[libvirt] [PATCH 3/3] Implmentation of new APIs to checking state/persistence of objects

Matthias Bolte matthias.bolte at googlemail.com
Wed Oct 21 19:46:52 UTC 2009


2009/10/21 Daniel P. Berrange <berrange at redhat.com>:
> This implements the virConnectIsSecure, virConnectIsEncrypted,
> virDomainIsPersistent, virDomainIsActive, virNetworkIsActive,
> virNetworkIsPersistent, virStoragePoolIsActive,
> virStoragePoolIsPersistent, virInterfaceIsActive APIs in
> (nearly) all drivers. Exceptions are:
>
>  phyp: missing domainIsActive/Persistent
>  esx: missing domainIsPersistent

That one is simple, ESX has no concept of transient domains, all are persistent.

>  opennebula: missing domainIsActive/Persistent
>
> * src/remote/remote_protocol.x: Define remote wire ABI for newly
>  added APIs.
> * daemon/remote_dispatch*.h: Re-generated from remote_protocol.x
> * src/esx/esx_driver.c, src/lxc/lxc_driver.c, src/network/bridge_driver.c,
>  src/opennebula/one_driver.c, src/openvz/openvz_conf.c,
>  src/openvz/openvz_driver.c, src/phyp/phyp_driver.c,
>  src/remote/remote_driver.c, src/storage/storage_driver.c,
>  src/test/test_driver.c, src/uml/uml_driver.c, src/vbox/vbox_tmpl.c,
>  src/xen/xen_driver.c, src/xen/xen_driver.h, src/xen/xen_inotify.c,
>  src/xen/xen_inotify.h: Implement all the new APIs where possible
> ---
>  daemon/remote.c                     |  202 ++++++++++++++++++++++++++
>  daemon/remote_dispatch_args.h       |    7 +
>  daemon/remote_dispatch_prototypes.h |   64 +++++++++
>  daemon/remote_dispatch_ret.h        |    8 +
>  daemon/remote_dispatch_table.h      |   40 ++++++
>  src/esx/esx_driver.c                |  106 +++++++++++++-
>  src/lxc/lxc_driver.c                |   68 +++++++++-
>  src/network/bridge_driver.c         |   50 ++++++-
>  src/opennebula/one_driver.c         |   21 +++-
>  src/openvz/openvz_conf.c            |    2 +
>  src/openvz/openvz_driver.c          |   66 ++++++++-
>  src/phyp/phyp_driver.c              |   25 +++-
>  src/qemu/qemu_driver.c              |   65 ++++++++-
>  src/remote/remote_driver.c          |  266 +++++++++++++++++++++++++++++++++--
>  src/remote/remote_protocol.c        |  137 ++++++++++++++++++-
>  src/remote/remote_protocol.h        |  112 +++++++++++++++
>  src/remote/remote_protocol.x        |   87 +++++++++++-
>  src/storage/storage_driver.c        |   46 ++++++
>  src/test/test_driver.c              |  184 +++++++++++++++++++++++--
>  src/uml/uml_driver.c                |   67 ++++++++-
>  src/vbox/vbox_tmpl.c                |  108 ++++++++++++++-
>  src/xen/xen_driver.c                |   98 ++++++++++++-
>  src/xen/xen_driver.h                |    2 +
>  src/xen/xen_inotify.c               |    8 +-
>  src/xen/xen_inotify.h               |    1 +
>  25 files changed, 1772 insertions(+), 68 deletions(-)

[...]
> diff --git a/src/esx/esx_driver.c b/src/esx/esx_driver.c
> index 3a57613..c3d1eac 100644
> --- a/src/esx/esx_driver.c
> +++ b/src/esx/esx_driver.c
[...]
> +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_GetObjectContent(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;
> +}

This looks like based on a verbatim copy of esxDomainLookupByUUID() :)

While looking at it I notice that esxDomainLookupByUUID() and
esxDomainIsActive() can be improved by using
esxVI_LookupVirtualMachineByUuid().

The current version of this functions enumerates all virtual machines
of an ESX host and searchs for a matching one. This works but can be
improved. The VI API allows to lookup a virtual machine by its UUID.
I'll post a separate patch for this.

[...]
> diff --git a/src/network/bridge_driver.c b/src/network/bridge_driver.c
> index 311838c..60c1acc 100644
> --- a/src/network/bridge_driver.c
> +++ b/src/network/bridge_driver.c
[...]
>  static virNetworkPtr networkCreate(virConnectPtr conn, const char *xml) {
>     struct network_driver *driver = conn->networkPrivateData;
>     virNetworkDefPtr def;
> @@ -1246,7 +1290,7 @@ static int networkUndefine(virNetworkPtr net) {
>
>     network = virNetworkFindByUUID(&driver->networks, net->uuid);
>     if (!network) {
> -        networkReportError(net->conn, NULL, net, VIR_ERR_INVALID_DOMAIN,
> +        networkReportError(net->conn, NULL, net, VIR_ERR_INVALID_NETWORK,
>                            "%s", _("no network with matching uuid"));
>         goto cleanup;
>     }

IMHO this should be fixed in a separate patch.

[...]
> diff --git a/src/openvz/openvz_conf.c b/src/openvz/openvz_conf.c
> index 403f537..83687a2 100644
> --- a/src/openvz/openvz_conf.c
> +++ b/src/openvz/openvz_conf.c
> @@ -473,6 +473,8 @@ int openvzLoadDomains(struct openvz_driver *driver) {
>
>         dom->pid = veid;
>         dom->def->id = dom->state == VIR_DOMAIN_SHUTOFF ? -1 : veid;
> +        /* XXX OpenVZ doesn't appear to have concept of a transient domain */
> +        dom->persistent = 1;
>
>         if (virAsprintf(&dom->def->name, "%i", veid) < 0)
>             goto no_memory;

IMHO this should be fixed in a separate patch

> diff --git a/src/openvz/openvz_driver.c b/src/openvz/openvz_driver.c
> index 4d7f56c..c9fb8a2 100644
> --- a/src/openvz/openvz_driver.c
> +++ b/src/openvz/openvz_driver.c
[...]
> @@ -777,6 +821,7 @@ openvzDomainDefineXML(virConnectPtr conn, const char *xml)
>     if (!(vm = virDomainAssignDef(conn, &driver->domains, vmdef)))
>         goto cleanup;
>     vmdef = NULL;
> +    vm->persistent = 1;
>
>     if (openvzSetInitialConfig(conn, vm->def) < 0) {
>         openvzError(conn, VIR_ERR_INTERNAL_ERROR,
> @@ -844,6 +889,9 @@ openvzDomainCreateXML(virConnectPtr conn, const char *xml,
>     if (!(vm = virDomainAssignDef(conn, &driver->domains, vmdef)))
>         goto cleanup;
>     vmdef = NULL;
> +    /* All OpenVZ domains seem to be persistent - this is a bit of a violation
> +     * of this libvirt API which is intended for transient domain creation */
> +    vm->persistent = 1;
>
>     if (openvzSetInitialConfig(conn, vm->def) < 0) {
>         openvzError(conn, VIR_ERR_INTERNAL_ERROR,

IMHO this should be fixed in a separate patch too.

[...]
> diff --git a/src/remote/remote_protocol.c b/src/remote/remote_protocol.c
> index 1449ed4..b6a85a8 100644
> --- a/src/remote/remote_protocol.c
> +++ b/src/remote/remote_protocol.c
> @@ -4,7 +4,7 @@
>  * It was generated using rpcgen.
>  */
>
> -#include "remote_protocol.h"
> +#include "./remote/remote_protocol.h"

Why change this include?

[...]
> diff --git a/src/test/test_driver.c b/src/test/test_driver.c
> index 88dc6a5..afa9b02 100644
> --- a/src/test/test_driver.c
> +++ b/src/test/test_driver.c
[...]
> @@ -4583,8 +4748,8 @@ static virNetworkDriver testNetworkDriver = {
>     testNetworkGetBridgeName, /* networkGetBridgeName */
>     testNetworkGetAutostart, /* networkGetAutostart */
>     testNetworkSetAutostart, /* networkSetAutostart */
> -    NULL, /* networkIsActive */
> -    NULL, /* networkIsEncrypted */
> +    testNetworkIsActive, /* domainIsActive */
> +    testNetworkIsPersistent, /* domainIsPersistent */
>  };

s/domainIsActive/networkIsActive/
s/domainIsPersistent/networkIsPersistent/

>  static virInterfaceDriver testInterfaceDriver = {
> @@ -4602,7 +4767,7 @@ static virInterfaceDriver testInterfaceDriver = {
>     testInterfaceUndefine,      /* interfaceUndefine */
>     testInterfaceCreate,        /* interfaceCreate */
>     testInterfaceDestroy,       /* interfaceDestroy */
> -    NULL, /* interfaceIsActive */
> +    testInterfaceIsActive, /* domainIsActive */
>  };

s/domainIsActive/interfaceIsActive/

ACK.

Matthias




More information about the libvir-list mailing list