improved peer svc stop request logic
This commit is contained in:
@@ -1,3 +1,4 @@
|
||||
import copy
|
||||
import os
|
||||
import pwd
|
||||
import shutil
|
||||
@@ -147,32 +148,55 @@ class SwiftProxyCharmException(Exception):
|
||||
|
||||
|
||||
class SwiftProxyClusterRPC(object):
|
||||
"""Provides cluster relation rpc dicts.
|
||||
|
||||
Crucially, this ensures that any settings we don't use in any given call
|
||||
are set to None, therefore removing them from the relation so they don't
|
||||
get accidentally interpreted by the receiver as part of the request.
|
||||
|
||||
NOTE: these are only intended to be used from cluster peer relations.
|
||||
"""
|
||||
|
||||
def __init__(self, version=1):
|
||||
self._version = version
|
||||
|
||||
def template(self):
|
||||
# Everything must be None by default so it gets dropped from the
|
||||
# relation unless we want it to be set.
|
||||
self.blanks = {1: {'trigger': None,
|
||||
templates = {1: {'trigger': None,
|
||||
'builder-broker': None,
|
||||
'stop-proxy-service': None,
|
||||
'stop-proxy-service-ack': None,
|
||||
'peers-only': None}}
|
||||
return copy.deepcopy(templates[self._version])
|
||||
|
||||
def stop_proxy_request(self, peers_only=None):
|
||||
rq = self.blanks[self._version]
|
||||
"""Request to stop peer proxy service.
|
||||
|
||||
NOTE: leader action
|
||||
"""
|
||||
rq = self.template()
|
||||
rq['trigger'] = str(uuid.uuid4())
|
||||
rq['stop-proxy-service'] = rq['trigger']
|
||||
rq['peers-only'] = peers_only
|
||||
return rq
|
||||
|
||||
def stop_proxy_ack(self, token):
|
||||
rq = self.blanks[self._version]
|
||||
"""Ack that peer proxy service is stopped.
|
||||
|
||||
NOTE: non-leader action
|
||||
"""
|
||||
rq = self.template()
|
||||
rq['trigger'] = str(uuid.uuid4())
|
||||
rq['stop-proxy-service-ack'] = token
|
||||
return rq
|
||||
|
||||
def sync_rings_request(self, broker_host):
|
||||
rq = self.blanks[self._version]
|
||||
"""Request for peer to sync rings.
|
||||
|
||||
NOTE: leader action
|
||||
"""
|
||||
rq = self.template()
|
||||
rq['trigger'] = str(uuid.uuid4())
|
||||
rq['builder-broker'] = broker_host
|
||||
return rq
|
||||
|
||||
@@ -35,15 +35,15 @@ class SwiftHooksTestCase(unittest.TestCase):
|
||||
responses = [{'some-other-key': token1}]
|
||||
self.assertFalse(swift_hooks.all_peers_stopped(responses))
|
||||
|
||||
responses = [{'stop-proxy-service-rsp': token1},
|
||||
{'stop-proxy-service-rsp': token2}]
|
||||
responses = [{'stop-proxy-service-ack': token1},
|
||||
{'stop-proxy-service-ack': token2}]
|
||||
self.assertFalse(swift_hooks.all_peers_stopped(responses))
|
||||
|
||||
responses = [{'stop-proxy-service-rsp': token1},
|
||||
{'stop-proxy-service-rsp': token1}]
|
||||
responses = [{'stop-proxy-service-ack': token1},
|
||||
{'stop-proxy-service-ack': token1}]
|
||||
self.assertTrue(swift_hooks.all_peers_stopped(responses))
|
||||
|
||||
responses = [{'stop-proxy-service-rsp': token1},
|
||||
{'stop-proxy-service-rsp': token1},
|
||||
responses = [{'stop-proxy-service-ack': token1},
|
||||
{'stop-proxy-service-ack': token1},
|
||||
{'some-other-key': token1}]
|
||||
self.assertFalse(swift_hooks.all_peers_stopped(responses))
|
||||
|
||||
@@ -66,3 +66,43 @@ class SwiftUtilsTestCase(unittest.TestCase):
|
||||
swift_utils.mark_www_rings_deleted()
|
||||
finally:
|
||||
shutil.rmtree(tmpdir)
|
||||
|
||||
@mock.patch('swift_utils.uuid')
|
||||
def test_cluster_rpc_stop_proxy_request(self, mock_uuid):
|
||||
mock_uuid.uuid4.return_value = 'test-uuid'
|
||||
rpc = swift_utils.SwiftProxyClusterRPC()
|
||||
rq = rpc.stop_proxy_request(peers_only=True)
|
||||
self.assertEqual({'trigger': 'test-uuid',
|
||||
'builder-broker': None,
|
||||
'peers-only': True,
|
||||
'stop-proxy-service': 'test-uuid',
|
||||
'stop-proxy-service-ack': None}, rq)
|
||||
|
||||
rq = rpc.stop_proxy_request()
|
||||
self.assertEqual({'trigger': 'test-uuid',
|
||||
'builder-broker': None,
|
||||
'peers-only': None,
|
||||
'stop-proxy-service': 'test-uuid',
|
||||
'stop-proxy-service-ack': None}, rq)
|
||||
|
||||
@mock.patch('swift_utils.uuid')
|
||||
def test_cluster_rpc_stop_proxy_ack(self, mock_uuid):
|
||||
mock_uuid.uuid4.return_value = 'token2'
|
||||
rpc = swift_utils.SwiftProxyClusterRPC()
|
||||
rq = rpc.stop_proxy_ack('token1')
|
||||
self.assertEqual({'trigger': 'token2',
|
||||
'builder-broker': None,
|
||||
'peers-only': None,
|
||||
'stop-proxy-service': None,
|
||||
'stop-proxy-service-ack': 'token1'}, rq)
|
||||
|
||||
@mock.patch('swift_utils.uuid')
|
||||
def test_cluster_rpc_sync_request(self, mock_uuid):
|
||||
mock_uuid.uuid4.return_value = 'token1'
|
||||
rpc = swift_utils.SwiftProxyClusterRPC()
|
||||
rq = rpc.sync_rings_request('HostA')
|
||||
self.assertEqual({'trigger': 'token1',
|
||||
'builder-broker': 'HostA',
|
||||
'peers-only': None,
|
||||
'stop-proxy-service': None,
|
||||
'stop-proxy-service-ack': None}, rq)
|
||||
|
||||
Reference in New Issue
Block a user