import logging import os from cryptography.hazmat.backends import default_backend from cryptography.hazmat.primitives import serialization from secrets_manager.flask_ext import FlaskSecretsManager from snowflake.sqlalchemy import URL from sqlalchemy.pool import NullPool from sqlalchemy.pool import QueuePool # Service information SERVICE_NAME = 'ows-accounting' 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) secrets_manager_client = FlaskSecretsManager( application_context=False, environment=ENVIRONMENT, service_name=SERVICE_NAME) # Errors and loggers SENTRY = os.environ.get('SENTRY_DSN') LOGGER_LEVEL = logging.INFO LOG_FILENAME = os.environ.get('LOG_FILENAME', 'populate_passthru.log') LOGGER_NAME = 'ows1' # Databases ACCOUNTING_STATEMENT_EXPORT_TABLE = os.getenv( 'ACCOUNTING_STATEMENT_EXPORT_TABLE') ACCOUNTING_STATEMENT_ATTACHMENT_TABLE = ( '{}_statement_attachments_success'.format(ENVIRONMENT)) SWF_DOMAIN = '{}_swf_processing_accounting'.format(ENVIRONMENT) CUSTOM_EXPORT_WORKFLOW_TYPE = 'custom_export_processing-accounting' CUSTOM_EXPORT_WORKFLOW_TYPE_VERSION = '1.0' CUSTOM_EXPORT_TASKLIST = 'custom_export_processing-accounting' WORKFLOW_ID_PREFIX = 'custom_export' STATUS_GENERATED = 'GENERATED' STATUS_GENERATING = 'GENERATING' STATUS_PENDING = 'PENDING' STATUS_DOESNOTEXIST = 'DOESNOTEXIST' DEFAULT_WORKFLOW_SERVICE = 'swf' PRESIGNED_URL_EXPIRES = 500 # Database config DB_CONNECTION_URL = ( 'mysql+pymysql://{MYSQL_USER}:{MYSQL_PASSWORD}' '@{MYSQL_HOST}/{MYSQL_DATABASE}').format( MYSQL_USER=os.environ.get('MYSQL_USER'), MYSQL_PASSWORD=os.environ.get('MYSQL_PASSWORD'), MYSQL_HOST=os.environ.get('MYSQL_HOST'), MYSQL_DATABASE=os.environ.get('MYSQL_DATABASE')) ACCOUNTINGFLAT_DB_CONNECTION_URL = ( 'mysql+pymysql://{MYSQL_USER}:{MYSQL_PASSWORD}' '@{MYSQL_HOST}/{MYSQL_DATABASE}').format( MYSQL_USER=os.environ.get('MYSQL_USER'), MYSQL_PASSWORD=os.environ.get('MYSQL_PASSWORD'), MYSQL_HOST=os.environ.get('MYSQL_HOST'), MYSQL_DATABASE=os.environ.get('AF_MYSQL_DATABASE')) POOLCLASS = NullPool # payment holds configurations PAYMENT_HOLDS_DB_URL = os.environ.get('PAYMENT_HOLDS_DB_URL') if ENVIRONMENT == TEST_ENVIRONMENT: DB_CONNECTION_URL = "sqlite://" PAYMENT_HOLDS_DB_URL = "sqlite://" POOLCLASS = None # sqlite does not play nice with NullPool # Snowflake database SNOWFLAKE_ACCOUNT = os.environ.get('SNOWFLAKE_ACCOUNT', '') SNOWFLAKE_USER = os.environ.get('SNOWFLAKE_USER', '') SNOWFLAKE_PASSWORD = os.environ.get('SNOWFLAKE_PASSWORD', '') SNOWFLAKE_ROLE = os.environ.get('SNOWFLAKE_ROLE', '') SNOWFLAKE_DATABASE = os.environ.get('SNOWFLAKE_DATABASE', '') SNOWFLAKE_SCHEMA = os.environ.get('SNOWFLAKE_SCHEMA', '') SNOWFLAKE_WAREHOUSE = os.environ.get('SNOWFLAKE_WAREHOUSE', '') # Default for local dev 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 SNOWFLAKE_DB_URL = URL( account=SNOWFLAKE_ACCOUNT, user=SNOWFLAKE_USER, password=SNOWFLAKE_PASSWORD, database=SNOWFLAKE_DATABASE, schema=SNOWFLAKE_SCHEMA, warehouse=SNOWFLAKE_WAREHOUSE ) 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 = {} SNOWFLAKE_POOL_CLASS = QueuePool SNOWFLAKE_POOL_SIZE = 5 SNOWFLAKE_POOL_MAX_OVERFLOW = -1 SNOWFLAKE_POOL_RECYCLE = 3600 SNOWFLAKE_POOL_PRE_PING = False # Redis config REDIS_HOST = os.environ.get('REDIS_HOST') REDIS_PORT = os.environ.get('REDIS_PORT') # Generic handlers HEALTH_CHECK = '/hello/' # Accounting information ACTIVE_ACCOUNTING_PERIOD = os.environ.get('ACTIVE_ACCOUNTING_PERIOD') DEFAULT_CURRENCY_CODE = 'USD' ONLY_LOG_ACCESS_ERRORS = False