On Fri, Oct 07, 2011 at 08:37:03PM -0600, Eric Blake wrote:
Counterpart to --roots.
* include/libvirt/libvirt.h.in (VIR_DOMAIN_SNAPSHOT_LIST_LEAVES):
New flag.
* src/libvirt.c (virDomainSnapshotNum, virDomainSnapshotListNames)
(virDomainSnapshotNumChildren)
(virDomainSnapshotListChildrenNames): Document it.
* tools/virsh.c (cmdSnapshotList): Expose it.
* tools/virsh.pod (snapshot-list): Document --leaves.
---
include/libvirt/libvirt.h.in | 2 ++
src/libvirt.c | 16 ++++++++++++++--
tools/virsh.c | 12 ++++++++++++
tools/virsh.pod | 7 ++++++-
4 files changed, 34 insertions(+), 3 deletions(-)
diff --git a/include/libvirt/libvirt.h.in b/include/libvirt/libvirt.h.in
index 1fc0dae..c81f928 100644
--- a/include/libvirt/libvirt.h.in
+++ b/include/libvirt/libvirt.h.in
@@ -2701,6 +2701,8 @@ typedef enum {
listing a snapshot */
VIR_DOMAIN_SNAPSHOT_LIST_METADATA = (1 << 1), /* Filter by snapshots
which have metadata */
+ VIR_DOMAIN_SNAPSHOT_LIST_LEAVES = (1 << 2), /* Filter by snapshots
+ with no children */
} virDomainSnapshotListFlags;
/* Return the number of snapshots for this domain */
diff --git a/src/libvirt.c b/src/libvirt.c
index f07c720..35eb6b4 100644
--- a/src/libvirt.c
+++ b/src/libvirt.c
@@ -15969,7 +15969,10 @@ error:
* Provides the number of domain snapshots for this domain.
*
* If @flags includes VIR_DOMAIN_SNAPSHOT_LIST_ROOTS, then the result is
- * filtered to the number of snapshots that have no parents.
+ * filtered to the number of snapshots that have no parents. Likewise,
+ * if @flags includes VIR_DOMAIN_SNAPSHOT_LIST_LEAVES, then the result is
+ * filtered to the number of snapshots that have no children. Both flags
+ * can be used together to find unrelated snapshots.
*
* If @flags includes VIR_DOMAIN_SNAPSHOT_LIST_METADATA, then the result is
* the number of snapshots that also include metadata that would prevent
@@ -16020,7 +16023,10 @@ error:
* virDomainSnapshotNum() with the same @flags.
*
* If @flags includes VIR_DOMAIN_SNAPSHOT_LIST_ROOTS, then the result is
- * filtered to the number of snapshots that have no parents.
+ * filtered to the number of snapshots that have no parents. Likewise,
+ * if @flags includes VIR_DOMAIN_SNAPSHOT_LIST_LEAVES, then the result is
+ * filtered to the number of snapshots that have no children. Both flags
+ * can be used together to find unrelated snapshots.
*
* If @flags includes VIR_DOMAIN_SNAPSHOT_LIST_METADATA, then the result is
* the number of snapshots that also include metadata that would prevent
@@ -16077,6 +16083,9 @@ error:
* If @flags includes VIR_DOMAIN_SNAPSHOT_LIST_DESCENDANTS, then the result
* includes all descendants, otherwise it is limited to direct children.
*
+ * If @flags includes VIR_DOMAIN_SNAPSHOT_LIST_LEAVES, then the result is
+ * filtered to the number of snapshots that have no children.
+ *
* If @flags includes VIR_DOMAIN_SNAPSHOT_LIST_METADATA, then the result is
* the number of snapshots that also include metadata that would prevent
* the removal of the last reference to a domain; this value will either
@@ -16129,6 +16138,9 @@ error:
* If @flags includes VIR_DOMAIN_SNAPSHOT_LIST_DESCENDANTS, then the result
* includes all descendants, otherwise it is limited to direct children.
*
+ * If @flags includes VIR_DOMAIN_SNAPSHOT_LIST_LEAVES, then the result is
+ * filtered to the number of snapshots that have no children.
+ *
* If @flags includes VIR_DOMAIN_SNAPSHOT_LIST_METADATA, then the result is
* the number of snapshots that also include metadata that would prevent
* the removal of the last reference to a domain; this value will either
diff --git a/tools/virsh.c b/tools/virsh.c
index bcf0603..0624bd8 100644
--- a/tools/virsh.c
+++ b/tools/virsh.c
@@ -13180,6 +13180,7 @@ static const vshCmdOptDef opts_snapshot_list[] = {
{"domain", VSH_OT_DATA, VSH_OFLAG_REQ, N_("domain name, id or
uuid")},
{"parent", VSH_OT_BOOL, 0, N_("add a column showing parent
snapshot")},
{"roots", VSH_OT_BOOL, 0, N_("list only snapshots without
parents")},
+ {"leaves", VSH_OT_BOOL, 0, N_("list only snapshots without
children")},
{"metadata", VSH_OT_BOOL, 0,
N_("list only snapshots that have metadata that would prevent
undefine")},
{"tree", VSH_OT_BOOL, 0, N_("list snapshots in a tree")},
@@ -13214,6 +13215,7 @@ cmdSnapshotList(vshControl *ctl, const vshCmd *cmd)
char timestr[100];
struct tm time_info;
bool tree = vshCommandOptBool(cmd, "tree");
+ bool leaves = vshCommandOptBool(cmd, "leaves");
const char *from = NULL;
virDomainSnapshotPtr start = NULL;
int start_index = -1;
@@ -13255,6 +13257,14 @@ cmdSnapshotList(vshControl *ctl, const vshCmd *cmd)
}
flags |= VIR_DOMAIN_SNAPSHOT_LIST_ROOTS;
}
+ if (leaves) {
+ if (tree) {
+ vshError(ctl, "%s",
+ _("--leaves and --tree are mutually exclusive"));
+ return false;
+ }
+ flags |= VIR_DOMAIN_SNAPSHOT_LIST_LEAVES;
+ }
if (vshCommandOptBool(cmd, "metadata")) {
flags |= VIR_DOMAIN_SNAPSHOT_LIST_METADATA;
@@ -13271,6 +13281,7 @@ cmdSnapshotList(vshControl *ctl, const vshCmd *cmd)
if (ctl->useSnapshotOld ||
last_error->code == VIR_ERR_NO_SUPPORT) {
/* We can emulate --from. */
+ /* XXX can we also emulate --leaves? */
virFreeError(last_error);
last_error = NULL;
ctl->useSnapshotOld = true;
@@ -13284,6 +13295,7 @@ cmdSnapshotList(vshControl *ctl, const vshCmd *cmd)
numsnaps = virDomainSnapshotNum(dom, flags);
/* Fall back to simulation if --roots was unsupported. */
+ /* XXX can we also emulate --leaves? */
if (numsnaps < 0 && last_error->code == VIR_ERR_INVALID_ARG
&&
(flags & VIR_DOMAIN_SNAPSHOT_LIST_ROOTS)) {
virFreeError(last_error);
diff --git a/tools/virsh.pod b/tools/virsh.pod
index 07df28e..ddafee4 100644
--- a/tools/virsh.pod
+++ b/tools/virsh.pod
@@ -1977,7 +1977,8 @@ will create a cloned snapshot. If neither is specified, then the
edits must not change the snapshot name.
=item B<snapshot-list> I<domain> [{I<--parent> | I<--roots> |
I<--tree>}]
-[I<--metadata>] [{[I<--from>] B<snapshot> | I<--current>}
[I<--descendants>]]
+[{[I<--from>] B<snapshot> | I<--current>} [I<--descendants>]]
+[I<--metadata>] [I<--leaves>]
List all of the available snapshots for the given domain, defaulting
to show columns for the snapshot name, creation time, and domain state.
@@ -1996,6 +1997,10 @@ I<--descendants> is also present. When used with
I<--tree>, the
use of I<--descendants> is implied. This option is not compatible
with I<--roots>.
+If I<--leaves> is specified, the list will be filtered to just
+snapshots that have no children. This option is not compatible
+with I<--tree>.
+
If I<--metadata> is specified, the list will be filtered to just
snapshots that involve libvirt metadata, and thus would prevent
B<undefine> of a persistent domain, or be lost on B<destroy> of
ACK,
Daniel
--
Daniel Veillard | libxml Gnome XML XSLT toolkit
http://xmlsoft.org/
daniel(a)veillard.com | Rpmfind RPM search engine
http://rpmfind.net/
http://veillard.com/ | virtualization library
http://libvirt.org/