[libvirt] [PATCH 17/21] qemu: qapi: Implement worker for introspecting builtin types

Peter Krempa pkrempa at redhat.com
Mon Apr 15 16:02:10 UTC 2019


Signed-off-by: Peter Krempa <pkrempa at redhat.com>
---
 src/qemu/qemu_qapi.c        | 31 ++++++++++++++++++++++++++++++-
 tests/qemumonitorjsontest.c |  2 ++
 2 files changed, 32 insertions(+), 1 deletion(-)

diff --git a/src/qemu/qemu_qapi.c b/src/qemu/qemu_qapi.c
index 8a695e022d..d401e9a303 100644
--- a/src/qemu/qemu_qapi.c
+++ b/src/qemu/qemu_qapi.c
@@ -121,7 +121,7 @@ virQEMUQAPISchemaTraverseObject(virJSONValuePtr cur,
         query++;

     /* exit on modifers for other types */
-    if (modifier == '^')
+    if (modifier == '^' || modifier == '!')
         return 0;

     if (modifier == '+') {
@@ -203,6 +203,31 @@ virQEMUQAPISchemaTraverseEnum(virJSONValuePtr cur,
 }


+static int
+virQEMUQAPISchemaTraverseBuiltin(virJSONValuePtr cur,
+                                 struct virQEMUQAPISchemaTraverseContext *ctxt)
+{
+    const char *query = virQEMUQAPISchemaTraverseContextNextQuery(ctxt);
+    const char *jsontype;
+
+    if (query[0] != '!')
+        return 0;
+
+    if (virQEMUQAPISchemaTraverseContextHasNextQuery(ctxt))
+        return -3;
+
+    query++;
+
+    if (!(jsontype = virJSONValueObjectGetString(cur, "json-type")))
+        return -1;
+
+    if (STREQ(jsontype, query))
+        return 1;
+
+    return 0;
+}
+
+
 /* The function must return 1 on successful query, 0 if the query was not found
  * -1 when a libvirt error is reported, -2 if the schema is invalid and -3 if
  *  the query component is malformed. */
@@ -221,6 +246,7 @@ static const struct virQEMUQAPISchemaTraverseMetaType traverseMetaType[] = {
     { "command", virQEMUQAPISchemaTraverseCommand },
     { "event", virQEMUQAPISchemaTraverseCommand },
     { "enum", virQEMUQAPISchemaTraverseEnum },
+    { "builtin", virQEMUQAPISchemaTraverseBuiltin },
 };


@@ -280,6 +306,9 @@ virQEMUQAPISchemaTraverse(const char *baseName,
  *
  * - Boolean queries - @entry remains NULL, return value indicates success:
  *   '^enumval': returns true if the previously selected enum contains 'enumval'
+ *   '!basictype': returns true if previously selected type is of 'basictype'
+ *                 JSON type. Spported are 'null', 'string', 'number', 'value',
+ *                 'int' and 'boolean.
  *
  * If the name of any (sub)attribute starts with non-alphabetical symbols it
  * needs to be prefixed by a single space.
diff --git a/tests/qemumonitorjsontest.c b/tests/qemumonitorjsontest.c
index 1c8ecead98..ece42aee0b 100644
--- a/tests/qemumonitorjsontest.c
+++ b/tests/qemumonitorjsontest.c
@@ -3094,12 +3094,14 @@ mymain(void)
     DO_TEST_QAPI_QUERY("variant", "blockdev-add/arg-type/+file", 1, true);
     DO_TEST_QAPI_QUERY("variant property", "blockdev-add/arg-type/+file/filename", 1, true);
     DO_TEST_QAPI_QUERY("enum value", "query-status/ret-type/status/^debug", 1, false);
+    DO_TEST_QAPI_QUERY("builtin type", "query-qmp-schema/ret-type/name/!string", 1, false);

     DO_TEST_QAPI_QUERY("nonexistent command", "nonexistent", 0, false);
     DO_TEST_QAPI_QUERY("nonexistent attr", "screendump/arg-type/nonexistent", 0, false);
     DO_TEST_QAPI_QUERY("nonexistent variant", "blockdev-add/arg-type/+nonexistent", 0, false);
     DO_TEST_QAPI_QUERY("nonexistent enum value", "query-status/ret-type/status/^nonexistentdebug", 0, false);
     DO_TEST_QAPI_QUERY("broken query for enum value", "query-status/ret-type/status/^debug/test", -1, false);
+    DO_TEST_QAPI_QUERY("builtin type", "query-qmp-schema/ret-type/name/!number", 0, false);

 #undef DO_TEST_QAPI_QUERY

-- 
2.20.1




More information about the libvir-list mailing list