"""trigger-state-machine.""" import json from os import path import uuid import boto3 import config from ddex_ingester_common.constants.ddex_providers import ( ALTAFONTE, ALTAFONTE_FOLDER_NAME, AWAL, RISING_88, RISING_88_FOLDER_NAME, SME, ) from ddex_ingester_common.logging import utils as logging_utils logger = logging_utils.get_logger(config.app_logger) def handler(event, context): """Lambda entrypoint.""" # Check event key is for an xml file correlation_id = event.get('correlation_id') or str(uuid.uuid4()) if event.get('detail-type', '') == 'Object Created': key = event.get('detail', {}).get('object', {}).get('key') bucket = event.get('detail', {}).get('bucket', {}).get('name') if 'requestParameters' not in event['detail']: event['detail']['requestParameters'] = { 'bucketName': bucket, 'key': key } else: event['detail']['requestParameters']['bucketName'] = bucket event['detail']['requestParameters']['key'] = key event['detail']['requestParameters']['correlation_id'] = correlation_id logging_utils.update_logger_correlation_id(logger, correlation_id) key = event.get('detail', {}).get('requestParameters', {}).get('key') logger.info(f'Lambda triggered by: {key}') if not key.endswith('.xml') or not key: return if 'resources' in path.dirname(key): return logger.info(f'Executing state machine for: {key}') # Get event key folder name to use as part of sfn execution name execution_name = ( f'{path.basename(path.dirname(key))}' f'-{uuid.uuid4()}' ) logger.info(f'Starting Execution: {execution_name}') logger.info(f'Execution input: {json.dumps(event)}') s3_bucket_index = key.split('/')[0] sfn_arn = config.DDEX_STATE_MACHINE_ARN ddex_provider = SME if s3_bucket_index == 'awal_ddex': sfn_arn = config.AWAL_STATE_MACHINE_ARN ddex_provider = AWAL if RISING_88_FOLDER_NAME in key: ddex_provider = RISING_88 elif ALTAFONTE_FOLDER_NAME in key: ddex_provider = ALTAFONTE event['detail']['requestParameters']['ddex_provider'] = ddex_provider client = boto3.client('stepfunctions') response = client.start_execution( stateMachineArn=sfn_arn, name=execution_name, input=json.dumps(event) ) execution_arn = response.get('executionArn') logger.info(f'Execution: {execution_arn}') return execution_arn