Fix typo and rename class for better understanding

Fixes a typo (None -> not None) and renames the class from
ObjectRetrier -> ObjectRetrierWraps to make it clearer that the class
instantiation is to wrap and object with the retrier code rather than do
retries at that moment.
This commit is contained in:
Alex Kavanagh
2021-03-25 14:47:42 +00:00
parent c041042fe2
commit e9f11da5df
3 changed files with 29 additions and 26 deletions

View File

@@ -31,7 +31,7 @@ class SomeException3(Exception):
pass
class TestObjectRetrier(ut_utils.BaseTestCase):
class TestObjectRetrierWraps(ut_utils.BaseTestCase):
def test_object_wrap(self):
@@ -41,7 +41,7 @@ class TestObjectRetrier(ut_utils.BaseTestCase):
return a + b
a = A()
wrapped_a = utilities.ObjectRetrier(a)
wrapped_a = utilities.ObjectRetrierWraps(a)
self.assertEqual(wrapped_a.func(3), 4)
def test_object_multilevel_wrap(self):
@@ -59,7 +59,7 @@ class TestObjectRetrier(ut_utils.BaseTestCase):
return A()
b = B()
wrapped_b = utilities.ObjectRetrier(b)
wrapped_b = utilities.ObjectRetrierWraps(b)
self.assertEqual(wrapped_b.f2.f1(5, 6), 30)
def test_object_wrap_number(self):
@@ -75,7 +75,7 @@ class TestObjectRetrier(ut_utils.BaseTestCase):
return a * b
a = A()
wrapped_a = utilities.ObjectRetrier(a)
wrapped_a = utilities.ObjectRetrierWraps(a)
self.assertEqual(wrapped_a.class_a, 5)
self.assertEqual(wrapped_a.instance_a, 10)
@@ -89,15 +89,15 @@ class TestObjectRetrier(ut_utils.BaseTestCase):
a = A()
# retry on a specific exception
wrapped_a = utilities.ObjectRetrier(a, num_retries=1,
retry_exceptions=[SomeException])
wrapped_a = utilities.ObjectRetrierWraps(
a, num_retries=1, retry_exceptions=[SomeException])
with self.assertRaises(SomeException):
wrapped_a.func()
mock_sleep.assert_called_once_with(5)
# also retry on any exception if none specified
wrapped_a = utilities.ObjectRetrier(a, num_retries=1)
wrapped_a = utilities.ObjectRetrierWraps(a, num_retries=1)
mock_sleep.reset_mock()
with self.assertRaises(SomeException):
wrapped_a.func()
@@ -105,8 +105,8 @@ class TestObjectRetrier(ut_utils.BaseTestCase):
mock_sleep.assert_called_once_with(5)
# no retry if exception isn't listed.
wrapped_a = utilities.ObjectRetrier(a, num_retries=1,
retry_exceptions=[SomeException2])
wrapped_a = utilities.ObjectRetrierWraps(
a, num_retries=1, retry_exceptions=[SomeException2])
mock_sleep.reset_mock()
with self.assertRaises(SomeException):
wrapped_a.func()
@@ -123,7 +123,8 @@ class TestObjectRetrier(ut_utils.BaseTestCase):
a = A()
mock_log = mock.Mock()
wrapped_a = utilities.ObjectRetrier(a, num_retries=1, log=mock_log)
wrapped_a = utilities.ObjectRetrierWraps(
a, num_retries=1, log=mock_log)
with self.assertRaises(SomeException):
wrapped_a.func()
@@ -140,7 +141,7 @@ class TestObjectRetrier(ut_utils.BaseTestCase):
raise SomeException()
a = A()
wrapped_a = utilities.ObjectRetrier(a, num_retries=3, backoff=2)
wrapped_a = utilities.ObjectRetrierWraps(a, num_retries=3, backoff=2)
with self.assertRaises(SomeException):
wrapped_a.func()
# Note third call hits maximum wait time of 15.
@@ -157,7 +158,8 @@ class TestObjectRetrier(ut_utils.BaseTestCase):
raise SomeException()
a = A()
wrapped_a = utilities.ObjectRetrier(a, num_retries=3, total_wait=9)
wrapped_a = utilities.ObjectRetrierWraps(
a, num_retries=3, total_wait=9)
with self.assertRaises(SomeException):
wrapped_a.func()
# Note only two calls, as total wait is 9, so a 3rd retry would exceed

View File

@@ -25,7 +25,7 @@ import osc_lib.exceptions
import zaza.openstack.charm_tests.test_utils as test_utils
import zaza.openstack.utilities.openstack as openstack_utils
from zaza.openstack.utilities import ObjectRetrier
from zaza.openstack.utilities import ObjectRetrierWraps
class CharmOperationTest(test_utils.OpenStackBaseTest):
@@ -65,11 +65,11 @@ class LBAASv2Test(test_utils.OpenStackBaseTest):
def setUpClass(cls):
"""Run class setup for running LBaaSv2 service tests."""
super(LBAASv2Test, cls).setUpClass()
cls.keystone_client = ObjectRetrier(
cls.keystone_client = ObjectRetrierWraps(
openstack_utils.get_keystone_session_client(cls.keystone_session))
cls.neutron_client = ObjectRetrier(
cls.neutron_client = ObjectRetrierWraps(
openstack_utils.get_neutron_session_client(cls.keystone_session))
cls.octavia_client = ObjectRetrier(
cls.octavia_client = ObjectRetrierWraps(
openstack_utils.get_octavia_session_client(cls.keystone_session))
cls.RESOURCE_PREFIX = 'zaza-octavia'

View File

@@ -20,7 +20,7 @@ import time
from keystoneauth1.exceptions.connection import ConnectFailure
class ObjectRetrier(object):
class ObjectRetrierWraps(object):
"""An automatic retrier for an object.
This is designed to be used with an instance of an object. Basically, it
@@ -35,7 +35,7 @@ class ObjectRetrier(object):
# get a client that does 3 retries, waits 5 seconds between retries and
# retries on any error.
some_client = ObjectRetrier(get_some_client)
some_client = ObjectRetrierWraps(get_some_client)
# this gets retried up to 3 times.
things = some_client.list_things()
@@ -96,7 +96,7 @@ class ObjectRetrier(object):
# will fail with an attribute error.
attr = getattr(self.__obj, name)
if callable(attr) or hasattr(attr, "__getattr__"):
return ObjectRetrier(attr, **self.__kwargs)
return ObjectRetrierWraps(attr, **self.__kwargs)
else:
return attr
# TODO(ajkavanagh): Note detecting a property is a bit trickier. we
@@ -122,8 +122,8 @@ class ObjectRetrier(object):
try:
return obj(*args, **kwargs)
except Exception as e:
# if retry_exceptions is None, or the type of the exception is
# not in the list of retries, then raise an exception
# if retry_exceptions is not None, or the type of the exception
# is not in the list of retries, then raise an exception
# immediately. This means that if retry_exceptions is None,
# then the method is always retried.
if (retry_exceptions is not None and
@@ -148,19 +148,20 @@ class ObjectRetrier(object):
def retry_on_connect_failure(client, **kwargs):
"""Retry an object that eventually gets resolved to a call.
Specifically, this uses ObjectRetrier but only against the
Specifically, this uses ObjectRetrierWraps but only against the
keystoneauth1.exceptions.connection.ConnectFailure exeception.
:params client: the object that may throw and exception when called.
:type client: Any
:params **kwargs: the arguments supplied to the ObjectRetrier init method
:params **kwargs: the arguments supplied to the ObjectRetrierWraps init
method
:type **kwargs: Dict[Any]
:returns: client wrapped in an ObjectRetrier instance
:rtype: ObjectRetrier[client]
:returns: client wrapped in an ObjectRetrierWraps instance
:rtype: ObjectRetrierWraps[client]
"""
kwcopy = kwargs.copy()
if 'retry_exceptions' not in kwcopy:
kwcopy['retry_exceptions'] = []
if ConnectFailure not in kwcopy['retry_exceptions']:
kwcopy['retry_exceptions'].append(ConnectFailure)
return ObjectRetrier(client, **kwcopy)
return ObjectRetrierWraps(client, **kwcopy)