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(a)redhat.com>
---
v1:
https://www.redhat.com/archives/libvir-list/2013-November/msg00955.html
Since then, delay 'network-dir' until later in gluster series,
change XML to <volume type='file'> instead of
<volume><type>file</type>,
and use 1.2.0 instead of 1.1.5
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 90eeaa3..c90d7b1 100644
--- a/docs/formatstorage.html.in
+++ b/docs/formatstorage.html.in
@@ -283,14 +283,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>
- <volume>
+ <volume type='file'>
<name>sparse.img</name>
<key>/var/lib/xen/images/sparse.img</key>
<allocation>0</allocation>
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 8b378c2..0cd80c3 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 f062bd8..c4dd403 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><sparse>.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.8.3.1