"""Configuration. Configuration and env. variables for analytics microservice. """ import base64 import logging import os from cryptography.hazmat.backends import default_backend from cryptography.hazmat.primitives import serialization from secrets_manager.flask_ext import FlaskSecretsManager SERVICE_NAME = 'ows-legacy-analytics' SERVICE_VERSION = '1.0.0' # Health check HEALTH_CHECK = '/hello/' # Session duration SESSION_DURATION = 60 # List of all our existing enviromments: # # - test: the test environment is used by py.test to perform small adjustments # to the code. For instance: create the tables etc. # # - dev: the dev environment is used for development purposes. It points to # a different set of databases. # # - prod: production environment. Points directly to all our production # servers. TEST_ENVIRONMENT = 'test' DEV_ENVIRONMENT = 'dev' PROD_ENVIRONMENT = 'prod' QA_ENVIRONMENT = 'qa' environment = os.environ.get('Environment', 'dev') secrets_manager_client = FlaskSecretsManager( application_context=False, environment=environment, service_name=SERVICE_NAME) # Database configuration if environment == DEV_ENVIRONMENT: # Redis configuration REDIS_HOST = os.environ.get('REDIS_HOST') REDIS_PORT = os.environ.get('REDIS_PORT') # Sentry SENTRY = os.environ.get('SENTRY_DSN') or None # Spotify SPOTIFY_CLIENT_ID = os.environ.get('SPOTIFY_CLIENT_ID') SPOTIFY_SECRET_ID = os.environ.get('SPOTIFY_SECRET_ID') # Apple Music Kit APPLE_MUSIC_PRIVATE_KEY_PATH = os.environ.get( 'APPLE_MUSIC_PRIVATE_KEY_PATH') if (APPLE_MUSIC_PRIVATE_KEY_PATH and os.path.isfile(APPLE_MUSIC_PRIVATE_KEY_PATH)): with open(APPLE_MUSIC_PRIVATE_KEY_PATH, 'r') as key_file: APPLE_MUSIC_PRIVATE_KEY = key_file.read() else: APPLE_MUSIC_PRIVATE_KEY = os.environ.get('APPLE_MUSIC_PRIVATE_KEY', '') APPLE_MUSIC_KEY_ID = os.environ.get('APPLE_MUSIC_KEY_ID') APPLE_MUSIC_TEAM_ID = os.environ.get('APPLE_MUSIC_TEAM_ID') # Snowflake SNOWFLAKE_ACCOUNT = os.environ.get('SNOWFLAKE_ACCOUNT') SNOWFLAKE_USER = os.environ.get('SNOWFLAKE_USER') SNOWFLAKE_ROLE = os.environ.get('SNOWFLAKE_ROLE') SNOWFLAKE_WAREHOUSE = os.environ.get('SNOWFLAKE_WAREHOUSE') SNOWFLAKE_SCHEMA = os.environ.get('SNOWFLAKE_SCHEMA', 'DEV') SNOWFLAKE_DATABASE = os.environ.get('SNOWFLAKE_DATABASE') else: # Redis configuration REDIS_HOST = secrets_manager_client.get_cred('REDIS_HOST') REDIS_PORT = secrets_manager_client.get_cred('REDIS_PORT') # Sentry SENTRY = secrets_manager_client.get_cred('SENTRY_DSN') or None # Spotify SPOTIFY_CLIENT_ID = secrets_manager_client.get_cred('SPOTIFY_CLIENT_ID') SPOTIFY_SECRET_ID = secrets_manager_client.get_cred('SPOTIFY_SECRET_ID') # Apple Music Kit APPLE_MUSIC_PRIVATE_KEY_PATH = secrets_manager_client.get_cred( 'APPLE_MUSIC_PRIVATE_KEY_PATH') if (APPLE_MUSIC_PRIVATE_KEY_PATH and os.path.isfile(APPLE_MUSIC_PRIVATE_KEY_PATH)): with open(APPLE_MUSIC_PRIVATE_KEY_PATH, 'r') as key_file: APPLE_MUSIC_PRIVATE_KEY = key_file.read() else: APPLE_MUSIC_PRIVATE_KEY = os.environ.get('APPLE_MUSIC_PRIVATE_KEY', '') APPLE_MUSIC_KEY_ID = secrets_manager_client.get_cred('APPLE_MUSIC_KEY_ID') APPLE_MUSIC_TEAM_ID = secrets_manager_client.get_cred( 'APPLE_MUSIC_TEAM_ID') # Snowflake SNOWFLAKE_ACCOUNT = secrets_manager_client.get_cred('SNOWFLAKE_ACCOUNT') SNOWFLAKE_USER = secrets_manager_client.get_cred('SNOWFLAKE_USER') SNOWFLAKE_ROLE = secrets_manager_client.get_cred('SNOWFLAKE_ROLE') SNOWFLAKE_WAREHOUSE = secrets_manager_client.get_cred( 'SNOWFLAKE_WAREHOUSE') SNOWFLAKE_SCHEMA = secrets_manager_client.get_cred('SNOWFLAKE_SCHEMA') SNOWFLAKE_DATABASE = secrets_manager_client.get_cred('SNOWFLAKE_DATABASE') # Logging LOGGER_LEVEL = logging.INFO LOGGER_NAME = 'ows1' LOGGER_DSN = os.environ.get('LOGGER_DSN') if environment == DEV_ENVIRONMENT: SNOWFLAKE_PRIVATE_KEY_PATH = os.environ["HOME"] + "/.ssh/snowflake/rsa_key.p8" try: SNOWFLAKE_PRIVATE_KEY_PATH = ( secrets_manager_client.get_cred("SNOWFLAKE_PRIVATE_KEY_PATH") or SNOWFLAKE_PRIVATE_KEY_PATH ) SNOWFLAKE_KEY_PASSPHRASE = ( secrets_manager_client.get_cred("SNOWFLAKE_KEY_PASSPHRASE") or None ) except Exception: SNOWFLAKE_KEY_PASSPHRASE = None if SNOWFLAKE_KEY_PASSPHRASE: with open(SNOWFLAKE_PRIVATE_KEY_PATH, "rb") as key: p_key = serialization.load_pem_private_key( key.read(), password=SNOWFLAKE_KEY_PASSPHRASE.encode(), backend=default_backend(), ) pkb = p_key.private_bytes( encoding=serialization.Encoding.DER, format=serialization.PrivateFormat.PKCS8, encryption_algorithm=serialization.NoEncryption(), ) SNOWFLAKE_CONNECT_ARGS = {"private_key": pkb} else: SNOWFLAKE_CONNECT_ARGS = {} else: # For QA and PROD environments we use Secrets Manager SNOWFLAKE_PRIVATE_KEY = ( secrets_manager_client.get_cred("SNOWFLAKE_PRIVATE_KEY") or None ) if ( not SNOWFLAKE_PRIVATE_KEY or SNOWFLAKE_PRIVATE_KEY == "dummy" ): # default value set by Terraform when you create a secret # noqa SNOWFLAKE_CONNECT_ARGS = {} else: SNOWFLAKE_CONNECT_ARGS = { "private_key": base64.b64decode( bytes(SNOWFLAKE_PRIVATE_KEY, encoding="utf-8") ) } logging.info("Snowflake private key is set from Secrets Manager.") SNOWFLAKE_POOL_SIZE = 15 # UWSGI number of threads SNOWFLAKE_POOL_RECYCLE = 4 * 55 * 60 # Snowflake timeout: ~4 hours SNOWFLAKE_POOL_MAX_OVERFLOW = 5 SNOWFLAKE_POOL_PRE_PING = False SNOWFLAKE_POOL_RESET_ON_RETURN = None PLACEMENT_URL_FEATURE_FLAG_NAME = 'placement_url' PLAYLIST_METADATA_CACHE_CODES = (200, 400, 404) PLAYLIST_METADATA_CACHE_TTL = int( # A day by default os.environ.get('PLAYLIST_METADATA_CACHE_TTL', 86400)) CURRENT_COMMIT_HASH = os.environ.get('CURRENT_COMMIT_HASH', '') # Enable rules access check for all envs ONLY_LOG_ACCESS_ERRORS = False datadog_secrets_manager_client = FlaskSecretsManager( application_context=False, environment=environment, service_name='datadog', ) DD_API_KEY = datadog_secrets_manager_client.get_cred('DD_API_KEY') DD_APP_KEY = datadog_secrets_manager_client.get_cred('DD_APP_KEY')