This commit is contained in:
Edward Hope-Morley 2014-12-18 11:58:28 +00:00
parent 5772463800
commit 6d6cabc0b1
2 changed files with 27 additions and 20 deletions

View File

@ -175,6 +175,7 @@ class SwiftProxyClusterRPC(object):
# Everything must be None by default so it gets dropped from the
# relation unless we want it to be set.
templates = {1: {'trigger': None,
'broker-token': None,
'builder-broker': None,
self.KEY_STOP_PROXY_SVC: None,
self.KEY_STOP_PROXY_SVC_ACK: None,
@ -215,11 +216,12 @@ class SwiftProxyClusterRPC(object):
NOTE: leader action
"""
rq = self.template()
rq['trigger'] = broker_token
rq['trigger'] = str(uuid.uuid4())
if builders_only:
rq['sync-only-builders'] = 1
rq['broker-token'] = broker_token
rq['builder-broker'] = broker_host
return rq
@ -713,6 +715,10 @@ def get_broker_token():
responses.append(relation_get(attribute=ack_key, rid=rid,
unit=unit))
# If no acks exist we have probably never done a sync so make up a token
if len(responses) == 0:
return str(uuid.uuid4())
if not all(responses) or len(set(responses)) != 1:
log("Not all ack tokens equal - %s" % (responses), level=DEBUG)
return None
@ -741,24 +747,17 @@ def sync_builders_and_rings_if_changed(f):
rings_ready = len(glob.glob(rings_path)) == len(SWIFT_RINGS)
rings_changed = rings_after != rings_before
builders_changed = builders_after != builders_before
broker_token = get_broker_token()
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)
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(peers_only=not rings_changed)
else:
log("Rings/builders unchanged so skipping sync", level=DEBUG)
cluster_sync_rings(builders_only=True)
log("Rings not ready for sync - skipping", level=DEBUG)
else:
log("Failed to get broker token so cannot do cluster sync",
level=WARNING)
log("Rings/builders unchanged so skipping sync", level=DEBUG)
return ret
@ -893,7 +892,7 @@ def broadcast_rings_available(broker_token, peers=True, storage=True,
log("Skipping notify peer relations", level=DEBUG)
def cluster_sync_rings(broker_token, peers_only=False, builders_only=False):
def cluster_sync_rings(peers_only=False, builders_only=False):
"""Notify peer relations that they should stop their proxy services.
Peer units will then be expected to do a relation_set with
@ -914,6 +913,7 @@ def cluster_sync_rings(broker_token, peers_only=False, builders_only=False):
# relations. If we have been instructed to only broadcast to peers, do
# nothing.
if not peer_units():
broker_token = get_broker_token()
broadcast_rings_available(broker_token, peers=False,
storage=not peers_only,
builders_only=builders_only)

View File

@ -129,6 +129,7 @@ class SwiftUtilsTestCase(unittest.TestCase):
rpc = swift_utils.SwiftProxyClusterRPC()
rq = rpc.stop_proxy_request(peers_only=True)
self.assertEqual({'trigger': 'test-uuid',
'broker-token': None,
'builder-broker': None,
'peers-only': True,
'leader-changed-notification': None,
@ -138,6 +139,7 @@ class SwiftUtilsTestCase(unittest.TestCase):
rq = rpc.stop_proxy_request()
self.assertEqual({'trigger': 'test-uuid',
'broker-token': None,
'builder-broker': None,
'peers-only': None,
'leader-changed-notification': None,
@ -151,6 +153,7 @@ class SwiftUtilsTestCase(unittest.TestCase):
rpc = swift_utils.SwiftProxyClusterRPC()
rq = rpc.stop_proxy_ack(echo_token='token1', echo_peers_only='1')
self.assertEqual({'trigger': 'token2',
'broker-token': None,
'builder-broker': None,
'peers-only': '1',
'leader-changed-notification': None,
@ -158,10 +161,13 @@ class SwiftUtilsTestCase(unittest.TestCase):
'stop-proxy-service-ack': 'token1',
'sync-only-builders': None}, rq)
def test_cluster_rpc_sync_request(self):
@mock.patch('swift_utils.uuid')
def test_cluster_rpc_sync_request(self, mock_uuid):
mock_uuid.uuid4.return_value = 'token2'
rpc = swift_utils.SwiftProxyClusterRPC()
rq = rpc.sync_rings_request('HostA', 'token1')
self.assertEqual({'trigger': 'token1',
self.assertEqual({'trigger': 'token2',
'broker-token': 'token1',
'builder-broker': 'HostA',
'peers-only': None,
'leader-changed-notification': None,
@ -175,6 +181,7 @@ class SwiftUtilsTestCase(unittest.TestCase):
rpc = swift_utils.SwiftProxyClusterRPC()
rq = rpc.notify_leader_changed()
self.assertEqual({'trigger': 'token1',
'broker-token': None,
'builder-broker': None,
'peers-only': None,
'leader-changed-notification': 'token1',