Merge "Refresh instance network info on deletion"
This commit is contained in:
commit
55da4e1305
|
@ -2569,6 +2569,12 @@ class ComputeManager(manager.Manager):
|
||||||
|
|
||||||
network_info = instance.get_network_info()
|
network_info = instance.get_network_info()
|
||||||
|
|
||||||
|
# NOTE(arnaudmorin) to avoid nova destroying the instance without
|
||||||
|
# unplugging the interface, refresh network_info if it is empty.
|
||||||
|
if not network_info:
|
||||||
|
network_info = self.network_api.get_instance_nw_info(
|
||||||
|
context, instance)
|
||||||
|
|
||||||
# NOTE(vish) get bdms before destroying the instance
|
# NOTE(vish) get bdms before destroying the instance
|
||||||
vol_bdms = [bdm for bdm in bdms if bdm.is_volume]
|
vol_bdms = [bdm for bdm in bdms if bdm.is_volume]
|
||||||
block_device_info = self._get_instance_block_device_info(
|
block_device_info = self._get_instance_block_device_info(
|
||||||
|
|
|
@ -4842,6 +4842,39 @@ class ComputeManagerUnitTestCase(test.NoDBTestCase,
|
||||||
mock_delete_instance.assert_called_once_with(
|
mock_delete_instance.assert_called_once_with(
|
||||||
self.context, instance, bdms)
|
self.context, instance, bdms)
|
||||||
|
|
||||||
|
@mock.patch('nova.context.RequestContext.elevated')
|
||||||
|
def test_terminate_instance_no_network_info(self, mock_elevated):
|
||||||
|
# Tests that we refresh the network info if it was empty
|
||||||
|
instance = fake_instance.fake_instance_obj(
|
||||||
|
self.context, vm_state=vm_states.ACTIVE)
|
||||||
|
empty_nw_info = network_model.NetworkInfo()
|
||||||
|
instance.info_cache = objects.InstanceInfoCache(
|
||||||
|
network_info=empty_nw_info)
|
||||||
|
vif = fake_network_cache_model.new_vif()
|
||||||
|
nw_info = network_model.NetworkInfo([vif])
|
||||||
|
bdms = objects.BlockDeviceMappingList()
|
||||||
|
elevated = context.get_admin_context()
|
||||||
|
mock_elevated.return_value = elevated
|
||||||
|
|
||||||
|
# Call shutdown instance
|
||||||
|
with test.nested(
|
||||||
|
mock.patch.object(self.compute.network_api, 'get_instance_nw_info',
|
||||||
|
return_value=nw_info),
|
||||||
|
mock.patch.object(self.compute, '_get_instance_block_device_info'),
|
||||||
|
mock.patch.object(self.compute.driver, 'destroy')
|
||||||
|
) as (
|
||||||
|
mock_nw_api_info, mock_get_bdi, mock_destroy
|
||||||
|
):
|
||||||
|
self.compute._shutdown_instance(self.context, instance, bdms,
|
||||||
|
notify=False, try_deallocate_networks=False)
|
||||||
|
|
||||||
|
# Verify
|
||||||
|
mock_nw_api_info.assert_called_once_with(elevated, instance)
|
||||||
|
mock_get_bdi.assert_called_once_with(elevated, instance, bdms=bdms)
|
||||||
|
# destroy should have been called with the refresh network_info
|
||||||
|
mock_destroy.assert_called_once_with(
|
||||||
|
elevated, instance, nw_info, mock_get_bdi.return_value)
|
||||||
|
|
||||||
@mock.patch('nova.compute.utils.notify_about_instance_action')
|
@mock.patch('nova.compute.utils.notify_about_instance_action')
|
||||||
@mock.patch.object(nova.compute.manager.ComputeManager,
|
@mock.patch.object(nova.compute.manager.ComputeManager,
|
||||||
'_notify_about_instance_usage')
|
'_notify_about_instance_usage')
|
||||||
|
|
|
@ -60,7 +60,7 @@ CONF = nova.conf.CONF
|
||||||
def create_instance(context, user_id='fake', project_id='fake', params=None):
|
def create_instance(context, user_id='fake', project_id='fake', params=None):
|
||||||
"""Create a test instance."""
|
"""Create a test instance."""
|
||||||
flavor = objects.Flavor.get_by_name(context, 'm1.tiny')
|
flavor = objects.Flavor.get_by_name(context, 'm1.tiny')
|
||||||
net_info = model.NetworkInfo([])
|
net_info = model.NetworkInfo([model.VIF(id=uuids.port_id)])
|
||||||
info_cache = objects.InstanceInfoCache(network_info=net_info)
|
info_cache = objects.InstanceInfoCache(network_info=net_info)
|
||||||
inst = objects.Instance(context=context,
|
inst = objects.Instance(context=context,
|
||||||
image_ref=uuids.fake_image_ref,
|
image_ref=uuids.fake_image_ref,
|
||||||
|
|
Loading…
Reference in New Issue