qemu: Move rng model validation to domcaps

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>
This commit is contained in:
Cole Robinson 2019-03-31 17:56:48 -04:00
parent b66ca0220a
commit d1830fba7f
3 changed files with 34 additions and 28 deletions

View 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;
}

View File

@ -217,6 +217,7 @@ virDomainCapsCPUModelsGet(virDomainCapsCPUModelsPtr cpuModels,
__nvalues, __values); \
} while (0)
int virDomainCapsEnumSet(virDomainCapsEnumPtr capsEnum,
const char *capsEnumName,
size_t nvalues,

View 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;
}