)]}'
{"rally-jobs/rally-ironic.yaml":[{"author":{"_account_id":8851,"name":"Valeriy Ponomaryov","email":"kiparis.kh@gmail.com","username":"vponomaryov"},"change_message_id":"3e1f64882690228f2186ac9b714dcbfdfb183c6e","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"  IronicNodes.create_and_list_node:"},{"line_number":3,"context_line":"    -"},{"line_number":4,"context_line":"      args:"},{"line_number":5,"context_line":"        driver: \"pxe_ssh\""}],"source_content_type":"text/x-yaml","patch_set":18,"id":"9a41bdd9_69616b04","line":2,"updated":"2015-07-16 11:13:34.000000000","message":"These two can be defined using jinja template.\n\nDocs: http://rally.readthedocs.org/en/stable/tutorial/step_4_task_templates.html#step-4-rally-task-templates\n\nExample: https://review.openstack.org/#/c/188833/15/rally-jobs/rally-manila.yaml","commit_id":"2220f9aa6ac634803d00dcdf093dcd532b48f1ae"}],"rally/consts.py":[{"author":{"_account_id":13609,"name":"Pavel Boldin","email":"pboldin@mirantis.com","username":"pboldin"},"change_message_id":"93ce82fc4845d5c6aa8870b8a01cce0abed8cc9c","unresolved":false,"context_lines":[{"line_number":131,"context_line":"    OBJECT_STORE \u003d \"object-store\""},{"line_number":132,"context_line":"    WORKFLOW_EXECUTION \u003d \"workflowv2\""},{"line_number":133,"context_line":"    APPLICATION_CATALOG \u003d \"application_catalog\""},{"line_number":134,"context_line":"    BARE_METAL \u003d \"baremetal\""},{"line_number":135,"context_line":""},{"line_number":136,"context_line":"    def __init__(self):"},{"line_number":137,"context_line":"        self.__names \u003d {"}],"source_content_type":"text/x-python","patch_set":17,"id":"9a41bdd9_fd5bd052","line":134,"updated":"2015-07-12 15:25:40.000000000","message":"Probably just BAREMETAL is better. Look at the above: only those with values with non-alphanum symbols do have \u0027_\u0027 in variable name.","commit_id":"ea3b2c80a5e2799de53c8e26c36f834e4596b5b5"},{"author":{"_account_id":13609,"name":"Pavel Boldin","email":"pboldin@mirantis.com","username":"pboldin"},"change_message_id":"19fd13a44ee020952cde70d9448a0700e3408a72","unresolved":false,"context_lines":[{"line_number":131,"context_line":"    OBJECT_STORE \u003d \"object-store\""},{"line_number":132,"context_line":"    WORKFLOW_EXECUTION \u003d \"workflowv2\""},{"line_number":133,"context_line":"    APPLICATION_CATALOG \u003d \"application_catalog\""},{"line_number":134,"context_line":"    BARE_METAL \u003d \"baremetal\""},{"line_number":135,"context_line":""},{"line_number":136,"context_line":"    def __init__(self):"},{"line_number":137,"context_line":"        self.__names \u003d {"}],"source_content_type":"text/x-python","patch_set":17,"id":"9a41bdd9_0a3bbfd2","line":134,"in_reply_to":"9a41bdd9_e4a7b44d","updated":"2015-07-12 20:26:40.000000000","message":"No, it is not.\n\nOther services are called with the \u0027_\u0027 in variable name *only* when there is a underscore in the value itself.","commit_id":"ea3b2c80a5e2799de53c8e26c36f834e4596b5b5"},{"author":{"_account_id":12395,"name":"Roman Vasylets","email":"pomeo92@gmail.com","username":"rvasilets"},"change_message_id":"84b727c2c1657006438ca159d80970456dd98083","unresolved":false,"context_lines":[{"line_number":131,"context_line":"    OBJECT_STORE \u003d \"object-store\""},{"line_number":132,"context_line":"    WORKFLOW_EXECUTION \u003d \"workflowv2\""},{"line_number":133,"context_line":"    APPLICATION_CATALOG \u003d \"application_catalog\""},{"line_number":134,"context_line":"    BARE_METAL \u003d \"baremetal\""},{"line_number":135,"context_line":""},{"line_number":136,"context_line":"    def __init__(self):"},{"line_number":137,"context_line":"        self.__names \u003d {"}],"source_content_type":"text/x-python","patch_set":17,"id":"9a41bdd9_e4a7b44d","line":134,"in_reply_to":"9a41bdd9_fd5bd052","updated":"2015-07-12 19:32:33.000000000","message":"I don\u0027t know why we need to rename it. It was called as other services.","commit_id":"ea3b2c80a5e2799de53c8e26c36f834e4596b5b5"},{"author":{"_account_id":8851,"name":"Valeriy Ponomaryov","email":"kiparis.kh@gmail.com","username":"vponomaryov"},"change_message_id":"3e1f64882690228f2186ac9b714dcbfdfb183c6e","unresolved":false,"context_lines":[{"line_number":155,"context_line":"            self.OBJECT_STORE: _Service.SWIFT,"},{"line_number":156,"context_line":"            self.WORKFLOW_EXECUTION: _Service.MISTRAL,"},{"line_number":157,"context_line":"            self.APPLICATION_CATALOG: _Service.MURANO,"},{"line_number":158,"context_line":"            self.BARE_METAL: _Service.IRONIC"},{"line_number":159,"context_line":"        }"},{"line_number":160,"context_line":""},{"line_number":161,"context_line":"    def __getitem__(self, service_type):"}],"source_content_type":"text/x-python","patch_set":18,"id":"9a41bdd9_e4284288","line":158,"updated":"2015-07-16 11:13:34.000000000","message":"Please, add comma at the end to avoid update of additional line in future as you do now for \u0027\u0027Murano\".","commit_id":"2220f9aa6ac634803d00dcdf093dcd532b48f1ae"}],"rally/plugins/openstack/scenarios/ironic/basic.py":[{"author":{"_account_id":12395,"name":"Roman Vasylets","email":"pomeo92@gmail.com","username":"rvasilets"},"change_message_id":"fd9f9987b06b0c87318a6204dfef86fd9f71efc6","unresolved":false,"context_lines":[{"line_number":61,"context_line":"        :returns: A list of nodes."},{"line_number":62,"context_line":"        \"\"\""},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"        utils._create(**kwargs)"},{"line_number":65,"context_line":""},{"line_number":66,"context_line":"        return utils._list_nodes("},{"line_number":67,"context_line":"            associated\u003dassociated, maintenance\u003dmaintenance, marker\u003dmarker,"}],"source_content_type":"text/x-python","patch_set":4,"id":"3afb71cf_038b4569","line":64,"updated":"2015-06-10 12:36:20.000000000","message":"_create_node","commit_id":"0eb2f32ce39c4cd37657b313c34278ff8422d6a1"}],"rally/plugins/openstack/scenarios/ironic/nodes.py":[{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"a8ee2be9e88f2bab07273e81f33a95e78503132f","unresolved":false,"context_lines":[{"line_number":77,"context_line":"        :param kwargs: Optional additional arguments"},{"line_number":78,"context_line":"        :returns: node object."},{"line_number":79,"context_line":"        \"\"\""},{"line_number":80,"context_line":"        return self._create_node(**kwargs)"}],"source_content_type":"text/x-python","patch_set":9,"id":"fa32b979_4fa119f7","line":80,"updated":"2015-06-18 16:19:50.000000000","message":"Shouldn\u0027t we add a scenario for deleting the node too?\n\ncreate_and_delete_node() - maybe?","commit_id":"68bb99148ef7ea332c71e92a16edff73e34e85a8"},{"author":{"_account_id":12395,"name":"Roman Vasylets","email":"pomeo92@gmail.com","username":"rvasilets"},"change_message_id":"37ab3dc727711823f116db3c912109b67e9c26bb","unresolved":false,"context_lines":[{"line_number":77,"context_line":"        :param kwargs: Optional additional arguments"},{"line_number":78,"context_line":"        :returns: node object."},{"line_number":79,"context_line":"        \"\"\""},{"line_number":80,"context_line":"        return self._create_node(**kwargs)"}],"source_content_type":"text/x-python","patch_set":9,"id":"fa32b979_904e5d39","line":80,"in_reply_to":"fa32b979_4fa119f7","updated":"2015-06-18 18:28:03.000000000","message":"We could add all scenarios that you request. If we create node in scenario but not delete it in scenario it would be deleted by cleanup manager after","commit_id":"68bb99148ef7ea332c71e92a16edff73e34e85a8"},{"author":{"_account_id":8840,"name":"Carlos L. Torres","email":"carlos.torres@rackspace.com","username":"carl6796"},"change_message_id":"54dbbe3faea3e8f61c422465615e93608884d760","unresolved":false,"context_lines":[{"line_number":77,"context_line":"        :param kwargs: Optional additional arguments"},{"line_number":78,"context_line":"        :returns: node object."},{"line_number":79,"context_line":"        \"\"\""},{"line_number":80,"context_line":"        return self._create_node(**kwargs)"}],"source_content_type":"text/x-python","patch_set":9,"id":"fa32b979_e3de013d","line":80,"in_reply_to":"fa32b979_904e5d39","updated":"2015-06-18 19:02:24.000000000","message":"While is true that the server will be deleted by cleanup manager, is not going to return a measurement for the delete action.","commit_id":"68bb99148ef7ea332c71e92a16edff73e34e85a8"},{"author":{"_account_id":10475,"name":"Alexander Maretskiy","email":"amaretskiy@mirantis.com","username":"maretskiy"},"change_message_id":"f1f0b69c63a967597d341d9e63a5e62996e5e1d7","unresolved":false,"context_lines":[{"line_number":22,"context_line":"class IronicNodes(utils.IronicScenario):"},{"line_number":23,"context_line":"    \"\"\"Base class for Ironic scenarios with basic atomic actions.\"\"\""},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"    RESOURCE_NAME_PREFIX \u003d \"rally_node_\""},{"line_number":26,"context_line":"    RESOURCE_NAME_LENGTH \u003d 16"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"    @validation.required_services(consts.Service.IRONIC)"}],"source_content_type":"text/x-python","patch_set":12,"id":"fa32b979_b4a3f89d","line":25,"updated":"2015-06-22 12:37:49.000000000","message":"This should be removed since this class does not use _generate_random_name()","commit_id":"48997d87010294d13cd7c792cec20da63d1ab2ab"},{"author":{"_account_id":10475,"name":"Alexander Maretskiy","email":"amaretskiy@mirantis.com","username":"maretskiy"},"change_message_id":"f1f0b69c63a967597d341d9e63a5e62996e5e1d7","unresolved":false,"context_lines":[{"line_number":23,"context_line":"    \"\"\"Base class for Ironic scenarios with basic atomic actions.\"\"\""},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"    RESOURCE_NAME_PREFIX \u003d \"rally_node_\""},{"line_number":26,"context_line":"    RESOURCE_NAME_LENGTH \u003d 16"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"    @validation.required_services(consts.Service.IRONIC)"},{"line_number":29,"context_line":"    @validation.required_openstack(admin\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":12,"id":"fa32b979_74ad7087","line":26,"updated":"2015-06-22 12:37:49.000000000","message":"ditto","commit_id":"48997d87010294d13cd7c792cec20da63d1ab2ab"},{"author":{"_account_id":10475,"name":"Alexander Maretskiy","email":"amaretskiy@mirantis.com","username":"maretskiy"},"change_message_id":"f1f0b69c63a967597d341d9e63a5e62996e5e1d7","unresolved":false,"context_lines":[{"line_number":29,"context_line":"    @validation.required_openstack(admin\u003dTrue)"},{"line_number":30,"context_line":"    @base.scenario(context\u003d{\"cleanup\": [\"ironic\"]})"},{"line_number":31,"context_line":"    def create_and_list_node("},{"line_number":32,"context_line":"            self, associated\u003dNone, maintenance\u003dNone,"},{"line_number":33,"context_line":"            marker\u003dNone, limit\u003dNone, detail\u003dFalse, sort_key\u003dNone,"},{"line_number":34,"context_line":"            sort_dir\u003dNone, **kwargs):"},{"line_number":35,"context_line":"        \"\"\"Create and list nodes."}],"source_content_type":"text/x-python","patch_set":12,"id":"fa32b979_2fff9102","line":32,"updated":"2015-06-22 12:37:49.000000000","message":"Here you have mixed _create_node() args and _list_nodes() args. I recommend to split these args into two arguments:\n\n def create_and_list_node(self,\n                          create_node_args\u003dNone,\n                          list_nodes_args\u003dNone):\n\n   create_node_args \u003d create_node_args or {\"driver\": \"pxe_ipmitool\"}\n   list_nodes_args \u003d list_nodes_args or {}\n\n   ...","commit_id":"48997d87010294d13cd7c792cec20da63d1ab2ab"},{"author":{"_account_id":10475,"name":"Alexander Maretskiy","email":"amaretskiy@mirantis.com","username":"maretskiy"},"change_message_id":"f1f0b69c63a967597d341d9e63a5e62996e5e1d7","unresolved":false,"context_lines":[{"line_number":35,"context_line":"        \"\"\"Create and list nodes."},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"        NOTE:"},{"line_number":38,"context_line":"            At minimum, you must specify the driver name (eg, \"pxe_ipmitool\")."},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"        :param associated: Optional. Either a Boolean or a string"},{"line_number":41,"context_line":"                           representation of a Boolean that indicates whether"}],"source_content_type":"text/x-python","patch_set":12,"id":"fa32b979_0f716da8","line":38,"range":{"start_line":38,"start_character":63,"end_line":38,"end_character":75},"updated":"2015-06-22 12:37:49.000000000","message":"Docstring is wrong way of control arguments. You can verify (or set default) any argument explicitly","commit_id":"48997d87010294d13cd7c792cec20da63d1ab2ab"},{"author":{"_account_id":10475,"name":"Alexander Maretskiy","email":"amaretskiy@mirantis.com","username":"maretskiy"},"change_message_id":"4b33d331174d754e5bb311a9dc5d2c3928c2fdce","unresolved":false,"context_lines":[{"line_number":67,"context_line":""},{"line_number":68,"context_line":"        self._create_node(**kwargs)"},{"line_number":69,"context_line":""},{"line_number":70,"context_line":"        return self._list_nodes("},{"line_number":71,"context_line":"            associated\u003dassociated, maintenance\u003dmaintenance, marker\u003dmarker,"},{"line_number":72,"context_line":"            limit\u003dlimit, detail\u003ddetail, sort_key\u003dsort_key, sort_dir\u003dsort_dir)"},{"line_number":73,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"fa32b979_a1e2d52d","line":70,"updated":"2015-06-22 12:40:27.000000000","message":"Why return? Do we use return value?","commit_id":"48997d87010294d13cd7c792cec20da63d1ab2ab"},{"author":{"_account_id":10475,"name":"Alexander Maretskiy","email":"amaretskiy@mirantis.com","username":"maretskiy"},"change_message_id":"f1f0b69c63a967597d341d9e63a5e62996e5e1d7","unresolved":false,"context_lines":[{"line_number":78,"context_line":"        \"\"\"Create node."},{"line_number":79,"context_line":""},{"line_number":80,"context_line":"        NOTE:"},{"line_number":81,"context_line":"            At minimum, you must specify the driver name (eg, \"pxe_ipmitool\")."},{"line_number":82,"context_line":""},{"line_number":83,"context_line":"        :param kwargs: Optional additional arguments"},{"line_number":84,"context_line":"        :returns: node object."}],"source_content_type":"text/x-python","patch_set":12,"id":"fa32b979_8f5d7d17","line":81,"updated":"2015-06-22 12:37:49.000000000","message":"ditto","commit_id":"48997d87010294d13cd7c792cec20da63d1ab2ab"},{"author":{"_account_id":10475,"name":"Alexander Maretskiy","email":"amaretskiy@mirantis.com","username":"maretskiy"},"change_message_id":"f1f0b69c63a967597d341d9e63a5e62996e5e1d7","unresolved":false,"context_lines":[{"line_number":83,"context_line":"        :param kwargs: Optional additional arguments"},{"line_number":84,"context_line":"        :returns: node object."},{"line_number":85,"context_line":"        \"\"\""},{"line_number":86,"context_line":"        return self._create_node(**kwargs)"}],"source_content_type":"text/x-python","patch_set":12,"id":"fa32b979_8fe25d2e","line":86,"updated":"2015-06-22 12:37:49.000000000","message":"Why return?","commit_id":"48997d87010294d13cd7c792cec20da63d1ab2ab"},{"author":{"_account_id":10475,"name":"Alexander Maretskiy","email":"amaretskiy@mirantis.com","username":"maretskiy"},"change_message_id":"e9cdf68df6872fb5288fd6794303b2f71e1b7792","unresolved":false,"context_lines":[{"line_number":29,"context_line":"    def create_and_list_node("},{"line_number":30,"context_line":"            self, associated\u003dNone, maintenance\u003dNone,"},{"line_number":31,"context_line":"            marker\u003dNone, limit\u003dNone, detail\u003dFalse, sort_key\u003dNone,"},{"line_number":32,"context_line":"            sort_dir\u003dNone, **kwargs):"},{"line_number":33,"context_line":"        \"\"\"Create and list nodes."},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"        :param associated: Optional. Either a Boolean or a string"}],"source_content_type":"text/x-python","patch_set":18,"id":"9a41bdd9_784c409e","line":32,"updated":"2015-07-14 16:12:58.000000000","message":"This definition mixes arguments for two different methods - this is confusing and require extra effort to understand explicitly what argument is for _create_node() and what is for _list_nodes()  - why not simply use only two arguments, something like that:\n\n  def create_and_list_node(self, create_node_args\u003dNone,\n                           list_nodes_args\u003dNone):\n      \"\"\" ... \"\"\"\n      self._create_node(**(create_node_args or {}))\n      self._list_nodes(**(list_nodes_args or {}))","commit_id":"2220f9aa6ac634803d00dcdf093dcd532b48f1ae"},{"author":{"_account_id":10475,"name":"Alexander Maretskiy","email":"amaretskiy@mirantis.com","username":"maretskiy"},"change_message_id":"e9cdf68df6872fb5288fd6794303b2f71e1b7792","unresolved":false,"context_lines":[{"line_number":34,"context_line":""},{"line_number":35,"context_line":"        :param associated: Optional. Either a Boolean or a string"},{"line_number":36,"context_line":"                           representation of a Boolean that indicates whether"},{"line_number":37,"context_line":"                           to return a list of associated (True or \"True\") or"},{"line_number":38,"context_line":"                           unassociated (False or \"False\") nodes."},{"line_number":39,"context_line":"        :param maintenance: Optional. Either a Boolean or a string"},{"line_number":40,"context_line":"                            representation of a Boolean that indicates whether"}],"source_content_type":"text/x-python","patch_set":18,"id":"9a41bdd9_98bd84b9","line":37,"updated":"2015-07-14 16:12:58.000000000","message":"Why not use only boolean. \"True\" and \"False\" looks redundant and confusing","commit_id":"2220f9aa6ac634803d00dcdf093dcd532b48f1ae"},{"author":{"_account_id":11748,"name":"Chris St. Pierre","email":"cstpierr@cisco.com","username":"stpierre"},"change_message_id":"8116662f843474f1a306a2c4e0377c2ac6819ea7","unresolved":false,"context_lines":[{"line_number":26,"context_line":"    @validation.required_services(consts.Service.IRONIC)"},{"line_number":27,"context_line":"    @validation.required_openstack(admin\u003dTrue)"},{"line_number":28,"context_line":"    @base.scenario(context\u003d{\"admin_cleanup\": [\"ironic\"]})"},{"line_number":29,"context_line":"    def create_and_list_node("},{"line_number":30,"context_line":"            self, associated\u003dNone, maintenance\u003dNone,"},{"line_number":31,"context_line":"            marker\u003dNone, limit\u003dNone, detail\u003dFalse, sort_key\u003dNone,"},{"line_number":32,"context_line":"            sort_dir\u003dNone, **kwargs):"}],"source_content_type":"text/x-python","patch_set":20,"id":"3a50d1a3_b62f91a0","line":29,"updated":"2015-07-20 15:49:47.000000000","message":"Should this be create_and_list_nodes instead?","commit_id":"d1fcdccd9bdf3cbaffe9013461c9e7b89e760695"},{"author":{"_account_id":12395,"name":"Roman Vasylets","email":"pomeo92@gmail.com","username":"rvasilets"},"change_message_id":"ba8bea4b9241b5afa23e1eb65c066bdb59923ad1","unresolved":false,"context_lines":[{"line_number":26,"context_line":"    @validation.required_services(consts.Service.IRONIC)"},{"line_number":27,"context_line":"    @validation.required_openstack(admin\u003dTrue)"},{"line_number":28,"context_line":"    @base.scenario(context\u003d{\"admin_cleanup\": [\"ironic\"]})"},{"line_number":29,"context_line":"    def create_and_list_node("},{"line_number":30,"context_line":"            self, associated\u003dNone, maintenance\u003dNone,"},{"line_number":31,"context_line":"            marker\u003dNone, limit\u003dNone, detail\u003dFalse, sort_key\u003dNone,"},{"line_number":32,"context_line":"            sort_dir\u003dNone, **kwargs):"}],"source_content_type":"text/x-python","patch_set":20,"id":"3a50d1a3_9e459918","line":29,"in_reply_to":"3a50d1a3_3c4a54c6","updated":"2015-07-21 12:31:45.000000000","message":"Ok. But I prefer left it like this.","commit_id":"d1fcdccd9bdf3cbaffe9013461c9e7b89e760695"},{"author":{"_account_id":11748,"name":"Chris St. Pierre","email":"cstpierr@cisco.com","username":"stpierre"},"change_message_id":"f37bae536d796bb1bbf0104c3d4b82e34157b5af","unresolved":false,"context_lines":[{"line_number":26,"context_line":"    @validation.required_services(consts.Service.IRONIC)"},{"line_number":27,"context_line":"    @validation.required_openstack(admin\u003dTrue)"},{"line_number":28,"context_line":"    @base.scenario(context\u003d{\"admin_cleanup\": [\"ironic\"]})"},{"line_number":29,"context_line":"    def create_and_list_node("},{"line_number":30,"context_line":"            self, associated\u003dNone, maintenance\u003dNone,"},{"line_number":31,"context_line":"            marker\u003dNone, limit\u003dNone, detail\u003dFalse, sort_key\u003dNone,"},{"line_number":32,"context_line":"            sort_dir\u003dNone, **kwargs):"}],"source_content_type":"text/x-python","patch_set":20,"id":"3a50d1a3_3c4a54c6","line":29,"in_reply_to":"3a50d1a3_b5f680f7","updated":"2015-07-21 11:11:25.000000000","message":"Looks like Rally is inconsistent about this (see Keystone, for example). I\u0027ve added an agenda item to talk about it at the next meeting.","commit_id":"d1fcdccd9bdf3cbaffe9013461c9e7b89e760695"},{"author":{"_account_id":12395,"name":"Roman Vasylets","email":"pomeo92@gmail.com","username":"rvasilets"},"change_message_id":"f1b5081dab76d159d268405453f2f329c98852fc","unresolved":false,"context_lines":[{"line_number":26,"context_line":"    @validation.required_services(consts.Service.IRONIC)"},{"line_number":27,"context_line":"    @validation.required_openstack(admin\u003dTrue)"},{"line_number":28,"context_line":"    @base.scenario(context\u003d{\"admin_cleanup\": [\"ironic\"]})"},{"line_number":29,"context_line":"    def create_and_list_node("},{"line_number":30,"context_line":"            self, associated\u003dNone, maintenance\u003dNone,"},{"line_number":31,"context_line":"            marker\u003dNone, limit\u003dNone, detail\u003dFalse, sort_key\u003dNone,"},{"line_number":32,"context_line":"            sort_dir\u003dNone, **kwargs):"}],"source_content_type":"text/x-python","patch_set":20,"id":"3a50d1a3_b5f680f7","line":29,"in_reply_to":"3a50d1a3_b62f91a0","updated":"2015-07-21 09:04:48.000000000","message":"No. I took pattern from other our scenarios. Look at glance for example.","commit_id":"d1fcdccd9bdf3cbaffe9013461c9e7b89e760695"},{"author":{"_account_id":11748,"name":"Chris St. Pierre","email":"cstpierr@cisco.com","username":"stpierre"},"change_message_id":"8116662f843474f1a306a2c4e0377c2ac6819ea7","unresolved":false,"context_lines":[{"line_number":56,"context_line":"        :param sort_key: Optional, field used for sorting."},{"line_number":57,"context_line":"        :param sort_dir: Optional, direction of sorting, either \u0027asc\u0027 (the"},{"line_number":58,"context_line":"                         default) or \u0027desc\u0027."},{"line_number":59,"context_line":"        :param kwargs: Optional additional arguments"},{"line_number":60,"context_line":"        \"\"\""},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"        self._create_node(**kwargs)"}],"source_content_type":"text/x-python","patch_set":20,"id":"3a50d1a3_761269b6","line":59,"updated":"2015-07-20 15:49:47.000000000","message":"\"Optional additional arguments for node creation\"","commit_id":"d1fcdccd9bdf3cbaffe9013461c9e7b89e760695"},{"author":{"_account_id":12395,"name":"Roman Vasylets","email":"pomeo92@gmail.com","username":"rvasilets"},"change_message_id":"f1b5081dab76d159d268405453f2f329c98852fc","unresolved":false,"context_lines":[{"line_number":56,"context_line":"        :param sort_key: Optional, field used for sorting."},{"line_number":57,"context_line":"        :param sort_dir: Optional, direction of sorting, either \u0027asc\u0027 (the"},{"line_number":58,"context_line":"                         default) or \u0027desc\u0027."},{"line_number":59,"context_line":"        :param kwargs: Optional additional arguments"},{"line_number":60,"context_line":"        \"\"\""},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"        self._create_node(**kwargs)"}],"source_content_type":"text/x-python","patch_set":20,"id":"3a50d1a3_15dc1411","line":59,"in_reply_to":"3a50d1a3_761269b6","updated":"2015-07-21 09:04:48.000000000","message":"Okey. I wiil take this as mark when I would review other patches. Thx","commit_id":"d1fcdccd9bdf3cbaffe9013461c9e7b89e760695"},{"author":{"_account_id":11748,"name":"Chris St. Pierre","email":"cstpierr@cisco.com","username":"stpierre"},"change_message_id":"8116662f843474f1a306a2c4e0377c2ac6819ea7","unresolved":false,"context_lines":[{"line_number":72,"context_line":"    def create_and_delete_node(self, **kwargs):"},{"line_number":73,"context_line":"        \"\"\"Create and delete node."},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"        :param kwargs: Optional additional arguments"},{"line_number":76,"context_line":"        \"\"\""},{"line_number":77,"context_line":"        node \u003d self._create_node(**kwargs)"},{"line_number":78,"context_line":"        self._delete_node(node.uuid)"}],"source_content_type":"text/x-python","patch_set":20,"id":"3a50d1a3_56116dab","line":75,"updated":"2015-07-20 15:49:47.000000000","message":"Same.","commit_id":"d1fcdccd9bdf3cbaffe9013461c9e7b89e760695"}],"rally/plugins/openstack/scenarios/ironic/utils.py":[{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"43e8018b92ff9ddd6516bfdfabc4b41b18f13156","unresolved":false,"context_lines":[{"line_number":23,"context_line":"    cfg.FloatOpt(\"ironic_node_create_poll_interval\","},{"line_number":24,"context_line":"                 default\u003d1.0,"},{"line_number":25,"context_line":"                 help\u003d\"Interval between checks when waiting for node \""},{"line_number":26,"context_line":"                      \"creation.\"),"},{"line_number":27,"context_line":"    cfg.FloatOpt(\"ironic_node_create_timeout\","},{"line_number":28,"context_line":"                 default\u003d1200.0,"},{"line_number":29,"context_line":"                 help\u003d\"Timeout(in sec) when waiting for node creation.\"),"}],"source_content_type":"text/x-python","patch_set":3,"id":"3afb71cf_906fe0c4","line":26,"updated":"2015-06-08 15:21:41.000000000","message":"in seconds","commit_id":"769f6949540bae9eb0cec37b62710376906c402c"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"1837c016eb95e37763467df40386933a14ade411","unresolved":false,"context_lines":[{"line_number":25,"context_line":"                 help\u003d\"Interval between checks when waiting for node \""},{"line_number":26,"context_line":"                      \"creation.\"),"},{"line_number":27,"context_line":"    cfg.FloatOpt(\"ironic_node_create_timeout\","},{"line_number":28,"context_line":"                 default\u003d1200.0,"},{"line_number":29,"context_line":"                 help\u003d\"Timeout(in sec) when waiting for node creation.\"),"},{"line_number":30,"context_line":"]"},{"line_number":31,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"3afb71cf_f0a61452","line":28,"updated":"2015-06-08 15:25:29.000000000","message":"btw this timeout also sounds pretty high (20 minutes) for node creation (ofc it depends on the amount of nodes being created, but still)","commit_id":"769f6949540bae9eb0cec37b62710376906c402c"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"43e8018b92ff9ddd6516bfdfabc4b41b18f13156","unresolved":false,"context_lines":[{"line_number":49,"context_line":"            kwargs[\"name\"] \u003d self._generate_random_name()"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"        node \u003d self.clients(\"ironic\").node.create(**kwargs)"},{"line_number":52,"context_line":"        node \u003d bench_utils.wait_for("},{"line_number":53,"context_line":"            node,"},{"line_number":54,"context_line":"            is_ready\u003dbench_utils.resource_is(\"active\"),"},{"line_number":55,"context_line":"            update_resource\u003dbench_utils.get_from_manager(),"}],"source_content_type":"text/x-python","patch_set":3,"id":"3afb71cf_30ceec5a","line":52,"updated":"2015-06-08 15:21:41.000000000","message":"(I don\u0027t know rally)\n\nnode.create() is a sync call, not sure what it\u0027s waiting for here","commit_id":"769f6949540bae9eb0cec37b62710376906c402c"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"43e8018b92ff9ddd6516bfdfabc4b41b18f13156","unresolved":false,"context_lines":[{"line_number":101,"context_line":"        :param node_id: id of the node to be deleted"},{"line_number":102,"context_line":"        \"\"\""},{"line_number":103,"context_line":""},{"line_number":104,"context_line":"        self.clients(\"ironic\").node.delete(node_id)"}],"source_content_type":"text/x-python","patch_set":3,"id":"3afb71cf_30f5cc82","line":104,"updated":"2015-06-08 15:21:41.000000000","message":"(I don\u0027t know rally)\n\nIf that wait_for is done and valid for node create (L52), perhaps deletion should also do it?","commit_id":"769f6949540bae9eb0cec37b62710376906c402c"},{"author":{"_account_id":2889,"name":"Aeva Black","email":"aeva.online@gmail.com","username":"tenbrae"},"change_message_id":"e1c930e7ca8242ca1faec498b29f7f8d5266fea1","unresolved":false,"context_lines":[{"line_number":25,"context_line":"                 help\u003d\"Interval(in sec) between checks when waiting for node \""},{"line_number":26,"context_line":"                      \"creation.\"),"},{"line_number":27,"context_line":"    cfg.FloatOpt(\"ironic_node_create_timeout\","},{"line_number":28,"context_line":"                 default\u003d1200.0,"},{"line_number":29,"context_line":"                 help\u003d\"Timeout(in sec) when waiting for node creation.\"),"},{"line_number":30,"context_line":"]"},{"line_number":31,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"fa32b979_a2a0d391","line":28,"updated":"2015-06-13 12:30:25.000000000","message":"this timeout doesn\u0027t make sense -- node creation is immediate. If you do not get an error from the POST, then Ironic has created the node.","commit_id":"17147b122930d9f2b6bfa9f7c545bfadc193c8df"},{"author":{"_account_id":12395,"name":"Roman Vasylets","email":"pomeo92@gmail.com","username":"rvasilets"},"change_message_id":"b1edd33bfdce61c65dbc2c9563b6397372bcf449","unresolved":false,"context_lines":[{"line_number":25,"context_line":"                 help\u003d\"Interval(in sec) between checks when waiting for node \""},{"line_number":26,"context_line":"                      \"creation.\"),"},{"line_number":27,"context_line":"    cfg.FloatOpt(\"ironic_node_create_timeout\","},{"line_number":28,"context_line":"                 default\u003d1200.0,"},{"line_number":29,"context_line":"                 help\u003d\"Timeout(in sec) when waiting for node creation.\"),"},{"line_number":30,"context_line":"]"},{"line_number":31,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"fa32b979_94cd3887","line":28,"in_reply_to":"fa32b979_a2a0d391","updated":"2015-06-17 13:57:11.000000000","message":"Done","commit_id":"17147b122930d9f2b6bfa9f7c545bfadc193c8df"},{"author":{"_account_id":2889,"name":"Aeva Black","email":"aeva.online@gmail.com","username":"tenbrae"},"change_message_id":"e1c930e7ca8242ca1faec498b29f7f8d5266fea1","unresolved":false,"context_lines":[{"line_number":34,"context_line":"CONF.register_opts(IRONIC_BENCHMARK_OPTS, group\u003dbenchmark_group)"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"class IronicScenario(base.Scenario):"},{"line_number":38,"context_line":"    \"\"\"Base class for Ironic scenarios with basic atomic actions.\"\"\""},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"    @base.atomic_action_timer(\"ironic.create_node\")"}],"source_content_type":"text/x-python","patch_set":5,"id":"fa32b979_62aacb72","line":37,"updated":"2015-06-13 12:30:25.000000000","message":"You lack any method for fetching a Node by its identifier (UUID or Name).","commit_id":"17147b122930d9f2b6bfa9f7c545bfadc193c8df"},{"author":{"_account_id":12395,"name":"Roman Vasylets","email":"pomeo92@gmail.com","username":"rvasilets"},"change_message_id":"b1edd33bfdce61c65dbc2c9563b6397372bcf449","unresolved":false,"context_lines":[{"line_number":34,"context_line":"CONF.register_opts(IRONIC_BENCHMARK_OPTS, group\u003dbenchmark_group)"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"class IronicScenario(base.Scenario):"},{"line_number":38,"context_line":"    \"\"\"Base class for Ironic scenarios with basic atomic actions.\"\"\""},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"    @base.atomic_action_timer(\"ironic.create_node\")"}],"source_content_type":"text/x-python","patch_set":5,"id":"fa32b979_b4dabc49","line":37,"in_reply_to":"fa32b979_62aacb72","updated":"2015-06-17 13:57:11.000000000","message":"First I try to add some benchmark that doesn\u0027t required context(existence of nodes) just to test that ironic works proper.","commit_id":"17147b122930d9f2b6bfa9f7c545bfadc193c8df"},{"author":{"_account_id":12395,"name":"Roman Vasylets","email":"pomeo92@gmail.com","username":"rvasilets"},"change_message_id":"e6d577fa40b97c850d40253b27da64fa6396ceb8","unresolved":false,"context_lines":[{"line_number":34,"context_line":"CONF.register_opts(IRONIC_BENCHMARK_OPTS, group\u003dbenchmark_group)"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"class IronicScenario(base.Scenario):"},{"line_number":38,"context_line":"    \"\"\"Base class for Ironic scenarios with basic atomic actions.\"\"\""},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"    @base.atomic_action_timer(\"ironic.create_node\")"}],"source_content_type":"text/x-python","patch_set":5,"id":"fa32b979_54f7b058","line":37,"in_reply_to":"fa32b979_b4dabc49","updated":"2015-06-17 13:59:00.000000000","message":"Next patch I will add context node an some more advanced scenario. You could make me you suggestion what you want to see. Please feel free\u003d)","commit_id":"17147b122930d9f2b6bfa9f7c545bfadc193c8df"},{"author":{"_account_id":2889,"name":"Aeva Black","email":"aeva.online@gmail.com","username":"tenbrae"},"change_message_id":"e1c930e7ca8242ca1faec498b29f7f8d5266fea1","unresolved":false,"context_lines":[{"line_number":48,"context_line":"            kwargs[\"name\"] \u003d self._generate_random_name()"},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"        node \u003d self.clients(\"ironic\").node.create(**kwargs)"},{"line_number":51,"context_line":"        node \u003d bench_utils.wait_for("},{"line_number":52,"context_line":"            node,"},{"line_number":53,"context_line":"            is_ready\u003dbench_utils.resource_is(\"active\"),"},{"line_number":54,"context_line":"            update_resource\u003dbench_utils.get_from_manager(),"}],"source_content_type":"text/x-python","patch_set":5,"id":"fa32b979_02b65fdc","line":51,"updated":"2015-06-13 12:30:25.000000000","message":"again, there\u0027s nothing to \"wait for\" here. If the client.node.create() call returned without error, then the node has successfully been created.","commit_id":"17147b122930d9f2b6bfa9f7c545bfadc193c8df"},{"author":{"_account_id":12395,"name":"Roman Vasylets","email":"pomeo92@gmail.com","username":"rvasilets"},"change_message_id":"b1edd33bfdce61c65dbc2c9563b6397372bcf449","unresolved":false,"context_lines":[{"line_number":48,"context_line":"            kwargs[\"name\"] \u003d self._generate_random_name()"},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"        node \u003d self.clients(\"ironic\").node.create(**kwargs)"},{"line_number":51,"context_line":"        node \u003d bench_utils.wait_for("},{"line_number":52,"context_line":"            node,"},{"line_number":53,"context_line":"            is_ready\u003dbench_utils.resource_is(\"active\"),"},{"line_number":54,"context_line":"            update_resource\u003dbench_utils.get_from_manager(),"}],"source_content_type":"text/x-python","patch_set":5,"id":"fa32b979_74e994e5","line":51,"in_reply_to":"fa32b979_02b65fdc","updated":"2015-06-17 13:57:11.000000000","message":"Done","commit_id":"17147b122930d9f2b6bfa9f7c545bfadc193c8df"},{"author":{"_account_id":10475,"name":"Alexander Maretskiy","email":"amaretskiy@mirantis.com","username":"maretskiy"},"change_message_id":"f1f0b69c63a967597d341d9e63a5e62996e5e1d7","unresolved":false,"context_lines":[{"line_number":40,"context_line":"        \"\"\"Create node immediately."},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"        NOTE:"},{"line_number":43,"context_line":"            At minimum, you must specify the driver name (eg, \"pxe_ipmitool\")."},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"        :param kwargs: optional parameters to create image"},{"line_number":46,"context_line":"        :returns: node object"}],"source_content_type":"text/x-python","patch_set":12,"id":"fa32b979_af6de133","line":43,"updated":"2015-06-22 12:37:49.000000000","message":"Use validation for that","commit_id":"48997d87010294d13cd7c792cec20da63d1ab2ab"},{"author":{"_account_id":10475,"name":"Alexander Maretskiy","email":"amaretskiy@mirantis.com","username":"maretskiy"},"change_message_id":"f1f0b69c63a967597d341d9e63a5e62996e5e1d7","unresolved":false,"context_lines":[{"line_number":59,"context_line":"        return node"},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"    @base.atomic_action_timer(\"ironic.list_nodes\")"},{"line_number":62,"context_line":"    def _list_nodes(self, associated\u003dNone, maintenance\u003dNone, marker\u003dNone,"},{"line_number":63,"context_line":"                    limit\u003dNone, detail\u003dFalse, sort_key\u003dNone, sort_dir\u003dNone):"},{"line_number":64,"context_line":"        \"\"\"Return list of nodes."},{"line_number":65,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"fa32b979_2f4a3184","line":62,"updated":"2015-06-22 12:37:49.000000000","message":"Since all these parameters are optional, do we need to use them explicitly? Maybe just **kwargs?","commit_id":"48997d87010294d13cd7c792cec20da63d1ab2ab"},{"author":{"_account_id":13609,"name":"Pavel Boldin","email":"pboldin@mirantis.com","username":"pboldin"},"change_message_id":"93ce82fc4845d5c6aa8870b8a01cce0abed8cc9c","unresolved":false,"context_lines":[{"line_number":55,"context_line":"            # or the name could be just uuid."},{"line_number":56,"context_line":"            kwargs[\"name\"] \u003d \"rally.\" + str(uuid.uuid4())"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"        node \u003d self.admin_clients(\"ironic\").node.create(**kwargs)"},{"line_number":59,"context_line":"        return node"},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"    @base.atomic_action_timer(\"ironic.list_nodes\")"}],"source_content_type":"text/x-python","patch_set":17,"id":"9a41bdd9_70528715","line":58,"updated":"2015-07-12 15:25:40.000000000","message":"Please just return it, no need for an intermediate variable.","commit_id":"ea3b2c80a5e2799de53c8e26c36f834e4596b5b5"},{"author":{"_account_id":12395,"name":"Roman Vasylets","email":"pomeo92@gmail.com","username":"rvasilets"},"change_message_id":"84b727c2c1657006438ca159d80970456dd98083","unresolved":false,"context_lines":[{"line_number":55,"context_line":"            # or the name could be just uuid."},{"line_number":56,"context_line":"            kwargs[\"name\"] \u003d \"rally.\" + str(uuid.uuid4())"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"        node \u003d self.admin_clients(\"ironic\").node.create(**kwargs)"},{"line_number":59,"context_line":"        return node"},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"    @base.atomic_action_timer(\"ironic.list_nodes\")"}],"source_content_type":"text/x-python","patch_set":17,"id":"9a41bdd9_a468ccf6","line":58,"in_reply_to":"9a41bdd9_70528715","updated":"2015-07-12 19:32:33.000000000","message":"Done","commit_id":"ea3b2c80a5e2799de53c8e26c36f834e4596b5b5"},{"author":{"_account_id":10475,"name":"Alexander Maretskiy","email":"amaretskiy@mirantis.com","username":"maretskiy"},"change_message_id":"e9cdf68df6872fb5288fd6794303b2f71e1b7792","unresolved":false,"context_lines":[{"line_number":39,"context_line":"    def _create_node(self, **kwargs):"},{"line_number":40,"context_line":"        \"\"\"Create node immediately."},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"        NOTE:"},{"line_number":43,"context_line":"            At minimum, you must specify the driver name (eg, \"pxe_ipmitool\")."},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"        :param kwargs: optional parameters to create image"}],"source_content_type":"text/x-python","patch_set":18,"id":"9a41bdd9_db6786b5","line":42,"updated":"2015-07-14 16:12:58.000000000","message":"This \"NOTE\" looks not required.","commit_id":"2220f9aa6ac634803d00dcdf093dcd532b48f1ae"},{"author":{"_account_id":4428,"name":"Liyingjun","email":"yinjalee@163.com","username":"liyingjun"},"change_message_id":"8dcd4bbddf1bcbf7120f7819d5ad9455f7341bb1","unresolved":false,"context_lines":[{"line_number":40,"context_line":"        \"\"\"Create node immediately."},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"        NOTE:"},{"line_number":43,"context_line":"            At minimum, you must specify the driver name (eg, \"pxe_ipmitool\")."},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"        :param kwargs: optional parameters to create image"},{"line_number":46,"context_line":"        :returns: node object"}],"source_content_type":"text/x-python","patch_set":18,"id":"9a41bdd9_73183f85","line":43,"updated":"2015-07-13 06:26:16.000000000","message":"why not add a default for \u0027driver\u0027 if not specified?","commit_id":"2220f9aa6ac634803d00dcdf093dcd532b48f1ae"},{"author":{"_account_id":12395,"name":"Roman Vasylets","email":"pomeo92@gmail.com","username":"rvasilets"},"change_message_id":"04419390eb393038d773b7b7ddb49e2e36d6097e","unresolved":false,"context_lines":[{"line_number":40,"context_line":"        \"\"\"Create node immediately."},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"        NOTE:"},{"line_number":43,"context_line":"            At minimum, you must specify the driver name (eg, \"pxe_ipmitool\")."},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"        :param kwargs: optional parameters to create image"},{"line_number":46,"context_line":"        :returns: node object"}],"source_content_type":"text/x-python","patch_set":18,"id":"9a41bdd9_f93424df","line":43,"in_reply_to":"9a41bdd9_73183f85","updated":"2015-07-13 10:18:56.000000000","message":"because this is the signature of ironic client function. And we try to support it at least in utils as far as I know","commit_id":"2220f9aa6ac634803d00dcdf093dcd532b48f1ae"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"23319d200e3d7bb507cbf2b039ba8003c19661ec","unresolved":false,"context_lines":[{"line_number":40,"context_line":"        \"\"\"Create node immediately."},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"        NOTE:"},{"line_number":43,"context_line":"            At minimum, you must specify the driver name (eg, \"pxe_ipmitool\")."},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"        :param kwargs: optional parameters to create image"},{"line_number":46,"context_line":"        :returns: node object"}],"source_content_type":"text/x-python","patch_set":18,"id":"9a41bdd9_4b365f53","line":43,"in_reply_to":"9a41bdd9_f93424df","updated":"2015-07-14 09:21:13.000000000","message":"You may want to mention that not all drivers are enabled by default. You can enable drivers by edit the \"enabled_drivers\" configuration option.","commit_id":"2220f9aa6ac634803d00dcdf093dcd532b48f1ae"},{"author":{"_account_id":11748,"name":"Chris St. Pierre","email":"cstpierr@cisco.com","username":"stpierre"},"change_message_id":"8116662f843474f1a306a2c4e0377c2ac6819ea7","unresolved":false,"context_lines":[{"line_number":52,"context_line":"            # * http://tools.ietf.org/html/rfc952"},{"line_number":53,"context_line":"            # * http://tools.ietf.org/html/rfc1123"},{"line_number":54,"context_line":"            # or the name could be just uuid."},{"line_number":55,"context_line":"            kwargs[\"name\"] \u003d \"rally.\" + str(uuid.uuid4())"},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"        return self.admin_clients(\"ironic\").node.create(**kwargs)"},{"line_number":58,"context_line":""}],"source_content_type":"text/x-python","patch_set":20,"id":"3a50d1a3_964ff591","line":55,"updated":"2015-07-20 15:49:47.000000000","message":"This shouldn\u0027t be a problem with an appropriate prefix for _generate_random_name(). The name check in Ironic is actually broken, so is *similar* to the criteria described, but isn\u0027t exact. It\u0027s been replaced in API microversion 1.10 anyway.\n\nMake sure the name doesn\u0027t start with a number and it should be fine; to keep it simple, don\u0027t put a . in the name, either. According to the Ironic devs uppercase letters should work (although that\u0027s not obvious from the code), but even if they don\u0027t something like this should suffice:\n\n    self._generate_random_name(choice\u003dstring.lowercase + string.digits)\n\nWe\u0027ll need to convert this to _generate_random_name() anyway for the out-of-band cleanup specs.","commit_id":"d1fcdccd9bdf3cbaffe9013461c9e7b89e760695"},{"author":{"_account_id":12395,"name":"Roman Vasylets","email":"pomeo92@gmail.com","username":"rvasilets"},"change_message_id":"774b2f7707b65168e96dfde80a5f6c5c0e8f3ec8","unresolved":false,"context_lines":[{"line_number":52,"context_line":"            # * http://tools.ietf.org/html/rfc952"},{"line_number":53,"context_line":"            # * http://tools.ietf.org/html/rfc1123"},{"line_number":54,"context_line":"            # or the name could be just uuid."},{"line_number":55,"context_line":"            kwargs[\"name\"] \u003d \"rally.\" + str(uuid.uuid4())"},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"        return self.admin_clients(\"ironic\").node.create(**kwargs)"},{"line_number":58,"context_line":""}],"source_content_type":"text/x-python","patch_set":20,"id":"3a50d1a3_a10dd838","line":55,"in_reply_to":"3a50d1a3_964ff591","updated":"2015-07-21 12:40:59.000000000","message":"I just wanted to make delimiter random part from rally prefix. Ok I will make here. \n     self._generate_random_name(prefix\u003d\"rally\", choice\u003dstring.lowercase + string.digits)","commit_id":"d1fcdccd9bdf3cbaffe9013461c9e7b89e760695"},{"author":{"_account_id":12395,"name":"Roman Vasylets","email":"pomeo92@gmail.com","username":"rvasilets"},"change_message_id":"94f4235e2c515b6517e86812c0a9dcc7e1fd6042","unresolved":false,"context_lines":[{"line_number":52,"context_line":"            # * http://tools.ietf.org/html/rfc952"},{"line_number":53,"context_line":"            # * http://tools.ietf.org/html/rfc1123"},{"line_number":54,"context_line":"            # or the name could be just uuid."},{"line_number":55,"context_line":"            kwargs[\"name\"] \u003d \"rally.\" + str(uuid.uuid4())"},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"        return self.admin_clients(\"ironic\").node.create(**kwargs)"},{"line_number":58,"context_line":""}],"source_content_type":"text/x-python","patch_set":20,"id":"3a50d1a3_81a0dc44","line":55,"in_reply_to":"3a50d1a3_a10dd838","updated":"2015-07-22 13:13:21.000000000","message":"Also there is no such parameter as choice in this function. But there is such in common/utils.py I prefer to use standard library functionality with simple logic instead of our function which will make the same.","commit_id":"d1fcdccd9bdf3cbaffe9013461c9e7b89e760695"},{"author":{"_account_id":11748,"name":"Chris St. Pierre","email":"cstpierr@cisco.com","username":"stpierre"},"change_message_id":"5ac8eec6c97ee8420bb2d81a57e4d8e46b4be63e","unresolved":false,"context_lines":[{"line_number":52,"context_line":"            # * http://tools.ietf.org/html/rfc952"},{"line_number":53,"context_line":"            # * http://tools.ietf.org/html/rfc1123"},{"line_number":54,"context_line":"            # or the name could be just uuid."},{"line_number":55,"context_line":"            kwargs[\"name\"] \u003d \"rally\" + str(uuid.uuid4())"},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"        return self.admin_clients(\"ironic\").node.create(**kwargs)"},{"line_number":58,"context_line":""}],"source_content_type":"text/x-python","patch_set":21,"id":"3a50d1a3_fe260bcd","line":55,"updated":"2015-07-21 17:38:32.000000000","message":"Did you miss changing this?","commit_id":"7313bdfd6fcf0980ccc8cce00ccb376c7b66d398"},{"author":{"_account_id":11748,"name":"Chris St. Pierre","email":"cstpierr@cisco.com","username":"stpierre"},"change_message_id":"dfa951caa9d292fe06adf2522036aa8cfceaa795","unresolved":false,"context_lines":[{"line_number":52,"context_line":"            # * http://tools.ietf.org/html/rfc952"},{"line_number":53,"context_line":"            # * http://tools.ietf.org/html/rfc1123"},{"line_number":54,"context_line":"            # or the name could be just uuid."},{"line_number":55,"context_line":"            kwargs[\"name\"] \u003d \"rally\" + str(uuid.uuid4())"},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"        return self.admin_clients(\"ironic\").node.create(**kwargs)"},{"line_number":58,"context_line":""}],"source_content_type":"text/x-python","patch_set":21,"id":"3a50d1a3_a4c9265b","line":55,"in_reply_to":"3a50d1a3_2a3de6c3","updated":"2015-07-22 13:09:54.000000000","message":"I misunderstood your comment on the previous patch, then. Everything needs to use _generate_random_name() -- there\u0027s no reason to suddenly start using uuid4() here instead, when a) everything else already uses _generate_random_name(); and b) we have a short-term hard requirement to use _generate_random_name(). uuid4() adds no value here. Please don\u0027t use it.","commit_id":"7313bdfd6fcf0980ccc8cce00ccb376c7b66d398"},{"author":{"_account_id":12395,"name":"Roman Vasylets","email":"pomeo92@gmail.com","username":"rvasilets"},"change_message_id":"0048176997c3843fc762dad27cf2fd0fde819b9c","unresolved":false,"context_lines":[{"line_number":52,"context_line":"            # * http://tools.ietf.org/html/rfc952"},{"line_number":53,"context_line":"            # * http://tools.ietf.org/html/rfc1123"},{"line_number":54,"context_line":"            # or the name could be just uuid."},{"line_number":55,"context_line":"            kwargs[\"name\"] \u003d \"rally\" + str(uuid.uuid4())"},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"        return self.admin_clients(\"ironic\").node.create(**kwargs)"},{"line_number":58,"context_line":""}],"source_content_type":"text/x-python","patch_set":21,"id":"3a50d1a3_2a3de6c3","line":55,"in_reply_to":"3a50d1a3_fe260bcd","updated":"2015-07-22 11:31:49.000000000","message":"I have answered in the previous patch. No. I don\u0027t change it because this is not bad approach. And and you asked me to use our function instead of built-in. But I prefer to use built-in functions as more as I can.","commit_id":"7313bdfd6fcf0980ccc8cce00ccb376c7b66d398"},{"author":{"_account_id":8576,"name":"Yair Fried","email":"yfried@redhat.com","username":"yfried"},"change_message_id":"2d80467df0fdb4e9c6e9b4d736039fd9bc83d84e","unresolved":false,"context_lines":[{"line_number":58,"context_line":""},{"line_number":59,"context_line":"    @base.atomic_action_timer(\"ironic.list_nodes\")"},{"line_number":60,"context_line":"    def _list_nodes(self, associated\u003dNone, maintenance\u003dNone, marker\u003dNone,"},{"line_number":61,"context_line":"                    limit\u003dNone, detail\u003dFalse, sort_key\u003dNone, sort_dir\u003dNone):"},{"line_number":62,"context_line":"        \"\"\"Return list of nodes."},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"        :param associated: Optional. Either a Boolean or a string"}],"source_content_type":"text/x-python","patch_set":21,"id":"3a50d1a3_5601f804","line":61,"updated":"2015-07-22 12:48:25.000000000","message":"Please add **kwargs to pass down to L92.\nIt\u0027s good that you are exposing more list options but since you\u0027re doing it already, why not expose them all and let the client handle it?","commit_id":"7313bdfd6fcf0980ccc8cce00ccb376c7b66d398"},{"author":{"_account_id":8576,"name":"Yair Fried","email":"yfried@redhat.com","username":"yfried"},"change_message_id":"2d80467df0fdb4e9c6e9b4d736039fd9bc83d84e","unresolved":false,"context_lines":[{"line_number":82,"context_line":"               (see Ironic\u0027s api.max_limit option)."},{"line_number":83,"context_line":"        :param detail: Optional, boolean whether to return detailed information"},{"line_number":84,"context_line":"                       about nodes."},{"line_number":85,"context_line":"        :param sort_key: Optional, field used for sorting."},{"line_number":86,"context_line":"        :param sort_dir: Optional, direction of sorting, either \u0027asc\u0027 (the"},{"line_number":87,"context_line":"                         default) or \u0027desc\u0027."},{"line_number":88,"context_line":"        :returns: A list of nodes."}],"source_content_type":"text/x-python","patch_set":21,"id":"3a50d1a3_f94ef76d","line":85,"updated":"2015-07-22 12:48:25.000000000","message":"sort options are trivial for listers, simply add \"**kwargs\" and pass it down. no need to overcrowd the docstring","commit_id":"7313bdfd6fcf0980ccc8cce00ccb376c7b66d398"},{"author":{"_account_id":8851,"name":"Valeriy Ponomaryov","email":"kiparis.kh@gmail.com","username":"vponomaryov"},"change_message_id":"51547aaa1a7539faf847db76fd1efea7f4b17fdf","unresolved":false,"context_lines":[{"line_number":54,"context_line":"            # * http://tools.ietf.org/html/rfc1123"},{"line_number":55,"context_line":"            # or the name could be just uuid."},{"line_number":56,"context_line":"            kwargs[\"name\"] \u003d utils.generate_random_name("},{"line_number":57,"context_line":"                prefix\u003d\"rally\", choice\u003dstring.lowercase + string.digits)"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"        return self.admin_clients(\"ironic\").node.create(**kwargs)"},{"line_number":60,"context_line":""}],"source_content_type":"text/x-python","patch_set":22,"id":"3a50d1a3_8b7672d5","line":57,"updated":"2015-07-22 14:54:38.000000000","message":"For python 3 it should \"string.ascii_lowercase\" instead of \"string.lowercase\".","commit_id":"228c1d8b99e9f0760ad033e5fb0375669e04f395"}],"samples/tasks/scenarios/ironic/create-and-list-node.json":[{"author":{"_account_id":2889,"name":"Aeva Black","email":"aeva.online@gmail.com","username":"tenbrae"},"change_message_id":"e1c930e7ca8242ca1faec498b29f7f8d5266fea1","unresolved":false,"context_lines":[{"line_number":5,"context_line":"                \"type\": \"constant\","},{"line_number":6,"context_line":"                \"times\": 10,"},{"line_number":7,"context_line":"                \"concurrency\": 2"},{"line_number":8,"context_line":"            },"},{"line_number":9,"context_line":"            \"context\": {"},{"line_number":10,"context_line":"                \"users\": {"},{"line_number":11,"context_line":"                    \"tenants\": 2,"}],"source_content_type":"application/json","patch_set":5,"id":"fa32b979_22bb63c6","line":8,"updated":"2015-06-13 12:30:25.000000000","message":"Ironic does not differentiate between users or tenants ...","commit_id":"17147b122930d9f2b6bfa9f7c545bfadc193c8df"},{"author":{"_account_id":12395,"name":"Roman Vasylets","email":"pomeo92@gmail.com","username":"rvasilets"},"change_message_id":"b1edd33bfdce61c65dbc2c9563b6397372bcf449","unresolved":false,"context_lines":[{"line_number":5,"context_line":"                \"type\": \"constant\","},{"line_number":6,"context_line":"                \"times\": 10,"},{"line_number":7,"context_line":"                \"concurrency\": 2"},{"line_number":8,"context_line":"            },"},{"line_number":9,"context_line":"            \"context\": {"},{"line_number":10,"context_line":"                \"users\": {"},{"line_number":11,"context_line":"                    \"tenants\": 2,"}],"source_content_type":"application/json","patch_set":5,"id":"fa32b979_f41364b6","line":8,"in_reply_to":"fa32b979_22bb63c6","updated":"2015-06-17 13:57:11.000000000","message":"Oh.. I will discuss it with team how to write here more right.","commit_id":"17147b122930d9f2b6bfa9f7c545bfadc193c8df"}],"samples/tasks/scenarios/ironic/create-and-list-node.yaml":[{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"43e8018b92ff9ddd6516bfdfabc4b41b18f13156","unresolved":false,"context_lines":[{"line_number":8,"context_line":"      context:"},{"line_number":9,"context_line":"        users:"},{"line_number":10,"context_line":"          tenants: 2"},{"line_number":11,"context_line":"          users_per_tenant: 3"}],"source_content_type":"text/x-yaml","patch_set":3,"id":"3afb71cf_30370ce5","line":11,"updated":"2015-06-08 15:21:41.000000000","message":"Quick q (sorry for my ignorance in rally)\n\nWhy we have a json and a yaml file with the same values? I mean, it just duplicate stuff in diff formats (I wonder about one of them getting out of sync as well)","commit_id":"769f6949540bae9eb0cec37b62710376906c402c"}],"tests/unit/plugins/openstack/scenarios/ironic/test_nodes.py":[{"author":{"_account_id":13609,"name":"Pavel Boldin","email":"pboldin@mirantis.com","username":"pboldin"},"change_message_id":"b041a8ebfb6d35776dc2c124b6342434185f6270","unresolved":false,"context_lines":[{"line_number":23,"context_line":""},{"line_number":24,"context_line":"class IronicNodesTestCase(test.ScenarioTestCase):"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"    @mock.patch(IRONIC_UTILS + \"._create_node\")"},{"line_number":27,"context_line":"    @mock.patch(IRONIC_UTILS + \"._list_nodes\")"},{"line_number":28,"context_line":"    def test_create_and_list_node(self, mock__list_nodes, mock__create_node):"},{"line_number":29,"context_line":"        scenario \u003d nodes.IronicNodes()"}],"source_content_type":"text/x-python","patch_set":15,"id":"9a41bdd9_7e20284a","line":26,"updated":"2015-07-11 12:53:49.000000000","message":"The solution is to mock them in `scenario\u0027 instance.\n\n scenario._create_node \u003d mock.Mock()\nscenario._list_nodes \u003d mock.Mock()","commit_id":"27f57435d41781a8daff88eda16c9170aff65c4b"},{"author":{"_account_id":13609,"name":"Pavel Boldin","email":"pboldin@mirantis.com","username":"pboldin"},"change_message_id":"93ce82fc4845d5c6aa8870b8a01cce0abed8cc9c","unresolved":false,"context_lines":[{"line_number":31,"context_line":"        scenario._create_node.assert_called_once_with(fake_parameter1\u003d\"fake1\","},{"line_number":32,"context_line":"                                                      fake_parameter2\u003d\"fake2\")"},{"line_number":33,"context_line":"        scenario._list_nodes.assert_called_once_with("},{"line_number":34,"context_line":"            sort_dir\u003dNone, associated\u003dNone, sort_key\u003dNone, detail\u003dFalse,"},{"line_number":35,"context_line":"            limit\u003dNone, maintenance\u003dNone, marker\u003dNone)"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"    def test_create_and_delete_node(self):"}],"source_content_type":"text/x-python","patch_set":17,"id":"9a41bdd9_10f3fb0b","line":34,"updated":"2015-07-12 15:25:40.000000000","message":"Please make sure that the arguments passed to the create_and_list_node are passed here.\n\nThat is, call create_and_list_node with `sort_dir\u003d\"foobar\"` and something alike for others.","commit_id":"ea3b2c80a5e2799de53c8e26c36f834e4596b5b5"},{"author":{"_account_id":12395,"name":"Roman Vasylets","email":"pomeo92@gmail.com","username":"rvasilets"},"change_message_id":"84b727c2c1657006438ca159d80970456dd98083","unresolved":false,"context_lines":[{"line_number":31,"context_line":"        scenario._create_node.assert_called_once_with(fake_parameter1\u003d\"fake1\","},{"line_number":32,"context_line":"                                                      fake_parameter2\u003d\"fake2\")"},{"line_number":33,"context_line":"        scenario._list_nodes.assert_called_once_with("},{"line_number":34,"context_line":"            sort_dir\u003dNone, associated\u003dNone, sort_key\u003dNone, detail\u003dFalse,"},{"line_number":35,"context_line":"            limit\u003dNone, maintenance\u003dNone, marker\u003dNone)"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"    def test_create_and_delete_node(self):"}],"source_content_type":"text/x-python","patch_set":17,"id":"9a41bdd9_6472c4e7","line":34,"in_reply_to":"9a41bdd9_10f3fb0b","updated":"2015-07-12 19:32:33.000000000","message":"Done","commit_id":"ea3b2c80a5e2799de53c8e26c36f834e4596b5b5"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"23319d200e3d7bb507cbf2b039ba8003c19661ec","unresolved":false,"context_lines":[{"line_number":24,"context_line":"    def test_create_and_list_node(self):"},{"line_number":25,"context_line":"        scenario \u003d nodes.IronicNodes()"},{"line_number":26,"context_line":"        scenario._create_node \u003d mock.Mock()"},{"line_number":27,"context_line":"        scenario._list_nodes \u003d mock.Mock()"},{"line_number":28,"context_line":"        fake_params \u003d {"},{"line_number":29,"context_line":"            \"sort_dir\": \"foo1\","},{"line_number":30,"context_line":"            \"associated\": \"foo2\","}],"source_content_type":"text/x-python","patch_set":18,"id":"9a41bdd9_6ba32350","line":27,"updated":"2015-07-14 09:21:13.000000000","message":"Most nit and maybe a question of taste, but usually the way we mock test cases like this would be at the class level since all tests are mocking the same thing.\n\n @mock.patch.object(nodes.IronicNodes, \u0027_create_node\u0027)\n @mock.patch.object(nodes.IronicNodes, \u0027_list_node\u0027)\n class IronicNodesTestCase(test.ScenarioTestCase):\n \n     def test_create_and_list_node(mock_list, mock_create):\n         scenario \u003d nodes.IronicNodes()\n         fake_params \u003d {...\n              ...\n         mock_create.assert_called_once_with(...)\n         mock_list.assert_called_once_with(...)","commit_id":"2220f9aa6ac634803d00dcdf093dcd532b48f1ae"}],"tests/unit/plugins/openstack/scenarios/ironic/test_utils.py":[{"author":{"_account_id":13609,"name":"Pavel Boldin","email":"pboldin@mirantis.com","username":"pboldin"},"change_message_id":"93ce82fc4845d5c6aa8870b8a01cce0abed8cc9c","unresolved":false,"context_lines":[{"line_number":22,"context_line":"class IronicScenarioTestCase(test.ScenarioTestCase):"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"    def test__create_node(self):"},{"line_number":25,"context_line":"        self.admin_clients(\"ironic\").node.create \u003d mock.Mock("},{"line_number":26,"context_line":"            return_value\u003d\"fake_node\")"},{"line_number":27,"context_line":"        scenario \u003d utils.IronicScenario()"},{"line_number":28,"context_line":"        create_node \u003d scenario._create_node(fake_name\u003d\"fake_param\")"}],"source_content_type":"text/x-python","patch_set":17,"id":"9a41bdd9_503743b0","line":25,"updated":"2015-07-12 15:25:40.000000000","message":"A nitpick that is optionally:\n self.admin_clients(\"ironic\").node.create.return_value \u003d \"fake_node\"\n\ndoes exactly the same.","commit_id":"ea3b2c80a5e2799de53c8e26c36f834e4596b5b5"},{"author":{"_account_id":12395,"name":"Roman Vasylets","email":"pomeo92@gmail.com","username":"rvasilets"},"change_message_id":"84b727c2c1657006438ca159d80970456dd98083","unresolved":false,"context_lines":[{"line_number":22,"context_line":"class IronicScenarioTestCase(test.ScenarioTestCase):"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"    def test__create_node(self):"},{"line_number":25,"context_line":"        self.admin_clients(\"ironic\").node.create \u003d mock.Mock("},{"line_number":26,"context_line":"            return_value\u003d\"fake_node\")"},{"line_number":27,"context_line":"        scenario \u003d utils.IronicScenario()"},{"line_number":28,"context_line":"        create_node \u003d scenario._create_node(fake_name\u003d\"fake_param\")"}],"source_content_type":"text/x-python","patch_set":17,"id":"9a41bdd9_a44f6c91","line":25,"in_reply_to":"9a41bdd9_503743b0","updated":"2015-07-12 19:32:33.000000000","message":"Ok. Is there any recommends or code style for this?","commit_id":"ea3b2c80a5e2799de53c8e26c36f834e4596b5b5"},{"author":{"_account_id":11748,"name":"Chris St. Pierre","email":"cstpierr@cisco.com","username":"stpierre"},"change_message_id":"8116662f843474f1a306a2c4e0377c2ac6819ea7","unresolved":false,"context_lines":[{"line_number":26,"context_line":"        scenario \u003d utils.IronicScenario()"},{"line_number":27,"context_line":"        create_node \u003d scenario._create_node(fake_name\u003d\"fake_param\")"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"        self.assertEqual(\"fake_node\", create_node)"},{"line_number":30,"context_line":"        self._test_atomic_action_timer(scenario.atomic_actions(),"},{"line_number":31,"context_line":"                                       \"ironic.create_node\")"},{"line_number":32,"context_line":""}],"source_content_type":"text/x-python","patch_set":20,"id":"3a50d1a3_7126f3bb","line":29,"updated":"2015-07-20 15:49:47.000000000","message":"Need:\n\n    self.admin_clients(\"ironic\").node.create.assert_called_once_with(fake_name\u003d\"fake_param\")","commit_id":"d1fcdccd9bdf3cbaffe9013461c9e7b89e760695"},{"author":{"_account_id":12395,"name":"Roman Vasylets","email":"pomeo92@gmail.com","username":"rvasilets"},"change_message_id":"f1b5081dab76d159d268405453f2f329c98852fc","unresolved":false,"context_lines":[{"line_number":26,"context_line":"        scenario \u003d utils.IronicScenario()"},{"line_number":27,"context_line":"        create_node \u003d scenario._create_node(fake_name\u003d\"fake_param\")"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"        self.assertEqual(\"fake_node\", create_node)"},{"line_number":30,"context_line":"        self._test_atomic_action_timer(scenario.atomic_actions(),"},{"line_number":31,"context_line":"                                       \"ironic.create_node\")"},{"line_number":32,"context_line":""}],"source_content_type":"text/x-python","patch_set":20,"id":"3a50d1a3_152174fb","line":29,"in_reply_to":"3a50d1a3_7126f3bb","updated":"2015-07-21 09:04:48.000000000","message":"Thank you for improvement. Need to use it in other patches.","commit_id":"d1fcdccd9bdf3cbaffe9013461c9e7b89e760695"},{"author":{"_account_id":11748,"name":"Chris St. Pierre","email":"cstpierr@cisco.com","username":"stpierre"},"change_message_id":"5ac8eec6c97ee8420bb2d81a57e4d8e46b4be63e","unresolved":false,"context_lines":[{"line_number":23,"context_line":""},{"line_number":24,"context_line":"class IronicScenarioTestCase(test.ScenarioTestCase):"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"    @mock.patch(IRONIC_UTILS + \".uuid.uuid4\")"},{"line_number":27,"context_line":"    def test__create_node(self, mock_uuid4):"},{"line_number":28,"context_line":"        mock_uuid4.return_value \u003d \"fake_uuid\""},{"line_number":29,"context_line":"        self.admin_clients(\"ironic\").node.create.return_value \u003d \"fake_node\""}],"source_content_type":"text/x-python","patch_set":21,"id":"3a50d1a3_d919e97a","line":26,"updated":"2015-07-21 17:38:32.000000000","message":"FWIW, you don\u0027t actually need to patch rally.plugins.openstack.scenarios.ironic.utils.uuid.uuid4 here; you can just patch uuid.uuid4. That\u0027s one of the advantages of importing modules instead of functions/classes/etc.\n\nThis isn\u0027t -1 worthy, I just thought you might want to know.","commit_id":"7313bdfd6fcf0980ccc8cce00ccb376c7b66d398"},{"author":{"_account_id":12395,"name":"Roman Vasylets","email":"pomeo92@gmail.com","username":"rvasilets"},"change_message_id":"0048176997c3843fc762dad27cf2fd0fde819b9c","unresolved":false,"context_lines":[{"line_number":23,"context_line":""},{"line_number":24,"context_line":"class IronicScenarioTestCase(test.ScenarioTestCase):"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"    @mock.patch(IRONIC_UTILS + \".uuid.uuid4\")"},{"line_number":27,"context_line":"    def test__create_node(self, mock_uuid4):"},{"line_number":28,"context_line":"        mock_uuid4.return_value \u003d \"fake_uuid\""},{"line_number":29,"context_line":"        self.admin_clients(\"ironic\").node.create.return_value \u003d \"fake_node\""}],"source_content_type":"text/x-python","patch_set":21,"id":"3a50d1a3_ef563029","line":26,"in_reply_to":"3a50d1a3_d919e97a","updated":"2015-07-22 11:31:49.000000000","message":"I had such minuses previously on other patches. The reason of this is that we patch all libraries through utils. Its good style that other cores ask me to do previously.","commit_id":"7313bdfd6fcf0980ccc8cce00ccb376c7b66d398"}]}
