diff --git a/nova/compute/manager.py b/nova/compute/manager.py index c9906a5e2aa3..73167929a861 100644 --- a/nova/compute/manager.py +++ b/nova/compute/manager.py @@ -4378,11 +4378,19 @@ class ComputeManager(manager.Manager): self.network_api.cleanup_instance_network_on_host(context, instance, instance.host) network_info = self.network_api.get_instance_nw_info(context, instance) + bdms = objects.BlockDeviceMappingList.get_by_instance_uuid( + context, instance.uuid) + block_device_info = self._get_instance_block_device_info(context, - instance) + instance, + bdms=bdms) self.driver.destroy(context, instance, network_info, block_device_info) + # the instance is going to be removed from the host so we want to + # terminate all the connections with the volume server and the host + self._terminate_volume_connections(context, instance, bdms) + instance.power_state = current_power_state # NOTE(mriedem): The vm_state has to be set before updating the # resource tracker, see vm_states.ALLOW_RESOURCE_REMOVAL. The host/node diff --git a/nova/tests/unit/compute/test_shelve.py b/nova/tests/unit/compute/test_shelve.py index 66928b3564bf..af5319ef9f09 100644 --- a/nova/tests/unit/compute/test_shelve.py +++ b/nova/tests/unit/compute/test_shelve.py @@ -47,6 +47,8 @@ def _fake_resources(): class ShelveComputeManagerTestCase(test_compute.BaseTestCase): + @mock.patch.object(nova.compute.manager.ComputeManager, + '_terminate_volume_connections') @mock.patch.object(nova.virt.fake.SmallFakeDriver, 'power_off') @mock.patch.object(nova.virt.fake.SmallFakeDriver, 'snapshot') @mock.patch.object(nova.compute.manager.ComputeManager, '_get_power_state') @@ -55,7 +57,7 @@ class ShelveComputeManagerTestCase(test_compute.BaseTestCase): @mock.patch('nova.compute.utils.notify_about_instance_action') def _shelve_instance(self, shelved_offload_time, mock_notify, mock_notify_instance_usage, mock_get_power_state, - mock_snapshot, mock_power_off, + mock_snapshot, mock_power_off, mock_terminate, clean_shutdown=True): mock_get_power_state.return_value = 123 @@ -159,6 +161,9 @@ class ShelveComputeManagerTestCase(test_compute.BaseTestCase): 'fake_image_id', mock.ANY) mock_get_power_state.assert_has_calls(mock_get_power_state_call_list) + if CONF.shelved_offload_time == 0: + self.assertTrue(mock_terminate.called) + def test_shelve(self): self._shelve_instance(-1) @@ -179,6 +184,8 @@ class ShelveComputeManagerTestCase(test_compute.BaseTestCase): instance = self._shelve_offload(clean_shutdown=False) mock_power_off.assert_called_once_with(instance, 0, 0) + @mock.patch.object(nova.compute.manager.ComputeManager, + '_terminate_volume_connections') @mock.patch('nova.compute.resource_tracker.ResourceTracker.' 'delete_allocation_for_shelve_offloaded_instance') @mock.patch.object(nova.compute.manager.ComputeManager, @@ -190,7 +197,8 @@ class ShelveComputeManagerTestCase(test_compute.BaseTestCase): @mock.patch('nova.compute.utils.notify_about_instance_action') def _shelve_offload(self, mock_notify, mock_notify_instance_usage, mock_get_power_state, mock_update_resource_tracker, - mock_delete_alloc, clean_shutdown=True): + mock_delete_alloc, mock_terminate, + clean_shutdown=True): host = 'fake-mini' instance = self._create_fake_instance_obj(params={'host': host}) instance.task_state = task_states.SHELVING @@ -208,6 +216,7 @@ class ShelveComputeManagerTestCase(test_compute.BaseTestCase): self.assertEqual(vm_states.SHELVED_OFFLOADED, instance.vm_state) self.assertIsNone(instance.task_state) + self.assertTrue(mock_terminate.called) # prepare expect call lists mock_notify_instance_usage_call_list = [