From nobody Mon Feb 9 12:27:16 2026 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of redhat.com designates 216.205.24.124 as permitted sender) client-ip=216.205.24.124; envelope-from=libvir-list-bounces@redhat.com; helo=us-smtp-delivery-124.mimecast.com; Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of redhat.com designates 216.205.24.124 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1613735963; cv=none; d=zohomail.com; s=zohoarc; b=U8sxLcchufuVKFVWFRYjOvLuPbCfO7OM2leMORWzomYqX+rHqL6o+FQ8OSReLrZFjgvnU8TaUf8bgztJmJlXkqUsuzjIQ0G2rwx9vIXZmSQu/erXarESyx95emZZdV5TiGhbe96vIilWEnqgqeTe/TE2xJ7gxw4OY48HSakmRRo= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1613735963; h=Content-Type:Content-Transfer-Encoding:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=/Cpn7EyxUUaFpDOCKVc0flB2ZKWuHrfDyq/rjb9YJoY=; b=HNX8Eo5VVpk3G5GkVBaaVP2NERAYRo6w/vze2k8ZJBVgT0rp1xn3rveDsOMOGR2MJMCL28YN79n8kgBhQqyGpFPkRZWE+u2Te9f5i7/DL4V3fCBAcfZ1aGTGoaWcdfu6ulVU1p5aDhhK4n2/DrQytvexjNt7zi5N888MMnetHiY= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of redhat.com designates 216.205.24.124 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=pass header.from= (p=none dis=none) header.from= Return-Path: Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [216.205.24.124]) by mx.zohomail.com with SMTPS id 1613735962877610.9230949895103; Fri, 19 Feb 2021 03:59:22 -0800 (PST) Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-209-C8FYGe40MD-FAe-BvfVY6A-1; Fri, 19 Feb 2021 06:59:19 -0500 Received: from smtp.corp.redhat.com (int-mx03.intmail.prod.int.phx2.redhat.com [10.5.11.13]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id DBDFCCE642; Fri, 19 Feb 2021 11:59:12 +0000 (UTC) Received: from colo-mx.corp.redhat.com (colo-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.21]) by smtp.corp.redhat.com (Postfix) with ESMTPS id B463060918; Fri, 19 Feb 2021 11:59:12 +0000 (UTC) Received: from lists01.pubmisc.prod.ext.phx2.redhat.com (lists01.pubmisc.prod.ext.phx2.redhat.com [10.5.19.33]) by colo-mx.corp.redhat.com (Postfix) with ESMTP id 787A95807F; Fri, 19 Feb 2021 11:59:12 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx03.intmail.prod.int.phx2.redhat.com [10.5.11.13]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id 11JBx84h008558 for ; Fri, 19 Feb 2021 06:59:08 -0500 Received: by smtp.corp.redhat.com (Postfix) id B6A3E60918; Fri, 19 Feb 2021 11:59:08 +0000 (UTC) Received: from speedmetal.lan (unknown [10.40.208.53]) by smtp.corp.redhat.com (Postfix) with ESMTP id 139EF60CD7 for ; Fri, 19 Feb 2021 11:59:04 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1613735961; h=from:from:sender:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:mime-version:mime-version: content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references:list-id:list-help: list-unsubscribe:list-subscribe:list-post; bh=/Cpn7EyxUUaFpDOCKVc0flB2ZKWuHrfDyq/rjb9YJoY=; b=G3BvQUMfUmvwEoiYMwoqNwmeQg3bqWMa+HvLa/mpKTKgTMZgxVpm1n3cFNWOI4MzlvNQ41 qAyyJiwaZhipvppch+cjyk1Xgdvg5cX+qNxL4djmdTzjs8QrsXuohmWvKacipID2WMHuT+ fbcP5s4wKeg3K+y1RjbXoOutfHfDImc= X-MC-Unique: C8FYGe40MD-FAe-BvfVY6A-1 From: Peter Krempa To: libvir-list@redhat.com Subject: [PATCH v2 12/15] tests: qemumigrationcookie: Add testing for block dirty bitmap migration Date: Fri, 19 Feb 2021 12:58:24 +0100 Message-Id: <7933aa67a1253c4f44fb648a87054bbec0ea4a7d.1613735605.git.pkrempa@redhat.com> In-Reply-To: References: MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.13 X-loop: libvir-list@redhat.com X-BeenThere: libvir-list@redhat.com X-Mailman-Version: 2.1.12 Precedence: junk List-Id: Development discussions about the libvirt library & tools List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: libvir-list-bounces@redhat.com Errors-To: libvir-list-bounces@redhat.com X-Scanned-By: MIMEDefang 2.79 on 10.5.11.13 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=libvir-list-bounces@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable X-ZohoMail-DKIM: pass (identity @redhat.com) Content-Type: text/plain; charset="utf-8" Test the XML infrastructure for migration cookie element as well as the conversion to migration parameters for QMP schema validation. Signed-off-by: Peter Krempa Reviewed-by: Jiri Denemark --- tests/meson.build | 2 +- .../nbd-bitmaps-xml2xml-in.xml | 52 ++++++ .../nbd-bitmaps-xml2xml-migparams.json | 25 +++ .../nbd-bitmaps-xml2xml-out.xml | 51 ++++++ tests/qemumigrationcookiexmltest.c | 166 +++++++++++++++--- 5 files changed, 269 insertions(+), 27 deletions(-) create mode 100644 tests/qemumigrationcookiexmldata/nbd-bitmaps-xml2xml-in= .xml create mode 100644 tests/qemumigrationcookiexmldata/nbd-bitmaps-xml2xml-mi= gparams.json create mode 100644 tests/qemumigrationcookiexmldata/nbd-bitmaps-xml2xml-ou= t.xml diff --git a/tests/meson.build b/tests/meson.build index 0de0783839..b9b2255666 100644 --- a/tests/meson.build +++ b/tests/meson.build @@ -452,7 +452,7 @@ if conf.has('WITH_QEMU') { 'name': 'qemuhotplugtest', 'link_with': [ test_qemu_driver_lib, test= _utils_qemu_monitor_lib ], 'link_whole': [ test_utils_qemu_lib ] }, { 'name': 'qemumemlocktest', 'link_with': [ test_qemu_driver_lib ], 'l= ink_whole': [ test_utils_qemu_lib ] }, { 'name': 'qemumigparamstest', 'link_with': [ test_qemu_driver_lib, te= st_utils_qemu_monitor_lib ], 'link_whole': [ test_utils_qemu_lib ] }, - { 'name': 'qemumigrationcookiexmltest', 'link_with': [ test_qemu_drive= r_lib ], 'link_whole': [ test_utils_qemu_lib, test_file_wrapper_lib ] }, + { 'name': 'qemumigrationcookiexmltest', 'link_with': [ test_qemu_drive= r_lib, test_utils_qemu_monitor_lib ], 'link_whole': [ test_utils_qemu_lib, = test_file_wrapper_lib ] }, { 'name': 'qemumonitorjsontest', 'link_with': [ test_qemu_driver_lib, = test_utils_qemu_monitor_lib ], 'link_whole': [ test_utils_qemu_lib ] }, { 'name': 'qemusecuritytest', 'sources': [ 'qemusecuritytest.c', 'qemu= securitymock.c' ], 'link_with': [ test_qemu_driver_lib ], 'link_whole': [ t= est_utils_qemu_lib ] }, { 'name': 'qemustatusxml2xmltest', 'link_with': [ test_qemu_driver_lib= ], 'link_whole': [ test_utils_qemu_lib, test_file_wrapper_lib ] }, diff --git a/tests/qemumigrationcookiexmldata/nbd-bitmaps-xml2xml-in.xml b/= tests/qemumigrationcookiexmldata/nbd-bitmaps-xml2xml-in.xml new file mode 100644 index 0000000000..b219c25f27 --- /dev/null +++ b/tests/qemumigrationcookiexmldata/nbd-bitmaps-xml2xml-in.xml @@ -0,0 +1,52 @@ + + migr + 10b01607-0323-486b-afe2-3014a8a5b98b + sourcehost + 1f5e0da0-fecf-413f-9bf1-1aa9c21e71e4 + + + + + + + EPYC-Rome + AMD + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/qemumigrationcookiexmldata/nbd-bitmaps-xml2xml-migparams= .json b/tests/qemumigrationcookiexmldata/nbd-bitmaps-xml2xml-migparams.json new file mode 100644 index 0000000000..100da7c270 --- /dev/null +++ b/tests/qemumigrationcookiexmldata/nbd-bitmaps-xml2xml-migparams.json @@ -0,0 +1,25 @@ +{ + "block-bitmap-mapping": [ + { + "node-name": "libvirt-1-format", + "alias": "vda", + "bitmaps": [ + { + "name": "a", + "alias": "libvirt-vda-a", + "transform": { + "persistent": true + } + }, + { + "name": "b", + "alias": "libvirt-vda-b" + }, + { + "name": "c", + "alias": "libvirt-vda-c" + } + ] + } + ] +} diff --git a/tests/qemumigrationcookiexmldata/nbd-bitmaps-xml2xml-out.xml b= /tests/qemumigrationcookiexmldata/nbd-bitmaps-xml2xml-out.xml new file mode 100644 index 0000000000..09b6fa291c --- /dev/null +++ b/tests/qemumigrationcookiexmldata/nbd-bitmaps-xml2xml-out.xml @@ -0,0 +1,51 @@ + + migr + 10b01607-0323-486b-afe2-3014a8a5b98b + hostname + 4a802f00-4cba-5df6-9679-a08c4c5b577f + + + + + + EPYC-Rome + AMD + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/qemumigrationcookiexmltest.c b/tests/qemumigrationcookie= xmltest.c index 5fe0ba8a8a..7f2437a7fe 100644 --- a/tests/qemumigrationcookiexmltest.c +++ b/tests/qemumigrationcookiexmltest.c @@ -25,9 +25,13 @@ #include "internal.h" #include "testutilsqemu.h" +#include "testutilsqemuschema.h" #include "configmake.h" +#define LIBVIRT_QEMU_MIGRATION_PARAMSPRIV_H_ALLOW + #include "qemu/qemu_migration_cookie.h" +#include "qemu/qemu_migration_paramspriv.h" #define VIR_FROM_THIS VIR_FROM_NONE @@ -61,13 +65,33 @@ struct testQemuMigrationCookieData { qemuMigrationParty cookiePopulateParty; + qemuMigrationCookiePtr cookie; + char *xmlstr; int xmlstrlen; char *infile; char *outfile; + char *outmigparamsfile; }; +static void +testQemuMigrationCookieDataFree(struct testQemuMigrationCookieData *data) +{ + if (!data) + return; + + qemuMigrationCookieFree(data->cookie); + g_free(data->xmlstr); + g_free(data->outfile); + g_free(data->infile); + g_free(data->outmigparamsfile); + g_free(data->inStatus); + virDomainObjEndAPI(&data->vm); + g_free(data); +} + + static int testQemuMigrationCookiePopulate(const void *opaque) { @@ -115,26 +139,25 @@ testQemuMigrationCookieParse(const void *opaque) struct testQemuMigrationCookieData *data =3D (struct testQemuMigration= CookieData *) opaque; qemuDomainObjPrivatePtr priv =3D data->vm->privateData; g_auto(virBuffer) actual =3D VIR_BUFFER_INITIALIZER; - g_autoptr(qemuMigrationCookie) cookie =3D NULL; - if (!(cookie =3D qemuMigrationCookieParse(&driver, - data->vm->def, - NULL, - priv, - data->xmlstr, - data->xmlstrlen, - data->cookieParseFlags))) { + if (!(data->cookie =3D qemuMigrationCookieParse(&driver, + data->vm->def, + NULL, + priv, + data->xmlstr, + data->xmlstrlen, + data->cookieParseFlags))= ) { VIR_TEST_DEBUG("\nfailed to parse qemu migration cookie:\n%s\n", d= ata->xmlstr); return -1; } /* set all flags so that formatter attempts to format everything */ - cookie->flags =3D ~0; + data->cookie->flags =3D ~0; if (qemuMigrationCookieXMLFormat(&driver, priv->qemuCaps, &actual, - cookie) < 0) { + data->cookie) < 0) { VIR_TEST_DEBUG("\nfailed to format back qemu migration cookie"); return -1; } @@ -179,21 +202,6 @@ testQemuMigrationCookieXMLLoad(const void *opaque) } -static void -testQemuMigrationCookieDataFree(struct testQemuMigrationCookieData *data) -{ - if (!data) - return; - - g_free(data->xmlstr); - g_free(data->outfile); - g_free(data->infile); - g_free(data->inStatus); - virDomainObjEndAPI(&data->vm); - g_free(data); -} - - static int testQemuMigrationCookieDom2XML(const char *namesuffix, const char *domxml, @@ -207,9 +215,11 @@ testQemuMigrationCookieDom2XML(const char *namesuffix, /* flags unsupported by default: * - lockstate: internals are NULL in tests, causes crash * - nbd: monitor not present + * - dirty bitmaps: monitor not present */ unsigned int cookiePopulateFlagMask =3D QEMU_MIGRATION_COOKIE_LOCK= STATE | - QEMU_MIGRATION_COOKIE_NBD; + QEMU_MIGRATION_COOKIE_NBD | + QEMU_MIGRATION_COOKIE_BLOCK_= DIRTY_BITMAPS; data->cookiePopulateFlags =3D ~cookiePopulateFlagMask; } @@ -286,6 +296,107 @@ testQemuMigrationCookieXML2XML(const char *name, } +static int +testQemuMigrationCookieBlockDirtyBitmaps(const void *opaque) +{ + const struct testQemuMigrationCookieData *data =3D opaque; + g_autoptr(virJSONValue) migParamsBitmaps =3D NULL; + g_autofree char *actualJSON =3D NULL; + g_autoptr(virJSONValue) paramsOut =3D NULL; + g_auto(virBuffer) debug =3D VIR_BUFFER_INITIALIZER; + g_autoptr(qemuMigrationParams) migParams =3D NULL; + g_autoptr(GHashTable) qmpschema =3D NULL; + GSList *next; + + if (!(qmpschema =3D testQEMUSchemaLoadLatest("x86_64"))) { + VIR_TEST_VERBOSE("failed to load QMP schema"); + return -1; + } + + if (qemuMigrationCookieBlockDirtyBitmapsMatchDisks(data->vm->def, + data->cookie->block= DirtyBitmaps) < 0) + return -1; + + for (next =3D data->cookie->blockDirtyBitmaps; next; next =3D next->ne= xt) { + qemuMigrationBlockDirtyBitmapsDiskPtr disk =3D next->data; + qemuMigrationBlockDirtyBitmapsDiskBitmapPtr bitmap =3D disk->bitma= ps->data; + + bitmap->persistent =3D VIR_TRISTATE_BOOL_YES; + } + + if (qemuMigrationCookieBlockDirtyBitmapsToParams(data->cookie->blockDi= rtyBitmaps, + &migParamsBitmaps)) + return -1; + + if (!(migParams =3D qemuMigrationParamsNew())) + return -1; + + qemuMigrationParamsSetBlockDirtyBitmapMapping(migParams, &migParamsBit= maps); + + if (!(paramsOut =3D qemuMigrationParamsToJSON(migParams)) || + !(actualJSON =3D virJSONValueToString(paramsOut, true))) + return -1; + + if (testQEMUSchemaValidateCommand("migrate-set-parameters", + paramsOut, + qmpschema, + false, + false, + &debug) < 0) { + VIR_TEST_VERBOSE("failed to validate migration params '%s' against= QMP schema: %s", + actualJSON, virBufferCurrentContent(&debug)); + return -1; + } + + if (virTestCompareToFile(actualJSON, data->outmigparamsfile) < 0) + return -1; + + return 0; +} + + +/* tests also the conversion to list of migrated bitmaps */ +static int +testQemuMigrationCookieXML2XMLBitmaps(const char *name, + const char *statusxml, + unsigned int cookieParseFlags) +{ + struct testQemuMigrationCookieData *data =3D g_new0(struct testQemuMig= rationCookieData, 1); + int ret =3D 0; + + if (cookieParseFlags =3D=3D 0) + data->cookieParseFlags =3D ~0; + + data->inStatus =3D g_strconcat(abs_srcdir, "/", statusxml, NULL); + data->infile =3D g_strconcat(abs_srcdir, "/qemumigrationcookiexmldata/= ", + name, "-xml2xml-in.xml", NULL); + data->outfile =3D g_strconcat(abs_srcdir, "/qemumigrationcookiexmldata= /", + name, "-xml2xml-out.xml", NULL); + data->outmigparamsfile =3D g_strconcat(abs_srcdir, "/qemumigrationcook= iexmldata/", + name, "-xml2xml-migparams.json", = NULL); + + if (virTestRun(tn("qemumigrationcookieXML2XML-dom-", name, NULL), + testQemuMigrationCookieDomInit, data) < 0) + ret =3D -1; + + if (virTestRun(tn("qemumigrationcookieXML2XML-load-", name, NULL), + testQemuMigrationCookieXMLLoad, data) < 0) + ret =3D -1; + + if (virTestRun(tn("qemumigrationcookieXML2XML-parse-", name, NULL), + testQemuMigrationCookieParse, data) < 0) + ret =3D -1; + + if (virTestRun(tn("qemumigrationcookieXML2XML-migparams-", name, NULL), + testQemuMigrationCookieBlockDirtyBitmaps, data) < 0) + ret =3D -1; + + testQemuMigrationCookieDataFree(data); + + return ret; +} + + static int mymain(void) { @@ -321,6 +432,9 @@ mymain(void) testQemuMigrationCookieXML2XML("full", "qemustatusxml2xmldata/mode= rn-in.xml", 0) < 0) ret =3D -1; + if (testQemuMigrationCookieXML2XMLBitmaps("nbd-bitmaps", "qemustatusxm= l2xmldata/migration-out-nbd-bitmaps-in.xml", 0) < 0) + ret =3D -1; + virBufferFreeAndReset(&testnamebuf); cleanup: --=20 2.29.2