"""Application configuration.""" import logging.config import os from urllib import parse import httpx from asgi_correlation_id import CorrelationIdFilter from secrets_manager.python_ext import PythonSecretsManager ENVIRONMENT = os.environ.get("Environment", default="dev") PROD_ENVIRONMENT = "prod" QA_ENVIRONMENT = "qa" TEST_ENVIRONMENT = "test" DEV_ENVIRONMENT = "dev" # AsyncM2MTokenManager only works for QA and PROD environments. TOKEN_MANAGER_ENVIRONMENT = ( ENVIRONMENT if ENVIRONMENT not in [DEV_ENVIRONMENT, TEST_ENVIRONMENT] else QA_ENVIRONMENT ) APP_DEBUG: bool = os.environ.get("APP_DEBUG", "0") == "1" SERVICE_NAME = "ows-delivery-metadata" SERVICE_VERSION = "1.0.0" # Secrets manager initialization secrets_manager_client = PythonSecretsManager( application_context=False, environment=ENVIRONMENT, service_name=SERVICE_NAME, ) # Database config # Art relations connector parameters ART_RELATIONS_DB_PASSWORD = os.environ.get("ART_RELATIONS_DB_PASSWORD") or None if ART_RELATIONS_DB_PASSWORD is None: ART_RELATIONS_DB_PASSWORD = secrets_manager_client.get_cred( "ART_RELATIONS_DB_PASSWORD" ) if ART_RELATIONS_DB_PASSWORD: ART_RELATIONS_DB_PASSWORD = parse.quote(ART_RELATIONS_DB_PASSWORD.encode("utf-8")) ART_RELATIONS_DB_DATABASE = ( os.environ.get("ART_RELATIONS_DB_DATABASE") or "art_relations" ) # Direct Delivery connector params DIRECT_DELIVERY_DB_PASSWORD = os.environ.get("DIRECT_DELIVERY_DB_PASSWORD") or None if DIRECT_DELIVERY_DB_PASSWORD is None: DIRECT_DELIVERY_DB_PASSWORD = secrets_manager_client.get_cred( "DIRECT_DELIVERY_DB_PASSWORD" ) if DIRECT_DELIVERY_DB_PASSWORD: DIRECT_DELIVERY_DB_PASSWORD = parse.quote( DIRECT_DELIVERY_DB_PASSWORD.encode("utf-8") ) DIRECT_DELIVERY_DB_DATABASE = ( os.environ.get("DIRECT_DELIVERY_DB_DATABASE") or "direct_delivery" ) SQLALCHEMY_ENGINE_OPTIONS = { "pool_size": 100, "max_overflow": 0, "pool_recycle": 3600, "pool_pre_ping": True, } AR_DB_URL = ( "mysql+aiomysql://{user}:{password}@{host}/{db_name}?charset={charset}".format( user=os.environ.get("ART_RELATIONS_DB_USER"), password=ART_RELATIONS_DB_PASSWORD, host=os.environ.get("ART_RELATIONS_DB_HOST"), db_name=ART_RELATIONS_DB_DATABASE, charset="utf8mb4", ) ) DD_DB_URL = ( "mysql+aiomysql://{user}:{password}@{host}/{db_name}?charset={charset}".format( user=os.environ.get("DIRECT_DELIVERY_DB_USER"), password=DIRECT_DELIVERY_DB_PASSWORD, host=os.environ.get("DIRECT_DELIVERY_DB_HOST"), db_name=DIRECT_DELIVERY_DB_DATABASE, charset="utf8mb4", ) ) DEFAULT_OWS_CLIENT_TIMEOUT = httpx.Timeout( connect=20.0, read=45.0, write=5.0, pool=20.0 ) # graphql headers SERVICE_USER_IDENTITY_ID = os.environ.get("SERVICE_USER_IDENTITY_ID") SERVICE_USER_IDENTITY_UUID = os.environ.get("SERVICE_USER_IDENTITY_UUID") SERVICE_USER_PROFILE_ID = os.environ.get("SERVICE_USER_PROFILE_ID") SERVICE_USER_PROFILE_UUID = os.environ.get("SERVICE_USER_PROFILE_UUID") SERVICE_USER_PROFILE_TYPE = os.environ.get("SERVICE_USER_PROFILE_TYPE") SERVICE_USER_ROLES = os.environ.get("SERVICE_USER_ROLES", "ows_delivery_metadata") # Workstation timed release USE_MERGED_TIMED_RELEASES_LOGIC = ( os.environ.get("USE_MERGED_TIMED_RELEASES_LOGIC", False) == "True" ) # Logging config SENTRY_DSN = os.environ.get("SENTRY_DSN") or None LOG_FORMAT = os.environ.get("LOG_FORMAT", "JSON").lower() LOG_LEVEL = os.environ.get("LOG_LEVEL", "INFO") LOG_SQL_ALCHEMY = bool(os.environ.get("LOG_SQL_ALCHEMY", "false").lower() == "true") logging.config.dictConfig( { "version": 1, "disable_existing_loggers": False, "filters": { "correlation_id": { "()": CorrelationIdFilter, "uuid_length": 32, "default_value": "-", }, }, "formatters": { "json": { "()": "owslogger.logger.DDJsonFormatter", "service_name": SERVICE_NAME, "service_version": SERVICE_VERSION, "env": ENVIRONMENT, }, "standard": { "format": "%(correlation_id)s %(asctime)s [%(levelname)s] %(name)s: %(message)s" }, }, "handlers": { "stream": { "level": LOG_LEVEL, "class": "logging.StreamHandler", "formatter": LOG_FORMAT, "filters": ["correlation_id"], }, "null": { "level": LOG_LEVEL, "class": "logging.NullHandler", }, }, "loggers": { "delivery_metadata": { "handlers": ["stream"], "level": LOG_LEVEL, }, "httpx": {"handlers": ["stream"], "level": LOG_LEVEL}, "sqlalchemy.engine.Engine": { "handlers": ["stream"] if LOG_SQL_ALCHEMY else ["null"], "level": LOG_LEVEL, }, "owsclient": { "handlers": ["stream"], "level": LOG_LEVEL, }, "uvicorn": { "handlers": ["stream"], "level": LOG_LEVEL, }, "uvicorn.access": { "handlers": ["stream"], "level": LOG_LEVEL, }, }, } )