"""Application configuration.""" import logging import os from urllib.parse import quote import 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.load_dotenv("../.env") # Service information SERVICE_NAME = "ows-product" SERVICE_VERSION = "1.0.0" # Split.io API key SPLITIO_API_KEY = os.environ.get("SPLITIO_API_KEY") # Production environment PROD_ENVIRONMENT = "prod" DEV_ENVIRONMENT = "dev" QA_ENVIRONMENT = "qa" TEST_ENVIRONMENT = "test" ENVIRONMENT = os.environ.get("Environment", DEV_ENVIRONMENT) # Overrides the DynamoDB endpoint when set (e.g. the local docker stack points # this at DynamoDB Local). Unset in deployed envs, so PynamoDB resolves the real # AWS endpoint as before. DYNAMODB_HOST = os.environ.get("DYNAMODB_HOST") # Permissions Platform migration shadow-mode: only emit `would_deny` Datadog metrics # from MigrationAuthorizationBackend in QA/prod. PP_MIGRATION_METRICS_ENABLED = ENVIRONMENT in (QA_ENVIRONMENT, PROD_ENVIRONMENT) secrets_manager_client = FlaskSecretsManager( application_context=False, environment=ENVIRONMENT, service_name=SERVICE_NAME ) # Errors and loggers try: SENTRY = secrets_manager_client.get_cred("SENTRY_DSN") except: # noqa SENTRY = None LOGGER_LEVEL = logging.INFO LOGGER_NAME = "ows1" # Database credentials if ENVIRONMENT == DEV_ENVIRONMENT: DB_CREDENTIALS = { "database": os.environ.get("AR_MYSQL_DATABASE"), "host": os.environ.get("AR_MYSQL_HOST"), "password": quote(str(os.environ.get("AR_MYSQL_PASSWORD"))), "port": os.environ.get("AR_MYSQL_PORT"), "user": os.environ.get("AR_MYSQL_USER"), } else: DB_CREDENTIALS = { "database": secrets_manager_client.get_cred("AR_MYSQL_DATABASE"), "host": secrets_manager_client.get_cred("AR_MYSQL_HOST"), "password": secrets_manager_client.get_cred("AR_MYSQL_PASSWORD"), "port": secrets_manager_client.get_cred("AR_MYSQL_PORT"), "user": secrets_manager_client.get_cred("AR_MYSQL_USER"), } # Database config if ENVIRONMENT == TEST_ENVIRONMENT: DB_URL = "sqlite://" POOL_CLASS = StaticPool else: # pragma: no cover DB_URL = "mysql+pymysql://{user}:{password}@{host}/{db}?charset=utf8mb4".format( user=DB_CREDENTIALS.get("user"), password=DB_CREDENTIALS.get("password"), host=DB_CREDENTIALS.get("host"), db=DB_CREDENTIALS.get("database"), ) POOL_CLASS = QueuePool POOL_SIZE = 15 POOL_RECYCLE_MS = 3600 # Avoids connections going stale POOL_MAX_OVERFLOW = -1 POOL_PRE_PING = False # Generic handlers HEALTH_CHECK = "/hello/" path = os.path.dirname(os.path.dirname(__file__)) # API definition API_DEFINITION = raml_parser.load( os.path.join( path, "spec", "ows_product-{version}.raml".format(version=SERVICE_VERSION) ) ) API_TEST_DEFINITION = raml_parser.load(os.path.join(path, "spec", "test.raml")) LIMIT = os.environ.get("LIMIT", 100) # SQS queue name for UPC provisioner SQS_QUEUE_NAME = "{env}-upc_repository-queue".format(env=ENVIRONMENT) ONLY_LOG_ACCESS_ERRORS = True EXCLUDE_PATH = [ HEALTH_CHECK, "/public/localization/languages", "/lookup/product/ownership/", ]