Merge "Support old & new versions of svm and vmx traits"

This commit is contained in:
Zuul
2020-09-11 14:10:00 +00:00
committed by Gerrit Code Review
3 changed files with 37 additions and 18 deletions
@@ -81,7 +81,10 @@ class LibvirtReportTraitsTests(LibvirtReportTraitsTestBase):
# trait values are coming from fakelibvirt's baselineCPU result. # trait values are coming from fakelibvirt's baselineCPU result.
# COMPUTE_NODE is always set on the compute node provider. # COMPUTE_NODE is always set on the compute node provider.
traits = self._get_provider_traits(self.host_uuid) traits = self._get_provider_traits(self.host_uuid)
for trait in ('HW_CPU_X86_VMX', 'HW_CPU_X86_AESNI', 'COMPUTE_NODE'): for trait in (
'HW_CPU_X86_VMX', 'HW_CPU_X86_INTEL_VMX', 'HW_CPU_X86_AESNI',
'COMPUTE_NODE',
):
self.assertIn(trait, traits) self.assertIn(trait, traits)
self._create_trait('CUSTOM_TRAITS') self._create_trait('CUSTOM_TRAITS')
@@ -96,10 +99,14 @@ class LibvirtReportTraitsTests(LibvirtReportTraitsTestBase):
# and it's not in the baseline for the host. # and it's not in the baseline for the host.
traits = set(self._get_provider_traits(self.host_uuid)) traits = set(self._get_provider_traits(self.host_uuid))
expected_traits = self.expected_libvirt_driver_capability_traits.union( expected_traits = self.expected_libvirt_driver_capability_traits.union(
[u'HW_CPU_X86_VMX', u'HW_CPU_X86_AESNI', u'CUSTOM_TRAITS', [
# The periodic restored the COMPUTE_NODE trait. 'HW_CPU_X86_VMX',
u'COMPUTE_NODE'] 'HW_CPU_X86_INTEL_VMX',
) 'HW_CPU_X86_AESNI',
'CUSTOM_TRAITS',
# The periodic restored the COMPUTE_NODE trait.
'COMPUTE_NODE',
])
for trait in expected_traits: for trait in expected_traits:
self.assertIn(trait, traits) self.assertIn(trait, traits)
+11 -7
View File
@@ -21101,7 +21101,7 @@ class TestUpdateProviderTree(test.NoDBTestCase):
pcpus = 12 pcpus = 12
memory_mb = 1024 memory_mb = 1024
disk_gb = 200 disk_gb = 200
cpu_traits = {t: False for t in libvirt_utils.CPU_TRAITS_MAPPING.values()} cpu_traits = libvirt_utils.cpu_features_to_traits({})
def setUp(self): def setUp(self):
super(TestUpdateProviderTree, self).setUp() super(TestUpdateProviderTree, self).setUp()
@@ -21816,7 +21816,7 @@ class TraitsComparisonMixin(object):
def assertTraitsEqual(self, expected, actual): def assertTraitsEqual(self, expected, actual):
exp = {t: t in expected exp = {t: t in expected
for t in libvirt_utils.CPU_TRAITS_MAPPING.values()} for t in libvirt_utils.cpu_features_to_traits({})}
self.assertEqual(exp, actual) self.assertEqual(exp, actual)
@@ -25538,8 +25538,9 @@ class LibvirtDriverTestCase(test.NoDBTestCase, TraitsComparisonMixin):
are calculated from fakelibvirt's baseline CPU features. are calculated from fakelibvirt's baseline CPU features.
""" """
self.flags(cpu_mode='host-passthrough', group='libvirt') self.flags(cpu_mode='host-passthrough', group='libvirt')
self.assertTraitsEqual(['HW_CPU_X86_AESNI', 'HW_CPU_X86_VMX'], self.assertTraitsEqual(
self.drvr._get_cpu_feature_traits()) ['HW_CPU_X86_AESNI', 'HW_CPU_X86_VMX', 'HW_CPU_X86_INTEL_VMX'],
self.drvr._get_cpu_feature_traits())
@mock.patch('nova.virt.libvirt.host.libvirt.Connection.baselineCPU') @mock.patch('nova.virt.libvirt.host.libvirt.Connection.baselineCPU')
def test_cpu_traits_with_mode_none(self, mock_baseline): def test_cpu_traits_with_mode_none(self, mock_baseline):
@@ -25548,9 +25549,10 @@ class LibvirtDriverTestCase(test.NoDBTestCase, TraitsComparisonMixin):
""" """
self.flags(cpu_mode='none', group='libvirt') self.flags(cpu_mode='none', group='libvirt')
mock_baseline.return_value = _fake_qemu64_cpu_feature mock_baseline.return_value = _fake_qemu64_cpu_feature
self.assertTraitsEqual(['HW_CPU_X86_SSE', 'HW_CPU_X86_SVM', self.assertTraitsEqual(
'HW_CPU_X86_MMX', 'HW_CPU_X86_SSE2'], ['HW_CPU_X86_SSE', 'HW_CPU_X86_SVM', 'HW_CPU_X86_AMD_SVM',
self.drvr._get_cpu_feature_traits()) 'HW_CPU_X86_MMX', 'HW_CPU_X86_SSE2'],
self.drvr._get_cpu_feature_traits())
mock_baseline.assert_called_with([u'''<cpu> mock_baseline.assert_called_with([u'''<cpu>
<arch>x86_64</arch> <arch>x86_64</arch>
@@ -25638,6 +25640,7 @@ class LibvirtDriverTestCase(test.NoDBTestCase, TraitsComparisonMixin):
'HW_CPU_X86_SSE2', 'HW_CPU_X86_SSE2',
'HW_CPU_X86_SSE', 'HW_CPU_X86_SSE',
'HW_CPU_X86_MMX', 'HW_CPU_X86_MMX',
'HW_CPU_X86_AMD_SVM',
'HW_CPU_X86_SVM' 'HW_CPU_X86_SVM'
], self.drvr._get_cpu_feature_traits() ], self.drvr._get_cpu_feature_traits()
) )
@@ -25705,6 +25708,7 @@ class LibvirtDriverTestCase(test.NoDBTestCase, TraitsComparisonMixin):
'HW_CPU_X86_SSE2', 'HW_CPU_X86_SSE2',
'HW_CPU_X86_SSE', 'HW_CPU_X86_SSE',
'HW_CPU_X86_MMX', 'HW_CPU_X86_MMX',
'HW_CPU_X86_AMD_SVM',
'HW_CPU_X86_SVM' 'HW_CPU_X86_SVM'
], self.drvr._get_cpu_feature_traits() ], self.drvr._get_cpu_feature_traits()
) )
+14 -6
View File
@@ -93,9 +93,13 @@ CPU_TRAITS_MAPPING = {
'sse4.2': os_traits.HW_CPU_X86_SSE42, 'sse4.2': os_traits.HW_CPU_X86_SSE42,
'sse4a': os_traits.HW_CPU_X86_SSE4A, 'sse4a': os_traits.HW_CPU_X86_SSE4A,
'ssse3': os_traits.HW_CPU_X86_SSSE3, 'ssse3': os_traits.HW_CPU_X86_SSSE3,
'svm': os_traits.HW_CPU_X86_SVM, # We have to continue to support the old (generic) trait for the
# AMD-specific svm feature.
'svm': (os_traits.HW_CPU_X86_SVM, os_traits.HW_CPU_X86_AMD_SVM),
'tbm': os_traits.HW_CPU_X86_TBM, 'tbm': os_traits.HW_CPU_X86_TBM,
'vmx': os_traits.HW_CPU_X86_VMX, # We have to continue to support the old (generic) trait for the
# Intel-specific vmx feature.
'vmx': (os_traits.HW_CPU_X86_VMX, os_traits.HW_CPU_X86_INTEL_VMX),
'xop': os_traits.HW_CPU_X86_XOP 'xop': os_traits.HW_CPU_X86_XOP
} }
@@ -577,11 +581,15 @@ def cpu_features_to_traits(features: ty.Set[str]) -> ty.Dict[str, bool]:
"""Returns this driver's CPU traits dict where keys are trait names from """Returns this driver's CPU traits dict where keys are trait names from
CPU_TRAITS_MAPPING, values are boolean indicates whether the trait should CPU_TRAITS_MAPPING, values are boolean indicates whether the trait should
be set in the provider tree. be set in the provider tree.
:param features: A set of feature names (short, lowercase,
CPU_TRAITS_MAPPING's keys).
""" """
traits = {trait_name: False for trait_name in CPU_TRAITS_MAPPING.values()} traits = {}
for f in features: for feature_name, val in CPU_TRAITS_MAPPING.items():
if f in CPU_TRAITS_MAPPING: trait_tuple = val if isinstance(val, tuple) else (val,)
traits[CPU_TRAITS_MAPPING[f]] = True for trait_name in trait_tuple:
traits[trait_name] = feature_name in features
return traits return traits