From 5f8393892d60fe1ee982e34c4af229ce148b5996 Mon Sep 17 00:00:00 2001 Message-Id: <5f8393892d60fe1ee982e34c4af229ce148b5996@dist-git> From: Pavel Hrdina Date: Wed, 28 Mar 2018 13:45:29 -0600 Subject: [PATCH] virtinst: read CPU model from domain capabilities From: Charles Arnold Add functionality to acquire the CPU model from the libvirt domain capabilities. This is used to compare with the host CPU model. (crobinso: add test coverage, rework domcaps layout a bit) (cherry picked from commit d15b78ab0d7b9e73261a19fafc841a4ee206d413) Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1525337 Conflicts: - _XML_ROOT_NAME is renamed to XML_NAME in upstream - utils.open_testdriver() is changed to utils.URIs.open_testdriver_cached() in upstream Reviewed-by: Cole Robinson Signed-off-by: Pavel Hrdina --- tests/capabilities-xml/kvm-x86_64-domcaps.xml | 88 +++++++++++++++++-- tests/capabilities.py | 10 +++ virtinst/domcapabilities.py | 28 ++++++ 3 files changed, 121 insertions(+), 5 deletions(-) diff --git a/tests/capabilities-xml/kvm-x86_64-domcaps.xml b/tests/capabilities-xml/kvm-x86_64-domcaps.xml index cf15c195..d2a3d11f 100644 --- a/tests/capabilities-xml/kvm-x86_64-domcaps.xml +++ b/tests/capabilities-xml/kvm-x86_64-domcaps.xml @@ -18,6 +18,68 @@ + + + + Broadwell + Intel + + + + + + + + + + + + + + qemu64 + qemu32 + phenom + pentium3 + pentium2 + pentium + n270 + kvm64 + kvm32 + coreduo + core2duo + athlon + Westmere + Westmere-IBRS + Skylake-Server + Skylake-Server-IBRS + Skylake-Client + Skylake-Client-IBRS + SandyBridge + SandyBridge-IBRS + Penryn + Opteron_G5 + Opteron_G4 + Opteron_G3 + Opteron_G2 + Opteron_G1 + Nehalem + Nehalem-IBRS + IvyBridge + IvyBridge-IBRS + Haswell + Haswell-noTSX + Haswell-noTSX-IBRS + Haswell-IBRS + EPYC + EPYC-IBPB + Conroe + Broadwell + Broadwell-noTSX + Broadwell-noTSX-IBRS + Broadwell-IBRS + 486 + + @@ -32,8 +94,25 @@ scsi virtio usb + sata + + + sdl + vnc + spice + + + subsystem @@ -50,11 +129,10 @@ scsi - - default - kvm - vfio - + + + + diff --git a/tests/capabilities.py b/tests/capabilities.py index 40f9fd86..ef1d961b 100644 --- a/tests/capabilities.py +++ b/tests/capabilities.py @@ -131,6 +131,16 @@ class TestCapabilities(unittest.TestCase): self.assertEqual(caps.os.loader.get_enum("type").get_values(), ["rom", "pflash"]) + def testDomainCapabilitiesx86(self): + xml = open("tests/capabilities-xml/kvm-x86_64-domcaps.xml").read() + caps = DomainCapabilities(utils.open_testdriver(), xml) + + custom_mode = caps.cpu.get_mode("custom") + self.assertTrue(bool(custom_mode)) + cpu_model = custom_mode.get_model("Opteron_G4") + self.assertTrue(bool(cpu_model)) + self.assertTrue(cpu_model.usable) + if __name__ == "__main__": unittest.main() diff --git a/virtinst/domcapabilities.py b/virtinst/domcapabilities.py index be2281a6..78ac7a3e 100644 --- a/virtinst/domcapabilities.py +++ b/virtinst/domcapabilities.py @@ -76,6 +76,33 @@ class _Features(_CapsBlock): gic = XMLChildProperty(_make_capsblock("gic"), is_single=True) +class _CPUModel(XMLBuilder): + _XML_ROOT_NAME = "model" + model = XMLProperty(".") + usable = XMLProperty("./@usable", is_yesno=True) + + +class _CPUMode(XMLBuilder): + _XML_ROOT_NAME = "mode" + name = XMLProperty("./@name") + models = XMLChildProperty(_CPUModel) + + def get_model(self, name): + for model in self.models: + if model.model == name: + return model + + +class _CPU(XMLBuilder): + _XML_ROOT_NAME = "cpu" + modes = XMLChildProperty(_CPUMode) + + def get_mode(self, name): + for mode in self.modes: + if mode.name == name: + return mode + + class DomainCapabilities(XMLBuilder): @staticmethod def build_from_params(conn, emulator, arch, machine, hvtype): @@ -163,6 +190,7 @@ class DomainCapabilities(XMLBuilder): _XML_ROOT_NAME = "domainCapabilities" os = XMLChildProperty(_OS, is_single=True) + cpu = XMLChildProperty(_CPU, is_single=True) devices = XMLChildProperty(_Devices, is_single=True) arch = XMLProperty("./arch") -- 2.20.1