Skip to content

Commit 90e2a5e

Browse files
Zuulopenstack-gerrit
authored andcommitted
Merge "Add traits for viommu model"
2 parents 457806e + dc05564 commit 90e2a5e

File tree

4 files changed

+44
-5
lines changed

4 files changed

+44
-5
lines changed

nova/scheduler/request_filter.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -214,6 +214,7 @@ def transform_image_metadata(ctxt, request_spec):
214214
'hw_vif_model': 'COMPUTE_NET_VIF_MODEL',
215215
'hw_architecture': 'HW_ARCH',
216216
'hw_emulation_architecture': 'COMPUTE_ARCH',
217+
'hw_viommu_model': 'COMPUTE_VIOMMU',
217218
}
218219

219220
trait_names = []

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4156,7 +4156,8 @@ def test_parse_domain_caps_devices(self):
41564156
obj.parse_str(xml)
41574157
# we only use the video and disk devices today.
41584158
device_types = [config.LibvirtConfigDomainCapsDiskBuses,
4159-
config.LibvirtConfigDomainCapsVideoModels]
4159+
config.LibvirtConfigDomainCapsVideoModels,
4160+
]
41604161
# so we assert there are only two device types parsed
41614162
self.assertEqual(2, len(obj.devices))
41624163
# we then assert that the parsed devices are of the correct type

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

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -961,9 +961,10 @@ def test_public_api_signatures(self):
961961
@mock.patch.object(libvirt_driver.LibvirtDriver, '_get_storage_bus_traits')
962962
@mock.patch.object(libvirt_driver.LibvirtDriver, '_get_video_model_traits')
963963
@mock.patch.object(libvirt_driver.LibvirtDriver, '_get_vif_model_traits')
964+
@mock.patch.object(host.Host, "has_min_version")
964965
def test_static_traits(
965-
self, mock_vif_traits, mock_video_traits, mock_storage_traits,
966-
mock_cpu_traits,
966+
self, mock_version, mock_vif_traits, mock_video_traits,
967+
mock_storage_traits, mock_cpu_traits,
967968
):
968969
"""Ensure driver capabilities are correctly retrieved and cached."""
969970

@@ -974,14 +975,21 @@ def test_static_traits(
974975
mock_video_traits.return_value = {'COMPUTE_GRAPHICS_MODEL_VGA': True}
975976
mock_vif_traits.return_value = {'COMPUTE_NET_VIF_MODEL_VIRTIO': True}
976977

978+
# for support COMPUTE_VIOMMU_MODEL_VIRTIO
979+
mock_version.return_value = True
980+
977981
drvr = libvirt_driver.LibvirtDriver(fake.FakeVirtAPI(), False)
978982
expected = {
979-
'HW_CPU_HYPERTHREADING': True,
980-
'COMPUTE_STORAGE_BUS_VIRTIO': True,
981983
'COMPUTE_GRAPHICS_MODEL_VGA': True,
982984
'COMPUTE_NET_VIF_MODEL_VIRTIO': True,
983985
'COMPUTE_SECURITY_TPM_1_2': False,
984986
'COMPUTE_SECURITY_TPM_2_0': False,
987+
'COMPUTE_STORAGE_BUS_VIRTIO': True,
988+
'COMPUTE_VIOMMU_MODEL_AUTO': True,
989+
'COMPUTE_VIOMMU_MODEL_INTEL': True,
990+
'COMPUTE_VIOMMU_MODEL_SMMUV3': True,
991+
'COMPUTE_VIOMMU_MODEL_VIRTIO': True,
992+
'HW_CPU_HYPERTHREADING': True
985993
}
986994

987995
static_traits = drvr.static_traits
@@ -1027,6 +1035,10 @@ def test_static_traits__invalid_trait(
10271035
'COMPUTE_NET_VIF_MODEL_VIRTIO': True,
10281036
'COMPUTE_SECURITY_TPM_1_2': False,
10291037
'COMPUTE_SECURITY_TPM_2_0': False,
1038+
'COMPUTE_VIOMMU_MODEL_AUTO': True,
1039+
'COMPUTE_VIOMMU_MODEL_INTEL': True,
1040+
'COMPUTE_VIOMMU_MODEL_SMMUV3': True,
1041+
'COMPUTE_VIOMMU_MODEL_VIRTIO': False
10301042
}
10311043

10321044
static_traits = drvr.static_traits

nova/virt/libvirt/driver.py

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8922,6 +8922,7 @@ def static_traits(self) -> ty.Dict[str, bool]:
89228922
traits.update(self._get_storage_bus_traits())
89238923
traits.update(self._get_video_model_traits())
89248924
traits.update(self._get_vif_model_traits())
8925+
traits.update(self._get_iommu_model_traits())
89258926
traits.update(self._get_tpm_traits())
89268927

89278928
_, invalid_traits = ot.check_traits(traits)
@@ -12198,6 +12199,30 @@ def _get_vif_model_traits(self) -> ty.Dict[str, bool]:
1219812199
in supported_models for model in all_models
1219912200
}
1220012201

12202+
def _get_iommu_model_traits(self) -> ty.Dict[str, bool]:
12203+
"""Get iommu model traits based on the currently enabled virt_type.
12204+
Not all traits generated by this function may be valid and the result
12205+
should be validated.
12206+
:return: A dict of trait names mapped to boolean values.
12207+
"""
12208+
dom_caps = self._host.get_domain_capabilities()
12209+
supported_models: ty.Set[str] = {fields.VIOMMUModel.AUTO}
12210+
# our min version of qemu/libvirt supprot q35 and virt machine types.
12211+
# They also support the smmuv3 and intel iommu modeles so if the qemu
12212+
# binary is avaiable we can report the trait.
12213+
if fields.Architecture.AARCH64 in dom_caps:
12214+
supported_models.add(fields.VIOMMUModel.SMMUV3)
12215+
if fields.Architecture.X86_64 in dom_caps:
12216+
supported_models.add(fields.VIOMMUModel.INTEL)
12217+
# the virtio iommu model requires a newer libvirt then our min
12218+
# libvirt so we need to check the version explcitly.
12219+
if self._host.has_min_version(MIN_LIBVIRT_VIOMMU_VIRTIO_MODEL):
12220+
supported_models.add(fields.VIOMMUModel.VIRTIO)
12221+
return {
12222+
f'COMPUTE_VIOMMU_MODEL_{model.replace("-", "_").upper()}': model
12223+
in supported_models for model in fields.VIOMMUModel.ALL
12224+
}
12225+
1220112226
def _get_storage_bus_traits(self) -> ty.Dict[str, bool]:
1220212227
"""Get storage bus traits based on the currently enabled virt_type.
1220312228

0 commit comments

Comments
 (0)