diff --git a/nova/compute/api.py b/nova/compute/api.py index c1b5ac3795e..531aa441488 100644 --- a/nova/compute/api.py +++ b/nova/compute/api.py @@ -880,8 +880,12 @@ def _delete(self, context, instance): if instance['vm_state'] == vm_states.RESIZED: # If in the middle of a resize, use confirm_resize to # ensure the original instance is cleaned up too - migration_ref = self.db.migration_get_by_instance_and_status( - context, instance['uuid'], 'finished') + get_migration = self.db.migration_get_by_instance_and_status + try: + migration_ref = get_migration(context.elevated(), + instance['uuid'], 'finished') + except exception.MigrationNotFoundByStatus: + migration_ref = None if migration_ref: src_host = migration_ref['source_compute'] # Call since this can race with the terminate_instance. diff --git a/nova/tests/compute/test_compute.py b/nova/tests/compute/test_compute.py index a78bdd65e29..3687c683f7b 100644 --- a/nova/tests/compute/test_compute.py +++ b/nova/tests/compute/test_compute.py @@ -2986,6 +2986,19 @@ def test_delete(self): db.instance_destroy(self.context, instance['uuid']) + def test_delete_in_resized(self): + instance, instance_uuid = self._run_instance(params={ + 'host': FLAGS.host}) + + instance['vm_state'] = vm_states.RESIZED + + self.compute_api.delete(self.context, instance) + + instance = db.instance_get_by_uuid(self.context, instance_uuid) + self.assertEqual(instance['task_state'], task_states.DELETING) + + db.instance_destroy(self.context, instance['uuid']) + def test_repeated_delete_quota(self): in_use = {'instances': 1}