|
|
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 |
|