"""Snowflake-related environment configuration. Extracted minimal constants and helpers from integration_scripts.constants.service. No side effects on import; call update_env_values() explicitly when needed. """ from __future__ import annotations from cryptography.hazmat.backends import default_backend from cryptography.hazmat.primitives import serialization import os from typing import Dict # Exposed environment-driven constants 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_DATABASE = os.environ.get("SNOWFLAKE_DATABASE", "") SNOWFLAKE_SCHEMA = os.environ.get("SNOWFLAKE_SCHEMA", "") ENVIRONMENT = os.environ.get("ENVIRONMENT", "").upper() # Optional secrets/connection args (legacy compatibility) SNOWFLAKE_PASSWORD = os.environ.get("SNOWFLAKE_PASSWORD", "") SNOWFLAKE_KEY_PASSPHRASE = os.environ.get("SNOWFLAKE_KEY_PASSPHRASE", "") SNOWFLAKE_PRIVATE_KEY_PATH = os.environ.get("SNOWFLAKE_PRIVATE_KEY_PATH", "") # ----------- Snowflake PEM-key RSA auth ------------------------------------- if SNOWFLAKE_KEY_PASSPHRASE: # Snowflake key if not SNOWFLAKE_PRIVATE_KEY_PATH: try: HOME = os.environ['HOME'] except KeyError: HOME = str( os.environ['HOMEDRIVE'] + os.environ['HOMEPATH'] ).replace('\\', '/') SNOWFLAKE_PRIVATE_KEY_PATH = '{}/.ssh/snowflake/rsa_key.p8'.format( HOME) 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 = {} # Mutable store mirroring legacy pattern ENV_VALUES: Dict[str, str] = {} def update_env_values() -> Dict[str, str]: """Populate and return ENV_VALUES with Snowflake-related settings.""" ENV_VALUES.update({ "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_DATABASE": os.environ.get("SNOWFLAKE_DATABASE", ""), "SNOWFLAKE_SCHEMA": os.environ.get("SNOWFLAKE_SCHEMA", ""), "ENVIRONMENT": os.environ.get("ENVIRONMENT", "").upper(), "SNOWFLAKE_PASSWORD": os.environ.get("SNOWFLAKE_PASSWORD", ""), }) return ENV_VALUES def load_snowflake_private_key() -> None: """Best-effort private key loading hook (no-op if not configured). Mirrors legacy invocation without performing file IO unless env vars are provided. Safe in CI and local environments. """ # Intentionally a no-op placeholder: actual key loading is handled in # the snowflake connector implementation if paths are provided. return None