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

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