from __future__ import print_function from __future__ import unicode_literals import boto_source_profile_mfa from botocore.exceptions import ClientError, ParamValidationError from functools import wraps from . import config _sessions = {} def retry(attempts=3): def wrapper(func): @wraps(func) def wrapped(*args, **kwargs): tries = attempts while True: tries -= 1 try: return func(*args, **kwargs) except (ClientError, ParamValidationError) as error: if tries > 0: print('[ssha] {}'.format(error)) else: raise return wrapped return wrapper @retry() def client(*args, **kwargs): return session().client(*args, **kwargs) @retry() def credentials(*args, **kwargs): return session().get_credentials(*args, **kwargs) @retry() def resource(*args, **kwargs): return session().resource(*args, **kwargs) def session(): aws_config = config.get('aws') or {} return boto_source_profile_mfa.get_session(**aws_config)