98 lines
3.9 KiB
Python
98 lines
3.9 KiB
Python
# [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"
|
||
}
|
||
}
|
||
}
|
||
} |