diff options
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.py | 43 |
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)) |