Blame SOURCES/virt-manager-virtinst-read-CPU-model-from-domain-capabilities.patch

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