Skip to content

Commit 787839f

Browse files
sivakrishnan-intelgibizer
authored andcommitted
Allow live migrate paused instance when post copy is enabled
Live migration of paused instance fails when VIR_MIGRATE_POSTCOPY flag is set. In this patch, the flag is unset to permit live migration of paused instance. Change-Id: Ib5cbc948cb953e35a22bcbb859976f0afddcb662 Closes-Bug: #1671011 (cherry picked from commit 33fa92b) (cherry picked from commit 989ee44) (cherry picked from commit 5db7a7b)
1 parent c36e0db commit 787839f

File tree

2 files changed

+41
-3
lines changed

2 files changed

+41
-3
lines changed

nova/tests/unit/virt/libvirt/test_driver.py

Lines changed: 30 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -694,6 +694,7 @@ def _create_test_instance():
694694
'numa_topology': None,
695695
'config_drive': None,
696696
'vm_mode': None,
697+
'vm_state': None,
697698
'kernel_id': None,
698699
'ramdisk_id': None,
699700
'os_type': 'linux',
@@ -12170,7 +12171,7 @@ def test_live_migration_update_volume_xml(self, mock_xml,
1217012171
mock_updated_guest_xml,
1217112172
mock_migrateToURI3):
1217212173
self.compute = manager.ComputeManager()
12173-
instance_ref = self.test_instance
12174+
instance_ref = objects.Instance(**self.test_instance)
1217412175
target_connection = '127.0.0.2'
1217512176

1217612177
target_xml = self.device_xml_tmpl.format(
@@ -12339,7 +12340,7 @@ def test_live_migration_with_valid_target_connect_addr(self, mock_xml,
1233912340
mock_migrateToURI3,
1234012341
mock_min_version):
1234112342
self.compute = manager.ComputeManager()
12342-
instance_ref = self.test_instance
12343+
instance_ref = objects.Instance(**self.test_instance)
1234312344
target_connection = '127.0.0.2'
1234412345

1234512346
target_xml = self.device_xml_tmpl.format(
@@ -12954,6 +12955,33 @@ def test_block_live_migration_tunnelled_migrateToURI3(
1295412955
drvr._live_migration_uri(target_connection),
1295512956
params=params, flags=expected_flags)
1295612957

12958+
@mock.patch.object(host.Host, 'has_min_version', return_value=True)
12959+
@mock.patch.object(fakelibvirt.virDomain, "migrateToURI3")
12960+
@mock.patch('nova.virt.libvirt.migration.get_updated_guest_xml',
12961+
return_value='')
12962+
def test_live_migration_paused_instance_postcopy(self, mock_new_xml,
12963+
mock_migrateToURI3,
12964+
mock_min_version):
12965+
disk_paths = []
12966+
params = {'bandwidth': CONF.libvirt.live_migration_bandwidth}
12967+
migrate_data = objects.LibvirtLiveMigrateData(block_migration=False,
12968+
serial_listen_addr=False)
12969+
dom = fakelibvirt.virDomain
12970+
guest = libvirt_guest.Guest(dom)
12971+
drvr = libvirt_driver.LibvirtDriver(fake.FakeVirtAPI(), False)
12972+
drvr._parse_migration_flags()
12973+
instance = objects.Instance(**self.test_instance)
12974+
instance.vm_state = vm_states.PAUSED
12975+
12976+
drvr._live_migration_operation(self.context, instance, 'dest',
12977+
True, migrate_data, guest,
12978+
disk_paths)
12979+
12980+
# Verify VIR_MIGRATE_POSTCOPY flag was not set
12981+
self.assertEqual(drvr._live_migration_flags, 27)
12982+
mock_migrateToURI3.assert_called_once_with(
12983+
drvr._live_migration_uri('dest'), params=params, flags=27)
12984+
1295712985
@mock.patch.object(host.Host, 'has_min_version', return_value=True)
1295812986
@mock.patch.object(fakelibvirt.virDomain, "migrateToURI3")
1295912987
@mock.patch('nova.virt.libvirt.migration.get_updated_guest_xml',
@@ -12963,7 +12991,6 @@ def test_block_live_migration_native_tls(
1296312991
self, mock_old_xml, mock_new_xml,
1296412992
mock_migrateToURI3, mock_min_version):
1296512993
self.flags(live_migration_with_native_tls=True, group='libvirt')
12966-
1296712994
target_connection = None
1296812995
disk_paths = ['vda', 'vdb']
1296912996

nova/virt/libvirt/driver.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10115,6 +10115,17 @@ def _live_migration_operation(self, context, instance, dest,
1011510115
else:
1011610116
migration_flags = self._live_migration_flags
1011710117

10118+
# Note(siva_krishnan): live migrating paused instance fails
10119+
# when VIR_MIGRATE_POSTCOPY flag is set. It is unset here
10120+
# to permit live migration of paused instance.
10121+
if (
10122+
instance.vm_state == vm_states.PAUSED and
10123+
self._is_post_copy_enabled(migration_flags)
10124+
):
10125+
LOG.debug('Post-copy flag unset because instance is paused.',
10126+
instance=instance)
10127+
migration_flags ^= libvirt.VIR_MIGRATE_POSTCOPY
10128+
1011810129
if not migrate_data.serial_listen_addr:
1011910130
# In this context we want to ensure that serial console is
1012010131
# disabled on source node. This is because nova couldn't

0 commit comments

Comments
 (0)