diff --git a/src/esx/esx_driver.c b/src/esx/esx_driver.c index 1f4f2c7a75..0cce0a41a3 100644 --- a/src/esx/esx_driver.c +++ b/src/esx/esx_driver.c @@ -2645,6 +2645,7 @@ esxDomainGetXMLDesc(virDomainPtr domain, unsigned int flags) esxVI_ObjectContent *virtualMachine = NULL; esxVI_VirtualMachinePowerState powerState; int id; + char *moref = NULL; char *vmPathName = NULL; char *datastoreName = NULL; char *directoryName = NULL; @@ -2670,6 +2671,7 @@ esxDomainGetXMLDesc(virDomainPtr domain, unsigned int flags) esxVI_LookupVirtualMachineByUuid(priv->primary, domain->uuid, propertyNameList, &virtualMachine, esxVI_Occurrence_RequiredItem) < 0 || + esxVI_GetVirtualMachineMORef(virtualMachine, &moref) < 0 || esxVI_GetVirtualMachinePowerState(virtualMachine, &powerState) < 0 || esxVI_GetVirtualMachineIdentity(virtualMachine, &id, NULL, NULL) < 0 || esxVI_GetStringValue(virtualMachine, "config.files.vmPathName", @@ -2715,6 +2717,7 @@ esxDomainGetXMLDesc(virDomainPtr domain, unsigned int flags) ctx.formatFileName = NULL; ctx.autodetectSCSIControllerModel = NULL; ctx.datacenterPath = priv->primary->datacenterPath; + ctx.moref = moref; def = virVMXParseConfig(&ctx, priv->xmlopt, priv->caps, vmx); @@ -2732,6 +2735,7 @@ esxDomainGetXMLDesc(virDomainPtr domain, unsigned int flags) esxVI_String_Free(&propertyNameList); esxVI_ObjectContent_Free(&virtualMachine); + VIR_FREE(moref); VIR_FREE(datastoreName); VIR_FREE(directoryName); VIR_FREE(directoryAndFileName); @@ -2774,6 +2778,7 @@ esxConnectDomainXMLFromNative(virConnectPtr conn, const char *nativeFormat, ctx.formatFileName = NULL; ctx.autodetectSCSIControllerModel = NULL; ctx.datacenterPath = NULL; + ctx.moref = NULL; def = virVMXParseConfig(&ctx, priv->xmlopt, priv->caps, nativeConfig); @@ -2830,6 +2835,7 @@ esxConnectDomainXMLToNative(virConnectPtr conn, const char *nativeFormat, ctx.formatFileName = esxFormatVMXFileName; ctx.autodetectSCSIControllerModel = esxAutodetectSCSIControllerModel; ctx.datacenterPath = NULL; + ctx.moref = NULL; vmx = virVMXFormatConfig(&ctx, priv->xmlopt, def, virtualHW_version); @@ -3077,6 +3083,7 @@ esxDomainDefineXMLFlags(virConnectPtr conn, const char *xml, unsigned int flags) ctx.formatFileName = esxFormatVMXFileName; ctx.autodetectSCSIControllerModel = esxAutodetectSCSIControllerModel; ctx.datacenterPath = NULL; + ctx.moref = NULL; vmx = virVMXFormatConfig(&ctx, priv->xmlopt, def, virtualHW_version); diff --git a/src/esx/esx_vi.c b/src/esx/esx_vi.c index 8586e3ff0a..6d59bae9d8 100644 --- a/src/esx/esx_vi.c +++ b/src/esx/esx_vi.c @@ -2390,6 +2390,19 @@ esxVI_GetVirtualMachineQuestionInfo } +int +esxVI_GetVirtualMachineMORef(esxVI_ObjectContent *virtualMachine, + char **moref) +{ + for (; virtualMachine != NULL; virtualMachine = virtualMachine->_next) { + if (virtualMachine->obj && + STREQ(virtualMachine->obj->type, "VirtualMachine") && + virtualMachine->obj->value) { + return VIR_STRDUP(*moref, virtualMachine->obj->value); + } + } + return -1; +} int esxVI_GetBoolean(esxVI_ObjectContent *objectContent, const char *propertyName, diff --git a/src/esx/esx_vi.h b/src/esx/esx_vi.h index 7c53f37816..47d518dd18 100644 --- a/src/esx/esx_vi.h +++ b/src/esx/esx_vi.h @@ -334,6 +334,10 @@ int esxVI_GetVirtualMachineQuestionInfo (esxVI_ObjectContent *virtualMachine, esxVI_VirtualMachineQuestionInfo **questionInfo); +int esxVI_GetVirtualMachineMORef + (esxVI_ObjectContent *virtualMachine, + char **moref); + int esxVI_GetBoolean(esxVI_ObjectContent *objectContent, const char *propertyName, esxVI_Boolean *value, esxVI_Occurrence occurrence); diff --git a/src/vmx/vmx.c b/src/vmx/vmx.c index d1d8184c56..8aae635c17 100644 --- a/src/vmx/vmx.c +++ b/src/vmx/vmx.c @@ -553,23 +553,41 @@ static virDomainDefParserConfig virVMXDomainDefParserConfig = { VIR_DOMAIN_DEF_FEATURE_NAME_SLASH), }; +struct virVMXDomainDefNamespaceData { + char *datacenterPath; + char *moref; +}; + static void virVMXDomainDefNamespaceFree(void *nsdata) { - VIR_FREE(nsdata); + struct virVMXDomainDefNamespaceData *data = nsdata; + + if (data) { + VIR_FREE(data->datacenterPath); + VIR_FREE(data->moref); + } + VIR_FREE(data); } static int virVMXDomainDefNamespaceFormatXML(virBufferPtr buf, void *nsdata) { - const char *datacenterPath = nsdata; + struct virVMXDomainDefNamespaceData *data = nsdata; - if (!datacenterPath) + if (!data) return 0; - virBufferAddLit(buf, "<vmware:datacenterpath>"); - virBufferEscapeString(buf, "%s", datacenterPath); - virBufferAddLit(buf, "</vmware:datacenterpath>\n"); + if (data->datacenterPath) { + virBufferAddLit(buf, "<vmware:datacenterpath>"); + virBufferEscapeString(buf, "%s", data->datacenterPath); + virBufferAddLit(buf, "</vmware:datacenterpath>\n"); + } + if (data->moref) { + virBufferAddLit(buf, "<vmware:moref>"); + virBufferEscapeString(buf, "%s", data->moref); + virBufferAddLit(buf, "</vmware:moref>\n"); + } return 0; } @@ -1304,7 +1322,6 @@ 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", @@ -1802,12 +1819,18 @@ virVMXParseConfig(virVMXContext *ctx, } /* ctx:datacenterPath -> def:namespaceData */ - if (ctx->datacenterPath) { - if (VIR_STRDUP(namespaceData, ctx->datacenterPath) < 0) + if (ctx->datacenterPath || ctx->moref) { + struct virVMXDomainDefNamespaceData *nsdata = NULL; + + if (VIR_ALLOC(nsdata) < 0 || + VIR_STRDUP(nsdata->datacenterPath, ctx->datacenterPath) < 0 || + VIR_STRDUP(nsdata->moref, ctx->moref) < 0) { + virVMXDomainDefNamespaceFree(nsdata); goto cleanup; + } def->ns = *virDomainXMLOptionGetNamespace(xmlopt); - def->namespaceData = namespaceData; + def->namespaceData = nsdata; } if (virDomainDefPostParse(def, caps, VIR_DOMAIN_DEF_PARSE_ABI_UPDATE, diff --git a/src/vmx/vmx.h b/src/vmx/vmx.h index 08b6277659..6b3d880d61 100644 --- a/src/vmx/vmx.h +++ b/src/vmx/vmx.h @@ -45,6 +45,7 @@ typedef int (*virVMXAutodetectSCSIControllerModel)(virDomainDiskDefPtr def, * formatFileName is only used by virVMXFormatConfig. * autodetectSCSIControllerModel is optionally used by virVMXFormatConfig. * datacenterPath is only used by virVMXFormatConfig. + * moref is only used by virVMXFormatConfig. */ struct _virVMXContext { void *opaque; @@ -52,6 +53,7 @@ struct _virVMXContext { virVMXFormatFileName formatFileName; virVMXAutodetectSCSIControllerModel autodetectSCSIControllerModel; const char *datacenterPath; /* including folders */ + const char *moref; };