[libvirt] RFC: Introduce API to query IP addresses for given domain

Nehal J. Wani nehaljw.kkd1 at gmail.com
Fri Jun 28 10:26:10 UTC 2013


Hello, fellow developers!
      I am a GSoC candidate this year working for libvirt.org. My
project is "Introduce API to query IP addresses for given domain".
The discussion regarding this feature had started here:
http://www.mail-archive.com/libvir-list@redhat.com/msg51857.html and
then Michal had sent a patch too (refer:
http://www.mail-archive.com/libvir-list@redhat.com/msg57141.html). But
it was not pushed upstream due to lack of extensibility.

So far I've come up with an API and I want to get your opinion before
I start writing the rest so I don't follow the wrong direction.

Following are the valid commands:

domifaddr <domain-name>
domifaddr <domain-name> <interface-name>
domifaddr <domain-name> <interface-name> <method>
domifaddr <domain-name> <method>

methods:
(i) Querying qemu-guest-agent
(ii) Getting info from dnsmasq.leases file
(iii) Using the nwfilter to snoop the traffic

If no method is mentioned, qemu-guest-agent will be used.

Previous attempts by Michal had used structs and xml. Structs bring in
restrictions and xml has to be parsed. Hence I am not planning to
continue with either of these.

As a start, I would like to know your comments about my API which
queries the qemu-guest-agent and returns the results in
virTypedParameter **params.

Format(JSON) in which the qemu guest agent returns info:

[{"name":"lo",
	"ip-addresses":
		[{"ip-address-type":"ipv4","ip-address":"127.0.0.1","prefix":8},
         	{"ip-address-type":"ipv6","ip-address":"::1","prefix":128}],
        "hardware-address":"00:00:00:00:00:00"},
{"name":"eth0",
	"ip-addresses":
        	[{"ip-address-type":"ipv4","ip-address":"192.168.122.42","prefix":24},
         	{"ip-address-type":"ipv6","ip-address":"fe80::5054:ff:fe09:d240","prefix":64}],
        "hardware-address":"52:54:00:09:d2:40"}]

//Possible 1-D Structure (A little hassle to maintain)

params[0] = {"iface-count",int,2}
params[1] = {"iface-name",string,"lo"}
params[2] = {"iface-hwaddr",string,"00:00:00:00:00:00"}
params[3] = {"iface-addr-count",int,2}
params[4] = {"iface-addr-type",string,"ipv4"}
params[5] = {"iface-addr",string,"127.0.0.1"}
params[6] = {"iface-addr-prefix",int,8}
params[7] = {"iface-addr-type",string,"ipv6"}
params[8] = {"iface-addr",string,"::1"}
params[9] = {"iface-addr-prefix",int,128}
....
....
....

//2D Structure: (Not very hasslefree, but easier to maintain as one
interface per row)

params[0] = {"iface-name",string,"lo"}{"iface-hwaddr",string,"00:00:00:00:00:00"}{"iface-addr-type",string,"ipv4"}{"iface-addr",string,"127.0.0.1"}{"iface-addr-prefix",int,8}{"iface-addr-type",string,"ipv6"}{"iface-addr",string,"::1"}{"iface-addr-prefix",int,128}
params[1] = {"iface-name",string,"eth0"}{"iface-hwaddr",string,"52:54:00:09:d2:40"}{"iface-addr-type",string,"ipv4"}{"iface-addr",string,"192.168.122.42"}{"iface-addr-prefix",int,8}{"iface-addr-type",string,"ipv6"}{"iface-addr",string,"fe80::5054:ff:fe09:d240"}{"iface-addr-prefix",int,64}


Function definitions that I intend to use are:

static int
remoteDispatchDomainInterfacesAddresses(
    virNetServerPtr server ATTRIBUTE_UNUSED,
    virNetServerClientPtr client,
    virNetMessagePtr msg ATTRIBUTE_UNUSED,
    virNetMessageErrorPtr rerr,
    remote_domain_interfaces_addresses_args *args,
    remote_domain_interfaces_addresses_ret *ret)

int virDomainInterfacesAddresses (virDomainPtr dom,
                                 virTypedParameterPtr *params,
                                  int *nparams,
                                  unsigned int flags);


typedef int
(*virDrvDomainInterfacesAddresses)   (virDomainPtr dom,
                                      virTypedParameterPtr *params,
                                      int *nparams,
                                      unsigned int flags);



int
virDomainInterfacesAddresses (virDomainPtr dom,
                             virTypedParameterPtr *params,
                             int *nparams,
                             unsigned int flags)

int
qemuAgentGetInterfaces(qemuAgentPtr mon,
                       virTypedParameterPtr *params,
                       int *nparams)


int qemuAgentGetInterfaces(qemuAgentPtr mon,
                           virTypedParameterPtr *params,
                           int *nparams);


static int
qemuDomainInterfacesAddresses(virDomainPtr dom,
                              virTypedParameterPtr *params,
                              int *nparams,
                              unsigned int flags)

static int
remoteDomainInterfacesAddresses(virDomainPtr dom,
                               virTypedParameterPtr *params,
                               int *nparams,
                                unsigned int flags)

static bool
cmdDomIfAddr(vshControl *ctl, const vshCmd *cmd)

Also, It will be helpful to know whether we want the client to first
query for the number of parameters and then send the request or have
the server side allocate appropriate memory and return the result once
in for all. In the latter case, I'll be using something of the kind
virTypedParameterPtr ***params.


Thanking You,
Nehal J. Wani
UG2, BTech CS+MS(CL)
IIIT-Hyderabad
http://commanlinewani.blogspot.com
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://listman.redhat.com/archives/libvir-list/attachments/20130628/100d6f03/attachment-0001.htm>


More information about the libvir-list mailing list