From: "Dr. David Alan Gilbert" <dgilbert@redhat.com>
To: Markus Armbruster <armbru@redhat.com>
Cc: kwolf@redhat.com, pkrempa@redhat.com, berrange@redhat.com,
ehabkost@redhat.com, qemu-block@nongnu.org, quintela@redhat.com,
libvir-list@redhat.com, eblake@redhat.com,
mdroth@linux.vnet.ibm.com, qemu-devel@nongnu.org,
pbonzini@redhat.com, marcandre.lureau@redhat.com,
jsnow@redhat.com, libguestfs@redhat.com
Subject: Re: [PATCH 9/9] qapi: Extend -compat to set policy for unstable interfaces
Date: Tue, 26 Oct 2021 19:45:32 +0100 [thread overview]
Message-ID: <YXhMzNHguAyUlRVR@work-vm> (raw)
In-Reply-To: <20211025052532.3859634-10-armbru@redhat.com>
* Markus Armbruster (armbru@redhat.com) wrote:
> New option parameters unstable-input and unstable-output set policy
> for unstable interfaces just like deprecated-input and
> deprecated-output set policy for deprecated interfaces (see commit
> 6dd75472d5 "qemu-options: New -compat to set policy for deprecated
> interfaces"). This is intended for testing users of the management
> interfaces. It is experimental.
So is there no way to mark the option as unstable?
Dave
> For now, this covers only syntactic aspects of QMP, i.e. stuff tagged
> with feature 'unstable'. We may want to extend it to cover semantic
> aspects, or the command line.
>
> Note that there is no good way for management application to detect
> presence of these new option parameters: they are not visible output
> of query-qmp-schema or query-command-line-options. Tolerable, because
> it's meant for testing. If running with -compat fails, skip the test.
>
> Signed-off-by: Markus Armbruster <armbru@redhat.com>
> ---
> qapi/compat.json | 6 +++++-
> include/qapi/util.h | 1 +
> qapi/qmp-dispatch.c | 6 ++++++
> qapi/qobject-output-visitor.c | 8 ++++++--
> qemu-options.hx | 20 +++++++++++++++++++-
> scripts/qapi/events.py | 10 ++++++----
> scripts/qapi/schema.py | 10 ++++++----
> 7 files changed, 49 insertions(+), 12 deletions(-)
>
> diff --git a/qapi/compat.json b/qapi/compat.json
> index 74a8493d3d..9bc9804abb 100644
> --- a/qapi/compat.json
> +++ b/qapi/compat.json
> @@ -47,9 +47,13 @@
> #
> # @deprecated-input: how to handle deprecated input (default 'accept')
> # @deprecated-output: how to handle deprecated output (default 'accept')
> +# @unstable-input: how to handle unstable input (default 'accept')
> +# @unstable-output: how to handle unstable output (default 'accept')
> #
> # Since: 6.0
> ##
> { 'struct': 'CompatPolicy',
> 'data': { '*deprecated-input': 'CompatPolicyInput',
> - '*deprecated-output': 'CompatPolicyOutput' } }
> + '*deprecated-output': 'CompatPolicyOutput',
> + '*unstable-input': 'CompatPolicyInput',
> + '*unstable-output': 'CompatPolicyOutput' } }
> diff --git a/include/qapi/util.h b/include/qapi/util.h
> index 0cc98db9f9..81a2b13a33 100644
> --- a/include/qapi/util.h
> +++ b/include/qapi/util.h
> @@ -13,6 +13,7 @@
>
> typedef enum {
> QAPI_DEPRECATED,
> + QAPI_UNSTABLE,
> } QapiSpecialFeature;
>
> typedef struct QEnumLookup {
> diff --git a/qapi/qmp-dispatch.c b/qapi/qmp-dispatch.c
> index e29ade134c..c5c6e521a2 100644
> --- a/qapi/qmp-dispatch.c
> +++ b/qapi/qmp-dispatch.c
> @@ -59,6 +59,12 @@ bool compat_policy_input_ok(unsigned special_features,
> error_class, kind, name, errp)) {
> return false;
> }
> + if ((special_features & (1u << QAPI_UNSTABLE))
> + && !compat_policy_input_ok1("Unstable",
> + policy->unstable_input,
> + error_class, kind, name, errp)) {
> + return false;
> + }
> return true;
> }
>
> diff --git a/qapi/qobject-output-visitor.c b/qapi/qobject-output-visitor.c
> index b5c6564cbb..74770edd73 100644
> --- a/qapi/qobject-output-visitor.c
> +++ b/qapi/qobject-output-visitor.c
> @@ -212,8 +212,12 @@ static bool qobject_output_type_null(Visitor *v, const char *name,
> static bool qobject_output_policy_skip(Visitor *v, const char *name,
> unsigned special_features)
> {
> - return !(special_features && 1u << QAPI_DEPRECATED)
> - || v->compat_policy.deprecated_output == COMPAT_POLICY_OUTPUT_HIDE;
> + CompatPolicy *pol = &v->compat_policy;
> +
> + return ((special_features & 1u << QAPI_DEPRECATED)
> + && pol->deprecated_output == COMPAT_POLICY_OUTPUT_HIDE)
> + || ((special_features & 1u << QAPI_UNSTABLE)
> + && pol->unstable_output == COMPAT_POLICY_OUTPUT_HIDE);
> }
>
> /* Finish building, and return the root object.
> diff --git a/qemu-options.hx b/qemu-options.hx
> index 5f375bbfa6..f051536b63 100644
> --- a/qemu-options.hx
> +++ b/qemu-options.hx
> @@ -3641,7 +3641,9 @@ DEFHEADING(Debug/Expert options:)
>
> DEF("compat", HAS_ARG, QEMU_OPTION_compat,
> "-compat [deprecated-input=accept|reject|crash][,deprecated-output=accept|hide]\n"
> - " Policy for handling deprecated management interfaces\n",
> + " Policy for handling deprecated management interfaces\n"
> + "-compat [unstable-input=accept|reject|crash][,unstable-output=accept|hide]\n"
> + " Policy for handling unstable management interfaces\n",
> QEMU_ARCH_ALL)
> SRST
> ``-compat [deprecated-input=@var{input-policy}][,deprecated-output=@var{output-policy}]``
> @@ -3659,6 +3661,22 @@ SRST
> Suppress deprecated command results and events
>
> Limitation: covers only syntactic aspects of QMP.
> +
> +``-compat [unstable-input=@var{input-policy}][,unstable-output=@var{output-policy}]``
> + Set policy for handling unstable management interfaces (experimental):
> +
> + ``unstable-input=accept`` (default)
> + Accept unstable commands and arguments
> + ``unstable-input=reject``
> + Reject unstable commands and arguments
> + ``unstable-input=crash``
> + Crash on unstable commands and arguments
> + ``unstable-output=accept`` (default)
> + Emit unstable command results and events
> + ``unstable-output=hide``
> + Suppress unstable command results and events
> +
> + Limitation: covers only syntactic aspects of QMP.
> ERST
>
> DEF("fw_cfg", HAS_ARG, QEMU_OPTION_fwcfg,
> diff --git a/scripts/qapi/events.py b/scripts/qapi/events.py
> index 82475e84ec..27b44c49f5 100644
> --- a/scripts/qapi/events.py
> +++ b/scripts/qapi/events.py
> @@ -109,13 +109,15 @@ def gen_event_send(name: str,
> if not boxed:
> ret += gen_param_var(arg_type)
>
> - if 'deprecated' in [f.name for f in features]:
> - ret += mcgen('''
> + for f in features:
> + if f.is_special():
> + ret += mcgen('''
>
> - if (compat_policy.deprecated_output == COMPAT_POLICY_OUTPUT_HIDE) {
> + if (compat_policy.%(feat)s_output == COMPAT_POLICY_OUTPUT_HIDE) {
> return;
> }
> -''')
> +''',
> + feat=f.name)
>
> ret += mcgen('''
>
> diff --git a/scripts/qapi/schema.py b/scripts/qapi/schema.py
> index 55f82d7389..b7b3fc0ce4 100644
> --- a/scripts/qapi/schema.py
> +++ b/scripts/qapi/schema.py
> @@ -254,9 +254,11 @@ def doc_type(self):
>
> def check(self, schema):
> QAPISchemaEntity.check(self, schema)
> - if 'deprecated' in [f.name for f in self.features]:
> - raise QAPISemError(
> - self.info, "feature 'deprecated' is not supported for types")
> + for feat in self.features:
> + if feat.is_special():
> + raise QAPISemError(
> + self.info,
> + f"feature '{feat.name}' is not supported for types")
>
> def describe(self):
> assert self.meta
> @@ -726,7 +728,7 @@ class QAPISchemaFeature(QAPISchemaMember):
> role = 'feature'
>
> def is_special(self):
> - return self.name in ('deprecated')
> + return self.name in ('deprecated', 'unstable')
>
>
> class QAPISchemaObjectTypeMember(QAPISchemaMember):
> --
> 2.31.1
>
--
Dr. David Alan Gilbert / dgilbert@redhat.com / Manchester, UK
next prev parent reply other threads:[~2021-10-26 18:52 UTC|newest]
Thread overview: 58+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-10-25 5:25 [PATCH 0/9] Configurable policy for handling unstable interfaces Markus Armbruster
2021-10-25 5:25 ` [PATCH 1/9] qapi: New special feature flag "unstable" Markus Armbruster
2021-10-25 7:15 ` Juan Quintela
2021-10-25 12:05 ` Kashyap Chamarthy
2021-10-25 12:18 ` Philippe Mathieu-Daudé
2021-10-26 7:15 ` Markus Armbruster
2021-10-26 8:14 ` Kashyap Chamarthy
2021-10-25 19:01 ` John Snow
2021-10-26 5:35 ` Markus Armbruster
2021-10-26 7:37 ` Kevin Wolf
2021-10-26 8:36 ` [Libguestfs] " Kashyap Chamarthy
2021-10-26 9:22 ` Dr. David Alan Gilbert
2021-10-26 9:28 ` Daniel P. Berrangé
2021-10-26 9:37 ` Markus Armbruster
2021-10-26 11:34 ` Kevin Wolf
2021-10-28 8:36 ` Markus Armbruster
2021-10-26 14:56 ` Daniel P. Berrangé
2021-10-26 15:15 ` Markus Armbruster
2021-10-26 15:22 ` Daniel P. Berrangé
2021-10-27 5:29 ` Markus Armbruster
2021-10-25 5:25 ` [PATCH 2/9] qapi: Mark unstable QMP parts with feature 'unstable' Markus Armbruster
2021-10-25 7:16 ` Juan Quintela
2021-10-25 19:05 ` John Snow
2021-10-26 7:56 ` Markus Armbruster
2021-10-26 16:34 ` John Snow
2021-10-27 5:44 ` Markus Armbruster
2021-10-29 13:07 ` Eric Blake
2021-11-02 9:15 ` Kevin Wolf
2021-10-25 5:25 ` [PATCH 3/9] qapi: Eliminate QCO_NO_OPTIONS for a slight simplification Markus Armbruster
2021-10-25 7:17 ` Juan Quintela
2021-10-25 19:08 ` John Snow
2021-10-26 7:58 ` Markus Armbruster
2021-10-25 5:25 ` [PATCH 4/9] qapi: Tools for sets of special feature flags in generated code Markus Armbruster
2021-10-25 19:21 ` John Snow
2021-10-26 8:48 ` Markus Armbruster
2021-10-25 5:25 ` [PATCH 5/9] qapi: Generalize struct member policy checking Markus Armbruster
2021-10-25 19:28 ` John Snow
2021-10-26 9:14 ` Markus Armbruster
2021-10-26 15:43 ` Philippe Mathieu-Daudé
2021-10-27 5:56 ` Markus Armbruster
2021-10-25 5:25 ` [PATCH 6/9] qapi: Generalize command " Markus Armbruster
2021-10-25 12:04 ` Philippe Mathieu-Daudé
2021-10-26 9:40 ` Markus Armbruster
2021-10-25 19:30 ` John Snow
2021-10-25 5:25 ` [PATCH 7/9] qapi: Generalize enum member " Markus Armbruster
2021-10-25 19:36 ` John Snow
2021-10-26 9:43 ` Markus Armbruster
2021-10-26 16:14 ` John Snow
2021-10-25 5:25 ` [PATCH 8/9] qapi: Factor out compat_policy_input_ok() Markus Armbruster
2021-10-25 12:13 ` Philippe Mathieu-Daudé
2021-10-26 9:46 ` Markus Armbruster
2021-10-26 10:39 ` Philippe Mathieu-Daudé
2021-10-29 14:08 ` Markus Armbruster
2021-10-25 19:38 ` John Snow
2021-10-25 5:25 ` [PATCH 9/9] qapi: Extend -compat to set policy for unstable interfaces Markus Armbruster
2021-10-25 19:40 ` John Snow
2021-10-26 18:45 ` Dr. David Alan Gilbert [this message]
2021-10-27 5:59 ` Markus Armbruster
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=YXhMzNHguAyUlRVR@work-vm \
--to=dgilbert@redhat.com \
--cc=armbru@redhat.com \
--cc=berrange@redhat.com \
--cc=eblake@redhat.com \
--cc=ehabkost@redhat.com \
--cc=jsnow@redhat.com \
--cc=kwolf@redhat.com \
--cc=libguestfs@redhat.com \
--cc=libvir-list@redhat.com \
--cc=marcandre.lureau@redhat.com \
--cc=mdroth@linux.vnet.ibm.com \
--cc=pbonzini@redhat.com \
--cc=pkrempa@redhat.com \
--cc=qemu-block@nongnu.org \
--cc=qemu-devel@nongnu.org \
--cc=quintela@redhat.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).