[libvirt] Looking for good example API function(s)
Daniel P. Berrange
berrange at redhat.com
Wed Mar 11 13:55:57 UTC 2009
On Tue, Mar 10, 2009 at 11:36:01AM -0400, Laine Stump wrote:
> To help with lutter's network configuration project, I'm looking at
> adding API functions to libvirt which are essentially pass-throughs to
> netcf library APIs called by libvirtd. Can someone point me to good
> examples of APIs that are not hypervisor driver-dependent (and possibly
> not host OS-dependent either - I believe the final intent is for netcf
> to handle all host OS dependencies itself) to use as a basis for writing
> these new APIs?
>
> At a more detailed level, a quick trace through the code of some other
> APIs got me as far as the call to the "call" function, with an RPC code,
> but I didn't find where that call was caught (and the RPC code
> interpreted, eg REMOTE_PROC_NETWORK_CREATE_XML - cscope couldn't find
> any other reference to this value) on the libvirtd side. I'm about run
> virsh and libvirtd under gdb to learn this by experimentation, but if
> someone wants to take the fun out of it for me, hints would be gladly
> accepted! ;-)
- Application connects to libvirt (virConnectOpen()
- in src/libvirt.c we activate a hypervisor driver based on the
URI given. If successful, we then try to activate a number of
secondary drivers (eg virtual network, storage, node device)
- in src/libvirt.c, virConenctPtr is populted with callbacks for
each of the activated drivers
Now....
- Application calls virNetworkCreateXML()
- in src/libvirt.c, this runs virNetworkCreateXML code
- this uses the networkDriver callback sets, invoking
the networkCreateXML() callback, eg
conn->networkDriver->networkCreateXML()
For something like the network driver, in the application process
the driver that's activated will be the generic remote driver.
- So, networkCreateXML() is pointing to remoteNetworkCreateXML()
in src/remote_driver.c
- remoteNetworkCreateXML() now serializes the parameters into
XDR format, and makes an RPC call REMOTE_PROC_NETWORK_CREATE_XML
The RPC calls are handling by the libvirtd daemon.
- libvirtd gets REMOTE_PROC_NETWORK_CREATE_XML and dispatches
it to remoteDispatchNetworkCreateXML() in qemud/remote.c
- libvirtd itself uses libvirt.so, so it once against calls
into the public API virNetworkCreateXML() as the application
did much earlier.
- in src/libvirt.c, this runs virNetworkCreateXML code
- this uses the networkDriver callback sets, invoking
the networkCreateXML() callback, eg
conn->networkDriver->networkCreateXML()
When run inside libvirtd though, libvirt.so does not activate
the 'remote' driver. Instead it activates the real driver,
in this case provided by src/network_driver.c
- So, networkCreateXML() is pointing to networkCreate()
in src/network_driver.c
- networkCreate() finally does whatever interesting stuff
needs to be done to complete the operation.
Summarizing
app -> libvirt.so -> remote driver -> XDR ->...
... TCP socket ...
... XDR -> libvirtd -> libvirt.so -> network driver
Daniel
--
|: Red Hat, Engineering, London -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