)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":10342,"name":"Jay Faulkner","display_name":"JayF","email":"jay@jvf.cc","username":"JayF","status":"youtube.com/@oss-gr / podcast.gr-oss.io"},"change_message_id":"a0277d3b26788fab10fdbca91176e9745fbedb08","unresolved":false,"context_lines":[{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This patch extends the \"api_version\" configuration option to support"},{"line_number":10,"context_line":"microversioning. The type of this configuration option was changed from"},{"line_number":11,"context_line":"Integer to String; A layer was added to kep it backward compatible, so"},{"line_number":12,"context_line":"if one is using an old configuration nova.conf this will work the same"},{"line_number":13,"context_line":"and the driver will continue to use the default version in the python"},{"line_number":14,"context_line":"ironic library."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":5,"id":"ba15a1d1_8b089629","line":11,"updated":"2015-09-17 16:22:04.000000000","message":"nit: s/kep/keep/","commit_id":"012d6684088b3799e9bcc0f759223923a1a7f5b0"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"d8c16434c3be91c0d804304942590c290c9ead08","unresolved":false,"context_lines":[{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This patch extends the \"api_version\" configuration option to support"},{"line_number":10,"context_line":"microversioning. The type of this configuration option was changed from"},{"line_number":11,"context_line":"Integer to String; A layer was added to kep it backward compatible, so"},{"line_number":12,"context_line":"if one is using an old configuration nova.conf this will work the same"},{"line_number":13,"context_line":"and the driver will continue to use the default version in the python"},{"line_number":14,"context_line":"ironic library."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":5,"id":"ba15a1d1_aba79a09","line":11,"in_reply_to":"ba15a1d1_8b089629","updated":"2015-09-17 16:23:15.000000000","message":"ops, thanks! I will fix it it there\u0027s a need to submit a new patch-set","commit_id":"012d6684088b3799e9bcc0f759223923a1a7f5b0"}],"nova/conf/ironic.py":[{"author":{"_account_id":6167,"name":"Ken\u0027ichi Ohmichi","email":"ken1ohmichi@gmail.com","username":"oomichi"},"change_message_id":"dc29efd9700a73627e05589988a45a0d1d1e4c92","unresolved":false,"context_lines":[{"line_number":23,"context_line":"    \u0027api_version\u0027,"},{"line_number":24,"context_line":"    default\u003d1,"},{"line_number":25,"context_line":"    deprecated_for_removal\u003dTrue,"},{"line_number":26,"context_line":"    help\u003d\u0027Version of Ironic API service endpoint.\u0027"},{"line_number":27,"context_line":"         \u0027DEPRECATED: Setting the API version is not possible anymore.\u0027)"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"api_endpoint \u003d cfg.StrOpt("}],"source_content_type":"text/x-python","patch_set":12,"id":"ba63e191_262c96aa","line":26,"range":{"start_line":26,"start_character":48,"end_line":26,"end_character":49},"updated":"2016-01-20 07:58:23.000000000","message":"nit: need a space after \".\" for making the help readable.","commit_id":"c8750a4f24b768a446668639fbb21be22204bb27"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"27696ebbd23e4235b642cf5041b8b9d5eeb8b652","unresolved":false,"context_lines":[{"line_number":23,"context_line":"    \u0027api_version\u0027,"},{"line_number":24,"context_line":"    default\u003d1,"},{"line_number":25,"context_line":"    deprecated_for_removal\u003dTrue,"},{"line_number":26,"context_line":"    help\u003d\u0027Version of Ironic API service endpoint.\u0027"},{"line_number":27,"context_line":"         \u0027DEPRECATED: Setting the API version is not possible anymore.\u0027)"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"api_endpoint \u003d cfg.StrOpt("}],"source_content_type":"text/x-python","patch_set":12,"id":"9a68dd71_3aae76e6","line":26,"range":{"start_line":26,"start_character":48,"end_line":26,"end_character":49},"in_reply_to":"ba63e191_262c96aa","updated":"2016-01-25 12:34:53.000000000","message":"Done","commit_id":"c8750a4f24b768a446668639fbb21be22204bb27"}],"nova/tests/unit/virt/ironic/test_client_wrapper.py":[{"author":{"_account_id":1063,"name":"Ed Leafe","email":"ed@leafe.com","username":"ed-leafe"},"change_message_id":"b293b5f00bb21843c664dd90fe32a3d7fa2b21f5","unresolved":false,"context_lines":[{"line_number":82,"context_line":""},{"line_number":83,"context_line":"    @mock.patch.object(ironic_client, \u0027get_client\u0027)"},{"line_number":84,"context_line":"    def test__get_client_no_auth_token_microversion(self, mock_ir_cli):"},{"line_number":85,"context_line":"        self.flags(api_version\u003d\u00271.12\u0027, group\u003d\u0027ironic\u0027)"},{"line_number":86,"context_line":"        self.flags(admin_auth_token\u003dNone, group\u003d\u0027ironic\u0027)"},{"line_number":87,"context_line":"        expected \u003d {\u0027os_username\u0027: CONF.ironic.admin_username,"},{"line_number":88,"context_line":"                    \u0027os_password\u0027: CONF.ironic.admin_password,"}],"source_content_type":"text/x-python","patch_set":6,"id":"ba15a1d1_acebcdaf","line":85,"updated":"2015-09-21 15:54:02.000000000","message":"Here (and below) it is cleaner to define the API version in a variable, and use that for the flag and the expected. This avoids the appearance of \u0027magic\u0027 numbers. Example:\n\n    api_version \u003d \u00271.1.2\u0027\n    self.flags(api_version\u003dapi_version, group\u003d\u0027ironic\u0027)\n    ...\n    expected \u003d {\n        ...\n        \u0027os_ironic_api_version\u0027: api_version}","commit_id":"4caf3894f1a4f969330a35051769840442a558e1"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"b590c166a0359663bd8693c12402359cb2bd9f49","unresolved":false,"context_lines":[{"line_number":82,"context_line":""},{"line_number":83,"context_line":"    @mock.patch.object(ironic_client, \u0027get_client\u0027)"},{"line_number":84,"context_line":"    def test__get_client_no_auth_token_microversion(self, mock_ir_cli):"},{"line_number":85,"context_line":"        self.flags(api_version\u003d\u00271.12\u0027, group\u003d\u0027ironic\u0027)"},{"line_number":86,"context_line":"        self.flags(admin_auth_token\u003dNone, group\u003d\u0027ironic\u0027)"},{"line_number":87,"context_line":"        expected \u003d {\u0027os_username\u0027: CONF.ironic.admin_username,"},{"line_number":88,"context_line":"                    \u0027os_password\u0027: CONF.ironic.admin_password,"}],"source_content_type":"text/x-python","patch_set":6,"id":"ba15a1d1_79530e3a","line":85,"in_reply_to":"ba15a1d1_acebcdaf","updated":"2015-09-22 10:39:44.000000000","message":"Done","commit_id":"4caf3894f1a4f969330a35051769840442a558e1"}],"nova/tests/unit/virt/ironic/test_version.py":[{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"73b36a7c10780241977e4f4023b84386770fdea7","unresolved":false,"context_lines":[{"line_number":20,"context_line":""},{"line_number":21,"context_line":"class IronicAPIVersionTestCase(test.NoDBTestCase):"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"    def test_version_instanciation(self):"},{"line_number":24,"context_line":"        # integer"},{"line_number":25,"context_line":"        api_version \u003d version.IronicAPIVersion(1)"},{"line_number":26,"context_line":"        self.assertEqual(1, api_version.major)"}],"source_content_type":"text/x-python","patch_set":2,"id":"da20952f_101bb1cb","line":23,"updated":"2015-09-10 14:06:35.000000000","message":"Nit: instantiation (I had to double check myself here heh)","commit_id":"a599105970845e1ecb816d1b000a3ced91d38153"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"790f0160759f3821863d702620fa11554bb00c2c","unresolved":false,"context_lines":[{"line_number":20,"context_line":""},{"line_number":21,"context_line":"class IronicAPIVersionTestCase(test.NoDBTestCase):"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"    def test_version_instanciation(self):"},{"line_number":24,"context_line":"        # integer"},{"line_number":25,"context_line":"        api_version \u003d version.IronicAPIVersion(1)"},{"line_number":26,"context_line":"        self.assertEqual(1, api_version.major)"}],"source_content_type":"text/x-python","patch_set":2,"id":"da20952f_cbd2685b","line":23,"in_reply_to":"da20952f_101bb1cb","updated":"2015-09-10 16:28:19.000000000","message":"Done","commit_id":"a599105970845e1ecb816d1b000a3ced91d38153"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"73b36a7c10780241977e4f4023b84386770fdea7","unresolved":false,"context_lines":[{"line_number":47,"context_line":"                        version.IronicAPIVersion(1.2))"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"        self.assertFalse(version.IronicAPIVersion(1.0) \u003e\u003d"},{"line_number":50,"context_line":"                         version.IronicAPIVersion(1.2))"},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"    def test_version_stringify(self):"},{"line_number":53,"context_line":"        self.assertEqual(\u00271.0\u0027, str(version.IronicAPIVersion(1)))"}],"source_content_type":"text/x-python","patch_set":2,"id":"da20952f_3054b552","line":50,"updated":"2015-09-10 14:06:35.000000000","message":"I assume StrictVersion works like it should, but let\u0027s add a test e.g. 1.11 \u003e 1.2, since that\u0027s a bug we\u0027ve hit elsewhere before.","commit_id":"a599105970845e1ecb816d1b000a3ced91d38153"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"790f0160759f3821863d702620fa11554bb00c2c","unresolved":false,"context_lines":[{"line_number":47,"context_line":"                        version.IronicAPIVersion(1.2))"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"        self.assertFalse(version.IronicAPIVersion(1.0) \u003e\u003d"},{"line_number":50,"context_line":"                         version.IronicAPIVersion(1.2))"},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"    def test_version_stringify(self):"},{"line_number":53,"context_line":"        self.assertEqual(\u00271.0\u0027, str(version.IronicAPIVersion(1)))"}],"source_content_type":"text/x-python","patch_set":2,"id":"da20952f_8bcc70bc","line":50,"in_reply_to":"da20952f_3054b552","updated":"2015-09-10 16:28:19.000000000","message":"Done","commit_id":"a599105970845e1ecb816d1b000a3ced91d38153"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"9f3e55c9292e03f7f4348d1f42f206270e1f8823","unresolved":false,"context_lines":[{"line_number":15,"context_line":""},{"line_number":16,"context_line":"from nova import test"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"from nova.virt.ironic import version"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"class IronicAPIVersionTestCase(test.NoDBTestCase):"}],"source_content_type":"text/x-python","patch_set":3,"id":"da20952f_a0f06a67","line":18,"updated":"2015-09-10 19:27:22.000000000","message":"not sure if it matters whether there is a blank space above this or not","commit_id":"856990ba0332609c7c651aff2a540cc84f22d2b6"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"a2d7be065d372656b9d6876a90fd23a564c9427c","unresolved":false,"context_lines":[{"line_number":15,"context_line":""},{"line_number":16,"context_line":"from nova import test"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"from nova.virt.ironic import version"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"class IronicAPIVersionTestCase(test.NoDBTestCase):"}],"source_content_type":"text/x-python","patch_set":3,"id":"da20952f_d15196da","line":18,"in_reply_to":"da20952f_a0f06a67","updated":"2015-09-11 11:02:51.000000000","message":"Yeah should not have a blank space. Will remove","commit_id":"856990ba0332609c7c651aff2a540cc84f22d2b6"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"9f3e55c9292e03f7f4348d1f42f206270e1f8823","unresolved":false,"context_lines":[{"line_number":34,"context_line":"        # string"},{"line_number":35,"context_line":"        api_version \u003d version.IronicAPIVersion(\u00271.12\u0027)"},{"line_number":36,"context_line":"        self.assertEqual(1, api_version.major)"},{"line_number":37,"context_line":"        self.assertEqual(12, api_version.minor)"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"    def test_version_comparison(self):"},{"line_number":40,"context_line":"        self.assertTrue(version.IronicAPIVersion(1.0) \u003c"}],"source_content_type":"text/x-python","patch_set":3,"id":"da20952f_a0970aea","line":37,"updated":"2015-09-10 19:27:22.000000000","message":"Do we want to show what happens for an invalid version, eg \u0027foo\u0027 or \u00271.2.3\u0027?","commit_id":"856990ba0332609c7c651aff2a540cc84f22d2b6"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"a2d7be065d372656b9d6876a90fd23a564c9427c","unresolved":false,"context_lines":[{"line_number":34,"context_line":"        # string"},{"line_number":35,"context_line":"        api_version \u003d version.IronicAPIVersion(\u00271.12\u0027)"},{"line_number":36,"context_line":"        self.assertEqual(1, api_version.major)"},{"line_number":37,"context_line":"        self.assertEqual(12, api_version.minor)"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"    def test_version_comparison(self):"},{"line_number":40,"context_line":"        self.assertTrue(version.IronicAPIVersion(1.0) \u003c"}],"source_content_type":"text/x-python","patch_set":3,"id":"da20952f_71420a11","line":37,"in_reply_to":"da20952f_a0970aea","updated":"2015-09-11 11:02:51.000000000","message":"Done","commit_id":"856990ba0332609c7c651aff2a540cc84f22d2b6"},{"author":{"_account_id":6167,"name":"Ken\u0027ichi Ohmichi","email":"ken1ohmichi@gmail.com","username":"oomichi"},"change_message_id":"a93604aa9f1d75b18516d4d36b5c235c977e19cb","unresolved":false,"context_lines":[{"line_number":46,"context_line":"                        version.IronicAPIVersion(\u00271.11\u0027))"},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"        self.assertTrue(version.IronicAPIVersion(\u00271.11\u0027) \u003e"},{"line_number":49,"context_line":"                         version.IronicAPIVersion(\u00271.2\u0027))"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"        self.assertTrue(version.IronicAPIVersion(\u00271.2\u0027) \u003d\u003d"},{"line_number":52,"context_line":"                        version.IronicAPIVersion(\u00271.2\u0027))"}],"source_content_type":"text/x-python","patch_set":7,"id":"fa80f949_8aeeb8b2","line":49,"updated":"2015-11-04 20:55:24.000000000","message":"nit: unnecessary one space at line 49","commit_id":"746d87679efb0279ba5bbdc25d9a6be59013cd69"}],"nova/virt/ironic/client_wrapper.py":[{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"73b36a7c10780241977e4f4023b84386770fdea7","unresolved":false,"context_lines":[{"line_number":81,"context_line":"        # If user not specify the value of api version, uses the"},{"line_number":82,"context_line":"        # python-ironicclient default version."},{"line_number":83,"context_line":"        if str(self._api_version) !\u003d \u00271.0\u0027:"},{"line_number":84,"context_line":"            kwargs[\u0027os_ironic_api_version\u0027] \u003d str(self._api_version)"},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"        # Retries for Conflict exception"},{"line_number":87,"context_line":"        kwargs[\u0027max_retries\u0027] \u003d CONF.ironic.api_max_retries"}],"source_content_type":"text/x-python","patch_set":2,"id":"da20952f_f0f15d96","line":84,"updated":"2015-09-10 14:06:35.000000000","message":"I wonder if we should change the default of the config option to None to more explicitly  say \"use the default\".","commit_id":"a599105970845e1ecb816d1b000a3ced91d38153"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"790f0160759f3821863d702620fa11554bb00c2c","unresolved":false,"context_lines":[{"line_number":81,"context_line":"        # If user not specify the value of api version, uses the"},{"line_number":82,"context_line":"        # python-ironicclient default version."},{"line_number":83,"context_line":"        if str(self._api_version) !\u003d \u00271.0\u0027:"},{"line_number":84,"context_line":"            kwargs[\u0027os_ironic_api_version\u0027] \u003d str(self._api_version)"},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"        # Retries for Conflict exception"},{"line_number":87,"context_line":"        kwargs[\u0027max_retries\u0027] \u003d CONF.ironic.api_max_retries"}],"source_content_type":"text/x-python","patch_set":2,"id":"da20952f_ff24c5c6","line":84,"in_reply_to":"da20952f_f0f15d96","updated":"2015-09-10 16:28:19.000000000","message":"Yeah, I\u0027m playing the safe card here and leaving it as \"1\" just in case someone has api_version\u003d1 in their configuration file since that\u0027s the current default.\n\nAlso \"1\" is used to set the default in the python-ironicclient --ironic-api-version CLI parameter [1]\n\n[1] https://github.com/openstack/python-ironicclient/blob/3f4671a0b7eb5c300291c2e92082d16b96e6316c/ironicclient/shell.py#L202","commit_id":"a599105970845e1ecb816d1b000a3ced91d38153"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"9f3e55c9292e03f7f4348d1f42f206270e1f8823","unresolved":false,"context_lines":[{"line_number":79,"context_line":""},{"line_number":80,"context_line":"        # Default value of CONF.ironic.api_version is \u00271\u0027."},{"line_number":81,"context_line":"        # If user not specify the value of api version, uses the"},{"line_number":82,"context_line":"        # python-ironicclient default version."},{"line_number":83,"context_line":"        if str(self._api_version) !\u003d \u00271.0\u0027:"},{"line_number":84,"context_line":"            kwargs[\u0027os_ironic_api_version\u0027] \u003d str(self._api_version)"},{"line_number":85,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"da20952f_aa4da4c5","line":82,"updated":"2015-09-10 19:27:22.000000000","message":"how about \u0027If the minor version wasn\u0027t specified, use python-ironicclient\u0027s default version.\u0027","commit_id":"856990ba0332609c7c651aff2a540cc84f22d2b6"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"a2d7be065d372656b9d6876a90fd23a564c9427c","unresolved":false,"context_lines":[{"line_number":79,"context_line":""},{"line_number":80,"context_line":"        # Default value of CONF.ironic.api_version is \u00271\u0027."},{"line_number":81,"context_line":"        # If user not specify the value of api version, uses the"},{"line_number":82,"context_line":"        # python-ironicclient default version."},{"line_number":83,"context_line":"        if str(self._api_version) !\u003d \u00271.0\u0027:"},{"line_number":84,"context_line":"            kwargs[\u0027os_ironic_api_version\u0027] \u003d str(self._api_version)"},{"line_number":85,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"da20952f_b163c2b0","line":82,"in_reply_to":"da20952f_aa4da4c5","updated":"2015-09-11 11:02:51.000000000","message":"Done","commit_id":"856990ba0332609c7c651aff2a540cc84f22d2b6"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"9f3e55c9292e03f7f4348d1f42f206270e1f8823","unresolved":false,"context_lines":[{"line_number":81,"context_line":"        # If user not specify the value of api version, uses the"},{"line_number":82,"context_line":"        # python-ironicclient default version."},{"line_number":83,"context_line":"        if str(self._api_version) !\u003d \u00271.0\u0027:"},{"line_number":84,"context_line":"            kwargs[\u0027os_ironic_api_version\u0027] \u003d str(self._api_version)"},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"        # Retries for Conflict exception"},{"line_number":87,"context_line":"        kwargs[\u0027max_retries\u0027] \u003d CONF.ironic.api_max_retries"}],"source_content_type":"text/x-python","patch_set":3,"id":"da20952f_d71a05c6","line":84,"updated":"2015-09-10 19:27:22.000000000","message":"you really want to know if the minor version is non-zerio, right? And/or maybe we only want to know that for 1.x, not for eg 2.x.","commit_id":"856990ba0332609c7c651aff2a540cc84f22d2b6"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"a2d7be065d372656b9d6876a90fd23a564c9427c","unresolved":false,"context_lines":[{"line_number":81,"context_line":"        # If user not specify the value of api version, uses the"},{"line_number":82,"context_line":"        # python-ironicclient default version."},{"line_number":83,"context_line":"        if str(self._api_version) !\u003d \u00271.0\u0027:"},{"line_number":84,"context_line":"            kwargs[\u0027os_ironic_api_version\u0027] \u003d str(self._api_version)"},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"        # Retries for Conflict exception"},{"line_number":87,"context_line":"        kwargs[\u0027max_retries\u0027] \u003d CONF.ironic.api_max_retries"}],"source_content_type":"text/x-python","patch_set":3,"id":"da20952f_31f7b2d4","line":84,"in_reply_to":"da20952f_d71a05c6","updated":"2015-09-11 11:02:51.000000000","message":"Yes the idea was to be prepared for the major versions \u003e 1. Currently the \u00271.0\u0027 of Ironic can\u0027t be used but that may not be true for newer versions of the API","commit_id":"856990ba0332609c7c651aff2a540cc84f22d2b6"},{"author":{"_account_id":8688,"name":"Alexis Lee","email":"openstack@lxsli.co.uk","username":"lxsli"},"change_message_id":"085fdfa64ea505d0d2b5f3db849a4c45b98b8c26","unresolved":false,"context_lines":[{"line_number":77,"context_line":"            kwargs \u003d {\u0027os_auth_token\u0027: auth_token,"},{"line_number":78,"context_line":"                      \u0027ironic_url\u0027: CONF.ironic.api_endpoint}"},{"line_number":79,"context_line":""},{"line_number":80,"context_line":"        # Default value of CONF.ironic.api_version is \u00271\u0027."},{"line_number":81,"context_line":"        # If the minor version wasn\u0027t specified, use python-ironicclient\u0027s"},{"line_number":82,"context_line":"        # default version."},{"line_number":83,"context_line":"        if str(self._api_version) !\u003d \u00271.0\u0027:"}],"source_content_type":"text/x-python","patch_set":5,"id":"ba15a1d1_b8526a65","line":80,"updated":"2015-09-18 14:19:28.000000000","message":"I\u0027d rather not duplicate this info here, it\u0027s easy enough to go and look up","commit_id":"012d6684088b3799e9bcc0f759223923a1a7f5b0"},{"author":{"_account_id":8688,"name":"Alexis Lee","email":"openstack@lxsli.co.uk","username":"lxsli"},"change_message_id":"085fdfa64ea505d0d2b5f3db849a4c45b98b8c26","unresolved":false,"context_lines":[{"line_number":79,"context_line":""},{"line_number":80,"context_line":"        # Default value of CONF.ironic.api_version is \u00271\u0027."},{"line_number":81,"context_line":"        # If the minor version wasn\u0027t specified, use python-ironicclient\u0027s"},{"line_number":82,"context_line":"        # default version."},{"line_number":83,"context_line":"        if str(self._api_version) !\u003d \u00271.0\u0027:"},{"line_number":84,"context_line":"            kwargs[\u0027os_ironic_api_version\u0027] \u003d str(self._api_version)"},{"line_number":85,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"ba15a1d1_1ecd7f30","line":82,"updated":"2015-09-18 14:19:28.000000000","message":"nit: It took me a little while to unpack this comment. I\u0027d add something like \"if the input version string doesn\u0027t include a minor version, after it has been parsed into an IronicAPIVersion, the minor version will show as 0\".","commit_id":"012d6684088b3799e9bcc0f759223923a1a7f5b0"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"db3044fd279fa326e04b931fbe09ee1c813e3c7b","unresolved":false,"context_lines":[{"line_number":79,"context_line":""},{"line_number":80,"context_line":"        # Default value of CONF.ironic.api_version is \u00271\u0027."},{"line_number":81,"context_line":"        # If the minor version wasn\u0027t specified, use python-ironicclient\u0027s"},{"line_number":82,"context_line":"        # default version."},{"line_number":83,"context_line":"        if str(self._api_version) !\u003d \u00271.0\u0027:"},{"line_number":84,"context_line":"            kwargs[\u0027os_ironic_api_version\u0027] \u003d str(self._api_version)"},{"line_number":85,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"ba15a1d1_64b8ac11","line":82,"in_reply_to":"ba15a1d1_1ecd7f30","updated":"2015-09-18 14:35:17.000000000","message":"My bad, see the comment below this \u00271.0\u0027 case is very specific for Ironic and this comment can be misleading indeed. I will replace it","commit_id":"012d6684088b3799e9bcc0f759223923a1a7f5b0"},{"author":{"_account_id":8688,"name":"Alexis Lee","email":"openstack@lxsli.co.uk","username":"lxsli"},"change_message_id":"085fdfa64ea505d0d2b5f3db849a4c45b98b8c26","unresolved":false,"context_lines":[{"line_number":80,"context_line":"        # Default value of CONF.ironic.api_version is \u00271\u0027."},{"line_number":81,"context_line":"        # If the minor version wasn\u0027t specified, use python-ironicclient\u0027s"},{"line_number":82,"context_line":"        # default version."},{"line_number":83,"context_line":"        if str(self._api_version) !\u003d \u00271.0\u0027:"},{"line_number":84,"context_line":"            kwargs[\u0027os_ironic_api_version\u0027] \u003d str(self._api_version)"},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"        # Retries for Conflict exception"}],"source_content_type":"text/x-python","patch_set":5,"id":"ba15a1d1_1ea1fff7","line":83,"updated":"2015-09-18 14:19:28.000000000","message":"Not so happy assuming the major version is always 1, despite microversions. What about \"if self._api_version.minor \u003d\u003d 0\" ?","commit_id":"012d6684088b3799e9bcc0f759223923a1a7f5b0"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"db3044fd279fa326e04b931fbe09ee1c813e3c7b","unresolved":false,"context_lines":[{"line_number":80,"context_line":"        # Default value of CONF.ironic.api_version is \u00271\u0027."},{"line_number":81,"context_line":"        # If the minor version wasn\u0027t specified, use python-ironicclient\u0027s"},{"line_number":82,"context_line":"        # default version."},{"line_number":83,"context_line":"        if str(self._api_version) !\u003d \u00271.0\u0027:"},{"line_number":84,"context_line":"            kwargs[\u0027os_ironic_api_version\u0027] \u003d str(self._api_version)"},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"        # Retries for Conflict exception"}],"source_content_type":"text/x-python","patch_set":5,"id":"ba15a1d1_043a1099","line":83,"in_reply_to":"ba15a1d1_1ea1fff7","updated":"2015-09-18 14:35:17.000000000","message":"Yeah, I perhaps can update that comment to talk about why we do it for the version \u00271.0\u0027.\n\nThis is very Ironic specific, but the \u00271.0\u0027 version of our API is not supported by this driver. The \u00271.0\u0027 is just a backward compat layer with the Juno API, please see the API docs in Ironic [1].\n\nSo I don\u0027t wanna block any other major version by checking if \"minor \u003d\u003d 0\", because in the future I want \u00272.0\u0027 to be support here too.\n\n[1] http://docs.openstack.org/developer/ironic/webapi/v1.html#api-versions-history","commit_id":"012d6684088b3799e9bcc0f759223923a1a7f5b0"},{"author":{"_account_id":8688,"name":"Alexis Lee","email":"openstack@lxsli.co.uk","username":"lxsli"},"change_message_id":"5850c8152af2d0a5b3204fe3dc2086c1c109f9aa","unresolved":false,"context_lines":[{"line_number":79,"context_line":""},{"line_number":80,"context_line":"        # NOTE(lucasagomes): The version \"1.0\" of the Ironic-API is a"},{"line_number":81,"context_line":"        # compatibility layer with the Juno release and not compatible"},{"line_number":82,"context_line":"        # with this driver (see link below). For historical reasons by"},{"line_number":83,"context_line":"        # setting the api_version configuration option to \"1\" is a way"},{"line_number":84,"context_line":"        # to indicate Ironic to use the default API version set in the"},{"line_number":85,"context_line":"        # python-ironicclient library, the conditional below is to keep"}],"source_content_type":"text/x-python","patch_set":6,"id":"ba15a1d1_8c84a5b1","line":82,"range":{"start_line":82,"start_character":67,"end_line":82,"end_character":70},"updated":"2015-09-22 09:51:29.000000000","message":"s/ by/,/\n\notherwise thanks, this is much clearer","commit_id":"4caf3894f1a4f969330a35051769840442a558e1"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"b590c166a0359663bd8693c12402359cb2bd9f49","unresolved":false,"context_lines":[{"line_number":79,"context_line":""},{"line_number":80,"context_line":"        # NOTE(lucasagomes): The version \"1.0\" of the Ironic-API is a"},{"line_number":81,"context_line":"        # compatibility layer with the Juno release and not compatible"},{"line_number":82,"context_line":"        # with this driver (see link below). For historical reasons by"},{"line_number":83,"context_line":"        # setting the api_version configuration option to \"1\" is a way"},{"line_number":84,"context_line":"        # to indicate Ironic to use the default API version set in the"},{"line_number":85,"context_line":"        # python-ironicclient library, the conditional below is to keep"}],"source_content_type":"text/x-python","patch_set":6,"id":"ba15a1d1_f93ddedd","line":82,"in_reply_to":"ba15a1d1_8c84a5b1","updated":"2015-09-22 10:39:44.000000000","message":"Done","commit_id":"4caf3894f1a4f969330a35051769840442a558e1"},{"author":{"_account_id":6167,"name":"Ken\u0027ichi Ohmichi","email":"ken1ohmichi@gmail.com","username":"oomichi"},"change_message_id":"dc29efd9700a73627e05589988a45a0d1d1e4c92","unresolved":false,"context_lines":[{"line_number":30,"context_line":""},{"line_number":31,"context_line":"ironic \u003d None"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"# The API version required by the Ironic driver"},{"line_number":34,"context_line":"IRONIC_API_VERSION \u003d (1, 8)"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"class IronicClientWrapper(object):"}],"source_content_type":"text/x-python","patch_set":12,"id":"ba63e191_e13bc89a","line":34,"range":{"start_line":33,"start_character":0,"end_line":34,"end_character":27},"updated":"2016-01-20 07:58:23.000000000","message":"just one question about the situation of ironic\u0027s microversion.\n\nIs this ironic\u0027s microversion find in long term?\nIn production environments, users can use different release versions for each components(nova, ironic, cinder, etc).\nSo my concern is this static microversion makes a problem if ironic\u0027s minimum microversion can be increased.\n\nAs microversion mechanism, the supported microversions are the range of both minimum and maximum. We are thinking Nova\u0027s minimum microversion is never increased forever because nova needs to support many existing users.\n\nAccording to the following ironic code:\n\n 69 # String representations of the minor and maximum versions\n 70 MIN_VERSION_STRING \u003d \u0027{}.{}\u0027.format(BASE_VERSION, MINOR_1_INITIAL_VERSION)\n 71 MAX_VERSION_STRING \u003d \u0027{}.{}\u0027.format(BASE_VERSION, MINOR_MAX_VERSION)\n\nI am guessing ironic\u0027s one also cannot be increased in long term, is it right?\nIf so, this static microversion is fine for me.","commit_id":"c8750a4f24b768a446668639fbb21be22204bb27"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"27696ebbd23e4235b642cf5041b8b9d5eeb8b652","unresolved":false,"context_lines":[{"line_number":30,"context_line":""},{"line_number":31,"context_line":"ironic \u003d None"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"# The API version required by the Ironic driver"},{"line_number":34,"context_line":"IRONIC_API_VERSION \u003d (1, 8)"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"class IronicClientWrapper(object):"}],"source_content_type":"text/x-python","patch_set":12,"id":"9a68dd71_9a9e82b7","line":34,"range":{"start_line":33,"start_character":0,"end_line":34,"end_character":27},"in_reply_to":"9a68dd71_3b5f0143","updated":"2016-01-25 12:34:53.000000000","message":"Thanks for the question Ken\u0027ichi... What @Dmitry has said.\n\nBut also, if you look at the history of this patch it started by making the Ironic API version customizable via a configuration option but based on the comments we agreed on pinning at a specific version.","commit_id":"c8750a4f24b768a446668639fbb21be22204bb27"},{"author":{"_account_id":6167,"name":"Ken\u0027ichi Ohmichi","email":"ken1ohmichi@gmail.com","username":"oomichi"},"change_message_id":"0b7da1c173d4a24ca3dcfcd0dd9accc6a50378a7","unresolved":false,"context_lines":[{"line_number":30,"context_line":""},{"line_number":31,"context_line":"ironic \u003d None"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"# The API version required by the Ironic driver"},{"line_number":34,"context_line":"IRONIC_API_VERSION \u003d (1, 8)"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"class IronicClientWrapper(object):"}],"source_content_type":"text/x-python","patch_set":12,"id":"9a68dd71_3b5f0143","line":34,"range":{"start_line":33,"start_character":0,"end_line":34,"end_character":27},"in_reply_to":"ba63e191_3d101c4e","updated":"2016-01-21 05:56:31.000000000","message":"Thanks Dmitry,\n\nThat is a perfect answer for me :)\n\nAfter this patch, nova also is a user of ironic\u0027s microversion. So if the minimum microverison is increased over this value(1.8) on ironic side, nova maybe get HTTP400 and is broken. but this situation never happen according to your explanation. so LGTM now.","commit_id":"c8750a4f24b768a446668639fbb21be22204bb27"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"73d3e4f9ffae825ad57f4220396b91ec60e9e51a","unresolved":false,"context_lines":[{"line_number":30,"context_line":""},{"line_number":31,"context_line":"ironic \u003d None"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"# The API version required by the Ironic driver"},{"line_number":34,"context_line":"IRONIC_API_VERSION \u003d (1, 8)"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"class IronicClientWrapper(object):"}],"source_content_type":"text/x-python","patch_set":12,"id":"ba63e191_3d101c4e","line":34,"range":{"start_line":33,"start_character":0,"end_line":34,"end_character":27},"in_reply_to":"ba63e191_e13bc89a","updated":"2016-01-20 10:15:23.000000000","message":"This patch is doing what is expected in the current API versioning implementation: declares a minimum versions it\u0027s known to work with. Of course if we ever remove a single API version, it would be a huge breaking change. Meaning that we won\u0027t ever do it, and I\u0027m personally committed to -2 an ironic patch making such a suggestion.\n\nThe constant you\u0027re referring to is just for convenient coding IMO.\n\nDoes it address your concern?","commit_id":"c8750a4f24b768a446668639fbb21be22204bb27"}],"nova/virt/ironic/driver.py":[{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"73b36a7c10780241977e4f4023b84386770fdea7","unresolved":false,"context_lines":[{"line_number":67,"context_line":"    cfg.FloatOpt(\u0027api_version\u0027,"},{"line_number":68,"context_line":"                 default\u003d1,"},{"line_number":69,"context_line":"                 help\u003d\u0027Version of Ironic API service, accepts \"1.x\" (where \u0027"},{"line_number":70,"context_line":"                      \u0027\"x\" is microversion). If set to \"1\" the default \u0027"},{"line_number":71,"context_line":"                      \u0027version from the ironic library will be used; \u0027"},{"line_number":72,"context_line":"                      \u0027defaults to \"1\".\u0027),"},{"line_number":73,"context_line":"    cfg.StrOpt(\u0027api_endpoint\u0027,"}],"source_content_type":"text/x-python","patch_set":2,"id":"da20952f_f0f07dcb","line":70,"updated":"2015-09-10 14:06:35.000000000","message":"I really hate the word microversion. We talk about our versioning as the whole thing, e.g. 1.12, so let\u0027s just drop the part in parens.","commit_id":"a599105970845e1ecb816d1b000a3ced91d38153"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"790f0160759f3821863d702620fa11554bb00c2c","unresolved":false,"context_lines":[{"line_number":67,"context_line":"    cfg.FloatOpt(\u0027api_version\u0027,"},{"line_number":68,"context_line":"                 default\u003d1,"},{"line_number":69,"context_line":"                 help\u003d\u0027Version of Ironic API service, accepts \"1.x\" (where \u0027"},{"line_number":70,"context_line":"                      \u0027\"x\" is microversion). If set to \"1\" the default \u0027"},{"line_number":71,"context_line":"                      \u0027version from the ironic library will be used; \u0027"},{"line_number":72,"context_line":"                      \u0027defaults to \"1\".\u0027),"},{"line_number":73,"context_line":"    cfg.StrOpt(\u0027api_endpoint\u0027,"}],"source_content_type":"text/x-python","patch_set":2,"id":"da20952f_4bd8987f","line":70,"in_reply_to":"da20952f_f0f07dcb","updated":"2015-09-10 16:28:19.000000000","message":"lol ack","commit_id":"a599105970845e1ecb816d1b000a3ced91d38153"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"9f3e55c9292e03f7f4348d1f42f206270e1f8823","unresolved":false,"context_lines":[{"line_number":65,"context_line":""},{"line_number":66,"context_line":"opts \u003d ["},{"line_number":67,"context_line":"    cfg.FloatOpt(\u0027api_version\u0027,"},{"line_number":68,"context_line":"                 default\u003d1,"},{"line_number":69,"context_line":"                 help\u003d\u0027Version of Ironic API service, accepts \"1.x\". If set \u0027"},{"line_number":70,"context_line":"                      \u0027to \"1\" the default version from the ironic library \u0027"},{"line_number":71,"context_line":"                      \u0027will be used; defaults to \"1\".\u0027),"}],"source_content_type":"text/x-python","patch_set":3,"id":"da20952f_8aa300b1","line":68,"updated":"2015-09-10 19:27:22.000000000","message":"I was wondering. Is there a minimum ironicclient library that has to be used with nova? If so, maybe we can just use the default version (1.6 probably?) from that library, as the default for the config here.\n\nWe\u0027d still need to handle \u00271\u0027 or \u00271.0\u0027 but why not make it more explicit what the \u0027minimum\u0027/default version is.\n\nI saw Jim\u0027s comment in the previous revision, about setting the default to None, but I\u0027d prefer a version there. (And None can\u0027t be a FloatOpt). \n\nDo we really want the default to be use the client\u0027s default? I\u0027d feel more comfortable being explicit about the value here. (But we\u0027re not going to change the client\u0027s default for a long time I don\u0027t think so maybe it doesn\u0027t matter. Guess I like things to be more explicit than the default \u003d\u003d the default from some other place...)","commit_id":"856990ba0332609c7c651aff2a540cc84f22d2b6"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"a2d7be065d372656b9d6876a90fd23a564c9427c","unresolved":false,"context_lines":[{"line_number":65,"context_line":""},{"line_number":66,"context_line":"opts \u003d ["},{"line_number":67,"context_line":"    cfg.FloatOpt(\u0027api_version\u0027,"},{"line_number":68,"context_line":"                 default\u003d1,"},{"line_number":69,"context_line":"                 help\u003d\u0027Version of Ironic API service, accepts \"1.x\". If set \u0027"},{"line_number":70,"context_line":"                      \u0027to \"1\" the default version from the ironic library \u0027"},{"line_number":71,"context_line":"                      \u0027will be used; defaults to \"1\".\u0027),"}],"source_content_type":"text/x-python","patch_set":3,"id":"da20952f_313d722b","line":68,"in_reply_to":"da20952f_8aa300b1","updated":"2015-09-11 11:02:51.000000000","message":"Hi @Ruby,\n\nYeah, I just left it to be using the libraries default because that was the default value before, I think that if we want to change this behavior we should first go to a deprecation process? Tho I\u0027m unsure, it\u0027s not something that the operator will notice to be honest, whether it uses 1.6 or 1.9 as the default won\u0027t make any difference for the code in the driver.\n\nI\u0027m ok if people agree to set it to something like 1.6 by default (tho this code works with older versions of the API as well, AFAICT)","commit_id":"856990ba0332609c7c651aff2a540cc84f22d2b6"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"9f3e55c9292e03f7f4348d1f42f206270e1f8823","unresolved":false,"context_lines":[{"line_number":66,"context_line":"opts \u003d ["},{"line_number":67,"context_line":"    cfg.FloatOpt(\u0027api_version\u0027,"},{"line_number":68,"context_line":"                 default\u003d1,"},{"line_number":69,"context_line":"                 help\u003d\u0027Version of Ironic API service, accepts \"1.x\". If set \u0027"},{"line_number":70,"context_line":"                      \u0027to \"1\" the default version from the ironic library \u0027"},{"line_number":71,"context_line":"                      \u0027will be used; defaults to \"1\".\u0027),"},{"line_number":72,"context_line":"    cfg.StrOpt(\u0027api_endpoint\u0027,"}],"source_content_type":"text/x-python","patch_set":3,"id":"da20952f_c02ebea4","line":69,"updated":"2015-09-10 19:27:22.000000000","message":"We might want this to be more general. Right now, it is 1.x, but the code will also accept 11.x. So is it better to have something like \u0027Version (\u003cmajor\u003e.\u003cminor\u003e) of Ironic API service.\u0027?\n\nIt might be s/Ironic/Bare Metal/ but I\u0027m not sure :)","commit_id":"856990ba0332609c7c651aff2a540cc84f22d2b6"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"a2d7be065d372656b9d6876a90fd23a564c9427c","unresolved":false,"context_lines":[{"line_number":66,"context_line":"opts \u003d ["},{"line_number":67,"context_line":"    cfg.FloatOpt(\u0027api_version\u0027,"},{"line_number":68,"context_line":"                 default\u003d1,"},{"line_number":69,"context_line":"                 help\u003d\u0027Version of Ironic API service, accepts \"1.x\". If set \u0027"},{"line_number":70,"context_line":"                      \u0027to \"1\" the default version from the ironic library \u0027"},{"line_number":71,"context_line":"                      \u0027will be used; defaults to \"1\".\u0027),"},{"line_number":72,"context_line":"    cfg.StrOpt(\u0027api_endpoint\u0027,"}],"source_content_type":"text/x-python","patch_set":3,"id":"da20952f_51aca687","line":69,"in_reply_to":"da20952f_c02ebea4","updated":"2015-09-11 11:02:51.000000000","message":"-1 for Ironic / Bare Metal. This is the ironic driver and the configuration options are under a [ironic] section","commit_id":"856990ba0332609c7c651aff2a540cc84f22d2b6"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"9f3e55c9292e03f7f4348d1f42f206270e1f8823","unresolved":false,"context_lines":[{"line_number":68,"context_line":"                 default\u003d1,"},{"line_number":69,"context_line":"                 help\u003d\u0027Version of Ironic API service, accepts \"1.x\". If set \u0027"},{"line_number":70,"context_line":"                      \u0027to \"1\" the default version from the ironic library \u0027"},{"line_number":71,"context_line":"                      \u0027will be used; defaults to \"1\".\u0027),"},{"line_number":72,"context_line":"    cfg.StrOpt(\u0027api_endpoint\u0027,"},{"line_number":73,"context_line":"               help\u003d\u0027URL for Ironic API endpoint.\u0027),"},{"line_number":74,"context_line":"    cfg.StrOpt(\u0027admin_username\u0027,"}],"source_content_type":"text/x-python","patch_set":3,"id":"da20952f_542273a4","line":71,"updated":"2015-09-10 19:27:22.000000000","message":"How about \u0027If only a major version is specified, for example \"1\", the default minor version from the ironic library will be used. Defaults to \"1\".\u0027","commit_id":"856990ba0332609c7c651aff2a540cc84f22d2b6"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"a2d7be065d372656b9d6876a90fd23a564c9427c","unresolved":false,"context_lines":[{"line_number":68,"context_line":"                 default\u003d1,"},{"line_number":69,"context_line":"                 help\u003d\u0027Version of Ironic API service, accepts \"1.x\". If set \u0027"},{"line_number":70,"context_line":"                      \u0027to \"1\" the default version from the ironic library \u0027"},{"line_number":71,"context_line":"                      \u0027will be used; defaults to \"1\".\u0027),"},{"line_number":72,"context_line":"    cfg.StrOpt(\u0027api_endpoint\u0027,"},{"line_number":73,"context_line":"               help\u003d\u0027URL for Ironic API endpoint.\u0027),"},{"line_number":74,"context_line":"    cfg.StrOpt(\u0027admin_username\u0027,"}],"source_content_type":"text/x-python","patch_set":3,"id":"da20952f_d1c0b62d","line":71,"in_reply_to":"da20952f_542273a4","updated":"2015-09-11 11:02:51.000000000","message":"Done","commit_id":"856990ba0332609c7c651aff2a540cc84f22d2b6"},{"author":{"_account_id":14760,"name":"John L. Villalovos","email":"openstack.org@sodarock.com","username":"jlvillal"},"change_message_id":"71e7d524b0a2dfc44d0ac8791d02ec11d5f63573","unresolved":false,"context_lines":[{"line_number":64,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":65,"context_line":""},{"line_number":66,"context_line":"opts \u003d ["},{"line_number":67,"context_line":"    cfg.FloatOpt(\u0027api_version\u0027,"},{"line_number":68,"context_line":"                 default\u003d1,"},{"line_number":69,"context_line":"                 help\u003d\u0027Version (\u003cmajor\u003e.\u003cminor\u003e) of Ironic API service. \u0027"},{"line_number":70,"context_line":"                      \u0027If only a major version is specified, for example \"1\", \u0027"}],"source_content_type":"text/x-python","patch_set":4,"id":"ba15a1d1_43ed1024","line":67,"updated":"2015-09-15 06:05:25.000000000","message":"My only concern with using a float is:\n\n 1.1\n 1.10\n 1.100\n\nAre the same value.","commit_id":"86556a7d2d5174de67f421e97541f1c91a5b4906"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"8069dcc4822e9c6c9b9e220ea7ce045a3eb4ab0f","unresolved":false,"context_lines":[{"line_number":64,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":65,"context_line":""},{"line_number":66,"context_line":"opts \u003d ["},{"line_number":67,"context_line":"    cfg.FloatOpt(\u0027api_version\u0027,"},{"line_number":68,"context_line":"                 default\u003d1,"},{"line_number":69,"context_line":"                 help\u003d\u0027Version (\u003cmajor\u003e.\u003cminor\u003e) of Ironic API service. \u0027"},{"line_number":70,"context_line":"                      \u0027If only a major version is specified, for example \"1\", \u0027"}],"source_content_type":"text/x-python","patch_set":4,"id":"ba15a1d1_8a0494c0","line":67,"in_reply_to":"ba15a1d1_07e95d80","updated":"2015-09-15 09:23:14.000000000","message":"++ great catch! Yeah it\u0027s right. I should change it to StrOpt","commit_id":"86556a7d2d5174de67f421e97541f1c91a5b4906"},{"author":{"_account_id":8125,"name":"Michael Davies","email":"michael@the-davies.net","username":"mrda"},"change_message_id":"5189f884364f89e19145016cde4a6cd59059ca37","unresolved":false,"context_lines":[{"line_number":64,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":65,"context_line":""},{"line_number":66,"context_line":"opts \u003d ["},{"line_number":67,"context_line":"    cfg.FloatOpt(\u0027api_version\u0027,"},{"line_number":68,"context_line":"                 default\u003d1,"},{"line_number":69,"context_line":"                 help\u003d\u0027Version (\u003cmajor\u003e.\u003cminor\u003e) of Ironic API service. \u0027"},{"line_number":70,"context_line":"                      \u0027If only a major version is specified, for example \"1\", \u0027"}],"source_content_type":"text/x-python","patch_set":4,"id":"ba15a1d1_07e95d80","line":67,"in_reply_to":"ba15a1d1_43ed1024","updated":"2015-09-15 09:13:37.000000000","message":"Yes - I\u0027m not sure either.  Does cfg.FloatOpt(\u00271.1\u0027) and cfg.FloatOpt(\u00271.10\u0027) yield the same value?","commit_id":"86556a7d2d5174de67f421e97541f1c91a5b4906"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"79eb44e225b6779d3c1ec4d8eb9c17ac9857bce7","unresolved":false,"context_lines":[{"line_number":478,"context_line":""},{"line_number":479,"context_line":"    def _get_hypervisor_version(self):"},{"line_number":480,"context_line":"        \"\"\"Returns the version of the Ironic API service endpoint.\"\"\""},{"line_number":481,"context_line":"        return version.IronicAPIVersion(CONF.ironic.api_version).major"},{"line_number":482,"context_line":""},{"line_number":483,"context_line":"    def instance_exists(self, instance):"},{"line_number":484,"context_line":"        \"\"\"Checks the existence of an instance."}],"source_content_type":"text/x-python","patch_set":5,"id":"ba15a1d1_b14f0033","line":481,"updated":"2015-09-17 21:00:06.000000000","message":"I was wondering. In the original, no exception would be raised, but now, it can. This is called from get_available_resource(). Any idea whether it is OK to blow up here, and/or whether we should get it to blow up sooner?","commit_id":"012d6684088b3799e9bcc0f759223923a1a7f5b0"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"58f5b9844460c8fd7abd0f5a7f77cc630ff28708","unresolved":false,"context_lines":[{"line_number":478,"context_line":""},{"line_number":479,"context_line":"    def _get_hypervisor_version(self):"},{"line_number":480,"context_line":"        \"\"\"Returns the version of the Ironic API service endpoint.\"\"\""},{"line_number":481,"context_line":"        return version.IronicAPIVersion(CONF.ironic.api_version).major"},{"line_number":482,"context_line":""},{"line_number":483,"context_line":"    def instance_exists(self, instance):"},{"line_number":484,"context_line":"        \"\"\"Checks the existence of an instance."}],"source_content_type":"text/x-python","patch_set":5,"id":"ba15a1d1_3b341ffa","line":481,"in_reply_to":"ba15a1d1_b14f0033","updated":"2015-09-18 09:06:18.000000000","message":"It should be fine, because the n-cpu won\u0027t even start if the \"api_version\" configuration option is invalid (e.g api_version\u003d\"blah\"). This will only happens if the configuration option is set to something incorrect.","commit_id":"012d6684088b3799e9bcc0f759223923a1a7f5b0"},{"author":{"_account_id":6167,"name":"Ken\u0027ichi Ohmichi","email":"ken1ohmichi@gmail.com","username":"oomichi"},"change_message_id":"a93604aa9f1d75b18516d4d36b5c235c977e19cb","unresolved":false,"context_lines":[{"line_number":69,"context_line":"               help\u003d\u0027Version (\u003cmajor\u003e.\u003cminor\u003e) of Ironic API service. \u0027"},{"line_number":70,"context_line":"                    \u0027If only a major version is specified, for example \"1\", \u0027"},{"line_number":71,"context_line":"                    \u0027the default minor version from the ironic library will \u0027"},{"line_number":72,"context_line":"                    \u0027be used. Defaults to \"1\".\u0027),"},{"line_number":73,"context_line":"    cfg.StrOpt(\u0027api_endpoint\u0027,"},{"line_number":74,"context_line":"               help\u003d\u0027URL for Ironic API endpoint.\u0027),"},{"line_number":75,"context_line":"    cfg.StrOpt(\u0027admin_username\u0027,"}],"source_content_type":"text/x-python","patch_set":7,"id":"fa80f949_85778939","line":72,"updated":"2015-11-04 20:55:24.000000000","message":"According to the code,\n\n if str(self._api_version) !\u003d \u00271.0\u0027:\n\nthe behavior of the above description is only for \"1.0\". If specifying \"2\" without minor version, minor version is just 0, right?","commit_id":"746d87679efb0279ba5bbdc25d9a6be59013cd69"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"abcdff11ad082e85f734e1a099165ce564af56be","unresolved":false,"context_lines":[{"line_number":69,"context_line":"               help\u003d\u0027Version (\u003cmajor\u003e.\u003cminor\u003e) of Ironic API service. \u0027"},{"line_number":70,"context_line":"                    \u0027If only a major version is specified, for example \"1\", \u0027"},{"line_number":71,"context_line":"                    \u0027the default minor version from the ironic library will \u0027"},{"line_number":72,"context_line":"                    \u0027be used. Defaults to \"1\".\u0027),"},{"line_number":73,"context_line":"    cfg.StrOpt(\u0027api_endpoint\u0027,"},{"line_number":74,"context_line":"               help\u003d\u0027URL for Ironic API endpoint.\u0027),"},{"line_number":75,"context_line":"    cfg.StrOpt(\u0027admin_username\u0027,"}],"source_content_type":"text/x-python","patch_set":7,"id":"9a8ffd7b_d0a4a809","line":72,"in_reply_to":"fa80f949_85778939","updated":"2015-11-24 16:27:01.000000000","message":"Yes, that\u0027s true, it is only for 1.0. If the user specifies 2, it will mean 2.0.","commit_id":"746d87679efb0279ba5bbdc25d9a6be59013cd69"},{"author":{"_account_id":2750,"name":"Sean Dague","email":"sean@dague.net","username":"sdague"},"change_message_id":"6245ce6600e6472a1541fe896a5125121115a6f3","unresolved":false,"context_lines":[{"line_number":89,"context_line":""},{"line_number":90,"context_line":"def _get_node(ironicclient, ident, instance\u003dFalse):"},{"line_number":91,"context_line":"    cmd \u003d \"node.get_by_instance_uuid\" if instance else \"node.get\""},{"line_number":92,"context_line":"    return ironicclient.call(cmd, ident, fields\u003d_NODE_FIELDS)"},{"line_number":93,"context_line":""},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"def _validate_instance_and_node(ironicclient, instance):"}],"source_content_type":"text/x-python","patch_set":12,"id":"9a68dd71_3d135aba","line":92,"updated":"2016-01-21 15:38:56.000000000","message":"no. no. no. no. no. no.\n\nThis makes ident non typed, it\u0027s either a name or a uuid.\n\nPlease stop.","commit_id":"c8750a4f24b768a446668639fbb21be22204bb27"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"27696ebbd23e4235b642cf5041b8b9d5eeb8b652","unresolved":false,"context_lines":[{"line_number":89,"context_line":""},{"line_number":90,"context_line":"def _get_node(ironicclient, ident, instance\u003dFalse):"},{"line_number":91,"context_line":"    cmd \u003d \"node.get_by_instance_uuid\" if instance else \"node.get\""},{"line_number":92,"context_line":"    return ironicclient.call(cmd, ident, fields\u003d_NODE_FIELDS)"},{"line_number":93,"context_line":""},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"def _validate_instance_and_node(ironicclient, instance):"}],"source_content_type":"text/x-python","patch_set":12,"id":"9a68dd71_a680168c","line":92,"in_reply_to":"9a68dd71_3d135aba","updated":"2016-01-25 12:34:53.000000000","message":"I just made this helper function so I only have to pass the \"fields\" arguments here once.\n\nI will make _get_node() only work for \"node.get\" and leave the instance UUID out of it. That\u0027s what the review is asking for right?","commit_id":"c8750a4f24b768a446668639fbb21be22204bb27"},{"author":{"_account_id":2750,"name":"Sean Dague","email":"sean@dague.net","username":"sdague"},"change_message_id":"326a256d94be369304ee0da88065671c1b4e6244","unresolved":false,"context_lines":[{"line_number":88,"context_line":""},{"line_number":89,"context_line":""},{"line_number":90,"context_line":"def _get_node(ironicclient, ident):"},{"line_number":91,"context_line":"    \"\"\"Get a node by its UUID or name.\"\"\""},{"line_number":92,"context_line":"    return ironicclient.call(\u0027node.get\u0027, ident, fields\u003d_NODE_FIELDS)"},{"line_number":93,"context_line":""},{"line_number":94,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"9a68dd71_48e6c945","line":91,"updated":"2016-01-26 13:42:25.000000000","message":"I still don\u0027t like this. I don\u0027t want a nova method which doesn\u0027t know what ident is. \n\nIf we are building nova methods, we should care about the ident type so we can understand why we are using one or the other.","commit_id":"ecbfdb5434495a83602cff908473af417d6b8c94"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"a5f95e470c1b8edf0ae4e9da7d6498f6dcea73a0","unresolved":false,"context_lines":[{"line_number":88,"context_line":""},{"line_number":89,"context_line":""},{"line_number":90,"context_line":"def _get_node(ironicclient, ident):"},{"line_number":91,"context_line":"    \"\"\"Get a node by its UUID or name.\"\"\""},{"line_number":92,"context_line":"    return ironicclient.call(\u0027node.get\u0027, ident, fields\u003d_NODE_FIELDS)"},{"line_number":93,"context_line":""},{"line_number":94,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"9a68dd71_cec881ab","line":91,"in_reply_to":"9a68dd71_48e6c945","updated":"2016-01-26 14:17:49.000000000","message":"Right, to be honest looking at the code, ident will always be the UUID.\n\nI think the confusion here is because we do have a couple of variables called \"nodename\" but that\u0027s like this because of the parameter name from the base driver.py [0], ironic is keeping the same variable name to preserve the method signature.\n\nI will update this code to replace s/ident/node_uuid. But there\u0027s nothing much to do, this _get_node() function is only a private helper function.\n\n[0] https://github.com/openstack/nova/blob/master/nova/virt/driver.py","commit_id":"ecbfdb5434495a83602cff908473af417d6b8c94"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"92e668b2433b1f0a44173cf755b5b20e1e2115f0","unresolved":false,"context_lines":[{"line_number":87,"context_line":"        return power_state.NOSTATE"},{"line_number":88,"context_line":""},{"line_number":89,"context_line":""},{"line_number":90,"context_line":"def _get_node(ironicclient, node_uuid):"},{"line_number":91,"context_line":"    \"\"\"Get a node by its UUID.\"\"\""},{"line_number":92,"context_line":"    return ironicclient.call(\u0027node.get\u0027, node_uuid, fields\u003d_NODE_FIELDS)"},{"line_number":93,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"7a5de9d1_cac70a44","line":90,"updated":"2016-01-27 18:04:09.000000000","message":"What about putting this in the IronicDriver class. Then it wouldn\u0027t need the ironicclient parameter.","commit_id":"67f27d5ef07d57ccd6d13b5be4a43e6ae362681a"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"513e502b3a2352524816f39f658a36ff6680e3fe","unresolved":false,"context_lines":[{"line_number":87,"context_line":"        return power_state.NOSTATE"},{"line_number":88,"context_line":""},{"line_number":89,"context_line":""},{"line_number":90,"context_line":"def _get_node(ironicclient, node_uuid):"},{"line_number":91,"context_line":"    \"\"\"Get a node by its UUID.\"\"\""},{"line_number":92,"context_line":"    return ironicclient.call(\u0027node.get\u0027, node_uuid, fields\u003d_NODE_FIELDS)"},{"line_number":93,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"7a5de9d1_ce5a9050","line":90,"in_reply_to":"7a5de9d1_2219fe88","updated":"2016-01-28 14:41:17.000000000","message":"OH. I was looking at consistency with eg IronicDriver._get_node_list().\n\nSo sad, I see that we have IronicDriver._wait_for_active(self, ironicclient, ...)\n\nMaybe the client wasn\u0027t an attribute of IronicDriver once upon a time.\n\nSo I would prefer that both methods were moved into the class, but I also think that this patch should only focus on what it was meant to do -- lightweight fetching of nodes. We should leave any code clean up to a different patch.","commit_id":"67f27d5ef07d57ccd6d13b5be4a43e6ae362681a"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"a65b5b01396c5cd132a9d6f604992714e73cae44","unresolved":false,"context_lines":[{"line_number":87,"context_line":"        return power_state.NOSTATE"},{"line_number":88,"context_line":""},{"line_number":89,"context_line":""},{"line_number":90,"context_line":"def _get_node(ironicclient, node_uuid):"},{"line_number":91,"context_line":"    \"\"\"Get a node by its UUID.\"\"\""},{"line_number":92,"context_line":"    return ironicclient.call(\u0027node.get\u0027, node_uuid, fields\u003d_NODE_FIELDS)"},{"line_number":93,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"7a5de9d1_2219fe88","line":90,"in_reply_to":"7a5de9d1_cac70a44","updated":"2016-01-28 13:01:07.000000000","message":"That works too, I left it outside to be consistent with the _validate_instance_and_node() method which also returns a node object.\n\nDo you prefer me to move both methods in the IronicDriver class as part of this patch?","commit_id":"67f27d5ef07d57ccd6d13b5be4a43e6ae362681a"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"0dfcc5d6db3f135dc90c7ce7c11f349a6522444d","unresolved":false,"context_lines":[{"line_number":87,"context_line":"        return power_state.NOSTATE"},{"line_number":88,"context_line":""},{"line_number":89,"context_line":""},{"line_number":90,"context_line":"def _get_node(ironicclient, node_uuid):"},{"line_number":91,"context_line":"    \"\"\"Get a node by its UUID.\"\"\""},{"line_number":92,"context_line":"    return ironicclient.call(\u0027node.get\u0027, node_uuid, fields\u003d_NODE_FIELDS)"},{"line_number":93,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"7a5de9d1_add4da1f","line":90,"in_reply_to":"7a5de9d1_ce5a9050","updated":"2016-01-29 00:52:39.000000000","message":"fyi, the code clean up is in https://review.openstack.org/273755","commit_id":"67f27d5ef07d57ccd6d13b5be4a43e6ae362681a"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"92e668b2433b1f0a44173cf755b5b20e1e2115f0","unresolved":false,"context_lines":[{"line_number":1184,"context_line":"        :returns: a string representing the host ID"},{"line_number":1185,"context_line":"        \"\"\""},{"line_number":1186,"context_line":""},{"line_number":1187,"context_line":"        node \u003d self.ironicclient.call(\"node.get\", instance.node)"},{"line_number":1188,"context_line":"        if getattr(node, \u0027network_provider\u0027, \u0027none\u0027) \u003d\u003d \u0027none\u0027:"},{"line_number":1189,"context_line":"            # flat network, go ahead and allow the port to be bound"},{"line_number":1190,"context_line":"            return super(IronicDriver, self).network_binding_host_id("}],"source_content_type":"text/x-python","patch_set":14,"id":"7a5de9d1_6adb761c","line":1187,"updated":"2016-01-27 18:04:09.000000000","message":"this one too?","commit_id":"67f27d5ef07d57ccd6d13b5be4a43e6ae362681a"}],"nova/virt/ironic/version.py":[{"author":{"_account_id":14760,"name":"John L. Villalovos","email":"openstack.org@sodarock.com","username":"jlvillal"},"change_message_id":"b2192406c30cabe0daf34f0998011eca89dd1003","unresolved":false,"context_lines":[{"line_number":20,"context_line":"    \"\"\"Helper class for Ironic API version numbering.\"\"\""},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"    def __init__(self, version):"},{"line_number":23,"context_line":"        self.sversion \u003d StrictVersion(str(float(version)))"},{"line_number":24,"context_line":"        self.major \u003d self.sversion.version[0]"},{"line_number":25,"context_line":"        self.minor \u003d self.sversion.version[1]"},{"line_number":26,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"ba15a1d1_b258e6fb","line":23,"updated":"2015-09-15 11:58:20.000000000","message":"Same thing here with converting to float.\n\nThanks Lucas.","commit_id":"86556a7d2d5174de67f421e97541f1c91a5b4906"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"79eb44e225b6779d3c1ec4d8eb9c17ac9857bce7","unresolved":false,"context_lines":[{"line_number":30,"context_line":"                               \u0027\u003cmajor\u003e.\u003cminor\u003e\u0027) % version)"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"        # Keep the code backward compatible by supporting inputing only"},{"line_number":33,"context_line":"        # the major version number"},{"line_number":34,"context_line":"        if version.isdigit():"},{"line_number":35,"context_line":"            version +\u003d \u0027.0\u0027"},{"line_number":36,"context_line":"        self.sversion \u003d StrictVersion(version)"}],"source_content_type":"text/x-python","patch_set":5,"id":"ba15a1d1_96f0b2ca","line":33,"updated":"2015-09-17 21:00:06.000000000","message":"nit, how about \u0027For backwards compatibility, continue to support versions that only specify the \u003cmajor\u003e part.\u0027\n\nDoes it really have to do with backwards compatibility? The help for the config mentions that it is OK to just have a \u003cmajor\u003e part.\n\nI don\u0027t even think this comment is necessary :)","commit_id":"012d6684088b3799e9bcc0f759223923a1a7f5b0"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"58f5b9844460c8fd7abd0f5a7f77cc630ff28708","unresolved":false,"context_lines":[{"line_number":30,"context_line":"                               \u0027\u003cmajor\u003e.\u003cminor\u003e\u0027) % version)"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"        # Keep the code backward compatible by supporting inputing only"},{"line_number":33,"context_line":"        # the major version number"},{"line_number":34,"context_line":"        if version.isdigit():"},{"line_number":35,"context_line":"            version +\u003d \u0027.0\u0027"},{"line_number":36,"context_line":"        self.sversion \u003d StrictVersion(version)"}],"source_content_type":"text/x-python","patch_set":5,"id":"ba15a1d1_c63d0ac5","line":33,"in_reply_to":"ba15a1d1_96f0b2ca","updated":"2015-09-18 09:06:18.000000000","message":"Right, yeah just playing the safe card here. If someone didn\u0027t read the configuration option help message but is looking at the code at least the comment will make him/her understand why we are appending a \".0\" to the version string.","commit_id":"012d6684088b3799e9bcc0f759223923a1a7f5b0"},{"author":{"_account_id":8688,"name":"Alexis Lee","email":"openstack@lxsli.co.uk","username":"lxsli"},"change_message_id":"085fdfa64ea505d0d2b5f3db849a4c45b98b8c26","unresolved":false,"context_lines":[{"line_number":35,"context_line":"            version +\u003d \u0027.0\u0027"},{"line_number":36,"context_line":"        self.sversion \u003d StrictVersion(version)"},{"line_number":37,"context_line":"        self.major \u003d self.sversion.version[0]"},{"line_number":38,"context_line":"        self.minor \u003d self.sversion.version[1]"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"    def __str__(self):"},{"line_number":41,"context_line":"        return \u0027%d.%d\u0027 % (self.major, self.minor)"}],"source_content_type":"text/x-python","patch_set":5,"id":"ba15a1d1_41e6ba44","line":38,"updated":"2015-09-18 14:19:28.000000000","message":"nit: You don\u0027t really need the regex:\n\n  if version.isdigit():\n    version +\u003d \u0027.0\u0027\n  parts \u003d version.split(\".\")\n  if len(parts) !\u003d 2 or not all(x.isdigit() for x in parts):\n    raise ValueError(_(\"...\"))\n  self.sversion \u003d StrictVersion(version)\n  (self.major, self.minor) \u003d self.sversion.version[0:2]","commit_id":"012d6684088b3799e9bcc0f759223923a1a7f5b0"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"db3044fd279fa326e04b931fbe09ee1c813e3c7b","unresolved":false,"context_lines":[{"line_number":35,"context_line":"            version +\u003d \u0027.0\u0027"},{"line_number":36,"context_line":"        self.sversion \u003d StrictVersion(version)"},{"line_number":37,"context_line":"        self.major \u003d self.sversion.version[0]"},{"line_number":38,"context_line":"        self.minor \u003d self.sversion.version[1]"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"    def __str__(self):"},{"line_number":41,"context_line":"        return \u0027%d.%d\u0027 % (self.major, self.minor)"}],"source_content_type":"text/x-python","patch_set":5,"id":"ba15a1d1_24c0744f","line":38,"in_reply_to":"ba15a1d1_41e6ba44","updated":"2015-09-18 14:35:17.000000000","message":"Done","commit_id":"012d6684088b3799e9bcc0f759223923a1a7f5b0"},{"author":{"_account_id":14760,"name":"John L. Villalovos","email":"openstack.org@sodarock.com","username":"jlvillal"},"change_message_id":"5ed5d417bd97c4918ec4a42648f539ccb4d99c1f","unresolved":false,"context_lines":[{"line_number":35,"context_line":"            version +\u003d \u0027.0\u0027"},{"line_number":36,"context_line":"        self.sversion \u003d StrictVersion(version)"},{"line_number":37,"context_line":"        self.major \u003d self.sversion.version[0]"},{"line_number":38,"context_line":"        self.minor \u003d self.sversion.version[1]"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"    def __str__(self):"},{"line_number":41,"context_line":"        return \u0027%d.%d\u0027 % (self.major, self.minor)"}],"source_content_type":"text/x-python","patch_set":5,"id":"ba15a1d1_44c32838","line":38,"in_reply_to":"ba15a1d1_41e6ba44","updated":"2015-09-18 14:39:27.000000000","message":"The regex seems much simpler to me.","commit_id":"012d6684088b3799e9bcc0f759223923a1a7f5b0"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"e1fb7dbf65e01ba7e39270996990fb5b168fbeb9","unresolved":false,"context_lines":[{"line_number":35,"context_line":"            version +\u003d \u0027.0\u0027"},{"line_number":36,"context_line":"        self.sversion \u003d StrictVersion(version)"},{"line_number":37,"context_line":"        self.major \u003d self.sversion.version[0]"},{"line_number":38,"context_line":"        self.minor \u003d self.sversion.version[1]"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"    def __str__(self):"},{"line_number":41,"context_line":"        return \u0027%d.%d\u0027 % (self.major, self.minor)"}],"source_content_type":"text/x-python","patch_set":5,"id":"ba15a1d1_ef121e58","line":38,"in_reply_to":"ba15a1d1_44c32838","updated":"2015-09-21 14:26:26.000000000","message":"Yeah, when I look at the code it seems simpler with the regex indeed. So I will keep it. Is it ok for you Alexis?","commit_id":"012d6684088b3799e9bcc0f759223923a1a7f5b0"},{"author":{"_account_id":8688,"name":"Alexis Lee","email":"openstack@lxsli.co.uk","username":"lxsli"},"change_message_id":"5850c8152af2d0a5b3204fe3dc2086c1c109f9aa","unresolved":false,"context_lines":[{"line_number":24,"context_line":""},{"line_number":25,"context_line":"    def __init__(self, version):"},{"line_number":26,"context_line":"        # Check for the version number syntax"},{"line_number":27,"context_line":"        if not re.match(\"^\\d+(\\.\\d+)?$\", version):"},{"line_number":28,"context_line":"            raise ValueError(_(\u0027Invalid Ironic API version number \"%s\". \u0027"},{"line_number":29,"context_line":"                               \u0027A valid version number should be: \u003cmajor\u003e or \u0027"},{"line_number":30,"context_line":"                               \u0027\u003cmajor\u003e.\u003cminor\u003e\u0027) % version)"}],"source_content_type":"text/x-python","patch_set":6,"id":"ba15a1d1_acd089ca","line":27,"updated":"2015-09-22 09:51:29.000000000","message":"I disagree that compiling a string into a finite state machine is simpler than all(isdigit)! Hiding the complexity doesn\u0027t obliterate it. I won\u0027t block for that though.","commit_id":"4caf3894f1a4f969330a35051769840442a558e1"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"b590c166a0359663bd8693c12402359cb2bd9f49","unresolved":false,"context_lines":[{"line_number":24,"context_line":""},{"line_number":25,"context_line":"    def __init__(self, version):"},{"line_number":26,"context_line":"        # Check for the version number syntax"},{"line_number":27,"context_line":"        if not re.match(\"^\\d+(\\.\\d+)?$\", version):"},{"line_number":28,"context_line":"            raise ValueError(_(\u0027Invalid Ironic API version number \"%s\". \u0027"},{"line_number":29,"context_line":"                               \u0027A valid version number should be: \u003cmajor\u003e or \u0027"},{"line_number":30,"context_line":"                               \u0027\u003cmajor\u003e.\u003cminor\u003e\u0027) % version)"}],"source_content_type":"text/x-python","patch_set":6,"id":"ba15a1d1_5c62b8d9","line":27,"in_reply_to":"ba15a1d1_acd089ca","updated":"2015-09-22 10:39:44.000000000","message":"Fair enough, I\u0027m good with both ways of doing it.","commit_id":"4caf3894f1a4f969330a35051769840442a558e1"},{"author":{"_account_id":6849,"name":"Roman Podoliaka","email":"roman.podoliaka@gmail.com","username":"rpodolyaka"},"change_message_id":"9feffc0190711d6d6ef0e1efa01ae48ea743cfd9","unresolved":false,"context_lines":[{"line_number":20,"context_line":"from nova.i18n import _"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"@functools.total_ordering"},{"line_number":24,"context_line":"class IronicAPIVersion(object):"},{"line_number":25,"context_line":"    \"\"\"Helper class for Ironic API version numbering.\"\"\""},{"line_number":26,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"9a8ffd7b_61b7bdf5","line":23,"updated":"2015-11-26 12:53:21.000000000","message":"hmm, given the fact you are using @total_ordering here, __lt__ + __eq__ must be enough\n\nhttps://docs.python.org/2/library/functools.html#functools.total_ordering","commit_id":"3dba530fa159c8a91509588f3ba591716457cbfb"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"62d5a70f1661d9f7157cc878daa771ce56a405cb","unresolved":false,"context_lines":[{"line_number":20,"context_line":"from nova.i18n import _"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"@functools.total_ordering"},{"line_number":24,"context_line":"class IronicAPIVersion(object):"},{"line_number":25,"context_line":"    \"\"\"Helper class for Ironic API version numbering.\"\"\""},{"line_number":26,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"9a8ffd7b_3c3a38cd","line":23,"in_reply_to":"9a8ffd7b_61b7bdf5","updated":"2015-11-26 12:56:17.000000000","message":"Done","commit_id":"3dba530fa159c8a91509588f3ba591716457cbfb"},{"author":{"_account_id":6849,"name":"Roman Podoliaka","email":"roman.podoliaka@gmail.com","username":"rpodolyaka"},"change_message_id":"9feffc0190711d6d6ef0e1efa01ae48ea743cfd9","unresolved":false,"context_lines":[{"line_number":36,"context_line":"                               \u0027\u003cmajor\u003e.\u003cminor\u003e\u0027) % version)"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"        self.sversion \u003d StrictVersion(version)"},{"line_number":39,"context_line":"        (self.major, self.minor) \u003d self.sversion.version[0:2]"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"    def __str__(self):"},{"line_number":42,"context_line":"        return \u0027%d.%d\u0027 % (self.major, self.minor)"}],"source_content_type":"text/x-python","patch_set":10,"id":"9a8ffd7b_01b35199","line":39,"updated":"2015-11-26 12:53:21.000000000","message":"(nit, optional): major / minor could probably be computed properties to make sure we can\u0027t accidentally change only one of major / minor / sversion attributes","commit_id":"3dba530fa159c8a91509588f3ba591716457cbfb"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"62d5a70f1661d9f7157cc878daa771ce56a405cb","unresolved":false,"context_lines":[{"line_number":36,"context_line":"                               \u0027\u003cmajor\u003e.\u003cminor\u003e\u0027) % version)"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"        self.sversion \u003d StrictVersion(version)"},{"line_number":39,"context_line":"        (self.major, self.minor) \u003d self.sversion.version[0:2]"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"    def __str__(self):"},{"line_number":42,"context_line":"        return \u0027%d.%d\u0027 % (self.major, self.minor)"}],"source_content_type":"text/x-python","patch_set":10,"id":"9a8ffd7b_1c3df4c3","line":39,"in_reply_to":"9a8ffd7b_01b35199","updated":"2015-11-26 12:56:17.000000000","message":"+1 good idea!","commit_id":"3dba530fa159c8a91509588f3ba591716457cbfb"}]}
