"""Application configuration.""" import json import logging import os from os.path import abspath, dirname, join, pardir from dotenv import load_dotenv from secrets_manager.flask_ext import FlaskSecretsManager from sqlalchemy.pool import NullPool, StaticPool # Load environment variables from a .env file dotenv_path = abspath(join(dirname(__file__), pardir, '.env')) load_dotenv(dotenv_path) # Service information SERVICE_NAME = 'ows-sales-goals' SERVICE_VERSION = '1.0.0' # Production environment PROD_ENVIRONMENT = 'prod' DEV_ENVIRONMENT = 'dev' QA_ENVIRONMENT = 'qa' TEST_ENVIRONMENT = 'test' ENVIRONMENT = os.environ.get('Environment', DEV_ENVIRONMENT) # Swagger documentation path SWAGGER_FILE_PATH = 'spec/ows-sales-goals.yaml' secrets_manager_client = FlaskSecretsManager( application_context=False, environment=ENVIRONMENT, service_name=SERVICE_NAME) # Database # -------- # Connection string SG_DB_CREDENTIALS = { 'database': secrets_manager_client.get_cred('SG_MYSQL_DATABASE'), 'host': secrets_manager_client.get_cred('SG_MYSQL_HOST'), 'password': secrets_manager_client.get_cred('SG_MYSQL_PASSWORD'), 'user': secrets_manager_client.get_cred('SG_MYSQL_USER') } SG_DB_CONNECTION_STRING = ( 'mysql+pymysql://{user}:{password}@{host}/{db}?charset=utf8mb4'.format( user=SG_DB_CREDENTIALS.get('user'), password=SG_DB_CREDENTIALS.get('password'), host=SG_DB_CREDENTIALS.get('host'), db=SG_DB_CREDENTIALS.get('database'))) AR_DB_CREDENTIALS = { 'database': secrets_manager_client.get_cred('AR_MYSQL_DATABASE'), 'host': secrets_manager_client.get_cred('AR_MYSQL_HOST'), 'password': secrets_manager_client.get_cred('AR_MYSQL_PASSWORD'), 'user': secrets_manager_client.get_cred('AR_MYSQL_USER') } AR_DB_CONNECTION_STRING = ( 'mysql+pymysql://{user}:{password}@{host}/{db}?charset=utf8mb4'.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'))) DB_POOLCLASS = NullPool # Errors and loggers SENTRY = secrets_manager_client.get_cred('SENTRY_DSN') or None LOGGER_DSN = os.environ.get('LOGGER_DSN') LOGGER_LEVEL = logging.INFO LOGGER_NAME = 'ows1' # Generic handlers HEALTH_CHECK = '/hello/' # Country data COUNTRY_DATA_PATH = 'spec/countries.yml' # Prod if ENVIRONMENT == PROD_ENVIRONMENT: assert LOGGER_DSN, 'LOGGER_DSN env variable required in prod environment' assert SENTRY, 'SENTRY_DSN env variable required in prod environment' assert SG_DB_CONNECTION_STRING, 'SG_DB_CONNECTION_STRING is missing ' \ 'from the environment' # Test if ENVIRONMENT == TEST_ENVIRONMENT: # Override db connection parameters not to wait for network timeouts on # missing credentials. Such timeouts might be quite high in some # environments. SG_DB_CONNECTION_STRING = 'sqlite://' AR_DB_CONNECTION_STRING = 'sqlite://' DB_POOLCLASS = StaticPool path = os.path.dirname(os.path.dirname(__file__)) def _load_schema(schema_name): file_name = '{name}.schema.json'.format(name=schema_name) with open(os.path.join(path, 'spec', file_name)) as f: return json.load(f) PATCH_SALES_GOALS_SCHEMA = _load_schema('goals-product-patch') POST_SALES_GOALS_SCHEMA = _load_schema('goals-product') POST_SALES_GOALS_TERRITORY_SCHEMA = _load_schema('goals-product-country')