Store identity-service information in the peer relation for clustered deploys and echo back to client service for each unit
This commit is contained in:
@@ -1,4 +1,6 @@
|
|||||||
|
from charmhelpers.core.hookenv import relation_id as current_relation_id
|
||||||
from charmhelpers.core.hookenv import (
|
from charmhelpers.core.hookenv import (
|
||||||
|
is_relation_made,
|
||||||
relation_ids,
|
relation_ids,
|
||||||
relation_get,
|
relation_get,
|
||||||
local_unit,
|
local_unit,
|
||||||
@@ -49,6 +51,22 @@ def peer_retrieve(key, relation_name='cluster'):
|
|||||||
'peer relation {}'.format(relation_name))
|
'peer relation {}'.format(relation_name))
|
||||||
|
|
||||||
|
|
||||||
|
def peer_retrieve_by_prefix(prefix, relation_name='cluster', delimiter='_',
|
||||||
|
inc_list=[], exc_list=[]):
|
||||||
|
""" Retrieve k/v pairs given a prefix and filter using {inc,exc}_list """
|
||||||
|
peerdb_settings = peer_retrieve('-', relation_name=relation_name)
|
||||||
|
matched = {}
|
||||||
|
for k, v in peerdb_settings.items():
|
||||||
|
full_prefix = prefix + delimiter
|
||||||
|
if k.startswith(full_prefix):
|
||||||
|
new_key = k.replace(full_prefix, '')
|
||||||
|
if new_key in exc_list:
|
||||||
|
continue
|
||||||
|
if new_key in inc_list or len(inc_list) == 0:
|
||||||
|
matched[new_key] = v
|
||||||
|
return matched
|
||||||
|
|
||||||
|
|
||||||
def peer_store(key, value, relation_name='cluster'):
|
def peer_store(key, value, relation_name='cluster'):
|
||||||
""" Store the key/value pair on the named peer relation relation_name """
|
""" Store the key/value pair on the named peer relation relation_name """
|
||||||
cluster_rels = relation_ids(relation_name)
|
cluster_rels = relation_ids(relation_name)
|
||||||
@@ -81,3 +99,26 @@ def peer_echo(includes=None):
|
|||||||
echo_data[attribute] = value
|
echo_data[attribute] = value
|
||||||
if len(echo_data) > 0:
|
if len(echo_data) > 0:
|
||||||
relation_set(relation_settings=echo_data)
|
relation_set(relation_settings=echo_data)
|
||||||
|
|
||||||
|
|
||||||
|
def peer_store_and_set(relation_id=None, peer_relation_name='cluster',
|
||||||
|
peer_store_fatal=False, relation_settings={},
|
||||||
|
delimiter='_', **kwargs):
|
||||||
|
""" For each pair set them in the relation and store in peer db
|
||||||
|
|
||||||
|
Note that the relation set is done within the provided relation_id and
|
||||||
|
if none is provided defaults to the current relation"""
|
||||||
|
relation_set(relation_id=relation_id,
|
||||||
|
relation_settings=relation_settings,
|
||||||
|
**kwargs)
|
||||||
|
if is_relation_made(peer_relation_name):
|
||||||
|
for key, value in dict(kwargs.items() +
|
||||||
|
relation_settings.items()).iteritems():
|
||||||
|
key_prefix = relation_id or current_relation_id()
|
||||||
|
peer_store(key_prefix + delimiter + key,
|
||||||
|
value,
|
||||||
|
relation_name=peer_relation_name)
|
||||||
|
else:
|
||||||
|
if peer_store_fatal:
|
||||||
|
raise ValueError('Unable to detect '
|
||||||
|
'peer relation {}'.format(peer_relation_name))
|
||||||
|
|||||||
@@ -61,7 +61,10 @@ from charmhelpers.contrib.hahelpers.cluster import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
from charmhelpers.payload.execd import execd_preinstall
|
from charmhelpers.payload.execd import execd_preinstall
|
||||||
from charmhelpers.contrib.peerstorage import peer_echo
|
from charmhelpers.contrib.peerstorage import (
|
||||||
|
peer_retrieve_by_prefix,
|
||||||
|
peer_echo,
|
||||||
|
)
|
||||||
from charmhelpers.contrib.network.ip import (
|
from charmhelpers.contrib.network.ip import (
|
||||||
get_iface_for_address,
|
get_iface_for_address,
|
||||||
get_netmask_for_address
|
get_netmask_for_address
|
||||||
@@ -173,6 +176,12 @@ def identity_changed(relation_id=None, remote_unit=None):
|
|||||||
add_service_to_keystone(relation_id, remote_unit)
|
add_service_to_keystone(relation_id, remote_unit)
|
||||||
synchronize_ca()
|
synchronize_ca()
|
||||||
else:
|
else:
|
||||||
|
# Each unit needs to set the db information otherwise if the unit
|
||||||
|
# with the info dies the settings die with it Bug# 1355848
|
||||||
|
for rel_id in relation_ids('identity-service'):
|
||||||
|
peerdb_settings = peer_retrieve_by_prefix(rel_id)
|
||||||
|
if 'service_password' in peerdb_settings:
|
||||||
|
relation_set(relation_id=rel_id, **peerdb_settings)
|
||||||
log('Deferring identity_changed() to service leader.')
|
log('Deferring identity_changed() to service leader.')
|
||||||
|
|
||||||
|
|
||||||
@@ -189,13 +198,17 @@ def cluster_joined():
|
|||||||
@restart_on_change(restart_map(), stopstart=True)
|
@restart_on_change(restart_map(), stopstart=True)
|
||||||
def cluster_changed():
|
def cluster_changed():
|
||||||
# NOTE(jamespage) re-echo passwords for peer storage
|
# NOTE(jamespage) re-echo passwords for peer storage
|
||||||
peer_echo(includes=['_passwd'])
|
peer_echo(includes=['_passwd', 'identity-service:'])
|
||||||
unison.ssh_authorized_peers(user=SSH_USER,
|
unison.ssh_authorized_peers(user=SSH_USER,
|
||||||
group='keystone',
|
group='keystone',
|
||||||
peer_interface='cluster',
|
peer_interface='cluster',
|
||||||
ensure_local_user=True)
|
ensure_local_user=True)
|
||||||
synchronize_ca()
|
synchronize_ca()
|
||||||
CONFIGS.write_all()
|
CONFIGS.write_all()
|
||||||
|
for r_id in relation_ids('identity-service'):
|
||||||
|
for unit in relation_list(r_id):
|
||||||
|
identity_changed(relation_id=r_id,
|
||||||
|
remote_unit=unit)
|
||||||
|
|
||||||
|
|
||||||
@hooks.hook('ha-relation-joined')
|
@hooks.hook('ha-relation-joined')
|
||||||
|
|||||||
@@ -57,6 +57,7 @@ from charmhelpers.core.host import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
from charmhelpers.contrib.peerstorage import (
|
from charmhelpers.contrib.peerstorage import (
|
||||||
|
peer_store_and_set,
|
||||||
peer_store,
|
peer_store,
|
||||||
peer_retrieve,
|
peer_retrieve,
|
||||||
)
|
)
|
||||||
@@ -655,7 +656,7 @@ def add_service_to_keystone(relation_id=None, remote_unit=None):
|
|||||||
for role in get_requested_roles(settings):
|
for role in get_requested_roles(settings):
|
||||||
log("Creating requested role: %s" % role)
|
log("Creating requested role: %s" % role)
|
||||||
create_role(role)
|
create_role(role)
|
||||||
relation_set(relation_id=relation_id,
|
peer_store_and_set(relation_id=relation_id,
|
||||||
**relation_data)
|
**relation_data)
|
||||||
return
|
return
|
||||||
else:
|
else:
|
||||||
@@ -771,7 +772,7 @@ def add_service_to_keystone(relation_id=None, remote_unit=None):
|
|||||||
relation_data['ssl_key'] = b64encode(key)
|
relation_data['ssl_key'] = b64encode(key)
|
||||||
relation_data['ca_cert'] = b64encode(ca_bundle)
|
relation_data['ca_cert'] = b64encode(ca_bundle)
|
||||||
relation_data['https_keystone'] = 'True'
|
relation_data['https_keystone'] = 'True'
|
||||||
relation_set(relation_id=relation_id,
|
peer_store_and_set(relation_id=relation_id,
|
||||||
**relation_data)
|
**relation_data)
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user