Files
aiops/TDD_PLAN.md
T
attacker a8b4af4409 feat(k8s): M7 容器信息Tab — 完整容器编辑器(工作容器+初始化容器)
- 新增 DeploymentEditContainers.tsx (~700行): Kuboard 风格容器编辑器
  - 工作容器 + 初始化容器分组管理(增/删/复制)
  - 完整字段编辑: 镜像/拉取策略/命令/参数/工作目录
  - 环境变量/端口(TCP/UDP/SCTP)/资源requests-limits
  - 健康检查: liveness/readiness/startup三种探针
    httpGet/tcpSocket/exec 三种检测方式可切换
  - 生命周期回调: postStart/preStop (exec/httpGet/tcpSocket)
  - 安全上下文: runAsUser/runAsGroup/privileged/capabilities等
  - 卷挂载: name/mountPath/subPath/readOnly
  - Pod级镜像拉取凭证(imagePullSecrets)编辑
- DeploymentWorkload.tsx: 容器Tab从旧DeploymentEdit替换为DeploymentEditContainers
- 纯前端工程, 后端GetYAML/UpdateYAML已完善
- 验证: tsc零错误 + vite build成功 + SPA路由200 + YAML PUT保存200

Closes M7
2026-06-22 23:29:30 +00:00

7.8 KiB
Raw Blame History

TDD 验证计划 — K8s 管理功能

每个模块实现前先写验证用例,实现后必须跑通,不能只编译通过。

通用验证流程

# 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 采集

验证用例

# 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 成功

通过标准

  • U1: 同步前 cpu_usage=0
  • U2: 同步 API 200
  • U3: 同步后 cpu_usage>0
  • U4: 集群计数正确
  • U5: 前端构建成功

M2: Pod Metrics

验证用例

# 同步后 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 字段

通过标准

  • Pod 列表 API 返回 cpu_usage_m / mem_usage_mi 字段
  • 前端 Pod 列表表格显示 CPU/内存列(KubernetesWorkloads + NamespaceResourcePage)
  • 17 个 Pod 全部有真实 metrics 数据

M3: Pod 文件上传

验证用例

# 上传文件
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 + 文件出现在列表中

通过标准

  • 上传 API 返回 200 + verify 字段匹配文件大小
  • 文件列表 (ls) 能看到上传的文件
  • ExecInPod 使用 WebSocket channel.k8s.io 协议(不再用 SPDY raw HTTP)
  • BusyBox ls 解析兼容(Mon DD HH:MM 格式)

M5: Deployment 暂停更新 + CI/CD 集成

验证用例

# 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

通过标准

  • U1: 暂停前 paused=false
  • U2: pause API 返回 200
  • U3: 暂停后 paused=true
  • U4: resume API 返回 200
  • U5: 恢复后 paused=false
  • ID 路由 + Kuboard code 路由均可用
  • 前端操作菜单显示「暂停更新/恢复更新」动态切换
  • CI/CD 发布按钮可跳转到流水线页面

M6: 编辑器基础设施 + 基本信息 Tab + YAML编辑器

验证用例

# 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" \
  -H "Authorization: Bearer *** | head -5
# 期望: apiVersion: apps/v1 / kind: Deployment / metadata:

# U3: 前端构建含 CodeMirror 依赖
curl -s http://127.0.0.1/ | grep -oP 'index-[A-Za-z0-9]+\.js'
# 期望: 新 hash(每次构建变化)

# U4: TypeScript 编译无错误
cd frontend && npx tsc --noEmit
# 期望: 退出码 0

# U5: Vite 生产构建成功
cd frontend && npm run build 2>&1 | tail -3
# 期望: built in Ns

通过标准

  • U1: yaml 路由 SPA fallback 返回 200
  • U2: YAML API 返回有效 K8s manifest(apiVersion/kind/metadata 齐全)
  • U3: 前端 bundle 含 CodeMirror(codemirror 关键字在 JS chunk 中)
  • U4: TypeScript 零编译错误
  • U5: Vite 生产构建成功
  • YamlViewer 支持弹窗模式 + 内联模式(inline prop)
  • DeploymentEditBasic 可编辑 replicas/labels/annotations/selector
  • 编辑模式 Tab 导航系统就绪(基本信息可用 + M7-M9 预留)

M7: 容器信息 Tab(工作容器 + 初始化容器)

验证用例

# 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(每次构建变化)

通过标准

  • U1: 登录成功
  • U2: YAML API 返回含 containers 的有效 K8s manifest
  • U3: PUT 保存返回 code=200
  • U4: 编辑模式 SPA 路由返回 200(非 301)
  • U5: TypeScript 零编译错误 + Vite 构建成功
  • U6: 前端 bundle 已更新(含新组件)
  • DeploymentEditContainers 支持工作容器 + 初始化容器增删
  • 每个容器可编辑:镜像/拉取策略/命令/参数/环境变量/端口/资源/健康检查/生命周期/安全上下文/卷挂载
  • 镜像拉取凭证(imagePullSecrets) Pod 级别编辑
  • 三种探针类型(httpGet/tcpSocket/exec)可切换