From a245abce436f4f333cadcadab65d5f677eb50e5d Mon Sep 17 00:00:00 2001 From: Peter Krempa Date: Sun, 4 Dec 2016 19:08:25 +0100 Subject: [PATCH] tests: hotplug: Add test infrastructure for testing qemu CPU hotplug code The cpu hotplug operation is rather complex so the testing code needs to provide quite lot of data and monitor conversations to successfully test it. The code mainly tests the selection of cpus according to the target count request. --- tests/qemuhotplugtest.c | 189 +++++++ .../x86-modern-bulk-domain.xml | 21 + .../x86-modern-bulk-monitor.json | 471 ++++++++++++++++++ .../x86-modern-bulk-result-conf.xml | 40 ++ .../x86-modern-bulk-result-live.xml | 48 ++ 5 files changed, 769 insertions(+) create mode 100644 tests/qemuhotplugtestcpus/x86-modern-bulk-domain.xml create mode 100644 tests/qemuhotplugtestcpus/x86-modern-bulk-monitor.json create mode 100644 tests/qemuhotplugtestcpus/x86-modern-bulk-result-conf.xml create mode 100644 tests/qemuhotplugtestcpus/x86-modern-bulk-result-live.xml diff --git a/tests/qemuhotplugtest.c b/tests/qemuhotplugtest.c index f0a8453947..af8c3fe01a 100644 --- a/tests/qemuhotplugtest.c +++ b/tests/qemuhotplugtest.c @@ -347,11 +347,187 @@ testQemuHotplug(const void *data) return ((ret < 0 && fail) || (!ret && !fail)) ? 0 : -1; } + +struct testQemuHotplugCpuData { + char *file_xml_dom; + char *file_xml_res_live; + char *file_xml_res_conf; + char *file_json_monitor; + + char *xml_dom; + + virDomainObjPtr vm; + qemuMonitorTestPtr mon; + bool modern; +}; + + +static void +testQemuHotplugCpuDataFree(struct testQemuHotplugCpuData *data) +{ + if (!data) + return; + + VIR_FREE(data->file_xml_dom); + VIR_FREE(data->file_xml_res_live); + VIR_FREE(data->file_xml_res_conf); + VIR_FREE(data->file_json_monitor); + + VIR_FREE(data->xml_dom); + + virObjectUnref(data->vm); + qemuMonitorTestFree(data->mon); +} + + +static struct testQemuHotplugCpuData * +testQemuHotplugCpuPrepare(const char *test, + bool modern) +{ + qemuDomainObjPrivatePtr priv = NULL; + virCapsPtr caps = NULL; + char *prefix = NULL; + struct testQemuHotplugCpuData *data = NULL; + + if (virAsprintf(&prefix, "%s/qemuhotplugtestcpus/%s", abs_srcdir, test) < 0) + return NULL; + + if (VIR_ALLOC(data) < 0) + goto error; + + data->modern = modern; + + if (virAsprintf(&data->file_xml_dom, "%s-domain.xml", prefix) < 0 || + virAsprintf(&data->file_xml_res_live, "%s-result-live.xml", prefix) < 0 || + virAsprintf(&data->file_xml_res_conf, "%s-result-conf.xml", prefix) < 0 || + virAsprintf(&data->file_json_monitor, "%s-monitor.json", prefix) < 0) + goto error; + + if (virTestLoadFile(data->file_xml_dom, &data->xml_dom) < 0) + goto error; + + if (qemuHotplugCreateObjects(driver.xmlopt, &data->vm, data->xml_dom, true, + "cpu-hotplug-test-domain") < 0) + goto error; + + if (!(caps = virQEMUDriverGetCapabilities(&driver, false))) + goto error; + + /* create vm->newDef */ + data->vm->persistent = true; + if (virDomainObjSetDefTransient(caps, driver.xmlopt, data->vm) < 0) + goto error; + + priv = data->vm->privateData; + + if (data->modern) + virQEMUCapsSet(priv->qemuCaps, QEMU_CAPS_QUERY_HOTPLUGGABLE_CPUS); + + if (!(data->mon = qemuMonitorTestNewFromFileFull(data->file_json_monitor, + &driver, data->vm))) + goto error; + + priv->mon = qemuMonitorTestGetMonitor(data->mon); + priv->monJSON = true; + virObjectUnlock(priv->mon); + + if (qemuDomainRefreshVcpuInfo(&driver, data->vm, 0, false) < 0) + goto error; + + return data; + + error: + virObjectUnref(caps); + testQemuHotplugCpuDataFree(data); + VIR_FREE(prefix); + return NULL; +} + + +static int +testQemuHotplugCpuFinalize(struct testQemuHotplugCpuData *data) +{ + int ret = -1; + char *activeXML = NULL; + char *configXML = NULL; + + if (data->file_xml_res_live) { + if (!(activeXML = virDomainDefFormat(data->vm->def, driver.caps, + VIR_DOMAIN_DEF_FORMAT_SECURE))) + goto cleanup; + + if (virTestCompareToFile(activeXML, data->file_xml_res_live) < 0) + goto cleanup; + } + + if (data->file_xml_res_conf) { + if (!(configXML = virDomainDefFormat(data->vm->newDef, driver.caps, + VIR_DOMAIN_DEF_FORMAT_SECURE | + VIR_DOMAIN_DEF_FORMAT_INACTIVE))) + goto cleanup; + + if (virTestCompareToFile(configXML, data->file_xml_res_conf) < 0) + goto cleanup; + } + + ret = 0; + + cleanup: + VIR_FREE(activeXML); + VIR_FREE(configXML); + return ret; +} + + +struct testQemuHotplugCpuParams { + const char *test; + int newcpus; + bool modern; + bool fail; +}; + + +static int +testQemuHotplugCpuGroup(const void *opaque) +{ + const struct testQemuHotplugCpuParams *params = opaque; + struct testQemuHotplugCpuData *data = NULL; + int ret = -1; + int rc; + + if (!(data = testQemuHotplugCpuPrepare(params->test, params->modern))) + return -1; + + rc = qemuDomainSetVcpusInternal(&driver, data->vm, data->vm->def, + data->vm->newDef, params->newcpus, + params->modern); + + if (params->fail) { + if (rc == 0) + fprintf(stderr, "cpu test '%s' should have failed\n", params->test); + else + ret = 0; + + goto cleanup; + } else { + if (rc < 0) + goto cleanup; + } + + ret = testQemuHotplugCpuFinalize(data); + + cleanup: + testQemuHotplugCpuDataFree(data); + return ret; +} + + static int mymain(void) { int ret = 0; struct qemuHotplugTestData data = {0}; + struct testQemuHotplugCpuParams cpudata; #if !WITH_YAJL fputs("libvirt not compiled with yajl, skipping this test\n", stderr); @@ -584,6 +760,19 @@ mymain(void) "device_del", QMP_OK, "object-del", QMP_OK); +#define DO_TEST_CPU_GROUP(prefix, vcpus, modernhp, expectfail) \ + do { \ + cpudata.test = prefix; \ + cpudata.newcpus = vcpus; \ + cpudata.modern = modernhp; \ + cpudata.fail = expectfail; \ + if (virTestRun("hotplug vcpus group " prefix, \ + testQemuHotplugCpuGroup, &cpudata) < 0) \ + ret = -1; \ + } while (0) + + DO_TEST_CPU_GROUP("x86-modern-bulk", 7, true, false); + qemuTestDriverFree(&driver); return (ret == 0) ? EXIT_SUCCESS : EXIT_FAILURE; } diff --git a/tests/qemuhotplugtestcpus/x86-modern-bulk-domain.xml b/tests/qemuhotplugtestcpus/x86-modern-bulk-domain.xml new file mode 100644 index 0000000000..1c2a5b1313 --- /dev/null +++ b/tests/qemuhotplugtestcpus/x86-modern-bulk-domain.xml @@ -0,0 +1,21 @@ + + QEMUGuest1 + c7a5fdbd-edaf-9455-926a-d65c16db1809 + 219100 + 219100 + 8 + + hvm + + + + + + + destroy + restart + destroy + + /usr/bin/qemu + + diff --git a/tests/qemuhotplugtestcpus/x86-modern-bulk-monitor.json b/tests/qemuhotplugtestcpus/x86-modern-bulk-monitor.json new file mode 100644 index 0000000000..4dcb6a2cf5 --- /dev/null +++ b/tests/qemuhotplugtestcpus/x86-modern-bulk-monitor.json @@ -0,0 +1,471 @@ +{"execute":"query-hotpluggable-cpus","id":"libvirt-1"} + +{ + "return": [ + { + "props": { + "core-id": 1, + "thread-id": 1, + "socket-id": 1 + }, + "vcpus-count": 1, + "type": "qemu64-x86_64-cpu" + }, + { + "props": { + "core-id": 1, + "thread-id": 0, + "socket-id": 1 + }, + "vcpus-count": 1, + "type": "qemu64-x86_64-cpu" + }, + { + "props": { + "core-id": 0, + "thread-id": 1, + "socket-id": 1 + }, + "vcpus-count": 1, + "type": "qemu64-x86_64-cpu" + }, + { + "props": { + "core-id": 0, + "thread-id": 0, + "socket-id": 1 + }, + "vcpus-count": 1, + "qom-path": "/machine/unattached/device[5]", + "type": "qemu64-x86_64-cpu" + }, + { + "props": { + "core-id": 1, + "thread-id": 1, + "socket-id": 0 + }, + "vcpus-count": 1, + "qom-path": "/machine/unattached/device[4]", + "type": "qemu64-x86_64-cpu" + }, + { + "props": { + "core-id": 1, + "thread-id": 0, + "socket-id": 0 + }, + "vcpus-count": 1, + "qom-path": "/machine/unattached/device[3]", + "type": "qemu64-x86_64-cpu" + }, + { + "props": { + "core-id": 0, + "thread-id": 1, + "socket-id": 0 + }, + "vcpus-count": 1, + "qom-path": "/machine/unattached/device[2]", + "type": "qemu64-x86_64-cpu" + }, + { + "props": { + "core-id": 0, + "thread-id": 0, + "socket-id": 0 + }, + "vcpus-count": 1, + "qom-path": "/machine/unattached/device[0]", + "type": "qemu64-x86_64-cpu" + } + ], + "id": "libvirt-23" +} + +{"execute":"query-cpus","id":"libvirt-2"} + +{ + "return": [ + { + "arch": "x86", + "current": true, + "CPU": 0, + "qom_path": "/machine/unattached/device[0]", + "pc": -2130415978, + "halted": true, + "thread_id": 518291 + }, + { + "arch": "x86", + "current": false, + "CPU": 1, + "qom_path": "/machine/unattached/device[2]", + "pc": -2130415978, + "halted": true, + "thread_id": 518292 + }, + { + "arch": "x86", + "current": false, + "CPU": 2, + "qom_path": "/machine/unattached/device[3]", + "pc": -2130415978, + "halted": true, + "thread_id": 518294 + }, + { + "arch": "x86", + "current": false, + "CPU": 3, + "qom_path": "/machine/unattached/device[4]", + "pc": -2130415978, + "halted": true, + "thread_id": 518295 + }, + { + "arch": "x86", + "current": false, + "CPU": 4, + "qom_path": "/machine/unattached/device[5]", + "pc": -2130415978, + "halted": true, + "thread_id": 518296 + } + ], + "id": "libvirt-22" +} + +{ + "execute": "device_add", + "arguments": { + "driver": "qemu64-x86_64-cpu", + "id": "vcpu5", + "socket-id": 1, + "core-id": 0, + "thread-id": 1 + }, + "id": "libvirt-3" +} + +{"return": {}} + +{"execute":"query-hotpluggable-cpus","id":"libvirt-4"} + +{ + "return": [ + { + "props": { + "core-id": 1, + "thread-id": 1, + "socket-id": 1 + }, + "vcpus-count": 1, + "type": "qemu64-x86_64-cpu" + }, + { + "props": { + "core-id": 1, + "thread-id": 0, + "socket-id": 1 + }, + "vcpus-count": 1, + "type": "qemu64-x86_64-cpu" + }, + { + "props": { + "core-id": 0, + "thread-id": 1, + "socket-id": 1 + }, + "vcpus-count": 1, + "qom-path": "/machine/peripheral/vcpu5", + "type": "qemu64-x86_64-cpu" + }, + { + "props": { + "core-id": 0, + "thread-id": 0, + "socket-id": 1 + }, + "vcpus-count": 1, + "qom-path": "/machine/unattached/device[5]", + "type": "qemu64-x86_64-cpu" + }, + { + "props": { + "core-id": 1, + "thread-id": 1, + "socket-id": 0 + }, + "vcpus-count": 1, + "qom-path": "/machine/unattached/device[4]", + "type": "qemu64-x86_64-cpu" + }, + { + "props": { + "core-id": 1, + "thread-id": 0, + "socket-id": 0 + }, + "vcpus-count": 1, + "qom-path": "/machine/unattached/device[3]", + "type": "qemu64-x86_64-cpu" + }, + { + "props": { + "core-id": 0, + "thread-id": 1, + "socket-id": 0 + }, + "vcpus-count": 1, + "qom-path": "/machine/unattached/device[2]", + "type": "qemu64-x86_64-cpu" + }, + { + "props": { + "core-id": 0, + "thread-id": 0, + "socket-id": 0 + }, + "vcpus-count": 1, + "qom-path": "/machine/unattached/device[0]", + "type": "qemu64-x86_64-cpu" + } + ], + "id": "libvirt-23" +} + +{"execute":"query-cpus","id":"libvirt-5"} + +{ + "return": [ + { + "arch": "x86", + "current": true, + "CPU": 0, + "qom_path": "/machine/unattached/device[0]", + "pc": -2130415978, + "halted": true, + "thread_id": 518291 + }, + { + "arch": "x86", + "current": false, + "CPU": 1, + "qom_path": "/machine/unattached/device[2]", + "pc": -2130415978, + "halted": true, + "thread_id": 518292 + }, + { + "arch": "x86", + "current": false, + "CPU": 2, + "qom_path": "/machine/unattached/device[3]", + "pc": -2130415978, + "halted": true, + "thread_id": 518294 + }, + { + "arch": "x86", + "current": false, + "CPU": 3, + "qom_path": "/machine/unattached/device[4]", + "pc": -2130415978, + "halted": true, + "thread_id": 518295 + }, + { + "arch": "x86", + "current": false, + "CPU": 4, + "qom_path": "/machine/unattached/device[5]", + "pc": -2130415978, + "halted": true, + "thread_id": 518296 + }, + { + "arch": "x86", + "current": false, + "CPU": 5, + "qom_path": "/machine/peripheral/vcpu5", + "pc": -2130415978, + "halted": true, + "thread_id": 518297 + } + ], + "id": "libvirt-22" +} + +{ + "execute": "device_add", + "arguments": { + "driver": "qemu64-x86_64-cpu", + "id": "vcpu6", + "socket-id": 1, + "core-id": 1, + "thread-id": 0 + }, + "id": "libvirt-6" +} + +{"return": {}} + +{"execute":"query-hotpluggable-cpus","id":"libvirt-7"} + +{ + "return": [ + { + "props": { + "core-id": 1, + "thread-id": 1, + "socket-id": 1 + }, + "vcpus-count": 1, + "type": "qemu64-x86_64-cpu" + }, + { + "props": { + "core-id": 1, + "thread-id": 0, + "socket-id": 1 + }, + "vcpus-count": 1, + "qom-path": "/machine/peripheral/vcpu6", + "type": "qemu64-x86_64-cpu" + }, + { + "props": { + "core-id": 0, + "thread-id": 1, + "socket-id": 1 + }, + "vcpus-count": 1, + "qom-path": "/machine/peripheral/vcpu5", + "type": "qemu64-x86_64-cpu" + }, + { + "props": { + "core-id": 0, + "thread-id": 0, + "socket-id": 1 + }, + "vcpus-count": 1, + "qom-path": "/machine/unattached/device[5]", + "type": "qemu64-x86_64-cpu" + }, + { + "props": { + "core-id": 1, + "thread-id": 1, + "socket-id": 0 + }, + "vcpus-count": 1, + "qom-path": "/machine/unattached/device[4]", + "type": "qemu64-x86_64-cpu" + }, + { + "props": { + "core-id": 1, + "thread-id": 0, + "socket-id": 0 + }, + "vcpus-count": 1, + "qom-path": "/machine/unattached/device[3]", + "type": "qemu64-x86_64-cpu" + }, + { + "props": { + "core-id": 0, + "thread-id": 1, + "socket-id": 0 + }, + "vcpus-count": 1, + "qom-path": "/machine/unattached/device[2]", + "type": "qemu64-x86_64-cpu" + }, + { + "props": { + "core-id": 0, + "thread-id": 0, + "socket-id": 0 + }, + "vcpus-count": 1, + "qom-path": "/machine/unattached/device[0]", + "type": "qemu64-x86_64-cpu" + } + ], + "id": "libvirt-23" +} + +{"execute":"query-cpus","id":"libvirt-8"} + +{ + "return": [ + { + "arch": "x86", + "current": true, + "CPU": 0, + "qom_path": "/machine/unattached/device[0]", + "pc": -2130415978, + "halted": true, + "thread_id": 518291 + }, + { + "arch": "x86", + "current": false, + "CPU": 1, + "qom_path": "/machine/unattached/device[2]", + "pc": -2130415978, + "halted": true, + "thread_id": 518292 + }, + { + "arch": "x86", + "current": false, + "CPU": 2, + "qom_path": "/machine/unattached/device[3]", + "pc": -2130415978, + "halted": true, + "thread_id": 518294 + }, + { + "arch": "x86", + "current": false, + "CPU": 3, + "qom_path": "/machine/unattached/device[4]", + "pc": -2130415978, + "halted": true, + "thread_id": 518295 + }, + { + "arch": "x86", + "current": false, + "CPU": 4, + "qom_path": "/machine/unattached/device[5]", + "pc": -2130415978, + "halted": true, + "thread_id": 518296 + }, + { + "arch": "x86", + "current": false, + "CPU": 5, + "qom_path": "/machine/peripheral/vcpu5", + "pc": -2130415978, + "halted": true, + "thread_id": 518297 + }, + { + "arch": "x86", + "current": false, + "CPU": 6, + "qom_path": "/machine/peripheral/vcpu6", + "pc": -2130415978, + "halted": true, + "thread_id": 518298 + } + ], + "id": "libvirt-22" +} diff --git a/tests/qemuhotplugtestcpus/x86-modern-bulk-result-conf.xml b/tests/qemuhotplugtestcpus/x86-modern-bulk-result-conf.xml new file mode 100644 index 0000000000..5c1d18b8fc --- /dev/null +++ b/tests/qemuhotplugtestcpus/x86-modern-bulk-result-conf.xml @@ -0,0 +1,40 @@ + + QEMUGuest1 + c7a5fdbd-edaf-9455-926a-d65c16db1809 + 219100 + 219100 + 8 + + + + + + + + + + + + hvm + + + + + + + destroy + restart + destroy + + /usr/bin/qemu + +
+ + + + + +
+ + + diff --git a/tests/qemuhotplugtestcpus/x86-modern-bulk-result-live.xml b/tests/qemuhotplugtestcpus/x86-modern-bulk-result-live.xml new file mode 100644 index 0000000000..50fd9eab61 --- /dev/null +++ b/tests/qemuhotplugtestcpus/x86-modern-bulk-result-live.xml @@ -0,0 +1,48 @@ + + QEMUGuest1 + c7a5fdbd-edaf-9455-926a-d65c16db1809 + 219100 + 219100 + 8 + + + + + + + + + + + + hvm + + + + + + + destroy + restart + destroy + + /usr/bin/qemu + + +
+ + + + + + + + + + + + +
+ + +