On Sun, Dec 13, 2009 at 12:20:39AM +0100, Matthias Bolte wrote:
esxDomainLookupByUUID() and esxDomainIsActive() lookup a domain by
asking
ESX for all known domains and searching manually for the one with the
matching UUID. This is inefficient. The VI API allows to lookup by UUID
directly: FindByUuid().
* src/esx/esx_driver.c: change esxDomainLookupByUUID() and esxDomainIsActive()
to use esxVI_LookupVirtualMachineByUuid(), also reorder some functions to
keep them in sync with the driver struct
---
src/esx/esx_driver.c | 261 +++++++++++++++++++------------------------------
1 files changed, 101 insertions(+), 160 deletions(-)
diff --git a/src/esx/esx_driver.c b/src/esx/esx_driver.c
index 45da694..db379d7 100644
--- a/src/esx/esx_driver.c
+++ b/src/esx/esx_driver.c
@@ -507,30 +507,6 @@ esxClose(virConnectPtr conn)
}
-static int
-esxIsSecure(virConnectPtr conn)
-{
- esxPrivate *priv = (esxPrivate *)conn->privateData;
-
- if (STRCASEEQ(priv->transport, "https")) {
- return 1;
- } else {
- return 0;
- }
-}
-
-
-static int
-esxIsEncrypted(virConnectPtr conn)
-{
- esxPrivate *priv = (esxPrivate *)conn->privateData;
-
- if (STRCASEEQ(priv->transport, "https")) {
- return 1;
- } else {
- return 0;
- }
-}
static esxVI_Boolean
esxSupportsVMotion(virConnectPtr conn)
@@ -749,7 +725,6 @@ esxGetHostname(virConnectPtr conn)
-
static int
esxNodeGetInfo(virConnectPtr conn, virNodeInfoPtr nodeinfo)
{
@@ -1097,13 +1072,10 @@ esxDomainLookupByUUID(virConnectPtr conn, const unsigned char
*uuid)
{
esxPrivate *priv = (esxPrivate *)conn->privateData;
esxVI_String *propertyNameList = NULL;
- esxVI_ObjectContent *virtualMachineList = NULL;
esxVI_ObjectContent *virtualMachine = NULL;
esxVI_VirtualMachinePowerState powerState;
- int id_candidate = -1;
- char *name_candidate = NULL;
- unsigned char uuid_candidate[VIR_UUID_BUFLEN];
- char uuid_string[VIR_UUID_STRING_BUFLEN];
+ int id = -1;
+ char *name = NULL;
virDomainPtr domain = NULL;
if (esxVI_EnsureSession(conn, priv->host) < 0) {
@@ -1111,64 +1083,35 @@ esxDomainLookupByUUID(virConnectPtr conn, const unsigned char
*uuid)
}
if (esxVI_String_AppendValueListToList(conn, &propertyNameList,
- "configStatus\0"
"name\0"
- "runtime.powerState\0"
- "config.uuid\0") < 0 ||
- esxVI_LookupObjectContentByType(conn, priv->host,
priv->host->vmFolder,
- "VirtualMachine", propertyNameList,
- esxVI_Boolean_True,
- &virtualMachineList) < 0) {
+ "runtime.powerState\0") < 0 ||
+ esxVI_LookupVirtualMachineByUuid(conn, priv->host, uuid,
+ propertyNameList, &virtualMachine,
+ esxVI_Occurence_RequiredItem) < 0 ||
+ esxVI_GetVirtualMachineIdentity(conn, virtualMachine,
+ &id, &name, NULL) < 0 ||
+ esxVI_GetVirtualMachinePowerState(conn, virtualMachine,
+ &powerState) < 0) {
goto failure;
}
- for (virtualMachine = virtualMachineList; virtualMachine != NULL;
- virtualMachine = virtualMachine->_next) {
- VIR_FREE(name_candidate);
-
- if (esxVI_GetVirtualMachineIdentity(conn, virtualMachine,
- &id_candidate, &name_candidate,
- uuid_candidate) < 0) {
- goto failure;
- }
-
- if (memcmp(uuid, uuid_candidate,
- VIR_UUID_BUFLEN * sizeof(unsigned char)) != 0) {
- continue;
- }
-
- if (esxVI_GetVirtualMachinePowerState(conn, virtualMachine,
- &powerState) < 0) {
- goto failure;
- }
-
- domain = virGetDomain(conn, name_candidate, uuid_candidate);
-
- if (domain == NULL) {
- goto failure;
- }
-
- /* Only running/suspended virtual machines have an ID != -1 */
- if (powerState != esxVI_VirtualMachinePowerState_PoweredOff) {
- domain->id = id_candidate;
- } else {
- domain->id = -1;
- }
-
- break;
- }
+ domain = virGetDomain(conn, name, uuid);
if (domain == NULL) {
- virUUIDFormat(uuid, uuid_string);
+ goto failure;
+ }
- ESX_ERROR(conn, VIR_ERR_NO_DOMAIN, "No domain with UUID
'%s'",
- uuid_string);
+ /* Only running/suspended virtual machines have an ID != -1 */
+ if (powerState != esxVI_VirtualMachinePowerState_PoweredOff) {
+ domain->id = id;
+ } else {
+ domain->id = -1;
}
cleanup:
esxVI_String_Free(&propertyNameList);
- esxVI_ObjectContent_Free(&virtualMachineList);
- VIR_FREE(name_candidate);
+ esxVI_ObjectContent_Free(&virtualMachine);
+ VIR_FREE(name);
return domain;
@@ -1262,89 +1205,6 @@ esxDomainLookupByName(virConnectPtr conn, const char *name)
}
-static int
-esxDomainIsActive(virDomainPtr dom)
-{
- esxPrivate *priv = (esxPrivate *)dom->conn->privateData;
- esxVI_String *propertyNameList = NULL;
- esxVI_ObjectContent *virtualMachineList = NULL;
- esxVI_ObjectContent *virtualMachine = NULL;
- esxVI_VirtualMachinePowerState powerState;
- int id_candidate = -1;
- char *name_candidate = NULL;
- unsigned char uuid_candidate[VIR_UUID_BUFLEN];
- char uuid_string[VIR_UUID_STRING_BUFLEN];
- int ret = -1;
-
- if (esxVI_EnsureSession(dom->conn, priv->host) < 0) {
- goto cleanup;
- }
-
- if (esxVI_String_AppendValueListToList(dom->conn, &propertyNameList,
- "configStatus\0"
- "name\0"
- "runtime.powerState\0"
- "config.uuid\0") < 0 ||
- esxVI_LookupObjectContentByType(dom->conn, priv->host,
priv->host->vmFolder,
- "VirtualMachine", propertyNameList,
- esxVI_Boolean_True,
- &virtualMachineList) < 0) {
- goto cleanup;
- }
-
- for (virtualMachine = virtualMachineList; virtualMachine != NULL;
- virtualMachine = virtualMachine->_next) {
- VIR_FREE(name_candidate);
-
- if (esxVI_GetVirtualMachineIdentity(dom->conn, virtualMachine,
- &id_candidate, &name_candidate,
- uuid_candidate) < 0) {
- goto cleanup;
- }
-
- if (memcmp(dom->uuid, uuid_candidate,
- VIR_UUID_BUFLEN * sizeof(unsigned char)) != 0) {
- continue;
- }
-
- if (esxVI_GetVirtualMachinePowerState(dom->conn, virtualMachine,
- &powerState) < 0) {
- goto cleanup;
- }
-
- /* Only running/suspended virtual machines have an ID != -1 */
- if (powerState != esxVI_VirtualMachinePowerState_PoweredOff) {
- ret = 1;
- } else {
- ret = 0;
- }
-
- break;
- }
-
- if (ret == -1) {
- virUUIDFormat(dom->uuid, uuid_string);
-
- ESX_ERROR(dom->conn, VIR_ERR_NO_DOMAIN, "No domain with UUID
'%s'",
- uuid_string);
- }
-
- cleanup:
- esxVI_String_Free(&propertyNameList);
- esxVI_ObjectContent_Free(&virtualMachineList);
- VIR_FREE(name_candidate);
-
- return ret;
-}
-
-
-static int
-esxDomainIsPersistent(virDomainPtr dom ATTRIBUTE_UNUSED)
-{
- /* ESX has no concept of transient domains, so
- * all of them are persistent */
- return 1;
-}
static int
esxDomainSuspend(virDomainPtr domain)
@@ -3355,6 +3215,87 @@ esxNodeGetFreeMemory(virConnectPtr conn)
+static int
+esxIsEncrypted(virConnectPtr conn)
+{
+ esxPrivate *priv = (esxPrivate *)conn->privateData;
+
+ if (STRCASEEQ(priv->transport, "https")) {
+ return 1;
+ } else {
+ return 0;
+ }
+}
+
+
+
+static int
+esxIsSecure(virConnectPtr conn)
+{
+ esxPrivate *priv = (esxPrivate *)conn->privateData;
+
+ if (STRCASEEQ(priv->transport, "https")) {
+ return 1;
+ } else {
+ return 0;
+ }
+}
+
+
+
+static int
+esxDomainIsActive(virDomainPtr domain)
+{
+ int result = 0;
+ esxPrivate *priv = (esxPrivate *)domain->conn->privateData;
+ esxVI_ObjectContent *virtualMachine = NULL;
+ esxVI_String *propertyNameList = NULL;
+ esxVI_VirtualMachinePowerState powerState;
+
+ if (esxVI_EnsureSession(domain->conn, priv->host) < 0) {
+ goto failure;
+ }
+
+ if (esxVI_String_AppendValueToList(domain->conn, &propertyNameList,
+ "runtime.powerState") < 0 ||
+ esxVI_LookupVirtualMachineByUuid(domain->conn, priv->host,
+ domain->uuid, propertyNameList,
+ &virtualMachine,
+ esxVI_Occurence_RequiredItem) < 0 ||
+ esxVI_GetVirtualMachinePowerState(domain->conn, virtualMachine,
+ &powerState) < 0) {
+ goto failure;
+ }
+
+ if (powerState != esxVI_VirtualMachinePowerState_PoweredOff) {
+ result = 1;
+ } else {
+ result = 0;
+ }
+
+ cleanup:
+ esxVI_ObjectContent_Free(&virtualMachine);
+ esxVI_String_Free(&propertyNameList);
+
+ return result;
+
+ failure:
+ result = -1;
+
+ goto cleanup;
+}
+
+
+
+static int
+esxDomainIsPersistent(virDomainPtr domain ATTRIBUTE_UNUSED)
+{
+ /* ESX has no concept of transient domains, so all of them are persistent */
+ return 1;
+}
+
+
+
static virDriver esxDriver = {
VIR_DRV_ESX,
"ESX",
ACK, there is a bit more than just the change of lookup, e.g. the new
IsActive and IsPersistent implementations,
Daniel
--
Daniel Veillard | libxml Gnome XML XSLT toolkit
http://xmlsoft.org/
daniel(a)veillard.com | Rpmfind RPM search engine
http://rpmfind.net/
http://veillard.com/ | virtualization library
http://libvirt.org/