[libvirt] [PATCH 02/13] esx: Improve domain lookup by UUID
Daniel Veillard
veillard at redhat.com
Thu Dec 17 09:44:55 UTC 2009
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 at veillard.com | Rpmfind RPM search engine http://rpmfind.net/
http://veillard.com/ | virtualization library http://libvirt.org/
More information about the libvir-list
mailing list