[PATCH 8/8] scripts: qemu-replies-tool: Add option to dump JSON commands that weren't processed by --dump-all

Peter Krempa via Devel posted 8 patches 1 week, 2 days ago
[PATCH 8/8] scripts: qemu-replies-tool: Add option to dump JSON commands that weren't processed by --dump-all
Posted by Peter Krempa via Devel 1 week, 2 days ago
From: Peter Krempa <pkrempa@redhat.com>

This is useful for checking that the script still covers everything when
using it to compare two .replies files.

Signed-off-by: Peter Krempa <pkrempa@redhat.com>
---
 scripts/qemu-replies-tool.py | 59 ++++++++++++++++++++++++++++++++++--
 1 file changed, 57 insertions(+), 2 deletions(-)

diff --git a/scripts/qemu-replies-tool.py b/scripts/qemu-replies-tool.py
index e5a1b2fb3e..cf99ecd1f3 100755
--- a/scripts/qemu-replies-tool.py
+++ b/scripts/qemu-replies-tool.py
@@ -401,6 +401,8 @@ def dump_qom_list_types(conv, dumpprefix):

                 types.append(qomtype['name'])

+            c['processed'] = True
+
             break

     types.sort()
@@ -421,7 +423,12 @@ def dump_device_and_object_properties(conv, dumpprefix):
         if c['cmd']['execute'] == 'qom-list-properties':
             prefix = '(qom-prop)'

-        if prefix is None or 'return' not in c['rep']:
+        if prefix is None:
+            continue
+
+        c['processed'] = True
+
+        if 'return' not in c['rep']:
             continue

         for arg in c['rep']['return']:
@@ -458,9 +465,16 @@ def machine_type_sorter(item):
 def dump_machine_types(conv, dumpprefix):
     machines = dict()
     aliases = []
+    dumped_kvm = False

     for c in conv:
         if c['cmd']['execute'] == 'query-machines':
+
+            c['processed'] = True
+
+            if dumped_kvm:
+                continue
+
             for machine in c['rep']['return']:
                 deprecated = False
                 name = machine['name']
@@ -481,7 +495,9 @@ def dump_machine_types(conv, dumpprefix):
                     machines[name] = {}

                 machines[name][version] = deprecated
-            break
+
+                # Dump only the machines for the first occurence of 'query-machines'
+                dumped_kvm = True

     for (machine, versions) in sorted(machines.items()):
         for (version, deprecated) in sorted(versions.items(), key=machine_type_sorter):
@@ -521,17 +537,47 @@ def dump_other(conv, dumpprefix):
                                                c['rep']['return']['qemu']['minor'],
                                                c['rep']['return']['qemu']['micro'],
                                                c['rep']['return']['package']))
+            c['processed'] = True

         if c['cmd']['execute'] == 'query-target':
             print('%s(target) %s' % (dumpprefix, c['rep']['return']['arch']))
+            c['processed'] = True

         if c['cmd']['execute'] == 'query-kvm':
             print('%s(kvm) present:%s enabled:%s' % (dumpprefix,
                                                      c['rep']['return']['present'],
                                                      c['rep']['return']['enabled']))
+            c['processed'] = True

         if c['cmd']['execute'] == 'query-command-line-options':
             dump_command_line_options(c, dumpprefix)
+            c['processed'] = True
+
+
+# dumps the parts of the .replies file which are not handled by the various dump_
+# helpers
+def dump_unprocessed(conv):
+    actual = ''
+
+    for c in conv:
+        if 'processed' in c and c['processed'] is True:
+            continue
+
+        # skip stuf not making sense to be processed:
+        # 'qmp_capabilities' - startup of QMP, no interesting data
+        # 'query-cpu-model-expansion' - too host dependant, nothing relevant
+        if c['cmd']['execute'] in ['qmp_capabilities', 'query-cpu-model-expansion']:
+            continue
+
+        # skip commands not having successful return
+        if 'return' not in c['rep']:
+            continue
+
+        actual += json.dumps(c['cmd'], indent=2) + '\n\n' + json.dumps(c['rep'], indent=2)
+
+    if actual != '':
+        for line in actual.split('\n'):
+            print('(unprocessed) ' + line)


 def process_one(filename, args):
@@ -551,6 +597,7 @@ def process_one(filename, args):

                 if args.dump_all or args.dump_qmp_query_strings:
                     dump_qmp_probe_strings(c['rep']['return'], dumpprefix)
+                    c['processed'] = True
                     dumped = True

         if args.dump_all:
@@ -560,6 +607,10 @@ def process_one(filename, args):
             dump_machine_types(conv, dumpprefix)
             dumped = True

+        if args.dump_unprocessed:
+            dump_unprocessed(conv)
+            dumped = True
+
         if dumped:
             return True

@@ -635,6 +686,10 @@ parser.add_argument('--dump-all', action='store_true',
 parser.add_argument('--dump-qmp-query-strings', action='store_true',
                     help='dump QMP schema in form of query strings used to probe capabilities')

+
+parser.add_argument('--dump-unprocessed', action='store_true',
+                    help='dump JSON of commands unprocessed by any of the --dump-* options')
+
 args = parser.parse_args()

 files = []
-- 
2.51.0