# WddSuperAgent DDS（现代化改造草案）

## 背景与总体目标
- WddSuperAgent 由多个 Go 模块组成：`agent-wdd`（通用 CLI 工具）、`agent-common`（工具库/常量/镜像命名转换等）、`agent-deploy`（K8s 部署模板生成）、`agent-operator`（运维中枢：镜像同步、K8s 操作、Harbor/MinIO 交互）。目前模块耦合度高、流程以脚本式函数为主，缺少统一 API 与测试保障。
- 目标：以“运维服务化”为方向，引入 Gin 提供标准接口，按领域拆分服务层/适配层，完善配置、安全与测试体系，并为后续 UI/自动化编排提供稳定基础。

## 现状梳理（按模块）
- `agent-common`：提供 logger、断言、文件/字符串等工具，镜像命名转换（`image` 包）、项目镜像列表（`real_project/*`），缺少接口抽象和错误语义。
- `agent-deploy`（依赖 agent-common）：生成/应用 CMII 相关的 K8s 资源模板（Dashboard、NFS、Middlewares、App、Ingress、Env Config），通过 `CommonEnvironmentConfig` 拼装 YAML/Apply 文件；存在大量硬编码路径与全局变量。
- `agent-operator`（依赖 agent-common、agent-deploy）：运维中枢，职责包含：
  - 镜像同步 DCU/DLTU 流程（`CmiiImageSyncOperator`）：Download → Compress → Upload/Push；支持从 Demo/RKE/Middle/版本号拉取，MinIO 上传，Harbor 直推（tag + push）。
  - Docker/Harbor/MinIO 适配（`image`、`minio` 包），K8s 适配（`CmiiK8sOperator`，Deployment/Pod/Node 的查询、缩容、重启、打 tag 等），部分函数含硬编码认证信息。
  - main 以交互式模式运行（mode=image/operator），无 HTTP API，流程控制与状态管理零散。
- `agent-wdd`（独立）：Cobra CLI 瑞士军刀（zsh、proxy、acme、Cloudflare、host info 等），与 CMII 运维解耦。

## 关键现有流程
- 镜像同步（DCU/DLTU）：`ImageSyncEntity` 描述 Download/Compress/Upload 条件，`A_DownloadCompressUpload` 执行拉取→压缩→上传，`A_DownloadLoadTagUpload` 负责离线包加载+重 tag + 推送；大量文件系统操作与全局路径（`OfflineImageGzipFolderPrefix`）。
- K8s 操作：`CmiiK8sOperator` 封装 client-go，基于 namespace 切换进行 Deployment/StatefulSet/Pod/Node 的查询、扩缩容、重启、删 pod/evict 等。
- 部署生成：`OctopusDeploy` 依靠模板包组合环境，按镜像 map 生成并 apply。

## 主要痛点
- 架构层次不足：领域逻辑、基础设施操作、流程编排混杂在同一包内；全局变量与硬编码路径/凭据多。
- 可测试性弱：测试多为打印/人工验证，`SaveImageListToGzipFile` 等函数甚至返回 stub；缺少接口注入、mock 与集成回归。
- 接口形态单一：仅 CLI/交互模式，缺少 HTTP API/任务编排，不利于自动化或 UI 集成。
- 配置与安全：凭据明文/硬编码（Harbor RegistryAuth、kubeconfig 路径等），无统一配置加载与密钥管理。
- 可靠性/可观察性：缺少健康探针、审计日志、指标/追踪；IO/网络无超时控制，错误语义不清晰。

## 目标架构（分层与模块化）
- **项目结构（示例）**
  ```
  /cmd/operator (HTTP + CLI 入口)
  /cmd/wdd      (保留独立 CLI)
  /pkg/domain   (实体与用例协议：ImageSyncSpec、DeployPlan、ClusterTarget 等)
  /pkg/service  (应用层：ImageSyncService、DeployService、K8sService、RegistryService、StorageService)
  /pkg/infra    (适配层：Docker/Harbor client、MinIO client、K8s client、Template renderer、Config)
  /pkg/transport/http (Gin handler，DTO 校验，统一响应)
  /pkg/transport/cli  (Cobra 命令适配，复用同一 service)
  /pkg/obs      (日志/指标/追踪/审计)
  /configs      (环境化配置，区分 dev/test/prod)
  ```
- **依赖关系**：`transport -> service -> infra`，`domain` 为纯模型；`agent-wdd` 继续独立，但可共用 `pkg/infra` 的下载/文件工具。
- **并发/任务模型**：对长耗时的镜像同步/压缩/上传采用异步任务（队列或 goroutine + work pool），任务状态持久化（可选 Bolt/SQLite/Redis），Gin 提供查询/取消接口。

## 组件设计与接口草案
- **Domain 模型**
  - `ImageSyncSpec`：源列表（cmiiNameTags/fullNames/projectVersion/sourceAuth）、压缩策略（split/monolithic、目标目录）、上传策略（minio bucket/oss prefix）、推送策略（target harbor/cred）、更新策略（是否更新集群 tag）。
  - `DeployPlan`：目标集群/namespace、镜像 map、模板参数（NFS/Ingress/SRS 等）。
  - `ClusterTarget`：kubeconfig/上下文/namespace，执行策略（超时、并发度）。
- **Service 层**
  - `ImageSyncService`：封装 Download→Compress→Upload→Push，用接口注入 `RegistryClient`、`StorageClient`、`Compressor`、`ImageNamer`；支持幂等与断点续跑（跳过已存在 gzip）。
  - `DeployService`：生成/渲染/Apply K8s 清单；可选 dry-run；依赖 `K8sApplier`（kubectl/go-client）。
  - `K8sService`：Deployment/StatefulSet/Pod/Node 读写操作，暴露给 HTTP/CLI；支持批量重启/cordon/evict。
  - `ConfigService`：集中配置加载（Viper），支持 env 覆盖与 secret 挂载。
  - `ObsService`：日志封装（zap sugared logger）、Prometheus 指标（请求量/耗时/失败率/队列长度）、OpenTelemetry trace。
- **Transport（Gin）**
  - `/api/v1/images/sync` `POST`：提交 `ImageSyncSpec`，返回任务 id。
  - `/api/v1/images/tasks/:id` `GET`：查询任务状态/日志片段。
  - `/api/v1/registry/push` `POST`：源→目标 Harbor 的 tag/push。
  - `/api/v1/deploy/apply` `POST`：提交 `DeployPlan`，可选择 `dryRun`。
  - `/api/v1/k8s/deployments/:ns/:name/tag` `PUT`：更新镜像 tag。
  - `/api/v1/healthz`、`/metrics`：健康检查与指标暴露。
- **CLI（Cobra）**
  - 复用同一 service：`wdd image sync ...`，`wdd deploy apply ...`，与 HTTP 行为保持一致。

## 关键改造点与落地方案
- **解耦与接口化**：为 Docker/Harbor/MinIO/K8s 定义接口（`RegistryClient`, `StorageClient`, `K8sClient`），在服务层通过依赖注入；现有实现迁移至 `infra`，便于 mock。
- **配置/密钥**：移除硬编码（RegistryAuth、kubeconfig 路径等），采用 `configs/*.yaml` + 环境变量覆盖；敏感信息通过文件挂载或 Secret 管理，Gin 层仅传递引用。
- **路径与存储**：统一离线镜像根路径（可配置），将 txt/gzip 列表输出迁移到任务上下文目录；为分片压缩/单包压缩提供策略接口。
- **错误与重试**：下载/上传/推送增加上下文超时与可配置重试；对局部失败的镜像保留失败列表与诊断信息。
- **并发与资源控制**：镜像拉取/压缩采用 worker pool（并发上限可配置），避免当前全局 goroutine + 共享 slice 可能的竞态。
- **可观察性**：统一日志格式；Gin middleware 注入 request-id；暴露 Prometheus 指标与 pprof；长任务输出阶段进度。
- **安全**：移除代码中的 base64 凭据；K8s 操作增加 RBAC 范围与 kubeconfig 选择；上传/下载校验 hash（md5/sha256）。
- **兼容性**：保留现有 DCU/DLTU 能力，通过 CLI 子命令封装新的 service，实现“新 API + 旧脚本可用”。

## 测试与质量保障
- **单元测试**：引入 `testify`/`gomock`，对核心服务（ImageSyncService/K8sService/DeployService）做 mock 测试；覆盖命名转换、列表生成、失败分支。
- **集成测试**：使用 kind + 本地 registry（或 test Harbor mock）、本地 MinIO 容器，跑镜像下载→压缩→推送→K8s apply 的端到端流程；提供 `make test-integration`。
- **契约测试**：Gin API 使用 `httptest` 覆盖请求校验/错误码；CLI 使用 golden 测试。
- **静态检查**：启用 `golangci-lint`（vet, ineffassign, errcheck, revive），`go test ./...` 作为最小门槛。

## 迁移路线（建议三步）
1) **基础设施抽象**：提炼 Registry/K8s/Storage/Compressor 接口，将现有实现迁入 `pkg/infra`，补齐 `SaveImageListToGzipFile` 等 stub，清理硬编码凭据/路径。
2) **服务化与测试**: 新建 `pkg/service`，重写 DCU/DLTU 流程为可注入的 `ImageSyncService`；构建 Gin 入口与 API DTO，补足单元/集成测试与 CI 流水线。
3) **运维增强**: 引入任务队列/状态持久化、指标/日志/trace，完善 K8s 操作 API，逐步替换旧 CLI 逻辑为 service 调用，并整理配置与文档。

## 成功度量
- 关键流程 API 化：镜像同步/推送、部署 apply、K8s tag 更新均有 Gin 接口与 CLI 对应子命令。
- 质量门槛：`go test ./...` 绿色，集成测试可在本地 one-command 运行；lint 无高危告警。
- 运维可用性：无硬编码密钥，配置可按环境切换；指标可在 Prometheus 抓取，健康检查可被 K8s 探针消费。

