The test suite files contain alot of boilerplate duplicated code. With a few more macros I can significantly cut down the size of the test code. I also change abs_top_srcdir to abs_srcdir, and automatically initialize it to 'getcwd' if the env variable is missing. This lets me run the test cases directly, rather than having to go via 'make check'. statstest.c | 207 ++++++++++++++++++++++------------------------------- test_conf.sh | 16 +++- xencapstest.c | 10 -- xmconfigtest.c | 220 ++++++++++++--------------------------------------------- 4 files changed, 149 insertions(+), 304 deletions(-) Dan. Index: statstest.c =================================================================== RCS file: /data/cvs/libvirt/tests/statstest.c,v retrieving revision 1.5 diff -u -p -r1.5 statstest.c --- statstest.c 10 Apr 2008 16:53:29 -0000 1.5 +++ statstest.c 18 Apr 2008 00:29:55 -0000 @@ -7,6 +7,8 @@ #include "stats_linux.h" #include "internal.h" +#include "testutils.h" + #if WITH_XEN static void testQuietError(void *userData ATTRIBUTE_UNUSED, virErrorPtr error ATTRIBUTE_UNUSED) @@ -21,13 +23,26 @@ static int testDevice(const char *path, int actual = xenLinuxDomainDeviceID(NULL, 1, path); if (actual == expect) { - fprintf(stderr, "%-14s == %-6d OK\n", path, expect); return 0; } else { - fprintf(stderr, "%-14s == %-6d (%-6d) FAILED\n", path, expect, actual); + if (getenv("DEBUG_TESTS")) + fprintf(stderr, "Expect %-6d Actual %-6d\n", expect, actual); return -1; } } + +struct testInfo +{ + const char *dev; + int num; +}; + +static int testDeviceHelper(const void *data) +{ + const struct testInfo *info = data; + return testDevice(info->dev, info->num); +} + #endif int @@ -42,85 +57,67 @@ main(void) if (!getenv("DEBUG_TESTS")) virSetErrorFunc(NULL, testQuietError); +#define DO_TEST(dev, num) \ + do { \ + struct testInfo info = { dev, num }; \ + if (virtTestRun("Device " dev " -> " # num, \ + 1, testDeviceHelper, &info) < 0) \ + ret = -1; \ + } while (0) + /******************************** * Xen paravirt disks ********************************/ /* first valid disk */ - if (testDevice("xvda", 51712) < 0) - ret = -1; - if (testDevice("xvda1", 51713) < 0) - ret = -1; - if (testDevice("xvda15", 51727) < 0) - ret = -1; + DO_TEST("xvda", 51712); + DO_TEST("xvda1", 51713); + DO_TEST("xvda15", 51727); /* Last valid disk */ - if (testDevice("xvdp", 51952) < 0) - ret = -1; - if (testDevice("xvdp1", 51953) < 0) - ret = -1; - if (testDevice("xvdp15", 51967) < 0) - ret = -1; + DO_TEST("xvdp", 51952); + DO_TEST("xvdp1", 51953); + DO_TEST("xvdp15", 51967); /* Disk letter to large */ - if (testDevice("xvdq", -1) < 0) - ret = -1; + DO_TEST("xvdq", -1); /* missing disk letter */ - if (testDevice("xvd1", -1) < 0) - ret = -1; + DO_TEST("xvd1", -1); /* partition to large */ - if (testDevice("xvda16", -1) < 0) - ret = -1; + DO_TEST("xvda16", -1); /* partition to small */ - if (testDevice("xvda0", -1) < 0) - ret = -1; + DO_TEST("xvda0", -1); /* leading zeros */ - if (testDevice("xvda01", -1) < 0) - ret = -1; + DO_TEST("xvda01", -1); /* leading + */ - if (testDevice("xvda+1", -1) < 0) - ret = -1; + DO_TEST("xvda+1", -1); /* leading - */ - if (testDevice("xvda-1", -1) < 0) - ret = -1; + DO_TEST("xvda-1", -1); /******************************** * IDE disks ********************************/ /* odd numbered disk */ - if (testDevice("hda", 768) < 0) - ret = -1; - if (testDevice("hda1", 769) < 0) - ret = -1; - if (testDevice("hda63", 831) < 0) - ret = -1; + DO_TEST("hda", 768); + DO_TEST("hda1", 769); + DO_TEST("hda63", 831); /* even number disk */ - if (testDevice("hdd", 5695) < 0) - ret = -1; - if (testDevice("hdd1", 5696) < 0) - ret = -1; - if (testDevice("hdd63", 5758) < 0) - ret = -1; + DO_TEST("hdd", 5695); + DO_TEST("hdd1", 5696); + DO_TEST("hdd63", 5758); /* last valid disk */ - if (testDevice("hdt", 23359) < 0) - ret = -1; - if (testDevice("hdt1", 23360) < 0) - ret = -1; - if (testDevice("hdt63", 23422) < 0) - ret = -1; + DO_TEST("hdt", 23359); + DO_TEST("hdt1", 23360); + DO_TEST("hdt63", 23422); /* Disk letter to large */ - if (testDevice("hdu", -1) < 0) - ret = -1; + DO_TEST("hdu", -1); /* missing disk letter */ - if (testDevice("hd1", -1) < 0) - ret = -1; + DO_TEST("hd1", -1); /* partition to large */ - if (testDevice("hda64", -1) < 0) - ret = -1; + DO_TEST("hda64", -1); /* partition to small */ - if (testDevice("hda0", -1) < 0) - ret = -1; + DO_TEST("hda0", -1); @@ -129,89 +126,55 @@ main(void) ********************************/ /* first valid disk */ - if (testDevice("sda", 2048) < 0) - ret = -1; - if (testDevice("sda1", 2049) < 0) - ret = -1; - if (testDevice("sda15", 2063) < 0) - ret = -1; + DO_TEST("sda", 2048); + DO_TEST("sda1", 2049); + DO_TEST("sda15", 2063); /* last valid disk of first SCSI major number */ - if (testDevice("sdp", 2288) < 0) - ret = -1; - if (testDevice("sdp1", 2289) < 0) - ret = -1; - if (testDevice("sdp15", 2303) < 0) - ret = -1; + DO_TEST("sdp", 2288); + DO_TEST("sdp1", 2289); + DO_TEST("sdp15", 2303); /* first valid disk of second SCSI major number */ - if (testDevice("sdq", 16640) < 0) - ret = -1; - if (testDevice("sdq1", 16641) < 0) - ret = -1; - if (testDevice("sdq15", 16655) < 0) - ret = -1; + DO_TEST("sdq", 16640); + DO_TEST("sdq1", 16641); + DO_TEST("sdq15", 16655); /* last valid single letter disk */ - if (testDevice("sdz", 16784) < 0) - ret = -1; - if (testDevice("sdz1", 16785) < 0) - ret = -1; - if (testDevice("sdz15", 16799) < 0) - ret = -1; + DO_TEST("sdz", 16784); + DO_TEST("sdz1", 16785); + DO_TEST("sdz15", 16799); /* first valid dual letter disk */ - if (testDevice("sdaa", 16800) < 0) - ret = -1; - if (testDevice("sdaa1", 16801) < 0) - ret = -1; - if (testDevice("sdaa15", 16815) < 0) - ret = -1; + DO_TEST("sdaa", 16800); + DO_TEST("sdaa1", 16801); + DO_TEST("sdaa15", 16815); /* second valid dual letter disk */ - if (testDevice("sdab", 16816) < 0) - ret = -1; - if (testDevice("sdab1", 16817) < 0) - ret = -1; - if (testDevice("sdab15", 16831) < 0) - ret = -1; + DO_TEST("sdab", 16816); + DO_TEST("sdab1", 16817); + DO_TEST("sdab15", 16831); /* first letter of second sequence of dual letter disk */ - if (testDevice("sdba", 17216) < 0) - ret = -1; - if (testDevice("sdba1", 17217) < 0) - ret = -1; - if (testDevice("sdba15", 17231) < 0) - ret = -1; + DO_TEST("sdba", 17216); + DO_TEST("sdba1", 17217); + DO_TEST("sdba15", 17231); /* last valid dual letter disk */ - if (testDevice("sdiv", 34800) < 0) - ret = -1; - if (testDevice("sdiv1", 34801) < 0) - ret = -1; - if (testDevice("sdiv15", 34815) < 0) - ret = -1; + DO_TEST("sdiv", 34800); + DO_TEST("sdiv1", 34801); + DO_TEST("sdiv15", 34815); /* Disk letter to large */ - if (testDevice("sdix", -1) < 0) - ret = -1; + DO_TEST("sdix", -1); /* missing disk letter */ - if (testDevice("sd1", -1) < 0) - ret = -1; + DO_TEST("sd1", -1); /* partition to large */ - if (testDevice("sda16", -1) < 0) - ret = -1; + DO_TEST("sda16", -1); /* partition to small */ - if (testDevice("sda0", -1) < 0) - ret = -1; + DO_TEST("sda0", -1); /* Path stripping */ - if (testDevice("/dev", -1) < 0) - ret = -1; - if (testDevice("/dev/", -1) < 0) - ret = -1; - if (testDevice("/dev/xvd", -1) < 0) - ret = -1; - if (testDevice("/dev/xvda", 51712) < 0) - ret = -1; - if (testDevice("/dev/xvda1", 51713) < 0) - ret = -1; - if (testDevice("/dev/xvda15", 51727) < 0) - ret = -1; + DO_TEST("/dev", -1); + DO_TEST("/dev/", -1); + DO_TEST("/dev/xvd", -1); + DO_TEST("/dev/xvda", 51712); + DO_TEST("/dev/xvda1", 51713); + DO_TEST("/dev/xvda15", 51727); #endif exit(ret==0 ? EXIT_SUCCESS : EXIT_FAILURE); Index: test_conf.sh =================================================================== RCS file: /data/cvs/libvirt/tests/test_conf.sh,v retrieving revision 1.4 diff -u -p -r1.4 test_conf.sh --- test_conf.sh 5 Feb 2008 19:27:37 -0000 1.4 +++ test_conf.sh 18 Apr 2008 00:29:55 -0000 @@ -1,8 +1,15 @@ #!/bin/bash -set -x +#set -x +set -e +if [ -z "$abs_srcdir" ]; then + abs_srcdir=`pwd` +fi + NOK=0 -for f in $abs_top_srcdir/tests/confdata/*.conf +i=1 +for f in $abs_srcdir/confdata/*.conf do + n=`echo $f | sed -e "s,$abs_srcdir/confdata/,,"` ./conftest $f > conftest.$$ outfile=`echo "$f" | sed s+\.conf$+\.out+` diff $outfile conftest.$$ > /dev/null @@ -11,11 +18,12 @@ do if [ -n "$DEBUG_TESTS" ]; then diff -u $outfile conftest.$$ fi - echo "$f FAILED" + printf "%2d) %-60s ... %s\n" $i $n "FAILED" NOK=1 else - echo "$f OK" + printf "%2d) %-60s ... %s\n" $i $n "OK" fi + i=`expr $i + 1` done rm -f conftest.$$ exit $NOK Index: xencapstest.c =================================================================== RCS file: /data/cvs/libvirt/tests/xencapstest.c,v retrieving revision 1.11 diff -u -p -r1.11 xencapstest.c --- xencapstest.c 10 Apr 2008 16:54:54 -0000 1.11 +++ xencapstest.c 18 Apr 2008 00:29:56 -0000 @@ -50,14 +50,10 @@ static int testCompareFiles(const char * if (!(actualxml = xenHypervisorMakeCapabilitiesXML(NULL, hostmachine, fp1, fp2))) goto fail; - if (getenv("DEBUG_TESTS") && - STRNEQ(expectxml, actualxml)) { - printf("In test file %s:\n", capabilities); - printf("Expect %d '%s'\n", (int)strlen(expectxml), expectxml); - printf("Actual %d '%s'\n", (int)strlen(actualxml), actualxml); + if (STRNEQ(expectxml, actualxml)) { + virtTestDifference(stderr, expectxml, actualxml); + goto fail; } - if (strcmp(expectxml, actualxml)) - goto fail; ret = 0; Index: xmconfigtest.c =================================================================== RCS file: /data/cvs/libvirt/tests/xmconfigtest.c,v retrieving revision 1.13 diff -u -p -r1.13 xmconfigtest.c --- xmconfigtest.c 10 Apr 2008 16:53:29 -0000 1.13 +++ xmconfigtest.c 18 Apr 2008 00:29:56 -0000 @@ -25,6 +25,7 @@ #include <stdio.h> #include <string.h> +#include <unistd.h> #ifdef WITH_XEN @@ -35,11 +36,11 @@ #include "conf.h" static char *progname; -static char *abs_top_srcdir; +static char *abs_srcdir; #define MAX_FILE 4096 -static int testCompareParseXML(const char *xmcfg_rel, const char *xml_rel, +static int testCompareParseXML(const char *xmcfg, const char *xml, int xendConfigVersion) { char xmlData[MAX_FILE]; char xmcfgData[MAX_FILE]; @@ -53,11 +54,6 @@ static int testCompareParseXML(const cha int wrote = MAX_FILE; void *old_priv = NULL; struct _xenUnifiedPrivate priv; - char xmcfg[PATH_MAX]; - char xml[PATH_MAX]; - - snprintf(xmcfg, sizeof xmcfg - 1, "%s/tests/%s", abs_top_srcdir, xmcfg_rel); - snprintf(xml, sizeof xml - 1, "%s/tests/%s", abs_top_srcdir, xml_rel); conn = virConnectOpenReadOnly("test:///default"); if (!conn) goto fail; @@ -80,11 +76,8 @@ static int testCompareParseXML(const cha goto fail; gotxmcfgPtr[wrote] = '\0'; - if (strcmp(xmcfgData, gotxmcfgData)) { - if (getenv("DEBUG_TESTS")) { - printf("Expect %d '%s'\n", (int)strlen(xmcfgData), xmcfgData); - printf("Actual %d '%s'\n", (int)strlen(gotxmcfgData), gotxmcfgData); - } + if (STRNEQ(xmcfgData, gotxmcfgData)) { + virtTestDifference(stderr, xmcfgData, gotxmcfgData); goto fail; } @@ -102,7 +95,7 @@ static int testCompareParseXML(const cha return ret; } -static int testCompareFormatXML(const char *xmcfg_rel, const char *xml_rel, +static int testCompareFormatXML(const char *xmcfg, const char *xml, int xendConfigVersion) { char xmlData[MAX_FILE]; char xmcfgData[MAX_FILE]; @@ -114,11 +107,6 @@ static int testCompareFormatXML(const ch virConnectPtr conn; void *old_priv; struct _xenUnifiedPrivate priv; - char xmcfg[PATH_MAX]; - char xml[PATH_MAX]; - - snprintf(xmcfg, sizeof xmcfg - 1, "%s/tests/%s", abs_top_srcdir, xmcfg_rel); - snprintf(xml, sizeof xml - 1, "%s/tests/%s", abs_top_srcdir, xml_rel); conn = virConnectOpenReadOnly("test:///default"); if (!conn) goto fail; @@ -163,102 +151,25 @@ static int testCompareFormatXML(const ch return ret; } -static int testCompareParavirtOldPVFBFormat(const void *data ATTRIBUTE_UNUSED) { - return testCompareFormatXML("xmconfigdata/test-paravirt-old-pvfb.cfg", - "xmconfigdata/test-paravirt-old-pvfb.xml", - 2); -} -static int testCompareParavirtOldPVFBParse(const void *data ATTRIBUTE_UNUSED) { - return testCompareParseXML("xmconfigdata/test-paravirt-old-pvfb.cfg", - "xmconfigdata/test-paravirt-old-pvfb.xml", - 2); -} - -static int testCompareParavirtNewPVFBFormat(const void *data ATTRIBUTE_UNUSED) { - return testCompareFormatXML("xmconfigdata/test-paravirt-new-pvfb.cfg", - "xmconfigdata/test-paravirt-new-pvfb.xml", - 3); -} -static int testCompareParavirtNewPVFBParse(const void *data ATTRIBUTE_UNUSED) { - return testCompareParseXML("xmconfigdata/test-paravirt-new-pvfb.cfg", - "xmconfigdata/test-paravirt-new-pvfb.xml", - 3); -} - -static int testCompareFullvirtOldCDROMFormat(const void *data ATTRIBUTE_UNUSED) { - return testCompareFormatXML("xmconfigdata/test-fullvirt-old-cdrom.cfg", - "xmconfigdata/test-fullvirt-old-cdrom.xml", - 1); -} -static int testCompareFullvirtOldCDROMParse(const void *data ATTRIBUTE_UNUSED) { - return testCompareParseXML("xmconfigdata/test-fullvirt-old-cdrom.cfg", - "xmconfigdata/test-fullvirt-old-cdrom.xml", - 1); -} - -static int testCompareFullvirtNewCDROMFormat(const void *data ATTRIBUTE_UNUSED) { - return testCompareFormatXML("xmconfigdata/test-fullvirt-new-cdrom.cfg", - "xmconfigdata/test-fullvirt-new-cdrom.xml", - 2); -} -static int testCompareFullvirtNewCDROMParse(const void *data ATTRIBUTE_UNUSED) { - return testCompareParseXML("xmconfigdata/test-fullvirt-new-cdrom.cfg", - "xmconfigdata/test-fullvirt-new-cdrom.xml", - 2); -} - -static int testCompareFullvirtClockUTCFormat(const void *data ATTRIBUTE_UNUSED) { - return testCompareFormatXML("xmconfigdata/test-fullvirt-utc.cfg", - "xmconfigdata/test-fullvirt-utc.xml", - 2); -} -static int testCompareFullvirtClockUTCParse(const void *data ATTRIBUTE_UNUSED) { - return testCompareParseXML("xmconfigdata/test-fullvirt-utc.cfg", - "xmconfigdata/test-fullvirt-utc.xml", - 2); -} - -static int testCompareFullvirtClockLocaltimeFormat(const void *data ATTRIBUTE_UNUSED) { - return testCompareFormatXML("xmconfigdata/test-fullvirt-localtime.cfg", - "xmconfigdata/test-fullvirt-localtime.xml", - 2); -} - -static int testCompareFullvirtClockLocaltimeParse(const void *data ATTRIBUTE_UNUSED) { - return testCompareParseXML("xmconfigdata/test-fullvirt-localtime.cfg", - "xmconfigdata/test-fullvirt-localtime.xml", - 2); -} - -static int testCompareFullvirtInputUSBTabletFormat(const void *data ATTRIBUTE_UNUSED) { - return testCompareFormatXML("xmconfigdata/test-fullvirt-usbtablet.cfg", - "xmconfigdata/test-fullvirt-usbtablet.xml", - 2); -} +struct testInfo { + const char *name; + int version; + int mode; +}; -static int testCompareFullvirtInputUSBTabletParse(const void *data ATTRIBUTE_UNUSED) { - return testCompareParseXML("xmconfigdata/test-fullvirt-usbtablet.cfg", - "xmconfigdata/test-fullvirt-usbtablet.xml", - 2); -} - -static int testCompareFullvirtInputUSBTabletNoBusParse(const void *data ATTRIBUTE_UNUSED) { - return testCompareParseXML("xmconfigdata/test-fullvirt-usbtablet.cfg", - "xmconfigdata/test-fullvirt-usbtablet-no-bus.xml", - 2); -} - -static int testCompareFullvirtInputUSBMouseFormat(const void *data ATTRIBUTE_UNUSED) { - return testCompareParseXML("xmconfigdata/test-fullvirt-usbmouse.cfg", - "xmconfigdata/test-fullvirt-usbmouse.xml", - 2); -} - -static int testCompareFullvirtInputUSBMouseParse(const void *data ATTRIBUTE_UNUSED) { - return testCompareParseXML("xmconfigdata/test-fullvirt-usbmouse.cfg", - "xmconfigdata/test-fullvirt-usbmouse.xml", - 2); +static int testCompareHelper(const void *data) { + const struct testInfo *info = data; + char xml[PATH_MAX]; + char cfg[PATH_MAX]; + snprintf(xml, PATH_MAX, "%s/xmconfigdata/test-%s.xml", + abs_srcdir, info->name); + snprintf(cfg, PATH_MAX, "%s/xmconfigdata/test-%s.cfg", + abs_srcdir, info->name); + if (info->mode == 0) + return testCompareParseXML(cfg, xml, info->version); + else + return testCompareFormatXML(cfg, xml, info->version); } @@ -266,6 +177,7 @@ int main(int argc, char **argv) { int ret = 0; + char cwd[PATH_MAX]; progname = argv[0]; @@ -274,65 +186,31 @@ main(int argc, char **argv) exit(EXIT_FAILURE); } - abs_top_srcdir = getenv("abs_top_srcdir"); - if (!abs_top_srcdir) - return 1; - - /* Config -> XML */ - if (virtTestRun("Paravirt old PVFB (Format)", - 1, testCompareParavirtOldPVFBFormat, NULL) != 0) - ret = -1; - if (virtTestRun("Paravirt new PVFB (Format)", - 1, testCompareParavirtNewPVFBFormat, NULL) != 0) - ret = -1; - if (virtTestRun("Fullvirt old PVFB (Format)", - 1, testCompareFullvirtOldCDROMFormat, NULL) != 0) - ret = -1; - if (virtTestRun("Fullvirt new PVFB (Format)", - 1, testCompareFullvirtNewCDROMFormat, NULL) != 0) - ret = -1; - if (virtTestRun("Fullvirt clock Localtime (Format)", - 1, testCompareFullvirtClockLocaltimeFormat, NULL) != 0) - ret = -1; - if (virtTestRun("Fullvirt clock UTC (Format)", - 1, testCompareFullvirtClockUTCFormat, NULL) != 0) - ret = -1; - if (virtTestRun("Fullvirt USB mouse (Format)", - 1, testCompareFullvirtInputUSBMouseFormat, NULL) != 0) - ret = -1; - if (virtTestRun("Fullvirt USB tablet (Format)", - 1, testCompareFullvirtInputUSBTabletFormat, NULL) != 0) - ret = -1; - - /* XML -> Config */ - if (virtTestRun("Paravirt old PVFB (Parse)", - 1, testCompareParavirtOldPVFBParse, NULL) != 0) - ret = -1; - if (virtTestRun("Paravirt new PVFB (Parse)", - 1, testCompareParavirtNewPVFBParse, NULL) != 0) - ret = -1; - if (virtTestRun("Fullvirt old PVFB (Parse)", - 1, testCompareFullvirtOldCDROMParse, NULL) != 0) - ret = -1; - if (virtTestRun("Fullvirt new PVFB (Parse)", - 1, testCompareFullvirtNewCDROMParse, NULL) != 0) - ret = -1; - if (virtTestRun("Fullvirt clock Localtime (Parse)", - 1, testCompareFullvirtClockLocaltimeParse, NULL) != 0) - ret = -1; - if (virtTestRun("Fullvirt clock UTC (Parse)", - 1, testCompareFullvirtClockUTCParse, NULL) != 0) - ret = -1; - if (virtTestRun("Fullvirt USB mouse (Parse)", - 1, testCompareFullvirtInputUSBMouseParse, NULL) != 0) - ret = -1; - if (virtTestRun("Fullvirt USB tablet (Parse)", - 1, testCompareFullvirtInputUSBTabletParse, NULL) != 0) - ret = -1; - if (virtTestRun("Fullvirt USB tablet no bus (Parse)", - 1, testCompareFullvirtInputUSBTabletNoBusParse, NULL) != 0) - ret = -1; - + abs_srcdir = getenv("abs_srcdir"); + if (!abs_srcdir) + abs_srcdir = getcwd(cwd, sizeof(cwd)); + + +#define DO_TEST(name, version) \ + do { \ + struct testInfo info0 = { name, version, 0 }; \ + struct testInfo info1 = { name, version, 1 }; \ + if (virtTestRun("Xen XM-2-XML Parse " name, \ + 1, testCompareHelper, &info0) < 0) \ + ret = -1; \ + if (virtTestRun("Xen XM-2-XML Format " name, \ + 1, testCompareHelper, &info1) < 0) \ + ret = -1; \ + } while (0) + + DO_TEST("paravirt-old-pvfb", 2); + DO_TEST("paravirt-new-pvfb", 3); + DO_TEST("fullvirt-old-cdrom", 1); + DO_TEST("fullvirt-new-cdrom", 2); + DO_TEST("fullvirt-utc", 2); + DO_TEST("fullvirt-localtime", 2); + DO_TEST("fullvirt-usbtablet", 2); + DO_TEST("fullvirt-usbmouse", 2); exit(ret==0 ? EXIT_SUCCESS : EXIT_FAILURE); } -- |: Red Hat, Engineering, Boston -o- http://people.redhat.com/berrange/ :| |: http://libvirt.org -o- http://virt-manager.org -o- http://ovirt.org :| |: http://autobuild.org -o- http://search.cpan.org/~danberr/ :| |: GnuPG: 7D3B9505 -o- F3C9 553F A1DA 4AC2 5648 23C1 B3DF F742 7D3B 9505 :| -- Libvir-list mailing list Libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list