improved peer svc stop request logic
This commit is contained in:
@@ -30,6 +30,8 @@ from swift_utils import (
|
||||
cluster_sync_rings,
|
||||
update_www_rings,
|
||||
SwiftProxyClusterRPC,
|
||||
get_first_available_value,
|
||||
all_responses_equal,
|
||||
)
|
||||
|
||||
import charmhelpers.contrib.openstack.utils as openstack
|
||||
@@ -258,33 +260,6 @@ def cluster_joined(relation_id=None):
|
||||
private_addr = unit_get('private-address')
|
||||
|
||||
|
||||
def all_responses_equal(responses, key, must_exist=True):
|
||||
"""If key exists in responses, all values for it must be equal.
|
||||
|
||||
If all equal return True. If key does not exist and must_exist is True
|
||||
return False otherwise True.
|
||||
"""
|
||||
sentinel = object()
|
||||
val = None
|
||||
all_equal = True
|
||||
for r in responses:
|
||||
_val = r.get(key, sentinel)
|
||||
if val is not None and val != _val:
|
||||
all_equal = False
|
||||
break
|
||||
elif _val != sentinel:
|
||||
val = _val
|
||||
|
||||
if must_exist and val is None:
|
||||
all_equal = False
|
||||
|
||||
if all_equal:
|
||||
return True
|
||||
|
||||
log("Responses not all equal for key '%s'" % (key), level=DEBUG)
|
||||
return False
|
||||
|
||||
|
||||
def all_peers_stopped(responses):
|
||||
"""Establish whether all peers have stopped their proxy services.
|
||||
|
||||
@@ -302,14 +277,6 @@ def all_peers_stopped(responses):
|
||||
return True
|
||||
|
||||
|
||||
def get_first_available_value(responses, key, default=None):
|
||||
for r in responses:
|
||||
if key in r:
|
||||
return r[key]
|
||||
|
||||
return default
|
||||
|
||||
|
||||
def cluster_leader_actions():
|
||||
"""Cluster relation hook actions to be performed by leader units.
|
||||
|
||||
|
||||
@@ -204,6 +204,41 @@ class SwiftProxyClusterRPC(object):
|
||||
return rq
|
||||
|
||||
|
||||
def get_first_available_value(responses, key, default=None):
|
||||
for r in responses:
|
||||
if key in r:
|
||||
return r[key]
|
||||
|
||||
return default
|
||||
|
||||
|
||||
def all_responses_equal(responses, key, must_exist=True):
|
||||
"""If key exists in responses, all values for it must be equal.
|
||||
|
||||
If all equal return True. If key does not exist and must_exist is True
|
||||
return False otherwise True.
|
||||
"""
|
||||
sentinel = object()
|
||||
val = None
|
||||
all_equal = True
|
||||
for r in responses:
|
||||
_val = r.get(key, sentinel)
|
||||
if val is not None and val != _val:
|
||||
all_equal = False
|
||||
break
|
||||
elif _val != sentinel:
|
||||
val = _val
|
||||
|
||||
if must_exist and val is None:
|
||||
all_equal = False
|
||||
|
||||
if all_equal:
|
||||
return True
|
||||
|
||||
log("Responses not all equal for key '%s'" % (key), level=DEBUG)
|
||||
return False
|
||||
|
||||
|
||||
def register_configs():
|
||||
"""Register config files with their respective contexts.
|
||||
|
||||
|
||||
@@ -9,26 +9,6 @@ with mock.patch('charmhelpers.core.hookenv.log'):
|
||||
|
||||
class SwiftHooksTestCase(unittest.TestCase):
|
||||
|
||||
def test_all_responses_equal(self):
|
||||
responses = [{'a': 1, 'c': 3}]
|
||||
self.assertTrue(swift_hooks.all_responses_equal(responses, 'b',
|
||||
must_exist=False))
|
||||
|
||||
responses = [{'a': 1, 'c': 3}]
|
||||
self.assertFalse(swift_hooks.all_responses_equal(responses, 'b'))
|
||||
|
||||
responses = [{'a': 1, 'b': 2, 'c': 3}]
|
||||
self.assertTrue(swift_hooks.all_responses_equal(responses, 'b'))
|
||||
|
||||
responses = [{'a': 1, 'b': 2, 'c': 3}, {'a': 1, 'b': 2, 'c': 3}]
|
||||
self.assertTrue(swift_hooks.all_responses_equal(responses, 'b'))
|
||||
|
||||
responses = [{'a': 1, 'b': 2, 'c': 3}, {'a': 2, 'b': 2, 'c': 3}]
|
||||
self.assertTrue(swift_hooks.all_responses_equal(responses, 'b'))
|
||||
|
||||
responses = [{'a': 1, 'b': 2, 'c': 3}, {'a': 1, 'b': 3, 'c': 3}]
|
||||
self.assertFalse(swift_hooks.all_responses_equal(responses, 'b'))
|
||||
|
||||
def test_all_peers_stopped(self):
|
||||
token1 = str(uuid.uuid4())
|
||||
token2 = str(uuid.uuid4())
|
||||
@@ -47,18 +27,3 @@ class SwiftHooksTestCase(unittest.TestCase):
|
||||
{'stop-proxy-service-ack': token1},
|
||||
{'some-other-key': token1}]
|
||||
self.assertFalse(swift_hooks.all_peers_stopped(responses))
|
||||
|
||||
def test_get_first_available_value(self):
|
||||
rsps = [{'key1': 'A'}, {'key1': 'B'}]
|
||||
self.assertEqual('A',
|
||||
swift_hooks.get_first_available_value(rsps, 'key1'))
|
||||
|
||||
rsps = [{'key2': 'A'}, {'key1': 'B'}]
|
||||
self.assertEqual('B',
|
||||
swift_hooks.get_first_available_value(rsps, 'key1'))
|
||||
|
||||
rsps = [{'key2': 'A'}, {'key1': 'B'}]
|
||||
self.assertIsNone(swift_hooks.get_first_available_value(rsps, 'key3'))
|
||||
|
||||
rsps = []
|
||||
self.assertIsNone(swift_hooks.get_first_available_value(rsps, 'key3'))
|
||||
|
||||
@@ -106,3 +106,38 @@ class SwiftUtilsTestCase(unittest.TestCase):
|
||||
'peers-only': None,
|
||||
'stop-proxy-service': None,
|
||||
'stop-proxy-service-ack': None}, rq)
|
||||
|
||||
def test_all_responses_equal(self):
|
||||
responses = [{'a': 1, 'c': 3}]
|
||||
self.assertTrue(swift_utils.all_responses_equal(responses, 'b',
|
||||
must_exist=False))
|
||||
|
||||
responses = [{'a': 1, 'c': 3}]
|
||||
self.assertFalse(swift_utils.all_responses_equal(responses, 'b'))
|
||||
|
||||
responses = [{'a': 1, 'b': 2, 'c': 3}]
|
||||
self.assertTrue(swift_utils.all_responses_equal(responses, 'b'))
|
||||
|
||||
responses = [{'a': 1, 'b': 2, 'c': 3}, {'a': 1, 'b': 2, 'c': 3}]
|
||||
self.assertTrue(swift_utils.all_responses_equal(responses, 'b'))
|
||||
|
||||
responses = [{'a': 1, 'b': 2, 'c': 3}, {'a': 2, 'b': 2, 'c': 3}]
|
||||
self.assertTrue(swift_utils.all_responses_equal(responses, 'b'))
|
||||
|
||||
responses = [{'a': 1, 'b': 2, 'c': 3}, {'a': 1, 'b': 3, 'c': 3}]
|
||||
self.assertFalse(swift_utils.all_responses_equal(responses, 'b'))
|
||||
|
||||
def test_get_first_available_value(self):
|
||||
rsps = [{'key1': 'A'}, {'key1': 'B'}]
|
||||
self.assertEqual('A',
|
||||
swift_utils.get_first_available_value(rsps, 'key1'))
|
||||
|
||||
rsps = [{'key2': 'A'}, {'key1': 'B'}]
|
||||
self.assertEqual('B',
|
||||
swift_utils.get_first_available_value(rsps, 'key1'))
|
||||
|
||||
rsps = [{'key2': 'A'}, {'key1': 'B'}]
|
||||
self.assertIsNone(swift_utils.get_first_available_value(rsps, 'key3'))
|
||||
|
||||
rsps = []
|
||||
self.assertIsNone(swift_utils.get_first_available_value(rsps, 'key3'))
|
||||
|
||||
Reference in New Issue
Block a user