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 :|