leader verify ack token with request

This commit is contained in:
Edward Hope-Morley
2014-12-05 13:32:28 +00:00
parent d12a983388
commit 35b42c8df9
2 changed files with 17 additions and 12 deletions

View File

@@ -271,15 +271,15 @@ def all_peers_stopped(responses):
To be safe, default expectation is that api is still running. To be safe, default expectation is that api is still running.
""" """
key = 'stop-proxy-service-ack' rq_key = SwiftProxyClusterRPC.KEY_STOP_PROXY_SVC
token = relation_get(attribute='stop-proxy-service-rq', ack_key = SwiftProxyClusterRPC.KEY_STOP_PROXY_SVC_ACK
unit=local_unit()) token = relation_get(attribute=rq_key, unit=local_unit())
if not token or token != responses[0].get(key): if not token or token != responses[0].get(ack_key):
log("Unmatched token in ack (expected=%s, got=%s)" % log("Unmatched token in ack (expected=%s, got=%s)" %
(token, responses[0].get(key)), level=DEBUG) (token, responses[0].get(ack_key)), level=DEBUG)
return False return False
if not all_responses_equal(responses, key): if not all_responses_equal(responses, ack_key):
return False return False
return True return True
@@ -292,7 +292,8 @@ def cluster_leader_actions():
""" """
# If we have received an ack, check other units # If we have received an ack, check other units
settings = relation_get() settings = relation_get()
if settings and 'stop-proxy-service-ack' in settings: ack_key = SwiftProxyClusterRPC.KEY_STOP_PROXY_SVC_ACK
if settings and ack_key in settings:
# Find out if all peer units have been stopped. # Find out if all peer units have been stopped.
responses = [] responses = []
for rid in relation_ids('cluster'): for rid in relation_ids('cluster'):
@@ -333,7 +334,8 @@ def cluster_non_leader_actions():
settings = relation_get() settings = relation_get()
# Check whether we have been requested to stop proxy service # Check whether we have been requested to stop proxy service
token = settings.get('stop-proxy-service', None) rq_key = SwiftProxyClusterRPC.KEY_STOP_PROXY_SVC
token = settings.get(rq_key, None)
if token: if token:
log("Peer request to stop proxy service received (%s)" % (token), log("Peer request to stop proxy service received (%s)" % (token),
level=INFO) level=INFO)

View File

@@ -157,6 +157,9 @@ class SwiftProxyClusterRPC(object):
NOTE: these are only intended to be used from cluster peer relations. NOTE: these are only intended to be used from cluster peer relations.
""" """
KEY_STOP_PROXY_SVC = 'stop-proxy-service'
KEY_STOP_PROXY_SVC_ACK = 'stop-proxy-service-ack'
def __init__(self, version=1): def __init__(self, version=1):
self._version = version self._version = version
@@ -165,8 +168,8 @@ class SwiftProxyClusterRPC(object):
# relation unless we want it to be set. # relation unless we want it to be set.
templates = {1: {'trigger': None, templates = {1: {'trigger': None,
'builder-broker': None, 'builder-broker': None,
'stop-proxy-service': None, self.KEY_STOP_PROXY_SVC: None,
'stop-proxy-service-ack': None, self.KEY_STOP_PROXY_SVC_ACK: None,
'peers-only': None}} 'peers-only': None}}
return copy.deepcopy(templates[self._version]) return copy.deepcopy(templates[self._version])
@@ -177,7 +180,7 @@ class SwiftProxyClusterRPC(object):
""" """
rq = self.template() rq = self.template()
rq['trigger'] = str(uuid.uuid4()) rq['trigger'] = str(uuid.uuid4())
rq['stop-proxy-service'] = rq['trigger'] rq[self.KEY_STOP_PROXY_SVC] = rq['trigger']
rq['peers-only'] = peers_only rq['peers-only'] = peers_only
return rq return rq
@@ -189,7 +192,7 @@ class SwiftProxyClusterRPC(object):
rq = self.template() rq = self.template()
rq['trigger'] = str(uuid.uuid4()) rq['trigger'] = str(uuid.uuid4())
# These echo values should match those received in the request # These echo values should match those received in the request
rq['stop-proxy-service-ack'] = echo_token rq[self.KEY_STOP_PROXY_SVC_ACK] = echo_token
rq['peers-only'] = echo_peers_only rq['peers-only'] = echo_peers_only
return rq return rq