"""Application configuration.""" import json import logging import os from os.path import abspath from os.path import dirname from os.path import join from os.path import pardir from urllib import parse from dotenv import load_dotenv from pyraml import parser as raml_parser from secrets_manager.flask_ext import FlaskSecretsManager from sqlalchemy.pool import QueuePool from sqlalchemy.pool import StaticPool # Load environment variables from a .env file dotenv_path = abspath(join(dirname(__file__), pardir, '.env')) load_dotenv(dotenv_path) # Service information SERVICE_NAME = 'ows-product-digital' SERVICE_VERSION = '0.0.1' # Production environment PROD_ENVIRONMENT = 'prod' DEV_ENVIRONMENT = 'dev' QA_ENVIRONMENT = 'qa' TEST_ENVIRONMENT = 'test' ENVIRONMENT = os.environ.get('Environment', DEV_ENVIRONMENT) ASSETS_PHYSICAL_LOCATION_ID = \ int(os.environ.get('ASSETS_PHYSICAL_LOCATION_ID') or 1) secrets_manager_client = FlaskSecretsManager( application_context=False, environment=ENVIRONMENT, service_name=SERVICE_NAME) # Errors and loggers SENTRY = secrets_manager_client.get_cred('SENTRY_DSN') or None LOGGER_LEVEL = logging.INFO LOGGER_NAME = 'ows1' # Database config if ENVIRONMENT == TEST_ENVIRONMENT: DB_URL = 'sqlite://' POOL_CLASS = StaticPool CONNECT_ARGS = {'check_same_thread': False} else: DB_URL = ( 'mysql+pymysql://{user}:{password}@{host}/{db}?charset={charset}' .format( user=secrets_manager_client.get_cred('AR_MYSQL_USER'), password=parse.quote(secrets_manager_client.get_cred('AR_MYSQL_PASSWORD').encode('utf-8')), host=secrets_manager_client.get_cred('AR_MYSQL_HOST'), db=secrets_manager_client.get_cred('AR_MYSQL_DATABASE'), charset='utf8mb4')) POOL_CLASS = QueuePool POOL_MAX_OVERFLOW = -1 POOL_PRE_PING = False # not needed as long as connections not stale POOL_RECYCLE_MS = 3600 # Avoids connections going stale POOL_SIZE = 15 # match the number of uwsgi threads CONNECT_ARGS = {} path = os.path.dirname(os.path.dirname(__file__)) # API definition API_DEFINITION = raml_parser.load( os.path.join( path, 'spec/api/ows-product-digital-{version}.raml'.format( version=SERVICE_VERSION))) API_TEST_DEFINITION = raml_parser.load( os.path.join(path, 'spec/api/test.raml')) def _load_schema(schema_name): file_name = 'spec/schema/{name}.json'.format(name=schema_name) with open(os.path.join(path, file_name)) as f: return json.load(f) PRODUCT_BASICS_DEFINITION = _load_schema('product_basics') COMPOSER_REQUIRED_SUBGENRE_IDS = _load_schema('composer_required_subgenre_ids') LYRICIST_REQUIRED_SUBGENRE_IDS = _load_schema('lyricist_required_subgenre_ids') PRODUCT_DATES_DEFINITION = _load_schema('product_dates') WORLD_MUSIC_GENRE_ID = 11 CLASSICAL_GENRE_ID = 12 SOUNDTRACKS_GENRE_ID = 27 THEATRE_SCORES_SUBGENRE_ID = 545 # Generic handlers HEALTH_CHECK = '/hello/' SQS_QUEUE_NAME = '{env}-upc_repository-queue' ONLY_LOG_ACCESS_ERRORS = True if ENVIRONMENT == PROD_ENVIRONMENT else False EXCLUDE_PATH = [HEALTH_CHECK, '/public/meta-language'] # Kafka config KAFKA_BOOTSTRAP_SERVERS = os.environ.get('KAFKA_BOOTSTRAP_SERVERS') KAFKA_DIGITAL_PRODUCT_TOPIC = os.environ.get( 'KAFKA_DIGITAL_PRODUCT_TOPIC', 'event.owsProductDigital.product') SCHEMA_REGISTRY_URL = os.environ.get('SCHEMA_REGISTRY_URL') # WARNING: Ensure this is the same across dev/qa/prod, otherwise use the env # var DIGITAL_PRODUCT_SCHEMA_VERSION to configure each environment DIGITAL_PRODUCT_SCHEMA_VERSION = '2' NEO4J_URL = os.environ.get('NEO4J_URL') NEO4J_USERNAME = secrets_manager_client.get_cred('NEO4J_USERNAME') NEO4J_PASSWORD = secrets_manager_client.get_cred('NEO4J_PASSWORD') NEO4J_CREATE_SESSION_RETRIES = 5 NEO4J_MAX_RETRY_TIME = os.environ.get('NEO4J_MAX_RETRY_TIME') or 30 # 30s NEO4J_DATABASE_NAME = os.environ.get('NEO4J_DATABASE_NAME') or 'graph.db' # Identities for specific endpoints DELETE_PRODUCT_IDENTITY = os.environ.get( "DELETE_PRODUCT_IDENTITY", "9b0fd375-dd82-4376-bde0-b73b2783ad32" ) DELETE_PRODUCT_NFD_VALUE = os.environ.get( "DELETE_PRODUCT_NFD_VALUE", "SMEAnalyticsDummy" ) UPDATE_DISPLAY_UPC_DDEX_IDENTITY = os.environ.get( "UPDATE_DISPLAY_UPC_IDENTITY", "ca371560-f558-433d-a273-32de264ad66b" ) UPDATE_DISPLAY_UPC_GRPS_IDENTITY = os.environ.get( "UPDATE_DISPLAY_UPC_IDENTITY", "f77aeb04-39ee-4ddc-bebf-a6c9cd86feaa" ) PRODUCT_SOFT_DELETE_IDENTITY = os.environ.get( "PRODUCT_SOFT_DELETE_IDENTITY", "ea17b79e-1728-46fb-8b83-721b25165de3" )