[libvirt] virStoragePoolDefParseString() fails with the following pool xml

Sharadha Prabhakar (3P) sharadha.prabhakar at citrix.com
Mon Mar 22 18:08:46 UTC 2010


Hi,
I'm still having problems getting a virStoragePoolDefPtr from
virStoragePoolDefParseString(xml). I've tried the example xmls
in libvirt but still getting NULL.
Can someone check if the following xml when passed to 
virStoragePoolDefParseString(..) returns a pointer to virStoragePoolDefPtr,
so that I can confirm that this function really works.
If something is wrong with the following XML please point out.

<pool type='netfs'>
  <name>NFS ISO library</name>
  <uuid>6142b786-378d-9def-bc96-2d0dc0466c13</uuid>
  <capacity>838729728</capacity>
  <allocation>838729728</allocation>
  <available>148315040</available>
  <source>
    <host name='telos'/>
    <dir path='/images/autoinstall'/>
    <format type='auto'/>
  </source>
  <target>
    <path>/</path>
    <permissions>
      <mode>00</mode>
      <owner>0</owner>
      <group>0</group>
    </permissions>
  </target>
</pool>

Thanks,
Sharadha



-----Original Message-----
From: Sharadha Prabhakar (3P) 
Sent: 19 March 2010 11:10
To: 'Daniel P. Berrange'
Cc: libvir-list at redhat.com
Subject: RE: [libvirt] virStoragePoolDefParseString() fails with the following pool xml



-----Original Message-----
From: Daniel P. Berrange [mailto:berrange at redhat.com] 
Sent: 19 March 2010 10:57
To: Sharadha Prabhakar (3P)
Cc: libvir-list at redhat.com
Subject: Re: [libvirt] virStoragePoolDefParseString() fails with the following pool xml

On Fri, Mar 19, 2010 at 10:37:15AM +0000, Sharadha Prabhakar (3P) wrote:
> Hi,
> I have the following Pool XML 
> 
> <pool type='netfs'>
>   <name>NFS ISO library</name>
>   <uuid>6142b786-378d-9def-bc96-2d0dc0466c13</uuid>
>   <capacity>838729728</capacity>
>   <allocation>838729728</allocation>
>   <available>148315040</available>
>   <source>
>     <host name='telos'/>
>     <dir path='/images/autoinstall'/>

>That needs to be '<directory.../>' instead of just <dir.../>'

I only filled the virStoragePoolDefPtr and passed it to virStoragePoolDefFormat(..) which
Returned the XML string that you see now. I've attached the function I used to fill pdef and
The call to virStoragePoolDefFormat at the end of this mail. I'm using libvirt version 0.7.6


>     <format type='auto'/>
>   </source>
>   <target>
>     <permissions>
>       <mode>00</mode>
>       <owner>0</owner>
>       <group>0</group>
>     </permissions>
>   </target>
> </pool>
> 
> I'm passing this string to virStoragePoolDefParseString() to get a virStoragePoolDefPtr
> But it returns NULL. Can anyone explain if there's something wrong with the XML format?

>FYI, there are example XML files in examples/xml/storage/  too



static char *
xenapiStoragePoolGetXMLDesc (virStoragePoolPtr pool,
                             unsigned int flags ATTRIBUTE_UNUSED)
{
    xen_sr_record *record=NULL;
    xen_sr sr=NULL;
    xen_pbd_set *pbd_set=NULL;
    xen_pbd pbd=NULL;
    char *pathDetails = NULL, *host=NULL, *path=NULL,*xml=NULL;
    virConnectPtr conn = pool->conn;
    virStoragePoolDefPtr pdef=NULL;
    char uuidStr[VIR_UUID_STRING_BUFLEN];
    int i;
    xen_session *session = ((struct _xenapiStoragePrivate *)(conn->storagePrivateData))->session;
    virUUIDFormat(pool->uuid,uuidStr);
    if (xen_sr_get_by_uuid(session, &sr, uuidStr)) {
        if (!xen_sr_get_record(session, &record, sr)) {
            xen_sr_free(sr);
            xenapiSessionErrorHandler(conn, VIR_ERR_INTERNAL_ERROR, "Couldn't get SR information");
            return NULL;
        }
        if (VIR_ALLOC(pdef)<0) {
            virReportOOMError();         
            xen_sr_record_free(record);
            return NULL;
        }
        if (STREQ(record->type,"nfs") || STREQ(record->type,"iso")) 
            pdef->type = VIR_STORAGE_POOL_NETFS;
        else if(STREQ(record->type,"iscsi"))
            pdef->type = VIR_STORAGE_POOL_ISCSI;
        else if(STREQ(record->type,"file"))
            pdef->type = VIR_STORAGE_POOL_DIR;
        else if(STREQ(record->type,"lvm"))
            pdef->type = VIR_STORAGE_POOL_LOGICAL;    
        else if(STREQ(record->type,"ext"))
            pdef->type = VIR_STORAGE_POOL_FS;
        else if(STREQ(record->type,"hba"))
            pdef->type = VIR_STORAGE_POOL_SCSI;

        fprintf(stderr,"\ntype:%s",virStoragePoolTypeToString(pdef->type));

        if (!(pdef->name = strdup(record->name_label))) {
            virReportOOMError();
            xen_sr_record_free(record);
            virStoragePoolDefFree(pdef);
            return NULL; //goto cleanup;
        }
        virUUIDParse(record->uuid,pdef->uuid);  
        pdef->allocation = (record->virtual_allocation)/1024;
        pdef->capacity = (record->physical_size)/1024;
        pdef->available = (record->physical_size - record->physical_utilisation)/1024;

        if (STREQ(record->type,"ext")) {
            pdef->source.format = VIR_STORAGE_POOL_FS_EXT3;
        } else if (STREQ(record->type,"nfs")) {
            pdef->source.format = VIR_STORAGE_POOL_NETFS_NFS;
        }
    
        xen_sr_get_pbds (session, &pbd_set, sr);
        pbd = pbd_set->contents[0];
        xen_string_string_map *deviceConfig=NULL;
        xen_pbd_get_device_config(session, &deviceConfig, pbd);
        if (deviceConfig) {
            for (i=0;i<deviceConfig->size;i++) {
                if(STREQ(deviceConfig->contents[i].key,"location")) {
                    fprintf(stderr,"\nfound location");
                    pathDetails = strdup(deviceConfig->contents[i].val);
                    break;
                }
            }
            xen_string_string_map_free(deviceConfig);
        }
        if (pathDetails) {
            VIR_ALLOC_N(host,strlen(pathDetails));
            VIR_ALLOC_N(path,strlen(pathDetails));
            if(pathDetails[0]!='/') {
                sscanf(pathDetails,"%[^:]:%s",host,path);
            } else {
                if(pathDetails[1]=='/') {
                    sscanf(pathDetails,"//%[^/]%s",host,path);
                } else {
                    strcpy(path,pathDetails);
                }
            }
            fprintf(stderr,"\nhost:%s,path:%s",host,path);
            if (host)
                pdef->source.host.name = strdup(host);
            if (path)
                pdef->source.dir = strdup(path);
            VIR_FREE(host);
            VIR_FREE(path);
            VIR_FREE(pathDetails);
        }
        xen_sr_free(sr);
        xen_sr_record_free(record);           
        xml = virStoragePoolDefFormat(pdef);
        virStoragePoolDefFree(pdef);
        if (!xml) 
            xenapiSessionErrorHandler(conn, VIR_ERR_INTERNAL_ERROR, "Couldn't convert to XML format");
        return xml;
    } else {
        xenapiSessionErrorHandler(conn, VIR_ERR_INTERNAL_ERROR, NULL);
        return NULL;
    }
}       

The XML output produced was 
<pool type='netfs'>
  <name>NFS ISO library</name>
  <uuid>6142b786-378d-9def-bc96-2d0dc0466c13</uuid>
  <capacity>838729728</capacity>
  <allocation>838729728</allocation>
  <available>148315040</available>
  <source>
    <host name='telos'/>
    <dir path='/images/autoinstall'/>
    <format type='auto'/>
  </source>
  <target>
    <permissions>
      <mode>00</mode>
      <owner>0</owner>
      <group>0</group>
    </permissions>
  </target>
</pool>








More information about the libvir-list mailing list