[Kimchi-devel] [RFC PATCH] List IPs of VM Ifaces

Aline Manera alinefm at linux.vnet.ibm.com
Wed May 27 16:19:33 UTC 2015


Hi Christy,

Your patch looks good.

I just have one suggestion. There is a python module name scapy that has 
some ARP methods.
On Ubuntu the package is python-scapy.
I am not sure it is available in all major Linux distribution, but I 
think we could take a look on it.

Regards,
Aline Manera

On 21/05/2015 14:04, Christy Perez wrote:
> Signed-off-by: Christy Perez <christy at linux.vnet.ibm.com>
> ---
>   src/kimchi/model/vmifaces.py | 29 +++++++++++++++++++++++++++++
>   1 file changed, 29 insertions(+)
>
> diff --git a/src/kimchi/model/vmifaces.py b/src/kimchi/model/vmifaces.py
> index 8bf6b3d..0b1ffe3 100644
> --- a/src/kimchi/model/vmifaces.py
> +++ b/src/kimchi/model/vmifaces.py
> @@ -25,6 +25,7 @@ from lxml import etree, objectify
>   from kimchi.exception import InvalidParameter, MissingParameter, NotFoundError
>   from kimchi.model.config import CapabilitiesModel
>   from kimchi.model.vms import DOM_STATE_MAP, VMModel
> +from kimchi.utils import run_command
>   from kimchi.xmlutils.interface import get_iface_xml
>
>
> @@ -122,9 +123,37 @@ class VMIfaceModel(object):
>               info['network'] = iface.source.get('network')
>           if info['type'] == 'bridge':
>               info['bridge'] = iface.source.get('bridge')
> +        info['ips'] = self._get_ips(info['mac'], info['network'])
>
>           return info
>
> +    def _get_ips(self, mac, network):
> +        ips = []
> +        conn = self.conn.get()
> +        # An iface may have multiple IPs
> +        # An IP could have been assigned without libvirt.
> +        # First check the ARP cache.
> +        (stdout, stderr, returncode) = run_command(['arp', '-n'])
> +        if returncode == 0:
> +            ips = [line.split()[0] for line in stdout.splitlines() if mac in line]
> +        # Some ifaces may be inactive, so if the ARP cache didn't have them,
> +        # and they happen to be assigned via DHCP, we can check there too.
> +        try:
> +            net = conn.networkLookupByName(network)
> +            leases = net.DHCPLeases(mac)
> +            for lease in leases:
> +                ip = lease.get('ipaddr')
> +                if ip not in ips:
> +                    ips.append(ip)
> +        except libvirt.libvirtError:
> +            pass
> +
> +        # @TODO: One other option is introspection. It is not, however,
> +        # guaranteed that any host OS would have the same files & commands
> +        # for storing and retreiving IPs. So, this may be as good as we can do.
> +
> +        return ips
> +
>       def delete(self, vm, mac):
>           dom = VMModel.get_vm(vm, self.conn)
>           iface = self._get_vmiface(vm, mac)




More information about the Kimchi-devel mailing list