[libvirt] [PATCH 10/16] conf: Add separate defaults addition and validation for XML parsing

Peter Krempa pkrempa at redhat.com
Mon Mar 4 15:04:43 UTC 2013


On 03/01/13 20:10, Laine Stump wrote:
> On 02/20/2013 12:06 PM, Peter Krempa wrote:
>> This patch adds instrumentation that will ultimately allow to split out
>> filling of defaults and input validation from the XML parser to separate
>> functions.
>>
>> With this patch, after the XML is parsed, a callback to the driver is
>> issued requesing to fill and validate driver specific details of the
>> configuration. This allows to use sensible defaults and checks on a per
>> driver basis at the time the XML is parsed.
>>
>> Two callback pointers are exposed in the virCaps object:
>> * virDriverDeviceDefCallback - called for a single device parsed and for
>>                                 every single device in a domain config.
>>                                 A virDomainDeviceDefPtr is passed.
>> * virDriverDomainDefCallback - called if a domain definition is parsed
>>                                 device specific callbacks were called.
>>                                 A virDomainDefPtr is passed.
>>
>> Errors may be reported in those callbacks resulting in a XML parsing
>> failure.
>>
>> Additionally two internal filler functions are added:
>> virDomainDeviceDefUpdateDefaultsInternal and
>> virDomainDefUpdateDefaultsInternal that are meant to be used for
>> separating the validation and defaults assignment code from the parser
>> function.
>> ---
>>   src/conf/capabilities.h |  6 +++++
>>   src/conf/domain_conf.c  | 72 +++++++++++++++++++++++++++++++++++++++++++++++++
>>   2 files changed, 78 insertions(+)
>>
>> diff --git a/src/conf/capabilities.h b/src/conf/capabilities.h
>> index cc01765..56cd09f 100644
>> --- a/src/conf/capabilities.h
>> +++ b/src/conf/capabilities.h
>> @@ -171,6 +171,12 @@ struct _virCaps {
>>       bool hasWideScsiBus;
>>       const char *defaultInitPath;
>>
>> +
>> +    /* these callbacks are called after a XML definition of a device or domain
>> +     * is parsed. They are meant to validate and fill driver-specific values. */
>> +    int (*virDriverDeviceDefCallback)(void *); /* virDomainDeviceDefPtr is passed */
>> +    int (*virDriverDomainDefCallback)(void *); /* virDomainDefPtr is passed */
>
> If you know that  virDriverDeviceDefCallback is always given a
> virDomainDeviceDefPtr, why prototype it as void*? Same question for
> virDriverDomainDefCallback.

Those two types are defined in conf/domain_conf.h. conf/domain_conf.h in 
return needs conf/capabilities.h. This creates a circular dependency 
chain if I try to include domain_conf.h in capabilities.h. I tried to to 
come up with a different solution than void * but none of the others 
were nicer than that. The options were:

1) use a separate header file for one of the types
2) use a extern declaration
3) include domain_conf.h into capabilities.h after all needed types were 
declared.

I'll welcome any tips how to solve this problem. (cc-d Dan and Eric).

>
> Additionally, in the callback for a device, we will need to have the
> virDomainDefPtr (e.g. so that we can see what machinetype was selected
> for the domain). And in both of these callbacks we will need to get the
> virCapsPtr so that (for example), we can have access to information
> about which devices are available for which machine types, the default
> pci addresses of integrated devices, etc.
>
> So, I think the callbacks should be like this:
>
>    int (*virDriverDeviceDefCallback) (virCapsPtr caps, virDomainDefPtr
> *domdef, virDomainDeviceDefPtr *devdef);
>    int (*virDriverDomainDefCallback) (virCapsPtr caps, virDomainDefPtr
> *domdef);
>

Yep, seems reasonable to me.

Peter




More information about the libvir-list mailing list