)]}'
{"nova/tests/unit/virt/ironic/test_client_wrapper.py":[{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"59d3619c769934f8ab2153d9aaad6d362f45f327","unresolved":false,"context_lines":[{"line_number":182,"context_line":"            ironicclient.call(\"node.list\")"},{"line_number":183,"context_line":"        self.assertEqual(1, mock_get_client.call_count)"},{"line_number":184,"context_line":""},{"line_number":185,"context_line":"    def test_client_can_reset_microversion(self):"},{"line_number":186,"context_line":"        # Test that we are able to reset the microversion for"},{"line_number":187,"context_line":"        # version specific calls."},{"line_number":188,"context_line":"        cli_wrapper \u003d client_wrapper.IronicClientWrapper()"}],"source_content_type":"text/x-python","patch_set":7,"id":"bf659307_e7266c17","line":185,"range":{"start_line":185,"start_character":24,"end_line":185,"end_character":42},"updated":"2018-03-23 19:25:16.000000000","message":"this should be renamed since the reset has been factored out, but the test stil validates that we are able to have different microversions.","commit_id":"d1201319788b9f16513781cb193c10aedf19d5bf"}],"nova/virt/ironic/client_wrapper.py":[{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"dabbf07366a62d3a14817e6299c0ac8137e538ed","unresolved":false,"context_lines":[{"line_number":73,"context_line":"                          if retry_on_conflict else 0)"},{"line_number":74,"context_line":"        kwargs \u003d {}"},{"line_number":75,"context_line":"        if microversion:"},{"line_number":76,"context_line":"            if isinstance(microversion, set):"},{"line_number":77,"context_line":"                kwargs[\u0027os_ironic_api_version\u0027] \u003d \u0027%d.%d\u0027 % microversion"},{"line_number":78,"context_line":"            else:"},{"line_number":79,"context_line":"                # NOTE(TheJulia) python-ironicclient can support a list of"}],"source_content_type":"text/x-python","patch_set":1,"id":"df7087c5_8261453c","line":76,"updated":"2018-03-21 11:55:18.000000000","message":"tuple? set is unordered, that\u0027d be weird :)\n\nDo we even pass a tuple anywhere? Feels like we can just drop this block.","commit_id":"c824a8b0538f00f568555efa4e425e89ea23b68e"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"1cca0b941bd6d0948408fb50bd32f51657d6f198","unresolved":false,"context_lines":[{"line_number":73,"context_line":"                          if retry_on_conflict else 0)"},{"line_number":74,"context_line":"        kwargs \u003d {}"},{"line_number":75,"context_line":"        if microversion:"},{"line_number":76,"context_line":"            if isinstance(microversion, set):"},{"line_number":77,"context_line":"                kwargs[\u0027os_ironic_api_version\u0027] \u003d \u0027%d.%d\u0027 % microversion"},{"line_number":78,"context_line":"            else:"},{"line_number":79,"context_line":"                # NOTE(TheJulia) python-ironicclient can support a list of"}],"source_content_type":"text/x-python","patch_set":1,"id":"df7087c5_155fa372","line":76,"in_reply_to":"df7087c5_8261453c","updated":"2018-03-21 20:46:40.000000000","message":"I\u0027m good with dropping it. I was thinking in a different direction on this, but then I decided that microversion\u003dNone should just be the queue to re-assert the overall library default.... which I don\u0027t really want to change.","commit_id":"c824a8b0538f00f568555efa4e425e89ea23b68e"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"0c50fc25216cf263cdb06d9daa640ef134930d34","unresolved":false,"context_lines":[{"line_number":62,"context_line":"            if not hasattr(ironic, \u0027client\u0027):"},{"line_number":63,"context_line":"                ironic.client \u003d importutils.import_module("},{"line_number":64,"context_line":"                                                    \u0027ironicclient.client\u0027)"},{"line_number":65,"context_line":"        self._cached_client \u003d {}"},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"    def _get_auth_plugin(self):"},{"line_number":68,"context_line":"        \"\"\"Load an auth plugin from CONF options.\"\"\""}],"source_content_type":"text/x-python","patch_set":8,"id":"bf659307_42aaa385","line":65,"range":{"start_line":65,"start_character":30,"end_line":65,"end_character":32},"updated":"2018-03-23 22:13:54.000000000","message":"Ew, so now we\u0027re caching a whole client for each microversion we use?\n\nI pawed through the ironicclient code a little bit, hoping to find that you could pass a microversion per HTTP request, which is how we would do it via ksa adapter.  You technically could, but it\u0027d have to be done by setting the header explicitly.  Not sure if that\u0027s less ugly.  But you could do that in .client() below and then not have to do this caching of multiple sessions.\n\nThis is of course assuming you can\u0027t update the ironicclient code itself to make that easier.  Could you?","commit_id":"8856845eb3ac23fd2552564d489eac998fe049a3"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"96a24e59e89e72e3f071cfdc9cc8bebfc4c80555","unresolved":false,"context_lines":[{"line_number":62,"context_line":"            if not hasattr(ironic, \u0027client\u0027):"},{"line_number":63,"context_line":"                ironic.client \u003d importutils.import_module("},{"line_number":64,"context_line":"                                                    \u0027ironicclient.client\u0027)"},{"line_number":65,"context_line":"        self._cached_client \u003d {}"},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"    def _get_auth_plugin(self):"},{"line_number":68,"context_line":"        \"\"\"Load an auth plugin from CONF options.\"\"\""}],"source_content_type":"text/x-python","patch_set":8,"id":"bf659307_cd708d0b","line":65,"range":{"start_line":65,"start_character":30,"end_line":65,"end_character":32},"in_reply_to":"bf659307_3ad640f3","updated":"2018-03-29 23:36:09.000000000","message":"Sorry for the delay, folks.\n\nI took a deeper look at this, and whereas the client itself would accept a header if you just used it to call the primitives, the actual target methods (dynamically resolved through _multi_getattr - ew!) don\u0027t take headers or kwargs into which we could stuff them.\n\nSo I\u0027m afraid I have to concede that the best we can do here is separate clients.","commit_id":"8856845eb3ac23fd2552564d489eac998fe049a3"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"e0c240c08bd039aabd3087d18093eaeebf36474b","unresolved":false,"context_lines":[{"line_number":62,"context_line":"            if not hasattr(ironic, \u0027client\u0027):"},{"line_number":63,"context_line":"                ironic.client \u003d importutils.import_module("},{"line_number":64,"context_line":"                                                    \u0027ironicclient.client\u0027)"},{"line_number":65,"context_line":"        self._cached_client \u003d {}"},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"    def _get_auth_plugin(self):"},{"line_number":68,"context_line":"        \"\"\"Load an auth plugin from CONF options.\"\"\""}],"source_content_type":"text/x-python","patch_set":8,"id":"bf659307_54a23d9c","line":65,"range":{"start_line":65,"start_character":30,"end_line":65,"end_character":32},"in_reply_to":"bf659307_42aaa385","updated":"2018-03-26 11:48:02.000000000","message":"\u003e Ew, so now we\u0027re caching a whole client for each microversion we use?\n\nWhat\u0027s the big deal with it? Now we\u0027re using 1 version anyway, we\u0027ll use 2 or 3 in the future. Or do we plan on really keeping compatibility with every version we had?\n\n\u003e My impression from ironic contributors is that they will only accept it as arguments updated on each method in the library, which I think won\u0027t get review bandwidth anyway.\n\nThat\u0027s the API SIG recommendation, so I guess I have to stand behind it :) and I will certainly commit to review it, no matter how painful.\n\nBut I was thinking about another workaround (or shortcut): we can update ironicclient to allow copies of it with a new version:\n\n return self._cached_client.with_version(\u00271.42\u0027)\n\ninternally it will do something like\n\n def with_version(self, new_version):\n     new \u003d copy.copy(self)\n     new.http_client \u003d copy.copy(self.http_client)\n     new.http_client.os_baremetal_api_version \u003d new_version\n     return new\n\nThis will probably have the same memory footprint as the previous solution with reset_microversion, but it\u0027s not going to be racy.","commit_id":"8856845eb3ac23fd2552564d489eac998fe049a3"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"84f24145e20daf971ae1811c240dde4a7f6bfc7f","unresolved":false,"context_lines":[{"line_number":62,"context_line":"            if not hasattr(ironic, \u0027client\u0027):"},{"line_number":63,"context_line":"                ironic.client \u003d importutils.import_module("},{"line_number":64,"context_line":"                                                    \u0027ironicclient.client\u0027)"},{"line_number":65,"context_line":"        self._cached_client \u003d {}"},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"    def _get_auth_plugin(self):"},{"line_number":68,"context_line":"        \"\"\"Load an auth plugin from CONF options.\"\"\""}],"source_content_type":"text/x-python","patch_set":8,"id":"bf659307_183dfaba","line":65,"range":{"start_line":65,"start_character":30,"end_line":65,"end_character":32},"in_reply_to":"bf659307_42aaa385","updated":"2018-03-24 00:07:43.000000000","message":"Agreed, I\u0027m not a fan of it.\n\nI\u0027m basically looking for past of least resistance. Every path I\u0027ve taken, I\u0027ve gotten resistance on. I had no resistance rewriting the nova interactions in rest until the realization that we would need a thousand or more lines of unit test changes to be reviewed first.\n\nMy impression from ironic contributors is that they will only accept it as arguments updated on each method in the library, which I think won\u0027t get review bandwidth anyway.\n\nI\u0027m also not sure setting headers would work because we would need to do away with caching for it to be fresh for every request, plus that would bypass our microverison handling code. I\u0027m not sure there is a happy path here. :(","commit_id":"8856845eb3ac23fd2552564d489eac998fe049a3"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"72c68ea0469a4b004a490f5592925f2d78bb57dd","unresolved":false,"context_lines":[{"line_number":62,"context_line":"            if not hasattr(ironic, \u0027client\u0027):"},{"line_number":63,"context_line":"                ironic.client \u003d importutils.import_module("},{"line_number":64,"context_line":"                                                    \u0027ironicclient.client\u0027)"},{"line_number":65,"context_line":"        self._cached_client \u003d {}"},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"    def _get_auth_plugin(self):"},{"line_number":68,"context_line":"        \"\"\"Load an auth plugin from CONF options.\"\"\""}],"source_content_type":"text/x-python","patch_set":8,"id":"bf659307_3ad640f3","line":65,"range":{"start_line":65,"start_character":30,"end_line":65,"end_character":32},"in_reply_to":"bf659307_54a23d9c","updated":"2018-03-28 17:53:15.000000000","message":"Dmitry, I was thinking n-1 would be fine. Ideally though with api-sig discussions from Denver, I think it would be compatibility until they are no longer compatible by design change (which could be n-1!) .\n\nBuilding code into ironicclient to hand back a modified copy to solve something that is essentially specific to this driver doesn\u0027t feel right, but I\u0027m happy to do it if it allows us to move forward.\n\nEric, what are your thoughts at this point?","commit_id":"8856845eb3ac23fd2552564d489eac998fe049a3"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"5195636bf941194b79882b23212e4acf6f703d81","unresolved":false,"context_lines":[{"line_number":62,"context_line":"            if not hasattr(ironic, \u0027client\u0027):"},{"line_number":63,"context_line":"                ironic.client \u003d importutils.import_module("},{"line_number":64,"context_line":"                                                    \u0027ironicclient.client\u0027)"},{"line_number":65,"context_line":"        self._cached_client \u003d {}"},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"    def _get_auth_plugin(self):"},{"line_number":68,"context_line":"        \"\"\"Load an auth plugin from CONF options.\"\"\""}],"source_content_type":"text/x-python","patch_set":8,"id":"bf659307_8c4f9791","line":65,"range":{"start_line":65,"start_character":30,"end_line":65,"end_character":32},"in_reply_to":"bf659307_6d32a112","updated":"2018-04-04 18:25:35.000000000","message":"We discussed this before [0] and we agreed to go the more expedient way to fix the problem in the driver for now instead of creating a hard dependency on ironicclient changes. The changes in ironicclient will need some time and care to be implemented properly and I\u0027d rather not rush through that just to avoid a bit of temporary non-idealness here.\n\nEarlier you mentioned we could just set the header explicitly in _get_client to avoid caching multiple client objects. Can we just do that?\n\n[0] http://eavesdrop.openstack.org/irclogs/%23openstack-ironic/%23openstack-ironic.2018-03-19.log.html#t2018-03-19T19:44:32","commit_id":"8856845eb3ac23fd2552564d489eac998fe049a3"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"c4de304a7d656dd1778cc5f8fd95d0454fc321b1","unresolved":false,"context_lines":[{"line_number":62,"context_line":"            if not hasattr(ironic, \u0027client\u0027):"},{"line_number":63,"context_line":"                ironic.client \u003d importutils.import_module("},{"line_number":64,"context_line":"                                                    \u0027ironicclient.client\u0027)"},{"line_number":65,"context_line":"        self._cached_client \u003d {}"},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"    def _get_auth_plugin(self):"},{"line_number":68,"context_line":"        \"\"\"Load an auth plugin from CONF options.\"\"\""}],"source_content_type":"text/x-python","patch_set":8,"id":"bf659307_6d32a112","line":65,"range":{"start_line":65,"start_character":30,"end_line":65,"end_character":32},"in_reply_to":"bf659307_cd708d0b","updated":"2018-03-29 23:57:04.000000000","message":"By way of apology for holding this patch up for a week, I made this for you [1], which could be used here [2].\n\n[1] https://review.openstack.org/557850\n[2] https://review.openstack.org/#/c/554762/8/nova/virt/ironic/driver.py@1088","commit_id":"8856845eb3ac23fd2552564d489eac998fe049a3"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"0c50fc25216cf263cdb06d9daa640ef134930d34","unresolved":false,"context_lines":[{"line_number":114,"context_line":"                ksa_adap \u003d utils.get_ksa_adapter("},{"line_number":115,"context_line":"                    nova.conf.ironic.DEFAULT_SERVICE_TYPE,"},{"line_number":116,"context_line":"                    ksa_auth\u003dauth_plugin, ksa_session\u003dsess,"},{"line_number":117,"context_line":"                    min_version\u003dDEFAULT_API_VERSION,"},{"line_number":118,"context_line":"                    max_version\u003d(DEFAULT_API_VERSION[0], ks_disc.LATEST))"},{"line_number":119,"context_line":"                ironic_url \u003d ksa_adap.get_endpoint()"},{"line_number":120,"context_line":"            except exception.ServiceNotFound:"}],"source_content_type":"text/x-python","patch_set":8,"id":"bf659307_22c20f87","line":117,"range":{"start_line":117,"start_character":20,"end_line":117,"end_character":52},"updated":"2018-03-23 22:13:54.000000000","message":"I think by doing this you may be precluding making calls at lower microversions (e.g. 1.35 like you\u0027re doing in driver.py).\n\nI could be wrong, though.","commit_id":"8856845eb3ac23fd2552564d489eac998fe049a3"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"84f24145e20daf971ae1811c240dde4a7f6bfc7f","unresolved":false,"context_lines":[{"line_number":114,"context_line":"                ksa_adap \u003d utils.get_ksa_adapter("},{"line_number":115,"context_line":"                    nova.conf.ironic.DEFAULT_SERVICE_TYPE,"},{"line_number":116,"context_line":"                    ksa_auth\u003dauth_plugin, ksa_session\u003dsess,"},{"line_number":117,"context_line":"                    min_version\u003dDEFAULT_API_VERSION,"},{"line_number":118,"context_line":"                    max_version\u003d(DEFAULT_API_VERSION[0], ks_disc.LATEST))"},{"line_number":119,"context_line":"                ironic_url \u003d ksa_adap.get_endpoint()"},{"line_number":120,"context_line":"            except exception.ServiceNotFound:"}],"source_content_type":"text/x-python","patch_set":8,"id":"bf659307_987a6a86","line":117,"range":{"start_line":117,"start_character":20,"end_line":117,"end_character":52},"in_reply_to":"bf659307_22c20f87","updated":"2018-03-24 00:07:43.000000000","message":"We don\u0027t use it since we have our own microversion handling code. This is truly just getting the endpoint AIUI. :\\","commit_id":"8856845eb3ac23fd2552564d489eac998fe049a3"}],"nova/virt/ironic/driver.py":[{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"dabbf07366a62d3a14817e6299c0ac8137e538ed","unresolved":false,"context_lines":[{"line_number":1085,"context_line":"            self.ironicclient.call(\"node.set_provision_state\", node_uuid,"},{"line_number":1086,"context_line":"                                   ironic_states.ACTIVE,"},{"line_number":1087,"context_line":"                                   configdrive\u003dconfigdrive_value,"},{"line_number":1088,"context_line":"                                   microversion\u003d\u00271.35\u0027)"},{"line_number":1089,"context_line":"        except Exception as e:"},{"line_number":1090,"context_line":"            with excutils.save_and_reraise_exception():"},{"line_number":1091,"context_line":"                LOG.error(\"Failed to request Ironic to provision instance \""}],"source_content_type":"text/x-python","patch_set":1,"id":"df7087c5_e2f7e158","line":1088,"updated":"2018-03-21 11:55:18.000000000","message":"Any particular reason to choose 1.35 here?","commit_id":"c824a8b0538f00f568555efa4e425e89ea23b68e"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"1a8a0bbc1bb85e8100d1e0c4ab37f7f2575c1807","unresolved":false,"context_lines":[{"line_number":1085,"context_line":"            self.ironicclient.call(\"node.set_provision_state\", node_uuid,"},{"line_number":1086,"context_line":"                                   ironic_states.ACTIVE,"},{"line_number":1087,"context_line":"                                   configdrive\u003dconfigdrive_value,"},{"line_number":1088,"context_line":"                                   microversion\u003d\u00271.35\u0027)"},{"line_number":1089,"context_line":"        except Exception as e:"},{"line_number":1090,"context_line":"            with excutils.save_and_reraise_exception():"},{"line_number":1091,"context_line":"                LOG.error(\"Failed to request Ironic to provision instance \""}],"source_content_type":"text/x-python","patch_set":1,"id":"df7087c5_d03b79c5","line":1088,"in_reply_to":"df7087c5_15d483bc","updated":"2018-03-21 20:59:07.000000000","message":"That change was only about rebuild, which doesn\u0027t apply here. Passing 1.35 here is fine, it just doesn\u0027t change anything about this call.","commit_id":"c824a8b0538f00f568555efa4e425e89ea23b68e"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"ba1cef47df6811d37bb8318a5e200c8c73457981","unresolved":false,"context_lines":[{"line_number":1085,"context_line":"            self.ironicclient.call(\"node.set_provision_state\", node_uuid,"},{"line_number":1086,"context_line":"                                   ironic_states.ACTIVE,"},{"line_number":1087,"context_line":"                                   configdrive\u003dconfigdrive_value,"},{"line_number":1088,"context_line":"                                   microversion\u003d\u00271.35\u0027)"},{"line_number":1089,"context_line":"        except Exception as e:"},{"line_number":1090,"context_line":"            with excutils.save_and_reraise_exception():"},{"line_number":1091,"context_line":"                LOG.error(\"Failed to request Ironic to provision instance \""}],"source_content_type":"text/x-python","patch_set":1,"id":"df7087c5_eb348c4c","line":1088,"in_reply_to":"df7087c5_d03b79c5","updated":"2018-03-22 21:58:53.000000000","message":"Ahh, yes, but it is handy to drop the version here to cause it to fail if it is going to fail... at least for testing right now. :)","commit_id":"c824a8b0538f00f568555efa4e425e89ea23b68e"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"1cca0b941bd6d0948408fb50bd32f51657d6f198","unresolved":false,"context_lines":[{"line_number":1085,"context_line":"            self.ironicclient.call(\"node.set_provision_state\", node_uuid,"},{"line_number":1086,"context_line":"                                   ironic_states.ACTIVE,"},{"line_number":1087,"context_line":"                                   configdrive\u003dconfigdrive_value,"},{"line_number":1088,"context_line":"                                   microversion\u003d\u00271.35\u0027)"},{"line_number":1089,"context_line":"        except Exception as e:"},{"line_number":1090,"context_line":"            with excutils.save_and_reraise_exception():"},{"line_number":1091,"context_line":"                LOG.error(\"Failed to request Ironic to provision instance \""}],"source_content_type":"text/x-python","patch_set":1,"id":"df7087c5_15d483bc","line":1088,"in_reply_to":"df7087c5_e2f7e158","updated":"2018-03-21 20:46:40.000000000","message":"Just the last time we touched node/provision/state endpoint.","commit_id":"c824a8b0538f00f568555efa4e425e89ea23b68e"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"dabbf07366a62d3a14817e6299c0ac8137e538ed","unresolved":false,"context_lines":[{"line_number":1574,"context_line":"                              microversion\u003d\u00271.35\u0027)"},{"line_number":1575,"context_line":"        except ironic.exc.UnsupportedVersion:"},{"line_number":1576,"context_line":"            # The default path requires a version that is not"},{"line_number":1577,"context_line":"            # avialable at present. Instead trigger the prior behavior."},{"line_number":1578,"context_line":"            LOG.error(\u0027Older version of the baremetal API detected, \u0027"},{"line_number":1579,"context_line":"                      \u0027downgrading to OpenStack Pike behavior\u0027"},{"line_number":1580,"context_line":"                      \u0027for instance %(instance).\u0027,"}],"source_content_type":"text/x-python","patch_set":1,"id":"df7087c5_22c0797c","line":1577,"updated":"2018-03-21 11:55:18.000000000","message":"nit: available","commit_id":"c824a8b0538f00f568555efa4e425e89ea23b68e"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"dabbf07366a62d3a14817e6299c0ac8137e538ed","unresolved":false,"context_lines":[{"line_number":1576,"context_line":"            # The default path requires a version that is not"},{"line_number":1577,"context_line":"            # avialable at present. Instead trigger the prior behavior."},{"line_number":1578,"context_line":"            LOG.error(\u0027Older version of the baremetal API detected, \u0027"},{"line_number":1579,"context_line":"                      \u0027downgrading to OpenStack Pike behavior\u0027"},{"line_number":1580,"context_line":"                      \u0027for instance %(instance).\u0027,"},{"line_number":1581,"context_line":"                      {\u0027instance\u0027: instance[\u0027uuid\u0027]})"},{"line_number":1582,"context_line":"            self.ironicclient.call(\"node.set_provision_state\","}],"source_content_type":"text/x-python","patch_set":1,"id":"df7087c5_625c31ed","line":1579,"updated":"2018-03-21 11:55:18.000000000","message":"I\u0027d probably go with log.warning.\n\nAlso, can we say what the behavior is instead of \u0027pike behavior\u0027? Maybe \"configdrive will not be passed\" or \"initial configdrive will be used instead\" or something.","commit_id":"c824a8b0538f00f568555efa4e425e89ea23b68e"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"1cca0b941bd6d0948408fb50bd32f51657d6f198","unresolved":false,"context_lines":[{"line_number":1576,"context_line":"            # The default path requires a version that is not"},{"line_number":1577,"context_line":"            # avialable at present. Instead trigger the prior behavior."},{"line_number":1578,"context_line":"            LOG.error(\u0027Older version of the baremetal API detected, \u0027"},{"line_number":1579,"context_line":"                      \u0027downgrading to OpenStack Pike behavior\u0027"},{"line_number":1580,"context_line":"                      \u0027for instance %(instance).\u0027,"},{"line_number":1581,"context_line":"                      {\u0027instance\u0027: instance[\u0027uuid\u0027]})"},{"line_number":1582,"context_line":"            self.ironicclient.call(\"node.set_provision_state\","}],"source_content_type":"text/x-python","patch_set":1,"id":"df7087c5_75e4dfac","line":1579,"in_reply_to":"df7087c5_625c31ed","updated":"2018-03-21 20:46:40.000000000","message":"Yeah, it is a tolerable error which means warning. I\u0027ll change in a future rev.","commit_id":"c824a8b0538f00f568555efa4e425e89ea23b68e"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"0c50fc25216cf263cdb06d9daa640ef134930d34","unresolved":false,"context_lines":[{"line_number":1425,"context_line":"        for vif in network_info:"},{"line_number":1426,"context_line":"            port_id \u003d six.text_type(vif[\u0027id\u0027])"},{"line_number":1427,"context_line":"            try:"},{"line_number":1428,"context_line":"                self.ironicclient.call(\"node.vif_detach\", node.uuid, port_id)"},{"line_number":1429,"context_line":"            except ironic.exc.BadRequest:"},{"line_number":1430,"context_line":"                LOG.debug(\"VIF %(vif)s isn\u0027t attached to Ironic node %(node)s\","},{"line_number":1431,"context_line":"                          {\u0027vif\u0027: port_id, \u0027node\u0027: node.uuid})"}],"source_content_type":"text/x-python","patch_set":8,"id":"bf659307_62824752","line":1428,"updated":"2018-03-23 22:13:54.000000000","message":"\u003cgasp\u003e unrelated (but nice) whitespace change","commit_id":"8856845eb3ac23fd2552564d489eac998fe049a3"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"84f24145e20daf971ae1811c240dde4a7f6bfc7f","unresolved":false,"context_lines":[{"line_number":1425,"context_line":"        for vif in network_info:"},{"line_number":1426,"context_line":"            port_id \u003d six.text_type(vif[\u0027id\u0027])"},{"line_number":1427,"context_line":"            try:"},{"line_number":1428,"context_line":"                self.ironicclient.call(\"node.vif_detach\", node.uuid, port_id)"},{"line_number":1429,"context_line":"            except ironic.exc.BadRequest:"},{"line_number":1430,"context_line":"                LOG.debug(\"VIF %(vif)s isn\u0027t attached to Ironic node %(node)s\","},{"line_number":1431,"context_line":"                          {\u0027vif\u0027: port_id, \u0027node\u0027: node.uuid})"}],"source_content_type":"text/x-python","patch_set":8,"id":"bf659307_58d05251","line":1428,"in_reply_to":"bf659307_62824752","updated":"2018-03-24 00:07:43.000000000","message":"Doh! :)","commit_id":"8856845eb3ac23fd2552564d489eac998fe049a3"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"ac743094a72b4c37a8779f24852b15ae934e28f2","unresolved":false,"context_lines":[{"line_number":1578,"context_line":"            # NOTE(TheJulia): If we wanted to support fallback to a"},{"line_number":1579,"context_line":"            # Pike deployment of Ironic and honor the original behavior,"},{"line_number":1580,"context_line":"            # we would catch ironic.exc.UnsupportedVersion, and send"},{"line_number":1581,"context_line":"            # the older microversion without a configdrive value."},{"line_number":1582,"context_line":"        except (exception.NovaException,         # Retry failed"},{"line_number":1583,"context_line":"                ironic.exc.InternalServerError,  # Validations"},{"line_number":1584,"context_line":"                ironic.exc.BadRequest) as e:     # Maintenance"}],"source_content_type":"text/x-python","patch_set":8,"id":"bf659307_333a5f34","line":1581,"updated":"2018-04-05 01:03:09.000000000","message":"I thought what we had discussed was that instead of doing this and passing a microversion, we would have something like this, where we just handle errors in the driver and let ironicclient use its automatic version handling. Is there something I\u0027m missing about why the below wouldn\u0027t work?\n\n  try:\n      self.ironicclient.call(\"node.set_provision_state\",\n                             node_uuid, ironic_states.REBUILD,\n                             configdrive\u003dconfigdrive_value)\n  except ironic.exc.UnsupportedVersion:\n      # Fall back to trying without a configdrive value.\n      self.ironicclient.call(\"node.set_provision_state\",\n                             node_uuid,\n                             ironic_states.REBUILD)\n except (..., ...):\n     ...","commit_id":"8856845eb3ac23fd2552564d489eac998fe049a3"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"0c50fc25216cf263cdb06d9daa640ef134930d34","unresolved":false,"context_lines":[{"line_number":1840,"context_line":"        :param instance: nova instance"},{"line_number":1841,"context_line":"        :return: A connector information dictionary"},{"line_number":1842,"context_line":"        \"\"\""},{"line_number":1843,"context_line":"        # NOTE(TheJulia): If the node.get below was wrapped with a try/expect"},{"line_number":1844,"context_line":"        # catch and used a specific microversion for when the volume"},{"line_number":1845,"context_line":"        # feature was introduced, then it could, in theory, skip the remaining."},{"line_number":1846,"context_line":"        # steps or fail the deployment."}],"source_content_type":"text/x-python","patch_set":8,"id":"bf659307_22944f8b","line":1843,"range":{"start_line":1843,"start_character":71,"end_line":1843,"end_character":77},"updated":"2018-03-23 22:13:54.000000000","message":"except","commit_id":"8856845eb3ac23fd2552564d489eac998fe049a3"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"0c50fc25216cf263cdb06d9daa640ef134930d34","unresolved":false,"context_lines":[{"line_number":1842,"context_line":"        \"\"\""},{"line_number":1843,"context_line":"        # NOTE(TheJulia): If the node.get below was wrapped with a try/expect"},{"line_number":1844,"context_line":"        # catch and used a specific microversion for when the volume"},{"line_number":1845,"context_line":"        # feature was introduced, then it could, in theory, skip the remaining."},{"line_number":1846,"context_line":"        # steps or fail the deployment."},{"line_number":1847,"context_line":"        node \u003d self.ironicclient.call(\"node.get\", instance.node)"},{"line_number":1848,"context_line":"        properties \u003d self._parse_node_properties(node)"}],"source_content_type":"text/x-python","patch_set":8,"id":"bf659307_c290f398","line":1845,"range":{"start_line":1845,"start_character":78,"end_line":1845,"end_character":79},"updated":"2018-03-23 22:13:54.000000000","message":"strike","commit_id":"8856845eb3ac23fd2552564d489eac998fe049a3"}]}
