[libvirt] [PATCH] Add virConnectGetLibvirtVersion API

Cole Robinson crobinso at redhat.com
Thu Nov 12 13:58:34 UTC 2009


On 11/12/2009 06:49 AM, Daniel P. Berrange wrote:
> On Mon, Nov 02, 2009 at 03:52:28PM -0500, Cole Robinson wrote:
>> Hi all,
>>
>> The attached patch adds a new API call for retrieving the libvirt
>> version used by a connection: virConnectGetLibvirtVersion. Without this,
>> there is currently no way to determine the libvirt version of a remote
>> qemu connection for example. This info can be useful for feature
>> detection/enabling/disabling.
>>
>> As an example, virt-install may want to use the AC97 sound device as
>> the default sound model for new VMs. However, this was only added to
>> libvirt's white list in 0.6.0, while the other models have been
>> available since 0.4.3. If installing a remote guest, virt-install will
>> want to ensure that the remote libvirtd is >= 0.6.0. Granted, the remote
>> version could have backported the AC97 patch and virt-install would be
>> incorrect, but better to be overly restrictive than to blindly specify
>> AC97 and have guest creation bomb out.
>>
>> The 'correct' way to handle the above issue would be some combination of
>> dropping internal whitelists from libvirt and generating them from info
>> reported by the hypervisor, and advertising the available values in the
>> capabilities XML. However I think this API addition makes things more
>> manageable with little downside until a proper solution is implemented.
> 
> Even as a simple debugging aid for bug reporting, it would be justified
> to add this extra API call to get the remote version.
> 
>> commit 59871ddf8956a96a1148769c05ada6e763d91080
>> Author: Cole Robinson <crobinso at redhat.com>
>> Date:   Mon Nov 2 15:34:46 2009 -0500
>>
>>     Add virConnectGetLibvirtVersion
>>     
>>     There is currently no way to determine the libvirt version of a remote libvirtd we
>>     are connected to. This is a useful piece of data to enable feature detection.
> 
> I think I'd prefer a name of either
> 
>   virConnectGetLibVersion
>   virConnectGetAPIVersion
> 

I'll go with GetLibVersion

>> diff --git a/src/libvirt.c b/src/libvirt.c
>> index 5ddf27a..85d7008 100644
>> --- a/src/libvirt.c
>> +++ b/src/libvirt.c
>> @@ -1437,6 +1437,48 @@ error:
>>  }
>>  
>>  /**
>> + * virConnectGetLibvirtVersion:
>> + * @conn: pointer to the hypervisor connection
>> + * @libVer: returns the libvirt library version used on the connection (OUT)
>> + *
>> + * Provides @libVer, which is the version of the libvirt on the @conn host.
>> + *
>> + * Returns -1 in case of failure, 0 otherwise, and values for @libVer have
>> + *      the format major * 1,000,000 + minor * 1,000 + release.
>> + */
>> +int
>> +virConnectGetLibvirtVersion(virConnectPtr conn, unsigned long *libVer)
>> +{
>> +    DEBUG("conn=%p, libVir=%p", conn, libVer);
>> +
>> +    virResetLastError();
>> +
>> +    if (!VIR_IS_CONNECT(conn)) {
>> +        virLibConnError(NULL, VIR_ERR_INVALID_CONN, __FUNCTION__);
>> +        return -1;
>> +    }
>> +
>> +    if (libVer == NULL) {
>> +        virLibConnError(conn, VIR_ERR_INVALID_ARG, __FUNCTION__);
>> +        goto error;
>> +    }
>> +
>> +    if (conn->driver->libvirtVersion) {
>> +        int ret = conn->driver->libvirtVersion(conn, libVer);
>> +        if (ret < 0)
>> +            goto error;
>> +        return ret;
>> +    }
>> +
>> +    virLibConnError (conn, VIR_ERR_NO_SUPPORT, __FUNCTION__);
>> +
>> +error:
>> +    /* Copy to connection error object for back compatability */
>> +    virSetConnError(conn);
>> +    return -1;
>> +}
> 
> Wouldn't it be better here to fallback to
> 
>  *libVer = LIBVIR_VERSION_NUMBER;
> 
> in the case of 'conn->driver->libvirtVersion' being NULL. That
> would mean you'd only need to implemnet this driver method for
> the remote driver, letting all the others fallback to this generic
> case as they do with virGetVersion()
>

I did that at first, but thought it was kind of hacky. I figured it
would be easier for driver writers to plug the util.c function into
their driver table, rather than ask 'How do I implement this?' only to
end up at libvirt.c and realize it's implemented for them. I suppose a
comment would clear that up, so I'll reinstate that behavior.

Thanks,
Cole




More information about the libvir-list mailing list