Blame SOURCES/virt-manager-guest-Add-DomainCapabilities-caching.patch

3d61c0
From 8bf52a94315a3fa219875a009a5d9661c46c47fe Mon Sep 17 00:00:00 2001
3d61c0
Message-Id: <8bf52a94315a3fa219875a009a5d9661c46c47fe@dist-git>
3d61c0
From: Pavel Hrdina <phrdina@redhat.com>
3d61c0
Date: Thu, 4 Oct 2018 12:22:22 -0400
3d61c0
Subject: [PATCH] guest: Add DomainCapabilities caching
3d61c0
3d61c0
From: Cole Robinson <crobinso@redhat.com>
3d61c0
3d61c0
(cherry picked from commit 76334bfabdfd32498d78f390182d9621036e02d3)
3d61c0
3d61c0
Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1525337
3d61c0
3d61c0
Conflicts:
3d61c0
    - virtinst/guest.py: different code-base as upstream have a lot of
3d61c0
      cleanup patches that moved a lot of code around
3d61c0
3d61c0
Reviewed-by: Cole Robinson <crobinso@redhat.com>
3d61c0
Signed-off-by: Pavel Hrdina <phrdina@redhat.com>
3d61c0
---
3d61c0
 tests/capabilities.py       |  5 +++++
3d61c0
 virtinst/cpu.py             | 26 ++++++++++++++------------
3d61c0
 virtinst/domcapabilities.py |  7 +++++--
3d61c0
 virtinst/guest.py           | 21 ++++++++++++++++++++-
3d61c0
 4 files changed, 44 insertions(+), 15 deletions(-)
3d61c0
3d61c0
diff --git a/tests/capabilities.py b/tests/capabilities.py
3d61c0
index ef1d961b..f1416925 100644
3d61c0
--- a/tests/capabilities.py
3d61c0
+++ b/tests/capabilities.py
3d61c0
@@ -135,6 +135,11 @@ class TestCapabilities(unittest.TestCase):
3d61c0
         xml = open("tests/capabilities-xml/kvm-x86_64-domcaps.xml").read()
3d61c0
         caps = DomainCapabilities(utils.open_testdriver(), xml)
3d61c0
 
3d61c0
+        self.assertEqual(caps.machine, "pc-i440fx-2.1")
3d61c0
+        self.assertEqual(caps.arch, "x86_64")
3d61c0
+        self.assertEqual(caps.domain, "kvm")
3d61c0
+        self.assertEqual(caps.path, "/bin/qemu-system-x86_64")
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
diff --git a/virtinst/cpu.py b/virtinst/cpu.py
3d61c0
index 1b8f4a96..1f1ad7ec 100644
3d61c0
--- a/virtinst/cpu.py
3d61c0
+++ b/virtinst/cpu.py
3d61c0
@@ -19,7 +19,6 @@
3d61c0
 
3d61c0
 import logging
3d61c0
 
3d61c0
-from .domcapabilities import DomainCapabilities
3d61c0
 from .xmlbuilder import XMLBuilder, XMLProperty, XMLChildProperty
3d61c0
 
3d61c0
 
3d61c0
@@ -237,20 +236,14 @@ class CPU(XMLBuilder):
3d61c0
     # Default config #
3d61c0
     ##################
3d61c0
 
3d61c0
-    def _set_cpu_x86_kvm_default(self, guest):
3d61c0
-        if guest.os.arch != self.conn.caps.host.cpu.arch:
3d61c0
-            return
3d61c0
-
3d61c0
-        self.set_special_mode(guest.x86_cpu_default)
3d61c0
-        if guest.x86_cpu_default != self.SPECIAL_MODE_HOST_MODEL_ONLY:
3d61c0
-            return
3d61c0
-        if not self.model:
3d61c0
-            return
3d61c0
-
3d61c0
+    def _validate_default_host_model_only(self, guest):
3d61c0
         # It's possible that the value HOST_MODEL_ONLY gets from
3d61c0
         # <capabilities> is not actually supported by qemu/kvm
3d61c0
         # combo which will be reported in <domainCapabilities>
3d61c0
-        domcaps = DomainCapabilities.build_from_guest(guest)
3d61c0
+        if not self.model:
3d61c0
+            return
3d61c0
+
3d61c0
+        domcaps = guest.lookup_domcaps()
3d61c0
         domcaps_mode = domcaps.cpu.get_mode("custom")
3d61c0
         if not domcaps_mode:
3d61c0
             return
3d61c0
@@ -264,6 +257,15 @@ class CPU(XMLBuilder):
3d61c0
             self.model)
3d61c0
         self.model = None
3d61c0
 
3d61c0
+    def _set_cpu_x86_kvm_default(self, guest):
3d61c0
+        if guest.os.arch != self.conn.caps.host.cpu.arch:
3d61c0
+            return
3d61c0
+
3d61c0
+        mode = guest.x86_cpu_default
3d61c0
+        self.set_special_mode(mode)
3d61c0
+        if mode == self.SPECIAL_MODE_HOST_MODEL_ONLY:
3d61c0
+            self._validate_default_host_model_only(guest)
3d61c0
+
3d61c0
     def set_defaults(self, guest):
3d61c0
         self.set_topology_defaults(guest.vcpus)
3d61c0
 
3d61c0
diff --git a/virtinst/domcapabilities.py b/virtinst/domcapabilities.py
3d61c0
index 78ac7a3e..1a84ab95 100644
3d61c0
--- a/virtinst/domcapabilities.py
3d61c0
+++ b/virtinst/domcapabilities.py
3d61c0
@@ -192,6 +192,9 @@ class DomainCapabilities(XMLBuilder):
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
     features = XMLChildProperty(_Features, is_single=True)
3d61c0
+
3d61c0
+    arch = XMLProperty("./arch")
3d61c0
+    domain = XMLProperty("./domain")
3d61c0
+    machine = XMLProperty("./machine")
3d61c0
+    path = XMLProperty("./path")
3d61c0
diff --git a/virtinst/guest.py b/virtinst/guest.py
3d61c0
index 6bf1b59a..9c45b1b8 100644
3d61c0
--- a/virtinst/guest.py
3d61c0
+++ b/virtinst/guest.py
3d61c0
@@ -140,6 +140,7 @@ class Guest(XMLBuilder):
3d61c0
 
3d61c0
         # This is set via Capabilities.build_virtinst_guest
3d61c0
         self.capsinfo = None
3d61c0
+        self._domcaps = None
3d61c0
 
3d61c0
         self.installer = DistroInstaller(self.conn)
3d61c0
 
3d61c0
@@ -534,6 +535,24 @@ class Guest(XMLBuilder):
3d61c0
                 logging.error("Failed to remove disk '%s': %s", name, e)
3d61c0
 
3d61c0
 
3d61c0
+    def lookup_domcaps(self):
3d61c0
+        # We need to regenerate domcaps cache if any of these values change
3d61c0
+        def _compare(domcaps):
3d61c0
+            if self.os.machine and self.os.machine != domcaps.machine:
3d61c0
+                return False
3d61c0
+            if self.type and self.type != domcaps.domain:
3d61c0
+                return False
3d61c0
+            if self.os.arch and self.os.arch != domcaps.arch:
3d61c0
+                return False
3d61c0
+            if self.emulator and self.emulator != domcaps.path:
3d61c0
+                return False
3d61c0
+            return True
3d61c0
+
3d61c0
+        if not self._domcaps or not _compare(self._domcaps):
3d61c0
+            self._domcaps = DomainCapabilities.build_from_guest(self)
3d61c0
+        return self._domcaps
3d61c0
+
3d61c0
+
3d61c0
     ###########################
3d61c0
     # XML convenience helpers #
3d61c0
     ###########################
3d61c0
@@ -543,7 +562,7 @@ class Guest(XMLBuilder):
3d61c0
         Configure UEFI for the VM, but only if libvirt is advertising
3d61c0
         a known UEFI binary path.
3d61c0
         """
3d61c0
-        domcaps = DomainCapabilities.build_from_guest(self)
3d61c0
+        domcaps = self.lookup_domcaps()
3d61c0
 
3d61c0
         if not domcaps.supports_uefi_xml():
3d61c0
             raise RuntimeError(_("Libvirt version does not support UEFI."))
3d61c0
-- 
3d61c0
2.20.1
3d61c0