The undefine code that removes the storage along with the VM didn't take
into acount the existence of 'volume' type disks. Add the functionality.
---
tools/virsh-domain.c | 36 ++++++++++++++++++++++++++++++++++--
1 file changed, 34 insertions(+), 2 deletions(-)
diff --git a/tools/virsh-domain.c b/tools/virsh-domain.c
index 8b80e1e..760dca5 100644
--- a/tools/virsh-domain.c
+++ b/tools/virsh-domain.c
@@ -2939,6 +2939,7 @@ cmdUndefine(vshControl *ctl, const vshCmd *cmd)
int nvol_nodes;
char *source = NULL;
char *target = NULL;
+ char *pool = NULL;
size_t i;
size_t j;
@@ -3048,6 +3049,7 @@ cmdUndefine(vshControl *ctl, const vshCmd *cmd)
vshUndefineVolume vol;
VIR_FREE(source);
VIR_FREE(target);
+ VIR_FREE(pool);
/* get volume source and target paths */
if (!(target = virXPathString("string(./target/@dev)", ctxt)))
@@ -3057,9 +3059,12 @@ cmdUndefine(vshControl *ctl, const vshCmd *cmd)
"./source/@file|"
"./source/@dir|"
"./source/@name|"
- "./source/@dev)", ctxt)))
+ "./source/@dev|"
+ "./source/@volume)", ctxt)))
continue;
+ pool = virXPathString("string(./source/@pool)", ctxt);
+
/* lookup if volume was selected by user */
if (vol_list) {
bool found = false;
@@ -3075,7 +3080,33 @@ cmdUndefine(vshControl *ctl, const vshCmd *cmd)
continue;
}
- if (!(vol.vol = virStorageVolLookupByPath(ctl->conn, source))) {
+ if (pool) {
+ virStoragePoolPtr storagepool = NULL;
+
+ if (!source) {
+ vshPrint(ctl,
+ _("Missing storage volume name for disk
'%s'"),
+ target);
+ continue;
+ }
+
+ if (!(storagepool = virStoragePoolLookupByName(ctl->conn,
+ pool))) {
+ vshPrint(ctl,
+ _("Storage pool '%s' for volume '%s'
not found."),
+ pool, target);
+ vshResetLibvirtError();
+ continue;
+ }
+
+ vol.vol = virStorageVolLookupByName(storagepool, source);
+ virStoragePoolFree(storagepool);
+
+ } else {
+ vol.vol = virStorageVolLookupByPath(ctl->conn, source);
+ }
+
+ if (!vol.vol) {
vshPrint(ctl,
_("Storage volume '%s'(%s) is not managed by
libvirt. "
"Remove it manually.\n"), target, source);
@@ -3190,6 +3221,7 @@ out:
cleanup:
VIR_FREE(source);
VIR_FREE(target);
+ VIR_FREE(pool);
for (i = 0; i < nvols; i++) {
VIR_FREE(vols[i].source);
VIR_FREE(vols[i].target);
--
1.8.5.1