# # @SEMANTICS: utility, factory, client, initialization, configuration # @PURPOSE: Централизованно инициализирует клиенты Superset для различных окружений (DEV, PROD, SBX, PREPROD), используя `keyring` для безопасного доступа к паролям. # @DEPENDS_ON: superset_tool.models -> Использует SupersetConfig для создания конфигураций. # @DEPENDS_ON: superset_tool.client -> Создает экземпляры SupersetClient. # @DEPENDS_ON: keyring -> Для безопасного получения паролей. # import keyring from typing import Dict from superset_tool.models import SupersetConfig from superset_tool.client import SupersetClient from superset_tool.utils.logger import SupersetLogger # # --- Начало кода модуля --- # # @PURPOSE: Инициализирует и возвращает словарь клиентов `SupersetClient` для всех предопределенных окружений. # @PRE: `keyring` должен содержать пароли для систем "dev migrate", "prod migrate", "sbx migrate", "preprod migrate". # @PRE: `logger` должен быть валидным экземпляром `SupersetLogger`. # @POST: Возвращает словарь с инициализированными клиентами. # @PARAM: logger: SupersetLogger - Экземпляр логгера для записи процесса. # @RETURN: Dict[str, SupersetClient] - Словарь, где ключ - имя окружения, значение - `SupersetClient`. # @THROW: ValueError - Если пароль для окружения не найден в `keyring`. # @THROW: Exception - При любых других ошибках инициализации. # @RELATION: CREATES_INSTANCE_OF -> SupersetConfig # @RELATION: CREATES_INSTANCE_OF -> SupersetClient def setup_clients(logger: SupersetLogger) -> Dict[str, SupersetClient]: logger.info("[setup_clients][Enter] Starting Superset clients initialization.") clients = {} environments = { "dev": "https://devta.bi.dwh.rusal.com/api/v1/", "prod": "https://prodta.bi.dwh.rusal.com/api/v1/", "sbx": "https://sandboxta.bi.dwh.rusal.com/api/v1/", "preprod": "https://preprodta.bi.dwh.rusal.com/api/v1/" } try: for env_name, base_url in environments.items(): logger.debug("[setup_clients][State] Creating config for environment: %s", env_name.upper()) password = keyring.get_password("system", f"{env_name} migrate") if not password: raise ValueError(f"Пароль для '{env_name} migrate' не найден в keyring.") config = SupersetConfig( env=env_name, base_url=base_url, auth={"provider": "db", "username": "migrate_user", "password": password, "refresh": True}, verify_ssl=False ) clients[env_name] = SupersetClient(config, logger) logger.debug("[setup_clients][State] Client for %s created successfully.", env_name.upper()) logger.info("[setup_clients][Exit] All clients (%s) initialized successfully.", ', '.join(clients.keys())) return clients except Exception as e: logger.critical("[setup_clients][Failure] Critical error during client initialization: %s", e, exc_info=True) raise # # --- Конец кода модуля --- #