driver.pre_live_migration migrate_data is always an object

The driver function pre_live_migration() has only 1 caller:
ComputeManager.pre_live_migration(), which always passes a
LiveMigrateData object to the driver. This is easy to prove as
ComputeManager.pre_live_migration() explicitly checks if migrate_data
is an object, and assigns it the return value of
LiveMigrateData.detect_implementation() if not.
detect_implementation() can only return a subclass of LiveMigrateData.
It will raise an exception if it is passed None.

This change removes handling of the case where migrate_data is None or
otherwise not a LiveMigrateData object from all driver implementations
of pre_live_migration().

Change-Id: I9d46019e06dc2b59f7b2ddf7c57c333809cbc94b
This commit is contained in:
Matthew Booth 2016-04-20 15:36:28 +01:00
parent b292bf3441
commit 824c8a31ff
10 changed files with 74 additions and 62 deletions

View File

@ -5148,7 +5148,7 @@ class ComputeManager(manager.Manager):
:param context: security context
:param instance: dict of instance data
:param block_migration: if true, prepare for block migration
:param migrate_data: if not None, it is a dict which holds data
:param migrate_data: A dict or LiveMigrateData object holding data
required for live migration without shared
storage.

View File

@ -68,6 +68,7 @@ from nova.network import model as network_model
from nova import objects
from nova.objects import block_device as block_device_obj
from nova.objects import fields
from nova.objects import migrate_data as migrate_data_obj
from nova.objects import virtual_interface as obj_vif
from nova.pci import manager as pci_manager
from nova.pci import utils as pci_utils
@ -9324,12 +9325,12 @@ class LibvirtConnTestCase(test.NoDBTestCase):
drvr.plug_vifs(mox.IsA(instance), nw_info)
self.mox.ReplayAll()
migrate_data = {
"block_migration": False,
"instance_relative_path": "foo",
"is_shared_block_storage": False,
"is_shared_instance_path": False,
}
migrate_data = migrate_data_obj.LibvirtLiveMigrateData(
block_migration=False,
instance_relative_path='foo',
is_shared_block_storage=False,
is_shared_instance_path=False,
)
result = drvr.pre_live_migration(
c, instance, vol, nw_info, None,
migrate_data=migrate_data)
@ -9397,12 +9398,14 @@ class LibvirtConnTestCase(test.NoDBTestCase):
instance = objects.Instance(**self.test_instance)
instance.config_drive = 'True'
migrate_data = migrate_data_obj.LibvirtLiveMigrateData(
is_shared_instance_path=False,
is_shared_block_storage=False,
block_migration=False,
instance_relative_path='foo',
)
res_data = drvr.pre_live_migration(
self.context, instance, vol, [], None,
{'is_shared_instance_path': False,
'is_shared_block_storage': False,
'block_migration': False,
'instance_relative_path': 'foo'})
self.context, instance, vol, [], None, migrate_data)
res_data = res_data.to_legacy_dict(pre_migration_result=True)
block_device_info_get_mapping.assert_called_once_with(
{'block_device_mapping': [
@ -9456,16 +9459,17 @@ class LibvirtConnTestCase(test.NoDBTestCase):
self.mox.StubOutWithMock(drvr, 'plug_vifs')
drvr.plug_vifs(mox.IsA(inst_ref), nw_info)
self.mox.ReplayAll()
migrate_data = {'is_shared_instance_path': False,
'is_shared_block_storage': False,
'is_volume_backed': True,
'block_migration': False,
'instance_relative_path': inst_ref['name'],
'disk_over_commit': False,
'disk_available_mb': 123,
'image_type': 'qcow2',
'filename': 'foo',
}
migrate_data = migrate_data_obj.LibvirtLiveMigrateData(
is_shared_instance_path=False,
is_shared_block_storage=False,
is_volume_backed=True,
block_migration=False,
instance_relative_path=inst_ref['name'],
disk_over_commit=False,
disk_available_mb=123,
image_type='qcow2',
filename='foo',
)
ret = drvr.pre_live_migration(c, inst_ref, vol, nw_info, None,
migrate_data)
target_ret = {
@ -9504,10 +9508,16 @@ class LibvirtConnTestCase(test.NoDBTestCase):
self.stubs.Set(eventlet.greenthread, 'sleep',
lambda x: eventlet.sleep(0))
disk_info_json = jsonutils.dumps({})
migrate_data = migrate_data_obj.LibvirtLiveMigrateData(
is_shared_block_storage=True,
is_shared_instance_path=True,
block_migration=False,
)
self.assertRaises(processutils.ProcessExecutionError,
drvr.pre_live_migration,
self.context, instance, block_device_info=None,
network_info=[], disk_info=disk_info_json)
network_info=[], disk_info=disk_info_json,
migrate_data=migrate_data)
def test_pre_live_migration_plug_vifs_retry_works(self):
self.flags(live_migration_retry_count=3)
@ -9526,8 +9536,14 @@ class LibvirtConnTestCase(test.NoDBTestCase):
self.stubs.Set(eventlet.greenthread, 'sleep',
lambda x: eventlet.sleep(0))
disk_info_json = jsonutils.dumps({})
migrate_data = migrate_data_obj.LibvirtLiveMigrateData(
is_shared_block_storage=True,
is_shared_instance_path=True,
block_migration=False,
)
drvr.pre_live_migration(self.context, instance, block_device_info=None,
network_info=[], disk_info=disk_info_json)
network_info=[], disk_info=disk_info_json,
migrate_data=migrate_data)
def test_pre_live_migration_image_not_created_with_shared_storage(self):
migrate_data_set = [{'is_shared_block_storage': False,
@ -9558,6 +9574,10 @@ class LibvirtConnTestCase(test.NoDBTestCase):
'image_type': 'qcow2',
'block_migration': True}]
def _to_obj(d):
return migrate_data_obj.LibvirtLiveMigrateData(**d)
migrate_data_set = map(_to_obj, migrate_data_set)
drvr = libvirt_driver.LibvirtDriver(fake.FakeVirtAPI(), False)
instance = objects.Instance(**self.test_instance)
# creating mocks
@ -9584,10 +9604,12 @@ class LibvirtConnTestCase(test.NoDBTestCase):
objects.LibvirtLiveMigrateData)
def test_pre_live_migration_with_not_shared_instance_path(self):
migrate_data = {'is_shared_block_storage': False,
'is_shared_instance_path': False,
'block_migration': False,
'instance_relative_path': 'foo'}
migrate_data = migrate_data_obj.LibvirtLiveMigrateData(
is_shared_block_storage=False,
is_shared_instance_path=False,
block_migration=False,
instance_relative_path='foo',
)
drvr = libvirt_driver.LibvirtDriver(fake.FakeVirtAPI(), False)
instance = objects.Instance(**self.test_instance)
@ -9622,10 +9644,12 @@ class LibvirtConnTestCase(test.NoDBTestCase):
def test_pre_live_migration_recreate_disk_info(self):
migrate_data = {'is_shared_block_storage': False,
'is_shared_instance_path': False,
'block_migration': True,
'instance_relative_path': '/some/path/'}
migrate_data = migrate_data_obj.LibvirtLiveMigrateData(
is_shared_block_storage=False,
is_shared_instance_path=False,
block_migration=True,
instance_relative_path='/some/path/',
)
disk_info = [{'disk_size': 5368709120, 'type': 'raw',
'virt_disk_size': 5368709120,
'path': '/some/path/disk',
@ -9662,7 +9686,12 @@ class LibvirtConnTestCase(test.NoDBTestCase):
drvr = libvirt_driver.LibvirtDriver(fake.FakeVirtAPI(), False)
drvr._supported_perf_events = ['cmt']
migrate_data = {}
migrate_data = migrate_data_obj.LibvirtLiveMigrateData(
is_shared_block_storage=False,
is_shared_instance_path=False,
block_migration=False,
instance_relative_path='foo',
)
instance = objects.Instance(**self.test_instance)

View File

@ -2232,10 +2232,11 @@ class VMwareAPIVMTestCase(test.NoDBTestCase):
self.assertEqual(2, len(ds_util._DS_DC_MAPPING))
def test_pre_live_migration(self):
migrate_data = objects.migrate_data.LiveMigrateData()
self.assertRaises(NotImplementedError,
self.conn.pre_live_migration, self.context,
'fake_instance', 'fake_block_device_info',
'fake_network_info', 'fake_disk_info')
'fake_network_info', 'fake_disk_info', migrate_data)
def test_live_migration(self):
self.assertRaises(NotImplementedError,

View File

@ -1417,11 +1417,6 @@ class LiveMigrateTestCase(VMOpsTestBase):
self.assertEqual(result.sr_uuid_map, sr_uuid_map)
mock_connect.assert_called_once_with("bdi")
def test_pre_live_migration_raises_with_no_data(self):
self.assertRaises(exception.InvalidParameterValue,
self.vmops.pre_live_migration,
None, None, "bdi", None, None, None)
class LiveMigrateFakeVersionTestCase(VMOpsTestBase):
@mock.patch.object(vmops.VMOps, '_pv_device_reported')

View File

@ -791,7 +791,7 @@ class ComputeDriver(object):
raise NotImplementedError()
def pre_live_migration(self, context, instance, block_device_info,
network_info, disk_info, migrate_data=None):
network_info, disk_info, migrate_data):
"""Prepare an instance for live migration
:param context: security context

View File

@ -502,7 +502,7 @@ class FakeDriver(driver.ComputeDriver):
return
def pre_live_migration(self, context, instance, block_device_info,
network_info, disk_info, migrate_data=None):
network_info, disk_info, migrate_data):
return
def unfilter_instance(self, instance, network_info):

View File

@ -236,7 +236,7 @@ class HyperVDriver(driver.ComputeDriver):
self.destroy(context, instance, network_info, block_device_info)
def pre_live_migration(self, context, instance, block_device_info,
network_info, disk_info, migrate_data=None):
network_info, disk_info, migrate_data):
self._livemigrationops.pre_live_migration(context, instance,
block_device_info,
network_info)

View File

@ -6367,25 +6367,16 @@ class LibvirtDriver(driver.ComputeDriver):
shutil.rmtree(instance_dir)
def pre_live_migration(self, context, instance, block_device_info,
network_info, disk_info, migrate_data=None):
network_info, disk_info, migrate_data):
"""Preparation live migration."""
if disk_info is not None:
disk_info = jsonutils.loads(disk_info)
# Steps for volume backed instance live migration w/o shared storage.
is_shared_block_storage = True
is_shared_instance_path = True
is_block_migration = True
if migrate_data:
if not isinstance(migrate_data, migrate_data_obj.LiveMigrateData):
obj = objects.LibvirtLiveMigrateData()
obj.from_legacy_dict(migrate_data)
migrate_data = obj
LOG.debug('migrate_data in pre_live_migration: %s', migrate_data,
instance=instance)
is_shared_block_storage = migrate_data.is_shared_block_storage
is_shared_instance_path = migrate_data.is_shared_instance_path
is_block_migration = migrate_data.block_migration
LOG.debug('migrate_data in pre_live_migration: %s', migrate_data,
instance=instance)
is_shared_block_storage = migrate_data.is_shared_block_storage
is_shared_instance_path = migrate_data.is_shared_instance_path
is_block_migration = migrate_data.block_migration
if not is_shared_instance_path:
instance_dir = libvirt_utils.get_instance_path_at_destination(

View File

@ -538,7 +538,7 @@ class XenAPIDriver(driver.ComputeDriver):
block_device_info)
def pre_live_migration(self, context, instance, block_device_info,
network_info, disk_info, migrate_data=None):
network_info, disk_info, migrate_data):
"""Preparation live migration.
:param block_device_info:

View File

@ -2375,10 +2375,6 @@ class VMOps(object):
def pre_live_migration(self, context, instance, block_device_info,
network_info, disk_info, migrate_data):
if migrate_data is None:
raise exception.InvalidParameterValue(
'XenAPI requires migrate data')
migrate_data.sr_uuid_map = self.connect_block_device_volumes(
block_device_info)
return migrate_data