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
This commit is contained in:
1 parent
68a954c1c5
commit
a8b4af4409
5 files changed
+1078
-11
No files matched your search
@@ -44,7 +44,7 @@
|
||||
|------|:------:|------|
|
||||
| Pod 文件上传 | ✅ | P2 | ✅ 已完成 M3 |
|
||||
| ConfigMap/Secret 编辑 | ✅ | P2 | ✅ 已完成 M4 |
|
||||
| **Deployment 可视化编辑器** | **P1** | **M6已完成(三模式切换+基本信息Tab+YAML编辑器CodeMirror),M7-M9 进行中** |
|
||||
| **Deployment 可视化编辑器** | **P1** | **M6-M7已完成(三模式+基本信息Tab+YAML编辑器+容器编辑器),M8-M9 进行中** |
|
||||
| **YAML 编辑器增强** | **P1** | **✅ 已完成 M6 — CodeMirror 6 语法高亮+行号+折叠+内联模式** |
|
||||
| CI/CD 集成菜单项 | ✅ | P3 | ✅ 已完成 M5 — 跳转流水线页面 |
|
||||
| Deployment 暂停更新 | ✅ | P3 | ✅ 已完成 M5 — pause/resume 端点 + 暂停 Badge |
|
||||
@@ -56,7 +56,7 @@
|
||||
| `DeploymentWorkload.tsx` | 680 | ✅ 可用 | Shell 框架(header + 三模式切换 + EditModeContainer Tab 系统) |
|
||||
| `DeploymentView.tsx` | 395 | ✅ 完整 | 查看模式(状态卡片/容器模板/Pod实例/版本历史/RS) |
|
||||
| `DeploymentEditBasic.tsx` | 340 | ✅ 新增 M6 | 基本信息 Tab — replicas/labels/annotations/selector 编辑 |
|
||||
| `DeploymentEdit.tsx` | 374 | ⚠️ 过渡 | M6 临时放在容器Tab下方,M7 将被完整容器编辑器取代 |
|
||||
| `DeploymentEditContainers.tsx` | 700+ | ✅ 新增 M7 | 完整容器编辑器(工作容器+初始化容器,10+ 字段编辑) |
|
||||
| `YamlViewer.tsx` | 220 | ✅ 升级 M6 | CodeMirror 6 YAML 语法高亮+行号+折叠,弹窗+内联双模式 |
|
||||
| `DeploymentDetail.tsx` | 719 | 💀 遗留 | **旧版 tab 式详情页,仅 KubernetesWorkloads.tsx 引用,待清理** |
|
||||
| 后端 GetYAML/UpdateYAML | — | ✅ 完善 | 支持 12 种资源,PUT 直通 K8s API,**纯前端工程无需改后端** |
|
||||
@@ -66,7 +66,7 @@
|
||||
| Tab | 模块 | 预估代码量 | 核心字段 |
|
||||
|-----|------|-----------|---------|
|
||||
| 基本信息 | M6 | ~200 行 | name/namespace/labels/annotations/replicas |
|
||||
| 容器信息 | M7 | ~800 行 | 镜像/资源/端口/环境变量/健康检查/生命周期/安全上下文/卷挂载 |
|
||||
| 容器信息 | M7 ✅ | ~700 行 | 镜像/资源/端口/环境变量/健康检查/生命周期/安全上下文/卷挂载/初始化容器 |
|
||||
| 存储挂载 | M8 | ~500 行 | 6种数据卷(PVC/EmptyDir/HostPath/NFS/ConfigMap/Secret) + 挂载映射 |
|
||||
| 高级设置 | M8 | ~600 行 | 更新策略/调度/容忍/亲和/DNS/主机别名/SA/安全上下文 |
|
||||
| 服务/应用路由 | M9 | ~400 行 | Service(ClusterIP/NodePort/LB) + Ingress 规则 |
|
||||
|
||||
+4
-4
@@ -109,7 +109,7 @@
|
||||
|
||||
---
|
||||
|
||||
### M7: 容器信息 Tab(工作容器 + 初始化容器)[pending]
|
||||
### M7: 容器信息 Tab(工作容器 + 初始化容器)[done]
|
||||
**目标**: Kuboard 风格的容器编辑器,替代当前浅层 DeploymentEdit
|
||||
|
||||
**改动**:
|
||||
@@ -126,9 +126,9 @@
|
||||
- 数据卷挂载(name/mountPath/subPath/readOnly)
|
||||
|
||||
**验收标准**:
|
||||
- [ ] 可添加/删除工作容器和初始化容器
|
||||
- [ ] 每个容器的所有常规字段可编辑
|
||||
- [ ] 保存后 K8s 中实际生效
|
||||
- [x] 可添加/删除工作容器和初始化容器
|
||||
- [x] 每个容器的所有常规字段可编辑
|
||||
- [x] 保存后 K8s 中实际生效
|
||||
|
||||
---
|
||||
|
||||
|
||||
+50
@@ -176,3 +176,53 @@ cd frontend && npm run build 2>&1 | tail -3
|
||||
- [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)可切换
|
||||
File diff suppressed because it is too large.
Load diff
@@ -24,7 +24,7 @@ import { useToast } from '@/hooks/use-toast';
|
||||
import { useUserStore } from '@/store';
|
||||
import { YamlViewer } from './YamlViewer';
|
||||
import { DeploymentView } from './DeploymentView';
|
||||
import { DeploymentEdit } from './DeploymentEdit';
|
||||
import { DeploymentEditContainers } from './DeploymentEditContainers';
|
||||
import { DeploymentEditBasic } from './DeploymentEditBasic';
|
||||
|
||||
type WorkloadMode = 'view' | 'edit' | 'yaml';
|
||||
@@ -549,7 +549,7 @@ function EditModeContainer({ clusterCode, namespace, deploymentName, manifest, o
|
||||
|
||||
const tabs: Array<{ key: EditTab; label: string; icon: typeof Settings; available: boolean; badge?: string }> = [
|
||||
{ key: 'basic', label: '基本信息', icon: Settings, available: true },
|
||||
{ key: 'containers', label: '容器信息', icon: Container, available: true, badge: 'M7' },
|
||||
{ key: 'containers', label: '容器信息', icon: Container, available: true },
|
||||
{ key: 'storage', label: '存储挂载', icon: Container, available: false, badge: 'M8' },
|
||||
{ key: 'advanced', label: '高级设置', icon: Settings, available: false, badge: 'M8' },
|
||||
{ key: 'service', label: '服务/应用路由', icon: Network, available: false, badge: 'M9' },
|
||||
@@ -598,8 +598,8 @@ function EditModeContainer({ clusterCode, namespace, deploymentName, manifest, o
|
||||
onCancel={onCancel}
|
||||
/>
|
||||
) : activeTab === 'containers' ? (
|
||||
/* M7 预留:容器编辑 — 暂用旧 DeploymentEdit */
|
||||
<DeploymentEdit
|
||||
/* M7: 完整容器编辑器 — 工作容器 + 初始化容器 */
|
||||
<DeploymentEditContainers
|
||||
clusterCode={clusterCode}
|
||||
namespace={namespace}
|
||||
deploymentName={deploymentName}
|
||||
|
||||
Reference in new issue
Block a user