qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
* [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

* [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

* [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 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 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

* 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 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 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

* 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

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).