[libvirt] [PATCH 03/48] list: Define new API virStorageListALlStoragePools

Guido Günther agx at sigxcpu.org
Mon Aug 6 14:57:13 UTC 2012


On Fri, Aug 03, 2012 at 11:48:06PM +0800, Osier Yang wrote:
> This introduces a new API to list the storage pool objects,
> 4 groups of flags are provided to filter the returned pools:

Typo on the subject: 

capital all in virStorageListALlStoragePools
                              ^

Cheers,
 -- Guido

>   * Active or not
> 
>   * Autostarting or not
> 
>   * Persistent or not
> 
>   * And the pool type.
> 
> include/libvirt/libvirt.h.in: New enum virConnectListAllStoragePoolFlags;
>                               Declare the API.
> python/generator.py: Skip the generating
> src/driver.h: (virDrvConnectListAllStoragePools)
> src/libvirt.c: Implementation for the API.
> src/libvirt_public.syms: Export the symbol.
> ---
>  include/libvirt/libvirt.h.in |   33 ++++++++++++
>  python/generator.py          |    5 +-
>  src/driver.h                 |    5 ++
>  src/libvirt.c                |  112 +++++++++++++++++++++++++++++++++++++++---
>  src/libvirt_public.syms      |    1 +
>  5 files changed, 146 insertions(+), 10 deletions(-)
> 
> diff --git a/include/libvirt/libvirt.h.in b/include/libvirt/libvirt.h.in
> index d21d029..e8f38ab 100644
> --- a/include/libvirt/libvirt.h.in
> +++ b/include/libvirt/libvirt.h.in
> @@ -2524,6 +2524,39 @@ int                     virConnectListDefinedStoragePools(virConnectPtr conn,
>                                                            int maxnames);
>  
>  /*
> + * virConnectListAllStoragePoolsFlags:
> + *
> + * Flags used to tune pools returned by virConnectListAllStoragePools().
> + * Note that these flags come in groups; if all bits from a group are 0,
> + * then that group is not used to filter results.
> + */
> +typedef enum {
> +    VIR_CONNECT_LIST_STORAGE_POOLS_INACTIVE      = 1 << 0,
> +    VIR_CONNECT_LIST_STORAGE_POOLS_ACTIVE        = 1 << 1,
> +
> +    VIR_CONNECT_LIST_STORAGE_POOLS_PERSISTENT    = 1 << 2,
> +    VIR_CONNECT_LIST_STORAGE_POOLS_TRANSIENT     = 1 << 3,
> +
> +    VIR_CONNECT_LIST_STORAGE_POOLS_AUTOSTART     = 1 << 4,
> +    VIR_CONNECT_LIST_STORAGE_POOLS_NO_AUTOSTART  = 1 << 5,
> +
> +    /* List pools by type */
> +    VIR_CONNECT_LIST_STORAGE_POOLS_DIR           = 1 << 6,
> +    VIR_CONNECT_LIST_STORAGE_POOLS_FS            = 1 << 7,
> +    VIR_CONNECT_LIST_STORAGE_POOLS_NETFS         = 1 << 8,
> +    VIR_CONNECT_LIST_STORAGE_POOLS_LOGICAL       = 1 << 9,
> +    VIR_CONNECT_LIST_STORAGE_POOLS_DISK          = 1 << 10,
> +    VIR_CONNECT_LIST_STORAGE_POOLS_ISCSI         = 1 << 11,
> +    VIR_CONNECT_LIST_STORAGE_POOLS_SCSI          = 1 << 12,
> +    VIR_CONNECT_LIST_STORAGE_POOLS_MPATH         = 1 << 13,
> +    VIR_CONNECT_LIST_STORAGE_POOLS_RBD           = 1 << 14,
> +    VIR_CONNECT_LIST_STORAGE_POOLS_SHEEPDOG      = 1 << 15,
> +} virConnectListAllStoragePoolsFlags;
> +
> +int                     virConnectListAllStoragePools(virConnectPtr conn,
> +                                                      virStoragePoolPtr **pools,
> +                                                      unsigned int flags);
> +/*
>   * Query a host for storage pools of a particular type
>   */
>  char *                  virConnectFindStoragePoolSources(virConnectPtr conn,
> diff --git a/python/generator.py b/python/generator.py
> index 6559ece..6fab68c 100755
> --- a/python/generator.py
> +++ b/python/generator.py
> @@ -337,7 +337,7 @@ foreign_encoding_args = (
>  #
>  #######################################################################
>  
> -# Class methods which are written by hand in libvir.c but the Python-level
> +# Class methods which are written by hand in libvirt.c but the Python-level
>  # code is still automatically generated (so they are not in skip_function()).
>  skip_impl = (
>      'virConnectGetVersion',
> @@ -455,9 +455,10 @@ skip_function = (
>      'virConnectDomainEventDeregisterAny', # overridden in virConnect.py
>      'virSaveLastError', # We have our own python error wrapper
>      'virFreeError', # Only needed if we use virSaveLastError
> -    'virConnectListAllDomains', #overridden in virConnect.py
> +    'virConnectListAllDomains', # overridden in virConnect.py
>      'virDomainListAllSnapshots', # overridden in virDomain.py
>      'virDomainSnapshotListAllChildren', # overridden in virDomainSnapshot.py
> +    'virConnectListAllStoragePools', # overridden in virConnect.py
>  
>      'virStreamRecvAll', # Pure python libvirt-override-virStream.py
>      'virStreamSendAll', # Pure python libvirt-override-virStream.py
> diff --git a/src/driver.h b/src/driver.h
> index aab9766..3c1ae3b 100644
> --- a/src/driver.h
> +++ b/src/driver.h
> @@ -1232,6 +1232,10 @@ typedef int
>      (*virDrvConnectListDefinedStoragePools)  (virConnectPtr conn,
>                                                char **const names,
>                                                int maxnames);
> +typedef int
> +    (*virDrvConnectListAllStoragePools)      (virConnectPtr conn,
> +                                              virStoragePoolPtr **pools,
> +                                              unsigned int flags);
>  typedef char *
>      (*virDrvConnectFindStoragePoolSources)   (virConnectPtr conn,
>                                                const char *type,
> @@ -1376,6 +1380,7 @@ struct _virStorageDriver {
>      virDrvConnectListStoragePools           listPools;
>      virDrvConnectNumOfDefinedStoragePools   numOfDefinedPools;
>      virDrvConnectListDefinedStoragePools    listDefinedPools;
> +    virDrvConnectListAllStoragePools        listAllPools;
>      virDrvConnectFindStoragePoolSources     findPoolSources;
>      virDrvStoragePoolLookupByName           poolLookupByName;
>      virDrvStoragePoolLookupByUUID           poolLookupByUUID;
> diff --git a/src/libvirt.c b/src/libvirt.c
> index 3c4bf8c..ad665e4 100644
> --- a/src/libvirt.c
> +++ b/src/libvirt.c
> @@ -11234,6 +11234,90 @@ virStoragePoolGetConnect (virStoragePoolPtr pool)
>  }
>  
>  /**
> + * virConnectListAllStoragePools:
> + * @conn: Pointer to the hypervisor connection.
> + * @pools: Pointer to a variable to store the array containing storage pool
> + *         objects or NULL if the list is not required (just returns number
> + *         of pools).
> + * @flags: bitwise-OR of virConnectListAllStoragePoolsFlags.
> + *
> + * Collect the list of storage pools, and allocate an array to store those
> + * objects. This API solves the race inherent between
> + * virConnectListStoragePools and virConnectListDefinedStoragePools.
> + *
> + * Normally, all storage pools are returned; however, @flags can be used to
> + * filter the results for a smaller list of targeted pools.  The valid
> + * flags are divided into groups, where each group contains bits that
> + * describe mutually exclusive attributes of a pool, and where all bits
> + * within a group describe all possible pools.
> + *
> + * The first group of @flags is VIR_CONNECT_LIST_STORAGE_POOLS_ACTIVE (online)
> + * and VIR_CONNECT_LIST_STORAGE_POOLS_INACTIVE (offline) to filter the pools
> + * by state.
> + *
> + * The second group of @flags is VIR_CONNECT_LIST_STORAGE_POOLS_PERSITENT
> + * (defined) and VIR_CONNECT_LIST_STORAGE_POOLS_TRANSIENT (running but not
> + * defined), to filter the pools by whether they have persistent config or not.
> + *
> + * The third group of @flags is VIR_CONNECT_LIST_STORAGE_POOLS_AUTOSTART
> + * and VIR_CONNECT_LIST_STORAGE_POOLS_NO_AUTOSTART, to filter the pools by
> + * whether they are marked as autostart or not.
> + *
> + * The last group of @flags is provided to filter the pools by the types,
> + * the flags include:
> + * VIR_CONNECT_LIST_STORAGE_POOLS_DIR
> + * VIR_CONNECT_LIST_STORAGE_POOLS_FS
> + * VIR_CONNECT_LIST_STORAGE_POOLS_NETFS
> + * VIR_CONNECT_LIST_STORAGE_POOLS_LOGICAL
> + * VIR_CONNECT_LIST_STORAGE_POOLS_DISK
> + * VIR_CONNECT_LIST_STORAGE_POOLS_ISCSI
> + * VIR_CONNECT_LIST_STORAGE_POOLS_SCSI
> + * VIR_CONNECT_LIST_STORAGE_POOLS_MPATH
> + * VIR_CONNECT_LIST_STORAGE_POOLS_RBD
> + * VIR_CONNECT_LIST_STORAGE_POOLS_SHEEPDOG
> + *
> + * Returns the number of storage pools found or -1 and sets @pools to
> + * NULL in case of error.  On success, the array stored into @pools is
> + * guaranteed to have an extra allocated element set to NULL but not included
> + * in the return count, to make iteration easier.  The caller is responsible
> + * for calling virStoragePoolFree() on each array element, then calling
> + * free() on @pools.
> + */
> +int
> +virConnectListAllStoragePools(virConnectPtr conn,
> +                              virStoragePoolPtr **pools,
> +                              unsigned int flags)
> +{
> +    VIR_DEBUG("conn=%p, pools=%p, flags=%x", conn, pools, flags);
> +
> +    virResetLastError();
> +
> +    if (pools)
> +        *pools = NULL;
> +
> +    if (!VIR_IS_CONNECT(conn)) {
> +        virLibConnError(VIR_ERR_INVALID_CONN, __FUNCTION__);
> +        virDispatchError(NULL);
> +        return -1;
> +    }
> +
> +    if (conn->storageDriver &&
> +        conn->storageDriver->listAllPools) {
> +        int ret;
> +        ret = conn->storageDriver->listAllPools(conn, pools, flags);
> +        if (ret < 0)
> +            goto error;
> +        return ret;
> +    }
> +
> +    virLibConnError(VIR_ERR_NO_SUPPORT, __FUNCTION__);
> +
> +error:
> +    virDispatchError(conn);
> +    return -1;
> +}
> +
> +/**
>   * virConnectNumOfStoragePools:
>   * @conn: pointer to hypervisor connection
>   *
> @@ -11275,11 +11359,17 @@ error:
>   * @names: array of char * to fill with pool names (allocated by caller)
>   * @maxnames: size of the names array
>   *
> - * Provides the list of names of active storage pools
> - * upto maxnames. If there are more than maxnames, the
> - * remaining names will be silently ignored.
> + * Provides the list of names of active storage pools up to maxnames.
> + * If there are more than maxnames, the remaining names will be silently
> + * ignored.
>   *
> - * Returns 0 on success, -1 on error
> + * For more control over the results, see virConnectListAllStoragePools().
> + *
> + * Returns the number of pools found or -1 in case of error.  Note that
> + * this command is inherently racy; a pool can be started between a call to
> + * virConnectNumOfStoragePools() and this call; you are only guaranteed
> + * that all currently active pools were listed if the return is less than
> + * @maxnames.
>   */
>  int
>  virConnectListStoragePools(virConnectPtr conn,
> @@ -11358,11 +11448,17 @@ error:
>   * @names: array of char * to fill with pool names (allocated by caller)
>   * @maxnames: size of the names array
>   *
> - * Provides the list of names of inactive storage pools
> - * upto maxnames. If there are more than maxnames, the
> - * remaining names will be silently ignored.
> + * Provides the list of names of inactive storage pools up to maxnames.
> + * If there are more than maxnames, the remaining names will be silently
> + * ignored.
>   *
> - * Returns 0 on success, -1 on error
> + * For more control over the results, see virConnectListAllStoragePools().
> + *
> + * Returns the number of names provided in the array or -1 in case of error.
> + * Note that this command is inherently racy; a pool can be defined between
> + * a call to virConnectNumOfDefinedStoragePools() and this call; you are only
> + * guaranteed that all currently defined pools were listed if the return
> + * is less than @maxnames.  The client must call free() on each returned name.
>   */
>  int
>  virConnectListDefinedStoragePools(virConnectPtr conn,
> diff --git a/src/libvirt_public.syms b/src/libvirt_public.syms
> index e3ba119..e9c9a31 100644
> --- a/src/libvirt_public.syms
> +++ b/src/libvirt_public.syms
> @@ -549,6 +549,7 @@ LIBVIRT_0.10.0 {
>          virDomainGetHostname;
>          virConnectRegisterCloseCallback;
>          virConnectUnregisterCloseCallback;
> +        virConnectListAllStoragePools;
>  } LIBVIRT_0.9.13;
>  
>  # .... define new API here using predicted next version number ....
> -- 
> 1.7.7.3
> 
> --
> libvir-list mailing list
> libvir-list at redhat.com
> https://www.redhat.com/mailman/listinfo/libvir-list
> 




More information about the libvir-list mailing list