From 9b88e5a782b2c10ce782ca09ff2bb56bb0a82200 Mon Sep 17 00:00:00 2001 From: Guillaume Abrioux Date: Fri, 9 Jun 2023 14:58:02 +0200 Subject: [PATCH] node-proxy: add a decorator 'retry' This decorator will be useful for calls that should do multiple attempts before actually failing. Signed-off-by: Guillaume Abrioux --- src/cephadm/node-proxy/util.py | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/src/cephadm/node-proxy/util.py b/src/cephadm/node-proxy/util.py index 817583e6ff7..6420e904876 100644 --- a/src/cephadm/node-proxy/util.py +++ b/src/cephadm/node-proxy/util.py @@ -1,7 +1,8 @@ import logging import yaml import os -from typing import Dict, List +import time +from typing import Dict, List, Callable, Any def normalize_dict(test_dict: Dict) -> Dict: @@ -69,3 +70,20 @@ class Logger: logger.addHandler(handler) return logger + + +def retry(exceptions: Any = Exception, retries: int = 20, delay: int = 1) -> Callable: + def decorator(f: Callable) -> Callable: + def _retry(*args: str, **kwargs: Any) -> Callable: + _tries = retries + while _tries > 1: + try: + print("{}".format(_tries)) + return f(*args, **kwargs) + except exceptions: + time.sleep(delay) + _tries -= 1 + print("{} has failed after {} tries".format(f, retries)) + return f(*args, **kwargs) + return _retry + return decorator -- 2.39.5