新增功能:
- ticket_sql_items模型: 逐条SQL执行记录(状态/耗时/影响行数)
- risk_evaluator.py: 4级风险评估(low/medium/high/critical), 支持MySQL/PG/Redis/Mongo
- Ticket模型: 新增risk_level + workflow_id字段
- 审核引擎签名改造: audit(sql, db_type, instance_id=None) 支持EXPLAIN预检
- 审核超时保护: 10s超时跳过审核, 防止工单创建阻塞
- 工单创建自动风险计算 + 审批流匹配(instance.workflow_id优先)
- SQL items查询API: GET /{ticket_id}/sql-items 含进度统计
- 执行器集成: 执行完成后自动更新SQL items逐条状态
- 通知脱敏: password/secret/token自动掩码, SQL预览截断100字符
- 高危操作强制二次确认: high/critical级别需confirmed=true
- 维护窗口控制: system_settings配置执行时间窗口(支持跨午夜)
- 45个新测试: 风险评估24+通知脱敏5+维护窗口2+SQL分类11+配置2
60 lines
1.8 KiB
Python
60 lines
1.8 KiB
Python
from datetime import datetime
|
|
from pydantic import BaseModel, ConfigDict, Field
|
|
from typing import Optional, Literal
|
|
|
|
|
|
class TicketCreate(BaseModel):
|
|
title: str = Field(..., min_length=5, max_length=200)
|
|
db_type: Literal["mysql", "postgres", "redis", "mongo"]
|
|
instance_id: int
|
|
target_database: str = Field(..., min_length=1)
|
|
sql_content: str = Field(..., min_length=1)
|
|
sql_type: Optional[str] = None
|
|
rollback_sql: Optional[str] = None
|
|
reason: str = Field(..., min_length=5)
|
|
priority: Literal["high", "medium", "low"] = "medium"
|
|
scheduled_at: Optional[datetime] = None
|
|
|
|
|
|
class TicketReview(BaseModel):
|
|
action: Literal["approve", "reject"]
|
|
comment: str = Field(default="", max_length=500)
|
|
|
|
|
|
class TicketResponse(BaseModel):
|
|
id: int
|
|
ticket_no: Optional[str] = None
|
|
title: str
|
|
db_type: str
|
|
instance_id: int
|
|
instance_name: Optional[str] = None
|
|
target_database: str
|
|
sql_content: str
|
|
rollback_sql: Optional[str] = None
|
|
status: str
|
|
priority: str
|
|
risk_level: Optional[str] = "low"
|
|
workflow_id: Optional[int] = None
|
|
applicant_id: int
|
|
applicant_name: Optional[str] = None
|
|
approver_id: Optional[int] = None
|
|
approver_name: Optional[str] = None
|
|
current_approver_name: Optional[str] = None
|
|
reason: Optional[str] = None
|
|
audit_result: Optional[str] = None
|
|
execute_result: Optional[str] = None
|
|
create_time: datetime
|
|
review_time: Optional[datetime] = None
|
|
execute_time: Optional[datetime] = None
|
|
scheduled_at: Optional[datetime] = None
|
|
|
|
model_config = ConfigDict(from_attributes=True)
|
|
|
|
|
|
class TicketListParams(BaseModel):
|
|
page: int = 1
|
|
page_size: int = 10
|
|
status: Optional[str] = None
|
|
db_type: Optional[str] = None
|
|
keyword: Optional[str] = None
|