]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
virDomainDefValidate: Add per-run 'opaque' data
authorPeter Krempa <pkrempa@redhat.com>
Tue, 8 Dec 2020 13:11:13 +0000 (14:11 +0100)
committerPeter Krempa <pkrempa@redhat.com>
Wed, 9 Dec 2020 08:33:47 +0000 (09:33 +0100)
virDomainDefPostParse infrastructure has apart from the global opaque
data also per-run data, but this was not duplicated into the validation
callbacks.

This is important when drivers want to use correct run-state for the
validation.

Signed-off-by: Peter Krempa <pkrempa@redhat.com>
Reviewed-by: Ján Tomko <jtomko@redhat.com>
src/bhyve/bhyve_domain.c
src/conf/domain_conf.c
src/conf/domain_conf.h
src/qemu/qemu_process.c
src/qemu/qemu_validate.c
src/qemu/qemu_validate.h
src/vz/vz_driver.c

index 6935609b96d33ac799724b39d96404401bcb9bc3..f0e553113f20f4c0dc860a67ede9c4cfa036a644 100644 (file)
@@ -199,7 +199,8 @@ virBhyveDriverCreateXMLConf(bhyveConnPtr driver)
 static int
 bhyveDomainDeviceDefValidate(const virDomainDeviceDef *dev,
                              const virDomainDef *def G_GNUC_UNUSED,
-                             void *opaque G_GNUC_UNUSED)
+                             void *opaque G_GNUC_UNUSED,
+                             void *parseOpaque G_GNUC_UNUSED)
 {
     if (dev->type == VIR_DOMAIN_DEVICE_CONTROLLER &&
         dev->data.controller->type == VIR_DOMAIN_CONTROLLER_TYPE_ISA &&
index 66ee658e7b32a0be0997ca66588938c05d9290d0..fa19563a35a697c8cf4fd65c1761df0d021beded 100644 (file)
@@ -6974,14 +6974,15 @@ static int
 virDomainDeviceDefValidate(const virDomainDeviceDef *dev,
                            const virDomainDef *def,
                            unsigned int parseFlags,
-                           virDomainXMLOptionPtr xmlopt)
+                           virDomainXMLOptionPtr xmlopt,
+                           void *parseOpaque)
 {
     /* validate configuration only in certain places */
     if (parseFlags & VIR_DOMAIN_DEF_PARSE_SKIP_VALIDATE)
         return 0;
 
     if (xmlopt->config.deviceValidateCallback &&
-        xmlopt->config.deviceValidateCallback(dev, def, xmlopt->config.priv))
+        xmlopt->config.deviceValidateCallback(dev, def, xmlopt->config.priv, parseOpaque))
         return -1;
 
     if (virDomainDeviceDefValidateInternal(dev, def) < 0)
@@ -6999,7 +7000,8 @@ virDomainDefValidateDeviceIterator(virDomainDefPtr def,
 {
     struct virDomainDefPostParseDeviceIteratorData *data = opaque;
     return virDomainDeviceDefValidate(dev, def,
-                                      data->parseFlags, data->xmlopt);
+                                      data->parseFlags, data->xmlopt,
+                                      data->parseOpaque);
 }
 
 
@@ -7357,6 +7359,7 @@ virDomainDefValidateInternal(const virDomainDef *def,
  * @caps: driver capabilities object
  * @parseFlags: virDomainDefParseFlags
  * @xmlopt: XML parser option object
+ * @parseOpaque: hypervisor driver specific data for this validation run
  *
  * This validation function is designed to take checks of globally invalid
  * configurations that the parser needs to accept so that VMs don't vanish upon
@@ -7369,11 +7372,13 @@ virDomainDefValidateInternal(const virDomainDef *def,
 int
 virDomainDefValidate(virDomainDefPtr def,
                      unsigned int parseFlags,
-                     virDomainXMLOptionPtr xmlopt)
+                     virDomainXMLOptionPtr xmlopt,
+                     void *parseOpaque)
 {
     struct virDomainDefPostParseDeviceIteratorData data = {
         .xmlopt = xmlopt,
         .parseFlags = parseFlags,
+        .parseOpaque = parseOpaque,
     };
 
     /* validate configuration only in certain places */
@@ -7382,7 +7387,7 @@ virDomainDefValidate(virDomainDefPtr def,
 
     /* call the domain config callback */
     if (xmlopt->config.domainValidateCallback &&
-        xmlopt->config.domainValidateCallback(def, xmlopt->config.priv) < 0)
+        xmlopt->config.domainValidateCallback(def, xmlopt->config.priv, parseOpaque) < 0)
         return -1;
 
     /* iterate the devices */
@@ -17220,7 +17225,7 @@ virDomainDeviceDefParse(const char *xmlStr,
         return NULL;
 
     /* validate the configuration */
-    if (virDomainDeviceDefValidate(dev, def, flags, xmlopt) < 0)
+    if (virDomainDeviceDefValidate(dev, def, flags, xmlopt, parseOpaque) < 0)
         return NULL;
 
     return g_steal_pointer(&dev);
@@ -22617,7 +22622,7 @@ virDomainObjParseXML(xmlDocPtr xml,
         goto error;
 
     /* validate configuration */
-    if (virDomainDefValidate(obj->def, flags, xmlopt) < 0)
+    if (virDomainDefValidate(obj->def, flags, xmlopt, parseOpaque) < 0)
         goto error;
 
     return obj;
@@ -22701,7 +22706,7 @@ virDomainDefParseNode(xmlDocPtr xml,
         return NULL;
 
     /* validate configuration */
-    if (virDomainDefValidate(def, flags, xmlopt) < 0)
+    if (virDomainDefValidate(def, flags, xmlopt, parseOpaque) < 0)
         return NULL;
 
     return g_steal_pointer(&def);
index cdf08de60aeac92001583abf679fa90c52affc8c..72771c46b909c353fab78290377b547606b9fc05 100644 (file)
@@ -2867,13 +2867,15 @@ typedef void (*virDomainDefPostParseDataFree)(void *parseOpaque);
  * for configurations that were previously accepted. This shall not modify the
  * config. */
 typedef int (*virDomainDefValidateCallback)(const virDomainDef *def,
-                                            void *opaque);
+                                            void *opaque,
+                                            void *parseOpaque);
 
 /* Called once per device, for adjusting per-device settings while
  * leaving the overall domain otherwise unchanged.  */
 typedef int (*virDomainDeviceDefValidateCallback)(const virDomainDeviceDef *dev,
                                                   const virDomainDef *def,
-                                                  void *opaque);
+                                                  void *opaque,
+                                                  void *parseOpaque);
 
 struct _virDomainDefParserConfig {
     /* driver domain definition callbacks */
@@ -2993,7 +2995,8 @@ bool virDomainDeviceAliasIsUserAlias(const char *aliasStr);
 
 int virDomainDefValidate(virDomainDefPtr def,
                          unsigned int parseFlags,
-                         virDomainXMLOptionPtr xmlopt);
+                         virDomainXMLOptionPtr xmlopt,
+                         void *parseOpaque);
 
 int
 virDomainActualNetDefValidate(const virDomainNetDef *net);
index 5a37c52d127bf6087f47bc82ed8c43d3086c16c3..3b64caa619495cbd855910a6a2a5cd64c4485b5e 100644 (file)
@@ -5467,7 +5467,7 @@ qemuProcessStartValidate(virQEMUDriverPtr driver,
      * VM that was running before (migration, snapshots, save). It's more
      * important to start such VM than keep the configuration clean */
     if ((flags & VIR_QEMU_PROCESS_START_NEW) &&
-        virDomainDefValidate(vm->def, 0, driver->xmlopt) < 0)
+        virDomainDefValidate(vm->def, 0, driver->xmlopt, qemuCaps) < 0)
         return -1;
 
     if (qemuProcessStartValidateGraphics(vm) < 0)
index 52d15defed22e9d3ccd46372681cd1a6b45cd9fe..62d7243e21dc9f0d93cf19ce1c8f052b554b8b51 100644 (file)
@@ -1066,7 +1066,8 @@ qemuValidateDomainDefPanic(const virDomainDef *def,
 
 int
 qemuValidateDomainDef(const virDomainDef *def,
-                      void *opaque)
+                      void *opaque,
+                      void *parseOpaque G_GNUC_UNUSED)
 {
     virQEMUDriverPtr driver = opaque;
     g_autoptr(virQEMUDriverConfig) cfg = virQEMUDriverGetConfig(driver);
@@ -4670,7 +4671,8 @@ qemuValidateDomainDeviceDefShmem(virDomainShmemDefPtr shmem,
 int
 qemuValidateDomainDeviceDef(const virDomainDeviceDef *dev,
                             const virDomainDef *def,
-                            void *opaque)
+                            void *opaque,
+                            void *parseOpaque G_GNUC_UNUSED)
 {
     int ret = 0;
     virQEMUDriverPtr driver = opaque;
index acf7d26ce009e4bac02cf05068c869e9e98e528d..b6c5441f90add1849853317b5f9ae790c70ca906 100644 (file)
 #include "qemu_capabilities.h"
 #include "qemu_conf.h"
 
-int qemuValidateDomainDef(const virDomainDef *def, void *opaque);
+int qemuValidateDomainDef(const virDomainDef *def,
+                          void *opaque,
+                          void *parseOpaque);
 int qemuValidateDomainDeviceDefDisk(const virDomainDiskDef *disk,
                                     const virDomainDef *def,
                                     virQEMUCapsPtr qemuCaps);
 int qemuValidateDomainDeviceDef(const virDomainDeviceDef *dev,
                                 const virDomainDef *def,
-                                void *opaque);
+                                void *opaque,
+                                void *parseOpaque);
index 8d47b90bdbc71621b368cf4777589db5570edf26..b60e99d4f5cf1e1755d003b713c2da5a9f08c952 100644 (file)
@@ -259,7 +259,8 @@ vzDomainDefPostParse(virDomainDefPtr def,
 
 static int
 vzDomainDefValidate(const virDomainDef *def,
-                    void *opaque)
+                    void *opaque,
+                    void *parseOpaque G_GNUC_UNUSED)
 {
     if (vzCheckUnsupportedControllers(def, opaque) < 0)
         return -1;
@@ -295,7 +296,8 @@ vzDomainDeviceDefPostParse(virDomainDeviceDefPtr dev,
 static int
 vzDomainDeviceDefValidate(const virDomainDeviceDef *dev,
                           const virDomainDef *def,
-                          void *opaque)
+                          void *opaque,
+                          void *parseOpaque G_GNUC_UNUSED)
 {
     vzDriverPtr driver = opaque;