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

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