[PATCH] ch_domain: Add handler for virDomainDeviceDefPostParseCallback

Peter Krempa pkrempa at redhat.com
Fri Jun 18 08:14:12 UTC 2021


On Wed, Jun 16, 2021 at 21:16:01 -0700, William Douglas wrote:
> Instead of trying to match devices passed in based on the monitor
> detecting the number of devices that were used in the domain
> definition, use the devicesPostParseCallback to evaluate if
> unsupported devices are used.
> 
> This allows the compiler to detect when new device types are added
> that need to be checked.
> 
> Signed-off-by: William Douglas <william.douglas at intel.com>
> ---
>  src/ch/ch_domain.c  | 121 +++++++++++++++++++++++++++++++++++++++++++
>  src/ch/ch_monitor.c | 122 --------------------------------------------
>  2 files changed, 121 insertions(+), 122 deletions(-)
> 
> diff --git a/src/ch/ch_domain.c b/src/ch/ch_domain.c
> index f9a6f3f31d..02ca5ea06c 100644
> --- a/src/ch/ch_domain.c
> +++ b/src/ch/ch_domain.c
> @@ -197,7 +197,128 @@ virCHDomainDefPostParse(virDomainDef *def,
>      return 0;
>  }
>  
> +static int
> +virCHDomainDeviceDefPostParse(virDomainDeviceDef *dev,
> +                              const virDomainDef *def G_GNUC_UNUSED,
> +                              unsigned int parseFlags G_GNUC_UNUSED,
> +                              void *opaque G_GNUC_UNUSED,
> +                              void *parseOpaque G_GNUC_UNUSED)
> +{
> +    int ret = -1;
> +
> +    switch ((virDomainDeviceType)dev->type) {
> +    case VIR_DOMAIN_DEVICE_DISK:
> +        ret = 0;
> +        break;
> +    case VIR_DOMAIN_DEVICE_LEASE:
> +        virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
> +                       _("Cloud-Hypervisor doesn't support lease"));
> +        break;
> +    case VIR_DOMAIN_DEVICE_FS:
> +        virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
> +                       _("Cloud-Hypervisor doesn't support fs"));
> +        break;
> +    case VIR_DOMAIN_DEVICE_NET:
> +        ret = 0;
> +        break;
> +    case VIR_DOMAIN_DEVICE_INPUT:
> +        virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
> +                       _("Cloud-Hypervisor doesn't support input"));
> +        break;
> +    case VIR_DOMAIN_DEVICE_SOUND:
> +        virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
> +                       _("Cloud-Hypervisor doesn't support sound"));
> +        break;

To further simplify the code you can also do the following (just an
example):

    case VIR_DOMAIN_DEVICE_VIDEO:
    case VIR_DOMAIN_DEVICE_HOSTDEV:
    case VIR_DOMAIN_DEVICE_WATCHDOG:
    case VIR_DOMAIN_DEVICE_CONTROLLER:
    case VIR_DOMAIN_DEVICE_GRAPHICS:
    case VIR_DOMAIN_DEVICE_HUB:
    case VIR_DOMAIN_DEVICE_REDIRDEV:
    case VIR_DOMAIN_DEVICE_SMARTCARD:
    case VIR_DOMAIN_DEVICE_CHR:
    default:
        virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
                       _("Cloud-Hypervisor doesn't support '%s' device"),
                       virDomainDeviceTypeToString(dev->type));
        return -1;


Also note that in validation callbacks any invalid configuration should
direclty return -1 to short circuit the execution so that we don't need
to have a 'ret' variable. It makes the code easier to read.




More information about the libvir-list mailing list