~openstack-charmers-next/charms/precise/ceilometer-agent/trunk

« back to all changes in this revision

Viewing changes to hooks/charmhelpers/contrib/openstack/ip.py

  • Committer: Liam Young
  • Date: 2016-04-12 14:00:39 UTC
  • Revision ID: liam.young@canonical.com-20160412140039-t3ivdl1iue30ys14
Charmhelper sync before 1604 testing

Change-Id: Ia92f2386ca3a14865c53d7f8f53e51acc2ad7386

Show diffs side-by-side

added added

removed removed

Lines of Context:
14
14
# You should have received a copy of the GNU Lesser General Public License
15
15
# along with charm-helpers.  If not, see <http://www.gnu.org/licenses/>.
16
16
 
 
17
 
17
18
from charmhelpers.core.hookenv import (
18
19
    config,
19
20
    unit_get,
20
21
    service_name,
 
22
    network_get_primary_address,
21
23
)
22
24
from charmhelpers.contrib.network.ip import (
23
25
    get_address_in_network,
24
26
    is_address_in_network,
25
27
    is_ipv6,
26
28
    get_ipv6_addr,
 
29
    resolve_network_cidr,
27
30
)
28
31
from charmhelpers.contrib.hahelpers.cluster import is_clustered
29
32
 
33
36
 
34
37
ADDRESS_MAP = {
35
38
    PUBLIC: {
 
39
        'binding': 'public',
36
40
        'config': 'os-public-network',
37
41
        'fallback': 'public-address',
38
42
        'override': 'os-public-hostname',
39
43
    },
40
44
    INTERNAL: {
 
45
        'binding': 'internal',
41
46
        'config': 'os-internal-network',
42
47
        'fallback': 'private-address',
43
48
        'override': 'os-internal-hostname',
44
49
    },
45
50
    ADMIN: {
 
51
        'binding': 'admin',
46
52
        'config': 'os-admin-network',
47
53
        'fallback': 'private-address',
48
54
        'override': 'os-admin-hostname',
110
116
    correct network. If clustered with no nets defined, return primary vip.
111
117
 
112
118
    If not clustered, return unit address ensuring address is on configured net
113
 
    split if one is configured.
 
119
    split if one is configured, or a Juju 2.0 extra-binding has been used.
114
120
 
115
121
    :param endpoint_type: Network endpoing type
116
122
    """
125
131
    net_type = ADDRESS_MAP[endpoint_type]['config']
126
132
    net_addr = config(net_type)
127
133
    net_fallback = ADDRESS_MAP[endpoint_type]['fallback']
 
134
    binding = ADDRESS_MAP[endpoint_type]['binding']
128
135
    clustered = is_clustered()
129
 
    if clustered:
130
 
        if not net_addr:
131
 
            # If no net-splits defined, we expect a single vip
132
 
            resolved_address = vips[0]
133
 
        else:
 
136
 
 
137
    if clustered and vips:
 
138
        if net_addr:
134
139
            for vip in vips:
135
140
                if is_address_in_network(net_addr, vip):
136
141
                    resolved_address = vip
137
142
                    break
 
143
        else:
 
144
            # NOTE: endeavour to check vips against network space
 
145
            #       bindings
 
146
            try:
 
147
                bound_cidr = resolve_network_cidr(
 
148
                    network_get_primary_address(binding)
 
149
                )
 
150
                for vip in vips:
 
151
                    if is_address_in_network(bound_cidr, vip):
 
152
                        resolved_address = vip
 
153
                        break
 
154
            except NotImplementedError:
 
155
                # If no net-splits configured and no support for extra
 
156
                # bindings/network spaces so we expect a single vip
 
157
                resolved_address = vips[0]
138
158
    else:
139
159
        if config('prefer-ipv6'):
140
160
            fallback_addr = get_ipv6_addr(exc_list=vips)[0]
141
161
        else:
142
162
            fallback_addr = unit_get(net_fallback)
143
163
 
144
 
        resolved_address = get_address_in_network(net_addr, fallback_addr)
 
164
        if net_addr:
 
165
            resolved_address = get_address_in_network(net_addr, fallback_addr)
 
166
        else:
 
167
            # NOTE: only try to use extra bindings if legacy network
 
168
            #       configuration is not in use
 
169
            try:
 
170
                resolved_address = network_get_primary_address(binding)
 
171
            except NotImplementedError:
 
172
                resolved_address = fallback_addr
145
173
 
146
174
    if resolved_address is None:
147
175
        raise ValueError("Unable to resolve a suitable IP address based on "