[libvirt] [PATCHv1.5 02/27] test: Implement fake storage pool driver in qemuxml2argv test

Osier Yang jyang at redhat.com
Wed Nov 27 07:47:02 UTC 2013


On 27/11/13 00:48, 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 | 162 +++++++++++++++++++++++++++++++++++++++++++++++
>   1 file changed, 162 insertions(+)
>
> diff --git a/tests/qemuxml2argvtest.c b/tests/qemuxml2argvtest.c
> index a290062..a4cef84 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,161 @@ static virSecretDriver fakeSecretDriver = {
>       .secretUndefine = NULL,
>   };
>
> +
> +# define STORAGE_POOL_XML_PATH "storagepoolxml2xmlout/"

This will cause build failure when building with VPATH.

> +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.xml",
> +                        STORAGE_POOL_XML_PATH,
> +                        name) < 0)
> +            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);

Looks like "fakeUUID" is only used here, so generating a random UUID
might work.

> +
> +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")) {

It will be better if it has document what these magic strings mean.

> +        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 *
> +fakeStoragePoolDumpXML(virStoragePoolPtr pool,

Better to rename it as fakeStoragePoolGetXMLDesc to keep consistent.
"DumpXML" is used in virsh.

Osier




More information about the libvir-list mailing list