"""Script to lock world wide territories for given ISRC(s).""" import csv import json import logging import os import sys import boto3 import requests import utils DEV_ENVIRONMENT = 'dev' ENVIRONMENT = os.environ.get('Environment', DEV_ENVIRONMENT) DYNAMODB_MASTERS_ACTIVE = '{}-masters_active'.format(ENVIRONMENT) DYNAMODB_MASTERS_AUDIT_LOG = '{}-masters_audit_new'.format(ENVIRONMENT) LOCK_REASON = 'ineligible for fingerprinting' BASE_URL = 'ows-territories.theorchard.io' FORMAT_STANDARD = 'ISO_3166_1_2016' OWS_TERRITORY_URL = 'https://{env}-{base_url}/territory/{standard}'.format( env='qa', base_url=BASE_URL, standard=FORMAT_STANDARD) FILENAME = os.environ.get('FILENAME', 'data/isrcs.csv') dynamodb_resource = boto3.resource('dynamodb', 'us-east-1') client = dynamodb_resource.meta.client sys.path.append(os.path.join(os.path.dirname(__file__), '..')) log = logging.getLogger('main') log.setLevel(logging.DEBUG) fmt = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s') sh = logging.StreamHandler(sys.stdout) sh.setFormatter(fmt) log.addHandler(sh) def update_isrc(isrc, territories): """Replace or create an ISRC item in DynamoDB active table. Args: isrc (dict): ISRC item to be written territories (dict): territories of ISO_3166_1 standard """ item = {} item['isrc'] = isrc item['locked_territories'] = {} item['territories'] = {} for territory in territories: territory_code = territory.get('territory_code_a2') item['locked_territories'][territory_code] = { 'reason': LOCK_REASON } timestamp = utils.get_timestamp_for_dynamo() item['timestamp'] = timestamp item['updated_timestamp'] = timestamp kwargs = { 'TableName': DYNAMODB_MASTERS_ACTIVE, 'Item': item } return client.put_item(**kwargs) def update_audit_log(isrc, territories): """Create an ISRC item in DynamoDB masters_audit_new table. Args: isrc (dict): ISRC item to be written territories (dict): territories of ISO_3166_1 standard """ item = {} item['isrc'] = isrc timestamp = utils.get_audit_log_timestamp() item['timestamp'] = timestamp item['correlation_id'] = 'master-registry-{}'.format(timestamp) item['opcode'] = 'LOCK' item['user'] = 'oa:179' item['territories'] = [] for territory in territories: territory_code = territory.get('territory_code_a2') item['territories'].append(territory_code) item['lock_reason'] = LOCK_REASON item['conflict'] = '' item['source'] = '' kwargs = { 'TableName': DYNAMODB_MASTERS_AUDIT_LOG, 'Item': item } return client.put_item(**kwargs) def get_territories(): """Retrieve standard territories.""" headers = {'Correlation-Id': 'master-registry-correlation-Id'} res = requests.get(OWS_TERRITORY_URL, headers=headers) if res.status_code != 200: raise Exception(res) data = json.loads(res.text) return data['items'] if __name__ == '__main__': log.info('Running master registry update for %s Environment', ENVIRONMENT) territories = get_territories() log.info('%s territories to lock', len(territories)) if not FILENAME: raise Exception('No file found.') log.info('Reading file %s from environment variables.', FILENAME) with open(FILENAME) as csv_file: reader = csv.DictReader(csv_file) for row in reader: isrc = row['ISRC'] log.info('Updating ISRC: %s', isrc) response = update_isrc(isrc, territories) log.info('Dynamo table update response: %s', json.dumps(response)) audit_log = update_audit_log(isrc, territories) log.info('Audit log update response: %s', json.dumps(audit_log))