[PATCH v3 04/13] qemu: monitor: Make wrapping of 'props' of 'object-add' optional

Peter Krempa pkrempa at redhat.com
Fri Mar 12 17:20:47 UTC 2021


Construct the JSON object which is used for object-add without the
'props' wrapper and add the wrapper only in the monitor code.

This simplifies the JSON->commandline generator in the first place and
also prepares for upcoming qemu where 'props' will be removed.

Signed-off-by: Peter Krempa <pkrempa at redhat.com>
---
 src/qemu/qemu_monitor.c | 68 +++++++++++++++++++++++++++++------------
 src/util/virqemu.c      | 34 ++++++---------------
 2 files changed, 58 insertions(+), 44 deletions(-)

diff --git a/src/qemu/qemu_monitor.c b/src/qemu/qemu_monitor.c
index b4f2641504..1127794206 100644
--- a/src/qemu/qemu_monitor.c
+++ b/src/qemu/qemu_monitor.c
@@ -109,6 +109,9 @@ struct _qemuMonitor {
     qemuMonitorReportDomainLogError logFunc;
     void *logOpaque;
     virFreeCallback logDestroy;
+
+    /* true if qemu no longer wants 'props' sub-object of object-add */
+    bool objectAddNoWrap;
 };

 /**
@@ -3019,14 +3022,12 @@ qemuMonitorCreateObjectPropsWrap(const char *type,
                                  const char *alias,
                                  virJSONValuePtr *props)
 {
-    virJSONValuePtr ret;

-    ignore_value(virJSONValueObjectCreate(&ret,
-                                          "s:qom-type", type,
-                                          "s:id", alias,
-                                          "A:props", props,
-                                          NULL));
-    return ret;
+    if (virJSONValueObjectPrependString(*props, "id", alias) < 0 ||
+        virJSONValueObjectPrependString(*props, "qom-type", type))
+        return NULL;
+
+    return g_steal_pointer(props);
 }


@@ -3046,26 +3047,28 @@ qemuMonitorCreateObjectProps(virJSONValuePtr *propsret,
                              const char *alias,
                              ...)
 {
-    virJSONValuePtr props = NULL;
-    int ret = -1;
+    g_autoptr(virJSONValue) props = NULL;
+    int rc;
     va_list args;

-    *propsret = NULL;
+    if (virJSONValueObjectCreate(&props,
+                                 "s:qom-type", type,
+                                 "s:id", alias,
+                                 NULL) < 0)
+        return -1;
+

     va_start(args, alias);

-    if (virJSONValueObjectCreateVArgs(&props, args) < 0)
-        goto cleanup;
+    rc = virJSONValueObjectAddVArgs(props, args);

-    if (!(*propsret = qemuMonitorCreateObjectPropsWrap(type, alias, &props)))
-        goto cleanup;
+    va_end(args);

-    ret = 0;
+    if (rc < 0)
+        return -1;

- cleanup:
-    virJSONValueFree(props);
-    va_end(args);
-    return ret;
+    *propsret = g_steal_pointer(&props);
+    return 0;
 }


@@ -3085,6 +3088,7 @@ qemuMonitorAddObject(qemuMonitorPtr mon,
                      virJSONValuePtr *props,
                      char **alias)
 {
+    g_autoptr(virJSONValue) pr = NULL;
     const char *type = NULL;
     const char *id = NULL;
     g_autofree char *aliasCopy = NULL;
@@ -3112,7 +3116,31 @@ qemuMonitorAddObject(qemuMonitorPtr mon,
     if (alias)
         aliasCopy = g_strdup(id);

-    if (qemuMonitorJSONAddObject(mon, props) < 0)
+    if (mon->objectAddNoWrap) {
+        pr = g_steal_pointer(props);
+    } else {
+        /* we need to create a wrapper which has the 'qom-type' and 'id' and
+         * store everything else under a 'props' sub-object */
+        g_autoptr(virJSONValue) typeobj = NULL;
+        g_autoptr(virJSONValue) idobj = NULL;
+
+        ignore_value(virJSONValueObjectRemoveKey(*props, "qom-type", &typeobj));
+        ignore_value(virJSONValueObjectRemoveKey(*props, "id", &idobj));
+
+        if (!virJSONValueObjectGetKey(*props, 0)) {
+            virJSONValueFree(*props);
+            *props = NULL;
+        }
+
+        if (virJSONValueObjectCreate(&pr,
+                                     "s:qom-type", type,
+                                     "s:id", id,
+                                     "A:props", props,
+                                     NULL) < 0)
+            return -1;
+    }
+
+    if (qemuMonitorJSONAddObject(mon, &pr) < 0)
         return -1;

     if (alias)
diff --git a/src/util/virqemu.c b/src/util/virqemu.c
index 57ee42dd16..a206da1852 100644
--- a/src/util/virqemu.c
+++ b/src/util/virqemu.c
@@ -303,12 +303,13 @@ virQEMUBuildNetdevCommandlineFromJSON(virJSONValuePtr props,
 }


-static int
-virQEMUBuildObjectCommandlineFromJSONInternal(virBufferPtr buf,
-                                              const char *type,
-                                              const char *alias,
-                                              virJSONValuePtr props)
+int
+virQEMUBuildObjectCommandlineFromJSON(virBufferPtr buf,
+                                      virJSONValuePtr objprops)
 {
+    const char *type = virJSONValueObjectGetString(objprops, "qom-type");
+    const char *alias = virJSONValueObjectGetString(objprops, "id");
+
     if (!type || !alias) {
         virReportError(VIR_ERR_INTERNAL_ERROR,
                        _("missing 'type'(%s) or 'alias'(%s) field of QOM 'object'"),
@@ -316,31 +317,16 @@ virQEMUBuildObjectCommandlineFromJSONInternal(virBufferPtr buf,
         return -1;
     }

-    virBufferAsprintf(buf, "%s,id=%s", type, alias);
+    virBufferAsprintf(buf, "%s,", type);

-    if (props) {
-        virBufferAddLit(buf, ",");
-        if (virQEMUBuildCommandLineJSON(props, buf, NULL,
-                                virQEMUBuildCommandLineJSONArrayBitmap) < 0)
-            return -1;
-    }
+    if (virQEMUBuildCommandLineJSON(objprops, buf, "qom-type",
+                                    virQEMUBuildCommandLineJSONArrayBitmap) < 0)
+        return -1;

     return 0;
 }


-int
-virQEMUBuildObjectCommandlineFromJSON(virBufferPtr buf,
-                                      virJSONValuePtr objprops)
-{
-    const char *type = virJSONValueObjectGetString(objprops, "qom-type");
-    const char *alias = virJSONValueObjectGetString(objprops, "id");
-    virJSONValuePtr props = virJSONValueObjectGetObject(objprops, "props");
-
-    return virQEMUBuildObjectCommandlineFromJSONInternal(buf, type, alias, props);
-}
-
-
 char *
 virQEMUBuildDriveCommandlineFromJSON(virJSONValuePtr srcdef)
 {
-- 
2.29.2




More information about the libvir-list mailing list