~openstack-charmers-archive/charms/precise/swift-proxy/trunk

« back to all changes in this revision

Viewing changes to charmhelpers/contrib/network/ip.py

  • Committer: Liam Young
  • Date: 2016-01-28 09:03:50 UTC
  • Revision ID: liam.young@canonical.com-20160128090350-tl7hj01pgi0r28im
16.01 Charm release

Show diffs side-by-side

added added

removed removed

Lines of Context:
53
53
 
54
54
 
55
55
def no_ip_found_error_out(network):
56
 
    errmsg = ("No IP address found in network: %s" % network)
 
56
    errmsg = ("No IP address found in network(s): %s" % network)
57
57
    raise ValueError(errmsg)
58
58
 
59
59
 
61
61
    """Get an IPv4 or IPv6 address within the network from the host.
62
62
 
63
63
    :param network (str): CIDR presentation format. For example,
64
 
        '192.168.1.0/24'.
 
64
        '192.168.1.0/24'. Supports multiple networks as a space-delimited list.
65
65
    :param fallback (str): If no address is found, return fallback.
66
66
    :param fatal (boolean): If no address is found, fallback is not
67
67
        set and fatal is True then exit(1).
75
75
        else:
76
76
            return None
77
77
 
78
 
    _validate_cidr(network)
79
 
    network = netaddr.IPNetwork(network)
80
 
    for iface in netifaces.interfaces():
81
 
        addresses = netifaces.ifaddresses(iface)
82
 
        if network.version == 4 and netifaces.AF_INET in addresses:
83
 
            addr = addresses[netifaces.AF_INET][0]['addr']
84
 
            netmask = addresses[netifaces.AF_INET][0]['netmask']
85
 
            cidr = netaddr.IPNetwork("%s/%s" % (addr, netmask))
86
 
            if cidr in network:
87
 
                return str(cidr.ip)
 
78
    networks = network.split() or [network]
 
79
    for network in networks:
 
80
        _validate_cidr(network)
 
81
        network = netaddr.IPNetwork(network)
 
82
        for iface in netifaces.interfaces():
 
83
            addresses = netifaces.ifaddresses(iface)
 
84
            if network.version == 4 and netifaces.AF_INET in addresses:
 
85
                addr = addresses[netifaces.AF_INET][0]['addr']
 
86
                netmask = addresses[netifaces.AF_INET][0]['netmask']
 
87
                cidr = netaddr.IPNetwork("%s/%s" % (addr, netmask))
 
88
                if cidr in network:
 
89
                    return str(cidr.ip)
88
90
 
89
 
        if network.version == 6 and netifaces.AF_INET6 in addresses:
90
 
            for addr in addresses[netifaces.AF_INET6]:
91
 
                if not addr['addr'].startswith('fe80'):
92
 
                    cidr = netaddr.IPNetwork("%s/%s" % (addr['addr'],
93
 
                                                        addr['netmask']))
94
 
                    if cidr in network:
95
 
                        return str(cidr.ip)
 
91
            if network.version == 6 and netifaces.AF_INET6 in addresses:
 
92
                for addr in addresses[netifaces.AF_INET6]:
 
93
                    if not addr['addr'].startswith('fe80'):
 
94
                        cidr = netaddr.IPNetwork("%s/%s" % (addr['addr'],
 
95
                                                            addr['netmask']))
 
96
                        if cidr in network:
 
97
                            return str(cidr.ip)
96
98
 
97
99
    if fallback is not None:
98
100
        return fallback