"""Сущности домена (пока без таблиц БД — контракт для следующих версий).""" from __future__ import annotations from datetime import datetime from enum import Enum from typing import Any from uuid import UUID, uuid4 from pydantic import BaseModel, Field class Severity(str, Enum): """Грубая шкала для алертов и инцидентов.""" INFO = "info" WARNING = "warning" CRITICAL = "critical" class Alert(BaseModel): """Нормализованный алерт после парсинга ingress (Grafana и др.).""" id: UUID = Field(default_factory=uuid4) source: str = Field(..., description="grafana, manual, …") external_ref: str | None = Field(None, description="uid правила, fingerprint") title: str = "" severity: Severity = Severity.WARNING labels: dict[str, str] = Field(default_factory=dict) payload: dict[str, Any] = Field(default_factory=dict) received_at: datetime | None = None class Incident(BaseModel): """Инцидент в продукте (отдельно от сырого ingress_events).""" id: UUID = Field(default_factory=uuid4) title: str = "" status: str = Field("open", description="open, acknowledged, resolved, …") severity: Severity = Severity.WARNING alert_ids: list[UUID] = Field(default_factory=list) created_at: datetime | None = None updated_at: datetime | None = None class EscalationStep(BaseModel): """Один шаг цепочки (уведомление, пауза, повтор).""" order: int = 0 kind: str = Field(..., description="notify, wait, repeat, …") config: dict[str, Any] = Field(default_factory=dict) class EscalationPolicy(BaseModel): """Политика эскалации, привязанная к команде/сервису.""" id: UUID = Field(default_factory=uuid4) name: str = "" steps: list[EscalationStep] = Field(default_factory=list)