]> xenbits.xensource.com Git - people/dariof/libvirt.git/commitdiff
virsh: domain: Fix undefine with storage of 'volume' disks
authorPeter Krempa <pkrempa@redhat.com>
Wed, 18 Dec 2013 13:54:07 +0000 (14:54 +0100)
committerPeter Krempa <pkrempa@redhat.com>
Wed, 18 Dec 2013 15:43:07 +0000 (16:43 +0100)
The undefine code that removes the storage along with the VM didn't take
into account the existence of 'volume' type disks. Add the functionality.

tools/virsh-domain.c

index 8b80e1e6ae4ad9209c230bcd4cb970615f7c466e..760dca598c8fd02b13d3cdab1f7df20da60e95f4 100644 (file)
@@ -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);