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:
parent
27b37ed5c8
commit
b2fbaa8767
|
@ -392,18 +392,23 @@ class PrepResizeAtSourceTask(base.TaskBase):
|
||||||
``resize_migrated`` and the migration.status will be ``post-migrating``.
|
``resize_migrated`` and the migration.status will be ``post-migrating``.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
def __init__(self, context, instance, migration, request_spec,
|
def __init__(
|
||||||
compute_rpcapi, image_api):
|
self, context, instance, flavor, migration, request_spec,
|
||||||
|
compute_rpcapi, image_api,
|
||||||
|
):
|
||||||
"""Initializes this PrepResizeAtSourceTask instance.
|
"""Initializes this PrepResizeAtSourceTask instance.
|
||||||
|
|
||||||
:param context: nova auth context targeted at the source cell
|
:param context: nova auth context targeted at the source cell
|
||||||
:param instance: Instance object from 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 migration: Migration object from the source cell
|
||||||
:param request_spec: RequestSpec object for the resize operation
|
:param request_spec: RequestSpec object for the resize operation
|
||||||
:param compute_rpcapi: instance of nova.compute.rpcapi.ComputeAPI
|
:param compute_rpcapi: instance of nova.compute.rpcapi.ComputeAPI
|
||||||
:param image_api: instance of nova.image.glance.API
|
:param image_api: instance of nova.image.glance.API
|
||||||
"""
|
"""
|
||||||
super(PrepResizeAtSourceTask, self).__init__(context, instance)
|
super(PrepResizeAtSourceTask, self).__init__(context, instance)
|
||||||
|
self.flavor = flavor
|
||||||
self.migration = migration
|
self.migration = migration
|
||||||
self.request_spec = request_spec
|
self.request_spec = request_spec
|
||||||
self.compute_rpcapi = compute_rpcapi
|
self.compute_rpcapi = compute_rpcapi
|
||||||
|
@ -416,6 +421,8 @@ class PrepResizeAtSourceTask(base.TaskBase):
|
||||||
# guest should be powered on.
|
# guest should be powered on.
|
||||||
self.instance.system_metadata['old_vm_state'] = self.instance.vm_state
|
self.instance.system_metadata['old_vm_state'] = self.instance.vm_state
|
||||||
self.instance.task_state = task_states.RESIZE_MIGRATING
|
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
|
# If the instance is not volume-backed, create a snapshot of the root
|
||||||
# disk.
|
# disk.
|
||||||
|
@ -782,7 +789,7 @@ class CrossCellMigrationTask(base.TaskBase):
|
||||||
LOG.debug('Preparing source host %s for cross-cell resize.',
|
LOG.debug('Preparing source host %s for cross-cell resize.',
|
||||||
self.source_migration.source_compute, instance=self.instance)
|
self.source_migration.source_compute, instance=self.instance)
|
||||||
prep_source_task = PrepResizeAtSourceTask(
|
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)
|
self.request_spec, self.compute_rpcapi, self.image_api)
|
||||||
snapshot_id = prep_source_task.execute()
|
snapshot_id = prep_source_task.execute()
|
||||||
self._completed_tasks['PrepResizeAtSourceTask'] = prep_source_task
|
self._completed_tasks['PrepResizeAtSourceTask'] = prep_source_task
|
||||||
|
@ -960,9 +967,6 @@ class ConfirmResizeTask(base.TaskBase):
|
||||||
ctxt, self.migration.uuid)
|
ctxt, self.migration.uuid)
|
||||||
LOG.debug('Cleaning up source host %s for cross-cell resize confirm.',
|
LOG.debug('Cleaning up source host %s for cross-cell resize confirm.',
|
||||||
source_migration.source_compute, instance=source_instance)
|
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
|
# 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
|
# 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.
|
# 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.
|
# source cell instance for doing the revert on the source compute host.
|
||||||
instance.system_metadata['old_vm_state'] = (
|
instance.system_metadata['old_vm_state'] = (
|
||||||
self.instance.system_metadata.get('old_vm_state'))
|
self.instance.system_metadata.get('old_vm_state'))
|
||||||
instance.old_flavor = instance.flavor
|
|
||||||
instance.task_state = task_states.RESIZE_REVERTING
|
instance.task_state = task_states.RESIZE_REVERTING
|
||||||
instance.save()
|
instance.save()
|
||||||
|
|
||||||
|
|
|
@ -270,8 +270,7 @@ class TestCrossCell(integrated_helpers.ProviderUsageBaseTestCase):
|
||||||
|
|
||||||
def fake_cleanup(_self, _context, _instance, *args, **kwargs):
|
def fake_cleanup(_self, _context, _instance, *args, **kwargs):
|
||||||
self.assertIsNotNone(_instance.old_flavor)
|
self.assertIsNotNone(_instance.old_flavor)
|
||||||
# FIXME(stephenfin): This should not be unset
|
self.assertIsNotNone(_instance.new_flavor)
|
||||||
self.assertIsNone(_instance.new_flavor)
|
|
||||||
return orig_cleanup(_self, _context, _instance, *args, **kwargs)
|
return orig_cleanup(_self, _context, _instance, *args, **kwargs)
|
||||||
|
|
||||||
# TODO(stephenfin): Use a helper
|
# TODO(stephenfin): Use a helper
|
||||||
|
@ -331,8 +330,7 @@ class TestCrossCell(integrated_helpers.ProviderUsageBaseTestCase):
|
||||||
|
|
||||||
def fake_finish_revert_migration(_self, _context, _instance, *a, **kw):
|
def fake_finish_revert_migration(_self, _context, _instance, *a, **kw):
|
||||||
self.assertIsNotNone(_instance.old_flavor)
|
self.assertIsNotNone(_instance.old_flavor)
|
||||||
# FIXME(stephenfin): This should not be unset
|
self.assertIsNotNone(_instance.new_flavor)
|
||||||
self.assertIsNone(_instance.new_flavor)
|
|
||||||
return orig_finish_revert(_self, _context, _instance, *a, **kw)
|
return orig_finish_revert(_self, _context, _instance, *a, **kw)
|
||||||
|
|
||||||
# TODO(stephenfin): Use a helper
|
# TODO(stephenfin): Use a helper
|
||||||
|
|
|
@ -804,7 +804,10 @@ class PrepResizeAtSourceTaskTestCase(test.NoDBTestCase):
|
||||||
vm_state=vm_states.ACTIVE,
|
vm_state=vm_states.ACTIVE,
|
||||||
display_name='fake-server',
|
display_name='fake-server',
|
||||||
system_metadata={},
|
system_metadata={},
|
||||||
host='source.host.com'),
|
host='source.host.com',
|
||||||
|
flavor=objects.Flavor(),
|
||||||
|
),
|
||||||
|
objects.Flavor(),
|
||||||
objects.Migration(),
|
objects.Migration(),
|
||||||
objects.RequestSpec(),
|
objects.RequestSpec(),
|
||||||
compute_rpcapi=mock.Mock(),
|
compute_rpcapi=mock.Mock(),
|
||||||
|
@ -828,6 +831,8 @@ class PrepResizeAtSourceTaskTestCase(test.NoDBTestCase):
|
||||||
# The instance should have been updated.
|
# The instance should have been updated.
|
||||||
instance_save.assert_called_once_with(
|
instance_save.assert_called_once_with(
|
||||||
expected_task_state=task_states.RESIZE_PREP)
|
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(
|
self.assertEqual(
|
||||||
task_states.RESIZE_MIGRATING, self.task.instance.task_state)
|
task_states.RESIZE_MIGRATING, self.task.instance.task_state)
|
||||||
self.assertEqual(self.task.instance.vm_state,
|
self.assertEqual(self.task.instance.vm_state,
|
||||||
|
@ -855,6 +860,8 @@ class PrepResizeAtSourceTaskTestCase(test.NoDBTestCase):
|
||||||
# The instance should have been updated.
|
# The instance should have been updated.
|
||||||
instance_save.assert_called_once_with(
|
instance_save.assert_called_once_with(
|
||||||
expected_task_state=task_states.RESIZE_PREP)
|
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(
|
self.assertEqual(
|
||||||
task_states.RESIZE_MIGRATING, self.task.instance.task_state)
|
task_states.RESIZE_MIGRATING, self.task.instance.task_state)
|
||||||
self.assertEqual(self.task.instance.vm_state,
|
self.assertEqual(self.task.instance.vm_state,
|
||||||
|
@ -1182,7 +1189,6 @@ class ConfirmResizeTaskTestCase(test.NoDBTestCase):
|
||||||
uuid=uuids.instance,
|
uuid=uuids.instance,
|
||||||
flavor=objects.Flavor())
|
flavor=objects.Flavor())
|
||||||
self.task._cleanup_source_host(instance)
|
self.task._cleanup_source_host(instance)
|
||||||
self.assertIs(instance.old_flavor, instance.flavor)
|
|
||||||
mock_action_start.assert_called_once_with(
|
mock_action_start.assert_called_once_with(
|
||||||
instance._context, instance.uuid, instance_actions.CONFIRM_RESIZE,
|
instance._context, instance.uuid, instance_actions.CONFIRM_RESIZE,
|
||||||
want_result=False)
|
want_result=False)
|
||||||
|
@ -1434,8 +1440,6 @@ class RevertResizeTaskTestCase(test.NoDBTestCase, ObjectComparatorMixin):
|
||||||
# Fields on the source cell instance should have been updated.
|
# Fields on the source cell instance should have been updated.
|
||||||
self.assertEqual(vm_states.ACTIVE,
|
self.assertEqual(vm_states.ACTIVE,
|
||||||
source_cell_instance.system_metadata['old_vm_state'])
|
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,
|
self.assertEqual(task_states.RESIZE_REVERTING,
|
||||||
source_cell_instance.task_state)
|
source_cell_instance.task_state)
|
||||||
mock_inst_save.assert_called_once_with()
|
mock_inst_save.assert_called_once_with()
|
||||||
|
|
Loading…
Reference in New Issue