[libvirt] [PATCH v2 09/11] tests: hotplug: Add test infrastructure for testing qemu CPU hotplug code
Pavel Hrdina
phrdina at redhat.com
Thu Jan 12 14:32:44 UTC 2017
On Wed, Jan 11, 2017 at 10:48:19AM +0100, Peter Krempa wrote:
> 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 +++++++++
> .../qemuhotplugtestcpus/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 f0a845394..32aaf5718 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);
I would put apostrophes around %s.
ACK
Pavel
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 833 bytes
Desc: Digital signature
URL: <http://listman.redhat.com/archives/libvir-list/attachments/20170112/a5deb06d/attachment-0001.sig>
More information about the libvir-list
mailing list