[libvirt] [PATCH] metadata: group metadata next to description

Eric Blake eblake at redhat.com
Wed Jan 25 00:28:34 UTC 2012


It's better to group all the metadata together.  This is a
cosmetic output change; since the RNG allows interleave, it
doesn't matter where the user stuck it on input, and an XPath
query will find it in the same location when parsing the output.

* src/conf/domain_conf.c (virDomainDefFormatInternal): Output
metadata earlier.
* docs/formatdomain.html.in: Update documentation.
* tests/domainsnapshotxml2xmlout/metadata.xml: Update test.
* tests/qemuxml2xmloutdata/qemuxml2xmlout-metadata.xml: Likewise.
---

As threatened here:

> I also think that this section belongs up next to <description>; but
> I'll move it as a followup patch.

 docs/formatdomain.html.in                          |   39 +++++++----------
 src/conf/domain_conf.c                             |   47 ++++++++++----------
 tests/domainsnapshotxml2xmlout/metadata.xml        |    8 ++--
 .../qemuxml2xmloutdata/qemuxml2xmlout-metadata.xml |    8 ++--
 4 files changed, 47 insertions(+), 55 deletions(-)

diff --git a/docs/formatdomain.html.in b/docs/formatdomain.html.in
index 6b025e8..dca9a81 100644
--- a/docs/formatdomain.html.in
+++ b/docs/formatdomain.html.in
@@ -33,6 +33,10 @@
   <name>fv0</name>
   <uuid>4dea22b31d52d8f32516782e98ab3fa0</uuid>
   <description>Some human readable description</description>
+  <metadata>
+    <app1:foo xmlns:app1="http://app1.org/app1/">..</app1:foo>
+    <app2:bar xmlns:app2="http://app1.org/app2/">..</app2:bar>
+  </metadata>
   ...</pre>

     <dl>
@@ -56,9 +60,18 @@

       <dt><code>description</code></dt>
       <dd>The content of the <code>description</code> element provides a
-      human readable description of the virtual machine. This data is not
-      used by libvirt in any way, it can contain any information the user
-      wants. <span class="since">Since 0.7.2</span></dd>
+        human readable description of the virtual machine. This data is not
+        used by libvirt in any way, it can contain any information the user
+        wants. <span class="since">Since 0.7.2</span></dd>
+
+      <dt><code>metadata</code></dt>
+      <dd>The <code>metadata</code> node can be used by applications
+        to store custom metadata in the form of XML
+        nodes/trees. Applications must use custom namespaces on their
+        XML nodes/trees, with only one top-level element per namespace
+        (if the application needs structure, they should have
+        sub-elements to their namespace
+        element). <span class="since">Since 0.9.10</span></dd>
     </dl>

     <h3><a name="elementsOS">Operating system booting</a></h3>
@@ -3556,26 +3569,6 @@ qemu-kvm -net nic,model=? /dev/null
       sub-element <code>label</code> are supported.
     </p>

-    <h3><a name="customMetadata">Custom metadata</a></h3>
-
-<pre>
-  ...
-  <metadata>
-    <app1:foo xmlns:app1="http://app1.org/app1/">..</app1:foo>
-    <app2:bar xmlns:app2="http://app1.org/app2/">..</app2:bar>
-  </metadata>
-  ...</pre>
-
-    <dl>
-      <dt><code>metadata</code></dt>
-      <dd>The <code>metadata</code> node can be used by applications to
-      store custom metadata in the form of XML nodes/trees. Applications
-      must use custom namespaces on their XML nodes/trees, with only
-      one top-level element per namespace (if the application needs
-      structure, they should have sub-elements to their namespace
-      element). <span class="since">Since 0.9.10</span></dd>
-    </dl>
-
     <h2><a name="examples">Example configs</a></h2>

     <p>
diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index f2c8d02..e872396 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -11431,6 +11431,29 @@ virDomainDefFormatInternal(virDomainDefPtr def,
     virBufferEscapeString(buf, "  <description>%s</description>\n",
                           def->description);

+    if (def->metadata) {
+        xmlBufferPtr xmlbuf;
+        int oldIndentTreeOutput = xmlIndentTreeOutput;
+
+        /* Indentation on output requires that we previously set
+         * xmlKeepBlanksDefault to 0 when parsing; also, libxml does 2
+         * spaces per level of indentation of intermediate elements,
+         * but no leading indentation before the starting element.
+         * Thankfully, libxml maps what looks like globals into
+         * thread-local uses, so we are thread-safe.  */
+        xmlIndentTreeOutput = 1;
+        xmlbuf = xmlBufferCreate();
+        if (xmlNodeDump(xmlbuf, def->metadata->doc, def->metadata,
+                        virBufferGetIndent(buf, false) / 2 + 1, 1) < 0) {
+            xmlBufferFree(xmlbuf);
+            xmlIndentTreeOutput = oldIndentTreeOutput;
+            goto cleanup;
+        }
+        virBufferAsprintf(buf, "  %s\n", (char *) xmlBufferContent(xmlbuf));
+        xmlBufferFree(xmlbuf);
+        xmlIndentTreeOutput = oldIndentTreeOutput;
+    }
+
     virBufferAsprintf(buf, "  <memory>%lu</memory>\n", def->mem.max_balloon);
     virBufferAsprintf(buf, "  <currentMemory>%lu</currentMemory>\n",
                       def->mem.cur_balloon);
@@ -11844,30 +11867,6 @@ virDomainDefFormatInternal(virDomainDefPtr def,
             goto cleanup;
     }

-    /* Custom metadata comes at the end */
-    if (def->metadata) {
-        xmlBufferPtr xmlbuf;
-        int oldIndentTreeOutput = xmlIndentTreeOutput;
-
-        /* Indentation on output requires that we previously set
-         * xmlKeepBlanksDefault to 0 when parsing; also, libxml does 2
-         * spaces per level of indentation of intermediate elements,
-         * but no leading indentation before the starting element.
-         * Thankfully, libxml maps what looks like globals into
-         * thread-local uses, so we are thread-safe.  */
-        xmlIndentTreeOutput = 1;
-        xmlbuf = xmlBufferCreate();
-        if (xmlNodeDump(xmlbuf, def->metadata->doc, def->metadata,
-                        virBufferGetIndent(buf, false) / 2 + 1, 1) < 0) {
-            xmlBufferFree(xmlbuf);
-            xmlIndentTreeOutput = oldIndentTreeOutput;
-            goto cleanup;
-        }
-        virBufferAsprintf(buf, "  %s\n", (char *) xmlBufferContent(xmlbuf));
-        xmlBufferFree(xmlbuf);
-        xmlIndentTreeOutput = oldIndentTreeOutput;
-    }
-
     virBufferAddLit(buf, "</domain>\n");

     if (virBufferError(buf))
diff --git a/tests/domainsnapshotxml2xmlout/metadata.xml b/tests/domainsnapshotxml2xmlout/metadata.xml
index 45180c9..f0ad70b 100644
--- a/tests/domainsnapshotxml2xmlout/metadata.xml
+++ b/tests/domainsnapshotxml2xmlout/metadata.xml
@@ -9,6 +9,10 @@
   <domain type='qemu'>
     <name>QEMUGuest1</name>
     <uuid>c7a5fdbd-edaf-9455-926a-d65c16db1809</uuid>
+    <metadata>
+      <app1:foo xmlns:app1="http://foo.org/">fooish</app1:foo>
+      <app2:bar xmlns:app2="http://bar.com/" maman="baz">barish</app2:bar>
+    </metadata>
     <memory>219100</memory>
     <currentMemory>219100</currentMemory>
     <vcpu cpuset='1-4,8-20,525'>1</vcpu>
@@ -30,9 +34,5 @@
       <controller type='ide' index='0'/>
       <memballoon model='virtio'/>
     </devices>
-    <metadata>
-      <app1:foo xmlns:app1="http://foo.org/">fooish</app1:foo>
-      <app2:bar xmlns:app2="http://bar.com/" maman="baz">barish</app2:bar>
-    </metadata>
   </domain>
 </domainsnapshot>
diff --git a/tests/qemuxml2xmloutdata/qemuxml2xmlout-metadata.xml b/tests/qemuxml2xmloutdata/qemuxml2xmlout-metadata.xml
index a6888ee..a029404 100644
--- a/tests/qemuxml2xmloutdata/qemuxml2xmlout-metadata.xml
+++ b/tests/qemuxml2xmloutdata/qemuxml2xmlout-metadata.xml
@@ -1,6 +1,10 @@
 <domain type='qemu'>
   <name>QEMUGuest1</name>
   <uuid>c7a5fdbd-edaf-9455-926a-d65c16db1809</uuid>
+  <metadata>
+    <app1:foo xmlns:app1="http://foo.org/">fooish</app1:foo>
+    <app2:bar xmlns:app2="http://bar.com/" maman="baz">barish</app2:bar>
+  </metadata>
   <memory>219100</memory>
   <currentMemory>219100</currentMemory>
   <vcpu cpuset='1-4,8-20,525'>1</vcpu>
@@ -22,8 +26,4 @@
     <controller type='ide' index='0'/>
     <memballoon model='virtio'/>
   </devices>
-  <metadata>
-    <app1:foo xmlns:app1="http://foo.org/">fooish</app1:foo>
-    <app2:bar xmlns:app2="http://bar.com/" maman="baz">barish</app2:bar>
-  </metadata>
 </domain>
-- 
1.7.7.5




More information about the libvir-list mailing list