]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
qemu: monitor: Make wrapping of 'props' of 'object-add' optional
authorPeter Krempa <pkrempa@redhat.com>
Mon, 30 Nov 2020 15:03:57 +0000 (16:03 +0100)
committerPeter Krempa <pkrempa@redhat.com>
Tue, 23 Mar 2021 13:06:31 +0000 (14:06 +0100)
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@redhat.com>
Reviewed-by: Michal Privoznik <mprivozn@redhat.com>
src/qemu/qemu_monitor.c
src/util/virqemu.c

index 3760349450348cb22529a21b7bce25ef2f8a6ee4..579d98b42f09fbc8d35d31f95018dccd4206c446 100644 (file)
@@ -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;
 };
 
 /**
@@ -3017,14 +3020,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);
 }
 
 
@@ -3044,26 +3045,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;
 }
 
 
@@ -3083,6 +3086,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;
@@ -3110,7 +3114,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)
index 57ee42dd160ead8a2dc8bee11e688e1de90784bb..a206da18525774dd32fd103d132cbf34d750b6dd 100644 (file)
@@ -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)
 {