From 84255632cbe882cd8699e55a1778811e97b6563d Mon Sep 17 00:00:00 2001 From: Matthias Bolte Date: Mon, 27 Jul 2009 14:27:09 +0200 Subject: [PATCH] ESX driver accept VI API version 4.0 * src/esx/esx_driver.c src/esx/esx_vi.c src/esx/esx_vi.h src/esx/esx_vmx.c src/esx/esx_vmx.h: extend the VI API version checks to accept version 4.0 and takes care of the virtualHW.version change from 4 to 7. --- src/esx/esx_driver.c | 10 ++++++++-- src/esx/esx_vi.c | 26 ++++++++++++++++--------- src/esx/esx_vi.h | 2 ++ src/esx/esx_vmx.c | 46 +++++++++++++++++++++++++++++++++++++------- src/esx/esx_vmx.h | 2 +- 5 files changed, 67 insertions(+), 19 deletions(-) diff --git a/src/esx/esx_driver.c b/src/esx/esx_driver.c index 15daf76cc6..e3709fbc8e 100644 --- a/src/esx/esx_driver.c +++ b/src/esx/esx_driver.c @@ -2011,7 +2011,7 @@ esxDomainDumpXML(virDomainPtr domain, int flags) goto failure; } - def = esxVMX_ParseConfig(domain->conn, vmx); + def = esxVMX_ParseConfig(domain->conn, vmx, priv->host->serverVersion); if (def != NULL) { xml = virDomainDefFormat(domain->conn, def, flags); @@ -2041,6 +2041,8 @@ esxDomainXMLFromNative(virConnectPtr conn, const char *nativeFormat, const char *nativeConfig, unsigned int flags ATTRIBUTE_UNUSED) { + esxPrivate *priv = (esxPrivate *)conn->privateData; + int serverVersion = -1; virDomainDefPtr def = NULL; char *xml = NULL; @@ -2050,7 +2052,11 @@ esxDomainXMLFromNative(virConnectPtr conn, const char *nativeFormat, return NULL; } - def = esxVMX_ParseConfig(conn, nativeConfig); + if (! priv->phantom) { + serverVersion = priv->host->serverVersion; + } + + def = esxVMX_ParseConfig(conn, nativeConfig, serverVersion); if (def != NULL) { xml = virDomainDefFormat(conn, def, VIR_DOMAIN_XML_INACTIVE); diff --git a/src/esx/esx_vi.c b/src/esx/esx_vi.c index 18e11e7047..1087926acb 100644 --- a/src/esx/esx_vi.c +++ b/src/esx/esx_vi.c @@ -266,19 +266,27 @@ esxVI_Context_Connect(virConnectPtr conn, esxVI_Context *ctx, const char *url, goto failure; } - if (STREQ(ctx->service->about->apiType, "HostAgent")) { - if (STRNEQ(ctx->service->about->apiVersion, "2.5.0") && - STRNEQ(ctx->service->about->apiVersion, "2.5u2")) { + if (STREQ(ctx->service->about->apiType, "HostAgent") || + STREQ(ctx->service->about->apiType, "VirtualCenter")) { + if (STRPREFIX(ctx->service->about->apiVersion, "2.5")) { + ctx->apiVersion = 25; + } else if (STRPREFIX(ctx->service->about->apiVersion, "4.0")) { + ctx->apiVersion = 40; + } else { ESX_VI_ERROR(conn, VIR_ERR_INTERNAL_ERROR, - "Expecting VI API version '2.5.0' or '2.5u2' but " - "found '%s'", ctx->service->about->apiVersion); + "Expecting VI API major/minor version '2.5' or '4.0' " + "but found '%s'", ctx->service->about->apiVersion); goto failure; } - } else if (STREQ(ctx->service->about->apiType, "VirtualCenter")) { - if (STRNEQ(ctx->service->about->apiVersion, "2.5u2")) { + + if (STRPREFIX(ctx->service->about->version, "3.5")) { + ctx->serverVersion = 35; + } else if (STRPREFIX(ctx->service->about->version, "4.0")) { + ctx->serverVersion = 40; + } else { ESX_VI_ERROR(conn, VIR_ERR_INTERNAL_ERROR, - "Expecting VI API version '2.5u2' but found '%s'", - ctx->service->about->apiVersion); + "Expecting server major/minor version '3.5' or '4.0' " + "but found '%s'", ctx->service->about->version); goto failure; } } else { diff --git a/src/esx/esx_vi.h b/src/esx/esx_vi.h index efef101c43..8f4d790cc4 100644 --- a/src/esx/esx_vi.h +++ b/src/esx/esx_vi.h @@ -52,6 +52,8 @@ struct _esxVI_Context { char *username; char *password; esxVI_ServiceContent *service; + int apiVersion; + int serverVersion; esxVI_UserSession *session; esxVI_ManagedObjectReference *datacenter; esxVI_ManagedObjectReference *vmFolder; diff --git a/src/esx/esx_vmx.c b/src/esx/esx_vmx.c index 635a4836ce..3d5e783031 100644 --- a/src/esx/esx_vmx.c +++ b/src/esx/esx_vmx.c @@ -37,7 +37,8 @@ domain-xml <=> vmx config.version = "8" # essential - virtualHW.version = "4" # essential + virtualHW.version = "4" # essential for ESX 3.5 + virtualHW.version = "7" # essential for ESX 4.0 ??? <=> guestOS = "" # essential, FIXME: not representable @@ -405,7 +406,7 @@ def->parallels[0]... virDomainDefPtr -esxVMX_ParseConfig(virConnectPtr conn, const char *vmx) +esxVMX_ParseConfig(virConnectPtr conn, const char *vmx, int serverVersion) { virConfPtr conf = NULL; virDomainDefPtr def = NULL; @@ -442,8 +443,8 @@ esxVMX_ParseConfig(virConnectPtr conn, const char *vmx) if (config_version != 8) { ESX_ERROR(conn, VIR_ERR_INTERNAL_ERROR, - "Expecting VMX entry 'config.version' to be \"8\" but " - "found \"%lld\"", config_version); + "Expecting VMX entry 'config.version' to be 8 but found " + "%lld", config_version); goto failure; } @@ -452,10 +453,41 @@ esxVMX_ParseConfig(virConnectPtr conn, const char *vmx) goto failure; } - if (virtualHW_version != 4) { + switch (serverVersion) { + case 35: + if (virtualHW_version != 4) { + ESX_ERROR(conn, VIR_ERR_INTERNAL_ERROR, + "Expecting VMX entry 'virtualHW.version' to be 4 for " + "server version 3.5 but found %lld", virtualHW_version); + goto failure; + } + + break; + + case 40: + if (virtualHW_version != 7) { + ESX_ERROR(conn, VIR_ERR_INTERNAL_ERROR, + "Expecting VMX entry 'virtualHW.version' to be 7 for " + "server version 4.0 but found %lld", virtualHW_version); + goto failure; + } + + break; + + case -1: + if (virtualHW_version != 4 && virtualHW_version != 7) { + ESX_ERROR(conn, VIR_ERR_INTERNAL_ERROR, + "Expecting VMX entry 'virtualHW.version' to be 4 or 7 " + "but found %lld", virtualHW_version); + goto failure; + } + + break; + + default: ESX_ERROR(conn, VIR_ERR_INTERNAL_ERROR, - "Expecting VMX entry 'virtualHW.version' to be \"4\" but " - "found \"%lld\"", virtualHW_version); + "Expecting server version 3.5 or 4.0 but got %d", + serverVersion); goto failure; } diff --git a/src/esx/esx_vmx.h b/src/esx/esx_vmx.h index f32a50a01b..8d524a4df1 100644 --- a/src/esx/esx_vmx.h +++ b/src/esx/esx_vmx.h @@ -27,7 +27,7 @@ #include "domain_conf.h" virDomainDefPtr -esxVMX_ParseConfig(virConnectPtr conn, const char *vmx); +esxVMX_ParseConfig(virConnectPtr conn, const char *vmx, int serverVersion); int esxVMX_ParseSCSIController(virConnectPtr conn, virConfPtr conf, -- GitLab