提交 3e8cb460 编写于 作者: M Matthias Bolte 提交者: Daniel Veillard

ESX add esxGetCapabilities() with basic defaults

* src/esx/esx_driver.c: add esxCapsInit() with default caps and add
  esxGetCapabilities()
上级 46e76e8b
...@@ -58,6 +58,7 @@ typedef struct _esxPrivate { ...@@ -58,6 +58,7 @@ typedef struct _esxPrivate {
esxVI_Context *host; esxVI_Context *host;
esxVI_Context *vCenter; esxVI_Context *vCenter;
int phantom; // boolean int phantom; // boolean
virCapsPtr caps;
char *transport; char *transport;
int32_t maxVcpus; int32_t maxVcpus;
esxVI_Boolean supportsVMotion; esxVI_Boolean supportsVMotion;
...@@ -66,6 +67,50 @@ typedef struct _esxPrivate { ...@@ -66,6 +67,50 @@ typedef struct _esxPrivate {
static virCapsPtr
esxCapsInit(virConnectPtr conn)
{
virCapsPtr caps = NULL;
virCapsGuestPtr guest = NULL;
/* FIXME: Need to detect real host architecture */
caps = virCapabilitiesNew("i686", 1, 1);
if (caps == NULL) {
virReportOOMError(conn);
return NULL;
}
virCapabilitiesSetMacPrefix(caps, (unsigned char[]){ 0x00, 0x50, 0x56 });
virCapabilitiesAddHostMigrateTransport(caps, "esx");
/* FIXME: Need to detect real host architecture and word size */
guest =
virCapabilitiesAddGuest(caps, "hvm", "i686", 32, NULL, NULL, 0, NULL);
if (guest == NULL) {
goto failure;
}
/*
* FIXME: Maybe distinguish betwen ESX and GSX here, see
* esxVMX_ParseConfig() and VIR_DOMAIN_VIRT_VMWARE
*/
if (virCapabilitiesAddGuestDomain(guest, "vmware", NULL, NULL, 0,
NULL) == NULL) {
goto failure;
}
return caps;
failure:
virCapabilitiesFree(caps);
return NULL;
}
/* /*
* URI format: {esx|gsx}://[<user>@]<server>[:<port>][?transport={http|https}][&vcenter=<vcenter>][&no_verify={0|1}] * URI format: {esx|gsx}://[<user>@]<server>[:<port>][?transport={http|https}][&vcenter=<vcenter>][&no_verify={0|1}]
* esx:///phantom * esx:///phantom
...@@ -177,6 +222,7 @@ esxOpen(virConnectPtr conn, virConnectAuthPtr auth, int flags ATTRIBUTE_UNUSED) ...@@ -177,6 +222,7 @@ esxOpen(virConnectPtr conn, virConnectAuthPtr auth, int flags ATTRIBUTE_UNUSED)
} }
} }
/* Login to host */
if (virAsprintf(&url, "%s://%s:%d/sdk", priv->transport, if (virAsprintf(&url, "%s://%s:%d/sdk", priv->transport,
conn->uri->server, conn->uri->port) < 0) { conn->uri->server, conn->uri->port) < 0) {
virReportOOMError(conn); virReportOOMError(conn);
...@@ -235,6 +281,7 @@ esxOpen(virConnectPtr conn, virConnectAuthPtr auth, int flags ATTRIBUTE_UNUSED) ...@@ -235,6 +281,7 @@ esxOpen(virConnectPtr conn, virConnectAuthPtr auth, int flags ATTRIBUTE_UNUSED)
VIR_FREE(password); VIR_FREE(password);
VIR_FREE(username); VIR_FREE(username);
/* Login to vCenter */
if (vCenter != NULL) { if (vCenter != NULL) {
if (virAsprintf(&url, "%s://%s/sdk", priv->transport, if (virAsprintf(&url, "%s://%s/sdk", priv->transport,
vCenter) < 0) { vCenter) < 0) {
...@@ -282,6 +329,13 @@ esxOpen(virConnectPtr conn, virConnectAuthPtr auth, int flags ATTRIBUTE_UNUSED) ...@@ -282,6 +329,13 @@ esxOpen(virConnectPtr conn, virConnectAuthPtr auth, int flags ATTRIBUTE_UNUSED)
} }
VIR_FREE(vCenter); VIR_FREE(vCenter);
/* Setup capabilities */
priv->caps = esxCapsInit(conn);
if (priv->caps == NULL) {
goto failure;
}
} }
conn->privateData = priv; conn->privateData = priv;
...@@ -298,6 +352,8 @@ esxOpen(virConnectPtr conn, virConnectAuthPtr auth, int flags ATTRIBUTE_UNUSED) ...@@ -298,6 +352,8 @@ esxOpen(virConnectPtr conn, virConnectAuthPtr auth, int flags ATTRIBUTE_UNUSED)
esxVI_Context_Free(&priv->host); esxVI_Context_Free(&priv->host);
esxVI_Context_Free(&priv->vCenter); esxVI_Context_Free(&priv->vCenter);
virCapabilitiesFree(priv->caps);
VIR_FREE(priv->transport); VIR_FREE(priv->transport);
VIR_FREE(priv); VIR_FREE(priv);
} }
...@@ -326,6 +382,8 @@ esxClose(virConnectPtr conn) ...@@ -326,6 +382,8 @@ esxClose(virConnectPtr conn)
} }
} }
virCapabilitiesFree(priv->caps);
VIR_FREE(priv->transport); VIR_FREE(priv->transport);
VIR_FREE(priv); VIR_FREE(priv);
...@@ -728,6 +786,30 @@ esxNodeGetInfo(virConnectPtr conn, virNodeInfoPtr nodeinfo) ...@@ -728,6 +786,30 @@ esxNodeGetInfo(virConnectPtr conn, virNodeInfoPtr nodeinfo)
static char *
esxGetCapabilities(virConnectPtr conn)
{
esxPrivate *priv = (esxPrivate *)conn->privateData;
char *xml = NULL;
if (priv->phantom) {
ESX_ERROR(conn, VIR_ERR_OPERATION_INVALID,
"Not possible with a phantom connection");
return NULL;
}
xml = virCapabilitiesFormatXML(priv->caps);
if (xml == NULL) {
virReportOOMError(conn);
return NULL;
}
return xml;
}
static int static int
esxListDomains(virConnectPtr conn, int *ids, int maxids) esxListDomains(virConnectPtr conn, int *ids, int maxids)
{ {
...@@ -2895,7 +2977,7 @@ static virDriver esxDriver = { ...@@ -2895,7 +2977,7 @@ static virDriver esxDriver = {
esxGetHostname, /* hostname */ esxGetHostname, /* hostname */
NULL, /* getMaxVcpus */ NULL, /* getMaxVcpus */
esxNodeGetInfo, /* nodeGetInfo */ esxNodeGetInfo, /* nodeGetInfo */
NULL, /* getCapabilities */ esxGetCapabilities, /* getCapabilities */
esxListDomains, /* listDomains */ esxListDomains, /* listDomains */
esxNumberOfDomains, /* numOfDomains */ esxNumberOfDomains, /* numOfDomains */
NULL, /* domainCreateXML */ NULL, /* domainCreateXML */
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册