[libvirt] Domain XML format using defined storage volume + RFC

Daniel P. Berrange berrange at redhat.com
Mon May 19 21:34:35 UTC 2008


On Fri, May 16, 2008 at 01:00:16AM +0200, Stefan de Konink wrote:
> On Thu, 15 May 2008, Stefan de Konink wrote:
> 
> > On Thu, 15 May 2008, Stefan de Konink wrote:
> >
> > > I almost started crying why it didn't work. But it is fixed, and it works
> > > as a charm :) See updated patch!
> >
> > I guess I need to write the 'check' tool and documentation update too?
> 
> Since there is currently no check build for pools in that directory, I'm
> passing this to someother person.

Yes, testing the interaction with pools is actually harder that I anticipated,
because the libvirtd isn't available in context of the test suite. I'll have to
think about best way todo it. Might be able to stub out a dummy impl for purposes
of testing.

> @@ -1309,11 +1311,24 @@ virDomainParseXMLDiskDesc(virConnectPtr conn, xmlNodePtr node,
>          if (cur->type == XML_ELEMENT_NODE) {
>              if ((source == NULL) &&
>                  (xmlStrEqual(cur->name, BAD_CAST "source"))) {
> -
>                  if (typ == 0)
>                      source = xmlGetProp(cur, BAD_CAST "file");
> -                else
> +                else if (typ == 1)
>                      source = xmlGetProp(cur, BAD_CAST "dev");
> +                else if (typ == 2) {
> +                    xmlChar *pool   = xmlGetProp(cur, BAD_CAST "pool");
> +                    xmlChar *volume = xmlGetProp(cur, BAD_CAST "volume");
> +                    if (pool != NULL && volume != NULL) {
> +                        virStoragePoolPtr virPool;
> +                        virPool = virStoragePoolLookupByName(conn, (const char *) pool);
> +                        if (virPool != NULL) {
> +                            virStorageVolPtr virVol;
> +                            virVol = virStorageVolLookupByName(virPool, (const char *) volume);
> +                            if (virVol != NULL)
> +                                source = BAD_CAST virStorageVolGetPath(virVol);

This is leaking the pool and volume objects.

> +                        }
> +                    }
> +                }
>              } else if ((target == NULL) &&
>                         (xmlStrEqual(cur->name, BAD_CAST "target"))) {
>                  target = xmlGetProp(cur, BAD_CAST "dev");
> @@ -1411,7 +1426,8 @@ virDomainParseXMLDiskDesc(virConnectPtr conn, xmlNodePtr node,
>                  virBufferVSprintf(buf, "(uname 'phy:%s')", source);
>              else
>                  virBufferVSprintf(buf, "(uname 'phy:/dev/%s')", source);
> -        }
> +        } else if (typ == 2)
> +            virBufferVSprintf(buf, "(uname 'phy:%s')", source);

This is leaking the 'source' string, and a volume can be either a file
or a physical device, so fixing it to be 'phy:' is not correct.

We also need to apply the reverse mapping when generating the XML. eg
do a virStorageVolLookupByPath() to discover the volume/pool. 

And really need todo the same for the QEMU driver

Regards,
Daniel.
-- 
|: Red Hat, Engineering, Boston   -o-   http://people.redhat.com/berrange/ :|
|: http://libvirt.org  -o-  http://virt-manager.org  -o-  http://ovirt.org :|
|: http://autobuild.org       -o-         http://search.cpan.org/~danberr/ :|
|: GnuPG: 7D3B9505  -o-  F3C9 553F A1DA 4AC2 5648 23C1 B3DF F742 7D3B 9505 :|




More information about the libvir-list mailing list