On Wed, Aug 10, 2011 at 10:09:56PM -0600, Eric Blake wrote:
> Down the road, I want to add virDomainSnapshotGetParent, and use
> the new API rather than xml scraping; but this virsh command can
> be implemented even without the new API.
> 
> * tools/virsh.c (cmdSnapshotParent): New command.
> * tools/virsh.pod (snapshot-parent): Document it.
> ---
> 
> Adding this will make it a bit easier to track relationships between
> snapshots, especially since 'virsh snapshot-list' covers everything
> except the relationship.
> 
>  tools/virsh.c   |   78 
> +++++++++++++++++++++++++++++++++++++++++++++++++++++++
>  tools/virsh.pod |    4 +++
>  2 files changed, 82 insertions(+), 0 deletions(-)
> 
> diff --git a/tools/virsh.c b/tools/virsh.c
> index 1d660d0..ee08c01 100644
> --- a/tools/virsh.c
> +++ b/tools/virsh.c
> @@ -12285,6 +12285,82 @@ cleanup:
>  }
> 
>  /*
> + * "snapshot-parent" command
> + */
> +static const vshCmdInfo info_snapshot_parent[] = {
> +    {"help", N_("Get the name of the parent of the current snapshot")},
> +    {"desc", N_("Extract the snapshot's parent, if any")},
> +    {NULL, NULL}
> +};
> +
> +static const vshCmdOptDef opts_snapshot_parent[] = {
> +    {"domain", VSH_OT_DATA, VSH_OFLAG_REQ, N_("domain name, id or uuid")},
> +    {"snapshotname", VSH_OT_DATA, VSH_OFLAG_REQ, N_("snapshot name")},
> +    {NULL, 0, 0, NULL}
> +};
> +
> +static bool
> +cmdSnapshotParent(vshControl *ctl, const vshCmd *cmd)
> +{
> +    virDomainPtr dom = NULL;
> +    bool ret = false;
> +    const char *name = NULL;
> +    virDomainSnapshotPtr snapshot = NULL;
> +    char *xml = NULL;
> +    char *parent = NULL;
> +    xmlDocPtr xmldoc = NULL;
> +    xmlXPathContextPtr ctxt = NULL;
> +
> +    if (!vshConnectionUsability(ctl, ctl->conn))
> +        goto cleanup;
> +
> +    dom = vshCommandOptDomain(ctl, cmd, NULL);
> +    if (dom == NULL)
> +        goto cleanup;
> +
> +    if (vshCommandOptString(cmd, "snapshotname", &name) <= 0)
> +        goto cleanup;
> +
> +    snapshot = virDomainSnapshotLookupByName(dom, name, 0);
> +    if (snapshot == NULL)
> +        goto cleanup;
> +
> +    xml = virDomainSnapshotGetXMLDesc(snapshot, 0);
> +    if (!xml)
> +        goto cleanup;
> +
> +    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)
> +        goto cleanup;
> +
> +    parent = virXPathString("string(/domainsnapshot/parent/name)", ctxt);
> +    if (!parent)
> +        goto cleanup;
> +
> +    vshPrint(ctl, "%s", parent);
> +
> +    ret = true;
> +
> +cleanup:
> +    VIR_FREE(parent);
> +    xmlXPathFreeContext(ctxt);
> +    if (xmldoc)
> +        xmlFreeDoc(xmldoc);
> +    VIR_FREE(xml);
> +    if (snapshot)
> +        virDomainSnapshotFree(snapshot);
> +    if (dom)
> +        virDomainFree(dom);
> +
> +    return ret;
> +}
> +
> +/*
>   * "snapshot-revert" command
>   */
>  static const vshCmdInfo info_snapshot_revert[] = {
> @@ -12754,6 +12830,8 @@ static const vshCmdDef snapshotCmds[] = {
>       info_snapshot_dumpxml, 0},
>      {"snapshot-list", cmdSnapshotList, opts_snapshot_list,
>       info_snapshot_list, 0},
> +    {"snapshot-parent", cmdSnapshotParent, opts_snapshot_parent,
> +     info_snapshot_parent, 0},
>      {"snapshot-revert", cmdDomainSnapshotRevert, opts_snapshot_revert,
>       info_snapshot_revert, 0},
>      {NULL, NULL, NULL, NULL, 0}
> diff --git a/tools/virsh.pod b/tools/virsh.pod
> index a6af1e6..1893c23 100644
> --- a/tools/virsh.pod
> +++ b/tools/virsh.pod
> @@ -1583,6 +1583,10 @@ List all of the available snapshots for the given 
> domain.
> 
>  Output the snapshot XML for the domain's snapshot named I<snapshot>.
> 
> +=item B<snapshot-parent> I<domain> I<snapshot>
> +
> +Output the name of the parent snapshot for the given I<snapshot>, if any.
> +
>  =item B<snapshot-revert> I<domain> I<snapshot>
> 
>  Revert the given domain to the snapshot specified by I<snapshot>.  Be aware
> -- 
> 1.7.4.4

  ACK,

Daniel

-- 
Daniel Veillard      | libxml Gnome XML XSLT toolkit  http://xmlsoft.org/
dan...@veillard.com  | Rpmfind RPM search engine http://rpmfind.net/
http://veillard.com/ | virtualization library  http://libvirt.org/

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list

Reply via email to