Merge "Resize should give guests a chance to shutdown"

This commit is contained in:
Jenkins 2014-08-20 19:02:49 +00:00 committed by Gerrit Code Review
commit c9768bb07e
8 changed files with 41 additions and 14 deletions

View File

@ -3576,7 +3576,8 @@ class ComputeManager(manager.Manager):
@errors_out_migration
@wrap_instance_fault
def resize_instance(self, context, instance, image,
reservations, migration, instance_type):
reservations, migration, instance_type,
clean_shutdown=True):
"""Starts the migration of a running instance to another host."""
quotas = quotas_obj.Quotas.from_reservations(context,
@ -3604,10 +3605,13 @@ class ComputeManager(manager.Manager):
block_device_info = self._get_instance_block_device_info(
context, instance, bdms=bdms)
timeout, retry_interval = self._get_power_off_values(context,
instance, clean_shutdown)
disk_info = self.driver.migrate_disk_and_power_off(
context, instance, migration.dest_host,
instance_type, network_info,
block_device_info)
block_device_info,
timeout, retry_interval)
self._terminate_volume_connections(context, instance, bdms)

View File

@ -4884,7 +4884,7 @@ class ComputeTestCase(BaseTestCase):
self.compute.terminate_instance(self.context,
self._objectify(instance), [], [])
def test_resize_instance(self):
def _test_resize_instance(self, clean_shutdown=True):
# Ensure instance can be migrated/resized.
instance = self._create_fake_instance_obj()
instance_type = flavors.get_default_flavor()
@ -4918,20 +4918,31 @@ class ComputeTestCase(BaseTestCase):
mock.patch.object(
self.compute, '_get_instance_block_device_info',
return_value='fake_bdinfo'),
mock.patch.object(self.compute, '_terminate_volume_connections')
mock.patch.object(self.compute, '_terminate_volume_connections'),
mock.patch.object(self.compute, '_get_power_off_values',
return_value=(1, 2))
) as (mock_get_by_inst_uuid, mock_get_instance_vol_bdinfo,
mock_terminate_vol_conn):
mock_terminate_vol_conn, mock_get_power_off_values):
self.compute.resize_instance(self.context, instance=instance,
migration=migration, image={}, reservations=[],
instance_type=jsonutils.to_primitive(instance_type))
instance_type=jsonutils.to_primitive(instance_type),
clean_shutdown=clean_shutdown)
mock_get_instance_vol_bdinfo.assert_called_once_with(
self.context, instance, bdms='fake_bdms')
mock_terminate_vol_conn.assert_called_once_with(self.context,
instance, 'fake_bdms')
mock_get_power_off_values.assert_caleld_once_with(self.context,
instance, clean_shutdown)
self.assertEqual(migration.dest_compute, instance.host)
self.compute.terminate_instance(self.context,
self._objectify(instance), [], [])
def test_resize_instance(self):
self._test_resize_instance()
def test_resize_instance_forced_shutdown(self):
self._test_resize_instance(clean_shutdown=False)
def _test_confirm_resize(self, power_on):
# Common test case method for confirm_resize
def fake(*args, **kwargs):

View File

@ -464,11 +464,15 @@ class ComputeDriver(object):
def migrate_disk_and_power_off(self, context, instance, dest,
flavor, network_info,
block_device_info=None):
block_device_info=None,
timeout=0, retry_interval=0):
"""Transfers the disk of a running instance in multiple phases, turning
off the instance before the end.
:param instance: nova.objects.instance.Instance
:param timeout: time to wait for GuestOS to shutdown
:param retry_interval: How often to signal guest while
waiting for it to shutdown
"""
raise NotImplementedError()

View File

@ -171,7 +171,8 @@ class FakeDriver(driver.ComputeDriver):
def migrate_disk_and_power_off(self, context, instance, dest,
flavor, network_info,
block_device_info=None):
block_device_info=None,
timeout=0, retry_interval=0):
pass
def finish_revert_migration(self, context, instance, network_info,

View File

@ -187,7 +187,9 @@ class HyperVDriver(driver.ComputeDriver):
def migrate_disk_and_power_off(self, context, instance, dest,
flavor, network_info,
block_device_info=None):
block_device_info=None,
timeout=0, retry_interval=0):
# TODO(PhilDay): Add support for timeout (clean shutdown)
return self._migrationops.migrate_disk_and_power_off(context,
instance, dest,
flavor,

View File

@ -5295,9 +5295,10 @@ class LibvirtDriver(driver.ComputeDriver):
def migrate_disk_and_power_off(self, context, instance, dest,
flavor, network_info,
block_device_info=None):
block_device_info=None,
timeout=0, retry_interval=0):
LOG.debug("Starting migrate_disk_and_power_off",
instance=instance)
instance=instance)
# Checks if the migration needs a disk resize down.
for kind in ('root_gb', 'ephemeral_gb'):
@ -5329,7 +5330,7 @@ class LibvirtDriver(driver.ComputeDriver):
if not shared_storage:
utils.execute('ssh', dest, 'mkdir', '-p', inst_base)
self.power_off(instance)
self.power_off(instance, timeout, retry_interval)
block_device_mapping = driver.block_device_info_get_mapping(
block_device_info)

View File

@ -230,10 +230,12 @@ class VMwareVCDriver(driver.ComputeDriver):
def migrate_disk_and_power_off(self, context, instance, dest,
flavor, network_info,
block_device_info=None):
block_device_info=None,
timeout=0, retry_interval=0):
"""Transfers the disk of a running instance in multiple phases, turning
off the instance before the end.
"""
# TODO(PhilDay): Add support for timeout (clean shutdown)
_vmops = self._get_vmops_for_compute_node(instance['node'])
return _vmops.migrate_disk_and_power_off(context, instance,
dest, flavor)

View File

@ -269,11 +269,13 @@ class XenAPIDriver(driver.ComputeDriver):
def migrate_disk_and_power_off(self, context, instance, dest,
flavor, network_info,
block_device_info=None):
block_device_info=None,
timeout=0, retry_interval=0):
"""Transfers the VHD of a running instance to another host, then shuts
off the instance copies over the COW disk
"""
# NOTE(vish): Xen currently does not use network info.
# TODO(PhilDay): Add support for timeout (clean shutdown)
return self._vmops.migrate_disk_and_power_off(context, instance,
dest, flavor, block_device_info)