Skip to content

Commit

Permalink
qapi: Extend -compat to set policy for unstable interfaces
Browse files Browse the repository at this point in the history
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
6dd7547 "qemu-options: New -compat to set policy for deprecated
interfaces").  This is intended for testing users of the management
interfaces.  It is experimental.

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 <[email protected]>
Acked-by: John Snow <[email protected]>
Message-Id: <[email protected]>
Reviewed-by: Eric Blake <[email protected]>
[Doc comments fixed up]
  • Loading branch information
Markus Armbruster committed Oct 29, 2021
1 parent 7ce5fc6 commit 57df0df
Show file tree
Hide file tree
Showing 7 changed files with 51 additions and 12 deletions.
1 change: 1 addition & 0 deletions include/qapi/util.h
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@

typedef enum {
QAPI_DEPRECATED,
QAPI_UNSTABLE,
} QapiSpecialFeature;

typedef struct QEnumLookup {
Expand Down
8 changes: 7 additions & 1 deletion qapi/compat.json
Original file line number Diff line number Diff line change
Expand Up @@ -47,9 +47,15 @@
#
# @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')
# (since 6.2)
# @unstable-output: how to handle unstable output (default 'accept')
# (since 6.2)
#
# Since: 6.0
##
{ 'struct': 'CompatPolicy',
'data': { '*deprecated-input': 'CompatPolicyInput',
'*deprecated-output': 'CompatPolicyOutput' } }
'*deprecated-output': 'CompatPolicyOutput',
'*unstable-input': 'CompatPolicyInput',
'*unstable-output': 'CompatPolicyOutput' } }
6 changes: 6 additions & 0 deletions qapi/qapi-util.c
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,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;
}

Expand Down
8 changes: 6 additions & 2 deletions qapi/qobject-output-visitor.c
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down
20 changes: 19 additions & 1 deletion qemu-options.hx
Original file line number Diff line number Diff line change
Expand Up @@ -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}]``
Expand All @@ -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,
Expand Down
10 changes: 6 additions & 4 deletions scripts/qapi/events.py
Original file line number Diff line number Diff line change
Expand Up @@ -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('''
Expand Down
10 changes: 6 additions & 4 deletions scripts/qapi/schema.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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):
Expand Down

0 comments on commit 57df0df

Please sign in to comment.