summaryrefslogtreecommitdiff
path: root/grpc/tools/run_tests/xds_k8s_test_driver/framework/helpers/retryers.py
diff options
context:
space:
mode:
Diffstat (limited to 'grpc/tools/run_tests/xds_k8s_test_driver/framework/helpers/retryers.py')
-rw-r--r--grpc/tools/run_tests/xds_k8s_test_driver/framework/helpers/retryers.py43
1 files changed, 41 insertions, 2 deletions
diff --git a/grpc/tools/run_tests/xds_k8s_test_driver/framework/helpers/retryers.py b/grpc/tools/run_tests/xds_k8s_test_driver/framework/helpers/retryers.py
index d76a4066..4ea4e905 100644
--- a/grpc/tools/run_tests/xds_k8s_test_driver/framework/helpers/retryers.py
+++ b/grpc/tools/run_tests/xds_k8s_test_driver/framework/helpers/retryers.py
@@ -21,16 +21,24 @@ We use tenacity as a general-purpose retrying library.
> - https://tenacity.readthedocs.io/en/latest/index.html
"""
import datetime
+import logging
from typing import Any, List, Optional
import tenacity
+retryers_logger = logging.getLogger(__name__)
# Type aliases
timedelta = datetime.timedelta
Retrying = tenacity.Retrying
+RetryError = tenacity.RetryError
+_after_log = tenacity.after_log
+_before_sleep_log = tenacity.before_sleep_log
_retry_if_exception_type = tenacity.retry_if_exception_type
+_stop_after_attempt = tenacity.stop_after_attempt
_stop_after_delay = tenacity.stop_after_delay
+_stop_any = tenacity.stop_any
_wait_exponential = tenacity.wait_exponential
+_wait_fixed = tenacity.wait_fixed
def _retry_on_exceptions(retry_on_exceptions: Optional[List[Any]] = None):
@@ -45,9 +53,40 @@ def exponential_retryer_with_timeout(
wait_min: timedelta,
wait_max: timedelta,
timeout: timedelta,
- retry_on_exceptions: Optional[List[Any]] = None) -> Retrying:
+ retry_on_exceptions: Optional[List[Any]] = None,
+ logger: Optional[logging.Logger] = None,
+ log_level: Optional[int] = logging.DEBUG) -> Retrying:
+ if logger is None:
+ logger = retryers_logger
+ if log_level is None:
+ log_level = logging.DEBUG
return Retrying(retry=_retry_on_exceptions(retry_on_exceptions),
wait=_wait_exponential(min=wait_min.total_seconds(),
max=wait_max.total_seconds()),
stop=_stop_after_delay(timeout.total_seconds()),
- reraise=True)
+ before_sleep=_before_sleep_log(logger, log_level))
+
+
+def constant_retryer(*,
+ wait_fixed: timedelta,
+ attempts: int = 0,
+ timeout: timedelta = None,
+ retry_on_exceptions: Optional[List[Any]] = None,
+ logger: Optional[logging.Logger] = None,
+ log_level: Optional[int] = logging.DEBUG) -> Retrying:
+ if logger is None:
+ logger = retryers_logger
+ if log_level is None:
+ log_level = logging.DEBUG
+ if attempts < 1 and timeout is None:
+ raise ValueError('The number of attempts or the timeout must be set')
+ stops = []
+ if attempts > 0:
+ stops.append(_stop_after_attempt(attempts))
+ if timeout is not None:
+ stops.append(_stop_after_delay.total_seconds())
+
+ return Retrying(retry=_retry_on_exceptions(retry_on_exceptions),
+ wait=_wait_fixed(wait_fixed.total_seconds()),
+ stop=_stop_any(*stops),
+ before_sleep=_before_sleep_log(logger, log_level))