docs: 全量重新评估 — PROJECT_EVALUATION/ROADMAP/TDD_PLAN 清空重写
基于全项目深度审计(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 引号问题)
This commit is contained in:
1 parent
6e479f6df7
commit
e29dfb5868
4 files changed
+677
-1265
No files matched your search
+195
-75
@@ -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 + 同步 | ✅ | ✅ | ✅ 已验证 |
|
| 后端 API 路由 | **411 条**(GET 171 / POST 144 / DELETE 54 / PUT 41 / PATCH 1) |
|
||||||
| 集群表单(名称即 code) | ✅ | ✅ NAME_RE 正则 | ✅ |
|
| 后端业务模块 | **48 个**(handlers 目录) |
|
||||||
| 节点列表 + 实时 metrics | ✅ ListNodes 调 GetNodeMetrics | ✅ ClusterOverviewPage | ⚠️ 实时OK,DB缓存缺 |
|
| 数据库表 | **86 张** GORM 映射表 |
|
||||||
| Pod 列表 | ✅ | ✅ | ✅ |
|
| 前端 API 方法 | **352 个**(31 个模块) |
|
||||||
| Deployment 列表/详情 | ✅ | ✅ DeploymentView + DeploymentWorkload | ✅ |
|
| 前端路由 | **~50 条**(45 个 lazy 组件,零空壳) |
|
||||||
| Deployment view/edit 路由 | ✅ | ✅ /:mode/:kind/:name | ✅ |
|
| 前端组件 | **215 个** |
|
||||||
| Deployment 伸缩/重启/镜像更新 | ✅ scale/restart/update-image | ✅ | ✅ |
|
| Agent 采集器 | **11 个**(CPU/Memory/Swap/Disk/DiskIO/Network/Port/ProcessTop/FD/ContextSwitch/HealthProbe) |
|
||||||
| Deployment 历史版本/回滚 | ✅ revisions/rollback | ✅ | ✅ |
|
| 侧边栏菜单 | **9 个一级 / 42 个二级** |
|
||||||
| 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 验证 |
|
|
||||||
|
|
||||||
### ❌ 缺失 / 进行中
|
---
|
||||||
|
|
||||||
| 功能 | 优先级 | 说明 |
|
## 二、功能模块评估
|
||||||
|------|:------:|------|
|
|
||||||
| 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 系统) |
|
| 服务器 CRUD + CSV 批量导入 | ✅ | ✅ ServerManager (609L) | ✅ |
|
||||||
| `DeploymentView.tsx` | 395 | ✅ 完整 | 查看模式(状态卡片/容器模板/Pod实例/版本历史/RS) |
|
| WebShell SSH 终端 | ✅ webshell.go (325L) | ✅ xterm.js WebSocket | ✅ |
|
||||||
| `DeploymentEditBasic.tsx` | 340 | ✅ 完成 M6 | 基本信息 Tab — replicas/labels/annotations/selector 编辑 |
|
| 云账号管理(AWS/阿里/华为) | ✅ cloud_sync.go (277L) | ✅ CloudAccountManager | ✅ |
|
||||||
| `DeploymentEditContainers.tsx` | 700+ | ✅ 完成 M7 | 完整容器编辑器(工作容器+初始化容器,10+ 字段编辑) |
|
| 域名/区域/平台管理 | ✅ | ✅ | ✅ |
|
||||||
| `DeploymentEditStorage.tsx` | 437 | ✅ 完成 M8 | 存储挂载 Tab — 6种 volume 类型编辑 + volumeMounts 汇总 |
|
| 云账单 | ✅ billing.go (307L) | ✅ | ✅ |
|
||||||
| `DeploymentEditAdvanced.tsx` | 632 | ✅ 完成 M8 | 高级设置 Tab — 更新策略/调度/容忍/DNS/主机别名/安全上下文 |
|
| Agent 管理(安装/卸载/升级) | ✅ agent.go(624L) + agent_install.go(514L) | ✅ AgentWizard + HostMonitor | ✅ |
|
||||||
| `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,**纯前端工程无需改后端** |
|
|
||||||
|
|
||||||
**编辑器 5 Tab 模块拆分**:
|
### 2.2 Kubernetes 管理 ✅ 功能完备
|
||||||
|
|
||||||
| Tab | 模块 | 预估代码量 | 核心字段 |
|
| 功能 | 后端 | 前端 | 状态 |
|
||||||
|-----|------|-----------|---------|
|
|------|:----:|:----:|:----:|
|
||||||
| 基本信息 | M6 ✅ | ~340 行 | name/namespace/labels/annotations/replicas |
|
| 多集群 CRUD + 同步 + metrics | ✅ kubernetes.go (4204L, 134 函数) | ✅ ClusterOverviewPage | ✅ |
|
||||||
| 容器信息 | M7 ✅ | ~700 行 | 镜像/资源/端口/环境变量/健康检查/生命周期/安全上下文/卷挂载/初始化容器 |
|
| Deployment 三模式编辑器 | ✅ GetYAML/UpdateYAML | ✅ DeploymentWorkload (773L) + 5 Tab 编辑器 (~2700L) | ✅ |
|
||||||
| 存储挂载 | M8 ✅ | ~437 行 | 6种数据卷(EmptyDir/HostPath/ConfigMap/Secret/PVC/NFS) + volumeMounts汇总 |
|
| StatefulSet/DaemonSet 详情 | ✅ | ✅ WorkloadViewPage (480L) | ✅ |
|
||||||
| 高级设置 | M8 ✅ | ~632 行 | 更新策略/调度/nodeSelector/tolerations/DNS/主机别名/SA/安全上下文/hostNetwork |
|
| Pod 日志/终端/文件浏览 | ✅ WebSocket channel.k8s.io | ✅ PodLogsViewer/PodExecTerminal/PodFileBrowser | ✅ |
|
||||||
| 服务/应用路由 | M9 ✅ | — | Service(ClusterIP/NodePort/LB) selector关联 + Ingress |
|
| Node 详情(资源分配率) | ✅ GetNodeDetail | ✅ NodeDetailPage (330L) | ✅ |
|
||||||
| YAML 编辑器 | M6 ✅ | ~220 行 | CodeMirror 6 语法高亮+行号+折叠 |
|
| 事件聚合看板 | ✅ GetEventsSummary | ✅ EventsPage (480L, recharts) | ✅ |
|
||||||
| **合计** | **M6-M9 ✅ 全部完成** | **~2700 行** | 纯前端,零后端改动 |
|
| 多集群对比 | ✅ 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 方案
|
| CI/CD 流水线(GitLab CI 风格) | ✅ pipeline.go(580L) + pipeline_executor.go(665L) | ✅ PipelineManager(961L) + PipelineEditor(602L) | ✅ |
|
||||||
4. **两个数据路径**:ListNodes 实时调 API(含 metrics),SyncCluster 写 DB(缺 metrics)→ 前端不同页面读不同路径
|
| SSH 主机 + Kubernetes 双路径 | ✅ | ✅ 流水线横幅 | ✅ |
|
||||||
5. **Node 详情页** (M10 ✅) — `GetNodeDetail` handler 返回完整节点信息:container_runtime/architecture/taints/conditions/资源分配率/Pod列表,前端 `NodeDetailPage.tsx` 可视化展示
|
| 发布配置/凭证/工具 | ✅ 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** | 企业级运维平台,功能覆盖全面,工程治理是当前首要提升方向 |
|
||||||
+165
-332
@@ -1,321 +1,199 @@
|
|||||||
# K8s 管理功能演进路线图
|
# AIOps 智能运维平台 — 优化路线图
|
||||||
|
|
||||||
> 每个模块 = 1 个 cron 周期(6h)可完成的**中等粒度功能**。完成后更新状态。
|
> 基于全量审计(96,102 行代码 / 374 文件),从「K8s 功能开发」全面转向「工程质量 + 功能补全 + 架构治理」。
|
||||||
|
> 最后更新: 2026-06-25
|
||||||
## 当前冲刺: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 正确
|
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
### M2: Pod Metrics 详情页接入 [done]
|
## 当前状态:功能开发阶段已完成
|
||||||
**目标**: Deployment 详情页和 Pod 列表展示真实 CPU/内存使用
|
|
||||||
|
|
||||||
**改动**:
|
| 大模块 | 完成度 | 说明 |
|
||||||
- 后端 `ListPods` handler 注入 `GetPodMetrics()`(类似 ListNodes 已有逻辑)
|
|--------|:------:|------|
|
||||||
- 前端 Pod 列表表格增加 CPU/内存列
|
| 资产管理 | 100% | 服务器/云账号/域名/账单/Agent 全功能 |
|
||||||
- DeploymentView 容器详情区域读取 metrics
|
| Kubernetes 管理 | 100% | M1-M14 全部完成(14 个子模块) |
|
||||||
|
| 应用发布 | 100% | CI/CD 流水线 + SSH/K8s 双路径 |
|
||||||
**验收标准**:
|
| 监控告警 | 80% | Agent 监控 + 告警引擎完善;缺:大屏/链路追踪/告警静默 |
|
||||||
- [x] Pod 列表有 CPU/内存使用量列
|
| 自动化运维 | 100% | CronJob/脚本/Ansible |
|
||||||
- [x] Deployment 详情页容器 CPU/内存非 mock
|
| AIOps 智能 | 100% | 6 种 LLM + 告警分析 + 容量预测 |
|
||||||
|
| 系统管理 | 95% | 审计导出 TODO |
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
### M3: Pod 文件上传 [done]
|
## P0 — 工程质量治理(最高优先级)
|
||||||
**目标**: PodFileBrowser 增加上传能力
|
|
||||||
|
|
||||||
**改动**:
|
> 目标:从「能跑」升级到「能维护」。解决前端类型安全和后端巨型文件问题。
|
||||||
- 后端新增 `POST .../pods/:pod/files/upload` — multipart 表单接收,base64 分块 exec 写入
|
|
||||||
- 前端 PodFileBrowser 增加上传按钮 + FormData 上传
|
### Q1: 前端类型安全治理 [pending]
|
||||||
- **重大修复**: `ExecInPod` 从 raw HTTP SPDY(不工作)改为 WebSocket channel.k8s.io 协议(和 ExecTerminal 一致)
|
|
||||||
- **修复**: BusyBox `ls` 不支持 `--time-style`,解析器改为兼容 BusyBox 默认日期格式
|
**问题**: 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 容器内
|
- [ ] `types/` 目录覆盖所有后端响应结构
|
||||||
- [x] 上传后文件列表刷新可见
|
- [ ] `any` 类型从 1026 处降至 < 50 处
|
||||||
- [x] verify 字段返回正确文件大小
|
- [ ] `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 — 功能补全
|
||||||
**目标**: 目前只读,增加在线编辑能力
|
|
||||||
|
|
||||||
**改动**:
|
> 目标:消除前端 mock 桩,补全监控模块缺失的后端。
|
||||||
- 后端 `UpdateResourceYAMLNS` 端点已支持 configmaps/secrets(无需改动)
|
|
||||||
- 前端 `YamlViewer` 增加 `autoEdit` prop — 打开即进入编辑模式
|
### F1: 告警静默规则 [pending]
|
||||||
- `NamespaceResourcePage` ConfigMap/Secret 行增加显式编辑按钮(铅笔图标)
|
|
||||||
- 统一 `cleanBeforeEdit=true` — 编辑前自动清理 status/managedFields/uid 等只读字段
|
**问题**: `alertCenterApi.silence` 硬编码返回 `{success:true}`
|
||||||
- `k8s-yaml-utils.ts` 的 `cleanYAML()` 提供行级清理
|
|
||||||
|
**方案**:
|
||||||
|
- 后端新增 `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 完善,但前端无按钮级权限控制
|
||||||
|
|
||||||
|
**方案**:
|
||||||
|
- 封装 `<HasPermission permission="xxx">` 组件
|
||||||
|
- Sidebar 菜单按角色过滤
|
||||||
|
- 操作按钮根据权限显示/隐藏
|
||||||
|
|
||||||
|
**验收标准**:
|
||||||
|
- [ ] 不同角色看到不同菜单
|
||||||
|
- [ ] 无权限按钮自动隐藏
|
||||||
|
- [ ] 权限变更后实时生效
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
### M5: Deployment 暂停更新 + CI/CD 集成 [done]
|
## P2 — 架构优化
|
||||||
**目标**: 接通顶部菜单的暂停更新和 CI/CD 按钮
|
|
||||||
|
|
||||||
**改动**:
|
### A1: K8s 双路由体系统一 [pending]
|
||||||
- 后端 `POST .../deployments/:name/pause` 和 `/resume`(ID 路由 + Kuboard code 路由)
|
|
||||||
- 客户端 `PauseDeployment()` / `ResumeDeployment()` — PATCH `spec.paused` 布尔字段
|
|
||||||
- Deployment 列表 summary 增加 `paused` 字段,前端可读取暂停状态
|
|
||||||
- 前端操作菜单增加「暂停更新/恢复更新」动态切换 + 暂停 Badge
|
|
||||||
- CI/CD 按钮跳转到流水线页面(传递 namespace+deployment 上下文)
|
|
||||||
|
|
||||||
**验收标准**:
|
**问题**: 104 条 K8s 路由存在集群域 `/kubernetes-clusters/:id/...` 和 Kuboard 域 `/kubernetes/:code/...` 两套
|
||||||
- [x] 可暂停/恢复 Deployment 滚动更新
|
|
||||||
- [x] CI/CD 按钮可跳转到流水线页面
|
**方案**: 以 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]
|
### U1: 虚拟滚动 [pending]
|
||||||
**目标**: 三模式切换(查看/可视化编辑/YAML编辑)+ 基本信息 Tab
|
- Pod 列表(1000+ Pod 场景)使用 `@tanstack/react-virtual`
|
||||||
|
- 事件列表、审计日志列表
|
||||||
|
|
||||||
**改动**:
|
### U2: 统一 DataTable 组件 [pending]
|
||||||
- `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 路由表)
|
|
||||||
|
|
||||||
**验收标准**:
|
### U3: 国际化 (i18n) [pending]
|
||||||
- [x] 三模式 tab 切换正常,YAML 模式打开 CodeMirror 编辑器
|
- 提取所有中文文案到 `i18n/zh-CN.json`
|
||||||
- [x] 基本信息 Tab 可编辑 labels/annotations/replicas 并保存
|
- 预留 `en-US.json` 扩展
|
||||||
- [x] YAML 编辑器有语法高亮和行号
|
|
||||||
- [x] YAML 编辑器支持内联模式(inline prop)
|
### U4: 后端镜像优化 [pending]
|
||||||
- [x] 编辑模式 Tab 导航系统就绪(M7-M9 预留占位)
|
- Backend 277MB → 目标 < 150MB(多阶段构建优化,移除 Agent 编译工具链)
|
||||||
|
- 或使用 distroless 基础镜像
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
### M7: 容器信息 Tab(工作容器 + 初始化容器)[done]
|
## 模块状态追踪
|
||||||
**目标**: Kuboard 风格的容器编辑器,替代当前浅层 DeploymentEdit
|
|
||||||
|
|
||||||
**改动**:
|
| ID | 模块 | 优先级 | 状态 |
|
||||||
- 新增 `DeploymentEditContainers.tsx`: 容器列表卡片(initContainers + containers)
|
|----|------|:------:|:----:|
|
||||||
- 每个容器卡片可编辑:
|
| Q1 | 前端类型安全治理 | P0 | pending |
|
||||||
- 容器镜像 + ImagePullSecret + 镜像拉取策略
|
| Q2 | kubernetes.go 拆分 | P0 | pending |
|
||||||
- 命令 (command + args)
|
| Q3 | api.ts 拆分 | P0 | pending |
|
||||||
- 环境变量(key-value 动态列表)
|
| F1 | 告警静默规则 | P1 | pending |
|
||||||
- 资源需求/限制(CPU/Memory/GPU)
|
| F2 | 审计日志导出 | P1 | pending |
|
||||||
- 端口(name/port/protocol 动态列表)
|
| F3 | 前端 RBAC 控制 | P1 | pending |
|
||||||
- 健康检查(liveness/readiness/startup — httpGet/tcpSocket/exec 三种)
|
| A1 | K8s 路由统一 | P2 | pending |
|
||||||
- 生命周期回调(postStart/preStop)
|
| A2 | 告警引擎分布式 | P2 | pending |
|
||||||
- 安全上下文(runAsUser/runAsNonRoot/privileged/capabilities)
|
| A3 | WebSocket 管理 | P2 | pending |
|
||||||
- 数据卷挂载(name/mountPath/subPath/readOnly)
|
| U1 | 虚拟滚动 | P3 | pending |
|
||||||
|
| U2 | 统一 DataTable | P3 | pending |
|
||||||
**验收标准**:
|
| U3 | 国际化 | P3 | pending |
|
||||||
- [x] 可添加/删除工作容器和初始化容器
|
| U4 | 镜像优化 | P3 | pending |
|
||||||
- [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)
|
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -328,49 +206,4 @@ pending → in_progress → done / blocked
|
|||||||
每个模块完成后:
|
每个模块完成后:
|
||||||
1. 更新本文件状态
|
1. 更新本文件状态
|
||||||
2. 更新 PROJECT_EVALUATION.md 对应行
|
2. 更新 PROJECT_EVALUATION.md 对应行
|
||||||
3. git commit message 格式: `feat(k8s): M1 SyncCluster metrics 采集`
|
3. git commit message 格式: `refactor: Q2 kubernetes.go 模块化拆分`
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
### 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 构建成功
|
|
||||||
+317
-494
@@ -1,550 +1,373 @@
|
|||||||
# TDD 验证计划 — K8s 管理功能
|
# AIOps 验证计划 — 全模块回归测试
|
||||||
|
|
||||||
> 每个模块实现前先写验证用例,实现后必须跑通,不能只编译通过。
|
> 基于 ROADMAP P0-P3 模块定义,每个模块开发前先写验证用例,实现后必须跑通。
|
||||||
|
> 最后更新: 2026-06-25
|
||||||
|
|
||||||
## 通用验证流程
|
## 通用验证流程
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
# 1. 重建后端镜像
|
# 0. 环境准备
|
||||||
cd /srv/aiops && docker-compose up -d --build backend
|
cd /srv/aiops
|
||||||
|
|
||||||
# 2. 等待 healthy
|
# 1. 重建后端
|
||||||
|
docker-compose up -d --build backend
|
||||||
sleep 10 && docker ps --format '{{.Names}} {{.Status}}' | grep aiops-backend
|
sleep 10 && docker ps --format '{{.Names}} {{.Status}}' | grep aiops-backend
|
||||||
|
|
||||||
# 3. 获取 JWT Token
|
# 2. 获取 JWT Token(用 Python 避免 shell 引号问题)
|
||||||
TOKEN=$(curl -s http://127.0.0.1:8080/api/v1/auth/login \
|
python3 -c "
|
||||||
-H "Content-Type: application/json" \
|
import urllib.request, json
|
||||||
-d '{"username":"admin","password":"CHANGE_ME"}' | jq -r '.data.token')
|
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 \
|
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\"])}')"
|
||||||
```
|
# 期望: 返回集群数组
|
||||||
|
|
||||||
---
|
# Deployment 列表
|
||||||
|
|
||||||
## 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
|
|
||||||
curl -s "http://127.0.0.1:8080/api/v1/kubernetes/prod-cluster/namespace/devops/deployments" \
|
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'
|
-H "Authorization: Bearer $TOKEN" | python3 -c "import json,sys; d=json.load(sys.stdin); print(f'deployments: {len(d[\"data\"])}')"
|
||||||
# 期望: false
|
# 期望: 返回 Deployment 数组
|
||||||
|
|
||||||
# U2: 暂停 Deployment
|
# Pod 列表
|
||||||
curl -X POST "http://127.0.0.1:8080/api/v1/kubernetes/prod-cluster/namespace/devops/deployments/redis/pause" \
|
curl -s "http://127.0.0.1:8080/api/v1/kubernetes/prod-cluster/namespace/devops/pods" \
|
||||||
-H "Authorization: Bearer $TOKEN"
|
-H "Authorization: Bearer $TOKEN" | python3 -c "import json,sys; d=json.load(sys.stdin); print(f'pods: {len(d[\"data\"])}')"
|
||||||
# 期望: code=200, msg="已暂停滚动更新"
|
# 期望: 返回 Pod 数组
|
||||||
|
|
||||||
# U3: 暂停后 — 确认 paused=true
|
# YAML 获取
|
||||||
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 编辑器数据源
|
|
||||||
curl -s "http://127.0.0.1:8080/api/v1/kubernetes/prod-cluster/namespace/devops/deployments/redis/yaml" \
|
curl -s "http://127.0.0.1:8080/api/v1/kubernetes/prod-cluster/namespace/devops/deployments/redis/yaml" \
|
||||||
-H "Authorization: Bearer *** | head -5
|
-H "Authorization: Bearer $TOKEN" | head -3
|
||||||
# 期望: 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
|
|
||||||
# 期望: apiVersion: apps/v1
|
# 期望: 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" \
|
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)}'
|
-H "Authorization: Bearer $TOKEN" | python3 -c "import json,sys; d=json.load(sys.stdin)['data']; print(f'events total: {d[\"total\"]}')"
|
||||||
# 期望: total/warning_count/normal_count 为数字,by_reason/by_namespace/by_kind/recent_warnings 为数组
|
# 期望: total 为数字
|
||||||
|
|
||||||
# U3: Events Summary 时间窗口过滤
|
# 多集群对比
|
||||||
curl -s "http://127.0.0.1:8080/api/v1/kubernetes/prod-cluster/events/summary?hours=24" \
|
curl -s "http://127.0.0.1:8080/api/v1/kubernetes/compare" \
|
||||||
-H "Authorization: Bearer $TOKEN" | jq '.data.total'
|
-H "Authorization: Bearer $TOKEN" | python3 -c "import json,sys; d=json.load(sys.stdin)['data']; print(f'clusters compared: {len(d[\"clusters\"])}')"
|
||||||
# 期望: 只返回近 24 小时事件计数
|
# 期望: clusters 数组
|
||||||
|
|
||||||
# U4: Events List 仍正常
|
# Namespace 详情
|
||||||
curl -s "http://127.0.0.1:8080/api/v1/kubernetes/prod-cluster/events" \
|
curl -s "http://127.0.0.1:8080/api/v1/kubernetes/prod-cluster/namespaces/detail" \
|
||||||
-H "Authorization: Bearer $TOKEN" | jq '.data | length'
|
-H "Authorization: Bearer $TOKEN" | python3 -c "import json,sys; d=json.load(sys.stdin); print(f'namespaces: {len(d[\"data\"])}')"
|
||||||
# 期望: 返回事件数组
|
# 期望: 返回命名空间数组
|
||||||
|
|
||||||
# U5: SPA 路由
|
# U5: 容器重新构建 + 启动
|
||||||
curl -s -o /dev/null -w "%{http_code}" http://127.0.0.1:8080/kubernetes/prod-cluster/events
|
docker-compose up -d --build backend
|
||||||
# 期望: 200
|
sleep 10
|
||||||
|
docker ps --format '{{.Names}} {{.Status}}' | grep aiops-backend
|
||||||
# U6: TypeScript + Vite 构建
|
# 期望: healthy
|
||||||
cd frontend && npx tsc --noEmit && npm run build 2>&1 | tail -3
|
|
||||||
# 期望: 零错误 + built in Ns
|
|
||||||
```
|
```
|
||||||
|
|
||||||
### 通过标准
|
### 通过标准
|
||||||
- [x] U2: Events Summary API 返回完整聚合数据(total/warning_count/normal_count/by_reason/by_namespace/by_kind/recent_warnings)
|
- [ ] U1: `go build` 零错误
|
||||||
- [x] U3: 时间窗口过滤正常(hours=24 只统计近 24h)
|
- [ ] U2: 每个拆分文件 < 800 行
|
||||||
- [x] U4: Events List API 不受影响
|
- [ ] U3: 路由数量不变
|
||||||
- [x] U5: SPA 路由返回 200
|
- [ ] U4: 7 个核心 API 端点全部返回正确数据
|
||||||
- [x] U6: TypeScript 零编译错误 + Vite 构建成功
|
- [ ] U5: 容器 healthy
|
||||||
- [x] 前端三维度柱状图正确渲染(recharts)
|
|
||||||
- [x] 图表点击联动过滤事件列表
|
|
||||||
- [x] 最新告警面板展示 Warning 事件
|
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## M13: 多集群资源对比看板
|
## P0-Q3: 前端 api.ts 模块化拆分
|
||||||
|
|
||||||
### 验证用例
|
### 验证用例
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
# U1: 登录获取 Token
|
# U1: 拆分后文件结构
|
||||||
TOKEN=$(python3 -c "
|
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
|
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 = 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')
|
req.add_header('Content-Type', 'application/json')
|
||||||
resp = urllib.request.urlopen(req)
|
resp = urllib.request.urlopen(req)
|
||||||
print(json.loads(resp.read())['data']['token'])
|
print(json.loads(resp.read())['data']['token'])
|
||||||
")
|
")
|
||||||
|
|
||||||
# U2: 多集群对比 API
|
# U4: viewer 调用写接口应被拒绝
|
||||||
curl -s "http://127.0.0.1:8080/api/v1/kubernetes/compare" \
|
curl -s -X POST "http://127.0.0.1:8080/api/v1/servers" \
|
||||||
-H "Authorization: Bearer $TOKEN" | jq '.data | {totals, cluster_count: (.clusters|length)}'
|
-H "Authorization: Bearer $VIEWER_TOKEN" \
|
||||||
# 期望: totals 含 cluster_count/node_count/pod_count/deployment_count/service_count
|
-H "Content-Type: application/json" \
|
||||||
|
-d '{"hostname": "test", "ip": "10.0.0.1"}' | python3 -m json.tool
|
||||||
|
# 期望: code=403
|
||||||
|
|
||||||
# U3: 验证每个集群包含完整字段
|
# U5: 前端验证(手动)
|
||||||
curl -s "http://127.0.0.1:8080/api/v1/kubernetes/compare" \
|
# 1. 用 viewer_test 登录前端
|
||||||
-H "Authorization: Bearer $TOKEN" | jq '.data.clusters[0] | keys'
|
# 2. 确认侧边栏无「删除」按钮
|
||||||
# 期望: 19 个字段 (id/name/code/status/node_count/pod_count/.../total_cpu_cores/total_memory_mb/master_count/worker_count)
|
# 3. 确认无权限的菜单不显示
|
||||||
|
|
||||||
# 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
|
|
||||||
```
|
```
|
||||||
|
|
||||||
### 通过标准
|
### 通过标准
|
||||||
- [x] U2: Compare API 返回 clusters 数组 + totals 聚合数据
|
- [ ] U1-U2: 创建角色和用户成功
|
||||||
- [x] U3: 每个集群包含 19 个字段(含 node 级别聚合数据)
|
- [ ] U4: 写接口返回 403
|
||||||
- [x] U4: SPA 路由返回 200
|
- [ ] U5: 前端按钮/菜单按权限显示
|
||||||
- [x] U5: TypeScript 零编译错误 + Vite 构建成功
|
|
||||||
- [x] 前端 4 类图表正确渲染(柱状图×2 + 雷达图 + 饼图)
|
|
||||||
- [x] 详细对比表格可点击跳转集群概览
|
|
||||||
- [x] totals 聚合正确(cluster_count/node_count/pod_count/deployment_count/service_count)
|
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## M14: Namespace 管理看板(资源配额 + 命名空间 CRUD)
|
## 回归测试基线(每次改动后必跑)
|
||||||
|
|
||||||
### 验证用例
|
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
# U1: 登录获取 Token
|
# === 后端回归 ===
|
||||||
TOKEN=$(python3 -c "
|
TOKEN=$(cat /tmp/aiops_token)
|
||||||
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'])
|
|
||||||
")
|
|
||||||
|
|
||||||
# U2: 命名空间详情 API(含资源计数+配额状态)
|
# 集群
|
||||||
curl -s "http://127.0.0.1:8080/api/v1/kubernetes/prod-cluster/namespaces/detail" \
|
curl -sf http://127.0.0.1:8080/api/v1/kubernetes-clusters -H "Authorization: Bearer $TOKEN" > /dev/null && echo "✅ clusters" || echo "❌ clusters"
|
||||||
-H "Authorization: Bearer $TOKEN" | jq '.data | length'
|
|
||||||
# 期望: 返回所有命名空间(含 status/age/labels/resource_counts)
|
|
||||||
|
|
||||||
# U3: 字段完整性
|
# Deployments
|
||||||
curl -s "http://127.0.0.1:8080/api/v1/kubernetes/prod-cluster/namespaces/detail" \
|
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"
|
||||||
-H "Authorization: Bearer $TOKEN" | jq '.data[0] | keys'
|
|
||||||
# 期望: 含 name/status/age/labels/resource_counts/has_resource_quota/has_limit_range
|
|
||||||
|
|
||||||
# U4: 创建命名空间
|
# Pods
|
||||||
curl -s -X POST "http://127.0.0.1:8080/api/v1/kubernetes/prod-cluster/namespaces" \
|
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"
|
||||||
-H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
|
|
||||||
-d '{"name":"test-ns-m14","labels":{"env":"test"}}'
|
|
||||||
# 期望: code=200, message="命名空间创建成功"
|
|
||||||
|
|
||||||
# U5: 创建后验证存在于列表
|
# Events
|
||||||
curl -s "http://127.0.0.1:8080/api/v1/kubernetes/prod-cluster/namespaces/detail" \
|
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"
|
||||||
-H "Authorization: Bearer $TOKEN" | jq '[.data[] | select(.name=="test-ns-m14")] | length'
|
|
||||||
# 期望: 1
|
|
||||||
|
|
||||||
# U6: 删除命名空间
|
# Namespace
|
||||||
curl -s -X DELETE "http://127.0.0.1:8080/api/v1/kubernetes/prod-cluster/namespaces/test-ns-m14" \
|
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"
|
||||||
-H "Authorization: Bearer $TOKEN"
|
|
||||||
# 期望: code=200, message="命名空间已删除"
|
|
||||||
|
|
||||||
# U7: 系统命名空间删除保护
|
# Servers
|
||||||
curl -s -X DELETE "http://127.0.0.1:8080/api/v1/kubernetes/prod-cluster/namespaces/kube-system" \
|
curl -sf http://127.0.0.1:8080/api/v1/servers -H "Authorization: Bearer $TOKEN" > /dev/null && echo "✅ servers" || echo "❌ servers"
|
||||||
-H "Authorization: Bearer $TOKEN"
|
|
||||||
# 期望: code=403, message="禁止删除系统命名空间: kube-system"
|
|
||||||
|
|
||||||
# U8: SPA 路由
|
# Pipelines
|
||||||
curl -s -o /dev/null -w "%{http_code}" http://127.0.0.1/kubernetes/prod-cluster/namespaces
|
curl -sf http://127.0.0.1:8080/api/v1/pipelines -H "Authorization: Bearer $TOKEN" > /dev/null && echo "✅ pipelines" || echo "❌ pipelines"
|
||||||
# 期望: 200
|
|
||||||
|
|
||||||
# U9: TypeScript + Vite 构建
|
# Alerts
|
||||||
cd frontend && npx tsc --noEmit && npm run build 2>&1 | tail -3
|
curl -sf http://127.0.0.1:8080/api/v1/alerts/rules -H "Authorization: Bearer $TOKEN" > /dev/null && echo "✅ alerts" || echo "❌ alerts"
|
||||||
# 期望: 零错误 + built in Ns
|
|
||||||
|
# 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] 集群概览页「管理全部」链接跳转正常
|
|
||||||
@@ -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 <CheckCommand>` 与 `automation.go:39/41` 的 `bash -c <content>` 若内容来自用户输入需**严格校验命令注入** |
|
|
||||||
| **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 处错误忽略 → ④ 补全审计导出 → ⑤ 告警引擎增加分布式协调。
|
|
||||||
Reference in new issue
Block a user