""" Модели данных для Jira тикетов. Автор: Сергей Антропов Сайт: https://devops.org.ru """ from typing import Optional, Dict, Any, List from pydantic import BaseModel, Field class JiraMappingCondition(BaseModel): """Условия для маппинга алерта в Jira тикет.""" severity: Optional[str] = None namespace: Optional[str] = None state: Optional[str] = None status: Optional[str] = None tags: Optional[Dict[str, str]] = None event_severity: Optional[str] = Field(None, alias="event-severity") class JiraMapping(BaseModel): """Маппинг алерта в Jira тикет.""" conditions: JiraMappingCondition project: str = Field(..., description="Ключ проекта Jira") assignee: Optional[str] = Field(None, description="Email исполнителя") issue_type: str = Field("Bug", description="Тип задачи") priority: str = Field("High", description="Приоритет задачи") labels: Optional[List[str]] = Field(None, description="Метки задачи") model_config = {"populate_by_name": True} class JiraSourceMapping(BaseModel): """Маппинг для источника алертов.""" default_project: str = Field(..., description="Проект по умолчанию") default_assignee: Optional[str] = Field(None, description="Исполнитель по умолчанию") default_issue_type: str = Field("Bug", description="Тип задачи по умолчанию") default_priority: str = Field("High", description="Приоритет по умолчанию") mappings: List[JiraMapping] = Field(default_factory=list, description="Список маппингов") class JiraMappingConfig(BaseModel): """Конфигурация маппинга алертов в Jira тикеты.""" alertmanager: Optional[JiraSourceMapping] = None grafana: Optional[JiraSourceMapping] = None zabbix: Optional[JiraSourceMapping] = None class JiraIssue(BaseModel): """Модель Jira тикета.""" project: str = Field(..., description="Ключ проекта") summary: str = Field(..., description="Заголовок тикета") description: str = Field(..., description="Описание тикета") issue_type: str = Field("Bug", description="Тип задачи") assignee: Optional[str] = Field(None, description="Email исполнителя") priority: Optional[str] = Field(None, description="Приоритет задачи") labels: Optional[List[str]] = Field(None, description="Метки задачи") components: Optional[List[str]] = Field(None, description="Компоненты проекта") model_config = { "json_schema_extra": { "examples": [{ "project": "MON", "summary": "[Critical] High CPU Usage - Production", "description": "**Alert:** High CPU Usage\n\n**Severity:** Critical\n\n**Namespace:** production", "issue_type": "Bug", "assignee": "devops-team@example.com", "priority": "Highest", "labels": ["critical", "production", "alertmanager"] }] } }