[libvirt] [PATCH 3/3] virsh: Add --delete-snapshots flag for undefine and vol-delete

John Ferlan jferlan at redhat.com
Wed Dec 2 23:18:13 UTC 2015


https://bugzilla.redhat.com/show_bug.cgi?id=1281710

Commit id '3c7590e0a' added the flag to the rbd backend, but provided
no means via virsh to use the flag.  This patch adds a '--delete-snapshots'
option to both the "undefine" and "vol-delete" commands.

For "undefine", the flag is combined with the "--remove-all-storage" flag
in order to add the appropriate flag for the virStorageVolDelete call;
whereas, for the "vol-delete" command, just the flag is sufficient since
it's only operating on one volume.

Currently only supported for rbd backends.

Signed-off-by: John Ferlan <jferlan at redhat.com>
---
 tools/virsh-domain.c | 14 +++++++++++++-
 tools/virsh-volume.c | 12 +++++++++++-
 tools/virsh.pod      | 14 +++++++++++++-
 3 files changed, 37 insertions(+), 3 deletions(-)

diff --git a/tools/virsh-domain.c b/tools/virsh-domain.c
index 413220b..726e995 100644
--- a/tools/virsh-domain.c
+++ b/tools/virsh-domain.c
@@ -3674,6 +3674,11 @@ static const vshCmdOptDef opts_undefine[] = {
      .type = VSH_OT_BOOL,
      .help = N_("remove all associated storage volumes (use with caution)")
     },
+    {.name = "delete-snapshots",
+     .type = VSH_OT_BOOL,
+     .help = N_("delete snapshots associated with volume(s), requires "
+                "--remove-all-storage (must be supported by storage driver)")
+    },
     {.name = "wipe-storage",
      .type = VSH_OT_BOOL,
      .help = N_("wipe data on the removed volumes")
@@ -3703,11 +3708,13 @@ cmdUndefine(vshControl *ctl, const vshCmd *cmd)
     const char *name = NULL;
     /* Flags to attempt.  */
     unsigned int flags = 0;
+    unsigned int vol_flags = 0;
     /* User-requested actions.  */
     bool managed_save = vshCommandOptBool(cmd, "managed-save");
     bool snapshots_metadata = vshCommandOptBool(cmd, "snapshots-metadata");
     bool wipe_storage = vshCommandOptBool(cmd, "wipe-storage");
     bool remove_all_storage = vshCommandOptBool(cmd, "remove-all-storage");
+    bool delete_snapshots = vshCommandOptBool(cmd, "delete-snapshots");
     bool nvram = vshCommandOptBool(cmd, "nvram");
     /* Positive if these items exist.  */
     int has_managed_save = 0;
@@ -3736,6 +3743,8 @@ cmdUndefine(vshControl *ctl, const vshCmd *cmd)
     size_t j;
     virshControlPtr priv = ctl->privData;
 
+    VSH_REQUIRE_OPTION("delete-snapshots", "remove-all-storage");
+
     ignore_value(vshCommandOptString(ctl, cmd, "storage", &vol_string));
 
     if (!(vol_string || remove_all_storage) && wipe_storage) {
@@ -3745,6 +3754,9 @@ cmdUndefine(vshControl *ctl, const vshCmd *cmd)
         return false;
     }
 
+    if (delete_snapshots)
+        vol_flags |= VIR_STORAGE_VOL_DELETE_WITH_SNAPSHOTS;
+
     if (managed_save) {
         flags |= VIR_DOMAIN_UNDEFINE_MANAGED_SAVE;
         managed_save_safe = true;
@@ -4011,7 +4023,7 @@ cmdUndefine(vshControl *ctl, const vshCmd *cmd)
             }
 
             /* delete the volume */
-            if (virStorageVolDelete(vols[i].vol, 0) < 0) {
+            if (virStorageVolDelete(vols[i].vol, vol_flags) < 0) {
                 vshError(ctl, _("Failed to remove storage volume '%s'(%s)"),
                          vols[i].target, vols[i].source);
                 ret = false;
diff --git a/tools/virsh-volume.c b/tools/virsh-volume.c
index 7d76a06..c9c656f 100644
--- a/tools/virsh-volume.c
+++ b/tools/virsh-volume.c
@@ -887,6 +887,11 @@ static const vshCmdOptDef opts_vol_delete[] = {
      .type = VSH_OT_STRING,
      .help = N_("pool name or uuid")
     },
+    {.name = "delete-snapshots",
+     .type = VSH_OT_BOOL,
+     .help = N_("delete snapshots associated with volume (must be "
+                "supported by storage driver)")
+    },
     {.name = NULL}
 };
 
@@ -896,11 +901,16 @@ cmdVolDelete(vshControl *ctl, const vshCmd *cmd)
     virStorageVolPtr vol;
     bool ret = true;
     const char *name;
+    bool delete_snapshots = vshCommandOptBool(cmd, "delete-snapshots");
+    unsigned int flags = 0;
 
     if (!(vol = virshCommandOptVol(ctl, cmd, "vol", "pool", &name)))
         return false;
 
-    if (virStorageVolDelete(vol, 0) == 0) {
+    if (delete_snapshots)
+        flags |= VIR_STORAGE_VOL_DELETE_WITH_SNAPSHOTS;
+
+    if (virStorageVolDelete(vol, flags) == 0) {
         vshPrint(ctl, _("Vol %s deleted\n"), name);
     } else {
         vshError(ctl, _("Failed to delete vol %s"), name);
diff --git a/tools/virsh.pod b/tools/virsh.pod
index 21ae4a3..075bf03 100644
--- a/tools/virsh.pod
+++ b/tools/virsh.pod
@@ -2295,7 +2295,9 @@ Output the device used for the TTY console of the domain. If the information
 is not available the processes will provide an exit code of 1.
 
 =item B<undefine> I<domain> [I<--managed-save>] [I<--snapshots-metadata>]
-[I<--nvram>] [ {I<--storage> B<volumes> | I<--remove-all-storage>} I<--wipe-storage>]
+[I<--nvram>]
+[ {I<--storage> B<volumes> | I<--remove-all-storage> [I<--delete-snapshots>]}
+I<--wipe-storage>]
 
 Undefine a domain. If the domain is running, this converts it to a
 transient domain, without stopping it. If the domain is inactive,
@@ -2330,6 +2332,11 @@ Example: --storage vda,/path/to/storage.img
 The I<--remove-all-storage> flag specifies that all of the domain's storage
 volumes should be deleted.
 
+The I<--delete-snapshots> flag specifies that any snapshots associated with
+the storage volume should be deleted as well. Requires the
+I<--remove-all-storage> flag to be provided. Not all storage drivers
+support this option, presently only rbd.
+
 The flag I<--wipe-storage> specifies that the storage volumes should be
 wiped before removal.
 
@@ -3438,12 +3445,17 @@ where the data blocks are copied only when modified.
 If this is not possible, the copy fails.
 
 =item B<vol-delete> [I<--pool> I<pool-or-uuid>] I<vol-name-or-key-or-path>
+[I<--delete-snapshots>]
 
 Delete a given volume.
 I<--pool> I<pool-or-uuid> is the name or UUID of the storage pool the volume
 is in.
 I<vol-name-or-key-or-path> is the name or key or path of the volume to delete.
 
+The I<--delete-snapshots> flag specifies that any snapshots associated with
+the storage volume should be deleted as well. Not all storage drivers
+support this option, presently only rbd.
+
 =item B<vol-upload> [I<--pool> I<pool-or-uuid>] [I<--offset> I<bytes>]
 [I<--length> I<bytes>] I<vol-name-or-key-or-path> I<local-file>
 
-- 
2.5.0




More information about the libvir-list mailing list