]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
virsh: add virsh snapshot-current --name
authorEric Blake <eblake@redhat.com>
Wed, 10 Aug 2011 03:10:25 +0000 (21:10 -0600)
committerEric Blake <eblake@redhat.com>
Thu, 11 Aug 2011 03:59:56 +0000 (21:59 -0600)
Sometimes, full XML is too much; since most snapshot commands
operate on a snapshot name, there should be an easy way to get
at the current snapshot's name.  For example:

virsh snapshot-revert dom `virsh snapshot-current dom --name`

* tools/virsh.c (cmdSnapshotCurrent): Add an option.
* tools/virsh.pod (snapshot-current): Document it.

tools/virsh.c
tools/virsh.pod

index d901d58e593f5f3ffd469e5e826847a749798028..1d660d0ba150a6ac410756fbae7c5241469e040c 100644 (file)
@@ -12034,6 +12034,7 @@ static const vshCmdInfo info_snapshot_current[] = {
 
 static const vshCmdOptDef opts_snapshot_current[] = {
     {"domain", VSH_OT_DATA, VSH_OFLAG_REQ, N_("domain name, id or uuid")},
+    {"name", VSH_OT_BOOL, 0, N_("list the name, rather than the full xml")},
     {NULL, 0, 0, NULL}
 };
 
@@ -12044,6 +12045,7 @@ cmdSnapshotCurrent(vshControl *ctl, const vshCmd *cmd)
     bool ret = false;
     int current;
     virDomainSnapshotPtr snapshot = NULL;
+    char *xml = NULL;
 
     if (!vshConnectionUsability(ctl, ctl->conn))
         goto cleanup;
@@ -12056,7 +12058,7 @@ cmdSnapshotCurrent(vshControl *ctl, const vshCmd *cmd)
     if (current < 0)
         goto cleanup;
     else if (current) {
-        char *xml;
+        char *name = NULL;
 
         if (!(snapshot = virDomainSnapshotCurrent(dom, 0)))
             goto cleanup;
@@ -12065,13 +12067,36 @@ cmdSnapshotCurrent(vshControl *ctl, const vshCmd *cmd)
         if (!xml)
             goto cleanup;
 
-        vshPrint(ctl, "%s", xml);
-        VIR_FREE(xml);
+        if (vshCommandOptBool(cmd, "name")) {
+            xmlDocPtr xmldoc = NULL;
+            xmlXPathContextPtr ctxt = NULL;
+
+            xmldoc = xmlReadDoc((const xmlChar *) xml, "domainsnapshot.xml",
+                                NULL, XML_PARSE_NOENT | XML_PARSE_NONET |
+                                XML_PARSE_NOWARNING);
+            if (!xmldoc)
+                goto cleanup;
+            ctxt = xmlXPathNewContext(xmldoc);
+            if (!ctxt) {
+                xmlFreeDoc(xmldoc);
+                goto cleanup;
+            }
+
+            name = virXPathString("string(/domainsnapshot/name)", ctxt);
+            xmlXPathFreeContext(ctxt);
+            xmlFreeDoc(xmldoc);
+            if (!name)
+                goto cleanup;
+        }
+
+        vshPrint(ctl, "%s", name ? name : xml);
+        VIR_FREE(name);
     }
 
     ret = true;
 
 cleanup:
+    VIR_FREE(xml);
     if (snapshot)
         virDomainSnapshotFree(snapshot);
     if (dom)
index 01b8fd68d0183aeeecec3071500348ed33ef6936..a6af1e6b2d3df433187a02925ed0c3fd851d02e4 100644 (file)
@@ -1569,9 +1569,11 @@ Create a snapshot for domain I<domain> with the given <name> and
 value.  If I<--print-xml> is specified, then XML appropriate for
 I<snapshot-create> is output, rather than actually creating a snapshot.
 
-=item B<snapshot-current> I<domain>
+=item B<snapshot-current> I<domain> [I<--name>]
 
 Output the snapshot XML for the domain's current snapshot (if any).
+If I<--name> is specified, just list the snapshot name instead of the
+full xml.
 
 =item B<snapshot-list> I<domain>