mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2024-12-22 13:45:38 +00:00
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.
This commit is contained in:
parent
2bd47d9c64
commit
e3f1d2a820
@ -1810,7 +1810,8 @@ storageVolCreateXMLFrom(virStoragePoolPtr obj,
|
|||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
|
|
||||||
newvol = virStorageVolDefParseString(pool->def, xmldesc, 0);
|
newvol = virStorageVolDefParseString(pool->def, xmldesc,
|
||||||
|
VIR_VOL_XML_PARSE_NO_CAPACITY);
|
||||||
if (newvol == NULL)
|
if (newvol == NULL)
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
|
||||||
@ -1824,7 +1825,8 @@ storageVolCreateXMLFrom(virStoragePoolPtr obj,
|
|||||||
goto cleanup;
|
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)
|
if (newvol->target.capacity < origvol->target.capacity)
|
||||||
newvol->target.capacity = origvol->target.capacity;
|
newvol->target.capacity = origvol->target.capacity;
|
||||||
|
|
||||||
|
@ -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
|
@ -49,6 +49,7 @@ testCompareXMLToArgvFiles(bool shouldFail,
|
|||||||
char *expectedCmdline = NULL;
|
char *expectedCmdline = NULL;
|
||||||
char *actualCmdline = NULL;
|
char *actualCmdline = NULL;
|
||||||
int ret = -1;
|
int ret = -1;
|
||||||
|
unsigned long parse_flags = 0;
|
||||||
|
|
||||||
int len;
|
int len;
|
||||||
|
|
||||||
@ -84,7 +85,10 @@ testCompareXMLToArgvFiles(bool shouldFail,
|
|||||||
goto cleanup;
|
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;
|
goto cleanup;
|
||||||
|
|
||||||
if (inputvolxml &&
|
if (inputvolxml &&
|
||||||
@ -305,6 +309,9 @@ mymain(void)
|
|||||||
DO_TEST("pool-dir", "vol-qcow2-nocow",
|
DO_TEST("pool-dir", "vol-qcow2-nocow",
|
||||||
NULL, NULL,
|
NULL, NULL,
|
||||||
"qcow2-nocow-compat", 0, FMT_COMPAT);
|
"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;
|
return ret == 0 ? EXIT_SUCCESS : EXIT_FAILURE;
|
||||||
}
|
}
|
||||||
|
19
tests/storagevolxml2xmlin/vol-qcow2-nocapacity.xml
Normal file
19
tests/storagevolxml2xmlin/vol-qcow2-nocapacity.xml
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
<volume>
|
||||||
|
<name>OtherDemo.img</name>
|
||||||
|
<key>/var/lib/libvirt/images/OtherDemo.img</key>
|
||||||
|
<source>
|
||||||
|
</source>
|
||||||
|
<target>
|
||||||
|
<path>/var/lib/libvirt/images/OtherDemo.img</path>
|
||||||
|
<format type='qcow2'/>
|
||||||
|
<permissions>
|
||||||
|
<mode>0644</mode>
|
||||||
|
<owner>0</owner>
|
||||||
|
<group>0</group>
|
||||||
|
<label>unconfined_u:object_r:virt_image_t:s0</label>
|
||||||
|
</permissions>
|
||||||
|
<encryption format='qcow'>
|
||||||
|
<secret type='passphrase' uuid='e78d4b51-a2af-485f-b0f5-afca709a80f4'/>
|
||||||
|
</encryption>
|
||||||
|
</target>
|
||||||
|
</volume>
|
21
tests/storagevolxml2xmlout/vol-qcow2-nocapacity.xml
Normal file
21
tests/storagevolxml2xmlout/vol-qcow2-nocapacity.xml
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
<volume type='file'>
|
||||||
|
<name>OtherDemo.img</name>
|
||||||
|
<key>/var/lib/libvirt/images/OtherDemo.img</key>
|
||||||
|
<source>
|
||||||
|
</source>
|
||||||
|
<capacity unit='bytes'>0</capacity>
|
||||||
|
<allocation unit='bytes'>0</allocation>
|
||||||
|
<target>
|
||||||
|
<path>/var/lib/libvirt/images/OtherDemo.img</path>
|
||||||
|
<format type='qcow2'/>
|
||||||
|
<permissions>
|
||||||
|
<mode>0644</mode>
|
||||||
|
<owner>0</owner>
|
||||||
|
<group>0</group>
|
||||||
|
<label>unconfined_u:object_r:virt_image_t:s0</label>
|
||||||
|
</permissions>
|
||||||
|
<encryption format='qcow'>
|
||||||
|
<secret type='passphrase' uuid='e78d4b51-a2af-485f-b0f5-afca709a80f4'/>
|
||||||
|
</encryption>
|
||||||
|
</target>
|
||||||
|
</volume>
|
@ -126,6 +126,8 @@ mymain(void)
|
|||||||
DO_TEST("pool-sheepdog", "vol-sheepdog");
|
DO_TEST("pool-sheepdog", "vol-sheepdog");
|
||||||
DO_TEST("pool-gluster", "vol-gluster-dir");
|
DO_TEST("pool-gluster", "vol-gluster-dir");
|
||||||
DO_TEST("pool-gluster", "vol-gluster-dir-neg-uid");
|
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;
|
return ret == 0 ? EXIT_SUCCESS : EXIT_FAILURE;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user