Merge "Resize should give guests a chance to shutdown"
This commit is contained in:
commit
c9768bb07e
|
@ -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)
|
||||
|
||||
|
|
|
@ -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):
|
||||
|
|
|
@ -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()
|
||||
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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)
|
||||
|
||||
|
|
Loading…
Reference in New Issue