From: "Daniel P. Berrangé" <berrange@redhat.com>
To: Victor Toso <victortoso@redhat.com>
Cc: qemu-devel@nongnu.org, Markus Armbruster <armbru@redhat.com>,
John Snow <jsnow@redhat.com>
Subject: Re: [PATCH v1 1/7] qapi: scripts: add a generator for qapi's examples
Date: Fri, 8 Sep 2023 09:12:51 +0100 [thread overview]
Message-ID: <ZPrXg36lLYrLQ23Q@redhat.com> (raw)
In-Reply-To: <smjkujz2ogjqma2gfoznpaziiwvnjhdep4na2cyifwr3ipnhcn@3wckktjnad2w>
On Thu, Sep 07, 2023 at 08:34:07PM +0200, Victor Toso wrote:
> Hi,
>
> On Wed, Sep 06, 2023 at 10:15:52AM +0100, Daniel P. Berrangé wrote:
> > On Tue, Sep 05, 2023 at 09:48:40PM +0200, Victor Toso wrote:
> > > This generator has two goals:
> > > 1. Mechanical validation of QAPI examples
> > > 2. Generate the examples in a JSON format to be consumed for extra
> > > validation.
> > >
> > > The generator iterates over every Example section, parsing both server
> > > and client messages. The generator prints any inconsistency found, for
> > > example:
> > >
> > > | Error: Extra data: line 1 column 39 (char 38)
> > > | Location: cancel-vcpu-dirty-limit at qapi/migration.json:2017
> > > | Data: {"execute": "cancel-vcpu-dirty-limit"},
> > > | "arguments": { "cpu-index": 1 } }
> > >
> > > The generator will output other JSON file with all the examples in the
> > > QAPI module that they came from. This can be used to validate the
> > > introspection between QAPI/QMP to language bindings, for example:
> > >
> > > | { "examples": [
> > > | {
> > > | "id": "ksuxwzfayw",
> > > | "client": [
> > > | {
> > > | "sequence-order": 1
> > > | "message-type": "command",
> > > | "message":
> > > | { "arguments":
> > > | { "device": "scratch", "size": 1073741824 },
> > > | "execute": "block_resize"
> > > | },
> > > | } ],
> > > | "server": [
> > > | {
> > > | "sequence-order": 2
> > > | "message-type": "return",
> > > | "message": { "return": {} },
> > > | } ]
> > > | }
> > > | ] }
> > >
> > > Note that the order matters, as read by the Example section and
> > > translated into "sequence-order". A language binding project can then
> > > consume this files to Marshal and Unmarshal, comparing if the results
> > > are what is to be expected.
> > >
> > > RFC discussion:
> > > https://lists.gnu.org/archive/html/qemu-devel/2022-08/msg04641.html
> > >
> > > Signed-off-by: Victor Toso <victortoso@redhat.com>
> > > ---
> > > scripts/qapi/dumpexamples.py | 194 +++++++++++++++++++++++++++++++++++
> > > scripts/qapi/main.py | 2 +
> > > 2 files changed, 196 insertions(+)
> > > create mode 100644 scripts/qapi/dumpexamples.py
> > >
> > > diff --git a/scripts/qapi/dumpexamples.py b/scripts/qapi/dumpexamples.py
> > > new file mode 100644
> > > index 0000000000..c14ed11774
> > > --- /dev/null
> > > +++ b/scripts/qapi/dumpexamples.py
> > > @@ -0,0 +1,194 @@
> > > +"""
> > > +Dump examples for Developers
> > > +"""
> > > +# Copyright (c) 2022 Red Hat Inc.
> > > +#
> > > +# Authors:
> > > +# Victor Toso <victortoso@redhat.com>
> > > +#
> > > +# This work is licensed under the terms of the GNU GPL, version 2.
> > > +# See the COPYING file in the top-level directory.
> > > +
> > > +# Just for type hint on self
> > > +from __future__ import annotations
> > > +
> > > +import os
> > > +import json
> > > +import random
> > > +import string
> > > +
> > > +from typing import Dict, List, Optional
> > > +
> > > +from .schema import (
> > > + QAPISchema,
> > > + QAPISchemaType,
> > > + QAPISchemaVisitor,
> > > + QAPISchemaEnumMember,
> > > + QAPISchemaFeature,
> > > + QAPISchemaIfCond,
> > > + QAPISchemaObjectType,
> > > + QAPISchemaObjectTypeMember,
> > > + QAPISchemaVariants,
> > > +)
> > > +from .source import QAPISourceInfo
> > > +
> > > +
> > > +def gen_examples(schema: QAPISchema,
> > > + output_dir: str,
> > > + prefix: str) -> None:
> > > + vis = QAPISchemaGenExamplesVisitor(prefix)
> > > + schema.visit(vis)
> > > + vis.write(output_dir)
> > > +
> > > +
> > > +def get_id(random, size: int) -> str:
> > > + letters = string.ascii_lowercase
> > > + return ''.join(random.choice(letters) for i in range(size))
> > > +
> > > +
> > > +def next_object(text, start, end, context) -> Dict:
> > > + # Start of json object
> > > + start = text.find("{", start)
> > > + end = text.rfind("}", start, end+1)
> > > +
> > > + # try catch, pretty print issues
> > > + try:
> > > + ret = json.loads(text[start:end+1])
> > > + except Exception as e:
> > > + print("Error: {}\nLocation: {}\nData: {}\n".format(
> > > + str(e), context, text[start:end+1]))
> >
> > This prints an error, but the caller ignores this and carries on
> > as normal.
> >
> > After applying this series, we still have multiple errors being
> > printed on console
>
> The first one is a easy to fix error. The other two are more
> related to metadata inserted in valid examples, see:
>
> > Error: Expecting ',' delimiter: line 12 column 19 (char 336)
> > Location: query-blockstats at ../storage-daemon/qapi/../../qapi/block-core.json:1259
>
> Indeed.
>
> > Error: Expecting property name enclosed in double quotes: line 7 column 19 (char 264)
> > Location: query-rocker-of-dpa-flows at ../qapi/rocker.json:256
>
> 251 # "mask": {"in-pport": 4294901760}
> 252 # },
> -> 253 # {...more...},
> 254 # ]}
>
> >
> > Error: Expecting value: line 28 column 15 (char 775)
> > Location: query-spice at ../qapi/ui.json:372
>
> 365 # "tls": false
> 366 # },
> -> 367 # [ ... more channels follow ... ]
> 368 # ]
>
> It would be good to have some sort of annotation for a valid
> example, to express this is a long list and we are not putting
> all of it here.
The second example already has 2 elements in the list, which
i think is sufficient illustration of "many" records.
The first example could just have a 2nd element added to its
returned list too I reckon
With regards,
Daniel
--
|: https://berrange.com -o- https://www.flickr.com/photos/dberrange :|
|: https://libvirt.org -o- https://fstop138.berrange.com :|
|: https://entangle-photo.org -o- https://www.instagram.com/dberrange :|
next prev parent reply other threads:[~2023-09-08 8:13 UTC|newest]
Thread overview: 22+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-09-05 19:48 [PATCH v1 0/7] Validate and test qapi examples Victor Toso
2023-09-05 19:48 ` [PATCH v1 1/7] qapi: scripts: add a generator for qapi's examples Victor Toso
2023-09-06 9:15 ` Daniel P. Berrangé
2023-09-07 18:34 ` Victor Toso
2023-09-08 8:12 ` Daniel P. Berrangé [this message]
2023-09-05 19:48 ` [PATCH v1 2/7] qapi: fix example of get-win32-socket command Victor Toso
2023-09-06 9:04 ` Daniel P. Berrangé
2023-09-05 19:48 ` [PATCH v1 3/7] qapi: fix example of dumpdtb command Victor Toso
2023-09-06 9:04 ` Daniel P. Berrangé
2023-09-05 19:48 ` [PATCH v1 4/7] qapi: fix example of cancel-vcpu-dirty-limit command Victor Toso
2023-09-06 9:03 ` Daniel P. Berrangé
2023-09-05 19:48 ` [PATCH v1 5/7] qapi: fix example of set-vcpu-dirty-limit command Victor Toso
2023-09-06 9:03 ` Daniel P. Berrangé
2023-09-05 19:48 ` [PATCH v1 6/7] qapi: fix example of calc-dirty-rate command Victor Toso
2023-09-06 9:02 ` Daniel P. Berrangé
2023-09-05 19:48 ` [PATCH v1 7/7] qapi: fix example of NETDEV_STREAM_CONNECTED event Victor Toso
2023-09-06 9:02 ` Daniel P. Berrangé
2023-09-06 9:17 ` [PATCH v1 0/7] Validate and test qapi examples Daniel P. Berrangé
2023-09-07 18:17 ` Victor Toso
2023-09-08 7:51 ` Philippe Mathieu-Daudé
2023-09-08 8:14 ` Daniel P. Berrangé
2023-09-14 16:26 ` Victor Toso
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=ZPrXg36lLYrLQ23Q@redhat.com \
--to=berrange@redhat.com \
--cc=armbru@redhat.com \
--cc=jsnow@redhat.com \
--cc=qemu-devel@nongnu.org \
--cc=victortoso@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).