It would technically be possible to have virsh compute the list
of descendants of a given snapshot, then delete those one at
a time. But it's complex, and not worth writing for a first
cut at implementing the new flags.
* tools/virsh.c (cmdSnapshotDelete): Add --children-only,
--metadata.
* tools/virsh.pod (snapshot-delete): Document them.
---
tools/virsh.c | 15 ++++++++++++++-
tools/virsh.pod | 12 ++++++++++--
2 files changed, 24 insertions(+), 3 deletions(-)
diff --git a/tools/virsh.c b/tools/virsh.c
index f5049c6..275a289 100644
--- a/tools/virsh.c
+++ b/tools/virsh.c
@@ -12791,6 +12791,9 @@ static const vshCmdOptDef opts_snapshot_delete[] = {
{"domain", VSH_OT_DATA, VSH_OFLAG_REQ, N_("domain name, id or
uuid")},
{"snapshotname", VSH_OT_DATA, VSH_OFLAG_REQ, N_("snapshot
name")},
{"children", VSH_OT_BOOL, 0, N_("delete snapshot and all
children")},
+ {"children-only", VSH_OT_BOOL, 0, N_("delete children but not
snapshot")},
+ {"metadata", VSH_OT_BOOL, 0,
+ N_("delete only libvirt metadata, leaving snapshot contents behind")},
{NULL, 0, 0, NULL}
};
@@ -12815,13 +12818,23 @@ cmdSnapshotDelete(vshControl *ctl, const vshCmd *cmd)
if (vshCommandOptBool(cmd, "children"))
flags |= VIR_DOMAIN_SNAPSHOT_DELETE_CHILDREN;
+ if (vshCommandOptBool(cmd, "children-only"))
+ flags |= VIR_DOMAIN_SNAPSHOT_DELETE_CHILDREN_ONLY;
+ if (vshCommandOptBool(cmd, "metadata"))
+ flags |= VIR_DOMAIN_SNAPSHOT_DELETE_METADATA_ONLY;
snapshot = virDomainSnapshotLookupByName(dom, name, 0);
if (snapshot == NULL)
goto cleanup;
+ /* XXX If we wanted, we could emulate DELETE_CHILDREN_ONLY even on
+ * older servers that reject the flag, by manually computing the
+ * list of descendants. But that's a lot of code to maintain. */
if (virDomainSnapshotDelete(snapshot, flags) == 0) {
- vshPrint(ctl, _("Domain snapshot %s deleted\n"), name);
+ if (flags & VIR_DOMAIN_SNAPSHOT_DELETE_CHILDREN_ONLY)
+ vshPrint(ctl, _("Domain snapshot %s children deleted\n"), name);
+ else
+ vshPrint(ctl, _("Domain snapshot %s deleted\n"), name);
} else {
vshError(ctl, _("Failed to delete snapshot %s"), name);
goto cleanup;
diff --git a/tools/virsh.pod b/tools/virsh.pod
index 64c3895..4005242 100644
--- a/tools/virsh.pod
+++ b/tools/virsh.pod
@@ -1635,12 +1635,20 @@ snapshot was taken will be lost. Also note that the state of the
domain after
snapshot-revert is complete will be the state of the domain at the time
the original snapshot was taken.
-=item B<snapshot-delete> I<domain> I<snapshot> I<--children>
+=item B<snapshot-delete> I<domain> I<snapshot> [I<--metadata>]
+[{I<--children> | I<--children-only>}]
Delete the snapshot for the domain named I<snapshot>. If this snapshot
has child snapshots, changes from this snapshot will be merged into the
children. If I<--children> is passed, then delete this snapshot and any
-children of this snapshot.
+children of this snapshot. If I<--children-only> is passed, then delete
+any children of this snapshot, but leave this snapshot intact. These
+two flags are mutually exclusive.
+
+If I<--metadata> is specified, then only delete the snapshot metadata
+maintained by libvirt, while leaving the snapshot contents intact for
+access by external tools; otherwise deleting a snapshot also removes
+the data contents from that point in time.
=back
--
1.7.4.4