From e3f1d2a8201e552837f77ce38613a555524888cc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A1n=20Tomko?= Date: Tue, 17 Feb 2015 16:54:53 +0100 Subject: [PATCH] Allow cloning volumes with no capacity specified In virStorageVolCreateXML, add VIR_VOL_XML_PARSE_NO_CAPACITY to the call parsing the XML of the new volume to make the capacity optional. If the capacity is omitted, use the capacity of the old volume. We already do that for values that are less than the original volume capacity. --- src/storage/storage_driver.c | 6 ++++-- .../qcow2-nocapacity-convert-prealloc.argv | 4 ++++ tests/storagevolxml2argvtest.c | 9 +++++++- .../vol-qcow2-nocapacity.xml | 19 +++++++++++++++++ .../vol-qcow2-nocapacity.xml | 21 +++++++++++++++++++ tests/storagevolxml2xmltest.c | 2 ++ 6 files changed, 58 insertions(+), 3 deletions(-) create mode 100644 tests/storagevolxml2argvdata/qcow2-nocapacity-convert-prealloc.argv create mode 100644 tests/storagevolxml2xmlin/vol-qcow2-nocapacity.xml create mode 100644 tests/storagevolxml2xmlout/vol-qcow2-nocapacity.xml diff --git a/src/storage/storage_driver.c b/src/storage/storage_driver.c index bc16e87c6b..6e51603d10 100644 --- a/src/storage/storage_driver.c +++ b/src/storage/storage_driver.c @@ -1810,7 +1810,8 @@ storageVolCreateXMLFrom(virStoragePoolPtr obj, goto cleanup; } - newvol = virStorageVolDefParseString(pool->def, xmldesc, 0); + newvol = virStorageVolDefParseString(pool->def, xmldesc, + VIR_VOL_XML_PARSE_NO_CAPACITY); if (newvol == NULL) goto cleanup; @@ -1824,7 +1825,8 @@ storageVolCreateXMLFrom(virStoragePoolPtr obj, goto cleanup; } - /* Is there ever a valid case for this? */ + /* Use the original volume's capacity in case the new capacity + * is less than that, or it was omitted */ if (newvol->target.capacity < origvol->target.capacity) newvol->target.capacity = origvol->target.capacity; diff --git a/tests/storagevolxml2argvdata/qcow2-nocapacity-convert-prealloc.argv b/tests/storagevolxml2argvdata/qcow2-nocapacity-convert-prealloc.argv new file mode 100644 index 0000000000..9073b1b163 --- /dev/null +++ b/tests/storagevolxml2argvdata/qcow2-nocapacity-convert-prealloc.argv @@ -0,0 +1,4 @@ +qemu-img convert -f raw -O qcow2 \ +-o encryption=on,preallocation=metadata \ +/var/lib/libvirt/images/sparse.img \ +/var/lib/libvirt/images/OtherDemo.img diff --git a/tests/storagevolxml2argvtest.c b/tests/storagevolxml2argvtest.c index c1f8a9d46e..52bb85625d 100644 --- a/tests/storagevolxml2argvtest.c +++ b/tests/storagevolxml2argvtest.c @@ -49,6 +49,7 @@ testCompareXMLToArgvFiles(bool shouldFail, char *expectedCmdline = NULL; char *actualCmdline = NULL; int ret = -1; + unsigned long parse_flags = 0; int len; @@ -84,7 +85,10 @@ testCompareXMLToArgvFiles(bool shouldFail, goto cleanup; } - if (!(vol = virStorageVolDefParseString(pool, volXmlData, 0))) + if (inputvolxml) + parse_flags |= VIR_VOL_XML_PARSE_NO_CAPACITY; + + if (!(vol = virStorageVolDefParseString(pool, volXmlData, parse_flags))) goto cleanup; if (inputvolxml && @@ -305,6 +309,9 @@ mymain(void) DO_TEST("pool-dir", "vol-qcow2-nocow", NULL, NULL, "qcow2-nocow-compat", 0, FMT_COMPAT); + DO_TEST("pool-dir", "vol-qcow2-nocapacity", + "pool-dir", "vol-file", + "qcow2-nocapacity-convert-prealloc", flags, FMT_OPTIONS); return ret == 0 ? EXIT_SUCCESS : EXIT_FAILURE; } diff --git a/tests/storagevolxml2xmlin/vol-qcow2-nocapacity.xml b/tests/storagevolxml2xmlin/vol-qcow2-nocapacity.xml new file mode 100644 index 0000000000..9746900f5c --- /dev/null +++ b/tests/storagevolxml2xmlin/vol-qcow2-nocapacity.xml @@ -0,0 +1,19 @@ + + OtherDemo.img + /var/lib/libvirt/images/OtherDemo.img + + + + /var/lib/libvirt/images/OtherDemo.img + + + 0644 + 0 + 0 + + + + + + + diff --git a/tests/storagevolxml2xmlout/vol-qcow2-nocapacity.xml b/tests/storagevolxml2xmlout/vol-qcow2-nocapacity.xml new file mode 100644 index 0000000000..223e6892fd --- /dev/null +++ b/tests/storagevolxml2xmlout/vol-qcow2-nocapacity.xml @@ -0,0 +1,21 @@ + + OtherDemo.img + /var/lib/libvirt/images/OtherDemo.img + + + 0 + 0 + + /var/lib/libvirt/images/OtherDemo.img + + + 0644 + 0 + 0 + + + + + + + diff --git a/tests/storagevolxml2xmltest.c b/tests/storagevolxml2xmltest.c index 5deb62c55e..0d6c818e0d 100644 --- a/tests/storagevolxml2xmltest.c +++ b/tests/storagevolxml2xmltest.c @@ -126,6 +126,8 @@ mymain(void) DO_TEST("pool-sheepdog", "vol-sheepdog"); DO_TEST("pool-gluster", "vol-gluster-dir"); DO_TEST("pool-gluster", "vol-gluster-dir-neg-uid"); + DO_TEST_FULL("pool-dir", "vol-qcow2-nocapacity", + VIR_VOL_XML_PARSE_NO_CAPACITY); return ret == 0 ? EXIT_SUCCESS : EXIT_FAILURE; } -- GitLab