)]}'
{"rally-jobs/rally.yaml":[{"author":{"_account_id":10475,"name":"Alexander Maretskiy","email":"amaretskiy@mirantis.com","username":"maretskiy"},"change_message_id":"3960fd21e20a17d27225db2a481eb7c88b4632a6","unresolved":false,"context_lines":[{"line_number":574,"context_line":"            name: event"},{"line_number":575,"context_line":"            args:"},{"line_number":576,"context_line":"              unit: iteration"},{"line_number":577,"context_line":"              at: [2, 4, 6, 8, 10]"},{"line_number":578,"context_line":""},{"line_number":579,"context_line":"    -"},{"line_number":580,"context_line":"      args:"}],"source_content_type":"text/x-yaml","patch_set":12,"id":"5a8bc5a2_8e097934","line":577,"updated":"2016-09-22 11:35:46.000000000","message":"sla:\n        failure_rate:\n          max: 0","commit_id":"d8e2c678fffbee5406f43cb2dc0caae613f5b0cf"},{"author":{"_account_id":10475,"name":"Alexander Maretskiy","email":"amaretskiy@mirantis.com","username":"maretskiy"},"change_message_id":"3960fd21e20a17d27225db2a481eb7c88b4632a6","unresolved":false,"context_lines":[{"line_number":592,"context_line":"            args:"},{"line_number":593,"context_line":"              unit: time"},{"line_number":594,"context_line":"              at: [0, 2, 4, 6, 8, 10]"},{"line_number":595,"context_line":""},{"line_number":596,"context_line":"  Dummy.dummy_exception:"},{"line_number":597,"context_line":"    -"},{"line_number":598,"context_line":"      args:"}],"source_content_type":"text/x-yaml","patch_set":12,"id":"5a8bc5a2_3109aa2d","line":595,"updated":"2016-09-22 11:35:46.000000000","message":"sla:\n        failure_rate:\n          max: 0","commit_id":"d8e2c678fffbee5406f43cb2dc0caae613f5b0cf"}],"rally/cli/commands/task.py":[{"author":{"_account_id":9545,"name":"Andriy Kurilin","email":"andr.kurilin@gmail.com","username":"akurilin"},"change_message_id":"317c53a5568a2be9bdb9da5c942242472ba09d42","unresolved":false,"context_lines":[{"line_number":471,"context_line":""},{"line_number":472,"context_line":"        results \u003d [{\"key\": x[\"key\"], \"result\": x[\"data\"][\"raw\"],"},{"line_number":473,"context_line":"                    \"sla\": x[\"data\"][\"sla\"],"},{"line_number":474,"context_line":"                    \"hooks\": x[\"data\"][\"hooks\"],"},{"line_number":475,"context_line":"                    \"load_duration\": x[\"data\"][\"load_duration\"],"},{"line_number":476,"context_line":"                    \"full_duration\": x[\"data\"][\"full_duration\"]}"},{"line_number":477,"context_line":"                   for x in task.get_results()]"}],"source_content_type":"text/x-python","patch_set":5,"id":"9a89bdaa_a87fb164","line":474,"range":{"start_line":474,"start_character":20,"end_line":474,"end_character":48},"updated":"2016-09-12 12:18:12.000000000","message":"In case of old task results, such lines will raise KeyError. We need to write simple db migration to add \"hook\" section to old results.","commit_id":"f2008453954ca5af100953983e7675e83fc544e6"}],"rally/common/db/sqlalchemy/migrations/versions/6ad4f426f005_add_hooks_to_task_result.py":[{"author":{"_account_id":12395,"name":"Roman Vasylets","email":"pomeo92@gmail.com","username":"rvasilets"},"change_message_id":"c98b82537632250478a6f92d96042e97e52e350f","unresolved":false,"context_lines":[{"line_number":46,"context_line":"def upgrade():"},{"line_number":47,"context_line":"    connection \u003d op.get_bind()"},{"line_number":48,"context_line":"    for task_result in connection.execute(task_results_helper.select()):"},{"line_number":49,"context_line":"        data \u003d task_result.data"},{"line_number":50,"context_line":"        data[\"hooks\"] \u003d []"},{"line_number":51,"context_line":"        connection.execute("},{"line_number":52,"context_line":"            task_results_helper.update().where("}],"source_content_type":"text/x-python","patch_set":12,"id":"5a8bc5a2_759323a4","line":49,"updated":"2016-09-22 11:52:46.000000000","message":"This is conflict with refactoring db because now hooks config should be put into workload table","commit_id":"d8e2c678fffbee5406f43cb2dc0caae613f5b0cf"}],"rally/plugins/common/exporter/file_system.py":[{"author":{"_account_id":9545,"name":"Andriy Kurilin","email":"andr.kurilin@gmail.com","username":"akurilin"},"change_message_id":"317c53a5568a2be9bdb9da5c942242472ba09d42","unresolved":false,"context_lines":[{"line_number":69,"context_line":""},{"line_number":70,"context_line":"        task_results \u003d [{\"key\": x[\"key\"], \"result\": x[\"data\"][\"raw\"],"},{"line_number":71,"context_line":"                         \"sla\": x[\"data\"][\"sla\"],"},{"line_number":72,"context_line":"                         \"hooks\": x[\"data\"][\"hooks\"],"},{"line_number":73,"context_line":"                         \"load_duration\": x[\"data\"][\"load_duration\"],"},{"line_number":74,"context_line":"                         \"full_duration\": x[\"data\"][\"full_duration\"]}"},{"line_number":75,"context_line":"                        for x in task.get_results()]"}],"source_content_type":"text/x-python","patch_set":5,"id":"9a89bdaa_88582dfc","line":72,"range":{"start_line":72,"start_character":24,"end_line":72,"end_character":53},"updated":"2016-09-12 12:18:12.000000000","message":"same KeyError here","commit_id":"f2008453954ca5af100953983e7675e83fc544e6"}],"rally/plugins/common/runners/constant.py":[{"author":{"_account_id":9545,"name":"Andriy Kurilin","email":"andr.kurilin@gmail.com","username":"akurilin"},"change_message_id":"317c53a5568a2be9bdb9da5c942242472ba09d42","unresolved":false,"context_lines":[{"line_number":289,"context_line":"        #     usage of `multiprocessing.Pool`(usage of separate process for"},{"line_number":290,"context_line":"        #     each concurrent iteration is redundant)."},{"line_number":291,"context_line":"        pool \u003d multiprocessing.Pool(concurrency)"},{"line_number":292,"context_line":"        manager \u003d multiprocessing.Manager()"},{"line_number":293,"context_line":"        event_queue \u003d manager.Queue()"},{"line_number":294,"context_line":"        stop_event_listener \u003d threading.Event()"},{"line_number":295,"context_line":""},{"line_number":296,"context_line":"        def event_listener():"}],"source_content_type":"text/x-python","patch_set":5,"id":"9a89bdaa_c895d540","line":293,"range":{"start_line":292,"start_character":8,"end_line":293,"end_character":37},"updated":"2016-09-12 12:18:12.000000000","message":"Why multiprocessing.Queue() is not used directly?","commit_id":"f2008453954ca5af100953983e7675e83fc544e6"},{"author":{"_account_id":19011,"name":"Anton Studenov","email":"tohin1332@gmail.com","username":"tohin"},"change_message_id":"472b3e34898a295c9bbf7e309b028c5cb4a08e10","unresolved":false,"context_lines":[{"line_number":289,"context_line":"        #     usage of `multiprocessing.Pool`(usage of separate process for"},{"line_number":290,"context_line":"        #     each concurrent iteration is redundant)."},{"line_number":291,"context_line":"        pool \u003d multiprocessing.Pool(concurrency)"},{"line_number":292,"context_line":"        manager \u003d multiprocessing.Manager()"},{"line_number":293,"context_line":"        event_queue \u003d manager.Queue()"},{"line_number":294,"context_line":"        stop_event_listener \u003d threading.Event()"},{"line_number":295,"context_line":""},{"line_number":296,"context_line":"        def event_listener():"}],"source_content_type":"text/x-python","patch_set":5,"id":"9a89bdaa_eebe1cfe","line":293,"range":{"start_line":292,"start_character":8,"end_line":293,"end_character":37},"in_reply_to":"9a89bdaa_c895d540","updated":"2016-09-13 16:40:27.000000000","message":"Regular Queue fails to work with multiprocessing.Pool and pool.imap throws exception in this case.","commit_id":"f2008453954ca5af100953983e7675e83fc544e6"}],"rally/plugins/common/runners/serial.py":[{"author":{"_account_id":9545,"name":"Andriy Kurilin","email":"andr.kurilin@gmail.com","username":"akurilin"},"change_message_id":"317c53a5568a2be9bdb9da5c942242472ba09d42","unresolved":false,"context_lines":[{"line_number":66,"context_line":"        \"\"\""},{"line_number":67,"context_line":"        times \u003d self.config.get(\"times\", 1)"},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"        event_queue \u003d rutils.DequeAsQueue(self.event_queue)"},{"line_number":70,"context_line":""},{"line_number":71,"context_line":"        for i in range(times):"},{"line_number":72,"context_line":"            if self.aborted.is_set():"}],"source_content_type":"text/x-python","patch_set":5,"id":"9a89bdaa_0877bd3a","line":69,"range":{"start_line":69,"start_character":8,"end_line":69,"end_character":59},"updated":"2016-09-12 12:18:12.000000000","message":"It is only one place of DequeAsQueue usage, why not multiprocessing.Queue ?","commit_id":"f2008453954ca5af100953983e7675e83fc544e6"},{"author":{"_account_id":19011,"name":"Anton Studenov","email":"tohin1332@gmail.com","username":"tohin"},"change_message_id":"472b3e34898a295c9bbf7e309b028c5cb4a08e10","unresolved":false,"context_lines":[{"line_number":66,"context_line":"        \"\"\""},{"line_number":67,"context_line":"        times \u003d self.config.get(\"times\", 1)"},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"        event_queue \u003d rutils.DequeAsQueue(self.event_queue)"},{"line_number":70,"context_line":""},{"line_number":71,"context_line":"        for i in range(times):"},{"line_number":72,"context_line":"            if self.aborted.is_set():"}],"source_content_type":"text/x-python","patch_set":5,"id":"9a89bdaa_3a754831","line":69,"range":{"start_line":69,"start_character":8,"end_line":69,"end_character":59},"in_reply_to":"9a89bdaa_0877bd3a","updated":"2016-09-13 16:40:27.000000000","message":"It would require one more listener thread to grab event from multiprocessing.Queue.","commit_id":"f2008453954ca5af100953983e7675e83fc544e6"}],"rally/task/engine.py":[{"author":{"_account_id":9545,"name":"Andriy Kurilin","email":"andr.kurilin@gmail.com","username":"akurilin"},"change_message_id":"317c53a5568a2be9bdb9da5c942242472ba09d42","unresolved":false,"context_lines":[{"line_number":390,"context_line":"    HOOK_CONFIG \u003d {"},{"line_number":391,"context_line":"        \"type\": \"object\","},{"line_number":392,"context_line":"        \"properties\": {"},{"line_number":393,"context_line":"            \"name\": {\"type\": \"string\"},"},{"line_number":394,"context_line":"            \"args\": {},"},{"line_number":395,"context_line":"            \"trigger\": {"},{"line_number":396,"context_line":"                \"type\": \"object\","}],"source_content_type":"text/x-python","patch_set":5,"id":"9a89bdaa_bfd1a1fd","line":393,"updated":"2016-09-12 12:18:12.000000000","message":"Let\u0027s add \"description\" field. It will help while creating reports.","commit_id":"f2008453954ca5af100953983e7675e83fc544e6"},{"author":{"_account_id":9545,"name":"Andriy Kurilin","email":"andr.kurilin@gmail.com","username":"akurilin"},"change_message_id":"8a129589d6771e38f57fe097da0882155c2ef218","unresolved":false,"context_lines":[{"line_number":66,"context_line":"        self.load_finished_at \u003d 0"},{"line_number":67,"context_line":""},{"line_number":68,"context_line":"        self.sla_checker \u003d sla.SLAChecker(key[\"kw\"])"},{"line_number":69,"context_line":"        self.hook_executor \u003d hook.HookExecutor(key[\"kw\"])"},{"line_number":70,"context_line":"        self.abort_on_sla_failure \u003d abort_on_sla_failure"},{"line_number":71,"context_line":"        self.is_done \u003d threading.Event()"},{"line_number":72,"context_line":"        self.unexpected_failure \u003d {}"}],"source_content_type":"text/x-python","patch_set":7,"id":"7a8ec9b2_04e4130b","line":69,"range":{"start_line":69,"start_character":46,"end_line":69,"end_character":57},"updated":"2016-09-15 10:04:34.000000000","message":"We need to transmit self.task here. Hooks should know task uuid","commit_id":"409772fbb41dd34e48072f4fb0470e87422bc71f"},{"author":{"_account_id":9545,"name":"Andriy Kurilin","email":"andr.kurilin@gmail.com","username":"akurilin"},"change_message_id":"8a129589d6771e38f57fe097da0882155c2ef218","unresolved":false,"context_lines":[{"line_number":107,"context_line":"        while not self.is_done.isSet():"},{"line_number":108,"context_line":"            if self.runner.event_queue:"},{"line_number":109,"context_line":"                event \u003d self.runner.event_queue.popleft()"},{"line_number":110,"context_line":"                if event[\"type\"] \u003d\u003d \"iteration\":"},{"line_number":111,"context_line":"                    self.hook_executor.on_event("},{"line_number":112,"context_line":"                        event_type\u003devent[\"type\"],"},{"line_number":113,"context_line":"                        value\u003devent[\"value\"])"},{"line_number":114,"context_line":"            else:"},{"line_number":115,"context_line":"                time.sleep(0.01)"},{"line_number":116,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"7a8ec9b2_c1d5bdb9","line":113,"range":{"start_line":110,"start_character":16,"end_line":113,"end_character":45},"updated":"2016-09-15 10:04:34.000000000","message":"Why does it hardcoded to iteration type?","commit_id":"409772fbb41dd34e48072f4fb0470e87422bc71f"},{"author":{"_account_id":5950,"name":"Ilya Shakhat","email":"shakhat@gmail.com","username":"shakhat"},"change_message_id":"0797f5a02e0fdc396c1038836501a0c9e01dc679","unresolved":false,"context_lines":[{"line_number":401,"context_line":"                \"additionalProperties\": False,"},{"line_number":402,"context_line":"            }"},{"line_number":403,"context_line":"        },"},{"line_number":404,"context_line":"        \"required\": [\"name\", \"description\", \"args\", \"trigger\"],"},{"line_number":405,"context_line":"        \"additionalProperties\": False,"},{"line_number":406,"context_line":"    }"},{"line_number":407,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"7a8ec9b2_6056515d","line":404,"updated":"2016-09-16 15:36:50.000000000","message":"how about making description optional? In most cases plugin parameters will be self-explanational","commit_id":"7ab93e8ef27c83c00bbd301d98176dbc9240f304"},{"author":{"_account_id":9545,"name":"Andriy Kurilin","email":"andr.kurilin@gmail.com","username":"akurilin"},"change_message_id":"b57750585c52c2746a014a5a8bf39136b6e82500","unresolved":false,"context_lines":[{"line_number":401,"context_line":"                \"additionalProperties\": False,"},{"line_number":402,"context_line":"            }"},{"line_number":403,"context_line":"        },"},{"line_number":404,"context_line":"        \"required\": [\"name\", \"description\", \"args\", \"trigger\"],"},{"line_number":405,"context_line":"        \"additionalProperties\": False,"},{"line_number":406,"context_line":"    }"},{"line_number":407,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"7a8ec9b2_b667c3b5","line":404,"in_reply_to":"7a8ec9b2_6056515d","updated":"2016-09-16 16:00:28.000000000","message":"oh..yes. I missed this. description should be optional.","commit_id":"7ab93e8ef27c83c00bbd301d98176dbc9240f304"},{"author":{"_account_id":19011,"name":"Anton Studenov","email":"tohin1332@gmail.com","username":"tohin"},"change_message_id":"281c3afa776a51bf31525bbf485b2745016ea3e8","unresolved":false,"context_lines":[{"line_number":401,"context_line":"                \"additionalProperties\": False,"},{"line_number":402,"context_line":"            }"},{"line_number":403,"context_line":"        },"},{"line_number":404,"context_line":"        \"required\": [\"name\", \"description\", \"args\", \"trigger\"],"},{"line_number":405,"context_line":"        \"additionalProperties\": False,"},{"line_number":406,"context_line":"    }"},{"line_number":407,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"7a8ec9b2_ad3a06e5","line":404,"in_reply_to":"7a8ec9b2_b667c3b5","updated":"2016-09-16 20:34:14.000000000","message":"Done","commit_id":"7ab93e8ef27c83c00bbd301d98176dbc9240f304"},{"author":{"_account_id":12395,"name":"Roman Vasylets","email":"pomeo92@gmail.com","username":"rvasilets"},"change_message_id":"4438286c45b3e4819387096e2ab1fe94c6d5e41f","unresolved":false,"context_lines":[{"line_number":252,"context_line":"                        workload.context, non_hidden\u003dTrue)"},{"line_number":253,"context_line":"                    sla.SLA.validate(workload.sla)"},{"line_number":254,"context_line":"                    for hook_conf in workload.hooks:"},{"line_number":255,"context_line":"                        hook.Hook.validate(hook_conf)"},{"line_number":256,"context_line":"                except (exceptions.RallyException,"},{"line_number":257,"context_line":"                        jsonschema.ValidationError) as e:"},{"line_number":258,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"5a8bc5a2_1f575503","line":255,"updated":"2016-09-22 11:54:08.000000000","message":"Trigger validation https://github.com/openstack/rally/blob/master/rally/task/hook.py#L174 should be moved here too","commit_id":"d8e2c678fffbee5406f43cb2dc0caae613f5b0cf"},{"author":{"_account_id":7428,"name":"Yaroslav Lobankov","email":"lobankovyv@gmail.com","username":"ylobankov"},"change_message_id":"7bd7c4833707fce01d57b09f82e8a6ea0915f934","unresolved":false,"context_lines":[{"line_number":252,"context_line":"                        workload.context, non_hidden\u003dTrue)"},{"line_number":253,"context_line":"                    sla.SLA.validate(workload.sla)"},{"line_number":254,"context_line":"                    for hook_conf in workload.hooks:"},{"line_number":255,"context_line":"                        hook.Hook.validate(hook_conf)"},{"line_number":256,"context_line":"                except (exceptions.RallyException,"},{"line_number":257,"context_line":"                        jsonschema.ValidationError) as e:"},{"line_number":258,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"5a8bc5a2_adc71244","line":255,"in_reply_to":"5a8bc5a2_1f575503","updated":"2016-09-22 14:01:39.000000000","message":"As far as I understand https://github.com/openstack/rally/blob/master/rally/task/hook.py#L174 is the validation of results schema, not config.","commit_id":"d8e2c678fffbee5406f43cb2dc0caae613f5b0cf"}]}
