diff --git a/nova/compute/manager.py b/nova/compute/manager.py index ce928db93767..f1e744f3402c 100644 --- a/nova/compute/manager.py +++ b/nova/compute/manager.py @@ -684,21 +684,28 @@ class ComputeManager(manager.Manager): evacuated to another host. Check that the instances reported by the driver are still associated with this host. If they are not, destroy them, with the exception of instances which are in - the MIGRATING state. + the MIGRATING, RESIZE_MIGRATING, RESIZE_MIGRATED, RESIZE_FINISH + task state or RESIZED vm state. """ our_host = self.host filters = {'deleted': False} local_instances = self._get_instances_on_driver(context, filters) for instance in local_instances: if instance.host != our_host: - if instance.task_state in [task_states.MIGRATING]: + if (instance.task_state in [task_states.MIGRATING, + task_states.RESIZE_MIGRATING, + task_states.RESIZE_MIGRATED, + task_states.RESIZE_FINISH] + or instance.vm_state in [vm_states.RESIZED]): LOG.debug('Will not delete instance as its host (' '%(instance_host)s) is not equal to our ' - 'host (%(our_host)s) but its state is ' - '(%(task_state)s)', + 'host (%(our_host)s) but its task state is ' + '(%(task_state)s) and vm state is ' + '(%(vm_state)s)', {'instance_host': instance.host, 'our_host': our_host, - 'task_state': instance.task_state}, + 'task_state': instance.task_state, + 'vm_state': instance.vm_state}, instance=instance) continue LOG.info(_('Deleting instance as its host (' diff --git a/nova/tests/compute/test_compute_mgr.py b/nova/tests/compute/test_compute_mgr.py index 717c34f37e11..7d7a4e367ebc 100644 --- a/nova/tests/compute/test_compute_mgr.py +++ b/nova/tests/compute/test_compute_mgr.py @@ -1551,15 +1551,18 @@ class ComputeManagerUnitTestCase(test.NoDBTestCase): self._do_test_set_admin_password_driver_error( exc, vm_states.ACTIVE, None, expected_exception) - def test_init_host_with_partial_migration(self): + def _test_init_host_with_partial_migration(self, task_state=None, + vm_state=vm_states.ACTIVE): our_host = self.compute.host instance_1 = objects.Instance(self.context) instance_1.uuid = 'foo' - instance_1.task_state = task_states.MIGRATING + instance_1.task_state = task_state + instance_1.vm_state = vm_state instance_1.host = 'not-' + our_host instance_2 = objects.Instance(self.context) instance_2.uuid = 'bar' instance_2.task_state = None + instance_2.vm_state = vm_states.ACTIVE instance_2.host = 'not-' + our_host with contextlib.nested( @@ -1580,6 +1583,26 @@ class ComputeManagerUnitTestCase(test.NoDBTestCase): destroy.assert_called_once_with(self.context, instance_2, None, {}, True) + def test_init_host_with_partial_migration_migrating(self): + self._test_init_host_with_partial_migration( + task_state=task_states.MIGRATING) + + def test_init_host_with_partial_migration_resize_migrating(self): + self._test_init_host_with_partial_migration( + task_state=task_states.RESIZE_MIGRATING) + + def test_init_host_with_partial_migration_resize_migrated(self): + self._test_init_host_with_partial_migration( + task_state=task_states.RESIZE_MIGRATED) + + def test_init_host_with_partial_migration_finish_resize(self): + self._test_init_host_with_partial_migration( + task_state=task_states.RESIZE_FINISH) + + def test_init_host_with_partial_migration_resized(self): + self._test_init_host_with_partial_migration( + vm_state=vm_states.RESIZED) + @mock.patch('nova.compute.manager.ComputeManager._instance_update') def test_error_out_instance_on_exception_not_implemented_err(self, inst_update_mock):