[libvirt] [PATCH] conf: Don't output <cpu> tag if it contains no information.

Andrea Bolognani abologna at redhat.com
Fri Apr 10 13:09:59 UTC 2015


The tag is already marked as optional in the schema, so no changes
are needed there.

RHBZ: https://bugzilla.redhat.com/show_bug.cgi?id=1202606
---

Hi everyone,

this is my first contribution to libvirt so I wholeheartedly welcome
any criticism, suggestion or recommendation :)

Cheers.

 src/conf/cpu_conf.c                                | 33 ++++++++++++++++------
 tests/qemuxml2argvdata/qemuxml2argv-cpu-empty.xml  | 23 +++++++++++++++
 .../qemuxml2xmlout-cpu-empty.xml                   | 21 ++++++++++++++
 tests/qemuxml2xmltest.c                            |  1 +
 4 files changed, 69 insertions(+), 9 deletions(-)
 create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-cpu-empty.xml
 create mode 100644 tests/qemuxml2xmloutdata/qemuxml2xmlout-cpu-empty.xml

diff --git a/src/conf/cpu_conf.c b/src/conf/cpu_conf.c
index cd3882d..8f65d55 100644
--- a/src/conf/cpu_conf.c
+++ b/src/conf/cpu_conf.c
@@ -435,13 +435,14 @@ virCPUDefFormatBufFull(virBufferPtr buf,
                        bool updateCPU)
 {
     int ret = -1;
+    virBuffer attributeBuf = VIR_BUFFER_INITIALIZER;
     virBuffer childrenBuf = VIR_BUFFER_INITIALIZER;
     int indent = virBufferGetIndent(buf, false);
 
     if (!def)
         return 0;
 
-    virBufferAddLit(buf, "<cpu");
+    /* Format attributes */
     if (def->type == VIR_CPU_TYPE_GUEST) {
         const char *tmp;
 
@@ -451,7 +452,7 @@ virCPUDefFormatBufFull(virBufferPtr buf,
                                _("Unexpected CPU mode %d"), def->mode);
                 goto cleanup;
             }
-            virBufferAsprintf(buf, " mode='%s'", tmp);
+            virBufferAsprintf(&attributeBuf, " mode='%s'", tmp);
         }
 
         if (def->model &&
@@ -463,10 +464,11 @@ virCPUDefFormatBufFull(virBufferPtr buf,
                                def->match);
                 goto cleanup;
             }
-            virBufferAsprintf(buf, " match='%s'", tmp);
+            virBufferAsprintf(&attributeBuf, " match='%s'", tmp);
         }
     }
 
+    /* Format children */
     virBufferAdjustIndent(&childrenBuf, indent + 2);
     if (def->arch)
         virBufferAsprintf(&childrenBuf, "<arch>%s</arch>\n",
@@ -477,16 +479,29 @@ virCPUDefFormatBufFull(virBufferPtr buf,
     if (virDomainNumaDefCPUFormat(&childrenBuf, numa) < 0)
         goto cleanup;
 
-    if (virBufferUse(&childrenBuf)) {
-        virBufferAddLit(buf, ">\n");
-        virBufferAddBuffer(buf, &childrenBuf);
-        virBufferAddLit(buf, "</cpu>\n");
-    } else {
-        virBufferAddLit(buf, "/>\n");
+    /* Put it all together */
+    if (virBufferUse(&attributeBuf) || virBufferUse(&childrenBuf)) {
+
+        /* Opening tag */
+        virBufferAddLit(buf, "<cpu");
+
+        /* Attributes (if any) */
+        if (virBufferUse(&attributeBuf))
+            virBufferAddBuffer(buf, &attributeBuf);
+
+        /* Children (if any) and closing tag */
+        if (virBufferUse(&childrenBuf)) {
+            virBufferAddLit(buf, ">\n");
+            virBufferAddBuffer(buf, &childrenBuf);
+            virBufferAddLit(buf, "</cpu>\n");
+        } else {
+            virBufferAddLit(buf, "/>\n");
+        }
     }
 
     ret = 0;
  cleanup:
+    virBufferFreeAndReset(&attributeBuf);
     virBufferFreeAndReset(&childrenBuf);
     return ret;
 }
diff --git a/tests/qemuxml2argvdata/qemuxml2argv-cpu-empty.xml b/tests/qemuxml2argvdata/qemuxml2argv-cpu-empty.xml
new file mode 100644
index 0000000..2a79826
--- /dev/null
+++ b/tests/qemuxml2argvdata/qemuxml2argv-cpu-empty.xml
@@ -0,0 +1,23 @@
+<domain type='kvm'>
+  <name>cpu-empty</name>
+  <uuid>1aed4c39-ad6e-4a78-9264-4ce996290d17</uuid>
+  <memory unit='KiB'>4000768</memory>
+  <currentMemory unit='KiB'>1048576</currentMemory>
+  <vcpu placement='static'>1</vcpu>
+  <os>
+    <type arch='x86_64' machine='pc'>hvm</type>
+    <boot dev='hd'/>
+  </os>
+  <cpu>
+  </cpu>
+  <clock offset='utc'/>
+  <on_poweroff>destroy</on_poweroff>
+  <on_reboot>restart</on_reboot>
+  <on_crash>destroy</on_crash>
+  <devices>
+    <emulator>/usr/bin/qemu-kvm</emulator>
+    <controller type='usb' index='0'/>
+    <controller type='pci' index='0' model='pci-root'/>
+    <memballoon model='virtio'/>
+  </devices>
+</domain>
diff --git a/tests/qemuxml2xmloutdata/qemuxml2xmlout-cpu-empty.xml b/tests/qemuxml2xmloutdata/qemuxml2xmlout-cpu-empty.xml
new file mode 100644
index 0000000..e678607
--- /dev/null
+++ b/tests/qemuxml2xmloutdata/qemuxml2xmlout-cpu-empty.xml
@@ -0,0 +1,21 @@
+<domain type='kvm'>
+  <name>cpu-empty</name>
+  <uuid>1aed4c39-ad6e-4a78-9264-4ce996290d17</uuid>
+  <memory unit='KiB'>4000768</memory>
+  <currentMemory unit='KiB'>1048576</currentMemory>
+  <vcpu placement='static'>1</vcpu>
+  <os>
+    <type arch='x86_64' machine='pc'>hvm</type>
+    <boot dev='hd'/>
+  </os>
+  <clock offset='utc'/>
+  <on_poweroff>destroy</on_poweroff>
+  <on_reboot>restart</on_reboot>
+  <on_crash>destroy</on_crash>
+  <devices>
+    <emulator>/usr/bin/qemu-kvm</emulator>
+    <controller type='usb' index='0'/>
+    <controller type='pci' index='0' model='pci-root'/>
+    <memballoon model='virtio'/>
+  </devices>
+</domain>
diff --git a/tests/qemuxml2xmltest.c b/tests/qemuxml2xmltest.c
index 817e408..cd0b280 100644
--- a/tests/qemuxml2xmltest.c
+++ b/tests/qemuxml2xmltest.c
@@ -361,6 +361,7 @@ mymain(void)
 
     DO_TEST("clock-utc");
     DO_TEST("clock-localtime");
+    DO_TEST_DIFFERENT("cpu-empty");
     DO_TEST("cpu-kvmclock");
     DO_TEST("cpu-host-kvmclock");
     DO_TEST("cpu-host-passthrough-features");
-- 
2.1.0




More information about the libvir-list mailing list