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