"""Application configuration.""" import logging import os # Service information SERVICE_NAME = 'ows-store-availability' SERVICE_VERSION = '1.0.0' # Daemon information DAEMON_NAME = os.environ.get('DD_SERVICE') # As we share the codebase, daemon version matches the service version DAEMON_VERSION = SERVICE_VERSION # Production environment PROD_ENVIRONMENT = 'prod' DEV_ENVIRONMENT = 'dev' QA_ENVIRONMENT = 'qa' TEST_ENVIRONMENT = 'test' ENVIRONMENT = os.environ.get('Environment', DEV_ENVIRONMENT) # Daemon specific configuration STORE_ID = os.environ.get('STORE_ID', None) # Errors and loggers SENTRY = os.environ.get('SENTRY_DSN') or None LOGGER_LEVEL = getattr(logging, os.environ.get('LOGGER_LEVEL', 'INFO')) LOGGER_NAME = 'ows1' LOG_FILEPATH = os.environ.get('LOG_FILEPATH', 'main.log') logging.getLogger('ddtrace').setLevel(logging.WARNING) # Thresholds for product availability check tasks in minutes. TASK_PROCESSING_THRESHOLD_MINUTES = 4 # This should be slightly less than scheduled producer run period. TASK_IN_QUEUE_THRESHOLD_MINUTES = 60 * 11 # SQS settings SQS_DEFAULT_REGION = os.environ.get('SQS_DEFAULT_REGION', 'us-east-1') SQS_QUEUE_STORE_AVAILABILITY = '{}-store-availability-polling'.format( ENVIRONMENT) SQS_STORE_SPECIFIC_QUEUE = SQS_QUEUE_STORE_AVAILABILITY + '-{store_id}' # SQS constants below have value in seconds. SQS_MESSAGE_VISIBILITY_TIMEOUT_SECONDS = int(os.environ.get( 'SQS_MESSAGE_VISIBILITY_TIMEOUT', 60)) SQS_WAIT_TIME_SECONDS = int(os.environ.get('SQS_WAIT_TIME_SECONDS', 20)) SQS_MESSAGE_RETENTION_PERIOD_SECONDS = ( TASK_IN_QUEUE_THRESHOLD_MINUTES - 1) * 60 SQS_NUM_MESSAGES_TO_PROCESS = int(os.environ.get( 'SQS_NUM_MESSAGES_TO_PROCESS', 10)) # Redis cache. REDIS_HOST = os.environ.get('REDIS_HOST', '') REDIS_CONFIG = { 'host': REDIS_HOST, 'port': int(os.environ.get('REDIS_PORT', 6379)), 'db': int(os.environ.get('REDIS_DB', 0)), 'decode_responses': True, } # Carveouts response cache TTL in seconds. CARVEOUTS_RESPONSE_CACHE_TTL = int(os.environ.get( 'CARVEOUTS_RESPONSE_CACHE_TTL', 2 * 24 * 60 * 60)) # Generic handlers HEALTH_CHECK = '/hello/' TIMEOUT_CHECK = '/sleep/' # iTMSTransporter related configuration ITUNES_USER = os.environ.get('ITUNES_USER', None) ITUNES_PASSWORD = os.environ.get('ITUNES_PASSWORD', None) ITUNES_CMD_BIN = os.environ.get('ITUNES_CMD_BIN', None) ITUNES_CMD_EXTRA_ARGS = os.environ.get( 'ITUNES_CMD_EXTRA_ARGS', '-Xmx1024m -Xms512m').split(' ') ITUNES_TIMEOUT = int(os.environ.get('ITUNES_TIMEOUT', 60)) # Spotify API auth. SPOTIFY_CLIENT_ID = os.environ.get('SPOTIFY_CLIENT_ID', None) SPOTIFY_CLIENT_SECRET = os.environ.get('SPOTIFY_CLIENT_SECRET', None) # Database DB_CREDENTIALS = { 'user': os.environ.get('MYSQL_USER'), 'password': os.environ.get('MYSQL_PASSWORD'), 'host': os.environ.get('MYSQL_HOST'), 'port': os.environ.get('MYSQL_PORT', '3306'), 'database': os.environ.get('MYSQL_DATABASE'), } DB_CONNECTION_STRING = ( 'mysql+pymysql://{user}:{password}@{host}:{port}/{database}'.format( user=DB_CREDENTIALS.get('user'), password=DB_CREDENTIALS.get('password'), host=DB_CREDENTIALS.get('host'), port=DB_CREDENTIALS.get('port'), database=DB_CREDENTIALS.get('database'))) DB_CONNECT_ARGS = {'charset': 'utf8mb4'} # Default MySQL connection timeout is 8 hours. The configured pool recycle # timeout should be less than that. DB_CONNECTION_POOL_RECYCLE_TIMEOUT = int( os.environ.get('DB_CONNECTION_POOL_RECYCLE_TIMEOUT', 3600)) BASE_DIR = os.path.dirname(__file__) # Environment-specific settings if ENVIRONMENT == TEST_ENVIRONMENT: DB_CONNECTION_STRING = 'sqlite://' DB_CONNECT_ARGS = {} # Make sure we won't run incomplete command even under test env. # Test should fail loudly if the real command was called. ITUNES_CMD_BIN = '/bin/nonexistingcommand' else: assert ITUNES_CMD_BIN, 'ITUNES_CMD_BIN is not set' assert ITUNES_USER, 'ITUNES_USER is not set' assert ITUNES_PASSWORD, 'ITUNES_PASSWORD is not set' assert SPOTIFY_CLIENT_ID, 'SPOTIFY_CLIENT_ID is not set' assert SPOTIFY_CLIENT_SECRET, 'SPOTIFY_CLIENT_SECRET is not set' assert REDIS_HOST, 'REDIS_HOST is not set' if ENVIRONMENT == PROD_ENVIRONMENT: assert all(DB_CREDENTIALS.values()), ( 'DB credentials are not present in the environment') assert DB_CONNECTION_STRING, 'DB_CONNECTION_STRING is empty'