)]}'
{"nova/network/base_api.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"12c64e67a14cb80a71a15c19ee278e8833047d5a","unresolved":false,"context_lines":[{"line_number":423,"context_line":"        \"\"\""},{"line_number":424,"context_line":"        raise NotImplementedError()"},{"line_number":425,"context_line":""},{"line_number":426,"context_line":"    def delete_port_binding(self, context, port_id, host):"},{"line_number":427,"context_line":"        \"\"\"Delete the port binding for the given port ID and host"},{"line_number":428,"context_line":""},{"line_number":429,"context_line":"        This method should not be used if \"supports_port_binding_extension\""}],"source_content_type":"text/x-python","patch_set":8,"id":"bf659307_10fd2d6d","line":426,"updated":"2018-04-01 14:12:56.000000000","message":"I think we can remove this since nothing outside of the neutronv2 API code is going to call this generically now.","commit_id":"bc941a81f2794f2c994f9931a1ff5516d50e2bd5"}],"nova/network/neutronv2/api.py":[{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"b9d1a79f48b6411dc689347b07334d7b6e0be023","unresolved":false,"context_lines":[{"line_number":1182,"context_line":""},{"line_number":1183,"context_line":"        # TODO(mriedem): Replace this with using python-neutronclient if/when"},{"line_number":1184,"context_line":"        # the binding-extended support is in there."},{"line_number":1185,"context_line":"        auth_plugin \u003d service_auth.get_auth_plugin(context)"},{"line_number":1186,"context_line":"        global _SESSION"},{"line_number":1187,"context_line":"        client \u003d utils.get_ksa_adapter(\u0027network\u0027, auth_plugin, _SESSION)"},{"line_number":1188,"context_line":"        client.additional_headers \u003d {\u0027accept\u0027: \u0027application/json\u0027}"},{"line_number":1189,"context_line":""},{"line_number":1190,"context_line":"        # Now bind each port to the destination host and keep track of each"}],"source_content_type":"text/x-python","patch_set":5,"id":"df7087c5_f916caa7","line":1187,"range":{"start_line":1185,"start_character":0,"end_line":1187,"end_character":72},"updated":"2018-03-20 21:06:52.000000000","message":"See below.","commit_id":"2d5155363d69e4d1204883839518c7f5930e57ec"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"b9d1a79f48b6411dc689347b07334d7b6e0be023","unresolved":false,"context_lines":[{"line_number":1229,"context_line":"        \"\"\""},{"line_number":1230,"context_line":"        # TODO(mriedem): Replace this with using python-neutronclient if/when"},{"line_number":1231,"context_line":"        # the binding-extended support is in there."},{"line_number":1232,"context_line":"        auth_plugin \u003d service_auth.get_auth_plugin(context)"},{"line_number":1233,"context_line":"        global _SESSION"},{"line_number":1234,"context_line":"        client \u003d utils.get_ksa_adapter(\u0027network\u0027, auth_plugin, _SESSION)"},{"line_number":1235,"context_line":""},{"line_number":1236,"context_line":"        resp \u003d client.delete("},{"line_number":1237,"context_line":"            \u0027/v2.0/ports/%s/bindings/%s\u0027 % (port_id, host),"}],"source_content_type":"text/x-python","patch_set":5,"id":"df7087c5_19f37ea0","line":1234,"range":{"start_line":1232,"start_character":0,"end_line":1234,"end_character":72},"updated":"2018-03-20 21:06:52.000000000","message":"Would prefer to see this bit of get_client factored out into a separate helper method to keep it common.\n\nActually, looking closer, it should be possible just to use client \u003d get_client(...) and then client.delete(...)","commit_id":"2d5155363d69e4d1204883839518c7f5930e57ec"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"4ca028cf00fcecb64fe00cbbeee0398ed7d14932","unresolved":false,"context_lines":[{"line_number":1229,"context_line":"        \"\"\""},{"line_number":1230,"context_line":"        # TODO(mriedem): Replace this with using python-neutronclient if/when"},{"line_number":1231,"context_line":"        # the binding-extended support is in there."},{"line_number":1232,"context_line":"        auth_plugin \u003d service_auth.get_auth_plugin(context)"},{"line_number":1233,"context_line":"        global _SESSION"},{"line_number":1234,"context_line":"        client \u003d utils.get_ksa_adapter(\u0027network\u0027, auth_plugin, _SESSION)"},{"line_number":1235,"context_line":""},{"line_number":1236,"context_line":"        resp \u003d client.delete("},{"line_number":1237,"context_line":"            \u0027/v2.0/ports/%s/bindings/%s\u0027 % (port_id, host),"}],"source_content_type":"text/x-python","patch_set":5,"id":"df7087c5_b43db9de","line":1234,"range":{"start_line":1232,"start_character":0,"end_line":1234,"end_character":72},"in_reply_to":"df7087c5_19f37ea0","updated":"2018-03-20 21:57:30.000000000","message":"But the client in that case is an instance of a wrapper around python-neutronclient so I don\u0027t think that\u0027s going to work, unless that all passes through KSA stuff.","commit_id":"2d5155363d69e4d1204883839518c7f5930e57ec"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"08c94a21ead9e336cc285ffff66eb15bb4be23e4","unresolved":false,"context_lines":[{"line_number":1229,"context_line":"        \"\"\""},{"line_number":1230,"context_line":"        # TODO(mriedem): Replace this with using python-neutronclient if/when"},{"line_number":1231,"context_line":"        # the binding-extended support is in there."},{"line_number":1232,"context_line":"        auth_plugin \u003d service_auth.get_auth_plugin(context)"},{"line_number":1233,"context_line":"        global _SESSION"},{"line_number":1234,"context_line":"        client \u003d utils.get_ksa_adapter(\u0027network\u0027, auth_plugin, _SESSION)"},{"line_number":1235,"context_line":""},{"line_number":1236,"context_line":"        resp \u003d client.delete("},{"line_number":1237,"context_line":"            \u0027/v2.0/ports/%s/bindings/%s\u0027 % (port_id, host),"}],"source_content_type":"text/x-python","patch_set":5,"id":"bf659307_529d9457","line":1234,"range":{"start_line":1232,"start_character":0,"end_line":1234,"end_character":72},"in_reply_to":"df7087c5_6bee3bb5","updated":"2018-03-23 19:58:52.000000000","message":"Well I\u0027ll be damned.\n\nhttps://github.com/openstack/python-neutronclient/blob/6.7.0/neutronclient/v2_0/client.py#L348","commit_id":"2d5155363d69e4d1204883839518c7f5930e57ec"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"324a3e188418d67c60cf132fce29b4bd7f7392dc","unresolved":false,"context_lines":[{"line_number":1229,"context_line":"        \"\"\""},{"line_number":1230,"context_line":"        # TODO(mriedem): Replace this with using python-neutronclient if/when"},{"line_number":1231,"context_line":"        # the binding-extended support is in there."},{"line_number":1232,"context_line":"        auth_plugin \u003d service_auth.get_auth_plugin(context)"},{"line_number":1233,"context_line":"        global _SESSION"},{"line_number":1234,"context_line":"        client \u003d utils.get_ksa_adapter(\u0027network\u0027, auth_plugin, _SESSION)"},{"line_number":1235,"context_line":""},{"line_number":1236,"context_line":"        resp \u003d client.delete("},{"line_number":1237,"context_line":"            \u0027/v2.0/ports/%s/bindings/%s\u0027 % (port_id, host),"}],"source_content_type":"text/x-python","patch_set":5,"id":"df7087c5_6bee3bb5","line":1234,"range":{"start_line":1232,"start_character":0,"end_line":1234,"end_character":72},"in_reply_to":"df7087c5_b43db9de","updated":"2018-03-21 22:40:50.000000000","message":"Yeah, I checked it out; the neutronclient has passthrough methods for get/put/post/delete.","commit_id":"2d5155363d69e4d1204883839518c7f5930e57ec"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"b9d1a79f48b6411dc689347b07334d7b6e0be023","unresolved":false,"context_lines":[{"line_number":1236,"context_line":"        resp \u003d client.delete("},{"line_number":1237,"context_line":"            \u0027/v2.0/ports/%s/bindings/%s\u0027 % (port_id, host),"},{"line_number":1238,"context_line":"            raise_exc\u003dFalse)"},{"line_number":1239,"context_line":"        if resp:    # requests implements __bool__ for Response objects"},{"line_number":1240,"context_line":"            LOG.debug(\u0027Deleted binding for port %s and host %s.\u0027,"},{"line_number":1241,"context_line":"                      port_id, host)"},{"line_number":1242,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":5,"id":"df7087c5_d978a6f9","line":1239,"range":{"start_line":1239,"start_character":19,"end_line":1239,"end_character":71},"updated":"2018-03-20 21:06:52.000000000","message":"Wasn\u0027t it you who told me this goes without saying?","commit_id":"2d5155363d69e4d1204883839518c7f5930e57ec"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"324a3e188418d67c60cf132fce29b4bd7f7392dc","unresolved":false,"context_lines":[{"line_number":1236,"context_line":"        resp \u003d client.delete("},{"line_number":1237,"context_line":"            \u0027/v2.0/ports/%s/bindings/%s\u0027 % (port_id, host),"},{"line_number":1238,"context_line":"            raise_exc\u003dFalse)"},{"line_number":1239,"context_line":"        if resp:    # requests implements __bool__ for Response objects"},{"line_number":1240,"context_line":"            LOG.debug(\u0027Deleted binding for port %s and host %s.\u0027,"},{"line_number":1241,"context_line":"                      port_id, host)"},{"line_number":1242,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":5,"id":"df7087c5_cb34274d","line":1239,"range":{"start_line":1239,"start_character":19,"end_line":1239,"end_character":71},"in_reply_to":"df7087c5_b4485987","updated":"2018-03-21 22:40:50.000000000","message":"Don\u0027t MAKE me find it.","commit_id":"2d5155363d69e4d1204883839518c7f5930e57ec"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"4ca028cf00fcecb64fe00cbbeee0398ed7d14932","unresolved":false,"context_lines":[{"line_number":1236,"context_line":"        resp \u003d client.delete("},{"line_number":1237,"context_line":"            \u0027/v2.0/ports/%s/bindings/%s\u0027 % (port_id, host),"},{"line_number":1238,"context_line":"            raise_exc\u003dFalse)"},{"line_number":1239,"context_line":"        if resp:    # requests implements __bool__ for Response objects"},{"line_number":1240,"context_line":"            LOG.debug(\u0027Deleted binding for port %s and host %s.\u0027,"},{"line_number":1241,"context_line":"                      port_id, host)"},{"line_number":1242,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":5,"id":"df7087c5_b4485987","line":1239,"range":{"start_line":1239,"start_character":19,"end_line":1239,"end_character":71},"in_reply_to":"df7087c5_d978a6f9","updated":"2018-03-20 21:57:30.000000000","message":"Oh I\u0027m quite sure I\u0027d never say something like that.","commit_id":"2d5155363d69e4d1204883839518c7f5930e57ec"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"6fcc21143f5af93c788c585662efe6d46bd6bacb","unresolved":false,"context_lines":[{"line_number":1242,"context_line":"        else:"},{"line_number":1243,"context_line":"            # We can safely ignore 404s since we\u0027re trying to delete"},{"line_number":1244,"context_line":"            # the thing that wasn\u0027t found anyway."},{"line_number":1245,"context_line":"            if resp.status_code !\u003d 404:"},{"line_number":1246,"context_line":"                LOG.warning(\u0027Unexpected error trying to delete binding \u0027"},{"line_number":1247,"context_line":"                            \u0027for port %s and host %s. Code: %s. \u0027"},{"line_number":1248,"context_line":"                            \u0027Error: %s\u0027, port_id, host,"}],"source_content_type":"text/x-python","patch_set":5,"id":"bf659307_0d0aa125","line":1245,"updated":"2018-03-23 21:01:07.000000000","message":"If it\u0027s not a 404, we should raise some kind of exception right?","commit_id":"2d5155363d69e4d1204883839518c7f5930e57ec"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"e0050c8aefd4c6878bed2d3f3d80cfede533dc77","unresolved":false,"context_lines":[{"line_number":1242,"context_line":"        else:"},{"line_number":1243,"context_line":"            # We can safely ignore 404s since we\u0027re trying to delete"},{"line_number":1244,"context_line":"            # the thing that wasn\u0027t found anyway."},{"line_number":1245,"context_line":"            if resp.status_code !\u003d 404:"},{"line_number":1246,"context_line":"                LOG.warning(\u0027Unexpected error trying to delete binding \u0027"},{"line_number":1247,"context_line":"                            \u0027for port %s and host %s. Code: %s. \u0027"},{"line_number":1248,"context_line":"                            \u0027Error: %s\u0027, port_id, host,"}],"source_content_type":"text/x-python","patch_set":5,"id":"bf659307_dfc52c5d","line":1245,"in_reply_to":"bf659307_0d0aa125","updated":"2018-03-23 21:26:02.000000000","message":"If you like, but you would just have to trap and ignore it at L1214-5, which is already in an error path and just about to raise PortBindingFailed.\n\nCould be worth mentioning in the docstring that errors are logged but otherwise ignored.","commit_id":"2d5155363d69e4d1204883839518c7f5930e57ec"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"5cff62df2c9bb5cb45260e004b0f8bde13522e81","unresolved":false,"context_lines":[{"line_number":1230,"context_line":"        client \u003d get_client(context, admin\u003dTrue)"},{"line_number":1231,"context_line":"        resp \u003d client.delete("},{"line_number":1232,"context_line":"            \u0027/ports/%s/bindings/%s\u0027 % (port_id, host))"},{"line_number":1233,"context_line":"        if resp:"},{"line_number":1234,"context_line":"            LOG.debug(\u0027Deleted binding for port %s and host %s.\u0027,"},{"line_number":1235,"context_line":"                      port_id, host)"},{"line_number":1236,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":8,"id":"bf659307_0046ae50","line":1233,"updated":"2018-03-27 01:03:08.000000000","message":"As pointed out elsewhere, the neutronclient.delete() likely doesn\u0027t return anything, and will raise an exception on failure, so I don\u0027t really want to be using this, and probably just want to use KSA like I had originally.","commit_id":"bc941a81f2794f2c994f9931a1ff5516d50e2bd5"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"97a68203c033eb4d1016ea55b47f3a05f571283c","unresolved":false,"context_lines":[{"line_number":1232,"context_line":"                          port_id, host, resp.status_code, resp.text,"},{"line_number":1233,"context_line":"                          instance\u003dinstance)"},{"line_number":1234,"context_line":"                for rollback_port_id in bindings_by_port_id:"},{"line_number":1235,"context_line":"                    self.delete_port_binding("},{"line_number":1236,"context_line":"                        context, rollback_port_id, host)"},{"line_number":1237,"context_line":"                raise exception.PortBindingFailed(port_id\u003dport_id)"},{"line_number":1238,"context_line":""},{"line_number":1239,"context_line":"        return bindings_by_port_id"}],"source_content_type":"text/x-python","patch_set":11,"id":"bf659307_76b817e4","line":1236,"range":{"start_line":1235,"start_character":20,"end_line":1236,"end_character":56},"updated":"2018-03-31 17:29:54.000000000","message":"Now this can raise PortBindingDeletionFailed.  Which you probably want to catch and ignore here so that a) you can go on to the next rollback; and b) you don\u0027t have to add PortBindingDeletionFailed to the contract for this method.","commit_id":"aec29c011178e6755e8c5187479f2457e96137fc"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"12c64e67a14cb80a71a15c19ee278e8833047d5a","unresolved":false,"context_lines":[{"line_number":1232,"context_line":"                          port_id, host, resp.status_code, resp.text,"},{"line_number":1233,"context_line":"                          instance\u003dinstance)"},{"line_number":1234,"context_line":"                for rollback_port_id in bindings_by_port_id:"},{"line_number":1235,"context_line":"                    self.delete_port_binding("},{"line_number":1236,"context_line":"                        context, rollback_port_id, host)"},{"line_number":1237,"context_line":"                raise exception.PortBindingFailed(port_id\u003dport_id)"},{"line_number":1238,"context_line":""},{"line_number":1239,"context_line":"        return bindings_by_port_id"}],"source_content_type":"text/x-python","patch_set":11,"id":"bf659307_029955c2","line":1236,"range":{"start_line":1235,"start_character":20,"end_line":1236,"end_character":56},"in_reply_to":"bf659307_76b817e4","updated":"2018-04-01 14:12:56.000000000","message":"Yeah good point.","commit_id":"aec29c011178e6755e8c5187479f2457e96137fc"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"5e40690103dbe0d9070ba92f89638201def10c92","unresolved":false,"context_lines":[{"line_number":1241,"context_line":"                          port_id, host, resp.status_code, resp.text,"},{"line_number":1242,"context_line":"                          instance\u003dinstance)"},{"line_number":1243,"context_line":"                for rollback_port_id in bindings_by_port_id:"},{"line_number":1244,"context_line":"                    try:"},{"line_number":1245,"context_line":"                        self.delete_port_binding("},{"line_number":1246,"context_line":"                            context, rollback_port_id, host)"},{"line_number":1247,"context_line":"                    except exception.PortBindingDeletionFailed:"},{"line_number":1248,"context_line":"                        LOG.warning(\u0027Failed to remove binding for port %s on \u0027"},{"line_number":1249,"context_line":"                                    \u0027host %s.\u0027, rollback_port_id, host,"},{"line_number":1250,"context_line":"                                    instance\u003dinstance)"}],"source_content_type":"text/x-python","patch_set":18,"id":"5f7c97a3_d0f2d3e3","line":1247,"range":{"start_line":1244,"start_character":0,"end_line":1247,"end_character":63},"updated":"2018-06-18 12:55:13.000000000","message":"This change can be avoided if you reorder the patches and commit delete_port_binding() before bind_ports_to_host()","commit_id":"208867998e9bef2749f6eafc3fba15c5b3e8e57a"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"5e40690103dbe0d9070ba92f89638201def10c92","unresolved":false,"context_lines":[{"line_number":1273,"context_line":"                      port_id, host)"},{"line_number":1274,"context_line":"        else:"},{"line_number":1275,"context_line":"            # We can safely ignore 404s since we\u0027re trying to delete"},{"line_number":1276,"context_line":"            # the thing that wasn\u0027t found anyway."},{"line_number":1277,"context_line":"            if resp.status_code !\u003d 404:"},{"line_number":1278,"context_line":"                # Log the details, raise an exception."},{"line_number":1279,"context_line":"                LOG.error(\u0027Unexpected error trying to delete binding \u0027"}],"source_content_type":"text/x-python","patch_set":18,"id":"5f7c97a3_b0c87756","line":1276,"updated":"2018-06-18 12:55:13.000000000","message":"Do we get back 404 if the port is not found? I agree that we can ignore the 404 if the binding is not found as we are about to delete that but I would at least log something if the port is missing. I don\u0027t know if we can differentiate between the two case. So let\u0027s log every 404.","commit_id":"208867998e9bef2749f6eafc3fba15c5b3e8e57a"},{"author":{"_account_id":7730,"name":"Sahid Orentino Ferdjaoui","email":"sahid.ferdjaoui@industrialdiscipline.com","username":"sahid"},"change_message_id":"15dd228d68bddf45dbb315612b8fd5ae4efde046","unresolved":false,"context_lines":[{"line_number":1275,"context_line":"        else:"},{"line_number":1276,"context_line":"            # We can safely ignore 404s since we\u0027re trying to delete"},{"line_number":1277,"context_line":"            # the thing that wasn\u0027t found anyway."},{"line_number":1278,"context_line":"            if resp.status_code !\u003d 404:"},{"line_number":1279,"context_line":"                # Log the details, raise an exception."},{"line_number":1280,"context_line":"                LOG.error(\u0027Unexpected error trying to delete binding \u0027"},{"line_number":1281,"context_line":"                          \u0027for port %s and host %s. Code: %s. \u0027"}],"source_content_type":"text/x-python","patch_set":21,"id":"5f7c97a3_97c23602","line":1278,"updated":"2018-06-28 07:01:31.000000000","message":"Not sure how we could be here since resp should be None... The tests look good so I would say it\u0027s something magic related to requests.Response","commit_id":"19c334b1d7440ecc3e2d88b0e7043028069fb456"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"fbea885016ca0fbc437f3c741e24127c857a28ff","unresolved":false,"context_lines":[{"line_number":1275,"context_line":"        else:"},{"line_number":1276,"context_line":"            # We can safely ignore 404s since we\u0027re trying to delete"},{"line_number":1277,"context_line":"            # the thing that wasn\u0027t found anyway."},{"line_number":1278,"context_line":"            if resp.status_code !\u003d 404:"},{"line_number":1279,"context_line":"                # Log the details, raise an exception."},{"line_number":1280,"context_line":"                LOG.error(\u0027Unexpected error trying to delete binding \u0027"},{"line_number":1281,"context_line":"                          \u0027for port %s and host %s. Code: %s. \u0027"}],"source_content_type":"text/x-python","patch_set":21,"id":"5f7c97a3_010c56ea","line":1278,"in_reply_to":"5f7c97a3_97c23602","updated":"2018-07-02 15:49:54.000000000","message":"The Response object implements __bool__ so if the status_code is \u003c 400 it\u0027s considered True.\n\nhttps://github.com/requests/requests/blob/master/requests/models.py#L667-L685","commit_id":"19c334b1d7440ecc3e2d88b0e7043028069fb456"}],"nova/tests/unit/network/test_neutronv2.py":[{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"d88b83f949fb3ed86ecd1310a9fcae0a6cef2f9d","unresolved":false,"context_lines":[{"line_number":50,"context_line":"from nova import service_auth"},{"line_number":51,"context_line":"from nova import test"},{"line_number":52,"context_line":"from nova.tests.unit import fake_instance"},{"line_number":53,"context_line":"from nova.tests.unit import test_identity as fake_resp"},{"line_number":54,"context_line":"from nova.tests import uuidsentinel as uuids"},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"CONF \u003d cfg.CONF"}],"source_content_type":"text/x-python","patch_set":11,"id":"bf659307_14e5d3db","line":53,"range":{"start_line":53,"start_character":28,"end_line":53,"end_character":41},"updated":"2018-04-04 13:16:06.000000000","message":"This is fake_requests now (https://review.openstack.org/#/c/556551/ merged)","commit_id":"aec29c011178e6755e8c5187479f2457e96137fc"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"058625b4402d76a1cb1d1cedf7edd71754c72050","unresolved":false,"context_lines":[{"line_number":50,"context_line":"from nova import service_auth"},{"line_number":51,"context_line":"from nova import test"},{"line_number":52,"context_line":"from nova.tests.unit import fake_instance"},{"line_number":53,"context_line":"from nova.tests.unit import test_identity as fake_resp"},{"line_number":54,"context_line":"from nova.tests import uuidsentinel as uuids"},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"CONF \u003d cfg.CONF"}],"source_content_type":"text/x-python","patch_set":11,"id":"bf659307_6af54a56","line":53,"range":{"start_line":53,"start_character":28,"end_line":53,"end_character":41},"in_reply_to":"bf659307_14e5d3db","updated":"2018-04-04 14:51:08.000000000","message":"Will update.","commit_id":"aec29c011178e6755e8c5187479f2457e96137fc"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"97a68203c033eb4d1016ea55b47f3a05f571283c","unresolved":false,"context_lines":[{"line_number":5422,"context_line":"        get_adapter.return_value.delete.side_effect \u003d fake_delete"},{"line_number":5423,"context_line":"        for port_id in (uuids.ok, uuids.notfound, uuids.fail):"},{"line_number":5424,"context_line":"            if port_id \u003d\u003d uuids.fail:"},{"line_number":5425,"context_line":"                self.assertRaises(exception.PortBindingDeletionFailed,"},{"line_number":5426,"context_line":"                                  self.api.delete_port_binding,"},{"line_number":5427,"context_line":"                                  ctxt, port_id, \u0027fake-host\u0027)"},{"line_number":5428,"context_line":"            else:"}],"source_content_type":"text/x-python","patch_set":11,"id":"bf659307_d6c6c368","line":5425,"range":{"start_line":5425,"start_character":34,"end_line":5425,"end_character":69},"updated":"2018-03-31 17:29:54.000000000","message":"boo","commit_id":"aec29c011178e6755e8c5187479f2457e96137fc"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"b08b332137f882781aa369e37caa30e298232b66","unresolved":false,"context_lines":[{"line_number":5422,"context_line":"        get_adapter.return_value.delete.side_effect \u003d fake_delete"},{"line_number":5423,"context_line":"        for port_id in (uuids.ok, uuids.notfound, uuids.fail):"},{"line_number":5424,"context_line":"            if port_id \u003d\u003d uuids.fail:"},{"line_number":5425,"context_line":"                self.assertRaises(exception.PortBindingDeletionFailed,"},{"line_number":5426,"context_line":"                                  self.api.delete_port_binding,"},{"line_number":5427,"context_line":"                                  ctxt, port_id, \u0027fake-host\u0027)"},{"line_number":5428,"context_line":"            else:"}],"source_content_type":"text/x-python","patch_set":11,"id":"bf659307_70b2584b","line":5425,"range":{"start_line":5425,"start_character":34,"end_line":5425,"end_character":69},"in_reply_to":"bf659307_62805147","updated":"2018-04-01 19:12:08.000000000","message":"Nothing, just reiterating my previous comment.","commit_id":"aec29c011178e6755e8c5187479f2457e96137fc"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"12c64e67a14cb80a71a15c19ee278e8833047d5a","unresolved":false,"context_lines":[{"line_number":5422,"context_line":"        get_adapter.return_value.delete.side_effect \u003d fake_delete"},{"line_number":5423,"context_line":"        for port_id in (uuids.ok, uuids.notfound, uuids.fail):"},{"line_number":5424,"context_line":"            if port_id \u003d\u003d uuids.fail:"},{"line_number":5425,"context_line":"                self.assertRaises(exception.PortBindingDeletionFailed,"},{"line_number":5426,"context_line":"                                  self.api.delete_port_binding,"},{"line_number":5427,"context_line":"                                  ctxt, port_id, \u0027fake-host\u0027)"},{"line_number":5428,"context_line":"            else:"}],"source_content_type":"text/x-python","patch_set":11,"id":"bf659307_62805147","line":5425,"range":{"start_line":5425,"start_character":34,"end_line":5425,"end_character":69},"in_reply_to":"bf659307_d6c6c368","updated":"2018-04-01 14:12:56.000000000","message":"?","commit_id":"aec29c011178e6755e8c5187479f2457e96137fc"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"5e40690103dbe0d9070ba92f89638201def10c92","unresolved":false,"context_lines":[{"line_number":5384,"context_line":"            return mock_response"},{"line_number":5385,"context_line":""},{"line_number":5386,"context_line":"        mock_client.return_value.post.side_effect \u003d fake_post"},{"line_number":5387,"context_line":"        with mock.patch.object(self.api, \u0027delete_port_binding\u0027,"},{"line_number":5388,"context_line":"                               # This will be logged but not re-raised."},{"line_number":5389,"context_line":"                               side_effect\u003dexception.PortBindingDeletionFailed("},{"line_number":5390,"context_line":"                                   port_id\u003duuids.ok, host\u003d\u0027fake-host\u0027"},{"line_number":5391,"context_line":"                               )) as mock_delete:"},{"line_number":5392,"context_line":"            self.assertRaises(exception.PortBindingFailed,"},{"line_number":5393,"context_line":"                              self.api.bind_ports_to_host,"},{"line_number":5394,"context_line":"                              ctxt, inst, \u0027fake-host\u0027)"},{"line_number":5395,"context_line":"        # assert that post was called twice and delete once"},{"line_number":5396,"context_line":"        self.assertEqual(2, mock_client.return_value.post.call_count)"},{"line_number":5397,"context_line":"        mock_delete.assert_called_once_with(ctxt, uuids.ok, \u0027fake-host\u0027)"},{"line_number":5398,"context_line":""}],"source_content_type":"text/x-python","patch_set":18,"id":"5f7c97a3_1037eb4f","line":5395,"range":{"start_line":5387,"start_character":0,"end_line":5395,"end_character":1},"updated":"2018-06-18 12:55:13.000000000","message":"this change could be avoided if you reorder the patches","commit_id":"208867998e9bef2749f6eafc3fba15c5b3e8e57a"}]}
