From c97507dfcd57cce9d76670d3b0d48538900c00e9 Mon Sep 17 00:00:00 2001 From: alexc20 Date: Fri, 21 Oct 2022 17:09:39 -0300 Subject: [PATCH] record action log when deleting shelved instance Closes-Bug: #1993736 Change-Id: I9ce18cbba5083c55d15d9b7c2a89133d227754ea --- nova/compute/api.py | 2 ++ nova/tests/functional/test_instance_actions.py | 9 +++++++++ nova/tests/unit/compute/test_api.py | 13 ++++++++++--- 3 files changed, 21 insertions(+), 3 deletions(-) diff --git a/nova/compute/api.py b/nova/compute/api.py index c06fefdd3cf3..b2884543e594 100644 --- a/nova/compute/api.py +++ b/nova/compute/api.py @@ -2547,6 +2547,8 @@ class API: instance=instance) with nova_context.target_cell(context, cell) as cctxt: self._local_delete(cctxt, instance, bdms, delete_type, cb) + self._record_action_start(context, instance, + instance_actions.DELETE) except exception.InstanceNotFound: # NOTE(comstud): Race condition. Instance already gone. diff --git a/nova/tests/functional/test_instance_actions.py b/nova/tests/functional/test_instance_actions.py index c20b05345936..060133ce93ec 100644 --- a/nova/tests/functional/test_instance_actions.py +++ b/nova/tests/functional/test_instance_actions.py @@ -59,6 +59,15 @@ class InstanceActionsTestV221(InstanceActionsTestV21): self.assertEqual('delete', actions[0]['action']) self.assertEqual('create', actions[1]['action']) + def test_get_instance_actions_shelve_deleted(self): + server = self._create_server() + self._shelve_server(server) + self._delete_server(server) + actions = self.api.get_instance_actions(server['id']) + self.assertEqual('delete', actions[0]['action']) + self.assertEqual('shelve', actions[1]['action']) + self.assertEqual('create', actions[2]['action']) + class HypervisorError(Exception): """This is just used to make sure the exception type is in the events.""" diff --git a/nova/tests/unit/compute/test_api.py b/nova/tests/unit/compute/test_api.py index ca72474a4cb5..f17a767b9984 100644 --- a/nova/tests/unit/compute/test_api.py +++ b/nova/tests/unit/compute/test_api.py @@ -1254,10 +1254,12 @@ class _ComputeAPIUnitTestMixIn(object): @mock.patch('nova.objects.Instance.save') @mock.patch('nova.compute.utils.notify_about_instance_usage') @mock.patch('nova.objects.Service.get_by_compute_host') + @mock.patch('nova.compute.api.API._record_action_start') @mock.patch('nova.compute.api.API._local_delete') def test_delete_error_state_with_no_host( - self, mock_local_delete, mock_service_get, _mock_notify, - _mock_save, mock_bdm_get, mock_lookup, _mock_del_booting): + self, mock_local_delete, mock_record, mock_service_get, + _mock_notify, _mock_save, mock_bdm_get, mock_lookup, + _mock_del_booting): # Instance in error state with no host should be a local delete # for non API cells inst = self._create_instance_obj(params=dict(vm_state=vm_states.ERROR, @@ -1269,6 +1271,8 @@ class _ComputeAPIUnitTestMixIn(object): mock_local_delete.assert_called_once_with( self.context, inst, mock_bdm_get.return_value, 'delete', self.compute_api._do_delete) + mock_record.assert_called_once_with(self.context, inst, + instance_actions.DELETE) mock_terminate.assert_not_called() mock_service_get.assert_not_called() @@ -7905,8 +7909,9 @@ class ComputeAPIUnitTestCase(_ComputeAPIUnitTestMixIn, test.NoDBTestCase): @mock.patch.object(compute_utils, 'notify_about_instance_usage') @mock.patch.object(objects.BlockDeviceMapping, 'destroy') @mock.patch.object(objects.Instance, 'destroy') + @mock.patch('nova.compute.api.API._record_action_start') def _test_delete_volume_backed_instance( - self, vm_state, mock_instance_destroy, bdm_destroy, + self, vm_state, mock_record, mock_instance_destroy, bdm_destroy, notify_about_instance_usage, mock_save, mock_elevated, bdm_get_by_instance_uuid, mock_lookup, _mock_del_booting, notify_about_instance_action): @@ -7935,6 +7940,8 @@ class ComputeAPIUnitTestCase(_ComputeAPIUnitTestMixIn, test.NoDBTestCase): 'detach') as mock_detach: self.compute_api.delete(self.context, inst) + mock_record.assert_called_once_with(self.context, inst, + instance_actions.DELETE) mock_deallocate.assert_called_once_with(self.context, inst) mock_detach.assert_called_once_with(self.context, volume_id, inst.uuid)