)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":13609,"name":"Pavel Boldin","email":"pboldin@mirantis.com","username":"pboldin"},"change_message_id":"48443b92be600df7528162b8deda07576de662bf","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Oleh Anufriiev \u003coanufriev@mirantis.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2015-06-11 23:34:20 +0300"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"[Fuel] add and remove nodes scenario"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Change-Id: Ib7da11d8ffe6c692018a241a20ac978eb450f624"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":14,"id":"1af86dd1_03ee6eec","line":7,"updated":"2015-06-11 21:18:32.000000000","message":"This reads like you are going add and then immediately remove a scenario.\n\nPlease reword it.","commit_id":"c2920f3e3b755cf449f071397843d3464aaa860e"},{"author":{"_account_id":9601,"name":"Oleh Anufriiev","email":"oanufriev@mirantis.com","username":"oanufriev"},"change_message_id":"7b14a02e9785302e1c99a3996b6855c414982710","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Oleh Anufriiev \u003coanufriev@mirantis.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2015-06-11 23:34:20 +0300"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"[Fuel] add and remove nodes scenario"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Change-Id: Ib7da11d8ffe6c692018a241a20ac978eb450f624"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":14,"id":"ba3cc151_a14bbc2a","line":7,"in_reply_to":"1af86dd1_03ee6eec","updated":"2015-07-06 22:08:04.000000000","message":"Done","commit_id":"c2920f3e3b755cf449f071397843d3464aaa860e"}],"rally-jobs/fuel.yaml":[{"author":{"_account_id":7369,"name":"Sergey Skripnick","email":"sskripnick@mirantis.com","username":"redixin"},"change_message_id":"036a5087950cc5a9ef4ab3333b98f7508204c5cc","unresolved":false,"context_lines":[{"line_number":33,"context_line":"          resource_management_workers: 1"},{"line_number":34,"context_line":"      runner:"},{"line_number":35,"context_line":"        type: \"constant\""},{"line_number":36,"context_line":"        times: 200"},{"line_number":37,"context_line":"        concurrency: 1"},{"line_number":38,"context_line":"      sla:"},{"line_number":39,"context_line":"        failure_rate:"}],"source_content_type":"text/x-yaml","patch_set":28,"id":"3a50d1a3_b818f476","line":36,"updated":"2015-07-30 11:47:22.000000000","message":"200 is too much. 20 will be enough","commit_id":"62557a9650bb9b7c7050141dca44f042e4516753"},{"author":{"_account_id":9601,"name":"Oleh Anufriiev","email":"oanufriev@mirantis.com","username":"oanufriev"},"change_message_id":"49a068612cfd6e0d71b50177a04926ff7f303ede","unresolved":false,"context_lines":[{"line_number":33,"context_line":"          resource_management_workers: 1"},{"line_number":34,"context_line":"      runner:"},{"line_number":35,"context_line":"        type: \"constant\""},{"line_number":36,"context_line":"        times: 200"},{"line_number":37,"context_line":"        concurrency: 1"},{"line_number":38,"context_line":"      sla:"},{"line_number":39,"context_line":"        failure_rate:"}],"source_content_type":"text/x-yaml","patch_set":28,"id":"1a4dcd0f_6d185885","line":36,"in_reply_to":"3a50d1a3_b818f476","updated":"2015-08-04 10:00:31.000000000","message":"Done","commit_id":"62557a9650bb9b7c7050141dca44f042e4516753"},{"author":{"_account_id":10475,"name":"Alexander Maretskiy","email":"amaretskiy@mirantis.com","username":"maretskiy"},"change_message_id":"d1048a67a02f8115e449260f0890e2ac732c1ab5","unresolved":false,"context_lines":[{"line_number":34,"context_line":"      runner:"},{"line_number":35,"context_line":"        type: \"constant\""},{"line_number":36,"context_line":"        times: 20"},{"line_number":37,"context_line":"        concurrency: 1"},{"line_number":38,"context_line":"      sla:"},{"line_number":39,"context_line":"        failure_rate:"},{"line_number":40,"context_line":"            max: 0"}],"source_content_type":"text/x-yaml","patch_set":36,"id":"fa1b9901_ab0d2fe9","line":37,"updated":"2015-08-21 14:46:31.000000000","message":"That looks not reasonable to use 1 thread for 20 iterations, use at least 2","commit_id":"c1b5e47ae4e3a01e53cffb3144d3df4fd329a058"},{"author":{"_account_id":9601,"name":"Oleh Anufriiev","email":"oanufriev@mirantis.com","username":"oanufriev"},"change_message_id":"c88be4dc8ffbdf1b610fe510dd80b7381fa62982","unresolved":false,"context_lines":[{"line_number":34,"context_line":"      runner:"},{"line_number":35,"context_line":"        type: \"constant\""},{"line_number":36,"context_line":"        times: 20"},{"line_number":37,"context_line":"        concurrency: 1"},{"line_number":38,"context_line":"      sla:"},{"line_number":39,"context_line":"        failure_rate:"},{"line_number":40,"context_line":"            max: 0"}],"source_content_type":"text/x-yaml","patch_set":36,"id":"fa1b9901_63d090f8","line":37,"in_reply_to":"fa1b9901_ab0d2fe9","updated":"2015-08-21 16:51:39.000000000","message":"That was discussed on daily miting.\nGreater concurrensy causes Fuel failures","commit_id":"c1b5e47ae4e3a01e53cffb3144d3df4fd329a058"},{"author":{"_account_id":10475,"name":"Alexander Maretskiy","email":"amaretskiy@mirantis.com","username":"maretskiy"},"change_message_id":"e6e0003138c88a4d432dca3b0b49f510a272fcec","unresolved":false,"context_lines":[{"line_number":32,"context_line":"          net_segment_type: \"vlan\""},{"line_number":33,"context_line":"          resource_management_workers: 1"},{"line_number":34,"context_line":"      runner:"},{"line_number":35,"context_line":"        type: \"constant\""},{"line_number":36,"context_line":"        times: 20"},{"line_number":37,"context_line":"        concurrency: 1"},{"line_number":38,"context_line":"      sla:"}],"source_content_type":"text/x-yaml","patch_set":45,"id":"ba15a1d1_1ee72212","line":35,"updated":"2015-09-17 16:18:44.000000000","message":"Since the only possible concurrency is 1, just use \"serial\" runner instead - this will save 1 LOC and avoid confusion with concurrency","commit_id":"b076b6c46f7a605559572128c8f2dbbde01ced56"},{"author":{"_account_id":9601,"name":"Oleh Anufriiev","email":"oanufriev@mirantis.com","username":"oanufriev"},"change_message_id":"2950685335e53009c506222999ea4cf1075b8cf2","unresolved":false,"context_lines":[{"line_number":32,"context_line":"          net_segment_type: \"vlan\""},{"line_number":33,"context_line":"          resource_management_workers: 1"},{"line_number":34,"context_line":"      runner:"},{"line_number":35,"context_line":"        type: \"constant\""},{"line_number":36,"context_line":"        times: 20"},{"line_number":37,"context_line":"        concurrency: 1"},{"line_number":38,"context_line":"      sla:"}],"source_content_type":"text/x-yaml","patch_set":45,"id":"ba15a1d1_1b2f6d3f","line":35,"in_reply_to":"ba15a1d1_1ee72212","updated":"2015-09-22 08:40:49.000000000","message":"Done","commit_id":"b076b6c46f7a605559572128c8f2dbbde01ced56"}],"rally/benchmark/context/fuel.py":[{"author":{"_account_id":12395,"name":"Roman Vasylets","email":"pomeo92@gmail.com","username":"rvasilets"},"change_message_id":"5912c22a0420180f4a98432c1e78e3499a1e54fd","unresolved":false,"context_lines":[{"line_number":15,"context_line":"import collections"},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"from rally.benchmark.context import base"},{"line_number":18,"context_line":"from rally.benchmark.scenarios.fuel import utils as futils"},{"line_number":19,"context_line":"from rally.common import broker"},{"line_number":20,"context_line":"from rally.common.i18n import _"},{"line_number":21,"context_line":"from rally.common import log as logging"}],"source_content_type":"text/x-python","patch_set":4,"id":"7a016987_fe756931","line":18,"updated":"2015-05-21 15:11:52.000000000","message":"I\u0027d better name fuel_utils","commit_id":"7e8a3493a581e71e8268acb799e6779fc6ae79a9"},{"author":{"_account_id":9601,"name":"Oleh Anufriiev","email":"oanufriev@mirantis.com","username":"oanufriev"},"change_message_id":"08dbcba4c70531671557cd1c7f2901556fd78a75","unresolved":false,"context_lines":[{"line_number":15,"context_line":"import collections"},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"from rally.benchmark.context import base"},{"line_number":18,"context_line":"from rally.benchmark.scenarios.fuel import utils as futils"},{"line_number":19,"context_line":"from rally.common import broker"},{"line_number":20,"context_line":"from rally.common.i18n import _"},{"line_number":21,"context_line":"from rally.common import log as logging"}],"source_content_type":"text/x-python","patch_set":4,"id":"7a016987_be1806d4","line":18,"in_reply_to":"7a016987_fe756931","updated":"2015-05-22 00:02:28.000000000","message":"Done","commit_id":"7e8a3493a581e71e8268acb799e6779fc6ae79a9"},{"author":{"_account_id":12395,"name":"Roman Vasylets","email":"pomeo92@gmail.com","username":"rvasilets"},"change_message_id":"ae183af4b725d2204554f54aa09532198b282d7b","unresolved":false,"context_lines":[{"line_number":27,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"@base.context(name\u003d\"fuel_environments\", order\u003d100)"},{"line_number":31,"context_line":"class FuelEnvGenerator(base.Context):"},{"line_number":32,"context_line":"    \"\"\"Context class for generating temporary Fuel enves for benchmarks.\"\"\""},{"line_number":33,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"7a016987_deb87077","line":30,"updated":"2015-05-21 14:31:15.000000000","message":"users context have the same order","commit_id":"7e8a3493a581e71e8268acb799e6779fc6ae79a9"},{"author":{"_account_id":9601,"name":"Oleh Anufriiev","email":"oanufriev@mirantis.com","username":"oanufriev"},"change_message_id":"08dbcba4c70531671557cd1c7f2901556fd78a75","unresolved":false,"context_lines":[{"line_number":27,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"@base.context(name\u003d\"fuel_environments\", order\u003d100)"},{"line_number":31,"context_line":"class FuelEnvGenerator(base.Context):"},{"line_number":32,"context_line":"    \"\"\"Context class for generating temporary Fuel enves for benchmarks.\"\"\""},{"line_number":33,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"7a016987_3e7656d7","line":30,"in_reply_to":"7a016987_deb87077","updated":"2015-05-22 00:02:28.000000000","message":"Done","commit_id":"7e8a3493a581e71e8268acb799e6779fc6ae79a9"},{"author":{"_account_id":12395,"name":"Roman Vasylets","email":"pomeo92@gmail.com","username":"rvasilets"},"change_message_id":"134ae2ec4eed5b17fd125df18d0a0d47d298fa24","unresolved":false,"context_lines":[{"line_number":84,"context_line":"        broker.run(publish, consume, threads)"},{"line_number":85,"context_line":"        env_ids \u003d []"},{"line_number":86,"context_line":"        for e in enves:"},{"line_number":87,"context_line":"            env_ids.append(e)"},{"line_number":88,"context_line":""},{"line_number":89,"context_line":"        return env_ids"},{"line_number":90,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"7a016987_1ee60515","line":87,"updated":"2015-05-21 14:53:08.000000000","message":"env_ids.extend(enves)","commit_id":"7e8a3493a581e71e8268acb799e6779fc6ae79a9"},{"author":{"_account_id":9601,"name":"Oleh Anufriiev","email":"oanufriev@mirantis.com","username":"oanufriev"},"change_message_id":"08dbcba4c70531671557cd1c7f2901556fd78a75","unresolved":false,"context_lines":[{"line_number":84,"context_line":"        broker.run(publish, consume, threads)"},{"line_number":85,"context_line":"        env_ids \u003d []"},{"line_number":86,"context_line":"        for e in enves:"},{"line_number":87,"context_line":"            env_ids.append(e)"},{"line_number":88,"context_line":""},{"line_number":89,"context_line":"        return env_ids"},{"line_number":90,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"7a016987_9e342a4a","line":87,"in_reply_to":"7a016987_1ee60515","updated":"2015-05-22 00:02:28.000000000","message":"Done","commit_id":"7e8a3493a581e71e8268acb799e6779fc6ae79a9"},{"author":{"_account_id":12395,"name":"Roman Vasylets","email":"pomeo92@gmail.com","username":"rvasilets"},"change_message_id":"5912c22a0420180f4a98432c1e78e3499a1e54fd","unresolved":false,"context_lines":[{"line_number":114,"context_line":"            admin_clients\u003dosclients.Clients(self.context[\"admin\"][\"endpoint\"]))"},{"line_number":115,"context_line":"        self.context[\"fuel\"][\"environments\"] \u003d self._create_enves()"},{"line_number":116,"context_line":""},{"line_number":117,"context_line":"        if len(self.context["},{"line_number":118,"context_line":"                \"fuel\"][\"environments\"]) \u003c self.config[\"environments\"]:"},{"line_number":119,"context_line":"            raise exceptions.ContextSetupFailure("},{"line_number":120,"context_line":"                ctx_name\u003dself.get_name(),"}],"source_content_type":"text/x-python","patch_set":4,"id":"7a016987_1eda85e8","line":117,"updated":"2015-05-21 15:11:52.000000000","message":"I believe the right way to throw an exception in _create_enves() or just handle if client throw itself.","commit_id":"7e8a3493a581e71e8268acb799e6779fc6ae79a9"},{"author":{"_account_id":9601,"name":"Oleh Anufriiev","email":"oanufriev@mirantis.com","username":"oanufriev"},"change_message_id":"08dbcba4c70531671557cd1c7f2901556fd78a75","unresolved":false,"context_lines":[{"line_number":114,"context_line":"            admin_clients\u003dosclients.Clients(self.context[\"admin\"][\"endpoint\"]))"},{"line_number":115,"context_line":"        self.context[\"fuel\"][\"environments\"] \u003d self._create_enves()"},{"line_number":116,"context_line":""},{"line_number":117,"context_line":"        if len(self.context["},{"line_number":118,"context_line":"                \"fuel\"][\"environments\"]) \u003c self.config[\"environments\"]:"},{"line_number":119,"context_line":"            raise exceptions.ContextSetupFailure("},{"line_number":120,"context_line":"                ctx_name\u003dself.get_name(),"}],"source_content_type":"text/x-python","patch_set":4,"id":"7a016987_3ea2d699","line":117,"in_reply_to":"7a016987_1eda85e8","updated":"2015-05-22 00:02:28.000000000","message":"This implementation copied from \u0027users\u0027 context.\nTill fuelclient is not well implemented i prefer to do some additional checks like this","commit_id":"7e8a3493a581e71e8268acb799e6779fc6ae79a9"},{"author":{"_account_id":12395,"name":"Roman Vasylets","email":"pomeo92@gmail.com","username":"rvasilets"},"change_message_id":"5912c22a0420180f4a98432c1e78e3499a1e54fd","unresolved":false,"context_lines":[{"line_number":124,"context_line":"    @rutils.log_task_wrapper(LOG.info, _(\"Exit context: `fuel_environments`\"))"},{"line_number":125,"context_line":"    def cleanup(self):"},{"line_number":126,"context_line":"        \"\"\"Delete environments, using the broker pattern.\"\"\""},{"line_number":127,"context_line":"        self._delete_enves()"}],"source_content_type":"text/x-python","patch_set":4,"id":"7a016987_9ebc35bc","line":127,"updated":"2015-05-21 15:11:52.000000000","message":"Is it normal that we don\u0027t even create fake cleanup in context/cleanup/resources.py?","commit_id":"7e8a3493a581e71e8268acb799e6779fc6ae79a9"},{"author":{"_account_id":9601,"name":"Oleh Anufriiev","email":"oanufriev@mirantis.com","username":"oanufriev"},"change_message_id":"08dbcba4c70531671557cd1c7f2901556fd78a75","unresolved":false,"context_lines":[{"line_number":124,"context_line":"    @rutils.log_task_wrapper(LOG.info, _(\"Exit context: `fuel_environments`\"))"},{"line_number":125,"context_line":"    def cleanup(self):"},{"line_number":126,"context_line":"        \"\"\"Delete environments, using the broker pattern.\"\"\""},{"line_number":127,"context_line":"        self._delete_enves()"}],"source_content_type":"text/x-python","patch_set":4,"id":"7a016987_7e284e33","line":127,"in_reply_to":"7a016987_9ebc35bc","updated":"2015-05-22 00:02:28.000000000","message":"Cleanup that you\u0027re asking for is implemented in previous patch","commit_id":"7e8a3493a581e71e8268acb799e6779fc6ae79a9"}],"rally/benchmark/scenarios/fuel/nodes.py":[{"author":{"_account_id":12395,"name":"Roman Vasylets","email":"pomeo92@gmail.com","username":"rvasilets"},"change_message_id":"ae183af4b725d2204554f54aa09532198b282d7b","unresolved":false,"context_lines":[{"line_number":28,"context_line":"        \"\"\"List Fuel environments"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"        :param node_ids: List of Fuel node ids to process"},{"line_number":31,"context_line":"            env saccessfuly"},{"line_number":32,"context_line":"        :param nodes_role: Role, which node should be assignet to env with"},{"line_number":33,"context_line":"        \"\"\""},{"line_number":34,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"7a016987_f4546bfe","line":31,"updated":"2015-05-21 14:31:15.000000000","message":"* typo successfully","commit_id":"7e8a3493a581e71e8268acb799e6779fc6ae79a9"},{"author":{"_account_id":9601,"name":"Oleh Anufriiev","email":"oanufriev@mirantis.com","username":"oanufriev"},"change_message_id":"08dbcba4c70531671557cd1c7f2901556fd78a75","unresolved":false,"context_lines":[{"line_number":28,"context_line":"        \"\"\"List Fuel environments"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"        :param node_ids: List of Fuel node ids to process"},{"line_number":31,"context_line":"            env saccessfuly"},{"line_number":32,"context_line":"        :param nodes_role: Role, which node should be assignet to env with"},{"line_number":33,"context_line":"        \"\"\""},{"line_number":34,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"7a016987_f477bd9d","line":31,"in_reply_to":"7a016987_f4546bfe","updated":"2015-05-22 00:02:28.000000000","message":"Done","commit_id":"7e8a3493a581e71e8268acb799e6779fc6ae79a9"},{"author":{"_account_id":12395,"name":"Roman Vasylets","email":"pomeo92@gmail.com","username":"rvasilets"},"change_message_id":"ae183af4b725d2204554f54aa09532198b282d7b","unresolved":false,"context_lines":[{"line_number":29,"context_line":""},{"line_number":30,"context_line":"        :param node_ids: List of Fuel node ids to process"},{"line_number":31,"context_line":"            env saccessfuly"},{"line_number":32,"context_line":"        :param nodes_role: Role, which node should be assignet to env with"},{"line_number":33,"context_line":"        \"\"\""},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"        env_id \u003d random.choice(self.context[\"fuel\"][\"environments\"])"}],"source_content_type":"text/x-python","patch_set":4,"id":"7a016987_d4596f36","line":32,"updated":"2015-05-21 14:31:15.000000000","message":"* typo assigned","commit_id":"7e8a3493a581e71e8268acb799e6779fc6ae79a9"},{"author":{"_account_id":9601,"name":"Oleh Anufriiev","email":"oanufriev@mirantis.com","username":"oanufriev"},"change_message_id":"08dbcba4c70531671557cd1c7f2901556fd78a75","unresolved":false,"context_lines":[{"line_number":29,"context_line":""},{"line_number":30,"context_line":"        :param node_ids: List of Fuel node ids to process"},{"line_number":31,"context_line":"            env saccessfuly"},{"line_number":32,"context_line":"        :param nodes_role: Role, which node should be assignet to env with"},{"line_number":33,"context_line":"        \"\"\""},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"        env_id \u003d random.choice(self.context[\"fuel\"][\"environments\"])"}],"source_content_type":"text/x-python","patch_set":4,"id":"7a016987_b46dc5cd","line":32,"in_reply_to":"7a016987_d4596f36","updated":"2015-05-22 00:02:28.000000000","message":"Done","commit_id":"7e8a3493a581e71e8268acb799e6779fc6ae79a9"}],"rally/benchmark/scenarios/fuel/utils.py":[{"author":{"_account_id":12395,"name":"Roman Vasylets","email":"pomeo92@gmail.com","username":"rvasilets"},"change_message_id":"5912c22a0420180f4a98432c1e78e3499a1e54fd","unresolved":false,"context_lines":[{"line_number":137,"context_line":"            env_id, retries, retry_pause)"},{"line_number":138,"context_line":""},{"line_number":139,"context_line":"    @base.atomic_action_timer(\"fuel.add_nodes\")"},{"line_number":140,"context_line":"    def _add_nodes(self, env_id, node_ids, nodes_role\u003dNone):"},{"line_number":141,"context_line":""},{"line_number":142,"context_line":"        nodes_role \u003d nodes_role or [\"compute\"]"},{"line_number":143,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"7a016987_9e9b1518","line":140,"updated":"2015-05-21 15:11:52.000000000","message":"Here is no docstring","commit_id":"7e8a3493a581e71e8268acb799e6779fc6ae79a9"},{"author":{"_account_id":9601,"name":"Oleh Anufriiev","email":"oanufriev@mirantis.com","username":"oanufriev"},"change_message_id":"08dbcba4c70531671557cd1c7f2901556fd78a75","unresolved":false,"context_lines":[{"line_number":137,"context_line":"            env_id, retries, retry_pause)"},{"line_number":138,"context_line":""},{"line_number":139,"context_line":"    @base.atomic_action_timer(\"fuel.add_nodes\")"},{"line_number":140,"context_line":"    def _add_nodes(self, env_id, node_ids, nodes_role\u003dNone):"},{"line_number":141,"context_line":""},{"line_number":142,"context_line":"        nodes_role \u003d nodes_role or [\"compute\"]"},{"line_number":143,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"7a016987_346c359b","line":140,"in_reply_to":"7a016987_9e9b1518","updated":"2015-05-22 00:02:28.000000000","message":"Yes. I\u0027ve asked for conceptual review. For other kinds of review patch is WIP marked. This is a secret signal, that  means: \"patch is under development\".","commit_id":"7e8a3493a581e71e8268acb799e6779fc6ae79a9"},{"author":{"_account_id":12395,"name":"Roman Vasylets","email":"pomeo92@gmail.com","username":"rvasilets"},"change_message_id":"ae183af4b725d2204554f54aa09532198b282d7b","unresolved":false,"context_lines":[{"line_number":174,"context_line":"        for item in result:"},{"line_number":175,"context_line":"            if item[\"id\"] \u003d\u003d node_id:"},{"line_number":176,"context_line":"                return True if item[\"cluster\"] else False"},{"line_number":177,"context_line":"        else:"},{"line_number":178,"context_line":"            return False"}],"source_content_type":"text/x-python","patch_set":4,"id":"7a016987_9401b73a","line":177,"updated":"2015-05-21 14:31:15.000000000","message":"What is this?","commit_id":"7e8a3493a581e71e8268acb799e6779fc6ae79a9"},{"author":{"_account_id":9601,"name":"Oleh Anufriiev","email":"oanufriev@mirantis.com","username":"oanufriev"},"change_message_id":"08dbcba4c70531671557cd1c7f2901556fd78a75","unresolved":false,"context_lines":[{"line_number":174,"context_line":"        for item in result:"},{"line_number":175,"context_line":"            if item[\"id\"] \u003d\u003d node_id:"},{"line_number":176,"context_line":"                return True if item[\"cluster\"] else False"},{"line_number":177,"context_line":"        else:"},{"line_number":178,"context_line":"            return False"}],"source_content_type":"text/x-python","patch_set":4,"id":"7a016987_b4c945ae","line":177,"in_reply_to":"7a016987_9401b73a","updated":"2015-05-22 00:02:28.000000000","message":"https://docs.python.org/2/tutorial/controlflow.html\nChapter 4.4","commit_id":"7e8a3493a581e71e8268acb799e6779fc6ae79a9"}],"rally/plugins/openstack/context/fuel.py":[{"author":{"_account_id":10475,"name":"Alexander Maretskiy","email":"amaretskiy@mirantis.com","username":"maretskiy"},"change_message_id":"ec9f1eba82affca5e420d6645e4aaa5fb6644bc7","unresolved":false,"context_lines":[{"line_number":29,"context_line":""},{"line_number":30,"context_line":"@base.context(name\u003d\"fuel_environments\", order\u003d110)"},{"line_number":31,"context_line":"class FuelEnvGenerator(base.Context):"},{"line_number":32,"context_line":"    \"\"\"Context class for generating temporary Fuel enves for benchmarks.\"\"\""},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"    CONFIG_SCHEMA \u003d {"},{"line_number":35,"context_line":"        \"type\": \"object\","}],"source_content_type":"text/x-python","patch_set":10,"id":"3afb71cf_d1811a91","line":32,"updated":"2015-06-05 15:48:07.000000000","message":"Just \"\"\"Context for generating Fuel environments.\"\"\"\n\n(\"temporary and for benchmarks\" is obvious)","commit_id":"1f59a1bc1cdbd658878b6a31969ce88baf08f5c9"},{"author":{"_account_id":9601,"name":"Oleh Anufriiev","email":"oanufriev@mirantis.com","username":"oanufriev"},"change_message_id":"bc8000ed2154f09a232e87a0dd5dbd24cde8b11f","unresolved":false,"context_lines":[{"line_number":29,"context_line":""},{"line_number":30,"context_line":"@base.context(name\u003d\"fuel_environments\", order\u003d110)"},{"line_number":31,"context_line":"class FuelEnvGenerator(base.Context):"},{"line_number":32,"context_line":"    \"\"\"Context class for generating temporary Fuel enves for benchmarks.\"\"\""},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"    CONFIG_SCHEMA \u003d {"},{"line_number":35,"context_line":"        \"type\": \"object\","}],"source_content_type":"text/x-python","patch_set":10,"id":"3afb71cf_efe5ea37","line":32,"in_reply_to":"3afb71cf_d1811a91","updated":"2015-06-09 13:07:24.000000000","message":"Done","commit_id":"1f59a1bc1cdbd658878b6a31969ce88baf08f5c9"},{"author":{"_account_id":10475,"name":"Alexander Maretskiy","email":"amaretskiy@mirantis.com","username":"maretskiy"},"change_message_id":"ec9f1eba82affca5e420d6645e4aaa5fb6644bc7","unresolved":false,"context_lines":[{"line_number":56,"context_line":"                \"minimum\": 1"},{"line_number":57,"context_line":"            },"},{"line_number":58,"context_line":"        },"},{"line_number":59,"context_line":"        \"additionalProperties\": False"},{"line_number":60,"context_line":"    }"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"    def __init__(self, context):"}],"source_content_type":"text/x-python","patch_set":10,"id":"3afb71cf_dce7f13e","line":59,"updated":"2015-06-05 15:48:07.000000000","message":"Add \"required\" here, or, instead, use DEFAULT_CONFIG property below - otherwise you will get None values on L74 if some parameter is missed\n\nExample: https://github.com/openstack/rally/blob/master/rally/plugins/openstack/context/users.py#L87-L94","commit_id":"1f59a1bc1cdbd658878b6a31969ce88baf08f5c9"},{"author":{"_account_id":9601,"name":"Oleh Anufriiev","email":"oanufriev@mirantis.com","username":"oanufriev"},"change_message_id":"230fd942fda44576bd89f5a280b68633ef234be8","unresolved":false,"context_lines":[{"line_number":56,"context_line":"                \"minimum\": 1"},{"line_number":57,"context_line":"            },"},{"line_number":58,"context_line":"        },"},{"line_number":59,"context_line":"        \"additionalProperties\": False"},{"line_number":60,"context_line":"    }"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"    def __init__(self, context):"}],"source_content_type":"text/x-python","patch_set":10,"id":"3afb71cf_7c7084dc","line":59,"in_reply_to":"3afb71cf_dce7f13e","updated":"2015-06-09 16:55:45.000000000","message":"Done","commit_id":"1f59a1bc1cdbd658878b6a31969ce88baf08f5c9"},{"author":{"_account_id":12395,"name":"Roman Vasylets","email":"pomeo92@gmail.com","username":"rvasilets"},"change_message_id":"f35fc4b27a7dd870446503f44cc8057d4a6517fa","unresolved":false,"context_lines":[{"line_number":97,"context_line":""},{"line_number":98,"context_line":"        def publish(queue):"},{"line_number":99,"context_line":"            for env_id in self.context[\"fuel\"][\"environments\"]:"},{"line_number":100,"context_line":"                queue.append(env_id)"},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"        def consume(cache, env_id):"},{"line_number":103,"context_line":"            self.fscenario._delete_environment(env_id)"}],"source_content_type":"text/x-python","patch_set":20,"id":"ba3cc151_19db2a51","line":100,"updated":"2015-07-10 12:19:08.000000000","message":"why not to use here extend?","commit_id":"bc0e35db8b35e87423db64cda9ec93170f1f22aa"},{"author":{"_account_id":9601,"name":"Oleh Anufriiev","email":"oanufriev@mirantis.com","username":"oanufriev"},"change_message_id":"c52780745054df703fca8fbafc95e67e774d3fd3","unresolved":false,"context_lines":[{"line_number":97,"context_line":""},{"line_number":98,"context_line":"        def publish(queue):"},{"line_number":99,"context_line":"            for env_id in self.context[\"fuel\"][\"environments\"]:"},{"line_number":100,"context_line":"                queue.append(env_id)"},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"        def consume(cache, env_id):"},{"line_number":103,"context_line":"            self.fscenario._delete_environment(env_id)"}],"source_content_type":"text/x-python","patch_set":20,"id":"9a41bdd9_e7498db8","line":100,"in_reply_to":"ba3cc151_19db2a51","updated":"2015-07-14 17:26:38.000000000","message":"Done","commit_id":"bc0e35db8b35e87423db64cda9ec93170f1f22aa"},{"author":{"_account_id":12395,"name":"Roman Vasylets","email":"pomeo92@gmail.com","username":"rvasilets"},"change_message_id":"f35fc4b27a7dd870446503f44cc8057d4a6517fa","unresolved":false,"context_lines":[{"line_number":113,"context_line":"        self.context[\"fuel\"][\"environments\"] \u003d []"},{"line_number":114,"context_line":"        threads \u003d self.config[\"resource_management_workers\"]"},{"line_number":115,"context_line":""},{"line_number":116,"context_line":"        LOG.debug(\"Creating %(enves)d environments using %(threads)s threads\" %"},{"line_number":117,"context_line":"                  {\"enves\": self.config[\"environments\"],"},{"line_number":118,"context_line":"                   \"threads\": threads})"},{"line_number":119,"context_line":"        self.fscenario \u003d fuel_utils.FuelScenario("}],"source_content_type":"text/x-python","patch_set":20,"id":"ba3cc151_6756522c","line":116,"updated":"2015-07-10 12:19:08.000000000","message":"this need to be i18n","commit_id":"bc0e35db8b35e87423db64cda9ec93170f1f22aa"},{"author":{"_account_id":9601,"name":"Oleh Anufriiev","email":"oanufriev@mirantis.com","username":"oanufriev"},"change_message_id":"c52780745054df703fca8fbafc95e67e774d3fd3","unresolved":false,"context_lines":[{"line_number":113,"context_line":"        self.context[\"fuel\"][\"environments\"] \u003d []"},{"line_number":114,"context_line":"        threads \u003d self.config[\"resource_management_workers\"]"},{"line_number":115,"context_line":""},{"line_number":116,"context_line":"        LOG.debug(\"Creating %(enves)d environments using %(threads)s threads\" %"},{"line_number":117,"context_line":"                  {\"enves\": self.config[\"environments\"],"},{"line_number":118,"context_line":"                   \"threads\": threads})"},{"line_number":119,"context_line":"        self.fscenario \u003d fuel_utils.FuelScenario("}],"source_content_type":"text/x-python","patch_set":20,"id":"9a41bdd9_07fb517a","line":116,"in_reply_to":"ba3cc151_6756522c","updated":"2015-07-14 17:26:38.000000000","message":"Done","commit_id":"bc0e35db8b35e87423db64cda9ec93170f1f22aa"},{"author":{"_account_id":9601,"name":"Oleh Anufriiev","email":"oanufriev@mirantis.com","username":"oanufriev"},"change_message_id":"c0a830211b71a91f9869483d21cec5faeb35295b","unresolved":false,"context_lines":[{"line_number":113,"context_line":"        self.context[\"fuel\"][\"environments\"] \u003d []"},{"line_number":114,"context_line":"        threads \u003d self.config[\"resource_management_workers\"]"},{"line_number":115,"context_line":""},{"line_number":116,"context_line":"        LOG.debug(\"Creating %(enves)d environments using %(threads)s threads\" %"},{"line_number":117,"context_line":"                  {\"enves\": self.config[\"environments\"],"},{"line_number":118,"context_line":"                   \"threads\": threads})"},{"line_number":119,"context_line":"        self.fscenario \u003d fuel_utils.FuelScenario("}],"source_content_type":"text/x-python","patch_set":20,"id":"9a41bdd9_e2189b77","line":116,"in_reply_to":"ba3cc151_6756522c","updated":"2015-07-14 17:33:33.000000000","message":"sorry... we don\u0027t translate log messages. Only exceptions or prints\n\nhttps://github.com/openstack/rally/blob/master/tests/hacking/checks.py#L152-L167","commit_id":"bc0e35db8b35e87423db64cda9ec93170f1f22aa"},{"author":{"_account_id":7369,"name":"Sergey Skripnick","email":"sskripnick@mirantis.com","username":"redixin"},"change_message_id":"036a5087950cc5a9ef4ab3333b98f7508204c5cc","unresolved":false,"context_lines":[{"line_number":70,"context_line":"    def __init__(self, context):"},{"line_number":71,"context_line":"        super(FuelEnvGenerator, self).__init__(context)"},{"line_number":72,"context_line":""},{"line_number":73,"context_line":"    def _create_enves(self):"},{"line_number":74,"context_line":"        threads \u003d self.config[\"resource_management_workers\"]"},{"line_number":75,"context_line":""},{"line_number":76,"context_line":"        enves \u003d collections.deque()"}],"source_content_type":"text/x-python","patch_set":28,"id":"3a50d1a3_b82f9487","line":73,"updated":"2015-07-30 11:47:22.000000000","message":"enves? why no envs?","commit_id":"62557a9650bb9b7c7050141dca44f042e4516753"},{"author":{"_account_id":9601,"name":"Oleh Anufriiev","email":"oanufriev@mirantis.com","username":"oanufriev"},"change_message_id":"49a068612cfd6e0d71b50177a04926ff7f303ede","unresolved":false,"context_lines":[{"line_number":70,"context_line":"    def __init__(self, context):"},{"line_number":71,"context_line":"        super(FuelEnvGenerator, self).__init__(context)"},{"line_number":72,"context_line":""},{"line_number":73,"context_line":"    def _create_enves(self):"},{"line_number":74,"context_line":"        threads \u003d self.config[\"resource_management_workers\"]"},{"line_number":75,"context_line":""},{"line_number":76,"context_line":"        enves \u003d collections.deque()"}],"source_content_type":"text/x-python","patch_set":28,"id":"1a4dcd0f_91093e2f","line":73,"in_reply_to":"3a50d1a3_b82f9487","updated":"2015-08-04 10:00:31.000000000","message":"Done","commit_id":"62557a9650bb9b7c7050141dca44f042e4516753"},{"author":{"_account_id":10475,"name":"Alexander Maretskiy","email":"amaretskiy@mirantis.com","username":"maretskiy"},"change_message_id":"d1048a67a02f8115e449260f0890e2ac732c1ab5","unresolved":false,"context_lines":[{"line_number":68,"context_line":"    }"},{"line_number":69,"context_line":""},{"line_number":70,"context_line":"    def __init__(self, context):"},{"line_number":71,"context_line":"        super(FuelEnvGenerator, self).__init__(context)"},{"line_number":72,"context_line":""},{"line_number":73,"context_line":"    def _create_envs(self):"},{"line_number":74,"context_line":"        threads \u003d self.config[\"resource_management_workers\"]"}],"source_content_type":"text/x-python","patch_set":36,"id":"fa1b9901_d6836a01","line":71,"updated":"2015-08-21 14:46:31.000000000","message":"This does nothing, just remove __init__() at all","commit_id":"c1b5e47ae4e3a01e53cffb3144d3df4fd329a058"},{"author":{"_account_id":9601,"name":"Oleh Anufriiev","email":"oanufriev@mirantis.com","username":"oanufriev"},"change_message_id":"c88be4dc8ffbdf1b610fe510dd80b7381fa62982","unresolved":false,"context_lines":[{"line_number":68,"context_line":"    }"},{"line_number":69,"context_line":""},{"line_number":70,"context_line":"    def __init__(self, context):"},{"line_number":71,"context_line":"        super(FuelEnvGenerator, self).__init__(context)"},{"line_number":72,"context_line":""},{"line_number":73,"context_line":"    def _create_envs(self):"},{"line_number":74,"context_line":"        threads \u003d self.config[\"resource_management_workers\"]"}],"source_content_type":"text/x-python","patch_set":36,"id":"fa1b9901_e32900f4","line":71,"in_reply_to":"fa1b9901_d6836a01","updated":"2015-08-21 16:51:39.000000000","message":"Done","commit_id":"c1b5e47ae4e3a01e53cffb3144d3df4fd329a058"},{"author":{"_account_id":7369,"name":"Sergey Skripnick","email":"sskripnick@mirantis.com","username":"redixin"},"change_message_id":"f9a73917531f4c9d642fb0e20b0308d53e97b00b","unresolved":false,"context_lines":[{"line_number":70,"context_line":"    def _create_envs(self):"},{"line_number":71,"context_line":"        threads \u003d self.config[\"resource_management_workers\"]"},{"line_number":72,"context_line":""},{"line_number":73,"context_line":"        enves \u003d collections.deque()"},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"        def publish(queue):"},{"line_number":76,"context_line":"            for i in range(self.config[\"environments\"]):"}],"source_content_type":"text/x-python","patch_set":45,"id":"ba15a1d1_ca5d4148","line":73,"updated":"2015-09-17 10:38:38.000000000","message":"why \"enves\"? mb \"envs\"?","commit_id":"b076b6c46f7a605559572128c8f2dbbde01ced56"},{"author":{"_account_id":9601,"name":"Oleh Anufriiev","email":"oanufriev@mirantis.com","username":"oanufriev"},"change_message_id":"2950685335e53009c506222999ea4cf1075b8cf2","unresolved":false,"context_lines":[{"line_number":70,"context_line":"    def _create_envs(self):"},{"line_number":71,"context_line":"        threads \u003d self.config[\"resource_management_workers\"]"},{"line_number":72,"context_line":""},{"line_number":73,"context_line":"        enves \u003d collections.deque()"},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"        def publish(queue):"},{"line_number":76,"context_line":"            for i in range(self.config[\"environments\"]):"}],"source_content_type":"text/x-python","patch_set":45,"id":"ba15a1d1_98906350","line":73,"in_reply_to":"ba15a1d1_ca5d4148","updated":"2015-09-22 08:40:49.000000000","message":"Done","commit_id":"b076b6c46f7a605559572128c8f2dbbde01ced56"},{"author":{"_account_id":7369,"name":"Sergey Skripnick","email":"sskripnick@mirantis.com","username":"redixin"},"change_message_id":"f9a73917531f4c9d642fb0e20b0308d53e97b00b","unresolved":false,"context_lines":[{"line_number":74,"context_line":""},{"line_number":75,"context_line":"        def publish(queue):"},{"line_number":76,"context_line":"            for i in range(self.config[\"environments\"]):"},{"line_number":77,"context_line":"                kwargs \u003d {\"release_id\": self.config[\"release_id\"],"},{"line_number":78,"context_line":"                          \"network_provider\": self.config[\"network_provider\"],"},{"line_number":79,"context_line":"                          \"deployment_mode\": self.config[\"deployment_mode\"],"},{"line_number":80,"context_line":"                          \"net_segment_type\": self.config[\"net_segment_type\"]}"}],"source_content_type":"text/x-python","patch_set":45,"id":"ba15a1d1_6a7515f8","line":77,"updated":"2015-09-17 10:38:38.000000000","message":"this may be outside of the loop. there is no need to create many identical kwargs","commit_id":"b076b6c46f7a605559572128c8f2dbbde01ced56"},{"author":{"_account_id":9601,"name":"Oleh Anufriiev","email":"oanufriev@mirantis.com","username":"oanufriev"},"change_message_id":"2950685335e53009c506222999ea4cf1075b8cf2","unresolved":false,"context_lines":[{"line_number":74,"context_line":""},{"line_number":75,"context_line":"        def publish(queue):"},{"line_number":76,"context_line":"            for i in range(self.config[\"environments\"]):"},{"line_number":77,"context_line":"                kwargs \u003d {\"release_id\": self.config[\"release_id\"],"},{"line_number":78,"context_line":"                          \"network_provider\": self.config[\"network_provider\"],"},{"line_number":79,"context_line":"                          \"deployment_mode\": self.config[\"deployment_mode\"],"},{"line_number":80,"context_line":"                          \"net_segment_type\": self.config[\"net_segment_type\"]}"}],"source_content_type":"text/x-python","patch_set":45,"id":"ba15a1d1_58a88b77","line":77,"in_reply_to":"ba15a1d1_6a7515f8","updated":"2015-09-22 08:40:49.000000000","message":"Done","commit_id":"b076b6c46f7a605559572128c8f2dbbde01ced56"},{"author":{"_account_id":7369,"name":"Sergey Skripnick","email":"sskripnick@mirantis.com","username":"redixin"},"change_message_id":"f9a73917531f4c9d642fb0e20b0308d53e97b00b","unresolved":false,"context_lines":[{"line_number":102,"context_line":""},{"line_number":103,"context_line":"    @rutils.log_task_wrapper(LOG.info, _(\"Enter context: `fuel_environments`\"))"},{"line_number":104,"context_line":"    def setup(self):"},{"line_number":105,"context_line":"        \"\"\"Create tenants and users, using the broker pattern.\"\"\""},{"line_number":106,"context_line":""},{"line_number":107,"context_line":"        self.context.setdefault(\"fuel\", {})"},{"line_number":108,"context_line":"        self.context[\"fuel\"][\"environments\"] \u003d []"}],"source_content_type":"text/x-python","patch_set":45,"id":"ba15a1d1_0ad499ba","line":105,"updated":"2015-09-17 10:38:38.000000000","message":"Docstring from wrong context","commit_id":"b076b6c46f7a605559572128c8f2dbbde01ced56"},{"author":{"_account_id":9601,"name":"Oleh Anufriiev","email":"oanufriev@mirantis.com","username":"oanufriev"},"change_message_id":"2950685335e53009c506222999ea4cf1075b8cf2","unresolved":false,"context_lines":[{"line_number":102,"context_line":""},{"line_number":103,"context_line":"    @rutils.log_task_wrapper(LOG.info, _(\"Enter context: `fuel_environments`\"))"},{"line_number":104,"context_line":"    def setup(self):"},{"line_number":105,"context_line":"        \"\"\"Create tenants and users, using the broker pattern.\"\"\""},{"line_number":106,"context_line":""},{"line_number":107,"context_line":"        self.context.setdefault(\"fuel\", {})"},{"line_number":108,"context_line":"        self.context[\"fuel\"][\"environments\"] \u003d []"}],"source_content_type":"text/x-python","patch_set":45,"id":"ba15a1d1_18077382","line":105,"in_reply_to":"ba15a1d1_0ad499ba","updated":"2015-09-22 08:40:49.000000000","message":"Done","commit_id":"b076b6c46f7a605559572128c8f2dbbde01ced56"},{"author":{"_account_id":7369,"name":"Sergey Skripnick","email":"sskripnick@mirantis.com","username":"redixin"},"change_message_id":"f9a73917531f4c9d642fb0e20b0308d53e97b00b","unresolved":false,"context_lines":[{"line_number":105,"context_line":"        \"\"\"Create tenants and users, using the broker pattern.\"\"\""},{"line_number":106,"context_line":""},{"line_number":107,"context_line":"        self.context.setdefault(\"fuel\", {})"},{"line_number":108,"context_line":"        self.context[\"fuel\"][\"environments\"] \u003d []"},{"line_number":109,"context_line":"        threads \u003d self.config[\"resource_management_workers\"]"},{"line_number":110,"context_line":""},{"line_number":111,"context_line":"        LOG.debug(\"Creating %(enves)d environments using %(threads)s threads\" %"}],"source_content_type":"text/x-python","patch_set":45,"id":"ba15a1d1_8aa50948","line":108,"updated":"2015-09-17 10:38:38.000000000","message":"What if there was already some environments in [\"fuel\"]? This may be a problem in the future. Please use setdefault","commit_id":"b076b6c46f7a605559572128c8f2dbbde01ced56"},{"author":{"_account_id":9601,"name":"Oleh Anufriiev","email":"oanufriev@mirantis.com","username":"oanufriev"},"change_message_id":"2950685335e53009c506222999ea4cf1075b8cf2","unresolved":false,"context_lines":[{"line_number":105,"context_line":"        \"\"\"Create tenants and users, using the broker pattern.\"\"\""},{"line_number":106,"context_line":""},{"line_number":107,"context_line":"        self.context.setdefault(\"fuel\", {})"},{"line_number":108,"context_line":"        self.context[\"fuel\"][\"environments\"] \u003d []"},{"line_number":109,"context_line":"        threads \u003d self.config[\"resource_management_workers\"]"},{"line_number":110,"context_line":""},{"line_number":111,"context_line":"        LOG.debug(\"Creating %(enves)d environments using %(threads)s threads\" %"}],"source_content_type":"text/x-python","patch_set":45,"id":"ba15a1d1_384917d1","line":108,"in_reply_to":"ba15a1d1_8aa50948","updated":"2015-09-22 08:40:49.000000000","message":"Done","commit_id":"b076b6c46f7a605559572128c8f2dbbde01ced56"}],"rally/plugins/openstack/scenarios/fuel/nodes.py":[{"author":{"_account_id":10475,"name":"Alexander Maretskiy","email":"amaretskiy@mirantis.com","username":"maretskiy"},"change_message_id":"ec9f1eba82affca5e420d6645e4aaa5fb6644bc7","unresolved":false,"context_lines":[{"line_number":36,"context_line":"        env_id \u003d random.choice(self.context[\"fuel\"][\"environments\"])"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"        node_id \u003d None"},{"line_number":39,"context_line":"        while not node_id:"},{"line_number":40,"context_line":"            tmp_node_id \u003d random.choice(node_ids)"},{"line_number":41,"context_line":"            if not self._node_is_assigned(tmp_node_id):"},{"line_number":42,"context_line":"                node_id \u003d tmp_node_id"}],"source_content_type":"text/x-python","patch_set":10,"id":"3afb71cf_3ca4c555","line":39,"updated":"2015-06-05 15:48:07.000000000","message":"What is all nodes are assigned? Can we avoid possibility of infinity loop?","commit_id":"1f59a1bc1cdbd658878b6a31969ce88baf08f5c9"},{"author":{"_account_id":9601,"name":"Oleh Anufriiev","email":"oanufriev@mirantis.com","username":"oanufriev"},"change_message_id":"88c3a034d62273aac492a313ebda43a1179fede2","unresolved":false,"context_lines":[{"line_number":36,"context_line":"        env_id \u003d random.choice(self.context[\"fuel\"][\"environments\"])"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"        node_id \u003d None"},{"line_number":39,"context_line":"        while not node_id:"},{"line_number":40,"context_line":"            tmp_node_id \u003d random.choice(node_ids)"},{"line_number":41,"context_line":"            if not self._node_is_assigned(tmp_node_id):"},{"line_number":42,"context_line":"                node_id \u003d tmp_node_id"}],"source_content_type":"text/x-python","patch_set":10,"id":"3afb71cf_2d076719","line":39,"in_reply_to":"3afb71cf_3ca4c555","updated":"2015-06-10 00:54:53.000000000","message":"Done","commit_id":"1f59a1bc1cdbd658878b6a31969ce88baf08f5c9"},{"author":{"_account_id":12395,"name":"Roman Vasylets","email":"pomeo92@gmail.com","username":"rvasilets"},"change_message_id":"e486d92f04e9857afd00429e07b1d7096567e0d2","unresolved":false,"context_lines":[{"line_number":26,"context_line":"    @validation.required_openstack(admin\u003dTrue)"},{"line_number":27,"context_line":"    @base.scenario()"},{"line_number":28,"context_line":"    def add_and_remove_nodes(self, nodes_role\u003d\"compute\"):"},{"line_number":29,"context_line":"        \"\"\"List Fuel environments"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"        :param node_ids: List of Fuel node ids to process"},{"line_number":32,"context_line":"            env saccessfully"}],"source_content_type":"text/x-python","patch_set":18,"id":"ba3cc151_a8f0f867","line":29,"updated":"2015-07-09 06:47:32.000000000","message":"This is not list fuel environment. Seems like docstring is invalid","commit_id":"42870ac71b27836f640d0d595146e50fd1f4d507"},{"author":{"_account_id":9601,"name":"Oleh Anufriiev","email":"oanufriev@mirantis.com","username":"oanufriev"},"change_message_id":"5eea4fbed08a7a91eefe1fc5dd73dc1ca7570c2c","unresolved":false,"context_lines":[{"line_number":26,"context_line":"    @validation.required_openstack(admin\u003dTrue)"},{"line_number":27,"context_line":"    @base.scenario()"},{"line_number":28,"context_line":"    def add_and_remove_nodes(self, nodes_role\u003d\"compute\"):"},{"line_number":29,"context_line":"        \"\"\"List Fuel environments"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"        :param node_ids: List of Fuel node ids to process"},{"line_number":32,"context_line":"            env saccessfully"}],"source_content_type":"text/x-python","patch_set":18,"id":"ba3cc151_c4f51283","line":29,"in_reply_to":"ba3cc151_a8f0f867","updated":"2015-07-09 21:23:59.000000000","message":"Done","commit_id":"42870ac71b27836f640d0d595146e50fd1f4d507"},{"author":{"_account_id":12395,"name":"Roman Vasylets","email":"pomeo92@gmail.com","username":"rvasilets"},"change_message_id":"e486d92f04e9857afd00429e07b1d7096567e0d2","unresolved":false,"context_lines":[{"line_number":38,"context_line":"        node_ids \u003d self._list_node_ids()"},{"line_number":39,"context_line":"        random.shuffle(node_ids)"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"        for node_id in node_ids:"},{"line_number":42,"context_line":"            if not self._node_is_assigned(node_id):"},{"line_number":43,"context_line":"                break"},{"line_number":44,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":18,"id":"ba3cc151_280f0838","line":41,"updated":"2015-07-09 06:47:32.000000000","message":"I think this logic(cycle) need to be done in utils","commit_id":"42870ac71b27836f640d0d595146e50fd1f4d507"},{"author":{"_account_id":9601,"name":"Oleh Anufriiev","email":"oanufriev@mirantis.com","username":"oanufriev"},"change_message_id":"5eea4fbed08a7a91eefe1fc5dd73dc1ca7570c2c","unresolved":false,"context_lines":[{"line_number":38,"context_line":"        node_ids \u003d self._list_node_ids()"},{"line_number":39,"context_line":"        random.shuffle(node_ids)"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"        for node_id in node_ids:"},{"line_number":42,"context_line":"            if not self._node_is_assigned(node_id):"},{"line_number":43,"context_line":"                break"},{"line_number":44,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":18,"id":"ba3cc151_7dd842ef","line":41,"in_reply_to":"ba3cc151_280f0838","updated":"2015-07-09 21:23:59.000000000","message":"Done","commit_id":"42870ac71b27836f640d0d595146e50fd1f4d507"},{"author":{"_account_id":10475,"name":"Alexander Maretskiy","email":"amaretskiy@mirantis.com","username":"maretskiy"},"change_message_id":"d1048a67a02f8115e449260f0890e2ac732c1ab5","unresolved":false,"context_lines":[{"line_number":25,"context_line":"    @validation.required_clients(\"fuel\", admin\u003dTrue)"},{"line_number":26,"context_line":"    @validation.required_openstack(admin\u003dTrue)"},{"line_number":27,"context_line":"    @scenario.configure()"},{"line_number":28,"context_line":"    def add_and_remove_nodes(self, nodes_role\u003d\"compute\"):"},{"line_number":29,"context_line":"        \"\"\"Add node to environment and remove"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"        :param node_ids: List of Fuel node ids to process"}],"source_content_type":"text/x-python","patch_set":36,"id":"fa1b9901_e3910b48","line":28,"updated":"2015-08-21 14:46:31.000000000","message":"Most scenarios uses term `delete\u0027 instead of `remove\u0027","commit_id":"c1b5e47ae4e3a01e53cffb3144d3df4fd329a058"},{"author":{"_account_id":9601,"name":"Oleh Anufriiev","email":"oanufriev@mirantis.com","username":"oanufriev"},"change_message_id":"c88be4dc8ffbdf1b610fe510dd80b7381fa62982","unresolved":false,"context_lines":[{"line_number":25,"context_line":"    @validation.required_clients(\"fuel\", admin\u003dTrue)"},{"line_number":26,"context_line":"    @validation.required_openstack(admin\u003dTrue)"},{"line_number":27,"context_line":"    @scenario.configure()"},{"line_number":28,"context_line":"    def add_and_remove_nodes(self, nodes_role\u003d\"compute\"):"},{"line_number":29,"context_line":"        \"\"\"Add node to environment and remove"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"        :param node_ids: List of Fuel node ids to process"}],"source_content_type":"text/x-python","patch_set":36,"id":"fa1b9901_a3cf8828","line":28,"in_reply_to":"fa1b9901_e3910b48","updated":"2015-08-21 16:51:39.000000000","message":"This is actually \u0027remove\u0027, cause we can not delete a node, we can remove it from environment","commit_id":"c1b5e47ae4e3a01e53cffb3144d3df4fd329a058"},{"author":{"_account_id":14084,"name":"Einst Crazy","email":"yu.changcai@99cloud.net","username":"Einst"},"change_message_id":"78924bc18e812e4c658796f6868792bb410e2dd3","unresolved":false,"context_lines":[{"line_number":29,"context_line":"        \"\"\"Add node to environment and remove"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"        :param node_ids: List of Fuel node ids to process"},{"line_number":32,"context_line":"            env saccessfully"},{"line_number":33,"context_line":"        :param nodes_role: Role, which node should be assigned to env with"},{"line_number":34,"context_line":"        \"\"\""},{"line_number":35,"context_line":""}],"source_content_type":"text/x-python","patch_set":40,"id":"da20952f_c64cde78","line":32,"updated":"2015-09-02 09:35:37.000000000","message":"Agree with wangtianfa, you have omit this param, you should delete these two lines.","commit_id":"2963bb9cbe99780212bd9f80af588cc259f9706a"},{"author":{"_account_id":9601,"name":"Oleh Anufriiev","email":"oanufriev@mirantis.com","username":"oanufriev"},"change_message_id":"8bb5866d5bbe9e077efd2f47fbf71fdeba713b54","unresolved":false,"context_lines":[{"line_number":29,"context_line":"        \"\"\"Add node to environment and remove"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"        :param node_ids: List of Fuel node ids to process"},{"line_number":32,"context_line":"            env saccessfully"},{"line_number":33,"context_line":"        :param nodes_role: Role, which node should be assigned to env with"},{"line_number":34,"context_line":"        \"\"\""},{"line_number":35,"context_line":""}],"source_content_type":"text/x-python","patch_set":40,"id":"da20952f_f884fa0b","line":32,"in_reply_to":"da20952f_c64cde78","updated":"2015-09-03 00:54:45.000000000","message":"Done","commit_id":"2963bb9cbe99780212bd9f80af588cc259f9706a"},{"author":{"_account_id":14103,"name":"wangtianfa","email":"wang.tianfa@99cloud.net","username":"wangtianfa"},"change_message_id":"7874b32f94f4f15cfbc4c3f432e1e56ace7c27cc","unresolved":false,"context_lines":[{"line_number":35,"context_line":""},{"line_number":36,"context_line":"        env_id \u003d random.choice(self.context[\"fuel\"][\"environments\"])"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"        node_id \u003d self._get_random_free_node_id()"},{"line_number":39,"context_line":"        self._add_nodes(env_id, node_id, nodes_role)"},{"line_number":40,"context_line":"        self._remove_nodes(env_id, node_id)"}],"source_content_type":"text/x-python","patch_set":40,"id":"da20952f_a3451c18","line":38,"updated":"2015-09-02 09:19:25.000000000","message":"node_id should modify node_ids，because \"param node_ids\".","commit_id":"2963bb9cbe99780212bd9f80af588cc259f9706a"},{"author":{"_account_id":9601,"name":"Oleh Anufriiev","email":"oanufriev@mirantis.com","username":"oanufriev"},"change_message_id":"8bb5866d5bbe9e077efd2f47fbf71fdeba713b54","unresolved":false,"context_lines":[{"line_number":35,"context_line":""},{"line_number":36,"context_line":"        env_id \u003d random.choice(self.context[\"fuel\"][\"environments\"])"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"        node_id \u003d self._get_random_free_node_id()"},{"line_number":39,"context_line":"        self._add_nodes(env_id, node_id, nodes_role)"},{"line_number":40,"context_line":"        self._remove_nodes(env_id, node_id)"}],"source_content_type":"text/x-python","patch_set":40,"id":"da20952f_987cde21","line":38,"in_reply_to":"da20952f_83aa5884","updated":"2015-09-03 00:54:45.000000000","message":"Done","commit_id":"2963bb9cbe99780212bd9f80af588cc259f9706a"},{"author":{"_account_id":14103,"name":"wangtianfa","email":"wang.tianfa@99cloud.net","username":"wangtianfa"},"change_message_id":"e86a8d26ccc924545b2c754eb15db5f4734488c5","unresolved":false,"context_lines":[{"line_number":35,"context_line":""},{"line_number":36,"context_line":"        env_id \u003d random.choice(self.context[\"fuel\"][\"environments\"])"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"        node_id \u003d self._get_random_free_node_id()"},{"line_number":39,"context_line":"        self._add_nodes(env_id, node_id, nodes_role)"},{"line_number":40,"context_line":"        self._remove_nodes(env_id, node_id)"}],"source_content_type":"text/x-python","patch_set":40,"id":"da20952f_83aa5884","line":38,"in_reply_to":"da20952f_a3451c18","updated":"2015-09-02 09:32:57.000000000","message":"sorry,I am mistaken,you omit param node_ids.","commit_id":"2963bb9cbe99780212bd9f80af588cc259f9706a"},{"author":{"_account_id":10475,"name":"Alexander Maretskiy","email":"amaretskiy@mirantis.com","username":"maretskiy"},"change_message_id":"e6e0003138c88a4d432dca3b0b49f510a272fcec","unresolved":false,"context_lines":[{"line_number":28,"context_line":"    def add_and_remove_nodes(self, nodes_role\u003d\"compute\"):"},{"line_number":29,"context_line":"        \"\"\"Add node to environment and remove"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"        :param node_ids: List of Fuel node ids to process"},{"line_number":32,"context_line":"            env saccessfully"},{"line_number":33,"context_line":"        :param nodes_role: Role, which node should be assigned to env with"},{"line_number":34,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":45,"id":"ba15a1d1_507b0928","line":31,"updated":"2015-09-17 16:18:44.000000000","message":"no such param","commit_id":"b076b6c46f7a605559572128c8f2dbbde01ced56"},{"author":{"_account_id":9601,"name":"Oleh Anufriiev","email":"oanufriev@mirantis.com","username":"oanufriev"},"change_message_id":"2950685335e53009c506222999ea4cf1075b8cf2","unresolved":false,"context_lines":[{"line_number":28,"context_line":"    def add_and_remove_nodes(self, nodes_role\u003d\"compute\"):"},{"line_number":29,"context_line":"        \"\"\"Add node to environment and remove"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"        :param node_ids: List of Fuel node ids to process"},{"line_number":32,"context_line":"            env saccessfully"},{"line_number":33,"context_line":"        :param nodes_role: Role, which node should be assigned to env with"},{"line_number":34,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":45,"id":"ba15a1d1_3b1a7118","line":31,"in_reply_to":"ba15a1d1_507b0928","updated":"2015-09-22 08:40:49.000000000","message":"Done","commit_id":"b076b6c46f7a605559572128c8f2dbbde01ced56"},{"author":{"_account_id":10475,"name":"Alexander Maretskiy","email":"amaretskiy@mirantis.com","username":"maretskiy"},"change_message_id":"15f29900123b828200b519d3283449f0ef838f57","unresolved":false,"context_lines":[{"line_number":28,"context_line":"    def add_and_remove_nodes(self, nodes_role\u003dNone):"},{"line_number":29,"context_line":"        \"\"\"Add node to environment and remove"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"        :param nodes_role: list. Roles, which node should be assigned to"},{"line_number":32,"context_line":"            env with"},{"line_number":33,"context_line":"        \"\"\""},{"line_number":34,"context_line":""}],"source_content_type":"text/x-python","patch_set":48,"id":"9a1a9d01_05c5f03a","line":31,"updated":"2015-09-25 14:35:23.000000000","message":"This scenario creates 1 node, so it is logical to use str value instead of list, and make list at L39:\n\n self._add_nodes(env_id, [node_id], [nodes_role])","commit_id":"a51c4e0392655dc9e8cc59e0a1faefc3163f808d"},{"author":{"_account_id":9601,"name":"Oleh Anufriiev","email":"oanufriev@mirantis.com","username":"oanufriev"},"change_message_id":"b9926d0a361d2e6541fe4d15845ca3654bf31f6d","unresolved":false,"context_lines":[{"line_number":28,"context_line":"    def add_and_remove_nodes(self, nodes_role\u003dNone):"},{"line_number":29,"context_line":"        \"\"\"Add node to environment and remove"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"        :param nodes_role: list. Roles, which node should be assigned to"},{"line_number":32,"context_line":"            env with"},{"line_number":33,"context_line":"        \"\"\""},{"line_number":34,"context_line":""}],"source_content_type":"text/x-python","patch_set":48,"id":"9a1a9d01_0807451d","line":31,"in_reply_to":"9a1a9d01_05c5f03a","updated":"2015-09-25 15:07:39.000000000","message":"one fuel node can have several roles\nso it should be the list","commit_id":"a51c4e0392655dc9e8cc59e0a1faefc3163f808d"},{"author":{"_account_id":6172,"name":"Boris Pavlovic","email":"boris@pavlovic.me","username":"boris-42"},"change_message_id":"eb9fb611231a27ef4f9eeda594c6bf74b95d5966","unresolved":false,"context_lines":[{"line_number":15,"context_line":"import random"},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"from rally.plugins.openstack.scenarios.fuel import utils"},{"line_number":18,"context_line":"from rally.task import scenario"},{"line_number":19,"context_line":"from rally.task import validation"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":""}],"source_content_type":"text/x-python","patch_set":49,"id":"9a1a9d01_86782b91","line":18,"updated":"2015-10-02 09:52:34.000000000","message":"from rally.plugins.openstack import scenario","commit_id":"295dfc81c1976f0ba271d59958eb47dbeddbb849"},{"author":{"_account_id":9601,"name":"Oleh Anufriiev","email":"oanufriev@mirantis.com","username":"oanufriev"},"change_message_id":"65dd73a68857807e332eb94fe40bc707a9c6c5a7","unresolved":false,"context_lines":[{"line_number":15,"context_line":"import random"},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"from rally.plugins.openstack.scenarios.fuel import utils"},{"line_number":18,"context_line":"from rally.task import scenario"},{"line_number":19,"context_line":"from rally.task import validation"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":""}],"source_content_type":"text/x-python","patch_set":49,"id":"9a1a9d01_ce863065","line":18,"in_reply_to":"9a1a9d01_86782b91","updated":"2015-10-02 13:55:10.000000000","message":"Done","commit_id":"295dfc81c1976f0ba271d59958eb47dbeddbb849"},{"author":{"_account_id":7369,"name":"Sergey Skripnick","email":"sskripnick@mirantis.com","username":"redixin"},"change_message_id":"ec1df68e0f2e51bd1dcbbbec729accb6ecf2c536","unresolved":false,"context_lines":[{"line_number":32,"context_line":"            env with"},{"line_number":33,"context_line":"        \"\"\""},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"        nodes_role \u003d node_roles or [\"compute\"]"},{"line_number":36,"context_line":"        env_id \u003d random.choice(self.context[\"fuel\"][\"environments\"])"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"        node_id \u003d self._get_free_node_id()"}],"source_content_type":"text/x-python","patch_set":52,"id":"7a2fa921_7201ad04","line":35,"updated":"2015-10-08 09:04:47.000000000","message":"_add_node has the same code, so it is ok to pass None","commit_id":"9badb252ab337ffab4c5129bc294759ae142a83c"},{"author":{"_account_id":9601,"name":"Oleh Anufriiev","email":"oanufriev@mirantis.com","username":"oanufriev"},"change_message_id":"eb69f084d1efd68f8555a570c476db7de5fdc3f8","unresolved":false,"context_lines":[{"line_number":32,"context_line":"            env with"},{"line_number":33,"context_line":"        \"\"\""},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"        nodes_role \u003d node_roles or [\"compute\"]"},{"line_number":36,"context_line":"        env_id \u003d random.choice(self.context[\"fuel\"][\"environments\"])"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"        node_id \u003d self._get_free_node_id()"}],"source_content_type":"text/x-python","patch_set":52,"id":"7a2fa921_ca3eba8b","line":35,"in_reply_to":"7a2fa921_7201ad04","updated":"2015-10-08 14:04:41.000000000","message":"Done","commit_id":"9badb252ab337ffab4c5129bc294759ae142a83c"},{"author":{"_account_id":7369,"name":"Sergey Skripnick","email":"sskripnick@mirantis.com","username":"redixin"},"change_message_id":"ec1df68e0f2e51bd1dcbbbec729accb6ecf2c536","unresolved":false,"context_lines":[{"line_number":33,"context_line":"        \"\"\""},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"        nodes_role \u003d node_roles or [\"compute\"]"},{"line_number":36,"context_line":"        env_id \u003d random.choice(self.context[\"fuel\"][\"environments\"])"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"        node_id \u003d self._get_free_node_id()"},{"line_number":39,"context_line":"        self._add_node(env_id, [node_id], nodes_role)"}],"source_content_type":"text/x-python","patch_set":52,"id":"7a2fa921_f78b6fc1","line":36,"updated":"2015-10-08 09:04:47.000000000","message":"Seems fuel context is required, so we need to add @required_contexts for this scenario","commit_id":"9badb252ab337ffab4c5129bc294759ae142a83c"},{"author":{"_account_id":9601,"name":"Oleh Anufriiev","email":"oanufriev@mirantis.com","username":"oanufriev"},"change_message_id":"eb69f084d1efd68f8555a570c476db7de5fdc3f8","unresolved":false,"context_lines":[{"line_number":33,"context_line":"        \"\"\""},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"        nodes_role \u003d node_roles or [\"compute\"]"},{"line_number":36,"context_line":"        env_id \u003d random.choice(self.context[\"fuel\"][\"environments\"])"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"        node_id \u003d self._get_free_node_id()"},{"line_number":39,"context_line":"        self._add_node(env_id, [node_id], nodes_role)"}],"source_content_type":"text/x-python","patch_set":52,"id":"7a2fa921_aaf01e68","line":36,"in_reply_to":"7a2fa921_f78b6fc1","updated":"2015-10-08 14:04:41.000000000","message":"Done","commit_id":"9badb252ab337ffab4c5129bc294759ae142a83c"}],"rally/plugins/openstack/scenarios/fuel/utils.py":[{"author":{"_account_id":10475,"name":"Alexander Maretskiy","email":"amaretskiy@mirantis.com","username":"maretskiy"},"change_message_id":"ec9f1eba82affca5e420d6645e4aaa5fb6644bc7","unresolved":false,"context_lines":[{"line_number":150,"context_line":"        if not isinstance(nodes_role, list):"},{"line_number":151,"context_line":"            nodes_role \u003d [nodes_role]"},{"line_number":152,"context_line":""},{"line_number":153,"context_line":"        if not isinstance(node_ids, list):"},{"line_number":154,"context_line":"            node_ids \u003d [node_ids]"},{"line_number":155,"context_line":"        try:"},{"line_number":156,"context_line":"            self.admin_clients(\"fuel\").environment.client.add_nodes("}],"source_content_type":"text/x-python","patch_set":10,"id":"3afb71cf_173b22d3","line":153,"updated":"2015-06-05 15:48:07.000000000","message":"Why not require list for all cases? For example, if we have single node_id, then this method can be called:\n\n  _add_nodes(env_id, [node_id], nodes_roles)\n\nThis looks more logical for me","commit_id":"1f59a1bc1cdbd658878b6a31969ce88baf08f5c9"},{"author":{"_account_id":9601,"name":"Oleh Anufriiev","email":"oanufriev@mirantis.com","username":"oanufriev"},"change_message_id":"bc8000ed2154f09a232e87a0dd5dbd24cde8b11f","unresolved":false,"context_lines":[{"line_number":150,"context_line":"        if not isinstance(nodes_role, list):"},{"line_number":151,"context_line":"            nodes_role \u003d [nodes_role]"},{"line_number":152,"context_line":""},{"line_number":153,"context_line":"        if not isinstance(node_ids, list):"},{"line_number":154,"context_line":"            node_ids \u003d [node_ids]"},{"line_number":155,"context_line":"        try:"},{"line_number":156,"context_line":"            self.admin_clients(\"fuel\").environment.client.add_nodes("}],"source_content_type":"text/x-python","patch_set":10,"id":"3afb71cf_2098af77","line":153,"in_reply_to":"3afb71cf_173b22d3","updated":"2015-06-09 13:07:24.000000000","message":"what if nodes_id already instance of list?\n\u003e\u003e [[id, id, id]]","commit_id":"1f59a1bc1cdbd658878b6a31969ce88baf08f5c9"},{"author":{"_account_id":10475,"name":"Alexander Maretskiy","email":"amaretskiy@mirantis.com","username":"maretskiy"},"change_message_id":"ec9f1eba82affca5e420d6645e4aaa5fb6644bc7","unresolved":false,"context_lines":[{"line_number":156,"context_line":"            self.admin_clients(\"fuel\").environment.client.add_nodes("},{"line_number":157,"context_line":"                env_id, node_ids, nodes_role)"},{"line_number":158,"context_line":"        except BaseException as e:"},{"line_number":159,"context_line":"            raise Exception(e.message)"},{"line_number":160,"context_line":""},{"line_number":161,"context_line":"    @base.atomic_action_timer(\"fuel.delete_nodes\")"},{"line_number":162,"context_line":"    def _remove_nodes(self, env_id, node_ids):"}],"source_content_type":"text/x-python","patch_set":10,"id":"3afb71cf_bc55551e","line":159,"updated":"2015-06-05 15:48:07.000000000","message":"I think it is better to avoid generic Exception, use more specific class like RuntimeError","commit_id":"1f59a1bc1cdbd658878b6a31969ce88baf08f5c9"},{"author":{"_account_id":9601,"name":"Oleh Anufriiev","email":"oanufriev@mirantis.com","username":"oanufriev"},"change_message_id":"bc8000ed2154f09a232e87a0dd5dbd24cde8b11f","unresolved":false,"context_lines":[{"line_number":156,"context_line":"            self.admin_clients(\"fuel\").environment.client.add_nodes("},{"line_number":157,"context_line":"                env_id, node_ids, nodes_role)"},{"line_number":158,"context_line":"        except BaseException as e:"},{"line_number":159,"context_line":"            raise Exception(e.message)"},{"line_number":160,"context_line":""},{"line_number":161,"context_line":"    @base.atomic_action_timer(\"fuel.delete_nodes\")"},{"line_number":162,"context_line":"    def _remove_nodes(self, env_id, node_ids):"}],"source_content_type":"text/x-python","patch_set":10,"id":"3afb71cf_20eaefdb","line":159,"in_reply_to":"3afb71cf_bc55551e","updated":"2015-06-09 13:07:24.000000000","message":"Done","commit_id":"1f59a1bc1cdbd658878b6a31969ce88baf08f5c9"},{"author":{"_account_id":10475,"name":"Alexander Maretskiy","email":"amaretskiy@mirantis.com","username":"maretskiy"},"change_message_id":"ec9f1eba82affca5e420d6645e4aaa5fb6644bc7","unresolved":false,"context_lines":[{"line_number":167,"context_line":"        try:"},{"line_number":168,"context_line":"            env.unassign(node_ids)"},{"line_number":169,"context_line":"        except BaseException as e:"},{"line_number":170,"context_line":"            raise Exception(e.message)"},{"line_number":171,"context_line":""},{"line_number":172,"context_line":"    @base.atomic_action_timer(\"fuel.list_nodes\")"},{"line_number":173,"context_line":"    def _list_node_ids(self, env_id\u003dNone):"}],"source_content_type":"text/x-python","patch_set":10,"id":"3afb71cf_174c4241","line":170,"updated":"2015-06-05 15:48:07.000000000","message":"Use specific Exception subclass","commit_id":"1f59a1bc1cdbd658878b6a31969ce88baf08f5c9"},{"author":{"_account_id":9601,"name":"Oleh Anufriiev","email":"oanufriev@mirantis.com","username":"oanufriev"},"change_message_id":"bc8000ed2154f09a232e87a0dd5dbd24cde8b11f","unresolved":false,"context_lines":[{"line_number":167,"context_line":"        try:"},{"line_number":168,"context_line":"            env.unassign(node_ids)"},{"line_number":169,"context_line":"        except BaseException as e:"},{"line_number":170,"context_line":"            raise Exception(e.message)"},{"line_number":171,"context_line":""},{"line_number":172,"context_line":"    @base.atomic_action_timer(\"fuel.list_nodes\")"},{"line_number":173,"context_line":"    def _list_node_ids(self, env_id\u003dNone):"}],"source_content_type":"text/x-python","patch_set":10,"id":"3afb71cf_207f8f16","line":170,"in_reply_to":"3afb71cf_174c4241","updated":"2015-06-09 13:07:24.000000000","message":"Done","commit_id":"1f59a1bc1cdbd658878b6a31969ce88baf08f5c9"},{"author":{"_account_id":10475,"name":"Alexander Maretskiy","email":"amaretskiy@mirantis.com","username":"maretskiy"},"change_message_id":"ec9f1eba82affca5e420d6645e4aaa5fb6644bc7","unresolved":false,"context_lines":[{"line_number":173,"context_line":"    def _list_node_ids(self, env_id\u003dNone):"},{"line_number":174,"context_line":"        result \u003d self.admin_clients(\"fuel\").node.get_all("},{"line_number":175,"context_line":"            environment_id\u003denv_id)"},{"line_number":176,"context_line":"        return map(lambda x: x[\"id\"], result)"},{"line_number":177,"context_line":""},{"line_number":178,"context_line":"    def _node_is_assigned(self, node_id):"},{"line_number":179,"context_line":"        result \u003d self.admin_clients(\"fuel\").node.get_all()"}],"source_content_type":"text/x-python","patch_set":10,"id":"3afb71cf_37cf3eb2","line":176,"updated":"2015-06-05 15:48:07.000000000","message":"This is not Py3-compatible, since map() returns iterator in Py3.\n\nList comprehension is better:\n\n return [x[\"id\"] for x in result]","commit_id":"1f59a1bc1cdbd658878b6a31969ce88baf08f5c9"},{"author":{"_account_id":9601,"name":"Oleh Anufriiev","email":"oanufriev@mirantis.com","username":"oanufriev"},"change_message_id":"bc8000ed2154f09a232e87a0dd5dbd24cde8b11f","unresolved":false,"context_lines":[{"line_number":173,"context_line":"    def _list_node_ids(self, env_id\u003dNone):"},{"line_number":174,"context_line":"        result \u003d self.admin_clients(\"fuel\").node.get_all("},{"line_number":175,"context_line":"            environment_id\u003denv_id)"},{"line_number":176,"context_line":"        return map(lambda x: x[\"id\"], result)"},{"line_number":177,"context_line":""},{"line_number":178,"context_line":"    def _node_is_assigned(self, node_id):"},{"line_number":179,"context_line":"        result \u003d self.admin_clients(\"fuel\").node.get_all()"}],"source_content_type":"text/x-python","patch_set":10,"id":"3afb71cf_60fc6772","line":176,"in_reply_to":"3afb71cf_37cf3eb2","updated":"2015-06-09 13:07:24.000000000","message":"Done","commit_id":"1f59a1bc1cdbd658878b6a31969ce88baf08f5c9"},{"author":{"_account_id":10475,"name":"Alexander Maretskiy","email":"amaretskiy@mirantis.com","username":"maretskiy"},"change_message_id":"ec9f1eba82affca5e420d6645e4aaa5fb6644bc7","unresolved":false,"context_lines":[{"line_number":179,"context_line":"        result \u003d self.admin_clients(\"fuel\").node.get_all()"},{"line_number":180,"context_line":"        for item in result:"},{"line_number":181,"context_line":"            if item[\"id\"] \u003d\u003d node_id:"},{"line_number":182,"context_line":"                return True if item[\"cluster\"] else False"},{"line_number":183,"context_line":"        else:"},{"line_number":184,"context_line":"            return False"}],"source_content_type":"text/x-python","patch_set":10,"id":"3afb71cf_9774b29c","line":182,"updated":"2015-06-05 15:48:07.000000000","message":"return bool(item[\"cluster\"])","commit_id":"1f59a1bc1cdbd658878b6a31969ce88baf08f5c9"},{"author":{"_account_id":9601,"name":"Oleh Anufriiev","email":"oanufriev@mirantis.com","username":"oanufriev"},"change_message_id":"bc8000ed2154f09a232e87a0dd5dbd24cde8b11f","unresolved":false,"context_lines":[{"line_number":179,"context_line":"        result \u003d self.admin_clients(\"fuel\").node.get_all()"},{"line_number":180,"context_line":"        for item in result:"},{"line_number":181,"context_line":"            if item[\"id\"] \u003d\u003d node_id:"},{"line_number":182,"context_line":"                return True if item[\"cluster\"] else False"},{"line_number":183,"context_line":"        else:"},{"line_number":184,"context_line":"            return False"}],"source_content_type":"text/x-python","patch_set":10,"id":"3afb71cf_20b30f9a","line":182,"in_reply_to":"3afb71cf_9774b29c","updated":"2015-06-09 13:07:24.000000000","message":"Done","commit_id":"1f59a1bc1cdbd658878b6a31969ce88baf08f5c9"},{"author":{"_account_id":10475,"name":"Alexander Maretskiy","email":"amaretskiy@mirantis.com","username":"maretskiy"},"change_message_id":"d1048a67a02f8115e449260f0890e2ac732c1ab5","unresolved":false,"context_lines":[{"line_number":157,"context_line":"            raise RuntimeError(e)"},{"line_number":158,"context_line":""},{"line_number":159,"context_line":"    @atomic.action_timer(\"fuel.delete_nodes\")"},{"line_number":160,"context_line":"    def _remove_nodes(self, env_id, node_ids):"},{"line_number":161,"context_line":"        if not isinstance(node_ids, list):"},{"line_number":162,"context_line":"            node_ids \u003d [node_ids]"},{"line_number":163,"context_line":""}],"source_content_type":"text/x-python","patch_set":36,"id":"fa1b9901_c39ac761","line":160,"updated":"2015-08-21 14:46:31.000000000","message":"Maybe s/remove/delete/ ? Otherwise rename atomic action name","commit_id":"c1b5e47ae4e3a01e53cffb3144d3df4fd329a058"},{"author":{"_account_id":9601,"name":"Oleh Anufriiev","email":"oanufriev@mirantis.com","username":"oanufriev"},"change_message_id":"c88be4dc8ffbdf1b610fe510dd80b7381fa62982","unresolved":false,"context_lines":[{"line_number":157,"context_line":"            raise RuntimeError(e)"},{"line_number":158,"context_line":""},{"line_number":159,"context_line":"    @atomic.action_timer(\"fuel.delete_nodes\")"},{"line_number":160,"context_line":"    def _remove_nodes(self, env_id, node_ids):"},{"line_number":161,"context_line":"        if not isinstance(node_ids, list):"},{"line_number":162,"context_line":"            node_ids \u003d [node_ids]"},{"line_number":163,"context_line":""}],"source_content_type":"text/x-python","patch_set":36,"id":"fa1b9901_03f2f46f","line":160,"in_reply_to":"fa1b9901_c39ac761","updated":"2015-08-21 16:51:39.000000000","message":"Not \u0027delete\u0027, but \u0027remove\u0027","commit_id":"c1b5e47ae4e3a01e53cffb3144d3df4fd329a058"},{"author":{"_account_id":10475,"name":"Alexander Maretskiy","email":"amaretskiy@mirantis.com","username":"maretskiy"},"change_message_id":"d1048a67a02f8115e449260f0890e2ac732c1ab5","unresolved":false,"context_lines":[{"line_number":169,"context_line":"            raise RuntimeError(e)"},{"line_number":170,"context_line":""},{"line_number":171,"context_line":"    @atomic.action_timer(\"fuel.list_nodes\")"},{"line_number":172,"context_line":"    def _list_node_ids(self, env_id\u003dNone):"},{"line_number":173,"context_line":"        result \u003d self.admin_clients(\"fuel\").node.get_all("},{"line_number":174,"context_line":"            environment_id\u003denv_id)"},{"line_number":175,"context_line":"        return [x[\"id\"] for x in result]"}],"source_content_type":"text/x-python","patch_set":36,"id":"fa1b9901_638c1bda","line":172,"updated":"2015-08-21 14:46:31.000000000","message":"Why not name this method similar to atomic action name (_list_nodes)?","commit_id":"c1b5e47ae4e3a01e53cffb3144d3df4fd329a058"},{"author":{"_account_id":9601,"name":"Oleh Anufriiev","email":"oanufriev@mirantis.com","username":"oanufriev"},"change_message_id":"c88be4dc8ffbdf1b610fe510dd80b7381fa62982","unresolved":false,"context_lines":[{"line_number":169,"context_line":"            raise RuntimeError(e)"},{"line_number":170,"context_line":""},{"line_number":171,"context_line":"    @atomic.action_timer(\"fuel.list_nodes\")"},{"line_number":172,"context_line":"    def _list_node_ids(self, env_id\u003dNone):"},{"line_number":173,"context_line":"        result \u003d self.admin_clients(\"fuel\").node.get_all("},{"line_number":174,"context_line":"            environment_id\u003denv_id)"},{"line_number":175,"context_line":"        return [x[\"id\"] for x in result]"}],"source_content_type":"text/x-python","patch_set":36,"id":"fa1b9901_e3610013","line":172,"in_reply_to":"fa1b9901_638c1bda","updated":"2015-08-21 16:51:39.000000000","message":"IMO this is not in principle","commit_id":"c1b5e47ae4e3a01e53cffb3144d3df4fd329a058"},{"author":{"_account_id":10475,"name":"Alexander Maretskiy","email":"amaretskiy@mirantis.com","username":"maretskiy"},"change_message_id":"e2cdac107f4c377c95ecbd01961e92e7b8798ea8","unresolved":false,"context_lines":[{"line_number":153,"context_line":"        if not isinstance(node_ids, list):"},{"line_number":154,"context_line":"            node_ids \u003d [node_ids]"},{"line_number":155,"context_line":"        try:"},{"line_number":156,"context_line":"            self.admin_clients(\"fuel\").environment.client.add_nodes("},{"line_number":157,"context_line":"                env_id, node_ids, nodes_role)"},{"line_number":158,"context_line":"        except BaseException as e:"},{"line_number":159,"context_line":"            raise RuntimeError(e)"}],"source_content_type":"text/x-python","patch_set":41,"id":"da20952f_8ecc4b8a","line":156,"updated":"2015-09-04 14:42:05.000000000","message":"Why do not return here?","commit_id":"4135888c1ab0f0d7814305ce8f1d4bd6e664ec81"},{"author":{"_account_id":10475,"name":"Alexander Maretskiy","email":"amaretskiy@mirantis.com","username":"maretskiy"},"change_message_id":"e510df201058cae648bfadf2afb7c409ae6533a4","unresolved":false,"context_lines":[{"line_number":153,"context_line":"        if not isinstance(node_ids, list):"},{"line_number":154,"context_line":"            node_ids \u003d [node_ids]"},{"line_number":155,"context_line":"        try:"},{"line_number":156,"context_line":"            self.admin_clients(\"fuel\").environment.client.add_nodes("},{"line_number":157,"context_line":"                env_id, node_ids, nodes_role)"},{"line_number":158,"context_line":"        except BaseException as e:"},{"line_number":159,"context_line":"            raise RuntimeError(e)"}],"source_content_type":"text/x-python","patch_set":41,"id":"da20952f_4a2b3682","line":156,"in_reply_to":"da20952f_3c8182c3","updated":"2015-09-07 15:28:41.000000000","message":"Why do not return result of add_nodes()? Utils methods usually return results, if we get some result from clients method, of course.\n\n  return self.admin_clients(\"fuel\").environment.client.add_nodes(\n      env_id, node_ids, nodes_role)","commit_id":"4135888c1ab0f0d7814305ce8f1d4bd6e664ec81"},{"author":{"_account_id":9601,"name":"Oleh Anufriiev","email":"oanufriev@mirantis.com","username":"oanufriev"},"change_message_id":"50aba16e1e34d68f3ad0291314150c97db959557","unresolved":false,"context_lines":[{"line_number":153,"context_line":"        if not isinstance(node_ids, list):"},{"line_number":154,"context_line":"            node_ids \u003d [node_ids]"},{"line_number":155,"context_line":"        try:"},{"line_number":156,"context_line":"            self.admin_clients(\"fuel\").environment.client.add_nodes("},{"line_number":157,"context_line":"                env_id, node_ids, nodes_role)"},{"line_number":158,"context_line":"        except BaseException as e:"},{"line_number":159,"context_line":"            raise RuntimeError(e)"}],"source_content_type":"text/x-python","patch_set":41,"id":"da20952f_3c8182c3","line":156,"in_reply_to":"da20952f_8ecc4b8a","updated":"2015-09-07 09:04:31.000000000","message":"Return what? Return why?\nThe answer is 42 )","commit_id":"4135888c1ab0f0d7814305ce8f1d4bd6e664ec81"},{"author":{"_account_id":7369,"name":"Sergey Skripnick","email":"sskripnick@mirantis.com","username":"redixin"},"change_message_id":"f9a73917531f4c9d642fb0e20b0308d53e97b00b","unresolved":false,"context_lines":[{"line_number":142,"context_line":"        self.admin_clients(\"fuel\").environment.delete(env_id, retries)"},{"line_number":143,"context_line":""},{"line_number":144,"context_line":"    @atomic.action_timer(\"fuel.add_nodes\")"},{"line_number":145,"context_line":"    def _add_nodes(self, env_id, node_ids, nodes_role\u003dNone):"},{"line_number":146,"context_line":""},{"line_number":147,"context_line":"        nodes_role \u003d nodes_role or [\"compute\"]"},{"line_number":148,"context_line":""}],"source_content_type":"text/x-python","patch_set":45,"id":"ba15a1d1_4565a2b2","line":145,"updated":"2015-09-17 10:38:38.000000000","message":"This method is a bit complicated.\n\nnode_ids may be either single id or list of ids. This is confusing. Please make this method accept only list of ids.","commit_id":"b076b6c46f7a605559572128c8f2dbbde01ced56"},{"author":{"_account_id":9601,"name":"Oleh Anufriiev","email":"oanufriev@mirantis.com","username":"oanufriev"},"change_message_id":"2950685335e53009c506222999ea4cf1075b8cf2","unresolved":false,"context_lines":[{"line_number":142,"context_line":"        self.admin_clients(\"fuel\").environment.delete(env_id, retries)"},{"line_number":143,"context_line":""},{"line_number":144,"context_line":"    @atomic.action_timer(\"fuel.add_nodes\")"},{"line_number":145,"context_line":"    def _add_nodes(self, env_id, node_ids, nodes_role\u003dNone):"},{"line_number":146,"context_line":""},{"line_number":147,"context_line":"        nodes_role \u003d nodes_role or [\"compute\"]"},{"line_number":148,"context_line":""}],"source_content_type":"text/x-python","patch_set":45,"id":"ba15a1d1_38583756","line":145,"in_reply_to":"ba15a1d1_4565a2b2","updated":"2015-09-22 08:40:49.000000000","message":"Done","commit_id":"b076b6c46f7a605559572128c8f2dbbde01ced56"},{"author":{"_account_id":7369,"name":"Sergey Skripnick","email":"sskripnick@mirantis.com","username":"redixin"},"change_message_id":"f9a73917531f4c9d642fb0e20b0308d53e97b00b","unresolved":false,"context_lines":[{"line_number":158,"context_line":"            raise RuntimeError(e)"},{"line_number":159,"context_line":""},{"line_number":160,"context_line":"    @atomic.action_timer(\"fuel.delete_nodes\")"},{"line_number":161,"context_line":"    def _remove_nodes(self, env_id, node_ids):"},{"line_number":162,"context_line":"        if not isinstance(node_ids, list):"},{"line_number":163,"context_line":"            node_ids \u003d [node_ids]"},{"line_number":164,"context_line":""}],"source_content_type":"text/x-python","patch_set":45,"id":"ba15a1d1_656a2683","line":161,"updated":"2015-09-17 10:38:38.000000000","message":"ditto","commit_id":"b076b6c46f7a605559572128c8f2dbbde01ced56"},{"author":{"_account_id":9601,"name":"Oleh Anufriiev","email":"oanufriev@mirantis.com","username":"oanufriev"},"change_message_id":"2950685335e53009c506222999ea4cf1075b8cf2","unresolved":false,"context_lines":[{"line_number":158,"context_line":"            raise RuntimeError(e)"},{"line_number":159,"context_line":""},{"line_number":160,"context_line":"    @atomic.action_timer(\"fuel.delete_nodes\")"},{"line_number":161,"context_line":"    def _remove_nodes(self, env_id, node_ids):"},{"line_number":162,"context_line":"        if not isinstance(node_ids, list):"},{"line_number":163,"context_line":"            node_ids \u003d [node_ids]"},{"line_number":164,"context_line":""}],"source_content_type":"text/x-python","patch_set":45,"id":"ba15a1d1_78254fc0","line":161,"in_reply_to":"ba15a1d1_656a2683","updated":"2015-09-22 08:40:49.000000000","message":"Done","commit_id":"b076b6c46f7a605559572128c8f2dbbde01ced56"},{"author":{"_account_id":7369,"name":"Sergey Skripnick","email":"sskripnick@mirantis.com","username":"redixin"},"change_message_id":"f9a73917531f4c9d642fb0e20b0308d53e97b00b","unresolved":false,"context_lines":[{"line_number":170,"context_line":"            raise RuntimeError(e)"},{"line_number":171,"context_line":""},{"line_number":172,"context_line":"    @atomic.action_timer(\"fuel.list_nodes\")"},{"line_number":173,"context_line":"    def _list_node_ids(self, env_id\u003dNone):"},{"line_number":174,"context_line":"        result \u003d self.admin_clients(\"fuel\").node.get_all("},{"line_number":175,"context_line":"            environment_id\u003denv_id)"},{"line_number":176,"context_line":"        return [x[\"id\"] for x in result]"}],"source_content_type":"text/x-python","patch_set":45,"id":"ba15a1d1_c5f8d2c5","line":173,"updated":"2015-09-17 10:38:38.000000000","message":"hm. why not list whole nodes? Please do not remove information that may be needed later in other scenarios.","commit_id":"b076b6c46f7a605559572128c8f2dbbde01ced56"},{"author":{"_account_id":9601,"name":"Oleh Anufriiev","email":"oanufriev@mirantis.com","username":"oanufriev"},"change_message_id":"2950685335e53009c506222999ea4cf1075b8cf2","unresolved":false,"context_lines":[{"line_number":170,"context_line":"            raise RuntimeError(e)"},{"line_number":171,"context_line":""},{"line_number":172,"context_line":"    @atomic.action_timer(\"fuel.list_nodes\")"},{"line_number":173,"context_line":"    def _list_node_ids(self, env_id\u003dNone):"},{"line_number":174,"context_line":"        result \u003d self.admin_clients(\"fuel\").node.get_all("},{"line_number":175,"context_line":"            environment_id\u003denv_id)"},{"line_number":176,"context_line":"        return [x[\"id\"] for x in result]"}],"source_content_type":"text/x-python","patch_set":45,"id":"ba15a1d1_7b72297e","line":173,"in_reply_to":"ba15a1d1_c5f8d2c5","updated":"2015-09-22 08:40:49.000000000","message":"I need only ids.\nThis method is called  _list_node_ids\nIf anyone will need method, that returns whole nodes info\none can reimplement this method or implement another one","commit_id":"b076b6c46f7a605559572128c8f2dbbde01ced56"},{"author":{"_account_id":7369,"name":"Sergey Skripnick","email":"sskripnick@mirantis.com","username":"redixin"},"change_message_id":"f9a73917531f4c9d642fb0e20b0308d53e97b00b","unresolved":false,"context_lines":[{"line_number":176,"context_line":"        return [x[\"id\"] for x in result]"},{"line_number":177,"context_line":""},{"line_number":178,"context_line":"    def _node_is_assigned(self, node_id):"},{"line_number":179,"context_line":"        result \u003d self.admin_clients(\"fuel\").node.get_all()"},{"line_number":180,"context_line":"        for item in result:"},{"line_number":181,"context_line":"            if item[\"id\"] \u003d\u003d node_id:"},{"line_number":182,"context_line":"                return bool(item[\"cluster\"])"}],"source_content_type":"text/x-python","patch_set":45,"id":"ba15a1d1_c5e69214","line":179,"updated":"2015-09-17 10:38:38.000000000","message":"I believe there is a method get_node_by_id or similar.","commit_id":"b076b6c46f7a605559572128c8f2dbbde01ced56"},{"author":{"_account_id":9601,"name":"Oleh Anufriiev","email":"oanufriev@mirantis.com","username":"oanufriev"},"change_message_id":"2950685335e53009c506222999ea4cf1075b8cf2","unresolved":false,"context_lines":[{"line_number":176,"context_line":"        return [x[\"id\"] for x in result]"},{"line_number":177,"context_line":""},{"line_number":178,"context_line":"    def _node_is_assigned(self, node_id):"},{"line_number":179,"context_line":"        result \u003d self.admin_clients(\"fuel\").node.get_all()"},{"line_number":180,"context_line":"        for item in result:"},{"line_number":181,"context_line":"            if item[\"id\"] \u003d\u003d node_id:"},{"line_number":182,"context_line":"                return bool(item[\"cluster\"])"}],"source_content_type":"text/x-python","patch_set":45,"id":"ba15a1d1_1bec4d28","line":179,"in_reply_to":"ba15a1d1_c5e69214","updated":"2015-09-22 08:40:49.000000000","message":"Done","commit_id":"b076b6c46f7a605559572128c8f2dbbde01ced56"},{"author":{"_account_id":10475,"name":"Alexander Maretskiy","email":"amaretskiy@mirantis.com","username":"maretskiy"},"change_message_id":"15f29900123b828200b519d3283449f0ef838f57","unresolved":false,"context_lines":[{"line_number":143,"context_line":""},{"line_number":144,"context_line":"    @atomic.action_timer(\"fuel.add_nodes\")"},{"line_number":145,"context_line":"    def _add_nodes(self, env_id, node_ids, nodes_role\u003dNone):"},{"line_number":146,"context_line":"        \"\"\"Add nodes to envieronment"},{"line_number":147,"context_line":""},{"line_number":148,"context_line":"        :param env_id environment id"},{"line_number":149,"context_line":"        :param node_ids list of node ids"}],"source_content_type":"text/x-python","patch_set":48,"id":"9a1a9d01_8520209d","line":146,"updated":"2015-09-25 14:35:23.000000000","message":"s/envieronment/environment/","commit_id":"a51c4e0392655dc9e8cc59e0a1faefc3163f808d"},{"author":{"_account_id":9601,"name":"Oleh Anufriiev","email":"oanufriev@mirantis.com","username":"oanufriev"},"change_message_id":"b9926d0a361d2e6541fe4d15845ca3654bf31f6d","unresolved":false,"context_lines":[{"line_number":143,"context_line":""},{"line_number":144,"context_line":"    @atomic.action_timer(\"fuel.add_nodes\")"},{"line_number":145,"context_line":"    def _add_nodes(self, env_id, node_ids, nodes_role\u003dNone):"},{"line_number":146,"context_line":"        \"\"\"Add nodes to envieronment"},{"line_number":147,"context_line":""},{"line_number":148,"context_line":"        :param env_id environment id"},{"line_number":149,"context_line":"        :param node_ids list of node ids"}],"source_content_type":"text/x-python","patch_set":48,"id":"9a1a9d01_686601ef","line":146,"in_reply_to":"9a1a9d01_8520209d","updated":"2015-09-25 15:07:39.000000000","message":"Done","commit_id":"a51c4e0392655dc9e8cc59e0a1faefc3163f808d"},{"author":{"_account_id":7369,"name":"Sergey Skripnick","email":"sskripnick@mirantis.com","username":"redixin"},"change_message_id":"ec1df68e0f2e51bd1dcbbbec729accb6ecf2c536","unresolved":false,"context_lines":[{"line_number":150,"context_line":"        :param nodes_role list of roles"},{"line_number":151,"context_line":"        \"\"\""},{"line_number":152,"context_line":""},{"line_number":153,"context_line":"        nodes_role \u003d node_roles or [\"compute\"]"},{"line_number":154,"context_line":""},{"line_number":155,"context_line":"        try:"},{"line_number":156,"context_line":"            self.admin_clients(\"fuel\").environment.client.add_nodes("}],"source_content_type":"text/x-python","patch_set":52,"id":"7a2fa921_f727efc7","line":153,"updated":"2015-10-08 09:04:47.000000000","message":"it is not necessary to create extra variable.\n\n node_roles \u003d node_roles or [\"compute\"]\n\nis okay","commit_id":"9badb252ab337ffab4c5129bc294759ae142a83c"},{"author":{"_account_id":9601,"name":"Oleh Anufriiev","email":"oanufriev@mirantis.com","username":"oanufriev"},"change_message_id":"eb69f084d1efd68f8555a570c476db7de5fdc3f8","unresolved":false,"context_lines":[{"line_number":150,"context_line":"        :param nodes_role list of roles"},{"line_number":151,"context_line":"        \"\"\""},{"line_number":152,"context_line":""},{"line_number":153,"context_line":"        nodes_role \u003d node_roles or [\"compute\"]"},{"line_number":154,"context_line":""},{"line_number":155,"context_line":"        try:"},{"line_number":156,"context_line":"            self.admin_clients(\"fuel\").environment.client.add_nodes("}],"source_content_type":"text/x-python","patch_set":52,"id":"7a2fa921_8aebe277","line":153,"in_reply_to":"7a2fa921_f727efc7","updated":"2015-10-08 14:04:41.000000000","message":"Done","commit_id":"9badb252ab337ffab4c5129bc294759ae142a83c"},{"author":{"_account_id":7369,"name":"Sergey Skripnick","email":"sskripnick@mirantis.com","username":"redixin"},"change_message_id":"ec1df68e0f2e51bd1dcbbbec729accb6ecf2c536","unresolved":false,"context_lines":[{"line_number":156,"context_line":"            self.admin_clients(\"fuel\").environment.client.add_nodes("},{"line_number":157,"context_line":"                env_id, node_ids, nodes_role)"},{"line_number":158,"context_line":"        except BaseException as e:"},{"line_number":159,"context_line":"            raise RuntimeError(e)"},{"line_number":160,"context_line":""},{"line_number":161,"context_line":"    @atomic.action_timer(\"fuel.delete_node\")"},{"line_number":162,"context_line":"    def _remove_node(self, env_id, node_id):"}],"source_content_type":"text/x-python","patch_set":52,"id":"7a2fa921_72768da5","line":159,"updated":"2015-10-08 09:04:47.000000000","message":"What this excepion looks like? Probable we need to add more info, like\n\n \"Unable to create node. Fuel client exited with error %s\"","commit_id":"9badb252ab337ffab4c5129bc294759ae142a83c"},{"author":{"_account_id":9601,"name":"Oleh Anufriiev","email":"oanufriev@mirantis.com","username":"oanufriev"},"change_message_id":"eb69f084d1efd68f8555a570c476db7de5fdc3f8","unresolved":false,"context_lines":[{"line_number":156,"context_line":"            self.admin_clients(\"fuel\").environment.client.add_nodes("},{"line_number":157,"context_line":"                env_id, node_ids, nodes_role)"},{"line_number":158,"context_line":"        except BaseException as e:"},{"line_number":159,"context_line":"            raise RuntimeError(e)"},{"line_number":160,"context_line":""},{"line_number":161,"context_line":"    @atomic.action_timer(\"fuel.delete_node\")"},{"line_number":162,"context_line":"    def _remove_node(self, env_id, node_id):"}],"source_content_type":"text/x-python","patch_set":52,"id":"7a2fa921_c5654bb5","line":159,"in_reply_to":"7a2fa921_72768da5","updated":"2015-10-08 14:04:41.000000000","message":"Done","commit_id":"9badb252ab337ffab4c5129bc294759ae142a83c"},{"author":{"_account_id":7369,"name":"Sergey Skripnick","email":"sskripnick@mirantis.com","username":"redixin"},"change_message_id":"ec1df68e0f2e51bd1dcbbbec729accb6ecf2c536","unresolved":false,"context_lines":[{"line_number":166,"context_line":"        try:"},{"line_number":167,"context_line":"            env.unassign([node_id])"},{"line_number":168,"context_line":"        except BaseException as e:"},{"line_number":169,"context_line":"            raise RuntimeError(e)"},{"line_number":170,"context_line":""},{"line_number":171,"context_line":"    @atomic.action_timer(\"fuel.list_nodes\")"},{"line_number":172,"context_line":"    def _list_node_ids(self, env_id\u003dNone):"}],"source_content_type":"text/x-python","patch_set":52,"id":"7a2fa921_927b298c","line":169,"updated":"2015-10-08 09:04:47.000000000","message":"ditto","commit_id":"9badb252ab337ffab4c5129bc294759ae142a83c"},{"author":{"_account_id":9601,"name":"Oleh Anufriiev","email":"oanufriev@mirantis.com","username":"oanufriev"},"change_message_id":"eb69f084d1efd68f8555a570c476db7de5fdc3f8","unresolved":false,"context_lines":[{"line_number":166,"context_line":"        try:"},{"line_number":167,"context_line":"            env.unassign([node_id])"},{"line_number":168,"context_line":"        except BaseException as e:"},{"line_number":169,"context_line":"            raise RuntimeError(e)"},{"line_number":170,"context_line":""},{"line_number":171,"context_line":"    @atomic.action_timer(\"fuel.list_nodes\")"},{"line_number":172,"context_line":"    def _list_node_ids(self, env_id\u003dNone):"}],"source_content_type":"text/x-python","patch_set":52,"id":"7a2fa921_45729b7c","line":169,"in_reply_to":"7a2fa921_927b298c","updated":"2015-10-08 14:04:41.000000000","message":"Done","commit_id":"9badb252ab337ffab4c5129bc294759ae142a83c"},{"author":{"_account_id":7369,"name":"Sergey Skripnick","email":"sskripnick@mirantis.com","username":"redixin"},"change_message_id":"ec1df68e0f2e51bd1dcbbbec729accb6ecf2c536","unresolved":false,"context_lines":[{"line_number":179,"context_line":"            node \u003d self.admin_clients(\"fuel\").node.get_by_id(node_id)"},{"line_number":180,"context_line":"            return bool(node[\"cluster\"])"},{"line_number":181,"context_line":"        except BaseException as e:"},{"line_number":182,"context_line":"            raise RuntimeError(e)"},{"line_number":183,"context_line":""},{"line_number":184,"context_line":"    def _get_free_node_id(self):"},{"line_number":185,"context_line":"        node_ids \u003d self._list_node_ids()"}],"source_content_type":"text/x-python","patch_set":52,"id":"7a2fa921_326c95cf","line":182,"updated":"2015-10-08 09:04:47.000000000","message":"ditto","commit_id":"9badb252ab337ffab4c5129bc294759ae142a83c"},{"author":{"_account_id":9601,"name":"Oleh Anufriiev","email":"oanufriev@mirantis.com","username":"oanufriev"},"change_message_id":"eb69f084d1efd68f8555a570c476db7de5fdc3f8","unresolved":false,"context_lines":[{"line_number":179,"context_line":"            node \u003d self.admin_clients(\"fuel\").node.get_by_id(node_id)"},{"line_number":180,"context_line":"            return bool(node[\"cluster\"])"},{"line_number":181,"context_line":"        except BaseException as e:"},{"line_number":182,"context_line":"            raise RuntimeError(e)"},{"line_number":183,"context_line":""},{"line_number":184,"context_line":"    def _get_free_node_id(self):"},{"line_number":185,"context_line":"        node_ids \u003d self._list_node_ids()"}],"source_content_type":"text/x-python","patch_set":52,"id":"7a2fa921_05682386","line":182,"in_reply_to":"7a2fa921_326c95cf","updated":"2015-10-08 14:04:41.000000000","message":"Done","commit_id":"9badb252ab337ffab4c5129bc294759ae142a83c"}],"samples/tasks/scenarios/fuel/add_and_remove_nodes.json":[{"author":{"_account_id":10475,"name":"Alexander Maretskiy","email":"amaretskiy@mirantis.com","username":"maretskiy"},"change_message_id":"ec9f1eba82affca5e420d6645e4aaa5fb6644bc7","unresolved":false,"context_lines":[{"line_number":18,"context_line":"            \"runner\": {"},{"line_number":19,"context_line":"                \"type\": \"constant\","},{"line_number":20,"context_line":"                \"times\": 200,"},{"line_number":21,"context_line":"                \"concurrency\": 1"},{"line_number":22,"context_line":"            }"},{"line_number":23,"context_line":"        }"},{"line_number":24,"context_line":"    ]"}],"source_content_type":"application/json","patch_set":10,"id":"3afb71cf_57dd1a41","line":21,"updated":"2015-06-05 15:48:07.000000000","message":"concurrency `1\u0027 makes no sense for constant runner (this actually becomes serial runner).\n\nI think, for 200 iterations it is reasonable to use at least 10 workers","commit_id":"1f59a1bc1cdbd658878b6a31969ce88baf08f5c9"},{"author":{"_account_id":9601,"name":"Oleh Anufriiev","email":"oanufriev@mirantis.com","username":"oanufriev"},"change_message_id":"230fd942fda44576bd89f5a280b68633ef234be8","unresolved":false,"context_lines":[{"line_number":18,"context_line":"            \"runner\": {"},{"line_number":19,"context_line":"                \"type\": \"constant\","},{"line_number":20,"context_line":"                \"times\": 200,"},{"line_number":21,"context_line":"                \"concurrency\": 1"},{"line_number":22,"context_line":"            }"},{"line_number":23,"context_line":"        }"},{"line_number":24,"context_line":"    ]"}],"source_content_type":"application/json","patch_set":10,"id":"3afb71cf_3713455d","line":21,"in_reply_to":"3afb71cf_57dd1a41","updated":"2015-06-09 16:55:45.000000000","message":"Done","commit_id":"1f59a1bc1cdbd658878b6a31969ce88baf08f5c9"},{"author":{"_account_id":14103,"name":"wangtianfa","email":"wang.tianfa@99cloud.net","username":"wangtianfa"},"change_message_id":"6a118ad681a7dd5e39fc06f3d15bd183e02e2377","unresolved":false,"context_lines":[{"line_number":16,"context_line":"            },"},{"line_number":17,"context_line":"            \"runner\": {"},{"line_number":18,"context_line":"                \"type\": \"constant\","},{"line_number":19,"context_line":"                \"times\": 200,"},{"line_number":20,"context_line":"                \"concurrency\": 10"},{"line_number":21,"context_line":"            }"},{"line_number":22,"context_line":"        }"}],"source_content_type":"application/json","patch_set":29,"id":"1a4dcd0f_137a04f2","line":19,"updated":"2015-08-04 13:52:17.000000000","message":"Hi,200 will not be too much?","commit_id":"70072527193740893059fb1e7170e3a3267b0899"},{"author":{"_account_id":9601,"name":"Oleh Anufriiev","email":"oanufriev@mirantis.com","username":"oanufriev"},"change_message_id":"b3cb6d05782540b9c56a2500d3e986bc6232c66f","unresolved":false,"context_lines":[{"line_number":16,"context_line":"            },"},{"line_number":17,"context_line":"            \"runner\": {"},{"line_number":18,"context_line":"                \"type\": \"constant\","},{"line_number":19,"context_line":"                \"times\": 200,"},{"line_number":20,"context_line":"                \"concurrency\": 10"},{"line_number":21,"context_line":"            }"},{"line_number":22,"context_line":"        }"}],"source_content_type":"application/json","patch_set":29,"id":"1a4dcd0f_5682ba95","line":19,"in_reply_to":"1a4dcd0f_137a04f2","updated":"2015-08-04 14:05:23.000000000","message":"This is a sample config. So, user can decide how meny times to iterate.","commit_id":"70072527193740893059fb1e7170e3a3267b0899"},{"author":{"_account_id":10475,"name":"Alexander Maretskiy","email":"amaretskiy@mirantis.com","username":"maretskiy"},"change_message_id":"e6e0003138c88a4d432dca3b0b49f510a272fcec","unresolved":false,"context_lines":[{"line_number":17,"context_line":"            \"runner\": {"},{"line_number":18,"context_line":"                \"type\": \"constant\","},{"line_number":19,"context_line":"                \"times\": 200,"},{"line_number":20,"context_line":"                \"concurrency\": 10"},{"line_number":21,"context_line":"            }"},{"line_number":22,"context_line":"        }"},{"line_number":23,"context_line":"    ]"}],"source_content_type":"application/json","patch_set":45,"id":"ba15a1d1_700bad7d","line":20,"updated":"2015-09-17 16:18:44.000000000","message":"Can we use concurrency \u003e 1 ? I thought we have already discussed this before and the only possible value is 1 (that is why I recommend `serial\u0027 runner)","commit_id":"b076b6c46f7a605559572128c8f2dbbde01ced56"},{"author":{"_account_id":9601,"name":"Oleh Anufriiev","email":"oanufriev@mirantis.com","username":"oanufriev"},"change_message_id":"2950685335e53009c506222999ea4cf1075b8cf2","unresolved":false,"context_lines":[{"line_number":17,"context_line":"            \"runner\": {"},{"line_number":18,"context_line":"                \"type\": \"constant\","},{"line_number":19,"context_line":"                \"times\": 200,"},{"line_number":20,"context_line":"                \"concurrency\": 10"},{"line_number":21,"context_line":"            }"},{"line_number":22,"context_line":"        }"},{"line_number":23,"context_line":"    ]"}],"source_content_type":"application/json","patch_set":45,"id":"ba15a1d1_bb98c16b","line":20,"in_reply_to":"ba15a1d1_700bad7d","updated":"2015-09-22 08:40:49.000000000","message":"\u003e\u003e Can we use concurrency \u003e 1 ?\n\nYes\n\n\u003e\u003e I thought we have already discussed this before and the only possible value is 1 (that is why I recommend `serial\u0027 runner)\n\nThat was only for gates cause too few resources and fake nodes\nIn case of large amount of nodes concurrency is possible","commit_id":"b076b6c46f7a605559572128c8f2dbbde01ced56"}],"samples/tasks/scenarios/fuel/add_and_remove_nodes.yaml":[{"author":{"_account_id":10475,"name":"Alexander Maretskiy","email":"amaretskiy@mirantis.com","username":"maretskiy"},"change_message_id":"ec9f1eba82affca5e420d6645e4aaa5fb6644bc7","unresolved":false,"context_lines":[{"line_number":15,"context_line":"      runner:"},{"line_number":16,"context_line":"        type: \"constant\""},{"line_number":17,"context_line":"        times: 200"},{"line_number":18,"context_line":"        concurrency: 1"}],"source_content_type":"text/x-yaml","patch_set":10,"id":"3afb71cf_d7f10acf","line":18,"updated":"2015-06-05 15:48:07.000000000","message":"ditto","commit_id":"1f59a1bc1cdbd658878b6a31969ce88baf08f5c9"},{"author":{"_account_id":9601,"name":"Oleh Anufriiev","email":"oanufriev@mirantis.com","username":"oanufriev"},"change_message_id":"230fd942fda44576bd89f5a280b68633ef234be8","unresolved":false,"context_lines":[{"line_number":15,"context_line":"      runner:"},{"line_number":16,"context_line":"        type: \"constant\""},{"line_number":17,"context_line":"        times: 200"},{"line_number":18,"context_line":"        concurrency: 1"}],"source_content_type":"text/x-yaml","patch_set":10,"id":"3afb71cf_1733a9f7","line":18,"in_reply_to":"3afb71cf_d7f10acf","updated":"2015-06-09 16:55:45.000000000","message":"Done","commit_id":"1f59a1bc1cdbd658878b6a31969ce88baf08f5c9"}],"tests/unit/plugins/openstack/context/test_fuel.py":[{"author":{"_account_id":10475,"name":"Alexander Maretskiy","email":"amaretskiy@mirantis.com","username":"maretskiy"},"change_message_id":"d1048a67a02f8115e449260f0890e2ac732c1ab5","unresolved":false,"context_lines":[{"line_number":32,"context_line":"                return_value\u003d[\"env1\"])"},{"line_number":33,"context_line":"    @mock.patch(BASE + \".fuel_utils.FuelScenario\")"},{"line_number":34,"context_line":"    def test_setup(self, mock_fuel_scenario, mock__create_envs):"},{"line_number":35,"context_line":"        context \u003d {}"},{"line_number":36,"context_line":"        context[\"config\"] \u003d {\"fuel_environments\": {\"environments\": 1}}"},{"line_number":37,"context_line":"        context[\"task\"] \u003d {\"uuid\": \"some_uuid\"}"},{"line_number":38,"context_line":"        context[\"admin\"] \u003d {\"endpoint\": \"some_endpoint\"}"}],"source_content_type":"text/x-python","patch_set":36,"id":"fa1b9901_fcc1ace4","line":35,"updated":"2015-08-21 14:46:31.000000000","message":"Why do not init context with single dict statement:\n\n context \u003d {\"config\": ...,\n            \"task\": ...,\n            \"admin\": ...}","commit_id":"c1b5e47ae4e3a01e53cffb3144d3df4fd329a058"},{"author":{"_account_id":9601,"name":"Oleh Anufriiev","email":"oanufriev@mirantis.com","username":"oanufriev"},"change_message_id":"c88be4dc8ffbdf1b610fe510dd80b7381fa62982","unresolved":false,"context_lines":[{"line_number":32,"context_line":"                return_value\u003d[\"env1\"])"},{"line_number":33,"context_line":"    @mock.patch(BASE + \".fuel_utils.FuelScenario\")"},{"line_number":34,"context_line":"    def test_setup(self, mock_fuel_scenario, mock__create_envs):"},{"line_number":35,"context_line":"        context \u003d {}"},{"line_number":36,"context_line":"        context[\"config\"] \u003d {\"fuel_environments\": {\"environments\": 1}}"},{"line_number":37,"context_line":"        context[\"task\"] \u003d {\"uuid\": \"some_uuid\"}"},{"line_number":38,"context_line":"        context[\"admin\"] \u003d {\"endpoint\": \"some_endpoint\"}"}],"source_content_type":"text/x-python","patch_set":36,"id":"fa1b9901_e32fc0a5","line":35,"in_reply_to":"fa1b9901_fcc1ace4","updated":"2015-08-21 16:51:39.000000000","message":"IMO this is not in pronciple too","commit_id":"c1b5e47ae4e3a01e53cffb3144d3df4fd329a058"},{"author":{"_account_id":10475,"name":"Alexander Maretskiy","email":"amaretskiy@mirantis.com","username":"maretskiy"},"change_message_id":"d1048a67a02f8115e449260f0890e2ac732c1ab5","unresolved":false,"context_lines":[{"line_number":103,"context_line":"                  \"net_segment_type\": \"type\","},{"line_number":104,"context_line":"                  \"resource_management_workers\": 3}"},{"line_number":105,"context_line":""},{"line_number":106,"context_line":"        context \u003d {\"task\": {\"uuid\": \"some_id\"},"},{"line_number":107,"context_line":"                   \"config\": {\"fuel_environments\": config},"},{"line_number":108,"context_line":"                   \"fuel\": {\"environments\": [\"id\", \"id\", \"id\"]}}"},{"line_number":109,"context_line":""}],"source_content_type":"text/x-python","patch_set":36,"id":"fa1b9901_f779c593","line":106,"updated":"2015-08-21 14:46:31.000000000","message":"Maybe move `context\u0027 setup to setUp()? This will reduce LOC a lot","commit_id":"c1b5e47ae4e3a01e53cffb3144d3df4fd329a058"},{"author":{"_account_id":10475,"name":"Alexander Maretskiy","email":"amaretskiy@mirantis.com","username":"maretskiy"},"change_message_id":"e2cdac107f4c377c95ecbd01961e92e7b8798ea8","unresolved":false,"context_lines":[{"line_number":23,"context_line":""},{"line_number":24,"context_line":"class FuelEnvGeneratorTestCase(test.TestCase):"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"    @mock.patch(BASE + \".base.Context.__init__\", return_value\u003dNone)"},{"line_number":27,"context_line":"    def test___init__(self, mock_context___init__):"},{"line_number":28,"context_line":"        fuel.FuelEnvGenerator(\"some_context\")"},{"line_number":29,"context_line":"        mock_context___init__.assert_called_once_with(\"some_context\")"}],"source_content_type":"text/x-python","patch_set":41,"id":"da20952f_6e277712","line":26,"updated":"2015-09-04 14:42:05.000000000","message":"return_value is not required (actually __init__ should never return something)","commit_id":"4135888c1ab0f0d7814305ce8f1d4bd6e664ec81"},{"author":{"_account_id":9601,"name":"Oleh Anufriiev","email":"oanufriev@mirantis.com","username":"oanufriev"},"change_message_id":"50aba16e1e34d68f3ad0291314150c97db959557","unresolved":false,"context_lines":[{"line_number":23,"context_line":""},{"line_number":24,"context_line":"class FuelEnvGeneratorTestCase(test.TestCase):"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"    @mock.patch(BASE + \".base.Context.__init__\", return_value\u003dNone)"},{"line_number":27,"context_line":"    def test___init__(self, mock_context___init__):"},{"line_number":28,"context_line":"        fuel.FuelEnvGenerator(\"some_context\")"},{"line_number":29,"context_line":"        mock_context___init__.assert_called_once_with(\"some_context\")"}],"source_content_type":"text/x-python","patch_set":41,"id":"da20952f_57421110","line":26,"in_reply_to":"da20952f_6e277712","updated":"2015-09-07 09:04:31.000000000","message":"Done","commit_id":"4135888c1ab0f0d7814305ce8f1d4bd6e664ec81"},{"author":{"_account_id":10475,"name":"Alexander Maretskiy","email":"amaretskiy@mirantis.com","username":"maretskiy"},"change_message_id":"e2cdac107f4c377c95ecbd01961e92e7b8798ea8","unresolved":false,"context_lines":[{"line_number":24,"context_line":"class FuelEnvGeneratorTestCase(test.TestCase):"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"    @mock.patch(BASE + \".base.Context.__init__\", return_value\u003dNone)"},{"line_number":27,"context_line":"    def test___init__(self, mock_context___init__):"},{"line_number":28,"context_line":"        fuel.FuelEnvGenerator(\"some_context\")"},{"line_number":29,"context_line":"        mock_context___init__.assert_called_once_with(\"some_context\")"},{"line_number":30,"context_line":""}],"source_content_type":"text/x-python","patch_set":41,"id":"da20952f_2e741ffc","line":27,"updated":"2015-09-04 14:42:05.000000000","message":"This test is not required (FuelEnvGenerator class does not have own __init__)","commit_id":"4135888c1ab0f0d7814305ce8f1d4bd6e664ec81"},{"author":{"_account_id":9601,"name":"Oleh Anufriiev","email":"oanufriev@mirantis.com","username":"oanufriev"},"change_message_id":"50aba16e1e34d68f3ad0291314150c97db959557","unresolved":false,"context_lines":[{"line_number":24,"context_line":"class FuelEnvGeneratorTestCase(test.TestCase):"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"    @mock.patch(BASE + \".base.Context.__init__\", return_value\u003dNone)"},{"line_number":27,"context_line":"    def test___init__(self, mock_context___init__):"},{"line_number":28,"context_line":"        fuel.FuelEnvGenerator(\"some_context\")"},{"line_number":29,"context_line":"        mock_context___init__.assert_called_once_with(\"some_context\")"},{"line_number":30,"context_line":""}],"source_content_type":"text/x-python","patch_set":41,"id":"da20952f_1749f930","line":27,"in_reply_to":"da20952f_2e741ffc","updated":"2015-09-07 09:04:31.000000000","message":"Done","commit_id":"4135888c1ab0f0d7814305ce8f1d4bd6e664ec81"},{"author":{"_account_id":7369,"name":"Sergey Skripnick","email":"sskripnick@mirantis.com","username":"redixin"},"change_message_id":"ec1df68e0f2e51bd1dcbbbec729accb6ecf2c536","unresolved":false,"context_lines":[{"line_number":52,"context_line":"        env_ctx \u003d fuel.FuelEnvGenerator(context)"},{"line_number":53,"context_line":"        self.assertRaises(exceptions.ContextSetupFailure, env_ctx.setup)"},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"    def test__create_enves(self):"},{"line_number":56,"context_line":"        config \u003d {\"environments\": 4,"},{"line_number":57,"context_line":"                  \"release_id\": 42,"},{"line_number":58,"context_line":"                  \"network_provider\": \"provider\","}],"source_content_type":"text/x-python","patch_set":52,"id":"7a2fa921_f24dbd3e","line":55,"updated":"2015-10-08 09:04:47.000000000","message":"test__create_envs","commit_id":"9badb252ab337ffab4c5129bc294759ae142a83c"},{"author":{"_account_id":9601,"name":"Oleh Anufriiev","email":"oanufriev@mirantis.com","username":"oanufriev"},"change_message_id":"eb69f084d1efd68f8555a570c476db7de5fdc3f8","unresolved":false,"context_lines":[{"line_number":52,"context_line":"        env_ctx \u003d fuel.FuelEnvGenerator(context)"},{"line_number":53,"context_line":"        self.assertRaises(exceptions.ContextSetupFailure, env_ctx.setup)"},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"    def test__create_enves(self):"},{"line_number":56,"context_line":"        config \u003d {\"environments\": 4,"},{"line_number":57,"context_line":"                  \"release_id\": 42,"},{"line_number":58,"context_line":"                  \"network_provider\": \"provider\","}],"source_content_type":"text/x-python","patch_set":52,"id":"7a2fa921_25cd1f66","line":55,"in_reply_to":"7a2fa921_f24dbd3e","updated":"2015-10-08 14:04:41.000000000","message":"Done","commit_id":"9badb252ab337ffab4c5129bc294759ae142a83c"}],"tests/unit/plugins/openstack/scenarios/fuel/test_utils.py":[{"author":{"_account_id":10475,"name":"Alexander Maretskiy","email":"amaretskiy@mirantis.com","username":"maretskiy"},"change_message_id":"e2cdac107f4c377c95ecbd01961e92e7b8798ea8","unresolved":false,"context_lines":[{"line_number":257,"context_line":"    def test__get_random_free_node_id(self, mock__list_node_ids,"},{"line_number":258,"context_line":"                                      mock__node_is_assigned):"},{"line_number":259,"context_line":"        node_id \u003d utils.FuelScenario()._get_random_free_node_id()"},{"line_number":260,"context_line":"        self.assertIn(node_id, mock__list_node_ids.return_value)"},{"line_number":261,"context_line":""},{"line_number":262,"context_line":"    @mock.patch(UTILS + \"FuelScenario._node_is_assigned\", return_value\u003dTrue)"},{"line_number":263,"context_line":"    @mock.patch(UTILS + \"FuelScenario._list_node_ids\","}],"source_content_type":"text/x-python","patch_set":41,"id":"da20952f_b4088281","line":260,"updated":"2015-09-04 14:42:05.000000000","message":"This must ensure that nodes list has been shuffled randomly","commit_id":"4135888c1ab0f0d7814305ce8f1d4bd6e664ec81"},{"author":{"_account_id":10475,"name":"Alexander Maretskiy","email":"amaretskiy@mirantis.com","username":"maretskiy"},"change_message_id":"40b04e7b076a3f8c8bffbe64a30c7191b3a30d68","unresolved":false,"context_lines":[{"line_number":257,"context_line":"    def test__get_random_free_node_id(self, mock__list_node_ids,"},{"line_number":258,"context_line":"                                      mock__node_is_assigned):"},{"line_number":259,"context_line":"        node_id \u003d utils.FuelScenario()._get_random_free_node_id()"},{"line_number":260,"context_line":"        self.assertIn(node_id, mock__list_node_ids.return_value)"},{"line_number":261,"context_line":""},{"line_number":262,"context_line":"    @mock.patch(UTILS + \"FuelScenario._node_is_assigned\", return_value\u003dTrue)"},{"line_number":263,"context_line":"    @mock.patch(UTILS + \"FuelScenario._list_node_ids\","}],"source_content_type":"text/x-python","patch_set":41,"id":"da20952f_0a6f7ec4","line":260,"in_reply_to":"da20952f_9752e911","updated":"2015-09-07 15:29:53.000000000","message":"Shuffling is the key function of tested method - so this must be checked","commit_id":"4135888c1ab0f0d7814305ce8f1d4bd6e664ec81"},{"author":{"_account_id":9601,"name":"Oleh Anufriiev","email":"oanufriev@mirantis.com","username":"oanufriev"},"change_message_id":"50aba16e1e34d68f3ad0291314150c97db959557","unresolved":false,"context_lines":[{"line_number":257,"context_line":"    def test__get_random_free_node_id(self, mock__list_node_ids,"},{"line_number":258,"context_line":"                                      mock__node_is_assigned):"},{"line_number":259,"context_line":"        node_id \u003d utils.FuelScenario()._get_random_free_node_id()"},{"line_number":260,"context_line":"        self.assertIn(node_id, mock__list_node_ids.return_value)"},{"line_number":261,"context_line":""},{"line_number":262,"context_line":"    @mock.patch(UTILS + \"FuelScenario._node_is_assigned\", return_value\u003dTrue)"},{"line_number":263,"context_line":"    @mock.patch(UTILS + \"FuelScenario._list_node_ids\","}],"source_content_type":"text/x-python","patch_set":41,"id":"da20952f_9752e911","line":260,"in_reply_to":"da20952f_b4088281","updated":"2015-09-07 09:04:31.000000000","message":"1. Ok. How can this been implemented?\n2. IMO, it doesn\u0027t metter... cause node list may be sequentials as well as randomly shuffled","commit_id":"4135888c1ab0f0d7814305ce8f1d4bd6e664ec81"}]}
