1# 2# Copyright 2010, 2013 Red Hat, Inc. 3# 4# This work is licensed under the GNU GPLv2 or later. 5# See the COPYING file in the top-level directory. 6 7from ..xmlbuilder import XMLBuilder, XMLProperty 8 9 10class DomainFeatures(XMLBuilder): 11 """ 12 Class for generating <features> XML 13 """ 14 XML_NAME = "features" 15 _XML_PROP_ORDER = ["acpi", "apic", "pae", "gic_version"] 16 17 acpi = XMLProperty("./acpi", is_bool=True) 18 apic = XMLProperty("./apic", is_bool=True) 19 pae = XMLProperty("./pae", is_bool=True) 20 gic_version = XMLProperty("./gic/@version") 21 22 hap = XMLProperty("./hap", is_bool=True) 23 viridian = XMLProperty("./viridian", is_bool=True) 24 privnet = XMLProperty("./privnet", is_bool=True) 25 26 pmu = XMLProperty("./pmu/@state", is_onoff=True) 27 eoi = XMLProperty("./apic/@eoi", is_onoff=True) 28 29 hyperv_reset = XMLProperty("./hyperv/reset/@state", is_onoff=True) 30 hyperv_vapic = XMLProperty("./hyperv/vapic/@state", is_onoff=True) 31 hyperv_relaxed = XMLProperty("./hyperv/relaxed/@state", is_onoff=True) 32 hyperv_spinlocks = XMLProperty("./hyperv/spinlocks/@state", is_onoff=True) 33 hyperv_spinlocks_retries = XMLProperty("./hyperv/spinlocks/@retries", 34 is_int=True) 35 hyperv_synic = XMLProperty("./hyperv/synic/@state", is_onoff=True) 36 37 vmport = XMLProperty("./vmport/@state", is_onoff=True) 38 kvm_hidden = XMLProperty("./kvm/hidden/@state", is_onoff=True) 39 kvm_hint_dedicated = XMLProperty("./kvm/hint-dedicated/@state", is_onoff=True) 40 pvspinlock = XMLProperty("./pvspinlock/@state", is_onoff=True) 41 42 smm = XMLProperty("./smm/@state", is_onoff=True) 43 vmcoreinfo = XMLProperty("./vmcoreinfo/@state", is_onoff=True) 44 45 46 ################## 47 # Default config # 48 ################## 49 50 def set_defaults(self, guest): 51 if guest.os.is_container(): 52 self.acpi = None 53 self.apic = None 54 self.pae = None 55 if guest.is_full_os_container() and guest.type != "vz": 56 self.privnet = True 57 return 58 59 if not guest.os.is_hvm(): 60 return 61 62 capsinfo = guest.lookup_capsinfo() 63 if self._prop_is_unset("acpi"): 64 self.acpi = capsinfo.guest.supports_acpi() 65 if self._prop_is_unset("apic"): 66 self.apic = capsinfo.guest.supports_apic() 67 if self._prop_is_unset("pae"): 68 if (guest.os.is_hvm() and 69 guest.type == "xen" and 70 guest.os.arch == "x86_64"): 71 self.pae = True 72 else: 73 self.pae = capsinfo.guest.supports_pae() 74 75 if (guest.hyperv_supported() and 76 self.conn.support.conn_hyperv_vapic()): 77 if self.hyperv_relaxed is None: 78 self.hyperv_relaxed = True 79 if self.hyperv_vapic is None: 80 self.hyperv_vapic = True 81 if self.hyperv_spinlocks is None: 82 self.hyperv_spinlocks = True 83 if self.hyperv_spinlocks_retries is None: 84 self.hyperv_spinlocks_retries = 8191 85