On Tue, May 16, 2017 at 11:41:55AM +0200, Martin Kletzander wrote: > On Mon, May 15, 2017 at 04:29:48AM -0400, Daniel Liu wrote: > > Fix bug 835476[1]. > > It's enough to mention it below (as you did). > > > virsh: add [--domain DOMAIN] option to domxml-to-native DOMAIN COMMAND > > This first line is already in the subject. > > > Add support for 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. > > > > I would reword this a little bit. How would you feel about something > along the lines of: > > The option allows someone to run domain-to-native on already existing > domain without the need of supplying their XML. It is basically > wrapper around `virsh dumpxml $dom | virsh domxml-to-native /dev/stdin`. > > Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=835476 > I made changes accordingly in the version 2 of this patch. > > E.g.: > > virsh domxml-to-native qemu-argv --domain RHEL7.3 # domain name > > virsh domxml-to-native qemu-argv --domain 10 # domain id > > virsh domxml-to-native qemu-argv dumped_dom.xml # dumped xml > > > > [1] https://bugzilla.redhat.com/show_bug.cgi?id=835476 > > --- > > tools/virsh-domain.c | 54 ++++++++++++++++++++++++++++++++++++++++++---------- > > 1 file changed, 44 insertions(+), 10 deletions(-) > > > > diff --git a/tools/virsh-domain.c b/tools/virsh-domain.c > > index 0d19d0e01..a79fd3ab2 100644 > > --- a/tools/virsh-domain.c > > +++ b/tools/virsh-domain.c > > @@ -9840,9 +9840,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} > > @@ -9851,30 +9855,60 @@ static const vshCmdOptDef opts_domxmltonative[] = { > > static bool > > cmdDomXMLToNative(vshControl *ctl, const vshCmd *cmd) > > { > > - bool ret = true; > > + bool ret = false; > > const char *format = NULL; > > - const char *xmlFile = NULL; > > - char *configData; > > - char *xmlData; > > + const char *domain = NULL; > > + const char *xml = NULL; > > + char *xmlData = NULL; > > + char *configData = NULL; > > unsigned int flags = 0; > > virshControlPtr priv = ctl->privData; > > + virDomainPtr dom = NULL; > > > > - if (vshCommandOptStringReq(ctl, cmd, "format", &format) < 0 || > > - vshCommandOptStringReq(ctl, cmd, "xml", &xmlFile) < 0) > > If this was already there, you could keep using it. But that's not a > big deal for me, just some others might not like it. > I kept the existing code and only added an additional check for "domain" in v2, i.e.: if (vshCommandOptStringReq(ctl, cmd, "format", &format) < 0 || vshCommandOptStringReq(ctl, cmd, "xml", &xml) < 0 || vshCommandOptStringReq(ctl, cmd, "domain", &domain) < 0) return false; > > + if (vshCommandOptStringReq(ctl, cmd, "format", &format) < 0) > > + return false; > > + > > + if (vshCommandOptStringReq(ctl, cmd, "domain", &domain) < 0) > > + return false; > > + > > [1] So here you get the domain name/id/uuid ... > > > + if (vshCommandOptStringReq(ctl, cmd, "xml", &xml) < 0) > > return false; > > > > - if (virFileReadAll(xmlFile, VSH_MAX_XML_FILE, &xmlData) < 0) > > + VSH_EXCLUSIVE_OPTIONS_VAR(domain, xml); > > + > > + if (domain) > > + dom = virshCommandOptDomain(ctl, cmd, &domain); > > + > > ... and here you get the object. What do you supply as the third > parameter? Check what the function does. There's a leak that you will > fix by getting rid of the lines above [1]. And just supply NULL here. > I did not fully get it by "getting rid of the lines above [1]." But I made the change as you suggested to use NULL as the third argument. > Also make sure &dom is not NULL here, in case someone supplies > non-existing domain name. > > > + if (!dom && !xml) { > > + vshError(ctl, _("need either domain (ID, UUID, or name) or domain XML configuration file path")); > > return false; > > + } > > + > > + if (dom) { > > + xmlData = virDomainGetXMLDesc(dom, flags); > > + if (xmlData == NULL) > > + goto cleanup; > > + } > > + > > + if (xml) { > > + if (virFileReadAll(xml, VSH_MAX_XML_FILE, &xmlData) < 0) > > + goto cleanup; > > + } > > > > This ^^ would be more readable as: > > if (dom) { > xmlData = blah; > } else if (xml) { > readFile(asdf, &xmlData); > } > > if (!xmlData) { > vshError(ctl, "%s", > _("Either <xml> or --domain must be suppied")); > > > Or something in that regard. > Yep, I changed it accordingly. > > configData = virConnectDomainXMLToNative(priv->conn, format, xmlData, flags); > > if (configData != NULL) { > > vshPrint(ctl, "%s", configData); > > - VIR_FREE(configData); > > + ret = true; > > + goto cleanup; > > } else { > > - ret = false; > > + vshError(ctl, _("convert from domain XML to native command failed")); > > + goto cleanup; > > } > > Since you are changing this... This does not look like all the other > places in libvirt. What we do _almost_ exclusively is: > > something = func(); > if (!func) { > handle error; > goto somewhere; > } > > what = should + continue(in.case->of.no(&error); > > ret = success code; > cleanup: > stuff to clean up; > > > I would not normally mention it, but since you are changing that part > anyway, it could be cleaned up so that it does what other parts of the > code do. Or just keep it as it is. It's small and right before the > cleanup, so it's _kinda_ OK (i.e. we don't have a rule written down in > the coding style for this). > > Otherwise it's fine ;) > > Martin I changed it to something like: if (!(configData = virConnectDomainXMLToNative())) { return false; goto cleanup; } else { vshPrint(); } Hopefully I am following the libvirt convention here. Let me know if there is anything more needs to be changed. Thank you very much, Dan -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list