Skip to content

Commit 0c68e3c

Browse files
authored
Merge pull request #67 from stackhpc/upstream/2023.1-2024-01-01
Synchronise 2023.1 with upstream
2 parents 41096f8 + 7583267 commit 0c68e3c

File tree

5 files changed

+66
-9
lines changed

5 files changed

+66
-9
lines changed

doc/source/admin/scheduling.rst

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1122,10 +1122,9 @@ scheduling.
11221122
Usage scenarios
11231123
~~~~~~~~~~~~~~~
11241124

1125-
Since allocation ratios can be set via nova configuration, host aggregate
1126-
metadata and the placement API, it can be confusing to know which should be
1127-
used. This really depends on your scenario. A few common scenarios are detailed
1128-
here.
1125+
Since allocation ratios can be set via nova configuration and the placement
1126+
API, it can be confusing to know which should be used. This really depends on
1127+
your scenario. A few common scenarios are detailed here.
11291128

11301129
1. When the deployer wants to **always** set an override value for a resource
11311130
on a compute node, the deployer should ensure that the

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',
@@ -12313,7 +12314,7 @@ def test_live_migration_update_volume_xml(self, mock_xml,
1231312314
mock_updated_guest_xml,
1231412315
mock_migrateToURI3):
1231512316
self.compute = manager.ComputeManager()
12316-
instance_ref = self.test_instance
12317+
instance_ref = objects.Instance(**self.test_instance)
1231712318
target_connection = '127.0.0.2'
1231812319

1231912320
target_xml = self.device_xml_tmpl.format(
@@ -12482,7 +12483,7 @@ def test_live_migration_with_valid_target_connect_addr(self, mock_xml,
1248212483
mock_migrateToURI3,
1248312484
mock_min_version):
1248412485
self.compute = manager.ComputeManager()
12485-
instance_ref = self.test_instance
12486+
instance_ref = objects.Instance(**self.test_instance)
1248612487
target_connection = '127.0.0.2'
1248712488

1248812489
target_xml = self.device_xml_tmpl.format(
@@ -13097,6 +13098,33 @@ def test_block_live_migration_tunnelled_migrateToURI3(
1309713098
drvr._live_migration_uri(target_connection),
1309813099
params=params, flags=expected_flags)
1309913100

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

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

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -710,6 +710,10 @@ def test_get_machine_type_from_image(self):
710710
os_mach_type = libvirt_utils.get_machine_type(image_meta)
711711
self.assertEqual('q35', os_mach_type)
712712

713+
def test_make_reverse_cpu_traits_mapping(self):
714+
for k in libvirt_utils.make_reverse_cpu_traits_mapping():
715+
self.assertIsInstance(k, str)
716+
713717
def test_get_flags_by_flavor_specs(self):
714718
flavor = objects.Flavor(
715719
id=1, flavorid='fakeid-1', name='fake1.small', memory_mb=128,
@@ -718,11 +722,15 @@ def test_get_flags_by_flavor_specs(self):
718722
'trait:%s' % os_traits.HW_CPU_X86_3DNOW: 'required',
719723
'trait:%s' % os_traits.HW_CPU_X86_SSE2: 'required',
720724
'trait:%s' % os_traits.HW_CPU_HYPERTHREADING: 'required',
725+
'trait:%s' % os_traits.HW_CPU_X86_INTEL_VMX: 'required',
726+
'trait:%s' % os_traits.HW_CPU_X86_VMX: 'required',
727+
'trait:%s' % os_traits.HW_CPU_X86_SVM: 'required',
728+
'trait:%s' % os_traits.HW_CPU_X86_AMD_SVM: 'required',
721729
})
722730
traits = libvirt_utils.get_flags_by_flavor_specs(flavor)
723731
# we shouldn't see the hyperthreading trait since that's a valid trait
724732
# but not a CPU flag
725-
self.assertEqual(set(['3dnow', 'sse2']), traits)
733+
self.assertEqual(set(['3dnow', 'sse2', 'vmx', 'svm']), traits)
726734

727735
@mock.patch('nova.virt.libvirt.utils.copy_image')
728736
@mock.patch('nova.privsep.path.chown')

nova/virt/libvirt/driver.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10152,6 +10152,17 @@ def _live_migration_operation(self, context, instance, dest,
1015210152
else:
1015310153
migration_flags = self._live_migration_flags
1015410154

10155+
# Note(siva_krishnan): live migrating paused instance fails
10156+
# when VIR_MIGRATE_POSTCOPY flag is set. It is unset here
10157+
# to permit live migration of paused instance.
10158+
if (
10159+
instance.vm_state == vm_states.PAUSED and
10160+
self._is_post_copy_enabled(migration_flags)
10161+
):
10162+
LOG.debug('Post-copy flag unset because instance is paused.',
10163+
instance=instance)
10164+
migration_flags ^= libvirt.VIR_MIGRATE_POSTCOPY
10165+
1015510166
if not migrate_data.serial_listen_addr:
1015610167
# In this context we want to ensure that serial console is
1015710168
# disabled on source node. This is because nova couldn't

nova/virt/libvirt/utils.py

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -103,8 +103,20 @@
103103
'xop': os_traits.HW_CPU_X86_XOP
104104
}
105105

106+
107+
def make_reverse_cpu_traits_mapping() -> ty.Dict[str, str]:
108+
traits_cpu_mapping = dict()
109+
for k, v in CPU_TRAITS_MAPPING.items():
110+
if isinstance(v, tuple):
111+
for trait in v:
112+
traits_cpu_mapping[trait] = k
113+
else:
114+
traits_cpu_mapping[v] = k
115+
return traits_cpu_mapping
116+
117+
106118
# Reverse CPU_TRAITS_MAPPING
107-
TRAITS_CPU_MAPPING = {v: k for k, v in CPU_TRAITS_MAPPING.items()}
119+
TRAITS_CPU_MAPPING = make_reverse_cpu_traits_mapping()
108120

109121
# global directory for emulated TPM
110122
VTPM_DIR = '/var/lib/libvirt/swtpm/'

0 commit comments

Comments
 (0)