From e29dfb58684d41ad9f2a2d23c1d0d70f4a2b4c0c Mon Sep 17 00:00:00 2001 From: attacker Date: Thu, 25 Jun 2026 01:09:32 +0800 Subject: [PATCH] =?UTF-8?q?docs:=20=E5=85=A8=E9=87=8F=E9=87=8D=E6=96=B0?= =?UTF-8?q?=E8=AF=84=E4=BC=B0=20=E2=80=94=20PROJECT=5FEVALUATION/ROADMAP/T?= =?UTF-8?q?DD=5FPLAN=20=E6=B8=85=E7=A9=BA=E9=87=8D=E5=86=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 基于全项目深度审计(96,102 行 / 374 文件),从 K8s 专项开发全面转向: PROJECT_EVALUATION.md: - 全量评估 8 大功能模块(资产/K8s/发布/监控/自动化/AIOps/审批/系统) - 技术债清单:前端 1026 处 any + 后端 4204 行 kubernetes.go + 1324 行 api.ts - Mock API 缺口:dashboardApi(6) / traceApi(3) / alertCenterApi.silence(1) - 综合评分 83/100 ROADMAP.md: - P0 工程质量:Q1 类型安全治理 / Q2 kubernetes.go 拆分 / Q3 api.ts 拆分 - P1 功能补全:F1 告警静默 / F2 审计导出 / F3 前端 RBAC - P2 架构优化:A1 K8s 路由统一 / A2 告警分布式 / A3 WebSocket 管理 - P3 用户体验:U1 虚拟滚动 / U2 DataTable / U3 i18n / U4 镜像优化 TDD_PLAN.md: - P0-P1 每个模块完整验证用例 - 回归测试基线(10 个核心 API 端点) - 全部改用 Python urllib(避免 shell 引号问题) --- PROJECT_EVALUATION.md | 270 +++++++++---- ROADMAP.md | 497 ++++++++---------------- TDD_PLAN.md | 811 ++++++++++++++++------------------------ backend/AUDIT_REPORT.md | 364 ------------------ 4 files changed, 677 insertions(+), 1265 deletions(-) delete mode 100644 backend/AUDIT_REPORT.md diff --git a/PROJECT_EVALUATION.md b/PROJECT_EVALUATION.md index 88028a0..261a88f 100644 --- a/PROJECT_EVALUATION.md +++ b/PROJECT_EVALUATION.md @@ -1,89 +1,209 @@ -# K8s 管理功能评估基线 +# AIOps 智能运维平台 — 全量项目评估 -> 生成时间: 2026-06-21 | 评估人: Logan + AI +> 最后审计: 2026-06-25 | 审计范围: 全项目(后端/前端/Agent/部署) | 审计人: AI + Logan -## 总体规模 +--- -| 层 | 规模 | -|----|------| -| 后端 `kubernetes.go` | 2583 行 / 99 个函数 / 74 个路由 | -| 后端 `kubernetesclient/client.go` | 1486 行 | -| 前端组件 | 22 个 .tsx / 7498 行 | +## 一、项目规模总览 -## 功能评估 +| 层 | 文件数 | 代码行数 | 语言/框架 | +|----|--------|----------|-----------| +| **后端** | 116 个 .go | **34,485** | Go 1.24 / Gin / GORM / MySQL 8 / Redis 7 | +| **前端** | 237 个 .tsx/.ts | **58,648** | React 19 / TypeScript / Vite / Tailwind / shadcn/ui | +| **Agent** | 21 个 .go | **2,969** | Go 1.24 静态编译 (CGO_ENABLED=0) | +| **合计** | **374** | **96,102** | — | -### ✅ 已完成(90%) +### 关键指标 -| 功能 | 后端 | 前端 | 验证状态 | -|------|:----:|:----:|:--------:| -| 集群 CRUD + 同步 | ✅ | ✅ | ✅ 已验证 | -| 集群表单(名称即 code) | ✅ | ✅ NAME_RE 正则 | ✅ | -| 节点列表 + 实时 metrics | ✅ ListNodes 调 GetNodeMetrics | ✅ ClusterOverviewPage | ⚠️ 实时OK,DB缓存缺 | -| Pod 列表 | ✅ | ✅ | ✅ | -| Deployment 列表/详情 | ✅ | ✅ DeploymentView + DeploymentWorkload | ✅ | -| Deployment view/edit 路由 | ✅ | ✅ /:mode/:kind/:name | ✅ | -| Deployment 伸缩/重启/镜像更新 | ✅ scale/restart/update-image | ✅ | ✅ | -| Deployment 历史版本/回滚 | ✅ revisions/rollback | ✅ | ✅ | -| Pod 日志(实时流) | ✅ GetPodLogs | ✅ PodLogsViewer fetch stream | ✅ | -| Pod 终端 exec | ✅ ExecTerminal(WS) | ✅ PodExecTerminal bash/sh/ash | ✅ | -| Pod 文件浏览 + 下载 + 上传 | ✅ files/list + files/download + files/upload | ✅ PodFileBrowser | ✅ | -| YAML 查看/编辑 | ✅ GetYAML + UpdateYAML | ✅ YamlViewer | ✅ | -| ReplicaSet 列表 | ✅ | ✅ | ✅ | -| Service/Ingress 列表 | ✅ | ✅ | ✅ | -| HPA 列表/创建/删除 | ✅ | ✅ | ✅ | -| ConfigMap/Secret 列表 | ✅ | ✅ | ✅ | -| ConfigMap/Secret 编辑 | ✅ UpdateResourceYAMLNS | ✅ YamlViewer(autoEdit) | ✅ curl 验证 | -| Events 列表 | ✅ ListEvents + GetEventsSummary(M12) | ✅ EventsPage 聚合看板(M12) | ✅ | -| 容量分析 | ✅ GetCapacityAnalysis | ✅ CapacityPage | ✅ | -| kubectl 终端 | ✅ KubectlShell(WS) | ✅ KubectlTerminal | ✅ | -| 拓扑图 | ✅ topology get/save | ✅ TopologyView | ✅ | -| **Node 详情页** | ✅ GetNodeDetail (M10) | ✅ NodeDetailPage | ✅ curl 验证 | -| **StatefulSet/DaemonSet 详情页** | ✅ GetStatefulSetDetail/GetDaemonSetDetail + YAML路由修复 (M11) | ✅ WorkloadViewPage 重写 (M11) | ✅ curl 验证 | -| **多集群资源对比看板** | ✅ GetMultiClusterComparison (M13) | ✅ ClusterComparePage (M13) | ✅ urllib 验证 | -| **Namespace 管理看板** | ✅ GetNamespacesDetail + CRUD (M14) | ✅ NamespaceManagementPage (M14) | ✅ urllib 验证 | +| 指标 | 数量 | +|------|------| +| 后端 API 路由 | **411 条**(GET 171 / POST 144 / DELETE 54 / PUT 41 / PATCH 1) | +| 后端业务模块 | **48 个**(handlers 目录) | +| 数据库表 | **86 张** GORM 映射表 | +| 前端 API 方法 | **352 个**(31 个模块) | +| 前端路由 | **~50 条**(45 个 lazy 组件,零空壳) | +| 前端组件 | **215 个** | +| Agent 采集器 | **11 个**(CPU/Memory/Swap/Disk/DiskIO/Network/Port/ProcessTop/FD/ContextSwitch/HealthProbe) | +| 侧边栏菜单 | **9 个一级 / 42 个二级** | -### ❌ 缺失 / 进行中 +--- -| 功能 | 优先级 | 说明 | -|------|:------:|------| -| Pod 文件上传 | ✅ | P2 | ✅ 已完成 M3 | -| ConfigMap/Secret 编辑 | ✅ | P2 | ✅ 已完成 M4 | -| **Deployment 可视化编辑器** | ✅ | **P1** | **✅ 全部完成 M6-M9 — 三模式(view/edit/yaml) + 5 Tab 编辑器(基本信息/容器信息/存储挂载/高级设置/服务路由)** | -| **YAML 编辑器增强** | **P1** | **✅ 已完成 M6 — CodeMirror 6 语法高亮+行号+折叠+内联模式** | -| CI/CD 集成菜单项 | ✅ | P3 | ✅ 已完成 M5 — 跳转流水线页面 | -| Deployment 暂停更新 | ✅ | P3 | ✅ 已完成 M5 — pause/resume 端点 + 暂停 Badge | +## 二、功能模块评估 -### 📋 Deployment 编辑器现状评估 (2026-06-23) +### 2.1 资产管理 ✅ 完善 -| 组件 | 行数 | 状态 | 说明 | -|------|------|:----:|------| -| `DeploymentWorkload.tsx` | 680 | ✅ 可用 | Shell 框架(header + 三模式切换 + EditModeContainer Tab 系统) | -| `DeploymentView.tsx` | 395 | ✅ 完整 | 查看模式(状态卡片/容器模板/Pod实例/版本历史/RS) | -| `DeploymentEditBasic.tsx` | 340 | ✅ 完成 M6 | 基本信息 Tab — replicas/labels/annotations/selector 编辑 | -| `DeploymentEditContainers.tsx` | 700+ | ✅ 完成 M7 | 完整容器编辑器(工作容器+初始化容器,10+ 字段编辑) | -| `DeploymentEditStorage.tsx` | 437 | ✅ 完成 M8 | 存储挂载 Tab — 6种 volume 类型编辑 + volumeMounts 汇总 | -| `DeploymentEditAdvanced.tsx` | 632 | ✅ 完成 M8 | 高级设置 Tab — 更新策略/调度/容忍/DNS/主机别名/安全上下文 | -| `DeploymentEditService.tsx` | — | ✅ 完成 M9 | 服务/应用路由 Tab — selector 关联 Service + 创建/删除 | -| `YamlViewer.tsx` | 220 | ✅ 升级 M6 | CodeMirror 6 YAML 语法高亮+行号+折叠,弹窗+内联双模式 | -| `DeploymentDetail.tsx` | 719 | 💀 遗留 | **旧版 tab 式详情页,仅 KubernetesWorkloads.tsx 引用,待清理** | -| 后端 GetYAML/UpdateYAML | — | ✅ 完善 | 支持 12 种资源,PUT 直通 K8s API,**纯前端工程无需改后端** | +| 功能 | 后端 | 前端 | 状态 | +|------|:----:|:----:|:----:| +| 服务器 CRUD + CSV 批量导入 | ✅ | ✅ ServerManager (609L) | ✅ | +| WebShell SSH 终端 | ✅ webshell.go (325L) | ✅ xterm.js WebSocket | ✅ | +| 云账号管理(AWS/阿里/华为) | ✅ cloud_sync.go (277L) | ✅ CloudAccountManager | ✅ | +| 域名/区域/平台管理 | ✅ | ✅ | ✅ | +| 云账单 | ✅ billing.go (307L) | ✅ | ✅ | +| Agent 管理(安装/卸载/升级) | ✅ agent.go(624L) + agent_install.go(514L) | ✅ AgentWizard + HostMonitor | ✅ | -**编辑器 5 Tab 模块拆分**: +### 2.2 Kubernetes 管理 ✅ 功能完备 -| Tab | 模块 | 预估代码量 | 核心字段 | -|-----|------|-----------|---------| -| 基本信息 | M6 ✅ | ~340 行 | name/namespace/labels/annotations/replicas | -| 容器信息 | M7 ✅ | ~700 行 | 镜像/资源/端口/环境变量/健康检查/生命周期/安全上下文/卷挂载/初始化容器 | -| 存储挂载 | M8 ✅ | ~437 行 | 6种数据卷(EmptyDir/HostPath/ConfigMap/Secret/PVC/NFS) + volumeMounts汇总 | -| 高级设置 | M8 ✅ | ~632 行 | 更新策略/调度/nodeSelector/tolerations/DNS/主机别名/SA/安全上下文/hostNetwork | -| 服务/应用路由 | M9 ✅ | — | Service(ClusterIP/NodePort/LB) selector关联 + Ingress | -| YAML 编辑器 | M6 ✅ | ~220 行 | CodeMirror 6 语法高亮+行号+折叠 | -| **合计** | **M6-M9 ✅ 全部完成** | **~2700 行** | 纯前端,零后端改动 | +| 功能 | 后端 | 前端 | 状态 | +|------|:----:|:----:|:----:| +| 多集群 CRUD + 同步 + metrics | ✅ kubernetes.go (4204L, 134 函数) | ✅ ClusterOverviewPage | ✅ | +| Deployment 三模式编辑器 | ✅ GetYAML/UpdateYAML | ✅ DeploymentWorkload (773L) + 5 Tab 编辑器 (~2700L) | ✅ | +| StatefulSet/DaemonSet 详情 | ✅ | ✅ WorkloadViewPage (480L) | ✅ | +| Pod 日志/终端/文件浏览 | ✅ WebSocket channel.k8s.io | ✅ PodLogsViewer/PodExecTerminal/PodFileBrowser | ✅ | +| Node 详情(资源分配率) | ✅ GetNodeDetail | ✅ NodeDetailPage (330L) | ✅ | +| 事件聚合看板 | ✅ GetEventsSummary | ✅ EventsPage (480L, recharts) | ✅ | +| 多集群对比 | ✅ GetMultiClusterComparison | ✅ ClusterComparePage (360L) | ✅ | +| Namespace 管理 CRUD | ✅ GetNamespacesDetail | ✅ NamespaceManagementPage (280L) | ✅ | +| kubectl 终端 | ✅ PTY | ✅ KubectlTerminal | ✅ | +| ConfigMap/Secret 编辑 | ✅ UpdateResourceYAMLNS | ✅ YamlViewer(CodeMirror 6) | ✅ | +| YAML 语法高亮编辑器 | ✅ | ✅ CodeMirror 6 | ✅ | -### ⚠️ 已知架构约束 +### 2.3 应用发布 ✅ 完善 -1. **K8s 集群(161/162)是 CentOS 7** — MySQL 8.0 容器跑不了(x86-64-v2),用 hostNetwork + 外部 MySQL -2. **metrics-server 已安装** — `kubectl top nodes` 正常返回 -3. **自研 K8s 客户端** — 不用 client-go,保持轻量 net/http 方案 -4. **两个数据路径**:ListNodes 实时调 API(含 metrics),SyncCluster 写 DB(缺 metrics)→ 前端不同页面读不同路径 -5. **Node 详情页** (M10 ✅) — `GetNodeDetail` handler 返回完整节点信息:container_runtime/architecture/taints/conditions/资源分配率/Pod列表,前端 `NodeDetailPage.tsx` 可视化展示 +| 功能 | 后端 | 前端 | 状态 | +|------|:----:|:----:|:----:| +| CI/CD 流水线(GitLab CI 风格) | ✅ pipeline.go(580L) + pipeline_executor.go(665L) | ✅ PipelineManager(961L) + PipelineEditor(602L) | ✅ | +| SSH 主机 + Kubernetes 双路径 | ✅ | ✅ 流水线横幅 | ✅ | +| 发布配置/凭证/工具 | ✅ credential.go(400L) | ✅ CredentialManager(822L) | ✅ | +| 发布权限 RBAC | ✅ | ✅ | ✅ | + +### 2.4 监控告警 ⚠️ 部分缺口 + +| 功能 | 后端 | 前端 | 状态 | +|------|:----:|:----:|:----:| +| 主机监控(Agent 上报) | ✅ agent.go + health_probe.go | ✅ HostMonitor (1094L, 7 Tab) | ✅ | +| 告警规则引擎 | ✅ alert_engine.go (424L) | ✅ AlertCenter (662L) | ✅ | +| 告警通知(飞书/钉钉/企微/Webhook) | ✅ alert_channels.go (483L) | ✅ AlertContact 管理 | ✅ | +| Prometheus 数据源 + 代理 | ✅ prometheus_datasource.go + proxy | ✅ PrometheusDatasourceManager(829L) | ✅ | +| Zabbix 数据源 + 代理 | ✅ zabbix_proxy.go (284L) | ✅ | ✅ | +| 监控大屏(Grafana 嵌入) | ❌ 无后端 | ⚠️ dashboardApi **6 个方法 mock 桩** | ❌ 需后端 | +| 链路追踪 | ❌ 无后端 | ⚠️ traceApi **3 个方法 mock 桩** | ❌ 需后端 | +| 告警静默 | ❌ 无后端 | ⚠️ alertCenterApi.silence 硬编码 | ❌ 需后端 | + +### 2.5 自动化运维 ✅ 完善 + +| 功能 | 后端 | 前端 | 状态 | +|------|:----:|:----:|:----:| +| 定时任务(CronJob) | ✅ automation_cron.go (411L) | ✅ CronJobManager | ✅ | +| 脚本库(Shell/Python) | ✅ automation_script.go (356L) | ✅ ScriptManager | ✅ | +| 远程执行(Go-native SSH) | ✅ remote_exec.go (309L) | ✅ | ✅ | +| Ansible Playbook | ✅ ansible.go (462L) | ✅ AnsibleWorkflow(886L) | ✅ | + +### 2.6 AIOps 智能 ✅ 基础完善 + +| 功能 | 后端 | 前端 | 状态 | +|------|:----:|:----:|:----:| +| AI 智能助手(6 种 LLM) | ✅ llm_chat.go (349L, SSE 流式) | ✅ AIOpsAssistant(694L) | ✅ | +| 告警分析 | ✅ | ✅ | ✅ | +| 容量预测 | ✅ | ✅ | ✅ | + +### 2.7 资源申请 ✅ 完善 + +| 功能 | 后端 | 前端 | 状态 | +|------|:----:|:----:|:----:| +| 云服务器申请审批 | ✅ | ✅ | ✅ | +| 应用部署申请 | ✅ | ✅ | ✅ | + +### 2.8 系统管理 ✅ 完善 + +| 功能 | 后端 | 前端 | 状态 | +|------|:----:|:----:|:----:| +| 用户/角色权限 (RBAC) | ✅ user.go + user_admin.go + ldap.go(319L) | ✅ SystemManager | ✅ | +| LDAP 集成 | ✅ ldap.go + ldap_users.go(397L) | ✅ | ✅ | +| 操作审计 | ✅ audit.go (360L) | ✅ | ⚠️ 导出功能 TODO | +| 终端审计(WebSSH 录制) | ✅ | ✅ | ✅ | +| 凭证管理 | ✅ credential.go(400L) | ✅ | ✅ | +| 系统设置 | ✅ | ✅ | ✅ | + +--- + +## 三、技术债评估 + +### 3.1 🔴 高优先级 + +| 问题 | 影响 | 范围 | 建议优先级 | +|------|------|------|:----------:| +| `kubernetes.go` 4204 行/134 函数 | 维护困难,合并冲突高发 | 后端 | P0 | +| `api.ts` 1324 行/352 方法 | 前端 API 层难以维护 | 前端 | P0 | +| 前端 **1026 处** `any` 类型 | 类型安全缺失,重构风险高 | 前端全局 | P0 | +| K8s 双路由体系(集群域+Kuboard 域) | 路由冗余 104 条 | 后端 | P1 | +| 25 个 ≥500 行巨型组件 | 拆分困难 | 前端 | P1 | + +### 3.2 🟡 中优先级 + +| 问题 | 数量 | 建议优先级 | +|------|------|:----------:| +| 前端未使用变量/导入(ESLint no-unused-vars) | 218 处 | P1 | +| 前端 console.log/console.error | 93 处(含 token 泄露风险) | P1 | +| 前端 React Hooks exhaustive-deps 缺失 | 38 处 | P1 | +| 后端 `_ =` 忽略错误 | 13 处(3 处中风险) | P2 | +| 前端硬编码内网 IP(10.10.10.75 等) | 6+ 处 | P2 | +| 后端告警引擎单实例 + 无优雅退出 | 多副本会重复告警 | P2 | +| 后端审计导出(CSV/Excel)TODO | 1 处 | P2 | + +### 3.3 🟢 低优先级 + +| 问题 | 数量 | +|------|------| +| 前端 `set-state-in-effect`(潜在无限循环) | 7 处 | +| 前端 `react-hooks/purity`(render 调 Date.now) | 6 处 | +| 前端死代码(HostMonitorDashboard lazy 未挂载) | 1 处 | +| 后端 `exec.Command` + `bash -c`(命令注入面) | 18 处(需审计用户输入路径) | + +### 3.4 Mock API / 未对接后端 + +| 前端 API 模块 | 方法数 | 状态 | 需要 | +|---------------|--------|------|------| +| `dashboardApi`(Grafana 大屏) | 6 | mock 返回空 | 后端 Grafana iframe/embed | +| `traceApi`(链路追踪) | 3 | mock 返回空 | 后端 Jaeger/Tempo 集成 | +| `alertCenterApi.silence` | 1 | 硬编码 `{success:true}` | 后端静默规则 CRUD | + +--- + +## 四、架构评估 + +### 4.1 部署架构 + +| 方式 | 架构 | 容器数 | 状态 | +|------|------|--------|:----:| +| Docker Compose | MySQL+Redis+Backend+Nginx | 4 | ✅ | +| Kubernetes | Embed 单容器 + MySQL/Redis StatefulSet | 3+ | ✅ | +| 独立二进制 | Go embed 前端 | 1 | ✅ | + +### 4.2 镜像体积 + +| 镜像 | 大小 | 评估 | +|------|------|------| +| aiops-backend | 277 MB | ⚠️ 偏大(含 Agent 编译工具链) | +| aiops-frontend | 69.8 MB | ✅ Nginx Alpine | +| aiops-embed | 54.9 MB | ✅ 单文件 | + +### 4.3 数据库架构 + +- **86 张表**,前缀规范统一:`iam_` / `asset_` / `monitor_` / `ops_` / `deploy_` / `ai_` / `sys_` / `kubernetes_` +- GORM AutoMigrate,UTF-8MB4 +- 已做索引审计(20 个重复索引已清理) + +### 4.4 安全 + +| 项 | 状态 | +|----|:----:| +| JWT 认证 | ✅ | +| RBAC 角色权限(后端) | ✅ | +| RBAC 前端按钮级控制 | ❌ 缺失 | +| SQL 注入防护 | ✅ 全参数化 | +| XSS 防护 | ✅ React 默认 | +| HTTPS | ⚠️ 生产未强制 | +| 密码 Bcrypt | ✅ | + +--- + +## 五、综合评分 + +| 维度 | 评分 | 说明 | +|------|:----:|------| +| 功能完整性 | **88/100** | 8 大模块齐全,K8s 管理极为完善;扣分项:监控大屏/链路追踪/告警静默未对接 | +| 代码质量 | **72/100** | 后端规范好(0 panic, 1 TODO);前端 1026 处 any + 218 处未用变量是主要扣分项 | +| 架构设计 | **82/100** | 前后端分离清晰,自研轻量 K8s 客户端;扣分项:kubernetes.go/api.ts 巨型文件 | +| 部署运维 | **85/100** | 三种部署方式 + run.sh 统一入口;扣分项:后端镜像偏大,告警引擎单实例 | +| 用户体验 | **86/100** | 骨架屏 + 页面过渡 + 5 套主题 + 懒加载;扣分项:无 i18n,无虚拟滚动 | +| **综合** | **83/100** | 企业级运维平台,功能覆盖全面,工程治理是当前首要提升方向 | diff --git a/ROADMAP.md b/ROADMAP.md index c80b765..177df4f 100644 --- a/ROADMAP.md +++ b/ROADMAP.md @@ -1,321 +1,199 @@ -# K8s 管理功能演进路线图 +# AIOps 智能运维平台 — 优化路线图 -> 每个模块 = 1 个 cron 周期(6h)可完成的**中等粒度功能**。完成后更新状态。 - -## 当前冲刺:P0 — Metrics 数据贯通 - -### M1: SyncCluster 增加 metrics 采集 [done] -**目标**: 同步时采集 node/pod metrics,写入 DB 的 cpu_usage/memory_usage 字段 - -**后端改动**: -- `SyncCluster` handler 中,`client.ListNodes()` 之后调 `client.GetNodeMetrics()` -- 将 CPU(nanocores→m) / Memory(Ki→Mi) 换算后写入 `kubernetes_nodes.cpu_usage` / `memory_usage`(百分比) -- 同理调 `client.GetPodMetrics()` 写入 Pod 的资源使用 - -**前端改动**: -- `KubernetesClusterDetail.tsx`: 删除 `resourceData` 硬编码,改为从 API 获取真实数据(或展示当前 metrics 快照) -- 资源分布卡片读取 cluster 实际计数(node_count/pod_count 已有) - -**验收标准**: -- [x] SyncCluster 后 DB `kubernetes_nodes` 表 cpu_usage/memory_usage 非零 -- [x] 节点列表页 CPU/内存百分比非零 -- [x] 集群详情页无硬编码 mock 数据 -- [x] curl `/kubernetes-clusters/:id` 返回的 node_count/pod_count 正确 +> 基于全量审计(96,102 行代码 / 374 文件),从「K8s 功能开发」全面转向「工程质量 + 功能补全 + 架构治理」。 +> 最后更新: 2026-06-25 --- -### M2: Pod Metrics 详情页接入 [done] -**目标**: Deployment 详情页和 Pod 列表展示真实 CPU/内存使用 +## 当前状态:功能开发阶段已完成 -**改动**: -- 后端 `ListPods` handler 注入 `GetPodMetrics()`(类似 ListNodes 已有逻辑) -- 前端 Pod 列表表格增加 CPU/内存列 -- DeploymentView 容器详情区域读取 metrics - -**验收标准**: -- [x] Pod 列表有 CPU/内存使用量列 -- [x] Deployment 详情页容器 CPU/内存非 mock +| 大模块 | 完成度 | 说明 | +|--------|:------:|------| +| 资产管理 | 100% | 服务器/云账号/域名/账单/Agent 全功能 | +| Kubernetes 管理 | 100% | M1-M14 全部完成(14 个子模块) | +| 应用发布 | 100% | CI/CD 流水线 + SSH/K8s 双路径 | +| 监控告警 | 80% | Agent 监控 + 告警引擎完善;缺:大屏/链路追踪/告警静默 | +| 自动化运维 | 100% | CronJob/脚本/Ansible | +| AIOps 智能 | 100% | 6 种 LLM + 告警分析 + 容量预测 | +| 系统管理 | 95% | 审计导出 TODO | --- -### M3: Pod 文件上传 [done] -**目标**: PodFileBrowser 增加上传能力 +## P0 — 工程质量治理(最高优先级) -**改动**: -- 后端新增 `POST .../pods/:pod/files/upload` — multipart 表单接收,base64 分块 exec 写入 -- 前端 PodFileBrowser 增加上传按钮 + FormData 上传 -- **重大修复**: `ExecInPod` 从 raw HTTP SPDY(不工作)改为 WebSocket channel.k8s.io 协议(和 ExecTerminal 一致) -- **修复**: BusyBox `ls` 不支持 `--time-style`,解析器改为兼容 BusyBox 默认日期格式 +> 目标:从「能跑」升级到「能维护」。解决前端类型安全和后端巨型文件问题。 + +### Q1: 前端类型安全治理 [pending] + +**问题**: 1026 处 `any` 类型 + 218 处未使用变量 + +**方案**: +1. 建立 `frontend/src/types/` 后端响应类型定义库(当前仅 375 行,覆盖率极低) +2. 按模块定义接口:`types/kubernetes.ts` / `types/server.ts` / `types/pipeline.ts` 等 +3. 逐步将 `any` 替换为具体接口类型 +4. 清理 218 处 `no-unused-vars` +5. 移除 93 处 `console.*`(特别是 `api.ts:280` 泄露 token 的调试日志) +6. 配置 CI `tsc --noEmit` 零错误门禁 **验收标准**: -- [x] 可上传文件到 Pod 容器内 -- [x] 上传后文件列表刷新可见 -- [x] verify 字段返回正确文件大小 +- [ ] `types/` 目录覆盖所有后端响应结构 +- [ ] `any` 类型从 1026 处降至 < 50 处 +- [ ] `npx tsc --noEmit` 零错误 +- [ ] ESLint `no-unused-vars` 降至 < 20 处 +- [ ] `console.*` 降至 < 10 处(仅保留 error 级别) + +### Q2: 后端 kubernetes.go 模块化拆分 [pending] + +**问题**: 单文件 4204 行 / 134 函数,全仓最大文件 + +**方案**: +``` +handlers/kubernetes.go (4204L) + → handlers/k8s_cluster.go (集群 CRUD + 同步 + metrics) + → handlers/k8s_workload.go (Deployment/STS/DS 读写操作) + → handlers/k8s_pod.go (Pod 日志/终端/文件/exec) + → handlers/k8s_yaml.go (通用 YAML get/update) + → handlers/k8s_namespace.go (Namespace CRUD + 配额) + → handlers/k8s_events.go (事件列表 + 聚合) + → handlers/k8s_node.go (Node 详情 + 资源分配) + → handlers/k8s_compare.go (多集群对比) +``` + +**验收标准**: +- [ ] 拆分后单文件不超过 800 行 +- [ ] 所有路由不变,API 响应不变 +- [ ] `go build` 零错误 +- [ ] 411 条路由全部可访问(回归测试) + +### Q3: 前端 api.ts 模块化拆分 [pending] + +**问题**: 单文件 1324 行 / 352 方法 + +**方案**: +``` +services/api.ts (1324L) + → services/api/kubernetes.ts (78 方法) + → services/api/deploy.ts (34 方法) + → services/api/agent.ts (23 方法) + → services/api/alert.ts (21 方法) + → services/api/server.ts (11 方法) + → services/api/cloud.ts (12 方法) + → services/api/index.ts (统一 re-export) +``` + +**验收标准**: +- [ ] 拆分后单文件不超过 300 行 +- [ ] 所有 import 路径正确 +- [ ] `npm run build` 零错误 +- [ ] 352 个 API 方法全部保留 --- -### M4: ConfigMap/Secret 编辑 [done] -**目标**: 目前只读,增加在线编辑能力 +## P1 — 功能补全 -**改动**: -- 后端 `UpdateResourceYAMLNS` 端点已支持 configmaps/secrets(无需改动) -- 前端 `YamlViewer` 增加 `autoEdit` prop — 打开即进入编辑模式 -- `NamespaceResourcePage` ConfigMap/Secret 行增加显式编辑按钮(铅笔图标) -- 统一 `cleanBeforeEdit=true` — 编辑前自动清理 status/managedFields/uid 等只读字段 -- `k8s-yaml-utils.ts` 的 `cleanYAML()` 提供行级清理 +> 目标:消除前端 mock 桩,补全监控模块缺失的后端。 + +### F1: 告警静默规则 [pending] + +**问题**: `alertCenterApi.silence` 硬编码返回 `{success:true}` + +**方案**: +- 后端新增 `alert_silences` 表 + CRUD API +- 告警引擎评估时检查静默规则(匹配 namespace/label/时间窗) +- 前端 AlertCenter 新增「静默规则」Tab **验收标准**: -- [x] 可在线编辑 ConfigMap 并保存 -- [x] 保存后 K8s 中实际生效(curl 验证 label 增删 → GET 确认) +- [ ] 可创建/查看/删除静默规则 +- [ ] 静默期间告警引擎不触发通知 +- [ ] 静默到期自动恢复 + +### F2: 审计日志导出 [pending] + +**问题**: 后端 `audit.go` 导出功能仅返回 JSON(TODO) + +**方案**: +- 实现 CSV/Excel 导出(用 `excelize` 库) +- 前端添加「导出」按钮 + +**验收标准**: +- [ ] 可导出为 Excel 格式 +- [ ] 支持按时间/用户/操作类型筛选导出 + +### F3: 前端 RBAC 按钮级控制 [pending] + +**问题**: 后端 RBAC 完善,但前端无按钮级权限控制 + +**方案**: +- 封装 `` 组件 +- Sidebar 菜单按角色过滤 +- 操作按钮根据权限显示/隐藏 + +**验收标准**: +- [ ] 不同角色看到不同菜单 +- [ ] 无权限按钮自动隐藏 +- [ ] 权限变更后实时生效 --- -### M5: Deployment 暂停更新 + CI/CD 集成 [done] -**目标**: 接通顶部菜单的暂停更新和 CI/CD 按钮 +## P2 — 架构优化 -**改动**: -- 后端 `POST .../deployments/:name/pause` 和 `/resume`(ID 路由 + Kuboard code 路由) -- 客户端 `PauseDeployment()` / `ResumeDeployment()` — PATCH `spec.paused` 布尔字段 -- Deployment 列表 summary 增加 `paused` 字段,前端可读取暂停状态 -- 前端操作菜单增加「暂停更新/恢复更新」动态切换 + 暂停 Badge -- CI/CD 按钮跳转到流水线页面(传递 namespace+deployment 上下文) +### A1: K8s 双路由体系统一 [pending] -**验收标准**: -- [x] 可暂停/恢复 Deployment 滚动更新 -- [x] CI/CD 按钮可跳转到流水线页面 +**问题**: 104 条 K8s 路由存在集群域 `/kubernetes-clusters/:id/...` 和 Kuboard 域 `/kubernetes/:code/...` 两套 + +**方案**: 以 Kuboard code 路由为主,ID 路由保留向后兼容(标记 deprecated) + +### A2: 告警引擎分布式安全 [pending] + +**问题**: 告警引擎用 goroutine + 30s ticker 常驻,多副本会重复告警 + +**方案**: Redis 分布式锁(每轮 ticker 先抢锁),或选主机制 + +### A3: WebSocket 连接统一管理 [pending] + +**问题**: WebShell/kubectl/PodExec/日志流各有 WebSocket 实现 + +**方案**: 封装统一的 WebSocket 管理器(断线重连 + 心跳 + 消息分发) --- -## 当前冲刺:P1 — Deployment 可视化编辑器(Kuboard 风格) +## P3 — 用户体验提升 -### M6: 编辑器基础设施 + 基本信息 Tab + YAML编辑器 [done] -**目标**: 三模式切换(查看/可视化编辑/YAML编辑)+ 基本信息 Tab +### U1: 虚拟滚动 [pending] +- Pod 列表(1000+ Pod 场景)使用 `@tanstack/react-virtual` +- 事件列表、审计日志列表 -**改动**: -- `DeploymentWorkload.tsx`: 模式切换从 2 tab → 3 tab(查看模式 / 编辑模式 / YAML编辑) -- 新增 `DeploymentEditBasic.tsx`: 基本信息 Tab — name/namespace(只读) + replicas/labels/annotations/selector(可编辑) -- `YamlViewer.tsx` 升级: 引入 CodeMirror 6(`@uiw/react-codemirror` + `@codemirror/lang-yaml`),支持 YAML 语法高亮 + 行号 + 折叠 + 括号匹配 -- `YamlViewer.tsx` 新增 `inline` 模式 — 非弹窗内联展示,适合 YAML 编辑 Tab -- `DeploymentDetailPage.tsx`: `mode` 类型扩展为 `'view' | 'edit' | 'yaml'` -- `DeploymentWorkload.tsx` 新增 `EditModeContainer` — 编辑模式 Tab 导航(基本信息✅ / 容器信息M7 / 存储M8 / 高级M8 / 服务M9) -- 路由 `:mode` 参数自动支持 `yaml` 值(无需改 App.tsx 路由表) +### U2: 统一 DataTable 组件 [pending] +- 封装排序/筛选/分页/导出/列自定义的通用表格 +- 替换散布在各页面的手写表格 -**验收标准**: -- [x] 三模式 tab 切换正常,YAML 模式打开 CodeMirror 编辑器 -- [x] 基本信息 Tab 可编辑 labels/annotations/replicas 并保存 -- [x] YAML 编辑器有语法高亮和行号 -- [x] YAML 编辑器支持内联模式(inline prop) -- [x] 编辑模式 Tab 导航系统就绪(M7-M9 预留占位) +### U3: 国际化 (i18n) [pending] +- 提取所有中文文案到 `i18n/zh-CN.json` +- 预留 `en-US.json` 扩展 + +### U4: 后端镜像优化 [pending] +- Backend 277MB → 目标 < 150MB(多阶段构建优化,移除 Agent 编译工具链) +- 或使用 distroless 基础镜像 --- -### M7: 容器信息 Tab(工作容器 + 初始化容器)[done] -**目标**: Kuboard 风格的容器编辑器,替代当前浅层 DeploymentEdit +## 模块状态追踪 -**改动**: -- 新增 `DeploymentEditContainers.tsx`: 容器列表卡片(initContainers + containers) -- 每个容器卡片可编辑: - - 容器镜像 + ImagePullSecret + 镜像拉取策略 - - 命令 (command + args) - - 环境变量(key-value 动态列表) - - 资源需求/限制(CPU/Memory/GPU) - - 端口(name/port/protocol 动态列表) - - 健康检查(liveness/readiness/startup — httpGet/tcpSocket/exec 三种) - - 生命周期回调(postStart/preStop) - - 安全上下文(runAsUser/runAsNonRoot/privileged/capabilities) - - 数据卷挂载(name/mountPath/subPath/readOnly) - -**验收标准**: -- [x] 可添加/删除工作容器和初始化容器 -- [x] 每个容器的所有常规字段可编辑 -- [x] 保存后 K8s 中实际生效 - ---- - -### M8: 存储挂载 + 高级设置 Tab [done] -**目标**: 数据卷定义/挂载 + Deployment 高级调度策略 - -**改动**: -- 新增 `DeploymentEditStorage.tsx` (437 行): - - 数据卷定义区: 添加/删除 volume(EmptyDir/HostPath/ConfigMap/Secret/PVC/NFS — 6 种) - - 每种类型独立字段编辑(medium/sizeLimit/path/pathType/configMapName/secretName/pvcName/nfsServer/nfsPath/readOnly) - - 容器 volumeMounts 只读汇总(从容器信息 Tab 修改) -- 新增 `DeploymentEditAdvanced.tsx` (632 行): - - 更新策略: RollingUpdate(maxSurge/maxUnavailable) / Recreate + revisionHistoryLimit + progressDeadlineSeconds - - 节点调度: nodeSelector (key-value) + tolerations (key/operator/value/effect/tolerationSeconds) - - DNS 配置: dnsPolicy + dnsConfig(nameservers/searches/options) - - 主机别名: hostAliases (ip/hostnames) - - ServiceAccountName + restartPolicy + schedulerName + terminationGracePeriodSeconds - - 主机设置: hostNetwork/hostIPC/hostPID/shareProcessNamespace - - Pod 安全上下文: runAsUser/runAsGroup/fsGroup/runAsNonRoot - -**验收标准**: -- [x] 可定义 6 种数据卷并挂载到容器 -- [x] 可编辑更新策略和调度策略 -- [x] 保存后 K8s 中实际生效(PUT application/yaml 直通 K8s API) -- [x] TypeScript 编译零错误 + Vite 构建成功 -- [x] SPA edit 路由返回 200(非 301) -- [x] YAML API 返回有效 K8s manifest(apiVersion/kind/metadata 齐全) - ---- - -### M9: 服务/应用路由 Tab + 整体联调 [done] -**目标**: Service/Ingress 可视化创建 + 编辑器整体联调 - -**改动**: -- 新增 `DeploymentEditService.tsx`: - - 服务发布: selector 匹配关联 Service(读 spec.selector.matchLabels),支持创建/删除 - - 应用路由: Ingress 关联展示 - - selector 双路径兼容(manifest?.spec?.selector?.matchLabels || manifest?.selector) -- 整体联调: - - 5 Tab 编辑器全部 `available: true`,统一 manifest 数据源 - - 各 Tab 独立保存(PUT application/yaml),保存后刷新 manifest + loadData - - `EditModeContainer` Tab 系统(basic/containers/storage/advanced/service) -- 所有 5 Tab 已在 DeploymentWorkload.tsx EditModeContainer 中接入 - -**验收标准**: -- [x] 可在编辑器内创建/编辑关联 Service -- [x] 5 Tab 编辑的数据合并保存成功(各 Tab 独立 PUT 完整 manifest) -- [x] DeploymentWorkload.tsx 5 Tab 全部 available -- [x] TypeScript 编译零错误 + Vite 构建成功 - ---- - -## 后续规划(P2+) - -### M10: Node 详情页(PID/容器运行时/分配率)[done] -**目标**: 节点名称可点击进入详情页,展示完整的系统信息、资源分配率、污点、条件、Pod 列表 - -**改动**: -- 后端: - - `kubernetesclient/client.go`: 新增 `NodeTaint` / `NodeCondition` 扩展字段 + `NodeInfo` 增加 `architecture`/`operatingSystem` + `GetNode(name)` 方法 - - `kubernetes.go`: 新增 `GetNodeDetail` handler — 获取单个节点详情 + 遍历 Pod 计算资源分配率(CPU/Memory/Pods requested vs allocatable) - - `routes.go`: 注册 `GET /kubernetes/:clusterCode/nodes/:name` (Kuboard code 路由) + `GET /kubernetes-clusters/:id/nodes/:name` (ID 路由) - - 新增 `parseCpuToMilli()` / `parseMemToMi()` 辅助函数(解析 Pod resource requests) -- 前端: - - 新增 `NodeDetailPage.tsx` (~330行) — 节点详情页:系统信息卡片 + 资源分配率卡片(进度条) + 条件卡片 + 污点卡片 + 标签卡片 + Pod 列表 - - `api.ts`: 新增 `getNodeDetail()` 方法 - - `App.tsx`: 新增路由 `:clusterCode/nodes/:nodeName` - - `ClusterOverviewPage.tsx`: 节点名称可点击跳转详情页 - -**验收标准**: -- [x] `GET /kubernetes/:clusterCode/nodes/:name` 返回完整详情(container_runtime/kubelet/os/kernel/architecture) -- [x] 资源分配率正确计算(cpu_alloc_pct/mem_alloc_pct/pod_alloc_pct) -- [x] metrics-server 数据注入(cpu_usage_m/mem_usage_mi) -- [x] 节点条件全量返回(5个 conditions 含 reason/message) -- [x] 污点列表返回 -- [x] 节点上的 Pod 列表返回(含 CPU/内存 requests) -- [x] 前端节点名称可点击跳转 -- [x] SPA 路由返回 200(非 301) -- [x] TypeScript 零编译错误 + Vite 构建成功 - ---- - -### M11: StatefulSet/DaemonSet 详情页 [done] -**目标**: 节点名称可点击进入详情页,展示完整的系统信息、资源分配率、污点、条件、Pod 列表 - -**改动**: -- 后端: - - `routes.go`: 为 statefulsets/daemonsets 注册专门的 YAML 子路由(避免 Gin radix tree 与通配 `/:resource/:name/yaml` 冲突) - - `kubernetes.go`: `GetResourceYAMLNS` / `UpdateResourceYAMLNS` 添加 URL path fallback 提取 resource 类型(当 `c.Param("resource")` 为空时从 URL path 解析) -- 前端: - - `WorkloadViewPage.tsx` 重写 (~480行): - - **Bug 修复**: kind 从 `useLocation().pathname` 提取(原 `params.kind` 永远 undefined — 静态路径段不是 :param) - - **增强**: 更新策略卡片(RollingUpdate partition/maxUnavailable/maxSurge + podManagementPolicy + revisionHistoryLimit) - - **增强**: 选择器与标签卡片(selector.matchLabels + labels + annotations) - - **增强**: VolumeClaimTemplates 表格(StatefulSet 专有 — PVC 模板 name/accessModes/storageClass/size) - - **增强**: Init Containers 展示 - - **增强**: ContainerInfo 子组件(提取重复容器渲染逻辑) - - **增强**: DaemonSet 状态卡片增加"已更新"字段 - - `NamespaceResourcePage.tsx`: `handleDetail` 添加 statefulsets/daemonsets 点击导航(view 模式) - - App.tsx 路由已就绪(`:mode/StatefulSet/:name` + `:mode/DaemonSet/:name`) - - api.ts 方法已就绪(getStatefulSetDetail/getDaemonSetDetail/scaleStatefulSet/restartStatefulSet/restartDaemonSet) - -**验收标准**: -- [x] DS YAML API 返回 200 + apiVersion + kind=DaemonSet(路由冲突修复) -- [x] DS Detail API 返回 name/desired/current/ready/containers -- [x] Deployment YAML API 仍然正常(generic 路由未受影响) -- [x] SPA 路由 view/yaml 两种模式均返回 200 -- [x] TypeScript 零编译错误 + Vite 构建成功 -- [x] NamespaceResourcePage 点击 STS/DS 行可跳转详情页 -- [x] WorkloadViewPage 支持 view/yaml 双模式切换 -- [x] DaemonSet 详情页正确显示 kind=DaemonSet(非 StatefulSet) - ---- - -### 后续(P3+) - -### M12: 事件聚合 + 告警联动 [done] -**目标**: 从扁平事件列表升级为事件聚合看板,支持原因/命名空间/资源类型多维聚合 + 告警联动展示 - -**后端改动**: -- `kubernetesclient/client.go`: EventItem 结构体已有完整字段(InvolvedObject/Type/Reason/Message/Count/FirstTimestamp/LastTimestamp),无需改动 -- `kubernetes.go`: 新增 `GetEventsSummary` handler — 聚合事件统计: - - 按 Reason 聚合(Top 15):统计每种 Warning 原因的累计触发次数 - - 按 Namespace 聚合(Top 15):哪个命名空间告警最多 - - 按 Resource Kind 聚合:Pod/Node/Deployment 等资源类型分布 - - 最新告警事件列表(Top 10 by lastTimestamp) - - 时间窗口过滤(hours 参数:1h/6h/24h/7d/all) -- `routes.go`: 注册 `GET /:clusterCode/events/summary` - -**前端改动**: -- `EventsPage.tsx` 完整重写(~480行): - - 概览卡片:事件总数 / 告警事件累计次数 / 正常事件 / 告警类型数 - - 三维度柱状图(recharts):告警原因 Top-N / 命名空间分布 / 资源类型分布 - - 图表交互:点击柱状图自动过滤事件列表(reason/kind 联动) - - 最新告警面板:红色高亮卡片,展示最近 10 条 Warning 事件 - - 时间窗口选择器(全部/1h/6h/24h/7d) - - 事件列表增强:可展开行(显示首次/最后出现时间 + 事件名称)、告警类型高亮、相对时间显示 - - 已选过滤 Badge(可点击移除) - -**验收标准**: -- [x] `GET /:clusterCode/events/summary` 返回 total/warning_count/normal_count/by_reason/by_namespace/by_kind/recent_warnings -- [x] 时间窗口过滤正常工作(hours=24 只返回近 24h 事件) -- [x] 前端三维度柱状图正确渲染(recharts) -- [x] 点击图表柱可过滤事件列表 -- [x] 最新告警面板展示 Warning 事件 -- [x] 事件列表行可展开查看详情 -- [x] TypeScript 零编译错误 + Vite 构建成功 -- [x] SPA 路由 `/kubernetes/:code/events` 返回 200 - ---- - -| 模块 | 描述 | -|------|------| -| M13 | 多集群资源对比看板 [done] | - -### M13: 多集群资源对比看板 [done] -**目标**: 跨集群资源用量、节点分布、健康状态对比 — 全局视角的多集群运维看板 - -**后端改动**: -- `handlers/kubernetes.go`: 新增 `GetMultiClusterComparison` handler: - - 聚合所有集群的 DB 缓存数据(node_count/pod_count/deployment_count/service_count/cpu_usage/memory_usage) - - 从 `kubernetes_nodes` 表聚合节点级数据:CPU 核数总和、内存总量、master/worker 分布、健康/非健康节点数 - - 集群级别 cpu_usage 为 0 时,用节点平均值回填 - - 返回 `{clusters: [...], totals: {cluster_count, node_count, pod_count, ...}}` -- `routes.go`: 注册 `GET /kubernetes/compare`(全局路由,不属于特定集群) - -**前端改动**: -- 新增 `ClusterComparePage.tsx` (~360行) — 多集群对比看板: - - 概览卡片:集群总数 / 节点总数 / Pod 总数 / Deployment 总数 / Service 总数 - - 资源数量对比柱状图(节点/Pod/Deployment/Service — 4 维度并排) - - CPU/内存使用率对比柱状图(百分比) - - 资源雷达图(多集群 6 维度对比 — 仅 ≥2 集群时显示) - - 节点角色分布饼图(Master/Worker) - - 详细对比表格(可点击行跳转集群概览,含 CPU/内存使用率进度条) -- `api.ts`: 新增 `getMultiClusterComparison()` 方法 -- `App.tsx`: 新增路由 `/kubernetes/compare` -- `Sidebar.tsx`: Kubernetes 菜单新增「多集群对比」入口(Layers 图标) - -**验收标准**: -- [x] `GET /api/v1/kubernetes/compare` 返回 clusters 数组 + totals 聚合 -- [x] totals 包含 cluster_count/node_count/pod_count/deployment_count/service_count -- [x] 每个集群包含 19 个字段(id/name/code/status/node_count/.../total_cpu_cores/total_memory_mb/master_count/worker_count) -- [x] 集群级别 cpu_usage 为 0 时用节点平均值回填 -- [x] 前端 4 类图表正确渲染(柱状图×2 + 雷达图 + 饼图) -- [x] 详细对比表格可点击跳转集群概览 -- [x] TypeScript 零编译错误 + Vite 构建成功 -- [x] SPA 路由 `/kubernetes/compare` 返回 200(非 301/404) +| ID | 模块 | 优先级 | 状态 | +|----|------|:------:|:----:| +| Q1 | 前端类型安全治理 | P0 | pending | +| Q2 | kubernetes.go 拆分 | P0 | pending | +| Q3 | api.ts 拆分 | P0 | pending | +| F1 | 告警静默规则 | P1 | pending | +| F2 | 审计日志导出 | P1 | pending | +| F3 | 前端 RBAC 控制 | P1 | pending | +| A1 | K8s 路由统一 | P2 | pending | +| A2 | 告警引擎分布式 | P2 | pending | +| A3 | WebSocket 管理 | P2 | pending | +| U1 | 虚拟滚动 | P3 | pending | +| U2 | 统一 DataTable | P3 | pending | +| U3 | 国际化 | P3 | pending | +| U4 | 镜像优化 | P3 | pending | --- @@ -328,49 +206,4 @@ pending → in_progress → done / blocked 每个模块完成后: 1. 更新本文件状态 2. 更新 PROJECT_EVALUATION.md 对应行 -3. git commit message 格式: `feat(k8s): M1 SyncCluster metrics 采集` - ---- - -### M14: Namespace 管理看板(资源配额 + 命名空间 CRUD)[done] -**目标**: 从仅返回命名空间名列表升级为完整的命名空间管理看板——含资源统计、配额状态、创建/删除操作 - -**后端改动**: -- `pkg/kubernetesclient/client.go`: - - `ListNamespacesDetailed()` — 返回完整 metadata(status/age/labels/annotations) - - `GetNamespace(name)` — 单个命名空间详情 - - `CreateNamespace(name, labels)` — 创建命名空间 - - `DeleteNamespace(name)` — 删除命名空间 - - `ListResourceQuotas(namespace)` — 支持空 namespace 全集群模式 - - `ListLimitRanges(namespace)` — 支持空 namespace 全集群模式 -- `handlers/kubernetes.go`: - - `GetNamespacesDetail` — 全量命名空间 + 资源计数 + 配额状态(6 次 API 调用聚合,非 N×3) - - `GetNamespaceDetailHandler` — 单命名空间详情 - - `CreateNamespaceHandler` — 创建(系统命名空间保护) - - `DeleteNamespaceHandler` — 删除(kube-system/default/devops 保护) -- `routes.go`: - - `GET /:clusterCode/namespaces/detail` — 全量命名空间详情 - - `GET /:clusterCode/namespace/:namespace/detail` — 单命名空间详情 - - `POST /:clusterCode/namespaces` — 创建命名空间 - - `DELETE /:clusterCode/namespaces/:namespace` — 删除命名空间 - -**前端改动**: -- 新增 `NamespaceManagementPage.tsx` (~280行): - - 概览卡片:命名空间总数 / Deployments / Pods / Services / 配额限制数 - - 命名空间表格:名称(可点击跳转)/ 状态 Badge / 年龄 / Dep/Pod/Svc 计数 / 配额状态 / 标签 / 操作(删除) - - 创建命名空间弹框(名称 + DNS-1123 提示) - - 删除确认弹框(红色警告 + 二次确认) - - 系统命名空间保护(kube-system/default/devops 不可删除) - - 搜索过滤 -- `api.ts`: 新增 4 个方法(getNamespacesDetail/getNamespaceDetail/createNamespace/deleteNamespace) -- `App.tsx`: 新增路由 `kubernetes/:clusterCode/namespaces` -- `ClusterOverviewPage.tsx`: 命名空间区域新增「管理全部」链接 - -**验收标准**: -- [x] `GET /:clusterCode/namespaces/detail` 返回 9 个命名空间(含 status/age/labels/resource_counts) -- [x] 每个命名空间包含 7 个字段(name/status/age/labels/resource_counts/has_resource_quota/has_limit_range) -- [x] 创建命名空间 API 返回 200 + 创建后列表中出现 -- [x] 删除命名空间 API 返回 200 + 删除后列表中消失 -- [x] 系统命名空间删除被拦截(403) -- [x] SPA 路由 `/kubernetes/:code/namespaces` 返回 200 -- [x] TypeScript 零编译错误 + Vite 构建成功 +3. git commit message 格式: `refactor: Q2 kubernetes.go 模块化拆分` diff --git a/TDD_PLAN.md b/TDD_PLAN.md index d5ccaac..3560d17 100644 --- a/TDD_PLAN.md +++ b/TDD_PLAN.md @@ -1,550 +1,373 @@ -# TDD 验证计划 — K8s 管理功能 +# AIOps 验证计划 — 全模块回归测试 -> 每个模块实现前先写验证用例,实现后必须跑通,不能只编译通过。 +> 基于 ROADMAP P0-P3 模块定义,每个模块开发前先写验证用例,实现后必须跑通。 +> 最后更新: 2026-06-25 ## 通用验证流程 ```bash -# 1. 重建后端镜像 -cd /srv/aiops && docker-compose up -d --build backend +# 0. 环境准备 +cd /srv/aiops -# 2. 等待 healthy +# 1. 重建后端 +docker-compose up -d --build backend sleep 10 && docker ps --format '{{.Names}} {{.Status}}' | grep aiops-backend -# 3. 获取 JWT Token -TOKEN=$(curl -s http://127.0.0.1:8080/api/v1/auth/login \ - -H "Content-Type: application/json" \ - -d '{"username":"admin","password":"CHANGE_ME"}' | jq -r '.data.token') +# 2. 获取 JWT Token(用 Python 避免 shell 引号问题) +python3 -c " +import urllib.request, json +login_data = json.dumps({'username': 'admin', 'password': '123456'}).encode() +req = urllib.request.Request('http://127.0.0.1:8080/api/v1/auth/login', data=login_data, method='POST') +req.add_header('Content-Type', 'application/json') +resp = urllib.request.urlopen(req) +print(json.loads(resp.read())['data']['token']) +" > /tmp/aiops_token +TOKEN=$(cat /tmp/aiops_token) -# 4. 验证 API +# 3. 验证后端健康 +curl -s http://127.0.0.1:8080/health | python3 -m json.tool + +# 4. 前端构建 +cd frontend && npm run build 2>&1 | tail -3 +``` + +--- + +## P0-Q1: 前端类型安全治理 + +### 验证用例 + +```bash +# U1: TypeScript 编译零错误 +cd /srv/aiops/frontend && npx tsc --noEmit 2>&1 | tail -5 +# 期望: 退出码 0, 无输出 + +# U2: ESLint any 类型数量 +npx eslint src/ --quiet --format json 2>/dev/null | python3 -c " +import json, sys +data = json.load(sys.stdin) +any_count = sum(1 for r in data for m in r.get('messages', []) if m.get('ruleId') == '@typescript-eslint/no-explicit-any') +print(f'any 类型: {any_count} 处') +# 期望: < 50 +" + +# U3: ESLint unused-vars 数量 +npx eslint src/ --quiet --format json 2>/dev/null | python3 -c " +import json, sys +data = json.load(sys.stdin) +unused = sum(1 for r in data for m in r.get('messages', []) if m.get('ruleId') == '@typescript-eslint/no-unused-vars') +print(f'未使用变量: {unused} 处') +# 期望: < 20 +" + +# U4: console.* 数量 +grep -rn 'console\.\(log\|debug\|info\)' src/ --include='*.ts' --include='*.tsx' | grep -v node_modules | wc -l +# 期望: < 10 + +# U5: api.ts 中无泄露 token 的 console.log +grep -n 'console.*token\|console.*Token' src/services/api.ts +# 期望: 无输出 + +# U6: types/ 目录覆盖率 +wc -l src/types/*.ts +# 期望: > 500 行(当前 375 行) + +# U7: Vite 构建成功 +npm run build 2>&1 | tail -3 +# 期望: built in Ns +``` + +### 通过标准 +- [ ] U1: `tsc --noEmit` 零错误 +- [ ] U2: `any` 类型 < 50 处 +- [ ] U3: 未使用变量 < 20 处 +- [ ] U4: `console.*` < 10 处 +- [ ] U5: api.ts 无 token 泄露 +- [ ] U6: types/ 覆盖率提升 +- [ ] U7: Vite 构建成功 + +--- + +## P0-Q2: 后端 kubernetes.go 模块化拆分 + +### 验证用例 + +```bash +# U1: Go 编译 +cd /srv/aiops/backend && go build ./... 2>&1 +# 期望: 零错误 + +# U2: 拆分后文件行数 +for f in internal/api/handlers/k8s_*.go; do + echo "$(wc -l < "$f") $f" +done | sort -rn +# 期望: 每个文件 < 800 行 + +# U3: 路由总数不变(拆分前后对比) +grep -cE '^\s+(api\.|r\.|router\.|group\.|authorized\.)' internal/api/routes/routes.go +# 期望: 路由数量与拆分前一致 + +# U4: API 回归测试 — 抽样核心端点 +TOKEN=$(cat /tmp/aiops_token) + +# 集群列表 curl -s http://127.0.0.1:8080/api/v1/kubernetes-clusters \ - -H "Authorization: Bearer $TOKEN" | jq '.' -``` + -H "Authorization: Bearer $TOKEN" | python3 -c "import json,sys; d=json.load(sys.stdin); print(f'clusters: {len(d[\"data\"])}')" +# 期望: 返回集群数组 ---- - -## M1: SyncCluster metrics 采集 - -### 验证用例 - -```bash -# U1: 同步前 — 确认 DB 里 cpu_usage 为 0 -docker exec aiops-mysql mysql -uroot -p"$MYSQL_ROOT_PASSWORD" aiops \ - -e "SELECT name, cpu_usage, memory_usage FROM kubernetes_nodes WHERE cluster_id=1" - -# U2: 触发同步 -curl -X POST http://127.0.0.1:8080/api/v1/kubernetes-clusters/1/sync \ - -H "Authorization: Bearer $TOKEN" - -# U3: 同步后 — 确认 cpu_usage/memory_usage 非零 -docker exec aiops-mysql mysql -uroot -p"$MYSQL_ROOT_PASSWORD" aiops \ - -e "SELECT name, cpu_usage, memory_usage FROM kubernetes_nodes WHERE cluster_id=1" -# 期望: cpu_usage > 0 AND memory_usage > 0 - -# U4: 集群详情页 API — 无硬编码 -curl -s http://127.0.0.1:8080/api/v1/kubernetes-clusters/1 \ - -H "Authorization: Bearer $TOKEN" | jq '.data.node_count, .data.pod_count' -# 期望: node_count=2, pod_count>0 - -# U5: 前端构建无报错 -cd /srv/aiops/frontend && npm run build 2>&1 | tail -5 -# 期望: vite build 成功 -``` - -### 通过标准 -- [x] U1: 同步前 cpu_usage=0 -- [x] U2: 同步 API 200 -- [x] U3: 同步后 cpu_usage>0 -- [x] U4: 集群计数正确 -- [x] U5: 前端构建成功 - ---- - -## M2: Pod Metrics - -### 验证用例 -```bash -# 同步后 Pod 列表含 CPU/内存 -curl -s "http://127.0.0.1:8080/api/v1/kubernetes-clusters/1/pods" \ - -H "Authorization: Bearer ***" | jq '.data[0]' -# 期望: 含 cpu_usage_m / mem_usage_mi 字段 -``` - -### 通过标准 -- [x] Pod 列表 API 返回 cpu_usage_m / mem_usage_mi 字段 -- [x] 前端 Pod 列表表格显示 CPU/内存列(KubernetesWorkloads + NamespaceResourcePage) -- [x] 17 个 Pod 全部有真实 metrics 数据 - ---- - -## M3: Pod 文件上传 - -### 验证用例 -```bash -# 上传文件 -echo "test content" > /tmp/test-upload.txt -curl -X POST "http://127.0.0.1:8080/api/v1/kubernetes/1/namespace/devops/pods/aiops-xxx/files/upload?path=/tmp&container=aiops" \ - -H "Authorization: Bearer ***" \ - -F "file=@/tmp/test-upload.txt" -# 期望: 200 + 文件出现在列表中 -``` - -### 通过标准 -- [x] 上传 API 返回 200 + verify 字段匹配文件大小 -- [x] 文件列表 (ls) 能看到上传的文件 -- [x] ExecInPod 使用 WebSocket channel.k8s.io 协议(不再用 SPDY raw HTTP) -- [x] BusyBox ls 解析兼容(Mon DD HH:MM 格式) - ---- - -## M5: Deployment 暂停更新 + CI/CD 集成 - -### 验证用例 -```bash -# U1: 暂停前 — 确认 paused=false +# Deployment 列表 curl -s "http://127.0.0.1:8080/api/v1/kubernetes/prod-cluster/namespace/devops/deployments" \ - -H "Authorization: Bearer $TOKEN" | jq '.data[] | select(.name=="redis") | .paused' -# 期望: false + -H "Authorization: Bearer $TOKEN" | python3 -c "import json,sys; d=json.load(sys.stdin); print(f'deployments: {len(d[\"data\"])}')" +# 期望: 返回 Deployment 数组 -# U2: 暂停 Deployment -curl -X POST "http://127.0.0.1:8080/api/v1/kubernetes/prod-cluster/namespace/devops/deployments/redis/pause" \ - -H "Authorization: Bearer $TOKEN" -# 期望: code=200, msg="已暂停滚动更新" +# Pod 列表 +curl -s "http://127.0.0.1:8080/api/v1/kubernetes/prod-cluster/namespace/devops/pods" \ + -H "Authorization: Bearer $TOKEN" | python3 -c "import json,sys; d=json.load(sys.stdin); print(f'pods: {len(d[\"data\"])}')" +# 期望: 返回 Pod 数组 -# U3: 暂停后 — 确认 paused=true -curl -s "http://127.0.0.1:8080/api/v1/kubernetes/prod-cluster/namespace/devops/deployments" \ - -H "Authorization: Bearer $TOKEN" | jq '.data[] | select(.name=="redis") | .paused' -# 期望: true - -# U4: 恢复 Deployment -curl -X POST "http://127.0.0.1:8080/api/v1/kubernetes/prod-cluster/namespace/devops/deployments/redis/resume" \ - -H "Authorization: Bearer $TOKEN" -# 期望: code=200, msg="已恢复滚动更新" - -# U5: 恢复后 — 确认 paused=false -curl -s "http://127.0.0.1:8080/api/v1/kubernetes/prod-cluster/namespace/devops/deployments" \ - -H "Authorization: Bearer $TOKEN" | jq '.data[] | select(.name=="redis") | .paused' -# 期望: false -``` - -### 通过标准 -- [x] U1: 暂停前 paused=false -- [x] U2: pause API 返回 200 -- [x] U3: 暂停后 paused=true -- [x] U4: resume API 返回 200 -- [x] U5: 恢复后 paused=false -- [x] ID 路由 + Kuboard code 路由均可用 -- [x] 前端操作菜单显示「暂停更新/恢复更新」动态切换 -- [x] CI/CD 发布按钮可跳转到流水线页面 - ---- - -## M6: 编辑器基础设施 + 基本信息 Tab + YAML编辑器 - -### 验证用例 - -```bash -# U1: 三模式路由 SPA fallback 200(非 301/404) -curl -s -o /dev/null -w "%{http_code}" \ - "http://127.0.0.1/kubernetes/prod-cluster/namespace/devops/workload/yaml/Deployment/redis" -# 期望: 200 - -# U2: YAML GET API — CodeMirror 编辑器数据源 +# YAML 获取 curl -s "http://127.0.0.1:8080/api/v1/kubernetes/prod-cluster/namespace/devops/deployments/redis/yaml" \ - -H "Authorization: Bearer *** | head -5 -# 期望: apiVersion: apps/v1 / kind: Deployment / metadata: - -# U3: 前端构建含 CodeMirror 依赖 -curl -s http://127.0.0.1/ | grep -oP 'index-[A-Za-z0-9]+\.js' -# 期望: 新 hash(每次构建变化) - -# U4: TypeScript 编译无错误 -cd frontend && npx tsc --noEmit -# 期望: 退出码 0 - -# U5: Vite 生产构建成功 -cd frontend && npm run build 2>&1 | tail -3 -# 期望: built in Ns -``` - -### 通过标准 -- [x] U1: yaml 路由 SPA fallback 返回 200 -- [x] U2: YAML API 返回有效 K8s manifest(apiVersion/kind/metadata 齐全) -- [x] U3: 前端 bundle 含 CodeMirror(codemirror 关键字在 JS chunk 中) -- [x] U4: TypeScript 零编译错误 -- [x] U5: Vite 生产构建成功 -- [x] YamlViewer 支持弹窗模式 + 内联模式(inline prop) -- [x] DeploymentEditBasic 可编辑 replicas/labels/annotations/selector -- [x] 编辑模式 Tab 导航系统就绪(基本信息可用 + M7-M9 预留) - ---- - -## M7: 容器信息 Tab(工作容器 + 初始化容器) - -### 验证用例 - -```bash -# U1: 登录获取 Token -TOKEN=$(curl -s http://127.0.0.1:8080/api/v1/auth/login \ - -H "Content-Type: application/json" \ - -d '{"username":"admin","password":"admin123"}' | jq -r '.data.token') -# 期望: code=200 - -# U2: YAML GET — 容器编辑器数据源 -curl -s "http://127.0.0.1:8080/api/v1/kubernetes/test-k8s/namespace/devops/deployments/aiops/yaml" \ - -H "Authorization: Bearer $TOKEN" | head -5 -# 期望: apiVersion: apps/v1 / kind: Deployment / containers: - -# U3: PUT YAML 保存(容器编辑器保存路径) -curl -s -X PUT "http://127.0.0.1:8080/api/v1/kubernetes/test-k8s/namespace/devops/deployments/aiops/yaml" \ - -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/yaml" \ - -d "$(curl -s .../aiops/yaml -H "Authorization: Bearer $TOKEN")" -# 期望: code=200 - -# U4: SPA fallback — edit 路由 200(非 301) -curl -s -o /dev/null -w "%{http_code}" \ - "http://127.0.0.1/kubernetes/test-k8s/namespace/devops/workload/edit/Deployment/aiops" -# 期望: 200 - -# U5: TypeScript 编译 + Vite 构建无错误 -cd frontend && npm run build 2>&1 | tail -3 -# 期望: built in Ns - -# U6: 前端 bundle 含 DeploymentEditContainers 组件(新 hash) -curl -s http://127.0.0.1/ | grep -oP 'index-[A-Za-z0-9]+\.js' -# 期望: 新 hash(每次构建变化) -``` - -### 通过标准 -- [x] U1: 登录成功 -- [x] U2: YAML API 返回含 containers 的有效 K8s manifest -- [x] U3: PUT 保存返回 code=200 -- [x] U4: 编辑模式 SPA 路由返回 200(非 301) -- [x] U5: TypeScript 零编译错误 + Vite 构建成功 -- [x] U6: 前端 bundle 已更新(含新组件) -- [x] DeploymentEditContainers 支持工作容器 + 初始化容器增删 -- [x] 每个容器可编辑:镜像/拉取策略/命令/参数/环境变量/端口/资源/健康检查/生命周期/安全上下文/卷挂载 -- [x] 镜像拉取凭证(imagePullSecrets) Pod 级别编辑 -- [x] 三种探针类型(httpGet/tcpSocket/exec)可切换 - ---- - -## M8: 存储挂载 + 高级设置 Tab - -### 验证用例 - -```bash -# U1: 登录获取 Token -TOKEN=$(curl -s http://127.0.0.1:8080/api/v1/auth/login \ - -H "Content-Type: application/json" \ - -d '{"username":"admin","password":"admin123"}' | jq -r '.data.token') - -# U2: SPA fallback — edit 路由返回 200(非 301) -curl -s -o /dev/null -w "%{http_code}" \ - "http://127.0.0.1/kubernetes/prod-cluster/namespace/devops/workload/edit/Deployment/redis" -# 期望: 200 - -# U3: YAML GET API — Storage/Advanced Tab 数据源 -curl -s "http://127.0.0.1:8080/api/v1/kubernetes/prod-cluster/namespace/devops/deployments/redis/yaml" \ - -H "Authorization: Bearer $TOKEN" | head -5 -# 期望: apiVersion: apps/v1 / kind: Deployment / metadata: - -# U4: TypeScript 编译 + Vite 构建 -cd frontend && npx tsc --noEmit && npm run build 2>&1 | tail -3 -# 期望: 零错误 + built in Ns - -# U5: 前端 bundle 含 DeploymentEditStorage + DeploymentEditAdvanced 组件 -curl -s http://127.0.0.1/ | grep -oP 'index-[A-Za-z0-9]+\.js' -# 期望: 新 hash(每次构建变化) -``` - -### 通过标准 -- [x] U1: 登录成功 -- [x] U2: edit 路由 SPA fallback 返回 200 -- [x] U3: YAML API 返回含 spec.strategy/spec.template.spec 的有效 manifest -- [x] U4: TypeScript 零编译错误 + Vite 构建成功 -- [x] U5: 前端 bundle 已更新 -- [x] DeploymentEditStorage 支持 6 种 volume 类型(EmptyDir/HostPath/ConfigMap/Secret/PVC/NFS) -- [x] DeploymentEditAdvanced 支持更新策略/调度/nodeSelector/tolerations/DNS/安全上下文/主机设置/hostAliases/dnsConfig -- [x] 各 Tab 独立保存(PUT application/yaml 直通 K8s API) - ---- - -## M10: Node 详情页(PID/容器运行时/分配率) - -### 验证用例 - -```bash -# U1: 登录获取 Token -TOKEN=$(curl -s http://127.0.0.1:8080/api/v1/auth/login \ - -H "Content-Type: application/json" \ - -d '{"username":"admin","password":"admin123"}' | jq -r '.data.token') - -# U2: Node detail API — Kuboard code route -curl -s "http://127.0.0.1:8080/api/v1/kubernetes/test-k8s/nodes/k8s-master-01" \ - -H "Authorization: Bearer *** | jq '.data.container_runtime' -# 期望: "containerd://2.1.4" - -# U3: 资源分配率字段 -curl -s "http://127.0.0.1:8080/api/v1/kubernetes/test-k8s/nodes/k8s-master-01" \ - -H "Authorization: Bearer *** | jq '.data | {cpu_alloc_pct, mem_alloc_pct, pod_alloc_pct, pod_count}' -# 期望: cpu_alloc_pct/mem_alloc_pct/pod_alloc_pct 均为数字 > 0 - -# U4: conditions + taints + pods 列表 -curl -s "http://127.0.0.1:8080/api/v1/kubernetes/test-k8s/nodes/k8s-master-01" \ - -H "Authorization: Bearer *** | jq '.data | {conditions: (.conditions|length), taints: (.taints|length), pods: (.pods|length)}' -# 期望: conditions>=4, pods>=1 - -# U5: SPA fallback — node detail 路由 200 -curl -s -o /dev/null -w "%{http_code}" \ - "http://127.0.0.1/kubernetes/test-k8s/nodes/k8s-master-01" -# 期望: 200 - -# U6: TypeScript + Vite 构建 -cd frontend && npx tsc --noEmit && npm run build 2>&1 | tail -3 -# 期望: 零错误 + built in Ns -``` - -### 通过标准 -- [x] U1: 登录成功 -- [x] U2: Node detail API 返回 container_runtime/kubelet/os/kernel/architecture -- [x] U3: 资源分配率正确(cpu_alloc_pct/mem_alloc_pct/pod_alloc_pct 数字) -- [x] U4: conditions/taints/pods 列表非空 -- [x] U5: SPA 路由 200(非 301) -- [x] U6: TypeScript 零错误 + Vite 构建成功 -- [x] 前端节点名称可点击跳转详情页 - ---- - -## M9: 服务/应用路由 Tab + 整体联调 - -### 验证用例 - -```bash -# U1: 5 Tab 全部 available(检查 EditModeContainer) -# 验证方式: 浏览器打开 edit 模式,5 个 Tab 均可点击切换 - -# U2: TypeScript 编译 -cd frontend && npx tsc --noEmit -# 期望: 退出码 0 - -# U3: Vite 构建成功 -cd frontend && npm run build 2>&1 | tail -3 -# 期望: built in Ns -``` - -### 通过标准 -- [x] DeploymentEditService.tsx 组件存在且编译通过 -- [x] DeploymentWorkload.tsx EditModeContainer 5 Tab 全部 available -- [x] Service Tab selector 双路径兼容(spec.selector.matchLabels || selector) -- [x] TypeScript 零编译错误 + Vite 构建成功 -- [x] 前端 bundle 已更新 - ---- - -## M11: StatefulSet/DaemonSet 详情页 - -### 验证用例 - -```bash -# U1: 登录获取 Token -TOKEN=$(curl -s http://127.0.0.1:8080/api/v1/auth/login \ - -H "Content-Type: application/json" \ - -d '{"username":"admin","password":"admin123"}' | jq -r '.data.token') - -# U2: DaemonSet YAML API(路由冲突修复验证) -curl -s "http://127.0.0.1:8080/api/v1/kubernetes/prod-cluster/namespace/kube-system/daemonsets/calico-node/yaml" \ - -H "Authorization: Bearer *** | head -3 -# 期望: apiVersion: apps/v1 / kind: DaemonSet / metadata: - -# U3: DaemonSet Detail API -curl -s "http://127.0.0.1:8080/api/v1/kubernetes/prod-cluster/namespace/kube-system/daemonsets/calico-node" \ - -H "Authorization: Bearer *** | jq '.data | {name: .metadata.name, desired: .status.desiredNumberScheduled, ready: .status.numberReady}' -# 期望: name="calico-node", desired=2, ready=2 - -# U4: Deployment YAML 仍正常(generic 路由未受影响) -curl -s "http://127.0.0.1:8080/api/v1/kubernetes/prod-cluster/namespace/devops/deployments/redis/yaml" \ - -H "Authorization: Bearer *** | head -1 + -H "Authorization: Bearer $TOKEN" | head -3 # 期望: apiVersion: apps/v1 -# U5: SPA fallback — workload 路由 200 -curl -s -o /dev/null -w "%{http_code}" \ - "http://127.0.0.1/kubernetes/prod-cluster/namespace/kube-system/workload/view/DaemonSet/calico-node" -# 期望: 200 - -# U6: TypeScript + Vite 构建 -cd frontend && npx tsc --noEmit && npm run build 2>&1 | tail -3 -# 期望: 零错误 + built in Ns -``` - -### 通过标准 -- [x] U2: DS YAML API 返回 200 + apiVersion + kind=DaemonSet(Gin radix tree 路由冲突已修复) -- [x] U3: DS Detail API 返回 name/desired/current/ready/containers -- [x] U4: Deployment YAML API 仍正常(generic `/:resource/:name/yaml` 路由未受影响) -- [x] U5: SPA 路由 view/yaml 两种模式均返回 200 -- [x] U6: TypeScript 零编译错误 + Vite 构建成功 -- [x] NamespaceResourcePage 点击 STS/DS 行可跳转详情页 -- [x] WorkloadViewPage 支持 view/yaml 双模式切换 -- [x] WorkloadViewPage kind 从 useLocation 正确提取(DaemonSet 不被误判为 StatefulSet) -- [x] 更新策略/选择器/PVC模板/InitContainers 全部展示 - ---- - -## M12: 事件聚合 + 告警联动 - -### 验证用例 - -```bash -# U1: 登录获取 Token -TOKEN=*** -s http://127.0.0.1:8080/api/v1/auth/login \ - -H "Content-Type: application/json" \ - -d '{"username":"admin","password":"admin123"}' | jq -r '.data.token') - -# U2: Events Summary API(聚合统计) +# 事件聚合 curl -s "http://127.0.0.1:8080/api/v1/kubernetes/prod-cluster/events/summary" \ - -H "Authorization: Bearer $TOKEN" | jq '.data | {total, warning_count, normal_count, reasons: (.by_reason|length), namespaces: (.by_namespace|length), kinds: (.by_kind|length), recent: (.recent_warnings|length)}' -# 期望: total/warning_count/normal_count 为数字,by_reason/by_namespace/by_kind/recent_warnings 为数组 + -H "Authorization: Bearer $TOKEN" | python3 -c "import json,sys; d=json.load(sys.stdin)['data']; print(f'events total: {d[\"total\"]}')" +# 期望: total 为数字 -# U3: Events Summary 时间窗口过滤 -curl -s "http://127.0.0.1:8080/api/v1/kubernetes/prod-cluster/events/summary?hours=24" \ - -H "Authorization: Bearer $TOKEN" | jq '.data.total' -# 期望: 只返回近 24 小时事件计数 +# 多集群对比 +curl -s "http://127.0.0.1:8080/api/v1/kubernetes/compare" \ + -H "Authorization: Bearer $TOKEN" | python3 -c "import json,sys; d=json.load(sys.stdin)['data']; print(f'clusters compared: {len(d[\"clusters\"])}')" +# 期望: clusters 数组 -# U4: Events List 仍正常 -curl -s "http://127.0.0.1:8080/api/v1/kubernetes/prod-cluster/events" \ - -H "Authorization: Bearer $TOKEN" | jq '.data | length' -# 期望: 返回事件数组 +# Namespace 详情 +curl -s "http://127.0.0.1:8080/api/v1/kubernetes/prod-cluster/namespaces/detail" \ + -H "Authorization: Bearer $TOKEN" | python3 -c "import json,sys; d=json.load(sys.stdin); print(f'namespaces: {len(d[\"data\"])}')" +# 期望: 返回命名空间数组 -# U5: SPA 路由 -curl -s -o /dev/null -w "%{http_code}" http://127.0.0.1:8080/kubernetes/prod-cluster/events -# 期望: 200 - -# U6: TypeScript + Vite 构建 -cd frontend && npx tsc --noEmit && npm run build 2>&1 | tail -3 -# 期望: 零错误 + built in Ns +# U5: 容器重新构建 + 启动 +docker-compose up -d --build backend +sleep 10 +docker ps --format '{{.Names}} {{.Status}}' | grep aiops-backend +# 期望: healthy ``` ### 通过标准 -- [x] U2: Events Summary API 返回完整聚合数据(total/warning_count/normal_count/by_reason/by_namespace/by_kind/recent_warnings) -- [x] U3: 时间窗口过滤正常(hours=24 只统计近 24h) -- [x] U4: Events List API 不受影响 -- [x] U5: SPA 路由返回 200 -- [x] U6: TypeScript 零编译错误 + Vite 构建成功 -- [x] 前端三维度柱状图正确渲染(recharts) -- [x] 图表点击联动过滤事件列表 -- [x] 最新告警面板展示 Warning 事件 +- [ ] U1: `go build` 零错误 +- [ ] U2: 每个拆分文件 < 800 行 +- [ ] U3: 路由数量不变 +- [ ] U4: 7 个核心 API 端点全部返回正确数据 +- [ ] U5: 容器 healthy --- -## M13: 多集群资源对比看板 +## P0-Q3: 前端 api.ts 模块化拆分 ### 验证用例 ```bash -# U1: 登录获取 Token -TOKEN=$(python3 -c " +# U1: 拆分后文件结构 +ls -la /srv/aiops/frontend/src/services/api/ +# 期望: kubernetes.ts, deploy.ts, agent.ts, alert.ts, server.ts, cloud.ts, index.ts + +# U2: 单文件行数 +wc -l /srv/aiops/frontend/src/services/api/*.ts | sort -rn +# 期望: 每个文件 < 300 行 + +# U3: API 方法总数不变 +grep -c 'export const\|async \|: Promise' /srv/aiops/frontend/src/services/api/index.ts +# 期望: re-export 352 个方法 + +# U4: TypeScript 编译 +cd /srv/aiops/frontend && npx tsc --noEmit +# 期望: 零错误 + +# U5: Vite 构建 +npm run build 2>&1 | tail -3 +# 期望: built in Ns + +# U6: 所有 import 路径正确(无断链) +grep -rn "from.*services/api" src/ | head -20 +# 期望: 所有引用正常解析 +``` + +### 通过标准 +- [ ] U1: api/ 目录结构正确 +- [ ] U2: 每个文件 < 300 行 +- [ ] U3: 352 个方法全部保留 +- [ ] U4: `tsc --noEmit` 零错误 +- [ ] U5: Vite 构建成功 +- [ ] U6: 所有 import 正常 + +--- + +## P1-F1: 告警静默规则 + +### 验证用例 + +```bash +TOKEN=$(cat /tmp/aiops_token) + +# U1: 创建静默规则 +curl -s -X POST "http://127.0.0.1:8080/api/v1/alerts/silences" \ + -H "Authorization: Bearer $TOKEN" \ + -H "Content-Type: application/json" \ + -d '{ + "name": "维护窗口静默", + "matchers": [{"key": "namespace", "value": "devops"}], + "starts_at": "2026-06-25T10:00:00Z", + "ends_at": "2026-06-25T12:00:00Z" + }' | python3 -m json.tool +# 期望: code=200 + +# U2: 查询静默规则列表 +curl -s "http://127.0.0.1:8080/api/v1/alerts/silences" \ + -H "Authorization: Bearer $TOKEN" | python3 -c "import json,sys; d=json.load(sys.stdin); print(f'silences: {len(d[\"data\"])}')" +# 期望: >= 1 + +# U3: 静默期间告警不触发通知(需要模拟告警条件) +# 手动验证: 创建一个会匹配静默规则的告警规则,触发后检查飞书是否收到通知 + +# U4: 删除静默规则 +SILENCE_ID=$(curl -s "http://127.0.0.1:8080/api/v1/alerts/silences" -H "Authorization: Bearer $TOKEN" | python3 -c "import json,sys; print(json.load(sys.stdin)['data'][0]['id'])") +curl -s -X DELETE "http://127.0.0.1:8080/api/v1/alerts/silences/$SILENCE_ID" \ + -H "Authorization: Bearer $TOKEN" | python3 -m json.tool +# 期望: code=200 +``` + +### 通过标准 +- [ ] U1: 创建静默规则返回 200 +- [ ] U2: 列表包含创建的规则 +- [ ] U3: 静默期间不触发通知 +- [ ] U4: 删除返回 200 +- [ ] 前端 AlertCenter 有「静默规则」Tab + +--- + +## P1-F2: 审计日志导出 + +### 验证用例 + +```bash +TOKEN=$(cat /tmp/aiops_token) + +# U1: 导出 CSV +curl -s "http://127.0.0.1:8080/api/v1/audit/export?format=csv" \ + -H "Authorization: Bearer $TOKEN" -o /tmp/audit_export.csv +file /tmp/audit_export.csv +# 期望: CSV 文件 + +# U2: 导出 Excel +curl -s "http://127.0.0.1:8080/api/v1/audit/export?format=xlsx" \ + -H "Authorization: Bearer $TOKEN" -o /tmp/audit_export.xlsx +file /tmp/audit_export.xlsx +# 期望: Microsoft Excel 2007+ + +# U3: 带筛选条件导出 +curl -s "http://127.0.0.1:8080/api/v1/audit/export?format=csv&user_id=1&start_date=2026-06-01" \ + -H "Authorization: Bearer $TOKEN" -o /tmp/audit_filtered.csv +wc -l /tmp/audit_filtered.csv +# 期望: 行数 > 1(有数据) +``` + +### 通过标准 +- [ ] U1: CSV 导出文件有效 +- [ ] U2: Excel 导出文件有效 +- [ ] U3: 筛选条件正确工作 +- [ ] 前端有「导出」按钮 + +--- + +## P1-F3: 前端 RBAC 按钮级控制 + +### 验证用例 + +```bash +# U1: 创建只读角色(无写入权限) +TOKEN=$(cat /tmp/aiops_token) +curl -s -X POST "http://127.0.0.1:8080/api/v1/admin/roles" \ + -H "Authorization: Bearer $TOKEN" \ + -H "Content-Type: application/json" \ + -d '{"name": "viewer", "permissions": ["read:servers", "read:k8s"]}' | python3 -m json.tool +# 期望: code=200 + +# U2: 创建 viewer 用户 +curl -s -X POST "http://127.0.0.1:8080/api/v1/admin/users" \ + -H "Authorization: Bearer $TOKEN" \ + -H "Content-Type: application/json" \ + -d '{"username": "viewer_test", "password": "123456", "role_id": 2}' | python3 -m json.tool +# 期望: code=200 + +# U3: 以 viewer 身份登录 +VIEWER_TOKEN=$(python3 -c " import urllib.request, json -login_data = json.dumps({'username': 'admin', 'password': 'admin123'}).encode() +login_data = json.dumps({'username': 'viewer_test', 'password': '123456'}).encode() req = urllib.request.Request('http://127.0.0.1:8080/api/v1/auth/login', data=login_data, method='POST') req.add_header('Content-Type', 'application/json') resp = urllib.request.urlopen(req) print(json.loads(resp.read())['data']['token']) ") -# U2: 多集群对比 API -curl -s "http://127.0.0.1:8080/api/v1/kubernetes/compare" \ - -H "Authorization: Bearer $TOKEN" | jq '.data | {totals, cluster_count: (.clusters|length)}' -# 期望: totals 含 cluster_count/node_count/pod_count/deployment_count/service_count +# U4: viewer 调用写接口应被拒绝 +curl -s -X POST "http://127.0.0.1:8080/api/v1/servers" \ + -H "Authorization: Bearer $VIEWER_TOKEN" \ + -H "Content-Type: application/json" \ + -d '{"hostname": "test", "ip": "10.0.0.1"}' | python3 -m json.tool +# 期望: code=403 -# U3: 验证每个集群包含完整字段 -curl -s "http://127.0.0.1:8080/api/v1/kubernetes/compare" \ - -H "Authorization: Bearer $TOKEN" | jq '.data.clusters[0] | keys' -# 期望: 19 个字段 (id/name/code/status/node_count/pod_count/.../total_cpu_cores/total_memory_mb/master_count/worker_count) - -# U4: SPA 路由 -curl -s -o /dev/null -w "%{http_code}" http://127.0.0.1:8080/kubernetes/compare -# 期望: 200 - -# U5: TypeScript + Vite 构建 -cd frontend && npx tsc --noEmit && npm run build 2>&1 | tail -3 -# 期望: 零错误 + built in Ns +# U5: 前端验证(手动) +# 1. 用 viewer_test 登录前端 +# 2. 确认侧边栏无「删除」按钮 +# 3. 确认无权限的菜单不显示 ``` ### 通过标准 -- [x] U2: Compare API 返回 clusters 数组 + totals 聚合数据 -- [x] U3: 每个集群包含 19 个字段(含 node 级别聚合数据) -- [x] U4: SPA 路由返回 200 -- [x] U5: TypeScript 零编译错误 + Vite 构建成功 -- [x] 前端 4 类图表正确渲染(柱状图×2 + 雷达图 + 饼图) -- [x] 详细对比表格可点击跳转集群概览 -- [x] totals 聚合正确(cluster_count/node_count/pod_count/deployment_count/service_count) +- [ ] U1-U2: 创建角色和用户成功 +- [ ] U4: 写接口返回 403 +- [ ] U5: 前端按钮/菜单按权限显示 --- -## M14: Namespace 管理看板(资源配额 + 命名空间 CRUD) - -### 验证用例 +## 回归测试基线(每次改动后必跑) ```bash -# U1: 登录获取 Token -TOKEN=$(python3 -c " -import urllib.request, json -login_data = json.dumps({'username': 'admin', 'password': 'admin123'}).encode() -req = urllib.request.Request('http://127.0.0.1:8080/api/v1/auth/login', data=login_data, method='POST') -req.add_header('Content-Type', 'application/json') -resp = urllib.request.urlopen(req) -print(json.loads(resp.read())['data']['token']) -") +# === 后端回归 === +TOKEN=$(cat /tmp/aiops_token) -# U2: 命名空间详情 API(含资源计数+配额状态) -curl -s "http://127.0.0.1:8080/api/v1/kubernetes/prod-cluster/namespaces/detail" \ - -H "Authorization: Bearer $TOKEN" | jq '.data | length' -# 期望: 返回所有命名空间(含 status/age/labels/resource_counts) +# 集群 +curl -sf http://127.0.0.1:8080/api/v1/kubernetes-clusters -H "Authorization: Bearer $TOKEN" > /dev/null && echo "✅ clusters" || echo "❌ clusters" -# U3: 字段完整性 -curl -s "http://127.0.0.1:8080/api/v1/kubernetes/prod-cluster/namespaces/detail" \ - -H "Authorization: Bearer $TOKEN" | jq '.data[0] | keys' -# 期望: 含 name/status/age/labels/resource_counts/has_resource_quota/has_limit_range +# Deployments +curl -sf "http://127.0.0.1:8080/api/v1/kubernetes/prod-cluster/namespace/devops/deployments" -H "Authorization: Bearer $TOKEN" > /dev/null && echo "✅ deployments" || echo "❌ deployments" -# U4: 创建命名空间 -curl -s -X POST "http://127.0.0.1:8080/api/v1/kubernetes/prod-cluster/namespaces" \ - -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \ - -d '{"name":"test-ns-m14","labels":{"env":"test"}}' -# 期望: code=200, message="命名空间创建成功" +# Pods +curl -sf "http://127.0.0.1:8080/api/v1/kubernetes/prod-cluster/namespace/devops/pods" -H "Authorization: Bearer $TOKEN" > /dev/null && echo "✅ pods" || echo "❌ pods" -# U5: 创建后验证存在于列表 -curl -s "http://127.0.0.1:8080/api/v1/kubernetes/prod-cluster/namespaces/detail" \ - -H "Authorization: Bearer $TOKEN" | jq '[.data[] | select(.name=="test-ns-m14")] | length' -# 期望: 1 +# Events +curl -sf "http://127.0.0.1:8080/api/v1/kubernetes/prod-cluster/events/summary" -H "Authorization: Bearer $TOKEN" > /dev/null && echo "✅ events" || echo "❌ events" -# U6: 删除命名空间 -curl -s -X DELETE "http://127.0.0.1:8080/api/v1/kubernetes/prod-cluster/namespaces/test-ns-m14" \ - -H "Authorization: Bearer $TOKEN" -# 期望: code=200, message="命名空间已删除" +# Namespace +curl -sf "http://127.0.0.1:8080/api/v1/kubernetes/prod-cluster/namespaces/detail" -H "Authorization: Bearer $TOKEN" > /dev/null && echo "✅ namespaces" || echo "❌ namespaces" -# U7: 系统命名空间删除保护 -curl -s -X DELETE "http://127.0.0.1:8080/api/v1/kubernetes/prod-cluster/namespaces/kube-system" \ - -H "Authorization: Bearer $TOKEN" -# 期望: code=403, message="禁止删除系统命名空间: kube-system" +# Servers +curl -sf http://127.0.0.1:8080/api/v1/servers -H "Authorization: Bearer $TOKEN" > /dev/null && echo "✅ servers" || echo "❌ servers" -# U8: SPA 路由 -curl -s -o /dev/null -w "%{http_code}" http://127.0.0.1/kubernetes/prod-cluster/namespaces -# 期望: 200 +# Pipelines +curl -sf http://127.0.0.1:8080/api/v1/pipelines -H "Authorization: Bearer $TOKEN" > /dev/null && echo "✅ pipelines" || echo "❌ pipelines" -# U9: TypeScript + Vite 构建 -cd frontend && npx tsc --noEmit && npm run build 2>&1 | tail -3 -# 期望: 零错误 + built in Ns +# Alerts +curl -sf http://127.0.0.1:8080/api/v1/alerts/rules -H "Authorization: Bearer $TOKEN" > /dev/null && echo "✅ alerts" || echo "❌ alerts" + +# Agent +curl -sf http://127.0.0.1:8080/api/v1/agent/latest -H "Authorization: Bearer $TOKEN" > /dev/null && echo "✅ agent" || echo "❌ agent" + +# Dashboard +curl -sf http://127.0.0.1:8080/api/v1/dashboard/stats -H "Authorization: Bearer $TOKEN" > /dev/null && echo "✅ dashboard" || echo "❌ dashboard" + +# === 前端回归 === +cd /srv/aiops/frontend && npm run build 2>&1 | tail -1 + +# === 健康检查 === +curl -sf http://127.0.0.1:8080/health > /dev/null && echo "✅ health" || echo "❌ health" +curl -sf http://127.0.0.1/ > /dev/null && echo "✅ frontend" || echo "❌ frontend" ``` - -### 通过标准 -- [x] U2: Namespaces Detail API 返回完整命名空间列表(含 status/age/resource_counts) -- [x] U3: 每个命名空间包含 7 个字段(name/status/age/labels/resource_counts/has_resource_quota/has_limit_range) -- [x] U4: 创建命名空间 API 返回 200 -- [x] U5: 创建后命名空间出现在列表中 -- [x] U6: 删除命名空间 API 返回 200 -- [x] U7: 系统命名空间删除被拦截(403) -- [x] U8: SPA 路由返回 200 -- [x] U9: TypeScript 零编译错误 + Vite 构建成功 -- [x] 前端命名空间管理页表格正确渲染(名称/状态/年龄/资源计数/配额/操作) -- [x] 创建/删除弹框功能正常 -- [x] 集群概览页「管理全部」链接跳转正常 diff --git a/backend/AUDIT_REPORT.md b/backend/AUDIT_REPORT.md deleted file mode 100644 index ae861fe..0000000 --- a/backend/AUDIT_REPORT.md +++ /dev/null @@ -1,364 +0,0 @@ -# AIOps 后端代码深度审计报告 - -> 审计目标:`/srv/aiops/backend` -> 模块名:`ezops` | Go 版本:`1.24.0` | Web 框架:Gin | ORM:GORM | 日志:zap -> 审计时间:2026-06-25 -> 审计方式:纯静态读取(`find` / `wc` / `grep`),**未修改任何文件** - ---- - -## 一、代码规模统计 - -### 1.1 全局总览 - -| 指标 | 数值 | -|---|---| -| Go 源文件总数 | **116** 个 | -| Go 源代码总行数 | **34,485** 行 | -| 顶层包分布 | `internal`(97) / `pkg`(14) / `cmd`(3) / `scripts`(2) | - -### 1.2 各目录 `.go` 文件数 + 总行数 - -| 目录 | 文件数 | 总行数 | 说明 | -|---|---:|---:|---| -| `internal/api/handlers` | **65** | **21,418** | 业务处理器(核心代码集中地) | -| `internal/models` | **26** | **4,269** | 数据模型 | -| `internal/api/routes` | 1 | 853 | 路由注册 | -| `internal/api/middleware` | 2 | 278 | 中间件(JWT / Admin / PipelineAccess) | -| `internal/cloud` | 2 | 286 | 云厂商 SDK 封装 | -| `internal/config` | 1 | 105 | 配置加载 | -| `pkg/kubernetesclient` | 1 | 1,896 | K8s 客户端封装(最大 pkg) | -| `pkg/zabbix` | 1 | 757 | Zabbix API 客户端 | -| `pkg/snmp` | 1 | 621 | SNMP 采集 | -| `pkg/toolinstaller` | 3 | 592 | 工具懒加载(kubectl/maven/node/helm) | -| `pkg/prometheus` | 1 | 531 | Prometheus 客户端 | -| `pkg/remoteexec` | 1 | 420 | 原生 SSH 批量执行 | -| `pkg/redis` | 3 | 290 | Redis/Redka 缓存抽象 | -| `pkg/database` | 1 | 150 | GORM 初始化 | -| `pkg/crypto` | 1 | 66 | AES 加解密(凭据) | -| `pkg/logger` | 1 | 90 | zap 封装 | -| `cmd` | 3 | 1,043 | 程序入口(main / seed / embed) | -| `scripts` | 2 | 820 | 辅助脚本 | - -> **规模结论**:`internal/api/handlers` 占全部代码的 **62%**(21,418 / 34,485),是绝对的业务核心;其中 `kubernetes.go` 单文件 **4,204 行**,是全仓最大文件(存在拆分必要,见第五章)。 - -### 1.3 `handlers/` 各文件行数与函数数(按行数降序) - -| 文件 | 行数 | 函数数 | 功能 | -|---|---:|---:|---| -| kubernetes.go | **4,204** | **134** | K8s 集群 + 资源全量管理(⚠️ 超大文件) | -| pipeline_executor.go | 665 | 18 | 流水线执行引擎 V2 | -| agent.go | 624 | 12 | Agent 上报/聚合/健康探针 | -| pipeline.go | 580 | 13 | 流水线 CRUD + 队列 + 成员 | -| agent_install.go | 514 | 10 | Agent 远程安装/卸载/升级 | -| alert_channels.go | 483 | 16 | 告警通知渠道 | -| ansible.go | 462 | 18 | Ansible 自动化 | -| k8s_export.go | 451 | 6 | K8s 资源批量导出 | -| alert_engine.go | 424 | 10 | 告警引擎(定时扫描) | -| server.go | 417 | 8 | 服务器 CRUD | -| automation_cron.go | 411 | 8 | 定时任务 | -| credential.go | 400 | 13 | 凭据管理 V2 | -| ldap_users.go | 397 | 5 | LDAP 用户导入/管理 | -| user.go | 360 | 6 | 用户/登录 | -| user_admin.go | 360 | 8 | 管理员用户管理 | -| audit.go | 360 | 9 | 审计日志(含 1 处 TODO) | -| dashboard.go | 356 | 5 | 仪表盘统计 | -| automation_script.go | 356 | 8 | 脚本执行 | -| prometheus_datasource.go | 352 | 9 | Prometheus 数据源 | -| llm_chat.go | 349 | 6 | LLM 对话代理 | -| alert_rules.go | 336 | 7 | 告警规则 | -| prometheus_proxy.go | 331 | 13 | Prometheus API 代理 | -| webshell.go | 325 | 5 | WebSSH 终端 | -| ldap.go | 319 | 6 | LDAP 配置 | -| remote_exec.go | 309 | 7 | SSH 远程批量执行 | -| health_probe.go | 308 | 7 | 健康探针 CRUD | -| billing.go | 307 | 7 | 云账单 | -| agent_task.go | 296 | 13 | Agent 远程任务/规则/事件 | -| zabbix_proxy.go | 284 | 5 | Zabbix API 代理 | -| cloud_sync.go | 277 | 5 | 云平台区域/实例同步 | -| pipeline_release.go | 261 | 6 | 应用发布 | -| navigation_link.go | 259 | 5 | 导航链接 | -| deploy_environments.go | 234 | 11 | 环境管理 | -| cloud_domain.go | 230 | 6 | 域名管理 | -| tool_config.go | 217 | 8 | 工具配置 | -| approval.go | 209 | 6 | 审批 | -| zabbix_datasource.go | 205 | 8 | Zabbix 数据源 | -| cloud_accounts.go | 202 | 5 | 云账号 | -| item_role.go | 201 | 8 | Item 角色 | -| metrics.go | 188 | 7 | 指标浏览器 | -| approval_process.go | 187 | 5 | 审批流程 | -| navigation.go | 186 | 5 | 导航分组 | -| workspace_files.go | 184 | 5 | 工作区文件浏览 | -| kubectl_shell.go | 183 | 3 | kubectl WebSocket 终端 | -| role.go | 168 | 4 | 角色 CRUD | -| billing_alert.go | 168 | 7 | 账单告警 | -| llm.go | 167 | 6 | LLM 配置 | -| site.go | 166 | 8 | 站点拨测 | -| deploy.go | 164 | 11 | 仓库/镜像仓库 | -| server_batch.go | 161 | 2 | 服务器批量导入/删除 | -| deploy_groups.go | 151 | 8 | 用户组 | -| cloud_region.go | 151 | 6 | 区域 | -| log.go | 150 | 6 | 日志监控 | -| alert_contacts.go | 149 | 8 | 告警联系人/组 | -| terminal_session.go | 147 | 6 | 终端会话审计 | -| snmp.go | 143 | 9 | SNMP 设备 | -| ws_pipeline_log.go | 142 | 3 | 流水线日志 WS 推流 | -| resource_model.go | 134 | 5 | 资源模型 | -| alert.go | 133 | 4 | 告警事件 | -| cloud_platform.go | 132 | 5 | 云平台 | -| ldap_ou.go | 122 | 2 | LDAP OU 管理 | -| metrics_ws.go | 120 | 7 | 指标 WS Hub | -| automation.go | 76 | 3 | 自动化处理器(构造 + 列表代理) | -| credential_assign.go | 62 | 1 | 凭据分配到服务器 | -| llm_history.go | 49 | 2 | 对话历史查询/清空 | - -> Handler 文件合计 **65** 个,**21,418** 行,约 **500+** 个 handler 函数。 - ---- - -## 二、API 路由清单 - -**路由定义文件**:`internal/api/routes/routes.go`(853 行,单文件集中注册) - -### 2.1 路由总量 - -| 维度 | 数值 | -|---|---| -| **路由总数** | **411** | -| GET | 171 | -| POST | 144 | -| DELETE | 54 | -| PUT | 41 | -| PATCH | 1 | - -### 2.2 路由按模块分组统计(method + 代表性 path) - -> 路径前缀统一为 `/api/v1`(除 `/health`、`/ws/*`、`/agent/*` 静态外)。 -> 鉴权:标注「公开」无需 JWT;其余均经 `middleware.JWTAuth`;`/admin/*` 额外加 `AdminAuth`;流水线 `/:code` 走 `PipelineAccess`。 - -| # | 模块 | 路由数 | 代表性路由(method + path) | -|---|---|---:|---| -| 1 | 健康检查 | 1 | `GET /health` | -| 2 | WebSocket 通道 | 5 | `GET /ws/terminal`、`/ws/metrics`、`/ws/pipeline/:runId/log`、`/ws/kubernetes-exec/:id/.../pods/:podName`、`/ws/kubectl` | -| 3 | 认证(公开) | 2 | `POST /auth/login`、`/auth/register` | -| 4 | Webhook 触发(公开) | 2 | `POST /webhook/job/:jobName`、`/webhook/pipeline/:code` | -| 5 | Agent API(上报/查询/任务,公开+JWT 混合) | 30 | `POST /agent/report`、`GET /agent/tasks/poll`、`GET /agent/latest`、`POST /agent/tasks`、`GET/POST/PUT/DELETE /agent/rules`、`POST /agent/uninstall` 等 | -| 6 | 用户中心 | 4 | `GET/PUT /user/profile`、`POST /user/change-password`、`GET /user/roles` | -| 7 | 管理员-用户管理 | 10 | `GET/POST /admin/users`、`GET/PUT/DELETE /admin/users/:id`、`POST /admin/users/batch-import`、`GET /admin/users/import-template` | -| 8 | 管理员-角色权限 | 4 | `GET/POST /admin/roles`、`PUT/DELETE /admin/roles/:id` | -| 9 | 管理员-权限列表 | 1 | `GET /admin/permissions` | -| 10 | Item 角色(Jenkins 式正则匹配) | 4 | `GET/POST /admin/item-roles`、`PUT/DELETE /admin/item-roles/:id` | -| 11 | LDAP 配置 | 10 | `GET/PUT /admin/ldap-config`、`POST .../test`、`/users`、`/import`、`/ou-list`、`/create-ou`、`/create-user`、`/delete-user`、`/update-user` | -| 12 | 仪表盘 | 4 | `GET /dashboard/stats`、`/recent-alerts`、`/recent-releases`、`/metrics` | -| 13 | 服务器 / Agent 安装 | 11 | `GET/POST /servers`、`GET/PUT/DELETE /servers/:id`、`POST /servers/batch`、`/batch-delete`、`POST /servers/:id/install-agent`、`/install-agent`(批量) | -| 14 | 云账号 / 云同步 | 8 | `GET/POST/PUT/DELETE /cloud-accounts`、`POST /cloud-accounts/:id/sync-regions`、`GET .../regions`、`POST .../discover-instances`、`/import-instances` | -| 15 | 域名 | 4 | `GET/POST/PUT/DELETE /domains` | -| 16 | 云平台 | 4 | `GET/POST/PUT/DELETE /platforms` | -| 17 | 区域 | 5 | `GET/POST/PUT /regions`、`DELETE /regions/batch-delete`、`/:id` | -| 18 | 云账单 | 6 | `GET/POST /cloud-billings`、`POST .../batch`、`DELETE .../:id`、`GET .../stats`、`/providers` | -| 19 | 账单告警 | 5 | `GET/POST/PUT/DELETE /billing-alerts`、`POST .../:id/toggle` | -| 20 | 资源模型 | 4 | `GET/POST/PUT/DELETE /resource-models` | -| 21 | **K8s 集群管理(集群域 `/kubernetes-clusters`)** | **38** | 集群 CRUD + 同步、节点/Pod/Deployment/Service/Ingress 列表、拓扑、HPA/CronJob/ReplicaSet、回滚、Pod 文件、exec、scale/restart/pause/resume | -| 22 | **K8s 资源管理(Kuboard 域 `/kubernetes/:clusterCode/...`)** | **66** | namespace 看板、Deployments/Pods/Services/Ingresses/HPA/CronJob/ReplicaSet/StatefulSet/DaemonSet/ConfigMap/Secret/PVC/RBAC 全量操作、YAML 在线编辑、Events、容量分析、多集群对比、批量导出 | -| 23 | 告警(规则/事件/渠道/联系人) | 22 | `GET /alerts`、`GET/POST/PUT/DELETE /alerts/rules`、`POST /:id/ack`、通知渠道 + 测试、联系人/联系组 CRUD、`/quick-setup` | -| 24 | 流水线(CI/CD) | 19 | `GET/POST /pipelines`、`/:code` 增删改查 + trigger + runs + stop + 队列 + 成员 + 组授权 | -| 25 | 用户组 | 7 | `GET/POST/PUT/DELETE /deploy/groups`、成员管理 | -| 26 | 环境管理 | 4 | `GET/POST/PUT/DELETE /deploy/environments` | -| 27 | 应用发布 | 6 | `GET/POST /releases`、`POST /:id/approve`、`/reject`、`/deploy`、`/rollback` | -| 28 | 代码仓库 | 5 | `GET/POST/PUT/DELETE /deploy/repos` | -| 29 | 镜像仓库 | 5 | `GET/POST/PUT/DELETE /deploy/registries` | -| 30 | 工具配置 | 6 | `GET/PUT /deploy/tools/:id`、`POST .../install`、`/check`、`GET .../versions` | -| 31 | 定时任务 | 8 | `GET/POST/PUT/DELETE /cron-jobs`、`/toggle`、`/execute`、`batch-delete` | -| 32 | 脚本管理 | 7 | `GET/POST/PUT/DELETE /scripts`、`/execute`、`batch-delete` | -| 33 | 远程执行(SSH) | 4 | `POST /remote-exec/execute`、`/upload`、`GET /hosts`、`POST /server/:id/exec` | -| 34 | 任务执行记录 | 1 | `GET /task-executions` | -| 35 | 日志监控 | 4 | `GET /logs`、`GET/POST/DELETE /logs/sources` | -| 36 | 审批流程 | 10 | 模板 + 流程 CRUD、`/approve`、`/reject` | -| 37 | 导航 | 9 | groups + links CRUD、`/favorite` | -| 38 | 审计日志 | 7 | `GET /audit/logs`、`/:id`、`/export`、`/statistics`、`/modules`、`/actions`、`POST /logs/clear` | -| 39 | 终端会话审计 | 5 | `GET /terminal-sessions`、`/:id`、`/:id/record`、`DELETE /:id`、`batch-delete` | -| 40 | AI 助手(LLM) | 7 | `GET/PUT /aiops/llm-config`、`/test`、`POST /chat`、`/chat/stream`、`GET/DELETE /chat-history` | -| 41 | 指标浏览器 | 5 | `GET /metrics/targets`、`/list`、`/query`、`/names`、`/top` | -| 42 | SNMP 设备 | 8 | 设备 + 模板 CRUD、`batch-delete`、`/stats` | -| 43 | Zabbix 代理 | 2 | `POST /zabbix/connect`、`GET /zabbix/host/:hostid` | -| 44 | Prometheus 代理 | 4 | `POST /prometheus/connect`、`/query`、`/query_range`、`/dashboard` | -| 45 | Prometheus 数据源 | 7 | CRUD + `/:id/default` + `/test` | -| 46 | Zabbix 数据源 | 7 | CRUD + `/:id/default` + `/test` | -| 47 | 凭据管理 | 7 | `GET/POST/PUT/PATCH/DELETE /credentials`、`GET /tags`、`POST /servers/:id/assign-credential` | -| 48 | 站点拨测 | 7 | tasks CRUD + batch-delete + results + stats | -| | **合计** | **411** | | - -> **路由结构特征**: -> - K8s 相关路由共 **104** 条(集群域 38 + Kuboard 域 66),占总路由 **25%**,是系统最重模块;存在**两套并行路由体系**(`/kubernetes-clusters/:id/...` 与 `/kubernetes/:clusterCode/...`),功能高度重叠,长期维护成本高。 -> - 告警体系路由 **22** 条,覆盖规则/事件/升级/静默/渠道/联系人全链路。 -> - 公开(无 JWT)路由:`/health`、`/auth/*`、`/webhook/*`、`/agent/*`(上报侧)、WebSocket(部分用 `?token=` 鉴权)。 - ---- - -## 三、数据模型清单 - -**目录**:`internal/models/`(26 个文件) - -### 3.1 模型总量 - -| 指标 | 数值 | -|---|---| -| 模型文件数 | **26** | -| `struct` 类型总数 | **218**(含 Request/Response DTO) | -| **GORM 映射数据库表数** | **86** | - -### 3.2 各模型文件核心模型与表名 - -| 文件 | 核心模型 | 数据库表 | -|---|---|---| -| `agent.go` | AgentReport / AgentPortPolicy | `monitor_agent_reports`、`monitor_agent_port_policy` | -| `agent_task.go` | AgentTask / AgentRule / AgentAlert | `monitor_agent_tasks`、`monitor_agent_rules`、`monitor_agent_alerts` | -| `alert.go` | AlertRule / AlertEvent / NotifyChannel / AlertSilence / AlertUpgrade / AlertContact(Group) | `monitor_alert_rules`、`monitor_alert_events`、`monitor_alert_conditions`、`monitor_alert_notify_templates`、`monitor_alert_upgrades`、`monitor_alert_upgrade_records`、`monitor_alert_silences`、`monitor_notify_channels`、`monitor_metric_data`、`monitor_alert_contacts`、`monitor_alert_contact_groups` | -| `approval.go` | ApprovalTemplate / ApprovalProcess / ApprovalStep | `sys_approval_templates`、`approval_processes`、`approval_steps` | -| `audit.go` | AuditLog | `sys_audit_logs` | -| `automation.go` | CronJob / Script / TaskExecution | `ops_cron_jobs`、`ops_scripts`、`ops_task_executions` | -| `billing.go` | CloudBilling / BillingAlertRule | `asset_cloud_billings`、`monitor_billing_alert_rules` | -| `cicd.go` | Pipeline / PipelineRun / AppRelease | `ops_pipelines`、`ops_pipeline_runs`、`deploy_app_releases` | -| `common.go` | Response / ListResponse / PageQuery / DashboardStats(DTO,无表) | — | -| `credential.go` | Credential(多类型) | `iam_credentials` | -| `deploy.go` | PipelineRepo / PipelineRegistry / DeployEnvironment / DeployUserGroup 等 | `deploy_pipeline_repos`、`deploy_pipeline_registries`、`deploy_environments`、`deploy_pipeline_members`、`deploy_user_groups`、`deploy_user_group_members` | -| `deploy_tool.go` | DeployTool | `deploy_tools` | -| `kubernetes.go` | KubernetesCluster / Node / Pod / Deployment / Service / Ingress / TopologyLayout | `kubernetes_clusters`、`kubernetes_nodes`、`kubernetes_pods`、`kubernetes_deployments`、`kubernetes_services`、`kubernetes_ingresses`、`kubernetes_topology_layouts` | -| `llm.go` | LLMConfig / ChatHistory | `ai_llm_configs`、`ai_chat_histories` | -| `metrics_aggregate.go` | MetricsAggregate | `monitor_metrics_aggregate` | -| `monitor.go` | MonitorTarget / MonitorMetric / MonitorDashboard / HostGroup / HealthProbe 等 | `monitor_targets`、`monitor_metrics`、`metric_values`、`monitor_metric_histories`、`monitor_metric_tags`、`monitor_dashboards`、`dashboard_panels`、`asset_host_groups`、`monitor_health_probes` | -| `navigation.go` | NavigationGroup / NavigationLink | `sys_navigation_groups`、`navigation_links` | -| `ops_modules.go` | AnsiblePlaybook / AnsibleJob / LogSource / LogEntry | `ops_ansible_playbooks`、`ops_ansible_jobs`、`ops_ansible_inventories`、`sys_log_sources`、`sys_log_entries` | -| `prometheus_datasource.go` | PrometheusDataSource | `monitor_prometheus_datasources` | -| `resource_model.go` | ResourceModel | `asset_resource_models` | -| `server.go` | Server / Cloud / CloudAccount / Region / Domain | `asset_servers`、`asset_clouds`、`asset_cloud_accounts`、`asset_regions`、`asset_domains` | -| `site.go` | SiteTask / SiteResult / SiteAlert | `ops_site_tasks`、`ops_site_results`、`ops_site_alerts` | -| `snmp.go` | SNMPDevice / SNMPTemplate / SNMPMetric / SNMPInterface | `ops_snmp_devices`、`ops_snmp_templates`、`ops_snmp_template_oids`、`ops_snmp_metrics`、`ops_snmp_interfaces`、`snmp_history` | -| `terminal_session.go` | TerminalSession | `sys_terminal_sessions` | -| `user.go` | User / Role / Permission / ItemRole / LDAPConfig | `iam_users`、`iam_roles`、`iam_permissions`、`iam_item_roles`、`iam_user_item_roles`、`iam_ldap_configs` | -| `zabbix_datasource.go` | ZabbixDataSource | `monitor_zabbix_datasources` | - -> **命名规范**:表名采用「业务前缀_模块_实体」前缀分组,一致性良好: -> - `iam_*` 身份认证 | `asset_*` 资产 | `monitor_*` 监控 | `ops_*` 运维 | `deploy_*` 发布 | `sys_*` 系统 | `ai_*` AI -> - 少数表未严格遵循:`approval_processes`、`approval_steps`、`navigation_links`、`dashboard_panels`、`metric_values`、`snmp_history`(缺前缀,轻微规范不一致)。 - ---- - -## 四、功能模块清单 - -> 评定标准:**✅ 完善** = 实现完整、行数充足;**⚠️ 轻量但完整** = 行数小但功能单一已实现;**🚧 仅框架/TODO** = 含 TODO 或未完成。 - -### 4.1 功能完善度评估(按域归类) - -| 业务域 | handler 文件 | 评定 | 说明 | -|---|---|---|---| -| **Kubernetes 管理** | kubernetes.go(4204)、k8s_export.go(451) | ✅ 完善 | 全仓最重模块,两套路由(集群域+Kuboard域),覆盖 Deploy/Pod/Svc/Ingress/HPA/CronJob/RS/STS/DS/CM/Secret/PVC/RBAC/YAML/Events/容量/对比/导出 | -| **流水线 CI/CD** | pipeline.go(580)、pipeline_executor.go(665)、pipeline_release.go(261) | ✅ 完善 | 执行引擎 V2 + Redis 实时日志推送,支持 git/maven/npm/go/docker/kubectl 全链路 | -| **Agent 体系** | agent.go(624)、agent_install.go(514)、agent_task.go(296)、health_probe.go(308) | ✅ 完善 | 上报/聚合/远程任务/告警规则/健康探针/端口策略/安装/卸载/升级 | -| **告警** | alert.go(133)、alert_rules.go(336)、alert_channels.go(483)、alert_contacts.go(149)、alert_engine.go(424) | ✅ 完善 | 规则+引擎(30s轮询)+渠道+联系人+静默+升级 | -| **用户/权限** | user.go(360)、user_admin.go(360)、role.go(168)、item_role.go(201) | ✅ 完善 | 用户/角色/权限/Item角色(Jenkins式) | -| **LDAP** | ldap.go(319)、ldap_users.go(397)、ldap_ou.go(122) | ✅ 完善 | 配置/测试/用户导入/OU 管理/用户 CRUD | -| **服务器资产** | server.go(417)、server_batch.go(161) | ✅ 完善 | CRUD + 批量导入/删除 + Agent 安装 | -| **云资源** | cloud_accounts.go(202)、cloud_sync.go(277)、cloud_platform.go(132)、cloud_region.go(151)、cloud_domain.go(230) | ✅ 完善 | 账号/同步/平台/区域/域名 | -| **凭据** | credential.go(400)、credential_assign.go(62) | ⚠️ 轻量但完整 | 多类型加密凭据 + 服务器分配(小文件但功能单一已实现) | -| **自动化运维** | automation.go(76)、automation_cron.go(411)、automation_script.go(356)、ansible.go(462) | ✅ 完善 | 定时任务/脚本/Ansible | -| **远程执行** | remote_exec.go(309) | ✅ 完善 | 原生 SSH 批量执行/上传/主机匹配 | -| **审批** | approval.go(209)、approval_process.go(187) | ✅ 完善 | 模板 + 流程 + 步骤 | -| **发布部署** | deploy.go(164)、deploy_environments.go(234)、deploy_groups.go(151)、deploy.go(repo/registry) | ✅ 完善 | 仓库/镜像仓库/环境/用户组 | -| **工具配置** | tool_config.go(217) | ✅ 完善 | kubectl/maven/node/helm 懒加载 | -| **监控数据源** | prometheus_datasource.go(352)、prometheus_proxy.go(331)、zabbix_datasource.go(205)、zabbix_proxy.go(284) | ✅ 完善 | Prom/Zabbix 数据源 CRUD + 代理查询 | -| **指标** | metrics.go(188)、metrics_ws.go(120) | ✅ 完善 | 指标浏览 + WS 实时推送 | -| **网络设备** | snmp.go(143) | ⚠️ 轻量但完整 | SNMP 设备/模板 CRUD | -| **站点拨测** | site.go(166) | ✅ 完善 | HTTP/TCP/DNS/PING 任务+结果+告警 | -| **账单** | billing.go(307)、billing_alert.go(168) | ✅ 完善 | 云账单 + 账单告警规则 | -| **仪表盘** | dashboard.go(356) | ✅ 完善 | 统计/近期告警/近期发布/指标 | -| **审计/合规** | audit.go(360)、terminal_session.go(147) | 🚧 **含 TODO** | 审计日志完整,但 **`ExportAuditLogs` 未实现 CSV/Excel 导出**,仅返回 JSON | -| **导航** | navigation.go(186)、navigation_link.go(259) | ✅ 完善 | 分组 + 链接 + 收藏 | -| **AI 助手** | llm.go(167)、llm_chat.go(349)、llm_history.go(49) | ✅ 完善 | LLM 配置 + OpenAI 兼容对话(含流式)+ 历史 | -| **终端** | webshell.go(325)、kubectl_shell.go(183)、ws_pipeline_log.go(142)、workspace_files.go(184) | ✅ 完善 | WebSSH/kubectl 终端 + WS 日志 + 工作区文件 | -| **日志监控** | log.go(150) | ✅ 完善 | 日志查询 + 数据源 | - -### 4.2 仅有框架 / 待完善项 - -| 文件 | 行数 | 问题 | -|---|---:|---| -| `audit.go` (`ExportAuditLogs`) | 360 | 🚧 **TODO**:`// TODO: 实现CSV/Excel导出功能`,当前仅返回 JSON,未生成实际导出文件 | -| `automation.go` | 76 | ⚠️ 仅含构造函数 + 列表代理(实际逻辑在 cron/script 子文件),属正常拆分,非残缺 | -| `credential_assign.go` | 62 | ⚠️ 仅 1 个函数,但已完整实现,非残缺 | -| `llm_history.go` | 49 | ⚠️ 仅 2 个函数(历史查询+清空),已完整实现,非残缺 | - -> **结论**:除 `audit.go` 的导出功能为明确 TODO 外,**无其他空壳/桩代码**。整体功能完成度高。 - ---- - -## 五、已知问题 / 技术债 - -### 5.1 TODO / FIXME / HACK / XXX 注释 - -| 位置 | 内容 | 严重度 | -|---|---|---| -| `internal/api/handlers/audit.go:223` | `// TODO: 实现CSV/Excel导出功能` — 导出接口返回 JSON 而非 CSV/Excel 文件 | 🟡 中(功能未达预期) | - -> **全仓 TODO/FIXME/HACK/XXX 总计:仅 1 处**。代码注释卫生状况良好。 - -### 5.2 `panic(` 调用 - -> **全仓 `panic(` 调用数:0**(排除测试文件)。 -> ✅ Handler 层无 panic,符合生产规范(均通过 `c.JSON(...)` 返回错误)。 - -### 5.3 `_ =` 显式忽略错误(共 13 处) - -| 文件:行 | 被忽略的表达式 | 风险评估 | -|---|---|---| -| `handlers/dashboard.go:236` | `_ = h.cache.Set(...)` | 🟢 低:缓存写入失败可接受(缓存降级) | -| `handlers/server.go:137` | `_ = h.cache.Set(...)` | 🟢 低:同上 | -| `handlers/agent.go:254` | `_ = h.cache.Expire(...)` | 🟢 低:缓存 TTL 失败可接受 | -| `handlers/agent.go:258` | `_ = h.cache.ZRemRangeByScore(...)` | 🟢 低:清理旧指标,失败影响小 | -| `handlers/kubernetes.go:1292/1334` | `_ = msgType`(WebSocket 消息类型) | 🟢 低:显式丢弃未用变量(编译要求) | -| `handlers/kubernetes.go:1353` | `_ = cluster` | 🟢 低:占位 | -| `handlers/kubernetes.go:3655` | `_ = c.ShouldBindJSON(&req)` | 🟡 **中**:绑定错误被忽略,但注释说明「允许空 body,下面会校验」——依赖后续校验,需确认所有分支确有校验 | -| `handlers/automation_script.go:267` | `_ = c.ShouldBindJSON(&req)` | 🟡 **中**:同上模式,绑定错误被忽略 | -| `handlers/ldap_users.go:164` | `_ = bcrypt.MinCost` | 🟢 低:常量引用占位 | -| `handlers/ldap_users.go:210` | `_ = json.Unmarshal(...)` | 🟡 **中**:LDAP 用户映射 JSON 解析失败被静默忽略,可能导致字段映射丢失而不报警 | -| `pkg/database/database.go:148` | `_ = lastErr` | 🟢 低:重试后记录最终错误 | -| `pkg/remoteexec/executor.go:226` | `_ = encodedLen` | 🟢 低:未用变量占位 | - -> **建议**:重点复查 3 处 🟡 中风险——`kubernetes.go:3655`、`automation_script.go:267`、`ldap_users.go:210`,确认忽略错误不会导致空指针或逻辑漏洞。 - -### 5.4 其他风险信号 - -| 类别 | 发现 | 数量/位置 | 建议 | -|---|---|---|---| -| **`exec.Command` 命令执行** | pipeline_executor / automation / ansible / tool_config 调用外部命令(git/mvn/npm/go/docker/kubectl/ansible-playbook/bash/sh/python3) | **18 处** | 多数参数为固定/受控;`tool_config.go:148` 的 `sh -c ` 与 `automation.go:39/41` 的 `bash -c ` 若内容来自用户输入需**严格校验命令注入** | -| **SQL 注入** | `.Where(fmt.Sprintf(...))` 拼接 | **0 处** | ✅ 全仓未发现 Sprintf 拼 Where,GORM 参数化查询使用规范 | -| **`defer Close()` 未检错** | 文件/连接关闭 | 22 处 | 🟢 低:Close 错误通常可忽略,符合 Go 惯例 | -| **超大文件** | `kubernetes.go` 单文件 4,204 行 / 134 函数 | 1 个 | 🔴 **高**:建议按资源类型(Deployment/Pod/Service/HPA/CronJob/YAML/导出等)拆分,否则维护困难 | -| **K8s 双路由体系** | `/kubernetes-clusters/:id/...` 与 `/kubernetes/:clusterCode/...` 功能重叠 | 2 套(104 路由) | 🟡 中:长期应统一为一套路由,避免双份逻辑漂移 | -| **routes.go 单文件** | 853 行集中注册 411 条路由 | 1 个 | 🟡 中:建议按模块拆分为多个注册函数 | - -### 5.5 告警引擎架构提示 - -`routes.go:845-852` 中告警引擎以 **goroutine + 30s ticker** 方式常驻启动: -```go -go func() { - ticker := time.NewTicker(30 * time.Second) - defer ticker.Stop() - for range ticker.C { alertEngine.Check() } -}() -``` -- 🟡 **无优雅退出机制**(无 context 取消),进程关闭时无法平滑停止; -- 🟡 单实例运行,**多副本部署会重复触发告警**(需结合分布式锁或单实例调度)。 - ---- - -## 六、总体评估 - -| 维度 | 评级 | 说明 | -|---|---|---| -| **功能完整度** | ⭐⭐⭐⭐ | 411 条路由覆盖资产/监控/告警/CI-CD/K8s/自动化/AI 全栈,除审计导出 TODO 外无空壳 | -| **代码规范** | ⭐⭐⭐⭐ | TODO/panic 几乎为零,命名前缀统一,GORM 参数化规范 | -| **可维护性** | ⭐⭐⭐ | kubernetes.go 超大文件 + K8s 双路由体系是主要技术债 | -| **健壮性** | ⭐⭐⭐⭐ | handler 无 panic,但 3 处错误忽略需复查 | -| **安全性** | ⭐⭐⭐⭐ | 无 SQL 注入;exec.Command 命令注入面需复核用户输入边界 | - -**核心结论**:这是一个功能完备、规范度较高的中型 AIOps 后端(3.4 万行 / 411 路由 / 86 表)。主要技术债集中在 **K8s 模块的代码体积与双路由体系**,以及**告警引擎的单实例/无优雅退出**设计。建议优先级:① 拆分 `kubernetes.go` → ② 统一 K8s 路由 → ③ 复查 3 处错误忽略 → ④ 补全审计导出 → ⑤ 告警引擎增加分布式协调。