* [PATCH v2 00/11] Validate and test qapi examples @ 2023-09-11 10:40 Victor Toso 2023-09-11 10:40 ` [PATCH v2 01/11] qapi: fix example of get-win32-socket command Victor Toso ` (10 more replies) 0 siblings, 11 replies; 19+ messages in thread From: Victor Toso @ 2023-09-11 10:40 UTC (permalink / raw) To: qemu-devel; +Cc: Markus Armbruster, John Snow, Daniel P . Berrangé Hi, v1: https://lists.gnu.org/archive/html/qemu-devel/2023-09/msg00853.html Changes: - Fixed running the generator with tests (Daniel). Added a flag for the generator, set in tests/meson.build (Philippe). - Moved the script to the end of the series, to avoid git bisect issues (Daniel) - Added a proper assert() to the generator, making it fail if any documentation error was found instead of just printing to the stderr and carry on. (Daniel) - Fixed the 3 other warnings the generator was showing, we are 100% free of warnings (in my machine) Cheers, Victor Victor Toso (11): qapi: fix example of get-win32-socket command qapi: fix example of dumpdtb command qapi: fix example of cancel-vcpu-dirty-limit command qapi: fix example of set-vcpu-dirty-limit command qapi: fix example of calc-dirty-rate command qapi: fix example of NETDEV_STREAM_CONNECTED event qapi: fix example of query-rocker-of-dpa-flows command qapi: fix example of query-spice command qapi: fix example of query-blockstats command qapi: meson: add test flag to allow skip generators qapi: scripts: add a generator for qapi's examples qapi/block-core.json | 32 +++--- qapi/machine.json | 2 +- qapi/migration.json | 6 +- qapi/misc.json | 2 +- qapi/net.json | 6 +- qapi/rocker.json | 3 +- qapi/ui.json | 3 +- scripts/qapi/dumpexamples.py | 204 +++++++++++++++++++++++++++++++++++ scripts/qapi/main.py | 9 +- tests/meson.build | 2 +- 10 files changed, 239 insertions(+), 30 deletions(-) create mode 100644 scripts/qapi/dumpexamples.py -- 2.41.0 ^ permalink raw reply [flat|nested] 19+ messages in thread
* [PATCH v2 01/11] qapi: fix example of get-win32-socket command 2023-09-11 10:40 [PATCH v2 00/11] Validate and test qapi examples Victor Toso @ 2023-09-11 10:40 ` Victor Toso 2023-09-11 10:40 ` [PATCH v2 02/11] qapi: fix example of dumpdtb command Victor Toso ` (9 subsequent siblings) 10 siblings, 0 replies; 19+ messages in thread From: Victor Toso @ 2023-09-11 10:40 UTC (permalink / raw) To: qemu-devel; +Cc: Markus Armbruster, John Snow, Daniel P . Berrangé Example output lacks double quotes. Fix it. Fixes: 4cda177c60 "qmp: add 'get-win32-socket'" Signed-off-by: Victor Toso <victortoso@redhat.com> Reviewed-by: Daniel P. Berrangé <berrange@redhat.com> --- qapi/misc.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/qapi/misc.json b/qapi/misc.json index cda2effa81..be302cadeb 100644 --- a/qapi/misc.json +++ b/qapi/misc.json @@ -290,7 +290,7 @@ # # Example: # -# -> { "execute": "get-win32-socket", "arguments": { "info": "abcd123..", fdname": "skclient" } } +# -> { "execute": "get-win32-socket", "arguments": { "info": "abcd123..", "fdname": "skclient" } } # <- { "return": {} } ## { 'command': 'get-win32-socket', 'data': {'info': 'str', 'fdname': 'str'}, 'if': 'CONFIG_WIN32' } -- 2.41.0 ^ permalink raw reply related [flat|nested] 19+ messages in thread
* [PATCH v2 02/11] qapi: fix example of dumpdtb command 2023-09-11 10:40 [PATCH v2 00/11] Validate and test qapi examples Victor Toso 2023-09-11 10:40 ` [PATCH v2 01/11] qapi: fix example of get-win32-socket command Victor Toso @ 2023-09-11 10:40 ` Victor Toso 2023-09-11 10:40 ` [PATCH v2 03/11] qapi: fix example of cancel-vcpu-dirty-limit command Victor Toso ` (8 subsequent siblings) 10 siblings, 0 replies; 19+ messages in thread From: Victor Toso @ 2023-09-11 10:40 UTC (permalink / raw) To: qemu-devel; +Cc: Markus Armbruster, John Snow, Daniel P . Berrangé Example output has extra end curly bracket. Switch with comma. Signed-off-by: Victor Toso <victortoso@redhat.com> Reviewed-by: Daniel P. Berrangé <berrange@redhat.com> --- qapi/machine.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/qapi/machine.json b/qapi/machine.json index a08b6576ca..9eb76193e0 100644 --- a/qapi/machine.json +++ b/qapi/machine.json @@ -1684,7 +1684,7 @@ # # Example: # -# -> { "execute": "dumpdtb" } +# -> { "execute": "dumpdtb", # "arguments": { "filename": "fdt.dtb" } } # <- { "return": {} } ## -- 2.41.0 ^ permalink raw reply related [flat|nested] 19+ messages in thread
* [PATCH v2 03/11] qapi: fix example of cancel-vcpu-dirty-limit command 2023-09-11 10:40 [PATCH v2 00/11] Validate and test qapi examples Victor Toso 2023-09-11 10:40 ` [PATCH v2 01/11] qapi: fix example of get-win32-socket command Victor Toso 2023-09-11 10:40 ` [PATCH v2 02/11] qapi: fix example of dumpdtb command Victor Toso @ 2023-09-11 10:40 ` Victor Toso 2023-09-11 10:40 ` [PATCH v2 04/11] qapi: fix example of set-vcpu-dirty-limit command Victor Toso ` (7 subsequent siblings) 10 siblings, 0 replies; 19+ messages in thread From: Victor Toso @ 2023-09-11 10:40 UTC (permalink / raw) To: qemu-devel; +Cc: Markus Armbruster, John Snow, Daniel P . Berrangé Example output has extra end curly bracket. Remove it. Signed-off-by: Victor Toso <victortoso@redhat.com> Reviewed-by: Daniel P. Berrangé <berrange@redhat.com> --- qapi/migration.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/qapi/migration.json b/qapi/migration.json index 8843e74b59..9385b9f87c 100644 --- a/qapi/migration.json +++ b/qapi/migration.json @@ -2010,7 +2010,7 @@ # # Example: # -# -> {"execute": "cancel-vcpu-dirty-limit"}, +# -> {"execute": "cancel-vcpu-dirty-limit", # "arguments": { "cpu-index": 1 } } # <- { "return": {} } ## -- 2.41.0 ^ permalink raw reply related [flat|nested] 19+ messages in thread
* [PATCH v2 04/11] qapi: fix example of set-vcpu-dirty-limit command 2023-09-11 10:40 [PATCH v2 00/11] Validate and test qapi examples Victor Toso ` (2 preceding siblings ...) 2023-09-11 10:40 ` [PATCH v2 03/11] qapi: fix example of cancel-vcpu-dirty-limit command Victor Toso @ 2023-09-11 10:40 ` Victor Toso 2023-09-11 10:40 ` [PATCH v2 05/11] qapi: fix example of calc-dirty-rate command Victor Toso ` (6 subsequent siblings) 10 siblings, 0 replies; 19+ messages in thread From: Victor Toso @ 2023-09-11 10:40 UTC (permalink / raw) To: qemu-devel; +Cc: Markus Armbruster, John Snow, Daniel P . Berrangé Example output has extra end curly bracket. Remove it. Signed-off-by: Victor Toso <victortoso@redhat.com> Reviewed-by: Daniel P. Berrangé <berrange@redhat.com> --- qapi/migration.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/qapi/migration.json b/qapi/migration.json index 9385b9f87c..2658cdbcbe 100644 --- a/qapi/migration.json +++ b/qapi/migration.json @@ -1986,7 +1986,7 @@ # # Example: # -# -> {"execute": "set-vcpu-dirty-limit"} +# -> {"execute": "set-vcpu-dirty-limit", # "arguments": { "dirty-rate": 200, # "cpu-index": 1 } } # <- { "return": {} } -- 2.41.0 ^ permalink raw reply related [flat|nested] 19+ messages in thread
* [PATCH v2 05/11] qapi: fix example of calc-dirty-rate command 2023-09-11 10:40 [PATCH v2 00/11] Validate and test qapi examples Victor Toso ` (3 preceding siblings ...) 2023-09-11 10:40 ` [PATCH v2 04/11] qapi: fix example of set-vcpu-dirty-limit command Victor Toso @ 2023-09-11 10:40 ` Victor Toso 2023-09-11 10:40 ` [PATCH v2 06/11] qapi: fix example of NETDEV_STREAM_CONNECTED event Victor Toso ` (5 subsequent siblings) 10 siblings, 0 replies; 19+ messages in thread From: Victor Toso @ 2023-09-11 10:40 UTC (permalink / raw) To: qemu-devel; +Cc: Markus Armbruster, John Snow, Daniel P . Berrangé Example output has property name with single quotes. Fix it. Signed-off-by: Victor Toso <victortoso@redhat.com> Reviewed-by: Daniel P. Berrangé <berrange@redhat.com> --- qapi/migration.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/qapi/migration.json b/qapi/migration.json index 2658cdbcbe..45dac41f67 100644 --- a/qapi/migration.json +++ b/qapi/migration.json @@ -1922,7 +1922,7 @@ # Example: # # -> {"execute": "calc-dirty-rate", "arguments": {"calc-time": 1, -# 'sample-pages': 512} } +# "sample-pages": 512} } # <- { "return": {} } ## { 'command': 'calc-dirty-rate', 'data': {'calc-time': 'int64', -- 2.41.0 ^ permalink raw reply related [flat|nested] 19+ messages in thread
* [PATCH v2 06/11] qapi: fix example of NETDEV_STREAM_CONNECTED event 2023-09-11 10:40 [PATCH v2 00/11] Validate and test qapi examples Victor Toso ` (4 preceding siblings ...) 2023-09-11 10:40 ` [PATCH v2 05/11] qapi: fix example of calc-dirty-rate command Victor Toso @ 2023-09-11 10:40 ` Victor Toso 2023-09-11 10:40 ` [PATCH v2 07/11] qapi: fix example of query-rocker-of-dpa-flows command Victor Toso ` (4 subsequent siblings) 10 siblings, 0 replies; 19+ messages in thread From: Victor Toso @ 2023-09-11 10:40 UTC (permalink / raw) To: qemu-devel; +Cc: Markus Armbruster, John Snow, Daniel P . Berrangé Example output was using single quotes. Fix it. Signed-off-by: Victor Toso <victortoso@redhat.com> Reviewed-by: Daniel P. Berrangé <berrange@redhat.com> --- qapi/net.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/qapi/net.json b/qapi/net.json index 313c8a606e..81988e499a 100644 --- a/qapi/net.json +++ b/qapi/net.json @@ -930,9 +930,9 @@ # # Example: # -# <- { 'event': 'NETDEV_STREAM_DISCONNECTED', -# 'data': {'netdev-id': 'netdev0'}, -# 'timestamp': {'seconds': 1663330937, 'microseconds': 526695} } +# <- { "event": "NETDEV_STREAM_DISCONNECTED", +# "data": {"netdev-id": "netdev0"}, +# "timestamp": {"seconds": 1663330937, "microseconds": 526695} } ## { 'event': 'NETDEV_STREAM_DISCONNECTED', 'data': { 'netdev-id': 'str' } } -- 2.41.0 ^ permalink raw reply related [flat|nested] 19+ messages in thread
* [PATCH v2 07/11] qapi: fix example of query-rocker-of-dpa-flows command 2023-09-11 10:40 [PATCH v2 00/11] Validate and test qapi examples Victor Toso ` (5 preceding siblings ...) 2023-09-11 10:40 ` [PATCH v2 06/11] qapi: fix example of NETDEV_STREAM_CONNECTED event Victor Toso @ 2023-09-11 10:40 ` Victor Toso 2023-09-11 10:53 ` Daniel P. Berrangé 2023-09-14 13:50 ` Markus Armbruster 2023-09-11 10:40 ` [PATCH v2 08/11] qapi: fix example of query-spice command Victor Toso ` (3 subsequent siblings) 10 siblings, 2 replies; 19+ messages in thread From: Victor Toso @ 2023-09-11 10:40 UTC (permalink / raw) To: qemu-devel; +Cc: Markus Armbruster, John Snow, Daniel P . Berrangé Example output has a comment embedded in the array. Remove it. The end result is a list of size 1. Signed-off-by: Victor Toso <victortoso@redhat.com> --- qapi/rocker.json | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/qapi/rocker.json b/qapi/rocker.json index 31ce0b36f6..858e4f4a45 100644 --- a/qapi/rocker.json +++ b/qapi/rocker.json @@ -249,8 +249,7 @@ # "cookie": 0, # "action": {"goto-tbl": 10}, # "mask": {"in-pport": 4294901760} -# }, -# {...more...}, +# } # ]} ## { 'command': 'query-rocker-of-dpa-flows', -- 2.41.0 ^ permalink raw reply related [flat|nested] 19+ messages in thread
* Re: [PATCH v2 07/11] qapi: fix example of query-rocker-of-dpa-flows command 2023-09-11 10:40 ` [PATCH v2 07/11] qapi: fix example of query-rocker-of-dpa-flows command Victor Toso @ 2023-09-11 10:53 ` Daniel P. Berrangé 2023-09-14 13:50 ` Markus Armbruster 1 sibling, 0 replies; 19+ messages in thread From: Daniel P. Berrangé @ 2023-09-11 10:53 UTC (permalink / raw) To: Victor Toso; +Cc: qemu-devel, Markus Armbruster, John Snow On Mon, Sep 11, 2023 at 12:40:15PM +0200, Victor Toso wrote: > Example output has a comment embedded in the array. Remove it. > The end result is a list of size 1. > > Signed-off-by: Victor Toso <victortoso@redhat.com> > --- > qapi/rocker.json | 3 +-- > 1 file changed, 1 insertion(+), 2 deletions(-) Reviewed-by: Daniel P. Berrangé <berrange@redhat.com> 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 :| ^ permalink raw reply [flat|nested] 19+ messages in thread
* Re: [PATCH v2 07/11] qapi: fix example of query-rocker-of-dpa-flows command 2023-09-11 10:40 ` [PATCH v2 07/11] qapi: fix example of query-rocker-of-dpa-flows command Victor Toso 2023-09-11 10:53 ` Daniel P. Berrangé @ 2023-09-14 13:50 ` Markus Armbruster 2023-09-14 14:01 ` Victor Toso 1 sibling, 1 reply; 19+ messages in thread From: Markus Armbruster @ 2023-09-14 13:50 UTC (permalink / raw) To: Victor Toso; +Cc: qemu-devel, John Snow, Daniel P . Berrangé Victor Toso <victortoso@redhat.com> writes: > Example output has a comment embedded in the array. Remove it. > The end result is a list of size 1. > > Signed-off-by: Victor Toso <victortoso@redhat.com> > --- > qapi/rocker.json | 3 +-- > 1 file changed, 1 insertion(+), 2 deletions(-) > > diff --git a/qapi/rocker.json b/qapi/rocker.json > index 31ce0b36f6..858e4f4a45 100644 > --- a/qapi/rocker.json > +++ b/qapi/rocker.json > @@ -249,8 +249,7 @@ > # "cookie": 0, > # "action": {"goto-tbl": 10}, > # "mask": {"in-pport": 4294901760} > -# }, > -# {...more...}, > +# } > # ]} > ## > { 'command': 'query-rocker-of-dpa-flows', The schema patches in this series fix typos, except for this patch and the next one, which drop "more of the same omitted for brevity" text. I believe you drop the text because it doesn't parse as JSON. Fine if the example still make sense afterwards. Do they? Shortening examples is a reasonable thing to do. Perhaps we should adopt a conventional way to do it, and teach the proposed generator to cope with it. What do you think? ^ permalink raw reply [flat|nested] 19+ messages in thread
* Re: [PATCH v2 07/11] qapi: fix example of query-rocker-of-dpa-flows command 2023-09-14 13:50 ` Markus Armbruster @ 2023-09-14 14:01 ` Victor Toso 2023-09-14 14:15 ` Daniel P. Berrangé 0 siblings, 1 reply; 19+ messages in thread From: Victor Toso @ 2023-09-14 14:01 UTC (permalink / raw) To: Markus Armbruster; +Cc: qemu-devel, John Snow, Daniel P . Berrangé [-- Attachment #1: Type: text/plain, Size: 2149 bytes --] Hi, On Thu, Sep 14, 2023 at 03:50:23PM +0200, Markus Armbruster wrote: > Victor Toso <victortoso@redhat.com> writes: > > > Example output has a comment embedded in the array. Remove it. > > The end result is a list of size 1. > > > > Signed-off-by: Victor Toso <victortoso@redhat.com> > > --- > > qapi/rocker.json | 3 +-- > > 1 file changed, 1 insertion(+), 2 deletions(-) > > > > diff --git a/qapi/rocker.json b/qapi/rocker.json > > index 31ce0b36f6..858e4f4a45 100644 > > --- a/qapi/rocker.json > > +++ b/qapi/rocker.json > > @@ -249,8 +249,7 @@ > > # "cookie": 0, > > # "action": {"goto-tbl": 10}, > > # "mask": {"in-pport": 4294901760} > > -# }, > > -# {...more...}, > > +# } > > # ]} > > ## > > { 'command': 'query-rocker-of-dpa-flows', > > The schema patches in this series fix typos, except for this patch and > the next one, which drop "more of the same omitted for brevity" text. I > believe you drop the text because it doesn't parse as JSON. That's correct. > Fine if the example still make sense afterwards. Do they? It depends what you mean by making sense. I did not setup rocker to do this query and copied a real example. I think the real example would have a list of size more than one. So, if you think about real examples, it might not make sense. If we talk about clarifying they API, I think it is reasonable. > Shortening examples is a reasonable thing to do. Perhaps we > should adopt a conventional way to do it, and teach the > proposed generator to cope with it. What do you think? Yep, I like it. In reality, I did not do this change in v1 but it was suggested by Daniel that the end result of introducing this generator would be to have it run without errors, so I shortened as a simple way to fix it. So, should we instead move forward with another convention for comments inside the examples? This way we could still have a list size 1 with this patch but it would be clear that the expectation is a bigger list. Cheers, Victor [-- Attachment #2: signature.asc --] [-- Type: application/pgp-signature, Size: 833 bytes --] ^ permalink raw reply [flat|nested] 19+ messages in thread
* Re: [PATCH v2 07/11] qapi: fix example of query-rocker-of-dpa-flows command 2023-09-14 14:01 ` Victor Toso @ 2023-09-14 14:15 ` Daniel P. Berrangé 0 siblings, 0 replies; 19+ messages in thread From: Daniel P. Berrangé @ 2023-09-14 14:15 UTC (permalink / raw) To: Victor Toso; +Cc: Markus Armbruster, qemu-devel, John Snow On Thu, Sep 14, 2023 at 04:01:55PM +0200, Victor Toso wrote: > Hi, > > On Thu, Sep 14, 2023 at 03:50:23PM +0200, Markus Armbruster wrote: > > Victor Toso <victortoso@redhat.com> writes: > > > > > Example output has a comment embedded in the array. Remove it. > > > The end result is a list of size 1. > > > > > > Signed-off-by: Victor Toso <victortoso@redhat.com> > > > --- > > > qapi/rocker.json | 3 +-- > > > 1 file changed, 1 insertion(+), 2 deletions(-) > > > > > > diff --git a/qapi/rocker.json b/qapi/rocker.json > > > index 31ce0b36f6..858e4f4a45 100644 > > > --- a/qapi/rocker.json > > > +++ b/qapi/rocker.json > > > @@ -249,8 +249,7 @@ > > > # "cookie": 0, > > > # "action": {"goto-tbl": 10}, > > > # "mask": {"in-pport": 4294901760} > > > -# }, > > > -# {...more...}, > > > +# } > > > # ]} > > > ## > > > { 'command': 'query-rocker-of-dpa-flows', > > > > The schema patches in this series fix typos, except for this patch and > > the next one, which drop "more of the same omitted for brevity" text. I > > believe you drop the text because it doesn't parse as JSON. > > That's correct. > > > Fine if the example still make sense afterwards. Do they? > > It depends what you mean by making sense. I did not setup rocker > to do this query and copied a real example. I think the real > example would have a list of size more than one. > > So, if you think about real examples, it might not make sense. If > we talk about clarifying they API, I think it is reasonable. > > > Shortening examples is a reasonable thing to do. Perhaps we > > should adopt a conventional way to do it, and teach the > > proposed generator to cope with it. What do you think? > > Yep, I like it. In reality, I did not do this change in v1 but it > was suggested by Daniel that the end result of introducing this > generator would be to have it run without errors, so I shortened > as a simple way to fix it. > > So, should we instead move forward with another convention for > comments inside the examples? This way we could still have a list > size 1 with this patch but it would be clear that the expectation > is a bigger list. Personally I'd say if a field is a list, then the example should contain 2 elements, just to make it a little more obvious at a glance, as opposed to relying on spottnig the []. But that's not a massively strong argument. 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 :| ^ permalink raw reply [flat|nested] 19+ messages in thread
* [PATCH v2 08/11] qapi: fix example of query-spice command 2023-09-11 10:40 [PATCH v2 00/11] Validate and test qapi examples Victor Toso ` (6 preceding siblings ...) 2023-09-11 10:40 ` [PATCH v2 07/11] qapi: fix example of query-rocker-of-dpa-flows command Victor Toso @ 2023-09-11 10:40 ` Victor Toso 2023-09-11 10:53 ` Daniel P. Berrangé 2023-09-11 10:40 ` [PATCH v2 09/11] qapi: fix example of query-blockstats command Victor Toso ` (2 subsequent siblings) 10 siblings, 1 reply; 19+ messages in thread From: Victor Toso @ 2023-09-11 10:40 UTC (permalink / raw) To: qemu-devel; +Cc: Markus Armbruster, John Snow, Daniel P . Berrangé Example output has a comment embedded in the array. Remove it. The end result is a list of size 2. Signed-off-by: Victor Toso <victortoso@redhat.com> --- qapi/ui.json | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/qapi/ui.json b/qapi/ui.json index 006616aa77..6ed36c45ea 100644 --- a/qapi/ui.json +++ b/qapi/ui.json @@ -363,8 +363,7 @@ # "host": "127.0.0.1", # "channel-id": 0, # "tls": false -# }, -# [ ... more channels follow ... ] +# } # ] # } # } -- 2.41.0 ^ permalink raw reply related [flat|nested] 19+ messages in thread
* Re: [PATCH v2 08/11] qapi: fix example of query-spice command 2023-09-11 10:40 ` [PATCH v2 08/11] qapi: fix example of query-spice command Victor Toso @ 2023-09-11 10:53 ` Daniel P. Berrangé 0 siblings, 0 replies; 19+ messages in thread From: Daniel P. Berrangé @ 2023-09-11 10:53 UTC (permalink / raw) To: Victor Toso; +Cc: qemu-devel, Markus Armbruster, John Snow On Mon, Sep 11, 2023 at 12:40:16PM +0200, Victor Toso wrote: > Example output has a comment embedded in the array. Remove it. > The end result is a list of size 2. > > Signed-off-by: Victor Toso <victortoso@redhat.com> > --- > qapi/ui.json | 3 +-- > 1 file changed, 1 insertion(+), 2 deletions(-) Reviewed-by: Daniel P. Berrangé <berrange@redhat.com> 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 :| ^ permalink raw reply [flat|nested] 19+ messages in thread
* [PATCH v2 09/11] qapi: fix example of query-blockstats command 2023-09-11 10:40 [PATCH v2 00/11] Validate and test qapi examples Victor Toso ` (7 preceding siblings ...) 2023-09-11 10:40 ` [PATCH v2 08/11] qapi: fix example of query-spice command Victor Toso @ 2023-09-11 10:40 ` Victor Toso 2023-09-11 10:55 ` Daniel P. Berrangé 2023-09-11 11:27 ` [PATCH v2 10/11] qapi: meson: add test flag to allow skip generators Victor Toso 2023-09-14 13:51 ` [PATCH v2 00/11] Validate and test qapi examples Markus Armbruster 10 siblings, 1 reply; 19+ messages in thread From: Victor Toso @ 2023-09-11 10:40 UTC (permalink / raw) To: qemu-devel; +Cc: Markus Armbruster, John Snow, Daniel P . Berrangé Example output has several missing commas. Add them. Signed-off-by: Victor Toso <victortoso@redhat.com> --- qapi/block-core.json | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/qapi/block-core.json b/qapi/block-core.json index 2b1d493d6e..6a81103594 100644 --- a/qapi/block-core.json +++ b/qapi/block-core.json @@ -1167,10 +1167,10 @@ # "wr_bytes":9786368, # "wr_operations":751, # "rd_bytes":122567168, -# "rd_operations":36772 -# "wr_total_times_ns":313253456 -# "rd_total_times_ns":3465673657 -# "flush_total_times_ns":49653 +# "rd_operations":36772, +# "wr_total_times_ns":313253456, +# "rd_total_times_ns":3465673657, +# "flush_total_times_ns":49653, # "flush_operations":61, # "rd_merged":0, # "wr_merged":0, @@ -1184,10 +1184,10 @@ # "wr_bytes":9786368, # "wr_operations":692, # "rd_bytes":122739200, -# "rd_operations":36604 +# "rd_operations":36604, # "flush_operations":51, -# "wr_total_times_ns":313253456 -# "rd_total_times_ns":3465673657 +# "wr_total_times_ns":313253456, +# "rd_total_times_ns":3465673657, # "flush_total_times_ns":49653, # "rd_merged":0, # "wr_merged":0, @@ -1204,10 +1204,10 @@ # "wr_bytes":0, # "wr_operations":0, # "rd_bytes":0, -# "rd_operations":0 +# "rd_operations":0, # "flush_operations":0, -# "wr_total_times_ns":0 -# "rd_total_times_ns":0 +# "wr_total_times_ns":0, +# "rd_total_times_ns":0, # "flush_total_times_ns":0, # "rd_merged":0, # "wr_merged":0, @@ -1223,10 +1223,10 @@ # "wr_bytes":0, # "wr_operations":0, # "rd_bytes":0, -# "rd_operations":0 +# "rd_operations":0, # "flush_operations":0, -# "wr_total_times_ns":0 -# "rd_total_times_ns":0 +# "wr_total_times_ns":0, +# "rd_total_times_ns":0, # "flush_total_times_ns":0, # "rd_merged":0, # "wr_merged":0, @@ -1242,10 +1242,10 @@ # "wr_bytes":0, # "wr_operations":0, # "rd_bytes":0, -# "rd_operations":0 +# "rd_operations":0, # "flush_operations":0, -# "wr_total_times_ns":0 -# "rd_total_times_ns":0 +# "wr_total_times_ns":0, +# "rd_total_times_ns":0, # "flush_total_times_ns":0, # "rd_merged":0, # "wr_merged":0, -- 2.41.0 ^ permalink raw reply related [flat|nested] 19+ messages in thread
* Re: [PATCH v2 09/11] qapi: fix example of query-blockstats command 2023-09-11 10:40 ` [PATCH v2 09/11] qapi: fix example of query-blockstats command Victor Toso @ 2023-09-11 10:55 ` Daniel P. Berrangé 0 siblings, 0 replies; 19+ messages in thread From: Daniel P. Berrangé @ 2023-09-11 10:55 UTC (permalink / raw) To: Victor Toso; +Cc: qemu-devel, Markus Armbruster, John Snow On Mon, Sep 11, 2023 at 12:40:17PM +0200, Victor Toso wrote: > Example output has several missing commas. Add them. > > Signed-off-by: Victor Toso <victortoso@redhat.com> > --- > qapi/block-core.json | 32 ++++++++++++++++---------------- > 1 file changed, 16 insertions(+), 16 deletions(-) Reviewed-by: Daniel P. Berrangé <berrange@redhat.com> 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 :| ^ permalink raw reply [flat|nested] 19+ messages in thread
* [PATCH v2 10/11] qapi: meson: add test flag to allow skip generators 2023-09-11 10:40 [PATCH v2 00/11] Validate and test qapi examples Victor Toso ` (8 preceding siblings ...) 2023-09-11 10:40 ` [PATCH v2 09/11] qapi: fix example of query-blockstats command Victor Toso @ 2023-09-11 11:27 ` Victor Toso 2023-09-11 11:27 ` [PATCH v2 11/11] qapi: scripts: add a generator for qapi's examples Victor Toso 2023-09-14 13:51 ` [PATCH v2 00/11] Validate and test qapi examples Markus Armbruster 10 siblings, 1 reply; 19+ messages in thread From: Victor Toso @ 2023-09-11 11:27 UTC (permalink / raw) To: qemu-devel The next patch adds a generator that also validates qapi documentation. We don't want to execute it with a test schema. Signed-off-by: Victor Toso <victortoso@redhat.com> --- scripts/qapi/main.py | 4 ++++ tests/meson.build | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/scripts/qapi/main.py b/scripts/qapi/main.py index 316736b6a2..7efdcc6b8d 100644 --- a/scripts/qapi/main.py +++ b/scripts/qapi/main.py @@ -33,6 +33,7 @@ def generate(schema_file: str, prefix: str, unmask: bool = False, builtins: bool = False, + test_schema: bool = False, gen_tracing: bool = False) -> None: """ Generate C code for the given schema into the target directory. @@ -75,6 +76,8 @@ def main() -> int: parser.add_argument('-u', '--unmask-non-abi-names', action='store_true', dest='unmask', help="expose non-ABI names in introspection") + parser.add_argument('-t', '--tests', action='store_true', + help="flag generator that is running with a test schema") # Option --suppress-tracing exists so we can avoid solving build system # problems. TODO Drop it when we no longer need it. @@ -96,6 +99,7 @@ def main() -> int: prefix=args.prefix, unmask=args.unmask, builtins=args.builtins, + test_schema=args.tests, gen_tracing=not args.suppress_tracing) except QAPIError as err: print(err, file=sys.stderr) diff --git a/tests/meson.build b/tests/meson.build index debaa4505e..ed0844a6a0 100644 --- a/tests/meson.build +++ b/tests/meson.build @@ -43,7 +43,7 @@ test_qapi_files = custom_target('Test QAPI files', 'qapi-schema/include/sub-module.json', 'qapi-schema/sub-sub-module.json'), command: [ qapi_gen, '-o', meson.current_build_dir(), - '-b', '-p', 'test-', '@INPUT0@', + '-t', '-b', '-p', 'test-', '@INPUT0@', '--suppress-tracing' ], depend_files: qapi_gen_depends) -- 2.41.0 ^ permalink raw reply related [flat|nested] 19+ messages in thread
* [PATCH v2 11/11] qapi: scripts: add a generator for qapi's examples 2023-09-11 11:27 ` [PATCH v2 10/11] qapi: meson: add test flag to allow skip generators Victor Toso @ 2023-09-11 11:27 ` Victor Toso 0 siblings, 0 replies; 19+ messages in thread From: Victor Toso @ 2023-09-11 11:27 UTC (permalink / raw) To: qemu-devel 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 | 204 +++++++++++++++++++++++++++++++++++ scripts/qapi/main.py | 5 +- 2 files changed, 208 insertions(+), 1 deletion(-) 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..5a1c275bc8 --- /dev/null +++ b/scripts/qapi/dumpexamples.py @@ -0,0 +1,204 @@ +""" +Dump examples for Developers +""" +# Copyright (c) 2023 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, bool): + # 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])) + return {}, True + else: + return ret, False + + +def parse_text_to_dicts(text: str, context: str) -> (List[Dict], bool): + examples, clients, servers = [], [], [] + failed = False + + count = 1 + c, s = text.find("->"), text.find("<-") + while c != -1 or s != -1: + if c == -1 or (s != -1 and s < c): + start, target = s, servers + else: + start, target = c, clients + + # Find the client and server, if any + if c != -1: + c = text.find("->", start + 1) + if s != -1: + s = text.find("<-", start + 1) + + # Find the limit of current's object. + # We first look for the next message, either client or server. If none + # is avaible, we set the end of the text as limit. + if c == -1 and s != -1: + end = s + elif c != -1 and s == -1: + end = c + elif c != -1 and s != -1: + end = (c < s) and c or s + else: + end = len(text) - 1 + + message, error = next_object(text, start, end, context) + if error: + failed = True + + if len(message) > 0: + message_type = "return" + if "execute" in message: + message_type = "command" + elif "event" in message: + message_type = "event" + + target.append({ + "sequence-order": count, + "message-type": message_type, + "message": message + }) + count += 1 + + examples.append({"client": clients, "server": servers}) + return examples, failed + + +def parse_examples_of(self: QAPISchemaGenExamplesVisitor, + name: str): + + assert(name in self.schema._entity_dict) + obj = self.schema._entity_dict[name] + assert((obj.doc is not None)) + module_name = obj._module.name + + # We initialize random with the name so that we get consistent example + # ids over different generations. The ids of a given example might + # change when adding/removing examples, but that's acceptable as the + # goal is just to grep $id to find what example failed at a given test + # with minimum chorn over regenerating. + random.seed(name, version=2) + + for s in obj.doc.sections: + if s.name != "Example": + continue + + if module_name not in self.target: + self.target[module_name] = [] + + context = f'''{name} at {obj.info.fname}:{obj.info.line}''' + examples, failed = parse_text_to_dicts(s.text, context) + if failed: + # To warn user that docs needs fixing + self.failed = True + + for example in examples: + self.target[module_name].append({ + "id": get_id(random, 10), + "client": example["client"], + "server": example["server"] + }) + + +class QAPISchemaGenExamplesVisitor(QAPISchemaVisitor): + + def __init__(self, prefix: str): + super().__init__() + self.target = {} + self.schema = None + self.failed = False + + def visit_begin(self, schema): + self.schema = schema + + def visit_end(self): + self.schema = None + assert not self.failed, "Should fix the docs" + + def write(self: QAPISchemaGenExamplesVisitor, + output_dir: str) -> None: + for filename, content in self.target.items(): + pathname = os.path.join(output_dir, "examples", filename) + odir = os.path.dirname(pathname) + os.makedirs(odir, exist_ok=True) + result = {"examples": content} + + with open(pathname, "w") as outfile: + outfile.write(json.dumps(result, indent=2, sort_keys=True)) + + def visit_command(self: QAPISchemaGenExamplesVisitor, + name: str, + info: Optional[QAPISourceInfo], + ifcond: QAPISchemaIfCond, + features: List[QAPISchemaFeature], + arg_type: Optional[QAPISchemaObjectType], + ret_type: Optional[QAPISchemaType], + gen: bool, + success_response: bool, + boxed: bool, + allow_oob: bool, + allow_preconfig: bool, + coroutine: bool) -> None: + + if gen: + parse_examples_of(self, name) + + def visit_event(self: QAPISchemaGenExamplesVisitor, + name: str, + info: Optional[QAPISourceInfo], + ifcond: QAPISchemaIfCond, + features: List[QAPISchemaFeature], + arg_type: Optional[QAPISchemaObjectType], + boxed: bool): + + parse_examples_of(self, name) diff --git a/scripts/qapi/main.py b/scripts/qapi/main.py index 7efdcc6b8d..9d71d78b55 100644 --- a/scripts/qapi/main.py +++ b/scripts/qapi/main.py @@ -13,6 +13,7 @@ from .commands import gen_commands from .common import must_match +from .dumpexamples import gen_examples from .error import QAPIError from .events import gen_events from .introspect import gen_introspect @@ -54,7 +55,9 @@ def generate(schema_file: str, gen_commands(schema, output_dir, prefix, gen_tracing) gen_events(schema, output_dir, prefix) gen_introspect(schema, output_dir, prefix, unmask) - + + if not test_schema: + gen_examples(schema, output_dir, prefix) def main() -> int: """ -- 2.41.0 ^ permalink raw reply related [flat|nested] 19+ messages in thread
* Re: [PATCH v2 00/11] Validate and test qapi examples 2023-09-11 10:40 [PATCH v2 00/11] Validate and test qapi examples Victor Toso ` (9 preceding siblings ...) 2023-09-11 11:27 ` [PATCH v2 10/11] qapi: meson: add test flag to allow skip generators Victor Toso @ 2023-09-14 13:51 ` Markus Armbruster 10 siblings, 0 replies; 19+ messages in thread From: Markus Armbruster @ 2023-09-14 13:51 UTC (permalink / raw) To: Victor Toso Cc: qemu-devel, Markus Armbruster, John Snow, Daniel P . Berrangé PATCH 01-06,09: Reviewed-by: Markus Armbruster <armbru@redhat.com> ^ permalink raw reply [flat|nested] 19+ messages in thread
end of thread, other threads:[~2023-09-14 14:16 UTC | newest] Thread overview: 19+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2023-09-11 10:40 [PATCH v2 00/11] Validate and test qapi examples Victor Toso 2023-09-11 10:40 ` [PATCH v2 01/11] qapi: fix example of get-win32-socket command Victor Toso 2023-09-11 10:40 ` [PATCH v2 02/11] qapi: fix example of dumpdtb command Victor Toso 2023-09-11 10:40 ` [PATCH v2 03/11] qapi: fix example of cancel-vcpu-dirty-limit command Victor Toso 2023-09-11 10:40 ` [PATCH v2 04/11] qapi: fix example of set-vcpu-dirty-limit command Victor Toso 2023-09-11 10:40 ` [PATCH v2 05/11] qapi: fix example of calc-dirty-rate command Victor Toso 2023-09-11 10:40 ` [PATCH v2 06/11] qapi: fix example of NETDEV_STREAM_CONNECTED event Victor Toso 2023-09-11 10:40 ` [PATCH v2 07/11] qapi: fix example of query-rocker-of-dpa-flows command Victor Toso 2023-09-11 10:53 ` Daniel P. Berrangé 2023-09-14 13:50 ` Markus Armbruster 2023-09-14 14:01 ` Victor Toso 2023-09-14 14:15 ` Daniel P. Berrangé 2023-09-11 10:40 ` [PATCH v2 08/11] qapi: fix example of query-spice command Victor Toso 2023-09-11 10:53 ` Daniel P. Berrangé 2023-09-11 10:40 ` [PATCH v2 09/11] qapi: fix example of query-blockstats command Victor Toso 2023-09-11 10:55 ` Daniel P. Berrangé 2023-09-11 11:27 ` [PATCH v2 10/11] qapi: meson: add test flag to allow skip generators Victor Toso 2023-09-11 11:27 ` [PATCH v2 11/11] qapi: scripts: add a generator for qapi's examples Victor Toso 2023-09-14 13:51 ` [PATCH v2 00/11] Validate and test qapi examples Markus Armbruster
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).