"""Lambda podcast_chartable function module.""" from datetime import datetime from datetime import timedelta import boto3 from botocore.exceptions import ClientError import config from common import sentry OWS_PODCAST = 'ows-podcast' s3_client = boto3.client('s3') def file_exists(file_path): """Check if file exists in s3 bucket.""" try: s3_object = s3_client.get_object( Bucket=config.CHARTABLE_BUCKET, Key=file_path) file_size = s3_object['ContentLength'] if file_size > 20: # file is not empty return True except ClientError as e: error = e.response['Error']['Code'] if error != 'NoSuchKey': raise e return False def get_missing_files(report_date, include_lag): """Get missing files for given date (and accounting for chartable lag).""" missing_files = [] for file_type, file_info in config.FILES.items(): if include_lag: report_date = report_date - timedelta(days=file_info[1]) formatted_date = report_date.strftime('%Y-%m-%d') formatted_file_name = file_info[0].format(date=formatted_date) if not file_exists(formatted_file_name): missing_files.append('{}-{}'.format(file_type, formatted_date)) return missing_files def handler(event, context): """Lambda entry point.""" try: report_date = datetime.now() include_lag = True if event.get('event_date'): report_date = datetime.strptime( event['event_date'], '%Y-%m-%dT%H:%M:%S.%f%z') include_lag = False missing_files = get_missing_files(report_date, include_lag) if len(missing_files): sentry_message = 'Missing files: {}'.format( ','.join(missing_files)) sentry.capture_message(sentry_message) except Exception as e: config.logger.exception(str(e)) raise e