1
from charmhelpers.core.hookenv import (
6
from charmhelpers.contrib.network.ip import (
7
get_address_in_network,
13
from charmhelpers.contrib.hahelpers.cluster import is_clustered
21
'config': 'os-public-network',
22
'fallback': 'public-address'
25
'config': 'os-internal-network',
26
'fallback': 'private-address'
29
'config': 'os-admin-network',
30
'fallback': 'private-address'
35
def canonical_url(configs, endpoint_type=PUBLIC):
37
Returns the correct HTTP URL to this host given the state of HTTPS
38
configuration, hacluster and charm configuration.
40
:configs OSTemplateRenderer: A config tempating object to inspect for
41
a complete https context.
42
:endpoint_type str: The endpoint type to resolve.
44
:returns str: Base URL for services on the current service unit.
47
if 'https' in configs.complete_contexts():
49
address = resolve_address(endpoint_type)
51
address = "[{}]".format(address)
52
return '%s://%s' % (scheme, address)
55
def resolve_address(endpoint_type=PUBLIC):
56
resolved_address = None
58
if config(_address_map[endpoint_type]['config']) is None:
59
# Assume vip is simple and pass back directly
60
resolved_address = config('vip')
62
for vip in config('vip').split():
63
if is_address_in_network(
64
config(_address_map[endpoint_type]['config']),
66
resolved_address = vip
68
if config('prefer-ipv6'):
69
fallback_addr = get_ipv6_addr()
71
fallback_addr = unit_get(_address_map[endpoint_type]['fallback'])
72
resolved_address = get_address_in_network(
73
config(_address_map[endpoint_type]['config']), fallback_addr)
75
if resolved_address is None:
76
raise ValueError('Unable to resolve a suitable IP address'
77
' based on charm state and configuration')
79
return resolved_address