[libvirt] [PATCHv2 1/2] virsh: add virsh snapshot-current --name
Daniel Veillard
veillard at redhat.com
Thu Aug 11 02:32:48 UTC 2011
On Wed, Aug 10, 2011 at 05:02:36PM -0600, Eric Blake wrote:
> 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.
>
> * tools/virsh.c (cmdSnapshotCurrent): Add an option.
> * tools/virsh.pod (snapshot-current): Document it.
> ---
>
> v2: use xpath instead of strstr; replaces:
> https://www.redhat.com/archives/libvir-list/2011-August/msg00329.html
>
> tools/virsh.c | 29 ++++++++++++++++++++++++++---
> tools/virsh.pod | 4 +++-
> 2 files changed, 29 insertions(+), 4 deletions(-)
>
> diff --git a/tools/virsh.c b/tools/virsh.c
> index bffec1d..fd64020 100644
> --- a/tools/virsh.c
> +++ b/tools/virsh.c
> @@ -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,34 @@ 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);
> + }
> +
> + name = virXPathString("string(/domainsnapshot/name)", ctxt);
> + xmlXPathFreeContext(ctxt);
> + xmlFreeDoc(xmldoc);
> + if (!name)
> + goto cleanup;
> + }
> +
> + vshPrint(ctl, "%s", name ? name : xml);
> }
>
> ret = true;
>
> cleanup:
> + VIR_FREE(xml);
> if (snapshot)
> virDomainSnapshotFree(snapshot);
> if (dom)
> diff --git a/tools/virsh.pod b/tools/virsh.pod
> index ec778bf..53376d6 100644
> --- a/tools/virsh.pod
> +++ b/tools/virsh.pod
> @@ -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>
ACK, this is really more convenient in most cases,
Daniel
--
Daniel Veillard | libxml Gnome XML XSLT toolkit http://xmlsoft.org/
daniel at veillard.com | Rpmfind RPM search engine http://rpmfind.net/
http://veillard.com/ | virtualization library http://libvirt.org/
More information about the libvir-list
mailing list