[libvirt] [PATCH 3/3] tests: check domain XML to libxl structures conversion
Joao Martins
joao.m.martins at oracle.com
Thu Jun 29 09:06:39 UTC 2017
On 06/29/2017 02:11 AM, Marek Marczykowski-Górecki wrote:
> libxl contains a method to dump libxl_domain_config in json format,
> which is really convenient for tests. Unfortunately it require
> libxl_ctx, which can be only created when running on Xen (wither in dom0
> or domU). Because of this, skip the test in other cases.
>
> For now, have just two tests, including just-introduced CPUID handling,
> but this commit introduces a framework for further tests of
> src/libxl/libxl_conf.c file.
There's related work about this. You might wanna look at the recent Jim's series
(CC'in him) from a few months ago (see below). He ressurected danpb work on
these xml <-> libxl_domain_config conversion, and had a whole test suite for
that where your cpuid test would be better inserted? Patch series is here:
https://www.redhat.com/archives/libvir-list/2017-February/msg01477.html
> ---
> tests/Makefile.am | 8 +-
> tests/libxlxmltest.c | 232 ++++++++++++++++++++++++++++++++++++++++++++-
> 2 files changed, 238 insertions(+), 2 deletions(-)
> create mode 100644 tests/libxlxmltest.c
>
> diff --git a/tests/Makefile.am b/tests/Makefile.am
> index 19986dc..06c5c73 100644
> --- a/tests/Makefile.am
> +++ b/tests/Makefile.am
> @@ -274,7 +274,7 @@ test_programs += xml2sexprtest sexpr2xmltest \
> endif WITH_XEN
>
> if WITH_LIBXL
> -test_programs += xlconfigtest
> +test_programs += xlconfigtest libxlxmltest
> endif WITH_LIBXL
>
> if WITH_QEMU
> @@ -528,9 +528,13 @@ libxl_LDADDS += $(LDADDS)
> xlconfigtest_SOURCES = \
> xlconfigtest.c testutilsxen.c testutilsxen.h \
> testutils.c testutils.h
> +libxlxmltest_SOURCES = \
> + libxlxmltest.c testutilsxen.c testutilsxen.h \
> + testutils.c testutils.h
> xlconfigtest_LDADD =$(libxl_LDADDS)
> +libxlxmltest_LDADD =$(libxl_LDADDS)
> else ! WITH_LIBXL
> -EXTRA_DIST += xlconfigtest.c
> +EXTRA_DIST += xlconfigtest.c libxlxmltest.c
> endif ! WITH_LIBXL
>
> QEMUMONITORTESTUTILS_SOURCES = \
> diff --git a/tests/libxlxmltest.c b/tests/libxlxmltest.c
> new file mode 100644
> index 0000000..7e11af4
> --- /dev/null
> +++ b/tests/libxlxmltest.c
> @@ -0,0 +1,232 @@
> +/*
> + * libxlxmltest.c: Test xl.cfg(5) <-> libxl_domain_config conversion
> + *
> + * Copyright (C) 2007, 2010-2011, 2014 Red Hat, Inc.
> + * Copyright (c) 2015 SUSE LINUX Products GmbH, Nuernberg, Germany.
> + *
> + * 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: Daniel P. Berrange <berrange at redhat.com>
> + * Author: Kiarie Kahurani <davidkiarie4 at gmail.com>
> + * Author: Marek Marczykowski-Górecki <marmarek at invisiblethingslab.com>
> + *
> + */
> +
> +#include <config.h>
> +
> +#include <stdio.h>
> +#include <string.h>
> +#include <unistd.h>
> +#ifdef WITH_YAJL2
> +# define HAVE_YAJL_V2 1
> +#endif
> +#include <libxl.h>
> +#include <libxl_json.h>
> +
> +#include "internal.h"
> +#include "datatypes.h"
> +#include "viralloc.h"
> +#include "virstring.h"
> +#include "testutils.h"
> +#include "testutilsxen.h"
> +#include "libxl/libxl_conf.h"
> +
> +#define VIR_FROM_THIS VIR_FROM_NONE
> +
> +static virCapsPtr caps;
> +static virDomainXMLOptionPtr xmlopt;
> +xentoollog_logger_stdiostream *logger;
> +libxl_ctx *ctx;
> +
> +
> +/*
> + * This function provides a mechanism to replace variables in test
> + * data files whose values are discovered at built time.
> + */
> +static char *
> +testReplaceVarsXML(const char *xml)
> +{
> + char *xmlcfgData;
> + char *replacedXML;
> +
> + if (virTestLoadFile(xml, &xmlcfgData) < 0)
> + return NULL;
> +
> + replacedXML = virStringReplace(xmlcfgData, "/LIBXL_FIRMWARE_DIR",
> + LIBXL_FIRMWARE_DIR);
> +
> + /* libxl driver checks for emulator existence */
> + replacedXML = virStringReplace(xmlcfgData, "/usr/lib/xen/bin/qemu-system-i386",
> + "/bin/true");
> +
> + VIR_FREE(xmlcfgData);
> + return replacedXML;
> +}
> +
> +/*
> + * Parses domXML to virDomainDef object, which is then converted to json
> + * config and compared with expected config.
> + */
> +static int
> +testCompareParseXML(const char *json, const char *xml, bool replaceVars)
> +{
> + char *gotjsonData = NULL;
> + virConfPtr conf = NULL;
> + virConnectPtr conn = NULL;
> + size_t wrote = 0;
> + int ret = -1;
> + virDomainDefPtr def = NULL;
> + char *replacedXML = NULL;
> + virPortAllocatorPtr reservedGraphicsPorts = NULL;
> + libxl_domain_config d_config;
> + yajl_gen gen = NULL;
> +
> + conn = virGetConnect();
> + if (!conn) goto fail;
> +
> + if (replaceVars) {
> + if (!(replacedXML = testReplaceVarsXML(xml)))
> + goto fail;
> + if (!(def = virDomainDefParseString(replacedXML, caps, xmlopt,
> + NULL, VIR_DOMAIN_XML_INACTIVE)))
> + goto fail;
> + } else {
> + if (!(def = virDomainDefParseFile(xml, caps, xmlopt,
> + NULL, VIR_DOMAIN_XML_INACTIVE)))
> + goto fail;
> + }
> +
> + if (!(reservedGraphicsPorts = virPortAllocatorNew("VNC",
> + LIBXL_VNC_PORT_MIN,
> + LIBXL_VNC_PORT_MAX,
> + 0)))
> + goto fail;
> +
> + if (libxlBuildDomainConfig(reservedGraphicsPorts,
> + def,
> + NULL, /* channelDir, unused in current version */
> + ctx,
> + caps,
> + &d_config))
> + goto fail;
> +
> + if (!(gen = libxl_yajl_gen_alloc(NULL)))
> + goto fail;
> +
> + if (libxl_domain_config_gen_json(gen, &d_config) != yajl_gen_status_ok)
> + goto fail;
> +
> + if (yajl_gen_get_buf(gen,
> + (const unsigned char **)&gotjsonData,
> + &wrote) != yajl_gen_status_ok)
> + goto fail;
> +
> + if (virTestCompareToFile(gotjsonData, json) < 0)
> + goto fail;
> +
> + ret = 0;
> +
> + fail:
> + VIR_FREE(replacedXML);
> + // yajl_gen_free handle also gotjsonData
> + if (gen)
> + yajl_gen_free(gen);
> + if (conf)
> + virConfFree(conf);
> + virObjectUnref(reservedGraphicsPorts);
> + virDomainDefFree(def);
> + virObjectUnref(conn);
> +
> + return ret;
> +}
> +
> +struct testInfo {
> + const char *name;
> + bool replaceVars;
> +};
> +
> +static int
> +testCompareHelper(const void *data)
> +{
> + int result = -1;
> + const struct testInfo *info = data;
> + char *xml = NULL;
> + char *json = NULL;
> +
> + if (virAsprintf(&xml, "%s/xlconfigdata/test-%s.xml",
> + abs_srcdir, info->name) < 0 ||
> + virAsprintf(&json, "%s/xlconfigdata/test-%s.json",
> + abs_srcdir, info->name) < 0)
> + goto cleanup;
> +
> + result = testCompareParseXML(json, xml, info->replaceVars);
> +
> + cleanup:
> + VIR_FREE(xml);
> + VIR_FREE(json);
> +
> + return result;
> +}
> +
> +
> +static int
> +mymain(void)
> +{
> + int ret = 0;
> +
> + logger = xtl_createlogger_stdiostream(stderr, XTL_PROGRESS, 0);
> + if (!logger)
> + return EXIT_FAILURE;
> +
> + if (libxl_ctx_alloc(&ctx, LIBXL_VERSION, 0, (xentoollog_logger*)logger))
> + return EXIT_AM_SKIP;
> +
> + if (!(caps = testXLInitCaps()))
> + return EXIT_FAILURE;
> +
> + if (!(xmlopt = libxlCreateXMLConf()))
> + return EXIT_FAILURE;
> +
> +#define DO_TEST_PARSE(name, replace) \
> + do { \
> + struct testInfo info0 = { name, replace }; \
> + if (virTestRun("Xen XML-2-json Parse " name, \
> + testCompareHelper, &info0) < 0) \
> + ret = -1; \
> + } while (0)
> +
> +#define DO_TEST(name) \
> + do { \
> + DO_TEST_PARSE(name, false); \
> + } while (0)
> +
> +#define DO_TEST_REPLACE_VARS(name) \
> + do { \
> + DO_TEST_PARSE(name, true); \
> + } while (0)
> +
> + DO_TEST_REPLACE_VARS("fullvirt-ovmf");
> +
> + DO_TEST("fullvirt-cpuid");
> +
> + virObjectUnref(caps);
> + virObjectUnref(xmlopt);
> + libxl_ctx_free(ctx);
> + xtl_logger_destroy((xentoollog_logger*)logger);
> +
> + return ret == 0 ? EXIT_SUCCESS : EXIT_FAILURE;
> +}
> +
> +VIR_TEST_MAIN(mymain)
>
More information about the libvir-list
mailing list