Merge "Fix regression with live migration on shared storage"
This commit is contained in:
@@ -9205,7 +9205,9 @@ class ComputeManager(manager.Manager):
|
||||
# vpmem must be cleaned
|
||||
do_cleanup = (not migrate_data.is_shared_instance_path or
|
||||
has_vpmem or has_mdevs or power_management_possible)
|
||||
destroy_disks = not migrate_data.is_shared_block_storage
|
||||
destroy_disks = not (
|
||||
migrate_data.is_shared_block_storage or
|
||||
migrate_data.is_shared_instance_path)
|
||||
elif isinstance(migrate_data, migrate_data_obj.HyperVLiveMigrateData):
|
||||
# NOTE(claudiub): We need to cleanup any zombie Planned VM.
|
||||
do_cleanup = True
|
||||
|
||||
@@ -11380,7 +11380,7 @@ class ComputeManagerMigrationTestCase(test.NoDBTestCase,
|
||||
do_cleanup, destroy_disks = self.compute._live_migration_cleanup_flags(
|
||||
migrate_data, migr_ctxt)
|
||||
self.assertTrue(do_cleanup)
|
||||
self.assertTrue(destroy_disks)
|
||||
self.assertFalse(destroy_disks)
|
||||
|
||||
def test_live_migration_cleanup_flags_block_migrate_libvirt(self):
|
||||
migrate_data = objects.LibvirtLiveMigrateData(
|
||||
@@ -11407,7 +11407,7 @@ class ComputeManagerMigrationTestCase(test.NoDBTestCase,
|
||||
do_cleanup, destroy_disks = self.compute._live_migration_cleanup_flags(
|
||||
migrate_data)
|
||||
self.assertFalse(do_cleanup)
|
||||
self.assertTrue(destroy_disks)
|
||||
self.assertFalse(destroy_disks)
|
||||
|
||||
def test_live_migration_cleanup_flags_shared_libvirt(self):
|
||||
migrate_data = objects.LibvirtLiveMigrateData(
|
||||
@@ -11418,6 +11418,16 @@ class ComputeManagerMigrationTestCase(test.NoDBTestCase,
|
||||
self.assertFalse(do_cleanup)
|
||||
self.assertFalse(destroy_disks)
|
||||
|
||||
def test_live_migration_cleanup_flags_shared_path_libvirt_mdev(self):
|
||||
migrate_data = objects.LibvirtLiveMigrateData(
|
||||
is_shared_block_storage=False,
|
||||
is_shared_instance_path=True,
|
||||
target_mdevs={})
|
||||
do_cleanup, destroy_disks = self.compute._live_migration_cleanup_flags(
|
||||
migrate_data)
|
||||
self.assertTrue(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(
|
||||
{})
|
||||
|
||||
@@ -21006,7 +21006,8 @@ class LibvirtConnTestCase(test.NoDBTestCase,
|
||||
# is_shared_block_storage=True and destroy_disks=False.
|
||||
instance = objects.Instance(self.context, **self.test_instance)
|
||||
migrate_data = objects.LibvirtLiveMigrateData(
|
||||
is_shared_block_storage=True)
|
||||
is_shared_block_storage=True,
|
||||
is_shared_instance_path=False)
|
||||
drvr = libvirt_driver.LibvirtDriver(fake.FakeVirtAPI())
|
||||
drvr.cleanup(
|
||||
self.context, instance, network_info={}, destroy_disks=False,
|
||||
@@ -21016,6 +21017,25 @@ class LibvirtConnTestCase(test.NoDBTestCase,
|
||||
self.assertTrue(instance.cleaned)
|
||||
save.assert_called_once_with()
|
||||
|
||||
@mock.patch.object(libvirt_driver.LibvirtDriver, 'delete_instance_files',
|
||||
return_value=True)
|
||||
@mock.patch.object(objects.Instance, 'save')
|
||||
@mock.patch.object(libvirt_driver.LibvirtDriver, '_undefine_domain')
|
||||
def test_cleanup_migrate_data_block_storage_and_share_instance_dir(
|
||||
self, _undefine_domain, save, delete_instance_files
|
||||
):
|
||||
# Test the case when the instance directory is on shared storage
|
||||
# (e.g. NFS) and the instance is booted form volume.
|
||||
instance = objects.Instance(self.context, **self.test_instance)
|
||||
migrate_data = objects.LibvirtLiveMigrateData(
|
||||
is_shared_block_storage=True,
|
||||
is_shared_instance_path=True)
|
||||
drvr = libvirt_driver.LibvirtDriver(fake.FakeVirtAPI())
|
||||
drvr.cleanup(
|
||||
self.context, instance, network_info={}, destroy_disks=False,
|
||||
migrate_data=migrate_data, destroy_vifs=False)
|
||||
delete_instance_files.assert_not_called()
|
||||
|
||||
@mock.patch.object(libvirt_driver.LibvirtDriver, 'delete_instance_files',
|
||||
return_value=True)
|
||||
@mock.patch.object(objects.Instance, 'save')
|
||||
|
||||
@@ -1705,12 +1705,12 @@ class LibvirtDriver(driver.ComputeDriver):
|
||||
cleanup_instance_dir = True
|
||||
cleanup_instance_disks = True
|
||||
else:
|
||||
# NOTE(mdbooth): I think the theory here was that if this is a
|
||||
# migration with shared block storage then we need to delete the
|
||||
# instance directory because that's not shared. I'm pretty sure
|
||||
# this is wrong.
|
||||
# NOTE(mheler): For shared block storage we only need to clean up
|
||||
# the instance directory when it's not on a shared path.
|
||||
if migrate_data and 'is_shared_block_storage' in migrate_data:
|
||||
cleanup_instance_dir = migrate_data.is_shared_block_storage
|
||||
cleanup_instance_dir = (
|
||||
migrate_data.is_shared_block_storage and
|
||||
not migrate_data.is_shared_instance_path)
|
||||
|
||||
# NOTE(lyarwood): The following workaround allows operators to
|
||||
# ensure that non-shared instance directories are removed after an
|
||||
|
||||
@@ -0,0 +1,8 @@
|
||||
---
|
||||
fixes:
|
||||
- |
|
||||
Fixes a regression for live migration on shared storage that
|
||||
was removing the backing disk and instance folder during the
|
||||
cleanup of a virtual machine post live migration.
|
||||
`bug 2080436
|
||||
<https://bugs.launchpad.net/nova/+bug/2080436>`__ for details.
|
||||
Reference in New Issue
Block a user