[libvirt] [PATCHv2 1/4] test: Implement fake storage pool driver in qemuxml2argv test

Osier Yang jyang at redhat.com
Thu Nov 28 08:27:36 UTC 2013


On 27/11/13 23:14, Peter Krempa wrote:
> To support testing of "volume" disk backing, we need to implement a few
> disk driver backend functions.
>
> The fake storage driver uses files in storagepoolxml2xmlout/POOLNAME.xml
> as XML files for pool definitions and volume names are in format
> "VOL_TYPE+VOL_PATH". By default type "block" is assumed (for iSCSI test
> compatibility).
>
> The choice of this approach along with implemented functions was made so
> that <disk type='volume'> can be tested in the xml2argv test.
> ---
>   tests/qemuxml2argvtest.c | 183 +++++++++++++++++++++++++++++++++++++++++++++++
>   1 file changed, 183 insertions(+)
>
> diff --git a/tests/qemuxml2argvtest.c b/tests/qemuxml2argvtest.c
> index a290062..9c8f8e2 100644
> --- a/tests/qemuxml2argvtest.c
> +++ b/tests/qemuxml2argvtest.c
> @@ -18,6 +18,7 @@
>   # include "qemu/qemu_command.h"
>   # include "qemu/qemu_domain.h"
>   # include "datatypes.h"
> +# include "conf/storage_conf.h"
>   # include "cpu/cpu_map.h"
>   # include "virstring.h"
>
> @@ -75,6 +76,182 @@ static virSecretDriver fakeSecretDriver = {
>       .secretUndefine = NULL,
>   };
>
> +
> +# define STORAGE_POOL_XML_PATH "storagepoolxml2xmlout/"
> +static const unsigned char fakeUUID[VIR_UUID_BUFLEN] = "fakeuuid";
> +
> +static virStoragePoolPtr
> +fakeStoragePoolLookupByName(virConnectPtr conn,
> +                            const char *name)
> +{
> +    char *xmlpath = NULL;
> +    virStoragePoolPtr ret = NULL;
> +
> +    if (STRNEQ(name, "inactive")) {
> +        if (virAsprintf(&xmlpath, "%s/%s%s.xml",
> +                        abs_srcdir,
> +                        STORAGE_POOL_XML_PATH,
> +                        name) < 0)

Ok, this solves the build problem.

> +            return NULL;
> +
> +        if (!virFileExists(xmlpath)) {
> +            virReportError(VIR_ERR_NO_STORAGE_POOL,
> +                           "File '%s' not found", xmlpath);
> +            goto cleanup;
> +        }
> +    }
> +
> +    ret = virGetStoragePool(conn, name, fakeUUID, NULL, NULL);
> +
> +cleanup:
> +    VIR_FREE(xmlpath);
> +    return ret;
> +}
> +
> +
> +static virStorageVolPtr
> +fakeStorageVolLookupByName(virStoragePoolPtr pool,
> +                           const char *name)
> +{
> +    char **volinfo = NULL;
> +    virStorageVolPtr ret = NULL;
> +
> +    if (STREQ(pool->name, "inactive")) {
> +        virReportError(VIR_ERR_OPERATION_INVALID,
> +                       "storage pool '%s' is not active", pool->name);
> +        return NULL;
> +    }
> +
> +    if (STREQ(name, "nonexistent")) {
> +        virReportError(VIR_ERR_NO_STORAGE_VOL,
> +                       "no storage vol with matching name '%s'", name);
> +        return NULL;
> +    }
> +
> +    if (!strchr(name, '+'))
> +        goto fallback;
> +
> +    if (!(volinfo = virStringSplit(name, "+", 2)))
> +        return NULL;
> +
> +    if (!volinfo[1])
> +        goto fallback;
> +
> +    ret = virGetStorageVol(pool->conn, pool->name, volinfo[1], volinfo[0],
> +                           NULL, NULL);
> +
> +cleanup:
> +    virStringFreeList(volinfo);
> +    return ret;
> +
> +fallback:
> +    ret = virGetStorageVol(pool->conn, pool->name, name, "block", NULL, NULL);
> +    goto cleanup;
> +}
> +
> +static int
> +fakeStorageVolGetInfo(virStorageVolPtr vol,
> +                      virStorageVolInfoPtr info)
> +{
> +    memset(info, 0, sizeof(*info));
> +
> +    info->type = virStorageVolTypeFromString(vol->key);
> +
> +    if (info->type < 0) {
> +        virReportError(VIR_ERR_INTERNAL_ERROR,
> +                       "Invalid volume type '%s'", vol->key);
> +        return -1;
> +    }
> +
> +    return 0;
> +}
> +
> +
> +static char *
> +fakeStorageVolGetPath(virStorageVolPtr vol)
> +{
> +    char *ret = NULL;
> +
> +    ignore_value(virAsprintf(&ret, "/some/%s/device/%s", vol->key, vol->name));
> +
> +    return ret;
> +}
> +
> +
> +static char *
> +fakeStoragePoolGetXMLDesc(virStoragePoolPtr pool,
> +                          unsigned int flags_unused ATTRIBUTE_UNUSED)
> +{
> +    char *xmlpath = NULL;
> +    char *xmlbuf = NULL;
> +
> +    if (STREQ(pool->name, "inactive")) {
> +        virReportError(VIR_ERR_NO_STORAGE_POOL, NULL);
> +        return NULL;
> +    }
> +
> +    if (virAsprintf(&xmlpath, "%s/%s%s.xml",
> +                    abs_srcdir,
> +                    STORAGE_POOL_XML_PATH,
> +                    pool->name) < 0)
> +        return NULL;
> +
> +    if (virtTestLoadFile(xmlpath, &xmlbuf) < 0) {
> +        virReportError(VIR_ERR_INTERNAL_ERROR,
> +                       "failed to load XML file '%s'",
> +                       xmlpath);
> +        goto cleanup;
> +    }
> +
> +cleanup:
> +    VIR_FREE(xmlpath);
> +
> +    return xmlbuf;
> +}
> +
> +static int
> +fakeStorageClose(virConnectPtr conn ATTRIBUTE_UNUSED)
> +{
> +    return 0;
> +}
> +
> +static int
> +fakeStoragePoolIsActive(virStoragePoolPtr pool)
> +{
> +    if (STREQ(pool->name, "inactive"))
> +        return 0;
> +
> +    return 1;
> +}
> +
> +/* Test storage pool implementation
> + *
> + * These functions aid testing of storage pool related stuff when creating a
> + * qemu command .

s/command \./command line\./,

> + *
> + * There are a few "magic" values to pass to these functions:
> + *
> + * 1) "inactive" as
> + * a pool name for pool lookup creates a inactive pool. All other names are

s/a/an/,

How about:

a pool name to create an inactive pool.

> + * interpreted as file names for files of storagepooltest and are used as the

To be more clear, it's XML files in storagepoolxml2xmlout
> + * definition for the pool. If the file doesn't exist the pool doesn't exist.
> + *
> + * 2) "nonexistent" returns an error while looking up a volume. Otherwise

To be consistent, you may want to keep 1) not broken after "as".

> + * pattern VOLUME_TYPE+VOLUME_PATH can be used to simulate a volume in an pool.

s/an pool/a pool/,

> + * This creates a fake path for this volume. If the '+' sign is omitted, block
> + * type is assumed.

Others look fine. ACK if you fix those comments.

Osier




More information about the libvir-list mailing list