]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
qemu: Prepare for testing of 'netdev_add' props via qemuxml2argvtest
authorPeter Krempa <pkrempa@redhat.com>
Fri, 15 May 2020 12:24:21 +0000 (14:24 +0200)
committerPeter Krempa <pkrempa@redhat.com>
Wed, 20 May 2020 07:41:58 +0000 (09:41 +0200)
qemuxml2argv test suite is way more comprehensive than the hotplug
suite. Since we share the code paths for monitor and command line
hotplug we can easily test the properties of devices against the QAPI
schema.

To achieve this we'll need to skip the JSON->commandline conversion for
the test run so that we can analyze the pure properties. This patch adds
flags for the comand line generator and hook them into the
JSON->commandline convertor for -netdev. An upcoming patch will make use
of this new infrastructure.

Signed-off-by: Peter Krempa <pkrempa@redhat.com>
Reviewed-by: Eric Blake <eblake@redhat.com>
src/qemu/qemu_command.c
src/qemu/qemu_command.h
src/qemu/qemu_driver.c
src/qemu/qemu_process.c
src/qemu/qemu_process.h
src/util/virqemu.c
src/util/virqemu.h
tests/qemuxml2argvtest.c

index ccae54140877be226fe7ba5955d2465db0469577..419eca5675cc15c7cf3edccfac54a0b7386b9ab3 100644 (file)
@@ -7701,7 +7701,8 @@ qemuBuildInterfaceCommandLine(virQEMUDriverPtr driver,
                               virNetDevVPortProfileOp vmop,
                               bool standalone,
                               size_t *nnicindexes,
-                              int **nicindexes)
+                              int **nicindexes,
+                              unsigned int flags)
 {
     virDomainDefPtr def = vm->def;
     int ret = -1;
@@ -7930,7 +7931,8 @@ qemuBuildInterfaceCommandLine(virQEMUDriverPtr driver,
                                              slirpfdName)))
         goto cleanup;
 
-    if (!(host = virQEMUBuildNetdevCommandlineFromJSON(hostnetprops)))
+    if (!(host = virQEMUBuildNetdevCommandlineFromJSON(hostnetprops,
+                                                       (flags & QEMU_BUILD_COMMANDLINE_VALIDATE_KEEP_JSON))))
         goto cleanup;
 
     virCommandAddArgList(cmd, "-netdev", host, NULL);
@@ -8006,7 +8008,8 @@ qemuBuildNetCommandLine(virQEMUDriverPtr driver,
                         bool standalone,
                         size_t *nnicindexes,
                         int **nicindexes,
-                        unsigned int *bootHostdevNet)
+                        unsigned int *bootHostdevNet,
+                        unsigned int flags)
 {
     size_t i;
     int last_good_net = -1;
@@ -8030,7 +8033,7 @@ qemuBuildNetCommandLine(virQEMUDriverPtr driver,
             if (qemuBuildInterfaceCommandLine(driver, vm, logManager, secManager, cmd, net,
                                               qemuCaps, bootNet, vmop,
                                               standalone, nnicindexes,
-                                              nicindexes) < 0)
+                                              nicindexes, flags) < 0)
                 goto error;
 
             last_good_net = i;
@@ -8566,7 +8569,8 @@ qemuBuildChannelsCommandLine(virLogManagerPtr logManager,
                              virQEMUDriverConfigPtr cfg,
                              const virDomainDef *def,
                              virQEMUCapsPtr qemuCaps,
-                             bool chardevStdioLogd)
+                             bool chardevStdioLogd,
+                             unsigned int flags)
 {
     size_t i;
     unsigned int cdevflags = QEMU_BUILD_CHARDEV_TCP_NOWAIT |
@@ -8595,7 +8599,8 @@ qemuBuildChannelsCommandLine(virLogManagerPtr logManager,
             if (!(netdevprops = qemuBuildChannelGuestfwdNetdevProps(channel)))
                 return -1;
 
-            if (!(netdevstr = virQEMUBuildNetdevCommandlineFromJSON(netdevprops)))
+            if (!(netdevstr = virQEMUBuildNetdevCommandlineFromJSON(netdevprops,
+                                                                    (flags & QEMU_BUILD_COMMANDLINE_VALIDATE_KEEP_JSON))))
                 return -1;
 
             virCommandAddArgList(cmd, "-netdev", netdevstr, NULL);
@@ -9531,7 +9536,8 @@ qemuBuildCommandLine(virQEMUDriverPtr driver,
                      bool standalone,
                      bool enableFips,
                      size_t *nnicindexes,
-                     int **nicindexes)
+                     int **nicindexes,
+                     unsigned int flags)
 {
     size_t i;
     char uuid[VIR_UUID_STRING_BUFLEN];
@@ -9544,9 +9550,9 @@ qemuBuildCommandLine(virQEMUDriverPtr driver,
     bool chardevStdioLogd = priv->chardevStdioLogd;
 
     VIR_DEBUG("driver=%p def=%p mon=%p "
-              "qemuCaps=%p migrateURI=%s snapshot=%p vmop=%d",
+              "qemuCaps=%p migrateURI=%s snapshot=%p vmop=%d flags=0x%x",
               driver, def, priv->monConfig,
-              qemuCaps, migrateURI, snapshot, vmop);
+              qemuCaps, migrateURI, snapshot, vmop, flags);
 
     if (qemuBuildCommandLineValidate(driver, def) < 0)
         return NULL;
@@ -9691,7 +9697,7 @@ qemuBuildCommandLine(virQEMUDriverPtr driver,
 
     if (qemuBuildNetCommandLine(driver, vm, logManager, secManager, cmd,
                                 qemuCaps, vmop, standalone,
-                                nnicindexes, nicindexes, &bootHostdevNet) < 0)
+                                nnicindexes, nicindexes, &bootHostdevNet, flags) < 0)
         return NULL;
 
     if (qemuBuildSmartcardCommandLine(logManager, secManager, cmd, cfg, def, qemuCaps,
@@ -9707,7 +9713,7 @@ qemuBuildCommandLine(virQEMUDriverPtr driver,
         return NULL;
 
     if (qemuBuildChannelsCommandLine(logManager, secManager, cmd, cfg, def, qemuCaps,
-                                     chardevStdioLogd) < 0)
+                                     chardevStdioLogd, flags) < 0)
         return NULL;
 
     if (qemuBuildConsoleCommandLine(logManager, secManager, cmd, cfg, def, qemuCaps,
index 1daa07982caa960b35a385adac82aca65d881cb6..55bc67072a11d51a2edeabbbec38d4ecc80efec6 100644 (file)
 VIR_ENUM_DECL(qemuVideo);
 VIR_ENUM_DECL(qemuSoundCodec);
 
+typedef enum {
+    QEMU_BUILD_COMMANDLINE_VALIDATE_KEEP_JSON = 1 << 0,
+} qemuBuildCommandLineFlags;
+
 virCommandPtr qemuBuildCommandLine(virQEMUDriverPtr driver,
                                    virLogManagerPtr logManager,
                                    virSecurityManagerPtr secManager,
@@ -53,7 +57,8 @@ virCommandPtr qemuBuildCommandLine(virQEMUDriverPtr driver,
                                    bool standalone,
                                    bool enableFips,
                                    size_t *nnicindexes,
-                                   int **nicindexes);
+                                   int **nicindexes,
+                                   unsigned int flags);
 
 /* Generate the object properties for pr-manager */
 virJSONValuePtr qemuBuildPRManagerInfoProps(virStorageSourcePtr src);
index db65862163d62cede03a6de43952936e48aedf0e..dd9ae30bb50c1e5ecf36aabc753b51c4bcba281a 100644 (file)
@@ -7423,7 +7423,7 @@ static char *qemuConnectDomainXMLToNative(virConnectPtr conn,
     }
 
     if (!(cmd = qemuProcessCreatePretendCmd(driver, vm, NULL,
-                                            qemuCheckFips(), true,
+                                            qemuCheckFips(), true, false,
                                             VIR_QEMU_PROCESS_START_COLD)))
         goto cleanup;
 
index 7cdd19b393d874cac5f7927b3ce32189817a5808..45af8f810cab7b571c4ba882b2375d0df0d70a5f 100644 (file)
@@ -6746,7 +6746,7 @@ qemuProcessLaunch(virConnectPtr conn,
                                      snapshot, vmop,
                                      false,
                                      qemuCheckFips(),
-                                     &nnicindexes, &nicindexes)))
+                                     &nnicindexes, &nicindexes, 0)))
         goto cleanup;
 
     if (incoming && incoming->fd != -1)
@@ -7189,8 +7189,11 @@ qemuProcessCreatePretendCmd(virQEMUDriverPtr driver,
                             const char *migrateURI,
                             bool enableFips,
                             bool standalone,
+                            bool jsonPropsValidation,
                             unsigned int flags)
 {
+    unsigned int buildflags = 0;
+
     virCheckFlags(VIR_QEMU_PROCESS_START_COLD |
                   VIR_QEMU_PROCESS_START_PAUSED |
                   VIR_QEMU_PROCESS_START_AUTODESTROY, NULL);
@@ -7200,6 +7203,9 @@ qemuProcessCreatePretendCmd(virQEMUDriverPtr driver,
     if (standalone)
         flags |= VIR_QEMU_PROCESS_START_STANDALONE;
 
+    if (jsonPropsValidation)
+        buildflags = QEMU_BUILD_COMMANDLINE_VALIDATE_KEEP_JSON;
+
     if (qemuProcessInit(driver, vm, NULL, QEMU_ASYNC_JOB_NONE,
                         !!migrateURI, flags) < 0)
         return NULL;
@@ -7218,7 +7224,8 @@ qemuProcessCreatePretendCmd(virQEMUDriverPtr driver,
                                 standalone,
                                 enableFips,
                                 NULL,
-                                NULL);
+                                NULL,
+                                buildflags);
 }
 
 
index 3077d3ef9e8ae2987eae19d95463075b01e04ec0..15e67b976277cd5e93b582c1e7084b7fd9afcad3 100644 (file)
@@ -101,6 +101,7 @@ virCommandPtr qemuProcessCreatePretendCmd(virQEMUDriverPtr driver,
                                           const char *migrateURI,
                                           bool enableFips,
                                           bool standalone,
+                                          bool jsonPropsValidation,
                                           unsigned int flags);
 
 int qemuProcessInit(virQEMUDriverPtr driver,
index 9823ebc14def040e6c2b139228c7afe1fed8cef6..321ddeb7e3658bb2af688bb5f1179405d4bd3175 100644 (file)
@@ -292,16 +292,23 @@ virQEMUBuildCommandLineJSON(virJSONValuePtr value,
 /**
  * virQEMUBuildNetdevCommandlineFromJSON:
  * @props: JSON properties describing a netdev
+ * @rawjson: don't transform to commandline args, but just stringify json
  *
  * Converts @props into arguments for -netdev including all the quirks and
  * differences between the monitor and command line syntax.
+ *
+ * @rawjson is meant for testing of the schema in the xml2argvtest
  */
 char *
-virQEMUBuildNetdevCommandlineFromJSON(virJSONValuePtr props)
+virQEMUBuildNetdevCommandlineFromJSON(virJSONValuePtr props,
+                                      bool rawjson)
 {
     const char *type = virJSONValueObjectGetString(props, "type");
     g_auto(virBuffer) buf = VIR_BUFFER_INITIALIZER;
 
+    if (rawjson)
+        return virJSONValueToString(props, false);
+
     virBufferAsprintf(&buf, "%s,", type);
 
     if (virQEMUBuildCommandLineJSON(props, &buf, "type", true,
index 22f47851dfa4f1d8e3fe6353fd7b8af33de7cb57..b1296cb65704dfda18ca12ef5a0996fe9fc95fcf 100644 (file)
@@ -50,7 +50,8 @@ int virQEMUBuildCommandLineJSON(virJSONValuePtr value,
                                 virQEMUBuildCommandLineJSONArrayFormatFunc array);
 
 char *
-virQEMUBuildNetdevCommandlineFromJSON(virJSONValuePtr props);
+virQEMUBuildNetdevCommandlineFromJSON(virJSONValuePtr props,
+                                      bool rawjson);
 
 int virQEMUBuildObjectCommandlineFromJSON(virBufferPtr buf,
                                           virJSONValuePtr objprops);
index 9fa1afd9d018a522ce4b22681f7f83c537a1fa01..5123580ee2392c58a97c282fa1bbc9f511746a0f 100644 (file)
@@ -396,7 +396,8 @@ testCompareXMLToArgvCreateArgs(virQEMUDriverPtr drv,
                                virDomainObjPtr vm,
                                const char *migrateURI,
                                struct testQemuInfo *info,
-                               unsigned int flags)
+                               unsigned int flags,
+                               bool jsonPropsValidation)
 {
     size_t i;
 
@@ -471,6 +472,7 @@ testCompareXMLToArgvCreateArgs(virQEMUDriverPtr drv,
 
     return qemuProcessCreatePretendCmd(drv, vm, migrateURI,
                                        (flags & FLAG_FIPS), false,
+                                       jsonPropsValidation,
                                        VIR_QEMU_PROCESS_START_COLD);
 }
 
@@ -566,7 +568,7 @@ testCompareXMLToArgv(const void *data)
     virResetLastError();
 
     if (!(cmd = testCompareXMLToArgvCreateArgs(&driver, vm, migrateURI, info,
-                                               flags))) {
+                                               flags, false))) {
         if (flags & FLAG_EXPECT_FAILURE)
             goto ok;
         goto cleanup;