Hello community,

here is the log from the commit of package virt-manager for openSUSE:Factory 
checked in at 2018-03-28 10:34:14
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/virt-manager (Old)
 and      /work/SRC/openSUSE:Factory/.virt-manager.new (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "virt-manager"

Wed Mar 28 10:34:14 2018 rev:175 rq:591755 version:1.5.0

Changes:
--------
--- /work/SRC/openSUSE:Factory/virt-manager/virt-manager.changes        
2018-03-16 10:44:22.726248654 +0100
+++ /work/SRC/openSUSE:Factory/.virt-manager.new/virt-manager.changes   
2018-03-28 10:34:15.250846327 +0200
@@ -1,0 +2,7 @@
+Thu Mar 22 15:35:57 MDT 2018 - [email protected]
+
+- bsc#1086038 - VM guests cannot be properly installed with
+  virt-install
+  virtinst-dont-set-cpu-model-when-caps-mismatch.patch
+
+-------------------------------------------------------------------

New:
----
  virtinst-dont-set-cpu-model-when-caps-mismatch.patch

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ virt-manager.spec ++++++
--- /var/tmp/diff_new_pack.pD7SZn/_old  2018-03-28 10:34:20.054673546 +0200
+++ /var/tmp/diff_new_pack.pD7SZn/_new  2018-03-28 10:34:20.058673401 +0200
@@ -84,6 +84,7 @@
 Patch169:       virtinst-keep-install-iso-attached.patch
 Patch170:       virtinst-osdict-get_supported.patch
 Patch171:       virtinst-dont-use-special-copy-cpu-features.patch
+Patch172:       virtinst-dont-set-cpu-model-when-caps-mismatch.patch
 # Python2 to Python3 patches
 Patch200:       virtmisc-python2-to-python3-conversion.patch
 Patch201:       virtcli-python2-to-python3-conversion.patch
@@ -225,6 +226,7 @@
 %patch169 -p1
 %patch170 -p1
 %patch171 -p1
+%patch172 -p1
 # Python2 to Python3 patches
 %patch200 -p1
 %patch201 -p1

++++++ virtinst-dont-set-cpu-model-when-caps-mismatch.patch ++++++
References: bsc#1086038

The issue is when the host has been updated with microcode for Spectre v2
but qemu has not been updated. In this scenario (as an example),
'virsh capabilities' shows the host cpu model as IvyBridge-IBRS, which is
correct. However, 'virsh domcapabilities' shows IvyBridge as the host-model
and does not show any of the '-IBRS' flavors available under the custom model,
which is also correct since the qemu does not have Spectre patches. Setting
the model to the 'IBRS' version in the installation XML will cause qemu to
fail because of an unknown CPU model.

When the capabilities CPU does not match the domcapabilities CPU,
leave the model unset in the cpu mode XML.

Index: virt-manager-1.5.0/virtinst/domcapabilities.py
===================================================================
--- virt-manager-1.5.0.orig/virtinst/domcapabilities.py
+++ virt-manager-1.5.0/virtinst/domcapabilities.py
@@ -41,9 +41,27 @@ class _Enum(_HasValues):
     name = XMLProperty("./@name")
 
 
+class _Model(XMLBuilder):
+    _XML_ROOT_NAME = "model"
+    model = XMLProperty(".")
+
+
+class _HasModels(XMLBuilder):
+    models = XMLChildProperty(_Model)
+
+    def get_models(self):
+        return [m.model for m in self.models]
+
+
+class _CPUMode(_HasModels):
+    _XML_ROOT_NAME = "mode"
+    name = XMLProperty("./@name")
+
+
 class _CapsBlock(_HasValues):
     supported = XMLProperty("./@supported", is_yesno=True)
     enums = XMLChildProperty(_Enum)
+    modes = XMLChildProperty(_CPUMode)
 
     def enum_names(self):
         return [e.name for e in self.enums]
@@ -52,6 +70,12 @@ class _CapsBlock(_HasValues):
         d = dict((e.name, e) for e in self.enums)
         return d[name]
 
+    def mode_names(self):
+        return [m.name for m in self.modes]
+
+    def get_mode(self, name):
+        d = dict((m.name, m) for m in self.modes)
+        return d[name]
 
 def _make_capsblock(xml_root_name):
     class TmpClass(_CapsBlock):
@@ -65,6 +89,11 @@ class _OS(_CapsBlock):
     loader = XMLChildProperty(_make_capsblock("loader"), is_single=True)
 
 
+class _CPU(_CapsBlock):
+    _XML_ROOT_NAME = "cpu"
+    mode = XMLChildProperty(_make_capsblock("mode"), is_single=True)
+
+
 class _Devices(_CapsBlock):
     _XML_ROOT_NAME = "devices"
     hostdev = XMLChildProperty(_make_capsblock("hostdev"), is_single=True)
@@ -163,6 +192,7 @@ class DomainCapabilities(XMLBuilder):
 
     _XML_ROOT_NAME = "domainCapabilities"
     os = XMLChildProperty(_OS, is_single=True)
+    cpu = XMLChildProperty(_CPU, is_single=True)
     devices = XMLChildProperty(_Devices, is_single=True)
 
     arch = XMLProperty("./arch")
Index: virt-manager-1.5.0/virtinst/cpu.py
===================================================================
--- virt-manager-1.5.0.orig/virtinst/cpu.py
+++ virt-manager-1.5.0/virtinst/cpu.py
@@ -17,7 +17,9 @@
 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
 # MA 02110-1301 USA.
 
+from .domcapabilities import DomainCapabilities
 from .xmlbuilder import XMLBuilder, XMLProperty, XMLChildProperty
+import logging
 
 
 class _CPUCellSibling(XMLBuilder):
@@ -96,7 +98,7 @@ class CPU(XMLBuilder):
     SPECIAL_MODES = [SPECIAL_MODE_HOST_MODEL_ONLY, SPECIAL_MODE_HV_DEFAULT,
                      SPECIAL_MODE_HOST_COPY, SPECIAL_MODE_HOST_MODEL,
                      SPECIAL_MODE_HOST_PASSTHROUGH, SPECIAL_MODE_CLEAR]
-    def set_special_mode(self, val):
+    def set_special_mode(self, val, guest=None):
         if (val == self.SPECIAL_MODE_HOST_MODEL or
             val == self.SPECIAL_MODE_HOST_PASSTHROUGH or
             val == self.SPECIAL_MODE_HOST_COPY):
@@ -118,6 +120,15 @@ class CPU(XMLBuilder):
             if self.conn.caps.host.cpu.model:
                 self.clear()
                 self.model = self.conn.caps.host.cpu.model
+                if guest:
+                    domcaps = DomainCapabilities.build_from_guest(guest)
+                    domcaps_model = 
domcaps.cpu.get_mode("host-model").get_models()
+                    if (isinstance(domcaps_model, list) and len(domcaps_model) 
and
+                        domcaps_model[0] != self.conn.caps.host.cpu.model):
+                        logging.debug("Host capabilities CPU '%s' does not 
match "
+                              "domain capabilities CPU '%s'. Leaving CPU model 
unset.",
+                              self.conn.caps.host.cpu.model, domcaps_model[0])
+                        self.model = None
         else:
             raise RuntimeError("programming error: unknown "
                 "special cpu mode '%s'" % val)
Index: virt-manager-1.5.0/virtinst/guest.py
===================================================================
--- virt-manager-1.5.0.orig/virtinst/guest.py
+++ virt-manager-1.5.0/virtinst/guest.py
@@ -930,7 +930,7 @@ class Guest(XMLBuilder):
             if self.os.arch != self.conn.caps.host.cpu.arch:
                 return
 
-            self.cpu.set_special_mode(self.x86_cpu_default)
+            self.cpu.set_special_mode(self.x86_cpu_default, self)
             if self._os_object.broken_x2apic():
                 self.cpu.add_feature("x2apic", policy="disable")
 
++++++ virtinst-python2-to-python3-conversion.patch ++++++
--- /var/tmp/diff_new_pack.pD7SZn/_old  2018-03-28 10:34:20.274665633 +0200
+++ /var/tmp/diff_new_pack.pD7SZn/_new  2018-03-28 10:34:20.274665633 +0200
@@ -294,7 +294,7 @@
 ===================================================================
 --- virt-manager-1.5.0.orig/virtinst/domcapabilities.py
 +++ virt-manager-1.5.0/virtinst/domcapabilities.py
-@@ -139,7 +139,7 @@ class DomainCapabilities(XMLBuilder):
+@@ -168,7 +168,7 @@ class DomainCapabilities(XMLBuilder):
                  return _("BIOS")
              return _("None")
  
@@ -303,7 +303,7 @@
              for pattern in patterns:
                  if re.match(pattern, path):
                      return (_("UEFI %(arch)s: %(path)s") %
-@@ -151,7 +151,7 @@ class DomainCapabilities(XMLBuilder):
+@@ -180,7 +180,7 @@ class DomainCapabilities(XMLBuilder):
          """
          Return True if we know how to setup UEFI for the passed arch
          """


Reply via email to