leader verify ack token with request
This commit is contained in:
@@ -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)
|
||||||
|
|||||||
@@ -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
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user