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
|
# Everything must be None by default so it gets dropped from the
|
||||||
# relation unless we want it to be set.
|
# relation unless we want it to be set.
|
||||||
templates = {1: {'trigger': None,
|
templates = {1: {'trigger': None,
|
||||||
|
'broker-token': None,
|
||||||
'builder-broker': None,
|
'builder-broker': None,
|
||||||
self.KEY_STOP_PROXY_SVC: None,
|
self.KEY_STOP_PROXY_SVC: None,
|
||||||
self.KEY_STOP_PROXY_SVC_ACK: None,
|
self.KEY_STOP_PROXY_SVC_ACK: None,
|
||||||
@ -215,11 +216,12 @@ class SwiftProxyClusterRPC(object):
|
|||||||
NOTE: leader action
|
NOTE: leader action
|
||||||
"""
|
"""
|
||||||
rq = self.template()
|
rq = self.template()
|
||||||
rq['trigger'] = broker_token
|
rq['trigger'] = str(uuid.uuid4())
|
||||||
|
|
||||||
if builders_only:
|
if builders_only:
|
||||||
rq['sync-only-builders'] = 1
|
rq['sync-only-builders'] = 1
|
||||||
|
|
||||||
|
rq['broker-token'] = broker_token
|
||||||
rq['builder-broker'] = broker_host
|
rq['builder-broker'] = broker_host
|
||||||
return rq
|
return rq
|
||||||
|
|
||||||
@ -713,6 +715,10 @@ def get_broker_token():
|
|||||||
responses.append(relation_get(attribute=ack_key, rid=rid,
|
responses.append(relation_get(attribute=ack_key, rid=rid,
|
||||||
unit=unit))
|
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:
|
if not all(responses) or len(set(responses)) != 1:
|
||||||
log("Not all ack tokens equal - %s" % (responses), level=DEBUG)
|
log("Not all ack tokens equal - %s" % (responses), level=DEBUG)
|
||||||
return None
|
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_ready = len(glob.glob(rings_path)) == len(SWIFT_RINGS)
|
||||||
rings_changed = rings_after != rings_before
|
rings_changed = rings_after != rings_before
|
||||||
builders_changed = builders_after != builders_before
|
builders_changed = builders_after != builders_before
|
||||||
broker_token = get_broker_token()
|
if rings_changed or builders_changed:
|
||||||
if broker_token:
|
# Copy builders and rings (if available) to the server dir.
|
||||||
if rings_changed or builders_changed:
|
update_www_rings(rings=rings_ready)
|
||||||
# Copy builders and rings (if available) to the server dir.
|
if rings_ready:
|
||||||
update_www_rings(rings=rings_ready)
|
# Trigger sync
|
||||||
if rings_ready:
|
cluster_sync_rings(peers_only=not rings_changed)
|
||||||
# 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:
|
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:
|
else:
|
||||||
log("Failed to get broker token so cannot do cluster sync",
|
log("Rings/builders unchanged so skipping sync", level=DEBUG)
|
||||||
level=WARNING)
|
|
||||||
|
|
||||||
return ret
|
return ret
|
||||||
|
|
||||||
@ -893,7 +892,7 @@ def broadcast_rings_available(broker_token, peers=True, storage=True,
|
|||||||
log("Skipping notify peer relations", level=DEBUG)
|
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.
|
"""Notify peer relations that they should stop their proxy services.
|
||||||
|
|
||||||
Peer units will then be expected to do a relation_set with
|
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
|
# relations. If we have been instructed to only broadcast to peers, do
|
||||||
# nothing.
|
# nothing.
|
||||||
if not peer_units():
|
if not peer_units():
|
||||||
|
broker_token = get_broker_token()
|
||||||
broadcast_rings_available(broker_token, peers=False,
|
broadcast_rings_available(broker_token, peers=False,
|
||||||
storage=not peers_only,
|
storage=not peers_only,
|
||||||
builders_only=builders_only)
|
builders_only=builders_only)
|
||||||
|
@ -129,6 +129,7 @@ class SwiftUtilsTestCase(unittest.TestCase):
|
|||||||
rpc = swift_utils.SwiftProxyClusterRPC()
|
rpc = swift_utils.SwiftProxyClusterRPC()
|
||||||
rq = rpc.stop_proxy_request(peers_only=True)
|
rq = rpc.stop_proxy_request(peers_only=True)
|
||||||
self.assertEqual({'trigger': 'test-uuid',
|
self.assertEqual({'trigger': 'test-uuid',
|
||||||
|
'broker-token': None,
|
||||||
'builder-broker': None,
|
'builder-broker': None,
|
||||||
'peers-only': True,
|
'peers-only': True,
|
||||||
'leader-changed-notification': None,
|
'leader-changed-notification': None,
|
||||||
@ -138,6 +139,7 @@ class SwiftUtilsTestCase(unittest.TestCase):
|
|||||||
|
|
||||||
rq = rpc.stop_proxy_request()
|
rq = rpc.stop_proxy_request()
|
||||||
self.assertEqual({'trigger': 'test-uuid',
|
self.assertEqual({'trigger': 'test-uuid',
|
||||||
|
'broker-token': None,
|
||||||
'builder-broker': None,
|
'builder-broker': None,
|
||||||
'peers-only': None,
|
'peers-only': None,
|
||||||
'leader-changed-notification': None,
|
'leader-changed-notification': None,
|
||||||
@ -151,6 +153,7 @@ class SwiftUtilsTestCase(unittest.TestCase):
|
|||||||
rpc = swift_utils.SwiftProxyClusterRPC()
|
rpc = swift_utils.SwiftProxyClusterRPC()
|
||||||
rq = rpc.stop_proxy_ack(echo_token='token1', echo_peers_only='1')
|
rq = rpc.stop_proxy_ack(echo_token='token1', echo_peers_only='1')
|
||||||
self.assertEqual({'trigger': 'token2',
|
self.assertEqual({'trigger': 'token2',
|
||||||
|
'broker-token': None,
|
||||||
'builder-broker': None,
|
'builder-broker': None,
|
||||||
'peers-only': '1',
|
'peers-only': '1',
|
||||||
'leader-changed-notification': None,
|
'leader-changed-notification': None,
|
||||||
@ -158,10 +161,13 @@ class SwiftUtilsTestCase(unittest.TestCase):
|
|||||||
'stop-proxy-service-ack': 'token1',
|
'stop-proxy-service-ack': 'token1',
|
||||||
'sync-only-builders': None}, rq)
|
'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()
|
rpc = swift_utils.SwiftProxyClusterRPC()
|
||||||
rq = rpc.sync_rings_request('HostA', 'token1')
|
rq = rpc.sync_rings_request('HostA', 'token1')
|
||||||
self.assertEqual({'trigger': 'token1',
|
self.assertEqual({'trigger': 'token2',
|
||||||
|
'broker-token': 'token1',
|
||||||
'builder-broker': 'HostA',
|
'builder-broker': 'HostA',
|
||||||
'peers-only': None,
|
'peers-only': None,
|
||||||
'leader-changed-notification': None,
|
'leader-changed-notification': None,
|
||||||
@ -175,6 +181,7 @@ class SwiftUtilsTestCase(unittest.TestCase):
|
|||||||
rpc = swift_utils.SwiftProxyClusterRPC()
|
rpc = swift_utils.SwiftProxyClusterRPC()
|
||||||
rq = rpc.notify_leader_changed()
|
rq = rpc.notify_leader_changed()
|
||||||
self.assertEqual({'trigger': 'token1',
|
self.assertEqual({'trigger': 'token1',
|
||||||
|
'broker-token': None,
|
||||||
'builder-broker': None,
|
'builder-broker': None,
|
||||||
'peers-only': None,
|
'peers-only': None,
|
||||||
'leader-changed-notification': 'token1',
|
'leader-changed-notification': 'token1',
|
||||||
|
Loading…
Reference in New Issue
Block a user