more
This commit is contained in:
parent
5772463800
commit
6d6cabc0b1
|
@ -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)
|
||||
|
|
|
@ -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',
|
||||
|
|
Loading…
Reference in New Issue