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.
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