)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":18205,"name":"Bulat Gaifullin","email":"gaifullinbf@gmail.com","username":"bgaifullin"},"change_message_id":"d909b16041f8a7410480bf7a62e79c0cf39920f1","unresolved":false,"context_lines":[{"line_number":7,"context_line":"Add handler for serialized tasks used in t-b deployment"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Handler will return output of the same serialized graph used for"},{"line_number":10,"context_line":"deployment in json format. And it will be available using next uriq"},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"GET clusters/\u003c:cluster_id\u003e/serialized_tasks?nodes\u003d\u003c:nodes\u003e\u0026tasks\u003d\u003c:tasks\u003e"},{"line_number":13,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":3,"id":"bae84128_76b5f4ce","line":10,"range":{"start_line":10,"start_character":63,"end_line":10,"end_character":67},"updated":"2016-02-25 08:56:50.000000000","message":"/uriq/uri","commit_id":"30ceed950d12739c39c9fb52cb7bcfd96f85a9ca"},{"author":{"_account_id":10959,"name":"Alexander Kislitsky","email":"akislitsky@mirantis.com","username":"akislitsky"},"change_message_id":"503210185577f02b40dc2831f48ed86342da6bdc","unresolved":false,"context_lines":[{"line_number":9,"context_line":"Handler will return output of the same serialized graph used for"},{"line_number":10,"context_line":"deployment in json format. And it will be available using next uri"},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"GET clusters/\u003c:cluster_id\u003e/serialized_tasks?nodes\u003d\u003c:nodes\u003e\u0026tasks\u003d\u003c:tasks\u003e"},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"Expected return codes are the following:"},{"line_number":15,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":9,"id":"9aed3d3a_13dbce7d","line":12,"updated":"2016-02-26 11:15:21.000000000","message":"Minor: please specify separator for nodes and tasks ids in the commit message.","commit_id":"31402415999908548e391c31beb33a987fba410c"},{"author":{"_account_id":8907,"name":"Dmitry Shulyak","email":"dshulyak@mirantis.com","username":"dshulyak"},"change_message_id":"6d37338ba5f11792363e046f4db8042286c308ef","unresolved":false,"context_lines":[{"line_number":9,"context_line":"Handler will return output of the same serialized graph used for"},{"line_number":10,"context_line":"deployment in json format. And it will be available using next uri"},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"GET clusters/\u003c:cluster_id\u003e/serialized_tasks?nodes\u003d\u003c:nodes\u003e\u0026tasks\u003d\u003c:tasks\u003e"},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"Expected return codes are the following:"},{"line_number":15,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":9,"id":"9aed3d3a_f66e18c8","line":12,"in_reply_to":"9aed3d3a_13dbce7d","updated":"2016-02-26 11:24:44.000000000","message":"Done","commit_id":"31402415999908548e391c31beb33a987fba410c"}],"nailgun/nailgun/api/v1/handlers/orchestrator.py":[{"author":{"_account_id":18205,"name":"Bulat Gaifullin","email":"gaifullinbf@gmail.com","username":"bgaifullin"},"change_message_id":"d909b16041f8a7410480bf7a62e79c0cf39920f1","unresolved":false,"context_lines":[{"line_number":392,"context_line":"                          data\u003dnodes, cluster\u003dcluster)"},{"line_number":393,"context_line":"        tasks \u003d web.input(tasks\u003dNone).tasks"},{"line_number":394,"context_line":"        task_ids \u003d tasks.split(\u0027,\u0027) if tasks else None"},{"line_number":395,"context_line":"        return task_based_deployment.TasksSerializer.serialize("},{"line_number":396,"context_line":"            cluster,"},{"line_number":397,"context_line":"            self.get_nodes(cluster),"},{"line_number":398,"context_line":"            objects.Cluster.get_deployment_tasks(cluster),"}],"source_content_type":"text/x-python","patch_set":3,"id":"bae84128_5693904f","line":395,"range":{"start_line":395,"start_character":15,"end_line":395,"end_character":36},"updated":"2016-02-25 08:56:50.000000000","message":"Please handle error TaskBaseDeploymentNotAllowed.","commit_id":"30ceed950d12739c39c9fb52cb7bcfd96f85a9ca"},{"author":{"_account_id":8907,"name":"Dmitry Shulyak","email":"dshulyak@mirantis.com","username":"dshulyak"},"change_message_id":"509afc0f54716e9b56478c1842c7935cd6822f0a","unresolved":false,"context_lines":[{"line_number":392,"context_line":"                          data\u003dnodes, cluster\u003dcluster)"},{"line_number":393,"context_line":"        tasks \u003d web.input(tasks\u003dNone).tasks"},{"line_number":394,"context_line":"        task_ids \u003d tasks.split(\u0027,\u0027) if tasks else None"},{"line_number":395,"context_line":"        return task_based_deployment.TasksSerializer.serialize("},{"line_number":396,"context_line":"            cluster,"},{"line_number":397,"context_line":"            self.get_nodes(cluster),"},{"line_number":398,"context_line":"            objects.Cluster.get_deployment_tasks(cluster),"}],"source_content_type":"text/x-python","patch_set":3,"id":"bae84128_c86c1839","line":395,"range":{"start_line":395,"start_character":15,"end_line":395,"end_character":36},"in_reply_to":"bae84128_5693904f","updated":"2016-02-25 11:21:38.000000000","message":"i will remove enabled validation, it doesnt make sense to have both","commit_id":"30ceed950d12739c39c9fb52cb7bcfd96f85a9ca"},{"author":{"_account_id":18205,"name":"Bulat Gaifullin","email":"gaifullinbf@gmail.com","username":"bgaifullin"},"change_message_id":"d909b16041f8a7410480bf7a62e79c0cf39920f1","unresolved":false,"context_lines":[{"line_number":394,"context_line":"        task_ids \u003d tasks.split(\u0027,\u0027) if tasks else None"},{"line_number":395,"context_line":"        return task_based_deployment.TasksSerializer.serialize("},{"line_number":396,"context_line":"            cluster,"},{"line_number":397,"context_line":"            self.get_nodes(cluster),"},{"line_number":398,"context_line":"            objects.Cluster.get_deployment_tasks(cluster),"},{"line_number":399,"context_line":"            task_ids\u003dtask_ids"},{"line_number":400,"context_line":"        )"}],"source_content_type":"text/x-python","patch_set":3,"id":"bae84128_b67bfc7a","line":397,"range":{"start_line":397,"start_character":17,"end_line":397,"end_character":26},"updated":"2016-02-25 08:56:50.000000000","message":"nodes","commit_id":"30ceed950d12739c39c9fb52cb7bcfd96f85a9ca"},{"author":{"_account_id":8907,"name":"Dmitry Shulyak","email":"dshulyak@mirantis.com","username":"dshulyak"},"change_message_id":"509afc0f54716e9b56478c1842c7935cd6822f0a","unresolved":false,"context_lines":[{"line_number":394,"context_line":"        task_ids \u003d tasks.split(\u0027,\u0027) if tasks else None"},{"line_number":395,"context_line":"        return task_based_deployment.TasksSerializer.serialize("},{"line_number":396,"context_line":"            cluster,"},{"line_number":397,"context_line":"            self.get_nodes(cluster),"},{"line_number":398,"context_line":"            objects.Cluster.get_deployment_tasks(cluster),"},{"line_number":399,"context_line":"            task_ids\u003dtask_ids"},{"line_number":400,"context_line":"        )"}],"source_content_type":"text/x-python","patch_set":3,"id":"bae84128_bc7bda28","line":397,"range":{"start_line":397,"start_character":17,"end_line":397,"end_character":26},"in_reply_to":"bae84128_b67bfc7a","updated":"2016-02-25 11:21:38.000000000","message":"Done","commit_id":"30ceed950d12739c39c9fb52cb7bcfd96f85a9ca"},{"author":{"_account_id":10959,"name":"Alexander Kislitsky","email":"akislitsky@mirantis.com","username":"akislitsky"},"change_message_id":"da80d02878f9b0b32d5d8225a7fb42724fcd417a","unresolved":false,"context_lines":[{"line_number":390,"context_line":"        self.checked_data(self.validator.validate_placement,"},{"line_number":391,"context_line":"                          data\u003dnodes, cluster\u003dcluster)"},{"line_number":392,"context_line":"        tasks \u003d web.input(tasks\u003dNone).tasks"},{"line_number":393,"context_line":"        task_ids \u003d tasks.split(\u0027,\u0027) if tasks else None"},{"line_number":394,"context_line":"        try:"},{"line_number":395,"context_line":"            rst \u003d task_based_deployment.TasksSerializer.serialize("},{"line_number":396,"context_line":"                cluster,"}],"source_content_type":"text/x-python","patch_set":12,"id":"9aed3d3a_7fb42b34","line":393,"updated":"2016-02-29 15:54:57.000000000","message":"Let\u0027s split and strip tasks.\nAnd I propose to strip node ids too.","commit_id":"a27618a5a55b14e7d62639374baa7c044db43120"}],"nailgun/nailgun/test/base.py":[{"author":{"_account_id":18205,"name":"Bulat Gaifullin","email":"gaifullinbf@gmail.com","username":"bgaifullin"},"change_message_id":"1debebd8977b724a0262d179a1d3cac2298cc055","unresolved":false,"context_lines":[{"line_number":469,"context_line":"        return created_ips"},{"line_number":470,"context_line":""},{"line_number":471,"context_line":"    def disable_task_deploy(self, cluster):"},{"line_number":472,"context_line":"        cluster_attrs \u003d copy.deepcopy(cluster.attributes.editable)"},{"line_number":473,"context_line":"        cluster_attrs[\u0027common\u0027][\u0027task_deploy\u0027][\u0027value\u0027] \u003d False"},{"line_number":474,"context_line":"        cluster.attributes.editable \u003d cluster_attrs"},{"line_number":475,"context_line":"        self.db().flush()"}],"source_content_type":"text/x-python","patch_set":6,"id":"bae84128_d5e785aa","line":472,"range":{"start_line":472,"start_character":8,"end_line":472,"end_character":21},"updated":"2016-02-25 13:57:01.000000000","message":"Because cluster.attributes.editable is MutableDict, the following code can be used:\n\nself.cluster.attributes.editable[\u0027common\u0027][\u0027task_deploy\u0027][\u0027value\u0027] \u003d False\nself.db().flush()","commit_id":"80bd935cfc9d491f905744034b35bbd7344019d1"},{"author":{"_account_id":8907,"name":"Dmitry Shulyak","email":"dshulyak@mirantis.com","username":"dshulyak"},"change_message_id":"fbf5258322f4b0fb407896bd14e7484f82c2b470","unresolved":false,"context_lines":[{"line_number":469,"context_line":"        return created_ips"},{"line_number":470,"context_line":""},{"line_number":471,"context_line":"    def disable_task_deploy(self, cluster):"},{"line_number":472,"context_line":"        cluster_attrs \u003d copy.deepcopy(cluster.attributes.editable)"},{"line_number":473,"context_line":"        cluster_attrs[\u0027common\u0027][\u0027task_deploy\u0027][\u0027value\u0027] \u003d False"},{"line_number":474,"context_line":"        cluster.attributes.editable \u003d cluster_attrs"},{"line_number":475,"context_line":"        self.db().flush()"}],"source_content_type":"text/x-python","patch_set":6,"id":"bae84128_b872b8ab","line":472,"range":{"start_line":472,"start_character":8,"end_line":472,"end_character":21},"in_reply_to":"bae84128_d5e785aa","updated":"2016-02-25 13:59:21.000000000","message":"yes, i got it from 1st comment ;) \n\nbut someone may say that it is not related change, and you already changed it in one of your patches","commit_id":"80bd935cfc9d491f905744034b35bbd7344019d1"},{"author":{"_account_id":10959,"name":"Alexander Kislitsky","email":"akislitsky@mirantis.com","username":"akislitsky"},"change_message_id":"503210185577f02b40dc2831f48ed86342da6bdc","unresolved":false,"context_lines":[{"line_number":471,"context_line":"    def disable_task_deploy(self, cluster):"},{"line_number":472,"context_line":"        cluster_attrs \u003d copy.deepcopy(cluster.attributes.editable)"},{"line_number":473,"context_line":"        cluster_attrs[\u0027common\u0027][\u0027task_deploy\u0027][\u0027value\u0027] \u003d False"},{"line_number":474,"context_line":"        cluster.attributes.editable \u003d cluster_attrs"},{"line_number":475,"context_line":"        self.db().flush()"},{"line_number":476,"context_line":""},{"line_number":477,"context_line":"    def delete_node_group(self, ng_id, status_code\u003d200, api\u003dTrue):"}],"source_content_type":"text/x-python","patch_set":9,"id":"9aed3d3a_53ef16e8","line":474,"updated":"2016-02-26 11:15:21.000000000","message":"Attributes.editable is MutableDict now. We should be able to apply direct change of cluster.attributes.editable[\u0027common\u0027][\u0027task_deploy\u0027][\u0027value\u0027] without any copy of data.","commit_id":"31402415999908548e391c31beb33a987fba410c"},{"author":{"_account_id":8907,"name":"Dmitry Shulyak","email":"dshulyak@mirantis.com","username":"dshulyak"},"change_message_id":"6d37338ba5f11792363e046f4db8042286c308ef","unresolved":false,"context_lines":[{"line_number":471,"context_line":"    def disable_task_deploy(self, cluster):"},{"line_number":472,"context_line":"        cluster_attrs \u003d copy.deepcopy(cluster.attributes.editable)"},{"line_number":473,"context_line":"        cluster_attrs[\u0027common\u0027][\u0027task_deploy\u0027][\u0027value\u0027] \u003d False"},{"line_number":474,"context_line":"        cluster.attributes.editable \u003d cluster_attrs"},{"line_number":475,"context_line":"        self.db().flush()"},{"line_number":476,"context_line":""},{"line_number":477,"context_line":"    def delete_node_group(self, ng_id, status_code\u003d200, api\u003dTrue):"}],"source_content_type":"text/x-python","patch_set":9,"id":"9aed3d3a_f60f38df","line":474,"in_reply_to":"9aed3d3a_53ef16e8","updated":"2016-02-26 11:24:44.000000000","message":"i was worried that it will be unrelated change, and someone will -1 for that :) also it is already changed in this patch - https://review.openstack.org/#/c/281996/7","commit_id":"31402415999908548e391c31beb33a987fba410c"},{"author":{"_account_id":10959,"name":"Alexander Kislitsky","email":"akislitsky@mirantis.com","username":"akislitsky"},"change_message_id":"6beff3cb70e8386397b1841af8cdc6c3d48c73b3","unresolved":false,"context_lines":[{"line_number":471,"context_line":"    def disable_task_deploy(self, cluster):"},{"line_number":472,"context_line":"        cluster_attrs \u003d copy.deepcopy(cluster.attributes.editable)"},{"line_number":473,"context_line":"        cluster_attrs[\u0027common\u0027][\u0027task_deploy\u0027][\u0027value\u0027] \u003d False"},{"line_number":474,"context_line":"        cluster.attributes.editable \u003d cluster_attrs"},{"line_number":475,"context_line":"        self.db().flush()"},{"line_number":476,"context_line":""},{"line_number":477,"context_line":"    def delete_node_group(self, ng_id, status_code\u003d200, api\u003dTrue):"}],"source_content_type":"text/x-python","patch_set":9,"id":"9aed3d3a_dcfe936a","line":474,"in_reply_to":"9aed3d3a_f60f38df","updated":"2016-02-26 12:00:06.000000000","message":"Let\u0027s do it in the right way at the very beginning :-)","commit_id":"31402415999908548e391c31beb33a987fba410c"},{"author":{"_account_id":10391,"name":"Ihor Kalnytskyi","email":"ihor@kalnytskyi.com","username":"ikalnitsky"},"change_message_id":"5348737ef31495fc6930e5776edafe5125fdb9d6","unresolved":false,"context_lines":[{"line_number":468,"context_line":"            self.db.flush()"},{"line_number":469,"context_line":"        return created_ips"},{"line_number":470,"context_line":""},{"line_number":471,"context_line":"    def disable_task_deploy(self, cluster):"},{"line_number":472,"context_line":"        cluster.attributes.editable[\u0027common\u0027][\u0027task_deploy\u0027][\u0027value\u0027] \u003d False"},{"line_number":473,"context_line":"        self.db().flush()"},{"line_number":474,"context_line":""}],"source_content_type":"text/x-python","patch_set":17,"id":"7af24918_cc4530b4","line":471,"updated":"2016-03-02 10:15:02.000000000","message":"Guess it\u0027s better to have\n\n  set_task_deploy(cluster, False)","commit_id":"bccb9012b17ac28098083d77161ca290566ad2c4"},{"author":{"_account_id":8907,"name":"Dmitry Shulyak","email":"dshulyak@mirantis.com","username":"dshulyak"},"change_message_id":"a284fb65044d5e0b5504fdfea9e0936001b7ea35","unresolved":false,"context_lines":[{"line_number":468,"context_line":"            self.db.flush()"},{"line_number":469,"context_line":"        return created_ips"},{"line_number":470,"context_line":""},{"line_number":471,"context_line":"    def disable_task_deploy(self, cluster):"},{"line_number":472,"context_line":"        cluster.attributes.editable[\u0027common\u0027][\u0027task_deploy\u0027][\u0027value\u0027] \u003d False"},{"line_number":473,"context_line":"        self.db().flush()"},{"line_number":474,"context_line":""}],"source_content_type":"text/x-python","patch_set":17,"id":"7af24918_87914155","line":471,"in_reply_to":"7af24918_cc4530b4","updated":"2016-03-02 10:26:02.000000000","message":"it was already existing method, i moved it to another class","commit_id":"bccb9012b17ac28098083d77161ca290566ad2c4"}],"nailgun/nailgun/test/integration/test_orchestrator_handlers.py":[{"author":{"_account_id":18205,"name":"Bulat Gaifullin","email":"gaifullinbf@gmail.com","username":"bgaifullin"},"change_message_id":"d909b16041f8a7410480bf7a62e79c0cf39920f1","unresolved":false,"context_lines":[{"line_number":431,"context_line":"            uri +\u003d make_orchestrator_uri(nodes_ids)"},{"line_number":432,"context_line":"        return self.app.get(uri, expect_errors\u003dTrue)"},{"line_number":433,"context_line":""},{"line_number":434,"context_line":"    def disable_task_deploy(self):"},{"line_number":435,"context_line":"        cluster_attrs \u003d copy.deepcopy(self.cluster.attributes.editable)"},{"line_number":436,"context_line":"        cluster_attrs[\u0027common\u0027][\u0027task_deploy\u0027][\u0027value\u0027] \u003d False"},{"line_number":437,"context_line":"        self.cluster.attributes.editable \u003d cluster_attrs"}],"source_content_type":"text/x-python","patch_set":3,"id":"bae84128_962a382b","line":434,"range":{"start_line":434,"start_character":8,"end_line":434,"end_character":27},"updated":"2016-02-25 08:56:50.000000000","message":"Please do not copy-paster. move this method to BaseIntergationTest\nand copy.deepcopy is not required since MutableObjects was merged.\n\nself.cluster.attributes.editable[\u0027common\u0027][\u0027task_deploy\u0027][\u0027value\u0027] \u003d False","commit_id":"30ceed950d12739c39c9fb52cb7bcfd96f85a9ca"},{"author":{"_account_id":8907,"name":"Dmitry Shulyak","email":"dshulyak@mirantis.com","username":"dshulyak"},"change_message_id":"509afc0f54716e9b56478c1842c7935cd6822f0a","unresolved":false,"context_lines":[{"line_number":431,"context_line":"            uri +\u003d make_orchestrator_uri(nodes_ids)"},{"line_number":432,"context_line":"        return self.app.get(uri, expect_errors\u003dTrue)"},{"line_number":433,"context_line":""},{"line_number":434,"context_line":"    def disable_task_deploy(self):"},{"line_number":435,"context_line":"        cluster_attrs \u003d copy.deepcopy(self.cluster.attributes.editable)"},{"line_number":436,"context_line":"        cluster_attrs[\u0027common\u0027][\u0027task_deploy\u0027][\u0027value\u0027] \u003d False"},{"line_number":437,"context_line":"        self.cluster.attributes.editable \u003d cluster_attrs"}],"source_content_type":"text/x-python","patch_set":3,"id":"bae84128_487808f9","line":434,"range":{"start_line":434,"start_character":8,"end_line":434,"end_character":27},"in_reply_to":"bae84128_962a382b","updated":"2016-02-25 11:21:38.000000000","message":"Done","commit_id":"30ceed950d12739c39c9fb52cb7bcfd96f85a9ca"},{"author":{"_account_id":18205,"name":"Bulat Gaifullin","email":"gaifullinbf@gmail.com","username":"bgaifullin"},"change_message_id":"d909b16041f8a7410480bf7a62e79c0cf39920f1","unresolved":false,"context_lines":[{"line_number":442,"context_line":""},{"line_number":443,"context_line":"    @patch.object(TaskProcessor, \u0027ensure_task_based_deploy_allowed\u0027)"},{"line_number":444,"context_line":"    def test_serialized_tasks_returned(self, _):"},{"line_number":445,"context_line":"        resp \u003d self.get_serialized_tasks("},{"line_number":446,"context_line":"            self.cluster.id, [n.uid for n in self.nodes])"},{"line_number":447,"context_line":"        self.assertEqual(resp.status_code, 200)"},{"line_number":448,"context_line":"        self.assertTrue(resp.json)"}],"source_content_type":"text/x-python","patch_set":3,"id":"bae84128_d6e32004","line":445,"range":{"start_line":445,"start_character":20,"end_line":445,"end_character":40},"updated":"2016-02-25 08:56:50.000000000","message":"Please check that response contains tasks.","commit_id":"30ceed950d12739c39c9fb52cb7bcfd96f85a9ca"},{"author":{"_account_id":8907,"name":"Dmitry Shulyak","email":"dshulyak@mirantis.com","username":"dshulyak"},"change_message_id":"509afc0f54716e9b56478c1842c7935cd6822f0a","unresolved":false,"context_lines":[{"line_number":442,"context_line":""},{"line_number":443,"context_line":"    @patch.object(TaskProcessor, \u0027ensure_task_based_deploy_allowed\u0027)"},{"line_number":444,"context_line":"    def test_serialized_tasks_returned(self, _):"},{"line_number":445,"context_line":"        resp \u003d self.get_serialized_tasks("},{"line_number":446,"context_line":"            self.cluster.id, [n.uid for n in self.nodes])"},{"line_number":447,"context_line":"        self.assertEqual(resp.status_code, 200)"},{"line_number":448,"context_line":"        self.assertTrue(resp.json)"}],"source_content_type":"text/x-python","patch_set":3,"id":"bae84128_1c93e650","line":445,"range":{"start_line":445,"start_character":20,"end_line":445,"end_character":40},"in_reply_to":"bae84128_d6e32004","updated":"2016-02-25 11:21:38.000000000","message":"Done","commit_id":"30ceed950d12739c39c9fb52cb7bcfd96f85a9ca"},{"author":{"_account_id":18205,"name":"Bulat Gaifullin","email":"gaifullinbf@gmail.com","username":"bgaifullin"},"change_message_id":"1debebd8977b724a0262d179a1d3cac2298cc055","unresolved":false,"context_lines":[{"line_number":443,"context_line":"        for n in nodes_uids:"},{"line_number":444,"context_line":"            received_tasks \u003d set((t[\u0027id\u0027] for t in resp.json[n]))"},{"line_number":445,"context_line":"            self.assertEqual(received_tasks, expected_tasks)"},{"line_number":446,"context_line":"        self.assertEqual("},{"line_number":447,"context_line":"            set((t[\u0027id\u0027] for t in resp.json[\u0027null\u0027])),"},{"line_number":448,"context_line":"            set([\u0027post_deployment_start\u0027, \u0027post_deployment_end\u0027,"},{"line_number":449,"context_line":"                 \u0027deploy_start\u0027, \u0027deploy_end\u0027,"}],"source_content_type":"text/x-python","patch_set":6,"id":"bae84128_f573a9e5","line":446,"range":{"start_line":446,"start_character":13,"end_line":446,"end_character":24},"updated":"2016-02-25 13:57:01.000000000","message":"minor:\nself.assertItemsEqual can be used instead of converting to set\nor \nsince 2.7 set comprehension has worked. \n{\"post_deployment_start\", \"post_deployment_end\", ...}","commit_id":"80bd935cfc9d491f905744034b35bbd7344019d1"},{"author":{"_account_id":8907,"name":"Dmitry Shulyak","email":"dshulyak@mirantis.com","username":"dshulyak"},"change_message_id":"fbf5258322f4b0fb407896bd14e7484f82c2b470","unresolved":false,"context_lines":[{"line_number":443,"context_line":"        for n in nodes_uids:"},{"line_number":444,"context_line":"            received_tasks \u003d set((t[\u0027id\u0027] for t in resp.json[n]))"},{"line_number":445,"context_line":"            self.assertEqual(received_tasks, expected_tasks)"},{"line_number":446,"context_line":"        self.assertEqual("},{"line_number":447,"context_line":"            set((t[\u0027id\u0027] for t in resp.json[\u0027null\u0027])),"},{"line_number":448,"context_line":"            set([\u0027post_deployment_start\u0027, \u0027post_deployment_end\u0027,"},{"line_number":449,"context_line":"                 \u0027deploy_start\u0027, \u0027deploy_end\u0027,"}],"source_content_type":"text/x-python","patch_set":6,"id":"bae84128_18964494","line":446,"range":{"start_line":446,"start_character":13,"end_line":446,"end_character":24},"in_reply_to":"bae84128_f573a9e5","updated":"2016-02-25 13:59:21.000000000","message":"Done","commit_id":"80bd935cfc9d491f905744034b35bbd7344019d1"},{"author":{"_account_id":8749,"name":"Evgeniy L","email":"eli@mirantis.com","username":"evgeniyl"},"change_message_id":"be9f69b8c09389d61ef382b6e0e341916837cf1a","unresolved":false,"context_lines":[{"line_number":429,"context_line":"            uri +\u003d make_orchestrator_uri(nodes_ids)"},{"line_number":430,"context_line":"        return self.app.get(uri, expect_errors\u003dTrue)"},{"line_number":431,"context_line":""},{"line_number":432,"context_line":"    def before(self, obj):"},{"line_number":433,"context_line":"        return str(obj.id - 1)"},{"line_number":434,"context_line":""},{"line_number":435,"context_line":"    @patch.object(TaskProcessor, \u0027ensure_task_based_deploy_allowed\u0027)"}],"source_content_type":"text/x-python","patch_set":9,"id":"9aed3d3a_f993a4a1","line":432,"updated":"2016-02-26 12:53:15.000000000","message":"It\u0027s more \"previous_id\"","commit_id":"31402415999908548e391c31beb33a987fba410c"},{"author":{"_account_id":10959,"name":"Alexander Kislitsky","email":"akislitsky@mirantis.com","username":"akislitsky"},"change_message_id":"503210185577f02b40dc2831f48ed86342da6bdc","unresolved":false,"context_lines":[{"line_number":435,"context_line":"    @patch.object(TaskProcessor, \u0027ensure_task_based_deploy_allowed\u0027)"},{"line_number":436,"context_line":"    def test_serialized_tasks_returned(self, _):"},{"line_number":437,"context_line":"        nodes_uids \u003d [n.uid for n in self.nodes]"},{"line_number":438,"context_line":"        resp \u003d self.get_serialized_tasks(self.cluster.id, nodes_uids)"},{"line_number":439,"context_line":"        self.assertEqual(resp.status_code, 200)"},{"line_number":440,"context_line":"        self.assertItemsEqual(nodes_uids + [\u0027null\u0027], resp.json.keys())"},{"line_number":441,"context_line":"        expected_tasks \u003d [\u0027netconfig\u0027, \u0027globals\u0027, \u0027deploy_legacy\u0027,"}],"source_content_type":"text/x-python","patch_set":9,"id":"9aed3d3a_133d8e2b","line":438,"updated":"2016-02-26 11:15:21.000000000","message":"nodes_ids is named parameter in the get_serialized_tasks.","commit_id":"31402415999908548e391c31beb33a987fba410c"},{"author":{"_account_id":8907,"name":"Dmitry Shulyak","email":"dshulyak@mirantis.com","username":"dshulyak"},"change_message_id":"6d37338ba5f11792363e046f4db8042286c308ef","unresolved":false,"context_lines":[{"line_number":435,"context_line":"    @patch.object(TaskProcessor, \u0027ensure_task_based_deploy_allowed\u0027)"},{"line_number":436,"context_line":"    def test_serialized_tasks_returned(self, _):"},{"line_number":437,"context_line":"        nodes_uids \u003d [n.uid for n in self.nodes]"},{"line_number":438,"context_line":"        resp \u003d self.get_serialized_tasks(self.cluster.id, nodes_uids)"},{"line_number":439,"context_line":"        self.assertEqual(resp.status_code, 200)"},{"line_number":440,"context_line":"        self.assertItemsEqual(nodes_uids + [\u0027null\u0027], resp.json.keys())"},{"line_number":441,"context_line":"        expected_tasks \u003d [\u0027netconfig\u0027, \u0027globals\u0027, \u0027deploy_legacy\u0027,"}],"source_content_type":"text/x-python","patch_set":9,"id":"9aed3d3a_d6ecb4c9","line":438,"in_reply_to":"9aed3d3a_133d8e2b","updated":"2016-02-26 11:24:44.000000000","message":"but it doesnt conflict with the way i am using this method, or you mean it that nodes_uids should be nodes_ids?","commit_id":"31402415999908548e391c31beb33a987fba410c"},{"author":{"_account_id":10959,"name":"Alexander Kislitsky","email":"akislitsky@mirantis.com","username":"akislitsky"},"change_message_id":"6beff3cb70e8386397b1841af8cdc6c3d48c73b3","unresolved":false,"context_lines":[{"line_number":435,"context_line":"    @patch.object(TaskProcessor, \u0027ensure_task_based_deploy_allowed\u0027)"},{"line_number":436,"context_line":"    def test_serialized_tasks_returned(self, _):"},{"line_number":437,"context_line":"        nodes_uids \u003d [n.uid for n in self.nodes]"},{"line_number":438,"context_line":"        resp \u003d self.get_serialized_tasks(self.cluster.id, nodes_uids)"},{"line_number":439,"context_line":"        self.assertEqual(resp.status_code, 200)"},{"line_number":440,"context_line":"        self.assertItemsEqual(nodes_uids + [\u0027null\u0027], resp.json.keys())"},{"line_number":441,"context_line":"        expected_tasks \u003d [\u0027netconfig\u0027, \u0027globals\u0027, \u0027deploy_legacy\u0027,"}],"source_content_type":"text/x-python","patch_set":9,"id":"9aed3d3a_5ca0c39f","line":438,"in_reply_to":"9aed3d3a_d6ecb4c9","updated":"2016-02-26 12:00:06.000000000","message":"It is not critical, but IMO implicit naming of named parameters more accurate :-)\nSuch approach protects us in case of changing of target function signature at least.","commit_id":"31402415999908548e391c31beb33a987fba410c"},{"author":{"_account_id":10959,"name":"Alexander Kislitsky","email":"akislitsky@mirantis.com","username":"akislitsky"},"change_message_id":"503210185577f02b40dc2831f48ed86342da6bdc","unresolved":false,"context_lines":[{"line_number":479,"context_line":"        self.env.disable_task_deploy(self.cluster)"},{"line_number":480,"context_line":"        resp \u003d self.get_serialized_tasks(self.cluster.id)"},{"line_number":481,"context_line":"        self.assertEqual(resp.status_code, 400)"},{"line_number":482,"context_line":"        self.assertIn(\"The task-based deployment is not allowed\", resp.body)"}],"source_content_type":"text/x-python","patch_set":9,"id":"9aed3d3a_93c19ee7","line":482,"updated":"2016-02-26 11:15:21.000000000","message":"Please add tests for nodes and tasks are requested in format like:\n/serialized_tasks?nodes\u003d1 , 2,\u0026tasks\u003d,","commit_id":"31402415999908548e391c31beb33a987fba410c"},{"author":{"_account_id":8907,"name":"Dmitry Shulyak","email":"dshulyak@mirantis.com","username":"dshulyak"},"change_message_id":"6d37338ba5f11792363e046f4db8042286c308ef","unresolved":false,"context_lines":[{"line_number":479,"context_line":"        self.env.disable_task_deploy(self.cluster)"},{"line_number":480,"context_line":"        resp \u003d self.get_serialized_tasks(self.cluster.id)"},{"line_number":481,"context_line":"        self.assertEqual(resp.status_code, 400)"},{"line_number":482,"context_line":"        self.assertIn(\"The task-based deployment is not allowed\", resp.body)"}],"source_content_type":"text/x-python","patch_set":9,"id":"9aed3d3a_56d9c420","line":482,"in_reply_to":"9aed3d3a_93c19ee7","updated":"2016-02-26 11:24:44.000000000","message":"Done","commit_id":"31402415999908548e391c31beb33a987fba410c"},{"author":{"_account_id":11898,"name":"Alexander Saprykin","email":"cutwatercore@gmail.com","username":"asaprykin"},"change_message_id":"4ae4af118de2ae5f5729839c31ecf77b9a307a2b","unresolved":false,"context_lines":[{"line_number":28,"context_line":"from nailgun.utils import reverse"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"def make_orchestrator_uri(**kwargs):"},{"line_number":32,"context_line":"    \"\"\"Each value in kwargs should be iterable"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"    :returns: ?k1\u003d1,2,3\u0026k2\u003d1,2,3"}],"source_content_type":"text/x-python","patch_set":11,"id":"9aed3d3a_e4af2628","line":31,"range":{"start_line":31,"start_character":0,"end_line":31,"end_character":36},"updated":"2016-02-29 11:09:06.000000000","message":"1. Function doesn\u0027t make uri. It makes query part of the uri.\n\n2. It\u0027s better to use urllib.urljoin?","commit_id":"d5358310f02cfb65b6243b47da2faea519b843e6"},{"author":{"_account_id":8907,"name":"Dmitry Shulyak","email":"dshulyak@mirantis.com","username":"dshulyak"},"change_message_id":"90be3a56e9ede5ec2d1b2df6286fb0a8b932fdb4","unresolved":false,"context_lines":[{"line_number":28,"context_line":"from nailgun.utils import reverse"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"def make_orchestrator_uri(**kwargs):"},{"line_number":32,"context_line":"    \"\"\"Each value in kwargs should be iterable"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"    :returns: ?k1\u003d1,2,3\u0026k2\u003d1,2,3"}],"source_content_type":"text/x-python","patch_set":11,"id":"9aed3d3a_1002400b","line":31,"range":{"start_line":31,"start_character":0,"end_line":31,"end_character":36},"in_reply_to":"9aed3d3a_e4af2628","updated":"2016-02-29 12:27:27.000000000","message":"current version allows to generate query in a flexible way, if i will use urljoin here i will need to move conditional logic elsewhere and i dont want to do this\n\nbut i will rename it to make_query","commit_id":"d5358310f02cfb65b6243b47da2faea519b843e6"},{"author":{"_account_id":11898,"name":"Alexander Saprykin","email":"cutwatercore@gmail.com","username":"asaprykin"},"change_message_id":"4ae4af118de2ae5f5729839c31ecf77b9a307a2b","unresolved":false,"context_lines":[{"line_number":432,"context_line":"            self.cluster, self.cluster.nodes)"},{"line_number":433,"context_line":""},{"line_number":434,"context_line":"    def get_serialized_tasks(self, cluster_id, **kwargs):"},{"line_number":435,"context_line":"        uri \u003d reverse("},{"line_number":436,"context_line":"            \"SerializedTasksHandler\","},{"line_number":437,"context_line":"            kwargs\u003d{\u0027cluster_id\u0027: cluster_id}) + \\"},{"line_number":438,"context_line":"            make_orchestrator_uri(**kwargs)"},{"line_number":439,"context_line":"        return self.app.get(uri, expect_errors\u003dTrue)"},{"line_number":440,"context_line":""},{"line_number":441,"context_line":"    def previous(self, obj):"}],"source_content_type":"text/x-python","patch_set":11,"id":"9aed3d3a_473374f6","line":438,"range":{"start_line":435,"start_character":0,"end_line":438,"end_character":43},"updated":"2016-02-29 11:09:06.000000000","message":"It will look better if you construct url like this\n\n  \u0027{0}?{1}\u0027.format(...)","commit_id":"d5358310f02cfb65b6243b47da2faea519b843e6"},{"author":{"_account_id":8907,"name":"Dmitry Shulyak","email":"dshulyak@mirantis.com","username":"dshulyak"},"change_message_id":"90be3a56e9ede5ec2d1b2df6286fb0a8b932fdb4","unresolved":false,"context_lines":[{"line_number":432,"context_line":"            self.cluster, self.cluster.nodes)"},{"line_number":433,"context_line":""},{"line_number":434,"context_line":"    def get_serialized_tasks(self, cluster_id, **kwargs):"},{"line_number":435,"context_line":"        uri \u003d reverse("},{"line_number":436,"context_line":"            \"SerializedTasksHandler\","},{"line_number":437,"context_line":"            kwargs\u003d{\u0027cluster_id\u0027: cluster_id}) + \\"},{"line_number":438,"context_line":"            make_orchestrator_uri(**kwargs)"},{"line_number":439,"context_line":"        return self.app.get(uri, expect_errors\u003dTrue)"},{"line_number":440,"context_line":""},{"line_number":441,"context_line":"    def previous(self, obj):"}],"source_content_type":"text/x-python","patch_set":11,"id":"9aed3d3a_d02458c6","line":438,"range":{"start_line":435,"start_character":0,"end_line":438,"end_character":43},"in_reply_to":"9aed3d3a_473374f6","updated":"2016-02-29 12:27:27.000000000","message":"why?","commit_id":"d5358310f02cfb65b6243b47da2faea519b843e6"},{"author":{"_account_id":10391,"name":"Ihor Kalnytskyi","email":"ihor@kalnytskyi.com","username":"ikalnitsky"},"change_message_id":"5348737ef31495fc6930e5776edafe5125fdb9d6","unresolved":false,"context_lines":[{"line_number":29,"context_line":""},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"def make_query(**kwargs):"},{"line_number":32,"context_line":"    \"\"\"Each value in kwargs should be iterable"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"    :returns: ?k1\u003d1,2,3\u0026k2\u003d1,2,3"},{"line_number":35,"context_line":"    \"\"\""}],"source_content_type":"text/x-python","patch_set":17,"id":"7af24918_ac26e4cb","line":32,"updated":"2016-03-02 10:15:02.000000000","message":"I think it would be a bit flexible if in case \u0027value\u0027 isn\u0027t iterable we use it \"As Is\".","commit_id":"bccb9012b17ac28098083d77161ca290566ad2c4"},{"author":{"_account_id":8907,"name":"Dmitry Shulyak","email":"dshulyak@mirantis.com","username":"dshulyak"},"change_message_id":"a284fb65044d5e0b5504fdfea9e0936001b7ea35","unresolved":false,"context_lines":[{"line_number":29,"context_line":""},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"def make_query(**kwargs):"},{"line_number":32,"context_line":"    \"\"\"Each value in kwargs should be iterable"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"    :returns: ?k1\u003d1,2,3\u0026k2\u003d1,2,3"},{"line_number":35,"context_line":"    \"\"\""}],"source_content_type":"text/x-python","patch_set":17,"id":"7af24918_4710d9a8","line":32,"in_reply_to":"7af24918_ac26e4cb","updated":"2016-03-02 10:26:02.000000000","message":"i think it wont be a problem to improve it when someone will need such functionality","commit_id":"bccb9012b17ac28098083d77161ca290566ad2c4"},{"author":{"_account_id":10391,"name":"Ihor Kalnytskyi","email":"ihor@kalnytskyi.com","username":"ikalnitsky"},"change_message_id":"5348737ef31495fc6930e5776edafe5125fdb9d6","unresolved":false,"context_lines":[{"line_number":491,"context_line":"    def test_404_if_cluster_doesnt_exist(self):"},{"line_number":492,"context_line":"        resp \u003d self.get_serialized_tasks(self.previous(self.cluster))"},{"line_number":493,"context_line":"        self.assertEqual(resp.status_code, 404)"},{"line_number":494,"context_line":"        self.assertIn(\"Cluster not found\", resp.body)"},{"line_number":495,"context_line":""},{"line_number":496,"context_line":"    def test_404_if_node_doesnt_exist(self):"},{"line_number":497,"context_line":"        resp \u003d self.get_serialized_tasks(self.cluster.id,"}],"source_content_type":"text/x-python","patch_set":17,"id":"7af24918_27002d01","line":494,"updated":"2016-03-02 10:15:02.000000000","message":"Here and below: Shouldn\u0027t error be wrapped in JSON?","commit_id":"bccb9012b17ac28098083d77161ca290566ad2c4"},{"author":{"_account_id":8907,"name":"Dmitry Shulyak","email":"dshulyak@mirantis.com","username":"dshulyak"},"change_message_id":"a284fb65044d5e0b5504fdfea9e0936001b7ea35","unresolved":false,"context_lines":[{"line_number":491,"context_line":"    def test_404_if_cluster_doesnt_exist(self):"},{"line_number":492,"context_line":"        resp \u003d self.get_serialized_tasks(self.previous(self.cluster))"},{"line_number":493,"context_line":"        self.assertEqual(resp.status_code, 404)"},{"line_number":494,"context_line":"        self.assertIn(\"Cluster not found\", resp.body)"},{"line_number":495,"context_line":""},{"line_number":496,"context_line":"    def test_404_if_node_doesnt_exist(self):"},{"line_number":497,"context_line":"        resp \u003d self.get_serialized_tasks(self.cluster.id,"}],"source_content_type":"text/x-python","patch_set":17,"id":"7af24918_67e875b5","line":494,"in_reply_to":"7af24918_27002d01","updated":"2016-03-02 10:26:02.000000000","message":"most of this errors are returned using *checked_data* interface https://github.com/openstack/fuel-web/blob/master/nailgun/nailgun/api/v1/handlers/base.py#L165-L203","commit_id":"bccb9012b17ac28098083d77161ca290566ad2c4"}]}
