v1.1.0: Alembic, pytest, домен и документация
- Миграции PostgreSQL через Alembic; DDL убран из lifespan приложения. - Тесты: health, status, ingress Grafana; моки Vault/Grafana/Forgejo. - Пакет onguard24/domain/ (сущности, шина событий), docs/DOMAIN.md. - Обновлены README, CHANGELOG, ARCHITECTURE. Made-with: Cursor
This commit is contained in:
59
onguard24/domain/entities.py
Normal file
59
onguard24/domain/entities.py
Normal file
@ -0,0 +1,59 @@
|
||||
"""Сущности домена (пока без таблиц БД — контракт для следующих версий)."""
|
||||
|
||||
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)
|
||||
Reference in New Issue
Block a user