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@xxxxxxxxxx> --- 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 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list