[PATCH 15/15] testQEMUSchemaValidate*: Reject usage of fields with 'deprecated' set

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

 



Make our QMP schema validator reject any use of schema entries which
were deprecated by QEMU except for those whitelisted.

This will allow us to catch this before qemu actually removed what we'd
still use.

Signed-off-by: Peter Krempa <pkrempa@xxxxxxxxxx>
---
 tests/testutilsqemuschema.c | 54 ++++++++++++++++++++++++++++++++++++-
 1 file changed, 53 insertions(+), 1 deletion(-)

diff --git a/tests/testutilsqemuschema.c b/tests/testutilsqemuschema.c
index f94a415b18..898be68b0a 100644
--- a/tests/testutilsqemuschema.c
+++ b/tests/testutilsqemuschema.c
@@ -445,6 +445,47 @@ testQEMUSchemaValidateAlternate(virJSONValuePtr obj,
 }


+static int
+testQEMUSchemaValidateDeprecated(virJSONValuePtr root,
+                                 const char *name,
+                                 struct testQEMUSchemaValidateCtxt *ctxt)
+{
+    virJSONValuePtr features = virJSONValueObjectGetArray(root, "features");
+    size_t nfeatures;
+    size_t i;
+
+    if (!features)
+        return 0;
+
+    nfeatures = virJSONValueArraySize(features);
+
+    for (i = 0; i < nfeatures; i++) {
+        virJSONValuePtr cur = virJSONValueArrayGet(features, i);
+        const char *curstr;
+
+        if (!cur ||
+            !(curstr = virJSONValueGetString(cur))) {
+            virBufferAsprintf(ctxt->debug, "ERROR: features of '%s' are malformed", name);
+            return -2;
+        }
+
+        if (STREQ(curstr, "deprecated")) {
+            if (ctxt->allowDeprecated) {
+                virBufferAsprintf(ctxt->debug, "WARNING: '%s' is deprecated", name);
+                if (virTestGetVerbose())
+                    g_fprintf(stderr, "\nWARNING: '%s' is deprecated\n", name);
+                return 0;
+            } else {
+                virBufferAsprintf(ctxt->debug, "ERROR: '%s' is deprecated", name);
+                return -1;
+            }
+        }
+    }
+
+    return 0;
+}
+
+
 static int
 testQEMUSchemaValidateRecurse(virJSONValuePtr obj,
                               virJSONValuePtr root,
@@ -452,6 +493,10 @@ testQEMUSchemaValidateRecurse(virJSONValuePtr obj,
 {
     const char *n = virJSONValueObjectGetString(root, "name");
     const char *t = virJSONValueObjectGetString(root, "meta-type");
+    int rc;
+
+    if ((rc = testQEMUSchemaValidateDeprecated(root, n, ctxt)) < 0)
+        return rc;

     if (STREQ_NULLABLE(t, "builtin")) {
         return testQEMUSchemaValidateBuiltin(obj, root, ctxt);
@@ -525,7 +570,7 @@ testQEMUSchemaValidateCommand(const char *command,
                               virJSONValuePtr arguments,
                               virHashTablePtr schema,
                               bool allowDeprecated,
-                              bool allowRemoved G_GNUC_UNUSED,
+                              bool allowRemoved,
                               virBufferPtr debug)
 {
     struct testQEMUSchemaValidateCtxt ctxt = { .schema = schema,
@@ -535,13 +580,20 @@ testQEMUSchemaValidateCommand(const char *command,
     g_autoptr(virJSONValue) emptyargs = NULL;
     virJSONValuePtr schemarootcommand;
     virJSONValuePtr schemarootarguments;
+    int rc;

     if (virQEMUQAPISchemaPathGet(command, schema, &schemarootcommand) < 0 ||
         !schemarootcommand) {
+        if (allowRemoved)
+            return 0;
+
         virBufferAsprintf(debug, "ERROR: command '%s' not found in the schema", command);
         return -1;
     }

+    if ((rc = testQEMUSchemaValidateDeprecated(schemarootcommand, command, &ctxt)) < 0)
+        return rc;
+
     if (!arguments)
         arguments = emptyargs = virJSONValueNewObject();

-- 
2.26.2





[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