Blob Blame History Raw
From 1b24900787b6b6cb52dae323ed0c6cff7492f66a Mon Sep 17 00:00:00 2001
Message-Id: <1b24900787b6b6cb52dae323ed0c6cff7492f66a@dist-git>
From: Pavel Hrdina <phrdina@redhat.com>
Date: Thu, 4 Oct 2018 14:19:32 -0400
Subject: [PATCH] virt-manager: Wire up support for default mode=host-model

From: Cole Robinson <crobinso@redhat.com>

Simplify things a long the way

(cherry picked from commit 9edca3486abd76e9a7c2c2fe3ad12ae32fc65733)

Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1525337

Conflicts:
    - CPU class is renamed to DomainCpu in upstream

Reviewed-by: Cole Robinson <crobinso@redhat.com>
Signed-off-by: Pavel Hrdina <phrdina@redhat.com>
---
 virtManager/config.py      | 20 +++-----------------
 virtManager/create.py      |  3 +--
 virtManager/details.py     |  8 ++++----
 virtManager/domain.py      |  2 +-
 virtManager/preferences.py | 16 ++++++++++------
 virtinst/cli.py            |  2 +-
 virtinst/cpu.py            | 19 ++++++++++---------
 7 files changed, 30 insertions(+), 40 deletions(-)

diff --git a/virtManager/config.py b/virtManager/config.py
index 4d47b477..a3daf341 100644
--- a/virtManager/config.py
+++ b/virtManager/config.py
@@ -198,7 +198,6 @@ class vmmConfig(object):
                 self.hv_packages = ["qemu-kvm"]
 
         self.default_storage_format_from_config = "qcow2"
-        self.cpu_default_from_config = CPU.SPECIAL_MODE_HOST_MODEL_ONLY
         self.default_console_resizeguest = 0
         self.default_add_spice_usbredir = "yes"
 
@@ -531,24 +530,11 @@ class vmmConfig(object):
     def set_storage_format(self, typ):
         self.conf.set("/new-vm/storage-format", typ.lower())
 
-    def get_default_cpu_setting(self, raw=False, for_cpu=False):
+    def get_default_cpu_setting(self):
         ret = self.conf.get("/new-vm/cpu-default")
-        whitelist = [CPU.SPECIAL_MODE_HOST_MODEL_ONLY,
-                     CPU.SPECIAL_MODE_HOST_MODEL,
-                     CPU.SPECIAL_MODE_HV_DEFAULT]
-
-        if ret not in whitelist:
-            ret = "default"
-        if ret == "default" and not raw:
-            ret = self.cpu_default_from_config
-            if ret not in whitelist:
-                ret = whitelist[0]
-
-        if for_cpu and ret == CPU.SPECIAL_MODE_HOST_MODEL:
-            # host-model has known issues, so use our 'copy cpu'
-            # behavior until host-model does what we need
-            ret = CPU.SPECIAL_MODE_HOST_COPY
 
+        if ret not in CPU.SPECIAL_MODES:
+            ret = CPU.SPECIAL_MODE_APP_DEFAULT
         return ret
     def set_default_cpu_setting(self, val):
         self.conf.set("/new-vm/cpu-default", val.lower())
diff --git a/virtManager/create.py b/virtManager/create.py
index d5d1d5a0..3e1fc624 100644
--- a/virtManager/create.py
+++ b/virtManager/create.py
@@ -1880,8 +1880,7 @@ class vmmCreate(vmmGObjectUI):
             guest.skip_default_sound = not self.config.get_new_vm_sound()
             guest.skip_default_usbredir = (
                 self.config.get_add_spice_usbredir() == "no")
-            guest.x86_cpu_default = self.config.get_default_cpu_setting(
-                for_cpu=True)
+            guest.x86_cpu_default = self.config.get_default_cpu_setting()
 
             guest.add_default_devices()
         except Exception as e:
diff --git a/virtManager/details.py b/virtManager/details.py
index ebe010b5..be0f25c9 100644
--- a/virtManager/details.py
+++ b/virtManager/details.py
@@ -972,7 +972,8 @@ class vmmDetails(vmmGObjectUI):
         cpu_model.set_entry_text_column(0)
         cpu_model.set_row_separator_func(sep_func, None)
         model.set_sort_column_id(1, Gtk.SortType.ASCENDING)
-        model.append([_("Application Default"), "1", "appdefault", False])
+        model.append([_("Application Default"), "1",
+            virtinst.CPU.SPECIAL_MODE_APP_DEFAULT, False])
         model.append([_("Hypervisor Default"), "2",
             virtinst.CPU.SPECIAL_MODE_HV_DEFAULT, False])
         model.append([_("Clear CPU configuration"), "3",
@@ -1572,12 +1573,11 @@ class vmmDetails(vmmGObjectUI):
             if text == row[0]:
                 key = row[2]
                 break
-
         if not key:
             return text
 
-        if key == "appdefault":
-            return self.config.get_default_cpu_setting(for_cpu=True)
+        if key == virtinst.CPU.SPECIAL_MODE_APP_DEFAULT:
+            return self.config.get_default_cpu_setting()
         return key
 
     def inspection_refresh(self, src_ignore):
diff --git a/virtManager/domain.py b/virtManager/domain.py
index ed94cf16..50ccbdb1 100644
--- a/virtManager/domain.py
+++ b/virtManager/domain.py
@@ -663,7 +663,7 @@ class vmmDomain(vmmLibvirtObject):
 
         if model != _SENTINEL:
             if model in guest.cpu.SPECIAL_MODES:
-                guest.cpu.set_special_mode(model)
+                guest.cpu.set_special_mode(guest, model)
             else:
                 guest.cpu.model = model
         self._redefine_xmlobj(guest)
diff --git a/virtManager/preferences.py b/virtManager/preferences.py
index bf67590f..5739af29 100644
--- a/virtManager/preferences.py
+++ b/virtManager/preferences.py
@@ -23,6 +23,8 @@ import logging
 from gi.repository import Gtk
 from gi.repository import Gdk
 
+from virtinst import CPU
+
 from . import uiutil
 from .baseclass import vmmGObjectUI
 
@@ -160,11 +162,13 @@ class vmmPreferences(vmmGObjectUI):
         combo = self.widget("prefs-cpu-default")
         # [gsettings value, string]
         model = Gtk.ListStore(str, str)
-        for row in [["default", _("System default (%s)") %
-                    self.config.cpu_default_from_config],
-                    ["hv-default", _("Hypervisor default")],
-                    ["host-model-only", _("Nearest host CPU model")],
-                    ["host-model", _("Copy host CPU definition")]]:
+        for row in [
+            [CPU.SPECIAL_MODE_APP_DEFAULT, _("Application default")],
+            [CPU.SPECIAL_MODE_HV_DEFAULT, _("Hypervisor default")],
+            [CPU.SPECIAL_MODE_HOST_MODEL_ONLY,
+                _("Nearest host CPU model")],
+            [CPU.SPECIAL_MODE_HOST_MODEL,
+                _("Copy host CPU definition")]]:
             model.append(row)
         combo.set_model(model)
         uiutil.init_combo_text_column(combo, 1)
@@ -211,7 +215,7 @@ class vmmPreferences(vmmGObjectUI):
         uiutil.set_list_selection(combo, val)
     def refresh_cpu_default(self):
         combo = self.widget("prefs-cpu-default")
-        val = self.config.get_default_cpu_setting(raw=True)
+        val = self.config.get_default_cpu_setting()
         uiutil.set_list_selection(combo, val)
 
     def refresh_cpu_poll(self):
diff --git a/virtinst/cli.py b/virtinst/cli.py
index 3d3ac0ac..7e8ab536 100644
--- a/virtinst/cli.py
+++ b/virtinst/cli.py
@@ -1484,7 +1484,7 @@ class ParserCPU(VirtCLIParser):
             val = inst.SPECIAL_MODE_CLEAR
 
         if val in inst.SPECIAL_MODES:
-            inst.set_special_mode(val)
+            inst.set_special_mode(self.guest, val)
         else:
             inst.model = val
 
diff --git a/virtinst/cpu.py b/virtinst/cpu.py
index 2de08145..356df206 100644
--- a/virtinst/cpu.py
+++ b/virtinst/cpu.py
@@ -100,7 +100,15 @@ class CPU(XMLBuilder):
                      SPECIAL_MODE_HOST_COPY, SPECIAL_MODE_HOST_MODEL,
                      SPECIAL_MODE_HOST_PASSTHROUGH, SPECIAL_MODE_CLEAR,
                      SPECIAL_MODE_APP_DEFAULT]
-    def set_special_mode(self, val):
+    def set_special_mode(self, guest, val):
+        if val == self.SPECIAL_MODE_APP_DEFAULT:
+            # If libvirt is new enough to support reliable mode=host-model
+            # then use it, otherwise use previous default HOST_MODEL_ONLY
+            domcaps = guest.lookup_domcaps()
+            val = self.SPECIAL_MODE_HOST_MODEL_ONLY
+            if domcaps.supports_safe_host_model():
+                val = self.SPECIAL_MODE_HOST_MODEL
+
         if (val == self.SPECIAL_MODE_HOST_MODEL or
             val == self.SPECIAL_MODE_HOST_PASSTHROUGH):
             self.model = None
@@ -264,15 +272,8 @@ class CPU(XMLBuilder):
             return
 
         mode = guest.x86_cpu_default
-        if mode == self.SPECIAL_MODE_APP_DEFAULT:
-            # If libvirt is new enough to support reliable mode=host-model
-            # then use it, otherwise use previous default HOST_MODEL_ONLY
-            domcaps = guest.lookup_domcaps()
-            mode = self.SPECIAL_MODE_HOST_MODEL_ONLY
-            if domcaps.supports_safe_host_model():
-                mode = self.SPECIAL_MODE_HOST_MODEL
 
-        self.set_special_mode(mode)
+        self.set_special_mode(guest, mode)
         if mode == self.SPECIAL_MODE_HOST_MODEL_ONLY:
             self._validate_default_host_model_only(guest)
 
-- 
2.20.1