Skip to content

Commit 33fa92b

Browse files
sivakrishnan-intelnotartom
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
1 parent 45e2349 commit 33fa92b

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',
@@ -12318,7 +12319,7 @@ def test_live_migration_update_volume_xml(self, mock_xml,
1231812319
mock_updated_guest_xml,
1231912320
mock_migrateToURI3):
1232012321
self.compute = manager.ComputeManager()
12321-
instance_ref = self.test_instance
12322+
instance_ref = objects.Instance(**self.test_instance)
1232212323
target_connection = '127.0.0.2'
1232312324

1232412325
target_xml = self.device_xml_tmpl.format(
@@ -12487,7 +12488,7 @@ def test_live_migration_with_valid_target_connect_addr(self, mock_xml,
1248712488
mock_migrateToURI3,
1248812489
mock_min_version):
1248912490
self.compute = manager.ComputeManager()
12490-
instance_ref = self.test_instance
12491+
instance_ref = objects.Instance(**self.test_instance)
1249112492
target_connection = '127.0.0.2'
1249212493

1249312494
target_xml = self.device_xml_tmpl.format(
@@ -13102,6 +13103,33 @@ def test_block_live_migration_tunnelled_migrateToURI3(
1310213103
drvr._live_migration_uri(target_connection),
1310313104
params=params, flags=expected_flags)
1310413105

13106+
@mock.patch.object(host.Host, 'has_min_version', return_value=True)
13107+
@mock.patch.object(fakelibvirt.virDomain, "migrateToURI3")
13108+
@mock.patch('nova.virt.libvirt.migration.get_updated_guest_xml',
13109+
return_value='')
13110+
def test_live_migration_paused_instance_postcopy(self, mock_new_xml,
13111+
mock_migrateToURI3,
13112+
mock_min_version):
13113+
disk_paths = []
13114+
params = {'bandwidth': CONF.libvirt.live_migration_bandwidth}
13115+
migrate_data = objects.LibvirtLiveMigrateData(block_migration=False,
13116+
serial_listen_addr=False)
13117+
dom = fakelibvirt.virDomain
13118+
guest = libvirt_guest.Guest(dom)
13119+
drvr = libvirt_driver.LibvirtDriver(fake.FakeVirtAPI(), False)
13120+
drvr._parse_migration_flags()
13121+
instance = objects.Instance(**self.test_instance)
13122+
instance.vm_state = vm_states.PAUSED
13123+
13124+
drvr._live_migration_operation(self.context, instance, 'dest',
13125+
True, migrate_data, guest,
13126+
disk_paths)
13127+
13128+
# Verify VIR_MIGRATE_POSTCOPY flag was not set
13129+
self.assertEqual(drvr._live_migration_flags, 27)
13130+
mock_migrateToURI3.assert_called_once_with(
13131+
drvr._live_migration_uri('dest'), params=params, flags=27)
13132+
1310513133
@mock.patch.object(host.Host, 'has_min_version', return_value=True)
1310613134
@mock.patch.object(fakelibvirt.virDomain, "migrateToURI3")
1310713135
@mock.patch('nova.virt.libvirt.migration.get_updated_guest_xml',
@@ -13111,7 +13139,6 @@ def test_block_live_migration_native_tls(
1311113139
self, mock_old_xml, mock_new_xml,
1311213140
mock_migrateToURI3, mock_min_version):
1311313141
self.flags(live_migration_with_native_tls=True, group='libvirt')
13114-
1311513142
target_connection = None
1311613143
disk_paths = ['vda', 'vdb']
1311713144

nova/virt/libvirt/driver.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10211,6 +10211,17 @@ def _live_migration_operation(self, context, instance, dest,
1021110211
else:
1021210212
migration_flags = self._live_migration_flags
1021310213

10214+
# Note(siva_krishnan): live migrating paused instance fails
10215+
# when VIR_MIGRATE_POSTCOPY flag is set. It is unset here
10216+
# to permit live migration of paused instance.
10217+
if (
10218+
instance.vm_state == vm_states.PAUSED and
10219+
self._is_post_copy_enabled(migration_flags)
10220+
):
10221+
LOG.debug('Post-copy flag unset because instance is paused.',
10222+
instance=instance)
10223+
migration_flags ^= libvirt.VIR_MIGRATE_POSTCOPY
10224+
1021410225
if not migrate_data.serial_listen_addr:
1021510226
# In this context we want to ensure that serial console is
1021610227
# disabled on source node. This is because nova couldn't

0 commit comments

Comments
 (0)