summaryrefslogtreecommitdiff
path: root/xml.go
diff options
context:
space:
mode:
Diffstat (limited to 'xml.go')
-rw-r--r--xml.go107
1 files changed, 103 insertions, 4 deletions
diff --git a/xml.go b/xml.go
index d2b271c..8ccd6d4 100644
--- a/xml.go
+++ b/xml.go
@@ -194,6 +194,36 @@ func setRandomMacs(domcfg *libvirtxml.Domain) {
// there might be something interesting in a VM
// 'standard' here means what I think is standard
func dumpNonStandardXML(domcfg *libvirtxml.Domain) {
+ // dump type
+ if domcfg.Type == "kvm" {
+ domcfg.Type = ""
+ } else {
+ fmt.Printf("type: %+v\n", domcfg.Type)
+ }
+
+ // dump normal OS settings
+ var standardOS bool = false
+ if domcfg.OS != nil {
+ if domcfg.OS.Type != nil {
+ // OS Type: &{Arch:x86_64 Machine:pc-i440fx-5.2 Type:hvm}
+ t := domcfg.OS.Type
+ if t.Arch == "x86_64" || t.Machine == "pc-i440fx-5.2" {
+ standardOS = true
+ }
+ }
+ }
+ if standardOS {
+ domcfg.OS = nil
+ } else {
+ fmt.Printf("OS: %+v\n", domcfg.OS)
+ fmt.Printf("OS Type: %+v\n", domcfg.OS.Type)
+ }
+
+ // ignore XMLName and IOThreads probably
+ // skip is hard coded in isDomainEmpty() function
+ // fmt.Printf("XMLName: %+v\n", domcfg.XMLName)
+ // fmt.Printf("IOThreads: %+v\n", domcfg.IOThreads)
+
// dump all the clock stuff if it's standard
var normalclock bool = true
if domcfg.Clock.Offset != "utc" {
@@ -472,13 +502,20 @@ func dumpNonStandardXML(domcfg *libvirtxml.Domain) {
}
// dumpLibvirtxmlDomainNames()
- if libvirtxmlDomainEmpty(*domcfg.Devices) {
- fmt.Println("Domain Devices are empty")
+ if libvirtxmlDomainDevicesEmpty(*domcfg.Devices) {
+ // fmt.Println("Domain Devices are empty")
domcfg.Devices = nil
} else {
fmt.Println("Domain Devices are not empty")
}
+ if libvirtxmlDomainEmpty(*domcfg) {
+ // fmt.Println("Domain Devices are empty")
+ domcfg = nil
+ } else {
+ fmt.Println("Domain is not yet empty")
+ }
+
updatedXML, err := xml.MarshalIndent(domcfg, "", " ")
if err != nil {
fmt.Printf("Failed to marshal updated XML: %v\n", err)
@@ -512,14 +549,73 @@ func dumpLibvirtxmlDomainNames() {
}
// dump out all the fields in libvirtxml.DomainDeviceList
-func libvirtxmlDomainEmpty(mydom libvirtxml.DomainDeviceList) bool {
+func libvirtxmlDomainDevicesEmpty(mydom libvirtxml.DomainDeviceList) bool {
+ var empty bool = true
+ // Get the reflection object of the variable
+ v := reflect.ValueOf(mydom)
+
+ // Ensure that we are working with a struct
+ if v.Kind() == reflect.Struct {
+ // fmt.Println("Fields and values in libvirtxml.DomainDeviceList:")
+
+ // Loop through each field in the struct
+ for i := 0; i < v.NumField(); i++ {
+ // Get field name
+ field := v.Type().Field(i).Name
+
+ // Get field value
+ value := v.Field(i)
+
+ if !value.IsValid() {
+ fmt.Printf("Field: %s is nil or invalid\n", field)
+ continue
+ }
+
+ // Check if the field is a string, array, or slice
+ switch value.Kind() {
+ case reflect.String:
+ if value.String() != "" {
+ fmt.Printf("Field: %s is a String with value: %s\n", field, value.String())
+ empty = false
+ }
+ case reflect.Slice:
+ if value.Len() != 0 {
+ fmt.Printf("Field: %s is a Slice with length: %d\n", field, value.Len())
+ empty = false
+ }
+ case reflect.Array:
+ if value.Len() != 0 {
+ fmt.Printf("Field: %s is an Array with length: %d\n", field, value.Len())
+ empty = false
+ }
+ case reflect.Ptr:
+ if !value.IsValid() {
+ fmt.Println("Field ptr: value:", value)
+ fmt.Printf("Field ptr: %s is of type: %s\n", field, value.Kind())
+ empty = false
+ }
+ default:
+ fmt.Printf("Field: %s is of type: %s\n", field, value.Kind())
+ empty = false
+ }
+ // Print the field name and value
+ // fmt.Printf("Field: %s, Value: %v\n", field, value)
+ }
+ } else {
+ fmt.Println("Provided variable is not a struct.")
+ }
+ return empty
+}
+
+// dump out all the fields in libvirtxml.DomainDeviceList
+func libvirtxmlDomainEmpty(mydom libvirtxml.Domain) bool {
var empty bool = true
// Get the reflection object of the variable
v := reflect.ValueOf(mydom)
// Ensure that we are working with a struct
if v.Kind() == reflect.Struct {
- fmt.Println("Fields and values in libvirtxml.DomainDeviceList:")
+ // fmt.Println("Fields and values in libvirtxml.DomainDeviceList:")
// Loop through each field in the struct
for i := 0; i < v.NumField(); i++ {
@@ -533,6 +629,9 @@ func libvirtxmlDomainEmpty(mydom libvirtxml.DomainDeviceList) bool {
fmt.Printf("Field: %s is nil or invalid\n", field)
continue
}
+ if (field == "IOThreads") || (field == "XMLName") {
+ continue
+ }
// Check if the field is a string, array, or slice
switch value.Kind() {