]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
qemu: Move rng model validation to domcaps
authorCole Robinson <crobinso@redhat.com>
Sun, 31 Mar 2019 21:56:48 +0000 (17:56 -0400)
committerCole Robinson <crobinso@redhat.com>
Tue, 6 Aug 2019 23:45:50 +0000 (19:45 -0400)
The qemu driver already does some <rng> model validation, based on
qemuCaps. However, the logic for exposing <rng> model values in domcaps
is basically identical. This drops the qemuCaps checking and compares
against the domCaps data directly.

This approach makes it basically impossible to add a new <rng> model to
the qemu driver without extending domcaps. The validation can also
be shared with other drivers eventually.

Reviewed-by: Reviewed-by: Daniel Henrique Barboza <danielhb413@gmail.com>
Reviewed-by: Michal Privoznik <mprivozn@redhat.com>
Signed-off-by: Cole Robinson <crobinso@redhat.com>
src/conf/domain_capabilities.c
src/conf/domain_capabilities.h
src/qemu/qemu_domain.c

index e17696fbc657477a906a77b0b556da1318d9ed1d..1000d8b969cbd34b8d268ada2c9225354dd1ebd4 100644 (file)
@@ -663,19 +663,48 @@ virDomainCapsFormat(virDomainCapsPtr const caps)
 }
 
 
+#define ENUM_VALUE_MISSING(capsEnum, value) !(capsEnum.values & (1 << value))
+
+#define ENUM_VALUE_ERROR(valueLabel, valueString) \
+    do { \
+        virReportError(VIR_ERR_CONFIG_UNSUPPORTED, \
+                       _("domain configuration does not support '%s' value '%s'"), \
+                       valueLabel, valueString); \
+    } while (0)
+
+
+static int
+virDomainCapsDeviceRNGDefValidate(virDomainCapsPtr const caps,
+                                  const virDomainRNGDef *dev)
+{
+    if (ENUM_VALUE_MISSING(caps->rng.model, dev->model)) {
+        ENUM_VALUE_ERROR("rng model",
+                         virDomainRNGModelTypeToString(dev->model));
+        return -1;
+    }
+
+    return 0;
+}
+
+
 int
-virDomainCapsDeviceDefValidate(virDomainCapsPtr const caps ATTRIBUTE_UNUSED,
+virDomainCapsDeviceDefValidate(virDomainCapsPtr const caps,
                                const virDomainDeviceDef *dev,
                                const virDomainDef *def ATTRIBUTE_UNUSED)
 {
+    int ret = 0;
+
     switch ((virDomainDeviceType) dev->type) {
+    case VIR_DOMAIN_DEVICE_RNG:
+        ret = virDomainCapsDeviceRNGDefValidate(caps, dev->data.rng);
+        break;
+
     case VIR_DOMAIN_DEVICE_DISK:
     case VIR_DOMAIN_DEVICE_REDIRDEV:
     case VIR_DOMAIN_DEVICE_NET:
     case VIR_DOMAIN_DEVICE_CONTROLLER:
     case VIR_DOMAIN_DEVICE_CHR:
     case VIR_DOMAIN_DEVICE_SMARTCARD:
-    case VIR_DOMAIN_DEVICE_RNG:
     case VIR_DOMAIN_DEVICE_HOSTDEV:
     case VIR_DOMAIN_DEVICE_VIDEO:
     case VIR_DOMAIN_DEVICE_MEMORY:
@@ -698,5 +727,5 @@ virDomainCapsDeviceDefValidate(virDomainCapsPtr const caps ATTRIBUTE_UNUSED,
         break;
     }
 
-    return 0;
+    return ret;
 }
index 4ff394608ee0d8febfd84505eb88deb27dc4b7ee..4756af38e9a9742148dfb76b2eee9f4a0c5ab65d 100644 (file)
@@ -217,6 +217,7 @@ virDomainCapsCPUModelsGet(virDomainCapsCPUModelsPtr cpuModels,
                              __nvalues, __values); \
     } while (0)
 
+
 int virDomainCapsEnumSet(virDomainCapsEnumPtr capsEnum,
                          const char *capsEnumName,
                          size_t nvalues,
index 8c8dacb2470855c53e20568eca7a4d0f90419286..0555caa6ab35806b05fb33fae476c14a0d70e429 100644 (file)
@@ -4974,36 +4974,12 @@ qemuDomainSmartcardDefValidate(const virDomainSmartcardDef *def)
 
 static int
 qemuDomainRNGDefValidate(const virDomainRNGDef *def,
-                         virQEMUCapsPtr qemuCaps)
+                         virQEMUCapsPtr qemuCaps ATTRIBUTE_UNUSED)
 {
-    bool modelIsSupported = false;
-
     if (def->backend == VIR_DOMAIN_RNG_BACKEND_EGD &&
         qemuDomainChrSourceDefValidate(def->source.chardev) < 0)
         return -1;
 
-    switch ((virDomainRNGModel) def->model) {
-    case VIR_DOMAIN_RNG_MODEL_VIRTIO:
-        modelIsSupported = virQEMUCapsGet(qemuCaps,
-                                          QEMU_CAPS_DEVICE_VIRTIO_RNG);
-        break;
-    case VIR_DOMAIN_RNG_MODEL_VIRTIO_TRANSITIONAL:
-    case VIR_DOMAIN_RNG_MODEL_VIRTIO_NON_TRANSITIONAL:
-        modelIsSupported = (virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE_VIRTIO_RNG) &&
-                            (virQEMUCapsGet(qemuCaps, QEMU_CAPS_VIRTIO_PCI_TRANSITIONAL) ||
-                             virQEMUCapsGet(qemuCaps, QEMU_CAPS_VIRTIO_PCI_DISABLE_LEGACY)));
-        break;
-    case VIR_DOMAIN_RNG_MODEL_LAST:
-        break;
-    }
-
-    if (!modelIsSupported) {
-        virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
-                       _("this qemu doesn't support RNG device type '%s'"),
-                       virDomainRNGModelTypeToString(def->model));
-        return -1;
-    }
-
     return 0;
 }