Use migrate_data.block_migration instead of block_migration

Since nova can calculate block_migration we might end up with
a case where block_migration is None while migrate_data.block_migration
is True.

Both drivers that support block live migration, Libvirt and Xenapi,
use migrate_data.block_migration already, so we should switch to use
it everywhere, instead of in drivers only.

Change-Id: Iaa8aea3cb58ed0864a6a38d4a163649f52e32c5c
Closes-Bug: #1552303
This commit is contained in:
Pawel Koniszewski 2016-03-11 16:32:21 +01:00
parent 59a07f00ad
commit 4378b4fa43
6 changed files with 51 additions and 34 deletions

@ -5258,7 +5258,8 @@ class ComputeManager(manager.Manager):
migrate_data)
try:
if block_migration:
if ('block_migration' in migrate_data and
migrate_data.block_migration):
block_device_info = self._get_instance_block_device_info(
context, instance)
disk = self.driver.get_instance_disk_info(
@ -5372,7 +5373,7 @@ class ComputeManager(manager.Manager):
self._notify_about_instance_usage(
context, instance, 'live.migration.abort.end')
def _live_migration_cleanup_flags(self, block_migration, migrate_data):
def _live_migration_cleanup_flags(self, migrate_data):
"""Determine whether disks or instance path need to be cleaned up after
live migration (at source on success, at destination on rollback)
@ -5383,22 +5384,26 @@ class ComputeManager(manager.Manager):
newly created instance-xxx dir on the destination as a part of its
rollback process
:param block_migration: if true, it was a block migration
:param migrate_data: implementation specific data
:returns: (bool, bool) -- do_cleanup, destroy_disks
"""
# NOTE(angdraug): block migration wouldn't have been allowed if either
# block storage or instance path were shared
is_shared_block_storage = not block_migration
is_shared_instance_path = not block_migration
# NOTE(pkoniszewski): block migration specific params are set inside
# migrate_data objects for drivers that expose block live migration
# information (i.e. Libvirt and Xenapi). For other drivers cleanup is
# not needed.
is_shared_block_storage = True
is_shared_instance_path = True
if isinstance(migrate_data, migrate_data_obj.LibvirtLiveMigrateData):
is_shared_block_storage = migrate_data.is_shared_block_storage
is_shared_instance_path = migrate_data.is_shared_instance_path
elif isinstance(migrate_data, migrate_data_obj.XenapiLiveMigrateData):
is_shared_block_storage = not migrate_data.block_migration
is_shared_instance_path = not migrate_data.block_migration
# No instance booting at source host, but instance dir
# must be deleted for preparing next block migration
# must be deleted for preparing next live migration w/o shared storage
do_cleanup = block_migration or not is_shared_instance_path
do_cleanup = not is_shared_instance_path
destroy_disks = not is_shared_block_storage
return (do_cleanup, destroy_disks)
@ -5482,7 +5487,7 @@ class ComputeManager(manager.Manager):
instance, block_migration, dest)
do_cleanup, destroy_disks = self._live_migration_cleanup_flags(
block_migration, migrate_data)
migrate_data)
if do_cleanup:
LOG.debug('Calling driver.cleanup from _post_live_migration',
@ -5649,7 +5654,7 @@ class ComputeManager(manager.Manager):
"live_migration._rollback.start")
do_cleanup, destroy_disks = self._live_migration_cleanup_flags(
block_migration, migrate_data)
migrate_data)
if do_cleanup:
self.compute_rpcapi.rollback_live_migration_at_destination(

@ -5545,7 +5545,8 @@ class ComputeTestCase(BaseTestCase):
'source_type': 'volume',
'destination_type': 'volume'}))
]
migrate_data = migrate_data_obj.LiveMigrateData()
migrate_data = migrate_data_obj.XenapiLiveMigrateData(
block_migration=True)
# creating mocks
self.mox.StubOutWithMock(self.compute.driver,

@ -4503,7 +4503,7 @@ class ComputeManagerMigrationTestCase(test.NoDBTestCase):
compute._rollback_live_migration(self.context,
mock.MagicMock(),
'foo', False, {})
self.assertIsInstance(mock_lmcf.call_args_list[0][0][1],
self.assertIsInstance(mock_lmcf.call_args_list[0][0][0],
migrate_data_obj.LiveMigrateData)
_test()
@ -4744,7 +4744,7 @@ class ComputeManagerMigrationTestCase(test.NoDBTestCase):
is_shared_block_storage=False,
is_shared_instance_path=False)
do_cleanup, destroy_disks = self.compute._live_migration_cleanup_flags(
True, migrate_data)
migrate_data)
self.assertTrue(do_cleanup)
self.assertTrue(destroy_disks)
@ -4753,7 +4753,7 @@ class ComputeManagerMigrationTestCase(test.NoDBTestCase):
is_shared_block_storage=True,
is_shared_instance_path=False)
do_cleanup, destroy_disks = self.compute._live_migration_cleanup_flags(
False, migrate_data)
migrate_data)
self.assertTrue(do_cleanup)
self.assertFalse(destroy_disks)
@ -4762,7 +4762,7 @@ class ComputeManagerMigrationTestCase(test.NoDBTestCase):
is_shared_block_storage=False,
is_shared_instance_path=True)
do_cleanup, destroy_disks = self.compute._live_migration_cleanup_flags(
False, migrate_data)
migrate_data)
self.assertFalse(do_cleanup)
self.assertTrue(destroy_disks)
@ -4771,27 +4771,27 @@ class ComputeManagerMigrationTestCase(test.NoDBTestCase):
is_shared_block_storage=True,
is_shared_instance_path=True)
do_cleanup, destroy_disks = self.compute._live_migration_cleanup_flags(
False, migrate_data)
migrate_data)
self.assertFalse(do_cleanup)
self.assertFalse(destroy_disks)
def test_live_migration_cleanup_flags_block_migrate_xenapi(self):
migrate_data = objects.XenapiLiveMigrateData(block_migration=True)
do_cleanup, destroy_disks = self.compute._live_migration_cleanup_flags(
True, migrate_data)
migrate_data)
self.assertTrue(do_cleanup)
self.assertTrue(destroy_disks)
def test_live_migration_cleanup_flags_live_migrate_xenapi(self):
migrate_data = objects.XenapiLiveMigrateData(block_migration=False)
do_cleanup, destroy_disks = self.compute._live_migration_cleanup_flags(
False, migrate_data)
migrate_data)
self.assertFalse(do_cleanup)
self.assertFalse(destroy_disks)
def test_live_migration_cleanup_flags_live_migrate(self):
do_cleanup, destroy_disks = self.compute._live_migration_cleanup_flags(
False, {})
{})
self.assertFalse(do_cleanup)
self.assertFalse(destroy_disks)

@ -6889,7 +6889,8 @@ class LibvirtConnTestCase(test.NoDBTestCase):
graphics_listen_addr_spice='10.0.0.2',
serial_listen_addr='127.0.0.1',
target_connect_addr=None,
bdms=[])
bdms=[],
block_migration=False)
self.mox.ReplayAll()
self.assertRaises(fakelibvirt.libvirtError,
drvr._live_migration_operation,
@ -6926,7 +6927,8 @@ class LibvirtConnTestCase(test.NoDBTestCase):
migrate_data = objects.LibvirtLiveMigrateData(
serial_listen_addr='',
target_connect_addr=None,
bdms=[bdm])
bdms=[bdm],
block_migration=False)
drvr = libvirt_driver.LibvirtDriver(fake.FakeVirtAPI(), False)
test_mock = mock.MagicMock()
@ -6977,7 +6979,8 @@ class LibvirtConnTestCase(test.NoDBTestCase):
migrate_data = objects.LibvirtLiveMigrateData(
serial_listen_addr='',
target_connect_addr='127.0.0.2',
bdms=[bdm])
bdms=[bdm],
block_migration=False)
drvr = libvirt_driver.LibvirtDriver(fake.FakeVirtAPI(), False)
test_mock = mock.MagicMock()
@ -7186,7 +7189,8 @@ class LibvirtConnTestCase(test.NoDBTestCase):
graphics_listen_addr_spice='10.0.0.2',
serial_listen_addr='9.0.0.12',
target_connect_addr=None,
bdms=[])
bdms=[],
block_migration=False)
dom = fakelibvirt.virDomain
drvr = libvirt_driver.LibvirtDriver(fake.FakeVirtAPI(), False)
self.assertRaises(fakelibvirt.libvirtError,
@ -7208,7 +7212,8 @@ class LibvirtConnTestCase(test.NoDBTestCase):
CONF.set_override("enabled", True, "serial_console")
dom = fakelibvirt.virDomain
migrate_data = objects.LibvirtLiveMigrateData(
serial_listen_addr='', target_connect_addr=None)
serial_listen_addr='', target_connect_addr=None,
block_migration=False)
drvr = libvirt_driver.LibvirtDriver(fake.FakeVirtAPI(), False)
self.assertRaises(exception.MigrationError,
@ -7244,7 +7249,8 @@ class LibvirtConnTestCase(test.NoDBTestCase):
graphics_listen_addr_spice='0.0.0.0',
serial_listen_addr='127.0.0.1',
target_connect_addr=None,
bdms=[])
bdms=[],
block_migration=False)
self.mox.ReplayAll()
self.assertRaises(fakelibvirt.libvirtError,
drvr._live_migration_operation,
@ -7275,7 +7281,8 @@ class LibvirtConnTestCase(test.NoDBTestCase):
migrate_data = objects.LibvirtLiveMigrateData(
serial_listen_addr='',
target_connect_addr=None,
bdms=[])
bdms=[],
block_migration=False)
self.mox.ReplayAll()
self.assertRaises(fakelibvirt.libvirtError,
drvr._live_migration_operation,
@ -7305,7 +7312,8 @@ class LibvirtConnTestCase(test.NoDBTestCase):
graphics_listen_addr_spice='0.0.0.0',
serial_listen_addr='127.0.0.1',
target_connect_addr=None,
bdms=[])
bdms=[],
block_migration=False)
dom = fakelibvirt.virDomain
drvr = libvirt_driver.LibvirtDriver(fake.FakeVirtAPI(), False)
@ -7337,7 +7345,8 @@ class LibvirtConnTestCase(test.NoDBTestCase):
graphics_listen_addr_vnc='1.2.3.4',
graphics_listen_addr_spice='1.2.3.4',
serial_listen_addr='127.0.0.1',
target_connect_addr=None)
target_connect_addr=None,
block_migration=False)
self.mox.ReplayAll()
drvr = libvirt_driver.LibvirtDriver(fake.FakeVirtAPI(), False)
self.assertRaises(exception.MigrationError,
@ -7384,7 +7393,8 @@ class LibvirtConnTestCase(test.NoDBTestCase):
graphics_listen_addr_spice='127.0.0.1',
serial_listen_addr='127.0.0.1',
target_connect_addr=None,
bdms=[])
bdms=[],
block_migration=False)
self.mox.ReplayAll()
self.assertRaises(fakelibvirt.libvirtError,
drvr._live_migration_operation,
@ -7431,7 +7441,8 @@ class LibvirtConnTestCase(test.NoDBTestCase):
graphics_listen_addr_spice='127.0.0.1',
serial_listen_addr='127.0.0.1',
target_connect_addr=None,
bdms=[])
bdms=[],
block_migration=False)
drvr = libvirt_driver.LibvirtDriver(fake.FakeVirtAPI(), False)
self.mox.StubOutWithMock(
@ -8019,7 +8030,7 @@ class LibvirtConnTestCase(test.NoDBTestCase):
dom = fakelibvirt.Domain(drvr._get_connection(),
"<domain><name>demo</name></domain>", True)
guest = libvirt_guest.Guest(dom)
migrate_data = {}
migrate_data = objects.LibvirtLiveMigrateData(block_migration=True)
disks_to_copy = (['/some/path/one', '/test/path/two'],
['vda', 'vdb'])
mock_copy_disk_path.return_value = disks_to_copy

@ -663,7 +663,7 @@ class _VirtDriverTestCase(_FakeDriverBackendTestCase):
fake_context = context.RequestContext('fake', 'fake')
migration = objects.Migration(context=fake_context, id=1)
migrate_data = objects.LibvirtLiveMigrateData(
migration=migration, bdms=[])
migration=migration, bdms=[], block_migration=False)
self.connection.live_migration(self.ctxt, instance_ref, 'otherhost',
lambda *a: None, lambda *a: None,
migrate_data=migrate_data)

@ -5968,7 +5968,7 @@ class LibvirtDriver(driver.ComputeDriver):
guest = libvirt_guest.Guest(dom)
try:
if block_migration:
if migrate_data.block_migration:
migration_flags = self._block_migration_flags
else:
migration_flags = self._live_migration_flags
@ -6460,7 +6460,7 @@ class LibvirtDriver(driver.ComputeDriver):
disk_paths = []
device_names = []
if block_migration:
if migrate_data.block_migration:
disk_paths, device_names = self._live_migration_copy_disk_paths(
context, instance, guest)