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/>.
17
18
from charmhelpers.core.hookenv import (
22
network_get_primary_address,
22
24
from charmhelpers.contrib.network.ip import (
23
25
get_address_in_network,
24
26
is_address_in_network,
28
31
from charmhelpers.contrib.hahelpers.cluster import is_clustered
36
40
'config': 'os-public-network',
37
41
'fallback': 'public-address',
38
42
'override': 'os-public-hostname',
45
'binding': 'internal',
41
46
'config': 'os-internal-network',
42
47
'fallback': 'private-address',
43
48
'override': 'os-internal-hostname',
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.
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.
115
121
:param endpoint_type: Network endpoing type
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()
131
# If no net-splits defined, we expect a single vip
132
resolved_address = vips[0]
137
if clustered and vips:
135
140
if is_address_in_network(net_addr, vip):
136
141
resolved_address = vip
144
# NOTE: endeavour to check vips against network space
147
bound_cidr = resolve_network_cidr(
148
network_get_primary_address(binding)
151
if is_address_in_network(bound_cidr, vip):
152
resolved_address = vip
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]
139
159
if config('prefer-ipv6'):
140
160
fallback_addr = get_ipv6_addr(exc_list=vips)[0]
142
162
fallback_addr = unit_get(net_fallback)
144
resolved_address = get_address_in_network(net_addr, fallback_addr)
165
resolved_address = get_address_in_network(net_addr, fallback_addr)
167
# NOTE: only try to use extra bindings if legacy network
168
# configuration is not in use
170
resolved_address = network_get_primary_address(binding)
171
except NotImplementedError:
172
resolved_address = fallback_addr
146
174
if resolved_address is None:
147
175
raise ValueError("Unable to resolve a suitable IP address based on "