[PATCH 19/21] qemu: qapi: Implement support for 'features'

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Starting from version 4.1 qemu allows reporting 'features' for a given
QAPI type object. This allows reporting support of fixes and additions
which are otherwise invisible in the QAPI schema.

Implement a possibility to query 'features' in the QAPI query strings.

Signed-off-by: Peter Krempa <pkrempa@xxxxxxxxxx>
---
 src/qemu/qemu_qapi.c | 41 +++++++++++++++++++++++++++++++++++++++++
 1 file changed, 41 insertions(+)

diff --git a/src/qemu/qemu_qapi.c b/src/qemu/qemu_qapi.c
index 4ed67b68bc..5e6dab4417 100644
--- a/src/qemu/qemu_qapi.c
+++ b/src/qemu/qemu_qapi.c
@@ -109,6 +109,38 @@ virQEMUQAPISchemaTraverse(const char *baseName,
                           struct virQEMUQAPISchemaTraverseContext *ctxt);


+/**
+ * @featurename: name of 'feature' field to select
+ * @elem: QAPI JSON entry for a type
+ *
+ * Looks for @featurename in the array of 'features' for given type passed in
+ * via @elem. Returns the pointer to the JSON string representing @feature.
+ */
+static int
+virQEMUQAPISchemaTraverseHasObjectFeature(const char *featurename,
+                                          virJSONValuePtr elem)
+{
+    virJSONValuePtr featuresarray;
+    virJSONValuePtr cur;
+    const char *curstr;
+    size_t i;
+
+    if (!(featuresarray = virJSONValueObjectGetArray(elem, "features")))
+        return 0;
+
+    for (i = 0; i < virJSONValueArraySize(featuresarray); i++) {
+        if (!(cur = virJSONValueArrayGet(featuresarray, i)) ||
+            !(curstr = virJSONValueGetString(cur)))
+            return -2;
+
+        if (STREQ(featurename, curstr))
+            return 1;
+    }
+
+    return 0;
+}
+
+
 static int
 virQEMUQAPISchemaTraverseObject(virJSONValuePtr cur,
                                 struct virQEMUQAPISchemaTraverseContext *ctxt)
@@ -124,6 +156,13 @@ virQEMUQAPISchemaTraverseObject(virJSONValuePtr cur,
     if (modifier == '^' || modifier == '!')
         return 0;

+    if (modifier == '$') {
+        if (virQEMUQAPISchemaTraverseContextHasNextQuery(ctxt))
+            return -3;
+
+        return virQEMUQAPISchemaTraverseHasObjectFeature(query, cur);
+    }
+
     if (modifier == '+') {
         obj = virQEMUQAPISchemaObjectGet("variants", query, "case", cur);
     } else {
@@ -339,6 +378,8 @@ virQEMUQAPISchemaTraverse(const char *baseName,
  *   '!basictype': returns true if previously selected type is of 'basictype'
  *                 JSON type. Spported are 'null', 'string', 'number', 'value',
  *                 'int' and 'boolean.
+ *   '$feature': returns true if the previously selected type supports 'feature'
+ *               ('feature' is in the 'features' array of given type)
  *
  * If the name of any (sub)attribute starts with non-alphabetical symbols it
  * needs to be prefixed by a single space.
-- 
2.20.1

--
libvir-list mailing list
libvir-list@xxxxxxxxxx
https://www.redhat.com/mailman/listinfo/libvir-list



[Index of Archives]     [Virt Tools]     [Libvirt Users]     [Lib OS Info]     [Fedora Users]     [Fedora Desktop]     [Fedora SELinux]     [Big List of Linux Books]     [Yosemite News]     [KDE Users]     [Fedora Tools]

  Powered by Linux