"""Wrap lambda call.""" import argparse import json import traceback import boto3 import botocore LOCATION_MAP = { 'avl': 1, 'nyc': 2 } # not setup for assets w/o track index ASSET_MAP = { 'wav': 1, 'mp3_192': 4, 'mp3_320': 5, 'flac': 440 } LAMBDA_CLIENT = boto3.client( 'lambda', config=botocore.config.Config( read_timeout=900 # wait for max lambda runtime ) ) def main(): """Entrypoint.""" args = _args() upc = args.upc track_indexes = args.t env = args.env asset_type_id = ASSET_MAP[args.a] location_id = LOCATION_MAP[args.l] # TODO - parallelize based on max concurrency and/or make range requests for track_index in track_indexes: _invoke( env, upc, track_index, asset_type_id, location_id ) def _invoke(env, upc, track_index, asset_type, location): success = False try: payload = json.dumps({ 'upcs': str([upc]), 'offset': track_index - 1, 'limit': 1, 'asset_type': asset_type, 'physical_location_id': str([location]) }) result = LAMBDA_CLIENT.invoke( FunctionName=f'lambda-support-copy-assets-{env}', InvocationType='RequestResponse', Payload=payload ) except Exception: result = traceback.format_exc() else: try: code = result['StatusCode'] if code >= 200 and code < 300: success = True except KeyError: pass finally: print(f""" Input: {env} {upc} {track_index} {asset_type} {location} Output: {result} Success: {success} """) return success def _args(): p = argparse.ArgumentParser( formatter_class=argparse.ArgumentDefaultsHelpFormatter ) p.add_argument( 'env', choices=['qa', 'prod'], help='environment namespace of lambda function' ) p.add_argument( 'upc', type=str, help='upc of product to find tracks on' ) p.add_argument( '-t', nargs='+', type=int, required=True, help='list of track indexes on product' ) p.add_argument( '-a', type=str, choices=[x for x in ASSET_MAP.keys()], default='flac', help='asset type to move' ) p.add_argument( '-l', type=str, choices=[x for x in LOCATION_MAP.keys()], default='avl', help='asset location to move from' ) return p.parse_args() if __name__ == '__main__': main()