mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2025-02-22 11:22:23 +00:00
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:
parent
b66ca0220a
commit
d1830fba7f
@ -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;
|
||||
}
|
||||
|
@ -217,6 +217,7 @@ virDomainCapsCPUModelsGet(virDomainCapsCPUModelsPtr cpuModels,
|
||||
__nvalues, __values); \
|
||||
} while (0)
|
||||
|
||||
|
||||
int virDomainCapsEnumSet(virDomainCapsEnumPtr capsEnum,
|
||||
const char *capsEnumName,
|
||||
size_t nvalues,
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user