You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@libcloud.apache.org by to...@apache.org on 2021/11/04 11:19:36 UTC
[libcloud] 03/03: Add test case for additional scenario we were
missing.
This is an automated email from the ASF dual-hosted git repository.
tomaz pushed a commit to branch understand-ai-intelligent-retry
in repository https://gitbox.apache.org/repos/asf/libcloud.git
commit 0e729e97d273ded83283ce8ed963074b3f3a340e
Author: Tomaz Muraus <to...@tomaz.me>
AuthorDate: Thu Nov 4 12:16:56 2021 +0100
Add test case for additional scenario we were missing.
---
libcloud/test/test_connection.py | 27 +++++++++++++++++++++++++++
libcloud/utils/retry.py | 2 +-
2 files changed, 28 insertions(+), 1 deletion(-)
diff --git a/libcloud/test/test_connection.py b/libcloud/test/test_connection.py
index 7a87aed..445cea1 100644
--- a/libcloud/test/test_connection.py
+++ b/libcloud/test/test_connection.py
@@ -35,6 +35,7 @@ from libcloud.http import LibcloudConnection
from libcloud.http import SignedHTTPSAdapter
from libcloud.utils.retry import Retry
from libcloud.utils.retry import RetryForeverOnRateLimitError
+from libcloud.utils.retry import RETRY_EXCEPTIONS
from libcloud.utils.py3 import assertRaisesRegex
@@ -559,6 +560,32 @@ class ConnectionClassTestCase(unittest.TestCase):
self.assertEqual(mock_connect.call_count, 2,
'Retry logic failed')
+ @patch('libcloud.common.base.Connection.request')
+ def test_retry_on_all_default_retry_exception_classes(self, mock_connect):
+ con = Connection()
+ con.connection = Mock()
+ connect_method = 'libcloud.common.base.Connection.request'
+
+ self.retry_counter = 0
+
+ def mock_connect_side_effect(*args, **kwargs):
+ self.retry_counter += 1
+
+ if self.retry_counter < len(RETRY_EXCEPTIONS):
+ raise RETRY_EXCEPTIONS[self.retry_counter]
+
+ return 'success'
+
+ mock_connect.__name__ = 'mock_connect'
+ mock_connect.side_effect = mock_connect_side_effect
+ retry_request = Retry(timeout=0.6, retry_delay=0.1,
+ backoff=1)
+ result = retry_request(con.request)(action='/')
+ self.assertEqual(result, "success")
+
+ self.assertEqual(mock_connect.call_count, len(RETRY_EXCEPTIONS),
+ 'Retry logic failed')
+
class CertificateConnectionClassTestCase(unittest.TestCase):
def setUp(self):
diff --git a/libcloud/utils/retry.py b/libcloud/utils/retry.py
index cb48d74..49418a4 100644
--- a/libcloud/utils/retry.py
+++ b/libcloud/utils/retry.py
@@ -40,7 +40,7 @@ class TransientSSLError(ssl.SSLError):
# Constants used by the ``retry`` class
-
+# All the time values (timeout, delay, backoff) are in seconds
DEFAULT_TIMEOUT = 30 # default retry timeout
DEFAULT_DELAY = 1 # default sleep delay used in each iterator
DEFAULT_BACKOFF = 1 # retry backup multiplier