# TDD 验证计划 — K8s 管理功能 > 每个模块实现前先写验证用例,实现后必须跑通,不能只编译通过。 ## 通用验证流程 ```bash # 1. 重建后端镜像 cd /srv/aiops && docker-compose up -d --build backend # 2. 等待 healthy sleep 10 && docker ps --format '{{.Names}} {{.Status}}' | grep aiops-backend # 3. 获取 JWT Token TOKEN=$(curl -s http://127.0.0.1:8080/api/v1/auth/login \ -H "Content-Type: application/json" \ -d '{"username":"admin","password":"CHANGE_ME"}' | jq -r '.data.token') # 4. 验证 API curl -s http://127.0.0.1:8080/api/v1/kubernetes-clusters \ -H "Authorization: Bearer $TOKEN" | jq '.' ``` --- ## 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" \ -H "Authorization: Bearer $TOKEN" | jq '.data[] | select(.name=="redis") | .paused' # 期望: false # U2: 暂停 Deployment curl -X POST "http://127.0.0.1:8080/api/v1/kubernetes/prod-cluster/namespace/devops/deployments/redis/pause" \ -H "Authorization: Bearer $TOKEN" # 期望: code=200, msg="已暂停滚动更新" # U3: 暂停后 — 确认 paused=true curl -s "http://127.0.0.1:8080/api/v1/kubernetes/prod-cluster/namespace/devops/deployments" \ -H "Authorization: Bearer $TOKEN" | jq '.data[] | select(.name=="redis") | .paused' # 期望: true # U4: 恢复 Deployment curl -X POST "http://127.0.0.1:8080/api/v1/kubernetes/prod-cluster/namespace/devops/deployments/redis/resume" \ -H "Authorization: Bearer $TOKEN" # 期望: code=200, msg="已恢复滚动更新" # U5: 恢复后 — 确认 paused=false curl -s "http://127.0.0.1:8080/api/v1/kubernetes/prod-cluster/namespace/devops/deployments" \ -H "Authorization: Bearer $TOKEN" | jq '.data[] | select(.name=="redis") | .paused' # 期望: false ``` ### 通过标准 - [x] U1: 暂停前 paused=false - [x] U2: pause API 返回 200 - [x] U3: 暂停后 paused=true - [x] U4: resume API 返回 200 - [x] U5: 恢复后 paused=false - [x] ID 路由 + Kuboard code 路由均可用 - [x] 前端操作菜单显示「暂停更新/恢复更新」动态切换 - [x] CI/CD 发布按钮可跳转到流水线页面