[libvirt] [PATCH RFC v2 0/5] conf: add net device prefix capability

Hey, Back in the pre 1.3.0 release [0] we had a regression when migrating domains in libxl (introduced by the reverted commit d2e5538b1). The chosen solution to address this problem was to introduce a capability to be used by the virDomainNetDefFormat() and virDomainNetDefParseXML() routines. RFCv1 implemented this by "caching" netprefix in the domain definition[1]; as suggested in the review[1] v2 implements it by adding the virCapsPtr to the relevant APIs and also propagating the API change to all drivers. It is divided as follows: Patch 1: Adds prefix to capabilites Patch 2: Add prefix to NetDefParseXML Patch 3,4: API changes to include virCapsPtr and netprefix (New) Patch 5: set prefix on libxl (Acked) Having this series and the reverted commit applied, I can successfully migrate a domain without seeing the same interface name on both source and destination node with libxl. Note: I haven't been able to compile-test all drivers, specifically bhyve, vz and hyperv. Testing was made with libxl. Thanks! Joao [0] https://www.redhat.com/archives/libvir-list/2015-December/msg00279.html [1] https://www.redhat.com/archives/libvir-list/2016-January/msg00886.html Joao Martins (5): conf: add net device prefix to capabilities conf: add prefix in virDomainNetDefParseXML conf: add caps to virDomainDefFormat* conf: add caps to virDomainSaveConfig libxl: set net device prefix src/bhyve/bhyve_driver.c | 11 +++++++++-- src/conf/capabilities.c | 22 +++++++++++++++++++++ src/conf/capabilities.h | 4 ++++ src/conf/domain_conf.c | 42 +++++++++++++++++++++++++++------------- src/conf/domain_conf.h | 4 ++++ src/conf/snapshot_conf.c | 2 +- src/esx/esx_driver.c | 5 +++-- src/libvirt_private.syms | 1 + src/libxl/libxl_conf.c | 3 +++ src/libxl/libxl_conf.h | 4 ++++ src/libxl/libxl_domain.c | 2 +- src/libxl/libxl_driver.c | 24 +++++++++++++---------- src/libxl/libxl_migration.c | 2 +- src/lxc/lxc_driver.c | 24 +++++++++++++---------- src/lxc/lxc_process.c | 12 ++++++------ src/network/bridge_driver.c | 4 ++-- src/openvz/openvz_driver.c | 5 +++-- src/phyp/phyp_driver.c | 2 +- src/qemu/qemu_blockjob.c | 1 + src/qemu/qemu_domain.c | 2 +- src/qemu/qemu_driver.c | 47 +++++++++++++++++++++++++-------------------- src/qemu/qemu_migration.c | 3 ++- src/qemu/qemu_process.c | 5 +++-- src/test/test_driver.c | 6 ++++-- src/uml/uml_driver.c | 4 ++-- src/vbox/vbox_common.c | 3 ++- src/vmware/vmware_driver.c | 5 +++-- src/vz/vz_driver.c | 3 ++- src/xen/xen_driver.c | 4 ++-- src/xenapi/xenapi_driver.c | 5 +++-- tests/lxcconf2xmltest.c | 2 +- tests/openvzutilstest.c | 2 +- tests/qemuargv2xmltest.c | 2 +- tests/qemuhotplugtest.c | 3 ++- tests/sexpr2xmltest.c | 2 +- tests/testutils.c | 2 +- tests/vmx2xmltest.c | 3 ++- tests/xlconfigtest.c | 2 +- tests/xmconfigtest.c | 2 +- 39 files changed, 184 insertions(+), 97 deletions(-) -- 2.1.4

In the reverted commit d2e5538b1, the libxl driver was changed to copy interface names autogenerated by libxl to the corresponding network def in the domain's virDomainDef object. The copied name is freed when the domain transitions to the shutoff state. But when migrating a domain, the autogenerated name is included in the XML sent to the destination host. It is possible an interface with the same name already exists on the destination host, causing migration to fail. This patch defines a new capability for setting the network device prefix that will be used in the driver. Valid prefixes are VIR_NET_GENERATED_PREFIX or the one announced by the driver. Signed-off-by: Joao Martins <joao.m.martins@oracle.com> --- Changes since v1: - free netprefix in virCapabilitiesDispose() --- src/conf/capabilities.c | 22 ++++++++++++++++++++++ src/conf/capabilities.h | 4 ++++ src/libvirt_private.syms | 1 + 3 files changed, 27 insertions(+) diff --git a/src/conf/capabilities.c b/src/conf/capabilities.c index 86ea212..9ab343b 100644 --- a/src/conf/capabilities.c +++ b/src/conf/capabilities.c @@ -221,6 +221,7 @@ virCapabilitiesDispose(void *object) virCapabilitiesClearSecModel(&caps->host.secModels[i]); VIR_FREE(caps->host.secModels); + VIR_FREE(caps->host.netprefix); VIR_FREE(caps->host.pagesSize); virCPUDefFree(caps->host.cpu); } @@ -269,6 +270,23 @@ virCapabilitiesAddHostMigrateTransport(virCapsPtr caps, return 0; } +/** + * virCapabilitiesSetNetPrefix: + * @caps: capabilities to extend + * @name: prefix for host generated network interfaces + * + * Registers the prefix that is used for generated network interfaces + */ +int +virCapabilitiesSetNetPrefix(virCapsPtr caps, + const char *prefix) +{ + if (VIR_STRDUP(caps->host.netprefix, prefix) < 0) + return -1; + + return 0; +} + /** * virCapabilitiesAddHostNUMACell: @@ -913,6 +931,10 @@ virCapabilitiesFormatXML(virCapsPtr caps) virBufferAddLit(&buf, "</migration_features>\n"); } + if (caps->host.netprefix) + virBufferAsprintf(&buf, "<netprefix>%s</netprefix>\n", + caps->host.netprefix); + if (caps->host.nnumaCell && virCapabilitiesFormatNUMATopology(&buf, caps->host.nnumaCell, caps->host.numaCell) < 0) diff --git a/src/conf/capabilities.h b/src/conf/capabilities.h index 1754b13..2767f48 100644 --- a/src/conf/capabilities.h +++ b/src/conf/capabilities.h @@ -160,6 +160,7 @@ struct _virCapsHost { size_t nsecModels; virCapsHostSecModelPtr secModels; + char *netprefix; virCPUDefPtr cpu; int nPagesSize; /* size of pagesSize array */ unsigned int *pagesSize; /* page sizes support on the system */ @@ -219,6 +220,9 @@ extern int virCapabilitiesAddHostMigrateTransport(virCapsPtr caps, const char *name); +extern int +virCapabilitiesSetNetPrefix(virCapsPtr caps, + const char *prefix); extern int virCapabilitiesAddHostNUMACell(virCapsPtr caps, diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index 3d0ec9d..4f94e42 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -59,6 +59,7 @@ virCapabilitiesGetCpusForNodemask; virCapabilitiesHostSecModelAddBaseLabel; virCapabilitiesNew; virCapabilitiesSetHostCPU; +virCapabilitiesSetNetPrefix; # conf/cpu_conf.h -- 2.1.4

On Wed, Feb 03, 2016 at 09:40:33PM +0000, Joao Martins wrote:
In the reverted commit d2e5538b1, the libxl driver was changed to copy interface names autogenerated by libxl to the corresponding network def in the domain's virDomainDef object. The copied name is freed when the domain transitions to the shutoff state. But when migrating a domain, the autogenerated name is included in the XML sent to the destination host. It is possible an interface with the same name already exists on the destination host, causing migration to fail.
This patch defines a new capability for setting the network device prefix that will be used in the driver. Valid prefixes are VIR_NET_GENERATED_PREFIX or the one announced by the driver.
Signed-off-by: Joao Martins <joao.m.martins@oracle.com> --- Changes since v1: - free netprefix in virCapabilitiesDispose() --- src/conf/capabilities.c | 22 ++++++++++++++++++++++ src/conf/capabilities.h | 4 ++++ src/libvirt_private.syms | 1 + 3 files changed, 27 insertions(+)
ACK Regards, Daniel -- |: http://berrange.com -o- http://www.flickr.com/photos/dberrange/ :| |: http://libvirt.org -o- http://virt-manager.org :| |: http://autobuild.org -o- http://search.cpan.org/~danberr/ :| |: http://entangle-photo.org -o- http://live.gnome.org/gtk-vnc :|

And use the newly added caps->host.netprefix for free interface names that match the autogenerated target names. Signed-off-by: Joao Martins <joao.m.martins@oracle.com> --- src/conf/domain_conf.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index 1ea74a6..76cb399 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -8403,6 +8403,7 @@ virDomainNetDefParseXML(virDomainXMLOptionPtr xmlopt, xmlNodePtr node, xmlXPathContextPtr ctxt, virHashTablePtr bootHash, + char *prefix, unsigned int flags) { virDomainNetDefPtr def; @@ -8569,7 +8570,8 @@ virDomainNetDefParseXML(virDomainXMLOptionPtr xmlopt, ifname = virXMLPropString(cur, "dev"); if (ifname && (flags & VIR_DOMAIN_DEF_PARSE_INACTIVE) && - STRPREFIX(ifname, VIR_NET_GENERATED_PREFIX)) { + (STRPREFIX(ifname, VIR_NET_GENERATED_PREFIX) || + (prefix && STRPREFIX(ifname, prefix)))) { /* An auto-generated target name, blank it out */ VIR_FREE(ifname); } @@ -12525,6 +12527,7 @@ virDomainDeviceDefParse(const char *xmlStr, xmlNodePtr node; xmlXPathContextPtr ctxt = NULL; virDomainDeviceDefPtr dev = NULL; + char *netprefix; if (!(xml = virXMLParseStringCtxt(xmlStr, _("(device_definition)"), &ctxt))) goto error; @@ -12567,8 +12570,9 @@ virDomainDeviceDefParse(const char *xmlStr, goto error; break; case VIR_DOMAIN_DEVICE_NET: + netprefix = caps->host.netprefix; if (!(dev->data.net = virDomainNetDefParseXML(xmlopt, node, ctxt, - NULL, flags))) + NULL, netprefix, flags))) goto error; break; case VIR_DOMAIN_DEVICE_INPUT: @@ -14716,6 +14720,7 @@ virDomainDefParseXML(xmlDocPtr xml, bool usb_other = false; bool usb_master = false; bool primaryVideo = false; + char *netprefix = NULL; if (flags & VIR_DOMAIN_DEF_PARSE_VALIDATE) { char *schema = virFileFindResource("domain.rng", @@ -15901,11 +15906,13 @@ virDomainDefParseXML(xmlDocPtr xml, goto error; if (n && VIR_ALLOC_N(def->nets, n) < 0) goto error; + netprefix = caps->host.netprefix; for (i = 0; i < n; i++) { virDomainNetDefPtr net = virDomainNetDefParseXML(xmlopt, nodes[i], ctxt, bootHash, + netprefix, flags); if (!net) goto error; -- 2.1.4

On Wed, Feb 03, 2016 at 09:40:34PM +0000, Joao Martins wrote:
And use the newly added caps->host.netprefix for free interface names that match the autogenerated target names.
Signed-off-by: Joao Martins <joao.m.martins@oracle.com> --- src/conf/domain_conf.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-)
ACK Regards, Daniel -- |: http://berrange.com -o- http://www.flickr.com/photos/dberrange/ :| |: http://libvirt.org -o- http://virt-manager.org :| |: http://autobuild.org -o- http://search.cpan.org/~danberr/ :| |: http://entangle-photo.org -o- http://live.gnome.org/gtk-vnc :|

And use the newly added caps->host.netprefix (if it exists) for interface names that match the autogenerated target names. Signed-off-by: Joao Martins <joao.m.martins@oracle.com> --- src/bhyve/bhyve_driver.c | 9 ++++++++- src/conf/domain_conf.c | 28 ++++++++++++++++++---------- src/conf/domain_conf.h | 3 +++ src/conf/snapshot_conf.c | 2 +- src/esx/esx_driver.c | 5 +++-- src/libxl/libxl_domain.c | 2 +- src/libxl/libxl_driver.c | 9 ++++++--- src/libxl/libxl_migration.c | 2 +- src/lxc/lxc_driver.c | 4 +++- src/lxc/lxc_process.c | 12 ++++++------ src/network/bridge_driver.c | 4 ++-- src/openvz/openvz_driver.c | 5 +++-- src/phyp/phyp_driver.c | 2 +- src/qemu/qemu_domain.c | 2 +- src/test/test_driver.c | 6 ++++-- src/uml/uml_driver.c | 2 +- src/vbox/vbox_common.c | 3 ++- src/vmware/vmware_driver.c | 5 +++-- src/vz/vz_driver.c | 3 ++- src/xen/xen_driver.c | 4 ++-- src/xenapi/xenapi_driver.c | 5 +++-- tests/lxcconf2xmltest.c | 2 +- tests/openvzutilstest.c | 2 +- tests/qemuargv2xmltest.c | 2 +- tests/qemuhotplugtest.c | 3 ++- tests/sexpr2xmltest.c | 2 +- tests/testutils.c | 2 +- tests/vmx2xmltest.c | 3 ++- tests/xlconfigtest.c | 2 +- tests/xmconfigtest.c | 2 +- 30 files changed, 85 insertions(+), 52 deletions(-) diff --git a/src/bhyve/bhyve_driver.c b/src/bhyve/bhyve_driver.c index a164b24..c23c310 100644 --- a/src/bhyve/bhyve_driver.c +++ b/src/bhyve/bhyve_driver.c @@ -488,7 +488,9 @@ bhyveDomainGetOSType(virDomainPtr dom) static char * bhyveDomainGetXMLDesc(virDomainPtr domain, unsigned int flags) { + bhyveConnPtr privconn = conn->privateData; virDomainObjPtr vm; + virCapsPtr caps = NULL; char *ret = NULL; if (!(vm = bhyveDomObjFromDomain(domain))) @@ -497,9 +499,14 @@ bhyveDomainGetXMLDesc(virDomainPtr domain, unsigned int flags) if (virDomainGetXMLDescEnsureACL(domain->conn, vm->def, flags) < 0) goto cleanup; - ret = virDomainDefFormat(vm->def, + caps = bhyveDriverGetCapabilities(privconn); + if (!caps) + goto cleanup; + + ret = virDomainDefFormat(vm->def, caps, virDomainDefFormatConvertXMLFlags(flags)); + virObjectUnref(caps); cleanup: if (vm) virObjectUnlock(vm); diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index 76cb399..4ecf700 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -18170,8 +18170,8 @@ virDomainDefCheckABIStability(virDomainDefPtr src, error: err = virSaveLastError(); - strSrc = virDomainDefFormat(src, 0); - strDst = virDomainDefFormat(dst, 0); + strSrc = virDomainDefFormat(src, NULL, 0); + strDst = virDomainDefFormat(dst, NULL, 0); VIR_DEBUG("XMLs that failed stability check were: src=\"%s\", dst=\"%s\"", NULLSTR(strSrc), NULLSTR(strDst)); VIR_FREE(strSrc); @@ -19859,6 +19859,7 @@ virDomainVirtioNetDriverFormat(char **outstr, int virDomainNetDefFormat(virBufferPtr buf, virDomainNetDefPtr def, + char *prefix, unsigned int flags) { unsigned int actualType = virDomainNetGetActualType(def); @@ -20036,7 +20037,8 @@ virDomainNetDefFormat(virBufferPtr buf, virBufferEscapeString(buf, "<backenddomain name='%s'/>\n", def->domain_name); if (def->ifname && !((flags & VIR_DOMAIN_DEF_FORMAT_INACTIVE) && - (STRPREFIX(def->ifname, VIR_NET_GENERATED_PREFIX)))) { + (STRPREFIX(def->ifname, VIR_NET_GENERATED_PREFIX) || + (prefix && STRPREFIX(def->ifname, prefix))))) { /* Skip auto-generated target names for inactive config. */ virBufferEscapeString(buf, "<target dev='%s'/>\n", def->ifname); } @@ -21586,6 +21588,7 @@ virDomainDefHasCapabilitiesFeatures(virDomainDefPtr def) * Return -1 on failure. */ int virDomainDefFormatInternal(virDomainDefPtr def, + virCapsPtr caps, unsigned int flags, virBufferPtr buf) { @@ -21596,6 +21599,7 @@ virDomainDefFormatInternal(virDomainDefPtr def, size_t i; virBuffer childrenBuf = VIR_BUFFER_INITIALIZER; int indent; + char *netprefix = NULL; virCheckFlags(VIR_DOMAIN_DEF_FORMAT_COMMON_FLAGS | VIR_DOMAIN_DEF_FORMAT_STATUS | @@ -22293,8 +22297,10 @@ virDomainDefFormatInternal(virDomainDefPtr def, if (virDomainFSDefFormat(buf, def->fss[n], flags) < 0) goto error; + if (caps) + netprefix = caps->host.netprefix; for (n = 0; n < def->nnets; n++) - if (virDomainNetDefFormat(buf, def->nets[n], flags) < 0) + if (virDomainNetDefFormat(buf, def->nets[n], netprefix, flags) < 0) goto error; for (n = 0; n < def->nsmartcards; n++) @@ -22464,12 +22470,12 @@ unsigned int virDomainDefFormatConvertXMLFlags(unsigned int flags) char * -virDomainDefFormat(virDomainDefPtr def, unsigned int flags) +virDomainDefFormat(virDomainDefPtr def, virCapsPtr caps, unsigned int flags) { virBuffer buf = VIR_BUFFER_INITIALIZER; virCheckFlags(VIR_DOMAIN_DEF_FORMAT_COMMON_FLAGS, NULL); - if (virDomainDefFormatInternal(def, flags, &buf) < 0) + if (virDomainDefFormatInternal(def, caps, flags, &buf) < 0) return NULL; return virBufferContentAndReset(&buf); @@ -22503,7 +22509,7 @@ virDomainObjFormat(virDomainXMLOptionPtr xmlopt, xmlopt->privateData.format(&buf, obj) < 0) goto error; - if (virDomainDefFormatInternal(obj->def, flags, &buf) < 0) + if (virDomainDefFormatInternal(obj->def, NULL, flags, &buf) < 0) goto error; virBufferAdjustIndent(&buf, -2); @@ -22693,7 +22699,7 @@ virDomainSaveConfig(const char *configDir, int ret = -1; char *xml; - if (!(xml = virDomainDefFormat(def, VIR_DOMAIN_DEF_FORMAT_SECURE))) + if (!(xml = virDomainDefFormat(def, NULL, VIR_DOMAIN_DEF_FORMAT_SECURE))) goto cleanup; if (virDomainSaveXML(configDir, def, xml)) @@ -22993,7 +22999,7 @@ virDomainDefCopy(virDomainDefPtr src, format_flags |= VIR_DOMAIN_DEF_FORMAT_INACTIVE | VIR_DOMAIN_DEF_FORMAT_MIGRATABLE; /* Easiest to clone via a round-trip through XML. */ - if (!(xml = virDomainDefFormat(src, format_flags))) + if (!(xml = virDomainDefFormat(src, caps, format_flags))) return NULL; ret = virDomainDefParseString(xml, caps, xmlopt, parse_flags); @@ -23480,6 +23486,7 @@ virDomainDeviceDefCopy(virDomainDeviceDefPtr src, int flags = VIR_DOMAIN_DEF_FORMAT_INACTIVE | VIR_DOMAIN_DEF_FORMAT_SECURE; char *xmlStr = NULL; int rc = -1; + char *netprefix; switch ((virDomainDeviceType) src->type) { case VIR_DOMAIN_DEVICE_DISK: @@ -23492,7 +23499,8 @@ virDomainDeviceDefCopy(virDomainDeviceDefPtr src, rc = virDomainFSDefFormat(&buf, src->data.fs, flags); break; case VIR_DOMAIN_DEVICE_NET: - rc = virDomainNetDefFormat(&buf, src->data.net, flags); + netprefix = caps->host.netprefix; + rc = virDomainNetDefFormat(&buf, src->data.net, netprefix, flags); break; case VIR_DOMAIN_DEVICE_INPUT: rc = virDomainInputDefFormat(&buf, src->data.input, flags); diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h index 0141009..6ae2e1b 100644 --- a/src/conf/domain_conf.h +++ b/src/conf/domain_conf.h @@ -2733,11 +2733,13 @@ void virDomainIOThreadSchedDelId(virDomainDefPtr def, unsigned int iothread_id); unsigned int virDomainDefFormatConvertXMLFlags(unsigned int flags); char *virDomainDefFormat(virDomainDefPtr def, + virCapsPtr caps, unsigned int flags); char *virDomainObjFormat(virDomainXMLOptionPtr xmlopt, virDomainObjPtr obj, unsigned int flags); int virDomainDefFormatInternal(virDomainDefPtr def, + virCapsPtr caps, unsigned int flags, virBufferPtr buf); @@ -2748,6 +2750,7 @@ int virDomainDiskSourceFormat(virBufferPtr buf, int virDomainNetDefFormat(virBufferPtr buf, virDomainNetDefPtr def, + char *prefix, unsigned int flags); typedef enum { diff --git a/src/conf/snapshot_conf.c b/src/conf/snapshot_conf.c index ea511ec..ffa1bf2 100644 --- a/src/conf/snapshot_conf.c +++ b/src/conf/snapshot_conf.c @@ -702,7 +702,7 @@ char *virDomainSnapshotDefFormat(const char *domain_uuid, virBufferAddLit(&buf, "</disks>\n"); } if (def->dom) { - if (virDomainDefFormatInternal(def->dom, flags, &buf) < 0) { + if (virDomainDefFormatInternal(def->dom, NULL, flags, &buf) < 0) { virBufferFreeAndReset(&buf); return NULL; } diff --git a/src/esx/esx_driver.c b/src/esx/esx_driver.c index 8d4b3fd..ce5f799 100644 --- a/src/esx/esx_driver.c +++ b/src/esx/esx_driver.c @@ -2749,7 +2749,7 @@ esxDomainGetXMLDesc(virDomainPtr domain, unsigned int flags) if (powerState != esxVI_VirtualMachinePowerState_PoweredOff) def->id = id; - xml = virDomainDefFormat(def, + xml = virDomainDefFormat(def, priv->caps, virDomainDefFormatConvertXMLFlags(flags)); } @@ -2805,7 +2805,8 @@ esxConnectDomainXMLFromNative(virConnectPtr conn, const char *nativeFormat, def = virVMXParseConfig(&ctx, priv->xmlopt, priv->caps, nativeConfig); if (def) - xml = virDomainDefFormat(def, VIR_DOMAIN_DEF_FORMAT_INACTIVE); + xml = virDomainDefFormat(def, priv->caps, + VIR_DOMAIN_DEF_FORMAT_INACTIVE); virDomainDefFree(def); diff --git a/src/libxl/libxl_domain.c b/src/libxl/libxl_domain.c index c74c55c..cf27ec4 100644 --- a/src/libxl/libxl_domain.c +++ b/src/libxl/libxl_domain.c @@ -1066,7 +1066,7 @@ libxlDomainStart(libxlDriverPrivatePtr driver, virDomainObjPtr vm, goto cleanup_dom; - if ((dom_xml = virDomainDefFormat(vm->def, 0)) == NULL) + if ((dom_xml = virDomainDefFormat(vm->def, cfg->caps, 0)) == NULL) goto cleanup_dom; if (libxl_userdata_store(cfg->ctx, domid, "libvirt-xml", diff --git a/src/libxl/libxl_driver.c b/src/libxl/libxl_driver.c index 4a9134e..dfaf3a0 100644 --- a/src/libxl/libxl_driver.c +++ b/src/libxl/libxl_driver.c @@ -1674,7 +1674,7 @@ libxlDoDomainSave(libxlDriverPrivatePtr driver, virDomainObjPtr vm, goto cleanup; } - if ((xml = virDomainDefFormat(vm->def, 0)) == NULL) + if ((xml = virDomainDefFormat(vm->def, cfg->caps, 0)) == NULL) goto cleanup; xml_len = strlen(xml) + 1; @@ -2555,6 +2555,8 @@ libxlDomainGetVcpus(virDomainPtr dom, virVcpuInfoPtr info, int maxinfo, static char * libxlDomainGetXMLDesc(virDomainPtr dom, unsigned int flags) { + libxlDriverPrivatePtr driver = dom->conn->privateData; + libxlDriverConfigPtr cfg = libxlDriverConfigGet(driver); virDomainObjPtr vm; virDomainDefPtr def; char *ret = NULL; @@ -2572,12 +2574,13 @@ libxlDomainGetXMLDesc(virDomainPtr dom, unsigned int flags) else def = vm->def; - ret = virDomainDefFormat(def, + ret = virDomainDefFormat(def, cfg->caps, virDomainDefFormatConvertXMLFlags(flags)); cleanup: if (vm) virObjectUnlock(vm); + virObjectUnref(cfg); return ret; } @@ -2630,7 +2633,7 @@ libxlConnectDomainXMLFromNative(virConnectPtr conn, goto cleanup; } - xml = virDomainDefFormat(def, VIR_DOMAIN_DEF_FORMAT_INACTIVE); + xml = virDomainDefFormat(def, cfg->caps, VIR_DOMAIN_DEF_FORMAT_INACTIVE); cleanup: virDomainDefFree(def); diff --git a/src/libxl/libxl_migration.c b/src/libxl/libxl_migration.c index 0d23e5f..93eaa87 100644 --- a/src/libxl/libxl_migration.c +++ b/src/libxl/libxl_migration.c @@ -254,7 +254,7 @@ libxlDomainMigrationBegin(virConnectPtr conn, if (!libxlDomainMigrationIsAllowed(def)) goto endjob; - xml = virDomainDefFormat(def, VIR_DOMAIN_DEF_FORMAT_SECURE); + xml = virDomainDefFormat(def, cfg->caps, VIR_DOMAIN_DEF_FORMAT_SECURE); endjob: if (!libxlDomainObjEndJob(driver, vm)) diff --git a/src/lxc/lxc_driver.c b/src/lxc/lxc_driver.c index 67088c8..7be92c7 100644 --- a/src/lxc/lxc_driver.c +++ b/src/lxc/lxc_driver.c @@ -1027,6 +1027,7 @@ lxcDomainGetMemoryParameters(virDomainPtr dom, static char *lxcDomainGetXMLDesc(virDomainPtr dom, unsigned int flags) { + virLXCDriverPtr driver = dom->conn->privateData; virDomainObjPtr vm; char *ret = NULL; @@ -1040,6 +1041,7 @@ static char *lxcDomainGetXMLDesc(virDomainPtr dom, ret = virDomainDefFormat((flags & VIR_DOMAIN_XML_INACTIVE) && vm->newDef ? vm->newDef : vm->def, + driver->caps, virDomainDefFormatConvertXMLFlags(flags)); cleanup: @@ -1072,7 +1074,7 @@ static char *lxcConnectDomainXMLFromNative(virConnectPtr conn, if (!(def = lxcParseConfigString(nativeConfig, caps, driver->xmlopt))) goto cleanup; - xml = virDomainDefFormat(def, 0); + xml = virDomainDefFormat(def, caps, 0); cleanup: virObjectUnref(caps); diff --git a/src/lxc/lxc_process.c b/src/lxc/lxc_process.c index f7e2b81..3ee3b13 100644 --- a/src/lxc/lxc_process.c +++ b/src/lxc/lxc_process.c @@ -177,7 +177,7 @@ static void virLXCProcessCleanup(virLXCDriverPtr driver, /* now that we know it's stopped call the hook if present */ if (virHookPresent(VIR_HOOK_DRIVER_LXC)) { - char *xml = virDomainDefFormat(vm->def, 0); + char *xml = virDomainDefFormat(vm->def, driver->caps, 0); /* we can't stop the operation even if the script raised an error */ virHookCall(VIR_HOOK_DRIVER_LXC, vm->def->name, @@ -238,7 +238,7 @@ static void virLXCProcessCleanup(virLXCDriverPtr driver, /* The "release" hook cleans up additional resources */ if (virHookPresent(VIR_HOOK_DRIVER_LXC)) { - char *xml = virDomainDefFormat(vm->def, 0); + char *xml = virDomainDefFormat(vm->def, driver->caps, 0); /* we can't stop the operation even if the script raised an error */ virHookCall(VIR_HOOK_DRIVER_LXC, vm->def->name, @@ -1278,7 +1278,7 @@ int virLXCProcessStart(virConnectPtr conn, /* Run an early hook to set-up missing devices */ if (virHookPresent(VIR_HOOK_DRIVER_LXC)) { - char *xml = virDomainDefFormat(vm->def, 0); + char *xml = virDomainDefFormat(vm->def, driver->caps, 0); int hookret; hookret = virHookCall(VIR_HOOK_DRIVER_LXC, vm->def->name, @@ -1390,7 +1390,7 @@ int virLXCProcessStart(virConnectPtr conn, /* now that we know it is about to start call the hook if present */ if (virHookPresent(VIR_HOOK_DRIVER_LXC)) { - char *xml = virDomainDefFormat(vm->def, 0); + char *xml = virDomainDefFormat(vm->def, driver->caps, 0); int hookret; hookret = virHookCall(VIR_HOOK_DRIVER_LXC, vm->def->name, @@ -1532,7 +1532,7 @@ int virLXCProcessStart(virConnectPtr conn, /* finally we can call the 'started' hook script if any */ if (virHookPresent(VIR_HOOK_DRIVER_LXC)) { - char *xml = virDomainDefFormat(vm->def, 0); + char *xml = virDomainDefFormat(vm->def, driver->caps, 0); int hookret; hookret = virHookCall(VIR_HOOK_DRIVER_LXC, vm->def->name, @@ -1697,7 +1697,7 @@ virLXCProcessReconnectDomain(virDomainObjPtr vm, /* now that we know it's reconnected call the hook if present */ if (virHookPresent(VIR_HOOK_DRIVER_LXC)) { - char *xml = virDomainDefFormat(vm->def, 0); + char *xml = virDomainDefFormat(vm->def, driver->caps, 0); int hookret; /* we can't stop the operation even if the script raised an error */ diff --git a/src/network/bridge_driver.c b/src/network/bridge_driver.c index 362e294..c19696c 100644 --- a/src/network/bridge_driver.c +++ b/src/network/bridge_driver.c @@ -200,11 +200,11 @@ networkRunHook(virNetworkObjPtr network, virBufferAddLit(&buf, "<hookData>\n"); virBufferAdjustIndent(&buf, 2); - if (iface && virDomainNetDefFormat(&buf, iface, 0) < 0) + if (iface && virDomainNetDefFormat(&buf, iface, NULL, 0) < 0) goto cleanup; if (virNetworkDefFormatBuf(&buf, network->def, 0) < 0) goto cleanup; - if (dom && virDomainDefFormatInternal(dom, 0, &buf) < 0) + if (dom && virDomainDefFormatInternal(dom, NULL, 0, &buf) < 0) goto cleanup; virBufferAdjustIndent(&buf, -2); diff --git a/src/openvz/openvz_driver.c b/src/openvz/openvz_driver.c index c14834b..a6834b3 100644 --- a/src/openvz/openvz_driver.c +++ b/src/openvz/openvz_driver.c @@ -573,7 +573,7 @@ static char *openvzDomainGetXMLDesc(virDomainPtr dom, unsigned int flags) { goto cleanup; } - ret = virDomainDefFormat(vm->def, + ret = virDomainDefFormat(vm->def, driver->caps, virDomainDefFormatConvertXMLFlags(flags)); cleanup: @@ -2274,7 +2274,8 @@ openvzDomainMigrateBegin3Params(virDomainPtr domain, goto cleanup; } - xml = virDomainDefFormat(vm->def, VIR_DOMAIN_DEF_FORMAT_SECURE); + xml = virDomainDefFormat(vm->def, driver->caps, + VIR_DOMAIN_DEF_FORMAT_SECURE); cleanup: if (vm) diff --git a/src/phyp/phyp_driver.c b/src/phyp/phyp_driver.c index 760e132..d1c40da 100644 --- a/src/phyp/phyp_driver.c +++ b/src/phyp/phyp_driver.c @@ -3303,7 +3303,7 @@ phypDomainGetXMLDesc(virDomainPtr dom, unsigned int flags) if (virDomainDefSetVcpus(&def, vcpus) < 0) goto err; - return virDomainDefFormat(&def, + return virDomainDefFormat(&def, phyp_driver->caps, virDomainDefFormatConvertXMLFlags(flags)); err: diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c index 1df1b74..22a8ff9 100644 --- a/src/qemu/qemu_domain.c +++ b/src/qemu/qemu_domain.c @@ -2160,7 +2160,7 @@ qemuDomainDefFormatBuf(virQEMUDriverPtr driver, } - ret = virDomainDefFormatInternal(def, + ret = virDomainDefFormatInternal(def, driver->caps, virDomainDefFormatConvertXMLFlags(flags), buf); diff --git a/src/test/test_driver.c b/src/test/test_driver.c index 37108ab..89973f6 100644 --- a/src/test/test_driver.c +++ b/src/test/test_driver.c @@ -1982,7 +1982,7 @@ testDomainSaveFlags(virDomainPtr domain, const char *path, if (!(privdom = testDomObjFromDomain(domain))) goto cleanup; - xml = virDomainDefFormat(privdom->def, + xml = virDomainDefFormat(privdom->def, privconn->caps, VIR_DOMAIN_DEF_FORMAT_SECURE); if (xml == NULL) { @@ -2591,6 +2591,7 @@ testDomainGetVcpuPinInfo(virDomainPtr dom, static char *testDomainGetXMLDesc(virDomainPtr domain, unsigned int flags) { + testDriverPtr privconn = domain->conn->privateData; virDomainDefPtr def; virDomainObjPtr privdom; char *ret = NULL; @@ -2603,7 +2604,8 @@ static char *testDomainGetXMLDesc(virDomainPtr domain, unsigned int flags) def = (flags & VIR_DOMAIN_XML_INACTIVE) && privdom->newDef ? privdom->newDef : privdom->def; - ret = virDomainDefFormat(def, virDomainDefFormatConvertXMLFlags(flags)); + ret = virDomainDefFormat(def, privconn->caps, + virDomainDefFormatConvertXMLFlags(flags)); virDomainObjEndAPI(&privdom); return ret; diff --git a/src/uml/uml_driver.c b/src/uml/uml_driver.c index bccdc69..4469426 100644 --- a/src/uml/uml_driver.c +++ b/src/uml/uml_driver.c @@ -1986,7 +1986,7 @@ static char *umlDomainGetXMLDesc(virDomainPtr dom, goto cleanup; ret = virDomainDefFormat((flags & VIR_DOMAIN_XML_INACTIVE) && vm->newDef ? - vm->newDef : vm->def, + vm->newDef : vm->def, driver->caps, virDomainDefFormatConvertXMLFlags(flags)); cleanup: diff --git a/src/vbox/vbox_common.c b/src/vbox/vbox_common.c index 110990f..cf38d2a 100644 --- a/src/vbox/vbox_common.c +++ b/src/vbox/vbox_common.c @@ -3996,7 +3996,8 @@ static char *vboxDomainGetXMLDesc(virDomainPtr dom, unsigned int flags) /* dump USB devices/filters if active */ vboxHostDeviceGetXMLDesc(data, def, machine); - ret = virDomainDefFormat(def, virDomainDefFormatConvertXMLFlags(flags)); + ret = virDomainDefFormat(def, data->caps, + virDomainDefFormatConvertXMLFlags(flags)); cleanup: VBOX_RELEASE(machine); diff --git a/src/vmware/vmware_driver.c b/src/vmware/vmware_driver.c index fa66c21..e4e470a 100644 --- a/src/vmware/vmware_driver.c +++ b/src/vmware/vmware_driver.c @@ -1005,7 +1005,7 @@ vmwareDomainGetXMLDesc(virDomainPtr dom, unsigned int flags) goto cleanup; } - ret = virDomainDefFormat(vm->def, + ret = virDomainDefFormat(vm->def, driver->caps, virDomainDefFormatConvertXMLFlags(flags)); cleanup: @@ -1040,7 +1040,8 @@ vmwareConnectDomainXMLFromNative(virConnectPtr conn, const char *nativeFormat, def = virVMXParseConfig(&ctx, driver->xmlopt, driver->caps, nativeConfig); if (def != NULL) - xml = virDomainDefFormat(def, VIR_DOMAIN_DEF_FORMAT_INACTIVE); + xml = virDomainDefFormat(def, driver->caps, + VIR_DOMAIN_DEF_FORMAT_INACTIVE); virDomainDefFree(def); diff --git a/src/vz/vz_driver.c b/src/vz/vz_driver.c index f73f8ef..1642894 100644 --- a/src/vz/vz_driver.c +++ b/src/vz/vz_driver.c @@ -642,6 +642,7 @@ vzDomainGetState(virDomainPtr domain, static char * vzDomainGetXMLDesc(virDomainPtr domain, unsigned int flags) { + vzConnPtr privconn = conn->privateData; virDomainDefPtr def; virDomainObjPtr privdom; char *ret = NULL; @@ -654,7 +655,7 @@ vzDomainGetXMLDesc(virDomainPtr domain, unsigned int flags) def = (flags & VIR_DOMAIN_XML_INACTIVE) && privdom->newDef ? privdom->newDef : privdom->def; - ret = virDomainDefFormat(def, flags); + ret = virDomainDefFormat(def, privconn->caps, flags); cleanup: if (privdom) diff --git a/src/xen/xen_driver.c b/src/xen/xen_driver.c index 4da2d6d..7628c94 100644 --- a/src/xen/xen_driver.c +++ b/src/xen/xen_driver.c @@ -1530,7 +1530,7 @@ xenUnifiedDomainGetXMLDesc(virDomainPtr dom, unsigned int flags) def = xenDaemonDomainGetXMLDesc(dom->conn, minidef, cpus); if (def) - ret = virDomainDefFormat(def, + ret = virDomainDefFormat(def, priv->caps, virDomainDefFormatConvertXMLFlags(flags)); cleanup: @@ -1586,7 +1586,7 @@ xenUnifiedConnectDomainXMLFromNative(virConnectPtr conn, if (!def) goto cleanup; - ret = virDomainDefFormat(def, 0); + ret = virDomainDefFormat(def, priv->caps, 0); cleanup: virDomainDefFree(def); diff --git a/src/xenapi/xenapi_driver.c b/src/xenapi/xenapi_driver.c index 629495c..c4f33b9 100644 --- a/src/xenapi/xenapi_driver.c +++ b/src/xenapi/xenapi_driver.c @@ -1402,7 +1402,8 @@ xenapiDomainGetXMLDesc(virDomainPtr dom, unsigned int flags) xen_vm vm = NULL; xen_vm_set *vms; xen_string_string_map *result = NULL; - xen_session *session = ((struct _xenapiPrivate *)(dom->conn->privateData))->session; + struct _xenapiPrivate *priv = conn->privateData; + xen_session *session = priv->session; virDomainDefPtr defPtr = NULL; char *boot_policy = NULL; unsigned long memory = 0; @@ -1580,7 +1581,7 @@ xenapiDomainGetXMLDesc(virDomainPtr dom, unsigned int flags) xen_vif_set_free(vif_set); } xen_vm_set_free(vms); - xml = virDomainDefFormat(defPtr, flags); + xml = virDomainDefFormat(defPtr, priv->caps, flags); virDomainDefFree(defPtr); return xml; diff --git a/tests/lxcconf2xmltest.c b/tests/lxcconf2xmltest.c index fd5bc03..fc071f7 100644 --- a/tests/lxcconf2xmltest.c +++ b/tests/lxcconf2xmltest.c @@ -40,7 +40,7 @@ testCompareXMLToConfigFiles(const char *xml, goto fail; if (vmdef) { - if (!(actualxml = virDomainDefFormat(vmdef, 0))) + if (!(actualxml = virDomainDefFormat(vmdef, caps, 0))) goto fail; if (virtTestLoadFile(xml, &expectxml) < 0) diff --git a/tests/openvzutilstest.c b/tests/openvzutilstest.c index 1414d70..ccde636 100644 --- a/tests/openvzutilstest.c +++ b/tests/openvzutilstest.c @@ -115,7 +115,7 @@ testReadNetworkConf(const void *data ATTRIBUTE_UNUSED) goto cleanup; } - actual = virDomainDefFormat(def, VIR_DOMAIN_DEF_FORMAT_INACTIVE); + actual = virDomainDefFormat(def, NULL, VIR_DOMAIN_DEF_FORMAT_INACTIVE); if (actual == NULL) { err = virGetLastError(); diff --git a/tests/qemuargv2xmltest.c b/tests/qemuargv2xmltest.c index 7759a09..946a4e5 100644 --- a/tests/qemuargv2xmltest.c +++ b/tests/qemuargv2xmltest.c @@ -87,7 +87,7 @@ static int testCompareXMLToArgvFiles(const char *xml, goto fail; } - if (!(actualxml = virDomainDefFormat(vmdef, 0))) + if (!(actualxml = virDomainDefFormat(vmdef, driver.caps, 0))) goto fail; if (blankProblemElements(expectxml) < 0 || diff --git a/tests/qemuhotplugtest.c b/tests/qemuhotplugtest.c index 61ade25..1f711dd 100644 --- a/tests/qemuhotplugtest.c +++ b/tests/qemuhotplugtest.c @@ -182,7 +182,8 @@ testQemuHotplugCheckResult(virDomainObjPtr vm, int ret; vm->def->id = -1; - actual = virDomainDefFormat(vm->def, VIR_DOMAIN_DEF_FORMAT_SECURE); + actual = virDomainDefFormat(vm->def, driver.caps, + VIR_DOMAIN_DEF_FORMAT_SECURE); if (!actual) return -1; vm->def->id = QEMU_HOTPLUG_TEST_DOMAIN_ID; diff --git a/tests/sexpr2xmltest.c b/tests/sexpr2xmltest.c index de537ed..a4b0452 100644 --- a/tests/sexpr2xmltest.c +++ b/tests/sexpr2xmltest.c @@ -62,7 +62,7 @@ testCompareFiles(const char *xml, const char *sexpr) goto fail; } - if (!(gotxml = virDomainDefFormat(def, 0))) + if (!(gotxml = virDomainDefFormat(def, caps, 0))) goto fail; if (virtTestCompareToFile(gotxml, xml) < 0) diff --git a/tests/testutils.c b/tests/testutils.c index b587f83..61c5b72 100644 --- a/tests/testutils.c +++ b/tests/testutils.c @@ -1091,7 +1091,7 @@ testCompareDomXML2XMLFiles(virCapsPtr caps, virDomainXMLOptionPtr xmlopt, goto fail; } - if (!(actual = virDomainDefFormat(def, format_flags))) + if (!(actual = virDomainDefFormat(def, caps, format_flags))) goto fail; if (virtTestCompareToFile(actual, outfile) < 0) diff --git a/tests/vmx2xmltest.c b/tests/vmx2xmltest.c index a22af75..efd6325 100644 --- a/tests/vmx2xmltest.c +++ b/tests/vmx2xmltest.c @@ -86,7 +86,8 @@ testCompareFiles(const char *vmx, const char *xml) goto cleanup; } - if (!(formatted = virDomainDefFormat(def, VIR_DOMAIN_DEF_FORMAT_SECURE))) + if (!(formatted = virDomainDefFormat(def, caps, + VIR_DOMAIN_DEF_FORMAT_SECURE))) goto cleanup; if (virtTestCompareToFile(formatted, xml) < 0) diff --git a/tests/xlconfigtest.c b/tests/xlconfigtest.c index bad69ca..4b2f28f 100644 --- a/tests/xlconfigtest.c +++ b/tests/xlconfigtest.c @@ -116,7 +116,7 @@ testCompareFormatXML(const char *xmcfg, const char *xml) if (!(def = xenParseXL(conf, caps, xmlopt))) goto fail; - if (!(gotxml = virDomainDefFormat(def, VIR_DOMAIN_XML_INACTIVE | + if (!(gotxml = virDomainDefFormat(def, caps, VIR_DOMAIN_XML_INACTIVE | VIR_DOMAIN_XML_SECURE))) goto fail; diff --git a/tests/xmconfigtest.c b/tests/xmconfigtest.c index 3d47693..a5c718b 100644 --- a/tests/xmconfigtest.c +++ b/tests/xmconfigtest.c @@ -121,7 +121,7 @@ testCompareFormatXML(const char *xmcfg, const char *xml) if (!(def = xenParseXM(conf, caps, xmlopt))) goto fail; - if (!(gotxml = virDomainDefFormat(def, VIR_DOMAIN_DEF_FORMAT_SECURE))) + if (!(gotxml = virDomainDefFormat(def, caps, VIR_DOMAIN_DEF_FORMAT_SECURE))) goto fail; if (virtTestCompareToFile(gotxml, xml) < 0) -- 2.1.4

On Wed, Feb 03, 2016 at 09:40:35PM +0000, Joao Martins wrote:
And use the newly added caps->host.netprefix (if it exists) for interface names that match the autogenerated target names.
Signed-off-by: Joao Martins <joao.m.martins@oracle.com> --- src/bhyve/bhyve_driver.c | 9 ++++++++- src/conf/domain_conf.c | 28 ++++++++++++++++++---------- src/conf/domain_conf.h | 3 +++ src/conf/snapshot_conf.c | 2 +- src/esx/esx_driver.c | 5 +++-- src/libxl/libxl_domain.c | 2 +- src/libxl/libxl_driver.c | 9 ++++++--- src/libxl/libxl_migration.c | 2 +- src/lxc/lxc_driver.c | 4 +++- src/lxc/lxc_process.c | 12 ++++++------ src/network/bridge_driver.c | 4 ++-- src/openvz/openvz_driver.c | 5 +++-- src/phyp/phyp_driver.c | 2 +- src/qemu/qemu_domain.c | 2 +- src/test/test_driver.c | 6 ++++-- src/uml/uml_driver.c | 2 +- src/vbox/vbox_common.c | 3 ++- src/vmware/vmware_driver.c | 5 +++-- src/vz/vz_driver.c | 3 ++- src/xen/xen_driver.c | 4 ++-- src/xenapi/xenapi_driver.c | 5 +++-- tests/lxcconf2xmltest.c | 2 +- tests/openvzutilstest.c | 2 +- tests/qemuargv2xmltest.c | 2 +- tests/qemuhotplugtest.c | 3 ++- tests/sexpr2xmltest.c | 2 +- tests/testutils.c | 2 +- tests/vmx2xmltest.c | 3 ++- tests/xlconfigtest.c | 2 +- tests/xmconfigtest.c | 2 +- 30 files changed, 85 insertions(+), 52 deletions(-)
ACK
diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h index 0141009..6ae2e1b 100644 --- a/src/conf/domain_conf.h +++ b/src/conf/domain_conf.h @@ -2733,11 +2733,13 @@ void virDomainIOThreadSchedDelId(virDomainDefPtr def, unsigned int iothread_id); unsigned int virDomainDefFormatConvertXMLFlags(unsigned int flags);
char *virDomainDefFormat(virDomainDefPtr def, + virCapsPtr caps, unsigned int flags); char *virDomainObjFormat(virDomainXMLOptionPtr xmlopt, virDomainObjPtr obj, unsigned int flags);
Surprised we don't have caps added to this one too, since it will call virDomainDefFormat.
int virDomainDefFormatInternal(virDomainDefPtr def, + virCapsPtr caps, unsigned int flags, virBufferPtr buf);
@@ -2748,6 +2750,7 @@ int virDomainDiskSourceFormat(virBufferPtr buf,
int virDomainNetDefFormat(virBufferPtr buf, virDomainNetDefPtr def, + char *prefix, unsigned int flags);
typedef enum { diff --git a/src/conf/snapshot_conf.c b/src/conf/snapshot_conf.c index ea511ec..ffa1bf2 100644 --- a/src/conf/snapshot_conf.c +++ b/src/conf/snapshot_conf.c @@ -702,7 +702,7 @@ char *virDomainSnapshotDefFormat(const char *domain_uuid, virBufferAddLit(&buf, "</disks>\n"); } if (def->dom) { - if (virDomainDefFormatInternal(def->dom, flags, &buf) < 0) { + if (virDomainDefFormatInternal(def->dom, NULL, flags, &buf) < 0) { virBufferFreeAndReset(&buf); return NULL; }
Yeah, we'll need to pass caps in here too eventually. ACK regardless Regards, Daniel -- |: http://berrange.com -o- http://www.flickr.com/photos/dberrange/ :| |: http://libvirt.org -o- http://virt-manager.org :| |: http://autobuild.org -o- http://search.cpan.org/~danberr/ :| |: http://entangle-photo.org -o- http://live.gnome.org/gtk-vnc :|

On Wed, Feb 03, 2016 at 09:40:35PM +0000, Joao Martins wrote:
And use the newly added caps->host.netprefix (if it exists) for interface names that match the autogenerated target names.
Signed-off-by: Joao Martins <joao.m.martins@oracle.com> --- src/bhyve/bhyve_driver.c | 9 ++++++++- src/conf/domain_conf.c | 28 ++++++++++++++++++---------- src/conf/domain_conf.h | 3 +++ src/conf/snapshot_conf.c | 2 +- src/esx/esx_driver.c | 5 +++-- src/libxl/libxl_domain.c | 2 +- src/libxl/libxl_driver.c | 9 ++++++--- src/libxl/libxl_migration.c | 2 +- src/lxc/lxc_driver.c | 4 +++- src/lxc/lxc_process.c | 12 ++++++------ src/network/bridge_driver.c | 4 ++-- src/openvz/openvz_driver.c | 5 +++-- src/phyp/phyp_driver.c | 2 +- src/qemu/qemu_domain.c | 2 +- src/test/test_driver.c | 6 ++++-- src/uml/uml_driver.c | 2 +- src/vbox/vbox_common.c | 3 ++- src/vmware/vmware_driver.c | 5 +++-- src/vz/vz_driver.c | 3 ++- src/xen/xen_driver.c | 4 ++-- src/xenapi/xenapi_driver.c | 5 +++-- tests/lxcconf2xmltest.c | 2 +- tests/openvzutilstest.c | 2 +- tests/qemuargv2xmltest.c | 2 +- tests/qemuhotplugtest.c | 3 ++- tests/sexpr2xmltest.c | 2 +- tests/testutils.c | 2 +- tests/vmx2xmltest.c | 3 ++- tests/xlconfigtest.c | 2 +- tests/xmconfigtest.c | 2 +- 30 files changed, 85 insertions(+), 52 deletions(-)
ACK
diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h index 0141009..6ae2e1b 100644 --- a/src/conf/domain_conf.h +++ b/src/conf/domain_conf.h @@ -2733,11 +2733,13 @@ void virDomainIOThreadSchedDelId(virDomainDefPtr def, unsigned int iothread_id); unsigned int virDomainDefFormatConvertXMLFlags(unsigned int flags);
char *virDomainDefFormat(virDomainDefPtr def, + virCapsPtr caps, unsigned int flags); char *virDomainObjFormat(virDomainXMLOptionPtr xmlopt, virDomainObjPtr obj, unsigned int flags);
Surprised we don't have caps added to this one too, since it will call virDomainDefFormat. Ah sorry, this one slipped. It would need changing virDomainSaveStatus to include caps (and propagating that change to qemu, lxc, libxl and bhyve too) so
On 02/04/2016 11:14 AM, Daniel P. Berrange wrote: perhaps in a separate patch?
int virDomainDefFormatInternal(virDomainDefPtr def, + virCapsPtr caps, unsigned int flags, virBufferPtr buf);
@@ -2748,6 +2750,7 @@ int virDomainDiskSourceFormat(virBufferPtr buf,
int virDomainNetDefFormat(virBufferPtr buf, virDomainNetDefPtr def, + char *prefix, unsigned int flags);
typedef enum { diff --git a/src/conf/snapshot_conf.c b/src/conf/snapshot_conf.c index ea511ec..ffa1bf2 100644 --- a/src/conf/snapshot_conf.c +++ b/src/conf/snapshot_conf.c @@ -702,7 +702,7 @@ char *virDomainSnapshotDefFormat(const char *domain_uuid, virBufferAddLit(&buf, "</disks>\n"); } if (def->dom) { - if (virDomainDefFormatInternal(def->dom, flags, &buf) < 0) { + if (virDomainDefFormatInternal(def->dom, NULL, flags, &buf) < 0) { virBufferFreeAndReset(&buf); return NULL; }
Yeah, we'll need to pass caps in here too eventually.
I could also add it on this series for v3.
ACK regardless
Thanks!
Regards, Daniel

On Thu, Feb 04, 2016 at 12:57:30PM +0000, Joao Martins wrote:
diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h index 0141009..6ae2e1b 100644 --- a/src/conf/domain_conf.h +++ b/src/conf/domain_conf.h @@ -2733,11 +2733,13 @@ void virDomainIOThreadSchedDelId(virDomainDefPtr def, unsigned int iothread_id); unsigned int virDomainDefFormatConvertXMLFlags(unsigned int flags);
char *virDomainDefFormat(virDomainDefPtr def, + virCapsPtr caps, unsigned int flags); char *virDomainObjFormat(virDomainXMLOptionPtr xmlopt, virDomainObjPtr obj, unsigned int flags);
Surprised we don't have caps added to this one too, since it will call virDomainDefFormat. Ah sorry, this one slipped. It would need changing virDomainSaveStatus to include caps (and propagating that change to qemu, lxc, libxl and bhyve too) so
On 02/04/2016 11:14 AM, Daniel P. Berrange wrote: perhaps in a separate patch?
No prob, I just sent a followup to fix that ommission.
diff --git a/src/conf/snapshot_conf.c b/src/conf/snapshot_conf.c index ea511ec..ffa1bf2 100644 --- a/src/conf/snapshot_conf.c +++ b/src/conf/snapshot_conf.c @@ -702,7 +702,7 @@ char *virDomainSnapshotDefFormat(const char *domain_uuid, virBufferAddLit(&buf, "</disks>\n"); } if (def->dom) { - if (virDomainDefFormatInternal(def->dom, flags, &buf) < 0) { + if (virDomainDefFormatInternal(def->dom, NULL, flags, &buf) < 0) { virBufferFreeAndReset(&buf); return NULL; }
Yeah, we'll need to pass caps in here too eventually. I could also add it on this series for v3.
If you can coook up a patch for this one too, that'd be great Regards, Daniel -- |: http://berrange.com -o- http://www.flickr.com/photos/dberrange/ :| |: http://libvirt.org -o- http://virt-manager.org :| |: http://autobuild.org -o- http://search.cpan.org/~danberr/ :| |: http://entangle-photo.org -o- http://live.gnome.org/gtk-vnc :|

virDomainSaveConfig calls virDomainDefFormat which was setting the caps to NULL, thus keeping the old behaviour (i.e. not looking at netprefix). This patch adds the virCapsPtr to the function and allows the configuration to be saved and skipping interface names that were registered with virCapabilitiesSetNetPrefix(). Signed-off-by: Joao Martins <joao.m.martins@oracle.com> --- src/bhyve/bhyve_driver.c | 2 +- src/conf/domain_conf.c | 5 +++-- src/conf/domain_conf.h | 1 + src/libxl/libxl_driver.c | 15 ++++++++------- src/lxc/lxc_driver.c | 20 +++++++++++--------- src/qemu/qemu_blockjob.c | 1 + src/qemu/qemu_driver.c | 47 ++++++++++++++++++++++++++--------------------- src/qemu/qemu_migration.c | 3 ++- src/qemu/qemu_process.c | 5 +++-- src/uml/uml_driver.c | 2 +- 10 files changed, 57 insertions(+), 44 deletions(-) diff --git a/src/bhyve/bhyve_driver.c b/src/bhyve/bhyve_driver.c index c23c310..337a29e 100644 --- a/src/bhyve/bhyve_driver.c +++ b/src/bhyve/bhyve_driver.c @@ -551,7 +551,7 @@ bhyveDomainDefineXMLFlags(virConnectPtr conn, const char *xml, unsigned int flag def = NULL; vm->persistent = 1; - if (virDomainSaveConfig(BHYVE_CONFIG_DIR, + if (virDomainSaveConfig(BHYVE_CONFIG_DIR, caps, vm->newDef ? vm->newDef : vm->def) < 0) { virDomainObjListRemove(privconn->domains, vm); vm = NULL; diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index 4ecf700..6b70543 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -22694,12 +22694,13 @@ virDomainSaveXML(const char *configDir, int virDomainSaveConfig(const char *configDir, + virCapsPtr caps, virDomainDefPtr def) { int ret = -1; char *xml; - if (!(xml = virDomainDefFormat(def, NULL, VIR_DOMAIN_DEF_FORMAT_SECURE))) + if (!(xml = virDomainDefFormat(def, caps, VIR_DOMAIN_DEF_FORMAT_SECURE))) goto cleanup; if (virDomainSaveXML(configDir, def, xml)) @@ -23883,7 +23884,7 @@ virDomainObjSetMetadata(virDomainObjPtr vm, uri) < 0) return -1; - if (virDomainSaveConfig(configDir, persistentDef) < 0) + if (virDomainSaveConfig(configDir, caps, persistentDef) < 0) return -1; } diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h index 6ae2e1b..a8d0225 100644 --- a/src/conf/domain_conf.h +++ b/src/conf/domain_conf.h @@ -2907,6 +2907,7 @@ int virDomainSaveXML(const char *configDir, const char *xml); int virDomainSaveConfig(const char *configDir, + virCapsPtr caps, virDomainDefPtr def); int virDomainSaveStatus(virDomainXMLOptionPtr xmlopt, const char *statusDir, diff --git a/src/libxl/libxl_driver.c b/src/libxl/libxl_driver.c index dfaf3a0..d2114ca 100644 --- a/src/libxl/libxl_driver.c +++ b/src/libxl/libxl_driver.c @@ -1511,7 +1511,7 @@ libxlDomainSetMemoryFlags(virDomainPtr dom, unsigned long newmem, virDomainDefSetMemoryTotal(persistentDef, newmem); if (persistentDef->mem.cur_balloon > newmem) persistentDef->mem.cur_balloon = newmem; - ret = virDomainSaveConfig(cfg->configDir, persistentDef); + ret = virDomainSaveConfig(cfg->configDir, cfg->caps, persistentDef); goto endjob; } @@ -1543,7 +1543,7 @@ libxlDomainSetMemoryFlags(virDomainPtr dom, unsigned long newmem, if (flags & VIR_DOMAIN_MEM_CONFIG) { sa_assert(persistentDef); persistentDef->mem.cur_balloon = newmem; - ret = virDomainSaveConfig(cfg->configDir, persistentDef); + ret = virDomainSaveConfig(cfg->configDir, cfg->caps, persistentDef); goto endjob; } } @@ -2237,7 +2237,7 @@ libxlDomainSetVcpusFlags(virDomainPtr dom, unsigned int nvcpus, } } if (flags & VIR_DOMAIN_VCPU_CONFIG) { - if (virDomainSaveConfig(cfg->configDir, def) < 0) { + if (virDomainSaveConfig(cfg->configDir, cfg->caps, def) < 0) { VIR_WARN("Unable to save configuration of vm %s after changing vcpus", vm->def->name); } @@ -2394,7 +2394,7 @@ libxlDomainPinVcpuFlags(virDomainPtr dom, unsigned int vcpu, if (flags & VIR_DOMAIN_AFFECT_LIVE) { ret = virDomainSaveStatus(driver->xmlopt, cfg->stateDir, vm); } else if (flags & VIR_DOMAIN_AFFECT_CONFIG) { - ret = virDomainSaveConfig(cfg->configDir, targetDef); + ret = virDomainSaveConfig(cfg->configDir, cfg->caps, targetDef); } endjob: @@ -2805,6 +2805,7 @@ libxlDomainDefineXMLFlags(virConnectPtr conn, const char *xml, unsigned int flag vm->persistent = 1; if (virDomainSaveConfig(cfg->configDir, + cfg->caps, vm->newDef ? vm->newDef : vm->def) < 0) { virDomainObjListRemove(driver->domains, vm); vm = NULL; @@ -3749,7 +3750,7 @@ libxlDomainAttachDeviceFlags(virDomainPtr dom, const char *xml, /* Finally, if no error until here, we can save config. */ if (flags & VIR_DOMAIN_DEVICE_MODIFY_CONFIG) { - ret = virDomainSaveConfig(cfg->configDir, vmdef); + ret = virDomainSaveConfig(cfg->configDir, cfg->caps, vmdef); if (!ret) { virDomainObjAssignDef(vm, vmdef, false, NULL); vmdef = NULL; @@ -3857,7 +3858,7 @@ libxlDomainDetachDeviceFlags(virDomainPtr dom, const char *xml, /* Finally, if no error until here, we can save config. */ if (flags & VIR_DOMAIN_DEVICE_MODIFY_CONFIG) { - ret = virDomainSaveConfig(cfg->configDir, vmdef); + ret = virDomainSaveConfig(cfg->configDir, cfg->caps, vmdef); if (!ret) { virDomainObjAssignDef(vm, vmdef, false, NULL); vmdef = NULL; @@ -3962,7 +3963,7 @@ libxlDomainUpdateDeviceFlags(virDomainPtr dom, const char *xml, /* Finally, if no error until here, we can save config. */ if (!ret && (flags & VIR_DOMAIN_DEVICE_MODIFY_CONFIG)) { - ret = virDomainSaveConfig(cfg->configDir, vmdef); + ret = virDomainSaveConfig(cfg->configDir, cfg->caps, vmdef); if (!ret) { virDomainObjAssignDef(vm, vmdef, false, NULL); vmdef = NULL; diff --git a/src/lxc/lxc_driver.c b/src/lxc/lxc_driver.c index 7be92c7..58c9bb4 100644 --- a/src/lxc/lxc_driver.c +++ b/src/lxc/lxc_driver.c @@ -488,7 +488,7 @@ lxcDomainDefineXMLFlags(virConnectPtr conn, const char *xml, unsigned int flags) def = NULL; vm->persistent = 1; - if (virDomainSaveConfig(cfg->configDir, + if (virDomainSaveConfig(cfg->configDir, driver->caps, vm->newDef ? vm->newDef : vm->def) < 0) { virDomainObjListRemove(driver->domains, vm); vm = NULL; @@ -737,7 +737,8 @@ static int lxcDomainSetMemoryFlags(virDomainPtr dom, unsigned long newmem, virDomainDefSetMemoryTotal(persistentDef, newmem); if (persistentDef->mem.cur_balloon > newmem) persistentDef->mem.cur_balloon = newmem; - if (virDomainSaveConfig(cfg->configDir, persistentDef) < 0) + if (virDomainSaveConfig(cfg->configDir, driver->caps, + persistentDef) < 0) goto cleanup; } } else { @@ -770,7 +771,8 @@ static int lxcDomainSetMemoryFlags(virDomainPtr dom, unsigned long newmem, if (flags & VIR_DOMAIN_AFFECT_CONFIG) { persistentDef->mem.cur_balloon = newmem; - if (virDomainSaveConfig(cfg->configDir, persistentDef) < 0) + if (virDomainSaveConfig(cfg->configDir, driver->caps, + persistentDef) < 0) goto cleanup; } } @@ -915,7 +917,7 @@ lxcDomainSetMemoryParameters(virDomainPtr dom, #undef LXC_SET_MEM_PARAMETER if (flags & VIR_DOMAIN_AFFECT_CONFIG && - virDomainSaveConfig(cfg->configDir, vmdef) < 0) + virDomainSaveConfig(cfg->configDir, driver->caps, vmdef) < 0) goto cleanup; ret = 0; @@ -2025,7 +2027,7 @@ lxcDomainSetSchedulerParametersFlags(virDomainPtr dom, if (flags & VIR_DOMAIN_AFFECT_CONFIG) { - rc = virDomainSaveConfig(cfg->configDir, vmdef); + rc = virDomainSaveConfig(cfg->configDir, driver->caps, vmdef); if (rc < 0) goto cleanup; @@ -2727,7 +2729,7 @@ lxcDomainSetBlkioParameters(virDomainPtr dom, } } - if (virDomainSaveConfig(cfg->configDir, persistentDef) < 0) + if (virDomainSaveConfig(cfg->configDir, driver->caps, persistentDef) < 0) ret = -1; } @@ -5081,7 +5083,7 @@ static int lxcDomainAttachDeviceFlags(virDomainPtr dom, /* Finally, if no error until here, we can save config. */ if (flags & VIR_DOMAIN_AFFECT_CONFIG) { - ret = virDomainSaveConfig(cfg->configDir, vmdef); + ret = virDomainSaveConfig(cfg->configDir, driver->caps, vmdef); if (!ret) { virDomainObjAssignDef(vm, vmdef, false, NULL); vmdef = NULL; @@ -5203,7 +5205,7 @@ static int lxcDomainUpdateDeviceFlags(virDomainPtr dom, /* Finally, if no error until here, we can save config. */ if (flags & VIR_DOMAIN_AFFECT_CONFIG) { - ret = virDomainSaveConfig(cfg->configDir, vmdef); + ret = virDomainSaveConfig(cfg->configDir, driver->caps, vmdef); if (!ret) { virDomainObjAssignDef(vm, vmdef, false, NULL); vmdef = NULL; @@ -5323,7 +5325,7 @@ static int lxcDomainDetachDeviceFlags(virDomainPtr dom, /* Finally, if no error until here, we can save config. */ if (flags & VIR_DOMAIN_AFFECT_CONFIG) { - ret = virDomainSaveConfig(cfg->configDir, vmdef); + ret = virDomainSaveConfig(cfg->configDir, driver->caps, vmdef); if (!ret) { virDomainObjAssignDef(vm, vmdef, false, NULL); vmdef = NULL; diff --git a/src/qemu/qemu_blockjob.c b/src/qemu/qemu_blockjob.c index 1d5b7ce..f14e70b 100644 --- a/src/qemu/qemu_blockjob.c +++ b/src/qemu/qemu_blockjob.c @@ -189,6 +189,7 @@ qemuBlockJobEventProcess(virQEMUDriverPtr driver, VIR_WARN("Unable to save status on vm %s after block job", vm->def->name); if (persistDisk && virDomainSaveConfig(cfg->configDir, + driver->caps, vm->newDef) < 0) VIR_WARN("Unable to update persistent definition on vm %s " "after block job", vm->def->name); diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index 37e348e..26f2584 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -2429,7 +2429,8 @@ static int qemuDomainSetMemoryFlags(virDomainPtr dom, unsigned long newmem, if (persistentDef->mem.cur_balloon > newmem) persistentDef->mem.cur_balloon = newmem; - ret = virDomainSaveConfig(cfg->configDir, persistentDef); + ret = virDomainSaveConfig(cfg->configDir, driver->caps, + persistentDef); goto endjob; } @@ -2468,7 +2469,8 @@ static int qemuDomainSetMemoryFlags(virDomainPtr dom, unsigned long newmem, if (persistentDef) { persistentDef->mem.cur_balloon = newmem; - ret = virDomainSaveConfig(cfg->configDir, persistentDef); + ret = virDomainSaveConfig(cfg->configDir, driver->caps, + persistentDef); goto endjob; } } @@ -2557,7 +2559,7 @@ static int qemuDomainSetMemoryStatsPeriod(virDomainPtr dom, int period, goto endjob; } persistentDef->memballoon->period = period; - ret = virDomainSaveConfig(cfg->configDir, persistentDef); + ret = virDomainSaveConfig(cfg->configDir, driver->caps, persistentDef); goto endjob; } @@ -5080,7 +5082,8 @@ qemuDomainSetVcpusFlags(virDomainPtr dom, unsigned int nvcpus, goto endjob; } - if (virDomainSaveConfig(cfg->configDir, persistentDef) < 0) + if (virDomainSaveConfig(cfg->configDir, driver->caps, + persistentDef) < 0) goto endjob; } @@ -5270,7 +5273,7 @@ qemuDomainPinVcpuFlags(virDomainPtr dom, goto endjob; } - ret = virDomainSaveConfig(cfg->configDir, persistentDef); + ret = virDomainSaveConfig(cfg->configDir, driver->caps, persistentDef); goto endjob; } @@ -5474,7 +5477,7 @@ qemuDomainPinEmulator(virDomainPtr dom, if (!(persistentDef->cputune.emulatorpin = virBitmapNewCopy(pcpumap))) goto endjob; - ret = virDomainSaveConfig(cfg->configDir, persistentDef); + ret = virDomainSaveConfig(cfg->configDir, driver->caps, persistentDef); goto endjob; } @@ -5974,7 +5977,7 @@ qemuDomainPinIOThread(virDomainPtr dom, iothrid->cpumask = cpumask; iothrid->autofill = false; - ret = virDomainSaveConfig(cfg->configDir, persistentDef); + ret = virDomainSaveConfig(cfg->configDir, driver->caps, persistentDef); goto endjob; } @@ -6277,7 +6280,8 @@ qemuDomainChgIOThread(virQEMUDriverPtr driver, persistentDef->iothreads--; } - if (virDomainSaveConfig(cfg->configDir, persistentDef) < 0) + if (virDomainSaveConfig(cfg->configDir, driver->caps, + persistentDef) < 0) goto endjob; } @@ -7601,7 +7605,7 @@ static virDomainPtr qemuDomainDefineXMLFlags(virConnectPtr conn, const char *xml } vm->persistent = 1; - if (virDomainSaveConfig(cfg->configDir, + if (virDomainSaveConfig(cfg->configDir, driver->caps, vm->newDef ? vm->newDef : vm->def) < 0) { if (oldDef) { /* There is backup so this VM was defined before. @@ -8591,7 +8595,7 @@ static int qemuDomainAttachDeviceFlags(virDomainPtr dom, const char *xml, /* Finally, if no error until here, we can save config. */ if (flags & VIR_DOMAIN_AFFECT_CONFIG) { - ret = virDomainSaveConfig(cfg->configDir, vmdef); + ret = virDomainSaveConfig(cfg->configDir, driver->caps, vmdef); if (!ret) { virDomainObjAssignDef(vm, vmdef, false, NULL); vmdef = NULL; @@ -8717,7 +8721,7 @@ static int qemuDomainUpdateDeviceFlags(virDomainPtr dom, /* Finally, if no error until here, we can save config. */ if (flags & VIR_DOMAIN_AFFECT_CONFIG) { - ret = virDomainSaveConfig(cfg->configDir, vmdef); + ret = virDomainSaveConfig(cfg->configDir, driver->caps, vmdef); if (!ret) { virDomainObjAssignDef(vm, vmdef, false, NULL); vmdef = NULL; @@ -8837,7 +8841,7 @@ static int qemuDomainDetachDeviceFlags(virDomainPtr dom, const char *xml, /* Finally, if no error until here, we can save config. */ if (flags & VIR_DOMAIN_AFFECT_CONFIG) { - ret = virDomainSaveConfig(cfg->configDir, vmdef); + ret = virDomainSaveConfig(cfg->configDir, driver->caps, vmdef); if (!ret) { virDomainObjAssignDef(vm, vmdef, false, NULL); vmdef = NULL; @@ -9395,7 +9399,7 @@ qemuDomainSetBlkioParameters(virDomainPtr dom, } } - if (virDomainSaveConfig(cfg->configDir, persistentDef) < 0) + if (virDomainSaveConfig(cfg->configDir, driver->caps, persistentDef) < 0) ret = -1; } @@ -9952,7 +9956,7 @@ qemuDomainSetMemoryParameters(virDomainPtr dom, goto endjob; if (flags & VIR_DOMAIN_AFFECT_CONFIG && - virDomainSaveConfig(cfg->configDir, persistentDef) < 0) + virDomainSaveConfig(cfg->configDir, driver->caps, persistentDef) < 0) goto endjob; ret = 0; @@ -10228,7 +10232,7 @@ qemuDomainSetNumaParameters(virDomainPtr dom, -1, mode, nodeset) < 0) goto endjob; - if (virDomainSaveConfig(cfg->configDir, persistentDef) < 0) + if (virDomainSaveConfig(cfg->configDir, driver->caps, persistentDef) < 0) goto endjob; } @@ -10590,7 +10594,7 @@ qemuDomainSetSchedulerParametersFlags(virDomainPtr dom, } if (flags & VIR_DOMAIN_AFFECT_CONFIG) { - rc = virDomainSaveConfig(cfg->configDir, vmdef); + rc = virDomainSaveConfig(cfg->configDir, driver->caps, vmdef); if (rc < 0) goto endjob; @@ -11387,7 +11391,7 @@ qemuDomainSetInterfaceParameters(virDomainPtr dom, } } - if (virDomainSaveConfig(cfg->configDir, persistentDef) < 0) + if (virDomainSaveConfig(cfg->configDir, driver->caps, persistentDef) < 0) goto endjob; } @@ -13715,7 +13719,7 @@ qemuDomainSnapshotCreateInactiveExternal(virQEMUDriverPtr driver, } defdisk->src->format = snapdisk->src->format; - if (virDomainSaveConfig(cfg->configDir, vm->def) < 0) + if (virDomainSaveConfig(cfg->configDir, driver->caps, vm->def) < 0) goto cleanup; } } @@ -14495,7 +14499,8 @@ qemuDomainSnapshotCreateDiskActive(virQEMUDriverPtr driver, if (ret == 0 || !virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_TRANSACTION)) { if (virDomainSaveStatus(driver->xmlopt, cfg->stateDir, vm) < 0 || - (persist && virDomainSaveConfig(cfg->configDir, vm->newDef) < 0)) + (persist && virDomainSaveConfig(cfg->configDir, driver->caps, + vm->newDef) < 0)) ret = -1; } virObjectUnref(cfg); @@ -17788,7 +17793,7 @@ qemuDomainSetBlockIoTune(virDomainPtr dom, info.write_iops_sec = oldinfo->write_iops_sec; } conf_disk->blkdeviotune = info; - ret = virDomainSaveConfig(cfg->configDir, persistentDef); + ret = virDomainSaveConfig(cfg->configDir, driver->caps, persistentDef); if (ret < 0) { virReportError(VIR_ERR_OPERATION_INVALID, "%s", _("Write to config file failed")); @@ -20069,7 +20074,7 @@ static int qemuDomainRename(virDomainPtr dom, vm->def->name = new_dom_name; new_dom_name = NULL; - if (virDomainSaveConfig(cfg->configDir, vm->def) < 0) + if (virDomainSaveConfig(cfg->configDir, driver->caps, vm->def) < 0) goto rollback; if (virFileExists(old_dom_cfg_file) && diff --git a/src/qemu/qemu_migration.c b/src/qemu/qemu_migration.c index 51e7125..2f5b368 100644 --- a/src/qemu/qemu_migration.c +++ b/src/qemu/qemu_migration.c @@ -5747,7 +5747,8 @@ qemuMigrationPersist(virQEMUDriverPtr driver, if (!(vmdef = virDomainObjGetPersistentDef(caps, driver->xmlopt, vm))) goto error; - if (virDomainSaveConfig(cfg->configDir, vmdef) < 0 && !ignoreSaveError) + if (virDomainSaveConfig(cfg->configDir, driver->caps, vmdef) < 0 && + !ignoreSaveError) goto error; event = virDomainEventLifecycleNewFromObj(vm, diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c index ee94d3f..0b34375 100644 --- a/src/qemu/qemu_process.c +++ b/src/qemu/qemu_process.c @@ -3996,6 +3996,7 @@ qemuProcessVerifyGuestCPU(virQEMUDriverPtr driver, static int qemuPrepareNVRAM(virQEMUDriverConfigPtr cfg, + virCapsPtr caps, virDomainObjPtr vm, bool migrated) { @@ -4035,7 +4036,7 @@ qemuPrepareNVRAM(virQEMUDriverConfigPtr cfg, generated = true; if (vm->persistent && - virDomainSaveConfig(cfg->configDir, vm->def) < 0) + virDomainSaveConfig(cfg->configDir, caps, vm->def) < 0) goto cleanup; } @@ -4509,7 +4510,7 @@ qemuProcessInit(virQEMUDriverPtr driver, * Fill them in prior to setting the domain def as transient. */ VIR_DEBUG("Generating paths"); - if (qemuPrepareNVRAM(cfg, vm, migration) < 0) + if (qemuPrepareNVRAM(cfg, caps, vm, migration) < 0) goto stop; /* Do this upfront, so any part of the startup process can add diff --git a/src/uml/uml_driver.c b/src/uml/uml_driver.c index 4469426..3cfa36f 100644 --- a/src/uml/uml_driver.c +++ b/src/uml/uml_driver.c @@ -2103,7 +2103,7 @@ umlDomainDefineXMLFlags(virConnectPtr conn, const char *xml, unsigned int flags) def = NULL; vm->persistent = 1; - if (virDomainSaveConfig(driver->configDir, + if (virDomainSaveConfig(driver->configDir, driver->caps, vm->newDef ? vm->newDef : vm->def) < 0) { virDomainObjListRemove(driver->domains, vm); -- 2.1.4

On Wed, Feb 03, 2016 at 09:40:36PM +0000, Joao Martins wrote:
virDomainSaveConfig calls virDomainDefFormat which was setting the caps to NULL, thus keeping the old behaviour (i.e. not looking at netprefix). This patch adds the virCapsPtr to the function and allows the configuration to be saved and skipping interface names that were registered with virCapabilitiesSetNetPrefix().
Signed-off-by: Joao Martins <joao.m.martins@oracle.com> --- src/bhyve/bhyve_driver.c | 2 +- src/conf/domain_conf.c | 5 +++-- src/conf/domain_conf.h | 1 + src/libxl/libxl_driver.c | 15 ++++++++------- src/lxc/lxc_driver.c | 20 +++++++++++--------- src/qemu/qemu_blockjob.c | 1 + src/qemu/qemu_driver.c | 47 ++++++++++++++++++++++++++--------------------- src/qemu/qemu_migration.c | 3 ++- src/qemu/qemu_process.c | 5 +++-- src/uml/uml_driver.c | 2 +- 10 files changed, 57 insertions(+), 44 deletions(-)
ACK Regards, Daniel -- |: http://berrange.com -o- http://www.flickr.com/photos/dberrange/ :| |: http://libvirt.org -o- http://virt-manager.org :| |: http://autobuild.org -o- http://search.cpan.org/~danberr/ :| |: http://entangle-photo.org -o- http://live.gnome.org/gtk-vnc :|

Use the newly added virCapabilitiesSetNetPrefix to set the network prefix for the driver. This in return will be use by NetDefFormat() and NetDefParseXML() routines to free any interface name that start with the registered prefix. Acked-by: Daniel P. Berrange <berrange@redhat.com> Signed-off-by: Joao Martins <joao.m.martins@oracle.com> --- src/libxl/libxl_conf.c | 3 +++ src/libxl/libxl_conf.h | 4 ++++ 2 files changed, 7 insertions(+) diff --git a/src/libxl/libxl_conf.c b/src/libxl/libxl_conf.c index 6320421..d7fb533 100644 --- a/src/libxl/libxl_conf.c +++ b/src/libxl/libxl_conf.c @@ -183,6 +183,9 @@ libxlCapsInitHost(libxl_ctx *ctx, virCapsPtr caps) virCapabilitiesAddHostFeature(caps, "pae") < 0) return -1; + if (virCapabilitiesSetNetPrefix(caps, LIBXL_GENERATED_PREFIX_XEN) < 0) + return -1; + return 0; } diff --git a/src/libxl/libxl_conf.h b/src/libxl/libxl_conf.h index 7c68b2b..6ad9ad3 100644 --- a/src/libxl/libxl_conf.h +++ b/src/libxl/libxl_conf.h @@ -47,6 +47,10 @@ # define LIBXL_MIGRATION_PORT_MIN 49152 # define LIBXL_MIGRATION_PORT_MAX 49216 +/* Used for prefix of ifname of any network name generated dynamically + * by libvirt for Xen, and cannot be used for a persistent network name. */ +# define LIBXL_GENERATED_PREFIX_XEN "vif" + # define LIBXL_CONFIG_BASE_DIR SYSCONFDIR "/libvirt" # define LIBXL_CONFIG_DIR SYSCONFDIR "/libvirt/libxl" # define LIBXL_AUTOSTART_DIR LIBXL_CONFIG_DIR "/autostart" -- 2.1.4

On Wed, Feb 03, 2016 at 09:40:37PM +0000, Joao Martins wrote:
Use the newly added virCapabilitiesSetNetPrefix to set the network prefix for the driver. This in return will be use by NetDefFormat() and NetDefParseXML() routines to free any interface name that start with the registered prefix.
Acked-by: Daniel P. Berrange <berrange@redhat.com> Signed-off-by: Joao Martins <joao.m.martins@oracle.com> --- src/libxl/libxl_conf.c | 3 +++ src/libxl/libxl_conf.h | 4 ++++ 2 files changed, 7 insertions(+)
ACK Regards, Daniel -- |: http://berrange.com -o- http://www.flickr.com/photos/dberrange/ :| |: http://libvirt.org -o- http://virt-manager.org :| |: http://autobuild.org -o- http://search.cpan.org/~danberr/ :| |: http://entangle-photo.org -o- http://live.gnome.org/gtk-vnc :|

On Wed, Feb 03, 2016 at 09:40:32PM +0000, Joao Martins wrote:
Hey,
Back in the pre 1.3.0 release [0] we had a regression when migrating domains in libxl (introduced by the reverted commit d2e5538b1).
The chosen solution to address this problem was to introduce a capability to be used by the virDomainNetDefFormat() and virDomainNetDefParseXML() routines. RFCv1 implemented this by "caching" netprefix in the domain definition[1]; as suggested in the review[1] v2 implements it by adding the virCapsPtr to the relevant APIs and also propagating the API change to all drivers. It is divided as follows:
Patch 1: Adds prefix to capabilites Patch 2: Add prefix to NetDefParseXML Patch 3,4: API changes to include virCapsPtr and netprefix (New) Patch 5: set prefix on libxl (Acked)
Having this series and the reverted commit applied, I can successfully migrate a domain without seeing the same interface name on both source and destination node with libxl.
Note: I haven't been able to compile-test all drivers, specifically bhyve, vz and hyperv. Testing was made with libxl.
I fixed smalls in the vs & hyperv drivers and pushed this series. I'll send a followup for the virDomainObjFormat / virDomainSaveStatus additions. Regards, Daniel -- |: http://berrange.com -o- http://www.flickr.com/photos/dberrange/ :| |: http://libvirt.org -o- http://virt-manager.org :| |: http://autobuild.org -o- http://search.cpan.org/~danberr/ :| |: http://entangle-photo.org -o- http://live.gnome.org/gtk-vnc :|
participants (2)
-
Daniel P. Berrange
-
Joao Martins