"""Application configuration.""" import logging import os from os.path import abspath, dirname, join, pardir import ddtrace from dotenv import load_dotenv from owsclient import OwsClient from owsrequest.ows_client import correlation_id_getter, request_context_getter from pymysql.constants import CLIENT from python_pdp_sdk.backends import authorization_backend from python_pdp_sdk.connectors.ows_pdp import ows_pdp from secrets_manager.flask_ext import FlaskSecretsManager from sqlalchemy.pool import QueuePool, StaticPool # Load environment variables from a .env file if present dotenv_path = abspath(join(dirname(__file__), pardir, '.env')) load_dotenv(dotenv_path) ddtrace.tracer.enabled = bool(os.getenv('DD_TRACE_ENABLED') != 'false') # Service information SERVICE_NAME = 'ows-permissions' SERVICE_VERSION = '1.0.0' os.environ['SERVICE_NAME'] = SERVICE_NAME # Production environment PROD_ENVIRONMENT = 'prod' DEV_ENVIRONMENT = 'dev' QA_ENVIRONMENT = 'qa' TEST_ENVIRONMENT = 'test' ENVIRONMENT = os.environ.get('Environment') or DEV_ENVIRONMENT secrets_manager_client = FlaskSecretsManager( application_context=False, environment=ENVIRONMENT, service_name=SERVICE_NAME ) # Errors and loggers SENTRY = os.environ.get('SENTRY_DSN') or None LOGGER_LEVEL = logging.INFO LOGGER_NAME = 'ows1' # Generic handlers HEALTH_CHECK = '/hello/' # Swagger documentation path SWAGGER_FILE_PATH = 'spec/ows_permissions-1.0.0.yaml' NEO4J_DATABASE_NAME = os.environ.get('NEO4J_DATABASE_NAME', 'graph.db') NEO4J_URL = os.environ.get('NEO4J_URL') or secrets_manager_client.get_cred('NEO4J_URL') NEO4J_USERNAME = os.environ.get('NEO4J_USERNAME') or secrets_manager_client.get_cred( 'NEO4J_USERNAME' ) NEO4J_PASSWORD = os.environ.get('NEO4J_PASSWORD') or secrets_manager_client.get_cred( 'NEO4J_PASSWORD' ) NEO4J_MAX_RETRY_TIME = os.environ.get('NEO4J_MAX_RETRY_TIME') or 30 # 30s # Neo4j Aura NEO4J_AURA_URL = os.environ.get('NEO4J_AURA_URL') or secrets_manager_client.get_cred( 'NEO4J_AURA_URL' ) NEO4J_AURA_USERNAME = os.environ.get('NEO4J_AURA_USERNAME') or secrets_manager_client.get_cred( 'NEO4J_AURA_USERNAME' ) NEO4J_AURA_PASSWORD = os.environ.get('NEO4J_AURA_PASSWORD') or secrets_manager_client.get_cred( 'NEO4J_AURA_PASSWORD' ) # art_relations database credentials. AR_DB_CREDENTIALS = { 'database': os.environ.get('AR_MYSQL_DATABASE') or secrets_manager_client.get_cred('AR_MYSQL_DATABASE'), 'host': os.environ.get('AR_MYSQL_HOST') or secrets_manager_client.get_cred('AR_MYSQL_HOST'), 'password': os.environ.get('AR_MYSQL_PASSWORD') or secrets_manager_client.get_cred('AR_MYSQL_PASSWORD'), 'port': os.environ.get('AR_MYSQL_PORT') or secrets_manager_client.get_cred('AR_MYSQL_PORT'), 'user': os.environ.get('AR_MYSQL_USER') or secrets_manager_client.get_cred('AR_MYSQL_USER'), } # Database connection configuration. if ENVIRONMENT == TEST_ENVIRONMENT: AR_DB_URL = 'sqlite://' POOL_CLASS = StaticPool CONNECT_ARGS = {'check_same_thread': False} POOL_SIZE = 15 POOL_RECYCLE_MS = 3600 POOL_MAX_OVERFLOW = -1 else: # pragma: no cover # We must explicitly set utf8 encoding for MySQL connections. AR_DB_URL = 'mysql+pymysql://{user}:{password}@{host}/{db}?charset={charset}'.format( user=AR_DB_CREDENTIALS.get('user'), password=AR_DB_CREDENTIALS.get('password'), host=AR_DB_CREDENTIALS.get('host'), db=AR_DB_CREDENTIALS.get('database'), charset='utf8', ) POOL_CLASS = QueuePool POOL_SIZE = 15 POOL_RECYCLE_MS = 3600 # Avoids connections going stale POOL_MAX_OVERFLOW = -1 CONNECT_ARGS = {'client_flag': CLIENT.MULTI_STATEMENTS} AUTH0_MACHINE_CLIENT_ID = secrets_manager_client.get_cred('AUTH0_MACHINE_CLIENT_ID') AUTH0_SETTINGS_APP_CLIENT_ID = secrets_manager_client.get_cred('AUTH0_SETTINGS_APP_CLIENT_ID') AUTH0_INSIGHT_APP_CLIENT_ID = secrets_manager_client.get_cred('AUTH0_INSIGHT_APP_CLIENT_ID') AUTH0_MONEYHUB_APP_CLIENT_ID = secrets_manager_client.get_cred('AUTH0_MONEYHUB_APP_CLIENT_ID') AUTH0_MACHINE_CLIENT_SECRET = secrets_manager_client.get_cred('AUTH0_MACHINE_CLIENT_SECRET') AUTH0_DOMAIN = os.environ.get('AUTH0_DOMAIN', 'dev-orchard.auth0.com') AUTH0_URL = 'https://{}/api/v2/'.format(AUTH0_DOMAIN) AUTH0_CONNECTION = os.environ.get('AUTH0_CONNECTION', 'art-relations') if ENVIRONMENT == TEST_ENVIRONMENT: SEGMENT_WRITE_KEY = 'test-segment-write-key' else: SEGMENT_WRITE_KEY = os.environ.get('SEGMENT_WRITE_KEY') # Redis Caching REDIS_URL = os.environ.get('REDIS_URL') REDIS_CACHE_TTL = os.environ.get('REDIS_CACHE_TTL', 300) # 5 mins def setup_ows_client(environment) -> OwsClient: """Set up ows-client.""" return OwsClient( correlation_id_getter=correlation_id_getter, environment=environment, request_context_getter=request_context_getter, service_name=SERVICE_NAME, ) def setup_authorization_backend( ows_client: OwsClient, ) -> authorization_backend.AuthorizationBackend: """Set up Authorization Backend.""" ows_pdp_client = ows_pdp.OwsPdpClient(ows_client=ows_client) return authorization_backend.PdpAuthorizationBackend(ows_pdp_client) ows_client = setup_ows_client(ENVIRONMENT) pdp_authorization_backend = setup_authorization_backend(ows_client)