This commit adds support for domain features. It does so by introducing
a new family of types DomainFeature*. The aggregate type
DomainFeatureList has been added to the Domain type to plumb in the new
type family. Testing has also been added in domain_test.go
---
domain.go | 91 +++++++++++++++++++++++++++++++++++++++++++++++-----------
domain_test.go | 55 +++++++++++++++++++++++++++++++++++
2 files changed, 130 insertions(+), 16 deletions(-)
diff --git a/domain.go b/domain.go
index cccd9a6..c9ffaef 100644
--- a/domain.go
+++ b/domain.go
@@ -371,23 +371,82 @@ type DomainCPU struct {
Features []DomainCPUFeature `xml:"feature"`
}
+type DomainFeature struct {
+ State string `xml:"state,attr,omitempty"`
+}
+
+type DomainFeatureAPIC struct {
+ DomainFeature
+ EOI string `xml:"eio,attr,omitempty"`
+}
+
+type DomainFeatureVendorId struct {
+ DomainFeature
+ Value string `xml:"value,attr,omitempty"`
+}
+
+type DomainFeatureSpinlocks struct {
+ DomainFeature
+ Retries uint `xml:"retries,attr,omitempty"`
+}
+
+type DomainFeatureHyperV struct {
+ DomainFeature
+ Relaxed *DomainFeature `xml:"relaxed,omitempty"`
+ VAPIC *DomainFeature `xml:"vapic,omitempty"`
+ Spinlocks *DomainFeatureSpinlocks `xml:"spinlocks,omitempty"`
+ VPIndex *DomainFeature `xml:"vpindex,omitempty"`
+ Runtime *DomainFeature `xml:"runtime,omitempty"`
+ Synic *DomainFeature `xml:"synic,omitempty"`
+ STimer *DomainFeature `xml:"stimer,omitempty"`
+ Reset *DomainFeature `xml:"reset,omitempty"`
+ VendorId *DomainFeatureVendorId `xml:"vendor_id,omitempty"`
+}
+
+type DomainFeatureKVM struct {
+ DomainFeature
+ Hidden *DomainFeature `xml:"hidden,omitempty"`
+}
+
+type DomainFeatureGIC struct {
+ DomainFeature
+ Version string `xml:"version,attr,omitempty"`
+}
+
+type DomainFeatureList struct {
+ PAE *DomainFeature `xml:"pae,omitempty"`
+ ACPI *DomainFeature `xml:"acpi,omitempty"`
+ APIC *DomainFeatureAPIC `xml:"apic,omitempty"`
+ HAP *DomainFeature `xml:"hap,omitempty"`
+ Viridian *DomainFeature `xml:"viridian,omitempty"`
+ PrivNet *DomainFeature `xml:"privnet,omitempty"`
+ HyperV *DomainFeatureHyperV `xml:"hyperv,omitempty"`
+ KVM *DomainFeatureKVM `xml:"kvm,omitempty"`
+ PVSpinlock *DomainFeature `xml:"pvspinlock,omitempty"`
+ PMU *DomainFeature `xml:"pmu,omitempty"`
+ VMPort *DomainFeature `xml:"vmport,omitempty"`
+ GIC *DomainFeatureGIC `xml:"gic,omitempty"`
+ SMM *DomainFeature `xml:"smm,omitempty"`
+}
+
type Domain struct {
- XMLName xml.Name `xml:"domain"`
- Type string `xml:"type,attr,omitempty"`
- Name string `xml:"name"`
- UUID string `xml:"uuid,omitempty"`
- Memory *DomainMemory `xml:"memory"`
- CurrentMemory *DomainMemory `xml:"currentMemory"`
- MaximumMemory *DomainMaxMemory `xml:"maxMemory"`
- VCPU *DomainVCPU `xml:"vcpu"`
- CPU *DomainCPU `xml:"cpu"`
- Resource *DomainResource `xml:"resource"`
- Devices *DomainDeviceList `xml:"devices"`
- OS *DomainOS `xml:"os"`
- SysInfo *DomainSysInfo `xml:"sysinfo"`
- OnPoweroff string `xml:"on_poweroff,omitempty"`
- OnReboot string `xml:"on_reboot,omitempty"`
- OnCrash string `xml:"on_crash,omitempty"`
+ XMLName xml.Name `xml:"domain"`
+ Type string `xml:"type,attr,omitempty"`
+ Name string `xml:"name"`
+ UUID string `xml:"uuid,omitempty"`
+ Memory *DomainMemory `xml:"memory"`
+ CurrentMemory *DomainMemory `xml:"currentMemory"`
+ MaximumMemory *DomainMaxMemory `xml:"maxMemory"`
+ VCPU *DomainVCPU `xml:"vcpu"`
+ CPU *DomainCPU `xml:"cpu"`
+ Resource *DomainResource `xml:"resource"`
+ Devices *DomainDeviceList `xml:"devices"`
+ OS *DomainOS `xml:"os"`
+ SysInfo *DomainSysInfo `xml:"sysinfo"`
+ OnPoweroff string `xml:"on_poweroff,omitempty"`
+ OnReboot string `xml:"on_reboot,omitempty"`
+ OnCrash string `xml:"on_crash,omitempty"`
+ Features *DomainFeatureList `xml:"features,omitempty"`
}
func (d *Domain) Unmarshal(doc string) error {
diff --git a/domain_test.go b/domain_test.go
index 06d585c..e25007e 100644
--- a/domain_test.go
+++ b/domain_test.go
@@ -745,6 +745,61 @@ var domainTestData = []struct {
`</domain>`,
},
},
+ {
+ Object: &Domain{
+ Type: "kvm",
+ Name: "test",
+ Features: &DomainFeatureList{
+ PAE: &DomainFeature{},
+ ACPI: &DomainFeature{},
+ APIC: &DomainFeatureAPIC{},
+ HAP: &DomainFeature{},
+ PrivNet: &DomainFeature{},
+ HyperV: &DomainFeatureHyperV{
+ Relaxed: &DomainFeature{State: "on"},
+ VAPIC: &DomainFeature{State: "on"},
+ Spinlocks: &DomainFeatureSpinlocks{DomainFeature{State: "on"}, 4096},
+ VPIndex: &DomainFeature{State: "on"},
+ Runtime: &DomainFeature{State: "on"},
+ Synic: &DomainFeature{State: "on"},
+ Reset: &DomainFeature{State: "on"},
+ VendorId: &DomainFeatureVendorId{DomainFeature{State: "on"},
"KVM Hv"},
+ },
+ KVM: &DomainFeatureKVM{
+ Hidden: &DomainFeature{State: "on"},
+ },
+ PVSpinlock: &DomainFeature{State: "on"},
+ GIC: &DomainFeatureGIC{Version: "2"},
+ },
+ },
+ Expected: []string{
+ `<domain type="kvm">`,
+ ` <name>test</name>`,
+ ` <features>`,
+ ` <pae></pae>`,
+ ` <acpi></acpi>`,
+ ` <apic></apic>`,
+ ` <hap></hap>`,
+ ` <privnet></privnet>`,
+ ` <hyperv>`,
+ ` <relaxed state="on"></relaxed>`,
+ ` <vapic state="on"></vapic>`,
+ ` <spinlocks state="on"
retries="4096"></spinlocks>`,
+ ` <vpindex state="on"></vpindex>`,
+ ` <runtime state="on"></runtime>`,
+ ` <synic state="on"></synic>`,
+ ` <reset state="on"></reset>`,
+ ` <vendor_id state="on" value="KVM
Hv"></vendor_id>`,
+ ` </hyperv>`,
+ ` <kvm>`,
+ ` <hidden state="on"></hidden>`,
+ ` </kvm>`,
+ ` <pvspinlock state="on"></pvspinlock>`,
+ ` <gic version="2"></gic>`,
+ ` </features>`,
+ `</domain>`,
+ },
+ },
}
func TestDomain(t *testing.T) {
--
2.11.0