# [MODULE] Сущности данных конфигурации # @desc: Определяет структуры данных для работы с Superset API # @contracts: # - Проверка валидности URL # - Валидация параметров аутентификации # @coherence: # - Все модели согласованы с API Superset v1 # - Совместимы с клиентскими методами # [IMPORTS] Models from typing import Optional, Dict, Any from pydantic import BaseModel, validator,Field from .utils.logger import SupersetLogger class SupersetConfig(BaseModel): """[CONFIG] Конфигурация подключения к Superset @semantic: Основные параметры подключения к API @invariant: - base_url должен содержать версию API (/v1/) - auth должен содержать все обязательные поля """ base_url: str = Field(..., regex=r'.*/api/v1.*') auth: dict verify_ssl: bool = True timeout: int = 30 logger: Optional[SupersetLogger] = None # [VALIDATOR] Проверка параметров аутентификации @validator('auth') def validate_auth(cls, v): required = {'provider', 'username', 'password', 'refresh'} if not required.issubset(v.keys()): raise ValueError( f"[CONTRACT_VIOLATION] Auth must contain {required}" ) return v class Config: arbitrary_types_allowed = True json_schema_extra = { "example": { "base_url": "https://host/api/v1/", "auth": { "provider": "db", "username": "user", "password": "pass", "refresh": True } } } # [SEMANTIC-TYPE] Конфигурация БД для миграций class DatabaseConfig(BaseModel): """[CONFIG] Параметры трансформации БД при миграции @semantic: Содержит old/new состояние для преобразования @invariant: - Должны быть указаны оба состояния (old/new) - UUID должен соответствовать формату """ database_config: Dict[str, Dict[str, Any]] logger: Optional[SupersetLogger] = None @validator('database_config') def validate_config(cls, v): if not {'old', 'new'}.issubset(v.keys()): raise ValueError( "[COHERENCE_ERROR] Config must contain both old/new states" ) return v class Config: arbitrary_types_allowed = True json_schema_extra = { "example": { "database_config": { "old": { "database_name": "Prod Clickhouse", "sqlalchemy_uri": "clickhousedb+connect://clicketl:XXXXXXXXXX@rgm-s-khclk.hq.root.ad:443/dm", "uuid": "b9b67cb5-9874-4dc6-87bd-354fc33be6f9", "database_uuid": "b9b67cb5-9874-4dc6-87bd-354fc33be6f9", "allow_ctas": "false", "allow_cvas": "false", "allow_dml": "false" }, "new": { "database_name": "Dev Clickhouse", "sqlalchemy_uri": "clickhousedb+connect://dwhuser:XXXXXXXXXX@10.66.229.179:8123/dm", "uuid": "e9fd8feb-cb77-4e82-bc1d-44768b8d2fc2", "database_uuid": "e9fd8feb-cb77-4e82-bc1d-44768b8d2fc2", "allow_ctas": "true", "allow_cvas": "true", "allow_dml": "true" } } } }