1
0
mirror of https://gitlab.com/libvirt/libvirt-python.git synced 2025-08-02 04:21:59 +03:00

Expose virDomainInterfacesAddresses to python binding

examples/Makefile.am:
  * Add new file domipaddrs.py

examples/README:
  * Add documentation for the python example

libvirt-override-api.xml:
  * Add new symbol for virDomainInterfacesAddresses

libvirt-override.c:
  * Hand written python api

Example:
  $ python examples/domipaddrs.py qemu:///system f18
    Interface  MAC address          Protocol     Address
    vnet0      52:54:00:20:70:3d    ipv4         192.168.105.240/16

Signed-off-by: Pavel Hrdina <phrdina@redhat.com>
This commit is contained in:
Pavel Hrdina
2015-03-28 11:21:56 +01:00
parent e1e9b27096
commit 0be1f5e31a
7 changed files with 199 additions and 0 deletions

View File

@ -4,6 +4,7 @@ include COPYING
include COPYING.LESSER
include ChangeLog
include examples/consolecallback.py
include examples/domipaddrs.py
include examples/dominfo.py
include examples/domrestore.py
include examples/domsave.py

View File

@ -11,6 +11,7 @@ domrestore.py - restore domU's from their saved files in a directory
esxlist.py - list active domains of an VMware ESX host and print some info.
also demonstrates how to use the libvirt.openAuth() method
dhcpleases.py - list dhcp leases for a given virtual network
domipaddrs.py - list IP addresses for guest domains
The XML files in this directory are examples of the XML format that libvirt
expects, and will have to be adapted for your setup. They are only needed

57
examples/domipaddrs.py Executable file
View File

@ -0,0 +1,57 @@
#!/usr/bin/env python
# domipaddrs - print domain interfaces along with their MAC and IP addresses
import libvirt
import sys
def usage():
print "Usage: %s [URI] DOMAIN" % sys.argv[0]
print " Print domain interfaces along with their MAC and IP addresses"
uri = None
name = None
args = len(sys.argv)
if args == 2:
name = sys.argv[1]
elif args == 3:
uri = sys.argv[1]
name = sys.argv[2]
else:
usage()
sys.exit(2)
conn = libvirt.open(uri)
if conn == None:
print "Unable to open connection to libvirt"
sys.exit(1)
try:
dom = conn.lookupByName(name)
except libvirt.libvirtError:
print "Domain %s not found" % name
sys.exit(0)
ifaces = dom.interfaceAddresses(libvirt.VIR_DOMAIN_INTERFACE_ADDRESSES_SRC_LEASE);
if (ifaces == None):
print "Failed to get domain interfaces"
sys.exit(0)
print " {0:10} {1:20} {2:12} {3}".format("Interface", "MAC address", "Protocol", "Address")
def toIPAddrType(addrType):
if addrType == libvirt.VIR_IP_ADDR_TYPE_IPV4:
return "ipv4"
elif addrType == libvirt.VIR_IP_ADDR_TYPE_IPV6:
return "ipv6"
for (name, val) in ifaces.iteritems():
if val['addrs']:
for addr in val['addrs']:
print " {0:10} {1:19}".format(name, val['hwaddr']),
print " {0:12} {1}/{2} ".format(toIPAddrType(addr['type']), addr['addr'], addr['prefix']),
print
else:
print " {0:10} {1:19}".format(name, val['hwaddr']),
print " {0:12} {1}".format("N/A", "N/A"),
print

View File

@ -483,6 +483,7 @@ skip_impl = (
'virDomainBlockCopy',
'virNodeAllocPages',
'virDomainGetFSInfo',
'virDomainInterfaceAddresses',
)
lxc_skip_impl = (
@ -595,6 +596,7 @@ skip_function = (
'virDomainStatsRecordListFree', # only useful in C, python uses dict
'virDomainFSInfoFree', # only useful in C, python code uses list
'virDomainIOThreadInfoFree', # only useful in C, python code uses list
'virDomainInterfaceFree', # only useful in C, python code uses list
)
lxc_skip_function = (

View File

@ -678,5 +678,12 @@
<arg name='flags' type='unsigned int' info='unused, pass 0'/>
<return type='char *' info="list of mounted filesystems information"/>
</function>
<function name='virDomainInterfaceAddresses' file='python'>
<info>returns a dictionary of domain interfaces along with their MAC and IP addresses</info>
<arg name='dom' type='virDomainPtr' info='pointer to the domain'/>
<arg name='source' type='unsigned int' info='the data source'/>
<arg name='flags' type='unsigned int' info='extra flags; not used yet, so callers should always pass 0'/>
<return type='char *' info="dictionary of domain interfaces along with their MAC and IP addresses"/>
</function>
</symbols>
</api>

View File

@ -5120,6 +5120,131 @@ cleanup:
return py_retval;
}
#if LIBVIR_CHECK_VERSION(1, 2, 14)
static PyObject *
libvirt_virDomainInterfaceAddresses(PyObject *self ATTRIBUTE_UNUSED,
PyObject *args)
{
PyObject *py_retval = VIR_PY_NONE;
PyObject *pyobj_domain;
virDomainPtr domain;
virDomainInterfacePtr *ifaces = NULL;
unsigned int source;
unsigned int flags;
int ifaces_count = 0;
size_t i, j;
if (!PyArg_ParseTuple(args, (char *) "Oii:virDomainInterfaceAddresses",
&pyobj_domain, &source, &flags))
goto error;
domain = (virDomainPtr) PyvirDomain_Get(pyobj_domain);
LIBVIRT_BEGIN_ALLOW_THREADS;
ifaces_count = virDomainInterfaceAddresses(domain, &ifaces, source, flags);
LIBVIRT_END_ALLOW_THREADS;
if (ifaces_count < 0)
goto cleanup;
if (!(py_retval = PyDict_New()))
goto error;
for (i = 0; i < ifaces_count; i++) {
virDomainInterfacePtr iface = ifaces[i];
PyObject *py_addrs = NULL;
PyObject *py_iface = NULL;
PyObject *py_iname = NULL;
PyObject *py_ivalue = NULL;
if (!(py_iface = PyDict_New()))
goto error;
if ((py_iname = libvirt_charPtrWrap(iface->name)) == NULL ||
PyDict_SetItem(py_retval, py_iname, py_iface) < 0) {
Py_XDECREF(py_iname);
Py_DECREF(py_iface);
goto error;
}
if (iface->naddrs) {
if (!(py_addrs = PyList_New(iface->naddrs))) {
goto error;
}
} else {
py_addrs = VIR_PY_NONE;
}
if ((py_iname = libvirt_constcharPtrWrap("addrs")) == NULL ||
PyDict_SetItem(py_iface, py_iname, py_addrs) < 0) {
Py_XDECREF(py_iname);
Py_DECREF(py_addrs);
goto error;
}
if ((py_iname = libvirt_constcharPtrWrap("hwaddr")) == NULL ||
(py_ivalue = libvirt_constcharPtrWrap(iface->hwaddr)) == NULL ||
PyDict_SetItem(py_iface, py_iname, py_ivalue) < 0) {
Py_XDECREF(py_iname);
Py_XDECREF(py_ivalue);
goto error;
}
for (j = 0; j < iface->naddrs; j++) {
virDomainIPAddressPtr addr = &(iface->addrs[j]);
PyObject *py_addr = PyDict_New();
if (!py_addr)
goto error;
if (PyList_SetItem(py_addrs, j, py_addr) < 0) {
Py_DECREF(py_addr);
goto error;
}
if ((py_iname = libvirt_constcharPtrWrap("addr")) == NULL ||
(py_ivalue = libvirt_constcharPtrWrap(addr->addr)) == NULL ||
PyDict_SetItem(py_addr, py_iname, py_ivalue) < 0) {
Py_XDECREF(py_iname);
Py_XDECREF(py_ivalue);
goto error;
}
if ((py_iname = libvirt_constcharPtrWrap("prefix")) == NULL ||
(py_ivalue = libvirt_intWrap(addr->prefix)) == NULL ||
PyDict_SetItem(py_addr, py_iname, py_ivalue) < 0) {
Py_XDECREF(py_iname);
Py_XDECREF(py_ivalue);
goto error;
}
if ((py_iname = libvirt_constcharPtrWrap("type")) == NULL ||
(py_ivalue = libvirt_intWrap(addr->type)) == NULL ||
PyDict_SetItem(py_addr, py_iname, py_ivalue) < 0) {
Py_XDECREF(py_iname);
Py_XDECREF(py_ivalue);
goto error;
}
}
}
cleanup:
if (ifaces && ifaces_count > 0) {
for (i = 0; i < ifaces_count; i++) {
virDomainInterfaceFree(ifaces[i]);
}
}
VIR_FREE(ifaces);
return py_retval;
error:
Py_XDECREF(py_retval);
py_retval = NULL;
goto cleanup;
}
#endif /* LIBVIR_CHECK_VERSION(1, 2, 14) */
/*******************************************
* Helper functions to avoid importing modules
* for every callback
@ -8750,6 +8875,9 @@ static PyMethodDef libvirtMethods[] = {
#if LIBVIR_CHECK_VERSION(1, 2, 11)
{(char *) "virDomainGetFSInfo", libvirt_virDomainGetFSInfo, METH_VARARGS, NULL},
#endif /* LIBVIR_CHECK_VERSION(1, 2, 11) */
#if LIBVIR_CHECK_VERSION(1, 2, 14)
{(char *) "virDomainInterfaceAddresses", libvirt_virDomainInterfaceAddresses, METH_VARARGS, NULL},
#endif /* LIBVIR_CHECK_VERSION(1, 2, 14) */
{NULL, NULL, 0, NULL}
};

View File

@ -145,6 +145,9 @@ for cname in wantfunctions:
if name[0:25] == "virDomainIOThreadInfoFree":
continue
if name[0:22] == "virDomainInterfaceFree":
continue
if name[0:21] == "virDomainListGetStats":
name = "virConnectDomainListGetStats"