util.failover: init
This commit is contained in:
parent
94cf7a5065
commit
b4efa7e45b
2 changed files with 90 additions and 0 deletions
46
util/failover.py
Normal file
46
util/failover.py
Normal file
|
@ -0,0 +1,46 @@
|
|||
import logging
|
||||
|
||||
from functools import wraps
|
||||
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
|
||||
class FailoverException(Exception):
|
||||
""" Exception raised when an operation should be retried by the failover decorator. """
|
||||
def __init__(self, message):
|
||||
super(FailoverException, self).__init__()
|
||||
self.message = message
|
||||
|
||||
def failover(func):
|
||||
""" Wraps a function such that it can be retried on specified failures.
|
||||
Raises FailoverException when all failovers are exhausted.
|
||||
Example:
|
||||
|
||||
@failover
|
||||
def get_google(scheme, use_www=False):
|
||||
www = 'www.' if use_www else ''
|
||||
r = requests.get(scheme + '://' + www + 'google.com')
|
||||
if r.status_code != 200:
|
||||
raise FailoverException('non 200 response from Google' )
|
||||
return r
|
||||
|
||||
def GooglePingTest():
|
||||
r = get_google(
|
||||
(('http'), {'use_www': False}),
|
||||
(('http'), {'use_www': True}),
|
||||
(('https'), {'use_www': False}),
|
||||
(('https'), {'use_www': True}),
|
||||
)
|
||||
print('Successfully contacted ' + r.url)
|
||||
"""
|
||||
@wraps(func)
|
||||
def wrapper(*args_sets):
|
||||
for arg_set in args_sets:
|
||||
try:
|
||||
return func(*arg_set[0], **arg_set[1])
|
||||
except FailoverException as ex:
|
||||
logger.debug('failing over: %s', ex.message)
|
||||
continue
|
||||
raise FailoverException('exhausted all possible failovers')
|
||||
return wrapper
|
Reference in a new issue