"""Application configuration.""" import logging import os from urllib import parse from secrets_manager.python_ext import PythonSecretsManager from sqlalchemy.pool import QueuePool # Service information SERVICE_NAME = "ows-assets" SERVICE_VERSION = "1.0.0" # Production environment PROD_ENVIRONMENT = "prod" DEV_ENVIRONMENT = "dev" QA_ENVIRONMENT = "qa" TEST_ENVIRONMENT = "test" ENVIRONMENT = os.environ["Environment"] ENVIRONMENTS = [TEST_ENVIRONMENT, QA_ENVIRONMENT, DEV_ENVIRONMENT, PROD_ENVIRONMENT] if ENVIRONMENT not in ENVIRONMENTS: raise Exception( f"Invalid environment {ENVIRONMENT}. Valid options are dev, test, qa, or prod." ) # Buckets are either on qa or prod. AWS_ENV = os.environ.get("AWS_ENV", ENVIRONMENT) if ENVIRONMENT in [DEV_ENVIRONMENT, TEST_ENVIRONMENT]: # Credentials os.environ.setdefault("AWS_ACCESS_KEY_ID", "fake_key") os.environ.setdefault("AWS_SECRET_ACCESS_KEY", "fake_secret") os.environ.setdefault("AWS_DEFAULT_REGION", "us-east-1") AWS_DEFAULT_REGION = os.environ.get("AWS_DEFAULT_REGION") or "us-east-1" AWS_REGION = os.environ.get("AWS_REGION") or AWS_DEFAULT_REGION secrets_manager_client = PythonSecretsManager( application_context=False, environment=ENVIRONMENT, service_name=SERVICE_NAME ) # Errors and loggers SENTRY_DSN = os.environ.get("SENTRY_DSN") or None LOGGER_LEVEL = logging.INFO LOGGER_NAME = "ows1" logging.getLogger("ddtrace").setLevel(logging.WARNING) if ENVIRONMENT in [QA_ENVIRONMENT, PROD_ENVIRONMENT]: if not SENTRY_DSN: raise Exception(f"Sentry is not configured in {ENVIRONMENT}") # Database config AR_DB_USER = os.environ["AR_DB_USER"] AR_DB_NAME = os.environ["AR_DB_NAME"] AR_DB_HOST = os.environ["AR_DB_HOST"] AR_DB_PASS = secrets_manager_client.get_cred("AR_DB_PASS").encode("utf-8") AR_DB_CONNECTION_CHARSET = os.environ.get("AR_DB_CONNECTION_CHARSET", default="utf8mb4") AR_DB_URL = f"mysql+pymysql://{AR_DB_USER}:{parse.quote(AR_DB_PASS)}@{AR_DB_HOST}/{AR_DB_NAME}?charset={AR_DB_CONNECTION_CHARSET}" RDS_DB_USER = os.environ["RDS_DB_USER"] RDS_DB_NAME = os.environ["RDS_DB_NAME"] RDS_DB_HOST = os.environ["RDS_DB_HOST"] RDS_DB_PASS = secrets_manager_client.get_cred("RDS_DB_PASS").encode("utf-8") RDS_DB_CONNECTION_CHARSET = os.environ.get( "RDS_DB_CONNECTION_CHARSET", default="utf8mb4" ) RDS_DB_URL = f"mysql+pymysql://{RDS_DB_USER}:{parse.quote(RDS_DB_PASS)}@{RDS_DB_HOST}/{RDS_DB_NAME}?charset={RDS_DB_CONNECTION_CHARSET}" CONNECT_ARGS = { "poolclass": QueuePool, "max_overflow": 5, "pool_recycle": 3600, "pool_size": 15, "echo": bool(os.environ.get("SQLALCHEMY_ECHO", "false").lower() == "true"), } # Redis config REDIS_HOST = os.environ["REDIS_HOST"] REDIS_PORT = int(os.environ.get("REDIS_PORT", 6379)) REDIS_SOCKET_CONNECT_TIMEOUT = float( os.environ.get("REDIS_SOCKET_CONNECT_TIMEOUT", 5.0) ) REDIS_SOCKET_TIMEOUT = float(os.environ.get("REDIS_SOCKET_TIMEOUT", 1.0)) # Generic handlers HEALTH_CHECK = "/hello/" # s3 buckets DEFAULT_BASE_BUCKET_NAME = "orcd-raw-assets" RAW_ASSET_BASE_BUCKET_NAME = os.environ.get( "RAW_ASSET_BASE_BUCKET_NAME", DEFAULT_BASE_BUCKET_NAME ) RAW_ASSETS_BUCKET_NAME = "{env}-{base}".format( env=AWS_ENV, base=RAW_ASSET_BASE_BUCKET_NAME ) ASSET_STORAGE_BUCKET_NAME = "{env}-asset-storage".format(env=AWS_ENV) # Sync Storages SYNC_PHYSYCAL_LOCATION_ID = int(os.environ.get("SYNC_PHYSICAL_LOCATION_ID", 0)) SYNC_STORAGE_DRIVE_ID = int(os.environ.get("SYNC_STORAGE_DRIVE_ID", 0)) # Cloudfront URL if ENVIRONMENT == PROD_ENVIRONMENT: CDN_URL = "https://images.theorchard.io" XLARGE_COVER_CDN_URL = "https://d1d42quv8tscnl.cloudfront.net" else: CDN_URL = "https://qa-images.theorchard.io" XLARGE_COVER_CDN_URL = "https://d14bv7mbq8je1y.cloudfront.net" # iam role to assume IAM_ROLE = os.environ["IAM_ROLE"] STS_TOKEN_DURATION = int(os.environ.get("STS_TOKEN_DURATION", 3600)) # 1 hour MIN_STS_TOKEN_DURATION = 900 ASSET_UPLOAD_PRESIGNED_URL_EXPIRES_IN_SECONDS = 60 * 15 # 15 minutes # Prefix for track stream urls STREAM_URL_PREFIX = os.environ.get("STREAM_URL") # Products Limit DEFAULT_LIMIT = 100 LIMIT = int(os.environ.get("LIMIT") or DEFAULT_LIMIT) # AVL Wowza WOWZA_URL = os.environ.get("WOWZA_URL", "https://wowza.qaorch.com") WOWZA_PATH_PREFIX = os.environ.get("WOWZA_PATH_PREFIX", "hls-cache-test") # EC2 Wowza WOWZA_URL_V2 = os.environ.get("WOWZA_URL_V2", "https://qa-test-wowza.theorchard.io") WOWZA_PATH_PREFIX_V2 = os.environ.get("WOWZA_PATH_PREFIX_V2", "vods3") WOWZA_SHARED_SECRET_V2 = ( secrets_manager_client.get_cred("WOWZA_SHARED_SECRET_V2") or "abc123" ) # Common WOWZA config for v1 and v2. WOWZA_TOKEN_TTL_IN_SECONDS = os.environ.get("WOWZA_TOKEN_TTL_IN_SECONDS", "1000") WOWZA_GRACE_PERIOD = int(os.environ.get("WOWZA_GRACE_PERIOD", 100)) SYSTEM_ORCHARD_USER_ID = os.environ.get("SYSTEM_ORCHARD_USER_ID", "oa:179") # time in seconds to wait for lock when updating asset_upload row(s) for POST /v2/assets ASSET_UPLOAD_UPDATE_LOCK_TIMEOUT = int( os.environ.get("ASSET_UPLOAD_UPDATE_LOCK_TIMEOUT", 90) ) MATCH_AUDIO_DYNAMODB_TABLE_NAME = os.environ["MATCH_AUDIO_DYNAMODB_TABLE_NAME"] IS_REDIS_SSL_ENABLED = os.environ.get("IS_REDIS_SSL_ENABLED") == "true"