"""Helper functions for workflows.""" import base64 import datetime import functools import logging import os import boto3 import sentry_sdk from botocore.exceptions import ClientError if os.getenv('SENTRY_DSN'): sentry_sdk.init( os.getenv('SENTRY_DSN'), traces_sample_rate=1.0, ) def catch_all_and_print(f): @functools.wraps(f) def inner(*args, **kwargs): try: return f(*args, **kwargs) except Exception as ex: if os.environ.get('SENTRY_DSN'): sentry_sdk.capture_exception(ex) raise ex return inner def catch_flow_failure(f): @functools.wraps(f) def inner(*args, **kwargs): try: return f(*args, **kwargs) except Exception as ex: executor = args[0].get_executor() artists = [a for a in executor.select_artists_stats() if (a[-2] < datetime.date.today() and a[-1] > datetime.date.today() - datetime.timedelta(days=14))] for artist in artists: # artist[0] returns artist's name executor.update_artist_stats_last_processing_date(artist[0], datetime.datetime.today()) args[0].update_staging_raw_table() logging.error('Flow has failed, but all the stats kept and updated ' 'preventing the dashboards being off.') if os.environ.get('SENTRY_DSN'): sentry_sdk.capture_exception(ex) raise ex return inner def get_secret(secret_name, flow_name, env): """Get secret from AWS Secrets Manager. Args: secret_name (str): secret name. flow_name (str): flow name.""" full_secret_name = '{}/{}/{}'.format(env, flow_name, secret_name) region_name = "us-east-1" secrets = boto3.client('secretsmanager', region_name=region_name) try: response = secrets.get_secret_value( SecretId=full_secret_name) except ClientError as error: if error.response['Error']['Code'] in ['DecryptionFailureException', 'InternalServiceErrorException', 'InvalidParameterException', 'InvalidRequestException', 'ResourceNotFoundException']: raise error else: if 'SecretString' in response: return response['SecretString']. \ replace(secret_name, '').replace('"', '').replace(":", ''). \ replace("{", '').replace("}", '') return base64.b64decode(response['SecretBinary'])