From d1830fba7f39288b8c58a1418c1c3a2be14a102d Mon Sep 17 00:00:00 2001 From: Cole Robinson Date: Sun, 31 Mar 2019 17:56:48 -0400 Subject: [PATCH] qemu: Move rng model validation to domcaps The qemu driver already does some model validation, based on qemuCaps. However, the logic for exposing 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 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 Reviewed-by: Michal Privoznik Signed-off-by: Cole Robinson --- src/conf/domain_capabilities.c | 35 +++++++++++++++++++++++++++++++--- src/conf/domain_capabilities.h | 1 + src/qemu/qemu_domain.c | 26 +------------------------ 3 files changed, 34 insertions(+), 28 deletions(-) diff --git a/src/conf/domain_capabilities.c b/src/conf/domain_capabilities.c index e17696fbc6..1000d8b969 100644 --- a/src/conf/domain_capabilities.c +++ b/src/conf/domain_capabilities.c @@ -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; } diff --git a/src/conf/domain_capabilities.h b/src/conf/domain_capabilities.h index 4ff394608e..4756af38e9 100644 --- a/src/conf/domain_capabilities.h +++ b/src/conf/domain_capabilities.h @@ -217,6 +217,7 @@ virDomainCapsCPUModelsGet(virDomainCapsCPUModelsPtr cpuModels, __nvalues, __values); \ } while (0) + int virDomainCapsEnumSet(virDomainCapsEnumPtr capsEnum, const char *capsEnumName, size_t nvalues, diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c index 8c8dacb247..0555caa6ab 100644 --- a/src/qemu/qemu_domain.c +++ b/src/qemu/qemu_domain.c @@ -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; }