)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"daf8e93f60f91118638425a264b4f1fcc7a3bac9","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Force refresh instance network info on deletion"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"When deleting an instance, if the network info is empty, we should force"},{"line_number":10,"context_line":"a refresh of the info because we can\u0027t be sure that the cache is"},{"line_number":11,"context_line":"up-to-date."},{"line_number":12,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":3,"id":"bfb3d3c7_9520634a","line":9,"range":{"start_line":9,"start_character":67,"end_line":9,"end_character":72},"updated":"2019-05-24 15:30:43.000000000","message":"This is not really what this change is doing anymore because you split things out as I suggested, but it makes me wonder if this will actually help you without the forced refresh, because without the force we rebuild the cache *from* the cache, and if we don\u0027t have anything in the cache is this really going to fix anything?","commit_id":"2d0a73b9840fb392d255961617d00dd79add04a2"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"429ba933ef2e3e9eab8efc6645a989f54cf60dc6","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Force refresh instance network info on deletion"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"When deleting an instance, if the network info is empty, we should force"},{"line_number":10,"context_line":"a refresh of the info because we can\u0027t be sure that the cache is"},{"line_number":11,"context_line":"up-to-date."},{"line_number":12,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":3,"id":"bfb3d3c7_95f8637b","line":9,"range":{"start_line":9,"start_character":67,"end_line":9,"end_character":72},"in_reply_to":"bfb3d3c7_9520634a","updated":"2019-05-24 15:35:27.000000000","message":"This is the thing I\u0027m talking about:\n\nhttps://github.com/openstack/nova/blob/976d1b89c2b754729903291050e01c9bf49704b9/nova/network/neutronv2/api.py#L3012\n\nHitting that code will refresh the cache so if we had a race where the instance info cache is populated in the DB but just not at the time that the copy of the instance is being terminated, then you might still be OK and fix your problem, but if the instance info cache is never populated by the time we refresh the cache, without forcing it from neutron we won\u0027t get anything and you\u0027ve got the same problem.","commit_id":"2d0a73b9840fb392d255961617d00dd79add04a2"},{"author":{"_account_id":11583,"name":"Arnaud Morin","email":"arnaud.morin@gmail.com","username":"arnaudmorin"},"change_message_id":"782b05113e2ca0ef7b2532f47b784ee6d800faab","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Force refresh instance network info on deletion"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"When deleting an instance, if the network info is empty, we should force"},{"line_number":10,"context_line":"a refresh of the info because we can\u0027t be sure that the cache is"},{"line_number":11,"context_line":"up-to-date."},{"line_number":12,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":3,"id":"bfb3d3c7_f611935e","line":9,"range":{"start_line":9,"start_character":67,"end_line":9,"end_character":72},"in_reply_to":"bfb3d3c7_956b831c","updated":"2019-05-27 14:15:35.000000000","message":"Done\n\nI doubled checked, and yes, the info_cache is populated in nova DB, so the fix without force_refresh is enough","commit_id":"2d0a73b9840fb392d255961617d00dd79add04a2"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"393a316a650030293a9e8d32a2551f2b77154761","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Force refresh instance network info on deletion"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"When deleting an instance, if the network info is empty, we should force"},{"line_number":10,"context_line":"a refresh of the info because we can\u0027t be sure that the cache is"},{"line_number":11,"context_line":"up-to-date."},{"line_number":12,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":3,"id":"bfb3d3c7_956b831c","line":9,"range":{"start_line":9,"start_character":67,"end_line":9,"end_character":72},"in_reply_to":"bfb3d3c7_95f8637b","updated":"2019-05-24 15:40:55.000000000","message":"Note that if you\u0027re just racing on delete with a stale copy of the instance.info_cache, then the refresh should fix things if the info_cache is populated by then b/c of this call:\n\nhttps://github.com/openstack/nova/blob/976d1b89c2b754729903291050e01c9bf49704b9/nova/network/neutronv2/api.py#L1757","commit_id":"2d0a73b9840fb392d255961617d00dd79add04a2"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"110d0d1d7f4f59595eeb52404735db247c931059","unresolved":false,"context_lines":[{"line_number":7,"context_line":"Refresh instance network info on deletion"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"When deleting an instance, if the network info is empty, we should"},{"line_number":10,"context_line":"refresh the info because we can\u0027t be sure that the cache is"},{"line_number":11,"context_line":"up-to-date."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"Closes-Bug: #1830081"},{"line_number":14,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":6,"id":"9fb8cfa7_7725cac1","line":11,"range":{"start_line":10,"start_character":47,"end_line":11,"end_character":11},"updated":"2019-06-07 15:51:17.000000000","message":"nit: could be expanded a bit to say something like, \"we can\u0027t be sure the copy of the cache we have when we fetched the instance to delete is up-to-date, i.e. if we\u0027re racing to delete the server while it\u0027s building and the network info cache was updated in the database after we started the delete operation and got the instance from the DB.\"","commit_id":"9babe75fd8583bfb044b667ab4cab4dcaa1bf10f"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"64b49e1a4f8962b6f1ea173cebe677cbfb125aae","unresolved":false,"context_lines":[{"line_number":7,"context_line":"Refresh instance network info on deletion"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"When deleting an instance, if the network info is empty, we should"},{"line_number":10,"context_line":"refresh the info because we can\u0027t be sure that the cache is"},{"line_number":11,"context_line":"up-to-date."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"Closes-Bug: #1830081"},{"line_number":14,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":6,"id":"9fb8cfa7_c6ae4997","line":11,"range":{"start_line":10,"start_character":47,"end_line":11,"end_character":11},"in_reply_to":"9fb8cfa7_7725cac1","updated":"2019-06-07 16:33:17.000000000","message":"Done","commit_id":"9babe75fd8583bfb044b667ab4cab4dcaa1bf10f"}],"nova/compute/manager.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"b53a666bfd56d17ea36766117874585bc8465ea0","unresolved":false,"context_lines":[{"line_number":2588,"context_line":"        # unplugging the interface, force_refresh of network_info if it is"},{"line_number":2589,"context_line":"        # empty."},{"line_number":2590,"context_line":"        if not network_info:"},{"line_number":2591,"context_line":"            self.network_api.get_instance_nw_info("},{"line_number":2592,"context_line":"                context, instance, force_refresh\u003dTrue)"},{"line_number":2593,"context_line":""},{"line_number":2594,"context_line":"        # NOTE(vish) get bdms before destroying the instance"}],"source_content_type":"text/x-python","patch_set":1,"id":"bfb3d3c7_bd549ecb","line":2591,"updated":"2019-05-22 15:48:39.000000000","message":"You should assign network_info to the return value of this method.","commit_id":"1ee0b9c766610ea3b343dd0bbcca4f83f7a55df1"},{"author":{"_account_id":11583,"name":"Arnaud Morin","email":"arnaud.morin@gmail.com","username":"arnaudmorin"},"change_message_id":"1c2d602e0648f0deaccf1e6f8e0a25b328e65cbc","unresolved":false,"context_lines":[{"line_number":2588,"context_line":"        # unplugging the interface, force_refresh of network_info if it is"},{"line_number":2589,"context_line":"        # empty."},{"line_number":2590,"context_line":"        if not network_info:"},{"line_number":2591,"context_line":"            self.network_api.get_instance_nw_info("},{"line_number":2592,"context_line":"                context, instance, force_refresh\u003dTrue)"},{"line_number":2593,"context_line":""},{"line_number":2594,"context_line":"        # NOTE(vish) get bdms before destroying the instance"}],"source_content_type":"text/x-python","patch_set":1,"id":"bfb3d3c7_62dbd31a","line":2591,"in_reply_to":"bfb3d3c7_bd549ecb","updated":"2019-05-23 10:03:46.000000000","message":"Done","commit_id":"1ee0b9c766610ea3b343dd0bbcca4f83f7a55df1"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"b53a666bfd56d17ea36766117874585bc8465ea0","unresolved":false,"context_lines":[{"line_number":2589,"context_line":"        # empty."},{"line_number":2590,"context_line":"        if not network_info:"},{"line_number":2591,"context_line":"            self.network_api.get_instance_nw_info("},{"line_number":2592,"context_line":"                context, instance, force_refresh\u003dTrue)"},{"line_number":2593,"context_line":""},{"line_number":2594,"context_line":"        # NOTE(vish) get bdms before destroying the instance"},{"line_number":2595,"context_line":"        vol_bdms \u003d [bdm for bdm in bdms if bdm.is_volume]"}],"source_content_type":"text/x-python","patch_set":1,"id":"bfb3d3c7_dd687288","line":2592,"range":{"start_line":2592,"start_character":35,"end_line":2592,"end_character":53},"updated":"2019-05-22 15:48:39.000000000","message":"Note that this is only available since Stein upstream so if you need this fix further than stable/stein, at least upstream you\u0027d need to remove this and make it a separate change to pass the force flag since that can only go to stable/stein upstream (I don\u0027t think we have plans right now to backport the change that added the force_refresh flag since it depends on an online data migration which introduced a few upgrade regressions in stein, see bug 1825034 and bug 1824435).","commit_id":"1ee0b9c766610ea3b343dd0bbcca4f83f7a55df1"},{"author":{"_account_id":11583,"name":"Arnaud Morin","email":"arnaud.morin@gmail.com","username":"arnaudmorin"},"change_message_id":"1c2d602e0648f0deaccf1e6f8e0a25b328e65cbc","unresolved":false,"context_lines":[{"line_number":2589,"context_line":"        # empty."},{"line_number":2590,"context_line":"        if not network_info:"},{"line_number":2591,"context_line":"            self.network_api.get_instance_nw_info("},{"line_number":2592,"context_line":"                context, instance, force_refresh\u003dTrue)"},{"line_number":2593,"context_line":""},{"line_number":2594,"context_line":"        # NOTE(vish) get bdms before destroying the instance"},{"line_number":2595,"context_line":"        vol_bdms \u003d [bdm for bdm in bdms if bdm.is_volume]"}],"source_content_type":"text/x-python","patch_set":1,"id":"bfb3d3c7_82d607f1","line":2592,"range":{"start_line":2592,"start_character":35,"end_line":2592,"end_character":53},"in_reply_to":"bfb3d3c7_dd687288","updated":"2019-05-23 10:03:46.000000000","message":"Done","commit_id":"1ee0b9c766610ea3b343dd0bbcca4f83f7a55df1"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"daf8e93f60f91118638425a264b4f1fcc7a3bac9","unresolved":false,"context_lines":[{"line_number":2585,"context_line":"        network_info \u003d instance.get_network_info()"},{"line_number":2586,"context_line":""},{"line_number":2587,"context_line":"        # NOTE(arnaudmorin) to avoid nova destroying the instance without"},{"line_number":2588,"context_line":"        # unplugging the interface, force_refresh of network_info if it is"},{"line_number":2589,"context_line":"        # empty."},{"line_number":2590,"context_line":"        if not network_info:"},{"line_number":2591,"context_line":"            network_info \u003d self.network_api.get_instance_nw_info("}],"source_content_type":"text/x-python","patch_set":3,"id":"bfb3d3c7_55166bf3","line":2588,"range":{"start_line":2588,"start_character":36,"end_line":2588,"end_character":49},"updated":"2019-05-24 15:30:43.000000000","message":"this is no longer part of this change","commit_id":"2d0a73b9840fb392d255961617d00dd79add04a2"}],"nova/tests/unit/compute/test_compute_mgr.py":[{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"75dac95139971068cdef7521b645f419aa83b872","unresolved":false,"context_lines":[{"line_number":4779,"context_line":"        mock_elevated.return_value \u003d fake_elevated"},{"line_number":4780,"context_line":""},{"line_number":4781,"context_line":"        # Call shutdown instance"},{"line_number":4782,"context_line":"        self.compute._shutdown_instance(self.context, instance, bdms, notify\u003dFalse, try_deallocate_networks\u003dFalse)"},{"line_number":4783,"context_line":""},{"line_number":4784,"context_line":"        # Verify"},{"line_number":4785,"context_line":"        mock_nw_cache_info.assert_called_once()"}],"source_content_type":"text/x-python","patch_set":2,"id":"bfb3d3c7_7274fa68","line":4782,"range":{"start_line":4782,"start_character":8,"end_line":4782,"end_character":114},"updated":"2019-05-23 15:37:58.000000000","message":"pep8","commit_id":"ea6350d71d79ed9c9e49f666f4a573f47a47c21e"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"110d0d1d7f4f59595eeb52404735db247c931059","unresolved":false,"context_lines":[{"line_number":4843,"context_line":"            self.context, instance, bdms)"},{"line_number":4844,"context_line":""},{"line_number":4845,"context_line":"    @mock.patch(\u0027nova.context.RequestContext.elevated\u0027)"},{"line_number":4846,"context_line":"    @mock.patch(\u0027nova.objects.BlockDeviceMappingList.get_by_instance_uuid\u0027)"},{"line_number":4847,"context_line":"    @mock.patch.object(fake_driver.FakeDriver, \u0027destroy\u0027)"},{"line_number":4848,"context_line":"    @mock.patch(\u0027nova.network.neutronv2.api.API.get_instance_nw_info\u0027)"},{"line_number":4849,"context_line":"    @mock.patch(\u0027nova.objects.Instance.get_network_info\u0027)"}],"source_content_type":"text/x-python","patch_set":6,"id":"9fb8cfa7_d2a844dc","line":4846,"updated":"2019-06-07 15:51:17.000000000","message":"You shouldn\u0027t need to mock this because you\u0027re passing in a non-None bdms list.","commit_id":"9babe75fd8583bfb044b667ab4cab4dcaa1bf10f"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"64b49e1a4f8962b6f1ea173cebe677cbfb125aae","unresolved":false,"context_lines":[{"line_number":4843,"context_line":"            self.context, instance, bdms)"},{"line_number":4844,"context_line":""},{"line_number":4845,"context_line":"    @mock.patch(\u0027nova.context.RequestContext.elevated\u0027)"},{"line_number":4846,"context_line":"    @mock.patch(\u0027nova.objects.BlockDeviceMappingList.get_by_instance_uuid\u0027)"},{"line_number":4847,"context_line":"    @mock.patch.object(fake_driver.FakeDriver, \u0027destroy\u0027)"},{"line_number":4848,"context_line":"    @mock.patch(\u0027nova.network.neutronv2.api.API.get_instance_nw_info\u0027)"},{"line_number":4849,"context_line":"    @mock.patch(\u0027nova.objects.Instance.get_network_info\u0027)"}],"source_content_type":"text/x-python","patch_set":6,"id":"9fb8cfa7_46e25931","line":4846,"in_reply_to":"9fb8cfa7_d2a844dc","updated":"2019-06-07 16:33:17.000000000","message":"Done","commit_id":"9babe75fd8583bfb044b667ab4cab4dcaa1bf10f"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"110d0d1d7f4f59595eeb52404735db247c931059","unresolved":false,"context_lines":[{"line_number":4845,"context_line":"    @mock.patch(\u0027nova.context.RequestContext.elevated\u0027)"},{"line_number":4846,"context_line":"    @mock.patch(\u0027nova.objects.BlockDeviceMappingList.get_by_instance_uuid\u0027)"},{"line_number":4847,"context_line":"    @mock.patch.object(fake_driver.FakeDriver, \u0027destroy\u0027)"},{"line_number":4848,"context_line":"    @mock.patch(\u0027nova.network.neutronv2.api.API.get_instance_nw_info\u0027)"},{"line_number":4849,"context_line":"    @mock.patch(\u0027nova.objects.Instance.get_network_info\u0027)"},{"line_number":4850,"context_line":"    def test_terminate_instance_no_network_info(self, mock_nw_cache_info,"},{"line_number":4851,"context_line":"            mock_nw_api_info, mock_destroy, mock_bdms, mock_elevated):"}],"source_content_type":"text/x-python","patch_set":6,"id":"9fb8cfa7_5703e60f","line":4848,"range":{"start_line":4848,"start_character":4,"end_line":4848,"end_character":70},"updated":"2019-06-07 15:51:17.000000000","message":"The compute manager code shouldn\u0027t know if it\u0027s using the neutron API or the nova-network API. What I would do instead is mock self.compute.network_api directly within the test.","commit_id":"9babe75fd8583bfb044b667ab4cab4dcaa1bf10f"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"64b49e1a4f8962b6f1ea173cebe677cbfb125aae","unresolved":false,"context_lines":[{"line_number":4845,"context_line":"    @mock.patch(\u0027nova.context.RequestContext.elevated\u0027)"},{"line_number":4846,"context_line":"    @mock.patch(\u0027nova.objects.BlockDeviceMappingList.get_by_instance_uuid\u0027)"},{"line_number":4847,"context_line":"    @mock.patch.object(fake_driver.FakeDriver, \u0027destroy\u0027)"},{"line_number":4848,"context_line":"    @mock.patch(\u0027nova.network.neutronv2.api.API.get_instance_nw_info\u0027)"},{"line_number":4849,"context_line":"    @mock.patch(\u0027nova.objects.Instance.get_network_info\u0027)"},{"line_number":4850,"context_line":"    def test_terminate_instance_no_network_info(self, mock_nw_cache_info,"},{"line_number":4851,"context_line":"            mock_nw_api_info, mock_destroy, mock_bdms, mock_elevated):"}],"source_content_type":"text/x-python","patch_set":6,"id":"9fb8cfa7_e6d26d5c","line":4848,"range":{"start_line":4848,"start_character":4,"end_line":4848,"end_character":70},"in_reply_to":"9fb8cfa7_5703e60f","updated":"2019-06-07 16:33:17.000000000","message":"Done","commit_id":"9babe75fd8583bfb044b667ab4cab4dcaa1bf10f"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"110d0d1d7f4f59595eeb52404735db247c931059","unresolved":false,"context_lines":[{"line_number":4846,"context_line":"    @mock.patch(\u0027nova.objects.BlockDeviceMappingList.get_by_instance_uuid\u0027)"},{"line_number":4847,"context_line":"    @mock.patch.object(fake_driver.FakeDriver, \u0027destroy\u0027)"},{"line_number":4848,"context_line":"    @mock.patch(\u0027nova.network.neutronv2.api.API.get_instance_nw_info\u0027)"},{"line_number":4849,"context_line":"    @mock.patch(\u0027nova.objects.Instance.get_network_info\u0027)"},{"line_number":4850,"context_line":"    def test_terminate_instance_no_network_info(self, mock_nw_cache_info,"},{"line_number":4851,"context_line":"            mock_nw_api_info, mock_destroy, mock_bdms, mock_elevated):"},{"line_number":4852,"context_line":"        # Tests that we refresh the network info if it was empty"}],"source_content_type":"text/x-python","patch_set":6,"id":"9fb8cfa7_723cf8c7","line":4849,"updated":"2019-06-07 15:51:17.000000000","message":"We shouldn\u0027t need to mock this, see below.","commit_id":"9babe75fd8583bfb044b667ab4cab4dcaa1bf10f"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"64b49e1a4f8962b6f1ea173cebe677cbfb125aae","unresolved":false,"context_lines":[{"line_number":4846,"context_line":"    @mock.patch(\u0027nova.objects.BlockDeviceMappingList.get_by_instance_uuid\u0027)"},{"line_number":4847,"context_line":"    @mock.patch.object(fake_driver.FakeDriver, \u0027destroy\u0027)"},{"line_number":4848,"context_line":"    @mock.patch(\u0027nova.network.neutronv2.api.API.get_instance_nw_info\u0027)"},{"line_number":4849,"context_line":"    @mock.patch(\u0027nova.objects.Instance.get_network_info\u0027)"},{"line_number":4850,"context_line":"    def test_terminate_instance_no_network_info(self, mock_nw_cache_info,"},{"line_number":4851,"context_line":"            mock_nw_api_info, mock_destroy, mock_bdms, mock_elevated):"},{"line_number":4852,"context_line":"        # Tests that we refresh the network info if it was empty"}],"source_content_type":"text/x-python","patch_set":6,"id":"9fb8cfa7_06d6a150","line":4849,"in_reply_to":"9fb8cfa7_723cf8c7","updated":"2019-06-07 16:33:17.000000000","message":"Done","commit_id":"9babe75fd8583bfb044b667ab4cab4dcaa1bf10f"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"110d0d1d7f4f59595eeb52404735db247c931059","unresolved":false,"context_lines":[{"line_number":4850,"context_line":"    def test_terminate_instance_no_network_info(self, mock_nw_cache_info,"},{"line_number":4851,"context_line":"            mock_nw_api_info, mock_destroy, mock_bdms, mock_elevated):"},{"line_number":4852,"context_line":"        # Tests that we refresh the network info if it was empty"},{"line_number":4853,"context_line":"        instance \u003d fake_instance.fake_instance_obj("},{"line_number":4854,"context_line":"            self.context, vm_state\u003dvm_states.ACTIVE)"},{"line_number":4855,"context_line":"        vif \u003d fake_network_cache_model.new_vif()"},{"line_number":4856,"context_line":"        empty_nw_info \u003d network_model.NetworkInfo()"}],"source_content_type":"text/x-python","patch_set":6,"id":"9fb8cfa7_b257d002","line":4853,"updated":"2019-06-07 15:51:17.000000000","message":"To avoid mocking get_network_info, just set instance.info_cache.network_info \u003d empty_nw_info on the test object.","commit_id":"9babe75fd8583bfb044b667ab4cab4dcaa1bf10f"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"64b49e1a4f8962b6f1ea173cebe677cbfb125aae","unresolved":false,"context_lines":[{"line_number":4850,"context_line":"    def test_terminate_instance_no_network_info(self, mock_nw_cache_info,"},{"line_number":4851,"context_line":"            mock_nw_api_info, mock_destroy, mock_bdms, mock_elevated):"},{"line_number":4852,"context_line":"        # Tests that we refresh the network info if it was empty"},{"line_number":4853,"context_line":"        instance \u003d fake_instance.fake_instance_obj("},{"line_number":4854,"context_line":"            self.context, vm_state\u003dvm_states.ACTIVE)"},{"line_number":4855,"context_line":"        vif \u003d fake_network_cache_model.new_vif()"},{"line_number":4856,"context_line":"        empty_nw_info \u003d network_model.NetworkInfo()"}],"source_content_type":"text/x-python","patch_set":6,"id":"9fb8cfa7_a6cc75bc","line":4853,"in_reply_to":"9fb8cfa7_b257d002","updated":"2019-06-07 16:33:17.000000000","message":"Done","commit_id":"9babe75fd8583bfb044b667ab4cab4dcaa1bf10f"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"110d0d1d7f4f59595eeb52404735db247c931059","unresolved":false,"context_lines":[{"line_number":4867,"context_line":"        self.compute._shutdown_instance(self.context, instance, bdms,"},{"line_number":4868,"context_line":"            notify\u003dFalse, try_deallocate_networks\u003dFalse)"},{"line_number":4869,"context_line":""},{"line_number":4870,"context_line":"        # Verify"},{"line_number":4871,"context_line":"        mock_nw_cache_info.assert_called_once()"},{"line_number":4872,"context_line":"        mock_nw_api_info.assert_called_once_with("},{"line_number":4873,"context_line":"            fake_elevated, instance)"}],"source_content_type":"text/x-python","patch_set":6,"id":"9fb8cfa7_b27ef068","line":4870,"updated":"2019-06-07 15:51:17.000000000","message":"You\u0027re not asserting anywhere that you\u0027re actually using the result of get_instance_nw_info and passing that along to the driver.destroy method, which is something I -1\u0027ed you for before. So what you should do is mock the driver.destroy method and assert that it\u0027s called with the results of get_instance_nw_info (so nw_info).","commit_id":"9babe75fd8583bfb044b667ab4cab4dcaa1bf10f"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"64b49e1a4f8962b6f1ea173cebe677cbfb125aae","unresolved":false,"context_lines":[{"line_number":4867,"context_line":"        self.compute._shutdown_instance(self.context, instance, bdms,"},{"line_number":4868,"context_line":"            notify\u003dFalse, try_deallocate_networks\u003dFalse)"},{"line_number":4869,"context_line":""},{"line_number":4870,"context_line":"        # Verify"},{"line_number":4871,"context_line":"        mock_nw_cache_info.assert_called_once()"},{"line_number":4872,"context_line":"        mock_nw_api_info.assert_called_once_with("},{"line_number":4873,"context_line":"            fake_elevated, instance)"}],"source_content_type":"text/x-python","patch_set":6,"id":"9fb8cfa7_c6cf29ae","line":4870,"in_reply_to":"9fb8cfa7_b27ef068","updated":"2019-06-07 16:33:17.000000000","message":"Done","commit_id":"9babe75fd8583bfb044b667ab4cab4dcaa1bf10f"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"59f76a4d261910c3b4efebdb0b2c83bdf0306d36","unresolved":false,"context_lines":[{"line_number":4862,"context_line":"                              return_value\u003dnw_info),"},{"line_number":4863,"context_line":"            mock.patch.object(self.compute, \u0027_get_instance_block_device_info\u0027),"},{"line_number":4864,"context_line":"            mock.patch.object(self.compute.driver, \u0027destroy\u0027)"},{"line_number":4865,"context_line":"        ) as ("},{"line_number":4866,"context_line":"            mock_nw_api_info, mock_get_bdi, mock_destroy"},{"line_number":4867,"context_line":"        ):"},{"line_number":4868,"context_line":"            self.compute._shutdown_instance(self.context, instance, bdms,"},{"line_number":4869,"context_line":"                notify\u003dFalse, try_deallocate_networks\u003dFalse)"},{"line_number":4870,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"9fb8cfa7_06e1c1d0","line":4867,"range":{"start_line":4865,"start_character":13,"end_line":4867,"end_character":10},"updated":"2019-06-07 16:38:37.000000000","message":"nit: one line","commit_id":"d6851decebc5f01fa35474c4e780591542df03c4"}],"nova/tests/unit/compute/test_compute_utils.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"daf8e93f60f91118638425a264b4f1fcc7a3bac9","unresolved":false,"context_lines":[{"line_number":420,"context_line":"        fake_network.set_stub_network_methods(self)"},{"line_number":421,"context_line":"        fake_server_actions.stub_out_action_events(self)"},{"line_number":422,"context_line":""},{"line_number":423,"context_line":"    @mock.patch(\u0027nova.network.neutronv2.api.API.get_instance_nw_info\u0027)"},{"line_number":424,"context_line":"    def test_notify_usage_exists(self, mock_nw_api_info):"},{"line_number":425,"context_line":"        mock_nw_api_info.return_value \u003d model.NetworkInfo([])"},{"line_number":426,"context_line":"        # Ensure \u0027exists\u0027 notification generates appropriate usage data."}],"source_content_type":"text/x-python","patch_set":3,"id":"bfb3d3c7_f5bd1fd8","line":423,"updated":"2019-05-24 15:30:43.000000000","message":"You could save yourself a lot of copy/paste by just doing the mock in the setUp of the test, something like this:\n\nmock_nw_api_info \u003d mock.patch(\n    \u0027nova.network.neutronv2.api.API.get_instance_nw_info\u0027,\n    return_value\u003dmodel.NetworkInfo([])\nmock_nw_api_info \u003d mock_nw_api_info.start()\nself.addCleanup(mock_nw_api_info.stop)","commit_id":"2d0a73b9840fb392d255961617d00dd79add04a2"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"110d0d1d7f4f59595eeb52404735db247c931059","unresolved":false,"context_lines":[{"line_number":60,"context_line":"def create_instance(context, user_id\u003d\u0027fake\u0027, project_id\u003d\u0027fake\u0027, params\u003dNone):"},{"line_number":61,"context_line":"    \"\"\"Create a test instance.\"\"\""},{"line_number":62,"context_line":"    flavor \u003d objects.Flavor.get_by_name(context, \u0027m1.tiny\u0027)"},{"line_number":63,"context_line":"    net_info \u003d model.NetworkInfo([])"},{"line_number":64,"context_line":"    info_cache \u003d objects.InstanceInfoCache(network_info\u003dnet_info)"},{"line_number":65,"context_line":"    inst \u003d objects.Instance(context\u003dcontext,"},{"line_number":66,"context_line":"                            image_ref\u003duuids.fake_image_ref,"}],"source_content_type":"text/x-python","patch_set":6,"id":"9fb8cfa7_724b982a","line":63,"updated":"2019-06-07 15:51:17.000000000","message":"We could avoid that mock below if we just put an actual vif in here. Would that break any other tests?","commit_id":"9babe75fd8583bfb044b667ab4cab4dcaa1bf10f"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"64b49e1a4f8962b6f1ea173cebe677cbfb125aae","unresolved":false,"context_lines":[{"line_number":60,"context_line":"def create_instance(context, user_id\u003d\u0027fake\u0027, project_id\u003d\u0027fake\u0027, params\u003dNone):"},{"line_number":61,"context_line":"    \"\"\"Create a test instance.\"\"\""},{"line_number":62,"context_line":"    flavor \u003d objects.Flavor.get_by_name(context, \u0027m1.tiny\u0027)"},{"line_number":63,"context_line":"    net_info \u003d model.NetworkInfo([])"},{"line_number":64,"context_line":"    info_cache \u003d objects.InstanceInfoCache(network_info\u003dnet_info)"},{"line_number":65,"context_line":"    inst \u003d objects.Instance(context\u003dcontext,"},{"line_number":66,"context_line":"                            image_ref\u003duuids.fake_image_ref,"}],"source_content_type":"text/x-python","patch_set":6,"id":"9fb8cfa7_46c5795a","line":63,"in_reply_to":"9fb8cfa7_724b982a","updated":"2019-06-07 16:33:17.000000000","message":"Done","commit_id":"9babe75fd8583bfb044b667ab4cab4dcaa1bf10f"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"110d0d1d7f4f59595eeb52404735db247c931059","unresolved":false,"context_lines":[{"line_number":404,"context_line":"        self.addCleanup(fake_notifier.reset)"},{"line_number":405,"context_line":""},{"line_number":406,"context_line":"        mock_nw_api_info_patcher \u003d mock.patch("},{"line_number":407,"context_line":"            \u0027nova.network.neutronv2.api.API.get_instance_nw_info\u0027,"},{"line_number":408,"context_line":"            return_value\u003dmodel.NetworkInfo([]))"},{"line_number":409,"context_line":"        self.mock_nw_api_info \u003d mock_nw_api_info_patcher.start()"},{"line_number":410,"context_line":"        self.addCleanup(mock_nw_api_info_patcher.stop)"}],"source_content_type":"text/x-python","patch_set":6,"id":"9fb8cfa7_d2f604fa","line":407,"range":{"start_line":407,"start_character":26,"end_line":407,"end_character":35},"updated":"2019-06-07 15:51:17.000000000","message":"Can we avoid mocking the neutronv2 specific API directly? IOW, can we just patch nova.network.base_api.NetworkAPI.get_instance_nw_info?","commit_id":"9babe75fd8583bfb044b667ab4cab4dcaa1bf10f"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"110d0d1d7f4f59595eeb52404735db247c931059","unresolved":false,"context_lines":[{"line_number":407,"context_line":"            \u0027nova.network.neutronv2.api.API.get_instance_nw_info\u0027,"},{"line_number":408,"context_line":"            return_value\u003dmodel.NetworkInfo([]))"},{"line_number":409,"context_line":"        self.mock_nw_api_info \u003d mock_nw_api_info_patcher.start()"},{"line_number":410,"context_line":"        self.addCleanup(mock_nw_api_info_patcher.stop)"},{"line_number":411,"context_line":""},{"line_number":412,"context_line":"        self.flags(compute_driver\u003d\u0027fake.FakeDriver\u0027,"},{"line_number":413,"context_line":"                   network_manager\u003d\u0027nova.network.manager.FlatManager\u0027)"}],"source_content_type":"text/x-python","patch_set":6,"id":"9fb8cfa7_329200a0","line":410,"updated":"2019-06-07 15:51:17.000000000","message":"This usually should come before the patcher.start() call.","commit_id":"9babe75fd8583bfb044b667ab4cab4dcaa1bf10f"}]}
