]> xenbits.xensource.com Git - libvirt.git/commitdiff
util: qemu: Add support for numbered array members
authorPeter Krempa <pkrempa@redhat.com>
Mon, 25 Jul 2016 17:47:40 +0000 (19:47 +0200)
committerPeter Krempa <pkrempa@redhat.com>
Wed, 27 Jul 2016 11:33:10 +0000 (13:33 +0200)
Add support for converting objects nested in arrays with a numbering
discriminator on the command line. This syntax is used for the
object-based specification of disk source properties.

src/libvirt_private.syms
src/util/virqemu.c
src/util/virqemu.h
tests/qemucommandutiltest.c

index 73904a68413661e9584152145aefbd01096301a1..f49a3b237754b166a433a59fcb323b29d2373793 100644 (file)
@@ -2206,6 +2206,7 @@ virProcessWait;
 virQEMUBuildBufferEscapeComma;
 virQEMUBuildCommandLineJSON;
 virQEMUBuildCommandLineJSONArrayBitmap;
+virQEMUBuildCommandLineJSONArrayNumbered;
 virQEMUBuildLuksOpts;
 virQEMUBuildObjectCommandlineFromJSON;
 
index 8babe36d8de6b5f14d7cbc058ca8a90daf8294fe..20410f70ea2d6a7994ef2278fa8c4d477576bbda 100644 (file)
@@ -79,6 +79,39 @@ virQEMUBuildCommandLineJSONArrayBitmap(const char *key,
 }
 
 
+int
+virQEMUBuildCommandLineJSONArrayNumbered(const char *key,
+                                         const virJSONValue *array,
+                                         virBufferPtr buf)
+{
+    const virJSONValue *member;
+    size_t nelems = virJSONValueArraySize(array);
+    char *prefix = NULL;
+    size_t i;
+    int ret = 0;
+
+    for (i = 0; i < nelems; i++) {
+        member = virJSONValueArrayGet((virJSONValuePtr) array, i);
+
+        if (virAsprintf(&prefix, "%s.%zu", key, i) < 0)
+            goto cleanup;
+
+        if (virQEMUBuildCommandLineJSONRecurse(prefix, member, buf,
+                                               virQEMUBuildCommandLineJSONArrayNumbered,
+                                               true) < 0)
+            goto cleanup;
+
+        VIR_FREE(prefix);
+    }
+
+    ret = 0;
+
+ cleanup:
+    VIR_FREE(prefix);
+    return ret;
+}
+
+
 /* internal iterator to handle nested object formatting */
 static int
 virQEMUBuildCommandLineJSONIterate(const char *key,
index 801c35b5dae8f8c323a6bad7d35036b3edbc364d..40cd9b8046ad7edf30c17bc9d1594dd788b35e60 100644 (file)
@@ -35,6 +35,9 @@ typedef int (*virQEMUBuildCommandLineJSONArrayFormatFunc)(const char *key,
 int virQEMUBuildCommandLineJSONArrayBitmap(const char *key,
                                            const virJSONValue *array,
                                            virBufferPtr buf);
+int virQEMUBuildCommandLineJSONArrayNumbered(const char *key,
+                                             const virJSONValue *array,
+                                             virBufferPtr buf);
 
 int virQEMUBuildCommandLineJSON(const virJSONValue *value,
                                 virBufferPtr buf,
index 0bf0351fc9ed620db401eeb15ae691bb7c5196f4..1985983dac1a722347166b0e885c5edde8709c8b 100644 (file)
@@ -30,6 +30,7 @@ typedef struct
 {
     const char *props;
     const char *expectprops;
+    virQEMUBuildCommandLineJSONArrayFormatFunc arrayfunc;
 } testQemuCommandBuildObjectFromJSONData;
 
 static int
@@ -46,8 +47,7 @@ testQemuCommandBuildFromJSON(const void *opaque)
         return -1;
     }
 
-    if (virQEMUBuildCommandLineJSON(val, &buf,
-                                    virQEMUBuildCommandLineJSONArrayBitmap) < 0) {
+    if (virQEMUBuildCommandLineJSON(val, &buf, data->arrayfunc) < 0) {
         fprintf(stderr,
                 "\nvirQEMUBuildCommandlineJSON failed process JSON:\n%s\n",
                 data->props);
@@ -83,16 +83,23 @@ mymain(void)
 
     virTestCounterReset("testQemuCommandBuildFromJSON");
 
-#define DO_TEST_COMMAND_OBJECT_FROM_JSON(PROPS, EXPECT)             \
+#define DO_TEST_COMMAND_FROM_JSON(PROPS, ARRAYFUNC, EXPECT)         \
     do {                                                            \
         data1.props = PROPS;                                        \
         data1.expectprops = EXPECT;                                 \
+        data1.arrayfunc = ARRAYFUNC;                                \
         if (virTestRun(virTestCounterNext(),                        \
                        testQemuCommandBuildFromJSON,                \
                        &data1) < 0)                                 \
             ret = -1;                                               \
      } while (0)
 
+#define DO_TEST_COMMAND_OBJECT_FROM_JSON(PROPS, EXPECT)             \
+    DO_TEST_COMMAND_FROM_JSON(PROPS, virQEMUBuildCommandLineJSONArrayBitmap, EXPECT)
+
+#define DO_TEST_COMMAND_DRIVE_FROM_JSON(PROPS, EXPECT)              \
+    DO_TEST_COMMAND_FROM_JSON(PROPS, virQEMUBuildCommandLineJSONArrayNumbered, EXPECT)
+
     DO_TEST_COMMAND_OBJECT_FROM_JSON("{}", NULL);
     DO_TEST_COMMAND_OBJECT_FROM_JSON("{\"string\":\"qwer\"}", "string=qwer");
     DO_TEST_COMMAND_OBJECT_FROM_JSON("{\"string\":\"qw,e,r\"}", "string=qw,,e,,r");
@@ -120,6 +127,29 @@ mymain(void)
                                      "}",
                                      "nest.boolean=yes,nest.hyphen-name=1234,"
                                      "nest.some_string=bleah,nest.bleah=bl,,eah");
+    DO_TEST_COMMAND_DRIVE_FROM_JSON("{\"driver\":\"gluster\","
+                                     "\"volume\":\"test\","
+                                     "\"path\":\"img\","
+                                     "\"server\":[ { \"type\":\"tcp\","
+                                                         "\"host\":\"example.com\","
+                                                         "\"port\":\"1234\""
+                                                        "},"
+                                                        "{ \"type\":\"unix\","
+                                                          "\"socket\":\"/path/socket\""
+                                                        "},"
+                                                        "{ \"type\":\"tcp\","
+                                                          "\"host\":\"example.com\""
+                                                        "}"
+                                                       "]"
+                                     "}",
+                                     "driver=gluster,volume=test,path=img,"
+                                     "server.0.type=tcp,"
+                                     "server.0.host=example.com,"
+                                     "server.0.port=1234,"
+                                     "server.1.type=unix,"
+                                     "server.1.socket=/path/socket,"
+                                     "server.2.type=tcp,"
+                                     "server.2.host=example.com");
 
     return ret;