[libvirt] [PATCH] Add domain type checking

Matthias Bolte matthias.bolte at googlemail.com
Sat Jul 9 13:38:32 UTC 2011


2011/7/8 Eric Blake <eblake at redhat.com>:
> On 07/08/2011 02:13 AM, Matthias Bolte wrote:
>> The drivers were accepting domain configs without checking if those
>> were actually meant for them. For example the LXC driver happily
>> accepts configs with type QEMU.
>>
>> For convenience add an optional check for the domain type for the
>> virDomainDefParse* functions. It's optional because in some places
>> virDomainDefParse* is used to parse a config without caring about
>> it's type. Also the QEMU driver has to accept 4 different types and
>> does this checking own it's own.
>
> Can we factor the 4 QEMU types back into the common method?  Do this by
> treating expectedType as a bitmask:
>
>> +++ b/src/conf/domain_conf.c
>> @@ -1257,7 +1257,7 @@ virDomainObjSetDefTransient(virCapsPtr caps,
>>      if (!(xml = virDomainDefFormat(domain->def, VIR_DOMAIN_XML_WRITE_FLAGS)))
>>          goto out;
>>
>> -    if (!(newDef = virDomainDefParseString(caps, xml,
>> +    if (!(newDef = virDomainDefParseString(caps, xml, -1,
>>                                             VIR_DOMAIN_XML_READ_FLAGS)))
>
> -1 being the bitmask to accept all possible types,
>
>> @@ -5796,6 +5797,14 @@ static virDomainDefPtr virDomainDefParseXML(virCapsPtr caps,
>>      }
>>      VIR_FREE(tmp);
>>
>> +    if (expectedVirtType >= 0 && def->virtType != expectedVirtType) {
>
> here, change the logic to:
>
> if (((1 << def->virtType) & expectedVirtTypes) == 0) {
>
>> +        virDomainReportError(VIR_ERR_INTERNAL_ERROR,
>> +                             _("unexpected domain type %s, should be %s"),
>> +                             virDomainVirtTypeToString(def->virtType),
>> +                             virDomainVirtTypeToString(expectedVirtType));
>> +        goto error;
>> +    }
>> +
>>      /* Extract domain name */
>>      if (!(def->name = virXPathString("string(./name[1])", ctxt))) {
>>          virDomainReportError(VIR_ERR_NO_NAME, NULL);
>> @@ -6704,6 +6713,7 @@ no_memory:
>>  static virDomainObjPtr virDomainObjParseXML(virCapsPtr caps,
>>                                              xmlDocPtr xml,
>>                                              xmlXPathContextPtr ctxt,
>> +                                            int expectedVirtType,
>
> make this plural expectedVirtTypes, to reflect that it is a bitmask,
>
>> +++ b/src/esx/esx_driver.c
>> @@ -2855,7 +2855,8 @@ esxDomainXMLToNative(virConnectPtr conn, const char *nativeFormat,
>>          return NULL;
>>      }
>>
>> -    def = virDomainDefParseString(priv->caps, domainXml, 0);
>> +    def = virDomainDefParseString(priv->caps, domainXml,
>> +                                  VIR_DOMAIN_VIRT_VMWARE, 0);
>
> here, pass (1 << VIR_DOMAIN_VIRT_VMWARE) instead of VIR_DOMAIN_VIRT_VMWARE
>
>> +++ b/src/qemu/qemu_domain.c
>> @@ -700,10 +700,32 @@ void qemuDomainObjExitRemoteWithDriver(struct qemud_driver *driver,
>>      ignore_value(virDomainObjUnref(obj));
>>  }
>>
>> +virDomainDefPtr qemuDomainDefParseXML(struct qemud_driver *driver,
>> +                                      const char *xml,
>> +                                      unsigned int flags)
>> +{
>> +    virDomainDefPtr def;
>> +
>> +    if (!(def = virDomainDefParseString(driver->caps, xml, -1, flags)))
>> +        return NULL;
>> +
>> +    if (def->virtType != VIR_DOMAIN_VIRT_QEMU &&
>> +        def->virtType != VIR_DOMAIN_VIRT_KQEMU &&
>> +        def->virtType != VIR_DOMAIN_VIRT_KVM &&
>> +        def->virtType != VIR_DOMAIN_VIRT_XEN) {
>
> Then here, instead of having qemu parse things, you instead pass:
>
> ((1 << VIR_DOMAIN_VIRT_QEMU) |
>  (1 << VIR_DOMAIN_VIRT_KQEMU) |
>  (1 << VIR_DOMAIN_VIRT_KVM) |
>  (1 << VIR_DOMAIN_VIRT_XEN))
>
> as the expectedVirtTypes.

Good idea, here's a v2 that does this.

-- 
Matthias Bolte
http://photron.blogspot.com
-------------- next part --------------
A non-text attachment was scrubbed...
Name: 0001-Add-domain-type-checking.patch
Type: text/x-diff
Size: 38479 bytes
Desc: not available
URL: <http://listman.redhat.com/archives/libvir-list/attachments/20110709/613753ff/attachment-0001.bin>


More information about the libvir-list mailing list