more
This commit is contained in:
parent
7ab3e53520
commit
5772463800
@ -41,8 +41,6 @@ from charmhelpers.core.hookenv import (
|
||||
unit_get,
|
||||
relation_set,
|
||||
relation_ids,
|
||||
remote_unit,
|
||||
local_unit,
|
||||
related_units,
|
||||
)
|
||||
from charmhelpers.fetch import (
|
||||
@ -701,55 +699,16 @@ def cluster_units():
|
||||
return units
|
||||
|
||||
|
||||
def rings_synced():
|
||||
"""
|
||||
"""
|
||||
try:
|
||||
r_unit = remote_unit()
|
||||
except KeyError:
|
||||
r_unit = None
|
||||
|
||||
if not r_unit:
|
||||
log("No remote unit available", level=DEBUG)
|
||||
return None
|
||||
|
||||
if r_unit not in cluster_units():
|
||||
log("Remote unit '%s' not a cluster peer" % (r_unit), level=DEBUG)
|
||||
return False
|
||||
|
||||
token_rid = None
|
||||
token = None
|
||||
ack_token = None
|
||||
for rid in relation_ids('cluster'):
|
||||
broker = relation_get(attribute='builder-broker', rid=rid,
|
||||
unit=r_unit)
|
||||
if broker:
|
||||
token_rid = rid
|
||||
token = relation_get(attribute='token', rid=rid, unit=r_unit)
|
||||
else:
|
||||
token = None
|
||||
|
||||
if token:
|
||||
key = SwiftProxyClusterRPC.KEY_STOP_PROXY_SVC_ACK
|
||||
ack_token = relation_get(attribute=key, rid=token_rid,
|
||||
unit=local_unit())
|
||||
return token == ack_token
|
||||
else:
|
||||
return False
|
||||
|
||||
|
||||
def get_broker_token():
|
||||
"""
|
||||
"""Get ack token from peers to be used as broker token.
|
||||
|
||||
Must be equal across all peers.
|
||||
|
||||
Returns token or None if not found.
|
||||
"""
|
||||
responses = []
|
||||
broker_tokens = []
|
||||
ack_key = SwiftProxyClusterRPC.KEY_STOP_PROXY_SVC_ACK
|
||||
broker_key = 'builder-broker'
|
||||
for rid in relation_ids('cluster'):
|
||||
s = relation_get(rid=rid, unit=local_unit())
|
||||
if s.get(broker_key, None):
|
||||
broker_tokens.append(s['token'])
|
||||
|
||||
for unit in related_units(rid):
|
||||
responses.append(relation_get(attribute=ack_key, rid=rid,
|
||||
unit=unit))
|
||||
@ -758,11 +717,6 @@ def get_broker_token():
|
||||
log("Not all ack tokens equal - %s" % (responses), level=DEBUG)
|
||||
return None
|
||||
|
||||
if len(broker_tokens) > 0:
|
||||
if not all(broker_tokens) or len(set(broker_tokens)) != 1:
|
||||
log("Not all builder tokens equal - %s" % (broker_tokens), level=DEBUG)
|
||||
return None
|
||||
|
||||
return responses[0]
|
||||
|
||||
|
||||
@ -788,22 +742,23 @@ def sync_builders_and_rings_if_changed(f):
|
||||
rings_changed = rings_after != rings_before
|
||||
builders_changed = builders_after != builders_before
|
||||
broker_token = get_broker_token()
|
||||
if broker_token and (rings_changed or builders_changed):
|
||||
# Copy builders and rings (if available) to the server dir.
|
||||
update_www_rings(rings=rings_ready)
|
||||
if rings_ready:
|
||||
# Trigger sync
|
||||
cluster_sync_rings(broker_token, peers_only=not rings_changed)
|
||||
else:
|
||||
cluster_sync_rings(broker_token, peers_only=True,
|
||||
builders_only=True)
|
||||
log("Rings not ready for sync - skipping", level=DEBUG)
|
||||
else:
|
||||
log("Rings/builders unchanged so skipping sync", level=DEBUG)
|
||||
if rings_synced():
|
||||
# Note that we may be a recently-elected leader so we need to
|
||||
# ensure rings are available.
|
||||
if broker_token:
|
||||
if rings_changed or builders_changed:
|
||||
# Copy builders and rings (if available) to the server dir.
|
||||
update_www_rings(rings=rings_ready)
|
||||
if rings_ready:
|
||||
# Trigger sync
|
||||
cluster_sync_rings(broker_token,
|
||||
peers_only=not rings_changed)
|
||||
else:
|
||||
cluster_sync_rings(broker_token, peers_only=True,
|
||||
builders_only=True)
|
||||
log("Rings not ready for sync - skipping", level=DEBUG)
|
||||
else:
|
||||
log("Rings/builders unchanged so skipping sync", level=DEBUG)
|
||||
else:
|
||||
log("Failed to get broker token so cannot do cluster sync",
|
||||
level=WARNING)
|
||||
|
||||
return ret
|
||||
|
||||
|
@ -21,7 +21,6 @@ def init_ring_paths(tmpdir):
|
||||
|
||||
class SwiftUtilsTestCase(unittest.TestCase):
|
||||
|
||||
@mock.patch('swift_utils.rings_synced')
|
||||
@mock.patch('swift_utils.get_broker_token')
|
||||
@mock.patch('swift_utils.update_www_rings')
|
||||
@mock.patch('swift_utils.get_builders_checksum')
|
||||
@ -38,9 +37,8 @@ class SwiftUtilsTestCase(unittest.TestCase):
|
||||
mock_log, mock_balance_rings,
|
||||
mock_get_rings_checksum,
|
||||
mock_get_builders_checksum, mock_update_www_rings,
|
||||
mock_get_broker_token, mock_rings_synced):
|
||||
mock_get_broker_token):
|
||||
mock_get_broker_token.return_value = "token1"
|
||||
mock_rings_synced.return_value = True
|
||||
|
||||
# Make sure same is returned for both so that we don't try to sync
|
||||
mock_get_rings_checksum.return_value = None
|
||||
|
Loading…
Reference in New Issue
Block a user