"""Configuration of ows-account.""" import logging import os import sys import ddtrace from dotenv import find_dotenv, load_dotenv from owsclient import OwsClient from owsrequest.ows_client import correlation_id_getter, request_context_getter from python_pdp_sdk.backends import authorization_backend from python_pdp_sdk.connectors.ows_pdp import ows_pdp from sqlalchemy.pool import QueuePool, StaticPool dotenv_path = None if 'pytest' in sys.modules: dotenv_path = find_dotenv('.env.test') load_dotenv(dotenv_path) ddtrace.tracer.enabled = bool(os.getenv('DD_TRACE_ENABLED') != 'false') # Service information SERVICE_NAME = 'ows-account' SERVICE_VERSION = '1.0.0' # Health check endpoint HEALTH_CHECK = '/hello/' # Production environment PROD_ENVIRONMENT = 'prod' DEV_ENVIRONMENT = 'dev' QA_ENVIRONMENT = 'qa' TEST_ENVIRONMENT = 'test' ENVIRONMENT = os.environ.get('Environment', TEST_ENVIRONMENT) # Errors and loggers SENTRY = os.environ.get('SENTRY_DSN') LOGGER_LEVEL = logging.INFO LOGGER_NAME = 'ows1' # art_relations database credentials. AR_DB_CREDENTIALS = { 'database': os.environ.get('AR_MYSQL_DATABASE'), 'host': os.environ.get('AR_MYSQL_HOST'), 'password': os.environ.get('AR_MYSQL_PASSWORD'), 'port': os.environ.get('AR_MYSQL_PORT'), 'user': os.environ.get('AR_MYSQL_USER'), } # Database connection configuration. if ENVIRONMENT in [DEV_ENVIRONMENT, QA_ENVIRONMENT, PROD_ENVIRONMENT]: # We must explicitly set utf8 encoding for MySQL connections. _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', ) DB_URL = os.environ.get('DB_URL', _DB_URL) POOL_CLASS = QueuePool POOL_SIZE = 15 POOL_RECYCLE_MS = 3600 # Avoids connections going stale POOL_MAX_OVERFLOW = -1 CONNECT_ARGS = {} else: DB_URL = 'sqlite://' POOL_CLASS = StaticPool CONNECT_ARGS = {'check_same_thread': False} ONLY_LOG_ACCESS_ERRORS = False NEO4J_URL = os.environ.get('NEO4J_URL') NEO4J_USERNAME = os.environ.get('NEO4J_USERNAME') NEO4J_PASSWORD = os.environ.get('NEO4J_PASSWORD') NEO4J_CREATE_SESSION_RETRIES = 5 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') NEO4J_AURA_USERNAME = os.environ.get('NEO4J_AURA_USERNAME') NEO4J_AURA_PASSWORD = os.environ.get('NEO4J_AURA_PASSWORD') # Kafka config KAFKA_BOOTSTRAP_SERVERS = os.environ.get('KAFKA_BOOTSTRAP_SERVERS') KAFKA_OWS_ACCOUNT_ACCOUNTS_TOPIC = os.environ.get( 'KAFKA_OWS_ACCOUNT_ACCOUNTS_TOPIC', 'event.accounts' ) KAFKA_OWS_ACCOUNT_SUBACCOUNTS_TOPIC = os.environ.get( 'KAFKA_OWS_SUBACCOUNT_ACCOUNTS_TOPIC', 'event.subaccounts' ) KAFKA_SECURITY_PROTOCOL = os.environ.get('KAFKA_SECURITY_PROTOCOL', 'SSL') KAFKA_TIMEOUT = os.environ.get('KAFKA_TIMEOUT', 3000) 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)