Set 'old_flavor', 'new_flavor' on source before resize

Cross-cell resize is confusing. We need to set this information ahead of
time.

Change-Id: I5a403c072b9f03074882b552e1925f22cb5b15b6
Signed-off-by: Stephen Finucane <stephenfin@redhat.com>
Partial-Bug: #1879878
This commit is contained in:
Stephen Finucane 2020-09-07 11:27:30 +01:00
parent 27b37ed5c8
commit b2fbaa8767
3 changed files with 20 additions and 15 deletions

View File

@ -392,18 +392,23 @@ class PrepResizeAtSourceTask(base.TaskBase):
``resize_migrated`` and the migration.status will be ``post-migrating``.
"""
def __init__(self, context, instance, migration, request_spec,
compute_rpcapi, image_api):
def __init__(
self, context, instance, flavor, migration, request_spec,
compute_rpcapi, image_api,
):
"""Initializes this PrepResizeAtSourceTask instance.
:param context: nova auth context targeted at the source cell
:param instance: Instance object from the source cell
:param flavor: The new flavor if performing resize and not just a
cold migration
:param migration: Migration object from the source cell
:param request_spec: RequestSpec object for the resize operation
:param compute_rpcapi: instance of nova.compute.rpcapi.ComputeAPI
:param image_api: instance of nova.image.glance.API
"""
super(PrepResizeAtSourceTask, self).__init__(context, instance)
self.flavor = flavor
self.migration = migration
self.request_spec = request_spec
self.compute_rpcapi = compute_rpcapi
@ -416,6 +421,8 @@ class PrepResizeAtSourceTask(base.TaskBase):
# guest should be powered on.
self.instance.system_metadata['old_vm_state'] = self.instance.vm_state
self.instance.task_state = task_states.RESIZE_MIGRATING
self.instance.old_flavor = self.instance.flavor
self.instance.new_flavor = self.flavor
# If the instance is not volume-backed, create a snapshot of the root
# disk.
@ -782,7 +789,7 @@ class CrossCellMigrationTask(base.TaskBase):
LOG.debug('Preparing source host %s for cross-cell resize.',
self.source_migration.source_compute, instance=self.instance)
prep_source_task = PrepResizeAtSourceTask(
self.context, self.instance, self.source_migration,
self.context, self.instance, self.flavor, self.source_migration,
self.request_spec, self.compute_rpcapi, self.image_api)
snapshot_id = prep_source_task.execute()
self._completed_tasks['PrepResizeAtSourceTask'] = prep_source_task
@ -960,9 +967,6 @@ class ConfirmResizeTask(base.TaskBase):
ctxt, self.migration.uuid)
LOG.debug('Cleaning up source host %s for cross-cell resize confirm.',
source_migration.source_compute, instance=source_instance)
# The instance.old_flavor field needs to be set before the source
# host drops the MoveClaim in the ResourceTracker.
source_instance.old_flavor = source_instance.flavor
# Use the EventReport context manager to create the same event that
# the source compute will create but in the target cell DB so we do not
# have to explicitly copy it over from source to target DB.
@ -1303,7 +1307,6 @@ class RevertResizeTask(base.TaskBase):
# source cell instance for doing the revert on the source compute host.
instance.system_metadata['old_vm_state'] = (
self.instance.system_metadata.get('old_vm_state'))
instance.old_flavor = instance.flavor
instance.task_state = task_states.RESIZE_REVERTING
instance.save()

View File

@ -270,8 +270,7 @@ class TestCrossCell(integrated_helpers.ProviderUsageBaseTestCase):
def fake_cleanup(_self, _context, _instance, *args, **kwargs):
self.assertIsNotNone(_instance.old_flavor)
# FIXME(stephenfin): This should not be unset
self.assertIsNone(_instance.new_flavor)
self.assertIsNotNone(_instance.new_flavor)
return orig_cleanup(_self, _context, _instance, *args, **kwargs)
# TODO(stephenfin): Use a helper
@ -331,8 +330,7 @@ class TestCrossCell(integrated_helpers.ProviderUsageBaseTestCase):
def fake_finish_revert_migration(_self, _context, _instance, *a, **kw):
self.assertIsNotNone(_instance.old_flavor)
# FIXME(stephenfin): This should not be unset
self.assertIsNone(_instance.new_flavor)
self.assertIsNotNone(_instance.new_flavor)
return orig_finish_revert(_self, _context, _instance, *a, **kw)
# TODO(stephenfin): Use a helper

View File

@ -804,7 +804,10 @@ class PrepResizeAtSourceTaskTestCase(test.NoDBTestCase):
vm_state=vm_states.ACTIVE,
display_name='fake-server',
system_metadata={},
host='source.host.com'),
host='source.host.com',
flavor=objects.Flavor(),
),
objects.Flavor(),
objects.Migration(),
objects.RequestSpec(),
compute_rpcapi=mock.Mock(),
@ -828,6 +831,8 @@ class PrepResizeAtSourceTaskTestCase(test.NoDBTestCase):
# The instance should have been updated.
instance_save.assert_called_once_with(
expected_task_state=task_states.RESIZE_PREP)
self.assertIs(self.task.instance.old_flavor, self.task.instance.flavor)
self.assertIs(self.task.instance.new_flavor, self.task.flavor)
self.assertEqual(
task_states.RESIZE_MIGRATING, self.task.instance.task_state)
self.assertEqual(self.task.instance.vm_state,
@ -855,6 +860,8 @@ class PrepResizeAtSourceTaskTestCase(test.NoDBTestCase):
# The instance should have been updated.
instance_save.assert_called_once_with(
expected_task_state=task_states.RESIZE_PREP)
self.assertIs(self.task.instance.old_flavor, self.task.instance.flavor)
self.assertIs(self.task.instance.new_flavor, self.task.flavor)
self.assertEqual(
task_states.RESIZE_MIGRATING, self.task.instance.task_state)
self.assertEqual(self.task.instance.vm_state,
@ -1182,7 +1189,6 @@ class ConfirmResizeTaskTestCase(test.NoDBTestCase):
uuid=uuids.instance,
flavor=objects.Flavor())
self.task._cleanup_source_host(instance)
self.assertIs(instance.old_flavor, instance.flavor)
mock_action_start.assert_called_once_with(
instance._context, instance.uuid, instance_actions.CONFIRM_RESIZE,
want_result=False)
@ -1434,8 +1440,6 @@ class RevertResizeTaskTestCase(test.NoDBTestCase, ObjectComparatorMixin):
# Fields on the source cell instance should have been updated.
self.assertEqual(vm_states.ACTIVE,
source_cell_instance.system_metadata['old_vm_state'])
self.assertIs(source_cell_instance.old_flavor,
source_cell_instance.flavor)
self.assertEqual(task_states.RESIZE_REVERTING,
source_cell_instance.task_state)
mock_inst_save.assert_called_once_with()