"""Application configuration.""" import logging import os from os.path import abspath, dirname, join, pardir from abacus_common_logic.constants.constants import DEFAULT_OWS_CLIENT_TIMEOUT from dotenv import load_dotenv from owsclient import OwsClient from owsrequest.ows_client import correlation_id_getter, request_context_getter from python_pdp_sdk.backends.authorization_backend import ( AuthorizationBackend, PdpAuthorizationBackend, ) from python_pdp_sdk.connectors.ows_pdp.ows_pdp import OwsPdpClient from secrets_manager.flask_ext import FlaskSecretsManager # Load environment variables from a .env file if present dotenv_path = abspath(join(dirname(__file__), pardir, '.env')) load_dotenv(dotenv_path) class Config: """Base application configuration. Subclass and override for specific environments. """ # Service information SERVICE_NAME = 'ows-abacus-schedule' SERVICE_VERSION = '1.0.0' # Production environment PROD_ENVIRONMENT = 'prod' DEV_ENVIRONMENT = 'dev' QA_ENVIRONMENT = 'qa' UAT_ENVIRONMENT = 'uat' ENVIRONMENT = os.environ.get('Environment') or DEV_ENVIRONMENT # Errors and loggers SENTRY = os.environ.get('SENTRY_DSN') or None LOGGER_DSN = os.environ.get('LOGGER_DSN') or None LOGGER_LEVEL = logging.INFO LOGGER_NAME = 'ows1' ONLY_LOG_ACCESS_ERRORS = False # Generic handlers HEALTH_CHECK = '/hello/' # Swagger documentation path SWAGGER_FILE_PATH = 'spec/ows_abacus_schedule-1.0.0.yaml' # Mysql database connection MYSQL_DB_USER = os.environ.get('MYSQL_DB_USER') MYSQL_DB_PASS = os.environ.get('MYSQL_DB_PASS') MYSQL_DB_HOST = os.environ.get('MYSQL_DB_HOST') MYSQL_DB_NAME = os.environ.get('MYSQL_DB_NAME', 'royalty_accounting') MYSQL_DB_PORT = os.environ.get('MYSQL_DB_PORT', '3306') MYSQL_DB_PORT = int(MYSQL_DB_PORT) secrets_manager_client = FlaskSecretsManager( application_context=False, environment=Config.ENVIRONMENT, service_name=Config.SERVICE_NAME, force_remote=True if Config.ENVIRONMENT == Config.DEV_ENVIRONMENT else False, ) def get_cred_value(cred_name): """Return secrets value for given cred_name.""" return secrets_manager_client.get_cred(cred_name) if Config.ENVIRONMENT in ( Config.PROD_ENVIRONMENT, Config.QA_ENVIRONMENT, Config.UAT_ENVIRONMENT, ): Config.MYSQL_DB_PASS = get_cred_value('MYSQL_DB_PASS') Config.SENTRY = get_cred_value('SENTRY_DSN') def setup_ows_client(environment) -> OwsClient: """Set up ows-client.""" return OwsClient( environment=environment, service_name='ows-abacus-schedule', timeout=DEFAULT_OWS_CLIENT_TIMEOUT, correlation_id_getter=correlation_id_getter, request_context_getter=request_context_getter, ) def setup_authorization_backend(ows_client: OwsClient) -> AuthorizationBackend: """Set up Authorization Backend.""" ows_pdp_client = OwsPdpClient(ows_client=ows_client) return PdpAuthorizationBackend(ows_pdp_client) ows_client = setup_ows_client(Config.ENVIRONMENT) authorization_backend = setup_authorization_backend(ows_client)