Blob Blame History Raw
From a3b40814f053009f0f40ec7b4ced3ef63be5d082 Mon Sep 17 00:00:00 2001
Message-Id: <a3b40814f053009f0f40ec7b4ced3ef63be5d082@dist-git>
From: Eric Blake <eblake@redhat.com>
Date: Wed, 26 Feb 2014 14:54:19 +0100
Subject: [PATCH] storage: expose volume meta-type in XML

https://bugzilla.redhat.com/show_bug.cgi?id=1032370

I got annoyed at having to use both 'virsh vol-list $pool --details'
AND 'virsh vol-dumpxml $vol $pool' to learn if I had populated
the volume correctly.  Since two-thirds of the data present in
virStorageVolGetInfo() already appears in virStorageVolGetXMLDesc(),
this just adds the remaining piece of information, as:

<volume type='...'>
  ...
</volume>

* docs/formatstorage.html.in: Document new <volume type=...>.
* docs/schemas/storagevol.rng (vol): Add it to RelaxNG.
* src/conf/storage_conf.h (virStorageVolTypeToString): Declare.
* src/conf/storage_conf.c (virStorageVolTargetDefFormat): Output
the metatype.
(virStorageVolDefParseXML): Parse it, for unit tests.
* tests/storagevolxml2xmlout/vol-*.xml: Update tests to match.

Signed-off-by: Eric Blake <eblake@redhat.com>
(cherry picked from commit 1b5c8d4cbcedc25f70837f9a0aff3dbbf8899c68)
Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
---
 docs/formatstorage.html.in                         | 10 +++++++---
 docs/schemas/storagevol.rng                        | 10 ++++++++++
 src/conf/storage_conf.c                            | 19 ++++++++++++++++++-
 src/conf/storage_conf.h                            |  1 +
 tests/storagevolxml2xmlin/vol-logical-backing.xml  |  2 +-
 tests/storagevolxml2xmlin/vol-logical.xml          |  2 +-
 tests/storagevolxml2xmlin/vol-partition.xml        |  2 +-
 tests/storagevolxml2xmlin/vol-sheepdog.xml         |  2 +-
 tests/storagevolxml2xmlout/vol-file-backing.xml    |  2 +-
 tests/storagevolxml2xmlout/vol-file-naming.xml     |  2 +-
 tests/storagevolxml2xmlout/vol-file.xml            |  2 +-
 tests/storagevolxml2xmlout/vol-logical-backing.xml |  2 +-
 tests/storagevolxml2xmlout/vol-logical.xml         |  2 +-
 tests/storagevolxml2xmlout/vol-partition.xml       |  2 +-
 tests/storagevolxml2xmlout/vol-qcow2-0.10-lazy.xml |  2 +-
 tests/storagevolxml2xmlout/vol-qcow2-1.1.xml       |  2 +-
 tests/storagevolxml2xmlout/vol-qcow2-lazy.xml      |  2 +-
 tests/storagevolxml2xmlout/vol-qcow2-nobacking.xml |  2 +-
 tests/storagevolxml2xmlout/vol-qcow2.xml           |  2 +-
 tests/storagevolxml2xmlout/vol-sheepdog.xml        |  2 +-
 20 files changed, 52 insertions(+), 20 deletions(-)

diff --git a/docs/formatstorage.html.in b/docs/formatstorage.html.in
index 278f89b..30ae538 100644
--- a/docs/formatstorage.html.in
+++ b/docs/formatstorage.html.in
@@ -267,14 +267,18 @@
 
     <h2><a name="StorageVol">Storage volume XML</a></h2>
     <p>
-      A storage volume will be either a file or a device node.
-      The storage volume XML format is available <span class="since">since 0.4.1</span>
+      A storage volume will generally be either a file or a device
+      node; <span class="since">since 1.2.0</span>, an optional
+      output-only attribute <code>type</code> lists the actual type
+      (file, block, dir, or network), which is also available
+      from <code>virStorageVolGetInfo()</code>.  The storage volume
+      XML format is available <span class="since">since 0.4.1</span>
     </p>
 
     <h3><a name="StorageVolFirst">General metadata</a></h3>
 
     <pre>
-      &lt;volume&gt;
+      &lt;volume type='file'&gt;
         &lt;name&gt;sparse.img&lt;/name&gt;
         &lt;key&gt;/var/lib/xen/images/sparse.img&lt;/key&gt;
         &lt;allocation&gt;0&lt;/allocation&gt;
diff --git a/docs/schemas/storagevol.rng b/docs/schemas/storagevol.rng
index e79bc35..f8081d9 100644
--- a/docs/schemas/storagevol.rng
+++ b/docs/schemas/storagevol.rng
@@ -13,6 +13,16 @@
 
   <define name='vol'>
     <element name='volume'>
+      <optional>
+        <attribute name='type'>
+          <choice>
+            <value>file</value>
+            <value>block</value>
+            <value>dir</value>
+            <value>network</value>
+          </choice>
+        </attribute>
+      </optional>
       <interleave>
         <element name='name'>
           <ref name='volName'/>
diff --git a/src/conf/storage_conf.c b/src/conf/storage_conf.c
index c9127b0..a5f03c3 100644
--- a/src/conf/storage_conf.c
+++ b/src/conf/storage_conf.c
@@ -51,6 +51,10 @@
 #define DEFAULT_POOL_PERM_MODE 0755
 #define DEFAULT_VOL_PERM_MODE  0600
 
+VIR_ENUM_IMPL(virStorageVol,
+              VIR_STORAGE_VOL_LAST,
+              "file", "block", "dir", "network")
+
 VIR_ENUM_IMPL(virStoragePool,
               VIR_STORAGE_POOL_LAST,
               "dir", "fs", "netfs",
@@ -1253,6 +1257,7 @@ virStorageVolDefParseXML(virStoragePoolDefPtr pool,
 {
     virStorageVolDefPtr ret;
     virStorageVolOptionsPtr options;
+    char *type = NULL;
     char *allocation = NULL;
     char *capacity = NULL;
     char *unit = NULL;
@@ -1278,6 +1283,16 @@ virStorageVolDefParseXML(virStoragePoolDefPtr pool,
     /* Normally generated by pool refresh, but useful for unit tests */
     ret->key = virXPathString("string(./key)", ctxt);
 
+    /* Technically overridden by pool refresh, but useful for unit tests */
+    type = virXPathString("string(./@type)", ctxt);
+    if (type) {
+        if ((ret->type = virStorageVolTypeFromString(type)) < 0) {
+            virReportError(VIR_ERR_XML_ERROR,
+                           _("unknown volume type '%s'"), type);
+            goto error;
+        }
+    }
+
     capacity = virXPathString("string(./capacity)", ctxt);
     unit = virXPathString("string(./capacity/@unit)", ctxt);
     if (capacity == NULL) {
@@ -1394,6 +1409,7 @@ cleanup:
     VIR_FREE(allocation);
     VIR_FREE(capacity);
     VIR_FREE(unit);
+    VIR_FREE(type);
     return ret;
 
 error:
@@ -1563,7 +1579,8 @@ virStorageVolDefFormat(virStoragePoolDefPtr pool,
     if (options == NULL)
         return NULL;
 
-    virBufferAddLit(&buf, "<volume>\n");
+    virBufferAsprintf(&buf, "<volume type='%s'>\n",
+                      virStorageVolTypeToString(def->type));
     virBufferEscapeString(&buf, "  <name>%s</name>\n", def->name);
     virBufferEscapeString(&buf, "  <key>%s</key>\n", def->key);
     virBufferAddLit(&buf, "  <source>\n");
diff --git a/src/conf/storage_conf.h b/src/conf/storage_conf.h
index 62ff1fd..4ed800c 100644
--- a/src/conf/storage_conf.h
+++ b/src/conf/storage_conf.h
@@ -116,6 +116,7 @@ struct _virStorageVolDefList {
     virStorageVolDefPtr *objs;
 };
 
+VIR_ENUM_DECL(virStorageVol)
 
 enum virStoragePoolType {
     VIR_STORAGE_POOL_DIR,      /* Local directory */
diff --git a/tests/storagevolxml2xmlin/vol-logical-backing.xml b/tests/storagevolxml2xmlin/vol-logical-backing.xml
index b4141a5..38ff8c5 100644
--- a/tests/storagevolxml2xmlin/vol-logical-backing.xml
+++ b/tests/storagevolxml2xmlin/vol-logical-backing.xml
@@ -1,4 +1,4 @@
-<volume>
+<volume type='block'>
   <name>Swap</name>
   <key>r4xkCv-MQhr-WKIT-R66x-Epn2-e8hG-1Z5gY0</key>
   <source>
diff --git a/tests/storagevolxml2xmlin/vol-logical.xml b/tests/storagevolxml2xmlin/vol-logical.xml
index cd4d3f7..46a607a 100644
--- a/tests/storagevolxml2xmlin/vol-logical.xml
+++ b/tests/storagevolxml2xmlin/vol-logical.xml
@@ -1,4 +1,4 @@
-<volume>
+<volume type='block'>
   <name>Swap</name>
   <key>r4xkCv-MQhr-WKIT-R66x-Epn2-e8hG-1Z5gY0</key>
   <source>
diff --git a/tests/storagevolxml2xmlin/vol-partition.xml b/tests/storagevolxml2xmlin/vol-partition.xml
index 6990bb5..d810fff 100644
--- a/tests/storagevolxml2xmlin/vol-partition.xml
+++ b/tests/storagevolxml2xmlin/vol-partition.xml
@@ -1,4 +1,4 @@
-<volume>
+<volume type='block'>
   <name>sda1</name>
   <key>/dev/sda1</key>
   <source>
diff --git a/tests/storagevolxml2xmlin/vol-sheepdog.xml b/tests/storagevolxml2xmlin/vol-sheepdog.xml
index 49e221c..d6e920b 100644
--- a/tests/storagevolxml2xmlin/vol-sheepdog.xml
+++ b/tests/storagevolxml2xmlin/vol-sheepdog.xml
@@ -1,4 +1,4 @@
-<volume>
+<volume type='network'>
   <name>test2</name>
   <source>
   </source>
diff --git a/tests/storagevolxml2xmlout/vol-file-backing.xml b/tests/storagevolxml2xmlout/vol-file-backing.xml
index 8d2fb57..cd33bee 100644
--- a/tests/storagevolxml2xmlout/vol-file-backing.xml
+++ b/tests/storagevolxml2xmlout/vol-file-backing.xml
@@ -1,4 +1,4 @@
-<volume>
+<volume type='file'>
   <name>sparse.img</name>
   <key>/var/lib/libvirt/images/sparse.img</key>
   <source>
diff --git a/tests/storagevolxml2xmlout/vol-file-naming.xml b/tests/storagevolxml2xmlout/vol-file-naming.xml
index 7022b02..e515502 100644
--- a/tests/storagevolxml2xmlout/vol-file-naming.xml
+++ b/tests/storagevolxml2xmlout/vol-file-naming.xml
@@ -1,4 +1,4 @@
-<volume>
+<volume type='file'>
   <name>&lt;sparse&gt;.img</name>
   <source>
   </source>
diff --git a/tests/storagevolxml2xmlout/vol-file.xml b/tests/storagevolxml2xmlout/vol-file.xml
index b97dd50..2923188 100644
--- a/tests/storagevolxml2xmlout/vol-file.xml
+++ b/tests/storagevolxml2xmlout/vol-file.xml
@@ -1,4 +1,4 @@
-<volume>
+<volume type='file'>
   <name>sparse.img</name>
   <source>
   </source>
diff --git a/tests/storagevolxml2xmlout/vol-logical-backing.xml b/tests/storagevolxml2xmlout/vol-logical-backing.xml
index bf34b08..07fe277 100644
--- a/tests/storagevolxml2xmlout/vol-logical-backing.xml
+++ b/tests/storagevolxml2xmlout/vol-logical-backing.xml
@@ -1,4 +1,4 @@
-<volume>
+<volume type='block'>
   <name>Swap</name>
   <key>r4xkCv-MQhr-WKIT-R66x-Epn2-e8hG-1Z5gY0</key>
   <source>
diff --git a/tests/storagevolxml2xmlout/vol-logical.xml b/tests/storagevolxml2xmlout/vol-logical.xml
index e9b4e4b..0df5cc0 100644
--- a/tests/storagevolxml2xmlout/vol-logical.xml
+++ b/tests/storagevolxml2xmlout/vol-logical.xml
@@ -1,4 +1,4 @@
-<volume>
+<volume type='block'>
   <name>Swap</name>
   <key>r4xkCv-MQhr-WKIT-R66x-Epn2-e8hG-1Z5gY0</key>
   <source>
diff --git a/tests/storagevolxml2xmlout/vol-partition.xml b/tests/storagevolxml2xmlout/vol-partition.xml
index 9be1cf1..147899e 100644
--- a/tests/storagevolxml2xmlout/vol-partition.xml
+++ b/tests/storagevolxml2xmlout/vol-partition.xml
@@ -1,4 +1,4 @@
-<volume>
+<volume type='block'>
   <name>sda1</name>
   <key>/dev/sda1</key>
   <source>
diff --git a/tests/storagevolxml2xmlout/vol-qcow2-0.10-lazy.xml b/tests/storagevolxml2xmlout/vol-qcow2-0.10-lazy.xml
index fd3d606..1f799da 100644
--- a/tests/storagevolxml2xmlout/vol-qcow2-0.10-lazy.xml
+++ b/tests/storagevolxml2xmlout/vol-qcow2-0.10-lazy.xml
@@ -1,4 +1,4 @@
-<volume>
+<volume type='file'>
   <name>OtherDemo.img</name>
   <key>/var/lib/libvirt/images/OtherDemo.img</key>
   <source>
diff --git a/tests/storagevolxml2xmlout/vol-qcow2-1.1.xml b/tests/storagevolxml2xmlout/vol-qcow2-1.1.xml
index 99fb5ac..14f805f 100644
--- a/tests/storagevolxml2xmlout/vol-qcow2-1.1.xml
+++ b/tests/storagevolxml2xmlout/vol-qcow2-1.1.xml
@@ -1,4 +1,4 @@
-<volume>
+<volume type='file'>
   <name>OtherDemo.img</name>
   <key>/var/lib/libvirt/images/OtherDemo.img</key>
   <source>
diff --git a/tests/storagevolxml2xmlout/vol-qcow2-lazy.xml b/tests/storagevolxml2xmlout/vol-qcow2-lazy.xml
index 3708ea7..68a9756 100644
--- a/tests/storagevolxml2xmlout/vol-qcow2-lazy.xml
+++ b/tests/storagevolxml2xmlout/vol-qcow2-lazy.xml
@@ -1,4 +1,4 @@
-<volume>
+<volume type='file'>
   <name>OtherDemo.img</name>
   <key>/var/lib/libvirt/images/OtherDemo.img</key>
   <source>
diff --git a/tests/storagevolxml2xmlout/vol-qcow2-nobacking.xml b/tests/storagevolxml2xmlout/vol-qcow2-nobacking.xml
index f6a2e21..075dc69 100644
--- a/tests/storagevolxml2xmlout/vol-qcow2-nobacking.xml
+++ b/tests/storagevolxml2xmlout/vol-qcow2-nobacking.xml
@@ -1,4 +1,4 @@
-<volume>
+<volume type='file'>
   <name>OtherDemo.img</name>
   <key>/var/lib/libvirt/images/OtherDemo.img</key>
   <source>
diff --git a/tests/storagevolxml2xmlout/vol-qcow2.xml b/tests/storagevolxml2xmlout/vol-qcow2.xml
index b9adcb4..31dc578 100644
--- a/tests/storagevolxml2xmlout/vol-qcow2.xml
+++ b/tests/storagevolxml2xmlout/vol-qcow2.xml
@@ -1,4 +1,4 @@
-<volume>
+<volume type='file'>
   <name>OtherDemo.img</name>
   <key>/var/lib/libvirt/images/OtherDemo.img</key>
   <source>
diff --git a/tests/storagevolxml2xmlout/vol-sheepdog.xml b/tests/storagevolxml2xmlout/vol-sheepdog.xml
index bd5d6d8..e08e36c 100644
--- a/tests/storagevolxml2xmlout/vol-sheepdog.xml
+++ b/tests/storagevolxml2xmlout/vol-sheepdog.xml
@@ -1,4 +1,4 @@
-<volume>
+<volume type='network'>
   <name>test2</name>
   <source>
   </source>
-- 
1.9.0