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@xxxxxxxxxxxx | Rpmfind RPM search engine http://rpmfind.net/ http://veillard.com/ | virtualization library http://libvirt.org/ -- Libvir-list mailing list Libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list