qemu/scripts/qapi
Markus Armbruster 75ecee7262 qapi: Enable enum member introspection to show more than name
The next commit will add feature flags to enum members.  There's a
problem, though: query-qmp-schema shows an enum type's members as an
array of member names (SchemaInfoEnum member @values).  If it showed
an array of objects with a name member, we could simply add more
members to these objects.  Since it's just strings, we can't.

I can see three ways to correct this design mistake:

1. Do it the way we should have done it, plus compatibility goo.

   We want a ['SchemaInfoEnumMember'] member in SchemaInfoEnum.  Since
   changing @values would be a compatibility break, add a new member
   @members instead.

   @values is now redundant.  In my testing, output of
   qemu-system-x86_64's query-qmp-schema grows by 11% (18.5KiB).

   We can deprecate @values now and drop it later.  This will break
   outmoded clients.  Well-behaved clients such as libvirt are
   expected to break cleanly.

2. Like 1, but omit "boring" elements of @member, and empty @member.

   @values does not become redundant.  @members augments it.  Somewhat
   cumbersome, but output of query-qmp-schema grows only as we make
   enum members non-boring.

   There is nothing to deprecate here.

3. Versioned query-qmp-schema.

   query-qmp-schema provides either @values or @members.  The QMP
   client can select which version it wants.  There is no redundant
   output.

   We can deprecate old versions and eventually drop them.  This will
   break outmoded clients.  Breaking cleanly is easier than for 1.

   While 1 and 2 operate within the common rules for compatible
   evolution apply (section "Compatibility considerations" in
   docs/devel/qapi-code-gen.rst), 3 bypasses them.  Attractive when
   operating within the rules is just too awkward.  Not the case here.

This commit implements 1.  Libvirt developers prefer it.

Deprecate @values in favour of @members.  Since query-qmp-schema
compatibility is pretty fundamental for management applications, an
extended grace period is advised.

Signed-off-by: Markus Armbruster <armbru@redhat.com>
Reviewed-by: Eric Blake <eblake@redhat.com>
Tested-by: Peter Krempa <pkrempa@redhat.com>
Acked-by: Peter Krempa <pkrempa@redhat.com>
Message-Id: <20211025042405.3762351-2-armbru@redhat.com>
Reviewed-by: John Snow <jsnow@redhat.com>
2021-10-27 17:18:43 +02:00
..
__init__.py
.flake8 qapi: delint using flake8 2020-10-10 11:37:47 +02:00
.isort.cfg qapi: enforce import order/styling with isort 2020-10-10 11:37:47 +02:00
commands.py qapi: wrap Sequence[str] in an object 2021-08-26 13:53:56 +02:00
common.py qapi: Bury some unused code in class Indentation 2021-09-08 15:30:10 +02:00
error.py qapi/error: Add type hints 2021-04-30 12:59:54 +02:00
events.py qapi: wrap Sequence[str] in an object 2021-08-26 13:53:56 +02:00
expr.py qapi: Drop simple unions 2021-09-27 08:23:25 +02:00
gen.py qapi/gen: use dict.items() to iterate over _modules 2021-10-02 07:33:41 +02:00
introspect.py qapi: Enable enum member introspection to show more than name 2021-10-27 17:18:43 +02:00
main.py qapi: add must_match helper 2021-05-20 11:28:28 +02:00
mypy.ini qapi/parser: enable mypy checks 2021-10-02 07:33:42 +02:00
parser.py qapi/parser: Silence too-few-public-methods warning 2021-10-02 07:33:42 +02:00
pylintrc qapi/parser: enable pylint checks 2021-10-02 07:33:42 +02:00
schema.py qapi: Drop simple unions 2021-09-27 08:23:25 +02:00
source.py qapi/source: Remove line number from QAPISourceInfo initializer 2021-05-20 11:28:27 +02:00
types.py qapi: Simplify QAPISchemaIfCond's interface for generating C 2021-09-03 17:06:40 +02:00
visit.py qapi: Simplify QAPISchemaIfCond's interface for generating C 2021-09-03 17:06:40 +02:00