import boto3 import botocore import itertools import datetime import pytz S3_BUCKET = 'prod-orcdbucket' S3_DIR = 'feed-drop/AmazonUnlimited' REPORT_TYPES = ['Activity', 'Playlist', 'User'] COUNTRIES = ['US', 'AT', 'GB', 'DE', 'IT', 'FR', 'AU', 'ES'] ORGS = ['ORCA', 'ORED'] MISSING_FILES_MANIFEST = 'missing_files.txt' FILE_MANIFEST = 'manifest.txt' STALE_MANIFEST = 'stale_manifest.txt' DATE_RANGES = [ { 'start_date': 20180101, 'end_date': 20180131 } # { 'start_date': 20181201, 'end_date': 20181204 } # { 'start_date': 20190201, 'end_date': 20190228 }, # { 'start_date': 20190301, 'end_date': 20190331 } ] DATE_THRESHOLD = datetime.datetime(2019, 3, 20, tzinfo=pytz.timezone('US/Eastern')) def main(): s3_resource = boto3.resource('s3') for date_range in DATE_RANGES: for date in range(date_range['start_date'], date_range['end_date'] + 1): print('processing {date}'.format(date=date)) check_files_for_date(s3_resource, date) def check_files_for_date(s3_resource, date): s3_keys = get_s3_keys_for_date(date) for s3_key in s3_keys: check_for_file_existance(s3_resource, s3_key) def get_s3_keys_for_date(date): def build_s3_key(org, country, report_type): filename = _get_filename(org, country, date, report_type) return '{dir}/{report_filename}'.format( dir=S3_DIR, report_filename=filename) return _create_s3_key_iterable(build_s3_key) def check_for_file_existance(s3, file_key): s3_object = s3.Object(S3_BUCKET, file_key) # import pdb; pdb.set_trace() try: s3_object.content_length if s3_object.last_modified.astimezone(pytz.timezone('US/Eastern')) < DATE_THRESHOLD: # old files add_file_to_manifest(file_key, STALE_MANIFEST) else: # good files add_file_to_manifest(file_key, FILE_MANIFEST) except botocore.exceptions.ClientError: add_file_to_manifest(file_key, MISSING_FILES_MANIFEST) def add_file_to_manifest(file_key, manifest): file_name = file_key.split('/')[-1] with open(manifest, "a") as manifest: manifest.write(file_name) manifest.write("\n") def _get_filename(org, country, date, report_type): return '{org}_{country}_{date}_Daily_{report_type}_Report.txt.zip'.format( org=org, country=country, date=date, report_type=report_type) def _create_s3_key_iterable(builder): combos = itertools.product(ORGS, COUNTRIES, REPORT_TYPES) return itertools.starmap(builder, combos) if __name__ == '__main__': main()