[libvirt] [PATCHv3 30/43] snapshot: refactor virsh snapshot creation

Eric Blake eblake at redhat.com
Wed Aug 24 15:22:47 UTC 2011


The next patch will make snapshot creation more complex, so it's
better to avoid repetition of the complexity.

* tools/virsh.c (vshSnapshotCreate): New helper function.
(cmdSnapshotCreate, cmdSnapshotCreateAs): Use it.
---
 tools/virsh.c |  119 ++++++++++++++++++++++++---------------------------------
 1 files changed, 50 insertions(+), 69 deletions(-)

diff --git a/tools/virsh.c b/tools/virsh.c
index c01edc1..861300d 100644
--- a/tools/virsh.c
+++ b/tools/virsh.c
@@ -12098,6 +12098,54 @@ cmdQuit(vshControl *ctl, const vshCmd *cmd ATTRIBUTE_UNUSED)
     return true;
 }

+/* Helper for snapshot-create and snapshot-create-as */
+static bool
+vshSnapshotCreate(vshControl *ctl, virDomainPtr dom, const char *buffer,
+                  unsigned int flags, const char *from)
+{
+    bool ret = false;
+    virDomainSnapshotPtr snapshot;
+    char *doc = NULL;
+    xmlDocPtr xml = NULL;
+    xmlXPathContextPtr ctxt = NULL;
+    char *name = NULL;
+
+    snapshot = virDomainSnapshotCreateXML(dom, buffer, flags);
+    if (snapshot == NULL)
+        goto cleanup;
+
+    doc = virDomainSnapshotGetXMLDesc(snapshot, 0);
+    if (!doc)
+        goto cleanup;
+
+    xml = virXMLParseStringCtxt(doc, "domainsnapshot.xml", &ctxt);
+    if (!xml)
+        goto cleanup;
+
+    name = virXPathString("string(/domainsnapshot/name)", ctxt);
+    if (!name) {
+        vshError(ctl, "%s",
+                 _("Could not find 'name' element in domain snapshot XML"));
+        goto cleanup;
+    }
+
+    if (from)
+        vshPrint(ctl, _("Domain snapshot %s created from '%s'"), name, from);
+    else
+        vshPrint(ctl, _("Domain snapshot %s created"), name);
+
+    ret = true;
+
+cleanup:
+    VIR_FREE(name);
+    xmlXPathFreeContext(ctxt);
+    xmlFreeDoc(xml);
+    if (snapshot)
+        virDomainSnapshotFree(snapshot);
+    VIR_FREE(doc);
+    return ret;
+}
+
 /*
  * "snapshot-create" command
  */
@@ -12120,11 +12168,6 @@ cmdSnapshotCreate(vshControl *ctl, const vshCmd *cmd)
     bool ret = false;
     const char *from = NULL;
     char *buffer = NULL;
-    virDomainSnapshotPtr snapshot = NULL;
-    xmlDocPtr xml = NULL;
-    xmlXPathContextPtr ctxt = NULL;
-    char *doc = NULL;
-    char *name = NULL;

     if (!vshConnectionUsability(ctl, ctl->conn))
         goto cleanup;
@@ -12150,39 +12193,9 @@ cmdSnapshotCreate(vshControl *ctl, const vshCmd *cmd)
         goto cleanup;
     }

-    snapshot = virDomainSnapshotCreateXML(dom, buffer, 0);
-    if (snapshot == NULL)
-        goto cleanup;
-
-    doc = virDomainSnapshotGetXMLDesc(snapshot, 0);
-    if (!doc)
-        goto cleanup;
-
-    xml = virXMLParseStringCtxt(doc, "domainsnapshot.xml", &ctxt);
-    if (!xml)
-        goto cleanup;
-
-    name = virXPathString("string(/domainsnapshot/name)", ctxt);
-    if (!name) {
-        vshError(ctl, "%s",
-                 _("Could not find 'name' element in domain snapshot XML"));
-        goto cleanup;
-    }
-
-    vshPrint(ctl, _("Domain snapshot %s created"), name);
-    if (from)
-        vshPrint(ctl, _(" from '%s'"), from);
-    vshPrint(ctl, "\n");
-
-    ret = true;
+    ret = vshSnapshotCreate(ctl, dom, buffer, 0, from);

 cleanup:
-    VIR_FREE(name);
-    xmlXPathFreeContext(ctxt);
-    xmlFreeDoc(xml);
-    if (snapshot)
-        virDomainSnapshotFree(snapshot);
-    VIR_FREE(doc);
     VIR_FREE(buffer);
     if (dom)
         virDomainFree(dom);
@@ -12213,13 +12226,8 @@ cmdSnapshotCreateAs(vshControl *ctl, const vshCmd *cmd)
     virDomainPtr dom = NULL;
     bool ret = false;
     char *buffer = NULL;
-    virDomainSnapshotPtr snapshot = NULL;
-    xmlDocPtr xml = NULL;
-    xmlXPathContextPtr ctxt = NULL;
-    char *doc = NULL;
     const char *name = NULL;
     const char *desc = NULL;
-    char *parsed_name = NULL;
     virBuffer buf = VIR_BUFFER_INITIALIZER;

     if (!vshConnectionUsability(ctl, ctl->conn))
@@ -12254,36 +12262,9 @@ cmdSnapshotCreateAs(vshControl *ctl, const vshCmd *cmd)
         goto cleanup;
     }

-    snapshot = virDomainSnapshotCreateXML(dom, buffer, 0);
-    if (snapshot == NULL)
-        goto cleanup;
-
-    doc = virDomainSnapshotGetXMLDesc(snapshot, 0);
-    if (!doc)
-        goto cleanup;
-
-    xml = virXMLParseStringCtxt(doc, "domainsnapshot.xml", &ctxt);
-    if (!xml)
-        goto cleanup;
-
-    parsed_name = virXPathString("string(/domainsnapshot/name)", ctxt);
-    if (!parsed_name) {
-        vshError(ctl, "%s",
-                 _("Could not find 'name' element in domain snapshot XML"));
-        goto cleanup;
-    }
-
-    vshPrint(ctl, _("Domain snapshot %s created\n"), name ? name : parsed_name);
-
-    ret = true;
+    ret = vshSnapshotCreate(ctl, dom, buffer, 0, NULL);

 cleanup:
-    VIR_FREE(parsed_name);
-    xmlXPathFreeContext(ctxt);
-    xmlFreeDoc(xml);
-    if (snapshot)
-        virDomainSnapshotFree(snapshot);
-    VIR_FREE(doc);
     VIR_FREE(buffer);
     if (dom)
         virDomainFree(dom);
-- 
1.7.4.4




More information about the libvir-list mailing list