From nobody Mon Feb 9 03:20:02 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=1616164505; cv=none; d=zohomail.com; s=zohoarc; b=V3+/nd29b/8tqopj80fkS5aykcXT9B7M0x31zo74k+9yZyxcXV9T1lSqZu+zpbypL6uJfujD6YopReWsbQnakKZu0nHFW3S0vDm5JvVZXWLNCPBt/4wDMQwGGJ+g8gfq7aA5HeWanmVB9FO6401IeDIRLcnEc3wAc9kUbL6clTM= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1616164505; 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=TaaAnks1Jacwk73geOQ84rX0SOirZ4iXT/MzpKo73F4=; b=kVUJ9AxCstT2yu/IWBXhuPQrqYcOqV5WHp9hsEmRejq9HabFvj43EmGAOfUORgHNf9oNob788xZoyuQ456CVrlyqJiJLEqtXNFcRXtbkvmeAdhJWd16Xv+XteqOABbHl+uyWnMoJAcQgxWygRtOeNq2/HYzVx9/2Bp+3kLcVvWY= 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 1616164505110262.3203960550899; Fri, 19 Mar 2021 07:35:05 -0700 (PDT) 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-479-LhupM3eGO7yNhNMUew3zig-1; Fri, 19 Mar 2021 10:34:12 -0400 Received: from smtp.corp.redhat.com (int-mx05.intmail.prod.int.phx2.redhat.com [10.5.11.15]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 65FDA180FCA5; Fri, 19 Mar 2021 14:34:06 +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 EBEDB5D740; Fri, 19 Mar 2021 14:34:05 +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 973054A7CB; Fri, 19 Mar 2021 14:34:05 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx05.intmail.prod.int.phx2.redhat.com [10.5.11.15]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id 12JEXvwG027557 for ; Fri, 19 Mar 2021 10:33:57 -0400 Received: by smtp.corp.redhat.com (Postfix) id 11D1D5D730; Fri, 19 Mar 2021 14:33:57 +0000 (UTC) Received: from speedmetal.redhat.com (unknown [10.40.208.33]) by smtp.corp.redhat.com (Postfix) with ESMTP id 44D955D72E for ; Fri, 19 Mar 2021 14:33:56 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1616164504; 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=TaaAnks1Jacwk73geOQ84rX0SOirZ4iXT/MzpKo73F4=; b=YyH5S4deV+RfTGbvnDhyv1N8dyRKwAs5yaGpht9MK/rAJQTNU5dpkVACNyEjRrHMOmtG/C FH2TE367Y9cUkSJuTPnMqqP4fdxx44qKPW+zqMf2WMebAqvHwWFhICaBZa6hab8FJVLFYA AAolFPrMMVoui0T7ieaG6mFNGtCx7Pc= X-MC-Unique: LhupM3eGO7yNhNMUew3zig-1 From: Peter Krempa To: libvir-list@redhat.com Subject: [PATCH v4 07/13] qemu: command: Use JSON for QAPIfied -object directly Date: Fri, 19 Mar 2021 15:33:38 +0100 Message-Id: <59f69e9adae19fc6645e6277c9adff7276928f81.1616164286.git.pkrempa@redhat.com> In-Reply-To: References: MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.15 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.15 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" Skip the lossy conversion to legacy commandline arguments by using the JSON props directly when -object is QAPIfied. This avoids issues with conversion of bitmaps and also allows validation of the generated JSON against the QMP schema in the tests. Since the new approach is triggered by a qemu capability the code from 'virQEMUBuildObjectCommandlineFromJSON' in util/virqemu.c was moved to 'qemuBuildObjectCommandlineFromJSON' in qemu/qemu_command.c which has the virQEMUCaps type. Some functions needed to be modified to propagate qemuCaps. Signed-off-by: Peter Krempa --- src/libvirt_private.syms | 1 - src/qemu/qemu_command.c | 92 +++++++++++++++++++++++++++------------- src/util/virqemu.c | 24 ----------- src/util/virqemu.h | 3 -- 4 files changed, 63 insertions(+), 57 deletions(-) diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index 526dcee11a..c27a4a7d2e 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -3065,7 +3065,6 @@ virQEMUBuildCommandLineJSONArrayBitmap; virQEMUBuildCommandLineJSONArrayNumbered; virQEMUBuildDriveCommandlineFromJSON; virQEMUBuildNetdevCommandlineFromJSON; -virQEMUBuildObjectCommandlineFromJSON; # util/virrandom.h diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index b60f297331..1b4fa77867 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -192,6 +192,31 @@ VIR_ENUM_IMPL(qemuAudioDriver, ); +static int +qemuBuildObjectCommandlineFromJSON(virBuffer *buf, + virJSONValue *props, + virQEMUCaps *qemuCaps) +{ + const char *type =3D virJSONValueObjectGetString(props, "qom-type"); + const char *alias =3D virJSONValueObjectGetString(props, "id"); + + if (!type || !alias) { + virReportError(VIR_ERR_INTERNAL_ERROR, + _("missing 'type'(%s) or 'alias'(%s) field of QOM '= object'"), + NULLSTR(type), NULLSTR(alias)); + return -1; + } + + if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_OBJECT_QAPIFIED)) { + return virJSONValueToBuffer(props, buf, false); + } else { + virBufferAsprintf(buf, "%s,", type); + + return virQEMUBuildCommandLineJSON(props, buf, "qom-type", + virQEMUBuildCommandLineJSONArra= yBitmap); + } +} + /** * qemuBuildMasterKeyCommandLine: @@ -238,7 +263,7 @@ qemuBuildMasterKeyCommandLine(virCommandPtr cmd, NULL) < 0) return -1; - if (virQEMUBuildObjectCommandlineFromJSON(&buf, props) < 0) + if (qemuBuildObjectCommandlineFromJSON(&buf, props, priv->qemuCaps) < = 0) return -1; virCommandAddArg(cmd, "-object"); @@ -714,6 +739,7 @@ qemuBuildSecretInfoProps(qemuDomainSecretInfoPtr secinf= o, * qemuBuildObjectSecretCommandLine: * @cmd: the command to modify * @secinfo: pointer to the secret info object + * @qemuCaps: qemu capabilities * * If the secinfo is available and associated with an AES secret, * then format the command line for the secret object. This object @@ -724,7 +750,8 @@ qemuBuildSecretInfoProps(qemuDomainSecretInfoPtr secinf= o, */ static int qemuBuildObjectSecretCommandLine(virCommandPtr cmd, - qemuDomainSecretInfoPtr secinfo) + qemuDomainSecretInfoPtr secinfo, + virQEMUCaps *qemuCaps) { g_auto(virBuffer) buf =3D VIR_BUFFER_INITIALIZER; g_autoptr(virJSONValue) props =3D NULL; @@ -732,7 +759,7 @@ qemuBuildObjectSecretCommandLine(virCommandPtr cmd, if (qemuBuildSecretInfoProps(secinfo, &props) < 0) return -1; - if (virQEMUBuildObjectCommandlineFromJSON(&buf, props) < 0) + if (qemuBuildObjectCommandlineFromJSON(&buf, props, qemuCaps) < 0) return -1; virCommandAddArg(cmd, "-object"); @@ -901,7 +928,7 @@ qemuBuildTLSx509CommandLine(virCommandPtr cmd, certEncSecretAlias, qemuCaps, &props)= < 0) return -1; - if (virQEMUBuildObjectCommandlineFromJSON(&buf, props) < 0) + if (qemuBuildObjectCommandlineFromJSON(&buf, props, qemuCaps) < 0) return -1; virCommandAddArg(cmd, "-object"); @@ -1991,14 +2018,15 @@ qemuBuildFloppyCommandLineControllerOptions(virComm= andPtr cmd, static int qemuBuildObjectCommandline(virCommandPtr cmd, - virJSONValuePtr objProps) + virJSONValuePtr objProps, + virQEMUCaps *qemuCaps) { g_auto(virBuffer) buf =3D VIR_BUFFER_INITIALIZER; if (!objProps) return 0; - if (virQEMUBuildObjectCommandlineFromJSON(&buf, objProps) < 0) + if (qemuBuildObjectCommandlineFromJSON(&buf, objProps, qemuCaps) < 0) return -1; virCommandAddArg(cmd, "-object"); @@ -2010,16 +2038,17 @@ qemuBuildObjectCommandline(virCommandPtr cmd, static int qemuBuildBlockStorageSourceAttachDataCommandline(virCommandPtr cmd, - qemuBlockStorageSourceAtt= achDataPtr data) + qemuBlockStorageSourceAtt= achDataPtr data, + virQEMUCaps *qemuCaps) { char *tmp; - if (qemuBuildObjectCommandline(cmd, data->prmgrProps) < 0 || - qemuBuildObjectCommandline(cmd, data->authsecretProps) < 0 || - qemuBuildObjectCommandline(cmd, data->encryptsecretProps) < 0 || - qemuBuildObjectCommandline(cmd, data->httpcookiesecretProps) < 0 || - qemuBuildObjectCommandline(cmd, data->tlsKeySecretProps) < 0 || - qemuBuildObjectCommandline(cmd, data->tlsProps) < 0) + if (qemuBuildObjectCommandline(cmd, data->prmgrProps, qemuCaps) < 0 || + qemuBuildObjectCommandline(cmd, data->authsecretProps, qemuCaps) <= 0 || + qemuBuildObjectCommandline(cmd, data->encryptsecretProps, qemuCaps= ) < 0 || + qemuBuildObjectCommandline(cmd, data->httpcookiesecretProps, qemuC= aps) < 0 || + qemuBuildObjectCommandline(cmd, data->tlsKeySecretProps, qemuCaps)= < 0 || + qemuBuildObjectCommandline(cmd, data->tlsProps, qemuCaps) < 0) return -1; if (data->driveCmd) @@ -2088,7 +2117,8 @@ qemuBuildDiskSourceCommandLine(virCommandPtr cmd, for (i =3D data->nsrcdata; i > 0; i--) { if (qemuBuildBlockStorageSourceAttachDataCommandline(cmd, - data->srcdata= [i - 1]) < 0) + data->srcdata= [i - 1], + qemuCaps) < 0) return -1; } @@ -3318,7 +3348,7 @@ qemuBuildMemoryCellBackendStr(virDomainDefPtr def, priv, def, &mem, false, false)) = < 0) return -1; - if (virQEMUBuildObjectCommandlineFromJSON(buf, props) < 0) + if (qemuBuildObjectCommandlineFromJSON(buf, props, priv->qemuCaps) < 0) return -1; return rc; @@ -3347,7 +3377,7 @@ qemuBuildMemoryDimmBackendStr(virBufferPtr buf, priv, def, mem, true, false) < 0) return -1; - if (virQEMUBuildObjectCommandlineFromJSON(buf, props) < 0) + if (qemuBuildObjectCommandlineFromJSON(buf, props, priv->qemuCaps) < 0) return -1; return 0; @@ -4971,7 +5001,8 @@ qemuBuildChrChardevStr(virLogManagerPtr logManager, * functions can just check the config fields */ if (chrSourcePriv && chrSourcePriv->secinfo) { if (qemuBuildObjectSecretCommandLine(cmd, - chrSourcePriv->secinf= o) < 0) + chrSourcePriv->secinf= o, + qemuCaps) < 0) return NULL; tlsCertEncSecAlias =3D chrSourcePriv->secinfo->s.aes.alias; @@ -5209,7 +5240,7 @@ qemuBuildHostdevSCSICommandLine(virCommandPtr cmd, if (!(data =3D qemuBuildHostdevSCSIAttachPrepare(hostdev, &backendAlia= s, qemuCaps))) return -1; - if (qemuBuildBlockStorageSourceAttachDataCommandline(cmd, data) < 0) + if (qemuBuildBlockStorageSourceAttachDataCommandline(cmd, data, qemuCa= ps) < 0) return -1; virCommandAddArg(cmd, "-device"); @@ -5615,7 +5646,7 @@ qemuBuildRNGCommandLine(virLogManagerPtr logManager, if (qemuBuildRNGBackendProps(rng, &props) < 0) return -1; - rc =3D virQEMUBuildObjectCommandlineFromJSON(&buf, props); + rc =3D qemuBuildObjectCommandlineFromJSON(&buf, props, qemuCaps); if (rc < 0) return -1; @@ -7192,7 +7223,7 @@ qemuBuildMemCommandLineMemoryDefaultBackend(virComman= dPtr cmd, priv, def, &mem, false, true) < 0) return -1; - if (virQEMUBuildObjectCommandlineFromJSON(&buf, props) < 0) + if (qemuBuildObjectCommandlineFromJSON(&buf, props, priv->qemuCaps) < = 0) return -1; virCommandAddArg(cmd, "-object"); @@ -7265,7 +7296,8 @@ qemuBuildMemCommandLine(virCommandPtr cmd, static int qemuBuildIOThreadCommandLine(virCommandPtr cmd, - const virDomainDef *def) + const virDomainDef *def, + virQEMUCaps *qemuCaps) { size_t i; @@ -7280,7 +7312,7 @@ qemuBuildIOThreadCommandLine(virCommandPtr cmd, if (qemuMonitorCreateObjectProps(&props, "iothread", alias, NULL) = < 0) return -1; - if (virQEMUBuildObjectCommandlineFromJSON(&buf, props) < 0) + if (qemuBuildObjectCommandlineFromJSON(&buf, props, qemuCaps) < 0) return -1; virCommandAddArg(cmd, "-object"); @@ -8098,7 +8130,8 @@ qemuBuildGraphicsVNCCommandLine(virQEMUDriverConfigPt= r cfg, if (gfxPriv->secinfo) { if (qemuBuildObjectSecretCommandLine(cmd, - gfxPriv->secinfo) < 0) + gfxPriv->secinfo, + qemuCaps) < 0) return -1; secretAlias =3D gfxPriv->secinfo->s.aes.alias; } @@ -9149,7 +9182,7 @@ qemuBuildShmemCommandLine(virLogManagerPtr logManager, if (!(memProps =3D qemuBuildShmemBackendMemProps(shmem))) return -1; - rc =3D virQEMUBuildObjectCommandlineFromJSON(&buf, memProps); + rc =3D qemuBuildObjectCommandlineFromJSON(&buf, memProps, qemuCaps= ); if (rc < 0) return -1; @@ -9903,7 +9936,7 @@ qemuBuildSEVCommandLine(virDomainObjPtr vm, virComman= dPtr cmd, NULL) < 0) return -1; - if (virQEMUBuildObjectCommandlineFromJSON(&buf, props) < 0) + if (qemuBuildObjectCommandlineFromJSON(&buf, props, priv->qemuCaps) < = 0) return -1; virCommandAddArg(cmd, "-object"); @@ -10021,7 +10054,7 @@ qemuBuildManagedPRCommandLine(virCommandPtr cmd, if (!(props =3D qemuBuildPRManagedManagerInfoProps(priv))) return -1; - if (virQEMUBuildObjectCommandlineFromJSON(&buf, props) < 0) + if (qemuBuildObjectCommandlineFromJSON(&buf, props, priv->qemuCaps) < = 0) return -1; virCommandAddArg(cmd, "-object"); @@ -10045,7 +10078,8 @@ qemuBuildPflashBlockdevOne(virCommandPtr cmd, for (i =3D data->nsrcdata; i > 0; i--) { if (qemuBuildBlockStorageSourceAttachDataCommandline(cmd, - data->srcdata= [i - 1]) < 0) + data->srcdata= [i - 1], + qemuCaps) < 0) return -1; } @@ -10110,7 +10144,7 @@ qemuBuildDBusVMStateCommandLine(virCommandPtr cmd, if (!(props =3D qemuBuildDBusVMStateInfoProps(driver, vm))) return -1; - if (virQEMUBuildObjectCommandlineFromJSON(&buf, props) < 0) + if (qemuBuildObjectCommandlineFromJSON(&buf, props, priv->qemuCaps) < = 0) return -1; virCommandAddArg(cmd, "-object"); @@ -10385,7 +10419,7 @@ qemuBuildCommandLine(virQEMUDriverPtr driver, if (qemuBuildSmpCommandLine(cmd, def, qemuCaps) < 0) return NULL; - if (qemuBuildIOThreadCommandLine(cmd, def) < 0) + if (qemuBuildIOThreadCommandLine(cmd, def, qemuCaps) < 0) return NULL; if (virDomainNumaGetNodeCount(def->numa) && diff --git a/src/util/virqemu.c b/src/util/virqemu.c index a206da1852..a1f57dea66 100644 --- a/src/util/virqemu.c +++ b/src/util/virqemu.c @@ -303,30 +303,6 @@ virQEMUBuildNetdevCommandlineFromJSON(virJSONValuePtr = props, } -int -virQEMUBuildObjectCommandlineFromJSON(virBufferPtr buf, - virJSONValuePtr objprops) -{ - const char *type =3D virJSONValueObjectGetString(objprops, "qom-type"); - const char *alias =3D virJSONValueObjectGetString(objprops, "id"); - - if (!type || !alias) { - virReportError(VIR_ERR_INTERNAL_ERROR, - _("missing 'type'(%s) or 'alias'(%s) field of QOM '= object'"), - NULLSTR(type), NULLSTR(alias)); - return -1; - } - - virBufferAsprintf(buf, "%s,", type); - - if (virQEMUBuildCommandLineJSON(objprops, buf, "qom-type", - virQEMUBuildCommandLineJSONArrayBitmap= ) < 0) - return -1; - - return 0; -} - - char * virQEMUBuildDriveCommandlineFromJSON(virJSONValuePtr srcdef) { diff --git a/src/util/virqemu.h b/src/util/virqemu.h index 849b7df0c2..361abddd11 100644 --- a/src/util/virqemu.h +++ b/src/util/virqemu.h @@ -48,9 +48,6 @@ char * virQEMUBuildNetdevCommandlineFromJSON(virJSONValuePtr props, bool rawjson); -int virQEMUBuildObjectCommandlineFromJSON(virBufferPtr buf, - virJSONValuePtr objprops); - char *virQEMUBuildDriveCommandlineFromJSON(virJSONValuePtr src); void virQEMUBuildBufferEscapeComma(virBufferPtr buf, const char *str); --=20 2.29.2