"""Lambda update-subaccount-mapping function module.""" import csv import config from lambdacommon.aws import s3 from lambdacommon.common_config import logger from src.constants import constants as const from src.update_subaccount_mapping_in_art_relations import update_mapping_in_art_relations, validate_vendor from src.update_subaccount_mapping_in_neo4j import update_mapping_in_neo4j def get_s3_data(bucket, filename): """Get file from s3.""" obj = s3.get_object(bucket, filename) data = obj['Body'].read().decode('utf-8').splitlines() return data def handler(event, context): """Lambda entry point.""" logger.info(event) if not event.get('filename'): logger.error(const.EVENT_ERROR_MESSAGE) return {'status': 'Fail'} try: filename = event.get('filename') data = get_s3_data(config.BUCKET, filename) reader = csv.DictReader(data) subaccount_ids = {} if not (const.SUBACCOUNT_ID in reader.fieldnames and const.PROJECT_ID in reader.fieldnames and const.VENDOR_ID in reader.fieldnames): logger.info('Required headers are missing from csv file') return {'status': 'Fail'} for row in reader: if not (row.get(const.SUBACCOUNT_ID) and row.get(const.PROJECT_ID) and row.get(const.VENDOR_ID)): subaccount_ids = {} logger.info('Data is missing in file') break subaccount_id = row[const.SUBACCOUNT_ID] project_id = int(row[const.PROJECT_ID]) vendor_id = row[const.VENDOR_ID] if not subaccount_ids.get(subaccount_id): subaccount_ids[subaccount_id] = [project_id] else: if project_id not in subaccount_ids.get(subaccount_id): subaccount_ids[subaccount_id].append(project_id) if not subaccount_ids: return {'status': 'Fail'} result = validate_vendor(subaccount_ids, vendor_id, logger) if not result: return {'status': 'Fail'} update_mapping_in_art_relations(subaccount_ids, logger) update_mapping_in_neo4j(vendor_id, logger) return {'status': 'OK'} except Exception as e: logger.exception(str(e)) raise e