mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2024-11-03 11:51:11 +00:00
d4eecbf662
There was a report on libvirt-users [1] about the domxml to/from native converter in the Xen driver not handling PCI addresses without a domain specification. This patch improves parsing of PCI addresses in the converter and allows PCI addresses with only bb:ss.f. xl.cfg(5) also allows either the dddd:bb:ss.f or bb:ss.f format. A test has been added to check the conversion from xl.cfg to domXML. [1] https://www.redhat.com/archives/libvirt-users/2020-August/msg00040.html Signed-off-by: Jim Fehlig <jfehlig@suse.com> Reviewed-by: Daniel Henrique Barboza <danielhb413@gmail.com>
230 lines
5.6 KiB
C
230 lines
5.6 KiB
C
/*
|
|
* xmconfigtest.c: Test backend for xm_internal config file handling
|
|
*
|
|
* Copyright (C) 2007, 2010-2011, 2014 Red Hat, Inc.
|
|
*
|
|
* 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/>.
|
|
*
|
|
*/
|
|
|
|
#include <config.h>
|
|
|
|
#include <unistd.h>
|
|
|
|
#include "internal.h"
|
|
#include "datatypes.h"
|
|
#include "libxl/xen_xm.h"
|
|
#include "testutils.h"
|
|
#include "testutilsxen.h"
|
|
#include "viralloc.h"
|
|
#include "virstring.h"
|
|
#include "libxl/libxl_conf.h"
|
|
|
|
#define VIR_FROM_THIS VIR_FROM_NONE
|
|
|
|
static libxlDriverPrivatePtr driver;
|
|
|
|
static int
|
|
testCompareParseXML(const char *xmcfg, const char *xml)
|
|
{
|
|
char *gotxmcfgData = NULL;
|
|
g_autoptr(virConf) conf = NULL;
|
|
int ret = -1;
|
|
virConnectPtr conn = NULL;
|
|
int wrote = 4096;
|
|
virDomainDefPtr def = NULL;
|
|
|
|
if (VIR_ALLOC_N(gotxmcfgData, wrote) < 0)
|
|
goto fail;
|
|
|
|
conn = virGetConnect();
|
|
if (!conn) goto fail;
|
|
|
|
if (!(def = virDomainDefParseFile(xml, driver->xmlopt, NULL,
|
|
VIR_DOMAIN_DEF_PARSE_INACTIVE)))
|
|
goto fail;
|
|
|
|
if (!virDomainDefCheckABIStability(def, def, driver->xmlopt)) {
|
|
fprintf(stderr, "ABI stability check failed on %s", xml);
|
|
goto fail;
|
|
}
|
|
|
|
if (!(conf = xenFormatXM(conn, def)))
|
|
goto fail;
|
|
|
|
if (virConfWriteMem(gotxmcfgData, &wrote, conf) < 0)
|
|
goto fail;
|
|
gotxmcfgData[wrote] = '\0';
|
|
|
|
if (virTestCompareToFile(gotxmcfgData, xmcfg) < 0)
|
|
goto fail;
|
|
|
|
ret = 0;
|
|
|
|
fail:
|
|
VIR_FREE(gotxmcfgData);
|
|
virDomainDefFree(def);
|
|
virObjectUnref(conn);
|
|
|
|
return ret;
|
|
}
|
|
|
|
static int
|
|
testCompareFormatXML(const char *xmcfg, const char *xml)
|
|
{
|
|
char *xmcfgData = NULL;
|
|
char *gotxml = NULL;
|
|
g_autoptr(virConf) conf = NULL;
|
|
int ret = -1;
|
|
virDomainDefPtr def = NULL;
|
|
g_autoptr(libxlDriverConfig) cfg = libxlDriverConfigGet(driver);
|
|
|
|
if (virTestLoadFile(xmcfg, &xmcfgData) < 0)
|
|
goto fail;
|
|
|
|
if (!(conf = virConfReadString(xmcfgData, 0)))
|
|
goto fail;
|
|
|
|
if (!(def = xenParseXM(conf, cfg->caps, driver->xmlopt)))
|
|
goto fail;
|
|
|
|
if (!(gotxml = virDomainDefFormat(def, driver->xmlopt, VIR_DOMAIN_DEF_FORMAT_SECURE)))
|
|
goto fail;
|
|
|
|
if (virTestCompareToFile(gotxml, xml) < 0)
|
|
goto fail;
|
|
|
|
ret = 0;
|
|
|
|
fail:
|
|
VIR_FREE(xmcfgData);
|
|
VIR_FREE(gotxml);
|
|
virDomainDefFree(def);
|
|
|
|
return ret;
|
|
}
|
|
|
|
|
|
struct testInfo {
|
|
const char *name;
|
|
int mode;
|
|
};
|
|
|
|
static int
|
|
testCompareHelper(const void *data)
|
|
{
|
|
int result = -1;
|
|
const struct testInfo *info = data;
|
|
char *xml = NULL;
|
|
char *cfg = NULL;
|
|
|
|
xml = g_strdup_printf("%s/xmconfigdata/test-%s.xml", abs_srcdir, info->name);
|
|
cfg = g_strdup_printf("%s/xmconfigdata/test-%s.cfg", abs_srcdir, info->name);
|
|
|
|
if (info->mode == 0)
|
|
result = testCompareParseXML(cfg, xml);
|
|
else
|
|
result = testCompareFormatXML(cfg, xml);
|
|
|
|
VIR_FREE(xml);
|
|
VIR_FREE(cfg);
|
|
|
|
return result;
|
|
}
|
|
|
|
|
|
static int
|
|
mymain(void)
|
|
{
|
|
int ret = 0;
|
|
|
|
if (!(driver = testXLInitDriver()))
|
|
return EXIT_FAILURE;
|
|
|
|
#define DO_TEST_PARSE(name) \
|
|
do { \
|
|
struct testInfo info0 = { name, 0 }; \
|
|
if (virTestRun("Xen XM-2-XML Parse " name, \
|
|
testCompareHelper, &info0) < 0) \
|
|
ret = -1; \
|
|
} while (0)
|
|
|
|
|
|
#define DO_TEST_FORMAT(name) \
|
|
do { \
|
|
struct testInfo info1 = { name, 1 }; \
|
|
if (virTestRun("Xen XM-2-XML Format " name, \
|
|
testCompareHelper, &info1) < 0) \
|
|
ret = -1; \
|
|
} while (0)
|
|
|
|
|
|
#define DO_TEST(name) \
|
|
do { \
|
|
DO_TEST_PARSE(name); \
|
|
DO_TEST_FORMAT(name); \
|
|
} while (0)
|
|
|
|
DO_TEST("paravirt-new-pvfb");
|
|
DO_TEST("paravirt-new-pvfb-vncdisplay");
|
|
DO_TEST("paravirt-net-e1000");
|
|
DO_TEST("paravirt-net-fakemodel");
|
|
DO_TEST("paravirt-net-vifname");
|
|
DO_TEST("paravirt-vcpu");
|
|
DO_TEST("paravirt-maxvcpus");
|
|
DO_TEST_FORMAT("paravirt-root");
|
|
DO_TEST_FORMAT("paravirt-extra-root");
|
|
DO_TEST("fullvirt-new-cdrom");
|
|
DO_TEST("fullvirt-utc");
|
|
DO_TEST("fullvirt-localtime");
|
|
DO_TEST("fullvirt-usbtablet");
|
|
DO_TEST("fullvirt-usbmouse");
|
|
DO_TEST("fullvirt-serial-file");
|
|
DO_TEST("fullvirt-serial-null");
|
|
DO_TEST("fullvirt-serial-pipe");
|
|
DO_TEST("fullvirt-serial-pty");
|
|
DO_TEST("fullvirt-serial-stdio");
|
|
DO_TEST("fullvirt-serial-tcp");
|
|
DO_TEST("fullvirt-serial-tcp-telnet");
|
|
DO_TEST("fullvirt-serial-udp");
|
|
DO_TEST("fullvirt-serial-unix");
|
|
|
|
DO_TEST("fullvirt-force-hpet");
|
|
DO_TEST("fullvirt-force-nohpet");
|
|
DO_TEST("fullvirt-nohap");
|
|
|
|
DO_TEST("fullvirt-parallel-tcp");
|
|
|
|
DO_TEST("fullvirt-sound");
|
|
|
|
DO_TEST("fullvirt-net-netfront");
|
|
|
|
DO_TEST_FORMAT("fullvirt-default-feature");
|
|
|
|
DO_TEST("escape-paths");
|
|
DO_TEST("no-source-cdrom");
|
|
DO_TEST("pci-devs");
|
|
DO_TEST_FORMAT("pci-dev-syntax");
|
|
|
|
DO_TEST("disk-drv-blktap-raw");
|
|
DO_TEST("disk-drv-blktap2-raw");
|
|
|
|
testXLFreeDriver(driver);
|
|
|
|
return ret == 0 ? EXIT_SUCCESS : EXIT_FAILURE;
|
|
}
|
|
|
|
VIR_TEST_MAIN_PRELOAD(mymain, VIR_TEST_MOCK("xl"))
|