Merge "Fix soft deleting vm fails after "nova resize" vm"
This commit is contained in:
commit
c815013b6b
|
@ -1982,6 +1982,18 @@ class API(base.Base):
|
||||||
|
|
||||||
if instance.vm_state == vm_states.RESIZED:
|
if instance.vm_state == vm_states.RESIZED:
|
||||||
self._confirm_resize_on_deleting(context, instance)
|
self._confirm_resize_on_deleting(context, instance)
|
||||||
|
# NOTE(neha_alhat): After confirm resize vm_state will become
|
||||||
|
# 'active' and task_state will be set to 'None'. But for soft
|
||||||
|
# deleting a vm, the _do_soft_delete callback requires
|
||||||
|
# task_state in 'SOFT_DELETING' status. So, we need to set
|
||||||
|
# task_state as 'SOFT_DELETING' again for soft_delete case.
|
||||||
|
# After confirm resize and before saving the task_state to
|
||||||
|
# "SOFT_DELETING", during the short window, user can submit
|
||||||
|
# soft delete vm request again and system will accept and
|
||||||
|
# process it without any errors.
|
||||||
|
if delete_type == 'soft_delete':
|
||||||
|
instance.task_state = instance_attrs['task_state']
|
||||||
|
instance.save()
|
||||||
|
|
||||||
is_local_delete = True
|
is_local_delete = True
|
||||||
try:
|
try:
|
||||||
|
|
|
@ -3915,7 +3915,8 @@ class ComputeManager(manager.Manager):
|
||||||
|
|
||||||
instance.vm_state = vm_state
|
instance.vm_state = vm_state
|
||||||
instance.task_state = None
|
instance.task_state = None
|
||||||
instance.save(expected_task_state=[None, task_states.DELETING])
|
instance.save(expected_task_state=[None, task_states.DELETING,
|
||||||
|
task_states.SOFT_DELETING])
|
||||||
|
|
||||||
self._notify_about_instance_usage(
|
self._notify_about_instance_usage(
|
||||||
context, instance, "resize.confirm.end",
|
context, instance, "resize.confirm.end",
|
||||||
|
|
|
@ -1051,6 +1051,13 @@ class _ComputeAPIUnitTestMixIn(object):
|
||||||
mock_confirm = self.useFixture(
|
mock_confirm = self.useFixture(
|
||||||
fixtures.MockPatchObject(rpcapi, 'confirm_resize')).mock
|
fixtures.MockPatchObject(rpcapi, 'confirm_resize')).mock
|
||||||
|
|
||||||
|
def _reset_task_state(context, instance, migration, src_host,
|
||||||
|
cast=False):
|
||||||
|
inst.update({'task_state': None})
|
||||||
|
|
||||||
|
# After confirm resize action, instance task_state is reset to None
|
||||||
|
mock_confirm.side_effect = _reset_task_state
|
||||||
|
|
||||||
is_shelved = inst.vm_state in (vm_states.SHELVED,
|
is_shelved = inst.vm_state in (vm_states.SHELVED,
|
||||||
vm_states.SHELVED_OFFLOADED)
|
vm_states.SHELVED_OFFLOADED)
|
||||||
if is_shelved:
|
if is_shelved:
|
||||||
|
@ -1093,6 +1100,17 @@ class _ComputeAPIUnitTestMixIn(object):
|
||||||
expected_record_calls.append(
|
expected_record_calls.append(
|
||||||
mock.call(self.context, inst,
|
mock.call(self.context, inst,
|
||||||
instance_actions.CONFIRM_RESIZE))
|
instance_actions.CONFIRM_RESIZE))
|
||||||
|
|
||||||
|
# After confirm resize action, instance task_state
|
||||||
|
# is reset to None, so is the expected value. But
|
||||||
|
# for soft delete, task_state will be again reset
|
||||||
|
# back to soft-deleting in the code to avoid status
|
||||||
|
# checking failure.
|
||||||
|
updates['task_state'] = None
|
||||||
|
if delete_type == 'soft_delete':
|
||||||
|
expected_save_calls.append(mock.call())
|
||||||
|
updates['task_state'] = 'soft-deleting'
|
||||||
|
|
||||||
if inst.host is not None:
|
if inst.host is not None:
|
||||||
mock_elevated.return_value = self.context
|
mock_elevated.return_value = self.context
|
||||||
expected_elevated_calls.append(mock.call())
|
expected_elevated_calls.append(mock.call())
|
||||||
|
@ -1238,6 +1256,9 @@ class _ComputeAPIUnitTestMixIn(object):
|
||||||
def test_delete_soft_with_down_host(self):
|
def test_delete_soft_with_down_host(self):
|
||||||
self._test_delete('soft_delete', host='down-host')
|
self._test_delete('soft_delete', host='down-host')
|
||||||
|
|
||||||
|
def test_delete_soft_in_resized(self):
|
||||||
|
self._test_delete('soft_delete', vm_state=vm_states.RESIZED)
|
||||||
|
|
||||||
def test_delete_soft(self):
|
def test_delete_soft(self):
|
||||||
self._test_delete('soft_delete')
|
self._test_delete('soft_delete')
|
||||||
|
|
||||||
|
|
|
@ -6947,6 +6947,9 @@ class ComputeManagerMigrationTestCase(test.NoDBTestCase):
|
||||||
self.migration,
|
self.migration,
|
||||||
self.instance.old_flavor,
|
self.instance.old_flavor,
|
||||||
self.migration.source_node)
|
self.migration.source_node)
|
||||||
|
mock_save.assert_called_with(expected_task_state=
|
||||||
|
[None, task_states.DELETING,
|
||||||
|
task_states.SOFT_DELETING])
|
||||||
|
|
||||||
do_confirm_resize()
|
do_confirm_resize()
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue