Sync charm-helpers, support haproxy for IPv6.
This commit is contained in:
@@ -9,3 +9,4 @@ include:
|
||||
- apache
|
||||
- payload.execd
|
||||
- contrib.network.ip
|
||||
- contrib.peerstorage
|
||||
|
||||
83
hooks/charmhelpers/contrib/peerstorage/__init__.py
Normal file
83
hooks/charmhelpers/contrib/peerstorage/__init__.py
Normal file
@@ -0,0 +1,83 @@
|
||||
from charmhelpers.core.hookenv import (
|
||||
relation_ids,
|
||||
relation_get,
|
||||
local_unit,
|
||||
relation_set,
|
||||
)
|
||||
|
||||
"""
|
||||
This helper provides functions to support use of a peer relation
|
||||
for basic key/value storage, with the added benefit that all storage
|
||||
can be replicated across peer units, so this is really useful for
|
||||
services that issue usernames/passwords to remote services.
|
||||
|
||||
def shared_db_changed()
|
||||
# Only the lead unit should create passwords
|
||||
if not is_leader():
|
||||
return
|
||||
username = relation_get('username')
|
||||
key = '{}.password'.format(username)
|
||||
# Attempt to retrieve any existing password for this user
|
||||
password = peer_retrieve(key)
|
||||
if password is None:
|
||||
# New user, create password and store
|
||||
password = pwgen(length=64)
|
||||
peer_store(key, password)
|
||||
create_access(username, password)
|
||||
relation_set(password=password)
|
||||
|
||||
|
||||
def cluster_changed()
|
||||
# Echo any relation data other that *-address
|
||||
# back onto the peer relation so all units have
|
||||
# all *.password keys stored on their local relation
|
||||
# for later retrieval.
|
||||
peer_echo()
|
||||
|
||||
"""
|
||||
|
||||
|
||||
def peer_retrieve(key, relation_name='cluster'):
|
||||
""" Retrieve a named key from peer relation relation_name """
|
||||
cluster_rels = relation_ids(relation_name)
|
||||
if len(cluster_rels) > 0:
|
||||
cluster_rid = cluster_rels[0]
|
||||
return relation_get(attribute=key, rid=cluster_rid,
|
||||
unit=local_unit())
|
||||
else:
|
||||
raise ValueError('Unable to detect'
|
||||
'peer relation {}'.format(relation_name))
|
||||
|
||||
|
||||
def peer_store(key, value, relation_name='cluster'):
|
||||
""" Store the key/value pair on the named peer relation relation_name """
|
||||
cluster_rels = relation_ids(relation_name)
|
||||
if len(cluster_rels) > 0:
|
||||
cluster_rid = cluster_rels[0]
|
||||
relation_set(relation_id=cluster_rid,
|
||||
relation_settings={key: value})
|
||||
else:
|
||||
raise ValueError('Unable to detect '
|
||||
'peer relation {}'.format(relation_name))
|
||||
|
||||
|
||||
def peer_echo(includes=None):
|
||||
"""Echo filtered attributes back onto the same relation for storage
|
||||
|
||||
Note that this helper must only be called within a peer relation
|
||||
changed hook
|
||||
"""
|
||||
rdata = relation_get()
|
||||
echo_data = {}
|
||||
if includes is None:
|
||||
echo_data = rdata.copy()
|
||||
for ex in ['private-address', 'public-address']:
|
||||
if ex in echo_data:
|
||||
echo_data.pop(ex)
|
||||
else:
|
||||
for attribute, value in rdata.iteritems():
|
||||
for include in includes:
|
||||
if include in attribute:
|
||||
echo_data[attribute] = value
|
||||
if len(echo_data) > 0:
|
||||
relation_set(relation_settings=echo_data)
|
||||
@@ -122,6 +122,7 @@ def filter_installed_packages(packages):
|
||||
# Tell apt to build an in-memory cache to prevent race conditions (if
|
||||
# another process is already building the cache).
|
||||
apt_pkg.config.set("Dir::Cache::pkgcache", "")
|
||||
apt_pkg.config.set("Dir::Cache::srcpkgcache", "")
|
||||
|
||||
cache = apt_pkg.Cache()
|
||||
_pkgs = []
|
||||
|
||||
@@ -163,6 +163,12 @@ def canonical_url(vip_setting='vip'):
|
||||
scheme = 'http'
|
||||
if https():
|
||||
scheme = 'https'
|
||||
if config('prefer-ipv6'):
|
||||
if is_clustered():
|
||||
addr = '[%s]' % config(vip_setting)
|
||||
else:
|
||||
addr = '[%s]' % get_ipv6_addr()
|
||||
else:
|
||||
if is_clustered():
|
||||
addr = config(vip_setting)
|
||||
else:
|
||||
@@ -208,7 +214,8 @@ class NeutronCCContext(context.NeutronContext):
|
||||
_config['nvp-controllers'].split()
|
||||
ctxt['nova_url'] = "{}:8774/v2".format(canonical_url())
|
||||
if config('prefer-ipv6'):
|
||||
ctxt['bind_host'] = '%s' % get_ipv6_addr()
|
||||
ctxt['bind_host'] = '::'
|
||||
ctxt['neutron_url'] = "{}:9696".format(canonical_url())
|
||||
return ctxt
|
||||
|
||||
|
||||
@@ -248,8 +255,9 @@ class NovaIPv6Context(context.OSContextGenerator):
|
||||
ctxt = {}
|
||||
if config('prefer-ipv6'):
|
||||
ctxt['use_ipv6'] = True
|
||||
ctxt['host_ip'] = '%s' % get_ipv6_addr()
|
||||
ctxt['host_ip'] = '::'
|
||||
ctxt['neutron_url'] = "{}:9696".format(canonical_url())
|
||||
else:
|
||||
ctxt['use_ipv6'] = False
|
||||
ctxt['host_ip'] = '%s' % unit_get('private-address')
|
||||
ctxt['host_ip'] = ctxt['neutron_url'] = unit_get('private-address')
|
||||
return ctxt
|
||||
|
||||
@@ -28,10 +28,13 @@ from charmhelpers.core.host import (
|
||||
restart_on_change,
|
||||
service_running,
|
||||
service_stop,
|
||||
lsb_release,
|
||||
)
|
||||
|
||||
from charmhelpers.fetch import (
|
||||
apt_install, apt_update
|
||||
apt_install,
|
||||
apt_update,
|
||||
add_source
|
||||
)
|
||||
|
||||
from charmhelpers.contrib.openstack.utils import (
|
||||
@@ -95,6 +98,8 @@ from charmhelpers.contrib.network.ip import (
|
||||
get_ipv6_addr,
|
||||
)
|
||||
|
||||
from charmhelpers.contrib.peerstorage import peer_store
|
||||
|
||||
hooks = Hooks()
|
||||
CONFIGS = register_configs()
|
||||
|
||||
@@ -103,8 +108,18 @@ CONFIGS = register_configs()
|
||||
def install():
|
||||
execd_preinstall()
|
||||
configure_installation_source(config('openstack-origin'))
|
||||
|
||||
trusty = lsb_release()['DISTRIB_CODENAME'] == 'trusty'
|
||||
if config('prefer-ipv6') and trusty:
|
||||
add_source('deb http://archive.ubuntu.com/ubuntu trusty-backports'
|
||||
' main')
|
||||
add_source('deb-src http://archive.ubuntu.com/ubuntu trusty-backports'
|
||||
' main')
|
||||
|
||||
apt_update()
|
||||
apt_install(determine_packages(), fatal=True)
|
||||
if config('prefer-ipv6') and trusty:
|
||||
apt_install('haproxy/trusty-backports', fatal=True)
|
||||
|
||||
_files = os.path.join(charm_dir(), 'files')
|
||||
if os.path.isdir(_files):
|
||||
@@ -524,11 +539,14 @@ def quantum_joined(rid=None):
|
||||
|
||||
|
||||
@hooks.hook('cluster-relation-changed',
|
||||
'cluster-relation-departed')
|
||||
'cluster-relation-departed',
|
||||
'cluster-relation-joined')
|
||||
@service_guard(guard_map(), CONFIGS,
|
||||
active=config('service-guard'))
|
||||
@restart_on_change(restart_map(), stopstart=True)
|
||||
def cluster_changed():
|
||||
if config('prefer-ipv6'):
|
||||
peer_store('private-address', get_ipv6_addr())
|
||||
CONFIGS.write_all()
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user