# [MODULE] Superset Clients Initializer # PURPOSE: Централизованно инициализирует клиенты Superset для различных окружений (DEV, PROD, SBX, PREPROD). # COHERENCE: # - Использует `SupersetClient` для создания экземпляров клиентов. # - Использует `SupersetLogger` для логирования процесса. # - Интегрируется с `keyring` для безопасного получения паролей. # [IMPORTS] Сторонние библиотеки import keyring from typing import Dict # [IMPORTS] Локальные модули from superset_tool.models import SupersetConfig from superset_tool.client import SupersetClient from superset_tool.utils.logger import SupersetLogger # CONTRACT: # PURPOSE: Инициализирует и возвращает словарь клиентов `SupersetClient` для всех предопределенных окружений. # PRECONDITIONS: # - `keyring` должен содержать пароли для систем "dev migrate", "prod migrate", "sandbox migrate", "preprod migrate". # - `logger` должен быть инициализированным экземпляром `SupersetLogger`. # POSTCONDITIONS: # - Возвращает словарь, где ключи - это имена окружений ('dev', 'sbx', 'prod', 'preprod'), # а значения - соответствующие экземпляры `SupersetClient`. # PARAMETERS: # - logger: SupersetLogger - Экземпляр логгера для записи процесса инициализации. # RETURN: Dict[str, SupersetClient] - Словарь с инициализированными клиентами. # EXCEPTIONS: # - Логирует и выбрасывает `Exception` при любой ошибке (например, отсутствие пароля, ошибка подключения). def setup_clients(logger: SupersetLogger) -> Dict[str, SupersetClient]: """Инициализирует и настраивает клиенты для всех окружений Superset.""" # [ANCHOR] CLIENTS_INITIALIZATION logger.info("[INFO][INIT_CLIENTS_START] Запуск инициализации клиентов Superset.") 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(f"[DEBUG][CONFIG_CREATE] Создание конфигурации для окружения: {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(f"[DEBUG][CLIENT_SUCCESS] Клиент для {env_name.upper()} успешно создан.") logger.info(f"[COHERENCE_CHECK_PASSED][INIT_CLIENTS_SUCCESS] Все клиенты ({', '.join(clients.keys())}) успешно инициализированы.") return clients except Exception as e: logger.error(f"[CRITICAL][INIT_CLIENTS_FAILED] Ошибка при инициализации клиентов: {str(e)}", exc_info=True) raise # END_FUNCTION_setup_clients # END_MODULE_init_clients