)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"03d56d5a27f436d3d47a428e7697a851631d84d3","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"WIP: Update Ironic UTs to enable REST migration"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Intentioanlly break and update of the unit tests to faciltate"},{"line_number":10,"context_line":"an update to utilize keystoneauth adapters to transmit rest"},{"line_number":11,"context_line":"reqeusts. Because the entire client was mocked for the tests,"},{"line_number":12,"context_line":"realistically this needs to be performed in major chunks."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"df7087c5_f41d9573","line":9,"range":{"start_line":9,"start_character":20,"end_line":9,"end_character":33},"updated":"2018-03-19 19:44:46.000000000","message":"?","commit_id":"29a5fc169dbf84e02f8ac49ee318a4ad11c4032d"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"03d56d5a27f436d3d47a428e7697a851631d84d3","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"WIP: Update Ironic UTs to enable REST migration"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Intentioanlly break and update of the unit tests to faciltate"},{"line_number":10,"context_line":"an update to utilize keystoneauth adapters to transmit rest"},{"line_number":11,"context_line":"reqeusts. Because the entire client was mocked for the tests,"},{"line_number":12,"context_line":"realistically this needs to be performed in major chunks."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"df7087c5_9439b9f3","line":9,"range":{"start_line":9,"start_character":0,"end_line":9,"end_character":13},"updated":"2018-03-19 19:44:46.000000000","message":"Intentionally","commit_id":"29a5fc169dbf84e02f8ac49ee318a4ad11c4032d"}],"nova/tests/unit/virt/ironic/test_driver.py":[{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"03d56d5a27f436d3d47a428e7697a851631d84d3","unresolved":false,"context_lines":[{"line_number":126,"context_line":"        self.assertEqual(expected, requested, \u0027REST message body mismatch\u0027)"},{"line_number":127,"context_line":""},{"line_number":128,"context_line":"    def _set_verification_request(self, node, instance):"},{"line_number":129,"context_line":"        # NOTE(TheJulia): This is a helper method to create a instance"},{"line_number":130,"context_line":"        # verification compatible request mock. Specifically because"},{"line_number":131,"context_line":"        # python-ironicclient needs the content-type to be set,"},{"line_number":132,"context_line":"        # and the crazy long URL."}],"source_content_type":"text/x-python","patch_set":1,"id":"df7087c5_77d8a77e","line":129,"range":{"start_line":129,"start_character":60,"end_line":129,"end_character":61},"updated":"2018-03-19 19:44:46.000000000","message":"an","commit_id":"29a5fc169dbf84e02f8ac49ee318a4ad11c4032d"}],"nova/virt/ironic/client_wrapper.py":[{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"03d56d5a27f436d3d47a428e7697a851631d84d3","unresolved":false,"context_lines":[{"line_number":71,"context_line":""},{"line_number":72,"context_line":"    def _get_adapter(self, retry_on_conflict\u003dTrue):"},{"line_number":73,"context_line":""},{"line_number":74,"context_line":"        if retry_on_conflict and self._cached_adapter is not None:"},{"line_number":75,"context_line":"            return self._cached_adapter"},{"line_number":76,"context_line":""},{"line_number":77,"context_line":"        auth_plugin \u003d self._get_auth_plugin()"}],"source_content_type":"text/x-python","patch_set":1,"id":"df7087c5_970d3bea","line":74,"range":{"start_line":74,"start_character":11,"end_line":74,"end_character":28},"updated":"2018-03-19 19:44:46.000000000","message":"Seems weird to condition caching the adapter on this retry flag.\n\n[Later] I see this is just a copy/paste.  Still weird, though.","commit_id":"29a5fc169dbf84e02f8ac49ee318a4ad11c4032d"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"ef28a167beb2107aba9698806b2fe9dec78d6ae4","unresolved":false,"context_lines":[{"line_number":190,"context_line":"        return self._multi_getattr(client, method)(*args, **kwargs)"},{"line_number":191,"context_line":""},{"line_number":192,"context_line":"    def get(self, url, **kwargs):"},{"line_number":193,"context_line":"        retry_on_conflict \u003d kwargs.get(\u0027retry_on_conflict\u0027, True)"},{"line_number":194,"context_line":"        client \u003d self._get_adapter(retry_on_conflict\u003dretry_on_conflict)"},{"line_number":195,"context_line":"        return client.get(url, **kwargs)"},{"line_number":196,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"df7087c5_c1aa486f","line":193,"range":{"start_line":193,"start_character":35,"end_line":193,"end_character":38},"updated":"2018-03-16 10:23:08.000000000","message":"s/get/pop/ unless you do intend to pass retry_on_conflict to both get_adapter and client.get","commit_id":"29a5fc169dbf84e02f8ac49ee318a4ad11c4032d"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"ef28a167beb2107aba9698806b2fe9dec78d6ae4","unresolved":false,"context_lines":[{"line_number":195,"context_line":"        return client.get(url, **kwargs)"},{"line_number":196,"context_line":""},{"line_number":197,"context_line":"    def put(self, url, **kwargs):"},{"line_number":198,"context_line":"        retry_on_conflict \u003d kwargs.get(\u0027retry_on_conflict\u0027, True)"},{"line_number":199,"context_line":"        client \u003d self._get_adapter(retry_on_conflict\u003dretry_on_conflict)"},{"line_number":200,"context_line":"        return client.get(url, **kwargs)"},{"line_number":201,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"df7087c5_a1bdd4b7","line":198,"range":{"start_line":198,"start_character":35,"end_line":198,"end_character":39},"updated":"2018-03-16 10:23:08.000000000","message":"ditto","commit_id":"29a5fc169dbf84e02f8ac49ee318a4ad11c4032d"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"03d56d5a27f436d3d47a428e7697a851631d84d3","unresolved":false,"context_lines":[{"line_number":199,"context_line":"        client \u003d self._get_adapter(retry_on_conflict\u003dretry_on_conflict)"},{"line_number":200,"context_line":"        return client.get(url, **kwargs)"},{"line_number":201,"context_line":""},{"line_number":202,"context_line":"    def _retriable(self, client, url, **kwargs):"},{"line_number":203,"context_line":"        # NOTE(TheJulia): Ironicclient conceals and retries 409 errors"},{"line_number":204,"context_line":"        # automatically. Since we are directly usage of the keystoneauth1"},{"line_number":205,"context_line":"        # adapter, we need to emulate that behavior where appropriate."}],"source_content_type":"text/x-python","patch_set":1,"id":"df7087c5_f7ecb72a","line":202,"updated":"2018-03-19 19:44:46.000000000","message":"Plan to make this a decorator on get/put/etc.?","commit_id":"29a5fc169dbf84e02f8ac49ee318a4ad11c4032d"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"03d56d5a27f436d3d47a428e7697a851631d84d3","unresolved":false,"context_lines":[{"line_number":201,"context_line":""},{"line_number":202,"context_line":"    def _retriable(self, client, url, **kwargs):"},{"line_number":203,"context_line":"        # NOTE(TheJulia): Ironicclient conceals and retries 409 errors"},{"line_number":204,"context_line":"        # automatically. Since we are directly usage of the keystoneauth1"},{"line_number":205,"context_line":"        # adapter, we need to emulate that behavior where appropriate."},{"line_number":206,"context_line":"        retry_on_conflict \u003d kwargs.get(\u0027retry_on_conflict\u0027, True)"},{"line_number":207,"context_line":"        max_retries \u003d CONF.ironic.api_max_retries if retry_on_conflict else 1"}],"source_content_type":"text/x-python","patch_set":1,"id":"df7087c5_773c27bf","line":204,"range":{"start_line":204,"start_character":47,"end_line":204,"end_character":55},"updated":"2018-03-19 19:44:46.000000000","message":"using","commit_id":"29a5fc169dbf84e02f8ac49ee318a4ad11c4032d"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"03d56d5a27f436d3d47a428e7697a851631d84d3","unresolved":false,"context_lines":[{"line_number":204,"context_line":"        # automatically. Since we are directly usage of the keystoneauth1"},{"line_number":205,"context_line":"        # adapter, we need to emulate that behavior where appropriate."},{"line_number":206,"context_line":"        retry_on_conflict \u003d kwargs.get(\u0027retry_on_conflict\u0027, True)"},{"line_number":207,"context_line":"        max_retries \u003d CONF.ironic.api_max_retries if retry_on_conflict else 1"},{"line_number":208,"context_line":"        retry_interval \u003d (CONF.ironic.api_retry_interval"},{"line_number":209,"context_line":"                          if retry_on_conflict else 0)"},{"line_number":210,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"df7087c5_77aae7d2","line":207,"updated":"2018-03-19 19:44:46.000000000","message":"Consider using `retrying`","commit_id":"29a5fc169dbf84e02f8ac49ee318a4ad11c4032d"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"ef28a167beb2107aba9698806b2fe9dec78d6ae4","unresolved":false,"context_lines":[{"line_number":213,"context_line":"            count +\u003d 1"},{"line_number":214,"context_line":"            try:"},{"line_number":215,"context_line":"                ret_val \u003d client(url, **kwargs)"},{"line_number":216,"context_line":"            except ks_exc.http.Conflict as e:"},{"line_number":217,"context_line":"                LOG.debug(\u0027HTTP Conflict detected, waiting \u0027"},{"line_number":218,"context_line":"                          \u0027{wait} seconds to retry. Error: {error}\u0027, {"},{"line_number":219,"context_line":"                              \u0027wait\u0027: retry_interval,"}],"source_content_type":"text/x-python","patch_set":1,"id":"df7087c5_8191b049","line":216,"range":{"start_line":216,"start_character":0,"end_line":216,"end_character":45},"updated":"2018-03-16 10:23:08.000000000","message":"we retry a few more exceptions, like \"connection refused\"","commit_id":"29a5fc169dbf84e02f8ac49ee318a4ad11c4032d"}]}
