diff --git a/src/esx/esx_driver.c b/src/esx/esx_driver.c index c304ff355b..5944947d93 100644 --- a/src/esx/esx_driver.c +++ b/src/esx/esx_driver.c @@ -2741,6 +2741,7 @@ esxDomainGetXMLDesc(virDomainPtr domain, unsigned int flags) ctx.parseFileName = esxParseVMXFileName; ctx.formatFileName = NULL; ctx.autodetectSCSIControllerModel = NULL; + ctx.datacenterPath = priv->primary->datacenterPath; def = virVMXParseConfig(&ctx, priv->xmlopt, vmx); @@ -2799,6 +2800,7 @@ esxConnectDomainXMLFromNative(virConnectPtr conn, const char *nativeFormat, ctx.parseFileName = esxParseVMXFileName; ctx.formatFileName = NULL; ctx.autodetectSCSIControllerModel = NULL; + ctx.datacenterPath = NULL; def = virVMXParseConfig(&ctx, priv->xmlopt, nativeConfig); @@ -2853,6 +2855,7 @@ esxConnectDomainXMLToNative(virConnectPtr conn, const char *nativeFormat, ctx.parseFileName = NULL; ctx.formatFileName = esxFormatVMXFileName; ctx.autodetectSCSIControllerModel = esxAutodetectSCSIControllerModel; + ctx.datacenterPath = NULL; vmx = virVMXFormatConfig(&ctx, priv->xmlopt, def, virtualHW_version); @@ -3096,6 +3099,7 @@ esxDomainDefineXMLFlags(virConnectPtr conn, const char *xml, unsigned int flags) ctx.parseFileName = NULL; ctx.formatFileName = esxFormatVMXFileName; ctx.autodetectSCSIControllerModel = esxAutodetectSCSIControllerModel; + ctx.datacenterPath = NULL; vmx = virVMXFormatConfig(&ctx, priv->xmlopt, def, virtualHW_version); diff --git a/src/vmware/vmware_conf.c b/src/vmware/vmware_conf.c index 21cf333a4f..f3cbbf5554 100644 --- a/src/vmware/vmware_conf.c +++ b/src/vmware/vmware_conf.c @@ -145,6 +145,9 @@ vmwareLoadDomains(struct vmware_driver *driver) virCommandPtr cmd; ctx.parseFileName = vmwareCopyVMXFileName; + ctx.formatFileName = NULL; + ctx.autodetectSCSIControllerModel = NULL; + ctx.datacenterPath = NULL; cmd = virCommandNewArgList(driver->vmrun, "-T", vmwareDriverTypeToString(driver->type), diff --git a/src/vmware/vmware_driver.c b/src/vmware/vmware_driver.c index ec74fe3831..e228aaa584 100644 --- a/src/vmware/vmware_driver.c +++ b/src/vmware/vmware_driver.c @@ -381,7 +381,10 @@ vmwareDomainDefineXMLFlags(virConnectPtr conn, const char *xml, unsigned int fla if (flags & VIR_DOMAIN_DEFINE_VALIDATE) parse_flags |= VIR_DOMAIN_DEF_PARSE_VALIDATE; + ctx.parseFileName = NULL; ctx.formatFileName = vmwareCopyVMXFileName; + ctx.autodetectSCSIControllerModel = NULL; + ctx.datacenterPath = NULL; vmwareDriverLock(driver); if ((vmdef = virDomainDefParseString(xml, driver->caps, driver->xmlopt, @@ -671,7 +674,10 @@ vmwareDomainCreateXML(virConnectPtr conn, const char *xml, if (flags & VIR_DOMAIN_START_VALIDATE) parse_flags |= VIR_DOMAIN_DEF_PARSE_VALIDATE; + ctx.parseFileName = NULL; ctx.formatFileName = vmwareCopyVMXFileName; + ctx.autodetectSCSIControllerModel = NULL; + ctx.datacenterPath = NULL; vmwareDriverLock(driver); @@ -1022,6 +1028,9 @@ vmwareConnectDomainXMLFromNative(virConnectPtr conn, const char *nativeFormat, } ctx.parseFileName = vmwareCopyVMXFileName; + ctx.formatFileName = NULL; + ctx.autodetectSCSIControllerModel = NULL; + ctx.datacenterPath = NULL; def = virVMXParseConfig(&ctx, driver->xmlopt, nativeConfig); diff --git a/src/vmx/vmx.c b/src/vmx/vmx.c index 70cda2aa3c..c6d97f840a 100644 --- a/src/vmx/vmx.c +++ b/src/vmx/vmx.c @@ -523,10 +523,11 @@ VIR_ENUM_IMPL(virVMXControllerModelSCSI, VIR_DOMAIN_CONTROLLER_MODEL_SCSI_LAST, /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Helpers */ + static int -vmxDomainDefPostParse(virDomainDefPtr def, - virCapsPtr caps ATTRIBUTE_UNUSED, - void *opaque ATTRIBUTE_UNUSED) +virVMXDomainDefPostParse(virDomainDefPtr def, + virCapsPtr caps ATTRIBUTE_UNUSED, + void *opaque ATTRIBUTE_UNUSED) { /* memory hotplug tunables are not supported by this driver */ if (virDomainDefCheckUnsupportedMemoryHotplug(def) < 0) @@ -536,27 +537,60 @@ vmxDomainDefPostParse(virDomainDefPtr def, } static int -vmxDomainDeviceDefPostParse(virDomainDeviceDefPtr dev ATTRIBUTE_UNUSED, - const virDomainDef *def ATTRIBUTE_UNUSED, - virCapsPtr caps ATTRIBUTE_UNUSED, - void *opaque ATTRIBUTE_UNUSED) +virVMXDomainDevicesDefPostParse(virDomainDeviceDefPtr dev ATTRIBUTE_UNUSED, + const virDomainDef *def ATTRIBUTE_UNUSED, + virCapsPtr caps ATTRIBUTE_UNUSED, + void *opaque ATTRIBUTE_UNUSED) { return 0; } -virDomainDefParserConfig virVMXDomainDefParserConfig = { +static virDomainDefParserConfig virVMXDomainDefParserConfig = { .hasWideSCSIBus = true, .macPrefix = {0x00, 0x0c, 0x29}, - .devicesPostParseCallback = vmxDomainDeviceDefPostParse, - .domainPostParseCallback = vmxDomainDefPostParse, + .devicesPostParseCallback = virVMXDomainDevicesDefPostParse, + .domainPostParseCallback = virVMXDomainDefPostParse, }; +static void +virVMXDomainDefNamespaceFree(void *nsdata) +{ + VIR_FREE(nsdata); +} + +static int +virVMXDomainDefNamespaceFormatXML(virBufferPtr buf, void *nsdata) +{ + const char *datacenterPath = nsdata; + + if (!datacenterPath) + return 0; + + virBufferAddLit(buf, ""); + virBufferEscapeString(buf, "%s", datacenterPath); + virBufferAddLit(buf, "\n"); + + return 0; +} + +static const char * +virVMXDomainDefNamespaceHref(void) +{ + return "xmlns:vmware='http://libvirt.org/schemas/domain/vmware/1.0'"; +} + +static virDomainXMLNamespace virVMXDomainXMLNamespace = { + .parse = NULL, + .free = virVMXDomainDefNamespaceFree, + .format = virVMXDomainDefNamespaceFormatXML, + .href = virVMXDomainDefNamespaceHref, +}; virDomainXMLOptionPtr virVMXDomainXMLConfInit(void) { - return virDomainXMLOptionNew(&virVMXDomainDefParserConfig, - NULL, NULL); + return virDomainXMLOptionNew(&virVMXDomainDefParserConfig, NULL, + &virVMXDomainXMLNamespace); } char * @@ -1268,6 +1302,7 @@ virVMXParseConfig(virVMXContext *ctx, bool hgfs_disabled = true; long long sharedFolder_maxNum = 0; int cpumasklen; + char *namespaceData; if (ctx->parseFileName == NULL) { virReportError(VIR_ERR_INTERNAL_ERROR, "%s", @@ -1767,6 +1802,15 @@ virVMXParseConfig(virVMXContext *ctx, ++def->nparallels; } + /* ctx:datacenterPath -> def:namespaceData */ + if (ctx->datacenterPath) { + if (VIR_STRDUP(namespaceData, ctx->datacenterPath) < 0) + goto cleanup; + + def->ns = *virDomainXMLOptionGetNamespace(xmlopt); + def->namespaceData = namespaceData; + } + success = true; cleanup: diff --git a/src/vmx/vmx.h b/src/vmx/vmx.h index e98612498c..90bd7479ed 100644 --- a/src/vmx/vmx.h +++ b/src/vmx/vmx.h @@ -1,7 +1,7 @@ /* * vmx.h: VMware VMX parsing/formatting functions * - * Copyright (C) 2009-2010 Matthias Bolte + * Copyright (C) 2009-2011, 2015 Matthias Bolte * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -41,15 +41,17 @@ typedef int (*virVMXAutodetectSCSIControllerModel)(virDomainDiskDefPtr def, int *model, void *opaque); /* - * virVMXParseFileName is only used by virVMXParseConfig. - * virVMXFormatFileName is only used by virVMXFormatConfig. - * virVMXAutodetectSCSIControllerModel is optionally used by virVMXFormatConfig. + * parseFileName is only used by virVMXParseConfig. + * formatFileName is only used by virVMXFormatConfig. + * autodetectSCSIControllerModel is optionally used by virVMXFormatConfig. + * datacenterPath is only used by virVMXFormatConfig. */ struct _virVMXContext { void *opaque; virVMXParseFileName parseFileName; virVMXFormatFileName formatFileName; virVMXAutodetectSCSIControllerModel autodetectSCSIControllerModel; + const char *datacenterPath; /* including folders */ }; diff --git a/tests/vmx2xmldata/vmx2xml-datacenterpath.vmx b/tests/vmx2xmldata/vmx2xml-datacenterpath.vmx new file mode 100644 index 0000000000..a8e5db3746 --- /dev/null +++ b/tests/vmx2xmldata/vmx2xml-datacenterpath.vmx @@ -0,0 +1,2 @@ +config.version = "8" +virtualHW.version = "4" diff --git a/tests/vmx2xmldata/vmx2xml-datacenterpath.xml b/tests/vmx2xmldata/vmx2xml-datacenterpath.xml new file mode 100644 index 0000000000..a690c0feb8 --- /dev/null +++ b/tests/vmx2xmldata/vmx2xml-datacenterpath.xml @@ -0,0 +1,19 @@ + + 00000000-0000-0000-0000-000000000000 + 32768 + 32768 + 1 + + hvm + + + destroy + restart + destroy + + + + folder1/folder2/datacenter1 + diff --git a/tests/vmx2xmltest.c b/tests/vmx2xmltest.c index 1d1fe83eda..2b14804de4 100644 --- a/tests/vmx2xmltest.c +++ b/tests/vmx2xmltest.c @@ -201,6 +201,7 @@ mymain(void) ctx.parseFileName = testParseVMXFileName; ctx.formatFileName = NULL; ctx.autodetectSCSIControllerModel = NULL; + ctx.datacenterPath = NULL; DO_TEST("case-insensitive-1", "case-insensitive-1"); DO_TEST("case-insensitive-2", "case-insensitive-2"); @@ -280,6 +281,10 @@ mymain(void) DO_TEST("svga", "svga"); + ctx.datacenterPath = "folder1/folder2/datacenter1"; + + DO_TEST("datacenterpath", "datacenterpath"); + virObjectUnref(caps); virObjectUnref(xmlopt); diff --git a/tests/xml2vmxdata/xml2vmx-datacenterpath.vmx b/tests/xml2vmxdata/xml2vmx-datacenterpath.vmx new file mode 100644 index 0000000000..59bde0342f --- /dev/null +++ b/tests/xml2vmxdata/xml2vmx-datacenterpath.vmx @@ -0,0 +1,10 @@ +.encoding = "UTF-8" +config.version = "8" +virtualHW.version = "4" +guestOS = "other" +uuid.bios = "56 4d 9b ef ac d9 b4 e0-c8 f0 ae a8 b9 10 35 15" +displayName = "datacenterpath" +memsize = "4" +numvcpus = "1" +floppy0.present = "false" +floppy1.present = "false" diff --git a/tests/xml2vmxdata/xml2vmx-datacenterpath.xml b/tests/xml2vmxdata/xml2vmx-datacenterpath.xml new file mode 100644 index 0000000000..048e13d270 --- /dev/null +++ b/tests/xml2vmxdata/xml2vmx-datacenterpath.xml @@ -0,0 +1,9 @@ + + datacenterpath + 564d9bef-acd9-b4e0-c8f0-aea8b9103515 + 4096 + + hvm + + folder1/folder2/datacenter1 + diff --git a/tests/xml2vmxtest.c b/tests/xml2vmxtest.c index 53efe31e99..32bad5fc98 100644 --- a/tests/xml2vmxtest.c +++ b/tests/xml2vmxtest.c @@ -221,6 +221,7 @@ mymain(void) ctx.parseFileName = NULL; ctx.formatFileName = testFormatVMXFileName; ctx.autodetectSCSIControllerModel = testAutodetectSCSIControllerModel; + ctx.datacenterPath = NULL; DO_TEST("minimal", "minimal", 4); DO_TEST("minimal-64bit", "minimal-64bit", 4); @@ -293,6 +294,8 @@ mymain(void) DO_TEST("svga", "svga", 4); + DO_TEST("datacenterpath", "datacenterpath", 4); + virObjectUnref(caps); virObjectUnref(xmlopt);