domain: features: Add set_defaults

And move all the Guest logic there.

We need to add an xmlbuilder helper _prop_is_unset to be able to
determine if a bool property is unset, in our quest to remove
default_* xmlbuilder bits
This commit is contained in:
Cole Robinson 2018-09-02 09:02:32 -04:00
parent 640a068650
commit 9a5b903086
3 changed files with 62 additions and 53 deletions

View File

@ -15,12 +15,9 @@ class DomainFeatures(XMLBuilder):
XML_NAME = "features"
_XML_PROP_ORDER = ["acpi", "apic", "pae", "gic_version"]
acpi = XMLProperty("./acpi", is_bool=True,
default_name="default", default_cb=lambda s: False)
apic = XMLProperty("./apic", is_bool=True,
default_name="default", default_cb=lambda s: False)
pae = XMLProperty("./pae", is_bool=True,
default_name="default", default_cb=lambda s: False)
acpi = XMLProperty("./acpi", is_bool=True)
apic = XMLProperty("./apic", is_bool=True)
pae = XMLProperty("./pae", is_bool=True)
gic_version = XMLProperty("./gic/@version")
hap = XMLProperty("./hap", is_bool=True)
@ -38,11 +35,49 @@ class DomainFeatures(XMLBuilder):
is_int=True)
hyperv_synic = XMLProperty("./hyperv/synic/@state", is_onoff=True)
vmport = XMLProperty("./vmport/@state", is_onoff=True,
default_name="default", default_cb=lambda s: False)
vmport = XMLProperty("./vmport/@state", is_onoff=True)
kvm_hidden = XMLProperty("./kvm/hidden/@state", is_onoff=True)
pvspinlock = XMLProperty("./pvspinlock/@state", is_onoff=True)
smm = XMLProperty("./smm/@state", is_onoff=True)
vmcoreinfo = XMLProperty("./vmcoreinfo", is_bool=True,
default_name="default", default_cb=lambda s: False)
vmcoreinfo = XMLProperty("./vmcoreinfo", is_bool=True)
##################
# Default config #
##################
def set_defaults(self, guest):
if guest.os.is_container():
self.acpi = None
self.apic = None
self.pae = None
if guest.is_full_os_container() and guest.type != "vz":
self.privnet = True
return
if not guest.os.is_hvm():
return
if self._prop_is_unset("acpi"):
self.acpi = guest.capsinfo.guest.supports_acpi()
if self._prop_is_unset("apic"):
self.apic = guest.capsinfo.guest.supports_apic()
if self._prop_is_unset("pae"):
if (guest.os.is_hvm() and
guest.type == "xen" and
guest.os.arch == "x86_64"):
self.pae = True
else:
self.pae = guest.capsinfo.guest.supports_pae()
if (guest.hyperv_supported() and
self.conn.check_support(self.conn.SUPPORT_CONN_HYPERV_VAPIC)):
if self.hyperv_relaxed is None:
self.hyperv_relaxed = True
if self.hyperv_vapic is None:
self.hyperv_vapic = True
if self.hyperv_spinlocks is None:
self.hyperv_spinlocks = True
if self.hyperv_spinlocks_retries is None:
self.hyperv_spinlocks_retries = 8191

View File

@ -754,7 +754,7 @@ class Guest(XMLBuilder):
self._set_clock_defaults()
self._set_emulator_defaults()
self._set_cpu_defaults()
self._set_feature_defaults()
self.features.set_defaults(self)
self._set_pm_defaults()
for dev in self.devices.get_all():
@ -764,7 +764,7 @@ class Guest(XMLBuilder):
self._add_implied_controllers()
self._add_spice_devices()
def _is_full_os_container(self):
def is_full_os_container(self):
if not self.os.is_container():
return False
for fs in self.devices.filesystem:
@ -774,7 +774,7 @@ class Guest(XMLBuilder):
def _set_osxml_defaults(self):
if self.os.is_container() and not self.os.init:
if self._is_full_os_container():
if self.is_full_os_container():
self.os.init = "/sbin/init"
self.os.init = self.os.init or "/bin/sh"
@ -824,7 +824,7 @@ class Guest(XMLBuilder):
hv_clock = self.conn.check_support(self.conn.SUPPORT_CONN_HYPERV_CLOCK)
hv_clock_rhel = self.conn.check_support(self.conn.SUPPORT_CONN_HYPERV_CLOCK_RHEL)
if (self.osinfo.is_windows() and self._hyperv_supported() and
if (self.hyperv_supported() and
(hv_clock or (self.stable_defaults() and hv_clock_rhel))):
hyperv = self.clock.timers.add_new()
hyperv.name = "hypervclock"
@ -894,7 +894,9 @@ class Guest(XMLBuilder):
if self.osinfo.broken_x2apic():
self.cpu.add_feature("x2apic", policy="disable")
def _hyperv_supported(self):
def hyperv_supported(self):
if not self.osinfo.is_windows():
return False
if (self.os.loader_type == "pflash" and
self.os_variant in ("win2k8r2", "win7")):
return False
@ -905,7 +907,7 @@ class Guest(XMLBuilder):
# changed through manual intervention via the customize wizard.
# UEFI doesn't work with hyperv bits
if not self._hyperv_supported():
if not self.hyperv_supported():
self.features.hyperv_relaxed = None
self.features.hyperv_vapic = None
self.features.hyperv_spinlocks = None
@ -914,42 +916,6 @@ class Guest(XMLBuilder):
if i.name == "hypervclock":
self.clock.remove_timer(i)
def _set_feature_defaults(self):
if self.os.is_container():
self.features.acpi = None
self.features.apic = None
self.features.pae = None
if self._is_full_os_container() and self.type != "vz":
self.features.privnet = True
return
if not self.os.is_hvm():
return
if self.features.acpi == "default":
self.features.acpi = self.capsinfo.guest.supports_acpi()
if self.features.apic == "default":
self.features.apic = self.capsinfo.guest.supports_apic()
if self.features.pae == "default":
if (self.os.is_hvm() and
self.type == "xen" and
self.os.arch == "x86_64"):
self.features.pae = True
else:
self.features.pae = self.capsinfo.guest.supports_pae()
if (self.osinfo.is_windows() and
self._hyperv_supported() and
self.conn.check_support(self.conn.SUPPORT_CONN_HYPERV_VAPIC)):
if self.features.hyperv_relaxed is None:
self.features.hyperv_relaxed = True
if self.features.hyperv_vapic is None:
self.features.hyperv_vapic = True
if self.features.hyperv_spinlocks is None:
self.features.hyperv_spinlocks = True
if self.features.hyperv_spinlocks_retries is None:
self.features.hyperv_spinlocks_retries = 8191
def _set_pm_defaults(self):
# When the suspend feature is exposed to VMs, an ACPI shutdown
# event triggers a suspend in the guest, which causes a lot of
@ -1113,7 +1079,7 @@ class Guest(XMLBuilder):
if not self.has_spice():
return
if (self.features.vmport == "default" and
if (self.features.vmport is None and
self.os.is_x86() and
self.conn.check_support(self.conn.SUPPORT_CONN_VMPORT)):
self.features.vmport = False

View File

@ -744,6 +744,14 @@ class XMLBuilder(object):
self._xmlstate.xmlapi.node_force_remove(xpath)
self._set_child_xpaths()
def _prop_is_unset(self, propname):
"""
Return True if the property name has never had a value set
"""
if getattr(self, propname):
return False
return propname not in self._propstore
#################################
# Private XML building routines #