Re: [PATCH 2/4] Implement infrastracture for mocking up QEMU capabilities cache

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On 15.09.2015 10:05, Ján Tomko wrote:
> From: Pavel Fedin <p.fedin@xxxxxxxxxxx>
> 
> The main purpose of this patch is to introduce test mode to
> virQEMUCapsCacheLookup(). This is done by adding a global variable, which
> effectively overrides binary name. This variable is supposed to be set by
> test suite.
> 
> The second addition is qemuTestCapsCacheInsert() function which allows the
> test suite to actually populate the cache.
> 
> Signed-off-by: Pavel Fedin <p.fedin@xxxxxxxxxxx>
> Signed-off-by: Ján Tomko <jtomko@xxxxxxxxxx>
> ---
>  src/qemu/qemu_capabilities.c | 16 +++++++---------
>  src/qemu/qemu_capspriv.h     | 36 ++++++++++++++++++++++++++++++++++++
>  tests/testutilsqemu.c        | 40 ++++++++++++++++++++++++++++++++++++++++
>  tests/testutilsqemu.h        |  5 +++++
>  4 files changed, 88 insertions(+), 9 deletions(-)
>  create mode 100644 src/qemu/qemu_capspriv.h
> 
> diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c
> index 4ad1bdb..9a819d2 100644
> --- a/src/qemu/qemu_capabilities.c
> +++ b/src/qemu/qemu_capabilities.c
> @@ -42,6 +42,7 @@
>  #include "virstring.h"
>  #include "qemu_hostdev.h"
>  #include "qemu_domain.h"
> +#include "qemu_capspriv.h"
>  
>  #include <fcntl.h>
>  #include <sys/stat.h>
> @@ -331,15 +332,6 @@ struct _virQEMUCaps {
>      unsigned int *machineMaxCpus;
>  };
>  
> -struct _virQEMUCapsCache {
> -    virMutex lock;
> -    virHashTablePtr binaries;
> -    char *libDir;
> -    char *cacheDir;
> -    uid_t runUid;
> -    gid_t runGid;
> -};
> -
>  struct virQEMUCapsSearchData {
>      virArch arch;
>  };
> @@ -3718,11 +3710,17 @@ virQEMUCapsCacheNew(const char *libDir,
>      return NULL;
>  }
>  
> +const char *qemuTestCapsName;
>  
>  virQEMUCapsPtr
>  virQEMUCapsCacheLookup(virQEMUCapsCachePtr cache, const char *binary)
>  {
>      virQEMUCapsPtr ret = NULL;
> +
> +    /* This is used only by test suite!!! */
> +    if (qemuTestCapsName)
> +        binary = qemuTestCapsName;
> +
>      virMutexLock(&cache->lock);
>      ret = virHashLookup(cache->binaries, binary);
>      if (ret &&
> diff --git a/src/qemu/qemu_capspriv.h b/src/qemu/qemu_capspriv.h
> new file mode 100644
> index 0000000..9288dbd
> --- /dev/null
> +++ b/src/qemu/qemu_capspriv.h
> @@ -0,0 +1,36 @@
> +/*
> + * qemu_capspriv.h: private declarations for QEMU capabilities generation
> + *
> + * Copyright (C) 2015 Samsung Electronics Co. Ltd
> + * Copyright (C) 2015 Pavel Fedin
> + *
> + * This library is free software; you can redistribute it and/or
> + * modify it under the terms of the GNU Lesser General Public
> + * License as published by the Free Software Foundation; either
> + * version 2.1 of the License, or (at your option) any later version.
> + *
> + * This library is distributed in the hope that it will be useful,
> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> + * Lesser General Public License for more details.
> + *
> + * You should have received a copy of the GNU Lesser General Public
> + * License along with this library.  If not, see
> + * <http://www.gnu.org/licenses/>.
> + *
> + * Author: Pavel Fedin <p.fedin@xxxxxxxxxxx>
> + */
> +

Maybe we want to guard this file so that it cannot be included from a
random .c file? Something like we do in ./src/util/vircommandpriv.h?

> +#ifndef __QEMU_CAPSPRIV_H__
> +# define __QEMU_CAPSPRIV_H__
> +
> +struct _virQEMUCapsCache {
> +    virMutex lock;
> +    virHashTablePtr binaries;
> +    char *libDir;
> +    char *cacheDir;
> +    uid_t runUid;
> +    gid_t runGid;
> +};
> +
> +#endif
> diff --git a/tests/testutilsqemu.c b/tests/testutilsqemu.c
> index 84dfa75..275d22a 100644
> --- a/tests/testutilsqemu.c
> +++ b/tests/testutilsqemu.c
> @@ -8,6 +8,7 @@
>  # include "cpu_conf.h"
>  # include "qemu/qemu_driver.h"
>  # include "qemu/qemu_domain.h"
> +# include "qemu/qemu_capspriv.h"
>  # include "virstring.h"
>  
>  # define VIR_FROM_THIS VIR_FROM_QEMU
> @@ -527,6 +528,32 @@ qemuTestParseCapabilities(const char *capsFile)
>      return NULL;
>  }
>  
> +int qemuTestCapsCacheInsert(virQEMUCapsCachePtr cache, const char *binary,
> +                            virQEMUCapsPtr caps)
> +{
> +    int ret;
> +
> +    if (caps) {
> +        /* Our caps were created artificially, so we don't want
> +         * virQEMUCapsCacheFree() to attempt to deallocate them */
> +        virObjectRef(caps);
> +    } else {
> +        caps = virQEMUCapsNew();
> +        if (!caps)
> +            return -ENOMEM;
> +    }
> +
> +    /* We can have repeating names for our test data sets,
> +     * so make sure there's no old copy */
> +    virHashRemoveEntry(cache->binaries, binary);
> +
> +    ret = virHashAddEntry(cache->binaries, binary, caps);
> +    if (ret < 0)
> +        virObjectUnref(caps);

I think we want to set @qemuTestCapsName here:

if (ret < 0)
  virObjectUnref(caps)
else
  qemuTestCapsName = binary;

> +
> +    return ret;
> +}
> +
>  int qemuTestDriverInit(virQEMUDriver *driver)
>  {
>      driver->config = virQEMUDriverConfigNew(false);
> @@ -537,13 +564,24 @@ int qemuTestDriverInit(virQEMUDriver *driver)
>      if (!driver->caps)
>          goto error;
>  
> +    /* Using /dev/null for libDir and cacheDir automatically produces errors
> +     * upon attempt to use any of them */
> +    driver->qemuCapsCache = virQEMUCapsCacheNew("/dev/null", "/dev/null", 0, 0);
> +    if (!driver->qemuCapsCache)
> +        goto error;
> +
>      driver->xmlopt = virQEMUDriverCreateXMLConf(driver);
>      if (!driver->xmlopt)
>          goto error;
>  
> +    qemuTestCapsName = "empty";
> +    if (qemuTestCapsCacheInsert(driver->qemuCapsCache, "empty", NULL) < 0)
> +        goto error;
> +
>      return 0;
>  
>   error:
> +    virQEMUCapsCacheFree(driver->qemuCapsCache);
>      virObjectUnref(driver->caps);
>      virObjectUnref(driver->config);
>      virObjectUnref(driver->xmlopt);
> @@ -552,8 +590,10 @@ int qemuTestDriverInit(virQEMUDriver *driver)
>  
>  void qemuTestDriverFree(virQEMUDriver *driver)
>  {
> +    virQEMUCapsCacheFree(driver->qemuCapsCache);
>      virObjectUnref(driver->xmlopt);
>      virObjectUnref(driver->caps);
>      virObjectUnref(driver->config);
>  }
> +
>  #endif
> diff --git a/tests/testutilsqemu.h b/tests/testutilsqemu.h
> index 6c2d3b5..1d5dfc5 100644
> --- a/tests/testutilsqemu.h
> +++ b/tests/testutilsqemu.h
> @@ -18,4 +18,9 @@ void testQemuCapsSetCPU(virCapsPtr caps,
>  
>  int qemuTestDriverInit(virQEMUDriver *driver);
>  void qemuTestDriverFree(virQEMUDriver *driver);
> +int qemuTestCapsCacheInsert(virQEMUCapsCachePtr cache, const char *binary,
> +                            virQEMUCapsPtr caps);
> +
> +/* This variable is actually defined in src/qemu/qemu_capabilities.c */
> +extern const char *qemuTestCapsName;
>  #endif
> 


Otherwise looking good.

Michal

--
libvir-list mailing list
libvir-list@xxxxxxxxxx
https://www.redhat.com/mailman/listinfo/libvir-list




[Index of Archives]     [Virt Tools]     [Libvirt Users]     [Lib OS Info]     [Fedora Users]     [Fedora Desktop]     [Fedora SELinux]     [Big List of Linux Books]     [Yosemite News]     [KDE Users]     [Fedora Tools]