[libvirt] [PATCH] RFE: virsh: add domxml-to-native <fmt> [--domain DOMAIN] option

Dan srwx4096 at gmail.com
Mon Apr 24 00:54:47 UTC 2017


Bug 835476 RFE: virsh: add domxml-to-native --domain option (for existing
VM) [1]

virsh DOMAIN COMMAND domxml-to-native did not support domain (id|uuid|name)
as input for generating hypervisor agent native command, instead only
supported
XML input from STDIN. Here in this patch, it supports the following syntax:
domxml-to-native <format> { [--domain DOMAIN] | [XML] }, i.e., it supports
either designating domain (domain id, uuid, or name), or path to XML domain
configuration file; NOTE that it deprecated existing STDIN input passing XML
functionality. It was tested on the test mock driver and QEMU.




[1]. https://bugzilla.redhat.com/show_bug.cgi?id=835476




Dan

---
 tools/virsh-domain.c | 68
++++++++++++++++++++++++++++++++++++++++++----------
 1 file changed, 55 insertions(+), 13 deletions(-)

diff --git a/tools/virsh-domain.c b/tools/virsh-domain.c
index db8accfe4..9ac855b19 100644
--- a/tools/virsh-domain.c
+++ b/tools/virsh-domain.c
@@ -60,6 +60,7 @@
 #include "virsh-nodedev.h"
 #include "viruri.h"

+
 /* Gnulib doesn't guarantee SA_SIGINFO support.  */
 #ifndef SA_SIGINFO
 # define SA_SIGINFO 0
@@ -9811,9 +9812,13 @@ static const vshCmdOptDef opts_domxmltonative[] = {
      .flags = VSH_OFLAG_REQ,
      .help = N_("target config data type format")
     },
+    {.name = "domain",
+     .type = VSH_OT_DATA,
+     .flags = VSH_OFLAG_REQ_OPT,
+     .help = N_("domain name, id or uuid")
+    },
     {.name = "xml",
      .type = VSH_OT_DATA,
-     .flags = VSH_OFLAG_REQ,
      .help = N_("xml data file to export from")
     },
     {.name = NULL}
@@ -9822,31 +9827,68 @@ static const vshCmdOptDef opts_domxmltonative[] = {
 static bool
 cmdDomXMLToNative(vshControl *ctl, const vshCmd *cmd)
 {
-    bool ret = true;
     const char *format = NULL;
     const char *xmlFile = NULL;
-    char *configData;
-    char *xmlData;
+    const char *domain = NULL;
+    char *configData = NULL;
+    char *xmlData = NULL;
     unsigned int flags = 0;
+    unsigned int domflags = 0;
     virshControlPtr priv = ctl->privData;
+    virDomainPtr dom = NULL;

-    if (vshCommandOptStringReq(ctl, cmd, "format", &format) < 0 ||
-        vshCommandOptStringReq(ctl, cmd, "xml", &xmlFile) < 0)
+    if (vshCommandOptStringReq(ctl, cmd, "format", &format) < 0)
         return false;
+
+    if (vshCommandOptStringReq(ctl, cmd, "domain", &domain) < 0)
+ return false;

-    if (virFileReadAll(xmlFile, VSH_MAX_XML_FILE, &xmlData) < 0)
-        return false;
+    if (vshCommandOptStringReq(ctl, cmd, "xml", &xmlFile) < 0)
+ return false;
+
+    VSH_EXCLUSIVE_OPTIONS_VAR(domain, xmlFile);
+
+    if (domain) {
+ domflags = VIRSH_BYID | VIRSH_BYUUID | VIRSH_BYNAME;
+        dom = virshLookupDomainBy(ctl, domain, domflags);
+    }
+
+    if (!dom && !xmlFile) {
+ vshError(ctl, _("need either xml file input or domain"));
+ return false;
+    }
+
+    if(dom){
+ xmlData = virDomainGetXMLDesc(dom, flags);
+ if (xmlData == NULL) {
+    virshDomainFree(dom);
+    return false;
+    }
+    }
+
+    if (xmlFile) {
+ if (virFileReadAll(xmlFile, VSH_MAX_XML_FILE, &xmlData) < 0) {
+            vshReportError(ctl);
+    VIR_FREE(xmlData);
+    return false;
+    }
+    }

     configData = virConnectDomainXMLToNative(priv->conn, format, xmlData,
flags);
+
     if (configData != NULL) {
-        vshPrint(ctl, "%s", configData);
-        VIR_FREE(configData);
+ vshPrint(ctl, "%s", configData);
+ VIR_FREE(xmlData);
+ VIR_FREE(configData);
+ virDomainFree(dom);
+ return true;
     } else {
-        ret = false;
+ VIR_FREE(xmlData);
+ virDomainFree(dom);
+ return false;
     }

-    VIR_FREE(xmlData);
-    return ret;
+    return false;
 }

 /*
-- 
2.12.2
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://listman.redhat.com/archives/libvir-list/attachments/20170423/26f2fb97/attachment-0001.htm>


More information about the libvir-list mailing list