)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":10475,"name":"Alexander Maretskiy","email":"amaretskiy@mirantis.com","username":"maretskiy"},"change_message_id":"3448bfb53d3c4eec0888c8f618937c3261047931","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     astaroverov \u003castaroverov@mirantis.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2016-11-08 15:09:03 +0300"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"[WIP] Remove BootRuncommandDeleteCustomImage scenario"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Change-Id: I9216eb772e5b553ac9a49da97ec2d2eaf008d243"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":3,"id":"9a629dbe_5374419b","line":7,"updated":"2016-11-08 12:19:11.000000000","message":"1) This patch removes validator, not scenario\n2) Please rebase this patch - it seems that validator is absent in master","commit_id":"fba491bab3ff953e1a52c62962514fed430e832b"}],"rally-jobs/rally-neutron-existing-users.yaml":[{"author":{"_account_id":9545,"name":"Andriy Kurilin","email":"andr.kurilin@gmail.com","username":"akurilin"},"change_message_id":"2a9887eea7c663424abfb93be9a03a8ed4f31c38","unresolved":false,"context_lines":[{"line_number":368,"context_line":"        failure_rate:"},{"line_number":369,"context_line":"          max: 0"},{"line_number":370,"context_line":""},{"line_number":371,"context_line":"  VMTasks.boot_runcommand_delete:"},{"line_number":372,"context_line":"    -"},{"line_number":373,"context_line":"      args:"},{"line_number":374,"context_line":"        command:"}],"source_content_type":"text/x-yaml","patch_set":37,"id":"3a461143_207e2b19","line":371,"range":{"start_line":371,"start_character":0,"end_line":371,"end_character":33},"updated":"2017-01-30 15:21:49.000000000","message":"we already have such subtask at L331. Please extent it.","commit_id":"e1fa737b5e80aa21448223c1906b3ab2e69e12b4"}],"rally-jobs/rally-neutron.yaml":[{"author":{"_account_id":9545,"name":"Andriy Kurilin","email":"andr.kurilin@gmail.com","username":"akurilin"},"change_message_id":"2a9887eea7c663424abfb93be9a03a8ed4f31c38","unresolved":false,"context_lines":[{"line_number":633,"context_line":"        failure_rate:"},{"line_number":634,"context_line":"          max: 0"},{"line_number":635,"context_line":""},{"line_number":636,"context_line":"  VMTasks.boot_runcommand_delete:"},{"line_number":637,"context_line":"    -"},{"line_number":638,"context_line":"      args:"},{"line_number":639,"context_line":"        command:"}],"source_content_type":"text/x-yaml","patch_set":37,"id":"3a461143_a0905b44","line":636,"range":{"start_line":636,"start_character":0,"end_line":636,"end_character":33},"updated":"2017-01-30 15:21:49.000000000","message":"same here","commit_id":"e1fa737b5e80aa21448223c1906b3ab2e69e12b4"}],"rally/plugins/openstack/scenarios/vm/utils.py":[{"author":{"_account_id":9545,"name":"Andriy Kurilin","email":"andr.kurilin@gmail.com","username":"akurilin"},"change_message_id":"2a9887eea7c663424abfb93be9a03a8ed4f31c38","unresolved":false,"context_lines":[{"line_number":146,"context_line":""},{"line_number":147,"context_line":"        return ssh.execute(cmd, stdin\u003dstdin)"},{"line_number":148,"context_line":""},{"line_number":149,"context_line":"    def _boot_server_with_fip(self, flavor, image\u003dNone, use_floating_ip\u003dTrue,"},{"line_number":150,"context_line":"                              floating_network\u003dNone, **kwargs):"},{"line_number":151,"context_line":"        \"\"\"Boot server prepared for SSH actions.\"\"\""},{"line_number":152,"context_line":"        kwargs[\"auto_assign_nic\"] \u003d True"}],"source_content_type":"text/x-python","patch_set":37,"id":"3a461143_e09c2310","line":149,"range":{"start_line":149,"start_character":36,"end_line":149,"end_character":56},"updated":"2017-01-30 15:21:49.000000000","message":"why you changed the order of arguments here? It is not required + image should not be optional.\n\nAlso, it breaks backward compatibility with those plugins who reuse that method.","commit_id":"e1fa737b5e80aa21448223c1906b3ab2e69e12b4"}],"rally/plugins/openstack/scenarios/vm/vmtasks.py":[{"author":{"_account_id":9545,"name":"Andriy Kurilin","email":"andr.kurilin@gmail.com","username":"akurilin"},"change_message_id":"09adc2eef01f268622c3a309e22197255d6e1780","unresolved":false,"context_lines":[{"line_number":142,"context_line":"        if volume_args:"},{"line_number":143,"context_line":"            volume \u003d self._create_volume(volume_args[\"size\"], imageRef\u003dNone)"},{"line_number":144,"context_line":"            kwargs[\"block_device_mapping\"] \u003d {\"vdrally\": \"%s:::1\" % volume.id}"},{"line_number":145,"context_line":""},{"line_number":146,"context_line":"        server, fip \u003d self._boot_server_with_fip("},{"line_number":147,"context_line":"            flavor, image, use_floating_ip\u003duse_floating_ip,"},{"line_number":148,"context_line":"            floating_network\u003dfloating_network,"}],"source_content_type":"text/x-python","patch_set":13,"id":"3a71b18c_2331c65a","line":145,"updated":"2016-12-12 12:35:09.000000000","message":"you need add here additional check:\n\n   if image is None:\n       image \u003d self.context[\"tenant\"][\"custom_image\"][\"id\"]","commit_id":"a76e692f2813ad22fd0fdcdb3bc6941395084627"},{"author":{"_account_id":9545,"name":"Andriy Kurilin","email":"andr.kurilin@gmail.com","username":"akurilin"},"change_message_id":"2a9887eea7c663424abfb93be9a03a8ed4f31c38","unresolved":false,"context_lines":[{"line_number":56,"context_line":"            max_log_length\u003dNone, **kwargs):"},{"line_number":57,"context_line":"        \"\"\"Boot a server, run script specified in command and delete server."},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"        :param image: glance image name to use for the vm"},{"line_number":60,"context_line":"        :param flavor: VM flavor name"},{"line_number":61,"context_line":"        :param username: ssh username on server, str"},{"line_number":62,"context_line":"        :param password: Password on SSH authentication"}],"source_content_type":"text/x-python","patch_set":37,"id":"3a461143_36c6719a","line":59,"updated":"2017-01-30 15:21:49.000000000","message":"please leave a note that it is optional in case of specified context","commit_id":"e1fa737b5e80aa21448223c1906b3ab2e69e12b4"},{"author":{"_account_id":9545,"name":"Andriy Kurilin","email":"andr.kurilin@gmail.com","username":"akurilin"},"change_message_id":"2512a7060aba9f17c6f48f14163a4065bbf1985c","unresolved":false,"context_lines":[{"line_number":41,"context_line":"@validation.number(\"port\", minval\u003d1, maxval\u003d65535, nullable\u003dTrue,"},{"line_number":42,"context_line":"                   integer_only\u003dTrue)"},{"line_number":43,"context_line":"@validation.external_network_exists(\"floating_network\")"},{"line_number":44,"context_line":"@validation.required_param_or_context(arg_name\u003d\"image\")"},{"line_number":45,"context_line":"@validation.required_services(consts.Service.NOVA, consts.Service.CINDER)"},{"line_number":46,"context_line":"@validation.required_openstack(users\u003dTrue)"},{"line_number":47,"context_line":"@scenario.configure(context\u003d{\"cleanup\": [\"nova\", \"cinder\"],"}],"source_content_type":"text/x-python","patch_set":39,"id":"3a461143_2c697326","line":44,"range":{"start_line":44,"start_character":38,"end_line":44,"end_character":55},"updated":"2017-02-01 12:50:33.000000000","message":"Also, you should transmit \"image_command_customize\" as a ctx_name","commit_id":"0c6217db754668f9501e3d0d2705d457d81b2b8c"},{"author":{"_account_id":9545,"name":"Andriy Kurilin","email":"andr.kurilin@gmail.com","username":"akurilin"},"change_message_id":"2512a7060aba9f17c6f48f14163a4065bbf1985c","unresolved":false,"context_lines":[{"line_number":58,"context_line":"        \"\"\"Boot a server, run script specified in command and delete server."},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"        :param image: glance image name to use for the vm. Optional"},{"line_number":61,"context_line":"            in case of specified context"},{"line_number":62,"context_line":"        :param flavor: VM flavor name"},{"line_number":63,"context_line":"        :param username: ssh username on server, str"},{"line_number":64,"context_line":"        :param password: Password on SSH authentication"}],"source_content_type":"text/x-python","patch_set":39,"id":"3a461143_4c1f9fb7","line":61,"updated":"2017-02-01 12:50:33.000000000","message":"in case of specified \"image_command_customize\" context","commit_id":"0c6217db754668f9501e3d0d2705d457d81b2b8c"},{"author":{"_account_id":9545,"name":"Andriy Kurilin","email":"andr.kurilin@gmail.com","username":"akurilin"},"change_message_id":"32c8494f75c8170ee4bc17c55a550c884893255a","unresolved":false,"context_lines":[{"line_number":42,"context_line":"                   integer_only\u003dTrue)"},{"line_number":43,"context_line":"@validation.external_network_exists(\"floating_network\")"},{"line_number":44,"context_line":"@validation.required_param_or_context(arg_name\u003d\"image\","},{"line_number":45,"context_line":"                                      ctx_name\u003d\"custom_image\")"},{"line_number":46,"context_line":"@validation.required_services(consts.Service.NOVA, consts.Service.CINDER)"},{"line_number":47,"context_line":"@validation.required_openstack(users\u003dTrue)"},{"line_number":48,"context_line":"@scenario.configure(context\u003d{\"cleanup\": [\"nova\", \"cinder\"],"}],"source_content_type":"text/x-python","patch_set":40,"id":"3a461143_a1d1e431","line":45,"range":{"start_line":45,"start_character":48,"end_line":45,"end_character":60},"updated":"2017-02-01 15:26:40.000000000","message":"it should be \"image_command_customize\"","commit_id":"890a8b2058d73d949ad6dd2018b4bfcb5ac1cede"}],"rally/task/validation.py":[{"author":{"_account_id":9545,"name":"Andriy Kurilin","email":"andr.kurilin@gmail.com","username":"akurilin"},"change_message_id":"09adc2eef01f268622c3a309e22197255d6e1780","unresolved":false,"context_lines":[{"line_number":608,"context_line":"        pass"},{"line_number":609,"context_line":""},{"line_number":610,"context_line":"    try:"},{"line_number":611,"context_line":"        if config.get(\"context\").get(\"image\").get(\"name\"):"},{"line_number":612,"context_line":"            return ValidationResult(True)"},{"line_number":613,"context_line":"    except AttributeError:"},{"line_number":614,"context_line":"        pass"}],"source_content_type":"text/x-python","patch_set":13,"id":"3a71b18c_238e262e","line":611,"range":{"start_line":611,"start_character":8,"end_line":611,"end_character":58},"updated":"2016-12-12 12:35:09.000000000","message":"this check is wrong. it should be like:\n\n    if \"images\" in config.get(\"context\", {}):\n         return ValidationResult(True)","commit_id":"a76e692f2813ad22fd0fdcdb3bc6941395084627"},{"author":{"_account_id":9545,"name":"Andriy Kurilin","email":"andr.kurilin@gmail.com","username":"akurilin"},"change_message_id":"32abd82304574fb99f3cd201343b2fa1eae40c44","unresolved":false,"context_lines":[{"line_number":615,"context_line":"            print(\"true\")"},{"line_number":616,"context_line":"            print(\"+++++++++++++++++++++++++++++\")"},{"line_number":617,"context_line":""},{"line_number":618,"context_line":"        if \"image\" in config.get(\"context\", {}):"},{"line_number":619,"context_line":"            return ValidationResult(True)"},{"line_number":620,"context_line":"    except AttributeError:"},{"line_number":621,"context_line":"        pass"}],"source_content_type":"text/x-python","patch_set":20,"id":"1a6eadb0_64a418a6","line":618,"range":{"start_line":618,"start_character":8,"end_line":618,"end_character":48},"updated":"2016-12-13 18:29:51.000000000","message":"ok, it looks like your debug is right and we should check \"image_command_customizer\" in config.get(\"context\", {}) here, instead of \"image\"","commit_id":"c4c1ba57e31fb189dfec165d1a51d184e4b58f8f"},{"author":{"_account_id":9545,"name":"Andriy Kurilin","email":"andr.kurilin@gmail.com","username":"akurilin"},"change_message_id":"c02d2ab02d803e13449ffa9908f114ed814b0805","unresolved":false,"context_lines":[{"line_number":368,"context_line":"                          Should be False if instance is booted from volume."},{"line_number":369,"context_line":"                          Default value is True."},{"line_number":370,"context_line":""},{"line_number":371,"context_line":"    \"\"\""},{"line_number":372,"context_line":"    valid_result, flavor \u003d _get_validated_flavor(config, clients, flavor_name)"},{"line_number":373,"context_line":"    if not valid_result.is_valid:"},{"line_number":374,"context_line":"        return valid_result"}],"source_content_type":"text/x-python","patch_set":31,"id":"5a3905b3_0fdd7342","line":371,"updated":"2017-01-19 10:48:21.000000000","message":"it is much easier to just add here(at the start of validator):\n\n   if config.get(\"args\", {}).get(image_name) is None:\n       # image_name is None. nothing to check\n       return ValidationResults(True)","commit_id":"28897e18e11bbe21ae783d2101e28f9e1f8d4398"},{"author":{"_account_id":9545,"name":"Andriy Kurilin","email":"andr.kurilin@gmail.com","username":"akurilin"},"change_message_id":"2a9887eea7c663424abfb93be9a03a8ed4f31c38","unresolved":false,"context_lines":[{"line_number":247,"context_line":"    image_ctx_name \u003d image_context.get(\"image_name\")"},{"line_number":248,"context_line":""},{"line_number":249,"context_line":"    if not image_args:"},{"line_number":250,"context_line":"        msg \u003d _(\"Parameter %s is not specified.\") % param_name"},{"line_number":251,"context_line":"        return (ValidationResult(False, msg), None)"},{"line_number":252,"context_line":"    if \"image_name\" in image_context:"},{"line_number":253,"context_line":"        # NOTE(rvasilets) check string is \"exactly equal to\" a regex"},{"line_number":254,"context_line":"        # or image name from context equal to image name from args"}],"source_content_type":"text/x-python","patch_set":37,"id":"3a461143_7b6aa482","side":"PARENT","line":251,"range":{"start_line":250,"start_character":8,"end_line":251,"end_character":51},"updated":"2017-01-30 15:21:49.000000000","message":"not sure why the clarification message was removed.","commit_id":"da46a909711cf5ae55b8da9d308e8656b7c2a455"},{"author":{"_account_id":9545,"name":"Andriy Kurilin","email":"andr.kurilin@gmail.com","username":"akurilin"},"change_message_id":"2a9887eea7c663424abfb93be9a03a8ed4f31c38","unresolved":false,"context_lines":[{"line_number":338,"context_line":"    image_value \u003d config.get(\"args\", {}).get(param_name)"},{"line_number":339,"context_line":"    if not image_value and nullable:"},{"line_number":340,"context_line":"        return ValidationResult(True)"},{"line_number":341,"context_line":"    if _get_validated_image(config, clients, param_name):"},{"line_number":342,"context_line":"        return _get_validated_image(config, clients, param_name)[0]"},{"line_number":343,"context_line":"    else:"},{"line_number":344,"context_line":"        return ValidationResult(False)"},{"line_number":345,"context_line":""},{"line_number":346,"context_line":""},{"line_number":347,"context_line":"@validator"}],"source_content_type":"text/x-python","patch_set":37,"id":"3a461143_db88f873","line":344,"range":{"start_line":341,"start_character":4,"end_line":344,"end_character":38},"updated":"2017-01-30 15:21:49.000000000","message":"1) _get_validated_image makes calls to API side. There is no reason to call them twice. It is better to save the result of _get_validated_image call and re-use it in checking and returning statements. like:\n\n  res \u003d _get_validated_image(config, clients, param_name)\n  if res:\n  return res[0]\n\n2) It looks like _get_validated_image always returns not empty tuple, so condition at L341 will be always True and \"else\" at L343 will never be executed.","commit_id":"e1fa737b5e80aa21448223c1906b3ab2e69e12b4"},{"author":{"_account_id":9545,"name":"Andriy Kurilin","email":"andr.kurilin@gmail.com","username":"akurilin"},"change_message_id":"2a9887eea7c663424abfb93be9a03a8ed4f31c38","unresolved":false,"context_lines":[{"line_number":375,"context_line":""},{"line_number":376,"context_line":"    valid_result, image \u003d _get_validated_image(config, clients, image_name)"},{"line_number":377,"context_line":""},{"line_number":378,"context_line":"    if not image:"},{"line_number":379,"context_line":"        return ValidationResult(True)"},{"line_number":380,"context_line":""},{"line_number":381,"context_line":"    if not valid_result.is_valid:"},{"line_number":382,"context_line":"        return valid_result"}],"source_content_type":"text/x-python","patch_set":37,"id":"3a461143_db9b9816","line":379,"range":{"start_line":378,"start_character":4,"end_line":379,"end_character":37},"updated":"2017-01-30 15:21:49.000000000","message":"it should not be behaviour by default. It is better to add one more argument to image_valid_on_flavor, something like \"fail_on_404_image\" which defaults to True .","commit_id":"e1fa737b5e80aa21448223c1906b3ab2e69e12b4"},{"author":{"_account_id":9545,"name":"Andriy Kurilin","email":"andr.kurilin@gmail.com","username":"akurilin"},"change_message_id":"2a9887eea7c663424abfb93be9a03a8ed4f31c38","unresolved":false,"context_lines":[{"line_number":551,"context_line":"        return ValidationResult(False, message)"},{"line_number":552,"context_line":""},{"line_number":553,"context_line":""},{"line_number":554,"context_line":"@validator"},{"line_number":555,"context_line":"def required_image(config, clients, deployment, image\u003dNone):"},{"line_number":556,"context_line":"    \"\"\"Validator checks if required image is specified."},{"line_number":557,"context_line":""},{"line_number":558,"context_line":"    :param image: image should be specified into context or set as a parameter"},{"line_number":559,"context_line":"    \"\"\""},{"line_number":560,"context_line":"    message \u003d (\"Image is required but not described into context\""},{"line_number":561,"context_line":"               \" or arguments of scenario\")"},{"line_number":562,"context_line":"    try:"},{"line_number":563,"context_line":"        if \"image\" in config.get(\"context\", {}):"},{"line_number":564,"context_line":"            return ValidationResult(True)"},{"line_number":565,"context_line":"    except AttributeError:"},{"line_number":566,"context_line":"        pass"},{"line_number":567,"context_line":"    return ValidationResult(False, message)"},{"line_number":568,"context_line":""},{"line_number":569,"context_line":""},{"line_number":570,"context_line":"@validator"}],"source_content_type":"text/x-python","patch_set":37,"id":"3a461143_b6ea610d","line":567,"range":{"start_line":554,"start_character":0,"end_line":567,"end_character":43},"updated":"2017-01-30 15:21:49.000000000","message":"1) I could not find any usage of that validator.\n\n2) Let\u0027s unify it and cover more cases.\n\n2.1) Rename required_image to required_param_or_context\n\n2.2) extend validator arguments with \"context_name\" and \"param_name\"\n\n2.3) fix check at L563 to `param_name in config.get(\"args\", {}) or context_name in confix.get(\"context\", {})`\n\nPS: In your last revision of that change, there is not case for raising AttributeError, so try..except block is redundant","commit_id":"e1fa737b5e80aa21448223c1906b3ab2e69e12b4"},{"author":{"_account_id":9545,"name":"Andriy Kurilin","email":"andr.kurilin@gmail.com","username":"akurilin"},"change_message_id":"2512a7060aba9f17c6f48f14163a4065bbf1985c","unresolved":false,"context_lines":[{"line_number":568,"context_line":""},{"line_number":569,"context_line":"@validator"},{"line_number":570,"context_line":"def required_param_or_context(config, clients, deployment,"},{"line_number":571,"context_line":"                              arg_name):"},{"line_number":572,"context_line":"    \"\"\"Validator checks if required image is specified."},{"line_number":573,"context_line":""},{"line_number":574,"context_line":"    :param image: image should be specified into context or set as a parameter"}],"source_content_type":"text/x-python","patch_set":39,"id":"3a461143_cce54fdd","line":571,"range":{"start_line":571,"start_character":30,"end_line":571,"end_character":40},"updated":"2017-02-01 12:50:33.000000000","message":"you should accept not only arg_name, but context name to check too.","commit_id":"0c6217db754668f9501e3d0d2705d457d81b2b8c"},{"author":{"_account_id":9545,"name":"Andriy Kurilin","email":"andr.kurilin@gmail.com","username":"akurilin"},"change_message_id":"2512a7060aba9f17c6f48f14163a4065bbf1985c","unresolved":false,"context_lines":[{"line_number":573,"context_line":""},{"line_number":574,"context_line":"    :param image: image should be specified into context or set as a parameter"},{"line_number":575,"context_line":"    \"\"\""},{"line_number":576,"context_line":"    message \u003d (\"Parameter is required but not described into context\""},{"line_number":577,"context_line":"               \" or arguments of scenario\")"},{"line_number":578,"context_line":"    if arg_name in config.get(\"context\", {}):"},{"line_number":579,"context_line":"        return ValidationResult(True)"},{"line_number":580,"context_line":"    if arg_name in config.get(\"args\", {}):"}],"source_content_type":"text/x-python","patch_set":39,"id":"3a461143_2cf41386","line":577,"range":{"start_line":576,"start_character":4,"end_line":577,"end_character":43},"updated":"2017-02-01 12:50:33.000000000","message":"please include names of the parameter and the context","commit_id":"0c6217db754668f9501e3d0d2705d457d81b2b8c"},{"author":{"_account_id":9545,"name":"Andriy Kurilin","email":"andr.kurilin@gmail.com","username":"akurilin"},"change_message_id":"2512a7060aba9f17c6f48f14163a4065bbf1985c","unresolved":false,"context_lines":[{"line_number":575,"context_line":"    \"\"\""},{"line_number":576,"context_line":"    message \u003d (\"Parameter is required but not described into context\""},{"line_number":577,"context_line":"               \" or arguments of scenario\")"},{"line_number":578,"context_line":"    if arg_name in config.get(\"context\", {}):"},{"line_number":579,"context_line":"        return ValidationResult(True)"},{"line_number":580,"context_line":"    if arg_name in config.get(\"args\", {}):"},{"line_number":581,"context_line":"        return ValidationResult(True)"}],"source_content_type":"text/x-python","patch_set":39,"id":"3a461143_ac072380","line":578,"range":{"start_line":578,"start_character":7,"end_line":578,"end_character":15},"updated":"2017-02-01 12:50:33.000000000","message":"s/arg_name/ctx_name","commit_id":"0c6217db754668f9501e3d0d2705d457d81b2b8c"},{"author":{"_account_id":19011,"name":"Anton Studenov","email":"tohin1332@gmail.com","username":"tohin"},"change_message_id":"38c567bbc65a3d91291e669c378de876771b0193","unresolved":false,"context_lines":[{"line_number":357,"context_line":"@validator"},{"line_number":358,"context_line":"def image_valid_on_flavor(config, clients, deployment, flavor_name,"},{"line_number":359,"context_line":"                          image_name, validate_disk\u003dTrue,"},{"line_number":360,"context_line":"                          fail_on_404_image\u003dTrue):"},{"line_number":361,"context_line":"    \"\"\"Returns validator for image could be used for current flavor"},{"line_number":362,"context_line":""},{"line_number":363,"context_line":"    :param flavor_name: defines which variable should be used"}],"source_content_type":"text/x-python","patch_set":42,"id":"3a461143_9913630d","line":360,"range":{"start_line":360,"start_character":26,"end_line":360,"end_character":43},"updated":"2017-02-02 08:18:52.000000000","message":"Please add a doc string for this argument.","commit_id":"4e4686b114e025dfdb8a691e180adb015128f637"}]}
