diff --git a/.cursor/rules/base.mdc b/.cursor/rules/base.mdc new file mode 100644 index 00000000..cbe4a9f1 --- /dev/null +++ b/.cursor/rules/base.mdc @@ -0,0 +1,38 @@ +--- +alwaysApply: true +--- +这是一个云原生运维管理平台,Go 1.24.6,Gin + Wire + Gorm,Redis 缓存,MySQL 主库。 + +## 分层与依赖 +- 统一遵循 `api/service/dao/utils` 四层,禁止跨层直接调用。 +- HTTP 入口只出现于 `api`,业务放 `service`,数据库与外部系统交互放 `dao`,通用方法沉淀在对应 `utils`。 +- 依赖注入通过 `pkg/di` + Wire,新增服务需同步更新注入图和 `generate.go`。 + +## HTTP 与中间件 +- Gin 处理请求,必须在 `api` 层做参数校验(`validator` / `binding`)与上下文超时控制。 +- Auth 使用 JWT + Casbin,所有需要身份的接口统一通过 `internal/middleware/auth.go`;无需鉴权的路由放 `internal/not_auth`。 +- HTTP 响应用统一结构:`code/message/data`,错误要区分用户错误与系统错误,日志链路包含 request-id。 + +## 业务与数据 +- Service 层聚合缓存、DAO、第三方接口,保持幂等,可用 `context.Context` 控制超时。 +- DAO 使用 Gorm,SQL 需命名方法并封装分页、排序,数据库表名蛇形,结构体字段驼峰+`gorm` tag。 +- 涉及事务使用 `gorm.Transaction`,在 Service 封装,不向 API 暴露。 +- Redis 仅作为缓存/分布式锁,key 要带业务前缀,失效时间可配置。 + +## 配置、日志与监控 +- 配置通过 Viper 加载 `config/*.yaml` + 环境变量,禁止硬编码密钥。 +- 日志使用 `zap`,中间件层打印请求摘要,Service/DAO 记录关键业务事件;敏感数据脱敏。 +- 通过 Prometheus 与 Alertmanager 统一指标和告警,新增指标放在对应 `prometheus` 子包。 + +## 编码规范 +- 全量使用 `goimports` + `golangci-lint`(至少包含 golint、staticcheck)保持风格一致。 +- 错误必须 wrap(`fmt.Errorf` 或 `pkg/errors`),向上抛出的错误信息面向开发,面向用户的提示在 API 层翻译。 +- 注释只写关键逻辑、接口、结构体,保持中英文统一(默认中文)。 +- 新功能必须附带单元测试或集成测试,最少覆盖 Service 层;执行 `go test ./...` 保持通过。 +- 代码中的注释不要出现AI痕迹,应尽量保证精简,直接描述代码逻辑即可。 + +## 安全与性能 +- 所有外部输入都要校验长度、格式、枚举;密码或密钥统一用 `internal/user/utils/password.go` 等工具。 +- 并发场景使用 `x/sync/errgroup` 或 channel,避免裸 goroutine 漏错误;需要锁时首选 `sync` 包。 +- 关注性能与内存,禁止在热路径频繁分配对象,可利用对象池或重用 buffer。 +- 对外暴露的文件、脚本、K8s 配置要保持最小权限原则,敏感配置走 `env` 或密钥管理。 \ No newline at end of file diff --git a/.gitignore b/.gitignore index 3a842875..d2b82b55 100644 --- a/.gitignore +++ b/.gitignore @@ -119,3 +119,4 @@ internal/model/kubeedge_types.go # AI-CloudOps executable AI-CloudOps +.cursor \ No newline at end of file diff --git a/Makefile b/Makefile index 8f3d0ed5..de61f8eb 100644 --- a/Makefile +++ b/Makefile @@ -35,104 +35,19 @@ lint: @go vet ./... @echo "✅ 代码检查完成" -# 生成 Swagger API 文档 (传统方式,需要手动注释) -swagger-manual: - @echo "正在生成API文档(传统方式)..." - @swag init --output ./docs --parseDependency --parseInternal --exclude ./internal/*/service --dir ./ --generalInfo main.go - @echo "API文档已生成到 docs/ 目录" - @echo "访问地址: http://localhost:8889/swagger/index.html" - -# 生成 Swagger API 文档 -swagger: - @echo "🚀 正在生成API文档..." - @echo "📄 使用生成工具生成文档..." - @bash scripts/generate-swagger.sh - @echo "✅ Swagger 文档生成完成!" - -# 兼容旧的命令名 -docs: swagger - -# 检查 Swagger 注解完整性 -swagger-check: - @echo "检查 Swagger 注解..." - @echo "正在统计 API 函数..." - @total_funcs=$$(grep -c "func.*Handler.*[Gg]et\|[Pp]ost\|[Pp]ut\|[Dd]elete" internal/*/api/*.go); \ - swagger_funcs=$$(grep -c "@Summary" internal/*/api/*.go); \ - echo "总 API 函数数量: $$total_funcs"; \ - echo "包含 Swagger 注解的函数: $$swagger_funcs"; \ - if [ $$swagger_funcs -lt $$total_funcs ]; then \ - echo "⚠️ 发现 $$(( $$total_funcs - $$swagger_funcs )) 个函数缺少 Swagger 注解"; \ - echo "缺少注解的文件:"; \ - grep -L "@Summary" internal/*/api/*.go || true; \ - else \ - echo "✅ 所有 API 函数都包含 Swagger 注解"; \ - fi - -# 启动本地服务器并打开 Swagger UI -swagger-serve: - @echo "启动服务器..." - @if pgrep -f "AI-CloudOps" > /dev/null; then \ - echo "服务器已在运行"; \ - else \ - echo "请先启动服务器: make dev 或 go run main.go"; \ - fi - @echo "Swagger UI 访问地址: http://localhost:8889/swagger/index.html" - @if command -v open > /dev/null; then \ - open http://localhost:8889/swagger/index.html; \ - elif command -v xdg-open > /dev/null; then \ - xdg-open http://localhost:8889/swagger/index.html; \ - fi - -# 验证生成的 API 文档 -swagger-validate: - @echo "验证 Swagger 文档..." - @if [ -f "docs/swagger.json" ]; then \ - echo "✅ swagger.json 文件存在"; \ - echo "文件大小: $$(du -h docs/swagger.json | cut -f1)"; \ - else \ - echo "❌ swagger.json 文件不存在,请先运行 make swagger"; \ - exit 1; \ - fi - @if [ -f "docs/swagger.yaml" ]; then \ - echo "✅ swagger.yaml 文件存在"; \ - echo "文件大小: $$(du -h docs/swagger.yaml | cut -f1)"; \ - else \ - echo "❌ swagger.yaml 文件不存在,请先运行 make swagger"; \ - exit 1; \ - fi - @api_count=$$(grep -c '"paths"' docs/swagger.json 2>/dev/null || echo "0"); \ - echo "API 路径数量: $$api_count" - -# 清理生成的文档 -swagger-clean: - @echo "清理 Swagger 文档..." - @rm -f docs/docs.go docs/swagger.json docs/swagger.yaml - @echo "✅ 文档已清理" - -# 完整的 Swagger 工作流(手动生成) -swagger-all: swagger-clean swagger swagger-validate swagger-check - @echo "🎉 Swagger 文档生成完成!" - -# 检查并修复 Swagger 注解 -swagger-fix: - @echo "检查并修复 Swagger 注解..." - @bash scripts/swagger-helper.sh fix - # 安装开发工具 install-dev-tools: @echo "安装开发工具..." @go install github.com/air-verse/air@latest - @go install github.com/swaggo/swag/cmd/swag@latest @echo "✅ 开发工具安装完成" -# 使用 Air 启动开发服务器(不自动生成 Swagger) +# 使用 Air 启动开发服务器 dev-air: @if ! command -v air &> /dev/null; then \ echo "❌ air 工具未安装,正在安装..."; \ go install github.com/air-verse/air@latest; \ fi @echo "🚀 启动开发服务器 (Air 热重载)..." - @echo "💡 提示: 如需生成文档,请手动运行 make swagger" @air # 开发环境设置(不包含自动生成功能) @@ -145,13 +60,6 @@ dev-setup: install-dev-tools @echo " make fmt-imports # 格式化代码并整理导入" @echo " make fmt-check # 检查代码格式" @echo " make lint # 代码检查 (go vet)" - @echo " make swagger # 手动生成 Swagger 文档" - @echo " make swagger-manual # 使用传统方式生成" - @echo " make swagger-validate # 验证生成的文档" - @echo " make swagger-check # 检查注解完整性" - @echo " make swagger-clean # 清理生成的文档" - @echo "" - @echo "📝 注意: Swagger 文档需要手动生成" docker-build: docker build -t Bamboo/gomodd:v1.23.1 . diff --git a/README.en.md b/README.en.md index 9a4ca20a..92564f98 100644 --- a/README.en.md +++ b/README.en.md @@ -185,7 +185,6 @@ go run main.go Backend service endpoints: - API Service: [http://localhost:8000](http://localhost:8000) -- Swagger Documentation: [http://localhost:8000/swagger](http://localhost:8000/swagger) #### 4. Start AI Service (Optional) diff --git a/README.md b/README.md index b5facd22..71110f4d 100644 --- a/README.md +++ b/README.md @@ -184,7 +184,6 @@ go run main.go 后端服务地址: - API 服务: [http://localhost:8000](http://localhost:8000) -- Swagger 文档: [http://localhost:8000/swagger](http://localhost:8000/swagger) #### 4. 启动 AI 服务 (可选) diff --git a/docs/docs.go b/docs/docs.go deleted file mode 100644 index 46e2a5d8..00000000 --- a/docs/docs.go +++ /dev/null @@ -1,51 +0,0 @@ -// Code generated by swagger-auto-gen. DO NOT EDIT. - -package docs - -import ( - "os" - "strings" - - "github.com/swaggo/swag" -) - -// SwaggerInfo holds exported Swagger Info so clients can modify it -var SwaggerInfo = &swag.Spec{ - Version: "1.0.0", - Host: "localhost:8889", - BasePath: "/", - Schemes: []string{"http", "https"}, - Title: "AI-CloudOps API", - Description: "AI-CloudOps云原生运维平台API文档 (自动生成)", - InfoInstanceName: "swagger", - SwaggerTemplate: docTemplate, - LeftDelim: "{{", - RightDelim: "}}", -} - -// isEnvTrue 检查环境变量是否为true -func isEnvTrue(key string) bool { - value := strings.ToLower(os.Getenv(key)) - return value == "true" || value == "1" || value == "yes" || value == "y" || value == "on" -} - -// isSwaggerEnabled 检查是否应该启用Swagger -func isSwaggerEnabled() bool { - // 优先检查环境变量 - if swaggerEnabled := os.Getenv("SWAGGER_ENABLED"); swaggerEnabled != "" { - return isEnvTrue("SWAGGER_ENABLED") - } - - // 默认情况下,开发环境启用,生产环境禁用 - env := strings.ToLower(os.Getenv("GIN_MODE")) - return env != "release" && env != "production" -} - -func init() { - // 只有当环境变量允许时才注册Swagger - if isSwaggerEnabled() { - swag.Register(SwaggerInfo.InstanceName(), SwaggerInfo) - } -} - -const docTemplate = `{"swagger":"2.0","info":{"title":"AI-CloudOps API","version":"1.0.0","description":"AI-CloudOps云原生运维平台API文档 (自动生成)","host":"","basePath":"","schemes":null},"host":"localhost:8889","basePath":"/","schemes":["http","https"],"consumes":["application/json"],"produces":["application/json"],"paths":{"/api/apis/create":{"post":{"path":"/api/apis/create","method":"POST","summary":"创建create","description":"CreateAPI 创建新的API","tags":["Apis","Api"],"parameters":[{"name":"body","in":"body","description":"请求体","schema":{"$ref":"#/definitions/CreateApiRequest"}}],"responses":{"201":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"ApiHandler_CreateAPI"}},"/api/apis/delete/{id}":{"delete":{"path":"/api/apis/delete/:id","method":"DELETE","summary":"删除delete","description":"DeleteAPI 删除API","tags":["Apis","Api"],"parameters":[{"name":"body","in":"body","description":"请求体","schema":{"$ref":"#/definitions/DeleteApiRequest"}}],"responses":{"200":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"ApiHandler_DeleteAPI"}},"/api/apis/detail/{id}":{"get":{"path":"/api/apis/detail/:id","method":"GET","summary":"获取detail详情","description":"DetailAPI 获取API详情","tags":["Apis","Api"],"parameters":[{"name":"body","in":"body","description":"请求体","schema":{"$ref":"#/definitions/GetApiRequest"}}],"responses":{"200":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"ApiHandler_DetailAPI"}},"/api/apis/list":{"get":{"path":"/api/apis/list","method":"GET","summary":"获取list列表","description":"ListApis 获取API列表","tags":["Apis","Api"],"parameters":[{"name":"body","in":"body","description":"请求体","schema":{"$ref":"#/definitions/ListApisRequest"}}],"responses":{"200":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"ApiHandler_ListApis"}},"/api/apis/statistics":{"get":{"path":"/api/apis/statistics","method":"GET","summary":"获取statistics列表","description":"GetApiStatistics 获取API统计","tags":["Apis","Api"],"responses":{"200":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"ApiHandler_GetApiStatistics"}},"/api/apis/update/{id}":{"put":{"path":"/api/apis/update/:id","method":"PUT","summary":"更新update","description":"UpdateAPI 更新API信息","tags":["Apis","Api"],"parameters":[{"name":"body","in":"body","description":"请求体","schema":{"$ref":"#/definitions/UpdateApiRequest"}}],"responses":{"200":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"ApiHandler_UpdateAPI"}},"/api/audit/archive":{"post":{"path":"/api/audit/archive","method":"POST","summary":"创建archive","description":"ArchiveAuditLogs 归档审计日志","tags":["Audit"],"parameters":[{"name":"body","in":"body","description":"请求体","schema":{"$ref":"#/definitions/ArchiveAuditLogsRequest"}}],"responses":{"201":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"AuditHandler_ArchiveAuditLogs"}},"/api/audit/batch-create":{"post":{"path":"/api/audit/batch-create","method":"POST","summary":"创建batch-create","description":"BatchCreateAuditLogs 批量创建审计日志 - 高性能批处理","tags":["Audit"],"parameters":[{"name":"body","in":"body","description":"请求体","schema":{"$ref":"#/definitions/AuditLogBatch"}}],"responses":{"201":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"AuditHandler_BatchCreateAuditLogs"}},"/api/audit/batch-delete":{"post":{"path":"/api/audit/batch-delete","method":"POST","summary":"创建batch-delete","description":"BatchDeleteLogs 批量删除审计日志","tags":["Audit"],"parameters":[{"name":"body","in":"body","description":"请求体","schema":{"$ref":"#/definitions/BatchDeleteRequest"}}],"responses":{"201":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"AuditHandler_BatchDeleteLogs"}},"/api/audit/create":{"post":{"path":"/api/audit/create","method":"POST","summary":"创建create","description":"CreateAuditLog 创建单个审计日志","tags":["Audit"],"parameters":[{"name":"body","in":"body","description":"请求体","schema":{"$ref":"#/definitions/CreateAuditLogRequest"}}],"responses":{"201":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"AuditHandler_CreateAuditLog"}},"/api/audit/detail/{id}":{"get":{"path":"/api/audit/detail/:id","method":"GET","summary":"获取detail详情","description":"GetAuditLogDetail 获取审计日志详情","tags":["Audit"],"parameters":[{"name":"body","in":"body","description":"请求体","schema":{"$ref":"#/definitions/GetAuditLogDetailRequest"}}],"responses":{"200":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"AuditHandler_GetAuditLogDetail"}},"/api/audit/list":{"get":{"path":"/api/audit/list","method":"GET","summary":"获取list列表","description":"ListAuditLogs 获取审计日志列表","tags":["Audit"],"parameters":[{"name":"body","in":"body","description":"请求体","schema":{"$ref":"#/definitions/ListAuditLogsRequest"}}],"responses":{"200":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"AuditHandler_ListAuditLogs"}},"/api/audit/search":{"get":{"path":"/api/audit/search","method":"GET","summary":"获取search列表","description":"SearchAuditLogs 搜索审计日志","tags":["Audit"],"parameters":[{"name":"body","in":"body","description":"请求体","schema":{"$ref":"#/definitions/SearchAuditLogsRequest"}}],"responses":{"200":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"AuditHandler_SearchAuditLogs"}},"/api/audit/statistics":{"get":{"path":"/api/audit/statistics","method":"GET","summary":"获取statistics列表","description":"GetAuditStatistics 获取审计统计信息","tags":["Audit"],"responses":{"200":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"AuditHandler_GetAuditStatistics"}},"/api/audit/types":{"get":{"path":"/api/audit/types","method":"GET","summary":"获取types列表","description":"GetAuditTypes 获取审计类型列表","tags":["Audit"],"responses":{"200":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"AuditHandler_GetAuditTypes"}},"/api/audit/{id}":{"delete":{"path":"/api/audit/:id","method":"DELETE","summary":"删除audit","description":"DeleteAuditLog 删除审计日志","tags":["Audit"],"parameters":[{"name":"body","in":"body","description":"请求体","schema":{"$ref":"#/definitions/DeleteAuditLogRequest"}}],"responses":{"200":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"AuditHandler_DeleteAuditLog"}},"/api/k8s/cluster-role-binding/create":{"post":{"path":"/api/k8s/cluster-role-binding/create","method":"POST","summary":"创建create","description":"创建create","tags":["K8s"],"responses":{"201":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"post_create"}},"/api/k8s/cluster-role-binding/delete/{cluster_id}/{name}":{"delete":{"path":"/api/k8s/cluster-role-binding/delete/:cluster_id/:name","method":"DELETE","summary":"删除:cluster_id","description":"删除:cluster_id","tags":["K8s"],"responses":{"200":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"delete_:cluster_id"}},"/api/k8s/cluster-role-binding/details/{cluster_id}/{name}":{"get":{"path":"/api/k8s/cluster-role-binding/details/:cluster_id/:name","method":"GET","summary":"获取:cluster_id详情","description":"获取:cluster_id详情","tags":["K8s"],"responses":{"200":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"get_:cluster_id"}},"/api/k8s/cluster-role-binding/list":{"get":{"path":"/api/k8s/cluster-role-binding/list","method":"GET","summary":"获取list列表","description":"获取list列表","tags":["K8s"],"responses":{"200":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"get_list"}},"/api/k8s/cluster-role-binding/update":{"put":{"path":"/api/k8s/cluster-role-binding/update","method":"PUT","summary":"更新update","description":"更新update","tags":["K8s"],"responses":{"200":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"put_update"}},"/api/k8s/cluster-role-binding/yaml":{"put":{"path":"/api/k8s/cluster-role-binding/yaml","method":"PUT","summary":"更新yaml","description":"更新yaml","tags":["K8s"],"responses":{"200":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"put_yaml"}},"/api/k8s/cluster-role-binding/yaml/{cluster_id}/{name}":{"get":{"path":"/api/k8s/cluster-role-binding/yaml/:cluster_id/:name","method":"GET","summary":"获取:cluster_id详情","description":"获取:cluster_id详情","tags":["K8s"],"responses":{"200":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"get_:cluster_id"}},"/api/k8s/cluster-role/create":{"post":{"path":"/api/k8s/cluster-role/create","method":"POST","summary":"创建create","description":"创建create","tags":["K8s"],"responses":{"201":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"post_create"}},"/api/k8s/cluster-role/delete/{cluster_id}/{name}":{"delete":{"path":"/api/k8s/cluster-role/delete/:cluster_id/:name","method":"DELETE","summary":"删除:cluster_id","description":"删除:cluster_id","tags":["K8s"],"responses":{"200":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"delete_:cluster_id"}},"/api/k8s/cluster-role/details/{cluster_id}/{name}":{"get":{"path":"/api/k8s/cluster-role/details/:cluster_id/:name","method":"GET","summary":"获取:cluster_id详情","description":"获取:cluster_id详情","tags":["K8s"],"responses":{"200":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"get_:cluster_id"}},"/api/k8s/cluster-role/list":{"get":{"path":"/api/k8s/cluster-role/list","method":"GET","summary":"获取list列表","description":"获取list列表","tags":["K8s"],"responses":{"200":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"get_list"}},"/api/k8s/cluster-role/update":{"put":{"path":"/api/k8s/cluster-role/update","method":"PUT","summary":"更新update","description":"更新update","tags":["K8s"],"responses":{"200":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"put_update"}},"/api/k8s/cluster-role/yaml":{"put":{"path":"/api/k8s/cluster-role/yaml","method":"PUT","summary":"更新yaml","description":"更新yaml","tags":["K8s"],"responses":{"200":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"put_yaml"}},"/api/k8s/cluster-role/yaml/{cluster_id}/{name}":{"get":{"path":"/api/k8s/cluster-role/yaml/:cluster_id/:name","method":"GET","summary":"获取:cluster_id详情","description":"获取:cluster_id详情","tags":["K8s"],"responses":{"200":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"get_:cluster_id"}},"/api/k8s/clusters/create":{"post":{"path":"/api/k8s/clusters/create","method":"POST","summary":"创建create","description":"CreateCluster 创建集群","tags":["K8s","K8sCluster"],"parameters":[{"name":"body","in":"body","description":"请求体","schema":{"$ref":"#/definitions/ClusterCreateReq"}}],"responses":{"201":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"K8sClusterHandler_CreateCluster"}},"/api/k8s/clusters/delete/{id}":{"delete":{"path":"/api/k8s/clusters/delete/:id","method":"DELETE","summary":"删除delete","description":"DeleteCluster 删除集群","tags":["K8s","K8sCluster"],"responses":{"200":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"K8sClusterHandler_DeleteCluster"}},"/api/k8s/clusters/detail/{id}":{"get":{"path":"/api/k8s/clusters/detail/:id","method":"GET","summary":"获取detail详情","description":"GetCluster 获取集群详情","tags":["K8s","K8sCluster"],"responses":{"200":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"K8sClusterHandler_GetCluster"}},"/api/k8s/clusters/health/{id}":{"get":{"path":"/api/k8s/clusters/health/:id","method":"GET","summary":"获取health详情","description":"CheckClusterHealth 检查集群健康状态","tags":["K8s","K8sCluster"],"responses":{"200":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"K8sClusterHandler_CheckClusterHealth"}},"/api/k8s/clusters/list":{"get":{"path":"/api/k8s/clusters/list","method":"GET","summary":"获取list列表","description":"GetAllClusters 获取集群列表","tags":["K8s","K8sCluster"],"responses":{"200":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"K8sClusterHandler_GetAllClusters"}},"/api/k8s/clusters/refresh/{id}":{"post":{"path":"/api/k8s/clusters/refresh/:id","method":"POST","summary":"创建refresh","description":"RefreshCluster 刷新集群状态","tags":["K8s","K8sCluster"],"responses":{"201":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"K8sClusterHandler_RefreshCluster"}},"/api/k8s/clusters/stats/{id}":{"get":{"path":"/api/k8s/clusters/stats/:id","method":"GET","summary":"获取stats详情","description":"GetClusterStats 获取集群统计信息","tags":["K8s","K8sCluster"],"responses":{"200":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"K8sClusterHandler_GetClusterStats"}},"/api/k8s/clusters/update/{id}":{"put":{"path":"/api/k8s/clusters/update/:id","method":"PUT","summary":"更新update","description":"UpdateCluster 更新集群","tags":["K8s","K8sCluster"],"parameters":[{"name":"body","in":"body","description":"请求体","schema":{"$ref":"#/definitions/ClusterUpdateReq"}}],"responses":{"200":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"K8sClusterHandler_UpdateCluster"}},"/api/k8s/configmaps/create":{"post":{"path":"/api/k8s/configmaps/create","method":"POST","summary":"创建create","description":"CreateConfigMap 创建ConfigMap","tags":["K8s","K8sConfigMap"],"parameters":[{"name":"body","in":"body","description":"请求体","schema":{"$ref":"#/definitions/ConfigMapCreateReq"}}],"responses":{"201":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"K8sConfigMapHandler_CreateConfigMap"}},"/api/k8s/configmaps/list":{"get":{"path":"/api/k8s/configmaps/list","method":"GET","summary":"获取list列表","description":"GetConfigMapList 获取ConfigMap列表","tags":["K8s","K8sConfigMap"],"responses":{"200":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"K8sConfigMapHandler_GetConfigMapList"}},"/api/k8s/configmaps/update":{"put":{"path":"/api/k8s/configmaps/update","method":"PUT","summary":"更新update","description":"UpdateConfigMap 更新ConfigMap","tags":["K8s","K8sConfigMap"],"parameters":[{"name":"body","in":"body","description":"请求体","schema":{"$ref":"#/definitions/ConfigMapUpdateReq"}}],"responses":{"200":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"K8sConfigMapHandler_UpdateConfigMap"}},"/api/k8s/configmaps/{cluster_id}/{namespace}/{name}":{"delete":{"path":"/api/k8s/configmaps/:cluster_id/:namespace/:name","method":"DELETE","summary":"删除:namespace","description":"DeleteConfigMap 删除ConfigMap","tags":["K8s","K8sConfigMap"],"responses":{"200":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"K8sConfigMapHandler_DeleteConfigMap"},"get":{"path":"/api/k8s/configmaps/:cluster_id/:namespace/:name","method":"GET","summary":"获取:namespace详情","description":"GetConfigMap 获取单个ConfigMap详情","tags":["K8s","K8sConfigMap"],"responses":{"200":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"K8sConfigMapHandler_GetConfigMap"}},"/api/k8s/configmaps/{cluster_id}/{namespace}/{name}/yaml":{"get":{"path":"/api/k8s/configmaps/:cluster_id/:namespace/:name/yaml","method":"GET","summary":"获取yaml详情","description":"GetConfigMapYAML 获取ConfigMap的YAML配置","tags":["K8s","K8sConfigMap"],"responses":{"200":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"K8sConfigMapHandler_GetConfigMapYAML"}},"/api/k8s/daemonsets/create":{"post":{"path":"/api/k8s/daemonsets/create","method":"POST","summary":"创建create","description":"CreateDaemonSet 创建DaemonSet","tags":["K8s","K8sDaemonSet"],"parameters":[{"name":"body","in":"body","description":"请求体","schema":{"$ref":"#/definitions/K8sDaemonSetCreateReq"}}],"responses":{"201":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"K8sDaemonSetHandler_CreateDaemonSet"}},"/api/k8s/daemonsets/delete":{"delete":{"path":"/api/k8s/daemonsets/delete","method":"DELETE","summary":"删除delete","description":"DeleteDaemonSet 删除DaemonSet","tags":["K8s","K8sDaemonSet"],"parameters":[{"name":"body","in":"body","description":"请求体","schema":{"$ref":"#/definitions/K8sDaemonSetDeleteReq"}}],"responses":{"200":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"K8sDaemonSetHandler_DeleteDaemonSet"}},"/api/k8s/daemonsets/list":{"get":{"path":"/api/k8s/daemonsets/list","method":"GET","summary":"获取list列表","description":"GetDaemonSetList 获取DaemonSet列表","tags":["K8s","K8sDaemonSet"],"responses":{"200":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"K8sDaemonSetHandler_GetDaemonSetList"}},"/api/k8s/daemonsets/restart":{"post":{"path":"/api/k8s/daemonsets/restart","method":"POST","summary":"创建restart","description":"RestartDaemonSet 重启DaemonSet","tags":["K8s","K8sDaemonSet"],"parameters":[{"name":"body","in":"body","description":"请求体","schema":{"$ref":"#/definitions/K8sDaemonSetRestartReq"}}],"responses":{"201":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"K8sDaemonSetHandler_RestartDaemonSet"}},"/api/k8s/daemonsets/update":{"put":{"path":"/api/k8s/daemonsets/update","method":"PUT","summary":"更新update","description":"UpdateDaemonSet 更新DaemonSet","tags":["K8s","K8sDaemonSet"],"parameters":[{"name":"body","in":"body","description":"请求体","schema":{"$ref":"#/definitions/K8sDaemonSetUpdateReq"}}],"responses":{"200":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"K8sDaemonSetHandler_UpdateDaemonSet"}},"/api/k8s/daemonsets/{cluster_id}":{"get":{"path":"/api/k8s/daemonsets/:cluster_id","method":"GET","summary":"获取daemonsets详情","description":"GetDaemonSetsByNamespace 根据命名空间获取DaemonSet列表","tags":["K8s","K8sDaemonSet"],"responses":{"200":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"K8sDaemonSetHandler_GetDaemonSetsByNamespace"}},"/api/k8s/daemonsets/{cluster_id}/{name}":{"get":{"path":"/api/k8s/daemonsets/:cluster_id/:name","method":"GET","summary":"获取:cluster_id详情","description":"GetDaemonSet 获取DaemonSet详情","tags":["K8s","K8sDaemonSet"],"responses":{"200":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"K8sDaemonSetHandler_GetDaemonSet"}},"/api/k8s/daemonsets/{cluster_id}/{name}/events":{"get":{"path":"/api/k8s/daemonsets/:cluster_id/:name/events","method":"GET","summary":"获取events详情","description":"GetDaemonSetEvents 获取DaemonSet事件","tags":["K8s","K8sDaemonSet"],"responses":{"200":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"K8sDaemonSetHandler_GetDaemonSetEvents"}},"/api/k8s/daemonsets/{cluster_id}/{name}/history":{"get":{"path":"/api/k8s/daemonsets/:cluster_id/:name/history","method":"GET","summary":"获取history详情","description":"GetDaemonSetHistory 获取DaemonSet历史版本","tags":["K8s","K8sDaemonSet"],"responses":{"200":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"K8sDaemonSetHandler_GetDaemonSetHistory"}},"/api/k8s/daemonsets/{cluster_id}/{name}/node-pods":{"get":{"path":"/api/k8s/daemonsets/:cluster_id/:name/node-pods","method":"GET","summary":"获取node-pods详情","description":"GetDaemonSetNodePods 获取DaemonSet在指定节点的Pod","tags":["K8s","K8sDaemonSet"],"responses":{"200":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"K8sDaemonSetHandler_GetDaemonSetNodePods"}},"/api/k8s/daemonsets/{cluster_id}/{name}/yaml":{"get":{"path":"/api/k8s/daemonsets/:cluster_id/:name/yaml","method":"GET","summary":"获取yaml详情","description":"GetDaemonSetYaml 获取DaemonSet的YAML配置","tags":["K8s","K8sDaemonSet"],"responses":{"200":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"K8sDaemonSetHandler_GetDaemonSetYaml"}},"/api/k8s/deployments/delete/{id}":{"delete":{"path":"/api/k8s/deployments/delete/:id","method":"DELETE","summary":"删除delete","description":"DeleteDeployment 删除部署","tags":["K8s","K8sDeployment"],"responses":{"200":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"K8sDeploymentHandler_DeleteDeployment"}},"/api/k8s/deployments/restart/{id}":{"post":{"path":"/api/k8s/deployments/restart/:id","method":"POST","summary":"创建restart","description":"RestartDeployment 重启部署","tags":["K8s","K8sDeployment"],"responses":{"201":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"K8sDeploymentHandler_RestartDeployment"}},"/api/k8s/deployments/update":{"post":{"path":"/api/k8s/deployments/update","method":"POST","summary":"创建update","description":"UpdateDeployment 更新部署","tags":["K8s","K8sDeployment"],"parameters":[{"name":"body","in":"body","description":"请求体","schema":{"$ref":"#/definitions/K8sDeploymentReq"}}],"responses":{"201":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"K8sDeploymentHandler_UpdateDeployment"}},"/api/k8s/deployments/{id}":{"get":{"path":"/api/k8s/deployments/:id","method":"GET","summary":"获取deployments详情","description":"GetDeployListByNamespace 根据命名空间获取部署列表","tags":["K8s","K8sDeployment"],"responses":{"200":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"K8sDeploymentHandler_GetDeployListByNamespace"}},"/api/k8s/deployments/{id}/yaml":{"get":{"path":"/api/k8s/deployments/:id/yaml","method":"GET","summary":"获取yaml详情","description":"GetDeployYaml 获取部署的YAML配置","tags":["K8s","K8sDeployment"],"responses":{"200":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"K8sDeploymentHandler_GetDeployYaml"}},"/api/k8s/events/by-deployment":{"get":{"path":"/api/k8s/events/by-deployment","method":"GET","summary":"获取by-deployment列表","description":"GetEventsByDeployment 获取Deployment相关事件","tags":["K8s","K8sEvent"],"responses":{"200":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"K8sEventHandler_GetEventsByDeployment"}},"/api/k8s/events/by-node":{"get":{"path":"/api/k8s/events/by-node","method":"GET","summary":"获取by-node列表","description":"GetEventsByNode 获取Node相关事件","tags":["K8s","K8sEvent"],"responses":{"200":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"K8sEventHandler_GetEventsByNode"}},"/api/k8s/events/by-object":{"get":{"path":"/api/k8s/events/by-object","method":"GET","summary":"获取by-object列表","description":"GetEventsByObject 根据对象获取相关事件","tags":["K8s","K8sEvent"],"responses":{"200":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"K8sEventHandler_GetEventsByObject"}},"/api/k8s/events/by-pod":{"get":{"path":"/api/k8s/events/by-pod","method":"GET","summary":"获取by-pod列表","description":"GetEventsByPod 获取Pod相关事件","tags":["K8s","K8sEvent"],"responses":{"200":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"K8sEventHandler_GetEventsByPod"}},"/api/k8s/events/by-service":{"get":{"path":"/api/k8s/events/by-service","method":"GET","summary":"获取by-service列表","description":"GetEventsByService 获取Service相关事件","tags":["K8s","K8sEvent"],"responses":{"200":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"K8sEventHandler_GetEventsByService"}},"/api/k8s/events/cleanup":{"post":{"path":"/api/k8s/events/cleanup","method":"POST","summary":"创建cleanup","description":"CleanupOldEvents 清理旧事件","tags":["K8s","K8sEvent"],"parameters":[{"name":"body","in":"body","description":"请求体","schema":{"$ref":"#/definitions/K8sEventCleanupReq"}}],"responses":{"201":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"K8sEventHandler_CleanupOldEvents"}},"/api/k8s/events/list":{"get":{"path":"/api/k8s/events/list","method":"GET","summary":"获取list列表","description":"GetEventList 获取Event列表","tags":["K8s","K8sEvent"],"responses":{"200":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"K8sEventHandler_GetEventList"}},"/api/k8s/events/statistics":{"get":{"path":"/api/k8s/events/statistics","method":"GET","summary":"获取statistics列表","description":"GetEventStatistics 获取事件统计","tags":["K8s","K8sEvent"],"responses":{"200":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"K8sEventHandler_GetEventStatistics"}},"/api/k8s/events/timeline":{"get":{"path":"/api/k8s/events/timeline","method":"GET","summary":"获取timeline列表","description":"GetEventTimeline 获取事件时间线","tags":["K8s","K8sEvent"],"responses":{"200":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"K8sEventHandler_GetEventTimeline"}},"/api/k8s/events/{cluster_id}":{"get":{"path":"/api/k8s/events/:cluster_id","method":"GET","summary":"获取events详情","description":"GetEventsByNamespace 根据命名空间获取Event列表","tags":["K8s","K8sEvent"],"responses":{"200":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"K8sEventHandler_GetEventsByNamespace"}},"/api/k8s/events/{cluster_id}/{name}":{"get":{"path":"/api/k8s/events/:cluster_id/:name","method":"GET","summary":"获取:cluster_id详情","description":"GetEvent 获取Event详情","tags":["K8s","K8sEvent"],"responses":{"200":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"K8sEventHandler_GetEvent"}},"/api/k8s/ingresses/create":{"post":{"path":"/api/k8s/ingresses/create","method":"POST","summary":"创建create","description":"CreateIngress 创建Ingress","tags":["K8s","K8sIngress"],"parameters":[{"name":"body","in":"body","description":"请求体","schema":{"$ref":"#/definitions/K8sIngressCreateReq"}}],"responses":{"201":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"K8sIngressHandler_CreateIngress"}},"/api/k8s/ingresses/delete":{"delete":{"path":"/api/k8s/ingresses/delete","method":"DELETE","summary":"删除delete","description":"DeleteIngress 删除Ingress","tags":["K8s","K8sIngress"],"parameters":[{"name":"body","in":"body","description":"请求体","schema":{"$ref":"#/definitions/K8sIngressDeleteReq"}}],"responses":{"200":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"K8sIngressHandler_DeleteIngress"}},"/api/k8s/ingresses/list":{"get":{"path":"/api/k8s/ingresses/list","method":"GET","summary":"获取list列表","description":"GetIngressList 获取Ingress列表","tags":["K8s","K8sIngress"],"responses":{"200":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"K8sIngressHandler_GetIngressList"}},"/api/k8s/ingresses/update":{"put":{"path":"/api/k8s/ingresses/update","method":"PUT","summary":"更新update","description":"UpdateIngress 更新Ingress","tags":["K8s","K8sIngress"],"parameters":[{"name":"body","in":"body","description":"请求体","schema":{"$ref":"#/definitions/K8sIngressUpdateReq"}}],"responses":{"200":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"K8sIngressHandler_UpdateIngress"}},"/api/k8s/ingresses/{cluster_id}":{"get":{"path":"/api/k8s/ingresses/:cluster_id","method":"GET","summary":"获取ingresses详情","description":"GetIngressesByNamespace 根据命名空间获取Ingress列表","tags":["K8s","K8sIngress"],"responses":{"200":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"K8sIngressHandler_GetIngressesByNamespace"}},"/api/k8s/ingresses/{cluster_id}/{name}":{"get":{"path":"/api/k8s/ingresses/:cluster_id/:name","method":"GET","summary":"获取:cluster_id详情","description":"GetIngress 获取Ingress详情","tags":["K8s","K8sIngress"],"responses":{"200":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"K8sIngressHandler_GetIngress"}},"/api/k8s/ingresses/{cluster_id}/{name}/backend-health":{"get":{"path":"/api/k8s/ingresses/:cluster_id/:name/backend-health","method":"GET","summary":"获取backend-health详情","description":"CheckIngressBackendHealth 检查Ingress后端健康状态","tags":["K8s","K8sIngress"],"responses":{"200":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"K8sIngressHandler_CheckIngressBackendHealth"}},"/api/k8s/ingresses/{cluster_id}/{name}/events":{"get":{"path":"/api/k8s/ingresses/:cluster_id/:name/events","method":"GET","summary":"获取events详情","description":"GetIngressEvents 获取Ingress事件","tags":["K8s","K8sIngress"],"responses":{"200":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"K8sIngressHandler_GetIngressEvents"}},"/api/k8s/ingresses/{cluster_id}/{name}/tls-test":{"post":{"path":"/api/k8s/ingresses/:cluster_id/:name/tls-test","method":"POST","summary":"创建tls-test","description":"TestIngressTLS 测试Ingress TLS证书","tags":["K8s","K8sIngress"],"parameters":[{"name":"body","in":"body","description":"请求体","schema":{"$ref":"#/definitions/K8sIngressTLSTestReq"}}],"responses":{"201":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"K8sIngressHandler_TestIngressTLS"}},"/api/k8s/ingresses/{cluster_id}/{name}/yaml":{"get":{"path":"/api/k8s/ingresses/:cluster_id/:name/yaml","method":"GET","summary":"获取yaml详情","description":"GetIngressYaml 获取Ingress的YAML配置","tags":["K8s","K8sIngress"],"responses":{"200":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"K8sIngressHandler_GetIngressYaml"}},"/api/k8s/namespaces/create":{"post":{"path":"/api/k8s/namespaces/create","method":"POST","summary":"创建create","description":"CreateNamespace 创建新的命名空间","tags":["K8s","K8sNamespace"],"parameters":[{"name":"body","in":"body","description":"请求体","schema":{"$ref":"#/definitions/CreateNamespaceReq"}}],"responses":{"201":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"K8sNamespaceHandler_CreateNamespace"}},"/api/k8s/namespaces/delete/{id}":{"delete":{"path":"/api/k8s/namespaces/delete/:id","method":"DELETE","summary":"删除delete","description":"DeleteNamespace 删除指定的命名空间","tags":["K8s","K8sNamespace"],"responses":{"200":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"K8sNamespaceHandler_DeleteNamespace"}},"/api/k8s/namespaces/list":{"get":{"path":"/api/k8s/namespaces/list","method":"GET","summary":"获取list列表","description":"GetClusterNamespacesForCascade 获取级联选择的命名空间列表","tags":["K8s","K8sNamespace"],"responses":{"200":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"K8sNamespaceHandler_GetClusterNamespacesForCascade"}},"/api/k8s/namespaces/select/{id}":{"get":{"path":"/api/k8s/namespaces/select/:id","method":"GET","summary":"获取select详情","description":"GetClusterNamespacesForSelect 获取用于选择的命名空间列表","tags":["K8s","K8sNamespace"],"responses":{"200":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"K8sNamespaceHandler_GetClusterNamespacesForSelect"}},"/api/k8s/namespaces/update":{"post":{"path":"/api/k8s/namespaces/update","method":"POST","summary":"创建update","description":"UpdateNamespace 更新指定命名空间","tags":["K8s","K8sNamespace"],"parameters":[{"name":"body","in":"body","description":"请求体","schema":{"$ref":"#/definitions/UpdateNamespaceReq"}}],"responses":{"201":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"K8sNamespaceHandler_UpdateNamespace"}},"/api/k8s/namespaces/{id}":{"get":{"path":"/api/k8s/namespaces/:id","method":"GET","summary":"获取namespaces详情","description":"GetNamespaceDetails 获取指定命名空间的详情","tags":["K8s","K8sNamespace"],"responses":{"200":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"K8sNamespaceHandler_GetNamespaceDetails"}},"/api/k8s/namespaces/{id}/events":{"get":{"path":"/api/k8s/namespaces/:id/events","method":"GET","summary":"获取events详情","description":"GetNamespaceEvents 获取指定命名空间中的事件","tags":["K8s","K8sNamespace"],"responses":{"200":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"K8sNamespaceHandler_GetNamespaceEvents"}},"/api/k8s/namespaces/{id}/resources":{"get":{"path":"/api/k8s/namespaces/:id/resources","method":"GET","summary":"获取resources详情","description":"GetNamespaceResources 获取指定命名空间中的资源","tags":["K8s","K8sNamespace"],"responses":{"200":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"K8sNamespaceHandler_GetNamespaceResources"}},"/api/k8s/nodes/cordon":{"post":{"path":"/api/k8s/nodes/cordon","method":"POST","summary":"创建cordon","description":"CordonNode 禁止节点调度新的Pod","tags":["K8s","K8sNode"],"parameters":[{"name":"body","in":"body","description":"请求体","schema":{"$ref":"#/definitions/NodeCordonReq"}}],"responses":{"201":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"K8sNodeHandler_CordonNode"}},"/api/k8s/nodes/detail/{node_name}":{"get":{"path":"/api/k8s/nodes/detail/:node_name","method":"GET","summary":"获取detail详情","description":"GetNodeDetail 获取指定名称的节点详情","tags":["K8s","K8sNode"],"responses":{"200":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"K8sNodeHandler_GetNodeDetail"}},"/api/k8s/nodes/drain":{"post":{"path":"/api/k8s/nodes/drain","method":"POST","summary":"创建drain","description":"DrainNode 驱逐节点上的所有Pod","tags":["K8s","K8sNode"],"parameters":[{"name":"body","in":"body","description":"请求体","schema":{"$ref":"#/definitions/NodeDrainReq"}}],"responses":{"201":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"K8sNodeHandler_DrainNode"}},"/api/k8s/nodes/labels/add":{"post":{"path":"/api/k8s/nodes/labels/add","method":"POST","summary":"创建add","description":"AddLabelNodes 为节点添加标签","tags":["K8s","K8sNode"],"parameters":[{"name":"body","in":"body","description":"请求体","schema":{"$ref":"#/definitions/LabelK8sNodesReq"}}],"responses":{"201":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"K8sNodeHandler_AddLabelNodes"}},"/api/k8s/nodes/labels/delete":{"delete":{"path":"/api/k8s/nodes/labels/delete","method":"DELETE","summary":"删除delete","description":"DeleteLabelNodes 删除节点标签","tags":["K8s","K8sNode"],"parameters":[{"name":"body","in":"body","description":"请求体","schema":{"$ref":"#/definitions/LabelK8sNodesReq"}}],"responses":{"200":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"K8sNodeHandler_DeleteLabelNodes"}},"/api/k8s/nodes/list/{id}":{"get":{"path":"/api/k8s/nodes/list/:id","method":"GET","summary":"获取list详情","description":"GetNodeList 获取节点列表","tags":["K8s","K8sNode"],"responses":{"200":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"K8sNodeHandler_GetNodeList"}},"/api/k8s/nodes/schedule/switch":{"post":{"path":"/api/k8s/nodes/schedule/switch","method":"POST","summary":"创建switch","description":"SwitchNodeSchedule 切换节点调度状态","tags":["K8s","K8sNode"],"parameters":[{"name":"body","in":"body","description":"请求体","schema":{"$ref":"#/definitions/ScheduleK8sNodesReq"}}],"responses":{"201":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"K8sNodeHandler_SwitchNodeSchedule"}},"/api/k8s/nodes/taints/add":{"post":{"path":"/api/k8s/nodes/taints/add","method":"POST","summary":"创建add","description":"AddNodeTaints 添加节点污点","tags":["K8s","K8sNode"],"parameters":[{"name":"body","in":"body","description":"请求体","schema":{"$ref":"#/definitions/TaintK8sNodesReq"}}],"responses":{"201":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"K8sNodeHandler_AddNodeTaints"}},"/api/k8s/nodes/taints/check":{"post":{"path":"/api/k8s/nodes/taints/check","method":"POST","summary":"创建check","description":"CheckTaintYaml 检查污点YAML配置","tags":["K8s","K8sNode"],"parameters":[{"name":"body","in":"body","description":"请求体","schema":{"$ref":"#/definitions/TaintK8sNodesReq"}}],"responses":{"201":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"K8sNodeHandler_CheckTaintYaml"}},"/api/k8s/nodes/taints/delete":{"delete":{"path":"/api/k8s/nodes/taints/delete","method":"DELETE","summary":"删除delete","description":"DeleteNodeTaints 删除节点污点","tags":["K8s","K8sNode"],"parameters":[{"name":"body","in":"body","description":"请求体","schema":{"$ref":"#/definitions/TaintK8sNodesReq"}}],"responses":{"200":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"K8sNodeHandler_DeleteNodeTaints"}},"/api/k8s/nodes/uncordon":{"post":{"path":"/api/k8s/nodes/uncordon","method":"POST","summary":"创建uncordon","description":"UncordonNode 解除节点调度限制","tags":["K8s","K8sNode"],"parameters":[{"name":"body","in":"body","description":"请求体","schema":{"$ref":"#/definitions/NodeUncordonReq"}}],"responses":{"201":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"K8sNodeHandler_UncordonNode"}},"/api/k8s/nodes/{cluster_id}/{node_name}/events":{"get":{"path":"/api/k8s/nodes/:cluster_id/:node_name/events","method":"GET","summary":"获取events详情","description":"GetNodeEvents 获取节点事件","tags":["K8s","K8sNode"],"parameters":[{"name":"body","in":"body","description":"请求体","schema":{"$ref":"#/definitions/NodeEventsReq"}}],"responses":{"200":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"K8sNodeHandler_GetNodeEvents"}},"/api/k8s/nodes/{cluster_id}/{node_name}/resources":{"get":{"path":"/api/k8s/nodes/:cluster_id/:node_name/resources","method":"GET","summary":"获取resources详情","description":"GetNodeResources 获取节点资源使用情况","tags":["K8s","K8sNode"],"parameters":[{"name":"body","in":"body","description":"请求体","schema":{"$ref":"#/definitions/NodeResourcesReq"}}],"responses":{"200":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"K8sNodeHandler_GetNodeResources"}},"/api/k8s/nodes/{cluster_id}/{node_name}/taints":{"get":{"path":"/api/k8s/nodes/:cluster_id/:node_name/taints","method":"GET","summary":"获取taints详情","description":"GetNodeTaints 获取节点污点列表","tags":["K8s","K8sNode"],"responses":{"200":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"K8sNodeHandler_GetNodeTaints"}},"/api/k8s/pods/delete/{id}":{"delete":{"path":"/api/k8s/pods/delete/:id","method":"DELETE","summary":"删除delete","description":"DeletePod 删除Pod","tags":["K8s","K8sPod"],"responses":{"200":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"K8sPodHandler_DeletePod"}},"/api/k8s/pods/{id}":{"get":{"path":"/api/k8s/pods/:id","method":"GET","summary":"获取pods详情","description":"GetPodListByNamespace 获取Pod列表","tags":["K8s","K8sPod"],"responses":{"200":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"K8sPodHandler_GetPodListByNamespace"}},"/api/k8s/pods/{id}/node":{"get":{"path":"/api/k8s/pods/:id/node","method":"GET","summary":"获取node详情","description":"GetPodsListByNodeName 根据节点名获取Pod列表","tags":["K8s","K8sPod"],"responses":{"200":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"K8sPodHandler_GetPodsListByNodeName"}},"/api/k8s/pods/{id}/{podName}/containers":{"get":{"path":"/api/k8s/pods/:id/:podName/containers","method":"GET","summary":"获取containers详情","description":"GetPodContainers 获取Pod的容器列表","tags":["K8s","K8sPod"],"responses":{"200":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"K8sPodHandler_GetPodContainers"}},"/api/k8s/pods/{id}/{podName}/yaml":{"get":{"path":"/api/k8s/pods/:id/:podName/yaml","method":"GET","summary":"获取yaml详情","description":"GetPodYaml 获取Pod的YAML配置","tags":["K8s","K8sPod"],"responses":{"200":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"K8sPodHandler_GetPodYaml"}},"/api/k8s/pods/{id}/{podName}/{container}/logs":{"get":{"path":"/api/k8s/pods/:id/:podName/:container/logs","method":"GET","summary":"获取logs详情","description":"GetContainerLogs 获取容器日志","tags":["K8s","K8sPod"],"responses":{"200":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"K8sPodHandler_GetContainerLogs"}},"/api/k8s/pvcs/create":{"post":{"path":"/api/k8s/pvcs/create","method":"POST","summary":"创建create","description":"CreatePVC 创建PVC","tags":["K8s","K8sPVC"],"parameters":[{"name":"body","in":"body","description":"请求体","schema":{"$ref":"#/definitions/K8sPVCCreateReq"}}],"responses":{"201":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"K8sPVCHandler_CreatePVC"}},"/api/k8s/pvcs/delete":{"delete":{"path":"/api/k8s/pvcs/delete","method":"DELETE","summary":"删除delete","description":"DeletePVC 删除PVC","tags":["K8s","K8sPVC"],"parameters":[{"name":"body","in":"body","description":"请求体","schema":{"$ref":"#/definitions/K8sPVCDeleteReq"}}],"responses":{"200":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"K8sPVCHandler_DeletePVC"}},"/api/k8s/pvcs/list":{"get":{"path":"/api/k8s/pvcs/list","method":"GET","summary":"获取list列表","description":"GetPVCList 获取PVC列表","tags":["K8s","K8sPVC"],"responses":{"200":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"K8sPVCHandler_GetPVCList"}},"/api/k8s/pvcs/update":{"put":{"path":"/api/k8s/pvcs/update","method":"PUT","summary":"更新update","description":"UpdatePVC 更新PVC","tags":["K8s","K8sPVC"],"parameters":[{"name":"body","in":"body","description":"请求体","schema":{"$ref":"#/definitions/K8sPVCUpdateReq"}}],"responses":{"200":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"K8sPVCHandler_UpdatePVC"}},"/api/k8s/pvcs/{cluster_id}":{"get":{"path":"/api/k8s/pvcs/:cluster_id","method":"GET","summary":"获取pvcs详情","description":"GetPVCsByNamespace 根据命名空间获取PVC列表","tags":["K8s","K8sPVC"],"responses":{"200":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"K8sPVCHandler_GetPVCsByNamespace"}},"/api/k8s/pvcs/{cluster_id}/{name}":{"get":{"path":"/api/k8s/pvcs/:cluster_id/:name","method":"GET","summary":"获取:cluster_id详情","description":"GetPVC 获取PVC详情","tags":["K8s","K8sPVC"],"responses":{"200":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"K8sPVCHandler_GetPVC"}},"/api/k8s/pvcs/{cluster_id}/{name}/events":{"get":{"path":"/api/k8s/pvcs/:cluster_id/:name/events","method":"GET","summary":"获取events详情","description":"GetPVCEvents 获取PVC事件","tags":["K8s","K8sPVC"],"responses":{"200":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"K8sPVCHandler_GetPVCEvents"}},"/api/k8s/pvcs/{cluster_id}/{name}/expand":{"post":{"path":"/api/k8s/pvcs/:cluster_id/:name/expand","method":"POST","summary":"创建expand","description":"ExpandPVC 扩容PVC","tags":["K8s","K8sPVC"],"parameters":[{"name":"body","in":"body","description":"请求体","schema":{"$ref":"#/definitions/K8sPVCExpandReq"}}],"responses":{"201":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"K8sPVCHandler_ExpandPVC"}},"/api/k8s/pvcs/{cluster_id}/{name}/usage":{"get":{"path":"/api/k8s/pvcs/:cluster_id/:name/usage","method":"GET","summary":"获取usage详情","description":"GetPVCUsage 获取PVC使用情况","tags":["K8s","K8sPVC"],"responses":{"200":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"K8sPVCHandler_GetPVCUsage"}},"/api/k8s/pvcs/{cluster_id}/{name}/yaml":{"get":{"path":"/api/k8s/pvcs/:cluster_id/:name/yaml","method":"GET","summary":"获取yaml详情","description":"GetPVCYaml 获取PVC的YAML配置","tags":["K8s","K8sPVC"],"responses":{"200":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"K8sPVCHandler_GetPVCYaml"}},"/api/k8s/pvs/create":{"post":{"path":"/api/k8s/pvs/create","method":"POST","summary":"创建create","description":"CreatePV 创建PV","tags":["K8s","K8sPV"],"parameters":[{"name":"body","in":"body","description":"请求体","schema":{"$ref":"#/definitions/K8sPVCreateReq"}}],"responses":{"201":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"K8sPVHandler_CreatePV"}},"/api/k8s/pvs/delete":{"delete":{"path":"/api/k8s/pvs/delete","method":"DELETE","summary":"删除delete","description":"DeletePV 删除PV","tags":["K8s","K8sPV"],"parameters":[{"name":"body","in":"body","description":"请求体","schema":{"$ref":"#/definitions/K8sPVDeleteReq"}}],"responses":{"200":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"K8sPVHandler_DeletePV"}},"/api/k8s/pvs/list":{"get":{"path":"/api/k8s/pvs/list","method":"GET","summary":"获取list列表","description":"GetPVList 获取PV列表","tags":["K8s","K8sPV"],"responses":{"200":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"K8sPVHandler_GetPVList"}},"/api/k8s/pvs/update":{"put":{"path":"/api/k8s/pvs/update","method":"PUT","summary":"更新update","description":"UpdatePV 更新PV","tags":["K8s","K8sPV"],"parameters":[{"name":"body","in":"body","description":"请求体","schema":{"$ref":"#/definitions/K8sPVUpdateReq"}}],"responses":{"200":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"K8sPVHandler_UpdatePV"}},"/api/k8s/pvs/{cluster_id}":{"get":{"path":"/api/k8s/pvs/:cluster_id","method":"GET","summary":"获取pvs详情","description":"GetPVsByCluster 根据集群获取PV列表","tags":["K8s","K8sPV"],"responses":{"200":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"K8sPVHandler_GetPVsByCluster"}},"/api/k8s/pvs/{cluster_id}/{name}":{"get":{"path":"/api/k8s/pvs/:cluster_id/:name","method":"GET","summary":"获取:cluster_id详情","description":"GetPV 获取PV详情","tags":["K8s","K8sPV"],"responses":{"200":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"K8sPVHandler_GetPV"}},"/api/k8s/pvs/{cluster_id}/{name}/events":{"get":{"path":"/api/k8s/pvs/:cluster_id/:name/events","method":"GET","summary":"获取events详情","description":"GetPVEvents 获取PV事件","tags":["K8s","K8sPV"],"responses":{"200":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"K8sPVHandler_GetPVEvents"}},"/api/k8s/pvs/{cluster_id}/{name}/reclaim":{"post":{"path":"/api/k8s/pvs/:cluster_id/:name/reclaim","method":"POST","summary":"创建reclaim","description":"ReclaimPV 回收PV","tags":["K8s","K8sPV"],"parameters":[{"name":"body","in":"body","description":"请求体","schema":{"$ref":"#/definitions/K8sPVReclaimReq"}}],"responses":{"201":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"K8sPVHandler_ReclaimPV"}},"/api/k8s/pvs/{cluster_id}/{name}/usage":{"get":{"path":"/api/k8s/pvs/:cluster_id/:name/usage","method":"GET","summary":"获取usage详情","description":"GetPVUsage 获取PV使用情况","tags":["K8s","K8sPV"],"responses":{"200":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"K8sPVHandler_GetPVUsage"}},"/api/k8s/pvs/{cluster_id}/{name}/yaml":{"get":{"path":"/api/k8s/pvs/:cluster_id/:name/yaml","method":"GET","summary":"获取yaml详情","description":"GetPVYaml 获取PV的YAML配置","tags":["K8s","K8sPV"],"responses":{"200":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"K8sPVHandler_GetPVYaml"}},"/api/k8s/rbac/check-permissions":{"post":{"path":"/api/k8s/rbac/check-permissions","method":"POST","summary":"创建check-permissions","description":"创建check-permissions","tags":["K8s"],"responses":{"201":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"post_check-permissions"}},"/api/k8s/rbac/resource-verbs":{"get":{"path":"/api/k8s/rbac/resource-verbs","method":"GET","summary":"获取resource-verbs列表","description":"获取resource-verbs列表","tags":["K8s"],"responses":{"200":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"get_resource-verbs"}},"/api/k8s/rbac/statistics/{cluster_id}":{"get":{"path":"/api/k8s/rbac/statistics/:cluster_id","method":"GET","summary":"获取statistics详情","description":"获取statistics详情","tags":["K8s"],"responses":{"200":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"get_statistics"}},"/api/k8s/rbac/subject-permissions/{cluster_id}":{"post":{"path":"/api/k8s/rbac/subject-permissions/:cluster_id","method":"POST","summary":"创建subject-permissions","description":"创建subject-permissions","tags":["K8s"],"responses":{"201":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"post_subject-permissions"}},"/api/k8s/role-binding/create":{"post":{"path":"/api/k8s/role-binding/create","method":"POST","summary":"创建create","description":"创建create","tags":["K8s"],"responses":{"201":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"post_create"}},"/api/k8s/role-binding/delete/{cluster_id}/{namespace}/{name}":{"delete":{"path":"/api/k8s/role-binding/delete/:cluster_id/:namespace/:name","method":"DELETE","summary":"删除:namespace","description":"删除:namespace","tags":["K8s"],"responses":{"200":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"delete_:namespace"}},"/api/k8s/role-binding/details/{cluster_id}/{namespace}/{name}":{"get":{"path":"/api/k8s/role-binding/details/:cluster_id/:namespace/:name","method":"GET","summary":"获取:namespace详情","description":"获取:namespace详情","tags":["K8s"],"responses":{"200":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"get_:namespace"}},"/api/k8s/role-binding/list":{"get":{"path":"/api/k8s/role-binding/list","method":"GET","summary":"获取list列表","description":"获取list列表","tags":["K8s"],"responses":{"200":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"get_list"}},"/api/k8s/role-binding/update":{"put":{"path":"/api/k8s/role-binding/update","method":"PUT","summary":"更新update","description":"更新update","tags":["K8s"],"responses":{"200":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"put_update"}},"/api/k8s/role-binding/yaml":{"put":{"path":"/api/k8s/role-binding/yaml","method":"PUT","summary":"更新yaml","description":"更新yaml","tags":["K8s"],"responses":{"200":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"put_yaml"}},"/api/k8s/role-binding/yaml/{cluster_id}/{namespace}/{name}":{"get":{"path":"/api/k8s/role-binding/yaml/:cluster_id/:namespace/:name","method":"GET","summary":"获取:namespace详情","description":"获取:namespace详情","tags":["K8s"],"responses":{"200":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"get_:namespace"}},"/api/k8s/role/create":{"post":{"path":"/api/k8s/role/create","method":"POST","summary":"创建create","description":"创建create","tags":["K8s"],"responses":{"201":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"post_create"}},"/api/k8s/role/delete/{cluster_id}/{namespace}/{name}":{"delete":{"path":"/api/k8s/role/delete/:cluster_id/:namespace/:name","method":"DELETE","summary":"删除:namespace","description":"删除:namespace","tags":["K8s"],"responses":{"200":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"delete_:namespace"}},"/api/k8s/role/details/{cluster_id}/{namespace}/{name}":{"get":{"path":"/api/k8s/role/details/:cluster_id/:namespace/:name","method":"GET","summary":"获取:namespace详情","description":"获取:namespace详情","tags":["K8s"],"responses":{"200":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"get_:namespace"}},"/api/k8s/role/list":{"get":{"path":"/api/k8s/role/list","method":"GET","summary":"获取list列表","description":"获取list列表","tags":["K8s"],"responses":{"200":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"get_list"}},"/api/k8s/role/update":{"put":{"path":"/api/k8s/role/update","method":"PUT","summary":"更新update","description":"更新update","tags":["K8s"],"responses":{"200":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"put_update"}},"/api/k8s/role/yaml":{"put":{"path":"/api/k8s/role/yaml","method":"PUT","summary":"更新yaml","description":"更新yaml","tags":["K8s"],"responses":{"200":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"put_yaml"}},"/api/k8s/role/yaml/{cluster_id}/{namespace}/{name}":{"get":{"path":"/api/k8s/role/yaml/:cluster_id/:namespace/:name","method":"GET","summary":"获取:namespace详情","description":"获取:namespace详情","tags":["K8s"],"responses":{"200":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"get_:namespace"}},"/api/k8s/secrets/create":{"post":{"path":"/api/k8s/secrets/create","method":"POST","summary":"创建create","description":"CreateSecret 创建Secret","tags":["K8s","K8sSecret"],"parameters":[{"name":"body","in":"body","description":"请求体","schema":{"$ref":"#/definitions/SecretCreateReq"}}],"responses":{"201":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"K8sSecretHandler_CreateSecret"}},"/api/k8s/secrets/list":{"get":{"path":"/api/k8s/secrets/list","method":"GET","summary":"获取list列表","description":"GetSecretList 获取Secret列表","tags":["K8s","K8sSecret"],"responses":{"200":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"K8sSecretHandler_GetSecretList"}},"/api/k8s/secrets/update":{"put":{"path":"/api/k8s/secrets/update","method":"PUT","summary":"更新update","description":"UpdateSecret 更新Secret","tags":["K8s","K8sSecret"],"parameters":[{"name":"body","in":"body","description":"请求体","schema":{"$ref":"#/definitions/SecretUpdateReq"}}],"responses":{"200":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"K8sSecretHandler_UpdateSecret"}},"/api/k8s/secrets/{cluster_id}/{namespace}/{name}":{"delete":{"path":"/api/k8s/secrets/:cluster_id/:namespace/:name","method":"DELETE","summary":"删除:namespace","description":"DeleteSecret 删除Secret","tags":["K8s","K8sSecret"],"responses":{"200":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"K8sSecretHandler_DeleteSecret"},"get":{"path":"/api/k8s/secrets/:cluster_id/:namespace/:name","method":"GET","summary":"获取:namespace详情","description":"GetSecret 获取单个Secret详情","tags":["K8s","K8sSecret"],"responses":{"200":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"K8sSecretHandler_GetSecret"}},"/api/k8s/secrets/{cluster_id}/{namespace}/{name}/yaml":{"get":{"path":"/api/k8s/secrets/:cluster_id/:namespace/:name/yaml","method":"GET","summary":"获取yaml详情","description":"GetSecretYAML 获取Secret的YAML配置","tags":["K8s","K8sSecret"],"responses":{"200":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"K8sSecretHandler_GetSecretYAML"}},"/api/k8s/serviceaccount/create":{"post":{"path":"/api/k8s/serviceaccount/create","method":"POST","summary":"创建create","description":"CreateServiceAccount 创建ServiceAccount","tags":["K8s","K8sServiceAccount"],"parameters":[{"name":"body","in":"body","description":"请求体","schema":{"$ref":"#/definitions/ServiceAccountCreateReq"}}],"responses":{"201":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"K8sServiceAccountHandler_CreateServiceAccount"}},"/api/k8s/serviceaccount/delete":{"delete":{"path":"/api/k8s/serviceaccount/delete","method":"DELETE","summary":"删除delete","description":"DeleteServiceAccount 删除ServiceAccount","tags":["K8s","K8sServiceAccount"],"parameters":[{"name":"body","in":"body","description":"请求体","schema":{"$ref":"#/definitions/ServiceAccountDeleteReq"}}],"responses":{"200":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"K8sServiceAccountHandler_DeleteServiceAccount"}},"/api/k8s/serviceaccount/details":{"get":{"path":"/api/k8s/serviceaccount/details","method":"GET","summary":"获取details列表","description":"GetServiceAccountDetails 获取ServiceAccount详情","tags":["K8s","K8sServiceAccount"],"responses":{"200":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"K8sServiceAccountHandler_GetServiceAccountDetails"}},"/api/k8s/serviceaccount/list":{"get":{"path":"/api/k8s/serviceaccount/list","method":"GET","summary":"获取list列表","description":"GetServiceAccountList 获取ServiceAccount列表","tags":["K8s","K8sServiceAccount"],"responses":{"200":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"K8sServiceAccountHandler_GetServiceAccountList"}},"/api/k8s/serviceaccount/statistics":{"get":{"path":"/api/k8s/serviceaccount/statistics","method":"GET","summary":"获取statistics列表","description":"GetServiceAccountStatistics 获取ServiceAccount统计信息","tags":["K8s","K8sServiceAccount"],"responses":{"200":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"K8sServiceAccountHandler_GetServiceAccountStatistics"}},"/api/k8s/serviceaccount/token":{"post":{"path":"/api/k8s/serviceaccount/token","method":"POST","summary":"创建token","description":"GetServiceAccountToken 获取ServiceAccount令牌","tags":["K8s","K8sServiceAccount"],"parameters":[{"name":"body","in":"body","description":"请求体","schema":{"$ref":"#/definitions/ServiceAccountTokenReq"}}],"responses":{"201":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"K8sServiceAccountHandler_GetServiceAccountToken"}},"/api/k8s/serviceaccount/update":{"put":{"path":"/api/k8s/serviceaccount/update","method":"PUT","summary":"更新update","description":"UpdateServiceAccount 更新ServiceAccount","tags":["K8s","K8sServiceAccount"],"parameters":[{"name":"body","in":"body","description":"请求体","schema":{"$ref":"#/definitions/ServiceAccountUpdateReq"}}],"responses":{"200":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"K8sServiceAccountHandler_UpdateServiceAccount"}},"/api/k8s/serviceaccount/yaml":{"get":{"path":"/api/k8s/serviceaccount/yaml","method":"GET","summary":"获取yaml列表","description":"GetServiceAccountYaml 获取ServiceAccount的YAML配置","tags":["K8s","K8sServiceAccount"],"responses":{"200":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"K8sServiceAccountHandler_GetServiceAccountYaml"},"put":{"path":"/api/k8s/serviceaccount/yaml","method":"PUT","summary":"更新yaml","description":"UpdateServiceAccountYaml 更新ServiceAccount的YAML配置","tags":["K8s","K8sServiceAccount"],"parameters":[{"name":"body","in":"body","description":"请求体","schema":{"$ref":"#/definitions/ServiceAccountUpdateYamlReq"}}],"responses":{"200":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"K8sServiceAccountHandler_UpdateServiceAccountYaml"}},"/api/k8s/services/delete/{id}":{"delete":{"path":"/api/k8s/services/delete/:id","method":"DELETE","summary":"删除delete","description":"DeleteService 删除指定 Service","tags":["K8s","K8sSvc"],"responses":{"200":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"K8sSvcHandler_DeleteService"}},"/api/k8s/services/update":{"post":{"path":"/api/k8s/services/update","method":"POST","summary":"创建update","description":"UpdateService 更新指定 Name 的 Service","tags":["K8s","K8sSvc"],"parameters":[{"name":"body","in":"body","description":"请求体","schema":{"$ref":"#/definitions/K8sServiceReq"}}],"responses":{"201":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"K8sSvcHandler_UpdateService"}},"/api/k8s/services/{id}":{"get":{"path":"/api/k8s/services/:id","method":"GET","summary":"获取services详情","description":"GetServiceListByNamespace 根据命名空间获取 Service 列表","tags":["K8s","K8sSvc"],"responses":{"200":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"K8sSvcHandler_GetServiceListByNamespace"}},"/api/k8s/services/{id}/{svcName}/yaml":{"get":{"path":"/api/k8s/services/:id/:svcName/yaml","method":"GET","summary":"获取yaml详情","description":"GetServiceYaml 获取 Service 的 YAML 配置","tags":["K8s","K8sSvc"],"responses":{"200":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"K8sSvcHandler_GetServiceYaml"}},"/api/k8s/statefulsets/create":{"post":{"path":"/api/k8s/statefulsets/create","method":"POST","summary":"创建create","description":"CreateStatefulSet 创建StatefulSet","tags":["K8s","K8sStatefulSet"],"parameters":[{"name":"body","in":"body","description":"请求体","schema":{"$ref":"#/definitions/StatefulSetCreateReq"}}],"responses":{"201":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"K8sStatefulSetHandler_CreateStatefulSet"}},"/api/k8s/statefulsets/list":{"get":{"path":"/api/k8s/statefulsets/list","method":"GET","summary":"获取list列表","description":"GetStatefulSetList 获取StatefulSet列表","tags":["K8s","K8sStatefulSet"],"responses":{"200":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"K8sStatefulSetHandler_GetStatefulSetList"}},"/api/k8s/statefulsets/scale":{"post":{"path":"/api/k8s/statefulsets/scale","method":"POST","summary":"创建scale","description":"ScaleStatefulSet 扩缩容StatefulSet","tags":["K8s","K8sStatefulSet"],"parameters":[{"name":"body","in":"body","description":"请求体","schema":{"$ref":"#/definitions/StatefulSetScaleReq"}}],"responses":{"201":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"K8sStatefulSetHandler_ScaleStatefulSet"}},"/api/k8s/statefulsets/update":{"put":{"path":"/api/k8s/statefulsets/update","method":"PUT","summary":"更新update","description":"UpdateStatefulSet 更新StatefulSet","tags":["K8s","K8sStatefulSet"],"parameters":[{"name":"body","in":"body","description":"请求体","schema":{"$ref":"#/definitions/StatefulSetUpdateReq"}}],"responses":{"200":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"K8sStatefulSetHandler_UpdateStatefulSet"}},"/api/k8s/statefulsets/{cluster_id}/{namespace}/{name}":{"delete":{"path":"/api/k8s/statefulsets/:cluster_id/:namespace/:name","method":"DELETE","summary":"删除:namespace","description":"DeleteStatefulSet 删除StatefulSet","tags":["K8s","K8sStatefulSet"],"responses":{"200":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"K8sStatefulSetHandler_DeleteStatefulSet"},"get":{"path":"/api/k8s/statefulsets/:cluster_id/:namespace/:name","method":"GET","summary":"获取:namespace详情","description":"GetStatefulSet 获取单个StatefulSet详情","tags":["K8s","K8sStatefulSet"],"responses":{"200":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"K8sStatefulSetHandler_GetStatefulSet"}},"/api/k8s/statefulsets/{cluster_id}/{namespace}/{name}/yaml":{"get":{"path":"/api/k8s/statefulsets/:cluster_id/:namespace/:name/yaml","method":"GET","summary":"获取yaml详情","description":"GetStatefulSetYAML 获取StatefulSet的YAML配置","tags":["K8s","K8sStatefulSet"],"responses":{"200":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"K8sStatefulSetHandler_GetStatefulSetYAML"}},"/api/k8s/taints/add":{"post":{"path":"/api/k8s/taints/add","method":"POST","summary":"创建add","description":"AddTaintsNodes 为节点添加 Taint","tags":["K8s","K8sTaint"],"parameters":[{"name":"body","in":"body","description":"请求体","schema":{"$ref":"#/definitions/TaintK8sNodesReq"}}],"responses":{"201":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"K8sTaintHandler_AddTaintsNodes"}},"/api/k8s/taints/delete":{"delete":{"path":"/api/k8s/taints/delete","method":"DELETE","summary":"删除delete","description":"DeleteTaintsNodes 删除节点 Taint","tags":["K8s","K8sTaint"],"parameters":[{"name":"body","in":"body","description":"请求体","schema":{"$ref":"#/definitions/TaintK8sNodesReq"}}],"responses":{"200":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"K8sTaintHandler_DeleteTaintsNodes"}},"/api/k8s/taints/drain":{"post":{"path":"/api/k8s/taints/drain","method":"POST","summary":"创建drain","description":"DrainPods 清空节点上的 Pods","tags":["K8s","K8sTaint"],"parameters":[{"name":"body","in":"body","description":"请求体","schema":{"$ref":"#/definitions/K8sClusterNodesReq"}}],"responses":{"201":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"K8sTaintHandler_DrainPods"}},"/api/k8s/taints/enable_switch":{"post":{"path":"/api/k8s/taints/enable_switch","method":"POST","summary":"创建enable_switch","description":"ScheduleEnableSwitchNodes 启用或切换节点调度","tags":["K8s","K8sTaint"],"parameters":[{"name":"body","in":"body","description":"请求体","schema":{"$ref":"#/definitions/ScheduleK8sNodesReq"}}],"responses":{"201":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"K8sTaintHandler_ScheduleEnableSwitchNodes"}},"/api/k8s/taints/taint_check":{"post":{"path":"/api/k8s/taints/taint_check","method":"POST","summary":"创建taint_check","description":"TaintYamlCheck 检查节点 Taint 的 YAML 配置","tags":["K8s","K8sTaint"],"parameters":[{"name":"body","in":"body","description":"请求体","schema":{"$ref":"#/definitions/TaintK8sNodesReq"}}],"responses":{"201":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"K8sTaintHandler_TaintYamlCheck"}},"/api/k8s/yaml_tasks/apply/{id}":{"post":{"path":"/api/k8s/yaml_tasks/apply/:id","method":"POST","summary":"创建apply","description":"ApplyYamlTask 应用指定 ID 的 YAML 任务","tags":["K8s","K8sYamlTask"],"responses":{"201":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"K8sYamlTaskHandler_ApplyYamlTask"}},"/api/k8s/yaml_tasks/create":{"post":{"path":"/api/k8s/yaml_tasks/create","method":"POST","summary":"创建create","description":"CreateYamlTask 创建新的 YAML 任务","tags":["K8s","K8sYamlTask"],"parameters":[{"name":"body","in":"body","description":"请求体","schema":{"$ref":"#/definitions/YamlTaskCreateReq"}}],"responses":{"201":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"K8sYamlTaskHandler_CreateYamlTask"}},"/api/k8s/yaml_tasks/delete/{id}":{"delete":{"path":"/api/k8s/yaml_tasks/delete/:id","method":"DELETE","summary":"删除delete","description":"DeleteYamlTask 删除指定 ID 的 YAML 任务","tags":["K8s","K8sYamlTask"],"responses":{"200":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"K8sYamlTaskHandler_DeleteYamlTask"}},"/api/k8s/yaml_tasks/list":{"get":{"path":"/api/k8s/yaml_tasks/list","method":"GET","summary":"获取list列表","description":"GetYamlTaskList 获取 YAML 任务列表","tags":["K8s","K8sYamlTask"],"responses":{"200":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"K8sYamlTaskHandler_GetYamlTaskList"}},"/api/k8s/yaml_tasks/update":{"post":{"path":"/api/k8s/yaml_tasks/update","method":"POST","summary":"创建update","description":"UpdateYamlTask 更新指定 ID 的 YAML 任务","tags":["K8s","K8sYamlTask"],"parameters":[{"name":"body","in":"body","description":"请求体","schema":{"$ref":"#/definitions/YamlTaskUpdateReq"}}],"responses":{"201":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"K8sYamlTaskHandler_UpdateYamlTask"}},"/api/k8s/yaml_templates/check":{"post":{"path":"/api/k8s/yaml_templates/check","method":"POST","summary":"创建check","description":"CheckYamlTemplate 检查 YAML 模板","tags":["K8s","K8sYamlTemplate"],"parameters":[{"name":"body","in":"body","description":"请求体","schema":{"$ref":"#/definitions/YamlTemplateCheckReq"}}],"responses":{"201":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"K8sYamlTemplateHandler_CheckYamlTemplate"}},"/api/k8s/yaml_templates/create":{"post":{"path":"/api/k8s/yaml_templates/create","method":"POST","summary":"创建create","description":"CreateYamlTemplate 创建新的 YAML 模板","tags":["K8s","K8sYamlTemplate"],"parameters":[{"name":"body","in":"body","description":"请求体","schema":{"$ref":"#/definitions/YamlTemplateCreateReq"}}],"responses":{"201":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"K8sYamlTemplateHandler_CreateYamlTemplate"}},"/api/k8s/yaml_templates/delete/{id}":{"delete":{"path":"/api/k8s/yaml_templates/delete/:id","method":"DELETE","summary":"删除delete","description":"DeleteYamlTemplate 删除指定 ID 的 YAML 模板","tags":["K8s","K8sYamlTemplate"],"responses":{"200":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"K8sYamlTemplateHandler_DeleteYamlTemplate"}},"/api/k8s/yaml_templates/list":{"get":{"path":"/api/k8s/yaml_templates/list","method":"GET","summary":"获取list列表","description":"GetYamlTemplateList 获取 YAML 模板列表","tags":["K8s","K8sYamlTemplate"],"responses":{"200":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"K8sYamlTemplateHandler_GetYamlTemplateList"}},"/api/k8s/yaml_templates/update":{"post":{"path":"/api/k8s/yaml_templates/update","method":"POST","summary":"创建update","description":"UpdateYamlTemplate 更新指定 ID 的 YAML 模板","tags":["K8s","K8sYamlTemplate"],"parameters":[{"name":"body","in":"body","description":"请求体","schema":{"$ref":"#/definitions/YamlTemplateUpdateReq"}}],"responses":{"201":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"K8sYamlTemplateHandler_UpdateYamlTemplate"}},"/api/k8s/yaml_templates/{id}/yaml":{"get":{"path":"/api/k8s/yaml_templates/:id/yaml","method":"GET","summary":"获取yaml详情","description":"GetYamlTemplateDetail 获取 YAML 模板详情","tags":["K8s","K8sYamlTemplate"],"responses":{"200":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"K8sYamlTemplateHandler_GetYamlTemplateDetail"}},"/api/monitor/alert_events/claim/{id}":{"post":{"path":"/api/monitor/alert_events/claim/:id","method":"POST","summary":"创建claim","description":"EventAlertClaim 认领指定的告警事件","tags":["Monitor","AlertEvent"],"parameters":[{"name":"body","in":"body","description":"请求体","schema":{"$ref":"#/definitions/EventAlertClaimReq"}}],"responses":{"201":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"AlertEventHandler_EventAlertClaim"}},"/api/monitor/alert_events/list":{"get":{"path":"/api/monitor/alert_events/list","method":"GET","summary":"获取list列表","description":"GetMonitorAlertEventList 获取告警事件列表","tags":["Monitor","AlertEvent"],"parameters":[{"name":"body","in":"body","description":"请求体","schema":{"$ref":"#/definitions/GetMonitorAlertEventListReq"}}],"responses":{"200":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"AlertEventHandler_GetMonitorAlertEventList"}},"/api/monitor/alert_events/silence/{id}":{"post":{"path":"/api/monitor/alert_events/silence/:id","method":"POST","summary":"创建silence","description":"EventAlertSilence 将指定告警事件设置为静默状态","tags":["Monitor","AlertEvent"],"parameters":[{"name":"body","in":"body","description":"请求体","schema":{"$ref":"#/definitions/EventAlertSilenceReq"}}],"responses":{"201":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"AlertEventHandler_EventAlertSilence"}},"/api/monitor/alert_events/unsilence/{id}":{"post":{"path":"/api/monitor/alert_events/unsilence/:id","method":"POST","summary":"创建unsilence","description":"EventAlertUnSilence 取消指定告警事件的静默状态","tags":["Monitor","AlertEvent"],"parameters":[{"name":"body","in":"body","description":"请求体","schema":{"$ref":"#/definitions/EventAlertUnSilenceReq"}}],"responses":{"201":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"AlertEventHandler_EventAlertUnSilence"}},"/api/monitor/alert_manager_pools/create":{"post":{"path":"/api/monitor/alert_manager_pools/create","method":"POST","summary":"创建create","description":"CreateMonitorAlertManagerPool 创建新的 AlertManager 集群池","tags":["Monitor","AlertPool"],"parameters":[{"name":"body","in":"body","description":"请求体","schema":{"$ref":"#/definitions/CreateMonitorAlertManagerPoolReq"}}],"responses":{"201":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"AlertPoolHandler_CreateMonitorAlertManagerPool"}},"/api/monitor/alert_manager_pools/delete/{id}":{"delete":{"path":"/api/monitor/alert_manager_pools/delete/:id","method":"DELETE","summary":"删除delete","description":"DeleteMonitorAlertManagerPool 删除指定的 AlertManager 集群池","tags":["Monitor","AlertPool"],"parameters":[{"name":"body","in":"body","description":"请求体","schema":{"$ref":"#/definitions/DeleteMonitorAlertManagerPoolReq"}}],"responses":{"200":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"AlertPoolHandler_DeleteMonitorAlertManagerPool"}},"/api/monitor/alert_manager_pools/detail/{id}":{"get":{"path":"/api/monitor/alert_manager_pools/detail/:id","method":"GET","summary":"获取detail详情","description":"GetMonitorAlertManagerPool 获取指定的AlertManager集群池详情","tags":["Monitor","AlertPool"],"parameters":[{"name":"body","in":"body","description":"请求体","schema":{"$ref":"#/definitions/GetMonitorAlertManagerPoolReq"}}],"responses":{"200":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"AlertPoolHandler_GetMonitorAlertManagerPool"}},"/api/monitor/alert_manager_pools/list":{"get":{"path":"/api/monitor/alert_manager_pools/list","method":"GET","summary":"获取list列表","description":"GetMonitorAlertManagerPoolList 获取 AlertManager 集群池列表","tags":["Monitor","AlertPool"],"parameters":[{"name":"body","in":"body","description":"请求体","schema":{"$ref":"#/definitions/GetMonitorAlertManagerPoolListReq"}}],"responses":{"200":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"AlertPoolHandler_GetMonitorAlertManagerPoolList"}},"/api/monitor/alert_manager_pools/update/{id}":{"put":{"path":"/api/monitor/alert_manager_pools/update/:id","method":"PUT","summary":"更新update","description":"UpdateMonitorAlertManagerPool 更新现有的 AlertManager 集群池","tags":["Monitor","AlertPool"],"parameters":[{"name":"body","in":"body","description":"请求体","schema":{"$ref":"#/definitions/UpdateMonitorAlertManagerPoolReq"}}],"responses":{"200":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"AlertPoolHandler_UpdateMonitorAlertManagerPool"}},"/api/monitor/alert_rules/create":{"post":{"path":"/api/monitor/alert_rules/create","method":"POST","summary":"创建create","description":"CreateMonitorAlertRule 创建新的告警规则","tags":["Monitor","AlertRule"],"parameters":[{"name":"body","in":"body","description":"请求体","schema":{"$ref":"#/definitions/CreateMonitorAlertRuleReq"}}],"responses":{"201":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"AlertRuleHandler_CreateMonitorAlertRule"}},"/api/monitor/alert_rules/delete/{id}":{"delete":{"path":"/api/monitor/alert_rules/delete/:id","method":"DELETE","summary":"删除delete","description":"DeleteMonitorAlertRule 删除指定的告警规则","tags":["Monitor","AlertRule"],"parameters":[{"name":"body","in":"body","description":"请求体","schema":{"$ref":"#/definitions/DeleteMonitorAlertRuleReq"}}],"responses":{"200":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"AlertRuleHandler_DeleteMonitorAlertRule"}},"/api/monitor/alert_rules/detail/{id}":{"get":{"path":"/api/monitor/alert_rules/detail/:id","method":"GET","summary":"获取detail详情","description":"GetMonitorAlertRule 获取指定的告警规则详情","tags":["Monitor","AlertRule"],"parameters":[{"name":"body","in":"body","description":"请求体","schema":{"$ref":"#/definitions/GetMonitorAlertRuleReq"}}],"responses":{"200":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"AlertRuleHandler_GetMonitorAlertRule"}},"/api/monitor/alert_rules/list":{"get":{"path":"/api/monitor/alert_rules/list","method":"GET","summary":"获取list列表","description":"GetMonitorAlertRuleList 获取告警规则列表","tags":["Monitor","AlertRule"],"parameters":[{"name":"body","in":"body","description":"请求体","schema":{"$ref":"#/definitions/GetMonitorAlertRuleListReq"}}],"responses":{"200":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"AlertRuleHandler_GetMonitorAlertRuleList"}},"/api/monitor/alert_rules/promql_check":{"post":{"path":"/api/monitor/alert_rules/promql_check","method":"POST","summary":"创建promql_check","description":"PromqlExprCheck 检查 PromQL 表达式的合法性","tags":["Monitor","AlertRule"],"parameters":[{"name":"body","in":"body","description":"请求体","schema":{"$ref":"#/definitions/PromqlAlertRuleExprCheckReq"}}],"responses":{"201":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"AlertRuleHandler_PromqlExprCheck"}},"/api/monitor/alert_rules/update/{id}":{"put":{"path":"/api/monitor/alert_rules/update/:id","method":"PUT","summary":"更新update","description":"UpdateMonitorAlertRule 更新现有的告警规则","tags":["Monitor","AlertRule"],"parameters":[{"name":"body","in":"body","description":"请求体","schema":{"$ref":"#/definitions/UpdateMonitorAlertRuleReq"}}],"responses":{"200":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"AlertRuleHandler_UpdateMonitorAlertRule"}},"/api/monitor/configs/create":{"post":{"path":"/api/monitor/configs/create","method":"POST","summary":"创建create","description":"CreateMonitorConfig 创建监控配置","tags":["Monitor","MonitorConfig"],"parameters":[{"name":"body","in":"body","description":"请求体","schema":{"$ref":"#/definitions/CreateMonitorConfigReq"}}],"responses":{"201":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"MonitorConfigHandler_CreateMonitorConfig"}},"/api/monitor/configs/delete/{id}":{"delete":{"path":"/api/monitor/configs/delete/:id","method":"DELETE","summary":"删除delete","description":"DeleteMonitorConfig 删除监控配置","tags":["Monitor","MonitorConfig"],"parameters":[{"name":"body","in":"body","description":"请求体","schema":{"$ref":"#/definitions/DeleteMonitorConfigReq"}}],"responses":{"200":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"MonitorConfigHandler_DeleteMonitorConfig"}},"/api/monitor/configs/detail/{id}":{"get":{"path":"/api/monitor/configs/detail/:id","method":"GET","summary":"获取detail详情","description":"GetMonitorConfig 获取监控配置","tags":["Monitor","MonitorConfig"],"parameters":[{"name":"body","in":"body","description":"请求体","schema":{"$ref":"#/definitions/GetMonitorConfigReq"}}],"responses":{"200":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"MonitorConfigHandler_GetMonitorConfig"}},"/api/monitor/configs/list":{"get":{"path":"/api/monitor/configs/list","method":"GET","summary":"获取list列表","description":"GetMonitorConfigList 获取监控配置列表","tags":["Monitor","MonitorConfig"],"parameters":[{"name":"body","in":"body","description":"请求体","schema":{"$ref":"#/definitions/GetMonitorConfigListReq"}}],"responses":{"200":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"MonitorConfigHandler_GetMonitorConfigList"}},"/api/monitor/configs/update/{id}":{"put":{"path":"/api/monitor/configs/update/:id","method":"PUT","summary":"更新update","description":"UpdateMonitorConfig 更新监控配置","tags":["Monitor","MonitorConfig"],"parameters":[{"name":"body","in":"body","description":"请求体","schema":{"$ref":"#/definitions/UpdateMonitorConfigReq"}}],"responses":{"200":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"MonitorConfigHandler_UpdateMonitorConfig"}},"/api/monitor/onduty_groups/changes":{"post":{"path":"/api/monitor/onduty_groups/changes","method":"POST","summary":"创建changes","description":"CreateMonitorOnDutyGroupChange 创建值班组的换班记录","tags":["Monitor","OnDutyGroup"],"parameters":[{"name":"body","in":"body","description":"请求体","schema":{"$ref":"#/definitions/CreateMonitorOnDutyGroupChangeReq"}}],"responses":{"201":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"OnDutyGroupHandler_CreateMonitorOnDutyGroupChange"}},"/api/monitor/onduty_groups/changes/{id}":{"get":{"path":"/api/monitor/onduty_groups/changes/:id","method":"GET","summary":"获取changes详情","description":"GetMonitorOnDutyGroupChangeList 获取值班组换班记录列表","tags":["Monitor","OnDutyGroup"],"parameters":[{"name":"body","in":"body","description":"请求体","schema":{"$ref":"#/definitions/GetMonitorOnDutyGroupChangeListReq"}}],"responses":{"200":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"OnDutyGroupHandler_GetMonitorOnDutyGroupChangeList"}},"/api/monitor/onduty_groups/create":{"post":{"path":"/api/monitor/onduty_groups/create","method":"POST","summary":"创建create","description":"CreateMonitorOnDutyGroup 创建新的值班组","tags":["Monitor","OnDutyGroup"],"parameters":[{"name":"body","in":"body","description":"请求体","schema":{"$ref":"#/definitions/CreateMonitorOnDutyGroupReq"}}],"responses":{"201":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"OnDutyGroupHandler_CreateMonitorOnDutyGroup"}},"/api/monitor/onduty_groups/delete/{id}":{"delete":{"path":"/api/monitor/onduty_groups/delete/:id","method":"DELETE","summary":"删除delete","description":"DeleteMonitorOnDutyGroup 删除指定的值班组","tags":["Monitor","OnDutyGroup"],"parameters":[{"name":"body","in":"body","description":"请求体","schema":{"$ref":"#/definitions/DeleteMonitorOnDutyGroupReq"}}],"responses":{"200":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"OnDutyGroupHandler_DeleteMonitorOnDutyGroup"}},"/api/monitor/onduty_groups/detail/{id}":{"get":{"path":"/api/monitor/onduty_groups/detail/:id","method":"GET","summary":"获取detail详情","description":"GetMonitorOnDutyGroup 获取指定的值班组信息","tags":["Monitor","OnDutyGroup"],"parameters":[{"name":"body","in":"body","description":"请求体","schema":{"$ref":"#/definitions/GetMonitorOnDutyGroupReq"}}],"responses":{"200":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"OnDutyGroupHandler_GetMonitorOnDutyGroup"}},"/api/monitor/onduty_groups/future_plan/{id}":{"get":{"path":"/api/monitor/onduty_groups/future_plan/:id","method":"GET","summary":"获取future_plan详情","description":"GetMonitorOnDutyGroupFuturePlan 获取指定值班组的未来值班计划","tags":["Monitor","OnDutyGroup"],"parameters":[{"name":"body","in":"body","description":"请求体","schema":{"$ref":"#/definitions/GetMonitorOnDutyGroupFuturePlanReq"}}],"responses":{"200":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"OnDutyGroupHandler_GetMonitorOnDutyGroupFuturePlan"}},"/api/monitor/onduty_groups/history/{id}":{"get":{"path":"/api/monitor/onduty_groups/history/:id","method":"GET","summary":"获取history详情","description":"GetMonitorOnDutyHistory 获取值班历史记录","tags":["Monitor","OnDutyGroup"],"parameters":[{"name":"body","in":"body","description":"请求体","schema":{"$ref":"#/definitions/GetMonitorOnDutyHistoryReq"}}],"responses":{"200":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"OnDutyGroupHandler_GetMonitorOnDutyHistory"}},"/api/monitor/onduty_groups/list":{"get":{"path":"/api/monitor/onduty_groups/list","method":"GET","summary":"获取list列表","description":"GetMonitorOnDutyGroupList 获取值班组列表","tags":["Monitor","OnDutyGroup"],"parameters":[{"name":"body","in":"body","description":"请求体","schema":{"$ref":"#/definitions/GetMonitorOnDutyGroupListReq"}}],"responses":{"200":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"OnDutyGroupHandler_GetMonitorOnDutyGroupList"}},"/api/monitor/onduty_groups/update/{id}":{"put":{"path":"/api/monitor/onduty_groups/update/:id","method":"PUT","summary":"更新update","description":"UpdateMonitorOnDutyGroup 更新值班组信息","tags":["Monitor","OnDutyGroup"],"parameters":[{"name":"body","in":"body","description":"请求体","schema":{"$ref":"#/definitions/UpdateMonitorOnDutyGroupReq"}}],"responses":{"200":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"OnDutyGroupHandler_UpdateMonitorOnDutyGroup"}},"/api/monitor/record_rules/create":{"post":{"path":"/api/monitor/record_rules/create","method":"POST","summary":"创建create","description":"CreateMonitorRecordRule 创建新的预聚合规则","tags":["Monitor","RecordRule"],"parameters":[{"name":"body","in":"body","description":"请求体","schema":{"$ref":"#/definitions/CreateMonitorRecordRuleReq"}}],"responses":{"201":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"RecordRuleHandler_CreateMonitorRecordRule"}},"/api/monitor/record_rules/delete/{id}":{"delete":{"path":"/api/monitor/record_rules/delete/:id","method":"DELETE","summary":"删除delete","description":"DeleteMonitorRecordRule 删除指定的预聚合规则","tags":["Monitor","RecordRule"],"parameters":[{"name":"body","in":"body","description":"请求体","schema":{"$ref":"#/definitions/DeleteMonitorRecordRuleReq"}}],"responses":{"200":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"RecordRuleHandler_DeleteMonitorRecordRule"}},"/api/monitor/record_rules/detail/{id}":{"get":{"path":"/api/monitor/record_rules/detail/:id","method":"GET","summary":"获取detail详情","description":"GetMonitorRecordRule 获取指定的预聚合规则详情","tags":["Monitor","RecordRule"],"parameters":[{"name":"body","in":"body","description":"请求体","schema":{"$ref":"#/definitions/GetMonitorRecordRuleReq"}}],"responses":{"200":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"RecordRuleHandler_GetMonitorRecordRule"}},"/api/monitor/record_rules/list":{"get":{"path":"/api/monitor/record_rules/list","method":"GET","summary":"获取list列表","description":"GetMonitorRecordRuleList 获取预聚合规则列表","tags":["Monitor","RecordRule"],"parameters":[{"name":"body","in":"body","description":"请求体","schema":{"$ref":"#/definitions/GetMonitorRecordRuleListReq"}}],"responses":{"200":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"RecordRuleHandler_GetMonitorRecordRuleList"}},"/api/monitor/record_rules/update/{id}":{"put":{"path":"/api/monitor/record_rules/update/:id","method":"PUT","summary":"更新update","description":"UpdateMonitorRecordRule 更新现有的预聚合规则","tags":["Monitor","RecordRule"],"parameters":[{"name":"body","in":"body","description":"请求体","schema":{"$ref":"#/definitions/UpdateMonitorRecordRuleReq"}}],"responses":{"200":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"RecordRuleHandler_UpdateMonitorRecordRule"}},"/api/monitor/scrape_jobs/create":{"post":{"path":"/api/monitor/scrape_jobs/create","method":"POST","summary":"创建create","description":"CreateMonitorScrapeJob 创建监控采集 Job","tags":["Monitor","ScrapeJob"],"parameters":[{"name":"body","in":"body","description":"请求体","schema":{"$ref":"#/definitions/CreateMonitorScrapeJobReq"}}],"responses":{"201":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"ScrapeJobHandler_CreateMonitorScrapeJob"}},"/api/monitor/scrape_jobs/delete/{id}":{"delete":{"path":"/api/monitor/scrape_jobs/delete/:id","method":"DELETE","summary":"删除delete","description":"DeleteMonitorScrapeJob 删除监控采集 Job","tags":["Monitor","ScrapeJob"],"parameters":[{"name":"body","in":"body","description":"请求体","schema":{"$ref":"#/definitions/DeleteMonitorScrapeJobReq"}}],"responses":{"200":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"ScrapeJobHandler_DeleteMonitorScrapeJob"}},"/api/monitor/scrape_jobs/detail/{id}":{"get":{"path":"/api/monitor/scrape_jobs/detail/:id","method":"GET","summary":"获取detail详情","description":"GetMonitorScrapeJobDetail 获取监控采集 Job 详情","tags":["Monitor","ScrapeJob"],"parameters":[{"name":"body","in":"body","description":"请求体","schema":{"$ref":"#/definitions/GetMonitorScrapeJobDetailReq"}}],"responses":{"200":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"ScrapeJobHandler_GetMonitorScrapeJobDetail"}},"/api/monitor/scrape_jobs/list":{"get":{"path":"/api/monitor/scrape_jobs/list","method":"GET","summary":"获取list列表","description":"GetMonitorScrapeJobList 获取监控采集 Job 列表","tags":["Monitor","ScrapeJob"],"parameters":[{"name":"body","in":"body","description":"请求体","schema":{"$ref":"#/definitions/GetMonitorScrapeJobListReq"}}],"responses":{"200":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"ScrapeJobHandler_GetMonitorScrapeJobList"}},"/api/monitor/scrape_jobs/update/{id}":{"put":{"path":"/api/monitor/scrape_jobs/update/:id","method":"PUT","summary":"更新update","description":"UpdateMonitorScrapeJob 更新监控采集 Job","tags":["Monitor","ScrapeJob"],"parameters":[{"name":"body","in":"body","description":"请求体","schema":{"$ref":"#/definitions/UpdateMonitorScrapeJobReq"}}],"responses":{"200":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"ScrapeJobHandler_UpdateMonitorScrapeJob"}},"/api/monitor/scrape_pools/create":{"post":{"path":"/api/monitor/scrape_pools/create","method":"POST","summary":"创建create","description":"CreateMonitorScrapePool 创建监控采集池","tags":["Monitor","ScrapePool"],"parameters":[{"name":"body","in":"body","description":"请求体","schema":{"$ref":"#/definitions/CreateMonitorScrapePoolReq"}}],"responses":{"201":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"ScrapePoolHandler_CreateMonitorScrapePool"}},"/api/monitor/scrape_pools/delete/{id}":{"delete":{"path":"/api/monitor/scrape_pools/delete/:id","method":"DELETE","summary":"删除delete","description":"DeleteMonitorScrapePool 删除监控采集池","tags":["Monitor","ScrapePool"],"parameters":[{"name":"body","in":"body","description":"请求体","schema":{"$ref":"#/definitions/DeleteMonitorScrapePoolReq"}}],"responses":{"200":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"ScrapePoolHandler_DeleteMonitorScrapePool"}},"/api/monitor/scrape_pools/detail/{id}":{"get":{"path":"/api/monitor/scrape_pools/detail/:id","method":"GET","summary":"获取detail详情","description":"GetMonitorScrapePoolDetail 获取监控采集池详情","tags":["Monitor","ScrapePool"],"parameters":[{"name":"body","in":"body","description":"请求体","schema":{"$ref":"#/definitions/GetMonitorScrapePoolDetailReq"}}],"responses":{"200":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"ScrapePoolHandler_GetMonitorScrapePoolDetail"}},"/api/monitor/scrape_pools/list":{"get":{"path":"/api/monitor/scrape_pools/list","method":"GET","summary":"获取list列表","description":"GetMonitorScrapePoolList 获取监控采集池列表","tags":["Monitor","ScrapePool"],"parameters":[{"name":"body","in":"body","description":"请求体","schema":{"$ref":"#/definitions/GetMonitorScrapePoolListReq"}}],"responses":{"200":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"ScrapePoolHandler_GetMonitorScrapePoolList"}},"/api/monitor/scrape_pools/update/{id}":{"put":{"path":"/api/monitor/scrape_pools/update/:id","method":"PUT","summary":"更新update","description":"UpdateMonitorScrapePool 更新监控采集池","tags":["Monitor","ScrapePool"],"parameters":[{"name":"body","in":"body","description":"请求体","schema":{"$ref":"#/definitions/UpdateMonitorScrapePoolReq"}}],"responses":{"200":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"ScrapePoolHandler_UpdateMonitorScrapePool"}},"/api/monitor/send_groups/create":{"post":{"path":"/api/monitor/send_groups/create","method":"POST","summary":"创建create","description":"CreateMonitorSendGroup 创建新的发送组","tags":["Monitor","SendGroup"],"parameters":[{"name":"body","in":"body","description":"请求体","schema":{"$ref":"#/definitions/CreateMonitorSendGroupReq"}}],"responses":{"201":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"SendGroupHandler_CreateMonitorSendGroup"}},"/api/monitor/send_groups/delete/{id}":{"delete":{"path":"/api/monitor/send_groups/delete/:id","method":"DELETE","summary":"删除delete","description":"DeleteMonitorSendGroup 删除指定的发送组","tags":["Monitor","SendGroup"],"parameters":[{"name":"body","in":"body","description":"请求体","schema":{"$ref":"#/definitions/DeleteMonitorSendGroupReq"}}],"responses":{"200":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"SendGroupHandler_DeleteMonitorSendGroup"}},"/api/monitor/send_groups/detail/{id}":{"get":{"path":"/api/monitor/send_groups/detail/:id","method":"GET","summary":"获取detail详情","description":"GetMonitorSendGroup 获取指定的发送组详情","tags":["Monitor","SendGroup"],"parameters":[{"name":"body","in":"body","description":"请求体","schema":{"$ref":"#/definitions/GetMonitorSendGroupReq"}}],"responses":{"200":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"SendGroupHandler_GetMonitorSendGroup"}},"/api/monitor/send_groups/list":{"get":{"path":"/api/monitor/send_groups/list","method":"GET","summary":"获取list列表","description":"GetMonitorSendGroupList 获取发送组列表","tags":["Monitor","SendGroup"],"parameters":[{"name":"body","in":"body","description":"请求体","schema":{"$ref":"#/definitions/GetMonitorSendGroupListReq"}}],"responses":{"200":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"SendGroupHandler_GetMonitorSendGroupList"}},"/api/monitor/send_groups/update/{id}":{"put":{"path":"/api/monitor/send_groups/update/:id","method":"PUT","summary":"更新update","description":"UpdateMonitorSendGroup 更新现有的发送组","tags":["Monitor","SendGroup"],"parameters":[{"name":"body","in":"body","description":"请求体","schema":{"$ref":"#/definitions/UpdateMonitorSendGroupReq"}}],"responses":{"200":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"SendGroupHandler_UpdateMonitorSendGroup"}},"/api/not_auth/getBindIps":{"get":{"path":"/api/not_auth/getBindIps","method":"GET","summary":"获取getBindIps列表","description":"GetBindIps 获取绑定IP地址","tags":["Not_auth","NotAuth"],"responses":{"200":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"operationId":"NotAuthHandler_GetBindIps"}},"/api/not_auth/getTreeNodeBindIps":{"get":{"path":"/api/not_auth/getTreeNodeBindIps","method":"GET","summary":"获取getTreeNodeBindIps列表","description":"GetBindIps 获取绑定IP地址","tags":["Not_auth","NotAuth"],"responses":{"200":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"operationId":"NotAuthHandler_GetBindIps"}},"/api/role/apis/{id}":{"get":{"path":"/api/role/apis/:id","method":"GET","summary":"获取apis详情","description":"GetRoleApis 获取角色的API权限列表","tags":["Role"],"parameters":[{"name":"body","in":"body","description":"请求体","schema":{"$ref":"#/definitions/GetRoleApiRequest"}}],"responses":{"200":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"RoleHandler_GetRoleApis"}},"/api/role/assign-apis":{"post":{"path":"/api/role/assign-apis","method":"POST","summary":"创建assign-apis","description":"AssignApisToRole 为角色分配API权限","tags":["Role"],"parameters":[{"name":"body","in":"body","description":"请求体","schema":{"$ref":"#/definitions/AssignRoleApiRequest"}}],"responses":{"201":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"RoleHandler_AssignApisToRole"}},"/api/role/assign_users":{"post":{"path":"/api/role/assign_users","method":"POST","summary":"创建assign_users","description":"AssignRolesToUser 为用户分配角色","tags":["Role"],"parameters":[{"name":"body","in":"body","description":"请求体","schema":{"$ref":"#/definitions/AssignRolesToUserRequest"}}],"responses":{"201":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"RoleHandler_AssignRolesToUser"}},"/api/role/check_permission":{"post":{"path":"/api/role/check_permission","method":"POST","summary":"创建check_permission","description":"CheckUserPermission 检查用户权限","tags":["Role"],"parameters":[{"name":"body","in":"body","description":"请求体","schema":{"$ref":"#/definitions/CheckUserPermissionRequest"}}],"responses":{"201":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"RoleHandler_CheckUserPermission"}},"/api/role/create":{"post":{"path":"/api/role/create","method":"POST","summary":"创建create","description":"CreateRole 创建角色","tags":["Role"],"parameters":[{"name":"body","in":"body","description":"请求体","schema":{"$ref":"#/definitions/CreateRoleRequest"}}],"responses":{"201":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"RoleHandler_CreateRole"}},"/api/role/delete/{id}":{"delete":{"path":"/api/role/delete/:id","method":"DELETE","summary":"删除delete","description":"DeleteRole 删除角色","tags":["Role"],"parameters":[{"name":"body","in":"body","description":"请求体","schema":{"$ref":"#/definitions/DeleteRoleRequest"}}],"responses":{"200":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"RoleHandler_DeleteRole"}},"/api/role/detail/{id}":{"get":{"path":"/api/role/detail/:id","method":"GET","summary":"获取detail详情","description":"GetRoleDetail 获取角色详情","tags":["Role"],"parameters":[{"name":"body","in":"body","description":"请求体","schema":{"$ref":"#/definitions/GetRoleRequest"}}],"responses":{"200":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"RoleHandler_GetRoleDetail"}},"/api/role/list":{"get":{"path":"/api/role/list","method":"GET","summary":"获取list列表","description":"ListRoles 获取角色列表","tags":["Role"],"parameters":[{"name":"body","in":"body","description":"请求体","schema":{"$ref":"#/definitions/ListRolesRequest"}}],"responses":{"200":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"RoleHandler_ListRoles"}},"/api/role/revoke-apis":{"post":{"path":"/api/role/revoke-apis","method":"POST","summary":"创建revoke-apis","description":"RevokeApisFromRole 撤销角色的API权限","tags":["Role"],"parameters":[{"name":"body","in":"body","description":"请求体","schema":{"$ref":"#/definitions/RevokeRoleApiRequest"}}],"responses":{"201":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"RoleHandler_RevokeApisFromRole"}},"/api/role/revoke_users":{"post":{"path":"/api/role/revoke_users","method":"POST","summary":"创建revoke_users","description":"RevokeRolesFromUser 撤销用户角色","tags":["Role"],"parameters":[{"name":"body","in":"body","description":"请求体","schema":{"$ref":"#/definitions/RevokeRolesFromUserRequest"}}],"responses":{"201":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"RoleHandler_RevokeRolesFromUser"}},"/api/role/update/{id}":{"put":{"path":"/api/role/update/:id","method":"PUT","summary":"更新update","description":"UpdateRole 更新角色","tags":["Role"],"parameters":[{"name":"body","in":"body","description":"请求体","schema":{"$ref":"#/definitions/UpdateRoleRequest"}}],"responses":{"200":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"RoleHandler_UpdateRole"}},"/api/role/user_permissions/{id}":{"get":{"path":"/api/role/user_permissions/:id","method":"GET","summary":"获取user_permissions详情","description":"GetUserPermissions 获取用户的所有权限","tags":["Role"],"parameters":[{"name":"body","in":"body","description":"请求体","schema":{"$ref":"#/definitions/GetUserPermissionsRequest"}}],"responses":{"200":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"RoleHandler_GetUserPermissions"}},"/api/role/user_roles/{id}":{"get":{"path":"/api/role/user_roles/:id","method":"GET","summary":"获取user_roles详情","description":"GetUserRoles 获取用户的角色列表","tags":["Role"],"parameters":[{"name":"body","in":"body","description":"请求体","schema":{"$ref":"#/definitions/GetUserRolesRequest"}}],"responses":{"200":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"RoleHandler_GetUserRoles"}},"/api/role/users/{id}":{"get":{"path":"/api/role/users/:id","method":"GET","summary":"获取users详情","description":"GetRoleUsers 获取角色下的用户列表","tags":["Role"],"parameters":[{"name":"body","in":"body","description":"请求体","schema":{"$ref":"#/definitions/GetRoleUsersRequest"}}],"responses":{"200":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"RoleHandler_GetRoleUsers"}},"/api/system/info":{"get":{"path":"/api/system/info","method":"GET","summary":"获取info列表","description":"GetSystemInfo 获取系统基本信息","tags":["System"],"responses":{"200":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"SystemHandler_GetSystemInfo"}},"/api/system/metrics":{"get":{"path":"/api/system/metrics","method":"GET","summary":"获取metrics列表","description":"GetSystemMetrics 获取系统性能指标","tags":["System"],"responses":{"200":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"SystemHandler_GetSystemMetrics"}},"/api/system/refresh":{"post":{"path":"/api/system/refresh","method":"POST","summary":"创建refresh","description":"RefreshSystemInfo 刷新系统信息","tags":["System"],"responses":{"201":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"SystemHandler_RefreshSystemInfo"}},"/api/tree/local/bind/{id}":{"post":{"path":"/api/tree/local/bind/:id","method":"POST","summary":"创建bind","description":"BindTreeLocal 绑定本地资源","tags":["Tree","TreeLocal"],"parameters":[{"name":"body","in":"body","description":"请求体","schema":{"$ref":"#/definitions/BindTreeLocalResourceReq"}}],"responses":{"201":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"TreeLocalHandler_BindTreeLocal"}},"/api/tree/local/create":{"post":{"path":"/api/tree/local/create","method":"POST","summary":"创建create","description":"CreateTreeLocal 创建本地资源","tags":["Tree","TreeLocal"],"parameters":[{"name":"body","in":"body","description":"请求体","schema":{"$ref":"#/definitions/CreateTreeLocalResourceReq"}}],"responses":{"201":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"TreeLocalHandler_CreateTreeLocal"}},"/api/tree/local/delete/{id}":{"delete":{"path":"/api/tree/local/delete/:id","method":"DELETE","summary":"删除delete","description":"DeleteTreeLocal 删除本地资源","tags":["Tree","TreeLocal"],"parameters":[{"name":"body","in":"body","description":"请求体","schema":{"$ref":"#/definitions/DeleteTreeLocalResourceReq"}}],"responses":{"200":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"TreeLocalHandler_DeleteTreeLocal"}},"/api/tree/local/detail/{id}":{"get":{"path":"/api/tree/local/detail/:id","method":"GET","summary":"获取detail详情","description":"GetTreeLocalDetail 获取本地资源详情","tags":["Tree","TreeLocal"],"parameters":[{"name":"body","in":"body","description":"请求体","schema":{"$ref":"#/definitions/GetTreeLocalResourceDetailReq"}}],"responses":{"200":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"TreeLocalHandler_GetTreeLocalDetail"}},"/api/tree/local/list":{"get":{"path":"/api/tree/local/list","method":"GET","summary":"获取list列表","description":"GetTreeLocalList 获取树节点列表","tags":["Tree","TreeLocal"],"parameters":[{"name":"body","in":"body","description":"请求体","schema":{"$ref":"#/definitions/GetTreeLocalResourceListReq"}}],"responses":{"200":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"TreeLocalHandler_GetTreeLocalList"}},"/api/tree/local/terminal/{id}":{"get":{"path":"/api/tree/local/terminal/:id","method":"GET","summary":"获取terminal详情","description":"ConnectTerminal 连接终端","tags":["Tree","TreeLocal"],"responses":{"200":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"TreeLocalHandler_ConnectTerminal"}},"/api/tree/local/unbind/{id}":{"post":{"path":"/api/tree/local/unbind/:id","method":"POST","summary":"创建unbind","description":"UnbindTreeLocal 解绑本地资源","tags":["Tree","TreeLocal"],"parameters":[{"name":"body","in":"body","description":"请求体","schema":{"$ref":"#/definitions/UnBindTreeLocalResourceReq"}}],"responses":{"201":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"TreeLocalHandler_UnbindTreeLocal"}},"/api/tree/local/update/{id}":{"put":{"path":"/api/tree/local/update/:id","method":"PUT","summary":"更新update","description":"UpdateTreeLocal 更新本地资源","tags":["Tree","TreeLocal"],"parameters":[{"name":"body","in":"body","description":"请求体","schema":{"$ref":"#/definitions/UpdateTreeLocalResourceReq"}}],"responses":{"200":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"TreeLocalHandler_UpdateTreeLocal"}},"/api/tree/node/children/{id}":{"get":{"path":"/api/tree/node/children/:id","method":"GET","summary":"获取children详情","description":"GetChildNodes 获取直接子节点列表","tags":["Tree","TreeNode"],"responses":{"200":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"TreeNodeHandler_GetChildNodes"}},"/api/tree/node/create":{"post":{"path":"/api/tree/node/create","method":"POST","summary":"创建create","description":"CreateNode 创建节点","tags":["Tree","TreeNode"],"parameters":[{"name":"body","in":"body","description":"请求体","schema":{"$ref":"#/definitions/CreateTreeNodeReq"}}],"responses":{"201":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"TreeNodeHandler_CreateNode"}},"/api/tree/node/delete/{id}":{"delete":{"path":"/api/tree/node/delete/:id","method":"DELETE","summary":"删除delete","description":"DeleteNode 删除节点","tags":["Tree","TreeNode"],"parameters":[{"name":"body","in":"body","description":"请求体","schema":{"$ref":"#/definitions/DeleteTreeNodeReq"}}],"responses":{"200":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"TreeNodeHandler_DeleteNode"}},"/api/tree/node/detail/{id}":{"get":{"path":"/api/tree/node/detail/:id","method":"GET","summary":"获取detail详情","description":"GetNodeDetail 获取节点详情","tags":["Tree","TreeNode"],"parameters":[{"name":"body","in":"body","description":"请求体","schema":{"$ref":"#/definitions/GetTreeNodeDetailReq"}}],"responses":{"200":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"TreeNodeHandler_GetNodeDetail"}},"/api/tree/node/list":{"get":{"path":"/api/tree/node/list","method":"GET","summary":"获取list列表","description":"GetTreeList 获取树节点列表","tags":["Tree","TreeNode"],"parameters":[{"name":"body","in":"body","description":"请求体","schema":{"$ref":"#/definitions/GetTreeNodeListReq"}}],"responses":{"200":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"TreeNodeHandler_GetTreeList"}},"/api/tree/node/member/add":{"post":{"path":"/api/tree/node/member/add","method":"POST","summary":"创建add","description":"AddNodeMember 添加节点成员","tags":["Tree","TreeNode"],"parameters":[{"name":"body","in":"body","description":"请求体","schema":{"$ref":"#/definitions/AddTreeNodeMemberReq"}}],"responses":{"201":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"TreeNodeHandler_AddNodeMember"}},"/api/tree/node/member/remove/{id}":{"delete":{"path":"/api/tree/node/member/remove/:id","method":"DELETE","summary":"删除remove","description":"RemoveNodeMember 移除节点成员","tags":["Tree","TreeNode"],"parameters":[{"name":"body","in":"body","description":"请求体","schema":{"$ref":"#/definitions/RemoveTreeNodeMemberReq"}}],"responses":{"200":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"TreeNodeHandler_RemoveNodeMember"}},"/api/tree/node/members/{id}":{"get":{"path":"/api/tree/node/members/:id","method":"GET","summary":"获取members详情","description":"GetNodeMembers 获取节点成员","tags":["Tree","TreeNode"],"parameters":[{"name":"body","in":"body","description":"请求体","schema":{"$ref":"#/definitions/GetTreeNodeMembersReq"}}],"responses":{"200":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"TreeNodeHandler_GetNodeMembers"}},"/api/tree/node/move/{id}":{"put":{"path":"/api/tree/node/move/:id","method":"PUT","summary":"更新move","description":"MoveNode 移动节点","tags":["Tree","TreeNode"],"parameters":[{"name":"body","in":"body","description":"请求体","schema":{"$ref":"#/definitions/MoveTreeNodeReq"}}],"responses":{"200":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"TreeNodeHandler_MoveNode"}},"/api/tree/node/resource/bind":{"post":{"path":"/api/tree/node/resource/bind","method":"POST","summary":"创建bind","description":"BindResource 绑定资源","tags":["Tree","TreeNode"],"parameters":[{"name":"body","in":"body","description":"请求体","schema":{"$ref":"#/definitions/BindTreeNodeResourceReq"}}],"responses":{"201":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"TreeNodeHandler_BindResource"}},"/api/tree/node/resource/unbind":{"post":{"path":"/api/tree/node/resource/unbind","method":"POST","summary":"创建unbind","description":"UnbindResource 解绑资源","tags":["Tree","TreeNode"],"parameters":[{"name":"body","in":"body","description":"请求体","schema":{"$ref":"#/definitions/UnbindTreeNodeResourceReq"}}],"responses":{"201":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"TreeNodeHandler_UnbindResource"}},"/api/tree/node/statistics":{"get":{"path":"/api/tree/node/statistics","method":"GET","summary":"获取statistics列表","description":"GetTreeStatistics 获取服务树统计信息","tags":["Tree","TreeNode"],"responses":{"200":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"TreeNodeHandler_GetTreeStatistics"}},"/api/tree/node/update/{id}":{"put":{"path":"/api/tree/node/update/:id","method":"PUT","summary":"更新update","description":"UpdateNode 更新节点","tags":["Tree","TreeNode"],"parameters":[{"name":"body","in":"body","description":"请求体","schema":{"$ref":"#/definitions/UpdateTreeNodeReq"}}],"responses":{"200":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"TreeNodeHandler_UpdateNode"}},"/api/user/change_password":{"post":{"path":"/api/user/change_password","method":"POST","summary":"创建change_password","description":"ChangePassword 修改密码","tags":["User"],"parameters":[{"name":"body","in":"body","description":"请求体","schema":{"$ref":"#/definitions/ChangePasswordReq"}}],"responses":{"201":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"UserHandler_ChangePassword"}},"/api/user/codes":{"get":{"path":"/api/user/codes","method":"GET","summary":"获取codes列表","description":"GetPermCode 获取权限码","tags":["User"],"parameters":[{"name":"body","in":"body","description":"请求体","schema":{"$ref":"#/definitions/GetPermCodeReq"}}],"responses":{"200":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"UserHandler_GetPermCode"}},"/api/user/detail/{id}":{"get":{"path":"/api/user/detail/:id","method":"GET","summary":"获取detail详情","description":"GetUserDetail 获取用户详情","tags":["User"],"parameters":[{"name":"body","in":"body","description":"请求体","schema":{"$ref":"#/definitions/GetUserDetailReq"}}],"responses":{"200":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"UserHandler_GetUserDetail"}},"/api/user/list":{"get":{"path":"/api/user/list","method":"GET","summary":"获取list列表","description":"GetUserList 获取用户列表","tags":["User"],"parameters":[{"name":"body","in":"body","description":"请求体","schema":{"$ref":"#/definitions/GetUserListReq"}}],"responses":{"200":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"UserHandler_GetUserList"}},"/api/user/login":{"post":{"path":"/api/user/login","method":"POST","summary":"创建login","description":"Login 用户登录处理","tags":["User"],"parameters":[{"name":"body","in":"body","description":"请求体","schema":{"$ref":"#/definitions/UserLoginReq"}}],"responses":{"201":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"UserHandler_Login"}},"/api/user/logout":{"post":{"path":"/api/user/logout","method":"POST","summary":"创建logout","description":"Logout 用户登出处理","tags":["User"],"responses":{"201":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"UserHandler_Logout"}},"/api/user/profile":{"get":{"path":"/api/user/profile","method":"GET","summary":"获取profile列表","description":"Profile 获取用户信息","tags":["User"],"parameters":[{"name":"body","in":"body","description":"请求体","schema":{"$ref":"#/definitions/ProfileReq"}}],"responses":{"200":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"UserHandler_Profile"}},"/api/user/profile/update/{id}":{"put":{"path":"/api/user/profile/update/:id","method":"PUT","summary":"更新update","description":"UpdateProfile 更新用户信息","tags":["User"],"parameters":[{"name":"body","in":"body","description":"请求体","schema":{"$ref":"#/definitions/UpdateProfileReq"}}],"responses":{"200":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"UserHandler_UpdateProfile"}},"/api/user/refresh_token":{"post":{"path":"/api/user/refresh_token","method":"POST","summary":"创建refresh_token","description":"RefreshToken 刷新令牌","tags":["User"],"parameters":[{"name":"body","in":"body","description":"请求体","schema":{"$ref":"#/definitions/TokenRequest"}}],"responses":{"201":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"UserHandler_RefreshToken"}},"/api/user/signup":{"post":{"path":"/api/user/signup","method":"POST","summary":"创建signup","description":"SignUp 用户注册处理","tags":["User"],"parameters":[{"name":"body","in":"body","description":"请求体","schema":{"$ref":"#/definitions/UserSignUpReq"}}],"responses":{"201":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"UserHandler_SignUp"}},"/api/user/statistics":{"get":{"path":"/api/user/statistics","method":"GET","summary":"获取statistics列表","description":"GetUserStatistics 获取用户统计","tags":["User"],"responses":{"200":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"UserHandler_GetUserStatistics"}},"/api/user/write_off":{"post":{"path":"/api/user/write_off","method":"POST","summary":"创建write_off","description":"WriteOff 注销账号","tags":["User"],"parameters":[{"name":"body","in":"body","description":"请求体","schema":{"$ref":"#/definitions/WriteOffReq"}}],"responses":{"201":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"UserHandler_WriteOff"}},"/api/user/{id}":{"delete":{"path":"/api/user/:id","method":"DELETE","summary":"删除user","description":"DeleteUser 删除用户","tags":["User"],"responses":{"200":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"UserHandler_DeleteUser"}},"/api/v1/alerts/receive":{"post":{"path":"/api/v1/alerts/receive","method":"POST","summary":"创建receive","description":"MonitorAlertReceive 处理来自Alertmanager的告警接收请求","tags":["V1","WebHook"],"parameters":[{"name":"body","in":"body","description":"请求体","schema":{"$ref":"#/definitions/Message"}}],"responses":{"201":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"WebHookHandler_MonitorAlertReceive"}},"/api/v1/alerts/silence":{"get":{"path":"/api/v1/alerts/silence","method":"GET","summary":"获取silence列表","description":"MonitorAlertSilence 处理静默告警的请求","tags":["V1","WebHook"],"responses":{"200":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"WebHookHandler_MonitorAlertSilence"}},"/api/v1/alerts/unsilence":{"get":{"path":"/api/v1/alerts/unsilence","method":"GET","summary":"获取unsilence列表","description":"MonitorAlertUnSilence 处理取消静默告警的请求","tags":["V1","WebHook"],"responses":{"200":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"WebHookHandler_MonitorAlertUnSilence"}},"/api/workorder/category/create":{"post":{"path":"/api/workorder/category/create","method":"POST","summary":"创建create","description":"CreateCategory 创建工单分类","tags":["Workorder","CategoryGroup"],"parameters":[{"name":"body","in":"body","description":"请求体","schema":{"$ref":"#/definitions/CreateWorkorderCategoryReq"}}],"responses":{"201":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"CategoryGroupHandler_CreateCategory"}},"/api/workorder/category/delete/{id}":{"delete":{"path":"/api/workorder/category/delete/:id","method":"DELETE","summary":"删除delete","description":"DeleteCategory 删除工单分类","tags":["Workorder","CategoryGroup"],"parameters":[{"name":"body","in":"body","description":"请求体","schema":{"$ref":"#/definitions/DeleteWorkorderCategoryReq"}}],"responses":{"200":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"CategoryGroupHandler_DeleteCategory"}},"/api/workorder/category/detail/{id}":{"get":{"path":"/api/workorder/category/detail/:id","method":"GET","summary":"获取detail详情","description":"DetailCategory 获取工单分类详情","tags":["Workorder","CategoryGroup"],"parameters":[{"name":"body","in":"body","description":"请求体","schema":{"$ref":"#/definitions/DetailWorkorderCategoryReq"}}],"responses":{"200":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"CategoryGroupHandler_DetailCategory"}},"/api/workorder/category/list":{"get":{"path":"/api/workorder/category/list","method":"GET","summary":"获取list列表","description":"ListCategory 获取工单分类列表","tags":["Workorder","CategoryGroup"],"parameters":[{"name":"body","in":"body","description":"请求体","schema":{"$ref":"#/definitions/ListWorkorderCategoryReq"}}],"responses":{"200":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"CategoryGroupHandler_ListCategory"}},"/api/workorder/category/update/{id}":{"put":{"path":"/api/workorder/category/update/:id","method":"PUT","summary":"更新update","description":"UpdateCategory 更新工单分类","tags":["Workorder","CategoryGroup"],"parameters":[{"name":"body","in":"body","description":"请求体","schema":{"$ref":"#/definitions/UpdateWorkorderCategoryReq"}}],"responses":{"200":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"CategoryGroupHandler_UpdateCategory"}},"/api/workorder/form-design/create":{"post":{"path":"/api/workorder/form-design/create","method":"POST","summary":"创建create","description":"CreateFormDesign 创建表单设计","tags":["Workorder","FormDesign"],"parameters":[{"name":"body","in":"body","description":"请求体","schema":{"$ref":"#/definitions/CreateWorkorderFormDesignReq"}}],"responses":{"201":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"FormDesignHandler_CreateFormDesign"}},"/api/workorder/form-design/delete/{id}":{"delete":{"path":"/api/workorder/form-design/delete/:id","method":"DELETE","summary":"删除delete","description":"DeleteFormDesign 删除表单设计","tags":["Workorder","FormDesign"],"parameters":[{"name":"body","in":"body","description":"请求体","schema":{"$ref":"#/definitions/DeleteWorkorderFormDesignReq"}}],"responses":{"200":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"FormDesignHandler_DeleteFormDesign"}},"/api/workorder/form-design/detail/{id}":{"get":{"path":"/api/workorder/form-design/detail/:id","method":"GET","summary":"获取detail详情","description":"DetailFormDesign 获取表单设计详情","tags":["Workorder","FormDesign"],"parameters":[{"name":"body","in":"body","description":"请求体","schema":{"$ref":"#/definitions/DetailWorkorderFormDesignReq"}}],"responses":{"200":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"FormDesignHandler_DetailFormDesign"}},"/api/workorder/form-design/list":{"get":{"path":"/api/workorder/form-design/list","method":"GET","summary":"获取list列表","description":"ListFormDesign 获取表单设计列表","tags":["Workorder","FormDesign"],"parameters":[{"name":"body","in":"body","description":"请求体","schema":{"$ref":"#/definitions/ListWorkorderFormDesignReq"}}],"responses":{"200":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"FormDesignHandler_ListFormDesign"}},"/api/workorder/form-design/update/{id}":{"put":{"path":"/api/workorder/form-design/update/:id","method":"PUT","summary":"更新update","description":"UpdateFormDesign 更新表单设计","tags":["Workorder","FormDesign"],"parameters":[{"name":"body","in":"body","description":"请求体","schema":{"$ref":"#/definitions/UpdateWorkorderFormDesignReq"}}],"responses":{"200":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"FormDesignHandler_UpdateFormDesign"}},"/api/workorder/instance/actions/{id}":{"get":{"path":"/api/workorder/instance/actions/:id","method":"GET","summary":"获取actions详情","description":"GetAvailableActions 获取可执行动作","tags":["Workorder","Instance"],"responses":{"200":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"InstanceHandler_GetAvailableActions"}},"/api/workorder/instance/approve/{id}":{"post":{"path":"/api/workorder/instance/approve/:id","method":"POST","summary":"创建approve","description":"ApproveInstance 审批通过工单","tags":["Workorder","Instance"],"parameters":[{"name":"body","in":"body","description":"请求体","schema":{"$ref":"#/definitions/ApproveWorkorderInstanceReq"}}],"responses":{"201":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"InstanceHandler_ApproveInstance"}},"/api/workorder/instance/assign/{id}":{"post":{"path":"/api/workorder/instance/assign/:id","method":"POST","summary":"创建assign","description":"AssignInstance 指派工单","tags":["Workorder","Instance"],"parameters":[{"name":"body","in":"body","description":"请求体","schema":{"$ref":"#/definitions/AssignWorkorderInstanceReq"}}],"responses":{"201":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"InstanceHandler_AssignInstance"}},"/api/workorder/instance/cancel/{id}":{"post":{"path":"/api/workorder/instance/cancel/:id","method":"POST","summary":"创建cancel","description":"CancelInstance 取消工单","tags":["Workorder","Instance"],"parameters":[{"name":"body","in":"body","description":"请求体","schema":{"$ref":"#/definitions/CancelWorkorderInstanceReq"}}],"responses":{"201":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"InstanceHandler_CancelInstance"}},"/api/workorder/instance/comment/create":{"post":{"path":"/api/workorder/instance/comment/create","method":"POST","summary":"创建create","description":"CreateInstanceComment 创建工单评论\nCreateInstanceComment 创建工单评论","tags":["Workorder","InstanceComment"],"parameters":[{"name":"body","in":"body","description":"请求体","schema":{"$ref":"#/definitions/CreateWorkorderInstanceCommentReq"}}],"responses":{"201":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"InstanceCommentHandler_CreateInstanceComment"}},"/api/workorder/instance/comment/delete/{id}":{"delete":{"path":"/api/workorder/instance/comment/delete/:id","method":"DELETE","summary":"删除delete","description":"DeleteInstanceComment 删除工单评论\nDeleteInstanceComment 删除工单评论","tags":["Workorder","InstanceComment"],"responses":{"200":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"InstanceCommentHandler_DeleteInstanceComment"}},"/api/workorder/instance/comment/detail/{id}":{"get":{"path":"/api/workorder/instance/comment/detail/:id","method":"GET","summary":"获取detail详情","description":"GetInstanceComment 获取工单评论详情\nGetInstanceComment 获取工单评论详情","tags":["Workorder","InstanceComment"],"responses":{"200":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"InstanceCommentHandler_GetInstanceComment"}},"/api/workorder/instance/comment/list":{"get":{"path":"/api/workorder/instance/comment/list","method":"GET","summary":"获取list列表","description":"ListInstanceComments 获取工单评论列表\nListInstanceComments 获取工单评论列表","tags":["Workorder","InstanceComment"],"parameters":[{"name":"body","in":"body","description":"请求体","schema":{"$ref":"#/definitions/ListWorkorderInstanceCommentReq"}}],"responses":{"200":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"InstanceCommentHandler_ListInstanceComments"}},"/api/workorder/instance/comment/tree/{id}":{"get":{"path":"/api/workorder/instance/comment/tree/:id","method":"GET","summary":"获取tree详情","description":"GetInstanceCommentsTree 获取工单评论树结构\nGetInstanceCommentsTree 获取工单评论树结构","tags":["Workorder","InstanceComment"],"parameters":[{"name":"body","in":"body","description":"请求体","schema":{"$ref":"#/definitions/GetInstanceCommentsTreeReq"}}],"responses":{"200":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"InstanceCommentHandler_GetInstanceCommentsTree"}},"/api/workorder/instance/comment/update/{id}":{"put":{"path":"/api/workorder/instance/comment/update/:id","method":"PUT","summary":"更新update","description":"UpdateInstanceComment 更新工单评论\nUpdateInstanceComment 更新工单评论","tags":["Workorder","InstanceComment"],"parameters":[{"name":"body","in":"body","description":"请求体","schema":{"$ref":"#/definitions/UpdateWorkorderInstanceCommentReq"}}],"responses":{"200":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"InstanceCommentHandler_UpdateInstanceComment"}},"/api/workorder/instance/complete/{id}":{"post":{"path":"/api/workorder/instance/complete/:id","method":"POST","summary":"创建complete","description":"CompleteInstance 完成工单","tags":["Workorder","Instance"],"parameters":[{"name":"body","in":"body","description":"请求体","schema":{"$ref":"#/definitions/CompleteWorkorderInstanceReq"}}],"responses":{"201":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"InstanceHandler_CompleteInstance"}},"/api/workorder/instance/create":{"post":{"path":"/api/workorder/instance/create","method":"POST","summary":"创建create","description":"CreateInstance 创建工单实例","tags":["Workorder","Instance"],"parameters":[{"name":"body","in":"body","description":"请求体","schema":{"$ref":"#/definitions/CreateWorkorderInstanceReq"}}],"responses":{"201":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"InstanceHandler_CreateInstance"}},"/api/workorder/instance/create-from-template/{id}":{"post":{"path":"/api/workorder/instance/create-from-template/:id","method":"POST","summary":"创建create-from-template","description":"CreateInstanceFromTemplate 从模板创建工单实例","tags":["Workorder","Instance"],"parameters":[{"name":"body","in":"body","description":"请求体","schema":{"$ref":"#/definitions/CreateWorkorderInstanceFromTemplateReq"}}],"responses":{"201":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"InstanceHandler_CreateInstanceFromTemplate"}},"/api/workorder/instance/current-step/{id}":{"get":{"path":"/api/workorder/instance/current-step/:id","method":"GET","summary":"获取current-step详情","description":"GetCurrentStep 获取当前步骤","tags":["Workorder","Instance"],"responses":{"200":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"InstanceHandler_GetCurrentStep"}},"/api/workorder/instance/delete/{id}":{"delete":{"path":"/api/workorder/instance/delete/:id","method":"DELETE","summary":"删除delete","description":"DeleteInstance 删除工单实例","tags":["Workorder","Instance"],"responses":{"200":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"InstanceHandler_DeleteInstance"}},"/api/workorder/instance/detail/{id}":{"get":{"path":"/api/workorder/instance/detail/:id","method":"GET","summary":"获取detail详情","description":"DetailInstance 获取工单实例详情","tags":["Workorder","Instance"],"responses":{"200":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"InstanceHandler_DetailInstance"}},"/api/workorder/instance/flow/detail/{id}":{"get":{"path":"/api/workorder/instance/flow/detail/:id","method":"GET","summary":"获取detail详情","description":"DetailInstanceFlow 获取工单流转记录详情\n获取工单流转记录详情","tags":["Workorder","InstanceFlow"],"parameters":[{"name":"body","in":"body","description":"请求体","schema":{"$ref":"#/definitions/DetailWorkorderInstanceFlowReq"}}],"responses":{"200":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"InstanceFlowHandler_DetailInstanceFlow"}},"/api/workorder/instance/flow/list":{"get":{"path":"/api/workorder/instance/flow/list","method":"GET","summary":"获取list列表","description":"ListInstanceFlows 获取工单流转记录列表\n获取工单流转记录列表","tags":["Workorder","InstanceFlow"],"parameters":[{"name":"body","in":"body","description":"请求体","schema":{"$ref":"#/definitions/ListWorkorderInstanceFlowReq"}}],"responses":{"200":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"InstanceFlowHandler_ListInstanceFlows"}},"/api/workorder/instance/list":{"get":{"path":"/api/workorder/instance/list","method":"GET","summary":"获取list列表","description":"ListInstance 获取工单实例列表","tags":["Workorder","Instance"],"parameters":[{"name":"body","in":"body","description":"请求体","schema":{"$ref":"#/definitions/ListWorkorderInstanceReq"}}],"responses":{"200":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"InstanceHandler_ListInstance"}},"/api/workorder/instance/reject/{id}":{"post":{"path":"/api/workorder/instance/reject/:id","method":"POST","summary":"创建reject","description":"RejectInstance 拒绝工单","tags":["Workorder","Instance"],"parameters":[{"name":"body","in":"body","description":"请求体","schema":{"$ref":"#/definitions/RejectWorkorderInstanceReq"}}],"responses":{"201":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"InstanceHandler_RejectInstance"}},"/api/workorder/instance/return/{id}":{"post":{"path":"/api/workorder/instance/return/:id","method":"POST","summary":"创建return","description":"ReturnInstance 退回工单","tags":["Workorder","Instance"],"parameters":[{"name":"body","in":"body","description":"请求体","schema":{"$ref":"#/definitions/ReturnWorkorderInstanceReq"}}],"responses":{"201":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"InstanceHandler_ReturnInstance"}},"/api/workorder/instance/submit/{id}":{"post":{"path":"/api/workorder/instance/submit/:id","method":"POST","summary":"创建submit","description":"SubmitInstance 提交工单","tags":["Workorder","Instance"],"parameters":[{"name":"body","in":"body","description":"请求体","schema":{"$ref":"#/definitions/SubmitWorkorderInstanceReq"}}],"responses":{"201":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"InstanceHandler_SubmitInstance"}},"/api/workorder/instance/timeline/create":{"post":{"path":"/api/workorder/instance/timeline/create","method":"POST","summary":"创建create","description":"CreateInstanceTimeLine 创建工单时间线记录\nCreateInstanceTimeLine 创建工单时间线记录","tags":["Workorder","InstanceTimeLine"],"parameters":[{"name":"body","in":"body","description":"请求体","schema":{"$ref":"#/definitions/CreateWorkorderInstanceTimelineReq"}}],"responses":{"201":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"InstanceTimeLineHandler_CreateInstanceTimeLine"}},"/api/workorder/instance/timeline/detail/{id}":{"get":{"path":"/api/workorder/instance/timeline/detail/:id","method":"GET","summary":"获取detail详情","description":"DetailInstanceTimeLine 获取工单时间线记录详情\nDetailInstanceTimeLine 获取工单时间线记录详情","tags":["Workorder","InstanceTimeLine"],"parameters":[{"name":"body","in":"body","description":"请求体","schema":{"$ref":"#/definitions/DetailWorkorderInstanceTimelineReq"}}],"responses":{"200":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"InstanceTimeLineHandler_DetailInstanceTimeLine"}},"/api/workorder/instance/timeline/list":{"get":{"path":"/api/workorder/instance/timeline/list","method":"GET","summary":"获取list列表","description":"ListInstanceTimeLine 获取工单时间线记录列表\nListInstanceTimeLine 获取工单时间线记录列表","tags":["Workorder","InstanceTimeLine"],"parameters":[{"name":"body","in":"body","description":"请求体","schema":{"$ref":"#/definitions/ListWorkorderInstanceTimelineReq"}}],"responses":{"200":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"InstanceTimeLineHandler_ListInstanceTimeLine"}},"/api/workorder/instance/update/{id}":{"put":{"path":"/api/workorder/instance/update/:id","method":"PUT","summary":"更新update","description":"UpdateInstance 更新工单实例","tags":["Workorder","Instance"],"parameters":[{"name":"body","in":"body","description":"请求体","schema":{"$ref":"#/definitions/UpdateWorkorderInstanceReq"}}],"responses":{"200":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"InstanceHandler_UpdateInstance"}},"/api/workorder/notification/channels":{"get":{"path":"/api/workorder/notification/channels","method":"GET","summary":"获取channels列表","description":"GetAvailableChannels 获取可用的通知渠道","tags":["Workorder","Notification"],"responses":{"200":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"NotificationHandler_GetAvailableChannels"}},"/api/workorder/notification/create":{"post":{"path":"/api/workorder/notification/create","method":"POST","summary":"创建create","description":"CreateNotification 创建通知配置","tags":["Workorder","Notification"],"parameters":[{"name":"body","in":"body","description":"请求体","schema":{"$ref":"#/definitions/CreateWorkorderNotificationReq"}}],"responses":{"201":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"NotificationHandler_CreateNotification"}},"/api/workorder/notification/delete/{id}":{"delete":{"path":"/api/workorder/notification/delete/:id","method":"DELETE","summary":"删除delete","description":"DeleteNotification 删除通知配置","tags":["Workorder","Notification"],"parameters":[{"name":"body","in":"body","description":"请求体","schema":{"$ref":"#/definitions/DeleteWorkorderNotificationReq"}}],"responses":{"200":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"NotificationHandler_DeleteNotification"}},"/api/workorder/notification/detail/{id}":{"get":{"path":"/api/workorder/notification/detail/:id","method":"GET","summary":"获取detail详情","description":"DetailNotification 获取通知配置详情","tags":["Workorder","Notification"],"parameters":[{"name":"body","in":"body","description":"请求体","schema":{"$ref":"#/definitions/DetailWorkorderNotificationReq"}}],"responses":{"200":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"NotificationHandler_DetailNotification"}},"/api/workorder/notification/list":{"get":{"path":"/api/workorder/notification/list","method":"GET","summary":"获取list列表","description":"ListNotification 获取通知配置列表","tags":["Workorder","Notification"],"parameters":[{"name":"body","in":"body","description":"请求体","schema":{"$ref":"#/definitions/ListWorkorderNotificationReq"}}],"responses":{"200":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"NotificationHandler_ListNotification"}},"/api/workorder/notification/logs":{"get":{"path":"/api/workorder/notification/logs","method":"GET","summary":"获取logs列表","description":"GetSendLogs 获取通知发送日志","tags":["Workorder","Notification"],"parameters":[{"name":"body","in":"body","description":"请求体","schema":{"$ref":"#/definitions/ListWorkorderNotificationLogReq"}}],"responses":{"200":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"NotificationHandler_GetSendLogs"}},"/api/workorder/notification/send":{"post":{"path":"/api/workorder/notification/send","method":"POST","summary":"创建send","description":"SendNotificationManually 手动发送通知","tags":["Workorder","Notification"],"parameters":[{"name":"body","in":"body","description":"请求体","schema":{"$ref":"#/definitions/ManualSendNotificationReq"}}],"responses":{"201":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"NotificationHandler_SendNotificationManually"}},"/api/workorder/notification/test/send":{"post":{"path":"/api/workorder/notification/test/send","method":"POST","summary":"创建send","description":"TestSendNotification 测试发送通知","tags":["Workorder","Notification"],"parameters":[{"name":"body","in":"body","description":"请求体","schema":{"$ref":"#/definitions/TestSendWorkorderNotificationReq"}}],"responses":{"201":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"NotificationHandler_TestSendNotification"}},"/api/workorder/notification/update/{id}":{"put":{"path":"/api/workorder/notification/update/:id","method":"PUT","summary":"更新update","description":"UpdateNotification 更新通知配置","tags":["Workorder","Notification"],"parameters":[{"name":"body","in":"body","description":"请求体","schema":{"$ref":"#/definitions/UpdateWorkorderNotificationReq"}}],"responses":{"200":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"NotificationHandler_UpdateNotification"}},"/api/workorder/process/create":{"post":{"path":"/api/workorder/process/create","method":"POST","summary":"创建create","description":"CreateWorkorderProcess 创建工单流程","tags":["Workorder","WorkorderProcess"],"parameters":[{"name":"body","in":"body","description":"请求体","schema":{"$ref":"#/definitions/CreateWorkorderProcessReq"}}],"responses":{"201":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"WorkorderProcessHandler_CreateWorkorderProcess"}},"/api/workorder/process/delete/{id}":{"delete":{"path":"/api/workorder/process/delete/:id","method":"DELETE","summary":"删除delete","description":"DeleteWorkorderProcess 删除工单流程","tags":["Workorder","WorkorderProcess"],"parameters":[{"name":"body","in":"body","description":"请求体","schema":{"$ref":"#/definitions/DeleteWorkorderProcessReq"}}],"responses":{"200":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"WorkorderProcessHandler_DeleteWorkorderProcess"}},"/api/workorder/process/detail/{id}":{"get":{"path":"/api/workorder/process/detail/:id","method":"GET","summary":"获取detail详情","description":"DetailWorkorderProcess 获取工单流程详情","tags":["Workorder","WorkorderProcess"],"parameters":[{"name":"body","in":"body","description":"请求体","schema":{"$ref":"#/definitions/DetailWorkorderProcessReq"}}],"responses":{"200":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"WorkorderProcessHandler_DetailWorkorderProcess"}},"/api/workorder/process/list":{"get":{"path":"/api/workorder/process/list","method":"GET","summary":"获取list列表","description":"ListWorkorderProcess 获取工单流程列表","tags":["Workorder","WorkorderProcess"],"parameters":[{"name":"body","in":"body","description":"请求体","schema":{"$ref":"#/definitions/ListWorkorderProcessReq"}}],"responses":{"200":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"WorkorderProcessHandler_ListWorkorderProcess"}},"/api/workorder/process/update/{id}":{"put":{"path":"/api/workorder/process/update/:id","method":"PUT","summary":"更新update","description":"UpdateWorkorderProcess 更新工单流程","tags":["Workorder","WorkorderProcess"],"parameters":[{"name":"body","in":"body","description":"请求体","schema":{"$ref":"#/definitions/UpdateWorkorderProcessReq"}}],"responses":{"200":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"WorkorderProcessHandler_UpdateWorkorderProcess"}},"/api/workorder/template/create":{"post":{"path":"/api/workorder/template/create","method":"POST","summary":"创建create","description":"CreateTemplate 创建模板","tags":["Workorder","Template"],"parameters":[{"name":"body","in":"body","description":"请求体","schema":{"$ref":"#/definitions/CreateWorkorderTemplateReq"}}],"responses":{"201":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"TemplateHandler_CreateTemplate"}},"/api/workorder/template/delete/{id}":{"delete":{"path":"/api/workorder/template/delete/:id","method":"DELETE","summary":"删除delete","description":"DeleteTemplate 删除模板","tags":["Workorder","Template"],"parameters":[{"name":"body","in":"body","description":"请求体","schema":{"$ref":"#/definitions/DeleteWorkorderTemplateReq"}}],"responses":{"200":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"TemplateHandler_DeleteTemplate"}},"/api/workorder/template/detail/{id}":{"get":{"path":"/api/workorder/template/detail/:id","method":"GET","summary":"获取detail详情","description":"DetailTemplate 获取模板详情","tags":["Workorder","Template"],"parameters":[{"name":"body","in":"body","description":"请求体","schema":{"$ref":"#/definitions/DetailWorkorderTemplateReq"}}],"responses":{"200":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"TemplateHandler_DetailTemplate"}},"/api/workorder/template/list":{"get":{"path":"/api/workorder/template/list","method":"GET","summary":"获取list列表","description":"ListTemplate 获取模板列表","tags":["Workorder","Template"],"parameters":[{"name":"body","in":"body","description":"请求体","schema":{"$ref":"#/definitions/ListWorkorderTemplateReq"}}],"responses":{"200":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"TemplateHandler_ListTemplate"}},"/api/workorder/template/update/{id}":{"put":{"path":"/api/workorder/template/update/:id","method":"PUT","summary":"更新update","description":"UpdateTemplate 更新模板","tags":["Workorder","Template"],"parameters":[{"name":"body","in":"body","description":"请求体","schema":{"$ref":"#/definitions/UpdateWorkorderTemplateReq"}}],"responses":{"200":{"description":"成功","schema":{"$ref":"#/definitions/ApiResponse"}},"400":{"description":"请求参数错误","schema":{"$ref":"#/definitions/ApiResponse"}},"401":{"description":"未授权","schema":{"$ref":"#/definitions/ApiResponse"}},"500":{"description":"服务器内部错误","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"BearerAuth":[]}],"operationId":"TemplateHandler_UpdateTemplate"}}},"definitions":{"AccessLog":{"type":"object","properties":{"duration":{"type":"object"},"method":{"type":"string"},"path":{"type":"string"},"reqBody":{"type":"string"},"respBody":{"type":"string"},"status":{"type":"integer"}},"description":"AccessLog数据模型"},"AddToolToBlacklistReq":{"type":"object","properties":{"id":{"type":"integer"},"tool_id":{"type":"integer"}},"required":["id","tool_id"],"description":"AddToolToBlacklistReq数据模型"},"AddToolToWhitelistReq":{"type":"object","properties":{"id":{"type":"integer"},"tool_name":{"type":"string"}},"required":["id","tool_name"],"description":"AddToolToWhitelistReq数据模型"},"AddTreeNodeMemberReq":{"type":"object","properties":{"member_type":{"type":"object"},"node_id":{"type":"integer"},"user_id":{"type":"integer"}},"required":["node_id","user_id","member_type"],"description":"AddTreeNodeMemberReq数据模型"},"AdvancedSearchOptions":{"type":"object","properties":{"duration_max":{"type":"integer"},"duration_min":{"type":"integer"},"endpoint_pattern":{"type":"string"},"has_error":{"type":"object"},"ip_address_list":{"type":"array","items":{"type":"string"}},"status_code_list":{"type":"array","items":{"type":"integer"}}},"description":"AdvancedSearchOptions数据模型"},"AlertmanagerSilenceResponse":{"type":"object","properties":{"data":{"type":"object"},"status":{"type":"string"}},"description":"AlertmanagerSilenceResponse数据模型"},"Api":{"type":"object","properties":{"category":{"type":"integer","description":"API分类 1系统 2业务"},"description":{"type":"string","description":"API描述"},"is_public":{"type":"integer","description":"是否公开 0否 1是"},"method":{"type":"integer","description":"HTTP请求方法 1GET 2POST 3PUT 4DELETE"},"name":{"type":"string","description":"API名称"},"path":{"type":"string","description":"API路径"},"users":{"type":"array","items":{"type":"string"},"description":"关联用户"},"version":{"type":"string","description":"API版本"}},"description":"Api数据模型"},"ApiResponse":{"type":"object","properties":{"code":{"type":"integer"},"data":{"type":"integer"},"message":{"type":"string"}},"description":"ApiResponse数据模型"},"ApiStatistics":{"type":"object","properties":{"private_count":{"type":"integer"},"public_count":{"type":"integer"}},"description":"ApiStatistics数据模型"},"ApproveWorkorderInstanceReq":{"type":"object","properties":{"comment":{"type":"string"},"id":{"type":"integer"}},"required":["id"],"description":"ApproveWorkorderInstanceReq数据模型"},"ArchiveAuditLogsRequest":{"type":"object","properties":{"end_time":{"type":"integer"},"start_time":{"type":"integer"}},"required":["start_time","end_time"],"description":"ArchiveAuditLogsRequest数据模型"},"AssignRoleApiRequest":{"type":"object","properties":{"api_ids":{"type":"array","items":{"type":"integer"}},"role_id":{"type":"integer"}},"required":["role_id","api_ids"],"description":"AssignRoleApiRequest数据模型"},"AssignRoleRequest":{"type":"object","properties":{"role_ids":{"type":"array","items":{"type":"integer"}},"user_id":{"type":"integer"}},"required":["user_id","role_ids"],"description":"AssignRoleRequest数据模型"},"AssignRolesToUserRequest":{"type":"object","properties":{"role_ids":{"type":"array","items":{"type":"integer"}},"user_id":{"type":"integer"}},"required":["user_id","role_ids"],"description":"AssignRolesToUserRequest数据模型"},"AssignWorkorderInstanceReq":{"type":"object","properties":{"assignee_id":{"type":"integer"},"id":{"type":"integer"}},"required":["id","assignee_id"],"description":"AssignWorkorderInstanceReq数据模型"},"Attachment":{"type":"object","properties":{"content":{"type":"array","items":{"type":"string"}},"content_type":{"type":"string"},"name":{"type":"string"},"size":{"type":"integer"}},"description":"Attachment数据模型"},"AuditLog":{"type":"object","properties":{"description":{"type":"string","description":"描述"},"duration":{"type":"integer","description":"请求耗时(微秒)"},"endpoint":{"type":"string","description":"请求端点"},"error_msg":{"type":"string","description":"错误信息"},"http_method":{"type":"string","description":"HTTP请求方法"},"ip_address":{"type":"string","description":"操作IP地址"},"operation_type":{"type":"string","description":"操作类型"},"request_body":{"type":"object","description":"请求体"},"response_body":{"type":"object","description":"响应体"},"status_code":{"type":"integer","description":"HTTP状态码"},"target_id":{"type":"string","description":"目标资源ID"},"target_type":{"type":"string","description":"目标资源类型"},"trace_id":{"type":"string","description":"链路追踪ID"},"user_agent":{"type":"string","description":"用户代理"},"user_id":{"type":"integer","description":"操作用户ID"}},"description":"AuditLog数据模型"},"AuditLogBatch":{"type":"object","properties":{"logs":{"type":"array","items":{"type":"string"}}},"description":"AuditLogBatch数据模型"},"AuditStatistics":{"type":"object","properties":{"avg_duration":{"type":"number"},"error_count":{"type":"integer"},"hourly_trend":{"type":"array","items":{"type":"string"}},"recent_activity":{"type":"array","items":{"type":"string"}},"status_distribution":{"type":"array","items":{"type":"string"}},"today_count":{"type":"integer"},"total_count":{"type":"integer"},"type_distribution":{"type":"array","items":{"type":"string"}}},"description":"AuditStatistics数据模型"},"AuditTypeInfo":{"type":"object","properties":{"category":{"type":"string"},"description":{"type":"string"},"type":{"type":"string"}},"description":"AuditTypeInfo数据模型"},"BaseChannelConfig":{"type":"object","properties":{"enabled":{"type":"boolean"},"max_retries":{"type":"integer"},"retry_interval":{"type":"object"},"timeout":{"type":"object"}},"description":"BaseChannelConfig数据模型"},"BatchDeleteClusterRoleBindingReq":{"type":"object","properties":{"cluster_id":{"type":"integer","description":"集群ID"},"names":{"type":"array","items":{"type":"string"},"description":"ClusterRoleBinding名称列表"}},"required":["cluster_id","names"],"description":"BatchDeleteClusterRoleBindingReq数据模型"},"BatchDeleteClusterRoleReq":{"type":"object","properties":{"cluster_id":{"type":"integer","description":"集群ID"},"names":{"type":"array","items":{"type":"string"},"description":"ClusterRole名称列表"}},"required":["cluster_id","names"],"description":"BatchDeleteClusterRoleReq数据模型"},"BatchDeleteClustersReq":{"type":"object","properties":{"ids":{"type":"array","items":{"type":"integer"}}},"required":["ids"],"description":"BatchDeleteClustersReq数据模型"},"BatchDeleteReq":{"type":"object","properties":{"ids":{"type":"array","items":{"type":"integer"}}},"required":["ids"],"description":"BatchDeleteReq数据模型"},"BatchDeleteRequest":{"type":"object","properties":{"ids":{"type":"array","items":{"type":"integer"}}},"required":["ids"],"description":"BatchDeleteRequest数据模型"},"BatchDeleteRoleBindingReq":{"type":"object","properties":{"bindings":{"type":"array","items":{"type":"string"},"description":"RoleBinding列表"},"cluster_id":{"type":"integer","description":"集群ID"}},"required":["cluster_id","bindings"],"description":"BatchDeleteRoleBindingReq数据模型"},"BatchDeleteRoleReq":{"type":"object","properties":{"cluster_id":{"type":"integer","description":"集群ID"},"roles":{"type":"array","items":{"type":"string"},"description":"Role列表"}},"required":["cluster_id","roles"],"description":"BatchDeleteRoleReq数据模型"},"BatchSendNotificationPayload":{"type":"object","properties":{"created_at":{"type":"string","format":"date-time"},"metadata":{"type":"object","additionalProperties":true},"requests":{"type":"array","items":{"type":"string"}}},"description":"BatchSendNotificationPayload数据模型"},"BindTreeLocalResourceReq":{"type":"object","properties":{"id":{"type":"integer"},"tree_node_ids":{"type":"array","items":{"type":"integer"}}},"description":"BindTreeLocalResourceReq数据模型"},"BindTreeNodeResourceReq":{"type":"object","properties":{"node_id":{"type":"integer"},"resource_ids":{"type":"array","items":{"type":"integer"}}},"required":["node_id","resource_ids"],"description":"BindTreeNodeResourceReq数据模型"},"CSIVolumeSourceRequest":{"type":"object","properties":{"driver":{"type":"string","description":"CSI驱动"},"read_only":{"type":"boolean","description":"是否只读"},"volume_attributes":{"type":"object","description":"卷属性","additionalProperties":true},"volume_handle":{"type":"string","description":"卷句柄"}},"description":"CSIVolumeSourceRequest数据模型"},"CallToolReq":{"type":"object","properties":{"arguments":{"type":"object","additionalProperties":true},"name":{"type":"string"}},"required":["name"],"description":"CallToolReq数据模型"},"CancelWorkorderInstanceReq":{"type":"object","properties":{"comment":{"type":"string"},"id":{"type":"integer"}},"required":["id","comment"],"description":"CancelWorkorderInstanceReq数据模型"},"ChangePasswordReq":{"type":"object","properties":{"confirm_password":{"type":"string"},"new_password":{"type":"string"},"password":{"type":"string"},"user_id":{"type":"integer"},"username":{"type":"string"}},"required":["user_id","username","password","new_password","confirm_password"],"description":"ChangePasswordReq数据模型"},"CheckPermissionsReq":{"type":"object","properties":{"cluster_id":{"type":"integer","description":"集群ID"},"resources":{"type":"array","items":{"type":"string"},"description":"资源列表"},"subject":{"$ref":"#/definitions/Subject","description":"主体"}},"required":["cluster_id","subject","resources"],"description":"CheckPermissionsReq数据模型"},"CheckPermissionsResponse":{"type":"object","properties":{"allowed_count":{"type":"integer"},"denied_count":{"type":"integer"},"results":{"type":"array","items":{"type":"string"}},"subject":{"$ref":"#/definitions/Subject"}},"description":"CheckPermissionsResponse数据模型"},"CheckTreeNodePermissionReq":{"type":"object","properties":{"node_id":{"type":"integer"},"operation":{"type":"string"},"user_id":{"type":"integer"}},"required":["user_id","node_id","operation"],"description":"CheckTreeNodePermissionReq数据模型"},"CheckUserPermissionRequest":{"type":"object","properties":{"method":{"type":"string"},"path":{"type":"string"},"user_id":{"type":"integer"}},"required":["user_id","method","path"],"description":"CheckUserPermissionRequest数据模型"},"ClusterCreateReq":{"type":"object","properties":{"action_timeout_seconds":{"type":"integer"},"api_server_addr":{"type":"string"},"cpu_limit":{"type":"string"},"cpu_request":{"type":"string"},"env":{"type":"string"},"kube_config_content":{"type":"string"},"memory_limit":{"type":"string"},"memory_request":{"type":"string"},"name":{"type":"string"},"name_zh":{"type":"string"},"restricted_name_space":{"type":"object"},"status":{"type":"string"},"user_id":{"type":"integer"},"version":{"type":"string"}},"required":["name","name_zh"],"description":"ClusterCreateReq数据模型"},"ClusterDeleteReq":{"type":"object","properties":{"id":{"type":"integer","description":"集群ID"}},"required":["id"],"description":"ClusterDeleteReq数据模型"},"ClusterGetReq":{"type":"object","properties":{"id":{"type":"integer","description":"集群ID"}},"required":["id"],"description":"ClusterGetReq数据模型"},"ClusterHealthResponse":{"type":"object","properties":{"api_server_addr":{"type":"string"},"cluster_id":{"type":"integer"},"cluster_name":{"type":"string"},"component_status":{"type":"array","items":{"type":"string"}},"connected":{"type":"boolean"},"error_message":{"type":"string"},"last_check_time":{"type":"string"},"namespace_count":{"type":"integer"},"node_count":{"type":"integer"},"resource_summary":{"$ref":"#/definitions/ClusterResourceSummary"},"response_time":{"type":"string"},"status":{"type":"string"},"version":{"type":"string"}},"description":"ClusterHealthResponse数据模型"},"ClusterListReq":{"type":"object","properties":{"env":{"type":"string"},"status":{"type":"string"}},"description":"ClusterListReq数据模型"},"ClusterNamespaces":{"type":"object","properties":{"cluster_id":{"type":"integer"},"cluster_name":{"type":"string"},"namespaces":{"type":"array","items":{"type":"string"}}},"description":"ClusterNamespaces数据模型"},"ClusterRefreshReq":{"type":"object","properties":{"id":{"type":"integer","description":"集群ID"}},"required":["id"],"description":"ClusterRefreshReq数据模型"},"ClusterResourceSummary":{"type":"object","properties":{"failed_pods":{"type":"integer"},"pending_pods":{"type":"integer"},"running_pods":{"type":"integer"},"total_cpu":{"type":"string"},"total_memory":{"type":"string"},"total_pods":{"type":"integer"},"used_cpu":{"type":"string"},"used_memory":{"type":"string"}},"description":"ClusterResourceSummary数据模型"},"ClusterRoleBindingDetailResponse":{"type":"object","properties":{"cluster_role_binding":{"$ref":"#/definitions/ClusterRoleBindingInfo"},"cluster_role_detail":{"$ref":"#/definitions/ClusterRoleInfo"},"events":{"type":"array","items":{"type":"string"}},"permissions":{"type":"array","items":{"type":"string"}},"yaml":{"type":"string"}},"description":"ClusterRoleBindingDetailResponse数据模型"},"ClusterRoleBindingEventEntity":{"type":"object","properties":{"count":{"type":"integer"},"first_time":{"type":"string"},"last_time":{"type":"string"},"message":{"type":"string"},"reason":{"type":"string"},"source":{"type":"string"},"type":{"type":"string"}},"description":"ClusterRoleBindingEventEntity数据模型"},"ClusterRoleBindingGetReq":{"type":"object","properties":{"cluster_id":{"type":"integer","description":"集群ID"},"name":{"type":"string","description":"ClusterRoleBinding名称"}},"required":["cluster_id","name"],"description":"ClusterRoleBindingGetReq数据模型"},"ClusterRoleBindingInfo":{"type":"object","properties":{"age":{"type":"string"},"annotations":{"type":"object","additionalProperties":true},"cluster_id":{"type":"integer"},"creation_timestamp":{"type":"string"},"labels":{"type":"object","additionalProperties":true},"name":{"type":"string"},"resource_version":{"type":"string"},"role_ref":{"$ref":"#/definitions/RoleRef"},"subjects":{"type":"array","items":{"type":"string"}},"uid":{"type":"string"}},"description":"ClusterRoleBindingInfo数据模型"},"ClusterRoleBindingListReq":{"type":"object","properties":{"cluster_id":{"type":"integer","description":"集群ID"},"keyword":{"type":"string","description":"关键字搜索"},"page":{"type":"integer","description":"页码"},"page_size":{"type":"integer","description":"页面大小"}},"required":["cluster_id"],"description":"ClusterRoleBindingListReq数据模型"},"ClusterRoleBindingListResponse":{"type":"object","properties":{"items":{"type":"array","items":{"type":"string"}},"total_count":{"type":"integer"}},"description":"ClusterRoleBindingListResponse数据模型"},"ClusterRoleBindingSimpleInfo":{"type":"object","properties":{"name":{"type":"string"},"subjects":{"type":"array","items":{"type":"string"}}},"description":"ClusterRoleBindingSimpleInfo数据模型"},"ClusterRoleBindingYamlReq":{"type":"object","properties":{"cluster_id":{"type":"integer","description":"集群ID"},"name":{"type":"string","description":"ClusterRoleBinding名称"},"yaml_content":{"type":"string","description":"YAML内容"}},"required":["cluster_id","name","yaml_content"],"description":"ClusterRoleBindingYamlReq数据模型"},"ClusterRoleDetailResponse":{"type":"object","properties":{"bindings":{"type":"array","items":{"type":"string"}},"cluster_role":{"$ref":"#/definitions/ClusterRoleInfo"},"events":{"type":"array","items":{"type":"string"}},"usage":{"$ref":"#/definitions/ClusterRoleUsageEntity"},"yaml":{"type":"string"}},"description":"ClusterRoleDetailResponse数据模型"},"ClusterRoleEventEntity":{"type":"object","properties":{"count":{"type":"integer"},"first_time":{"type":"string"},"last_time":{"type":"string"},"message":{"type":"string"},"reason":{"type":"string"},"source":{"type":"string"},"type":{"type":"string"}},"description":"ClusterRoleEventEntity数据模型"},"ClusterRoleGetReq":{"type":"object","properties":{"cluster_id":{"type":"integer","description":"集群ID"},"name":{"type":"string","description":"ClusterRole名称"}},"required":["cluster_id","name"],"description":"ClusterRoleGetReq数据模型"},"ClusterRoleInfo":{"type":"object","properties":{"age":{"type":"string"},"annotations":{"type":"object","additionalProperties":true},"cluster_id":{"type":"integer"},"creation_timestamp":{"type":"string"},"labels":{"type":"object","additionalProperties":true},"name":{"type":"string"},"resource_version":{"type":"string"},"rules":{"type":"array","items":{"type":"string"}},"uid":{"type":"string"}},"description":"ClusterRoleInfo数据模型"},"ClusterRoleListReq":{"type":"object","properties":{"cluster_id":{"type":"integer","description":"集群ID"},"keyword":{"type":"string","description":"关键字搜索"},"page":{"type":"integer","description":"页码"},"page_size":{"type":"integer","description":"页面大小"}},"required":["cluster_id"],"description":"ClusterRoleListReq数据模型"},"ClusterRoleListResponse":{"type":"object","properties":{"items":{"type":"array","items":{"type":"string"}},"total_count":{"type":"integer"}},"description":"ClusterRoleListResponse数据模型"},"ClusterRoleUsageEntity":{"type":"object","properties":{"active_users":{"type":"integer"},"bindings":{"type":"array","items":{"type":"string"}},"total_bindings":{"type":"integer"}},"description":"ClusterRoleUsageEntity数据模型"},"ClusterRoleYamlReq":{"type":"object","properties":{"cluster_id":{"type":"integer","description":"集群ID"},"name":{"type":"string","description":"ClusterRole名称"},"yaml_content":{"type":"string","description":"YAML内容"}},"required":["cluster_id","name","yaml_content"],"description":"ClusterRoleYamlReq数据模型"},"ClusterStatsResponse":{"type":"object","properties":{"cluster_id":{"type":"integer"},"cluster_name":{"type":"string"},"event_stats":{"$ref":"#/definitions/EventStatsInfo"},"last_update_time":{"type":"string"},"namespace_stats":{"$ref":"#/definitions/NamespaceStatsInfo"},"network_stats":{"$ref":"#/definitions/NetworkStatsInfo"},"node_stats":{"$ref":"#/definitions/NodeStatsInfo"},"pod_stats":{"$ref":"#/definitions/PodStatsInfo"},"resource_stats":{"$ref":"#/definitions/ResourceStatsInfo"},"storage_stats":{"$ref":"#/definitions/StorageStatsInfo"},"workload_stats":{"$ref":"#/definitions/WorkloadStatsInfo"}},"description":"ClusterStatsResponse数据模型"},"ClusterUpdateReq":{"type":"object","properties":{"action_timeout_seconds":{"type":"integer"},"api_server_addr":{"type":"string"},"cpu_limit":{"type":"string"},"cpu_request":{"type":"string"},"env":{"type":"string"},"id":{"type":"integer","description":"集群ID"},"kube_config_content":{"type":"string"},"memory_limit":{"type":"string"},"memory_request":{"type":"string"},"name":{"type":"string"},"name_zh":{"type":"string"},"restricted_name_space":{"type":"object"},"status":{"type":"string"},"user_id":{"type":"integer"},"version":{"type":"string"}},"required":["id","name","name_zh"],"description":"ClusterUpdateReq数据模型"},"CompleteWorkorderInstanceReq":{"type":"object","properties":{"comment":{"type":"string"},"id":{"type":"integer"}},"required":["id","comment"],"description":"CompleteWorkorderInstanceReq数据模型"},"ComponentHealthStatus":{"type":"object","properties":{"message":{"type":"string"},"name":{"type":"string"},"status":{"type":"string"},"timestamp":{"type":"string"}},"description":"ComponentHealthStatus数据模型"},"ConfigMapBackupResponse":{"type":"object","properties":{"backup_name":{"type":"string"},"backup_path":{"type":"string"},"cluster_id":{"type":"integer"},"configmap_names":{"type":"array","items":{"type":"string"}},"created_at":{"type":"string"},"message":{"type":"string"},"namespace":{"type":"string"},"size":{"type":"string"},"status":{"type":"string"}},"description":"ConfigMapBackupResponse数据模型"},"ConfigMapCreateReq":{"type":"object","properties":{"annotations":{"type":"object","description":"注解","additionalProperties":true},"binary_data":{"type":"object","description":"二进制数据","additionalProperties":true},"data":{"type":"object","description":"字符串数据","additionalProperties":true},"labels":{"type":"object","description":"标签","additionalProperties":true},"name":{"type":"string","description":"ConfigMap名称"}},"required":["name"],"description":"ConfigMapCreateReq数据模型"},"ConfigMapDaemonSetUsageEntity":{"type":"object","properties":{"container_name":{"type":"string"},"daemonset_name":{"type":"string"},"keys":{"type":"array","items":{"type":"string"}},"mount_path":{"type":"string"},"namespace":{"type":"string"},"usage_type":{"type":"string"}},"description":"ConfigMapDaemonSetUsageEntity数据模型"},"ConfigMapDataResponse":{"type":"object","properties":{"binary_data":{"type":"object","additionalProperties":true},"data":{"type":"object","additionalProperties":true},"data_count":{"type":"integer"},"name":{"type":"string"},"namespace":{"type":"string"},"size":{"type":"string"}},"description":"ConfigMapDataResponse数据模型"},"ConfigMapDeploymentUsageEntity":{"type":"object","properties":{"container_name":{"type":"string"},"deployment_name":{"type":"string"},"keys":{"type":"array","items":{"type":"string"}},"mount_path":{"type":"string"},"namespace":{"type":"string"},"usage_type":{"type":"string"}},"description":"ConfigMapDeploymentUsageEntity数据模型"},"ConfigMapDetailResponse":{"type":"object","properties":{"config_map":{"$ref":"#/definitions/ConfigMapEntity"},"events":{"type":"array","items":{"type":"string"}},"usage":{"$ref":"#/definitions/ConfigMapUsageEntity"},"yaml":{"type":"string"}},"description":"ConfigMapDetailResponse数据模型"},"ConfigMapEntity":{"type":"object","properties":{"age":{"type":"string"},"annotations":{"type":"object","additionalProperties":true},"binary_data":{"type":"object","additionalProperties":true},"created_at":{"type":"string"},"data":{"type":"object","additionalProperties":true},"data_count":{"type":"integer"},"immutable":{"type":"boolean"},"labels":{"type":"object","additionalProperties":true},"name":{"type":"string"},"namespace":{"type":"string"},"size":{"type":"string"},"uid":{"type":"string"}},"description":"ConfigMapEntity数据模型"},"ConfigMapEventEntity":{"type":"object","properties":{"count":{"type":"integer"},"first_time":{"type":"string"},"last_time":{"type":"string"},"message":{"type":"string"},"reason":{"type":"string"},"source":{"type":"string"},"type":{"type":"string"}},"description":"ConfigMapEventEntity数据模型"},"ConfigMapJobUsageEntity":{"type":"object","properties":{"container_name":{"type":"string"},"job_name":{"type":"string"},"keys":{"type":"array","items":{"type":"string"}},"mount_path":{"type":"string"},"namespace":{"type":"string"},"usage_type":{"type":"string"}},"description":"ConfigMapJobUsageEntity数据模型"},"ConfigMapKeySelector":{"type":"object","properties":{"key":{"type":"string","description":"键名"},"name":{"type":"string","description":"ConfigMap名称"}},"description":"ConfigMapKeySelector数据模型"},"ConfigMapListResponse":{"type":"object","properties":{"items":{"type":"array","items":{"type":"string"}},"total_count":{"type":"integer"}},"description":"ConfigMapListResponse数据模型"},"ConfigMapPodUsageEntity":{"type":"object","properties":{"container_name":{"type":"string"},"keys":{"type":"array","items":{"type":"string"}},"mount_path":{"type":"string"},"namespace":{"type":"string"},"pod_name":{"type":"string"},"usage_type":{"type":"string"}},"description":"ConfigMapPodUsageEntity数据模型"},"ConfigMapStatefulSetUsageEntity":{"type":"object","properties":{"container_name":{"type":"string"},"keys":{"type":"array","items":{"type":"string"}},"mount_path":{"type":"string"},"namespace":{"type":"string"},"statefulset_name":{"type":"string"},"usage_type":{"type":"string"}},"description":"ConfigMapStatefulSetUsageEntity数据模型"},"ConfigMapUpdateReq":{"type":"object","properties":{"annotations":{"type":"object","description":"注解","additionalProperties":true},"binary_data":{"type":"object","description":"二进制数据","additionalProperties":true},"data":{"type":"object","description":"字符串数据","additionalProperties":true},"labels":{"type":"object","description":"标签","additionalProperties":true}},"description":"ConfigMapUpdateReq数据模型"},"ConfigMapUsageEntity":{"type":"object","properties":{"used_by_daemonsets":{"type":"array","items":{"type":"string"}},"used_by_deployments":{"type":"array","items":{"type":"string"}},"used_by_jobs":{"type":"array","items":{"type":"string"}},"used_by_pods":{"type":"array","items":{"type":"string"}},"used_by_statefulsets":{"type":"array","items":{"type":"string"}}},"description":"ConfigMapUsageEntity数据模型"},"ConnectMCPReq":{"type":"object","properties":{"id":{"type":"integer"}},"required":["id"],"description":"ConnectMCPReq数据模型"},"ConnectTerminalResourceReq":{"type":"object","properties":{"id":{"type":"integer"},"user_id":{"type":"integer"}},"description":"ConnectTerminalResourceReq数据模型"},"ContainerCore":{"type":"object","properties":{"args":{"type":"array","items":{"type":"string"},"description":"容器启动参数"},"command":{"type":"array","items":{"type":"string"},"description":"容器启动命令"},"cpu":{"type":"string","description":"CPU 资源限制"},"cpu_request":{"type":"string","description":"CPU 资源请求"},"envs":{"type":"object","description":"环境变量","additionalProperties":true},"mem_request":{"type":"string","description":"内存资源请求"},"memory":{"type":"string","description":"内存资源限制"},"name":{"type":"string","description":"容器名称"},"pull_policy":{"type":"string","description":"镜像拉取策略"},"volumes":{"type":"array","items":{"type":"string"},"description":"挂载卷"}},"description":"ContainerCore数据模型"},"ContainerInfo":{"type":"object","properties":{"env":{"type":"array","items":{"type":"string"}},"image":{"type":"string"},"name":{"type":"string"},"ports":{"type":"array","items":{"type":"string"}},"ready":{"type":"boolean"},"resources":{"$ref":"#/definitions/ContainerResources"},"restart_count":{"type":"integer"},"status":{"type":"string"},"volume_mounts":{"type":"array","items":{"type":"string"}}},"description":"ContainerInfo数据模型"},"ContainerPort":{"type":"object","properties":{"container_port":{"type":"integer","description":"容器端口"},"name":{"type":"string","description":"端口名称"},"protocol":{"type":"string","description":"端口协议"}},"description":"ContainerPort数据模型"},"ContainerResources":{"type":"object","properties":{"cpu_limit":{"type":"string"},"cpu_request":{"type":"string"},"cpu_usage":{"type":"string"},"memory_limit":{"type":"string"},"memory_request":{"type":"string"},"memory_usage":{"type":"string"}},"description":"ContainerResources数据模型"},"CreateApiRequest":{"type":"object","properties":{"category":{"type":"integer"},"description":{"type":"string"},"is_public":{"type":"integer"},"method":{"type":"integer"},"name":{"type":"string"},"path":{"type":"string"},"version":{"type":"string"}},"required":["name","path","method"],"description":"CreateApiRequest数据模型"},"CreateAuditLogRequest":{"type":"object","properties":{"duration":{"type":"integer"},"endpoint":{"type":"string"},"error_msg":{"type":"string"},"http_method":{"type":"string"},"ip_address":{"type":"string"},"operation_type":{"type":"string"},"request_body":{"type":"object"},"response_body":{"type":"object"},"status_code":{"type":"integer"},"target_id":{"type":"string"},"target_type":{"type":"string"},"trace_id":{"type":"string"},"user_agent":{"type":"string"},"user_id":{"type":"integer"}},"required":["user_id","ip_address","http_method","endpoint","operation_type","status_code","duration"],"description":"CreateAuditLogRequest数据模型"},"CreateClusterReq":{"type":"object","properties":{"action_timeout_seconds":{"type":"integer"},"cpu_limit":{"type":"string"},"cpu_request":{"type":"string"},"env":{"type":"string"},"kube_config_content":{"type":"string"},"memory_limit":{"type":"string"},"memory_request":{"type":"string"},"name":{"type":"string"},"name_zh":{"type":"string"},"restricted_name_space":{"type":"array","items":{"type":"string"}}},"required":["name","name_zh","kube_config_content"],"description":"CreateClusterReq数据模型"},"CreateClusterRoleBindingReq":{"type":"object","properties":{"annotations":{"type":"object","description":"注解","additionalProperties":true},"cluster_id":{"type":"integer","description":"集群ID"},"labels":{"type":"object","description":"标签","additionalProperties":true},"name":{"type":"string","description":"ClusterRoleBinding名称"},"role_ref":{"$ref":"#/definitions/RoleRef","description":"角色引用"},"subjects":{"type":"array","items":{"type":"string"},"description":"主体列表"}},"required":["cluster_id","name","role_ref","subjects"],"description":"CreateClusterRoleBindingReq数据模型"},"CreateClusterRoleReq":{"type":"object","properties":{"annotations":{"type":"object","description":"注解","additionalProperties":true},"cluster_id":{"type":"integer","description":"集群ID"},"labels":{"type":"object","description":"标签","additionalProperties":true},"name":{"type":"string","description":"ClusterRole名称"},"rules":{"type":"array","items":{"type":"string"},"description":"权限规则"}},"required":["cluster_id","name","rules"],"description":"CreateClusterRoleReq数据模型"},"CreateMCPConfigReq":{"type":"object","properties":{"url":{"type":"string"}},"required":["url"],"description":"CreateMCPConfigReq数据模型"},"CreateMonitorAlertManagerPoolReq":{"type":"object","properties":{"alert_manager_instances":{"type":"object"},"create_user_name":{"type":"string"},"group_by":{"type":"object"},"group_interval":{"type":"string"},"group_wait":{"type":"string"},"name":{"type":"string"},"receiver":{"type":"string"},"repeat_interval":{"type":"string"},"resolve_timeout":{"type":"string"},"user_id":{"type":"integer"}},"required":["name","alert_manager_instances","user_id","receiver","create_user_name"],"description":"CreateMonitorAlertManagerPoolReq数据模型"},"CreateMonitorAlertRuleReq":{"type":"object","properties":{"annotations":{"type":"object"},"create_user_name":{"type":"string"},"enable":{"type":"integer"},"expr":{"type":"string"},"for_time":{"type":"string"},"grafana_link":{"type":"string"},"ip_address":{"type":"string"},"labels":{"type":"object"},"name":{"type":"string"},"pool_id":{"type":"integer"},"send_group_id":{"type":"integer"},"severity":{"type":"object"},"user_id":{"type":"integer"}},"required":["name","pool_id","send_group_id","expr","for_time"],"description":"CreateMonitorAlertRuleReq数据模型"},"CreateMonitorConfigReq":{"type":"object","properties":{"config_content":{"type":"string"},"config_type":{"type":"integer"},"instance_ip":{"type":"string"},"name":{"type":"string"},"pool_id":{"type":"integer"},"status":{"type":"integer"}},"required":["name","pool_id","instance_ip","config_type","config_content"],"description":"CreateMonitorConfigReq数据模型"},"CreateMonitorOnDutyGroupChangeReq":{"type":"object","properties":{"create_user_name":{"type":"string"},"date":{"type":"string"},"on_duty_group_id":{"type":"integer"},"on_duty_user_id":{"type":"integer"},"origin_user_id":{"type":"integer"},"reason":{"type":"string"},"user_id":{"type":"integer"}},"required":["on_duty_group_id","date","origin_user_id","on_duty_user_id","user_id"],"description":"CreateMonitorOnDutyGroupChangeReq数据模型"},"CreateMonitorOnDutyGroupReq":{"type":"object","properties":{"create_user_name":{"type":"string"},"description":{"type":"string"},"name":{"type":"string"},"shift_days":{"type":"integer"},"user_id":{"type":"integer"},"user_ids":{"type":"array","items":{"type":"integer"}}},"required":["name","user_id","user_ids","shift_days"],"description":"CreateMonitorOnDutyGroupReq数据模型"},"CreateMonitorRecordRuleReq":{"type":"object","properties":{"create_user_name":{"type":"string"},"enable":{"type":"integer"},"expr":{"type":"string"},"ip_address":{"type":"string"},"labels":{"type":"object"},"name":{"type":"string"},"pool_id":{"type":"integer"},"user_id":{"type":"integer"}},"required":["name","pool_id","expr"],"description":"CreateMonitorRecordRuleReq数据模型"},"CreateMonitorScrapeJobReq":{"type":"object","properties":{"bearer_token":{"type":"string"},"bearer_token_file":{"type":"string"},"create_user_name":{"type":"string"},"enable":{"type":"integer"},"ip_address":{"type":"string"},"kube_config_file_path":{"type":"string"},"kubernetes_sd_role":{"type":"string"},"metrics_path":{"type":"string"},"name":{"type":"string"},"pool_id":{"type":"integer"},"port":{"type":"integer"},"refresh_interval":{"type":"integer"},"relabel_configs_yaml_string":{"type":"string"},"scheme":{"type":"string"},"scrape_interval":{"type":"integer"},"scrape_timeout":{"type":"integer"},"service_discovery_type":{"type":"object"},"tags":{"type":"object"},"tls_ca_content":{"type":"string"},"tls_ca_file_path":{"type":"string"},"tree_node_ids":{"type":"object"},"user_id":{"type":"integer"}},"required":["name","user_id","pool_id"],"description":"CreateMonitorScrapeJobReq数据模型"},"CreateMonitorScrapePoolReq":{"type":"object","properties":{"alert_manager_url":{"type":"string"},"create_user_name":{"type":"string"},"name":{"type":"string"},"prometheus_instances":{"type":"object"},"record_file_path":{"type":"string"},"remote_read_url":{"type":"string"},"remote_timeout_seconds":{"type":"integer"},"remote_write_url":{"type":"string"},"rule_file_path":{"type":"string"},"scrape_interval":{"type":"integer"},"scrape_timeout":{"type":"integer"},"support_alert":{"type":"integer"},"support_record":{"type":"integer"},"tags":{"type":"object"},"user_id":{"type":"integer"}},"required":["name"],"description":"CreateMonitorScrapePoolReq数据模型"},"CreateMonitorSendGroupReq":{"type":"object","properties":{"create_user_name":{"type":"string"},"enable":{"type":"integer"},"fei_shu_qun_robot_token":{"type":"string"},"first_upgrade_users":{"type":"array","items":{"type":"string"}},"name":{"type":"string"},"name_zh":{"type":"string"},"need_upgrade":{"type":"integer"},"notify_methods":{"type":"object"},"on_duty_group_id":{"type":"integer"},"pool_id":{"type":"integer"},"repeat_interval":{"type":"string"},"second_upgrade_users":{"type":"array","items":{"type":"string"}},"send_resolved":{"type":"integer"},"static_receive_users":{"type":"array","items":{"type":"string"}},"upgrade_minutes":{"type":"integer"},"user_id":{"type":"integer"}},"required":["name","name_zh","user_id","pool_id"],"description":"CreateMonitorSendGroupReq数据模型"},"CreateNamespaceReq":{"type":"object","properties":{"annotations":{"type":"array","items":{"type":"string"}},"cluster_id":{"type":"integer"},"labels":{"type":"array","items":{"type":"string"}},"namespace":{"type":"string"}},"required":["cluster_id","namespace"],"description":"CreateNamespaceReq数据模型"},"CreateRoleBindingReq":{"type":"object","properties":{"annotations":{"type":"object","description":"注解","additionalProperties":true},"cluster_id":{"type":"integer","description":"集群ID"},"labels":{"type":"object","description":"标签","additionalProperties":true},"name":{"type":"string","description":"RoleBinding名称"},"namespace":{"type":"string","description":"命名空间"},"role_ref":{"$ref":"#/definitions/RoleRef","description":"角色引用"},"subjects":{"type":"array","items":{"type":"string"},"description":"主体列表"}},"required":["cluster_id","name","namespace","role_ref","subjects"],"description":"CreateRoleBindingReq数据模型"},"CreateRoleReq":{"type":"object","properties":{"annotations":{"type":"object","description":"注解","additionalProperties":true},"cluster_id":{"type":"integer","description":"集群ID"},"labels":{"type":"object","description":"标签","additionalProperties":true},"name":{"type":"string","description":"Role名称"},"namespace":{"type":"string","description":"命名空间"},"rules":{"type":"array","items":{"type":"string"},"description":"权限规则"}},"required":["cluster_id","name","namespace","rules"],"description":"CreateRoleReq数据模型"},"CreateRoleRequest":{"type":"object","properties":{"api_ids":{"type":"array","items":{"type":"integer"}},"code":{"type":"string"},"description":{"type":"string"},"name":{"type":"string"},"status":{"type":"integer"}},"required":["name","code"],"description":"CreateRoleRequest数据模型"},"CreateToolBlacklistReq":{"type":"object","properties":{"tools":{"type":"array","items":{"type":"string"}}},"required":["tools"],"description":"CreateToolBlacklistReq数据模型"},"CreateToolReq":{"type":"object","properties":{"description":{"type":"string"},"metadata":{"type":"object","additionalProperties":true},"name":{"type":"string"},"parameters":{"$ref":"#/definitions/ToolParameters"}},"required":["name","description"],"description":"CreateToolReq数据模型"},"CreateToolWhitelistReq":{"type":"object","properties":{"tools":{"type":"array","items":{"type":"string"}}},"required":["tools"],"description":"CreateToolWhitelistReq数据模型"},"CreateTreeLocalResourceReq":{"type":"object","properties":{"auth_mode":{"type":"object"},"create_user_id":{"type":"integer"},"create_user_name":{"type":"string"},"description":{"type":"string"},"environment":{"type":"string"},"image_name":{"type":"string"},"ip_addr":{"type":"string"},"key":{"type":"string"},"name":{"type":"string"},"os_name":{"type":"string"},"os_type":{"type":"string"},"password":{"type":"string"},"port":{"type":"integer"},"tags":{"type":"object"},"username":{"type":"string"}},"required":["name","ip_addr"],"description":"CreateTreeLocalResourceReq数据模型"},"CreateTreeNodeReq":{"type":"object","properties":{"creator_id":{"type":"integer"},"creator_name":{"type":"string"},"description":{"type":"string"},"is_leaf":{"type":"integer"},"name":{"type":"string"},"parent_id":{"type":"integer"},"status":{"type":"object"}},"required":["name"],"description":"CreateTreeNodeReq数据模型"},"CreateWorkorderCategoryReq":{"type":"object","properties":{"description":{"type":"string"},"name":{"type":"string"},"operator_id":{"type":"integer"},"operator_name":{"type":"string"},"status":{"type":"integer"}},"required":["name","status","operator_id","operator_name"],"description":"CreateWorkorderCategoryReq数据模型"},"CreateWorkorderFormDesignReq":{"type":"object","properties":{"category_id":{"type":"object"},"description":{"type":"string"},"is_template":{"type":"integer"},"name":{"type":"string"},"operator_id":{"type":"integer"},"operator_name":{"type":"string"},"schema":{"$ref":"#/definitions/FormSchema"},"status":{"type":"integer"},"tags":{"type":"object"}},"required":["name","schema","status","operator_id","operator_name","is_template"],"description":"CreateWorkorderFormDesignReq数据模型"},"CreateWorkorderInstanceCommentReq":{"type":"object","properties":{"content":{"type":"string"},"instance_id":{"type":"integer"},"is_system":{"type":"integer"},"operator_id":{"type":"integer"},"operator_name":{"type":"string"},"parent_id":{"type":"object"},"status":{"type":"integer"},"type":{"type":"string"}},"required":["instance_id","operator_id","operator_name","content"],"description":"CreateWorkorderInstanceCommentReq数据模型"},"CreateWorkorderInstanceFlowReq":{"type":"object","properties":{"action":{"type":"string"},"comment":{"type":"string"},"from_status":{"type":"integer"},"instance_id":{"type":"integer"},"is_system_action":{"type":"integer"},"operator_id":{"type":"integer"},"operator_name":{"type":"string"},"to_status":{"type":"integer"}},"required":["instance_id","action","operator_id","operator_name","from_status","to_status"],"description":"CreateWorkorderInstanceFlowReq数据模型"},"CreateWorkorderInstanceFromTemplateReq":{"type":"object","properties":{"assignee_id":{"type":"object"},"description":{"type":"string"},"due_date":{"type":"string","format":"date-time"},"form_data":{"type":"object"},"operator_id":{"type":"integer"},"operator_name":{"type":"string"},"priority":{"type":"integer"},"tags":{"type":"object"},"title":{"type":"string"}},"required":["title","priority","operator_id","operator_name"],"description":"CreateWorkorderInstanceFromTemplateReq数据模型"},"CreateWorkorderInstanceReq":{"type":"object","properties":{"assignee_id":{"type":"object"},"description":{"type":"string"},"due_date":{"type":"string","format":"date-time"},"form_data":{"type":"object"},"operator_id":{"type":"integer"},"operator_name":{"type":"string"},"priority":{"type":"integer"},"process_id":{"type":"integer"},"status":{"type":"integer"},"tags":{"type":"object"},"title":{"type":"string"}},"required":["title","process_id","form_data","status","priority","operator_id","operator_name"],"description":"CreateWorkorderInstanceReq数据模型"},"CreateWorkorderInstanceTimelineReq":{"type":"object","properties":{"action":{"type":"string"},"action_detail":{"type":"string"},"comment":{"type":"string"},"instance_id":{"type":"integer"},"operator_id":{"type":"integer"},"operator_name":{"type":"string"},"related_id":{"type":"object"}},"required":["instance_id","action","operator_id","operator_name"],"description":"CreateWorkorderInstanceTimelineReq数据模型"},"CreateWorkorderNotificationReq":{"type":"object","properties":{"category_id":{"type":"object"},"channels":{"type":"object"},"description":{"type":"string"},"event_types":{"type":"object"},"is_default":{"type":"integer"},"max_retries":{"type":"integer"},"message_template":{"type":"string"},"name":{"type":"string"},"priority":{"type":"integer"},"process_id":{"type":"object"},"recipient_depts":{"type":"object"},"recipient_roles":{"type":"object"},"recipient_types":{"type":"object"},"recipient_users":{"type":"object"},"repeat_interval":{"type":"object"},"retry_interval":{"type":"integer"},"scheduled_time":{"type":"string","format":"date-time"},"settings":{"type":"object"},"status":{"type":"integer"},"subject_template":{"type":"string"},"template_id":{"type":"object"},"trigger_condition":{"type":"object"},"trigger_type":{"type":"string"}},"required":["name","event_types","trigger_type","channels","recipient_types","message_template"],"description":"CreateWorkorderNotificationReq数据模型"},"CreateWorkorderProcessReq":{"type":"object","properties":{"category_id":{"type":"object"},"definition":{"$ref":"#/definitions/ProcessDefinition"},"description":{"type":"string"},"form_design_id":{"type":"integer"},"is_default":{"type":"integer"},"name":{"type":"string"},"operator_id":{"type":"integer"},"operator_name":{"type":"string"},"status":{"type":"integer"},"tags":{"type":"object"}},"required":["name","form_design_id","definition","status","operator_id","operator_name","is_default"],"description":"CreateWorkorderProcessReq数据模型"},"CreateWorkorderTemplateReq":{"type":"object","properties":{"category_id":{"type":"object"},"default_values":{"type":"object"},"description":{"type":"string"},"form_design_id":{"type":"integer"},"name":{"type":"string"},"operator_id":{"type":"integer"},"operator_name":{"type":"string"},"process_id":{"type":"integer"},"status":{"type":"integer"},"tags":{"type":"object"}},"required":["name","process_id","form_design_id","status","operator_id","operator_name"],"description":"CreateWorkorderTemplateReq数据模型"},"DaemonSetDetailResponse":{"type":"object","properties":{"daemonset":{"$ref":"#/definitions/DaemonSetEntity"},"events":{"type":"array","items":{"type":"string"}},"history":{"type":"array","items":{"type":"string"}},"metrics":{"$ref":"#/definitions/DaemonSetMetricsEntity"},"pods":{"type":"array","items":{"type":"string"}},"yaml":{"type":"string"}},"description":"DaemonSetDetailResponse数据模型"},"DaemonSetEntity":{"type":"object","properties":{"age":{"type":"string"},"annotations":{"type":"object","additionalProperties":true},"created_at":{"type":"string"},"current_number_scheduled":{"type":"integer"},"desired_number_scheduled":{"type":"integer"},"images":{"type":"array","items":{"type":"string"}},"labels":{"type":"object","additionalProperties":true},"name":{"type":"string"},"namespace":{"type":"string"},"number_available":{"type":"integer"},"number_misscheduled":{"type":"integer"},"number_ready":{"type":"integer"},"number_unavailable":{"type":"integer"},"revision_history_limit":{"type":"integer"},"status":{"type":"string"},"uid":{"type":"string"},"update_strategy":{"type":"string"},"updated_number_scheduled":{"type":"integer"}},"description":"DaemonSetEntity数据模型"},"DaemonSetEventEntity":{"type":"object","properties":{"count":{"type":"integer"},"first_time":{"type":"string"},"last_time":{"type":"string"},"message":{"type":"string"},"reason":{"type":"string"},"source":{"type":"string"},"type":{"type":"string"}},"description":"DaemonSetEventEntity数据模型"},"DaemonSetHistoryEntity":{"type":"object","properties":{"change_reason":{"type":"string"},"created_at":{"type":"string"},"current":{"type":"boolean"},"image":{"type":"string"},"revision":{"type":"integer"}},"description":"DaemonSetHistoryEntity数据模型"},"DaemonSetListResponse":{"type":"object","properties":{"items":{"type":"array","items":{"type":"string"}},"total_count":{"type":"integer"}},"description":"DaemonSetListResponse数据模型"},"DaemonSetMetricsEntity":{"type":"object","properties":{"cpu_usage":{"type":"number"},"memory_usage":{"type":"integer"},"network_rx":{"type":"integer"},"network_tx":{"type":"integer"},"storage_usage":{"type":"integer"}},"description":"DaemonSetMetricsEntity数据模型"},"DaemonSetPodEntity":{"type":"object","properties":{"age":{"type":"string"},"ip":{"type":"string"},"name":{"type":"string"},"node":{"type":"string"},"nominated":{"type":"string"},"readiness":{"type":"string"},"ready":{"type":"string"},"restarts":{"type":"integer"},"status":{"type":"string"}},"description":"DaemonSetPodEntity数据模型"},"DaemonSetRestartResponse":{"type":"object","properties":{"end_time":{"type":"string"},"message":{"type":"string"},"name":{"type":"string"},"namespace":{"type":"string"},"restarted_pods":{"type":"array","items":{"type":"string"}},"start_time":{"type":"string"},"status":{"type":"string"}},"description":"DaemonSetRestartResponse数据模型"},"DaemonSetRollbackResponse":{"type":"object","properties":{"end_time":{"type":"string"},"from_revision":{"type":"integer"},"message":{"type":"string"},"name":{"type":"string"},"namespace":{"type":"string"},"start_time":{"type":"string"},"status":{"type":"string"},"to_revision":{"type":"integer"}},"description":"DaemonSetRollbackResponse数据模型"},"DaemonSetRollingUpdateStrategy":{"type":"object","properties":{"max_surge":{"type":"object","description":"最大超出数量"},"max_unavailable":{"type":"object","description":"最大不可用数量"}},"description":"DaemonSetRollingUpdateStrategy数据模型"},"DaemonSetUpdateStrategy":{"type":"object","properties":{"rolling_update":{"type":"object"},"type":{"type":"string","description":"更新策略类型"}},"description":"DaemonSetUpdateStrategy数据模型"},"DeleteApiRequest":{"type":"object","properties":{"id":{"type":"integer"}},"required":["id"],"description":"DeleteApiRequest数据模型"},"DeleteAuditLogRequest":{"type":"object","properties":{"id":{"type":"integer"}},"required":["id"],"description":"DeleteAuditLogRequest数据模型"},"DeleteClusterReq":{"type":"object","properties":{"id":{"type":"integer"}},"required":["id"],"description":"DeleteClusterReq数据模型"},"DeleteClusterRoleBindingReq":{"type":"object","properties":{"cluster_id":{"type":"integer","description":"集群ID"},"name":{"type":"string","description":"ClusterRoleBinding名称"}},"required":["cluster_id","name"],"description":"DeleteClusterRoleBindingReq数据模型"},"DeleteClusterRoleReq":{"type":"object","properties":{"cluster_id":{"type":"integer","description":"集群ID"},"name":{"type":"string","description":"ClusterRole名称"}},"required":["cluster_id","name"],"description":"DeleteClusterRoleReq数据模型"},"DeleteMCPConfigReq":{"type":"object","properties":{"id":{"type":"integer"}},"required":["id"],"description":"DeleteMCPConfigReq数据模型"},"DeleteMonitorAlertManagerPoolReq":{"type":"object","properties":{"id":{"type":"integer"}},"required":["id"],"description":"DeleteMonitorAlertManagerPoolReq数据模型"},"DeleteMonitorAlertRuleReq":{"type":"object","properties":{"id":{"type":"integer"}},"required":["id"],"description":"DeleteMonitorAlertRuleReq数据模型"},"DeleteMonitorConfigReq":{"type":"object","properties":{"id":{"type":"integer"}},"required":["id"],"description":"DeleteMonitorConfigReq数据模型"},"DeleteMonitorOnDutyGroupReq":{"type":"object","properties":{"id":{"type":"integer"}},"required":["id"],"description":"DeleteMonitorOnDutyGroupReq数据模型"},"DeleteMonitorRecordRuleReq":{"type":"object","properties":{"id":{"type":"integer"}},"required":["id"],"description":"DeleteMonitorRecordRuleReq数据模型"},"DeleteMonitorScrapeJobReq":{"type":"object","properties":{"id":{"type":"integer"}},"required":["id"],"description":"DeleteMonitorScrapeJobReq数据模型"},"DeleteMonitorScrapePoolReq":{"type":"object","properties":{"id":{"type":"integer"}},"required":["id"],"description":"DeleteMonitorScrapePoolReq数据模型"},"DeleteMonitorSendGroupReq":{"type":"object","properties":{"id":{"type":"integer"}},"required":["id"],"description":"DeleteMonitorSendGroupReq数据模型"},"DeleteRoleBindingReq":{"type":"object","properties":{"cluster_id":{"type":"integer","description":"集群ID"},"name":{"type":"string","description":"RoleBinding名称"},"namespace":{"type":"string","description":"命名空间"}},"required":["cluster_id","namespace","name"],"description":"DeleteRoleBindingReq数据模型"},"DeleteRoleReq":{"type":"object","properties":{"cluster_id":{"type":"integer","description":"集群ID"},"name":{"type":"string","description":"Role名称"},"namespace":{"type":"string","description":"命名空间"}},"required":["cluster_id","namespace","name"],"description":"DeleteRoleReq数据模型"},"DeleteRoleRequest":{"type":"object","properties":{"id":{"type":"integer"}},"required":["id"],"description":"DeleteRoleRequest数据模型"},"DeleteToolBlacklistReq":{"type":"object","properties":{"id":{"type":"integer"}},"required":["id"],"description":"DeleteToolBlacklistReq数据模型"},"DeleteToolReq":{"type":"object","properties":{"name":{"type":"string"}},"required":["name"],"description":"DeleteToolReq数据模型"},"DeleteToolWhitelistReq":{"type":"object","properties":{"id":{"type":"integer"}},"required":["id"],"description":"DeleteToolWhitelistReq数据模型"},"DeleteTreeLocalResourceReq":{"type":"object","properties":{"id":{"type":"integer"}},"description":"DeleteTreeLocalResourceReq数据模型"},"DeleteTreeNodeReq":{"type":"object","properties":{"id":{"type":"integer"}},"required":["id"],"description":"DeleteTreeNodeReq数据模型"},"DeleteUserReq":{"type":"object","properties":{"id":{"type":"integer"}},"required":["id"],"description":"DeleteUserReq数据模型"},"DeleteWorkorderCategoryReq":{"type":"object","properties":{"id":{"type":"integer"}},"required":["id"],"description":"DeleteWorkorderCategoryReq数据模型"},"DeleteWorkorderFormDesignReq":{"type":"object","properties":{"id":{"type":"integer"}},"required":["id"],"description":"DeleteWorkorderFormDesignReq数据模型"},"DeleteWorkorderInstanceCommentReq":{"type":"object","properties":{"id":{"type":"integer"}},"required":["id"],"description":"DeleteWorkorderInstanceCommentReq数据模型"},"DeleteWorkorderInstanceReq":{"type":"object","properties":{"id":{"type":"integer"}},"required":["id"],"description":"DeleteWorkorderInstanceReq数据模型"},"DeleteWorkorderInstanceTimelineReq":{"type":"object","properties":{"id":{"type":"integer"}},"required":["id"],"description":"DeleteWorkorderInstanceTimelineReq数据模型"},"DeleteWorkorderNotificationReq":{"type":"object","properties":{"id":{"type":"integer"}},"required":["id"],"description":"DeleteWorkorderNotificationReq数据模型"},"DeleteWorkorderProcessReq":{"type":"object","properties":{"id":{"type":"integer"}},"required":["id"],"description":"DeleteWorkorderProcessReq数据模型"},"DeleteWorkorderTemplateReq":{"type":"object","properties":{"id":{"type":"integer"}},"required":["id"],"description":"DeleteWorkorderTemplateReq数据模型"},"DeploymentBatchDeleteReq":{"type":"object","properties":{"deployment_names":{"type":"array","items":{"type":"string"},"description":"Deployment名称列表"}},"required":["deployment_names"],"description":"DeploymentBatchDeleteReq数据模型"},"DeploymentBatchRestartReq":{"type":"object","properties":{"deployment_names":{"type":"array","items":{"type":"string"},"description":"Deployment名称列表"}},"required":["deployment_names"],"description":"DeploymentBatchRestartReq数据模型"},"DeploymentConditionEntity":{"type":"object","properties":{"last_transition_time":{"type":"string"},"last_update_time":{"type":"string"},"message":{"type":"string"},"reason":{"type":"string"},"status":{"type":"string"},"type":{"type":"string"}},"description":"DeploymentConditionEntity数据模型"},"DeploymentDetailResponse":{"type":"object","properties":{"deployment":{"$ref":"#/definitions/DeploymentEntity"},"events":{"type":"array","items":{"type":"string"}},"history":{"type":"array","items":{"type":"string"}},"pods":{"type":"array","items":{"type":"string"}},"replica_sets":{"type":"array","items":{"type":"string"}},"yaml":{"type":"string"}},"description":"DeploymentDetailResponse数据模型"},"DeploymentEntity":{"type":"object","properties":{"age":{"type":"string"},"annotations":{"type":"object","additionalProperties":true},"available_replicas":{"type":"integer"},"conditions":{"type":"array","items":{"type":"string"}},"created_at":{"type":"string"},"images":{"type":"array","items":{"type":"string"}},"labels":{"type":"object","additionalProperties":true},"name":{"type":"string"},"namespace":{"type":"string"},"ready_replicas":{"type":"integer"},"replicas":{"type":"integer"},"selector":{"type":"object","additionalProperties":true},"status":{"type":"string"},"strategy":{"$ref":"#/definitions/DeploymentStrategyEntity"},"uid":{"type":"string"},"unavailable_replicas":{"type":"integer"},"updated_replicas":{"type":"integer"}},"description":"DeploymentEntity数据模型"},"DeploymentEventEntity":{"type":"object","properties":{"count":{"type":"integer"},"first_time":{"type":"string"},"last_time":{"type":"string"},"message":{"type":"string"},"reason":{"type":"string"},"source":{"type":"string"},"type":{"type":"string"}},"description":"DeploymentEventEntity数据模型"},"DeploymentHistoryEntity":{"type":"object","properties":{"change_info":{"type":"string"},"created_at":{"type":"string"},"images":{"type":"array","items":{"type":"string"}},"replicas":{"type":"integer"},"revision":{"type":"integer"}},"description":"DeploymentHistoryEntity数据模型"},"DeploymentListResponse":{"type":"object","properties":{"items":{"type":"array","items":{"type":"string"}},"total_count":{"type":"integer"}},"description":"DeploymentListResponse数据模型"},"DeploymentRestartReq":{"type":"object","properties":{"cluster_id":{"type":"integer","description":"集群ID"},"deployment_name":{"type":"string","description":"Deployment名称"},"namespace":{"type":"string","description":"命名空间"}},"required":["cluster_id","namespace","deployment_name"],"description":"DeploymentRestartReq数据模型"},"DeploymentRollbackResponse":{"type":"object","properties":{"current_revision":{"type":"integer"},"name":{"type":"string"},"namespace":{"type":"string"},"previous_revision":{"type":"integer"},"status":{"type":"string"}},"description":"DeploymentRollbackResponse数据模型"},"DeploymentRollingUpdateEntity":{"type":"object","properties":{"max_surge":{"type":"string"},"max_unavailable":{"type":"string"}},"description":"DeploymentRollingUpdateEntity数据模型"},"DeploymentScaleResponse":{"type":"object","properties":{"current_replicas":{"type":"integer"},"name":{"type":"string"},"namespace":{"type":"string"},"previous_replicas":{"type":"integer"},"status":{"type":"string"}},"description":"DeploymentScaleResponse数据模型"},"DeploymentStrategy":{"type":"object","properties":{"rolling_update":{"type":"object","description":"滚动更新策略"},"type":{"type":"string","description":"部署策略类型"}},"description":"DeploymentStrategy数据模型"},"DeploymentStrategyEntity":{"type":"object","properties":{"rolling_update":{"type":"object"},"type":{"type":"string"}},"description":"DeploymentStrategyEntity数据模型"},"DetailWorkorderCategoryReq":{"type":"object","properties":{"id":{"type":"integer"}},"required":["id"],"description":"DetailWorkorderCategoryReq数据模型"},"DetailWorkorderFormDesignReq":{"type":"object","properties":{"id":{"type":"integer"}},"required":["id"],"description":"DetailWorkorderFormDesignReq数据模型"},"DetailWorkorderInstanceCommentReq":{"type":"object","properties":{"id":{"type":"integer"}},"required":["id"],"description":"DetailWorkorderInstanceCommentReq数据模型"},"DetailWorkorderInstanceFlowReq":{"type":"object","properties":{"id":{"type":"integer"}},"required":["id"],"description":"DetailWorkorderInstanceFlowReq数据模型"},"DetailWorkorderInstanceReq":{"type":"object","properties":{"id":{"type":"integer"}},"required":["id"],"description":"DetailWorkorderInstanceReq数据模型"},"DetailWorkorderInstanceTimelineReq":{"type":"object","properties":{"id":{"type":"integer"}},"required":["id"],"description":"DetailWorkorderInstanceTimelineReq数据模型"},"DetailWorkorderNotificationReq":{"type":"object","properties":{"id":{"type":"integer"}},"required":["id"],"description":"DetailWorkorderNotificationReq数据模型"},"DetailWorkorderProcessReq":{"type":"object","properties":{"id":{"type":"integer"}},"required":["id"],"description":"DetailWorkorderProcessReq数据模型"},"DetailWorkorderTemplateReq":{"type":"object","properties":{"id":{"type":"integer"}},"required":["id"],"description":"DetailWorkorderTemplateReq数据模型"},"DisconnectMCPReq":{"type":"object","properties":{"id":{"type":"integer"}},"required":["id"],"description":"DisconnectMCPReq数据模型"},"EnableSwitchMonitorAlertRuleReq":{"type":"object","properties":{"id":{"type":"integer"}},"required":["id"],"description":"EnableSwitchMonitorAlertRuleReq数据模型"},"EnableSwitchMonitorRecordRuleReq":{"type":"object","properties":{"id":{"type":"integer"}},"required":["id"],"description":"EnableSwitchMonitorRecordRuleReq数据模型"},"EnvVar":{"type":"object","properties":{"name":{"type":"string","description":"环境变量名"},"value":{"type":"string","description":"环境变量值"},"value_from":{"type":"object","description":"环境变量来源"}},"description":"EnvVar数据模型"},"EnvVarSource":{"type":"object","properties":{"config_map_key_ref":{"type":"object","description":"ConfigMap引用"},"secret_key_ref":{"type":"object","description":"Secret引用"}},"description":"EnvVarSource数据模型"},"Event":{"type":"object","properties":{"count":{"type":"integer"},"first_timestamp":{"type":"string","format":"date-time"},"last_timestamp":{"type":"string","format":"date-time"},"message":{"type":"string"},"reason":{"type":"string"},"source":{"type":"object"},"type":{"type":"string"}},"description":"Event数据模型"},"EventAlertClaimReq":{"type":"object","properties":{"id":{"type":"integer"},"user_id":{"type":"integer"}},"required":["id","user_id"],"description":"EventAlertClaimReq数据模型"},"EventAlertResponse":{"type":"object","properties":{"alert_channel":{"type":"string"},"alert_count":{"type":"integer"},"cluster_id":{"type":"integer"},"enabled":{"type":"boolean"},"event_reasons":{"type":"array","items":{"type":"string"}},"event_types":{"type":"array","items":{"type":"string"}},"last_alert_time":{"type":"string"},"namespace":{"type":"string"},"status":{"type":"string"}},"description":"EventAlertResponse数据模型"},"EventAlertSilenceReq":{"type":"object","properties":{"id":{"type":"integer"},"time":{"type":"string"},"use_name":{"type":"integer"},"user_id":{"type":"integer"}},"required":["id","user_id","time"],"description":"EventAlertSilenceReq数据模型"},"EventAlertUnSilenceReq":{"type":"object","properties":{"id":{"type":"integer"},"user_id":{"type":"integer"}},"required":["id","user_id"],"description":"EventAlertUnSilenceReq数据模型"},"EventByObjectResponse":{"type":"object","properties":{"events":{"type":"array","items":{"type":"string"}},"namespace":{"type":"string"},"normal_count":{"type":"integer"},"object_kind":{"type":"string"},"object_name":{"type":"string"},"object_uid":{"type":"string"},"total_count":{"type":"integer"},"warning_count":{"type":"integer"}},"description":"EventByObjectResponse数据模型"},"EventCleanupResponse":{"type":"object","properties":{"cleanup_time":{"type":"string"},"cluster_id":{"type":"integer"},"days_to_keep":{"type":"integer"},"deleted_count":{"type":"integer"},"message":{"type":"string"},"namespace":{"type":"string"},"remaining_count":{"type":"integer"},"status":{"type":"string"}},"description":"EventCleanupResponse数据模型"},"EventDetailResponse":{"type":"object","properties":{"event":{"$ref":"#/definitions/EventEntity"},"related_events":{"type":"array","items":{"type":"string"}},"timeline":{"$ref":"#/definitions/EventTimelineEntity"}},"description":"EventDetailResponse数据模型"},"EventEntity":{"type":"object","properties":{"age":{"type":"string"},"count":{"type":"integer"},"created_at":{"type":"string"},"first_time":{"type":"string"},"involved_object":{"$ref":"#/definitions/EventObjectEntity"},"last_time":{"type":"string"},"message":{"type":"string"},"name":{"type":"string"},"namespace":{"type":"string"},"reason":{"type":"string"},"severity":{"type":"string"},"source":{"$ref":"#/definitions/EventSourceEntity"},"type":{"type":"string"},"uid":{"type":"string"}},"description":"EventEntity数据模型"},"EventExportResponse":{"type":"object","properties":{"download_url":{"type":"string"},"event_count":{"type":"integer"},"export_time":{"type":"string"},"file_name":{"type":"string"},"file_path":{"type":"string"},"file_size":{"type":"string"},"format":{"type":"string"}},"description":"EventExportResponse数据模型"},"EventInvolvedObject":{"type":"object","properties":{"api_version":{"type":"string","description":"API版本"},"kind":{"type":"string","description":"对象类型"},"name":{"type":"string","description":"对象名称"},"namespace":{"type":"string","description":"命名空间"},"uid":{"type":"string","description":"对象UID"}},"description":"EventInvolvedObject数据模型"},"EventListResponse":{"type":"object","properties":{"items":{"type":"array","items":{"type":"string"}},"total_count":{"type":"integer"}},"description":"EventListResponse数据模型"},"EventNamespaceStatEntity":{"type":"object","properties":{"count":{"type":"integer"},"namespace":{"type":"string"}},"description":"EventNamespaceStatEntity数据模型"},"EventObjectEntity":{"type":"object","properties":{"api_version":{"type":"string"},"field_path":{"type":"string"},"kind":{"type":"string"},"name":{"type":"string"},"namespace":{"type":"string"},"resource_version":{"type":"string"},"uid":{"type":"string"}},"description":"EventObjectEntity数据模型"},"EventObjectStatEntity":{"type":"object","properties":{"count":{"type":"integer"},"namespace":{"type":"string"},"object_kind":{"type":"string"},"object_name":{"type":"string"}},"description":"EventObjectStatEntity数据模型"},"EventReasonCount":{"type":"object","properties":{"count":{"type":"integer"},"reason":{"type":"string"}},"description":"EventReasonCount数据模型"},"EventReasonStatEntity":{"type":"object","properties":{"count":{"type":"integer"},"reason":{"type":"string"}},"description":"EventReasonStatEntity数据模型"},"EventSearchResponse":{"type":"object","properties":{"items":{"type":"array","items":{"type":"string"}},"keywords":{"type":"array","items":{"type":"string"}},"search_time":{"type":"string"},"total_count":{"type":"integer"}},"description":"EventSearchResponse数据模型"},"EventSource":{"type":"object","properties":{"component":{"type":"string","description":"组件名称"},"host":{"type":"string","description":"主机名"}},"description":"EventSource数据模型"},"EventSourceCount":{"type":"object","properties":{"count":{"type":"integer"},"source":{"type":"string"}},"description":"EventSourceCount数据模型"},"EventSourceEntity":{"type":"object","properties":{"component":{"type":"string"},"host":{"type":"string"}},"description":"EventSourceEntity数据模型"},"EventStatisticsResponse":{"type":"object","properties":{"events_by_namespace":{"type":"array","items":{"type":"string"}},"events_by_object":{"type":"array","items":{"type":"string"}},"events_by_reason":{"type":"array","items":{"type":"string"}},"events_by_type":{"type":"array","items":{"type":"string"}},"normal_events":{"type":"integer"},"total_events":{"type":"integer"},"trend_data":{"type":"array","items":{"type":"string"}},"warning_events":{"type":"integer"}},"description":"EventStatisticsResponse数据模型"},"EventStatsInfo":{"type":"object","properties":{"normal_events":{"type":"integer"},"recent_events":{"type":"integer"},"total_events":{"type":"integer"},"warning_events":{"type":"integer"}},"description":"EventStatsInfo数据模型"},"EventTimelineEntity":{"type":"object","properties":{"end_time":{"type":"string"},"start_time":{"type":"string"},"time_points":{"type":"array","items":{"type":"string"}}},"description":"EventTimelineEntity数据模型"},"EventTimelinePointEntity":{"type":"object","properties":{"count":{"type":"integer"},"event_type":{"type":"string"},"time":{"type":"string"}},"description":"EventTimelinePointEntity数据模型"},"EventTrendDataEntity":{"type":"object","properties":{"normal_count":{"type":"integer"},"time":{"type":"string"},"warning_count":{"type":"integer"}},"description":"EventTrendDataEntity数据模型"},"EventTypeStatEntity":{"type":"object","properties":{"count":{"type":"integer"},"type":{"type":"string"}},"description":"EventTypeStatEntity数据模型"},"FeishuPrivateCardMsg":{"type":"object","properties":{"content":{"type":"string"},"msg_type":{"type":"string"},"receive_id":{"type":"string"},"receive_id_type":{"type":"string"}},"description":"FeishuPrivateCardMsg数据模型"},"FormField":{"type":"object","properties":{"default":{"type":"object"},"id":{"type":"string"},"label":{"type":"string"},"name":{"type":"string"},"options":{"type":"array","items":{"type":"string"}},"placeholder":{"type":"string"},"required":{"type":"integer"},"type":{"type":"string"}},"required":["name","type","label"],"description":"FormField数据模型"},"FormSchema":{"type":"object","properties":{"fields":{"type":"array","items":{"type":"string"}}},"required":["fields"],"description":"FormSchema数据模型"},"GetApiRequest":{"type":"object","properties":{"id":{"type":"integer"}},"required":["id"],"description":"GetApiRequest数据模型"},"GetAuditLogDetailRequest":{"type":"object","properties":{"id":{"type":"integer"}},"required":["id"],"description":"GetAuditLogDetailRequest数据模型"},"GetAvailableActionsReq":{"type":"object","properties":{"id":{"type":"integer"}},"required":["id"],"description":"GetAvailableActionsReq数据模型"},"GetClusterReq":{"type":"object","properties":{"id":{"type":"integer"}},"required":["id"],"description":"GetClusterReq数据模型"},"GetCurrentStepReq":{"type":"object","properties":{"id":{"type":"integer"}},"required":["id"],"description":"GetCurrentStepReq数据模型"},"GetInstanceCommentsTreeReq":{"type":"object","properties":{"id":{"type":"integer"}},"required":["id"],"description":"GetInstanceCommentsTreeReq数据模型"},"GetMCPConfigReq":{"type":"object","properties":{"id":{"type":"integer"}},"required":["id"],"description":"GetMCPConfigReq数据模型"},"GetMCPConfigsReq":{"type":"object","properties":{"url":{"type":"string"}},"description":"GetMCPConfigsReq数据模型"},"GetMCPStatusReq":{"type":"object","properties":{"id":{"type":"integer"}},"required":["id"],"description":"GetMCPStatusReq数据模型"},"GetMonitorAlertEventListReq":{"type":"object","properties":{"end_time":{"type":"string"},"start_time":{"type":"string"},"status":{"type":"object"}},"description":"GetMonitorAlertEventListReq数据模型"},"GetMonitorAlertManagerPoolReq":{"type":"object","properties":{"id":{"type":"integer"}},"required":["id"],"description":"GetMonitorAlertManagerPoolReq数据模型"},"GetMonitorAlertRuleListReq":{"type":"object","properties":{"enable":{"type":"object"},"severity":{"type":"object"}},"description":"GetMonitorAlertRuleListReq数据模型"},"GetMonitorAlertRuleReq":{"type":"object","properties":{"id":{"type":"integer"}},"required":["id"],"description":"GetMonitorAlertRuleReq数据模型"},"GetMonitorConfigByInstanceReq":{"type":"object","properties":{"config_type":{"type":"integer"},"instance_ip":{"type":"string"}},"required":["instance_ip","config_type"],"description":"GetMonitorConfigByInstanceReq数据模型"},"GetMonitorConfigListReq":{"type":"object","properties":{"config_type":{"type":"object"},"status":{"type":"object"}},"description":"GetMonitorConfigListReq数据模型"},"GetMonitorConfigReq":{"type":"object","properties":{"id":{"type":"integer"}},"required":["id"],"description":"GetMonitorConfigReq数据模型"},"GetMonitorOnDutyGroupChangeListReq":{"type":"object","properties":{"on_duty_group_id":{"type":"integer"}},"required":["on_duty_group_id"],"description":"GetMonitorOnDutyGroupChangeListReq数据模型"},"GetMonitorOnDutyGroupFuturePlanReq":{"type":"object","properties":{"end_time":{"type":"string"},"id":{"type":"integer"},"start_time":{"type":"string"}},"required":["id","start_time","end_time"],"description":"GetMonitorOnDutyGroupFuturePlanReq数据模型"},"GetMonitorOnDutyGroupListReq":{"type":"object","properties":{"enable":{"type":"object"}},"description":"GetMonitorOnDutyGroupListReq数据模型"},"GetMonitorOnDutyGroupReq":{"type":"object","properties":{"id":{"type":"integer"}},"required":["id"],"description":"GetMonitorOnDutyGroupReq数据模型"},"GetMonitorOnDutyHistoryReq":{"type":"object","properties":{"end_date":{"type":"string"},"on_duty_group_id":{"type":"integer"},"start_date":{"type":"string"}},"required":["on_duty_group_id"],"description":"GetMonitorOnDutyHistoryReq数据模型"},"GetMonitorRecordRuleListReq":{"type":"object","properties":{"enable":{"type":"object"},"pool_id":{"type":"object"}},"description":"GetMonitorRecordRuleListReq数据模型"},"GetMonitorRecordRuleReq":{"type":"object","properties":{"id":{"type":"integer"}},"required":["id"],"description":"GetMonitorRecordRuleReq数据模型"},"GetMonitorScrapeJobDetailReq":{"type":"object","properties":{"id":{"type":"integer"}},"required":["id"],"description":"GetMonitorScrapeJobDetailReq数据模型"},"GetMonitorScrapeJobListReq":{"type":"object","properties":{"enable":{"type":"object"},"pool_id":{"type":"integer"}},"description":"GetMonitorScrapeJobListReq数据模型"},"GetMonitorScrapePoolDetailReq":{"type":"object","properties":{"id":{"type":"integer"}},"required":["id"],"description":"GetMonitorScrapePoolDetailReq数据模型"},"GetMonitorScrapePoolListReq":{"type":"object","properties":{"support_alert":{"type":"object"},"support_record":{"type":"object"}},"description":"GetMonitorScrapePoolListReq数据模型"},"GetMonitorSendGroupListReq":{"type":"object","properties":{"enable":{"type":"object"},"on_duty_group_id":{"type":"object"},"pool_id":{"type":"object"}},"description":"GetMonitorSendGroupListReq数据模型"},"GetMonitorSendGroupReq":{"type":"object","properties":{"id":{"type":"integer"}},"required":["id"],"description":"GetMonitorSendGroupReq数据模型"},"GetPermCodeReq":{"type":"object","properties":{"id":{"type":"integer"}},"required":["id"],"description":"GetPermCodeReq数据模型"},"GetRoleApiRequest":{"type":"object","properties":{"id":{"type":"integer"}},"description":"GetRoleApiRequest数据模型"},"GetRoleRequest":{"type":"object","properties":{"id":{"type":"integer"}},"description":"GetRoleRequest数据模型"},"GetRoleUsersRequest":{"type":"object","properties":{"id":{"type":"integer"}},"description":"GetRoleUsersRequest数据模型"},"GetToolBlacklistReq":{"type":"object","properties":{"id":{"type":"integer"}},"required":["id"],"description":"GetToolBlacklistReq数据模型"},"GetToolReq":{"type":"object","properties":{"name":{"type":"string"}},"required":["name"],"description":"GetToolReq数据模型"},"GetToolWhitelistReq":{"type":"object","properties":{"id":{"type":"integer"}},"required":["id"],"description":"GetToolWhitelistReq数据模型"},"GetToolsReq":{"type":"object","properties":{"description":{"type":"string"},"name":{"type":"string"}},"description":"GetToolsReq数据模型"},"GetTreeLocalResourceDetailReq":{"type":"object","properties":{"id":{"type":"integer"}},"description":"GetTreeLocalResourceDetailReq数据模型"},"GetTreeLocalResourceListReq":{"type":"object","properties":{"status":{"type":"object"}},"description":"GetTreeLocalResourceListReq数据模型"},"GetTreeNodeChildNodesReq":{"type":"object","properties":{"id":{"type":"integer"}},"required":["id"],"description":"GetTreeNodeChildNodesReq数据模型"},"GetTreeNodeDetailReq":{"type":"object","properties":{"id":{"type":"integer"}},"required":["id"],"description":"GetTreeNodeDetailReq数据模型"},"GetTreeNodeListReq":{"type":"object","properties":{"level":{"type":"integer"},"search":{"type":"string"},"status":{"type":"object"}},"description":"GetTreeNodeListReq数据模型"},"GetTreeNodeMembersReq":{"type":"object","properties":{"id":{"type":"integer"},"type":{"type":"object"}},"required":["id"],"description":"GetTreeNodeMembersReq数据模型"},"GetUserDetailReq":{"type":"object","properties":{"id":{"type":"integer"}},"required":["id"],"description":"GetUserDetailReq数据模型"},"GetUserListReq":{"type":"object","properties":{"account_type":{"type":"integer"},"enable":{"type":"integer"}},"description":"GetUserListReq数据模型"},"GetUserPermissionsRequest":{"type":"object","properties":{"id":{"type":"integer"}},"description":"GetUserPermissionsRequest数据模型"},"GetUserRolesRequest":{"type":"object","properties":{"id":{"type":"integer"}},"description":"GetUserRolesRequest数据模型"},"GetUserTreeNodesReq":{"type":"object","properties":{"role":{"type":"object"},"user_id":{"type":"integer"}},"required":["user_id"],"description":"GetUserTreeNodesReq数据模型"},"HostPathVolumeSourceRequest":{"type":"object","properties":{"path":{"type":"string","description":"主机路径"},"type":{"type":"object","description":"路径类型"}},"description":"HostPathVolumeSourceRequest数据模型"},"HourlyTrendItem":{"type":"object","properties":{"count":{"type":"integer"},"hour":{"type":"integer"}},"description":"HourlyTrendItem数据模型"},"IngressBackend":{"type":"object","properties":{"resource":{"$ref":"#/definitions/IngressResourceRef"},"service":{"$ref":"#/definitions/IngressServiceBackendPort"}},"description":"IngressBackend数据模型"},"IngressBackendHealthEntity":{"type":"object","properties":{"backends":{"type":"array","items":{"type":"string"}},"healthy_backends":{"type":"integer"},"total_backends":{"type":"integer"}},"description":"IngressBackendHealthEntity数据模型"},"IngressBackendReq":{"type":"object","properties":{"resource":{"$ref":"#/definitions/IngressResourceRefReq","description":"资源后端"},"service":{"$ref":"#/definitions/IngressServiceBackendPortReq","description":"服务后端"}},"description":"IngressBackendReq数据模型"},"IngressBackendStatusEntity":{"type":"object","properties":{"healthy":{"type":"boolean"},"host":{"type":"string"},"message":{"type":"string"},"path":{"type":"string"},"service_name":{"type":"string"},"service_port":{"type":"string"},"status":{"type":"string"}},"description":"IngressBackendStatusEntity数据模型"},"IngressCertInfoEntity":{"type":"object","properties":{"days_to_expiry":{"type":"integer"},"hosts":{"type":"array","items":{"type":"string"}},"is_valid":{"type":"boolean"},"issuer":{"type":"string"},"not_after":{"type":"string"},"not_before":{"type":"string"},"secret_name":{"type":"string"},"subject":{"type":"string"}},"description":"IngressCertInfoEntity数据模型"},"IngressDetailResponse":{"type":"object","properties":{"backend_health":{"$ref":"#/definitions/IngressBackendHealthEntity"},"events":{"type":"array","items":{"type":"string"}},"ingress":{"$ref":"#/definitions/IngressEntity"},"tls_status":{"$ref":"#/definitions/IngressTLSStatusEntity"},"yaml":{"type":"string"}},"description":"IngressDetailResponse数据模型"},"IngressEndpointEntity":{"type":"object","properties":{"available":{"type":"boolean"},"host":{"type":"string"},"path":{"type":"string"},"ready":{"type":"boolean"},"service_name":{"type":"string"},"service_port":{"type":"string"}},"description":"IngressEndpointEntity数据模型"},"IngressEntity":{"type":"object","properties":{"age":{"type":"string"},"annotations":{"type":"object","additionalProperties":true},"created_at":{"type":"string"},"endpoints":{"type":"array","items":{"type":"string"}},"hosts":{"type":"array","items":{"type":"string"}},"ingress_class_name":{"type":"string"},"labels":{"type":"object","additionalProperties":true},"load_balancer":{"$ref":"#/definitions/IngressLoadBalancerEntity"},"name":{"type":"string"},"namespace":{"type":"string"},"rules":{"type":"array","items":{"type":"string"}},"status":{"type":"string"},"tls":{"type":"array","items":{"type":"string"}},"uid":{"type":"string"}},"description":"IngressEntity数据模型"},"IngressEventEntity":{"type":"object","properties":{"count":{"type":"integer"},"first_time":{"type":"string"},"last_time":{"type":"string"},"message":{"type":"string"},"reason":{"type":"string"},"source":{"type":"string"},"type":{"type":"string"}},"description":"IngressEventEntity数据模型"},"IngressHTTPIngressPath":{"type":"object","properties":{"backend":{"$ref":"#/definitions/IngressBackend"},"path":{"type":"string"},"path_type":{"type":"string"}},"description":"IngressHTTPIngressPath数据模型"},"IngressHTTPIngressPathEntity":{"type":"object","properties":{"backend":{"$ref":"#/definitions/IngressIngressBackendEntity"},"path":{"type":"string"},"path_type":{"type":"string"}},"description":"IngressHTTPIngressPathEntity数据模型"},"IngressHTTPIngressPathReq":{"type":"object","properties":{"backend":{"$ref":"#/definitions/IngressBackendReq","description":"后端服务"},"path":{"type":"string","description":"路径"},"path_type":{"type":"string","description":"路径类型"}},"description":"IngressHTTPIngressPathReq数据模型"},"IngressHTTPRuleValue":{"type":"object","properties":{"paths":{"type":"array","items":{"type":"string"}}},"description":"IngressHTTPRuleValue数据模型"},"IngressHTTPRuleValueEntity":{"type":"object","properties":{"paths":{"type":"array","items":{"type":"string"}}},"description":"IngressHTTPRuleValueEntity数据模型"},"IngressHTTPRuleValueReq":{"type":"object","properties":{"paths":{"type":"array","items":{"type":"string"},"description":"路径列表"}},"description":"IngressHTTPRuleValueReq数据模型"},"IngressIngress":{"type":"object","properties":{"hostname":{"type":"string"},"ip":{"type":"string"},"ports":{"type":"array","items":{"type":"string"}}},"description":"IngressIngress数据模型"},"IngressIngressBackendEntity":{"type":"object","properties":{"resource":{"$ref":"#/definitions/IngressResourceRefEntity"},"service":{"$ref":"#/definitions/IngressServiceBackendPortEntity"}},"description":"IngressIngressBackendEntity数据模型"},"IngressIngressPort":{"type":"object","properties":{"port":{"type":"integer"},"protocol":{"type":"string"}},"description":"IngressIngressPort数据模型"},"IngressListResponse":{"type":"object","properties":{"items":{"type":"array","items":{"type":"string"}},"total_count":{"type":"integer"}},"description":"IngressListResponse数据模型"},"IngressLoadBalancer":{"type":"object","properties":{"ingress":{"type":"array","items":{"type":"string"}}},"description":"IngressLoadBalancer数据模型"},"IngressLoadBalancerEntity":{"type":"object","properties":{"ingress":{"type":"array","items":{"type":"string"}}},"description":"IngressLoadBalancerEntity数据模型"},"IngressLoadBalancerIngress":{"type":"object","properties":{"hostname":{"type":"string"},"ip":{"type":"string"},"ports":{"type":"array","items":{"type":"string"}}},"description":"IngressLoadBalancerIngress数据模型"},"IngressLoadBalancerIngressEntity":{"type":"object","properties":{"hostname":{"type":"string"},"ip":{"type":"string"},"ports":{"type":"array","items":{"type":"string"}}},"description":"IngressLoadBalancerIngressEntity数据模型"},"IngressPortStatus":{"type":"object","properties":{"error":{"type":"string"},"port":{"type":"integer"},"protocol":{"type":"string"}},"description":"IngressPortStatus数据模型"},"IngressPortStatusEntity":{"type":"object","properties":{"error":{"type":"string"},"port":{"type":"integer"},"protocol":{"type":"string"}},"description":"IngressPortStatusEntity数据模型"},"IngressResourceRef":{"type":"object","properties":{"api_group":{"type":"string"},"kind":{"type":"string"},"name":{"type":"string"}},"description":"IngressResourceRef数据模型"},"IngressResourceRefEntity":{"type":"object","properties":{"api_group":{"type":"string"},"kind":{"type":"string"},"name":{"type":"string"}},"description":"IngressResourceRefEntity数据模型"},"IngressResourceRefReq":{"type":"object","properties":{"api_group":{"type":"string","description":"API组"},"kind":{"type":"string","description":"资源类型"},"name":{"type":"string","description":"资源名称"}},"description":"IngressResourceRefReq数据模型"},"IngressRule":{"type":"object","properties":{"host":{"type":"string"},"http":{"$ref":"#/definitions/IngressHTTPRuleValue"}},"description":"IngressRule数据模型"},"IngressRuleEntity":{"type":"object","properties":{"host":{"type":"string"},"http":{"$ref":"#/definitions/IngressHTTPRuleValueEntity"}},"description":"IngressRuleEntity数据模型"},"IngressRuleReq":{"type":"object","properties":{"host":{"type":"string","description":"主机名"},"http":{"$ref":"#/definitions/IngressHTTPRuleValueReq","description":"HTTP规则"}},"description":"IngressRuleReq数据模型"},"IngressServiceBackendPort":{"type":"object","properties":{"name":{"type":"string"},"port":{"$ref":"#/definitions/IngressServiceBackendPortSpec"}},"description":"IngressServiceBackendPort数据模型"},"IngressServiceBackendPortEntity":{"type":"object","properties":{"name":{"type":"string"},"port":{"$ref":"#/definitions/IngressServiceBackendPortNumberEntity"}},"description":"IngressServiceBackendPortEntity数据模型"},"IngressServiceBackendPortNumberEntity":{"type":"object","properties":{"name":{"type":"string"},"number":{"type":"integer"}},"description":"IngressServiceBackendPortNumberEntity数据模型"},"IngressServiceBackendPortReq":{"type":"object","properties":{"name":{"type":"string","description":"服务名称"},"port":{"$ref":"#/definitions/IngressServiceBackendPortSpecReq","description":"端口信息"}},"description":"IngressServiceBackendPortReq数据模型"},"IngressServiceBackendPortSpec":{"type":"object","properties":{"name":{"type":"string"},"number":{"type":"integer"}},"description":"IngressServiceBackendPortSpec数据模型"},"IngressServiceBackendPortSpecReq":{"type":"object","properties":{"name":{"type":"string","description":"端口名称"},"number":{"type":"integer","description":"端口号"}},"description":"IngressServiceBackendPortSpecReq数据模型"},"IngressServicePort":{"type":"object","properties":{"name":{"type":"string"},"number":{"type":"integer"}},"description":"IngressServicePort数据模型"},"IngressServicePortRequest":{"type":"object","properties":{"name":{"type":"string","description":"端口名"},"number":{"type":"integer","description":"端口号"}},"description":"IngressServicePortRequest数据模型"},"IngressTLS":{"type":"object","properties":{"hosts":{"type":"array","items":{"type":"string"}},"secret_name":{"type":"string"}},"description":"IngressTLS数据模型"},"IngressTLSEntity":{"type":"object","properties":{"hosts":{"type":"array","items":{"type":"string"}},"secret_name":{"type":"string"}},"description":"IngressTLSEntity数据模型"},"IngressTLSReq":{"type":"object","properties":{"hosts":{"type":"array","items":{"type":"string"},"description":"主机列表"},"secret_name":{"type":"string","description":"Secret名称"}},"description":"IngressTLSReq数据模型"},"IngressTLSStatusEntity":{"type":"object","properties":{"certificate_info":{"type":"array","items":{"type":"string"}},"secured_hosts":{"type":"integer"},"total_hosts":{"type":"integer"}},"description":"IngressTLSStatusEntity数据模型"},"ItemDef":{"type":"object","properties":{"enum":{"type":"array","items":{"type":"integer"}},"type":{"type":"string"}},"description":"ItemDef数据模型"},"K8sBackendHealth":{"type":"object","properties":{"healthy":{"type":"boolean"},"message":{"type":"string"},"service_name":{"type":"string"},"service_port":{"type":"integer"}},"description":"K8sBackendHealth数据模型"},"K8sBaseReq":{"type":"object","properties":{"cluster_id":{"type":"integer","description":"集群ID"},"namespace":{"type":"string","description":"命名空间"}},"required":["cluster_id","namespace"],"description":"K8sBaseReq数据模型"},"K8sBatchDeleteReq":{"type":"object","properties":{"resource_names":{"type":"array","items":{"type":"string"},"description":"资源名称列表"}},"required":["resource_names"],"description":"K8sBatchDeleteReq数据模型"},"K8sBatchOperationReq":{"type":"object","properties":{"operation":{"type":"string","description":"操作类型:restart|scale|delete"},"parameters":{"type":"object","description":"操作参数"},"resource_names":{"type":"array","items":{"type":"string"},"description":"资源名称列表"}},"required":["resource_names","operation"],"description":"K8sBatchOperationReq数据模型"},"K8sBatchRequest":{"type":"object","properties":{"cluster":{"type":"string"},"items":{"type":"array","items":{"type":"string"}}},"description":"K8sBatchRequest数据模型"},"K8sCluster":{"type":"object","properties":{"action_timeout_seconds":{"type":"integer","description":"操作超时时间(秒)"},"api_server_addr":{"type":"string","description":"API Server 地址"},"cpu_limit":{"type":"string","description":"CPU 限制量"},"cpu_request":{"type":"string","description":"CPU 请求量"},"env":{"type":"string","description":"集群环境,例如 prod, stage, dev, rc, press"},"kube_config_content":{"type":"string","description":"kubeConfig 内容"},"memory_limit":{"type":"string","description":"内存限制量"},"memory_request":{"type":"string","description":"内存请求量"},"name":{"type":"string","description":"集群名称"},"name_zh":{"type":"string","description":"集群中文名称"},"restricted_name_space":{"type":"object","description":"资源限制命名空间"},"status":{"type":"string","description":"集群状态"},"user_id":{"type":"integer","description":"创建者用户ID"},"version":{"type":"string","description":"集群版本"}},"required":["name","name_zh"],"description":"K8sCluster数据模型"},"K8sClusterNodesReq":{"type":"object","properties":{"cluster_id":{"type":"integer","description":"集群ID"},"node_name":{"type":"string","description":"节点名称"}},"required":["cluster_id","node_name"],"description":"K8sClusterNodesReq数据模型"},"K8sConfigMap":{"type":"object","properties":{"age":{"type":"string"},"annotations":{"type":"object","additionalProperties":true},"binary_data":{"type":"object","additionalProperties":true},"creation_timestamp":{"type":"string","format":"date-time"},"data":{"type":"object","additionalProperties":true},"events":{"type":"array","items":{"type":"string"}},"labels":{"type":"object","additionalProperties":true},"name":{"type":"string"},"namespace":{"type":"string"},"uid":{"type":"string"}},"description":"K8sConfigMap数据模型"},"K8sConfigMapBackupReq":{"type":"object","properties":{"backup_name":{"type":"string","description":"备份名称"},"cluster_id":{"type":"integer","description":"集群ID"},"description":{"type":"string","description":"备份描述"},"names":{"type":"array","items":{"type":"string"},"description":"ConfigMap名称列表"},"namespace":{"type":"string","description":"命名空间"}},"required":["cluster_id","namespace","names","backup_name"],"description":"K8sConfigMapBackupReq数据模型"},"K8sConfigMapBatchDeleteReq":{"type":"object","properties":{"cluster_id":{"type":"integer","description":"集群ID"},"force":{"type":"boolean","description":"是否强制删除"},"grace_period_seconds":{"type":"object","description":"优雅删除时间(秒)"},"names":{"type":"array","items":{"type":"string"},"description":"ConfigMap名称列表"},"namespace":{"type":"string","description":"命名空间"}},"required":["cluster_id","namespace","names"],"description":"K8sConfigMapBatchDeleteReq数据模型"},"K8sConfigMapCreateReq":{"type":"object","properties":{"annotations":{"type":"object","description":"注解","additionalProperties":true},"binary_data":{"type":"object","description":"二进制数据","additionalProperties":true},"cluster_id":{"type":"integer","description":"集群ID"},"configmap_yaml":{"type":"object","description":"ConfigMap YAML对象"},"data":{"type":"object","description":"字符串数据","additionalProperties":true},"labels":{"type":"object","description":"标签","additionalProperties":true},"name":{"type":"string","description":"ConfigMap名称"},"namespace":{"type":"string","description":"命名空间"}},"required":["cluster_id","namespace","name"],"description":"K8sConfigMapCreateReq数据模型"},"K8sConfigMapDataReq":{"type":"object","properties":{"cluster_id":{"type":"integer","description":"集群ID"},"key":{"type":"string","description":"数据键,为空则获取所有"},"name":{"type":"string","description":"ConfigMap名称"},"namespace":{"type":"string","description":"命名空间"}},"required":["cluster_id","namespace","name"],"description":"K8sConfigMapDataReq数据模型"},"K8sConfigMapDeleteReq":{"type":"object","properties":{"cluster_id":{"type":"integer","description":"集群ID"},"force":{"type":"boolean","description":"是否强制删除"},"grace_period_seconds":{"type":"object","description":"优雅删除时间(秒)"},"name":{"type":"string","description":"ConfigMap名称"},"namespace":{"type":"string","description":"命名空间"}},"required":["cluster_id","namespace","name"],"description":"K8sConfigMapDeleteReq数据模型"},"K8sConfigMapEntity":{"type":"object","properties":{"age":{"type":"string"},"annotations":{"type":"object","description":"注解","additionalProperties":true},"binary_data":{"type":"object","description":"二进制数据","additionalProperties":true},"cluster_id":{"type":"integer","description":"所属集群ID"},"creation_timestamp":{"type":"string","format":"date-time","description":"Kubernetes创建时间"},"data":{"type":"object","description":"字符串数据","additionalProperties":true},"data_count":{"type":"integer"},"labels":{"type":"object","description":"标签","additionalProperties":true},"name":{"type":"string","description":"ConfigMap名称"},"namespace":{"type":"string","description":"所属命名空间"},"size":{"type":"string"},"uid":{"type":"string","description":"ConfigMap UID"}},"required":["name","namespace"],"description":"K8sConfigMapEntity数据模型"},"K8sConfigMapEventReq":{"type":"object","properties":{"cluster_id":{"type":"integer","description":"集群ID"},"limit_days":{"type":"integer","description":"限制天数内的事件"},"name":{"type":"string","description":"ConfigMap名称"},"namespace":{"type":"string","description":"命名空间"}},"required":["cluster_id","namespace","name"],"description":"K8sConfigMapEventReq数据模型"},"K8sConfigMapListReq":{"type":"object","properties":{"cluster_id":{"type":"integer","description":"集群ID"},"data_key":{"type":"string","description":"数据键过滤"},"field_selector":{"type":"string","description":"字段选择器"},"label_selector":{"type":"string","description":"标签选择器"},"namespace":{"type":"string","description":"命名空间"},"page":{"type":"integer","description":"页码"},"page_size":{"type":"integer","description":"每页大小"},"status":{"type":"string","description":"状态过滤"}},"required":["cluster_id"],"description":"K8sConfigMapListReq数据模型"},"K8sConfigMapReq":{"type":"object","properties":{"cluster_id":{"type":"integer"},"config_map":{"type":"object"},"config_map_names":{"type":"array","items":{"type":"string"}},"namespace":{"type":"string"}},"required":["cluster_id"],"description":"K8sConfigMapReq数据模型"},"K8sConfigMapUpdateReq":{"type":"object","properties":{"annotations":{"type":"object","description":"注解","additionalProperties":true},"binary_data":{"type":"object","description":"二进制数据","additionalProperties":true},"cluster_id":{"type":"integer","description":"集群ID"},"configmap_yaml":{"type":"object","description":"ConfigMap YAML对象"},"data":{"type":"object","description":"字符串数据","additionalProperties":true},"labels":{"type":"object","description":"标签","additionalProperties":true},"name":{"type":"string","description":"ConfigMap名称"},"namespace":{"type":"string","description":"命名空间"}},"required":["cluster_id","namespace","name"],"description":"K8sConfigMapUpdateReq数据模型"},"K8sConfigMapUsageReq":{"type":"object","properties":{"cluster_id":{"type":"integer","description":"集群ID"},"name":{"type":"string","description":"ConfigMap名称"},"namespace":{"type":"string","description":"命名空间"}},"required":["cluster_id","namespace","name"],"description":"K8sConfigMapUsageReq数据模型"},"K8sContainerPort":{"type":"object","properties":{"container_port":{"type":"integer","description":"容器端口号"},"name":{"type":"string","description":"端口名称"},"protocol":{"type":"string","description":"协议类型"}},"required":["container_port"],"description":"K8sContainerPort数据模型"},"K8sDaemonSet":{"type":"object","properties":{"age":{"type":"string"},"annotations":{"type":"object","additionalProperties":true},"available_number":{"type":"integer"},"creation_timestamp":{"type":"string","format":"date-time"},"current_number":{"type":"integer"},"desired_number":{"type":"integer"},"events":{"type":"array","items":{"type":"string"}},"images":{"type":"array","items":{"type":"string"}},"labels":{"type":"object","additionalProperties":true},"misscheduled_number":{"type":"integer"},"name":{"type":"string"},"namespace":{"type":"string"},"ready_number":{"type":"integer"},"uid":{"type":"string"},"update_strategy":{"type":"string"},"updated_number":{"type":"integer"}},"description":"K8sDaemonSet数据模型"},"K8sDaemonSetBatchDeleteReq":{"type":"object","properties":{"cluster_id":{"type":"integer","description":"集群ID"},"force":{"type":"boolean","description":"是否强制删除"},"grace_period_seconds":{"type":"object","description":"优雅删除时间(秒)"},"names":{"type":"array","items":{"type":"string"},"description":"DaemonSet名称列表"},"namespace":{"type":"string","description":"命名空间"},"orphan_dependents":{"type":"boolean","description":"是否保留依赖资源"}},"required":["cluster_id","namespace","names"],"description":"K8sDaemonSetBatchDeleteReq数据模型"},"K8sDaemonSetBatchRestartReq":{"type":"object","properties":{"cluster_id":{"type":"integer","description":"集群ID"},"names":{"type":"array","items":{"type":"string"},"description":"DaemonSet名称列表"},"namespace":{"type":"string","description":"命名空间"}},"required":["cluster_id","namespace","names"],"description":"K8sDaemonSetBatchRestartReq数据模型"},"K8sDaemonSetCreateReq":{"type":"object","properties":{"annotations":{"type":"object","description":"注解","additionalProperties":true},"cluster_id":{"type":"integer","description":"集群ID"},"daemonset_yaml":{"type":"object","description":"DaemonSet YAML对象"},"labels":{"type":"object","description":"标签","additionalProperties":true},"name":{"type":"string","description":"DaemonSet名称"},"namespace":{"type":"string","description":"命名空间"},"pod_template":{"type":"object","description":"Pod模板","additionalProperties":true},"revision_history_limit":{"type":"object","description":"历史版本限制"},"selector":{"type":"object","description":"选择器","additionalProperties":true},"update_strategy":{"type":"string","description":"更新策略"}},"required":["cluster_id","namespace","name","selector","pod_template"],"description":"K8sDaemonSetCreateReq数据模型"},"K8sDaemonSetDeleteReq":{"type":"object","properties":{"cluster_id":{"type":"integer","description":"集群ID"},"force":{"type":"boolean","description":"是否强制删除"},"grace_period_seconds":{"type":"object","description":"优雅删除时间(秒)"},"name":{"type":"string","description":"DaemonSet名称"},"namespace":{"type":"string","description":"命名空间"},"orphan_dependents":{"type":"boolean","description":"是否保留依赖资源"}},"required":["cluster_id","namespace","name"],"description":"K8sDaemonSetDeleteReq数据模型"},"K8sDaemonSetEntity":{"type":"object","properties":{"age":{"type":"string"},"annotations":{"type":"object","description":"注解","additionalProperties":true},"cluster_id":{"type":"integer","description":"所属集群ID"},"creation_timestamp":{"type":"string","format":"date-time","description":"Kubernetes创建时间"},"current_number_scheduled":{"type":"integer","description":"当前调度数量"},"desired_number_scheduled":{"type":"integer","description":"期望调度数量"},"images":{"type":"array","items":{"type":"string"}},"labels":{"type":"object","description":"标签","additionalProperties":true},"name":{"type":"string","description":"DaemonSet名称"},"namespace":{"type":"string","description":"所属命名空间"},"number_available":{"type":"integer","description":"可用数量"},"number_misscheduled":{"type":"integer","description":"错误调度数量"},"number_ready":{"type":"integer","description":"就绪数量"},"number_unavailable":{"type":"integer","description":"不可用数量"},"pod_template":{"type":"object","description":"Pod模板","additionalProperties":true},"revision_history_limit":{"type":"integer","description":"历史版本限制"},"selector":{"type":"object","description":"选择器","additionalProperties":true},"status":{"type":"string"},"uid":{"type":"string","description":"DaemonSet UID"},"update_strategy":{"type":"string","description":"更新策略"},"updated_number_scheduled":{"type":"integer","description":"更新调度数量"}},"required":["name","namespace"],"description":"K8sDaemonSetEntity数据模型"},"K8sDaemonSetEventReq":{"type":"object","properties":{"cluster_id":{"type":"integer","description":"集群ID"},"limit_days":{"type":"integer","description":"限制天数内的事件"},"name":{"type":"string","description":"DaemonSet名称"},"namespace":{"type":"string","description":"命名空间"}},"required":["cluster_id","namespace","name"],"description":"K8sDaemonSetEventReq数据模型"},"K8sDaemonSetHistoryReq":{"type":"object","properties":{"cluster_id":{"type":"integer","description":"集群ID"},"name":{"type":"string","description":"DaemonSet名称"},"namespace":{"type":"string","description":"命名空间"}},"required":["cluster_id","namespace","name"],"description":"K8sDaemonSetHistoryReq数据模型"},"K8sDaemonSetListReq":{"type":"object","properties":{"cluster_id":{"type":"integer","description":"集群ID"},"field_selector":{"type":"string","description":"字段选择器"},"label_selector":{"type":"string","description":"标签选择器"},"namespace":{"type":"string","description":"命名空间"},"page":{"type":"integer","description":"页码"},"page_size":{"type":"integer","description":"每页大小"},"status":{"type":"string","description":"状态过滤"}},"required":["cluster_id"],"description":"K8sDaemonSetListReq数据模型"},"K8sDaemonSetMetricsReq":{"type":"object","properties":{"cluster_id":{"type":"integer","description":"集群ID"},"name":{"type":"string","description":"DaemonSet名称"},"namespace":{"type":"string","description":"命名空间"},"time_range":{"type":"string","description":"时间范围"}},"required":["cluster_id","namespace","name"],"description":"K8sDaemonSetMetricsReq数据模型"},"K8sDaemonSetNodePodsReq":{"type":"object","properties":{"cluster_id":{"type":"integer","description":"集群ID"},"daemonset_name":{"type":"string","description":"DaemonSet名称"},"namespace":{"type":"string","description":"命名空间"},"node_name":{"type":"string","description":"节点名称"}},"required":["cluster_id","namespace","daemonset_name","node_name"],"description":"K8sDaemonSetNodePodsReq数据模型"},"K8sDaemonSetRestartReq":{"type":"object","properties":{"cluster_id":{"type":"integer","description":"集群ID"},"name":{"type":"string","description":"DaemonSet名称"},"namespace":{"type":"string","description":"命名空间"}},"required":["cluster_id","namespace","name"],"description":"K8sDaemonSetRestartReq数据模型"},"K8sDaemonSetRollbackReq":{"type":"object","properties":{"cluster_id":{"type":"integer","description":"集群ID"},"name":{"type":"string","description":"DaemonSet名称"},"namespace":{"type":"string","description":"命名空间"},"revision":{"type":"integer","description":"回滚版本"}},"required":["cluster_id","namespace","name","revision"],"description":"K8sDaemonSetRollbackReq数据模型"},"K8sDaemonSetUpdateReq":{"type":"object","properties":{"annotations":{"type":"object","description":"注解","additionalProperties":true},"cluster_id":{"type":"integer","description":"集群ID"},"daemonset_yaml":{"type":"object","description":"DaemonSet YAML对象"},"labels":{"type":"object","description":"标签","additionalProperties":true},"name":{"type":"string","description":"DaemonSet名称"},"namespace":{"type":"string","description":"命名空间"},"pod_template":{"type":"object","description":"Pod模板","additionalProperties":true},"revision_history_limit":{"type":"object","description":"历史版本限制"},"selector":{"type":"object","description":"选择器","additionalProperties":true},"update_strategy":{"type":"string","description":"更新策略"}},"required":["cluster_id","namespace","name"],"description":"K8sDaemonSetUpdateReq数据模型"},"K8sDeleteResourceReq":{"type":"object","properties":{"cluster_id":{"type":"integer","description":"集群ID"},"force":{"type":"boolean","description":"是否强制删除"},"grace_period_seconds":{"type":"object","description":"优雅删除时间"},"namespace":{"type":"string","description":"命名空间"},"resource_name":{"type":"string","description":"资源名称"}},"required":["cluster_id","namespace","resource_name"],"description":"K8sDeleteResourceReq数据模型"},"K8sDeployment":{"type":"object","properties":{"age":{"type":"string"},"annotations":{"type":"object","additionalProperties":true},"available_replicas":{"type":"integer"},"creation_timestamp":{"type":"string","format":"date-time"},"events":{"type":"array","items":{"type":"string"}},"images":{"type":"array","items":{"type":"string"}},"labels":{"type":"object","additionalProperties":true},"name":{"type":"string"},"namespace":{"type":"string"},"ready_replicas":{"type":"integer"},"replicas":{"type":"integer"},"strategy":{"type":"string"},"uid":{"type":"string"},"updated_replicas":{"type":"integer"}},"description":"K8sDeployment数据模型"},"K8sDeploymentBatchDeleteReq":{"type":"object","properties":{"cluster_id":{"type":"integer","description":"集群ID"},"force":{"type":"boolean","description":"是否强制删除"},"grace_period_seconds":{"type":"object","description":"优雅删除时间(秒)"},"names":{"type":"array","items":{"type":"string"},"description":"Deployment名称列表"},"namespace":{"type":"string","description":"命名空间"}},"required":["cluster_id","namespace","names"],"description":"K8sDeploymentBatchDeleteReq数据模型"},"K8sDeploymentBatchRestartReq":{"type":"object","properties":{"cluster_id":{"type":"integer","description":"集群ID"},"names":{"type":"array","items":{"type":"string"},"description":"Deployment名称列表"},"namespace":{"type":"string","description":"命名空间"}},"required":["cluster_id","namespace","names"],"description":"K8sDeploymentBatchRestartReq数据模型"},"K8sDeploymentCreateReq":{"type":"object","properties":{"annotations":{"type":"object","description":"注解","additionalProperties":true},"cluster_id":{"type":"integer","description":"集群ID"},"deployment_yaml":{"type":"object","description":"Deployment YAML对象"},"env":{"type":"array","items":{"type":"string"},"description":"环境变量"},"image":{"type":"string","description":"镜像地址"},"labels":{"type":"object","description":"标签","additionalProperties":true},"name":{"type":"string","description":"Deployment名称"},"namespace":{"type":"string","description":"命名空间"},"ports":{"type":"array","items":{"type":"string"},"description":"容器端口"},"replicas":{"type":"integer","description":"副本数量"},"resources":{"$ref":"#/definitions/ResourceRequirements","description":"资源限制"},"strategy":{"$ref":"#/definitions/DeploymentStrategy","description":"部署策略"}},"required":["cluster_id","namespace","name","image"],"description":"K8sDeploymentCreateReq数据模型"},"K8sDeploymentDeleteReq":{"type":"object","properties":{"cluster_id":{"type":"integer","description":"集群ID"},"force":{"type":"boolean","description":"是否强制删除"},"grace_period_seconds":{"type":"object","description":"优雅删除时间(秒)"},"name":{"type":"string","description":"Deployment名称"},"namespace":{"type":"string","description":"命名空间"}},"required":["cluster_id","namespace","name"],"description":"K8sDeploymentDeleteReq数据模型"},"K8sDeploymentEntity":{"type":"object","properties":{"age":{"type":"string"},"annotations":{"type":"object","description":"注解","additionalProperties":true},"available_replicas":{"type":"integer","description":"可用副本数"},"cluster_id":{"type":"integer","description":"所属集群ID"},"creation_timestamp":{"type":"string","format":"date-time","description":"Kubernetes创建时间"},"images":{"type":"array","items":{"type":"string"},"description":"容器镜像列表"},"labels":{"type":"object","description":"标签","additionalProperties":true},"name":{"type":"string","description":"Deployment名称"},"namespace":{"type":"string","description":"所属命名空间"},"ready_replicas":{"type":"integer","description":"就绪副本数"},"replicas":{"type":"integer","description":"期望副本数"},"status":{"type":"string"},"strategy":{"type":"string","description":"部署策略"},"uid":{"type":"string","description":"Deployment UID"},"updated_replicas":{"type":"integer","description":"更新副本数"}},"required":["name","namespace"],"description":"K8sDeploymentEntity数据模型"},"K8sDeploymentEventReq":{"type":"object","properties":{"cluster_id":{"type":"integer","description":"集群ID"},"limit_days":{"type":"integer","description":"限制天数内的事件"},"name":{"type":"string","description":"Deployment名称"},"namespace":{"type":"string","description":"命名空间"}},"required":["cluster_id","namespace","name"],"description":"K8sDeploymentEventReq数据模型"},"K8sDeploymentHistoryReq":{"type":"object","properties":{"cluster_id":{"type":"integer","description":"集群ID"},"name":{"type":"string","description":"Deployment名称"},"namespace":{"type":"string","description":"命名空间"}},"required":["cluster_id","namespace","name"],"description":"K8sDeploymentHistoryReq数据模型"},"K8sDeploymentListReq":{"type":"object","properties":{"cluster_id":{"type":"integer","description":"集群ID"},"field_selector":{"type":"string","description":"字段选择器"},"label_selector":{"type":"string","description":"标签选择器"},"namespace":{"type":"string","description":"命名空间"},"page":{"type":"integer","description":"页码"},"page_size":{"type":"integer","description":"每页大小"},"status":{"type":"string","description":"状态过滤"}},"required":["cluster_id"],"description":"K8sDeploymentListReq数据模型"},"K8sDeploymentReq":{"type":"object","properties":{"cluster_id":{"type":"integer"},"deployment_names":{"type":"array","items":{"type":"string"}},"deployment_yaml":{"type":"object"},"namespace":{"type":"string"}},"required":["cluster_id","namespace"],"description":"K8sDeploymentReq数据模型"},"K8sDeploymentRestartReq":{"type":"object","properties":{"cluster_id":{"type":"integer","description":"集群ID"},"name":{"type":"string","description":"Deployment名称"},"namespace":{"type":"string","description":"命名空间"}},"required":["cluster_id","namespace","name"],"description":"K8sDeploymentRestartReq数据模型"},"K8sDeploymentRollbackReq":{"type":"object","properties":{"cluster_id":{"type":"integer","description":"集群ID"},"name":{"type":"string","description":"Deployment名称"},"namespace":{"type":"string","description":"命名空间"},"revision":{"type":"integer","description":"回滚到的版本,不指定则回滚到前一版本"}},"required":["cluster_id","namespace","name"],"description":"K8sDeploymentRollbackReq数据模型"},"K8sDeploymentScaleReq":{"type":"object","properties":{"cluster_id":{"type":"integer","description":"集群ID"},"name":{"type":"string","description":"Deployment名称"},"namespace":{"type":"string","description":"命名空间"},"replicas":{"type":"integer","description":"副本数量"}},"required":["cluster_id","namespace","name","replicas"],"description":"K8sDeploymentScaleReq数据模型"},"K8sDeploymentUpdateReq":{"type":"object","properties":{"annotations":{"type":"object","description":"注解","additionalProperties":true},"cluster_id":{"type":"integer","description":"集群ID"},"deployment_yaml":{"type":"object","description":"Deployment YAML对象"},"env":{"type":"array","items":{"type":"string"},"description":"环境变量"},"image":{"type":"string","description":"镜像地址"},"labels":{"type":"object","description":"标签","additionalProperties":true},"name":{"type":"string","description":"Deployment名称"},"namespace":{"type":"string","description":"命名空间"},"ports":{"type":"array","items":{"type":"string"},"description":"容器端口"},"replicas":{"type":"object","description":"副本数量"},"resources":{"$ref":"#/definitions/ResourceRequirements","description":"资源限制"},"strategy":{"$ref":"#/definitions/DeploymentStrategy","description":"部署策略"}},"required":["cluster_id","namespace","name"],"description":"K8sDeploymentUpdateReq数据模型"},"K8sEnvVar":{"type":"object","properties":{"name":{"type":"string","description":"环境变量名称"},"value":{"type":"string","description":"环境变量值"}},"required":["name"],"description":"K8sEnvVar数据模型"},"K8sEvent":{"type":"object","properties":{"count":{"type":"integer"},"creation_timestamp":{"type":"string","format":"date-time"},"first_timestamp":{"type":"string","format":"date-time"},"involved_object":{"type":"object"},"last_timestamp":{"type":"string","format":"date-time"},"message":{"type":"string"},"name":{"type":"string"},"namespace":{"type":"string"},"reason":{"type":"string"},"source":{"type":"object"},"type":{"type":"string"}},"description":"K8sEvent数据模型"},"K8sEventAlertReq":{"type":"object","properties":{"alert_channel":{"type":"string","description":"告警渠道"},"cluster_id":{"type":"integer","description":"集群ID"},"enabled":{"type":"boolean","description":"是否启用告警"},"event_reasons":{"type":"array","items":{"type":"string"},"description":"监控的事件原因"},"event_types":{"type":"array","items":{"type":"string"},"description":"监控的事件类型"},"namespace":{"type":"string","description":"命名空间"}},"required":["cluster_id"],"description":"K8sEventAlertReq数据模型"},"K8sEventByObjectReq":{"type":"object","properties":{"cluster_id":{"type":"integer","description":"集群ID"},"limit_days":{"type":"integer","description":"限制天数内的事件"},"namespace":{"type":"string","description":"命名空间"},"object_kind":{"type":"string","description":"对象类型"},"object_name":{"type":"string","description":"对象名称"},"object_uid":{"type":"string","description":"对象UID"}},"required":["cluster_id","object_name","object_kind"],"description":"K8sEventByObjectReq数据模型"},"K8sEventCleanupReq":{"type":"object","properties":{"cluster_id":{"type":"integer","description":"集群ID"},"days_to_keep":{"type":"integer","description":"保留天数"},"namespace":{"type":"string","description":"命名空间"}},"required":["cluster_id"],"description":"K8sEventCleanupReq数据模型"},"K8sEventCleanupResult":{"type":"object","properties":{"cleaned_count":{"type":"integer"},"error_count":{"type":"integer"},"errors":{"type":"array","items":{"type":"string"}}},"description":"K8sEventCleanupResult数据模型"},"K8sEventEntity":{"type":"object","properties":{"age":{"type":"string"},"cluster_id":{"type":"integer","description":"所属集群ID"},"count":{"type":"integer","description":"发生次数"},"creation_timestamp":{"type":"string","format":"date-time","description":"Kubernetes创建时间"},"first_timestamp":{"type":"string","format":"date-time","description":"首次发生时间"},"involved_object":{"type":"object","description":"相关对象"},"last_timestamp":{"type":"string","format":"date-time","description":"最后发生时间"},"message":{"type":"string","description":"事件消息"},"name":{"type":"string","description":"事件名称"},"namespace":{"type":"string","description":"所属命名空间"},"reason":{"type":"string","description":"事件原因"},"severity":{"type":"string"},"source":{"type":"object","description":"事件来源"},"type":{"type":"string","description":"事件类型"},"uid":{"type":"string","description":"事件UID"}},"description":"K8sEventEntity数据模型"},"K8sEventExportReq":{"type":"object","properties":{"cluster_id":{"type":"integer","description":"集群ID"},"end_time":{"type":"string","description":"结束时间"},"format":{"type":"string","description":"导出格式(excel,csv,json)"},"involved_object_kind":{"type":"string","description":"相关对象类型"},"involved_object_name":{"type":"string","description":"相关对象名称"},"namespace":{"type":"string","description":"命名空间"},"reason":{"type":"string","description":"事件原因过滤"},"start_time":{"type":"string","description":"开始时间"},"type":{"type":"string","description":"事件类型过滤"}},"required":["cluster_id"],"description":"K8sEventExportReq数据模型"},"K8sEventListReq":{"type":"object","properties":{"cluster_id":{"type":"integer","description":"集群ID"},"end_time":{"type":"string","description":"结束时间"},"event_type":{"type":"string","description":"事件类型过滤"},"field_selector":{"type":"string","description":"字段选择器"},"involved_object_kind":{"type":"string","description":"相关对象类型"},"involved_object_name":{"type":"string","description":"相关对象名称"},"label_selector":{"type":"string","description":"标签选择器"},"limit_days":{"type":"integer","description":"限制天数内的事件"},"namespace":{"type":"string","description":"命名空间"},"page":{"type":"integer","description":"页码"},"page_size":{"type":"integer","description":"每页大小"},"reason":{"type":"string","description":"事件原因过滤"},"severity":{"type":"string","description":"严重程度过滤"},"source":{"type":"string","description":"事件来源过滤"},"start_time":{"type":"string","description":"开始时间"},"type":{"type":"string","description":"事件类型过滤"}},"required":["cluster_id"],"description":"K8sEventListReq数据模型"},"K8sEventSearchReq":{"type":"object","properties":{"cluster_id":{"type":"integer","description":"集群ID"},"involved_object_kind":{"type":"string","description":"相关对象类型"},"involved_object_name":{"type":"string","description":"相关对象名称"},"keyword":{"type":"string","description":"搜索关键词"},"limit_days":{"type":"integer","description":"限制天数内的事件"},"namespace":{"type":"string","description":"命名空间"},"page":{"type":"integer","description":"页码"},"page_size":{"type":"integer","description":"每页大小"},"type":{"type":"string","description":"事件类型过滤"}},"required":["cluster_id"],"description":"K8sEventSearchReq数据模型"},"K8sEventStatistics":{"type":"object","properties":{"normal_events":{"type":"integer"},"top_reasons":{"type":"array","items":{"type":"string"}},"top_sources":{"type":"array","items":{"type":"string"}},"total_events":{"type":"integer"},"warning_events":{"type":"integer"}},"description":"K8sEventStatistics数据模型"},"K8sEventStatisticsReq":{"type":"object","properties":{"cluster_id":{"type":"integer","description":"集群ID"},"limit_days":{"type":"integer","description":"统计天数"},"namespace":{"type":"string","description":"命名空间"}},"required":["cluster_id"],"description":"K8sEventStatisticsReq数据模型"},"K8sEventTimelineItem":{"type":"object","properties":{"message":{"type":"string"},"object":{"type":"string"},"reason":{"type":"string"},"timestamp":{"type":"string","format":"date-time"},"type":{"type":"string"}},"description":"K8sEventTimelineItem数据模型"},"K8sEventTimelineReq":{"type":"object","properties":{"cluster_id":{"type":"integer","description":"集群ID"},"end_time":{"type":"string","description":"结束时间"},"granularity":{"type":"string","description":"时间粒度(hour/day)"},"involved_object_kind":{"type":"string","description":"相关对象类型"},"involved_object_name":{"type":"string","description":"相关对象名称"},"namespace":{"type":"string","description":"命名空间"},"start_time":{"type":"string","description":"开始时间"}},"required":["cluster_id"],"description":"K8sEventTimelineReq数据模型"},"K8sGetResourceListReq":{"type":"object","properties":{"cluster_id":{"type":"integer","description":"集群ID"},"continue":{"type":"string","description":"分页续订令牌"},"field_selector":{"type":"string","description":"字段选择器"},"label_selector":{"type":"string","description":"标签选择器"},"limit":{"type":"integer","description":"限制结果数量"},"namespace":{"type":"string","description":"命名空间"}},"required":["cluster_id"],"description":"K8sGetResourceListReq数据模型"},"K8sGetResourceReq":{"type":"object","properties":{"cluster_id":{"type":"integer","description":"集群ID"},"namespace":{"type":"string","description":"命名空间"},"resource_name":{"type":"string","description":"资源名称"}},"required":["cluster_id","namespace","resource_name"],"description":"K8sGetResourceReq数据模型"},"K8sGetResourceYamlReq":{"type":"object","properties":{"cluster_id":{"type":"integer","description":"集群ID"},"namespace":{"type":"string","description":"命名空间"},"resource_name":{"type":"string","description":"资源名称"}},"required":["cluster_id","namespace","resource_name"],"description":"K8sGetResourceYamlReq数据模型"},"K8sHTTPGetAction":{"type":"object","properties":{"path":{"type":"string","description":"探测路径"},"port":{"type":"integer","description":"探测端口号"},"scheme":{"type":"string","description":"协议类型"}},"required":["path","port"],"description":"K8sHTTPGetAction数据模型"},"K8sIngress":{"type":"object","properties":{"age":{"type":"string"},"annotations":{"type":"object","additionalProperties":true},"creation_timestamp":{"type":"string","format":"date-time"},"events":{"type":"array","items":{"type":"string"}},"ingress_class_name":{"type":"string"},"labels":{"type":"object","additionalProperties":true},"load_balancer":{"$ref":"#/definitions/IngressLoadBalancer"},"name":{"type":"string"},"namespace":{"type":"string"},"rules":{"type":"array","items":{"type":"string"}},"tls":{"type":"array","items":{"type":"string"}},"uid":{"type":"string"}},"description":"K8sIngress数据模型"},"K8sIngressBackendHealthReq":{"type":"object","properties":{"cluster_id":{"type":"integer","description":"集群ID"},"name":{"type":"string","description":"Ingress名称"},"namespace":{"type":"string","description":"命名空间"}},"required":["cluster_id","namespace","name"],"description":"K8sIngressBackendHealthReq数据模型"},"K8sIngressBatchDeleteReq":{"type":"object","properties":{"cluster_id":{"type":"integer","description":"集群ID"},"force":{"type":"boolean","description":"是否强制删除"},"grace_period_seconds":{"type":"object","description":"优雅删除时间(秒)"},"names":{"type":"array","items":{"type":"string"},"description":"Ingress名称列表"},"namespace":{"type":"string","description":"命名空间"}},"required":["cluster_id","namespace","names"],"description":"K8sIngressBatchDeleteReq数据模型"},"K8sIngressCreateReq":{"type":"object","properties":{"annotations":{"type":"object","description":"注解","additionalProperties":true},"cluster_id":{"type":"integer","description":"集群ID"},"ingress_class_name":{"type":"object","description":"Ingress类名"},"ingress_yaml":{"type":"object","description":"Ingress YAML对象"},"labels":{"type":"object","description":"标签","additionalProperties":true},"name":{"type":"string","description":"Ingress名称"},"namespace":{"type":"string","description":"命名空间"},"rules":{"type":"array","items":{"type":"string"},"description":"Ingress规则"},"tls":{"type":"array","items":{"type":"string"},"description":"TLS配置"}},"required":["cluster_id","namespace","name","rules"],"description":"K8sIngressCreateReq数据模型"},"K8sIngressDeleteReq":{"type":"object","properties":{"cluster_id":{"type":"integer","description":"集群ID"},"force":{"type":"boolean","description":"是否强制删除"},"grace_period_seconds":{"type":"object","description":"优雅删除时间(秒)"},"name":{"type":"string","description":"Ingress名称"},"namespace":{"type":"string","description":"命名空间"}},"required":["cluster_id","namespace","name"],"description":"K8sIngressDeleteReq数据模型"},"K8sIngressEntity":{"type":"object","properties":{"age":{"type":"string"},"annotations":{"type":"object","description":"注解","additionalProperties":true},"cluster_id":{"type":"integer","description":"所属集群ID"},"creation_timestamp":{"type":"string","format":"date-time","description":"Kubernetes创建时间"},"hosts":{"type":"array","items":{"type":"string"}},"ingress_class_name":{"type":"string","description":"Ingress类名"},"labels":{"type":"object","description":"标签","additionalProperties":true},"load_balancer":{"$ref":"#/definitions/IngressLoadBalancer","description":"负载均衡器信息"},"name":{"type":"string","description":"Ingress名称"},"namespace":{"type":"string","description":"所属命名空间"},"rules":{"type":"array","items":{"type":"string"},"description":"Ingress规则"},"status":{"type":"string"},"tls":{"type":"array","items":{"type":"string"},"description":"TLS配置"},"uid":{"type":"string","description":"Ingress UID"}},"required":["name","namespace"],"description":"K8sIngressEntity数据模型"},"K8sIngressEventReq":{"type":"object","properties":{"cluster_id":{"type":"integer","description":"集群ID"},"limit_days":{"type":"integer","description":"限制天数内的事件"},"name":{"type":"string","description":"Ingress名称"},"namespace":{"type":"string","description":"命名空间"}},"required":["cluster_id","namespace","name"],"description":"K8sIngressEventReq数据模型"},"K8sIngressListReq":{"type":"object","properties":{"cluster_id":{"type":"integer","description":"集群ID"},"field_selector":{"type":"string","description":"字段选择器"},"host":{"type":"string","description":"主机名过滤"},"ingress_class_name":{"type":"string","description":"Ingress类名"},"label_selector":{"type":"string","description":"标签选择器"},"namespace":{"type":"string","description":"命名空间"},"page":{"type":"integer","description":"页码"},"page_size":{"type":"integer","description":"每页大小"},"status":{"type":"string","description":"状态过滤"}},"required":["cluster_id"],"description":"K8sIngressListReq数据模型"},"K8sIngressUpdateReq":{"type":"object","properties":{"annotations":{"type":"object","description":"注解","additionalProperties":true},"cluster_id":{"type":"integer","description":"集群ID"},"ingress_class_name":{"type":"object","description":"Ingress类名"},"ingress_yaml":{"type":"object","description":"Ingress YAML对象"},"labels":{"type":"object","description":"标签","additionalProperties":true},"name":{"type":"string","description":"Ingress名称"},"namespace":{"type":"string","description":"命名空间"},"rules":{"type":"array","items":{"type":"string"},"description":"Ingress规则"},"tls":{"type":"array","items":{"type":"string"},"description":"TLS配置"}},"required":["cluster_id","namespace","name"],"description":"K8sIngressUpdateReq数据模型"},"K8sListReq":{"type":"object","properties":{"cluster_id":{"type":"integer","description":"集群ID"},"continue":{"type":"string","description":"分页续订令牌"},"field_selector":{"type":"string","description":"字段选择器"},"label_selector":{"type":"string","description":"标签选择器"},"limit":{"type":"integer","description":"限制结果数量"},"namespace":{"type":"string","description":"命名空间,为空则查询所有"}},"required":["cluster_id"],"description":"K8sListReq数据模型"},"K8sNamespace":{"type":"object","properties":{"annotations":{"type":"object","additionalProperties":true},"creation_timestamp":{"type":"string","format":"date-time"},"labels":{"type":"object","additionalProperties":true},"name":{"type":"string"},"resource_quota":{"type":"object"},"status":{"type":"string"},"uid":{"type":"string"}},"description":"K8sNamespace数据模型"},"K8sNamespaceBatchDeleteReq":{"type":"object","properties":{"cluster_id":{"type":"integer","description":"集群ID"},"force":{"type":"boolean","description":"是否强制删除"},"grace_period_seconds":{"type":"object","description":"优雅删除时间(秒)"},"names":{"type":"array","items":{"type":"string"},"description":"命名空间名称列表"}},"required":["cluster_id","names"],"description":"K8sNamespaceBatchDeleteReq数据模型"},"K8sNamespaceCreateReq":{"type":"object","properties":{"annotations":{"type":"object","description":"注解","additionalProperties":true},"cluster_id":{"type":"integer","description":"集群ID"},"labels":{"type":"object","description":"标签","additionalProperties":true},"name":{"type":"string","description":"命名空间名称"}},"required":["cluster_id","name"],"description":"K8sNamespaceCreateReq数据模型"},"K8sNamespaceDeleteReq":{"type":"object","properties":{"cluster_id":{"type":"integer","description":"集群ID"},"force":{"type":"boolean","description":"是否强制删除"},"grace_period_seconds":{"type":"object","description":"优雅删除时间(秒)"},"name":{"type":"string","description":"命名空间名称"}},"required":["cluster_id","name"],"description":"K8sNamespaceDeleteReq数据模型"},"K8sNamespaceEntity":{"type":"object","properties":{"age":{"type":"string"},"annotations":{"type":"object","description":"注解","additionalProperties":true},"cluster_id":{"type":"integer","description":"所属集群ID"},"creation_timestamp":{"type":"string","format":"date-time","description":"Kubernetes创建时间"},"labels":{"type":"object","description":"标签","additionalProperties":true},"name":{"type":"string","description":"命名空间名称"},"phase":{"type":"string","description":"命名空间阶段"},"resource_quota":{"type":"object","description":"资源配额"},"status":{"type":"string","description":"命名空间状态"},"uid":{"type":"string","description":"命名空间UID"}},"required":["name"],"description":"K8sNamespaceEntity数据模型"},"K8sNamespaceEventReq":{"type":"object","properties":{"cluster_id":{"type":"integer","description":"集群ID"},"limit_days":{"type":"integer","description":"限制天数内的事件"},"name":{"type":"string","description":"命名空间名称"}},"required":["cluster_id","name"],"description":"K8sNamespaceEventReq数据模型"},"K8sNamespaceListReq":{"type":"object","properties":{"cluster_id":{"type":"integer","description":"集群ID"},"field_selector":{"type":"string","description":"字段选择器"},"label_selector":{"type":"string","description":"标签选择器"},"page":{"type":"integer","description":"页码"},"page_size":{"type":"integer","description":"每页大小"},"status":{"type":"string","description":"状态过滤"}},"required":["cluster_id"],"description":"K8sNamespaceListReq数据模型"},"K8sNamespaceQuotaReq":{"type":"object","properties":{"cluster_id":{"type":"integer","description":"集群ID"},"name":{"type":"string","description":"命名空间名称"},"resource_quota":{"type":"object","description":"资源配额"}},"required":["cluster_id","name","resource_quota"],"description":"K8sNamespaceQuotaReq数据模型"},"K8sNamespaceResourceReq":{"type":"object","properties":{"cluster_id":{"type":"integer","description":"集群ID"},"name":{"type":"string","description":"命名空间名称"}},"required":["cluster_id","name"],"description":"K8sNamespaceResourceReq数据模型"},"K8sNamespaceUpdateReq":{"type":"object","properties":{"annotations":{"type":"object","description":"注解","additionalProperties":true},"cluster_id":{"type":"integer","description":"集群ID"},"labels":{"type":"object","description":"标签","additionalProperties":true},"name":{"type":"string","description":"命名空间名称"}},"required":["cluster_id","name"],"description":"K8sNamespaceUpdateReq数据模型"},"K8sNetworkPolicy":{"type":"object","properties":{"age":{"type":"string"},"annotations":{"type":"object","additionalProperties":true},"creation_timestamp":{"type":"string","format":"date-time"},"egress":{"type":"array","items":{"type":"string"}},"events":{"type":"array","items":{"type":"string"}},"ingress":{"type":"array","items":{"type":"string"}},"labels":{"type":"object","additionalProperties":true},"name":{"type":"string"},"namespace":{"type":"string"},"pod_selector":{"type":"object","additionalProperties":true},"policy_types":{"type":"array","items":{"type":"string"}},"uid":{"type":"string"}},"description":"K8sNetworkPolicy数据模型"},"K8sNode":{"type":"object","properties":{"age":{"type":"string","description":"节点存在时间,例如 5d"},"annotation":{"type":"object","description":"注解键值对映射","additionalProperties":true},"cluster_id":{"type":"integer","description":"所属集群ID"},"conditions":{"type":"array","items":{"type":"string"}},"cpu_cores":{"type":"string","description":"CPU 核心信息,例如 2/4"},"cpu_limit_info":{"type":"string","description":"CPU 限制信息,例如 1/2"},"cpu_request_info":{"type":"string","description":"CPU 请求信息,例如 500m/2"},"cpu_usage_info":{"type":"string","description":"CPU 使用信息,例如 300m/2 (15%)"},"created_at":{"type":"string","format":"date-time","description":"创建时间"},"cri_version":{"type":"string","description":"容器运行时接口版本"},"ephemeral_storage":{"type":"string","description":"临时存储信息,例如 100Gi/200Gi"},"events":{"type":"array","items":{"type":"string"}},"ip":{"type":"string","description":"节点内部IP"},"kernel_version":{"type":"string","description":"内核版本"},"kubelet_version":{"type":"string","description":"Kubelet 版本"},"label_pairs":{"type":"object","additionalProperties":true},"labels":{"type":"array","items":{"type":"string"},"description":"节点标签列表"},"labels_front":{"type":"string"},"mem_gibs":{"type":"string","description":"内存信息,例如 8Gi/16Gi"},"memory_limit_info":{"type":"string","description":"内存限制信息,例如 2Gi/8Gi"},"memory_request_info":{"type":"string","description":"内存请求信息,例如 1Gi/8Gi"},"memory_usage_info":{"type":"string","description":"内存使用信息,例如 1.5Gi/8Gi (18.75%)"},"name":{"type":"string","description":"节点名称"},"os_version":{"type":"string","description":"操作系统版本"},"pod_num":{"type":"integer","description":"节点上的 Pod 数量"},"pod_num_info":{"type":"string","description":"Pod 数量信息,例如 10/50 (20%)"},"roles":{"type":"array","items":{"type":"string"},"description":"节点角色,例如 master, worker"},"schedule_enable":{"type":"boolean","description":"节点是否可调度"},"status":{"type":"string","description":"节点状态,例如 Ready, NotReady, SchedulingDisabled"},"taints":{"type":"array","items":{"type":"string"}},"taints_front":{"type":"string"},"updated_at":{"type":"string","format":"date-time","description":"更新时间"}},"required":["name"],"description":"K8sNode数据模型"},"K8sObjectRequest":{"type":"object","properties":{"cluster":{"type":"string"},"name":{"type":"string"},"namespace":{"type":"string"}},"description":"K8sObjectRequest数据模型"},"K8sPVBackupReq":{"type":"object","properties":{"backup_name":{"type":"string","description":"备份名称"},"cluster_id":{"type":"integer","description":"集群ID"},"description":{"type":"string","description":"备份描述"},"names":{"type":"array","items":{"type":"string"},"description":"PV名称列表"}},"required":["cluster_id","names","backup_name"],"description":"K8sPVBackupReq数据模型"},"K8sPVBatchDeleteReq":{"type":"object","properties":{"cluster_id":{"type":"integer","description":"集群ID"},"force":{"type":"boolean","description":"是否强制删除"},"grace_period_seconds":{"type":"object","description":"优雅删除时间(秒)"},"names":{"type":"array","items":{"type":"string"},"description":"PV名称列表"}},"required":["cluster_id","names"],"description":"K8sPVBatchDeleteReq数据模型"},"K8sPVCBackupReq":{"type":"object","properties":{"backup_name":{"type":"string","description":"备份名称"},"cluster_id":{"type":"integer","description":"集群ID"},"description":{"type":"string","description":"备份描述"},"names":{"type":"array","items":{"type":"string"},"description":"PVC名称列表"},"namespace":{"type":"string","description":"命名空间"}},"required":["cluster_id","namespace","names","backup_name"],"description":"K8sPVCBackupReq数据模型"},"K8sPVCBatchDeleteReq":{"type":"object","properties":{"cluster_id":{"type":"integer","description":"集群ID"},"force":{"type":"boolean","description":"是否强制删除"},"grace_period_seconds":{"type":"object","description":"优雅删除时间(秒)"},"names":{"type":"array","items":{"type":"string"},"description":"PVC名称列表"},"namespace":{"type":"string","description":"命名空间"}},"required":["cluster_id","namespace","names"],"description":"K8sPVCBatchDeleteReq数据模型"},"K8sPVCCloneReq":{"type":"object","properties":{"cluster_id":{"type":"integer","description":"集群ID"},"description":{"type":"string","description":"克隆描述"},"namespace":{"type":"string","description":"命名空间"},"source_name":{"type":"string","description":"源PVC名称"},"target_name":{"type":"string","description":"目标PVC名称"}},"required":["cluster_id","namespace","source_name","target_name"],"description":"K8sPVCCloneReq数据模型"},"K8sPVCCreateReq":{"type":"object","properties":{"access_modes":{"type":"array","items":{"type":"string"},"description":"访问模式"},"annotations":{"type":"object","description":"注解","additionalProperties":true},"cluster_id":{"type":"integer","description":"集群ID"},"labels":{"type":"object","description":"标签","additionalProperties":true},"name":{"type":"string","description":"PVC名称"},"namespace":{"type":"string","description":"命名空间"},"pvc_yaml":{"type":"object","description":"PVC YAML对象"},"request_storage":{"type":"string","description":"请求存储"},"selector":{"type":"object","description":"选择器","additionalProperties":true},"storage_class":{"type":"string","description":"存储类"},"volume_mode":{"type":"string","description":"卷模式"},"volume_name":{"type":"string","description":"指定PV名称"}},"required":["cluster_id","namespace","name","request_storage","access_modes"],"description":"K8sPVCCreateReq数据模型"},"K8sPVCDeleteReq":{"type":"object","properties":{"cluster_id":{"type":"integer","description":"集群ID"},"force":{"type":"boolean","description":"是否强制删除"},"grace_period_seconds":{"type":"object","description":"优雅删除时间(秒)"},"name":{"type":"string","description":"PVC名称"},"namespace":{"type":"string","description":"命名空间"}},"required":["cluster_id","namespace","name"],"description":"K8sPVCDeleteReq数据模型"},"K8sPVCEntity":{"type":"object","properties":{"access_modes":{"type":"array","items":{"type":"string"},"description":"访问模式"},"age":{"type":"string"},"annotations":{"type":"object","description":"注解","additionalProperties":true},"available_capacity":{"type":"string"},"capacity":{"type":"string","description":"存储容量"},"cluster_id":{"type":"integer","description":"所属集群ID"},"creation_timestamp":{"type":"string","format":"date-time","description":"Kubernetes创建时间"},"labels":{"type":"object","description":"标签","additionalProperties":true},"name":{"type":"string","description":"PVC名称"},"namespace":{"type":"string","description":"所属命名空间"},"request_storage":{"type":"string","description":"请求存储"},"selector":{"type":"object","description":"选择器","additionalProperties":true},"status":{"type":"string","description":"PVC状态"},"storage_class":{"type":"string","description":"存储类"},"uid":{"type":"string","description":"PVC UID"},"used_capacity":{"type":"string"},"volume_mode":{"type":"string","description":"卷模式"},"volume_name":{"type":"string","description":"绑定的PV名称"}},"required":["name","namespace"],"description":"K8sPVCEntity数据模型"},"K8sPVCEventReq":{"type":"object","properties":{"cluster_id":{"type":"integer","description":"集群ID"},"limit_days":{"type":"integer","description":"限制天数内的事件"},"name":{"type":"string","description":"PVC名称"},"namespace":{"type":"string","description":"命名空间"}},"required":["cluster_id","namespace","name"],"description":"K8sPVCEventReq数据模型"},"K8sPVCExpandReq":{"type":"object","properties":{"cluster_id":{"type":"integer","description":"集群ID"},"name":{"type":"string","description":"PVC名称"},"namespace":{"type":"string","description":"命名空间"},"new_capacity":{"type":"string","description":"新容量"}},"required":["cluster_id","namespace","name","new_capacity"],"description":"K8sPVCExpandReq数据模型"},"K8sPVCListReq":{"type":"object","properties":{"access_mode":{"type":"string","description":"访问模式过滤"},"cluster_id":{"type":"integer","description":"集群ID"},"field_selector":{"type":"string","description":"字段选择器"},"label_selector":{"type":"string","description":"标签选择器"},"namespace":{"type":"string","description":"命名空间"},"page":{"type":"integer","description":"页码"},"page_size":{"type":"integer","description":"每页大小"},"status":{"type":"string","description":"PVC状态过滤"},"storage_class":{"type":"string","description":"存储类过滤"},"volume_name":{"type":"string","description":"PV名称过滤"}},"required":["cluster_id"],"description":"K8sPVCListReq数据模型"},"K8sPVCSnapshotReq":{"type":"object","properties":{"cluster_id":{"type":"integer","description":"集群ID"},"description":{"type":"string","description":"快照描述"},"namespace":{"type":"string","description":"命名空间"},"pvc_name":{"type":"string","description":"PVC名称"},"snapshot_name":{"type":"string","description":"快照名称"}},"required":["cluster_id","namespace","pvc_name","snapshot_name"],"description":"K8sPVCSnapshotReq数据模型"},"K8sPVCUpdateReq":{"type":"object","properties":{"access_modes":{"type":"array","items":{"type":"string"},"description":"访问模式"},"annotations":{"type":"object","description":"注解","additionalProperties":true},"cluster_id":{"type":"integer","description":"集群ID"},"labels":{"type":"object","description":"标签","additionalProperties":true},"name":{"type":"string","description":"PVC名称"},"namespace":{"type":"string","description":"命名空间"},"pvc_yaml":{"type":"object","description":"PVC YAML对象"},"request_storage":{"type":"string","description":"请求存储"},"selector":{"type":"object","description":"选择器","additionalProperties":true},"storage_class":{"type":"string","description":"存储类"},"volume_mode":{"type":"string","description":"卷模式"},"volume_name":{"type":"string","description":"指定PV名称"}},"required":["cluster_id","namespace","name"],"description":"K8sPVCUpdateReq数据模型"},"K8sPVCUsageInfo":{"type":"object","properties":{"available":{"type":"string"},"total":{"type":"string"},"usage_rate":{"type":"number"},"used":{"type":"string"}},"description":"K8sPVCUsageInfo数据模型"},"K8sPVCUsageReq":{"type":"object","properties":{"cluster_id":{"type":"integer","description":"集群ID"},"name":{"type":"string","description":"PVC名称"},"namespace":{"type":"string","description":"命名空间"}},"required":["cluster_id","namespace","name"],"description":"K8sPVCUsageReq数据模型"},"K8sPVCreateReq":{"type":"object","properties":{"access_modes":{"type":"array","items":{"type":"string"},"description":"访问模式"},"annotations":{"type":"object","description":"注解","additionalProperties":true},"capacity":{"type":"string","description":"存储容量"},"cluster_id":{"type":"integer","description":"集群ID"},"labels":{"type":"object","description":"标签","additionalProperties":true},"name":{"type":"string","description":"PV名称"},"node_affinity":{"type":"object","description":"节点亲和性","additionalProperties":true},"pv_yaml":{"type":"object","description":"PV YAML对象"},"reclaim_policy":{"type":"string","description":"回收策略"},"storage_class":{"type":"string","description":"存储类"},"volume_mode":{"type":"string","description":"卷模式"},"volume_source":{"type":"object","description":"卷源配置","additionalProperties":true}},"required":["cluster_id","name","capacity","access_modes","volume_source"],"description":"K8sPVCreateReq数据模型"},"K8sPVDeleteReq":{"type":"object","properties":{"cluster_id":{"type":"integer","description":"集群ID"},"force":{"type":"boolean","description":"是否强制删除"},"grace_period_seconds":{"type":"object","description":"优雅删除时间(秒)"},"name":{"type":"string","description":"PV名称"}},"required":["cluster_id","name"],"description":"K8sPVDeleteReq数据模型"},"K8sPVEntity":{"type":"object","properties":{"access_modes":{"type":"array","items":{"type":"string"},"description":"访问模式"},"age":{"type":"string"},"annotations":{"type":"object","description":"注解","additionalProperties":true},"available_capacity":{"type":"string"},"capacity":{"type":"string","description":"存储容量"},"claim_ref":{"type":"object","description":"PVC引用","additionalProperties":true},"cluster_id":{"type":"integer","description":"所属集群ID"},"creation_timestamp":{"type":"string","format":"date-time","description":"Kubernetes创建时间"},"labels":{"type":"object","description":"标签","additionalProperties":true},"name":{"type":"string","description":"PV名称"},"node_affinity":{"type":"object","description":"节点亲和性","additionalProperties":true},"reclaim_policy":{"type":"string","description":"回收策略"},"status":{"type":"string","description":"PV状态"},"storage_class":{"type":"string","description":"存储类"},"uid":{"type":"string","description":"PV UID"},"used_capacity":{"type":"string"},"volume_mode":{"type":"string","description":"卷模式"},"volume_source":{"type":"object","description":"卷源配置","additionalProperties":true},"volume_type":{"type":"string"}},"required":["name"],"description":"K8sPVEntity数据模型"},"K8sPVEventReq":{"type":"object","properties":{"cluster_id":{"type":"integer","description":"集群ID"},"limit_days":{"type":"integer","description":"限制天数内的事件"},"name":{"type":"string","description":"PV名称"}},"required":["cluster_id","name"],"description":"K8sPVEventReq数据模型"},"K8sPVExpandReq":{"type":"object","properties":{"cluster_id":{"type":"integer","description":"集群ID"},"name":{"type":"string","description":"PV名称"},"new_capacity":{"type":"string","description":"新容量"}},"required":["cluster_id","name","new_capacity"],"description":"K8sPVExpandReq数据模型"},"K8sPVListReq":{"type":"object","properties":{"access_mode":{"type":"string","description":"访问模式过滤"},"cluster_id":{"type":"integer","description":"集群ID"},"field_selector":{"type":"string","description":"字段选择器"},"label_selector":{"type":"string","description":"标签选择器"},"page":{"type":"integer","description":"页码"},"page_size":{"type":"integer","description":"每页大小"},"status":{"type":"string","description":"PV状态过滤"},"storage_class":{"type":"string","description":"存储类过滤"},"volume_type":{"type":"string","description":"卷类型过滤"}},"required":["cluster_id"],"description":"K8sPVListReq数据模型"},"K8sPVReclaimReq":{"type":"object","properties":{"cluster_id":{"type":"integer","description":"集群ID"},"name":{"type":"string","description":"PV名称"}},"required":["cluster_id","name"],"description":"K8sPVReclaimReq数据模型"},"K8sPVUpdateReq":{"type":"object","properties":{"access_modes":{"type":"array","items":{"type":"string"},"description":"访问模式"},"annotations":{"type":"object","description":"注解","additionalProperties":true},"capacity":{"type":"string","description":"存储容量"},"cluster_id":{"type":"integer","description":"集群ID"},"labels":{"type":"object","description":"标签","additionalProperties":true},"name":{"type":"string","description":"PV名称"},"node_affinity":{"type":"object","description":"节点亲和性","additionalProperties":true},"pv_yaml":{"type":"object","description":"PV YAML对象"},"reclaim_policy":{"type":"string","description":"回收策略"},"storage_class":{"type":"string","description":"存储类"},"volume_mode":{"type":"string","description":"卷模式"},"volume_source":{"type":"object","description":"卷源配置","additionalProperties":true}},"required":["cluster_id","name"],"description":"K8sPVUpdateReq数据模型"},"K8sPVUsageInfo":{"type":"object","properties":{"available":{"type":"string"},"total":{"type":"string"},"usage_rate":{"type":"number"},"used":{"type":"string"}},"description":"K8sPVUsageInfo数据模型"},"K8sPVUsageReq":{"type":"object","properties":{"cluster_id":{"type":"integer","description":"集群ID"},"name":{"type":"string","description":"PV名称"}},"required":["cluster_id","name"],"description":"K8sPVUsageReq数据模型"},"K8sPersistentVolume":{"type":"object","properties":{"access_modes":{"type":"array","items":{"type":"string"}},"age":{"type":"string"},"annotations":{"type":"object","additionalProperties":true},"capacity":{"type":"string"},"claim":{"type":"object"},"creation_timestamp":{"type":"string","format":"date-time"},"events":{"type":"array","items":{"type":"string"}},"labels":{"type":"object","additionalProperties":true},"mount_options":{"type":"array","items":{"type":"string"}},"name":{"type":"string"},"node_affinity":{"type":"object"},"reclaim_policy":{"type":"string"},"status":{"type":"string"},"storage_class":{"type":"string"},"uid":{"type":"string"},"volume_source":{"type":"string"}},"description":"K8sPersistentVolume数据模型"},"K8sPersistentVolumeClaim":{"type":"object","properties":{"access_modes":{"type":"array","items":{"type":"string"}},"age":{"type":"string"},"annotations":{"type":"object","additionalProperties":true},"capacity":{"type":"string"},"creation_timestamp":{"type":"string","format":"date-time"},"events":{"type":"array","items":{"type":"string"}},"labels":{"type":"object","additionalProperties":true},"name":{"type":"string"},"namespace":{"type":"string"},"status":{"type":"string"},"storage_class":{"type":"string"},"uid":{"type":"string"},"volume":{"type":"string"},"volume_mode":{"type":"string"}},"description":"K8sPersistentVolumeClaim数据模型"},"K8sPod":{"type":"object","properties":{"annotations":{"type":"object","description":"Pod 注解键值对","additionalProperties":true},"containers":{"type":"array","items":{"type":"string"}},"labels":{"type":"object","description":"Pod 标签键值对","additionalProperties":true},"name":{"type":"string","description":"Pod 名称"},"namespace":{"type":"string","description":"Pod 所属的命名空间"},"node_name":{"type":"string","description":"Pod 所在节点名称"},"status":{"type":"string","description":"Pod 状态,例如 Running, Pending"}},"required":["name","namespace"],"description":"K8sPod数据模型"},"K8sPodContainer":{"type":"object","properties":{"args":{"type":"object","description":"启动参数,空格分隔"},"command":{"type":"object","description":"启动命令组"},"envs":{"type":"array","items":{"type":"string"},"description":"环境变量组"},"image":{"type":"string","description":"容器镜像"},"image_pull_policy":{"type":"string","description":"镜像拉取策略"},"liveness_probe":{"type":"object","description":"存活探测配置"},"name":{"type":"string","description":"容器名称"},"ports":{"type":"array","items":{"type":"string"},"description":"容器端口配置"},"readiness_probe":{"type":"object","description":"就绪探测配置"},"resources":{"$ref":"#/definitions/ResourceRequirements","description":"资源请求与限制"},"volume_mounts":{"type":"array","items":{"type":"string"},"description":"卷挂载配置"}},"required":["name","image"],"description":"K8sPodContainer数据模型"},"K8sPodListResponse":{"type":"object","properties":{"pods":{"type":"array","items":{"type":"string"}},"total_count":{"type":"integer"}},"description":"K8sPodListResponse数据模型"},"K8sPodReq":{"type":"object","properties":{"cluster_id":{"type":"integer"},"pod":{"type":"object"}},"required":["cluster_id"],"description":"K8sPodReq数据模型"},"K8sPodResponse":{"type":"object","properties":{"age":{"type":"string"},"annotations":{"type":"object","additionalProperties":true},"containers":{"type":"array","items":{"type":"string"}},"creation_timestamp":{"type":"string","format":"date-time"},"events":{"type":"array","items":{"type":"string"}},"host_ip":{"type":"string"},"labels":{"type":"object","additionalProperties":true},"name":{"type":"string"},"namespace":{"type":"string"},"node_name":{"type":"string"},"owner_references":{"type":"array","items":{"type":"string"}},"phase":{"type":"string"},"pod_ip":{"type":"string"},"restart_count":{"type":"integer"},"status":{"type":"string"},"uid":{"type":"string"}},"description":"K8sPodResponse数据模型"},"K8sProbe":{"type":"object","properties":{"failure_threshold":{"type":"integer","description":"探测失败阈值"},"http_get":{"type":"object","description":"HTTP GET 探测配置"},"initial_delay_seconds":{"type":"integer","description":"探测初始延迟时间(秒)"},"period_seconds":{"type":"integer","description":"探测间隔时间(秒)"},"success_threshold":{"type":"integer","description":"探测成功阈值"},"timeout_seconds":{"type":"integer","description":"探测超时时间(秒)"}},"description":"K8sProbe数据模型"},"K8sRequestItem":{"type":"object","properties":{"name":{"type":"string"},"namespace":{"type":"string"}},"description":"K8sRequestItem数据模型"},"K8sResourceHistory":{"type":"object","properties":{"annotations":{"type":"object","additionalProperties":true},"change_cause":{"type":"string"},"change_time":{"type":"string","format":"date-time"},"config_changes":{"type":"string"},"labels":{"type":"object","additionalProperties":true},"namespace":{"type":"string"},"resource_name":{"type":"string"},"resource_type":{"type":"string"},"revision":{"type":"integer"},"status":{"type":"string"}},"description":"K8sResourceHistory数据模型"},"K8sResourceIdentifierReq":{"type":"object","properties":{"resource_name":{"type":"string","description":"资源名称"}},"required":["resource_name"],"description":"K8sResourceIdentifierReq数据模型"},"K8sResourceList":{"type":"object","properties":{"cpu":{"type":"string","description":"CPU 数量,例如 '500m', '2'"},"memory":{"type":"string","description":"内存数量,例如 '1Gi', '512Mi'"}},"description":"K8sResourceList数据模型"},"K8sSecret":{"type":"object","properties":{"age":{"type":"string"},"annotations":{"type":"object","additionalProperties":true},"creation_timestamp":{"type":"string","format":"date-time"},"data":{"type":"object","additionalProperties":true},"events":{"type":"array","items":{"type":"string"}},"labels":{"type":"object","additionalProperties":true},"name":{"type":"string"},"namespace":{"type":"string"},"string_data":{"type":"object","additionalProperties":true},"type":{"type":"string"},"uid":{"type":"string"}},"description":"K8sSecret数据模型"},"K8sSecretBackupReq":{"type":"object","properties":{"backup_name":{"type":"string","description":"备份名称"},"cluster_id":{"type":"integer","description":"集群ID"},"description":{"type":"string","description":"备份描述"},"names":{"type":"array","items":{"type":"string"},"description":"Secret名称列表"},"namespace":{"type":"string","description":"命名空间"}},"required":["cluster_id","namespace","names","backup_name"],"description":"K8sSecretBackupReq数据模型"},"K8sSecretBatchDeleteReq":{"type":"object","properties":{"cluster_id":{"type":"integer","description":"集群ID"},"force":{"type":"boolean","description":"是否强制删除"},"grace_period_seconds":{"type":"object","description":"优雅删除时间(秒)"},"names":{"type":"array","items":{"type":"string"},"description":"Secret名称列表"},"namespace":{"type":"string","description":"命名空间"}},"required":["cluster_id","namespace","names"],"description":"K8sSecretBatchDeleteReq数据模型"},"K8sSecretCreateReq":{"type":"object","properties":{"annotations":{"type":"object","description":"注解","additionalProperties":true},"cluster_id":{"type":"integer","description":"集群ID"},"data":{"type":"object","description":"加密数据","additionalProperties":true},"labels":{"type":"object","description":"标签","additionalProperties":true},"name":{"type":"string","description":"Secret名称"},"namespace":{"type":"string","description":"命名空间"},"secret_yaml":{"type":"object","description":"Secret YAML对象"},"string_data":{"type":"object","description":"明文数据","additionalProperties":true},"type":{"type":"string","description":"Secret类型"}},"required":["cluster_id","namespace","name"],"description":"K8sSecretCreateReq数据模型"},"K8sSecretDataReq":{"type":"object","properties":{"cluster_id":{"type":"integer","description":"集群ID"},"decode":{"type":"boolean","description":"是否解码数据"},"key":{"type":"string","description":"数据键,为空则获取所有"},"name":{"type":"string","description":"Secret名称"},"namespace":{"type":"string","description":"命名空间"}},"required":["cluster_id","namespace","name"],"description":"K8sSecretDataReq数据模型"},"K8sSecretDeleteReq":{"type":"object","properties":{"cluster_id":{"type":"integer","description":"集群ID"},"force":{"type":"boolean","description":"是否强制删除"},"grace_period_seconds":{"type":"object","description":"优雅删除时间(秒)"},"name":{"type":"string","description":"Secret名称"},"namespace":{"type":"string","description":"命名空间"}},"required":["cluster_id","namespace","name"],"description":"K8sSecretDeleteReq数据模型"},"K8sSecretEntity":{"type":"object","properties":{"age":{"type":"string"},"annotations":{"type":"object","description":"注解","additionalProperties":true},"cluster_id":{"type":"integer","description":"所属集群ID"},"creation_timestamp":{"type":"string","format":"date-time","description":"Kubernetes创建时间"},"data":{"type":"object","description":"加密数据","additionalProperties":true},"data_count":{"type":"integer"},"labels":{"type":"object","description":"标签","additionalProperties":true},"name":{"type":"string","description":"Secret名称"},"namespace":{"type":"string","description":"所属命名空间"},"size":{"type":"string"},"string_data":{"type":"object","description":"明文数据","additionalProperties":true},"type":{"type":"string","description":"Secret类型"},"uid":{"type":"string","description":"Secret UID"}},"required":["name","namespace"],"description":"K8sSecretEntity数据模型"},"K8sSecretEventReq":{"type":"object","properties":{"cluster_id":{"type":"integer","description":"集群ID"},"limit_days":{"type":"integer","description":"限制天数内的事件"},"name":{"type":"string","description":"Secret名称"},"namespace":{"type":"string","description":"命名空间"}},"required":["cluster_id","namespace","name"],"description":"K8sSecretEventReq数据模型"},"K8sSecretListReq":{"type":"object","properties":{"cluster_id":{"type":"integer","description":"集群ID"},"data_key":{"type":"string","description":"数据键过滤"},"field_selector":{"type":"string","description":"字段选择器"},"label_selector":{"type":"string","description":"标签选择器"},"namespace":{"type":"string","description":"命名空间"},"page":{"type":"integer","description":"页码"},"page_size":{"type":"integer","description":"每页大小"},"status":{"type":"string","description":"状态过滤"},"type":{"type":"string","description":"Secret类型过滤"}},"required":["cluster_id"],"description":"K8sSecretListReq数据模型"},"K8sSecretUpdateReq":{"type":"object","properties":{"annotations":{"type":"object","description":"注解","additionalProperties":true},"cluster_id":{"type":"integer","description":"集群ID"},"data":{"type":"object","description":"加密数据","additionalProperties":true},"labels":{"type":"object","description":"标签","additionalProperties":true},"name":{"type":"string","description":"Secret名称"},"namespace":{"type":"string","description":"命名空间"},"secret_yaml":{"type":"object","description":"Secret YAML对象"},"string_data":{"type":"object","description":"明文数据","additionalProperties":true}},"required":["cluster_id","namespace","name"],"description":"K8sSecretUpdateReq数据模型"},"K8sSecretUsageReq":{"type":"object","properties":{"cluster_id":{"type":"integer","description":"集群ID"},"name":{"type":"string","description":"Secret名称"},"namespace":{"type":"string","description":"命名空间"}},"required":["cluster_id","namespace","name"],"description":"K8sSecretUsageReq数据模型"},"K8sService":{"type":"object","properties":{"age":{"type":"string"},"annotations":{"type":"object","additionalProperties":true},"cluster_ip":{"type":"string"},"creation_timestamp":{"type":"string","format":"date-time"},"events":{"type":"array","items":{"type":"string"}},"external_ips":{"type":"array","items":{"type":"string"}},"labels":{"type":"object","additionalProperties":true},"load_balancer_ip":{"type":"string"},"name":{"type":"string"},"namespace":{"type":"string"},"ports":{"type":"array","items":{"type":"string"}},"selector":{"type":"object","additionalProperties":true},"type":{"type":"string"},"uid":{"type":"string"}},"description":"K8sService数据模型"},"K8sServiceAccountResponse":{"type":"object","properties":{"age":{"type":"string"},"annotations":{"type":"object","additionalProperties":true},"automount_service_account_token":{"type":"object"},"ca_cert":{"type":"string"},"cluster_id":{"type":"integer"},"creation_timestamp":{"type":"string","format":"date-time"},"image_pull_secrets":{"type":"array","items":{"type":"string"}},"image_pull_secrets_count":{"type":"integer"},"labels":{"type":"object","additionalProperties":true},"name":{"type":"string"},"namespace":{"type":"string"},"secrets":{"type":"array","items":{"type":"string"}},"secrets_count":{"type":"integer"},"token":{"type":"string"},"uid":{"type":"string"}},"description":"K8sServiceAccountResponse数据模型"},"K8sServiceBatchDeleteReq":{"type":"object","properties":{"cluster_id":{"type":"integer","description":"集群ID"},"force":{"type":"boolean","description":"是否强制删除"},"grace_period_seconds":{"type":"object","description":"优雅删除时间(秒)"},"names":{"type":"array","items":{"type":"string"},"description":"Service名称列表"},"namespace":{"type":"string","description":"命名空间"}},"required":["cluster_id","namespace","names"],"description":"K8sServiceBatchDeleteReq数据模型"},"K8sServiceCreateReq":{"type":"object","properties":{"annotations":{"type":"object","description":"注解","additionalProperties":true},"cluster_id":{"type":"integer","description":"集群ID"},"labels":{"type":"object","description":"标签","additionalProperties":true},"name":{"type":"string","description":"Service名称"},"namespace":{"type":"string","description":"命名空间"},"ports":{"type":"array","items":{"type":"string"},"description":"服务端口"},"selector":{"type":"object","description":"Pod选择器","additionalProperties":true},"service_yaml":{"type":"object","description":"Service YAML对象"},"type":{"type":"string","description":"Service类型"}},"required":["cluster_id","namespace","name","ports"],"description":"K8sServiceCreateReq数据模型"},"K8sServiceDeleteReq":{"type":"object","properties":{"cluster_id":{"type":"integer","description":"集群ID"},"force":{"type":"boolean","description":"是否强制删除"},"grace_period_seconds":{"type":"object","description":"优雅删除时间(秒)"},"name":{"type":"string","description":"Service名称"},"namespace":{"type":"string","description":"命名空间"}},"required":["cluster_id","namespace","name"],"description":"K8sServiceDeleteReq数据模型"},"K8sServiceEndpointsReq":{"type":"object","properties":{"cluster_id":{"type":"integer","description":"集群ID"},"name":{"type":"string","description":"Service名称"},"namespace":{"type":"string","description":"命名空间"}},"required":["cluster_id","namespace","name"],"description":"K8sServiceEndpointsReq数据模型"},"K8sServiceEntity":{"type":"object","properties":{"age":{"type":"string"},"annotations":{"type":"object","description":"注解","additionalProperties":true},"cluster_id":{"type":"integer","description":"所属集群ID"},"cluster_ip":{"type":"string","description":"集群内部IP"},"creation_timestamp":{"type":"string","format":"date-time","description":"Kubernetes创建时间"},"endpoints":{"type":"array","items":{"type":"string"}},"external_ips":{"type":"array","items":{"type":"string"},"description":"外部IP列表"},"labels":{"type":"object","description":"标签","additionalProperties":true},"load_balancer_ip":{"type":"string","description":"负载均衡器IP"},"name":{"type":"string","description":"Service名称"},"namespace":{"type":"string","description":"所属命名空间"},"ports":{"type":"array","items":{"type":"string"},"description":"端口配置"},"selector":{"type":"object","description":"Pod选择器","additionalProperties":true},"status":{"type":"string"},"type":{"type":"string","description":"Service类型"},"uid":{"type":"string","description":"Service UID"}},"required":["name","namespace"],"description":"K8sServiceEntity数据模型"},"K8sServiceEventReq":{"type":"object","properties":{"cluster_id":{"type":"integer","description":"集群ID"},"limit_days":{"type":"integer","description":"限制天数内的事件"},"name":{"type":"string","description":"Service名称"},"namespace":{"type":"string","description":"命名空间"}},"required":["cluster_id","namespace","name"],"description":"K8sServiceEventReq数据模型"},"K8sServiceListReq":{"type":"object","properties":{"cluster_id":{"type":"integer","description":"集群ID"},"field_selector":{"type":"string","description":"字段选择器"},"label_selector":{"type":"string","description":"标签选择器"},"namespace":{"type":"string","description":"命名空间"},"page":{"type":"integer","description":"页码"},"page_size":{"type":"integer","description":"每页大小"},"status":{"type":"string","description":"状态过滤"},"type":{"type":"string","description":"Service类型过滤"}},"required":["cluster_id"],"description":"K8sServiceListReq数据模型"},"K8sServicePortForwardReq":{"type":"object","properties":{"cluster_id":{"type":"integer","description":"集群ID"},"name":{"type":"string","description":"Service名称"},"namespace":{"type":"string","description":"命名空间"},"ports":{"type":"array","items":{"type":"string"},"description":"端口转发配置"}},"required":["cluster_id","namespace","name","ports"],"description":"K8sServicePortForwardReq数据模型"},"K8sServiceReq":{"type":"object","properties":{"cluster_id":{"type":"integer"},"namespace":{"type":"string"},"service_names":{"type":"array","items":{"type":"string"}},"service_yaml":{"type":"object"}},"required":["cluster_id"],"description":"K8sServiceReq数据模型"},"K8sServiceUpdateReq":{"type":"object","properties":{"annotations":{"type":"object","description":"注解","additionalProperties":true},"cluster_id":{"type":"integer","description":"集群ID"},"labels":{"type":"object","description":"标签","additionalProperties":true},"name":{"type":"string","description":"Service名称"},"namespace":{"type":"string","description":"命名空间"},"ports":{"type":"array","items":{"type":"string"},"description":"服务端口"},"selector":{"type":"object","description":"Pod选择器","additionalProperties":true},"service_yaml":{"type":"object","description":"Service YAML对象"},"type":{"type":"string","description":"Service类型"}},"required":["cluster_id","namespace","name"],"description":"K8sServiceUpdateReq数据模型"},"K8sStatefulSet":{"type":"object","properties":{"age":{"type":"string"},"annotations":{"type":"object","additionalProperties":true},"creation_timestamp":{"type":"string","format":"date-time"},"current_replicas":{"type":"integer"},"events":{"type":"array","items":{"type":"string"}},"images":{"type":"array","items":{"type":"string"}},"labels":{"type":"object","additionalProperties":true},"name":{"type":"string"},"namespace":{"type":"string"},"ready_replicas":{"type":"integer"},"replicas":{"type":"integer"},"service_name":{"type":"string"},"uid":{"type":"string"},"update_strategy":{"type":"string"},"updated_replicas":{"type":"integer"}},"description":"K8sStatefulSet数据模型"},"K8sStatefulSetBatchDeleteReq":{"type":"object","properties":{"cluster_id":{"type":"integer","description":"集群ID"},"force":{"type":"boolean","description":"是否强制删除"},"grace_period_seconds":{"type":"object","description":"优雅删除时间(秒)"},"names":{"type":"array","items":{"type":"string"},"description":"StatefulSet名称列表"},"namespace":{"type":"string","description":"命名空间"},"orphan_dependents":{"type":"boolean","description":"是否保留依赖资源"}},"required":["cluster_id","namespace","names"],"description":"K8sStatefulSetBatchDeleteReq数据模型"},"K8sStatefulSetCreateReq":{"type":"object","properties":{"annotations":{"type":"object","description":"注解","additionalProperties":true},"cluster_id":{"type":"integer","description":"集群ID"},"labels":{"type":"object","description":"标签","additionalProperties":true},"name":{"type":"string","description":"StatefulSet名称"},"namespace":{"type":"string","description":"命名空间"},"pod_management_policy":{"type":"string","description":"Pod管理策略"},"pod_template":{"type":"object","description":"Pod模板","additionalProperties":true},"replicas":{"type":"integer","description":"副本数"},"revision_history_limit":{"type":"object","description":"历史版本限制"},"selector":{"type":"object","description":"选择器","additionalProperties":true},"service_name":{"type":"string","description":"服务名称"},"statefulset_yaml":{"type":"object","description":"StatefulSet YAML对象"},"update_strategy":{"type":"string","description":"更新策略"},"volume_claim_templates":{"type":"array","items":{"type":"string"},"description":"卷声明模板"}},"required":["cluster_id","namespace","name","replicas","service_name","selector","pod_template"],"description":"K8sStatefulSetCreateReq数据模型"},"K8sStatefulSetDeleteReq":{"type":"object","properties":{"cluster_id":{"type":"integer","description":"集群ID"},"force":{"type":"boolean","description":"是否强制删除"},"grace_period_seconds":{"type":"object","description":"优雅删除时间(秒)"},"name":{"type":"string","description":"StatefulSet名称"},"namespace":{"type":"string","description":"命名空间"},"orphan_dependents":{"type":"boolean","description":"是否保留依赖资源"}},"required":["cluster_id","namespace","name"],"description":"K8sStatefulSetDeleteReq数据模型"},"K8sStatefulSetEntity":{"type":"object","properties":{"age":{"type":"string"},"annotations":{"type":"object","description":"注解","additionalProperties":true},"cluster_id":{"type":"integer","description":"所属集群ID"},"creation_timestamp":{"type":"string","format":"date-time","description":"Kubernetes创建时间"},"current_replicas":{"type":"integer","description":"当前副本数"},"images":{"type":"array","items":{"type":"string"}},"labels":{"type":"object","description":"标签","additionalProperties":true},"name":{"type":"string","description":"StatefulSet名称"},"namespace":{"type":"string","description":"所属命名空间"},"pod_management_policy":{"type":"string","description":"Pod管理策略"},"pod_template":{"type":"object","description":"Pod模板","additionalProperties":true},"ready_replicas":{"type":"integer","description":"就绪副本数"},"replicas":{"type":"integer","description":"期望副本数"},"revision_history_limit":{"type":"integer","description":"历史版本限制"},"selector":{"type":"object","description":"选择器","additionalProperties":true},"service_name":{"type":"string","description":"服务名称"},"status":{"type":"string"},"uid":{"type":"string","description":"StatefulSet UID"},"update_strategy":{"type":"string","description":"更新策略"},"updated_replicas":{"type":"integer","description":"更新副本数"},"volume_claim_templates":{"type":"array","items":{"type":"string"},"description":"卷声明模板"}},"required":["name","namespace"],"description":"K8sStatefulSetEntity数据模型"},"K8sStatefulSetEventReq":{"type":"object","properties":{"cluster_id":{"type":"integer","description":"集群ID"},"limit_days":{"type":"integer","description":"限制天数内的事件"},"name":{"type":"string","description":"StatefulSet名称"},"namespace":{"type":"string","description":"命名空间"}},"required":["cluster_id","namespace","name"],"description":"K8sStatefulSetEventReq数据模型"},"K8sStatefulSetListReq":{"type":"object","properties":{"cluster_id":{"type":"integer","description":"集群ID"},"field_selector":{"type":"string","description":"字段选择器"},"label_selector":{"type":"string","description":"标签选择器"},"namespace":{"type":"string","description":"命名空间"},"page":{"type":"integer","description":"页码"},"page_size":{"type":"integer","description":"每页大小"},"service_name":{"type":"string","description":"服务名称过滤"},"status":{"type":"string","description":"状态过滤"}},"required":["cluster_id"],"description":"K8sStatefulSetListReq数据模型"},"K8sStatefulSetMetricsReq":{"type":"object","properties":{"cluster_id":{"type":"integer","description":"集群ID"},"name":{"type":"string","description":"StatefulSet名称"},"namespace":{"type":"string","description":"命名空间"},"time_range":{"type":"string","description":"时间范围"}},"required":["cluster_id","namespace","name"],"description":"K8sStatefulSetMetricsReq数据模型"},"K8sStatefulSetRestartReq":{"type":"object","properties":{"cluster_id":{"type":"integer","description":"集群ID"},"name":{"type":"string","description":"StatefulSet名称"},"namespace":{"type":"string","description":"命名空间"}},"required":["cluster_id","namespace","name"],"description":"K8sStatefulSetRestartReq数据模型"},"K8sStatefulSetScaleReq":{"type":"object","properties":{"cluster_id":{"type":"integer","description":"集群ID"},"name":{"type":"string","description":"StatefulSet名称"},"namespace":{"type":"string","description":"命名空间"},"replicas":{"type":"integer","description":"副本数"}},"required":["cluster_id","namespace","name","replicas"],"description":"K8sStatefulSetScaleReq数据模型"},"K8sStatefulSetUpdateReq":{"type":"object","properties":{"annotations":{"type":"object","description":"注解","additionalProperties":true},"cluster_id":{"type":"integer","description":"集群ID"},"labels":{"type":"object","description":"标签","additionalProperties":true},"name":{"type":"string","description":"StatefulSet名称"},"namespace":{"type":"string","description":"命名空间"},"pod_management_policy":{"type":"string","description":"Pod管理策略"},"pod_template":{"type":"object","description":"Pod模板","additionalProperties":true},"replicas":{"type":"object","description":"副本数"},"revision_history_limit":{"type":"object","description":"历史版本限制"},"selector":{"type":"object","description":"选择器","additionalProperties":true},"service_name":{"type":"string","description":"服务名称"},"statefulset_yaml":{"type":"object","description":"StatefulSet YAML对象"},"update_strategy":{"type":"string","description":"更新策略"},"volume_claim_templates":{"type":"array","items":{"type":"string"},"description":"卷声明模板"}},"required":["cluster_id","namespace","name"],"description":"K8sStatefulSetUpdateReq数据模型"},"K8sVolumeMount":{"type":"object","properties":{"mount_path":{"type":"string","description":"挂载路径"},"name":{"type":"string","description":"卷名称"},"read_only":{"type":"boolean","description":"是否只读"},"sub_path":{"type":"string","description":"子路径"}},"required":["name","mount_path"],"description":"K8sVolumeMount数据模型"},"K8sYamlApplyReq":{"type":"object","properties":{"dry_run":{"type":"boolean","description":"是否为试运行"},"yaml_content":{"type":"string","description":"YAML内容"}},"required":["yaml_content"],"description":"K8sYamlApplyReq数据模型"},"K8sYamlTask":{"type":"object","properties":{"apply_result":{"type":"string","description":"apply 后的返回数据"},"cluster_id":{"type":"integer","description":"集群名称"},"name":{"type":"string","description":"YAML 任务名称"},"status":{"type":"string","description":"当前状态"},"template_id":{"type":"integer","description":"关联的模板ID"},"user_id":{"type":"integer","description":"创建者用户ID"},"variables":{"type":"object","description":"yaml 变量,格式 k=v,k=v"}},"description":"K8sYamlTask数据模型"},"K8sYamlTemplate":{"type":"object","properties":{"cluster_id":{"type":"integer","description":"对应集群id"},"content":{"type":"string","description":"yaml 模板内容"},"name":{"type":"string","description":"模板名称"},"user_id":{"type":"integer","description":"创建者用户ID"}},"required":["name"],"description":"K8sYamlTemplate数据模型"},"KeyValueItem":{"type":"object","properties":{"key":{"type":"string"},"value":{"type":"string"}},"description":"KeyValueItem数据模型"},"KeyValuePair":{"type":"object","properties":{"key":{"type":"string"},"value":{"type":"string"}},"description":"KeyValuePair数据模型"},"LabelK8sNodesReq":{"type":"object","properties":{"cluster_id":{"type":"integer"},"labels":{"type":"array","items":{"type":"string"}},"mod_type":{"type":"string"},"node_name":{"type":"string"}},"required":["node_name","cluster_id","mod_type","labels"],"description":"LabelK8sNodesReq数据模型"},"LabelOption":{"type":"object","properties":{"children":{"type":"array","items":{"type":"string"}},"label":{"type":"string"},"value":{"type":"string"}},"description":"LabelOption数据模型"},"LabelSelector":{"type":"object","properties":{"match_expressions":{"type":"array","items":{"type":"string"},"description":"匹配表达式"},"match_labels":{"type":"object","description":"匹配标签","additionalProperties":true}},"description":"LabelSelector数据模型"},"LabelSelectorRequirement":{"type":"object","properties":{"key":{"type":"string","description":"键"},"operator":{"type":"string","description":"操作符"},"values":{"type":"array","items":{"type":"string"},"description":"值列表"}},"description":"LabelSelectorRequirement数据模型"},"ListApisRequest":{"type":"object","properties":{"is_public":{"type":"integer"},"method":{"type":"integer"}},"description":"ListApisRequest数据模型"},"ListAuditLogsRequest":{"type":"object","properties":{"end_time":{"type":"integer"},"operation_type":{"type":"string"},"start_time":{"type":"integer"},"status_code":{"type":"integer"},"target_type":{"type":"string"}},"description":"ListAuditLogsRequest数据模型"},"ListClustersReq":{"type":"object","properties":{"env":{"type":"string"},"status":{"type":"string"}},"description":"ListClustersReq数据模型"},"ListReq":{"type":"object","properties":{"page":{"type":"integer"},"search":{"type":"string"},"size":{"type":"integer"}},"description":"ListReq数据模型"},"ListResp":{"type":"object","properties":{"items":{"type":"array","items":{"type":"string"}},"total":{"type":"integer"}},"description":"ListResp数据模型"},"ListRolesRequest":{"type":"object","properties":{"status":{"type":"object"}},"description":"ListRolesRequest数据模型"},"ListWorkorderCategoryReq":{"type":"object","properties":{"status":{"type":"object"}},"description":"ListWorkorderCategoryReq数据模型"},"ListWorkorderFormDesignReq":{"type":"object","properties":{"category_id":{"type":"object"},"is_template":{"type":"object"},"status":{"type":"object"}},"description":"ListWorkorderFormDesignReq数据模型"},"ListWorkorderInstanceCommentReq":{"type":"object","properties":{"instance_id":{"type":"object"},"status":{"type":"object"},"type":{"type":"object"}},"description":"ListWorkorderInstanceCommentReq数据模型"},"ListWorkorderInstanceFlowReq":{"type":"object","properties":{"action":{"type":"object"},"instance_id":{"type":"object"},"is_system_action":{"type":"object"}},"description":"ListWorkorderInstanceFlowReq数据模型"},"ListWorkorderInstanceReq":{"type":"object","properties":{"priority":{"type":"object"},"process_id":{"type":"object"},"status":{"type":"object"}},"description":"ListWorkorderInstanceReq数据模型"},"ListWorkorderInstanceTimelineReq":{"type":"object","properties":{"action":{"type":"object"},"end_date":{"type":"string","format":"date-time"},"instance_id":{"type":"object"},"start_date":{"type":"string","format":"date-time"}},"description":"ListWorkorderInstanceTimelineReq数据模型"},"ListWorkorderNotificationLogReq":{"type":"object","properties":{"channel":{"type":"string"},"event_type":{"type":"string"},"instance_id":{"type":"object"},"notification_id":{"type":"object"},"page":{"type":"integer"},"page_size":{"type":"integer"},"recipient_id":{"type":"string"},"recipient_type":{"type":"string"},"status":{"type":"object"}},"description":"ListWorkorderNotificationLogReq数据模型"},"ListWorkorderNotificationQueueReq":{"type":"object","properties":{"channel":{"type":"string"},"event_type":{"type":"string"},"instance_id":{"type":"object"},"notification_id":{"type":"object"},"page":{"type":"integer"},"page_size":{"type":"integer"},"priority":{"type":"object"},"recipient_id":{"type":"string"},"recipient_type":{"type":"string"},"status":{"type":"object"}},"description":"ListWorkorderNotificationQueueReq数据模型"},"ListWorkorderNotificationReq":{"type":"object","properties":{"category_id":{"type":"object"},"is_default":{"type":"object"},"name":{"type":"string"},"page":{"type":"integer"},"page_size":{"type":"integer"},"process_id":{"type":"object"},"status":{"type":"object"},"template_id":{"type":"object"}},"description":"ListWorkorderNotificationReq数据模型"},"ListWorkorderProcessReq":{"type":"object","properties":{"category_id":{"type":"object"},"form_design_id":{"type":"object"},"is_default":{"type":"object"},"status":{"type":"object"}},"description":"ListWorkorderProcessReq数据模型"},"ListWorkorderTemplateReq":{"type":"object","properties":{"category_id":{"type":"object"},"form_design_id":{"type":"object"},"process_id":{"type":"object"},"status":{"type":"object"}},"description":"ListWorkorderTemplateReq数据模型"},"MCPConfig":{"type":"object","properties":{"blacklist":{"type":"object"},"url":{"type":"string"},"whitelist":{"type":"object"}},"description":"MCPConfig数据模型"},"ManualSendNotificationReq":{"type":"object","properties":{"channels":{"type":"array","items":{"type":"string"}},"content":{"type":"string"},"recipient":{"type":"string"},"subject":{"type":"string"}},"required":["channels","recipient","subject","content"],"description":"ManualSendNotificationReq数据模型"},"Model":{"type":"object","properties":{"created_at":{"type":"string","format":"date-time","description":"创建时间"},"deleted_at":{"type":"object","description":"删除时间"},"id":{"type":"integer","description":"主键ID"},"updated_at":{"type":"string","format":"date-time","description":"更新时间"}},"description":"Model数据模型"},"MonitorAlertEvent":{"type":"object","properties":{"alert_name":{"type":"string","description":"告警名称"},"event_times":{"type":"integer","description":"触发次数"},"fingerprint":{"type":"string","description":"告警唯一ID"},"labels":{"type":"object","description":"标签组,格式为key=value"},"labels_map":{"type":"object","additionalProperties":true},"ren_ling_user":{"type":"object"},"ren_ling_user_id":{"type":"integer","description":"认领告警的用户ID"},"rule_id":{"type":"integer","description":"关联的告警规则ID"},"send_group":{"type":"object"},"send_group_id":{"type":"integer","description":"关联的发送组ID"},"silence_id":{"type":"string","description":"AlertManager返回的静默ID"},"status":{"type":"object","description":"告警状态(1:触发 2:静默 3:认领 4:恢复)"}},"required":["alert_name","fingerprint"],"description":"MonitorAlertEvent数据模型"},"MonitorAlertManagerPool":{"type":"object","properties":{"alert_manager_instances":{"type":"object","description":"AlertManager实例列表"},"create_user_name":{"type":"string","description":"创建者名称"},"group_by":{"type":"object","description":"告警分组标签列表"},"group_interval":{"type":"string","description":"告警分组间隔时间"},"group_wait":{"type":"string","description":"首次告警等待时间"},"name":{"type":"string","description":"AlertManager实例池名称"},"receiver":{"type":"string","description":"默认接收者"},"repeat_interval":{"type":"string","description":"重复告警间隔"},"resolve_timeout":{"type":"string","description":"告警恢复超时时间"},"user_id":{"type":"integer","description":"所属用户ID"}},"required":["name"],"description":"MonitorAlertManagerPool数据模型"},"MonitorAlertRule":{"type":"object","properties":{"annotations":{"type":"object","description":"注解(key=value)"},"create_user_name":{"type":"string","description":"创建者名称"},"enable":{"type":"integer","description":"是否启用告警规则(1:启用,2:禁用)"},"expr":{"type":"string","description":"告警规则表达式"},"for_time":{"type":"string","description":"持续时间"},"grafana_link":{"type":"string","description":"Grafana大盘链接"},"ip_address":{"type":"string","description":"IP地址"},"labels":{"type":"object","description":"标签组(key=value)"},"name":{"type":"string","description":"告警规则名称"},"pool_id":{"type":"integer","description":"关联的Prometheus实例池ID"},"pool_name":{"type":"string"},"send_group_id":{"type":"integer","description":"关联的发送组ID"},"send_group_name":{"type":"string"},"severity":{"type":"object","description":"告警级别(1:info,2:warning,3:critical)"},"user_id":{"type":"integer","description":"创建该告警规则的用户ID"}},"required":["name"],"description":"MonitorAlertRule数据模型"},"MonitorConfig":{"type":"object","properties":{"config_content":{"type":"string","description":"配置内容(YAML格式)"},"config_hash":{"type":"string","description":"配置内容的哈希值"},"config_type":{"type":"integer","description":"配置类型(1:Prometheus主配置,2:AlertManager主配置,3:告警规则,4:预聚合规则,5:webhook file)"},"instance_ip":{"type":"string","description":"实例IP地址"},"last_generated_time":{"type":"integer","description":"最后生成时间(Unix时间戳)"},"name":{"type":"string","description":"配置名称"},"pool_id":{"type":"integer","description":"关联的池ID"},"status":{"type":"integer","description":"配置状态(1:激活,2:非激活)"}},"description":"MonitorConfig数据模型"},"MonitorOnDutyChange":{"type":"object","properties":{"create_user_name":{"type":"string","description":"创建者名称"},"date":{"type":"string","description":"换班日期"},"on_duty_group_id":{"type":"integer","description":"值班组ID"},"on_duty_user_id":{"type":"integer","description":"新值班人ID"},"origin_user_id":{"type":"integer","description":"原值班人ID"},"reason":{"type":"string","description":"换班原因"},"user_id":{"type":"integer","description":"创建者ID"}},"description":"MonitorOnDutyChange数据模型"},"MonitorOnDutyGroup":{"type":"object","properties":{"create_user_name":{"type":"string","description":"创建者名称"},"description":{"type":"string","description":"值班组描述"},"enable":{"type":"integer","description":"是否启用 1-启用 2-禁用"},"name":{"type":"string","description":"值班组名称"},"shift_days":{"type":"integer","description":"轮班周期,以天为单位"},"today_duty_user":{"type":"object","description":"今日值班人"},"user_id":{"type":"integer","description":"创建该值班组的用户ID"},"users":{"type":"array","items":{"type":"string"},"description":"值班组成员列表,多对多关系"},"yesterday_normal_duty_user_id":{"type":"integer","description":"昨天的正常排班值班人ID,由cron任务设置"}},"required":["name"],"description":"MonitorOnDutyGroup数据模型"},"MonitorOnDutyHistory":{"type":"object","properties":{"date_string":{"type":"string","description":"值班日期"},"on_duty_group_id":{"type":"integer","description":"值班组ID"},"on_duty_user_id":{"type":"integer","description":"当天值班人员ID"},"origin_user_id":{"type":"integer","description":"原计划值班人员ID"}},"description":"MonitorOnDutyHistory数据模型"},"MonitorOnDutyOne":{"type":"object","properties":{"date":{"type":"string"},"origin_user":{"type":"string"},"user":{"type":"object"}},"description":"MonitorOnDutyOne数据模型"},"MonitorRecordRule":{"type":"object","properties":{"create_user_name":{"type":"string","description":"创建者名称"},"enable":{"type":"integer","description":"是否启用记录规则(1:启用,2:禁用)"},"expr":{"type":"string","description":"记录规则表达式"},"ip_address":{"type":"string","description":"IP地址"},"labels":{"type":"object","description":"标签组(key=value)"},"name":{"type":"string","description":"记录规则名称"},"pool_id":{"type":"integer","description":"关联的Prometheus实例池ID"},"pool_name":{"type":"string"},"user_id":{"type":"integer","description":"创建该记录规则的用户ID"}},"required":["name"],"description":"MonitorRecordRule数据模型"},"MonitorScrapeJob":{"type":"object","properties":{"bearer_token":{"type":"string","description":"鉴权Token内容"},"bearer_token_file":{"type":"string","description":"鉴权Token文件路径"},"create_user_name":{"type":"string","description":"创建用户名称"},"enable":{"type":"integer","description":"是否启用采集任务: 1-启用, 2-禁用"},"ip_address":{"type":"string","description":"IP地址"},"kube_config_file_path":{"type":"string","description":"K8s配置文件路径"},"kubernetes_sd_role":{"type":"string","description":"K8s服务发现角色"},"metrics_path":{"type":"string","description":"监控采集的路径"},"name":{"type":"string","description":"采集任务名称"},"pool_id":{"type":"integer","description":"关联的采集池ID"},"port":{"type":"integer","description":"采集端口号"},"refresh_interval":{"type":"integer","description":"刷新目标的时间间隔(秒)"},"relabel_configs_yaml_string":{"type":"string","description":"relabel配置的YAML字符串"},"scheme":{"type":"string","description":"监控采集的协议方案(http/https)"},"scrape_interval":{"type":"integer","description":"采集的时间间隔(秒)"},"scrape_timeout":{"type":"integer","description":"采集的超时时间(秒)"},"service_discovery_type":{"type":"object","description":"服务发现类型(1-k8s, 2-http, 3-static)"},"tags":{"type":"object","description":"标签"},"tls_ca_content":{"type":"string","description":"TLS CA证书内容"},"tls_ca_file_path":{"type":"string","description":"TLS CA证书文件路径"},"tree_node_ids":{"type":"object","description":"树节点ID列表"},"user_id":{"type":"integer","description":"任务关联的用户ID"}},"required":["name"],"description":"MonitorScrapeJob数据模型"},"MonitorScrapePool":{"type":"object","properties":{"alert_manager_url":{"type":"string","description":"AlertManager地址"},"create_user_name":{"type":"string","description":"创建人名称"},"name":{"type":"string","description":"pool池名称"},"prometheus_instances":{"type":"object","description":"Prometheus实例ID列表"},"record_file_path":{"type":"string","description":"记录规则文件路径"},"remote_read_url":{"type":"string","description":"远程读取地址"},"remote_timeout_seconds":{"type":"integer","description":"远程写入超时(秒)"},"remote_write_url":{"type":"string","description":"远程写入地址"},"rule_file_path":{"type":"string","description":"告警规则文件路径"},"scrape_interval":{"type":"integer","description":"采集间隔(秒)"},"scrape_timeout":{"type":"integer","description":"采集超时(秒)"},"support_alert":{"type":"integer","description":"告警支持(1:启用,2:禁用)"},"support_record":{"type":"integer","description":"预聚合支持(1:启用,2:禁用)"},"tags":{"type":"object","description":"标签"},"user_id":{"type":"integer","description":"所属用户ID"}},"required":["name"],"description":"MonitorScrapePool数据模型"},"MonitorSendGroup":{"type":"object","properties":{"create_user_name":{"type":"string","description":"创建该发送组的用户名称"},"enable":{"type":"integer","description":"是否启用发送组 1:启用 2:禁用"},"fei_shu_qun_robot_token":{"type":"string","description":"飞书机器人Token"},"first_upgrade_users":{"type":"array","items":{"type":"string"},"description":"第一级升级人列表"},"first_user_names":{"type":"array","items":{"type":"string"}},"name":{"type":"string","description":"发送组英文名称"},"name_zh":{"type":"string","description":"发送组中文名称"},"need_upgrade":{"type":"integer","description":"是否需要告警升级 1:需要 2:不需要"},"notify_methods":{"type":"object","description":"通知方法列表"},"on_duty_group_id":{"type":"integer","description":"值班组ID"},"pool_id":{"type":"integer","description":"关联的AlertManager实例ID"},"repeat_interval":{"type":"string","description":"重复发送时间间隔"},"second_upgrade_users":{"type":"array","items":{"type":"string"},"description":"第二级升级人列表"},"second_user_names":{"type":"array","items":{"type":"string"}},"send_resolved":{"type":"integer","description":"是否发送恢复通知 1:发送 2:不发送"},"static_receive_user_names":{"type":"array","items":{"type":"string"}},"static_receive_users":{"type":"array","items":{"type":"string"},"description":"静态配置的接收人列表"},"upgrade_minutes":{"type":"integer","description":"告警升级等待时间(分钟)"},"user_id":{"type":"integer","description":"创建该发送组的用户ID"}},"required":["name","name_zh"],"description":"MonitorSendGroup数据模型"},"MoveTreeNodeReq":{"type":"object","properties":{"id":{"type":"integer"},"new_parent_id":{"type":"integer"}},"required":["id","new_parent_id"],"description":"MoveTreeNodeReq数据模型"},"NFSVolumeSourceRequest":{"type":"object","properties":{"path":{"type":"string","description":"NFS路径"},"read_only":{"type":"boolean","description":"是否只读"},"server":{"type":"string","description":"NFS服务器"}},"description":"NFSVolumeSourceRequest数据模型"},"Namespace":{"type":"object","properties":{"annotations":{"type":"array","items":{"type":"string"}},"creation_time":{"type":"string","format":"date-time"},"labels":{"type":"array","items":{"type":"string"}},"name":{"type":"string"},"status":{"type":"string"},"uid":{"type":"string"}},"description":"Namespace数据模型"},"NamespaceDetailResponse":{"type":"object","properties":{"deployments":{"type":"array","items":{"type":"string"}},"events":{"type":"array","items":{"type":"string"}},"namespace":{"$ref":"#/definitions/NamespaceEntity"},"pods":{"type":"array","items":{"type":"string"}},"resources":{"$ref":"#/definitions/NamespaceResourcesEntity"},"services":{"type":"array","items":{"type":"string"}},"yaml":{"type":"string"}},"description":"NamespaceDetailResponse数据模型"},"NamespaceEntity":{"type":"object","properties":{"age":{"type":"string"},"annotations":{"type":"object","additionalProperties":true},"created_at":{"type":"string"},"labels":{"type":"object","additionalProperties":true},"limit_ranges":{"type":"array","items":{"type":"string"}},"name":{"type":"string"},"network_policies":{"type":"array","items":{"type":"string"}},"phase":{"type":"string"},"resource_quota":{"type":"object"},"status":{"type":"string"},"uid":{"type":"string"}},"description":"NamespaceEntity数据模型"},"NamespaceEventEntity":{"type":"object","properties":{"count":{"type":"integer"},"first_time":{"type":"string"},"last_time":{"type":"string"},"message":{"type":"string"},"reason":{"type":"string"},"source":{"type":"string"},"type":{"type":"string"}},"description":"NamespaceEventEntity数据模型"},"NamespaceLimitRangeEntity":{"type":"object","properties":{"limits":{"type":"array","items":{"type":"string"}},"name":{"type":"string"}},"description":"NamespaceLimitRangeEntity数据模型"},"NamespaceLimitRangeItemEntity":{"type":"object","properties":{"default":{"type":"object","additionalProperties":true},"default_request":{"type":"object","additionalProperties":true},"max":{"type":"object","additionalProperties":true},"max_limit_request_ratio":{"type":"object","additionalProperties":true},"min":{"type":"object","additionalProperties":true},"type":{"type":"string"}},"description":"NamespaceLimitRangeItemEntity数据模型"},"NamespaceListResponse":{"type":"object","properties":{"items":{"type":"array","items":{"type":"string"}},"total_count":{"type":"integer"}},"description":"NamespaceListResponse数据模型"},"NamespaceQuotaResponse":{"type":"object","properties":{"message":{"type":"string"},"namespace_name":{"type":"string"},"quota_name":{"type":"string"},"resource_quota":{"type":"object"},"status":{"type":"string"}},"description":"NamespaceQuotaResponse数据模型"},"NamespaceRBACStatEntity":{"type":"object","properties":{"namespace":{"type":"string"},"role_binding_count":{"type":"integer"},"role_count":{"type":"integer"},"subject_count":{"type":"integer"}},"description":"NamespaceRBACStatEntity数据模型"},"NamespaceResourceCountEntity":{"type":"object","properties":{"failed":{"type":"integer"},"pending":{"type":"integer"},"running":{"type":"integer"},"total":{"type":"integer"}},"description":"NamespaceResourceCountEntity数据模型"},"NamespaceResourceQuotaEntity":{"type":"object","properties":{"hard":{"type":"object","additionalProperties":true},"name":{"type":"string"},"scope_selector":{"type":"object"},"scopes":{"type":"array","items":{"type":"string"}},"used":{"type":"object","additionalProperties":true}},"description":"NamespaceResourceQuotaEntity数据模型"},"NamespaceResourcesEntity":{"type":"object","properties":{"configmaps":{"$ref":"#/definitions/NamespaceResourceCountEntity"},"cronjobs":{"$ref":"#/definitions/NamespaceResourceCountEntity"},"daemonsets":{"$ref":"#/definitions/NamespaceResourceCountEntity"},"deployments":{"$ref":"#/definitions/NamespaceResourceCountEntity"},"ingresses":{"$ref":"#/definitions/NamespaceResourceCountEntity"},"jobs":{"$ref":"#/definitions/NamespaceResourceCountEntity"},"pods":{"$ref":"#/definitions/NamespaceResourceCountEntity"},"pvcs":{"$ref":"#/definitions/NamespaceResourceCountEntity"},"secrets":{"$ref":"#/definitions/NamespaceResourceCountEntity"},"services":{"$ref":"#/definitions/NamespaceResourceCountEntity"},"statefulsets":{"$ref":"#/definitions/NamespaceResourceCountEntity"}},"description":"NamespaceResourcesEntity数据模型"},"NamespaceScopeExpressionEntity":{"type":"object","properties":{"operator":{"type":"string"},"scope_name":{"type":"string"},"values":{"type":"array","items":{"type":"string"}}},"description":"NamespaceScopeExpressionEntity数据模型"},"NamespaceScopeSelectorEntity":{"type":"object","properties":{"match_expressions":{"type":"array","items":{"type":"string"}}},"description":"NamespaceScopeSelectorEntity数据模型"},"NamespaceStatsInfo":{"type":"object","properties":{"active_namespaces":{"type":"integer"},"system_namespaces":{"type":"integer"},"top_namespaces":{"type":"array","items":{"type":"string"}},"total_namespaces":{"type":"integer"},"user_namespaces":{"type":"integer"}},"description":"NamespaceStatsInfo数据模型"},"NetworkStatsInfo":{"type":"object","properties":{"endpoints":{"type":"integer"},"ingresses":{"type":"integer"},"network_policies":{"type":"integer"},"services":{"type":"integer"}},"description":"NetworkStatsInfo数据模型"},"NodeConditionEntity":{"type":"object","properties":{"last_heartbeat_time":{"type":"string"},"last_transition_time":{"type":"string"},"message":{"type":"string"},"reason":{"type":"string"},"status":{"type":"string"},"type":{"type":"string"}},"description":"NodeConditionEntity数据模型"},"NodeCordonReq":{"type":"object","properties":{"cluster_id":{"type":"integer","description":"集群ID"},"node_name":{"type":"string","description":"节点名称"}},"required":["cluster_id","node_name"],"description":"NodeCordonReq数据模型"},"NodeCordonResponse":{"type":"object","properties":{"message":{"type":"string"},"node_name":{"type":"string"},"status":{"type":"string"}},"description":"NodeCordonResponse数据模型"},"NodeDetailResponse":{"type":"object","properties":{"events":{"type":"array","items":{"type":"string"}},"metrics":{"$ref":"#/definitions/NodeMetricsEntity"},"node":{"$ref":"#/definitions/NodeEntity"},"pods":{"type":"array","items":{"type":"string"}},"yaml":{"type":"string"}},"description":"NodeDetailResponse数据模型"},"NodeDrainReq":{"type":"object","properties":{"cluster_id":{"type":"integer","description":"集群ID"},"delete_local_data":{"type":"boolean","description":"是否删除本地数据"},"force":{"type":"boolean","description":"是否强制排空"},"grace_period_seconds":{"type":"integer","description":"优雅关闭时间"},"ignore_daemonsets":{"type":"boolean","description":"是否忽略DaemonSet"},"node_name":{"type":"string","description":"节点名称"},"timeout":{"type":"integer","description":"超时时间"}},"required":["cluster_id","node_name"],"description":"NodeDrainReq数据模型"},"NodeDrainResponse":{"type":"object","properties":{"drained_pods":{"type":"array","items":{"type":"string"}},"duration":{"type":"string"},"message":{"type":"string"},"node_name":{"type":"string"},"skipped_pods":{"type":"array","items":{"type":"string"}},"status":{"type":"string"}},"description":"NodeDrainResponse数据模型"},"NodeEntity":{"type":"object","properties":{"age":{"type":"string"},"annotations":{"type":"object","additionalProperties":true},"architecture":{"type":"string"},"conditions":{"type":"array","items":{"type":"string"}},"container_runtime_version":{"type":"string"},"created_at":{"type":"string"},"external_ip":{"type":"string"},"hostname":{"type":"string"},"internal_ip":{"type":"string"},"kernel_version":{"type":"string"},"kube_proxy_version":{"type":"string"},"kubelet_version":{"type":"string"},"labels":{"type":"object","additionalProperties":true},"name":{"type":"string"},"operating_system":{"type":"string"},"os_image":{"type":"string"},"pod_cidr":{"type":"string"},"pod_cidrs":{"type":"array","items":{"type":"string"}},"provider_id":{"type":"string"},"resources":{"$ref":"#/definitions/NodeResourcesEntity"},"roles":{"type":"array","items":{"type":"string"}},"schedule_enable":{"type":"boolean"},"status":{"type":"string"},"taints":{"type":"array","items":{"type":"string"}},"uid":{"type":"string"}},"description":"NodeEntity数据模型"},"NodeEventEntity":{"type":"object","properties":{"count":{"type":"integer"},"first_time":{"type":"string"},"last_time":{"type":"string"},"message":{"type":"string"},"reason":{"type":"string"},"source":{"type":"string"},"type":{"type":"string"}},"description":"NodeEventEntity数据模型"},"NodeEventsReq":{"type":"object","properties":{"cluster_id":{"type":"integer","description":"集群ID"},"node_name":{"type":"string","description":"节点名称"}},"required":["cluster_id","node_name"],"description":"NodeEventsReq数据模型"},"NodeFilesystemMetricsEntity":{"type":"object","properties":{"available_bytes":{"type":"integer"},"capacity_bytes":{"type":"integer"},"usage_percent":{"type":"number"},"used_bytes":{"type":"integer"}},"description":"NodeFilesystemMetricsEntity数据模型"},"NodeGetReq":{"type":"object","properties":{"cluster_id":{"type":"integer","description":"集群ID"},"node_name":{"type":"string","description":"节点名称"}},"required":["cluster_id","node_name"],"description":"NodeGetReq数据模型"},"NodeLabelResponse":{"type":"object","properties":{"current_labels":{"type":"object","additionalProperties":true},"labels":{"type":"object","additionalProperties":true},"message":{"type":"string"},"node_name":{"type":"string"},"operation":{"type":"string"},"status":{"type":"string"}},"description":"NodeLabelResponse数据模型"},"NodeListReq":{"type":"object","properties":{"cluster_id":{"type":"integer","description":"集群ID"},"field_selector":{"type":"string","description":"字段选择器"},"label_selector":{"type":"string","description":"标签选择器"}},"required":["cluster_id"],"description":"NodeListReq数据模型"},"NodeListResponse":{"type":"object","properties":{"items":{"type":"array","items":{"type":"string"}},"total_count":{"type":"integer"}},"description":"NodeListResponse数据模型"},"NodeMetricsEntity":{"type":"object","properties":{"cpu":{"$ref":"#/definitions/NodeResourceMetricsEntity"},"filesystem":{"$ref":"#/definitions/NodeFilesystemMetricsEntity"},"memory":{"$ref":"#/definitions/NodeResourceMetricsEntity"},"network":{"$ref":"#/definitions/NodeNetworkMetricsEntity"},"storage":{"$ref":"#/definitions/NodeResourceMetricsEntity"},"timestamp":{"type":"string"}},"description":"NodeMetricsEntity数据模型"},"NodeNetworkMetricsEntity":{"type":"object","properties":{"rx_bytes":{"type":"integer"},"rx_errors":{"type":"integer"},"rx_packets":{"type":"integer"},"tx_bytes":{"type":"integer"},"tx_errors":{"type":"integer"},"tx_packets":{"type":"integer"}},"description":"NodeNetworkMetricsEntity数据模型"},"NodeResourceMapEntity":{"type":"object","properties":{"cpu":{"type":"string"},"ephemeral_storage":{"type":"string"},"hugepages_size":{"type":"object","additionalProperties":true},"memory":{"type":"string"},"pods":{"type":"string"},"storage":{"type":"string"}},"description":"NodeResourceMapEntity数据模型"},"NodeResourceMetricsEntity":{"type":"object","properties":{"available":{"type":"string"},"capacity":{"type":"string"},"percentage":{"type":"number"},"usage":{"type":"string"}},"description":"NodeResourceMetricsEntity数据模型"},"NodeResources":{"type":"object","properties":{"cpu":{"type":"string"},"memory":{"type":"string"},"node_name":{"type":"string"},"pods":{"type":"string"},"ready":{"type":"boolean"},"status":{"type":"string"},"storage":{"type":"string"}},"description":"NodeResources数据模型"},"NodeResourcesEntity":{"type":"object","properties":{"allocatable":{"$ref":"#/definitions/NodeResourceMapEntity"},"capacity":{"$ref":"#/definitions/NodeResourceMapEntity"},"limits":{"$ref":"#/definitions/NodeResourceMapEntity"},"requests":{"$ref":"#/definitions/NodeResourceMapEntity"},"usage":{"$ref":"#/definitions/NodeResourceMapEntity"}},"description":"NodeResourcesEntity数据模型"},"NodeResourcesReq":{"type":"object","properties":{"cluster_id":{"type":"integer","description":"集群ID"},"node_name":{"type":"string","description":"节点名称"}},"required":["cluster_id","node_name"],"description":"NodeResourcesReq数据模型"},"NodeSelectorRequest":{"type":"object","properties":{"node_selector_terms":{"type":"array","items":{"type":"string"},"description":"节点选择器条件"}},"description":"NodeSelectorRequest数据模型"},"NodeSelectorRequirementRequest":{"type":"object","properties":{"key":{"type":"string","description":"键"},"operator":{"type":"string","description":"操作符"},"values":{"type":"array","items":{"type":"string"},"description":"值列表"}},"description":"NodeSelectorRequirementRequest数据模型"},"NodeSelectorTermRequest":{"type":"object","properties":{"match_expressions":{"type":"array","items":{"type":"string"},"description":"匹配表达式"},"match_fields":{"type":"array","items":{"type":"string"},"description":"匹配字段"}},"description":"NodeSelectorTermRequest数据模型"},"NodeStatsInfo":{"type":"object","properties":{"master_nodes":{"type":"integer"},"not_ready_nodes":{"type":"integer"},"ready_nodes":{"type":"integer"},"total_nodes":{"type":"integer"},"worker_nodes":{"type":"integer"}},"description":"NodeStatsInfo数据模型"},"NodeTaintEntity":{"type":"object","properties":{"effect":{"type":"string"},"key":{"type":"string"},"time_added":{"type":"string"},"value":{"type":"string"}},"description":"NodeTaintEntity数据模型"},"NodeTaintResponse":{"type":"object","properties":{"current_taints":{"type":"array","items":{"type":"string"}},"message":{"type":"string"},"node_name":{"type":"string"},"operation":{"type":"string"},"status":{"type":"string"},"taints":{"type":"array","items":{"type":"string"}}},"description":"NodeTaintResponse数据模型"},"NodeUncordonReq":{"type":"object","properties":{"cluster_id":{"type":"integer","description":"集群ID"},"node_name":{"type":"string","description":"节点名称"}},"required":["cluster_id","node_name"],"description":"NodeUncordonReq数据模型"},"NodeUncordonResponse":{"type":"object","properties":{"message":{"type":"string"},"node_name":{"type":"string"},"status":{"type":"string"}},"description":"NodeUncordonResponse数据模型"},"OneEvent":{"type":"object","properties":{"component":{"type":"string"},"count":{"type":"integer"},"first_time":{"type":"string"},"last_time":{"type":"string"},"message":{"type":"string"},"object":{"type":"string"},"reason":{"type":"string"},"type":{"type":"string"}},"description":"OneEvent数据模型"},"OperationData":{"type":"object","properties":{"error":{"type":"string"},"success":{"type":"boolean"}},"description":"OperationData数据模型"},"PVBackupResponse":{"type":"object","properties":{"backup_name":{"type":"string"},"backup_path":{"type":"string"},"cluster_id":{"type":"integer"},"created_at":{"type":"string"},"message":{"type":"string"},"pv_names":{"type":"array","items":{"type":"string"}},"size":{"type":"string"},"status":{"type":"string"}},"description":"PVBackupResponse数据模型"},"PVCBackupResponse":{"type":"object","properties":{"backup_name":{"type":"string"},"backup_path":{"type":"string"},"cluster_id":{"type":"integer"},"created_at":{"type":"string"},"message":{"type":"string"},"namespace":{"type":"string"},"pvc_names":{"type":"array","items":{"type":"string"}},"size":{"type":"string"},"status":{"type":"string"}},"description":"PVCBackupResponse数据模型"},"PVCCloneResponse":{"type":"object","properties":{"cluster_id":{"type":"integer"},"end_time":{"type":"string"},"message":{"type":"string"},"namespace":{"type":"string"},"progress":{"type":"integer"},"size":{"type":"string"},"source_name":{"type":"string"},"start_time":{"type":"string"},"status":{"type":"string"},"target_name":{"type":"string"}},"description":"PVCCloneResponse数据模型"},"PVCDetailResponse":{"type":"object","properties":{"events":{"type":"array","items":{"type":"string"}},"metrics":{"$ref":"#/definitions/PVCMetricsEntity"},"pv_info":{"$ref":"#/definitions/PVEntity"},"pvc":{"$ref":"#/definitions/PVCEntity"},"usage":{"$ref":"#/definitions/PVCUsageEntity"},"yaml":{"type":"string"}},"description":"PVCDetailResponse数据模型"},"PVCEntity":{"type":"object","properties":{"access_modes":{"type":"array","items":{"type":"string"}},"age":{"type":"string"},"annotations":{"type":"object","additionalProperties":true},"available_capacity":{"type":"string"},"capacity":{"type":"string"},"created_at":{"type":"string"},"labels":{"type":"object","additionalProperties":true},"name":{"type":"string"},"namespace":{"type":"string"},"request_storage":{"type":"string"},"selector":{"$ref":"#/definitions/PVCSelectorEntity"},"status":{"type":"string"},"storage_class":{"type":"string"},"uid":{"type":"string"},"used_capacity":{"type":"string"},"volume_mode":{"type":"string"},"volume_name":{"type":"string"}},"description":"PVCEntity数据模型"},"PVCEventEntity":{"type":"object","properties":{"count":{"type":"integer"},"first_time":{"type":"string"},"last_time":{"type":"string"},"message":{"type":"string"},"reason":{"type":"string"},"source":{"type":"string"},"type":{"type":"string"}},"description":"PVCEventEntity数据模型"},"PVCExpandResponse":{"type":"object","properties":{"end_time":{"type":"string"},"message":{"type":"string"},"name":{"type":"string"},"namespace":{"type":"string"},"new_capacity":{"type":"string"},"old_capacity":{"type":"string"},"start_time":{"type":"string"},"status":{"type":"string"}},"description":"PVCExpandResponse数据模型"},"PVCListResponse":{"type":"object","properties":{"items":{"type":"array","items":{"type":"string"}},"total_count":{"type":"integer"}},"description":"PVCListResponse数据模型"},"PVCMetricsEntity":{"type":"object","properties":{"available_bytes":{"type":"integer"},"capacity_bytes":{"type":"integer"},"inode_capacity":{"type":"integer"},"inode_usage_percent":{"type":"number"},"inode_used":{"type":"integer"},"iops_read":{"type":"number"},"iops_write":{"type":"number"},"throughput_read":{"type":"number"},"throughput_write":{"type":"number"},"usage_percentage":{"type":"number"},"used_bytes":{"type":"integer"}},"description":"PVCMetricsEntity数据模型"},"PVCMountPointEntity":{"type":"object","properties":{"container_name":{"type":"string"},"mount_path":{"type":"string"},"pod_name":{"type":"string"},"read_only":{"type":"boolean"},"sub_path":{"type":"string"}},"description":"PVCMountPointEntity数据模型"},"PVCNamespaceStatEntity":{"type":"object","properties":{"capacity":{"type":"string"},"count":{"type":"integer"},"namespace":{"type":"string"}},"description":"PVCNamespaceStatEntity数据模型"},"PVCSelectorEntity":{"type":"object","properties":{"match_expressions":{"type":"array","items":{"type":"string"}},"match_labels":{"type":"object","additionalProperties":true}},"description":"PVCSelectorEntity数据模型"},"PVCSelectorRequirementEntity":{"type":"object","properties":{"key":{"type":"string"},"operator":{"type":"string"},"values":{"type":"array","items":{"type":"string"}}},"description":"PVCSelectorRequirementEntity数据模型"},"PVCSnapshotResponse":{"type":"object","properties":{"cluster_id":{"type":"integer"},"created_at":{"type":"string"},"message":{"type":"string"},"namespace":{"type":"string"},"pvc_name":{"type":"string"},"ready_to_use":{"type":"boolean"},"size":{"type":"string"},"snapshot_name":{"type":"string"},"status":{"type":"string"}},"description":"PVCSnapshotResponse数据模型"},"PVCStatisticsResponse":{"type":"object","properties":{"available_capacity":{"type":"string"},"bound_pvcs":{"type":"integer"},"by_namespace":{"type":"array","items":{"type":"string"}},"by_status":{"type":"array","items":{"type":"string"}},"by_storage_class":{"type":"array","items":{"type":"string"}},"lost_pvcs":{"type":"integer"},"pending_pvcs":{"type":"integer"},"total_capacity":{"type":"string"},"total_pvcs":{"type":"integer"},"usage_percentage":{"type":"number"},"used_capacity":{"type":"string"}},"description":"PVCStatisticsResponse数据模型"},"PVCStatusStatEntity":{"type":"object","properties":{"count":{"type":"integer"},"status":{"type":"string"}},"description":"PVCStatusStatEntity数据模型"},"PVCStorageClassStatEntity":{"type":"object","properties":{"capacity":{"type":"string"},"count":{"type":"integer"},"storage_class":{"type":"string"}},"description":"PVCStorageClassStatEntity数据模型"},"PVCUsageEntity":{"type":"object","properties":{"access_patterns":{"type":"array","items":{"type":"string"}},"is_bound":{"type":"boolean"},"mount_points":{"type":"array","items":{"type":"string"}},"pv_name":{"type":"string"},"used_by":{"type":"array","items":{"type":"string"}}},"description":"PVCUsageEntity数据模型"},"PVCUsedByEntity":{"type":"object","properties":{"kind":{"type":"string"},"mount_path":{"type":"string"},"name":{"type":"string"},"namespace":{"type":"string"},"pod_name":{"type":"string"},"read_only":{"type":"boolean"}},"description":"PVCUsedByEntity数据模型"},"PVClaimRefEntity":{"type":"object","properties":{"api_version":{"type":"string"},"kind":{"type":"string"},"name":{"type":"string"},"namespace":{"type":"string"},"resource_version":{"type":"string"},"uid":{"type":"string"}},"description":"PVClaimRefEntity数据模型"},"PVDetailResponse":{"type":"object","properties":{"events":{"type":"array","items":{"type":"string"}},"metrics":{"$ref":"#/definitions/PVMetricsEntity"},"pv":{"$ref":"#/definitions/PVEntity"},"usage":{"$ref":"#/definitions/PVUsageEntity"},"yaml":{"type":"string"}},"description":"PVDetailResponse数据模型"},"PVEntity":{"type":"object","properties":{"access_modes":{"type":"array","items":{"type":"string"}},"age":{"type":"string"},"annotations":{"type":"object","additionalProperties":true},"available_capacity":{"type":"string"},"capacity":{"type":"string"},"claim_ref":{"$ref":"#/definitions/PVClaimRefEntity"},"created_at":{"type":"string"},"labels":{"type":"object","additionalProperties":true},"name":{"type":"string"},"node_affinity":{"$ref":"#/definitions/PVNodeAffinityEntity"},"reclaim_policy":{"type":"string"},"status":{"type":"string"},"storage_class":{"type":"string"},"uid":{"type":"string"},"used_capacity":{"type":"string"},"volume_mode":{"type":"string"},"volume_source":{"$ref":"#/definitions/PVVolumeSourceEntity"},"volume_type":{"type":"string"}},"description":"PVEntity数据模型"},"PVEventEntity":{"type":"object","properties":{"count":{"type":"integer"},"first_time":{"type":"string"},"last_time":{"type":"string"},"message":{"type":"string"},"reason":{"type":"string"},"source":{"type":"string"},"type":{"type":"string"}},"description":"PVEventEntity数据模型"},"PVExpandResponse":{"type":"object","properties":{"end_time":{"type":"string"},"message":{"type":"string"},"name":{"type":"string"},"new_capacity":{"type":"string"},"old_capacity":{"type":"string"},"start_time":{"type":"string"},"status":{"type":"string"}},"description":"PVExpandResponse数据模型"},"PVListResponse":{"type":"object","properties":{"items":{"type":"array","items":{"type":"string"}},"total_count":{"type":"integer"}},"description":"PVListResponse数据模型"},"PVMetricsEntity":{"type":"object","properties":{"available_bytes":{"type":"integer"},"capacity_bytes":{"type":"integer"},"inode_capacity":{"type":"integer"},"inode_usage_percent":{"type":"number"},"inode_used":{"type":"integer"},"iops_read":{"type":"number"},"iops_write":{"type":"number"},"throughput_read":{"type":"number"},"throughput_write":{"type":"number"},"usage_percentage":{"type":"number"},"used_bytes":{"type":"integer"}},"description":"PVMetricsEntity数据模型"},"PVNodeAffinityEntity":{"type":"object","properties":{"required":{"$ref":"#/definitions/PVNodeSelectorEntity"}},"description":"PVNodeAffinityEntity数据模型"},"PVNodeSelectorEntity":{"type":"object","properties":{"node_selector_terms":{"type":"array","items":{"type":"string"}}},"description":"PVNodeSelectorEntity数据模型"},"PVNodeSelectorRequirementEntity":{"type":"object","properties":{"key":{"type":"string"},"operator":{"type":"string"},"values":{"type":"array","items":{"type":"string"}}},"description":"PVNodeSelectorRequirementEntity数据模型"},"PVNodeSelectorTermEntity":{"type":"object","properties":{"match_expressions":{"type":"array","items":{"type":"string"}},"match_fields":{"type":"array","items":{"type":"string"}}},"description":"PVNodeSelectorTermEntity数据模型"},"PVUsageEntity":{"type":"object","properties":{"access_patterns":{"type":"array","items":{"type":"string"}},"claim_name":{"type":"string"},"claim_namespace":{"type":"string"},"is_bound":{"type":"boolean"},"used_by":{"type":"array","items":{"type":"string"}}},"description":"PVUsageEntity数据模型"},"PVUsedByEntity":{"type":"object","properties":{"kind":{"type":"string"},"mount_path":{"type":"string"},"name":{"type":"string"},"namespace":{"type":"string"},"pod_name":{"type":"string"}},"description":"PVUsedByEntity数据模型"},"PVVolumeSourceEntity":{"type":"object","properties":{"config":{"type":"object","additionalProperties":true},"driver":{"type":"string"},"fs_type":{"type":"string"},"path":{"type":"string"},"read_only":{"type":"boolean"},"server":{"type":"string"},"type":{"type":"string"},"volume_id":{"type":"string"}},"description":"PVVolumeSourceEntity数据模型"},"PermissionResult":{"type":"object","properties":{"allowed":{"type":"boolean"},"namespace":{"type":"string"},"reason":{"type":"string"},"resource":{"type":"string"},"verb":{"type":"string"}},"description":"PermissionResult数据模型"},"PermissionStatEntity":{"type":"object","properties":{"count":{"type":"integer"},"resource":{"type":"string"},"verb":{"type":"string"}},"description":"PermissionStatEntity数据模型"},"PersistentVolumeClaimRef":{"type":"object","properties":{"name":{"type":"string"},"namespace":{"type":"string"}},"description":"PersistentVolumeClaimRef数据模型"},"PersistentVolumeClaimTemplate":{"type":"object","properties":{"access_modes":{"type":"array","items":{"type":"string"},"description":"访问模式"},"name":{"type":"string","description":"PVC名称"},"resources":{"$ref":"#/definitions/ResourceRequirements","description":"资源需求"},"selector":{"type":"object","description":"标签选择器"},"size":{"type":"string","description":"存储大小"},"storage_class":{"type":"string","description":"存储类"}},"description":"PersistentVolumeClaimTemplate数据模型"},"PersistentVolumeSourceRequest":{"type":"object","properties":{"csi":{"type":"object","description":"CSI"},"host_path":{"type":"object","description":"主机路径"},"nfs":{"type":"object","description":"NFS"}},"description":"PersistentVolumeSourceRequest数据模型"},"PodContainersReq":{"type":"object","properties":{"cluster_id":{"type":"integer","description":"集群ID"},"namespace":{"type":"string","description":"命名空间"},"pod_name":{"type":"string","description":"Pod名称"}},"required":["cluster_id","namespace","pod_name"],"description":"PodContainersReq数据模型"},"PodCreateReq":{"type":"object","properties":{"annotations":{"type":"object","description":"注解","additionalProperties":true},"cluster_id":{"type":"integer","description":"集群ID"},"labels":{"type":"object","description":"标签","additionalProperties":true},"name":{"type":"string","description":"Pod名称"},"namespace":{"type":"string","description":"命名空间"},"yaml":{"type":"string","description":"YAML配置"}},"required":["cluster_id","namespace","name","yaml"],"description":"PodCreateReq数据模型"},"PodDeleteReq":{"type":"object","properties":{"cluster_id":{"type":"integer","description":"集群ID"},"force":{"type":"boolean","description":"是否强制删除"},"grace_period_seconds":{"type":"object","description":"优雅删除时间"},"namespace":{"type":"string","description":"命名空间"},"pod_name":{"type":"string","description":"Pod名称"}},"required":["cluster_id","namespace","pod_name"],"description":"PodDeleteReq数据模型"},"PodEntity":{"type":"object","properties":{"age":{"type":"string"},"annotations":{"type":"object","additionalProperties":true},"created_at":{"type":"string"},"host_ip":{"type":"string"},"labels":{"type":"object","additionalProperties":true},"name":{"type":"string"},"namespace":{"type":"string"},"node_name":{"type":"string"},"pod_ip":{"type":"string"},"qos_class":{"type":"string"},"ready":{"type":"string"},"restarts":{"type":"integer"},"status":{"type":"string"},"uid":{"type":"string"}},"description":"PodEntity数据模型"},"PodExecReq":{"type":"object","properties":{"command":{"type":"array","items":{"type":"string"},"description":"执行的命令"},"container":{"type":"string","description":"容器名称"},"stderr":{"type":"boolean","description":"是否启用标准错误"},"stdin":{"type":"boolean","description":"是否启用标准输入"},"stdout":{"type":"boolean","description":"是否启用标准输出"},"tty":{"type":"boolean","description":"是否分配TTY"}},"required":["command"],"description":"PodExecReq数据模型"},"PodGetReq":{"type":"object","properties":{"cluster_id":{"type":"integer","description":"集群ID"},"namespace":{"type":"string","description":"命名空间"},"pod_name":{"type":"string","description":"Pod名称"}},"required":["cluster_id","namespace","pod_name"],"description":"PodGetReq数据模型"},"PodListReq":{"type":"object","properties":{"cluster_id":{"type":"integer","description":"集群ID"},"field_selector":{"type":"string","description":"字段选择器"},"label_selector":{"type":"string","description":"标签选择器"},"limit":{"type":"integer","description":"限制结果数量"},"namespace":{"type":"string","description":"命名空间"}},"required":["cluster_id"],"description":"PodListReq数据模型"},"PodListResponse":{"type":"object","properties":{"items":{"type":"array","items":{"type":"string"}},"total_count":{"type":"integer"}},"description":"PodListResponse数据模型"},"PodLogReq":{"type":"object","properties":{"container":{"type":"string","description":"容器名称"},"follow":{"type":"boolean","description":"是否持续跟踪"},"limit_bytes":{"type":"object","description":"限制日志字节数"},"previous":{"type":"boolean","description":"是否获取前一个容器的日志"},"since_seconds":{"type":"object","description":"获取多少秒内的日志"},"since_time":{"type":"string","description":"从指定时间开始获取日志"},"tail_lines":{"type":"object","description":"获取最后几行日志"},"timestamps":{"type":"boolean","description":"是否显示时间戳"}},"description":"PodLogReq数据模型"},"PodPortForwardReq":{"type":"object","properties":{"ports":{"type":"array","items":{"type":"string"},"description":"端口转发配置"}},"required":["ports"],"description":"PodPortForwardReq数据模型"},"PodStatsInfo":{"type":"object","properties":{"failed_pods":{"type":"integer"},"pending_pods":{"type":"integer"},"running_pods":{"type":"integer"},"succeeded_pods":{"type":"integer"},"total_pods":{"type":"integer"},"unknown_pods":{"type":"integer"}},"description":"PodStatsInfo数据模型"},"PodUpdateReq":{"type":"object","properties":{"annotations":{"type":"object","description":"注解","additionalProperties":true},"cluster_id":{"type":"integer","description":"集群ID"},"labels":{"type":"object","description":"标签","additionalProperties":true},"name":{"type":"string","description":"Pod名称"},"namespace":{"type":"string","description":"命名空间"},"yaml":{"type":"string","description":"YAML配置"}},"required":["cluster_id","namespace","name","yaml"],"description":"PodUpdateReq数据模型"},"PodsByNodeReq":{"type":"object","properties":{"cluster_id":{"type":"integer","description":"集群ID"},"node_name":{"type":"string","description":"节点名称"}},"required":["cluster_id","node_name"],"description":"PodsByNodeReq数据模型"},"PolicyRule":{"type":"object","properties":{"api_groups":{"type":"array","items":{"type":"string"}},"non_resource_urls":{"type":"array","items":{"type":"string"}},"resource_names":{"type":"array","items":{"type":"string"}},"resources":{"type":"array","items":{"type":"string"}},"verbs":{"type":"array","items":{"type":"string"}}},"description":"PolicyRule数据模型"},"PortForwardPort":{"type":"object","properties":{"local_port":{"type":"integer","description":"本地端口"},"remote_port":{"type":"integer","description":"远程端口"}},"required":["local_port","remote_port"],"description":"PortForwardPort数据模型"},"ProcessConnection":{"type":"object","properties":{"from":{"type":"string"},"to":{"type":"string"}},"description":"ProcessConnection数据模型"},"ProcessDefinition":{"type":"object","properties":{"connections":{"type":"array","items":{"type":"string"}},"steps":{"type":"array","items":{"type":"string"}}},"required":["steps","connections"],"description":"ProcessDefinition数据模型"},"ProcessStep":{"type":"object","properties":{"actions":{"type":"array","items":{"type":"string"}},"assignee_ids":{"type":"array","items":{"type":"integer"}},"assignee_type":{"type":"string"},"id":{"type":"string"},"name":{"type":"string"},"sort_order":{"type":"integer"},"type":{"type":"string"}},"required":["type","name"],"description":"ProcessStep数据模型"},"ProfileReq":{"type":"object","properties":{"id":{"type":"integer"}},"required":["id"],"description":"ProfileReq数据模型"},"PromqlAlertRuleExprCheckReq":{"type":"object","properties":{"promql_expr":{"type":"string"}},"required":["promql_expr"],"description":"PromqlAlertRuleExprCheckReq数据模型"},"PromqlRecordRuleExprCheckReq":{"type":"object","properties":{"promql_expr":{"type":"string"}},"required":["promql_expr"],"description":"PromqlRecordRuleExprCheckReq数据模型"},"PropertyDef":{"type":"object","properties":{"default":{"type":"integer"},"description":{"type":"string"},"enum":{"type":"array","items":{"type":"integer"}},"items":{"type":"object"},"maximum":{"type":"object"},"minimum":{"type":"object"},"type":{"type":"string"}},"description":"PropertyDef数据模型"},"RBACMatrixCellEntity":{"type":"object","properties":{"allowed":{"type":"boolean"},"namespace":{"type":"string"},"role_name":{"type":"string"}},"description":"RBACMatrixCellEntity数据模型"},"RBACMatrixResponse":{"type":"object","properties":{"matrix":{"type":"array","items":{"type":"string"}},"namespaces":{"type":"array","items":{"type":"string"}},"resources":{"type":"array","items":{"type":"string"}},"subjects":{"type":"array","items":{"type":"string"}},"verbs":{"type":"array","items":{"type":"string"}}},"description":"RBACMatrixResponse数据模型"},"RBACResourceVerbsResponse":{"type":"object","properties":{"resources":{"type":"array","items":{"type":"string"}}},"description":"RBACResourceVerbsResponse数据模型"},"RBACSecurityReportResponse":{"type":"object","properties":{"cross_namespace_access":{"type":"array","items":{"type":"string"}},"dangerous_permissions":{"type":"array","items":{"type":"string"}},"orphaned_role_bindings":{"type":"array","items":{"type":"string"}},"overprivileged_roles":{"type":"array","items":{"type":"string"}},"recommendations":{"type":"array","items":{"type":"string"}},"security_score":{"type":"integer"},"unused_roles":{"type":"array","items":{"type":"string"}}},"description":"RBACSecurityReportResponse数据模型"},"RBACStatistics":{"type":"object","properties":{"active_subjects":{"type":"integer"},"custom_roles":{"type":"integer"},"system_roles":{"type":"integer"},"total_cluster_role_bindings":{"type":"integer"},"total_cluster_roles":{"type":"integer"},"total_role_bindings":{"type":"integer"},"total_roles":{"type":"integer"}},"description":"RBACStatistics数据模型"},"RBACStatisticsDetailEntity":{"type":"object","properties":{"custom_roles_list":{"type":"array","items":{"type":"string"}},"namespace_stats":{"type":"array","items":{"type":"string"}},"permission_stats":{"type":"array","items":{"type":"string"}},"subject_stats":{"type":"array","items":{"type":"string"}},"system_roles_list":{"type":"array","items":{"type":"string"}}},"description":"RBACStatisticsDetailEntity数据模型"},"RBACStatisticsResponse":{"type":"object","properties":{"details":{"$ref":"#/definitions/RBACStatisticsDetailEntity"},"statistics":{"$ref":"#/definitions/RBACStatistics"}},"description":"RBACStatisticsResponse数据模型"},"RecentActivityItem":{"type":"object","properties":{"duration":{"type":"integer"},"operation_type":{"type":"string"},"status_code":{"type":"integer"},"target_type":{"type":"string"},"time":{"type":"integer"},"user_id":{"type":"integer"},"username":{"type":"string"}},"description":"RecentActivityItem数据模型"},"RecipientInfo":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"type":{"type":"string"}},"description":"RecipientInfo数据模型"},"RefreshClusterReq":{"type":"object","properties":{"id":{"type":"integer"}},"required":["id"],"description":"RefreshClusterReq数据模型"},"RejectWorkorderInstanceReq":{"type":"object","properties":{"comment":{"type":"string"},"id":{"type":"integer"}},"required":["id","comment"],"description":"RejectWorkorderInstanceReq数据模型"},"RemoveToolFromBlacklistReq":{"type":"object","properties":{"id":{"type":"integer"},"tool_id":{"type":"integer"}},"required":["id","tool_id"],"description":"RemoveToolFromBlacklistReq数据模型"},"RemoveToolFromWhitelistReq":{"type":"object","properties":{"id":{"type":"integer"},"tool_name":{"type":"string"}},"required":["id","tool_name"],"description":"RemoveToolFromWhitelistReq数据模型"},"RemoveTreeNodeMemberReq":{"type":"object","properties":{"member_type":{"type":"object"},"node_id":{"type":"integer"},"user_id":{"type":"integer"}},"required":["node_id","user_id","member_type"],"description":"RemoveTreeNodeMemberReq数据模型"},"ReplicaSetEntity":{"type":"object","properties":{"age":{"type":"string"},"annotations":{"type":"object","additionalProperties":true},"available_replicas":{"type":"integer"},"created_at":{"type":"string"},"images":{"type":"array","items":{"type":"string"}},"labels":{"type":"object","additionalProperties":true},"name":{"type":"string"},"namespace":{"type":"string"},"ready_replicas":{"type":"integer"},"replicas":{"type":"integer"},"status":{"type":"string"},"uid":{"type":"string"}},"description":"ReplicaSetEntity数据模型"},"Resource":{"type":"object","properties":{"creation_time":{"type":"string","format":"date-time"},"name":{"type":"string"},"namespace":{"type":"string"},"status":{"type":"string"},"type":{"type":"string"}},"description":"Resource数据模型"},"ResourceInfo":{"type":"object","properties":{"api_group":{"type":"string"},"resource":{"type":"string"},"shortname":{"type":"string"},"verbs":{"type":"array","items":{"type":"string"}}},"description":"ResourceInfo数据模型"},"ResourceQuota":{"type":"object","properties":{"configmap_limit":{"type":"string"},"cpu_limit":{"type":"string"},"cpu_request":{"type":"string"},"memory_limit":{"type":"string"},"memory_request":{"type":"string"},"pod_limit":{"type":"string"},"secrets_limit":{"type":"string"},"services_limit":{"type":"string"},"storage_limit":{"type":"string"}},"description":"ResourceQuota数据模型"},"ResourceRequirements":{"type":"object","properties":{"limits":{"$ref":"#/definitions/K8sResourceList","description":"资源限制"},"requests":{"$ref":"#/definitions/K8sResourceList","description":"资源请求"}},"description":"ResourceRequirements数据模型"},"ResourceStatsInfo":{"type":"object","properties":{"cpu_utilization":{"type":"number"},"memory_utilization":{"type":"number"},"storage_utilization":{"type":"number"},"total_cpu":{"type":"string"},"total_memory":{"type":"string"},"total_storage":{"type":"string"},"used_cpu":{"type":"string"},"used_memory":{"type":"string"},"used_storage":{"type":"string"}},"description":"ResourceStatsInfo数据模型"},"ResourceVerbsResponse":{"type":"object","properties":{"resources":{"type":"array","items":{"type":"string"}}},"description":"ResourceVerbsResponse数据模型"},"RetryFailedNotificationPayload":{"type":"object","properties":{"created_at":{"type":"string","format":"date-time"},"last_error":{"type":"string"},"metadata":{"type":"object","additionalProperties":true},"original_message_id":{"type":"string"},"request":{"type":"object"},"retry_count":{"type":"integer"}},"description":"RetryFailedNotificationPayload数据模型"},"ReturnWorkorderInstanceReq":{"type":"object","properties":{"comment":{"type":"string"},"id":{"type":"integer"}},"required":["id","comment"],"description":"ReturnWorkorderInstanceReq数据模型"},"RevokeRoleApiRequest":{"type":"object","properties":{"api_ids":{"type":"array","items":{"type":"integer"}},"role_id":{"type":"integer"}},"required":["role_id","api_ids"],"description":"RevokeRoleApiRequest数据模型"},"RevokeRoleRequest":{"type":"object","properties":{"role_ids":{"type":"array","items":{"type":"integer"}},"user_id":{"type":"integer"}},"required":["user_id","role_ids"],"description":"RevokeRoleRequest数据模型"},"RevokeRolesFromUserRequest":{"type":"object","properties":{"role_ids":{"type":"array","items":{"type":"integer"}},"user_id":{"type":"integer"}},"required":["user_id","role_ids"],"description":"RevokeRolesFromUserRequest数据模型"},"RobotTenantAccessTokenReq":{"type":"object","properties":{"app_id":{"type":"string"},"app_secret":{"type":"string"}},"description":"RobotTenantAccessTokenReq数据模型"},"RobotTenantAccessTokenRes":{"type":"object","properties":{"code":{"type":"integer"},"expire":{"type":"integer"},"message":{"type":"string"},"tenant_access_token":{"type":"string"}},"description":"RobotTenantAccessTokenRes数据模型"},"Role":{"type":"object","properties":{"apis":{"type":"array","items":{"type":"string"},"description":"关联API"},"code":{"type":"string","description":"角色编码"},"description":{"type":"string","description":"角色描述"},"is_system":{"type":"integer","description":"是否系统角色 0否 1是"},"name":{"type":"string","description":"角色名称"},"status":{"type":"integer","description":"状态 0禁用 1启用"},"users":{"type":"array","items":{"type":"string"},"description":"关联用户"}},"description":"Role数据模型"},"RoleApi":{"type":"object","properties":{"api_id":{"type":"integer","description":"API ID"},"id":{"type":"integer","description":"主键ID"},"role_id":{"type":"integer","description":"角色ID"}},"description":"RoleApi数据模型"},"RoleBindingDetailResponse":{"type":"object","properties":{"events":{"type":"array","items":{"type":"string"}},"permissions":{"type":"array","items":{"type":"string"}},"role_binding":{"$ref":"#/definitions/RoleBindingInfo"},"role_detail":{"$ref":"#/definitions/RoleInfo"},"yaml":{"type":"string"}},"description":"RoleBindingDetailResponse数据模型"},"RoleBindingEventEntity":{"type":"object","properties":{"count":{"type":"integer"},"first_time":{"type":"string"},"last_time":{"type":"string"},"message":{"type":"string"},"reason":{"type":"string"},"source":{"type":"string"},"type":{"type":"string"}},"description":"RoleBindingEventEntity数据模型"},"RoleBindingGetReq":{"type":"object","properties":{"cluster_id":{"type":"integer","description":"集群ID"},"name":{"type":"string","description":"RoleBinding名称"},"namespace":{"type":"string","description":"命名空间"}},"required":["cluster_id","namespace","name"],"description":"RoleBindingGetReq数据模型"},"RoleBindingInfo":{"type":"object","properties":{"age":{"type":"string"},"annotations":{"type":"object","additionalProperties":true},"cluster_id":{"type":"integer"},"creation_timestamp":{"type":"string"},"labels":{"type":"object","additionalProperties":true},"name":{"type":"string"},"namespace":{"type":"string"},"resource_version":{"type":"string"},"role_ref":{"$ref":"#/definitions/RoleRef"},"subjects":{"type":"array","items":{"type":"string"}},"uid":{"type":"string"}},"description":"RoleBindingInfo数据模型"},"RoleBindingListReq":{"type":"object","properties":{"cluster_id":{"type":"integer","description":"集群ID"},"keyword":{"type":"string","description":"关键字搜索"},"namespace":{"type":"string","description":"命名空间"},"page":{"type":"integer","description":"页码"},"page_size":{"type":"integer","description":"页面大小"}},"required":["cluster_id"],"description":"RoleBindingListReq数据模型"},"RoleBindingListResponse":{"type":"object","properties":{"items":{"type":"array","items":{"type":"string"}},"total_count":{"type":"integer"}},"description":"RoleBindingListResponse数据模型"},"RoleBindingSimpleInfo":{"type":"object","properties":{"name":{"type":"string"},"namespace":{"type":"string"},"subjects":{"type":"array","items":{"type":"string"}}},"description":"RoleBindingSimpleInfo数据模型"},"RoleBindingYamlReq":{"type":"object","properties":{"cluster_id":{"type":"integer","description":"集群ID"},"name":{"type":"string","description":"RoleBinding名称"},"namespace":{"type":"string","description":"命名空间"},"yaml_content":{"type":"string","description":"YAML内容"}},"required":["cluster_id","namespace","name","yaml_content"],"description":"RoleBindingYamlReq数据模型"},"RoleDetailResponse":{"type":"object","properties":{"bindings":{"type":"array","items":{"type":"string"}},"events":{"type":"array","items":{"type":"string"}},"role":{"$ref":"#/definitions/RoleInfo"},"usage":{"$ref":"#/definitions/RoleUsageEntity"},"yaml":{"type":"string"}},"description":"RoleDetailResponse数据模型"},"RoleEventEntity":{"type":"object","properties":{"count":{"type":"integer"},"first_time":{"type":"string"},"last_time":{"type":"string"},"message":{"type":"string"},"reason":{"type":"string"},"source":{"type":"string"},"type":{"type":"string"}},"description":"RoleEventEntity数据模型"},"RoleGetReq":{"type":"object","properties":{"cluster_id":{"type":"integer","description":"集群ID"},"name":{"type":"string","description":"Role名称"},"namespace":{"type":"string","description":"命名空间"}},"required":["cluster_id","namespace","name"],"description":"RoleGetReq数据模型"},"RoleInfo":{"type":"object","properties":{"age":{"type":"string"},"annotations":{"type":"object","additionalProperties":true},"cluster_id":{"type":"integer"},"creation_timestamp":{"type":"string"},"labels":{"type":"object","additionalProperties":true},"name":{"type":"string"},"namespace":{"type":"string"},"resource_version":{"type":"string"},"rules":{"type":"array","items":{"type":"string"}},"uid":{"type":"string"}},"description":"RoleInfo数据模型"},"RoleListReq":{"type":"object","properties":{"cluster_id":{"type":"integer","description":"集群ID"},"keyword":{"type":"string","description":"关键字搜索"},"namespace":{"type":"string","description":"命名空间"},"page":{"type":"integer","description":"页码"},"page_size":{"type":"integer","description":"页面大小"}},"required":["cluster_id"],"description":"RoleListReq数据模型"},"RoleListResponse":{"type":"object","properties":{"items":{"type":"array","items":{"type":"string"}},"total_count":{"type":"integer"}},"description":"RoleListResponse数据模型"},"RoleRef":{"type":"object","properties":{"api_group":{"type":"string"},"kind":{"type":"string"},"name":{"type":"string"}},"description":"RoleRef数据模型"},"RoleUsageEntity":{"type":"object","properties":{"active_users":{"type":"integer"},"bindings":{"type":"array","items":{"type":"string"}},"total_bindings":{"type":"integer"}},"description":"RoleUsageEntity数据模型"},"RoleYamlReq":{"type":"object","properties":{"cluster_id":{"type":"integer","description":"集群ID"},"name":{"type":"string","description":"Role名称"},"namespace":{"type":"string","description":"命名空间"},"yaml_content":{"type":"string","description":"YAML内容"}},"required":["cluster_id","namespace","name","yaml_content"],"description":"RoleYamlReq数据模型"},"RollingUpdateStrategy":{"type":"object","properties":{"max_surge":{"type":"string","description":"最大超出数量"},"max_unavailable":{"type":"string","description":"最大不可用数量"}},"description":"RollingUpdateStrategy数据模型"},"ScheduleK8sNodesReq":{"type":"object","properties":{"cluster_id":{"type":"integer"},"node_name":{"type":"string"},"schedule_enable":{"type":"boolean"}},"required":["node_name","cluster_id"],"description":"ScheduleK8sNodesReq数据模型"},"ScheduledNotificationPayload":{"type":"object","properties":{"created_at":{"type":"string","format":"date-time"},"metadata":{"type":"object","additionalProperties":true},"request":{"type":"object"},"schedule_type":{"type":"string"},"scheduled_at":{"type":"string","format":"date-time"}},"description":"ScheduledNotificationPayload数据模型"},"SearchAuditLogsRequest":{"type":"object","properties":{"advanced":{"type":"object"}},"description":"SearchAuditLogsRequest数据模型"},"SecretBackupResponse":{"type":"object","properties":{"backup_name":{"type":"string"},"backup_path":{"type":"string"},"cluster_id":{"type":"integer"},"created_at":{"type":"string"},"message":{"type":"string"},"namespace":{"type":"string"},"secret_names":{"type":"array","items":{"type":"string"}},"size":{"type":"string"},"status":{"type":"string"}},"description":"SecretBackupResponse数据模型"},"SecretCreateReq":{"type":"object","properties":{"annotations":{"type":"object","description":"注解","additionalProperties":true},"data":{"type":"object","description":"加密数据","additionalProperties":true},"labels":{"type":"object","description":"标签","additionalProperties":true},"name":{"type":"string","description":"Secret名称"},"string_data":{"type":"object","description":"明文数据","additionalProperties":true},"type":{"type":"string","description":"Secret类型"}},"required":["name"],"description":"SecretCreateReq数据模型"},"SecretDaemonSetUsageEntity":{"type":"object","properties":{"container_name":{"type":"string"},"daemonset_name":{"type":"string"},"keys":{"type":"array","items":{"type":"string"}},"mount_path":{"type":"string"},"namespace":{"type":"string"},"usage_type":{"type":"string"}},"description":"SecretDaemonSetUsageEntity数据模型"},"SecretDataResponse":{"type":"object","properties":{"data":{"type":"object","additionalProperties":true},"data_count":{"type":"integer"},"name":{"type":"string"},"namespace":{"type":"string"},"size":{"type":"string"},"string_data":{"type":"object","additionalProperties":true},"type":{"type":"string"}},"description":"SecretDataResponse数据模型"},"SecretDeploymentUsageEntity":{"type":"object","properties":{"container_name":{"type":"string"},"deployment_name":{"type":"string"},"keys":{"type":"array","items":{"type":"string"}},"mount_path":{"type":"string"},"namespace":{"type":"string"},"usage_type":{"type":"string"}},"description":"SecretDeploymentUsageEntity数据模型"},"SecretDetailResponse":{"type":"object","properties":{"events":{"type":"array","items":{"type":"string"}},"secret":{"$ref":"#/definitions/SecretEntity"},"usage":{"$ref":"#/definitions/SecretUsageEntity"},"yaml":{"type":"string"}},"description":"SecretDetailResponse数据模型"},"SecretEntity":{"type":"object","properties":{"age":{"type":"string"},"annotations":{"type":"object","additionalProperties":true},"created_at":{"type":"string"},"data":{"type":"object","additionalProperties":true},"data_count":{"type":"integer"},"immutable":{"type":"boolean"},"labels":{"type":"object","additionalProperties":true},"name":{"type":"string"},"namespace":{"type":"string"},"size":{"type":"string"},"string_data":{"type":"object","additionalProperties":true},"type":{"type":"string"},"uid":{"type":"string"}},"description":"SecretEntity数据模型"},"SecretEventEntity":{"type":"object","properties":{"count":{"type":"integer"},"first_time":{"type":"string"},"last_time":{"type":"string"},"message":{"type":"string"},"reason":{"type":"string"},"source":{"type":"string"},"type":{"type":"string"}},"description":"SecretEventEntity数据模型"},"SecretJobUsageEntity":{"type":"object","properties":{"container_name":{"type":"string"},"job_name":{"type":"string"},"keys":{"type":"array","items":{"type":"string"}},"mount_path":{"type":"string"},"namespace":{"type":"string"},"usage_type":{"type":"string"}},"description":"SecretJobUsageEntity数据模型"},"SecretKeySelector":{"type":"object","properties":{"key":{"type":"string","description":"键名"},"name":{"type":"string","description":"Secret名称"}},"description":"SecretKeySelector数据模型"},"SecretListResponse":{"type":"object","properties":{"items":{"type":"array","items":{"type":"string"}},"total_count":{"type":"integer"}},"description":"SecretListResponse数据模型"},"SecretPodUsageEntity":{"type":"object","properties":{"container_name":{"type":"string"},"keys":{"type":"array","items":{"type":"string"}},"mount_path":{"type":"string"},"namespace":{"type":"string"},"pod_name":{"type":"string"},"usage_type":{"type":"string"}},"description":"SecretPodUsageEntity数据模型"},"SecretServiceAccountUsageEntity":{"type":"object","properties":{"namespace":{"type":"string"},"service_account_name":{"type":"string"},"usage_type":{"type":"string"}},"description":"SecretServiceAccountUsageEntity数据模型"},"SecretStatefulSetUsageEntity":{"type":"object","properties":{"container_name":{"type":"string"},"keys":{"type":"array","items":{"type":"string"}},"mount_path":{"type":"string"},"namespace":{"type":"string"},"statefulset_name":{"type":"string"},"usage_type":{"type":"string"}},"description":"SecretStatefulSetUsageEntity数据模型"},"SecretUpdateReq":{"type":"object","properties":{"annotations":{"type":"object","description":"注解","additionalProperties":true},"data":{"type":"object","description":"加密数据","additionalProperties":true},"labels":{"type":"object","description":"标签","additionalProperties":true},"string_data":{"type":"object","description":"明文数据","additionalProperties":true}},"description":"SecretUpdateReq数据模型"},"SecretUsageEntity":{"type":"object","properties":{"used_by_daemonsets":{"type":"array","items":{"type":"string"}},"used_by_deployments":{"type":"array","items":{"type":"string"}},"used_by_jobs":{"type":"array","items":{"type":"string"}},"used_by_pods":{"type":"array","items":{"type":"string"}},"used_by_service_accounts":{"type":"array","items":{"type":"string"}},"used_by_statefulsets":{"type":"array","items":{"type":"string"}}},"description":"SecretUsageEntity数据模型"},"SecurityAccessEntity":{"type":"object","properties":{"permission":{"type":"string"},"risk":{"type":"string"},"source_ns":{"type":"string"},"subject":{"type":"string"},"target_ns":{"type":"string"}},"description":"SecurityAccessEntity数据模型"},"SecurityBindingEntity":{"type":"object","properties":{"kind":{"type":"string"},"name":{"type":"string"},"namespace":{"type":"string"},"reason":{"type":"string"},"role_name":{"type":"string"}},"description":"SecurityBindingEntity数据模型"},"SecurityPermissionEntity":{"type":"object","properties":{"reason":{"type":"string"},"resource":{"type":"string"},"risk":{"type":"string"},"roles":{"type":"array","items":{"type":"string"}},"verb":{"type":"string"}},"description":"SecurityPermissionEntity数据模型"},"SecurityRecommendationEntity":{"type":"object","properties":{"action":{"type":"string"},"description":{"type":"string"},"priority":{"type":"string"},"title":{"type":"string"},"type":{"type":"string"}},"description":"SecurityRecommendationEntity数据模型"},"SecurityRoleEntity":{"type":"object","properties":{"kind":{"type":"string"},"name":{"type":"string"},"namespace":{"type":"string"},"permissions":{"type":"array","items":{"type":"string"}},"reason":{"type":"string"},"risk":{"type":"string"}},"description":"SecurityRoleEntity数据模型"},"SelectOption":{"type":"object","properties":{"label":{"type":"string"},"value":{"type":"string"}},"description":"SelectOption数据模型"},"SelectOptionInt":{"type":"object","properties":{"label":{"type":"string"},"value":{"type":"integer"}},"description":"SelectOptionInt数据模型"},"SendNotificationPayload":{"type":"object","properties":{"created_at":{"type":"string","format":"date-time"},"metadata":{"type":"object","additionalProperties":true},"request":{"type":"object"}},"description":"SendNotificationPayload数据模型"},"SendRequest":{"type":"object","properties":{"attachments":{"type":"array","items":{"type":"string"}},"content":{"type":"string"},"event_type":{"type":"string"},"instance_id":{"type":"object"},"message_id":{"type":"string"},"metadata":{"type":"object","additionalProperties":true},"priority":{"type":"integer"},"recipient_addr":{"type":"string"},"recipient_id":{"type":"string"},"recipient_name":{"type":"string"},"recipient_type":{"type":"string"},"subject":{"type":"string"},"templates":{"type":"object","additionalProperties":true}},"description":"SendRequest数据模型"},"SendResponse":{"type":"object","properties":{"cost":{"type":"object"},"error_message":{"type":"string"},"external_id":{"type":"string"},"message_id":{"type":"string"},"response_data":{"type":"object","additionalProperties":true},"send_time":{"type":"string","format":"date-time"},"status":{"type":"string"},"success":{"type":"boolean"}},"description":"SendResponse数据模型"},"ServiceAccountBatchDeleteReq":{"type":"object","properties":{"cluster_id":{"type":"integer","description":"集群ID"},"force":{"type":"boolean","description":"是否强制删除"},"grace_period_seconds":{"type":"object","description":"优雅删除时间"},"names":{"type":"array","items":{"type":"string"},"description":"ServiceAccount名称列表"},"namespace":{"type":"string","description":"命名空间"}},"required":["cluster_id","namespace","names"],"description":"ServiceAccountBatchDeleteReq数据模型"},"ServiceAccountCreateReq":{"type":"object","properties":{"annotations":{"type":"object","description":"注解","additionalProperties":true},"automount_service_account_token":{"type":"object","description":"是否自动挂载ServiceAccount Token"},"cluster_id":{"type":"integer","description":"集群ID"},"image_pull_secrets":{"type":"array","items":{"type":"string"},"description":"ImagePullSecrets列表"},"labels":{"type":"object","description":"标签","additionalProperties":true},"name":{"type":"string","description":"ServiceAccount名称"},"namespace":{"type":"string","description":"命名空间"}},"required":["cluster_id","namespace","name"],"description":"ServiceAccountCreateReq数据模型"},"ServiceAccountDeleteReq":{"type":"object","properties":{"cluster_id":{"type":"integer","description":"集群ID"},"force":{"type":"boolean","description":"是否强制删除"},"grace_period_seconds":{"type":"object","description":"优雅删除时间"},"name":{"type":"string","description":"ServiceAccount名称"},"namespace":{"type":"string","description":"命名空间"}},"required":["cluster_id","namespace","name"],"description":"ServiceAccountDeleteReq数据模型"},"ServiceAccountListReq":{"type":"object","properties":{"cluster_id":{"type":"integer","description":"集群ID"},"field_selector":{"type":"string","description":"字段选择器"},"label_selector":{"type":"string","description":"标签选择器"},"namespace":{"type":"string","description":"命名空间"},"page":{"type":"integer","description":"页码"},"page_size":{"type":"integer","description":"每页大小"}},"required":["cluster_id"],"description":"ServiceAccountListReq数据模型"},"ServiceAccountSecret":{"type":"object","properties":{"name":{"type":"string"},"namespace":{"type":"string"},"type":{"type":"string"}},"description":"ServiceAccountSecret数据模型"},"ServiceAccountStatisticsReq":{"type":"object","properties":{"cluster_id":{"type":"integer","description":"集群ID"},"namespace":{"type":"string","description":"命名空间"}},"required":["cluster_id"],"description":"ServiceAccountStatisticsReq数据模型"},"ServiceAccountStatisticsResp":{"type":"object","properties":{"active_count":{"type":"integer"},"auto_mount_enabled_count":{"type":"integer"},"total_count":{"type":"integer"},"with_image_pull_secrets_count":{"type":"integer"},"with_secrets_count":{"type":"integer"}},"description":"ServiceAccountStatisticsResp数据模型"},"ServiceAccountTokenReq":{"type":"object","properties":{"cluster_id":{"type":"integer","description":"集群ID"},"expiration_seconds":{"type":"object","description":"Token过期时间(秒),不设置则使用系统默认值"},"name":{"type":"string","description":"ServiceAccount名称"},"namespace":{"type":"string","description":"命名空间"}},"required":["cluster_id","namespace","name"],"description":"ServiceAccountTokenReq数据模型"},"ServiceAccountTokenResp":{"type":"object","properties":{"expiration_timestamp":{"type":"string","format":"date-time"},"token":{"type":"string"}},"description":"ServiceAccountTokenResp数据模型"},"ServiceAccountUpdateReq":{"type":"object","properties":{"annotations":{"type":"object","description":"注解","additionalProperties":true},"automount_service_account_token":{"type":"object","description":"是否自动挂载ServiceAccount Token"},"cluster_id":{"type":"integer","description":"集群ID"},"image_pull_secrets":{"type":"array","items":{"type":"string"},"description":"ImagePullSecrets列表"},"labels":{"type":"object","description":"标签","additionalProperties":true},"name":{"type":"string","description":"ServiceAccount名称"},"namespace":{"type":"string","description":"命名空间"}},"required":["cluster_id","namespace","name"],"description":"ServiceAccountUpdateReq数据模型"},"ServiceAccountUpdateYamlReq":{"type":"object","properties":{"cluster_id":{"type":"integer","description":"集群ID"},"name":{"type":"string","description":"ServiceAccount名称"},"namespace":{"type":"string","description":"命名空间"},"yaml":{"type":"string","description":"YAML内容"}},"required":["cluster_id","namespace","name","yaml"],"description":"ServiceAccountUpdateYamlReq数据模型"},"ServiceAccountYamlReq":{"type":"object","properties":{"cluster_id":{"type":"integer","description":"集群ID"},"name":{"type":"string","description":"ServiceAccount名称"},"namespace":{"type":"string","description":"命名空间"}},"required":["cluster_id","namespace","name"],"description":"ServiceAccountYamlReq数据模型"},"ServiceAccountYamlResp":{"type":"object","properties":{"yaml":{"type":"string"}},"description":"ServiceAccountYamlResp数据模型"},"ServiceDetailResponse":{"type":"object","properties":{"endpoints":{"type":"array","items":{"type":"string"}},"events":{"type":"array","items":{"type":"string"}},"pods":{"type":"array","items":{"type":"string"}},"service":{"$ref":"#/definitions/ServiceEntity"},"yaml":{"type":"string"}},"description":"ServiceDetailResponse数据模型"},"ServiceEndpoint":{"type":"object","properties":{"ip":{"type":"string","description":"端点IP"},"port":{"type":"integer","description":"端点端口"},"protocol":{"type":"string","description":"端口协议"},"ready":{"type":"boolean","description":"端点是否就绪"}},"description":"ServiceEndpoint数据模型"},"ServiceEndpointConditionEntity":{"type":"object","properties":{"last_transition_time":{"type":"string"},"status":{"type":"string"},"type":{"type":"string"}},"description":"ServiceEndpointConditionEntity数据模型"},"ServiceEndpointEntity":{"type":"object","properties":{"conditions":{"type":"array","items":{"type":"string"}},"hostname":{"type":"string"},"ip":{"type":"string"},"node_name":{"type":"string"},"ports":{"type":"array","items":{"type":"string"}},"ready":{"type":"boolean"},"serving":{"type":"boolean"},"terminating":{"type":"boolean"}},"description":"ServiceEndpointEntity数据模型"},"ServiceEndpointPortEntity":{"type":"object","properties":{"app_protocol":{"type":"string"},"name":{"type":"string"},"port":{"type":"integer"},"protocol":{"type":"string"}},"description":"ServiceEndpointPortEntity数据模型"},"ServiceEntity":{"type":"object","properties":{"age":{"type":"string"},"annotations":{"type":"object","additionalProperties":true},"cluster_ip":{"type":"string"},"cluster_ips":{"type":"array","items":{"type":"string"}},"created_at":{"type":"string"},"endpoints":{"type":"array","items":{"type":"string"}},"external_ips":{"type":"array","items":{"type":"string"}},"external_name":{"type":"string"},"labels":{"type":"object","additionalProperties":true},"load_balancer_ip":{"type":"string"},"load_balancer_source_ranges":{"type":"array","items":{"type":"string"}},"name":{"type":"string"},"namespace":{"type":"string"},"ports":{"type":"array","items":{"type":"string"}},"selector":{"type":"object","additionalProperties":true},"session_affinity":{"type":"string"},"status":{"type":"string"},"type":{"type":"string"},"uid":{"type":"string"}},"description":"ServiceEntity数据模型"},"ServiceEventEntity":{"type":"object","properties":{"count":{"type":"integer"},"first_time":{"type":"string"},"last_time":{"type":"string"},"message":{"type":"string"},"reason":{"type":"string"},"source":{"type":"string"},"type":{"type":"string"}},"description":"ServiceEventEntity数据模型"},"ServiceListResponse":{"type":"object","properties":{"items":{"type":"array","items":{"type":"string"}},"total_count":{"type":"integer"}},"description":"ServiceListResponse数据模型"},"ServicePort":{"type":"object","properties":{"name":{"type":"string"},"node_port":{"type":"integer"},"port":{"type":"integer"},"protocol":{"type":"string"},"target_port":{"type":"string"}},"description":"ServicePort数据模型"},"ServicePortEntity":{"type":"object","properties":{"app_protocol":{"type":"string"},"name":{"type":"string"},"node_port":{"type":"integer"},"port":{"type":"integer"},"protocol":{"type":"string"},"target_port":{"type":"string"}},"description":"ServicePortEntity数据模型"},"ServicePortForwardResponse":{"type":"object","properties":{"local_port":{"type":"integer"},"message":{"type":"string"},"remote_port":{"type":"integer"},"status":{"type":"string"}},"description":"ServicePortForwardResponse数据模型"},"SilenceResponse":{"type":"object","properties":{"data":{"type":"object"},"status":{"type":"string"}},"description":"SilenceResponse数据模型"},"StatefulSetAffinityEntity":{"type":"object","properties":{"node_affinity":{"$ref":"#/definitions/StatefulSetNodeAffinityEntity"},"pod_affinity":{"$ref":"#/definitions/StatefulSetPodAffinityEntity"},"pod_anti_affinity":{"$ref":"#/definitions/StatefulSetPodAntiAffinityEntity"}},"description":"StatefulSetAffinityEntity数据模型"},"StatefulSetCapabilitiesEntity":{"type":"object","properties":{"add":{"type":"array","items":{"type":"string"}},"drop":{"type":"array","items":{"type":"string"}}},"description":"StatefulSetCapabilitiesEntity数据模型"},"StatefulSetConfigMapKeySelectorEntity":{"type":"object","properties":{"key":{"type":"string"},"name":{"type":"string"},"optional":{"type":"object"}},"description":"StatefulSetConfigMapKeySelectorEntity数据模型"},"StatefulSetConfigMapVolumeSourceEntity":{"type":"object","properties":{"default_mode":{"type":"object"},"items":{"type":"array","items":{"type":"string"}},"name":{"type":"string"},"optional":{"type":"object"}},"description":"StatefulSetConfigMapVolumeSourceEntity数据模型"},"StatefulSetContainerEntity":{"type":"object","properties":{"args":{"type":"array","items":{"type":"string"}},"command":{"type":"array","items":{"type":"string"}},"env":{"type":"array","items":{"type":"string"}},"image":{"type":"string"},"image_pull_policy":{"type":"string"},"liveness_probe":{"$ref":"#/definitions/StatefulSetProbeEntity"},"name":{"type":"string"},"ports":{"type":"array","items":{"type":"string"}},"readiness_probe":{"$ref":"#/definitions/StatefulSetProbeEntity"},"resources":{"$ref":"#/definitions/StatefulSetResourceRequirementsEntity"},"security_context":{"$ref":"#/definitions/StatefulSetSecurityContextEntity"},"startup_probe":{"$ref":"#/definitions/StatefulSetProbeEntity"},"volume_mounts":{"type":"array","items":{"type":"string"}}},"description":"StatefulSetContainerEntity数据模型"},"StatefulSetContainerPortEntity":{"type":"object","properties":{"container_port":{"type":"integer"},"host_ip":{"type":"string"},"host_port":{"type":"integer"},"name":{"type":"string"},"protocol":{"type":"string"}},"description":"StatefulSetContainerPortEntity数据模型"},"StatefulSetCreateReq":{"type":"object","properties":{"annotations":{"type":"object","description":"注解","additionalProperties":true},"env":{"type":"array","items":{"type":"string"},"description":"环境变量"},"image":{"type":"string","description":"镜像地址"},"labels":{"type":"object","description":"标签","additionalProperties":true},"name":{"type":"string","description":"StatefulSet名称"},"ports":{"type":"array","items":{"type":"string"},"description":"容器端口"},"replicas":{"type":"integer","description":"副本数量"},"resources":{"$ref":"#/definitions/ResourceRequirements","description":"资源限制"},"service_name":{"type":"string","description":"服务名称"},"update_strategy":{"$ref":"#/definitions/StatefulSetUpdateStrategy","description":"更新策略"},"volume_claim_templates":{"type":"array","items":{"type":"string"},"description":"存储卷声明模板"}},"required":["name","service_name","image"],"description":"StatefulSetCreateReq数据模型"},"StatefulSetDetailResponse":{"type":"object","properties":{"events":{"type":"array","items":{"type":"string"}},"metrics":{"$ref":"#/definitions/StatefulSetMetricsEntity"},"pods":{"type":"array","items":{"type":"string"}},"service":{"$ref":"#/definitions/StatefulSetServiceEntity"},"statefulset":{"$ref":"#/definitions/StatefulSetEntity"},"yaml":{"type":"string"}},"description":"StatefulSetDetailResponse数据模型"},"StatefulSetEmptyDirVolumeSourceEntity":{"type":"object","properties":{"medium":{"type":"string"},"size_limit":{"type":"string"}},"description":"StatefulSetEmptyDirVolumeSourceEntity数据模型"},"StatefulSetEntity":{"type":"object","properties":{"age":{"type":"string"},"annotations":{"type":"object","additionalProperties":true},"created_at":{"type":"string"},"current_replicas":{"type":"integer"},"images":{"type":"array","items":{"type":"string"}},"labels":{"type":"object","additionalProperties":true},"name":{"type":"string"},"namespace":{"type":"string"},"pod_management_policy":{"type":"string"},"pod_template":{"$ref":"#/definitions/StatefulSetPodTemplateEntity"},"ready_replicas":{"type":"integer"},"replicas":{"type":"integer"},"revision_history_limit":{"type":"integer"},"selector":{"$ref":"#/definitions/StatefulSetSelectorEntity"},"service_name":{"type":"string"},"status":{"type":"string"},"uid":{"type":"string"},"update_strategy":{"$ref":"#/definitions/StatefulSetUpdateStrategyEntity"},"updated_replicas":{"type":"integer"},"volume_claim_templates":{"type":"array","items":{"type":"string"}}},"description":"StatefulSetEntity数据模型"},"StatefulSetEnvVarEntity":{"type":"object","properties":{"name":{"type":"string"},"value":{"type":"string"},"value_from":{"$ref":"#/definitions/StatefulSetEnvVarSourceEntity"}},"description":"StatefulSetEnvVarEntity数据模型"},"StatefulSetEnvVarSourceEntity":{"type":"object","properties":{"config_map_key_ref":{"$ref":"#/definitions/StatefulSetConfigMapKeySelectorEntity"},"field_ref":{"$ref":"#/definitions/StatefulSetObjectFieldSelectorEntity"},"resource_field_ref":{"$ref":"#/definitions/StatefulSetResourceFieldSelectorEntity"},"secret_key_ref":{"$ref":"#/definitions/StatefulSetSecretKeySelectorEntity"}},"description":"StatefulSetEnvVarSourceEntity数据模型"},"StatefulSetEventEntity":{"type":"object","properties":{"count":{"type":"integer"},"first_time":{"type":"string"},"last_time":{"type":"string"},"message":{"type":"string"},"reason":{"type":"string"},"source":{"type":"string"},"type":{"type":"string"}},"description":"StatefulSetEventEntity数据模型"},"StatefulSetExecActionEntity":{"type":"object","properties":{"command":{"type":"array","items":{"type":"string"}}},"description":"StatefulSetExecActionEntity数据模型"},"StatefulSetHTTPGetActionEntity":{"type":"object","properties":{"host":{"type":"string"},"http_headers":{"type":"array","items":{"type":"string"}},"path":{"type":"string"},"port":{"type":"integer"},"scheme":{"type":"string"}},"description":"StatefulSetHTTPGetActionEntity数据模型"},"StatefulSetHTTPHeaderEntity":{"type":"object","properties":{"name":{"type":"string"},"value":{"type":"string"}},"description":"StatefulSetHTTPHeaderEntity数据模型"},"StatefulSetHostPathVolumeSourceEntity":{"type":"object","properties":{"path":{"type":"string"},"type":{"type":"string"}},"description":"StatefulSetHostPathVolumeSourceEntity数据模型"},"StatefulSetKeyToPathEntity":{"type":"object","properties":{"key":{"type":"string"},"mode":{"type":"object"},"path":{"type":"string"}},"description":"StatefulSetKeyToPathEntity数据模型"},"StatefulSetListResponse":{"type":"object","properties":{"items":{"type":"array","items":{"type":"string"}},"total_count":{"type":"integer"}},"description":"StatefulSetListResponse数据模型"},"StatefulSetMetricsEntity":{"type":"object","properties":{"cpu_usage":{"type":"number"},"memory_usage":{"type":"integer"},"network_rx":{"type":"integer"},"network_tx":{"type":"integer"},"storage_usage":{"type":"integer"}},"description":"StatefulSetMetricsEntity数据模型"},"StatefulSetNodeAffinityEntity":{"type":"object","properties":{"preferred_during_scheduling_ignored_during_execution":{"type":"array","items":{"type":"string"}},"required_during_scheduling_ignored_during_execution":{"$ref":"#/definitions/StatefulSetNodeSelectorEntity"}},"description":"StatefulSetNodeAffinityEntity数据模型"},"StatefulSetNodeSelectorEntity":{"type":"object","properties":{"node_selector_terms":{"type":"array","items":{"type":"string"}}},"description":"StatefulSetNodeSelectorEntity数据模型"},"StatefulSetNodeSelectorRequirementEntity":{"type":"object","properties":{"key":{"type":"string"},"operator":{"type":"string"},"values":{"type":"array","items":{"type":"string"}}},"description":"StatefulSetNodeSelectorRequirementEntity数据模型"},"StatefulSetNodeSelectorTermEntity":{"type":"object","properties":{"match_expressions":{"type":"array","items":{"type":"string"}},"match_fields":{"type":"array","items":{"type":"string"}}},"description":"StatefulSetNodeSelectorTermEntity数据模型"},"StatefulSetObjectFieldSelectorEntity":{"type":"object","properties":{"api_version":{"type":"string"},"field_path":{"type":"string"}},"description":"StatefulSetObjectFieldSelectorEntity数据模型"},"StatefulSetPersistentVolumeClaimVolumeSourceEntity":{"type":"object","properties":{"claim_name":{"type":"string"},"read_only":{"type":"boolean"}},"description":"StatefulSetPersistentVolumeClaimVolumeSourceEntity数据模型"},"StatefulSetPodAffinityEntity":{"type":"object","properties":{"preferred_during_scheduling_ignored_during_execution":{"type":"array","items":{"type":"string"}},"required_during_scheduling_ignored_during_execution":{"type":"array","items":{"type":"string"}}},"description":"StatefulSetPodAffinityEntity数据模型"},"StatefulSetPodAffinityTermEntity":{"type":"object","properties":{"label_selector":{"$ref":"#/definitions/StatefulSetSelectorEntity"},"namespace_selector":{"$ref":"#/definitions/StatefulSetSelectorEntity"},"namespaces":{"type":"array","items":{"type":"string"}},"topology_key":{"type":"string"}},"description":"StatefulSetPodAffinityTermEntity数据模型"},"StatefulSetPodAntiAffinityEntity":{"type":"object","properties":{"preferred_during_scheduling_ignored_during_execution":{"type":"array","items":{"type":"string"}},"required_during_scheduling_ignored_during_execution":{"type":"array","items":{"type":"string"}}},"description":"StatefulSetPodAntiAffinityEntity数据模型"},"StatefulSetPodEntity":{"type":"object","properties":{"age":{"type":"string"},"ip":{"type":"string"},"name":{"type":"string"},"node":{"type":"string"},"nominated":{"type":"string"},"readiness":{"type":"string"},"ready":{"type":"string"},"restarts":{"type":"integer"},"status":{"type":"string"}},"description":"StatefulSetPodEntity数据模型"},"StatefulSetPodSecurityContextEntity":{"type":"object","properties":{"fs_group":{"type":"object"},"fs_group_change_policy":{"type":"string"},"run_as_group":{"type":"object"},"run_as_non_root":{"type":"object"},"run_as_user":{"type":"object"},"seccomp_profile":{"$ref":"#/definitions/StatefulSetSeccompProfileEntity"},"selinux_options":{"$ref":"#/definitions/StatefulSetSELinuxOptionsEntity"},"supplemental_groups":{"type":"array","items":{"type":"integer"}},"sysctls":{"type":"array","items":{"type":"string"}},"windows_options":{"$ref":"#/definitions/StatefulSetWindowsSecurityContextOptionsEntity"}},"description":"StatefulSetPodSecurityContextEntity数据模型"},"StatefulSetPodSpecEntity":{"type":"object","properties":{"affinity":{"$ref":"#/definitions/StatefulSetAffinityEntity"},"containers":{"type":"array","items":{"type":"string"}},"dns_policy":{"type":"string"},"init_containers":{"type":"array","items":{"type":"string"}},"node_selector":{"type":"object","additionalProperties":true},"restart_policy":{"type":"string"},"security_context":{"$ref":"#/definitions/StatefulSetPodSecurityContextEntity"},"service_account_name":{"type":"string"},"termination_grace_period_seconds":{"type":"object"},"tolerations":{"type":"array","items":{"type":"string"}},"volumes":{"type":"array","items":{"type":"string"}}},"description":"StatefulSetPodSpecEntity数据模型"},"StatefulSetPodTemplateEntity":{"type":"object","properties":{"annotations":{"type":"object","additionalProperties":true},"labels":{"type":"object","additionalProperties":true},"spec":{"$ref":"#/definitions/StatefulSetPodSpecEntity"}},"description":"StatefulSetPodTemplateEntity数据模型"},"StatefulSetPreferredSchedulingTermEntity":{"type":"object","properties":{"preference":{"$ref":"#/definitions/StatefulSetNodeSelectorTermEntity"},"weight":{"type":"integer"}},"description":"StatefulSetPreferredSchedulingTermEntity数据模型"},"StatefulSetProbeEntity":{"type":"object","properties":{"exec":{"$ref":"#/definitions/StatefulSetExecActionEntity"},"failure_threshold":{"type":"integer"},"http_get":{"$ref":"#/definitions/StatefulSetHTTPGetActionEntity"},"initial_delay_seconds":{"type":"integer"},"period_seconds":{"type":"integer"},"success_threshold":{"type":"integer"},"tcp_socket":{"$ref":"#/definitions/StatefulSetTCPSocketActionEntity"},"timeout_seconds":{"type":"integer"}},"description":"StatefulSetProbeEntity数据模型"},"StatefulSetResourceFieldSelectorEntity":{"type":"object","properties":{"container_name":{"type":"string"},"divisor":{"type":"string"},"resource":{"type":"string"}},"description":"StatefulSetResourceFieldSelectorEntity数据模型"},"StatefulSetResourceRequirementsEntity":{"type":"object","properties":{"limits":{"type":"object","additionalProperties":true},"requests":{"type":"object","additionalProperties":true}},"description":"StatefulSetResourceRequirementsEntity数据模型"},"StatefulSetRestartResponse":{"type":"object","properties":{"end_time":{"type":"string"},"message":{"type":"string"},"name":{"type":"string"},"namespace":{"type":"string"},"restarted_pods":{"type":"array","items":{"type":"string"}},"start_time":{"type":"string"},"status":{"type":"string"}},"description":"StatefulSetRestartResponse数据模型"},"StatefulSetRollingUpdateStrategy":{"type":"object","properties":{"max_unavailable":{"type":"string","description":"最大不可用数量"},"partition":{"type":"object","description":"分区"}},"description":"StatefulSetRollingUpdateStrategy数据模型"},"StatefulSetRollingUpdateStrategyEntity":{"type":"object","properties":{"max_unavailable":{"type":"object"},"partition":{"type":"object"}},"description":"StatefulSetRollingUpdateStrategyEntity数据模型"},"StatefulSetSELinuxOptionsEntity":{"type":"object","properties":{"level":{"type":"string"},"role":{"type":"string"},"type":{"type":"string"},"user":{"type":"string"}},"description":"StatefulSetSELinuxOptionsEntity数据模型"},"StatefulSetScaleReq":{"type":"object","properties":{"replicas":{"type":"integer","description":"副本数量"}},"required":["replicas"],"description":"StatefulSetScaleReq数据模型"},"StatefulSetScaleResponse":{"type":"object","properties":{"end_time":{"type":"string"},"message":{"type":"string"},"name":{"type":"string"},"namespace":{"type":"string"},"new_replicas":{"type":"integer"},"old_replicas":{"type":"integer"},"start_time":{"type":"string"},"status":{"type":"string"}},"description":"StatefulSetScaleResponse数据模型"},"StatefulSetSeccompProfileEntity":{"type":"object","properties":{"localhost_profile":{"type":"string"},"type":{"type":"string"}},"description":"StatefulSetSeccompProfileEntity数据模型"},"StatefulSetSecretKeySelectorEntity":{"type":"object","properties":{"key":{"type":"string"},"name":{"type":"string"},"optional":{"type":"object"}},"description":"StatefulSetSecretKeySelectorEntity数据模型"},"StatefulSetSecretVolumeSourceEntity":{"type":"object","properties":{"default_mode":{"type":"object"},"items":{"type":"array","items":{"type":"string"}},"optional":{"type":"object"},"secret_name":{"type":"string"}},"description":"StatefulSetSecretVolumeSourceEntity数据模型"},"StatefulSetSecurityContextEntity":{"type":"object","properties":{"allow_privilege_escalation":{"type":"object"},"capabilities":{"$ref":"#/definitions/StatefulSetCapabilitiesEntity"},"privileged":{"type":"object"},"read_only_root_filesystem":{"type":"object"},"run_as_group":{"type":"object"},"run_as_non_root":{"type":"object"},"run_as_user":{"type":"object"}},"description":"StatefulSetSecurityContextEntity数据模型"},"StatefulSetSelectorEntity":{"type":"object","properties":{"match_expressions":{"type":"array","items":{"type":"string"}},"match_labels":{"type":"object","additionalProperties":true}},"description":"StatefulSetSelectorEntity数据模型"},"StatefulSetSelectorRequirementEntity":{"type":"object","properties":{"key":{"type":"string"},"operator":{"type":"string"},"values":{"type":"array","items":{"type":"string"}}},"description":"StatefulSetSelectorRequirementEntity数据模型"},"StatefulSetServiceEntity":{"type":"object","properties":{"cluster_ip":{"type":"string"},"external_ips":{"type":"array","items":{"type":"string"}},"name":{"type":"string"},"ports":{"type":"array","items":{"type":"string"}},"selector":{"type":"object","additionalProperties":true},"type":{"type":"string"}},"description":"StatefulSetServiceEntity数据模型"},"StatefulSetServicePortEntity":{"type":"object","properties":{"name":{"type":"string"},"node_port":{"type":"integer"},"port":{"type":"integer"},"protocol":{"type":"string"},"target_port":{"type":"string"}},"description":"StatefulSetServicePortEntity数据模型"},"StatefulSetSysctlEntity":{"type":"object","properties":{"name":{"type":"string"},"value":{"type":"string"}},"description":"StatefulSetSysctlEntity数据模型"},"StatefulSetTCPSocketActionEntity":{"type":"object","properties":{"host":{"type":"string"},"port":{"type":"integer"}},"description":"StatefulSetTCPSocketActionEntity数据模型"},"StatefulSetTolerationEntity":{"type":"object","properties":{"effect":{"type":"string"},"key":{"type":"string"},"operator":{"type":"string"},"toleration_seconds":{"type":"object"},"value":{"type":"string"}},"description":"StatefulSetTolerationEntity数据模型"},"StatefulSetTypedLocalObjectReferenceEntity":{"type":"object","properties":{"api_group":{"type":"string"},"kind":{"type":"string"},"name":{"type":"string"}},"description":"StatefulSetTypedLocalObjectReferenceEntity数据模型"},"StatefulSetUpdateReq":{"type":"object","properties":{"annotations":{"type":"object","description":"注解","additionalProperties":true},"env":{"type":"array","items":{"type":"string"},"description":"环境变量"},"image":{"type":"string","description":"镜像地址"},"labels":{"type":"object","description":"标签","additionalProperties":true},"ports":{"type":"array","items":{"type":"string"},"description":"容器端口"},"replicas":{"type":"object","description":"副本数量"},"resources":{"$ref":"#/definitions/ResourceRequirements","description":"资源限制"},"update_strategy":{"$ref":"#/definitions/StatefulSetUpdateStrategy","description":"更新策略"},"volume_claim_templates":{"type":"array","items":{"type":"string"},"description":"存储卷声明模板"}},"description":"StatefulSetUpdateReq数据模型"},"StatefulSetUpdateStrategy":{"type":"object","properties":{"rolling_update":{"type":"object","description":"滚动更新策略"},"type":{"type":"string","description":"更新策略类型"}},"description":"StatefulSetUpdateStrategy数据模型"},"StatefulSetUpdateStrategyEntity":{"type":"object","properties":{"rolling_update":{"$ref":"#/definitions/StatefulSetRollingUpdateStrategyEntity"},"type":{"type":"string"}},"description":"StatefulSetUpdateStrategyEntity数据模型"},"StatefulSetVolumeClaimTemplateEntity":{"type":"object","properties":{"metadata":{"$ref":"#/definitions/StatefulSetVolumeClaimTemplateMetadataEntity"},"spec":{"$ref":"#/definitions/StatefulSetVolumeClaimTemplateSpecEntity"}},"description":"StatefulSetVolumeClaimTemplateEntity数据模型"},"StatefulSetVolumeClaimTemplateMetadataEntity":{"type":"object","properties":{"annotations":{"type":"object","additionalProperties":true},"labels":{"type":"object","additionalProperties":true},"name":{"type":"string"}},"description":"StatefulSetVolumeClaimTemplateMetadataEntity数据模型"},"StatefulSetVolumeClaimTemplateSpecEntity":{"type":"object","properties":{"access_modes":{"type":"array","items":{"type":"string"}},"data_source":{"$ref":"#/definitions/StatefulSetTypedLocalObjectReferenceEntity"},"resources":{"$ref":"#/definitions/StatefulSetResourceRequirementsEntity"},"selector":{"$ref":"#/definitions/StatefulSetSelectorEntity"},"storage_class_name":{"type":"string"},"volume_mode":{"type":"string"},"volume_name":{"type":"string"}},"description":"StatefulSetVolumeClaimTemplateSpecEntity数据模型"},"StatefulSetVolumeEntity":{"type":"object","properties":{"config_map":{"$ref":"#/definitions/StatefulSetConfigMapVolumeSourceEntity"},"empty_dir":{"$ref":"#/definitions/StatefulSetEmptyDirVolumeSourceEntity"},"host_path":{"$ref":"#/definitions/StatefulSetHostPathVolumeSourceEntity"},"name":{"type":"string"},"persistent_volume_claim":{"$ref":"#/definitions/StatefulSetPersistentVolumeClaimVolumeSourceEntity"},"secret":{"$ref":"#/definitions/StatefulSetSecretVolumeSourceEntity"}},"description":"StatefulSetVolumeEntity数据模型"},"StatefulSetVolumeMountEntity":{"type":"object","properties":{"mount_path":{"type":"string"},"mount_propagation":{"type":"string"},"name":{"type":"string"},"read_only":{"type":"boolean"},"sub_path":{"type":"string"}},"description":"StatefulSetVolumeMountEntity数据模型"},"StatefulSetWeightedPodAffinityTermEntity":{"type":"object","properties":{"pod_affinity_term":{"$ref":"#/definitions/StatefulSetPodAffinityTermEntity"},"weight":{"type":"integer"}},"description":"StatefulSetWeightedPodAffinityTermEntity数据模型"},"StatefulSetWindowsSecurityContextOptionsEntity":{"type":"object","properties":{"gmsa_credential_spec":{"type":"string"},"gmsa_credential_spec_name":{"type":"string"},"host_process":{"type":"object"},"run_as_user_name":{"type":"string"}},"description":"StatefulSetWindowsSecurityContextOptionsEntity数据模型"},"StatusDistributionItem":{"type":"object","properties":{"count":{"type":"integer"},"status":{"type":"integer"}},"description":"StatusDistributionItem数据模型"},"StorageStatsInfo":{"type":"object","properties":{"available_pv":{"type":"integer"},"bound_pv":{"type":"integer"},"bound_pvc":{"type":"integer"},"pending_pvc":{"type":"integer"},"storage_classes":{"type":"integer"},"total_capacity":{"type":"string"},"total_pv":{"type":"integer"},"total_pvc":{"type":"integer"}},"description":"StorageStatsInfo数据模型"},"Subject":{"type":"object","properties":{"api_group":{"type":"string"},"kind":{"type":"string"},"name":{"type":"string"},"namespace":{"type":"string"}},"description":"Subject数据模型"},"SubjectPermissionsReq":{"type":"object","properties":{"cluster_id":{"type":"integer","description":"集群ID"},"subject":{"$ref":"#/definitions/Subject","description":"主体"}},"required":["cluster_id","subject"],"description":"SubjectPermissionsReq数据模型"},"SubjectPermissionsResponse":{"type":"object","properties":{"cluster_roles":{"type":"array","items":{"type":"string"}},"permissions":{"type":"array","items":{"type":"string"}},"roles":{"type":"array","items":{"type":"string"}},"subject":{"$ref":"#/definitions/Subject"}},"description":"SubjectPermissionsResponse数据模型"},"SubjectStatEntity":{"type":"object","properties":{"count":{"type":"integer"},"kind":{"type":"string"}},"description":"SubjectStatEntity数据模型"},"SubmitWorkorderInstanceReq":{"type":"object","properties":{"id":{"type":"integer"}},"required":["id"],"description":"SubmitWorkorderInstanceReq数据模型"},"System":{"type":"object","properties":{"arch":{"type":"string","description":"系统架构"},"cpu_cores":{"type":"integer","description":"CPU核心数"},"cpu_model":{"type":"string","description":"CPU型号"},"cpu_usage":{"type":"number","description":"CPU使用率"},"disk_total":{"type":"integer","description":"总磁盘空间GB"},"disk_usage":{"type":"number","description":"磁盘使用率"},"disk_used":{"type":"integer","description":"已用磁盘空间GB"},"hostname":{"type":"string","description":"主机名"},"last_update_time":{"type":"integer"},"load_avg_1":{"type":"number","description":"1分钟负载"},"load_avg_15":{"type":"number","description":"15分钟负载"},"load_avg_5":{"type":"number","description":"5分钟负载"},"memory_total":{"type":"integer","description":"总内存MB"},"memory_usage":{"type":"number","description":"内存使用率"},"memory_used":{"type":"integer","description":"已用内存MB"},"network_in":{"type":"integer","description":"网络入流量MB"},"network_out":{"type":"integer","description":"网络出流量MB"},"os":{"type":"string","description":"操作系统"},"os_version":{"type":"string","description":"操作系统版本"},"process_count":{"type":"integer","description":"进程数"},"uptime":{"type":"integer","description":"系统运行时长秒"}},"description":"System数据模型"},"SystemInfoResponse":{"type":"object","properties":{"disk_usage_formatted":{"type":"string"},"memory_usage_formatted":{"type":"string"},"system_status":{"type":"string"},"uptime_formatted":{"type":"string"}},"description":"SystemInfoResponse数据模型"},"Taint":{"type":"object","properties":{"effect":{"type":"string"},"key":{"type":"string"},"value":{"type":"string"}},"required":["key","effect"],"description":"Taint数据模型"},"TaintK8sNodesReq":{"type":"object","properties":{"cluster_id":{"type":"integer"},"mod_type":{"type":"string"},"node_name":{"type":"string"},"taint_yaml":{"type":"string"}},"required":["node_name","cluster_id"],"description":"TaintK8sNodesReq数据模型"},"TokenRequest":{"type":"object","properties":{"account_type":{"type":"integer"},"refreshToken":{"type":"string"},"ssid":{"type":"string"},"user_id":{"type":"integer"},"username":{"type":"string"}},"required":["refreshToken","user_id","username","ssid","account_type"],"description":"TokenRequest数据模型"},"Toleration":{"type":"object","properties":{"effect":{"type":"string","description":"影响"},"key":{"type":"string","description":"键"},"operator":{"type":"string","description":"操作符"},"toleration_seconds":{"type":"object","description":"容忍时间"},"value":{"type":"string","description":"值"}},"description":"Toleration数据模型"},"Tool":{"type":"object","properties":{"description":{"type":"string"},"metadata":{"type":"object","additionalProperties":true},"name":{"type":"string"},"parameters":{"$ref":"#/definitions/ToolParameters"}},"description":"Tool数据模型"},"ToolBlacklist":{"type":"object","properties":{"tools":{"type":"array","items":{"type":"string"}}},"description":"ToolBlacklist数据模型"},"ToolParameters":{"type":"object","properties":{"properties":{"type":"object","additionalProperties":true},"required":{"type":"array","items":{"type":"string"}},"type":{"type":"string"}},"description":"ToolParameters数据模型"},"ToolWhitelist":{"type":"object","properties":{"tools":{"type":"array","items":{"type":"string"}}},"description":"ToolWhitelist数据模型"},"TreeLocalResource":{"type":"object","properties":{"auth_mode":{"type":"object"},"cpu":{"type":"integer","description":"CPU核数"},"create_user_id":{"type":"integer"},"create_user_name":{"type":"string","description":"创建者姓名"},"description":{"type":"string","description":"资源描述"},"disk":{"type":"integer","description":"系统盘大小,单位GiB"},"environment":{"type":"string","description":"环境标识,如dev,prod"},"image_name":{"type":"string","description":"镜像名称"},"ip_addr":{"type":"string","description":"主IP地址"},"key":{"type":"string","description":"密钥"},"memory":{"type":"integer","description":"内存大小,单位GiB"},"name":{"type":"string","description":"资源名称"},"os_name":{"type":"string","description":"操作系统名称"},"os_type":{"type":"string","description":"操作系统类型,如win,linux"},"port":{"type":"integer"},"status":{"type":"object"},"tags":{"type":"object","description":"资源标签集合"},"tree_nodes":{"type":"array","items":{"type":"string"}},"username":{"type":"string"}},"description":"TreeLocalResource数据模型"},"TreeNode":{"type":"object","properties":{"admins":{"type":"array","items":{"type":"string"}},"children":{"type":"array","items":{"type":"string"}},"create_user_id":{"type":"integer"},"create_user_name":{"type":"string","description":"创建者姓名"},"description":{"type":"string","description":"节点描述"},"is_leaf":{"type":"integer"},"level":{"type":"integer"},"members":{"type":"array","items":{"type":"string"}},"name":{"type":"string","description":"节点名称"},"parent_id":{"type":"integer"},"status":{"type":"object","description":"节点状态, 1:活跃 2:非活跃"},"tree_local_resources":{"type":"array","items":{"type":"string"}}},"description":"TreeNode数据模型"},"TreeNodeStatisticsResp":{"type":"object","properties":{"active_nodes":{"type":"integer"},"inactive_nodes":{"type":"integer"},"total_admins":{"type":"integer"},"total_members":{"type":"integer"},"total_nodes":{"type":"integer"},"total_resources":{"type":"integer"}},"description":"TreeNodeStatisticsResp数据模型"},"TypeDistributionItem":{"type":"object","properties":{"count":{"type":"integer"},"type":{"type":"string"}},"description":"TypeDistributionItem数据模型"},"UnBindTreeLocalResourceReq":{"type":"object","properties":{"id":{"type":"integer"},"tree_node_ids":{"type":"array","items":{"type":"integer"}}},"description":"UnBindTreeLocalResourceReq数据模型"},"UnbindTreeNodeResourceReq":{"type":"object","properties":{"node_id":{"type":"integer"},"resource_id":{"type":"integer"}},"required":["node_id","resource_id"],"description":"UnbindTreeNodeResourceReq数据模型"},"UpdateApiRequest":{"type":"object","properties":{"category":{"type":"integer"},"description":{"type":"string"},"id":{"type":"integer"},"is_public":{"type":"integer"},"method":{"type":"integer"},"name":{"type":"string"},"path":{"type":"string"},"version":{"type":"string"}},"required":["id","name","path","method"],"description":"UpdateApiRequest数据模型"},"UpdateClusterReq":{"type":"object","properties":{"action_timeout_seconds":{"type":"integer"},"cpu_limit":{"type":"string"},"cpu_request":{"type":"string"},"env":{"type":"string"},"id":{"type":"integer"},"kube_config_content":{"type":"string"},"memory_limit":{"type":"string"},"memory_request":{"type":"string"},"name":{"type":"string"},"name_zh":{"type":"string"},"restricted_name_space":{"type":"array","items":{"type":"string"}}},"required":["id","name","name_zh"],"description":"UpdateClusterReq数据模型"},"UpdateClusterRoleBindingReq":{"type":"object","properties":{"annotations":{"type":"object","description":"注解","additionalProperties":true},"cluster_id":{"type":"integer","description":"集群ID"},"labels":{"type":"object","description":"标签","additionalProperties":true},"name":{"type":"string","description":"ClusterRoleBinding名称"},"original_name":{"type":"string","description":"原始名称"},"role_ref":{"$ref":"#/definitions/RoleRef","description":"角色引用"},"subjects":{"type":"array","items":{"type":"string"},"description":"主体列表"}},"required":["cluster_id","name","role_ref","subjects"],"description":"UpdateClusterRoleBindingReq数据模型"},"UpdateClusterRoleReq":{"type":"object","properties":{"annotations":{"type":"object","description":"注解","additionalProperties":true},"cluster_id":{"type":"integer","description":"集群ID"},"labels":{"type":"object","description":"标签","additionalProperties":true},"name":{"type":"string","description":"ClusterRole名称"},"original_name":{"type":"string","description":"原始名称"},"rules":{"type":"array","items":{"type":"string"},"description":"权限规则"}},"required":["cluster_id","name","rules"],"description":"UpdateClusterRoleReq数据模型"},"UpdateMCPConfigReq":{"type":"object","properties":{"id":{"type":"integer"},"url":{"type":"string"}},"required":["id","url"],"description":"UpdateMCPConfigReq数据模型"},"UpdateMonitorAlertManagerPoolReq":{"type":"object","properties":{"alert_manager_instances":{"type":"object"},"group_by":{"type":"object"},"group_interval":{"type":"string"},"group_wait":{"type":"string"},"id":{"type":"integer"},"name":{"type":"string"},"receiver":{"type":"string"},"repeat_interval":{"type":"string"},"resolve_timeout":{"type":"string"}},"required":["id","name","alert_manager_instances","receiver"],"description":"UpdateMonitorAlertManagerPoolReq数据模型"},"UpdateMonitorAlertRuleReq":{"type":"object","properties":{"annotations":{"type":"object"},"enable":{"type":"integer"},"expr":{"type":"string"},"for_time":{"type":"string"},"grafana_link":{"type":"string"},"id":{"type":"integer"},"ip_address":{"type":"string"},"labels":{"type":"object"},"name":{"type":"string"},"pool_id":{"type":"integer"},"send_group_id":{"type":"integer"},"severity":{"type":"object"}},"required":["id","name","pool_id","send_group_id","expr","for_time"],"description":"UpdateMonitorAlertRuleReq数据模型"},"UpdateMonitorConfigReq":{"type":"object","properties":{"config_content":{"type":"string"},"config_type":{"type":"integer"},"id":{"type":"integer"},"instance_ip":{"type":"string"},"name":{"type":"string"},"pool_id":{"type":"integer"},"status":{"type":"integer"}},"required":["id","name"],"description":"UpdateMonitorConfigReq数据模型"},"UpdateMonitorOnDutyGroupReq":{"type":"object","properties":{"description":{"type":"string"},"enable":{"type":"object"},"id":{"type":"integer"},"name":{"type":"string"},"shift_days":{"type":"integer"},"user_ids":{"type":"array","items":{"type":"integer"}}},"required":["id","name","shift_days","user_ids"],"description":"UpdateMonitorOnDutyGroupReq数据模型"},"UpdateMonitorRecordRuleReq":{"type":"object","properties":{"enable":{"type":"integer"},"expr":{"type":"string"},"id":{"type":"integer"},"ip_address":{"type":"string"},"labels":{"type":"object"},"name":{"type":"string"},"pool_id":{"type":"integer"}},"required":["id","name","pool_id","expr"],"description":"UpdateMonitorRecordRuleReq数据模型"},"UpdateMonitorScrapeJobReq":{"type":"object","properties":{"bearer_token":{"type":"string"},"bearer_token_file":{"type":"string"},"enable":{"type":"integer"},"id":{"type":"integer"},"ip_address":{"type":"string"},"kube_config_file_path":{"type":"string"},"kubernetes_sd_role":{"type":"string"},"metrics_path":{"type":"string"},"name":{"type":"string"},"pool_id":{"type":"integer"},"port":{"type":"integer"},"refresh_interval":{"type":"integer"},"relabel_configs_yaml_string":{"type":"string"},"scheme":{"type":"string"},"scrape_interval":{"type":"integer"},"scrape_timeout":{"type":"integer"},"service_discovery_type":{"type":"object"},"tags":{"type":"object"},"tls_ca_content":{"type":"string"},"tls_ca_file_path":{"type":"string"},"tree_node_ids":{"type":"object"}},"required":["id","name"],"description":"UpdateMonitorScrapeJobReq数据模型"},"UpdateMonitorScrapePoolReq":{"type":"object","properties":{"alert_manager_url":{"type":"string"},"id":{"type":"integer"},"name":{"type":"string"},"prometheus_instances":{"type":"object"},"record_file_path":{"type":"string"},"remote_read_url":{"type":"string"},"remote_timeout_seconds":{"type":"integer"},"remote_write_url":{"type":"string"},"rule_file_path":{"type":"string"},"scrape_interval":{"type":"integer"},"scrape_timeout":{"type":"integer"},"support_alert":{"type":"integer"},"support_record":{"type":"integer"},"tags":{"type":"object"},"user_id":{"type":"integer"}},"required":["id","name"],"description":"UpdateMonitorScrapePoolReq数据模型"},"UpdateMonitorSendGroupReq":{"type":"object","properties":{"enable":{"type":"integer"},"fei_shu_qun_robot_token":{"type":"string"},"first_upgrade_users":{"type":"array","items":{"type":"string"}},"id":{"type":"integer"},"name":{"type":"string"},"name_zh":{"type":"string"},"need_upgrade":{"type":"integer"},"notify_methods":{"type":"object"},"on_duty_group_id":{"type":"integer"},"pool_id":{"type":"integer"},"repeat_interval":{"type":"string"},"second_upgrade_users":{"type":"array","items":{"type":"string"}},"send_resolved":{"type":"integer"},"static_receive_users":{"type":"array","items":{"type":"string"}},"upgrade_minutes":{"type":"integer"}},"required":["id","name","name_zh","pool_id"],"description":"UpdateMonitorSendGroupReq数据模型"},"UpdateNamespaceReq":{"type":"object","properties":{"annotations":{"type":"array","items":{"type":"string"}},"cluster_id":{"type":"integer"},"labels":{"type":"array","items":{"type":"string"}},"namespace":{"type":"string"}},"required":["cluster_id","namespace"],"description":"UpdateNamespaceReq数据模型"},"UpdateProfileReq":{"type":"object","properties":{"account_type":{"type":"integer"},"avatar":{"type":"string"},"desc":{"type":"string"},"email":{"type":"string"},"enable":{"type":"integer"},"fei_shu_user_id":{"type":"string"},"home_path":{"type":"string"},"id":{"type":"integer"},"mobile":{"type":"string"},"real_name":{"type":"string"}},"required":["id","real_name","mobile","account_type","home_path"],"description":"UpdateProfileReq数据模型"},"UpdateRoleBindingReq":{"type":"object","properties":{"annotations":{"type":"object","description":"注解","additionalProperties":true},"cluster_id":{"type":"integer","description":"集群ID"},"labels":{"type":"object","description":"标签","additionalProperties":true},"name":{"type":"string","description":"RoleBinding名称"},"namespace":{"type":"string","description":"命名空间"},"original_name":{"type":"string","description":"原始名称"},"role_ref":{"$ref":"#/definitions/RoleRef","description":"角色引用"},"subjects":{"type":"array","items":{"type":"string"},"description":"主体列表"}},"required":["cluster_id","name","namespace","role_ref","subjects"],"description":"UpdateRoleBindingReq数据模型"},"UpdateRoleReq":{"type":"object","properties":{"annotations":{"type":"object","description":"注解","additionalProperties":true},"cluster_id":{"type":"integer","description":"集群ID"},"labels":{"type":"object","description":"标签","additionalProperties":true},"name":{"type":"string","description":"Role名称"},"namespace":{"type":"string","description":"命名空间"},"original_name":{"type":"string","description":"原始名称"},"rules":{"type":"array","items":{"type":"string"},"description":"权限规则"}},"required":["cluster_id","name","namespace","rules"],"description":"UpdateRoleReq数据模型"},"UpdateRoleRequest":{"type":"object","properties":{"api_ids":{"type":"array","items":{"type":"integer"}},"code":{"type":"string"},"description":{"type":"string"},"id":{"type":"integer"},"name":{"type":"string"},"status":{"type":"integer"}},"required":["id","name","code"],"description":"UpdateRoleRequest数据模型"},"UpdateToolBlacklistReq":{"type":"object","properties":{"id":{"type":"integer"},"tools":{"type":"array","items":{"type":"string"}}},"required":["id","tools"],"description":"UpdateToolBlacklistReq数据模型"},"UpdateToolReq":{"type":"object","properties":{"description":{"type":"string"},"metadata":{"type":"object","additionalProperties":true},"name":{"type":"string"},"parameters":{"$ref":"#/definitions/ToolParameters"}},"required":["name"],"description":"UpdateToolReq数据模型"},"UpdateToolWhitelistReq":{"type":"object","properties":{"id":{"type":"integer"},"tools":{"type":"array","items":{"type":"string"}}},"required":["id","tools"],"description":"UpdateToolWhitelistReq数据模型"},"UpdateTreeLocalResourceReq":{"type":"object","properties":{"auth_mode":{"type":"object"},"description":{"type":"string"},"environment":{"type":"string"},"id":{"type":"integer"},"image_name":{"type":"string"},"ip_addr":{"type":"string"},"key":{"type":"string"},"name":{"type":"string"},"os_name":{"type":"string"},"os_type":{"type":"string"},"password":{"type":"string"},"port":{"type":"integer"},"tags":{"type":"object"},"username":{"type":"string"}},"description":"UpdateTreeLocalResourceReq数据模型"},"UpdateTreeNodeReq":{"type":"object","properties":{"description":{"type":"string"},"id":{"type":"integer"},"is_leaf":{"type":"integer"},"name":{"type":"string"},"parent_id":{"type":"integer"},"status":{"type":"object"}},"required":["id","name"],"description":"UpdateTreeNodeReq数据模型"},"UpdateTreeNodeStatusReq":{"type":"object","properties":{"id":{"type":"integer"},"status":{"type":"object"}},"required":["id","status"],"description":"UpdateTreeNodeStatusReq数据模型"},"UpdateWorkorderCategoryReq":{"type":"object","properties":{"description":{"type":"string"},"id":{"type":"integer"},"name":{"type":"string"},"status":{"type":"integer"}},"required":["id","name","status"],"description":"UpdateWorkorderCategoryReq数据模型"},"UpdateWorkorderFormDesignReq":{"type":"object","properties":{"category_id":{"type":"object"},"description":{"type":"string"},"id":{"type":"integer"},"is_template":{"type":"integer"},"name":{"type":"string"},"schema":{"$ref":"#/definitions/FormSchema"},"status":{"type":"integer"},"tags":{"type":"object"}},"required":["id"],"description":"UpdateWorkorderFormDesignReq数据模型"},"UpdateWorkorderInstanceCommentReq":{"type":"object","properties":{"content":{"type":"string"},"id":{"type":"integer"},"is_system":{"type":"integer"},"status":{"type":"integer"}},"required":["id","content"],"description":"UpdateWorkorderInstanceCommentReq数据模型"},"UpdateWorkorderInstanceReq":{"type":"object","properties":{"assignee_id":{"type":"object"},"completed_at":{"type":"string","format":"date-time"},"description":{"type":"string"},"due_date":{"type":"string","format":"date-time"},"form_data":{"type":"object"},"id":{"type":"integer"},"priority":{"type":"integer"},"status":{"type":"integer"},"tags":{"type":"object"},"title":{"type":"string"}},"required":["id"],"description":"UpdateWorkorderInstanceReq数据模型"},"UpdateWorkorderInstanceTimelineReq":{"type":"object","properties":{"action_detail":{"type":"string"},"comment":{"type":"string"},"id":{"type":"integer"}},"required":["id"],"description":"UpdateWorkorderInstanceTimelineReq数据模型"},"UpdateWorkorderNotificationReq":{"type":"object","properties":{"category_id":{"type":"object"},"channels":{"type":"object"},"description":{"type":"string"},"event_types":{"type":"object"},"id":{"type":"integer"},"is_default":{"type":"integer"},"max_retries":{"type":"integer"},"message_template":{"type":"string"},"name":{"type":"string"},"priority":{"type":"integer"},"process_id":{"type":"object"},"recipient_depts":{"type":"object"},"recipient_roles":{"type":"object"},"recipient_types":{"type":"object"},"recipient_users":{"type":"object"},"repeat_interval":{"type":"object"},"retry_interval":{"type":"integer"},"scheduled_time":{"type":"string","format":"date-time"},"settings":{"type":"object"},"status":{"type":"integer"},"subject_template":{"type":"string"},"template_id":{"type":"object"},"trigger_condition":{"type":"object"},"trigger_type":{"type":"string"}},"required":["id"],"description":"UpdateWorkorderNotificationReq数据模型"},"UpdateWorkorderProcessReq":{"type":"object","properties":{"category_id":{"type":"object"},"definition":{"$ref":"#/definitions/ProcessDefinition"},"description":{"type":"string"},"form_design_id":{"type":"integer"},"id":{"type":"integer"},"is_default":{"type":"integer"},"name":{"type":"string"},"status":{"type":"integer"},"tags":{"type":"object"}},"required":["id"],"description":"UpdateWorkorderProcessReq数据模型"},"UpdateWorkorderTemplateReq":{"type":"object","properties":{"category_id":{"type":"object"},"default_values":{"type":"object"},"description":{"type":"string"},"form_design_id":{"type":"integer"},"id":{"type":"integer"},"name":{"type":"string"},"process_id":{"type":"integer"},"status":{"type":"integer"},"tags":{"type":"object"}},"required":["id"],"description":"UpdateWorkorderTemplateReq数据模型"},"User":{"type":"object","properties":{"account_type":{"type":"integer","description":"账号类型 1普通用户 2服务账号"},"apis":{"type":"array","items":{"type":"string"},"description":"关联接口"},"avatar":{"type":"string","description":"用户头像"},"desc":{"type":"string","description":"用户描述"},"domain":{"type":"string","description":"用户域"},"email":{"type":"string","description":"邮箱"},"enable":{"type":"integer","description":"用户状态 1正常 2冻结"},"fei_shu_user_id":{"type":"string","description":"飞书用户ID"},"home_path":{"type":"string","description":"登录后的默认首页"},"mobile":{"type":"string","description":"手机号"},"real_name":{"type":"string","description":"用户真实姓名"},"username":{"type":"string","description":"用户登录名"}},"description":"User数据模型"},"UserInfo":{"type":"object","properties":{"ip":{"type":"string"},"userAgent":{"type":"string"},"userId":{"type":"integer"},"username":{"type":"string"}},"description":"UserInfo数据模型"},"UserLoginReq":{"type":"object","properties":{"password":{"type":"string"},"username":{"type":"string"}},"required":["username","password"],"description":"UserLoginReq数据模型"},"UserRole":{"type":"object","properties":{"id":{"type":"integer","description":"主键ID"},"role_id":{"type":"integer","description":"角色ID"},"user_id":{"type":"integer","description":"用户ID"}},"description":"UserRole数据模型"},"UserSignUpReq":{"type":"object","properties":{"account_type":{"type":"integer"},"avatar":{"type":"string"},"desc":{"type":"string"},"email":{"type":"string"},"enable":{"type":"integer"},"fei_shu_user_id":{"type":"string"},"home_path":{"type":"string"},"mobile":{"type":"string"},"password":{"type":"string"},"real_name":{"type":"string"},"username":{"type":"string"}},"required":["username","password","mobile","real_name","account_type"],"description":"UserSignUpReq数据模型"},"UserStatistics":{"type":"object","properties":{"active_user_count":{"type":"integer"},"admin_count":{"type":"integer"}},"description":"UserStatistics数据模型"},"Volume":{"type":"object","properties":{"mount_path":{"type":"string"},"name":{"type":"string"},"read_only":{"type":"boolean"},"size":{"type":"string"},"source_name":{"type":"string"},"sub_path":{"type":"string"},"type":{"type":"string"}},"description":"Volume数据模型"},"VolumeNodeAffinityRequest":{"type":"object","properties":{"required":{"type":"object","description":"必须满足的节点选择器"}},"description":"VolumeNodeAffinityRequest数据模型"},"WorkloadStatsInfo":{"type":"object","properties":{"configmaps":{"type":"integer"},"cronjobs":{"type":"integer"},"daemonsets":{"type":"integer"},"deployments":{"type":"integer"},"ingresses":{"type":"integer"},"jobs":{"type":"integer"},"secrets":{"type":"integer"},"services":{"type":"integer"},"statefulsets":{"type":"integer"}},"description":"WorkloadStatsInfo数据模型"},"WorkorderCategory":{"type":"object","properties":{"description":{"type":"string","description":"分类描述"},"name":{"type":"string","description":"分类名称"},"operator_id":{"type":"integer","description":"操作人ID"},"operator_name":{"type":"string","description":"操作人名称"},"status":{"type":"integer","description":"状态:1-启用,2-禁用"}},"description":"WorkorderCategory数据模型"},"WorkorderFormDesign":{"type":"object","properties":{"category":{"type":"object"},"category_id":{"type":"object","description":"分类ID"},"description":{"type":"string","description":"表单描述"},"is_template":{"type":"integer","description":"是否为模板:1-是,2-否"},"name":{"type":"string","description":"表单名称"},"operator_id":{"type":"integer","description":"操作人ID"},"operator_name":{"type":"string","description":"操作人名称"},"schema":{"type":"object","description":"表单JSON结构"},"status":{"type":"integer","description":"状态:1-草稿,2-已发布,3-已归档"},"tags":{"type":"object","description":"标签"}},"description":"WorkorderFormDesign数据模型"},"WorkorderInstance":{"type":"object","properties":{"assignee_id":{"type":"object","description":"当前处理人ID"},"comments":{"type":"array","items":{"type":"string"}},"completed_at":{"type":"string","format":"date-time","description":"完成时间"},"current_step_id":{"type":"object","description":"当前步骤ID"},"description":{"type":"string","description":"详细描述"},"due_date":{"type":"string","format":"date-time","description":"截止时间"},"flow_logs":{"type":"array","items":{"type":"string"}},"form_data":{"type":"object","description":"表单数据"},"operator_id":{"type":"integer","description":"操作人ID"},"operator_name":{"type":"string","description":"操作人名称"},"priority":{"type":"integer","description":"优先级:1-高,2-中,3-低"},"process":{"type":"object"},"process_id":{"type":"integer","description":"流程ID"},"serial_number":{"type":"string","description":"工单编号"},"status":{"type":"integer","description":"状态"},"tags":{"type":"object","description":"标签"},"timeline":{"type":"array","items":{"type":"string"}},"title":{"type":"string","description":"工单标题"}},"description":"WorkorderInstance数据模型"},"WorkorderInstanceComment":{"type":"object","properties":{"children":{"type":"array","items":{"type":"string"}},"content":{"type":"string","description":"评论内容"},"instance_id":{"type":"integer","description":"工单实例ID"},"is_system":{"type":"integer","description":"是否系统评论:1-是,2-否"},"operator_id":{"type":"integer","description":"操作人ID"},"operator_name":{"type":"string","description":"操作人名称"},"parent_id":{"type":"object","description":"父评论ID,如果没有父评论,则不传"},"status":{"type":"integer","description":"状态:1-正常,2-已删除,3-已隐藏"},"type":{"type":"string","description":"评论类型"}},"description":"WorkorderInstanceComment数据模型"},"WorkorderInstanceFlow":{"type":"object","properties":{"action":{"type":"string","description":"流转动作"},"comment":{"type":"string","description":"审批意见或处理说明"},"from_status":{"type":"integer","description":"变更前状态"},"instance_id":{"type":"integer","description":"工单实例ID"},"is_system_action":{"type":"integer","description":"是否为系统自动操作:1-是,2-否"},"operator_id":{"type":"integer","description":"操作人ID"},"operator_name":{"type":"string","description":"操作人名称"},"to_status":{"type":"integer","description":"变更后状态"}},"description":"WorkorderInstanceFlow数据模型"},"WorkorderInstanceTimeline":{"type":"object","properties":{"action":{"type":"string","description":"操作类型"},"action_detail":{"type":"string","description":"操作详情(JSON格式)"},"comment":{"type":"string","description":"操作备注或说明"},"instance_id":{"type":"integer","description":"工单实例ID"},"operator_id":{"type":"integer","description":"操作人ID"},"operator_name":{"type":"string","description":"操作人名称"},"related_id":{"type":"object","description":"关联记录ID(如评论ID、附件ID等)"}},"description":"WorkorderInstanceTimeline数据模型"},"WorkorderNotification":{"type":"object","properties":{"category_id":{"type":"object","description":"关联分类ID"},"channels":{"type":"object","description":"通知渠道"},"description":{"type":"string","description":"通知配置描述"},"event_types":{"type":"object","description":"触发事件类型"},"is_default":{"type":"integer","description":"是否默认配置:1-是,2-否"},"max_retries":{"type":"integer","description":"最大重试次数"},"message_template":{"type":"string","description":"消息模板"},"name":{"type":"string","description":"通知配置名称"},"operator_id":{"type":"integer","description":"操作人ID"},"priority":{"type":"integer","description":"优先级:1-高,2-中,3-低"},"process_id":{"type":"object","description":"关联流程ID"},"recipient_depts":{"type":"object","description":"接收人部门ID"},"recipient_roles":{"type":"object","description":"接收人角色ID"},"recipient_types":{"type":"object","description":"接收人类型"},"recipient_users":{"type":"object","description":"自定义接收人用户ID"},"repeat_interval":{"type":"object","description":"重复间隔(分钟)"},"retry_interval":{"type":"integer","description":"重试间隔(分钟)"},"scheduled_time":{"type":"string","format":"date-time","description":"定时发送时间"},"settings":{"type":"object","description":"通知设置"},"status":{"type":"integer","description":"状态:1-启用,2-禁用"},"subject_template":{"type":"string","description":"主题模板"},"template_id":{"type":"object","description":"关联模板ID"},"trigger_condition":{"type":"object","description":"触发条件"},"trigger_type":{"type":"string","description":"触发类型"}},"description":"WorkorderNotification数据模型"},"WorkorderNotificationChannel":{"type":"object","properties":{"channels":{"type":"object"}},"description":"WorkorderNotificationChannel数据模型"},"WorkorderNotificationLog":{"type":"object","properties":{"channel":{"type":"string","description":"发送渠道"},"content":{"type":"string","description":"发送内容"},"cost":{"type":"object","description":"发送成本"},"delivered_at":{"type":"string","format":"date-time","description":"送达时间"},"error_message":{"type":"string","description":"错误信息"},"event_type":{"type":"string","description":"触发事件类型"},"extended_data":{"type":"object","description":"扩展数据"},"instance_id":{"type":"object","description":"工单实例ID"},"next_retry_at":{"type":"string","format":"date-time","description":"下次重试时间"},"notification_id":{"type":"integer","description":"通知配置ID"},"read_at":{"type":"string","format":"date-time","description":"阅读时间"},"recipient_addr":{"type":"string","description":"接收人地址"},"recipient_id":{"type":"string","description":"接收人ID"},"recipient_name":{"type":"string","description":"接收人名称"},"recipient_type":{"type":"string","description":"接收人类型"},"response_data":{"type":"object","description":"响应数据"},"retry_count":{"type":"integer","description":"重试次数"},"send_at":{"type":"string","format":"date-time","description":"发送时间"},"sender_id":{"type":"integer","description":"发送人ID"},"status":{"type":"integer","description":"发送状态:1-待发送,2-发送中,3-发送成功,4-发送失败"},"subject":{"type":"string","description":"消息主题"}},"description":"WorkorderNotificationLog数据模型"},"WorkorderNotificationQueue":{"type":"object","properties":{"channel":{"type":"string","description":"发送渠道"},"content":{"type":"string","description":"发送内容"},"error_message":{"type":"string","description":"错误信息"},"event_type":{"type":"string","description":"触发事件类型"},"extended_data":{"type":"object","description":"扩展数据"},"instance_id":{"type":"object","description":"工单实例ID"},"next_retry_at":{"type":"string","format":"date-time","description":"下次重试时间"},"notification_id":{"type":"integer","description":"通知配置ID"},"priority":{"type":"integer","description":"优先级:1-高,2-中,3-低"},"processed_at":{"type":"string","format":"date-time","description":"处理时间"},"recipient_addr":{"type":"string","description":"接收人地址"},"recipient_id":{"type":"string","description":"接收人ID"},"recipient_type":{"type":"string","description":"接收人类型"},"retry_count":{"type":"integer","description":"重试次数"},"scheduled_at":{"type":"string","format":"date-time","description":"计划发送时间"},"status":{"type":"integer","description":"状态:1-待处理,2-处理中,3-处理成功,4-处理失败"},"subject":{"type":"string","description":"消息主题"}},"description":"WorkorderNotificationQueue数据模型"},"WorkorderProcess":{"type":"object","properties":{"category":{"type":"object","description":"分类"},"category_id":{"type":"object","description":"分类ID"},"definition":{"type":"object","description":"流程JSON定义"},"description":{"type":"string","description":"流程描述"},"form_design":{"type":"object","description":"关联表单设计"},"form_design_id":{"type":"integer","description":"关联表单设计ID"},"is_default":{"type":"integer","description":"是否为默认流程:1-是,2-否"},"name":{"type":"string","description":"流程名称"},"operator_id":{"type":"integer","description":"操作人ID"},"operator_name":{"type":"string","description":"操作人名称"},"status":{"type":"integer","description":"状态:1-草稿,2-已发布,3-已归档"},"tags":{"type":"object","description":"标签"}},"description":"WorkorderProcess数据模型"},"WorkorderTemplate":{"type":"object","properties":{"category":{"type":"object"},"category_id":{"type":"object","description":"分类ID"},"default_values":{"type":"object","description":"默认值JSON"},"description":{"type":"string","description":"模板描述"},"form_design":{"type":"object"},"form_design_id":{"type":"integer","description":"关联的表单设计ID"},"name":{"type":"string","description":"模板名称"},"operator_id":{"type":"integer","description":"操作人ID"},"operator_name":{"type":"string","description":"操作人名称"},"process":{"type":"object"},"process_id":{"type":"integer","description":"关联的流程ID"},"status":{"type":"integer","description":"状态:1-启用,2-禁用"},"tags":{"type":"object","description":"标签"}},"description":"WorkorderTemplate数据模型"},"WriteOffReq":{"type":"object","properties":{"password":{"type":"string"},"username":{"type":"string"}},"required":["username","password"],"description":"WriteOffReq数据模型"},"YamlTaskApplyReq":{"type":"object","properties":{"id":{"type":"integer","description":"任务ID"}},"required":["id"],"description":"YamlTaskApplyReq数据模型"},"YamlTaskCreateReq":{"type":"object","properties":{"cluster_id":{"type":"integer","description":"集群ID"},"name":{"type":"string","description":"YAML任务名称"},"template_id":{"type":"integer","description":"关联的模板ID"},"user_id":{"type":"integer","description":"创建者用户ID"},"variables":{"type":"object","description":"yaml变量,格式k=v,k=v"}},"required":["name"],"description":"YamlTaskCreateReq数据模型"},"YamlTaskDeleteReq":{"type":"object","properties":{"id":{"type":"integer","description":"任务ID"}},"required":["id"],"description":"YamlTaskDeleteReq数据模型"},"YamlTaskUpdateReq":{"type":"object","properties":{"cluster_id":{"type":"integer","description":"集群ID"},"id":{"type":"integer","description":"任务ID"},"name":{"type":"string","description":"YAML任务名称"},"template_id":{"type":"integer","description":"关联的模板ID"},"user_id":{"type":"integer","description":"创建者用户ID"},"variables":{"type":"object","description":"yaml变量,格式k=v,k=v"}},"required":["id","name"],"description":"YamlTaskUpdateReq数据模型"},"YamlTemplateCheckReq":{"type":"object","properties":{"cluster_id":{"type":"integer","description":"对应集群ID"},"content":{"type":"string","description":"yaml模板内容"},"name":{"type":"string","description":"模板名称"}},"required":["name","content"],"description":"YamlTemplateCheckReq数据模型"},"YamlTemplateCreateReq":{"type":"object","properties":{"cluster_id":{"type":"integer","description":"对应集群ID"},"content":{"type":"string","description":"yaml模板内容"},"name":{"type":"string","description":"模板名称"},"user_id":{"type":"integer","description":"创建者用户ID"}},"required":["name","content"],"description":"YamlTemplateCreateReq数据模型"},"YamlTemplateDeleteReq":{"type":"object","properties":{"cluster_id":{"type":"integer","description":"集群ID"},"id":{"type":"integer","description":"模板ID"}},"required":["id","cluster_id"],"description":"YamlTemplateDeleteReq数据模型"},"YamlTemplateGetReq":{"type":"object","properties":{"cluster_id":{"type":"integer","description":"集群ID"},"id":{"type":"integer","description":"模板ID"}},"required":["id","cluster_id"],"description":"YamlTemplateGetReq数据模型"},"YamlTemplateUpdateReq":{"type":"object","properties":{"cluster_id":{"type":"integer","description":"对应集群ID"},"content":{"type":"string","description":"yaml模板内容"},"id":{"type":"integer","description":"模板ID"},"name":{"type":"string","description":"模板名称"},"user_id":{"type":"integer","description":"创建者用户ID"}},"required":["id","name","content"],"description":"YamlTemplateUpdateReq数据模型"},"alertHashPayload":{"type":"object","properties":{"alert_manager_instances":{"type":"array","items":{"type":"string"}},"group_by":{"type":"array","items":{"type":"string"}},"group_interval":{"type":"string"},"group_wait":{"type":"string"},"name":{"type":"string"},"receiver":{"type":"string"},"repeat_interval":{"type":"string"},"resolve_timeout":{"type":"string"}},"description":"alertHashPayload数据模型"},"promHashPayload":{"type":"object","properties":{"alert_manager_instances":{"type":"array","items":{"type":"string"}},"alert_manager_url":{"type":"string"},"external_labels":{"type":"array","items":{"type":"string"}},"name":{"type":"string"},"prometheus_instances":{"type":"array","items":{"type":"string"}},"record_file_path":{"type":"string"},"remote_read_url":{"type":"string"},"remote_timeout_seconds":{"type":"integer"},"remote_write_url":{"type":"string"},"scrape_interval":{"type":"integer"},"scrape_timeout":{"type":"integer"},"support_alert":{"type":"integer"},"support_record":{"type":"integer"}},"description":"promHashPayload数据模型"}},"securityDefinitions":{"BearerAuth":{"type":"apiKey","name":"Authorization","in":"header","description":"Bearer Token认证"}},"tags":[{"name":"K8s","description":"K8s相关接口"},{"name":"K8sNode","description":"K8sNode相关接口"},{"name":"Monitor","description":"Monitor相关接口"},{"name":"AlertPool","description":"AlertPool相关接口"},{"name":"K8sPV","description":"K8sPV相关接口"},{"name":"K8sYamlTask","description":"K8sYamlTask相关接口"},{"name":"V1","description":"V1相关接口"},{"name":"WebHook","description":"WebHook相关接口"},{"name":"Workorder","description":"Workorder相关接口"},{"name":"Notification","description":"Notification相关接口"},{"name":"K8sEvent","description":"K8sEvent相关接口"},{"name":"User","description":"User相关接口"},{"name":"Role","description":"Role相关接口"},{"name":"Audit","description":"Audit相关接口"},{"name":"K8sDaemonSet","description":"K8sDaemonSet相关接口"},{"name":"OnDutyGroup","description":"OnDutyGroup相关接口"},{"name":"AlertRule","description":"AlertRule相关接口"},{"name":"K8sServiceAccount","description":"K8sServiceAccount相关接口"},{"name":"K8sPVC","description":"K8sPVC相关接口"},{"name":"Template","description":"Template相关接口"},{"name":"FormDesign","description":"FormDesign相关接口"},{"name":"RecordRule","description":"RecordRule相关接口"},{"name":"K8sSecret","description":"K8sSecret相关接口"},{"name":"SendGroup","description":"SendGroup相关接口"},{"name":"InstanceComment","description":"InstanceComment相关接口"},{"name":"K8sNamespace","description":"K8sNamespace相关接口"},{"name":"Apis","description":"Apis相关接口"},{"name":"Api","description":"Api相关接口"},{"name":"Instance","description":"Instance相关接口"},{"name":"K8sTaint","description":"K8sTaint相关接口"},{"name":"Tree","description":"Tree相关接口"},{"name":"TreeLocal","description":"TreeLocal相关接口"},{"name":"K8sCluster","description":"K8sCluster相关接口"},{"name":"ScrapeJob","description":"ScrapeJob相关接口"},{"name":"System","description":"System相关接口"},{"name":"AlertEvent","description":"AlertEvent相关接口"},{"name":"TreeNode","description":"TreeNode相关接口"},{"name":"MonitorConfig","description":"MonitorConfig相关接口"},{"name":"K8sConfigMap","description":"K8sConfigMap相关接口"},{"name":"InstanceTimeLine","description":"InstanceTimeLine相关接口"},{"name":"K8sDeployment","description":"K8sDeployment相关接口"},{"name":"K8sYamlTemplate","description":"K8sYamlTemplate相关接口"},{"name":"CategoryGroup","description":"CategoryGroup相关接口"},{"name":"K8sIngress","description":"K8sIngress相关接口"},{"name":"K8sStatefulSet","description":"K8sStatefulSet相关接口"},{"name":"ScrapePool","description":"ScrapePool相关接口"},{"name":"InstanceFlow","description":"InstanceFlow相关接口"},{"name":"K8sSvc","description":"K8sSvc相关接口"},{"name":"K8sPod","description":"K8sPod相关接口"},{"name":"WorkorderProcess","description":"WorkorderProcess相关接口"},{"name":"Not_auth","description":"Not_auth相关接口"},{"name":"NotAuth","description":"NotAuth相关接口"}]}` diff --git a/env.example b/env.example index 142a97f2..a85e58c1 100644 --- a/env.example +++ b/env.example @@ -107,20 +107,3 @@ FEISHU_WEBHOOK=https://open.feishu.cn/open-apis/bot/v2/hook/your-webhook-url # Tavily搜索配置 TAVILY_API_KEY= - -# ============================================================================ -# Swagger服务配置 -# ============================================================================ - -# 是否启用Swagger生成(默认: true) -# 在生产环境中可以设置为 false 以禁用Swagger -SWAGGER_ENABLED=false - -# 项目根目录路径(等同于 -root 参数) -SWAGGER_ROOT= - -# 输出目录路径(等同于 -output 参数) -SWAGGER_OUTPUT= - -# 是否启用详细输出(等同于 -v 参数) -SWAGGER_VERBOSE=false \ No newline at end of file diff --git a/generate.go b/generate.go index ef05fc1a..8b81343d 100644 --- a/generate.go +++ b/generate.go @@ -28,16 +28,6 @@ // Run `go generate` in the project root to execute all generation tasks. package main -//go:generate bash -c "echo '🔄 正在生成 Swagger 文档...'" -//go:generate bash -c "echo '[INFO] 使用生成模式(无需手动注释)...'" -//go:generate bash -c "echo '[INFO] 构建生成工具...'" -//go:generate bash -c "cd tools/swagger-auto-gen && go build -o swagger-auto-gen ." -//go:generate bash -c "echo '[INFO] 分析项目结构并生成文档...'" -//go:generate bash -c "./tools/swagger-auto-gen/swagger-auto-gen -root . -output ./docs -v" -//go:generate bash -c "if [ -f docs/swagger.json ]; then echo '[SUCCESS] 文档生成成功!文件大小: $(du -h docs/swagger.json | cut -f1)'; else echo '[ERROR] 文档生成失败'; fi" -//go:generate bash -c "echo '[INFO] 访问地址: http://localhost:8889/swagger/index.html'" -//go:generate bash -c "echo '✅ Swagger 文档生成完成!'" - // Generate wire dependency injection code (if wire.go exists) //go:generate bash -c "if [ -f 'pkg/di/wire.go' ]; then cd pkg/di && wire; echo '✅ Wire 依赖注入代码生成完成'; fi" diff --git a/go.mod b/go.mod index 010d0f1a..8c53e504 100644 --- a/go.mod +++ b/go.mod @@ -28,9 +28,6 @@ require ( github.com/redis/go-redis/v9 v9.8.0 github.com/spf13/pflag v1.0.6 github.com/spf13/viper v1.19.0 - github.com/swaggo/files v1.0.1 - github.com/swaggo/gin-swagger v1.6.0 - github.com/swaggo/swag v1.16.6 go.uber.org/zap v1.27.0 golang.org/x/crypto v0.41.0 golang.org/x/sync v0.16.0 @@ -66,7 +63,6 @@ require ( github.com/Azure/azure-sdk-for-go/sdk/internal v1.11.1 // indirect github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161 // indirect github.com/AzureAD/microsoft-authentication-library-for-go v1.4.2 // indirect - github.com/KyleBanks/depth v1.2.1 // indirect github.com/MakeNowJust/heredoc v1.0.0 // indirect github.com/alecthomas/units v0.0.0-20240927000941-0f3dac36c52b // indirect github.com/armon/go-metrics v0.4.1 // indirect @@ -115,7 +111,6 @@ require ( github.com/go-logr/stdr v1.2.2 // indirect github.com/go-openapi/jsonpointer v0.21.0 // indirect github.com/go-openapi/jsonreference v0.21.0 // indirect - github.com/go-openapi/spec v0.21.0 // indirect github.com/go-openapi/swag v0.23.0 // indirect github.com/go-sql-driver/mysql v1.8.1 // indirect github.com/goccy/go-json v0.10.5 // indirect diff --git a/go.sum b/go.sum index 0de748f3..7da18650 100644 --- a/go.sum +++ b/go.sum @@ -56,8 +56,6 @@ github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03 github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= github.com/HdrHistogram/hdrhistogram-go v1.1.2/go.mod h1:yDgFjdqOqDEKOvasDdhWNXYg9BVp4O+o5f6V/ehm6Oo= -github.com/KyleBanks/depth v1.2.1 h1:5h8fQADFrWtarTdtDudMmGsC7GPbOAu6RVB3ffsVFHc= -github.com/KyleBanks/depth v1.2.1/go.mod h1:jzSb9d0L43HxTQfT+oSA1EEp2q+ne2uh6XgeJcm8brE= github.com/MakeNowJust/heredoc v1.0.0 h1:cXCdzVdstXyiTqTvfqk9SDHpKNjxuom+DOlyEeQ4pzQ= github.com/MakeNowJust/heredoc v1.0.0/go.mod h1:mG5amYoWBHf8vpLOuehzbGGw0EHxpZZ6lCpQ4fNJ8LE= github.com/Microsoft/go-winio v0.6.1 h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migciow= @@ -229,8 +227,6 @@ github.com/go-openapi/jsonpointer v0.21.0 h1:YgdVicSA9vH5RiHs9TZW5oyafXZFc6+2Vc1 github.com/go-openapi/jsonpointer v0.21.0/go.mod h1:IUyH9l/+uyhIYQ/PXVA41Rexl+kOkAPDdXEYns6fzUY= github.com/go-openapi/jsonreference v0.21.0 h1:Rs+Y7hSXT83Jacb7kFyjn4ijOuVGSvOdF2+tg1TRrwQ= github.com/go-openapi/jsonreference v0.21.0/go.mod h1:LmZmgsrTkVg9LG4EaHeY8cBDslNPMo06cago5JNLkm4= -github.com/go-openapi/spec v0.21.0 h1:LTVzPc3p/RzRnkQqLRndbAzjY0d0BCL72A6j3CdL9ZY= -github.com/go-openapi/spec v0.21.0/go.mod h1:78u6VdPw81XU44qEWGhtr982gJ5BWg2c0I5XwVMotYk= github.com/go-openapi/swag v0.23.0 h1:vsEVJDUo2hPJ2tu0/Xc+4noaxyEffXNIs3cOULZ+GrE= github.com/go-openapi/swag v0.23.0/go.mod h1:esZ8ITTYEsH1V2trKHjAN8Ai7xHb8RV+YSZ577vPjgQ= github.com/go-playground/assert/v2 v2.2.0 h1:JvknZsQTYeFEAhQwI4qEt9cyV5ONwRHC+lYKSsYSR8s= @@ -668,12 +664,6 @@ github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= github.com/subosito/gotenv v1.6.0 h1:9NlTDc1FTs4qu0DDq7AEtTPNw6SVm7uBMsUCUjABIf8= github.com/subosito/gotenv v1.6.0/go.mod h1:Dk4QP5c2W3ibzajGcXpNraDfq2IrhjMIvMSWPKKo0FU= -github.com/swaggo/files v1.0.1 h1:J1bVJ4XHZNq0I46UU90611i9/YzdrF7x92oX1ig5IdE= -github.com/swaggo/files v1.0.1/go.mod h1:0qXmMNH6sXNf+73t65aKeB+ApmgxdnkQzVTAj2uaMUg= -github.com/swaggo/gin-swagger v1.6.0 h1:y8sxvQ3E20/RCyrXeFfg60r6H0Z+SwpTjMYsMm+zy8M= -github.com/swaggo/gin-swagger v1.6.0/go.mod h1:BG00cCEy294xtVpyIAHG6+e2Qzj/xKlRdOqDkvq0uzo= -github.com/swaggo/swag v1.16.6 h1:qBNcx53ZaX+M5dxVyTrgQ0PJ/ACK+NzhwcbieTt+9yI= -github.com/swaggo/swag v1.16.6/go.mod h1:ngP2etMK5a0P3QBizic5MEwpRmluJZPHjXcMoj4Xesg= github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM= github.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI= github.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08= @@ -813,7 +803,6 @@ golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= -golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= golang.org/x/net v0.15.0/go.mod h1:idbUs1IY1+zTqbi8yxTbhexhEEk5ur9LInksu6HrEpk= golang.org/x/net v0.20.0/go.mod h1:z8BVo6PvndSri0LbOE3hAn0apkU+1YvI6E70E9jsnvY= diff --git a/internal/constants/user.go b/internal/constants/user.go index 165eb6ce..de70e182 100644 --- a/internal/constants/user.go +++ b/internal/constants/user.go @@ -27,13 +27,18 @@ package constants import "errors" -// Http Error Code +// Http Error Code 与用户常量 const ( UserSignUpFailedErrorCode = 400001 + iota UserExistErrorCode UserNotExistErrorCode ) +const ( + AccountTypeUser int8 = 1 // 普通用户 + AccountTypeService int8 = 2 // 服务账号 +) + var ( ErrorUserNotExist = errors.New("user not exists") ErrorPasswordIncorrect = errors.New("user password incorrect") diff --git a/internal/cron/api/cron_api.go b/internal/cron/api/cron_api.go index f02fd441..c9271221 100644 --- a/internal/cron/api/cron_api.go +++ b/internal/cron/api/cron_api.go @@ -28,7 +28,8 @@ package api import ( "github.com/GoSimplicity/AI-CloudOps/internal/cron/service" "github.com/GoSimplicity/AI-CloudOps/internal/model" - "github.com/GoSimplicity/AI-CloudOps/pkg/utils" + "github.com/GoSimplicity/AI-CloudOps/pkg/base" + "github.com/GoSimplicity/AI-CloudOps/pkg/jwt" "github.com/gin-gonic/gin" "go.uber.org/zap" ) @@ -65,12 +66,12 @@ func (api *CronJobHandler) RegisterRouters(server *gin.Engine) { func (api *CronJobHandler) CreateCronJob(ctx *gin.Context) { var req model.CreateCronJobReq - user := ctx.MustGet("user").(utils.UserClaims) + user := ctx.MustGet("user").(jwt.UserClaims) req.CreatedBy = user.Uid req.CreatedByName = user.Username - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return nil, api.cronService.CreateCronJob(ctx, &req) }) } @@ -79,41 +80,41 @@ func (api *CronJobHandler) CreateCronJob(ctx *gin.Context) { func (api *CronJobHandler) UpdateCronJob(ctx *gin.Context) { var req model.UpdateCronJobReq - id, err := utils.GetParamID(ctx) + id, err := base.GetParamID(ctx) if err != nil { - utils.ErrorWithMessage(ctx, err.Error()) + base.ErrorWithMessage(ctx, err.Error()) return } req.ID = id - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return nil, api.cronService.UpdateCronJob(ctx, &req) }) } // DeleteCronJob 删除任务 func (api *CronJobHandler) DeleteCronJob(ctx *gin.Context) { - id, err := utils.GetParamID(ctx) + id, err := base.GetParamID(ctx) if err != nil { - utils.ErrorWithMessage(ctx, err.Error()) + base.ErrorWithMessage(ctx, err.Error()) return } - utils.HandleRequest(ctx, nil, func() (interface{}, error) { + base.HandleRequest(ctx, nil, func() (interface{}, error) { return nil, api.cronService.DeleteCronJob(ctx, id) }) } // GetCronJob 获取任务详情 func (api *CronJobHandler) GetCronJob(ctx *gin.Context) { - id, err := utils.GetParamID(ctx) + id, err := base.GetParamID(ctx) if err != nil { - utils.ErrorWithMessage(ctx, err.Error()) + base.ErrorWithMessage(ctx, err.Error()) return } - utils.HandleRequest(ctx, nil, func() (interface{}, error) { + base.HandleRequest(ctx, nil, func() (interface{}, error) { return api.cronService.GetCronJob(ctx, id) }) } @@ -122,46 +123,46 @@ func (api *CronJobHandler) GetCronJob(ctx *gin.Context) { func (api *CronJobHandler) GetCronJobList(ctx *gin.Context) { var req model.GetCronJobListReq - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return api.cronService.GetCronJobList(ctx, &req) }) } // EnableCronJob 启用任务 func (api *CronJobHandler) EnableCronJob(ctx *gin.Context) { - id, err := utils.GetParamID(ctx) + id, err := base.GetParamID(ctx) if err != nil { - utils.ErrorWithMessage(ctx, err.Error()) + base.ErrorWithMessage(ctx, err.Error()) return } - utils.HandleRequest(ctx, nil, func() (interface{}, error) { + base.HandleRequest(ctx, nil, func() (interface{}, error) { return nil, api.cronService.EnableCronJob(ctx, id) }) } // DisableCronJob 禁用任务 func (api *CronJobHandler) DisableCronJob(ctx *gin.Context) { - id, err := utils.GetParamID(ctx) + id, err := base.GetParamID(ctx) if err != nil { - utils.ErrorWithMessage(ctx, err.Error()) + base.ErrorWithMessage(ctx, err.Error()) return } - utils.HandleRequest(ctx, nil, func() (interface{}, error) { + base.HandleRequest(ctx, nil, func() (interface{}, error) { return nil, api.cronService.DisableCronJob(ctx, id) }) } // TriggerCronJob 手动触发任务 func (api *CronJobHandler) TriggerCronJob(ctx *gin.Context) { - id, err := utils.GetParamID(ctx) + id, err := base.GetParamID(ctx) if err != nil { - utils.ErrorWithMessage(ctx, err.Error()) + base.ErrorWithMessage(ctx, err.Error()) return } - utils.HandleRequest(ctx, nil, func() (interface{}, error) { + base.HandleRequest(ctx, nil, func() (interface{}, error) { return nil, api.cronService.TriggerCronJob(ctx, id) }) } @@ -170,7 +171,7 @@ func (api *CronJobHandler) TriggerCronJob(ctx *gin.Context) { func (api *CronJobHandler) ValidateSchedule(ctx *gin.Context) { var req model.ValidateScheduleReq - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return api.cronService.ValidateSchedule(ctx, &req) }) } diff --git a/internal/cron/service/cron_service.go b/internal/cron/service/cron_service.go index ae67a374..a48e44cb 100644 --- a/internal/cron/service/cron_service.go +++ b/internal/cron/service/cron_service.go @@ -35,7 +35,7 @@ import ( "github.com/GoSimplicity/AI-CloudOps/internal/cron/handler" "github.com/GoSimplicity/AI-CloudOps/internal/cron/scheduler" "github.com/GoSimplicity/AI-CloudOps/internal/model" - userDao "github.com/GoSimplicity/AI-CloudOps/internal/user/dao" + userDao "github.com/GoSimplicity/AI-CloudOps/internal/system/dao" "github.com/hibiken/asynq" "github.com/robfig/cron/v3" "go.uber.org/zap" @@ -387,7 +387,7 @@ func (s *cronService) fillCreatedByName(ctx context.Context, job *model.CronJob) } // 查询用户信息 - user, err := s.userDAO.GetUserByID(ctx, job.CreatedBy) + user, err := s.userDAO.GetByID(ctx, job.CreatedBy) if err != nil { s.logger.Warn("查询创建者信息失败", zap.Int("jobID", job.ID), diff --git a/internal/k8s/api/cluster.go b/internal/k8s/api/cluster.go index 88ffdda9..1262746b 100644 --- a/internal/k8s/api/cluster.go +++ b/internal/k8s/api/cluster.go @@ -28,7 +28,8 @@ package api import ( "github.com/GoSimplicity/AI-CloudOps/internal/k8s/service" "github.com/GoSimplicity/AI-CloudOps/internal/model" - "github.com/GoSimplicity/AI-CloudOps/pkg/utils" + "github.com/GoSimplicity/AI-CloudOps/pkg/base" + "github.com/GoSimplicity/AI-CloudOps/pkg/jwt" "github.com/gin-gonic/gin" ) @@ -57,7 +58,7 @@ func (h *K8sClusterHandler) RegisterRouters(server *gin.Engine) { func (h *K8sClusterHandler) GetClusterList(ctx *gin.Context) { var req model.ListClustersReq - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return h.clusterService.ListClusters(ctx, &req) }) } @@ -65,15 +66,15 @@ func (h *K8sClusterHandler) GetClusterList(ctx *gin.Context) { func (h *K8sClusterHandler) GetCluster(ctx *gin.Context) { var req model.GetClusterReq - id, err := utils.GetCustomParamID(ctx, "cluster_id") + id, err := base.GetCustomParamID(ctx, "cluster_id") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } req.ID = id - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return h.clusterService.GetClusterByID(ctx, &req) }) } @@ -81,12 +82,12 @@ func (h *K8sClusterHandler) GetCluster(ctx *gin.Context) { func (h *K8sClusterHandler) CreateCluster(ctx *gin.Context) { var req model.CreateClusterReq - uc := ctx.MustGet("user").(utils.UserClaims) + uc := ctx.MustGet("user").(jwt.UserClaims) req.CreateUserID = uc.Uid req.CreateUserName = uc.Username - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return nil, h.clusterService.CreateCluster(ctx, &req) }) } @@ -94,15 +95,15 @@ func (h *K8sClusterHandler) CreateCluster(ctx *gin.Context) { func (h *K8sClusterHandler) UpdateCluster(ctx *gin.Context) { var req model.UpdateClusterReq - id, err := utils.GetCustomParamID(ctx, "cluster_id") + id, err := base.GetCustomParamID(ctx, "cluster_id") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } req.ID = id - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return nil, h.clusterService.UpdateCluster(ctx, &req) }) } @@ -110,15 +111,15 @@ func (h *K8sClusterHandler) UpdateCluster(ctx *gin.Context) { func (h *K8sClusterHandler) DeleteCluster(ctx *gin.Context) { var req model.DeleteClusterReq - id, err := utils.GetCustomParamID(ctx, "cluster_id") + id, err := base.GetCustomParamID(ctx, "cluster_id") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } req.ID = id - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return nil, h.clusterService.DeleteCluster(ctx, &req) }) } @@ -127,15 +128,15 @@ func (h *K8sClusterHandler) DeleteCluster(ctx *gin.Context) { func (h *K8sClusterHandler) RefreshCluster(ctx *gin.Context) { var req model.RefreshClusterReq - id, err := utils.GetCustomParamID(ctx, "cluster_id") + id, err := base.GetCustomParamID(ctx, "cluster_id") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } req.ID = id - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return nil, h.clusterService.RefreshClusterStatus(ctx, &req) }) } diff --git a/internal/k8s/api/clusterrole.go b/internal/k8s/api/clusterrole.go index ab1a226c..e80ba843 100644 --- a/internal/k8s/api/clusterrole.go +++ b/internal/k8s/api/clusterrole.go @@ -28,7 +28,7 @@ package api import ( "github.com/GoSimplicity/AI-CloudOps/internal/k8s/service" "github.com/GoSimplicity/AI-CloudOps/internal/model" - "github.com/GoSimplicity/AI-CloudOps/pkg/utils" + "github.com/GoSimplicity/AI-CloudOps/pkg/base" "github.com/gin-gonic/gin" ) @@ -59,15 +59,15 @@ func (h *K8sClusterRoleHandler) RegisterRouters(server *gin.Engine) { func (h *K8sClusterRoleHandler) GetClusterRoleList(ctx *gin.Context) { var req model.GetClusterRoleListReq - clusterID, err := utils.GetCustomParamID(ctx, "cluster_id") + clusterID, err := base.GetCustomParamID(ctx, "cluster_id") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } req.ClusterID = clusterID - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return h.clusterRoleService.GetClusterRoleList(ctx, &req) }) } @@ -75,22 +75,22 @@ func (h *K8sClusterRoleHandler) GetClusterRoleList(ctx *gin.Context) { func (h *K8sClusterRoleHandler) GetClusterRoleDetails(ctx *gin.Context) { var req model.GetClusterRoleDetailsReq - clusterID, err := utils.GetCustomParamID(ctx, "cluster_id") + clusterID, err := base.GetCustomParamID(ctx, "cluster_id") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } - name, err := utils.GetParamCustomName(ctx, "name") + name, err := base.GetParamCustomName(ctx, "name") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } req.ClusterID = clusterID req.Name = name - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return h.clusterRoleService.GetClusterRoleDetails(ctx, &req) }) } @@ -98,22 +98,22 @@ func (h *K8sClusterRoleHandler) GetClusterRoleDetails(ctx *gin.Context) { func (h *K8sClusterRoleHandler) GetClusterRoleYaml(ctx *gin.Context) { var req model.GetClusterRoleYamlReq - clusterID, err := utils.GetCustomParamID(ctx, "cluster_id") + clusterID, err := base.GetCustomParamID(ctx, "cluster_id") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } - name, err := utils.GetParamCustomName(ctx, "name") + name, err := base.GetParamCustomName(ctx, "name") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } req.ClusterID = clusterID req.Name = name - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return h.clusterRoleService.GetClusterRoleYaml(ctx, &req) }) } @@ -121,15 +121,15 @@ func (h *K8sClusterRoleHandler) GetClusterRoleYaml(ctx *gin.Context) { func (h *K8sClusterRoleHandler) CreateClusterRole(ctx *gin.Context) { var req model.CreateClusterRoleReq - clusterID, err := utils.GetCustomParamID(ctx, "cluster_id") + clusterID, err := base.GetCustomParamID(ctx, "cluster_id") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } req.ClusterID = clusterID - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return nil, h.clusterRoleService.CreateClusterRole(ctx, &req) }) } @@ -137,15 +137,15 @@ func (h *K8sClusterRoleHandler) CreateClusterRole(ctx *gin.Context) { func (h *K8sClusterRoleHandler) CreateClusterRoleByYaml(ctx *gin.Context) { var req model.CreateClusterRoleByYamlReq - clusterID, err := utils.GetCustomParamID(ctx, "cluster_id") + clusterID, err := base.GetCustomParamID(ctx, "cluster_id") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } req.ClusterID = clusterID - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return nil, h.clusterRoleService.CreateClusterRoleByYaml(ctx, &req) }) } @@ -153,22 +153,22 @@ func (h *K8sClusterRoleHandler) CreateClusterRoleByYaml(ctx *gin.Context) { func (h *K8sClusterRoleHandler) UpdateClusterRole(ctx *gin.Context) { var req model.UpdateClusterRoleReq - clusterID, err := utils.GetCustomParamID(ctx, "cluster_id") + clusterID, err := base.GetCustomParamID(ctx, "cluster_id") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } - name, err := utils.GetParamCustomName(ctx, "name") + name, err := base.GetParamCustomName(ctx, "name") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } req.ClusterID = clusterID req.Name = name - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return nil, h.clusterRoleService.UpdateClusterRole(ctx, &req) }) } @@ -176,22 +176,22 @@ func (h *K8sClusterRoleHandler) UpdateClusterRole(ctx *gin.Context) { func (h *K8sClusterRoleHandler) UpdateClusterRoleByYaml(ctx *gin.Context) { var req model.UpdateClusterRoleByYamlReq - clusterID, err := utils.GetCustomParamID(ctx, "cluster_id") + clusterID, err := base.GetCustomParamID(ctx, "cluster_id") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } - name, err := utils.GetParamCustomName(ctx, "name") + name, err := base.GetParamCustomName(ctx, "name") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } req.ClusterID = clusterID req.Name = name - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return nil, h.clusterRoleService.UpdateClusterRoleYaml(ctx, &req) }) } @@ -199,22 +199,22 @@ func (h *K8sClusterRoleHandler) UpdateClusterRoleByYaml(ctx *gin.Context) { func (h *K8sClusterRoleHandler) DeleteClusterRole(ctx *gin.Context) { var req model.DeleteClusterRoleReq - clusterID, err := utils.GetCustomParamID(ctx, "cluster_id") + clusterID, err := base.GetCustomParamID(ctx, "cluster_id") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } - name, err := utils.GetParamCustomName(ctx, "name") + name, err := base.GetParamCustomName(ctx, "name") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } req.ClusterID = clusterID req.Name = name - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return nil, h.clusterRoleService.DeleteClusterRole(ctx, &req) }) } diff --git a/internal/k8s/api/clusterrolebinding.go b/internal/k8s/api/clusterrolebinding.go index d7b22a5a..18d05fcf 100644 --- a/internal/k8s/api/clusterrolebinding.go +++ b/internal/k8s/api/clusterrolebinding.go @@ -28,7 +28,7 @@ package api import ( "github.com/GoSimplicity/AI-CloudOps/internal/k8s/service" "github.com/GoSimplicity/AI-CloudOps/internal/model" - "github.com/GoSimplicity/AI-CloudOps/pkg/utils" + "github.com/GoSimplicity/AI-CloudOps/pkg/base" "github.com/gin-gonic/gin" ) @@ -59,14 +59,14 @@ func (h *K8sClusterRoleBindingHandler) RegisterRouters(server *gin.Engine) { func (h *K8sClusterRoleBindingHandler) GetClusterRoleBindingList(ctx *gin.Context) { var req model.GetClusterRoleBindingListReq - clusterID, err := utils.GetCustomParamID(ctx, "cluster_id") + clusterID, err := base.GetCustomParamID(ctx, "cluster_id") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } req.ClusterID = clusterID - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return h.clusterRoleBindingService.GetClusterRoleBindingList(ctx, &req) }) } @@ -74,22 +74,22 @@ func (h *K8sClusterRoleBindingHandler) GetClusterRoleBindingList(ctx *gin.Contex func (h *K8sClusterRoleBindingHandler) GetClusterRoleBindingDetails(ctx *gin.Context) { var req model.GetClusterRoleBindingDetailsReq - clusterID, err := utils.GetCustomParamID(ctx, "cluster_id") + clusterID, err := base.GetCustomParamID(ctx, "cluster_id") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } - name, err := utils.GetParamCustomName(ctx, "name") + name, err := base.GetParamCustomName(ctx, "name") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } req.ClusterID = clusterID req.Name = name - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return h.clusterRoleBindingService.GetClusterRoleBindingDetails(ctx, &req) }) } @@ -97,7 +97,7 @@ func (h *K8sClusterRoleBindingHandler) GetClusterRoleBindingDetails(ctx *gin.Con func (h *K8sClusterRoleBindingHandler) CreateClusterRoleBinding(ctx *gin.Context) { var req model.CreateClusterRoleBindingReq - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return nil, h.clusterRoleBindingService.CreateClusterRoleBinding(ctx, &req) }) } @@ -105,15 +105,15 @@ func (h *K8sClusterRoleBindingHandler) CreateClusterRoleBinding(ctx *gin.Context func (h *K8sClusterRoleBindingHandler) CreateClusterRoleBindingByYaml(ctx *gin.Context) { var req model.CreateClusterRoleBindingByYamlReq - clusterID, err := utils.GetCustomParamID(ctx, "cluster_id") + clusterID, err := base.GetCustomParamID(ctx, "cluster_id") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } req.ClusterID = clusterID - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return nil, h.clusterRoleBindingService.CreateClusterRoleBindingByYaml(ctx, &req) }) } @@ -121,22 +121,22 @@ func (h *K8sClusterRoleBindingHandler) CreateClusterRoleBindingByYaml(ctx *gin.C func (h *K8sClusterRoleBindingHandler) UpdateClusterRoleBinding(ctx *gin.Context) { var req model.UpdateClusterRoleBindingReq - clusterID, err := utils.GetCustomParamID(ctx, "cluster_id") + clusterID, err := base.GetCustomParamID(ctx, "cluster_id") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } - name, err := utils.GetParamCustomName(ctx, "name") + name, err := base.GetParamCustomName(ctx, "name") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } req.ClusterID = clusterID req.Name = name - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return nil, h.clusterRoleBindingService.UpdateClusterRoleBinding(ctx, &req) }) } @@ -144,22 +144,22 @@ func (h *K8sClusterRoleBindingHandler) UpdateClusterRoleBinding(ctx *gin.Context func (h *K8sClusterRoleBindingHandler) DeleteClusterRoleBinding(ctx *gin.Context) { var req model.DeleteClusterRoleBindingReq - clusterID, err := utils.GetCustomParamID(ctx, "cluster_id") + clusterID, err := base.GetCustomParamID(ctx, "cluster_id") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } - name, err := utils.GetParamCustomName(ctx, "name") + name, err := base.GetParamCustomName(ctx, "name") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } req.ClusterID = clusterID req.Name = name - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return nil, h.clusterRoleBindingService.DeleteClusterRoleBinding(ctx, &req) }) } @@ -167,22 +167,22 @@ func (h *K8sClusterRoleBindingHandler) DeleteClusterRoleBinding(ctx *gin.Context func (h *K8sClusterRoleBindingHandler) GetClusterRoleBindingYaml(ctx *gin.Context) { var req model.GetClusterRoleBindingYamlReq - clusterID, err := utils.GetCustomParamID(ctx, "cluster_id") + clusterID, err := base.GetCustomParamID(ctx, "cluster_id") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } - name, err := utils.GetParamCustomName(ctx, "name") + name, err := base.GetParamCustomName(ctx, "name") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } req.ClusterID = clusterID req.Name = name - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return h.clusterRoleBindingService.GetClusterRoleBindingYaml(ctx, &req) }) } @@ -190,22 +190,22 @@ func (h *K8sClusterRoleBindingHandler) GetClusterRoleBindingYaml(ctx *gin.Contex func (h *K8sClusterRoleBindingHandler) UpdateClusterRoleBindingYaml(ctx *gin.Context) { var req model.UpdateClusterRoleBindingByYamlReq - clusterID, err := utils.GetCustomParamID(ctx, "cluster_id") + clusterID, err := base.GetCustomParamID(ctx, "cluster_id") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } - name, err := utils.GetParamCustomName(ctx, "name") + name, err := base.GetParamCustomName(ctx, "name") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } req.ClusterID = clusterID req.Name = name - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return nil, h.clusterRoleBindingService.UpdateClusterRoleBindingYaml(ctx, &req) }) } diff --git a/internal/k8s/api/configmap.go b/internal/k8s/api/configmap.go index c82854e6..c0b1f95e 100644 --- a/internal/k8s/api/configmap.go +++ b/internal/k8s/api/configmap.go @@ -28,7 +28,7 @@ package api import ( "github.com/GoSimplicity/AI-CloudOps/internal/k8s/service" "github.com/GoSimplicity/AI-CloudOps/internal/model" - "github.com/GoSimplicity/AI-CloudOps/pkg/utils" + "github.com/GoSimplicity/AI-CloudOps/pkg/base" "github.com/gin-gonic/gin" ) @@ -61,15 +61,15 @@ func (h *K8sConfigMapHandler) RegisterRouters(server *gin.Engine) { func (h *K8sConfigMapHandler) GetConfigMapList(ctx *gin.Context) { var req model.GetConfigMapListReq - clusterID, err := utils.GetCustomParamID(ctx, "cluster_id") + clusterID, err := base.GetCustomParamID(ctx, "cluster_id") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } req.ClusterID = clusterID - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return h.configMapService.GetConfigMapList(ctx, &req) }) } @@ -77,21 +77,21 @@ func (h *K8sConfigMapHandler) GetConfigMapList(ctx *gin.Context) { func (h *K8sConfigMapHandler) GetConfigMap(ctx *gin.Context) { var req model.GetConfigMapDetailsReq - clusterID, err := utils.GetCustomParamID(ctx, "cluster_id") + clusterID, err := base.GetCustomParamID(ctx, "cluster_id") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } - namespace, err := utils.GetParamCustomName(ctx, "namespace") + namespace, err := base.GetParamCustomName(ctx, "namespace") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } - name, err := utils.GetParamCustomName(ctx, "name") + name, err := base.GetParamCustomName(ctx, "name") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } @@ -99,7 +99,7 @@ func (h *K8sConfigMapHandler) GetConfigMap(ctx *gin.Context) { req.Namespace = namespace req.Name = name - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return h.configMapService.GetConfigMap(ctx, &req) }) } @@ -107,15 +107,15 @@ func (h *K8sConfigMapHandler) GetConfigMap(ctx *gin.Context) { func (h *K8sConfigMapHandler) CreateConfigMap(ctx *gin.Context) { var req model.CreateConfigMapReq - clusterID, err := utils.GetCustomParamID(ctx, "cluster_id") + clusterID, err := base.GetCustomParamID(ctx, "cluster_id") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } req.ClusterID = clusterID - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return nil, h.configMapService.CreateConfigMap(ctx, &req) }) } @@ -123,21 +123,21 @@ func (h *K8sConfigMapHandler) CreateConfigMap(ctx *gin.Context) { func (h *K8sConfigMapHandler) UpdateConfigMap(ctx *gin.Context) { var req model.UpdateConfigMapReq - clusterID, err := utils.GetCustomParamID(ctx, "cluster_id") + clusterID, err := base.GetCustomParamID(ctx, "cluster_id") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } - namespace, err := utils.GetParamCustomName(ctx, "namespace") + namespace, err := base.GetParamCustomName(ctx, "namespace") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } - name, err := utils.GetParamCustomName(ctx, "name") + name, err := base.GetParamCustomName(ctx, "name") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } @@ -145,7 +145,7 @@ func (h *K8sConfigMapHandler) UpdateConfigMap(ctx *gin.Context) { req.Namespace = namespace req.Name = name - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return nil, h.configMapService.UpdateConfigMap(ctx, &req) }) } @@ -153,21 +153,21 @@ func (h *K8sConfigMapHandler) UpdateConfigMap(ctx *gin.Context) { func (h *K8sConfigMapHandler) DeleteConfigMap(ctx *gin.Context) { var req model.DeleteConfigMapReq - clusterID, err := utils.GetCustomParamID(ctx, "cluster_id") + clusterID, err := base.GetCustomParamID(ctx, "cluster_id") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } - namespace, err := utils.GetParamCustomName(ctx, "namespace") + namespace, err := base.GetParamCustomName(ctx, "namespace") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } - name, err := utils.GetParamCustomName(ctx, "name") + name, err := base.GetParamCustomName(ctx, "name") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } @@ -175,7 +175,7 @@ func (h *K8sConfigMapHandler) DeleteConfigMap(ctx *gin.Context) { req.Namespace = namespace req.Name = name - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return nil, h.configMapService.DeleteConfigMap(ctx, &req) }) } @@ -183,21 +183,21 @@ func (h *K8sConfigMapHandler) DeleteConfigMap(ctx *gin.Context) { func (h *K8sConfigMapHandler) GetConfigMapYAML(ctx *gin.Context) { var req model.GetConfigMapYamlReq - clusterID, err := utils.GetCustomParamID(ctx, "cluster_id") + clusterID, err := base.GetCustomParamID(ctx, "cluster_id") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } - namespace, err := utils.GetParamCustomName(ctx, "namespace") + namespace, err := base.GetParamCustomName(ctx, "namespace") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } - name, err := utils.GetParamCustomName(ctx, "name") + name, err := base.GetParamCustomName(ctx, "name") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } @@ -205,7 +205,7 @@ func (h *K8sConfigMapHandler) GetConfigMapYAML(ctx *gin.Context) { req.Namespace = namespace req.Name = name - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return h.configMapService.GetConfigMapYAML(ctx, &req) }) } @@ -213,15 +213,15 @@ func (h *K8sConfigMapHandler) GetConfigMapYAML(ctx *gin.Context) { func (h *K8sConfigMapHandler) CreateConfigMapByYaml(ctx *gin.Context) { var req model.CreateConfigMapByYamlReq - clusterID, err := utils.GetCustomParamID(ctx, "cluster_id") + clusterID, err := base.GetCustomParamID(ctx, "cluster_id") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } req.ClusterID = clusterID - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return nil, h.configMapService.CreateConfigMapByYaml(ctx, &req) }) } @@ -229,21 +229,21 @@ func (h *K8sConfigMapHandler) CreateConfigMapByYaml(ctx *gin.Context) { func (h *K8sConfigMapHandler) UpdateConfigMapByYaml(ctx *gin.Context) { var req model.UpdateConfigMapByYamlReq - clusterID, err := utils.GetCustomParamID(ctx, "cluster_id") + clusterID, err := base.GetCustomParamID(ctx, "cluster_id") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } - namespace, err := utils.GetParamCustomName(ctx, "namespace") + namespace, err := base.GetParamCustomName(ctx, "namespace") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } - name, err := utils.GetParamCustomName(ctx, "name") + name, err := base.GetParamCustomName(ctx, "name") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } @@ -251,7 +251,7 @@ func (h *K8sConfigMapHandler) UpdateConfigMapByYaml(ctx *gin.Context) { req.Namespace = namespace req.Name = name - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return nil, h.configMapService.UpdateConfigMapByYaml(ctx, &req) }) } diff --git a/internal/k8s/api/daemonset.go b/internal/k8s/api/daemonset.go index 94270e37..11071b51 100644 --- a/internal/k8s/api/daemonset.go +++ b/internal/k8s/api/daemonset.go @@ -28,7 +28,7 @@ package api import ( "github.com/GoSimplicity/AI-CloudOps/internal/k8s/service" "github.com/GoSimplicity/AI-CloudOps/internal/model" - "github.com/GoSimplicity/AI-CloudOps/pkg/utils" + "github.com/GoSimplicity/AI-CloudOps/pkg/base" "github.com/gin-gonic/gin" ) @@ -63,15 +63,15 @@ func (h *K8sDaemonSetHandler) RegisterRouters(server *gin.Engine) { func (h *K8sDaemonSetHandler) GetDaemonSetList(ctx *gin.Context) { var req model.GetDaemonSetListReq - clusterID, err := utils.GetCustomParamID(ctx, "cluster_id") + clusterID, err := base.GetCustomParamID(ctx, "cluster_id") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } req.ClusterID = clusterID - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return h.daemonSetService.GetDaemonSetList(ctx, &req) }) } @@ -79,21 +79,21 @@ func (h *K8sDaemonSetHandler) GetDaemonSetList(ctx *gin.Context) { func (h *K8sDaemonSetHandler) GetDaemonSetDetails(ctx *gin.Context) { var req model.GetDaemonSetDetailsReq - clusterID, err := utils.GetCustomParamID(ctx, "cluster_id") + clusterID, err := base.GetCustomParamID(ctx, "cluster_id") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } - namespace, err := utils.GetParamCustomName(ctx, "namespace") + namespace, err := base.GetParamCustomName(ctx, "namespace") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } - name, err := utils.GetParamCustomName(ctx, "name") + name, err := base.GetParamCustomName(ctx, "name") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } @@ -101,7 +101,7 @@ func (h *K8sDaemonSetHandler) GetDaemonSetDetails(ctx *gin.Context) { req.Namespace = namespace req.Name = name - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return h.daemonSetService.GetDaemonSetDetails(ctx, &req) }) } @@ -109,21 +109,21 @@ func (h *K8sDaemonSetHandler) GetDaemonSetDetails(ctx *gin.Context) { func (h *K8sDaemonSetHandler) GetDaemonSetYaml(ctx *gin.Context) { var req model.GetDaemonSetYamlReq - clusterID, err := utils.GetCustomParamID(ctx, "cluster_id") + clusterID, err := base.GetCustomParamID(ctx, "cluster_id") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } - namespace, err := utils.GetParamCustomName(ctx, "namespace") + namespace, err := base.GetParamCustomName(ctx, "namespace") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } - name, err := utils.GetParamCustomName(ctx, "name") + name, err := base.GetParamCustomName(ctx, "name") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } @@ -131,7 +131,7 @@ func (h *K8sDaemonSetHandler) GetDaemonSetYaml(ctx *gin.Context) { req.Namespace = namespace req.Name = name - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return h.daemonSetService.GetDaemonSetYaml(ctx, &req) }) } @@ -139,15 +139,15 @@ func (h *K8sDaemonSetHandler) GetDaemonSetYaml(ctx *gin.Context) { func (h *K8sDaemonSetHandler) CreateDaemonSet(ctx *gin.Context) { var req model.CreateDaemonSetReq - clusterID, err := utils.GetCustomParamID(ctx, "cluster_id") + clusterID, err := base.GetCustomParamID(ctx, "cluster_id") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } req.ClusterID = clusterID - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return nil, h.daemonSetService.CreateDaemonSet(ctx, &req) }) } @@ -155,15 +155,15 @@ func (h *K8sDaemonSetHandler) CreateDaemonSet(ctx *gin.Context) { func (h *K8sDaemonSetHandler) CreateDaemonSetByYaml(ctx *gin.Context) { var req model.CreateDaemonSetByYamlReq - clusterID, err := utils.GetCustomParamID(ctx, "cluster_id") + clusterID, err := base.GetCustomParamID(ctx, "cluster_id") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } req.ClusterID = clusterID - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return nil, h.daemonSetService.CreateDaemonSetByYaml(ctx, &req) }) } @@ -171,21 +171,21 @@ func (h *K8sDaemonSetHandler) CreateDaemonSetByYaml(ctx *gin.Context) { func (h *K8sDaemonSetHandler) UpdateDaemonSet(ctx *gin.Context) { var req model.UpdateDaemonSetReq - clusterID, err := utils.GetCustomParamID(ctx, "cluster_id") + clusterID, err := base.GetCustomParamID(ctx, "cluster_id") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } - namespace, err := utils.GetParamCustomName(ctx, "namespace") + namespace, err := base.GetParamCustomName(ctx, "namespace") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } - name, err := utils.GetParamCustomName(ctx, "name") + name, err := base.GetParamCustomName(ctx, "name") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } @@ -193,7 +193,7 @@ func (h *K8sDaemonSetHandler) UpdateDaemonSet(ctx *gin.Context) { req.Namespace = namespace req.Name = name - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return nil, h.daemonSetService.UpdateDaemonSet(ctx, &req) }) } @@ -201,21 +201,21 @@ func (h *K8sDaemonSetHandler) UpdateDaemonSet(ctx *gin.Context) { func (h *K8sDaemonSetHandler) UpdateDaemonSetByYaml(ctx *gin.Context) { var req model.UpdateDaemonSetByYamlReq - clusterID, err := utils.GetCustomParamID(ctx, "cluster_id") + clusterID, err := base.GetCustomParamID(ctx, "cluster_id") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } - namespace, err := utils.GetParamCustomName(ctx, "namespace") + namespace, err := base.GetParamCustomName(ctx, "namespace") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } - name, err := utils.GetParamCustomName(ctx, "name") + name, err := base.GetParamCustomName(ctx, "name") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } @@ -223,7 +223,7 @@ func (h *K8sDaemonSetHandler) UpdateDaemonSetByYaml(ctx *gin.Context) { req.Namespace = namespace req.Name = name - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return nil, h.daemonSetService.UpdateDaemonSetByYaml(ctx, &req) }) } @@ -231,21 +231,21 @@ func (h *K8sDaemonSetHandler) UpdateDaemonSetByYaml(ctx *gin.Context) { func (h *K8sDaemonSetHandler) DeleteDaemonSet(ctx *gin.Context) { var req model.DeleteDaemonSetReq - clusterID, err := utils.GetCustomParamID(ctx, "cluster_id") + clusterID, err := base.GetCustomParamID(ctx, "cluster_id") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } - namespace, err := utils.GetParamCustomName(ctx, "namespace") + namespace, err := base.GetParamCustomName(ctx, "namespace") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } - name, err := utils.GetParamCustomName(ctx, "name") + name, err := base.GetParamCustomName(ctx, "name") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } @@ -253,7 +253,7 @@ func (h *K8sDaemonSetHandler) DeleteDaemonSet(ctx *gin.Context) { req.Namespace = namespace req.Name = name - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return nil, h.daemonSetService.DeleteDaemonSet(ctx, &req) }) } @@ -261,21 +261,21 @@ func (h *K8sDaemonSetHandler) DeleteDaemonSet(ctx *gin.Context) { func (h *K8sDaemonSetHandler) RestartDaemonSet(ctx *gin.Context) { var req model.RestartDaemonSetReq - clusterID, err := utils.GetCustomParamID(ctx, "cluster_id") + clusterID, err := base.GetCustomParamID(ctx, "cluster_id") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } - namespace, err := utils.GetParamCustomName(ctx, "namespace") + namespace, err := base.GetParamCustomName(ctx, "namespace") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } - name, err := utils.GetParamCustomName(ctx, "name") + name, err := base.GetParamCustomName(ctx, "name") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } @@ -283,7 +283,7 @@ func (h *K8sDaemonSetHandler) RestartDaemonSet(ctx *gin.Context) { req.Namespace = namespace req.Name = name - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return nil, h.daemonSetService.RestartDaemonSet(ctx, &req) }) } @@ -291,21 +291,21 @@ func (h *K8sDaemonSetHandler) RestartDaemonSet(ctx *gin.Context) { func (h *K8sDaemonSetHandler) GetDaemonSetPods(ctx *gin.Context) { var req model.GetDaemonSetPodsReq - clusterID, err := utils.GetCustomParamID(ctx, "cluster_id") + clusterID, err := base.GetCustomParamID(ctx, "cluster_id") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } - namespace, err := utils.GetParamCustomName(ctx, "namespace") + namespace, err := base.GetParamCustomName(ctx, "namespace") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } - name, err := utils.GetParamCustomName(ctx, "name") + name, err := base.GetParamCustomName(ctx, "name") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } @@ -313,7 +313,7 @@ func (h *K8sDaemonSetHandler) GetDaemonSetPods(ctx *gin.Context) { req.Namespace = namespace req.Name = name - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return h.daemonSetService.GetDaemonSetPods(ctx, &req) }) } @@ -321,21 +321,21 @@ func (h *K8sDaemonSetHandler) GetDaemonSetPods(ctx *gin.Context) { func (h *K8sDaemonSetHandler) GetDaemonSetHistory(ctx *gin.Context) { var req model.GetDaemonSetHistoryReq - clusterID, err := utils.GetCustomParamID(ctx, "cluster_id") + clusterID, err := base.GetCustomParamID(ctx, "cluster_id") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } - namespace, err := utils.GetParamCustomName(ctx, "namespace") + namespace, err := base.GetParamCustomName(ctx, "namespace") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } - name, err := utils.GetParamCustomName(ctx, "name") + name, err := base.GetParamCustomName(ctx, "name") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } @@ -343,7 +343,7 @@ func (h *K8sDaemonSetHandler) GetDaemonSetHistory(ctx *gin.Context) { req.Namespace = namespace req.Name = name - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return h.daemonSetService.GetDaemonSetHistory(ctx, &req) }) } @@ -351,21 +351,21 @@ func (h *K8sDaemonSetHandler) GetDaemonSetHistory(ctx *gin.Context) { func (h *K8sDaemonSetHandler) RollbackDaemonSet(ctx *gin.Context) { var req model.RollbackDaemonSetReq - clusterID, err := utils.GetCustomParamID(ctx, "cluster_id") + clusterID, err := base.GetCustomParamID(ctx, "cluster_id") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } - namespace, err := utils.GetParamCustomName(ctx, "namespace") + namespace, err := base.GetParamCustomName(ctx, "namespace") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } - name, err := utils.GetParamCustomName(ctx, "name") + name, err := base.GetParamCustomName(ctx, "name") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } @@ -373,7 +373,7 @@ func (h *K8sDaemonSetHandler) RollbackDaemonSet(ctx *gin.Context) { req.Namespace = namespace req.Name = name - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return nil, h.daemonSetService.RollbackDaemonSet(ctx, &req) }) } diff --git a/internal/k8s/api/deployment.go b/internal/k8s/api/deployment.go index f8e25507..3fbacfc0 100644 --- a/internal/k8s/api/deployment.go +++ b/internal/k8s/api/deployment.go @@ -28,7 +28,7 @@ package api import ( "github.com/GoSimplicity/AI-CloudOps/internal/k8s/service" "github.com/GoSimplicity/AI-CloudOps/internal/model" - "github.com/GoSimplicity/AI-CloudOps/pkg/utils" + "github.com/GoSimplicity/AI-CloudOps/pkg/base" "github.com/gin-gonic/gin" ) @@ -66,15 +66,15 @@ func (h *K8sDeploymentHandler) RegisterRouters(server *gin.Engine) { func (h *K8sDeploymentHandler) GetDeploymentList(ctx *gin.Context) { var req model.GetDeploymentListReq - clusterID, err := utils.GetCustomParamID(ctx, "cluster_id") + clusterID, err := base.GetCustomParamID(ctx, "cluster_id") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } req.ClusterID = clusterID - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return h.deploymentService.GetDeploymentList(ctx, &req) }) } @@ -82,21 +82,21 @@ func (h *K8sDeploymentHandler) GetDeploymentList(ctx *gin.Context) { func (h *K8sDeploymentHandler) GetDeploymentDetails(ctx *gin.Context) { var req model.GetDeploymentDetailsReq - clusterID, err := utils.GetCustomParamID(ctx, "cluster_id") + clusterID, err := base.GetCustomParamID(ctx, "cluster_id") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } - namespace, err := utils.GetParamCustomName(ctx, "namespace") + namespace, err := base.GetParamCustomName(ctx, "namespace") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } - name, err := utils.GetParamCustomName(ctx, "name") + name, err := base.GetParamCustomName(ctx, "name") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } @@ -104,7 +104,7 @@ func (h *K8sDeploymentHandler) GetDeploymentDetails(ctx *gin.Context) { req.Namespace = namespace req.Name = name - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return h.deploymentService.GetDeploymentDetails(ctx, &req) }) } @@ -112,21 +112,21 @@ func (h *K8sDeploymentHandler) GetDeploymentDetails(ctx *gin.Context) { func (h *K8sDeploymentHandler) GetDeploymentYaml(ctx *gin.Context) { var req model.GetDeploymentYamlReq - clusterID, err := utils.GetCustomParamID(ctx, "cluster_id") + clusterID, err := base.GetCustomParamID(ctx, "cluster_id") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } - namespace, err := utils.GetParamCustomName(ctx, "namespace") + namespace, err := base.GetParamCustomName(ctx, "namespace") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } - name, err := utils.GetParamCustomName(ctx, "name") + name, err := base.GetParamCustomName(ctx, "name") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } @@ -134,7 +134,7 @@ func (h *K8sDeploymentHandler) GetDeploymentYaml(ctx *gin.Context) { req.Namespace = namespace req.Name = name - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return h.deploymentService.GetDeploymentYaml(ctx, &req) }) } @@ -142,15 +142,15 @@ func (h *K8sDeploymentHandler) GetDeploymentYaml(ctx *gin.Context) { func (h *K8sDeploymentHandler) CreateDeployment(ctx *gin.Context) { var req model.CreateDeploymentReq - clusterID, err := utils.GetCustomParamID(ctx, "cluster_id") + clusterID, err := base.GetCustomParamID(ctx, "cluster_id") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } req.ClusterID = clusterID - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return nil, h.deploymentService.CreateDeployment(ctx, &req) }) } @@ -158,21 +158,21 @@ func (h *K8sDeploymentHandler) CreateDeployment(ctx *gin.Context) { func (h *K8sDeploymentHandler) UpdateDeployment(ctx *gin.Context) { var req model.UpdateDeploymentReq - clusterID, err := utils.GetCustomParamID(ctx, "cluster_id") + clusterID, err := base.GetCustomParamID(ctx, "cluster_id") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } - namespace, err := utils.GetParamCustomName(ctx, "namespace") + namespace, err := base.GetParamCustomName(ctx, "namespace") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } - name, err := utils.GetParamCustomName(ctx, "name") + name, err := base.GetParamCustomName(ctx, "name") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } @@ -180,7 +180,7 @@ func (h *K8sDeploymentHandler) UpdateDeployment(ctx *gin.Context) { req.Namespace = namespace req.Name = name - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return nil, h.deploymentService.UpdateDeployment(ctx, &req) }) } @@ -188,21 +188,21 @@ func (h *K8sDeploymentHandler) UpdateDeployment(ctx *gin.Context) { func (h *K8sDeploymentHandler) DeleteDeployment(ctx *gin.Context) { var req model.DeleteDeploymentReq - clusterID, err := utils.GetCustomParamID(ctx, "cluster_id") + clusterID, err := base.GetCustomParamID(ctx, "cluster_id") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } - namespace, err := utils.GetParamCustomName(ctx, "namespace") + namespace, err := base.GetParamCustomName(ctx, "namespace") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } - name, err := utils.GetParamCustomName(ctx, "name") + name, err := base.GetParamCustomName(ctx, "name") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } @@ -210,7 +210,7 @@ func (h *K8sDeploymentHandler) DeleteDeployment(ctx *gin.Context) { req.Namespace = namespace req.Name = name - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return nil, h.deploymentService.DeleteDeployment(ctx, &req) }) } @@ -218,21 +218,21 @@ func (h *K8sDeploymentHandler) DeleteDeployment(ctx *gin.Context) { func (h *K8sDeploymentHandler) RestartDeployment(ctx *gin.Context) { var req model.RestartDeploymentReq - clusterID, err := utils.GetCustomParamID(ctx, "cluster_id") + clusterID, err := base.GetCustomParamID(ctx, "cluster_id") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } - namespace, err := utils.GetParamCustomName(ctx, "namespace") + namespace, err := base.GetParamCustomName(ctx, "namespace") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } - name, err := utils.GetParamCustomName(ctx, "name") + name, err := base.GetParamCustomName(ctx, "name") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } @@ -240,7 +240,7 @@ func (h *K8sDeploymentHandler) RestartDeployment(ctx *gin.Context) { req.Namespace = namespace req.Name = name - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return nil, h.deploymentService.RestartDeployment(ctx, &req) }) } @@ -248,21 +248,21 @@ func (h *K8sDeploymentHandler) RestartDeployment(ctx *gin.Context) { func (h *K8sDeploymentHandler) ScaleDeployment(ctx *gin.Context) { var req model.ScaleDeploymentReq - clusterID, err := utils.GetCustomParamID(ctx, "cluster_id") + clusterID, err := base.GetCustomParamID(ctx, "cluster_id") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } - namespace, err := utils.GetParamCustomName(ctx, "namespace") + namespace, err := base.GetParamCustomName(ctx, "namespace") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } - name, err := utils.GetParamCustomName(ctx, "name") + name, err := base.GetParamCustomName(ctx, "name") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } @@ -270,7 +270,7 @@ func (h *K8sDeploymentHandler) ScaleDeployment(ctx *gin.Context) { req.Namespace = namespace req.Name = name - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return nil, h.deploymentService.ScaleDeployment(ctx, &req) }) } @@ -278,21 +278,21 @@ func (h *K8sDeploymentHandler) ScaleDeployment(ctx *gin.Context) { func (h *K8sDeploymentHandler) GetDeploymentPods(ctx *gin.Context) { var req model.GetDeploymentPodsReq - clusterID, err := utils.GetCustomParamID(ctx, "cluster_id") + clusterID, err := base.GetCustomParamID(ctx, "cluster_id") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } - namespace, err := utils.GetParamCustomName(ctx, "namespace") + namespace, err := base.GetParamCustomName(ctx, "namespace") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } - name, err := utils.GetParamCustomName(ctx, "name") + name, err := base.GetParamCustomName(ctx, "name") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } @@ -300,7 +300,7 @@ func (h *K8sDeploymentHandler) GetDeploymentPods(ctx *gin.Context) { req.Namespace = namespace req.Name = name - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return h.deploymentService.GetDeploymentPods(ctx, &req) }) } @@ -308,21 +308,21 @@ func (h *K8sDeploymentHandler) GetDeploymentPods(ctx *gin.Context) { func (h *K8sDeploymentHandler) GetDeploymentHistory(ctx *gin.Context) { var req model.GetDeploymentHistoryReq - clusterID, err := utils.GetCustomParamID(ctx, "cluster_id") + clusterID, err := base.GetCustomParamID(ctx, "cluster_id") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } - namespace, err := utils.GetParamCustomName(ctx, "namespace") + namespace, err := base.GetParamCustomName(ctx, "namespace") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } - name, err := utils.GetParamCustomName(ctx, "name") + name, err := base.GetParamCustomName(ctx, "name") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } @@ -330,7 +330,7 @@ func (h *K8sDeploymentHandler) GetDeploymentHistory(ctx *gin.Context) { req.Namespace = namespace req.Name = name - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return h.deploymentService.GetDeploymentHistory(ctx, &req) }) } @@ -338,21 +338,21 @@ func (h *K8sDeploymentHandler) GetDeploymentHistory(ctx *gin.Context) { func (h *K8sDeploymentHandler) RollbackDeployment(ctx *gin.Context) { var req model.RollbackDeploymentReq - clusterID, err := utils.GetCustomParamID(ctx, "cluster_id") + clusterID, err := base.GetCustomParamID(ctx, "cluster_id") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } - namespace, err := utils.GetParamCustomName(ctx, "namespace") + namespace, err := base.GetParamCustomName(ctx, "namespace") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } - name, err := utils.GetParamCustomName(ctx, "name") + name, err := base.GetParamCustomName(ctx, "name") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } @@ -360,7 +360,7 @@ func (h *K8sDeploymentHandler) RollbackDeployment(ctx *gin.Context) { req.Namespace = namespace req.Name = name - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return nil, h.deploymentService.RollbackDeployment(ctx, &req) }) } @@ -368,21 +368,21 @@ func (h *K8sDeploymentHandler) RollbackDeployment(ctx *gin.Context) { func (h *K8sDeploymentHandler) PauseDeployment(ctx *gin.Context) { var req model.PauseDeploymentReq - clusterID, err := utils.GetCustomParamID(ctx, "cluster_id") + clusterID, err := base.GetCustomParamID(ctx, "cluster_id") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } - namespace, err := utils.GetParamCustomName(ctx, "namespace") + namespace, err := base.GetParamCustomName(ctx, "namespace") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } - name, err := utils.GetParamCustomName(ctx, "name") + name, err := base.GetParamCustomName(ctx, "name") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } @@ -390,7 +390,7 @@ func (h *K8sDeploymentHandler) PauseDeployment(ctx *gin.Context) { req.Namespace = namespace req.Name = name - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return nil, h.deploymentService.PauseDeployment(ctx, &req) }) } @@ -398,21 +398,21 @@ func (h *K8sDeploymentHandler) PauseDeployment(ctx *gin.Context) { func (h *K8sDeploymentHandler) ResumeDeployment(ctx *gin.Context) { var req model.ResumeDeploymentReq - clusterID, err := utils.GetCustomParamID(ctx, "cluster_id") + clusterID, err := base.GetCustomParamID(ctx, "cluster_id") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } - namespace, err := utils.GetParamCustomName(ctx, "namespace") + namespace, err := base.GetParamCustomName(ctx, "namespace") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } - name, err := utils.GetParamCustomName(ctx, "name") + name, err := base.GetParamCustomName(ctx, "name") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } @@ -420,7 +420,7 @@ func (h *K8sDeploymentHandler) ResumeDeployment(ctx *gin.Context) { req.Namespace = namespace req.Name = name - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return nil, h.deploymentService.ResumeDeployment(ctx, &req) }) } @@ -428,15 +428,15 @@ func (h *K8sDeploymentHandler) ResumeDeployment(ctx *gin.Context) { func (h *K8sDeploymentHandler) CreateDeploymentByYaml(ctx *gin.Context) { var req model.CreateDeploymentByYamlReq - clusterID, err := utils.GetCustomParamID(ctx, "cluster_id") + clusterID, err := base.GetCustomParamID(ctx, "cluster_id") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } req.ClusterID = clusterID - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return nil, h.deploymentService.CreateDeploymentByYaml(ctx, &req) }) } @@ -444,21 +444,21 @@ func (h *K8sDeploymentHandler) CreateDeploymentByYaml(ctx *gin.Context) { func (h *K8sDeploymentHandler) UpdateDeploymentByYaml(ctx *gin.Context) { var req model.UpdateDeploymentByYamlReq - clusterID, err := utils.GetCustomParamID(ctx, "cluster_id") + clusterID, err := base.GetCustomParamID(ctx, "cluster_id") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } - namespace, err := utils.GetParamCustomName(ctx, "namespace") + namespace, err := base.GetParamCustomName(ctx, "namespace") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } - name, err := utils.GetParamCustomName(ctx, "name") + name, err := base.GetParamCustomName(ctx, "name") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } @@ -466,7 +466,7 @@ func (h *K8sDeploymentHandler) UpdateDeploymentByYaml(ctx *gin.Context) { req.Namespace = namespace req.Name = name - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return nil, h.deploymentService.UpdateDeploymentByYaml(ctx, &req) }) } diff --git a/internal/k8s/api/event.go b/internal/k8s/api/event.go index c527d5ce..144637f4 100644 --- a/internal/k8s/api/event.go +++ b/internal/k8s/api/event.go @@ -28,7 +28,7 @@ package api import ( "github.com/GoSimplicity/AI-CloudOps/internal/k8s/service" "github.com/GoSimplicity/AI-CloudOps/internal/model" - "github.com/GoSimplicity/AI-CloudOps/pkg/utils" + "github.com/GoSimplicity/AI-CloudOps/pkg/base" "github.com/gin-gonic/gin" ) @@ -64,15 +64,15 @@ func (h *K8sEventHandler) RegisterRouters(server *gin.Engine) { func (h *K8sEventHandler) GetEventList(ctx *gin.Context) { var req model.GetEventListReq - clusterID, err := utils.GetCustomParamID(ctx, "cluster_id") + clusterID, err := base.GetCustomParamID(ctx, "cluster_id") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } req.ClusterID = clusterID - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return h.eventService.GetEventList(ctx, &req) }) } @@ -80,21 +80,21 @@ func (h *K8sEventHandler) GetEventList(ctx *gin.Context) { func (h *K8sEventHandler) GetEventDetail(ctx *gin.Context) { var req model.GetEventDetailReq - clusterID, err := utils.GetCustomParamID(ctx, "cluster_id") + clusterID, err := base.GetCustomParamID(ctx, "cluster_id") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } - namespace, err := utils.GetParamCustomName(ctx, "namespace") + namespace, err := base.GetParamCustomName(ctx, "namespace") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } - name, err := utils.GetParamCustomName(ctx, "name") + name, err := base.GetParamCustomName(ctx, "name") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } @@ -102,7 +102,7 @@ func (h *K8sEventHandler) GetEventDetail(ctx *gin.Context) { req.Namespace = namespace req.Name = name - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return h.eventService.GetEvent(ctx, &req) }) } @@ -110,21 +110,21 @@ func (h *K8sEventHandler) GetEventDetail(ctx *gin.Context) { func (h *K8sEventHandler) GetEventsByPod(ctx *gin.Context) { var req model.GetEventsByPodReq - clusterID, err := utils.GetCustomParamID(ctx, "cluster_id") + clusterID, err := base.GetCustomParamID(ctx, "cluster_id") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } - namespace, err := utils.GetParamCustomName(ctx, "namespace") + namespace, err := base.GetParamCustomName(ctx, "namespace") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } - podName, err := utils.GetParamCustomName(ctx, "pod_name") + podName, err := base.GetParamCustomName(ctx, "pod_name") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } @@ -132,7 +132,7 @@ func (h *K8sEventHandler) GetEventsByPod(ctx *gin.Context) { req.Namespace = namespace req.PodName = podName - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return h.eventService.GetEventsByPod(ctx, &req) }) } @@ -140,21 +140,21 @@ func (h *K8sEventHandler) GetEventsByPod(ctx *gin.Context) { func (h *K8sEventHandler) GetEventsByDeployment(ctx *gin.Context) { var req model.GetEventsByDeploymentReq - clusterID, err := utils.GetCustomParamID(ctx, "cluster_id") + clusterID, err := base.GetCustomParamID(ctx, "cluster_id") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } - namespace, err := utils.GetParamCustomName(ctx, "namespace") + namespace, err := base.GetParamCustomName(ctx, "namespace") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } - deploymentName, err := utils.GetParamCustomName(ctx, "deployment_name") + deploymentName, err := base.GetParamCustomName(ctx, "deployment_name") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } @@ -162,7 +162,7 @@ func (h *K8sEventHandler) GetEventsByDeployment(ctx *gin.Context) { req.Namespace = namespace req.DeploymentName = deploymentName - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return h.eventService.GetEventsByDeployment(ctx, &req) }) } @@ -170,21 +170,21 @@ func (h *K8sEventHandler) GetEventsByDeployment(ctx *gin.Context) { func (h *K8sEventHandler) GetEventsByService(ctx *gin.Context) { var req model.GetEventsByServiceReq - clusterID, err := utils.GetCustomParamID(ctx, "cluster_id") + clusterID, err := base.GetCustomParamID(ctx, "cluster_id") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } - namespace, err := utils.GetParamCustomName(ctx, "namespace") + namespace, err := base.GetParamCustomName(ctx, "namespace") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } - serviceName, err := utils.GetParamCustomName(ctx, "service_name") + serviceName, err := base.GetParamCustomName(ctx, "service_name") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } @@ -192,7 +192,7 @@ func (h *K8sEventHandler) GetEventsByService(ctx *gin.Context) { req.Namespace = namespace req.ServiceName = serviceName - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return h.eventService.GetEventsByService(ctx, &req) }) } @@ -200,22 +200,22 @@ func (h *K8sEventHandler) GetEventsByService(ctx *gin.Context) { func (h *K8sEventHandler) GetEventsByNode(ctx *gin.Context) { var req model.GetEventsByNodeReq - clusterID, err := utils.GetCustomParamID(ctx, "cluster_id") + clusterID, err := base.GetCustomParamID(ctx, "cluster_id") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } - nodeName, err := utils.GetParamCustomName(ctx, "node_name") + nodeName, err := base.GetParamCustomName(ctx, "node_name") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } req.ClusterID = clusterID req.NodeName = nodeName - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return h.eventService.GetEventsByNode(ctx, &req) }) } @@ -223,7 +223,7 @@ func (h *K8sEventHandler) GetEventsByNode(ctx *gin.Context) { func (h *K8sEventHandler) GetEventStatistics(ctx *gin.Context) { var req model.GetEventStatisticsReq - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return h.eventService.GetEventStatistics(ctx, &req) }) } @@ -231,7 +231,7 @@ func (h *K8sEventHandler) GetEventStatistics(ctx *gin.Context) { func (h *K8sEventHandler) GetEventSummary(ctx *gin.Context) { var req model.GetEventSummaryReq - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return h.eventService.GetEventSummary(ctx, &req) }) } @@ -239,7 +239,7 @@ func (h *K8sEventHandler) GetEventSummary(ctx *gin.Context) { func (h *K8sEventHandler) GetEventTimeline(ctx *gin.Context) { var req model.GetEventTimelineReq - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return h.eventService.GetEventTimeline(ctx, &req) }) } @@ -247,7 +247,7 @@ func (h *K8sEventHandler) GetEventTimeline(ctx *gin.Context) { func (h *K8sEventHandler) GetEventTrends(ctx *gin.Context) { var req model.GetEventTrendsReq - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return h.eventService.GetEventTrends(ctx, &req) }) } @@ -255,7 +255,7 @@ func (h *K8sEventHandler) GetEventTrends(ctx *gin.Context) { func (h *K8sEventHandler) GetEventGroupData(ctx *gin.Context) { var req model.GetEventGroupDataReq - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return h.eventService.GetEventGroupData(ctx, &req) }) } @@ -263,21 +263,21 @@ func (h *K8sEventHandler) GetEventGroupData(ctx *gin.Context) { func (h *K8sEventHandler) DeleteEvent(ctx *gin.Context) { var req model.DeleteEventReq - clusterID, err := utils.GetCustomParamID(ctx, "cluster_id") + clusterID, err := base.GetCustomParamID(ctx, "cluster_id") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } - namespace, err := utils.GetParamCustomName(ctx, "namespace") + namespace, err := base.GetParamCustomName(ctx, "namespace") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } - name, err := utils.GetParamCustomName(ctx, "name") + name, err := base.GetParamCustomName(ctx, "name") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } @@ -285,7 +285,7 @@ func (h *K8sEventHandler) DeleteEvent(ctx *gin.Context) { req.Namespace = namespace req.Name = name - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return nil, h.eventService.DeleteEvent(ctx, &req) }) } @@ -294,7 +294,7 @@ func (h *K8sEventHandler) DeleteEvent(ctx *gin.Context) { func (h *K8sEventHandler) CleanupOldEvents(ctx *gin.Context) { var req model.CleanupOldEventsReq - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return nil, h.eventService.CleanupOldEvents(ctx, &req) }) } diff --git a/internal/k8s/api/ingress.go b/internal/k8s/api/ingress.go index c238f33a..496f451d 100644 --- a/internal/k8s/api/ingress.go +++ b/internal/k8s/api/ingress.go @@ -28,7 +28,7 @@ package api import ( "github.com/GoSimplicity/AI-CloudOps/internal/k8s/service" "github.com/GoSimplicity/AI-CloudOps/internal/model" - "github.com/GoSimplicity/AI-CloudOps/pkg/utils" + "github.com/GoSimplicity/AI-CloudOps/pkg/base" "github.com/gin-gonic/gin" ) @@ -59,15 +59,15 @@ func (h *K8sIngressHandler) RegisterRouters(server *gin.Engine) { func (h *K8sIngressHandler) GetIngressList(ctx *gin.Context) { var req model.GetIngressListReq - clusterID, err := utils.GetCustomParamID(ctx, "cluster_id") + clusterID, err := base.GetCustomParamID(ctx, "cluster_id") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } req.ClusterID = clusterID - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return h.ingressService.GetIngressList(ctx, &req) }) } @@ -75,21 +75,21 @@ func (h *K8sIngressHandler) GetIngressList(ctx *gin.Context) { func (h *K8sIngressHandler) GetIngressDetails(ctx *gin.Context) { var req model.GetIngressDetailsReq - clusterID, err := utils.GetCustomParamID(ctx, "cluster_id") + clusterID, err := base.GetCustomParamID(ctx, "cluster_id") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } - namespace, err := utils.GetParamCustomName(ctx, "namespace") + namespace, err := base.GetParamCustomName(ctx, "namespace") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } - name, err := utils.GetParamCustomName(ctx, "name") + name, err := base.GetParamCustomName(ctx, "name") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } @@ -97,7 +97,7 @@ func (h *K8sIngressHandler) GetIngressDetails(ctx *gin.Context) { req.Namespace = namespace req.Name = name - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return h.ingressService.GetIngressDetails(ctx, &req) }) } @@ -105,21 +105,21 @@ func (h *K8sIngressHandler) GetIngressDetails(ctx *gin.Context) { func (h *K8sIngressHandler) GetIngressYaml(ctx *gin.Context) { var req model.GetIngressYamlReq - clusterID, err := utils.GetCustomParamID(ctx, "cluster_id") + clusterID, err := base.GetCustomParamID(ctx, "cluster_id") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } - namespace, err := utils.GetParamCustomName(ctx, "namespace") + namespace, err := base.GetParamCustomName(ctx, "namespace") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } - name, err := utils.GetParamCustomName(ctx, "name") + name, err := base.GetParamCustomName(ctx, "name") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } @@ -127,7 +127,7 @@ func (h *K8sIngressHandler) GetIngressYaml(ctx *gin.Context) { req.Namespace = namespace req.Name = name - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return h.ingressService.GetIngressYaml(ctx, &req) }) } @@ -135,15 +135,15 @@ func (h *K8sIngressHandler) GetIngressYaml(ctx *gin.Context) { func (h *K8sIngressHandler) CreateIngress(ctx *gin.Context) { var req model.CreateIngressReq - clusterID, err := utils.GetCustomParamID(ctx, "cluster_id") + clusterID, err := base.GetCustomParamID(ctx, "cluster_id") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } req.ClusterID = clusterID - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return nil, h.ingressService.CreateIngress(ctx, &req) }) } @@ -151,15 +151,15 @@ func (h *K8sIngressHandler) CreateIngress(ctx *gin.Context) { func (h *K8sIngressHandler) CreateIngressByYaml(ctx *gin.Context) { var req model.CreateIngressByYamlReq - clusterID, err := utils.GetCustomParamID(ctx, "cluster_id") + clusterID, err := base.GetCustomParamID(ctx, "cluster_id") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } req.ClusterID = clusterID - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return nil, h.ingressService.CreateIngressByYaml(ctx, &req) }) } @@ -167,21 +167,21 @@ func (h *K8sIngressHandler) CreateIngressByYaml(ctx *gin.Context) { func (h *K8sIngressHandler) UpdateIngress(ctx *gin.Context) { var req model.UpdateIngressReq - clusterID, err := utils.GetCustomParamID(ctx, "cluster_id") + clusterID, err := base.GetCustomParamID(ctx, "cluster_id") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } - namespace, err := utils.GetParamCustomName(ctx, "namespace") + namespace, err := base.GetParamCustomName(ctx, "namespace") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } - name, err := utils.GetParamCustomName(ctx, "name") + name, err := base.GetParamCustomName(ctx, "name") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } @@ -189,7 +189,7 @@ func (h *K8sIngressHandler) UpdateIngress(ctx *gin.Context) { req.Namespace = namespace req.Name = name - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return nil, h.ingressService.UpdateIngress(ctx, &req) }) } @@ -197,21 +197,21 @@ func (h *K8sIngressHandler) UpdateIngress(ctx *gin.Context) { func (h *K8sIngressHandler) UpdateIngressByYaml(ctx *gin.Context) { var req model.UpdateIngressByYamlReq - clusterID, err := utils.GetCustomParamID(ctx, "cluster_id") + clusterID, err := base.GetCustomParamID(ctx, "cluster_id") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } - namespace, err := utils.GetParamCustomName(ctx, "namespace") + namespace, err := base.GetParamCustomName(ctx, "namespace") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } - name, err := utils.GetParamCustomName(ctx, "name") + name, err := base.GetParamCustomName(ctx, "name") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } @@ -219,7 +219,7 @@ func (h *K8sIngressHandler) UpdateIngressByYaml(ctx *gin.Context) { req.Namespace = namespace req.Name = name - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return nil, h.ingressService.UpdateIngressByYaml(ctx, &req) }) } @@ -227,21 +227,21 @@ func (h *K8sIngressHandler) UpdateIngressByYaml(ctx *gin.Context) { func (h *K8sIngressHandler) DeleteIngress(ctx *gin.Context) { var req model.DeleteIngressReq - clusterID, err := utils.GetCustomParamID(ctx, "cluster_id") + clusterID, err := base.GetCustomParamID(ctx, "cluster_id") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } - namespace, err := utils.GetParamCustomName(ctx, "namespace") + namespace, err := base.GetParamCustomName(ctx, "namespace") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } - name, err := utils.GetParamCustomName(ctx, "name") + name, err := base.GetParamCustomName(ctx, "name") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } @@ -249,7 +249,7 @@ func (h *K8sIngressHandler) DeleteIngress(ctx *gin.Context) { req.Namespace = namespace req.Name = name - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return nil, h.ingressService.DeleteIngress(ctx, &req) }) } diff --git a/internal/k8s/api/namespace.go b/internal/k8s/api/namespace.go index cee83c88..24a3d4b9 100644 --- a/internal/k8s/api/namespace.go +++ b/internal/k8s/api/namespace.go @@ -28,7 +28,7 @@ package api import ( "github.com/GoSimplicity/AI-CloudOps/internal/k8s/service" "github.com/GoSimplicity/AI-CloudOps/internal/model" - "github.com/GoSimplicity/AI-CloudOps/pkg/utils" + "github.com/GoSimplicity/AI-CloudOps/pkg/base" "github.com/gin-gonic/gin" ) @@ -56,15 +56,15 @@ func (h *K8sNamespaceHandler) RegisterRouters(server *gin.Engine) { func (h *K8sNamespaceHandler) CreateNamespace(ctx *gin.Context) { var req model.K8sNamespaceCreateReq - clusterID, err := utils.GetCustomParamID(ctx, "cluster_id") + clusterID, err := base.GetCustomParamID(ctx, "cluster_id") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } req.ClusterID = clusterID - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return nil, h.namespaceService.CreateNamespace(ctx, &req) }) } @@ -72,22 +72,22 @@ func (h *K8sNamespaceHandler) CreateNamespace(ctx *gin.Context) { func (h *K8sNamespaceHandler) DeleteNamespace(ctx *gin.Context) { var req model.K8sNamespaceDeleteReq - clusterID, err := utils.GetCustomParamID(ctx, "cluster_id") + clusterID, err := base.GetCustomParamID(ctx, "cluster_id") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } - name, err := utils.GetParamCustomName(ctx, "name") + name, err := base.GetParamCustomName(ctx, "name") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } req.ClusterID = clusterID req.Name = name - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return nil, h.namespaceService.DeleteNamespace(ctx, &req) }) } @@ -95,22 +95,22 @@ func (h *K8sNamespaceHandler) DeleteNamespace(ctx *gin.Context) { func (h *K8sNamespaceHandler) GetNamespaceDetails(ctx *gin.Context) { var req model.K8sNamespaceGetDetailsReq - clusterID, err := utils.GetCustomParamID(ctx, "cluster_id") + clusterID, err := base.GetCustomParamID(ctx, "cluster_id") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } - name, err := utils.GetParamCustomName(ctx, "name") + name, err := base.GetParamCustomName(ctx, "name") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } req.ClusterID = clusterID req.Name = name - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return h.namespaceService.GetNamespaceDetails(ctx, &req) }) } @@ -118,22 +118,22 @@ func (h *K8sNamespaceHandler) GetNamespaceDetails(ctx *gin.Context) { func (h *K8sNamespaceHandler) UpdateNamespace(ctx *gin.Context) { var req model.K8sNamespaceUpdateReq - clusterID, err := utils.GetCustomParamID(ctx, "cluster_id") + clusterID, err := base.GetCustomParamID(ctx, "cluster_id") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } - name, err := utils.GetParamCustomName(ctx, "name") + name, err := base.GetParamCustomName(ctx, "name") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } req.ClusterID = clusterID req.Name = name - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return nil, h.namespaceService.UpdateNamespace(ctx, &req) }) } @@ -141,15 +141,15 @@ func (h *K8sNamespaceHandler) UpdateNamespace(ctx *gin.Context) { func (h *K8sNamespaceHandler) ListNamespaces(ctx *gin.Context) { var req model.K8sNamespaceListReq - clusterID, err := utils.GetCustomParamID(ctx, "cluster_id") + clusterID, err := base.GetCustomParamID(ctx, "cluster_id") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } req.ClusterID = clusterID - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return h.namespaceService.ListNamespaces(ctx, &req) }) } diff --git a/internal/k8s/api/node.go b/internal/k8s/api/node.go index f7de2807..18daa318 100644 --- a/internal/k8s/api/node.go +++ b/internal/k8s/api/node.go @@ -28,7 +28,7 @@ package api import ( "github.com/GoSimplicity/AI-CloudOps/internal/k8s/service" "github.com/GoSimplicity/AI-CloudOps/internal/model" - "github.com/GoSimplicity/AI-CloudOps/pkg/utils" + "github.com/GoSimplicity/AI-CloudOps/pkg/base" "github.com/gin-gonic/gin" ) @@ -63,15 +63,15 @@ func (h *K8sNodeHandler) RegisterRouters(server *gin.Engine) { func (h *K8sNodeHandler) GetNodeList(ctx *gin.Context) { var req model.GetNodeListReq - clusterID, err := utils.GetCustomParamID(ctx, "cluster_id") + clusterID, err := base.GetCustomParamID(ctx, "cluster_id") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } req.ClusterID = clusterID - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return h.nodeService.GetNodeList(ctx, &req) }) } @@ -79,22 +79,22 @@ func (h *K8sNodeHandler) GetNodeList(ctx *gin.Context) { func (h *K8sNodeHandler) GetNodeDetail(ctx *gin.Context) { var req model.GetNodeDetailReq - clusterID, err := utils.GetCustomParamID(ctx, "cluster_id") + clusterID, err := base.GetCustomParamID(ctx, "cluster_id") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } - nodeName, err := utils.GetParamCustomName(ctx, "node_name") + nodeName, err := base.GetParamCustomName(ctx, "node_name") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } req.ClusterID = clusterID req.NodeName = nodeName - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return h.nodeService.GetNodeDetail(ctx, &req) }) } @@ -102,22 +102,22 @@ func (h *K8sNodeHandler) GetNodeDetail(ctx *gin.Context) { func (h *K8sNodeHandler) UpdateNodeLabels(ctx *gin.Context) { var req model.UpdateNodeLabelsReq - clusterID, err := utils.GetCustomParamID(ctx, "cluster_id") + clusterID, err := base.GetCustomParamID(ctx, "cluster_id") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } - nodeName, err := utils.GetParamCustomName(ctx, "node_name") + nodeName, err := base.GetParamCustomName(ctx, "node_name") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } req.ClusterID = clusterID req.NodeName = nodeName - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return nil, h.nodeService.UpdateNodeLabels(ctx, &req) }) } @@ -125,22 +125,22 @@ func (h *K8sNodeHandler) UpdateNodeLabels(ctx *gin.Context) { func (h *K8sNodeHandler) DrainNode(ctx *gin.Context) { var req model.DrainNodeReq - clusterID, err := utils.GetCustomParamID(ctx, "cluster_id") + clusterID, err := base.GetCustomParamID(ctx, "cluster_id") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } - nodeName, err := utils.GetParamCustomName(ctx, "node_name") + nodeName, err := base.GetParamCustomName(ctx, "node_name") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } req.ClusterID = clusterID req.NodeName = nodeName - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return nil, h.nodeService.DrainNode(ctx, &req) }) } @@ -148,22 +148,22 @@ func (h *K8sNodeHandler) DrainNode(ctx *gin.Context) { func (h *K8sNodeHandler) CordonNode(ctx *gin.Context) { var req model.NodeCordonReq - clusterID, err := utils.GetCustomParamID(ctx, "cluster_id") + clusterID, err := base.GetCustomParamID(ctx, "cluster_id") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } - nodeName, err := utils.GetParamCustomName(ctx, "node_name") + nodeName, err := base.GetParamCustomName(ctx, "node_name") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } req.ClusterID = clusterID req.NodeName = nodeName - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return nil, h.nodeService.CordonNode(ctx, &req) }) } @@ -171,22 +171,22 @@ func (h *K8sNodeHandler) CordonNode(ctx *gin.Context) { func (h *K8sNodeHandler) UncordonNode(ctx *gin.Context) { var req model.NodeUncordonReq - clusterID, err := utils.GetCustomParamID(ctx, "cluster_id") + clusterID, err := base.GetCustomParamID(ctx, "cluster_id") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } - nodeName, err := utils.GetParamCustomName(ctx, "node_name") + nodeName, err := base.GetParamCustomName(ctx, "node_name") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } req.ClusterID = clusterID req.NodeName = nodeName - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return nil, h.nodeService.UncordonNode(ctx, &req) }) } @@ -194,22 +194,22 @@ func (h *K8sNodeHandler) UncordonNode(ctx *gin.Context) { func (h *K8sNodeHandler) GetNodeTaints(ctx *gin.Context) { var req model.GetNodeTaintsReq - clusterID, err := utils.GetCustomParamID(ctx, "cluster_id") + clusterID, err := base.GetCustomParamID(ctx, "cluster_id") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } - nodeName, err := utils.GetParamCustomName(ctx, "node_name") + nodeName, err := base.GetParamCustomName(ctx, "node_name") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } req.ClusterID = clusterID req.NodeName = nodeName - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return h.nodeService.GetNodeTaints(ctx, &req) }) } @@ -217,22 +217,22 @@ func (h *K8sNodeHandler) GetNodeTaints(ctx *gin.Context) { func (h *K8sNodeHandler) AddNodeTaints(ctx *gin.Context) { var req model.AddNodeTaintsReq - clusterID, err := utils.GetCustomParamID(ctx, "cluster_id") + clusterID, err := base.GetCustomParamID(ctx, "cluster_id") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } - nodeName, err := utils.GetParamCustomName(ctx, "node_name") + nodeName, err := base.GetParamCustomName(ctx, "node_name") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } req.ClusterID = clusterID req.NodeName = nodeName - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return nil, h.taintService.AddNodeTaint(ctx, &req) }) } @@ -240,22 +240,22 @@ func (h *K8sNodeHandler) AddNodeTaints(ctx *gin.Context) { func (h *K8sNodeHandler) DeleteNodeTaints(ctx *gin.Context) { var req model.DeleteNodeTaintsReq - clusterID, err := utils.GetCustomParamID(ctx, "cluster_id") + clusterID, err := base.GetCustomParamID(ctx, "cluster_id") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } - nodeName, err := utils.GetParamCustomName(ctx, "node_name") + nodeName, err := base.GetParamCustomName(ctx, "node_name") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } req.ClusterID = clusterID req.NodeName = nodeName - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return nil, h.taintService.DeleteNodeTaint(ctx, &req) }) } @@ -263,22 +263,22 @@ func (h *K8sNodeHandler) DeleteNodeTaints(ctx *gin.Context) { func (h *K8sNodeHandler) CheckTaintYaml(ctx *gin.Context) { var req model.CheckTaintYamlReq - clusterID, err := utils.GetCustomParamID(ctx, "cluster_id") + clusterID, err := base.GetCustomParamID(ctx, "cluster_id") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } - nodeName, err := utils.GetParamCustomName(ctx, "node_name") + nodeName, err := base.GetParamCustomName(ctx, "node_name") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } req.ClusterID = clusterID req.NodeName = nodeName - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return nil, h.taintService.CheckTaintYaml(ctx, &req) }) } diff --git a/internal/k8s/api/pod.go b/internal/k8s/api/pod.go index 6e9dc4db..4ba533c7 100644 --- a/internal/k8s/api/pod.go +++ b/internal/k8s/api/pod.go @@ -31,7 +31,7 @@ import ( "github.com/GoSimplicity/AI-CloudOps/internal/k8s/service" "github.com/GoSimplicity/AI-CloudOps/internal/model" - "github.com/GoSimplicity/AI-CloudOps/pkg/utils" + "github.com/GoSimplicity/AI-CloudOps/pkg/base" "github.com/gin-gonic/gin" ) @@ -68,21 +68,21 @@ func (h *K8sPodHandler) RegisterRouters(server *gin.Engine) { func (h *K8sPodHandler) GetPodDetails(ctx *gin.Context) { var req model.GetPodDetailsReq - clusterID, err := utils.GetCustomParamID(ctx, "cluster_id") + clusterID, err := base.GetCustomParamID(ctx, "cluster_id") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } - namespace, err := utils.GetParamCustomName(ctx, "namespace") + namespace, err := base.GetParamCustomName(ctx, "namespace") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } - name, err := utils.GetParamCustomName(ctx, "name") + name, err := base.GetParamCustomName(ctx, "name") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } @@ -90,7 +90,7 @@ func (h *K8sPodHandler) GetPodDetails(ctx *gin.Context) { req.Namespace = namespace req.Name = name - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return h.podService.GetPodDetails(ctx, &req) }) } @@ -98,15 +98,15 @@ func (h *K8sPodHandler) GetPodDetails(ctx *gin.Context) { func (h *K8sPodHandler) GetPodList(ctx *gin.Context) { var req model.GetPodListReq - clusterID, err := utils.GetCustomParamID(ctx, "cluster_id") + clusterID, err := base.GetCustomParamID(ctx, "cluster_id") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } req.ClusterID = clusterID - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return h.podService.GetPodList(ctx, &req) }) } @@ -115,11 +115,11 @@ func (h *K8sPodHandler) GetPodContainers(ctx *gin.Context) { var req model.GetPodContainersReq if err := ctx.ShouldBindUri(&req); err != nil { - utils.BadRequestError(ctx, "参数绑定失败: "+err.Error()) + base.BadRequestError(ctx, "参数绑定失败: "+err.Error()) return } - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return h.podService.GetPodContainers(ctx, &req) }) } @@ -128,12 +128,12 @@ func (h *K8sPodHandler) GetPodLogs(ctx *gin.Context) { var req model.GetPodLogsReq if err := ctx.ShouldBindUri(&req); err != nil { - utils.BadRequestError(ctx, "参数绑定失败: "+err.Error()) + base.BadRequestError(ctx, "参数绑定失败: "+err.Error()) return } if err := ctx.ShouldBindQuery(&req); err != nil { - utils.BadRequestError(ctx, "查询参数绑定失败: "+err.Error()) + base.BadRequestError(ctx, "查询参数绑定失败: "+err.Error()) return } @@ -146,7 +146,7 @@ func (h *K8sPodHandler) GetPodLogs(ctx *gin.Context) { ctx.Header("Access-Control-Allow-Headers", "Cache-Control") if err := h.podService.GetPodLogs(ctx, &req); err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } } @@ -154,21 +154,21 @@ func (h *K8sPodHandler) GetPodLogs(ctx *gin.Context) { func (h *K8sPodHandler) GetPodYaml(ctx *gin.Context) { var req model.GetPodYamlReq - clusterID, err := utils.GetCustomParamID(ctx, "cluster_id") + clusterID, err := base.GetCustomParamID(ctx, "cluster_id") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } - namespace, err := utils.GetParamCustomName(ctx, "namespace") + namespace, err := base.GetParamCustomName(ctx, "namespace") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } - name, err := utils.GetParamCustomName(ctx, "name") + name, err := base.GetParamCustomName(ctx, "name") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } @@ -176,7 +176,7 @@ func (h *K8sPodHandler) GetPodYaml(ctx *gin.Context) { req.Namespace = namespace req.Name = name - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return h.podService.GetPodYaml(ctx, &req) }) } @@ -184,15 +184,15 @@ func (h *K8sPodHandler) GetPodYaml(ctx *gin.Context) { func (h *K8sPodHandler) CreatePod(ctx *gin.Context) { var req model.CreatePodReq - clusterID, err := utils.GetCustomParamID(ctx, "cluster_id") + clusterID, err := base.GetCustomParamID(ctx, "cluster_id") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } req.ClusterID = clusterID - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return nil, h.podService.CreatePod(ctx, &req) }) } @@ -200,15 +200,15 @@ func (h *K8sPodHandler) CreatePod(ctx *gin.Context) { func (h *K8sPodHandler) CreatePodByYaml(ctx *gin.Context) { var req model.CreatePodByYamlReq - clusterID, err := utils.GetCustomParamID(ctx, "cluster_id") + clusterID, err := base.GetCustomParamID(ctx, "cluster_id") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } req.ClusterID = clusterID - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return nil, h.podService.CreatePodByYaml(ctx, &req) }) } @@ -216,21 +216,21 @@ func (h *K8sPodHandler) CreatePodByYaml(ctx *gin.Context) { func (h *K8sPodHandler) UpdatePod(ctx *gin.Context) { var req model.UpdatePodReq - clusterID, err := utils.GetCustomParamID(ctx, "cluster_id") + clusterID, err := base.GetCustomParamID(ctx, "cluster_id") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } - namespace, err := utils.GetParamCustomName(ctx, "namespace") + namespace, err := base.GetParamCustomName(ctx, "namespace") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } - name, err := utils.GetParamCustomName(ctx, "name") + name, err := base.GetParamCustomName(ctx, "name") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } @@ -238,7 +238,7 @@ func (h *K8sPodHandler) UpdatePod(ctx *gin.Context) { req.Namespace = namespace req.Name = name - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return nil, h.podService.UpdatePod(ctx, &req) }) } @@ -246,21 +246,21 @@ func (h *K8sPodHandler) UpdatePod(ctx *gin.Context) { func (h *K8sPodHandler) UpdatePodByYaml(ctx *gin.Context) { var req model.UpdatePodByYamlReq - clusterID, err := utils.GetCustomParamID(ctx, "cluster_id") + clusterID, err := base.GetCustomParamID(ctx, "cluster_id") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } - namespace, err := utils.GetParamCustomName(ctx, "namespace") + namespace, err := base.GetParamCustomName(ctx, "namespace") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } - name, err := utils.GetParamCustomName(ctx, "name") + name, err := base.GetParamCustomName(ctx, "name") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } @@ -268,7 +268,7 @@ func (h *K8sPodHandler) UpdatePodByYaml(ctx *gin.Context) { req.Namespace = namespace req.Name = name - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return nil, h.podService.UpdatePodByYaml(ctx, &req) }) } @@ -276,21 +276,21 @@ func (h *K8sPodHandler) UpdatePodByYaml(ctx *gin.Context) { func (h *K8sPodHandler) DeletePod(ctx *gin.Context) { var req model.DeletePodReq - clusterID, err := utils.GetCustomParamID(ctx, "cluster_id") + clusterID, err := base.GetCustomParamID(ctx, "cluster_id") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } - namespace, err := utils.GetParamCustomName(ctx, "namespace") + namespace, err := base.GetParamCustomName(ctx, "namespace") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } - name, err := utils.GetParamCustomName(ctx, "name") + name, err := base.GetParamCustomName(ctx, "name") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } @@ -298,7 +298,7 @@ func (h *K8sPodHandler) DeletePod(ctx *gin.Context) { req.Namespace = namespace req.Name = name - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return nil, h.podService.DeletePod(ctx, &req) }) } @@ -306,49 +306,49 @@ func (h *K8sPodHandler) DeletePod(ctx *gin.Context) { func (h *K8sPodHandler) PodExec(ctx *gin.Context) { var req model.PodExecReq - clusterID, err := utils.GetCustomParamID(ctx, "cluster_id") + clusterID, err := base.GetCustomParamID(ctx, "cluster_id") if err != nil { - utils.BadRequestError(ctx, "集群ID参数错误: "+err.Error()) + base.BadRequestError(ctx, "集群ID参数错误: "+err.Error()) return } - namespace, err := utils.GetParamCustomName(ctx, "namespace") + namespace, err := base.GetParamCustomName(ctx, "namespace") if err != nil { - utils.BadRequestError(ctx, "命名空间参数错误: "+err.Error()) + base.BadRequestError(ctx, "命名空间参数错误: "+err.Error()) return } - podName, err := utils.GetParamCustomName(ctx, "name") + podName, err := base.GetParamCustomName(ctx, "name") if err != nil { - utils.BadRequestError(ctx, "Pod名称参数错误: "+err.Error()) + base.BadRequestError(ctx, "Pod名称参数错误: "+err.Error()) return } - container, err := utils.GetParamCustomName(ctx, "container") + container, err := base.GetParamCustomName(ctx, "container") if err != nil { - utils.BadRequestError(ctx, "容器名称参数错误: "+err.Error()) + base.BadRequestError(ctx, "容器名称参数错误: "+err.Error()) return } shell := ctx.DefaultQuery("shell", "sh") if clusterID <= 0 { - utils.BadRequestError(ctx, "集群ID必须大于0") + base.BadRequestError(ctx, "集群ID必须大于0") return } if namespace == "" { - utils.BadRequestError(ctx, "命名空间不能为空") + base.BadRequestError(ctx, "命名空间不能为空") return } if podName == "" { - utils.BadRequestError(ctx, "Pod名称不能为空") + base.BadRequestError(ctx, "Pod名称不能为空") return } if container == "" { - utils.BadRequestError(ctx, "容器名称不能为空") + base.BadRequestError(ctx, "容器名称不能为空") return } @@ -362,7 +362,7 @@ func (h *K8sPodHandler) PodExec(ctx *gin.Context) { } } if !isValidShell { - utils.BadRequestError(ctx, "不支持的shell类型: "+shell) + base.BadRequestError(ctx, "不支持的shell类型: "+shell) return } @@ -373,7 +373,7 @@ func (h *K8sPodHandler) PodExec(ctx *gin.Context) { req.Shell = shell if err := h.podService.PodExec(ctx, &req); err != nil { - utils.BadRequestError(ctx, "建立终端连接失败: "+err.Error()) + base.BadRequestError(ctx, "建立终端连接失败: "+err.Error()) return } } @@ -381,21 +381,21 @@ func (h *K8sPodHandler) PodExec(ctx *gin.Context) { func (h *K8sPodHandler) PodPortForward(ctx *gin.Context) { var req model.PodPortForwardReq - clusterID, err := utils.GetCustomParamID(ctx, "cluster_id") + clusterID, err := base.GetCustomParamID(ctx, "cluster_id") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } - namespace, err := utils.GetParamCustomName(ctx, "namespace") + namespace, err := base.GetParamCustomName(ctx, "namespace") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } - podName, err := utils.GetParamCustomName(ctx, "name") + podName, err := base.GetParamCustomName(ctx, "name") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } @@ -403,7 +403,7 @@ func (h *K8sPodHandler) PodPortForward(ctx *gin.Context) { req.Namespace = namespace req.PodName = podName - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return nil, h.podService.PodPortForward(ctx, &req) }) } @@ -411,27 +411,27 @@ func (h *K8sPodHandler) PodPortForward(ctx *gin.Context) { func (h *K8sPodHandler) PodFileUpload(ctx *gin.Context) { var req model.PodFileUploadReq - clusterID, err := utils.GetCustomParamID(ctx, "cluster_id") + clusterID, err := base.GetCustomParamID(ctx, "cluster_id") if err != nil { - utils.BadRequestError(ctx, "集群ID参数错误: "+err.Error()) + base.BadRequestError(ctx, "集群ID参数错误: "+err.Error()) return } - namespace, err := utils.GetParamCustomName(ctx, "namespace") + namespace, err := base.GetParamCustomName(ctx, "namespace") if err != nil { - utils.BadRequestError(ctx, "命名空间参数错误: "+err.Error()) + base.BadRequestError(ctx, "命名空间参数错误: "+err.Error()) return } - podName, err := utils.GetParamCustomName(ctx, "name") + podName, err := base.GetParamCustomName(ctx, "name") if err != nil { - utils.BadRequestError(ctx, "Pod名称参数错误: "+err.Error()) + base.BadRequestError(ctx, "Pod名称参数错误: "+err.Error()) return } - container, err := utils.GetParamCustomName(ctx, "container") + container, err := base.GetParamCustomName(ctx, "container") if err != nil { - utils.BadRequestError(ctx, "容器名称参数错误: "+err.Error()) + base.BadRequestError(ctx, "容器名称参数错误: "+err.Error()) return } @@ -444,39 +444,39 @@ func (h *K8sPodHandler) PodFileUpload(ctx *gin.Context) { } if clusterID <= 0 { - utils.BadRequestError(ctx, "集群ID必须大于0") + base.BadRequestError(ctx, "集群ID必须大于0") return } if namespace == "" { - utils.BadRequestError(ctx, "命名空间不能为空") + base.BadRequestError(ctx, "命名空间不能为空") return } if podName == "" { - utils.BadRequestError(ctx, "Pod名称不能为空") + base.BadRequestError(ctx, "Pod名称不能为空") return } if container == "" { - utils.BadRequestError(ctx, "容器名称不能为空") + base.BadRequestError(ctx, "容器名称不能为空") return } if !isValidPath(filePath) { - utils.BadRequestError(ctx, "无效的文件路径格式") + base.BadRequestError(ctx, "无效的文件路径格式") return } if ctx.Request.MultipartForm == nil { if err := ctx.Request.ParseMultipartForm(32 << 20); err != nil { - utils.BadRequestError(ctx, "解析上传文件失败: "+err.Error()) + base.BadRequestError(ctx, "解析上传文件失败: "+err.Error()) return } } if ctx.Request.MultipartForm == nil || len(ctx.Request.MultipartForm.File) == 0 { - utils.BadRequestError(ctx, "未找到上传的文件") + base.BadRequestError(ctx, "未找到上传的文件") return } @@ -487,69 +487,69 @@ func (h *K8sPodHandler) PodFileUpload(ctx *gin.Context) { req.FilePath = filePath if err := h.podService.PodFileUpload(ctx, &req); err != nil { - utils.BadRequestError(ctx, "文件上传失败: "+err.Error()) + base.BadRequestError(ctx, "文件上传失败: "+err.Error()) return } - utils.Success(ctx) + base.Success(ctx) } func (h *K8sPodHandler) PodFileDownload(ctx *gin.Context) { var req model.PodFileDownloadReq - clusterID, err := utils.GetCustomParamID(ctx, "cluster_id") + clusterID, err := base.GetCustomParamID(ctx, "cluster_id") if err != nil { - utils.BadRequestError(ctx, "集群ID参数错误: "+err.Error()) + base.BadRequestError(ctx, "集群ID参数错误: "+err.Error()) return } - namespace, err := utils.GetParamCustomName(ctx, "namespace") + namespace, err := base.GetParamCustomName(ctx, "namespace") if err != nil { - utils.BadRequestError(ctx, "命名空间参数错误: "+err.Error()) + base.BadRequestError(ctx, "命名空间参数错误: "+err.Error()) return } - podName, err := utils.GetParamCustomName(ctx, "name") + podName, err := base.GetParamCustomName(ctx, "name") if err != nil { - utils.BadRequestError(ctx, "Pod名称参数错误: "+err.Error()) + base.BadRequestError(ctx, "Pod名称参数错误: "+err.Error()) return } - container, err := utils.GetParamCustomName(ctx, "container") + container, err := base.GetParamCustomName(ctx, "container") if err != nil { - utils.BadRequestError(ctx, "容器名称参数错误: "+err.Error()) + base.BadRequestError(ctx, "容器名称参数错误: "+err.Error()) return } filePath := ctx.Query("file_path") if clusterID <= 0 { - utils.BadRequestError(ctx, "集群ID必须大于0") + base.BadRequestError(ctx, "集群ID必须大于0") return } if namespace == "" { - utils.BadRequestError(ctx, "命名空间不能为空") + base.BadRequestError(ctx, "命名空间不能为空") return } if podName == "" { - utils.BadRequestError(ctx, "Pod名称不能为空") + base.BadRequestError(ctx, "Pod名称不能为空") return } if container == "" { - utils.BadRequestError(ctx, "容器名称不能为空") + base.BadRequestError(ctx, "容器名称不能为空") return } if filePath == "" { - utils.BadRequestError(ctx, "文件路径不能为空") + base.BadRequestError(ctx, "文件路径不能为空") return } if !isValidPath(filePath) { - utils.BadRequestError(ctx, "无效的文件路径格式") + base.BadRequestError(ctx, "无效的文件路径格式") return } @@ -560,7 +560,7 @@ func (h *K8sPodHandler) PodFileDownload(ctx *gin.Context) { req.FilePath = filePath if err := h.podService.PodFileDownload(ctx, &req); err != nil { - utils.BadRequestError(ctx, "文件下载失败: "+err.Error()) + base.BadRequestError(ctx, "文件下载失败: "+err.Error()) return } } diff --git a/internal/k8s/api/pv.go b/internal/k8s/api/pv.go index 658f322f..d6966579 100644 --- a/internal/k8s/api/pv.go +++ b/internal/k8s/api/pv.go @@ -28,7 +28,7 @@ package api import ( "github.com/GoSimplicity/AI-CloudOps/internal/k8s/service" "github.com/GoSimplicity/AI-CloudOps/internal/model" - "github.com/GoSimplicity/AI-CloudOps/pkg/utils" + "github.com/GoSimplicity/AI-CloudOps/pkg/base" "github.com/gin-gonic/gin" ) @@ -60,15 +60,15 @@ func (h *K8sPVHandler) RegisterRouters(server *gin.Engine) { func (h *K8sPVHandler) GetPVList(ctx *gin.Context) { var req model.GetPVListReq - clusterID, err := utils.GetCustomParamID(ctx, "cluster_id") + clusterID, err := base.GetCustomParamID(ctx, "cluster_id") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } req.ClusterID = clusterID - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return h.pvService.GetPVList(ctx, &req) }) } @@ -76,22 +76,22 @@ func (h *K8sPVHandler) GetPVList(ctx *gin.Context) { func (h *K8sPVHandler) GetPVDetails(ctx *gin.Context) { var req model.GetPVDetailsReq - clusterID, err := utils.GetCustomParamID(ctx, "cluster_id") + clusterID, err := base.GetCustomParamID(ctx, "cluster_id") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } - name, err := utils.GetParamCustomName(ctx, "name") + name, err := base.GetParamCustomName(ctx, "name") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } req.ClusterID = clusterID req.Name = name - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return h.pvService.GetPVDetails(ctx, &req) }) } @@ -99,22 +99,22 @@ func (h *K8sPVHandler) GetPVDetails(ctx *gin.Context) { func (h *K8sPVHandler) GetPVYaml(ctx *gin.Context) { var req model.GetPVYamlReq - clusterID, err := utils.GetCustomParamID(ctx, "cluster_id") + clusterID, err := base.GetCustomParamID(ctx, "cluster_id") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } - name, err := utils.GetParamCustomName(ctx, "name") + name, err := base.GetParamCustomName(ctx, "name") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } req.ClusterID = clusterID req.Name = name - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return h.pvService.GetPVYaml(ctx, &req) }) } @@ -122,15 +122,15 @@ func (h *K8sPVHandler) GetPVYaml(ctx *gin.Context) { func (h *K8sPVHandler) CreatePV(ctx *gin.Context) { var req model.CreatePVReq - clusterID, err := utils.GetCustomParamID(ctx, "cluster_id") + clusterID, err := base.GetCustomParamID(ctx, "cluster_id") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } req.ClusterID = clusterID - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return nil, h.pvService.CreatePV(ctx, &req) }) } @@ -138,15 +138,15 @@ func (h *K8sPVHandler) CreatePV(ctx *gin.Context) { func (h *K8sPVHandler) CreatePVByYaml(ctx *gin.Context) { var req model.CreatePVByYamlReq - clusterID, err := utils.GetCustomParamID(ctx, "cluster_id") + clusterID, err := base.GetCustomParamID(ctx, "cluster_id") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } req.ClusterID = clusterID - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return nil, h.pvService.CreatePVByYaml(ctx, &req) }) } @@ -154,22 +154,22 @@ func (h *K8sPVHandler) CreatePVByYaml(ctx *gin.Context) { func (h *K8sPVHandler) UpdatePV(ctx *gin.Context) { var req model.UpdatePVReq - clusterID, err := utils.GetCustomParamID(ctx, "cluster_id") + clusterID, err := base.GetCustomParamID(ctx, "cluster_id") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } - name, err := utils.GetParamCustomName(ctx, "name") + name, err := base.GetParamCustomName(ctx, "name") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } req.ClusterID = clusterID req.Name = name - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return nil, h.pvService.UpdatePV(ctx, &req) }) } @@ -177,22 +177,22 @@ func (h *K8sPVHandler) UpdatePV(ctx *gin.Context) { func (h *K8sPVHandler) UpdatePVByYaml(ctx *gin.Context) { var req model.UpdatePVByYamlReq - clusterID, err := utils.GetCustomParamID(ctx, "cluster_id") + clusterID, err := base.GetCustomParamID(ctx, "cluster_id") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } - name, err := utils.GetParamCustomName(ctx, "name") + name, err := base.GetParamCustomName(ctx, "name") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } req.ClusterID = clusterID req.Name = name - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return nil, h.pvService.UpdatePVByYaml(ctx, &req) }) } @@ -200,22 +200,22 @@ func (h *K8sPVHandler) UpdatePVByYaml(ctx *gin.Context) { func (h *K8sPVHandler) DeletePV(ctx *gin.Context) { var req model.DeletePVReq - clusterID, err := utils.GetCustomParamID(ctx, "cluster_id") + clusterID, err := base.GetCustomParamID(ctx, "cluster_id") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } - name, err := utils.GetParamCustomName(ctx, "name") + name, err := base.GetParamCustomName(ctx, "name") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } req.ClusterID = clusterID req.Name = name - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return nil, h.pvService.DeletePV(ctx, &req) }) } @@ -223,22 +223,22 @@ func (h *K8sPVHandler) DeletePV(ctx *gin.Context) { func (h *K8sPVHandler) ReclaimPV(ctx *gin.Context) { var req model.ReclaimPVReq - clusterID, err := utils.GetCustomParamID(ctx, "cluster_id") + clusterID, err := base.GetCustomParamID(ctx, "cluster_id") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } - name, err := utils.GetParamCustomName(ctx, "name") + name, err := base.GetParamCustomName(ctx, "name") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } req.ClusterID = clusterID req.Name = name - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return nil, h.pvService.ReclaimPV(ctx, &req) }) } diff --git a/internal/k8s/api/pvc.go b/internal/k8s/api/pvc.go index 4aa13416..a672885d 100644 --- a/internal/k8s/api/pvc.go +++ b/internal/k8s/api/pvc.go @@ -28,7 +28,7 @@ package api import ( "github.com/GoSimplicity/AI-CloudOps/internal/k8s/service" "github.com/GoSimplicity/AI-CloudOps/internal/model" - "github.com/GoSimplicity/AI-CloudOps/pkg/utils" + "github.com/GoSimplicity/AI-CloudOps/pkg/base" "github.com/gin-gonic/gin" ) @@ -61,15 +61,15 @@ func (h *K8sPVCHandler) RegisterRouters(server *gin.Engine) { func (h *K8sPVCHandler) GetPVCList(ctx *gin.Context) { var req model.GetPVCListReq - clusterID, err := utils.GetCustomParamID(ctx, "cluster_id") + clusterID, err := base.GetCustomParamID(ctx, "cluster_id") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } req.ClusterID = clusterID - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return h.pvcService.GetPVCList(ctx, &req) }) } @@ -77,21 +77,21 @@ func (h *K8sPVCHandler) GetPVCList(ctx *gin.Context) { func (h *K8sPVCHandler) GetPVCDetails(ctx *gin.Context) { var req model.GetPVCDetailsReq - clusterID, err := utils.GetCustomParamID(ctx, "cluster_id") + clusterID, err := base.GetCustomParamID(ctx, "cluster_id") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } - namespace, err := utils.GetParamCustomName(ctx, "namespace") + namespace, err := base.GetParamCustomName(ctx, "namespace") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } - name, err := utils.GetParamCustomName(ctx, "name") + name, err := base.GetParamCustomName(ctx, "name") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } @@ -99,7 +99,7 @@ func (h *K8sPVCHandler) GetPVCDetails(ctx *gin.Context) { req.Namespace = namespace req.Name = name - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return h.pvcService.GetPVCDetails(ctx, &req) }) } @@ -107,21 +107,21 @@ func (h *K8sPVCHandler) GetPVCDetails(ctx *gin.Context) { func (h *K8sPVCHandler) GetPVCYaml(ctx *gin.Context) { var req model.GetPVCYamlReq - clusterID, err := utils.GetCustomParamID(ctx, "cluster_id") + clusterID, err := base.GetCustomParamID(ctx, "cluster_id") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } - namespace, err := utils.GetParamCustomName(ctx, "namespace") + namespace, err := base.GetParamCustomName(ctx, "namespace") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } - name, err := utils.GetParamCustomName(ctx, "name") + name, err := base.GetParamCustomName(ctx, "name") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } @@ -129,7 +129,7 @@ func (h *K8sPVCHandler) GetPVCYaml(ctx *gin.Context) { req.Namespace = namespace req.Name = name - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return h.pvcService.GetPVCYaml(ctx, &req) }) } @@ -137,15 +137,15 @@ func (h *K8sPVCHandler) GetPVCYaml(ctx *gin.Context) { func (h *K8sPVCHandler) CreatePVC(ctx *gin.Context) { var req model.CreatePVCReq - clusterID, err := utils.GetCustomParamID(ctx, "cluster_id") + clusterID, err := base.GetCustomParamID(ctx, "cluster_id") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } req.ClusterID = clusterID - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return nil, h.pvcService.CreatePVC(ctx, &req) }) } @@ -153,21 +153,21 @@ func (h *K8sPVCHandler) CreatePVC(ctx *gin.Context) { func (h *K8sPVCHandler) UpdatePVC(ctx *gin.Context) { var req model.UpdatePVCReq - clusterID, err := utils.GetCustomParamID(ctx, "cluster_id") + clusterID, err := base.GetCustomParamID(ctx, "cluster_id") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } - namespace, err := utils.GetParamCustomName(ctx, "namespace") + namespace, err := base.GetParamCustomName(ctx, "namespace") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } - name, err := utils.GetParamCustomName(ctx, "name") + name, err := base.GetParamCustomName(ctx, "name") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } @@ -175,7 +175,7 @@ func (h *K8sPVCHandler) UpdatePVC(ctx *gin.Context) { req.Namespace = namespace req.Name = name - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return nil, h.pvcService.UpdatePVC(ctx, &req) }) } @@ -183,21 +183,21 @@ func (h *K8sPVCHandler) UpdatePVC(ctx *gin.Context) { func (h *K8sPVCHandler) DeletePVC(ctx *gin.Context) { var req model.DeletePVCReq - clusterID, err := utils.GetCustomParamID(ctx, "cluster_id") + clusterID, err := base.GetCustomParamID(ctx, "cluster_id") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } - namespace, err := utils.GetParamCustomName(ctx, "namespace") + namespace, err := base.GetParamCustomName(ctx, "namespace") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } - name, err := utils.GetParamCustomName(ctx, "name") + name, err := base.GetParamCustomName(ctx, "name") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } @@ -205,7 +205,7 @@ func (h *K8sPVCHandler) DeletePVC(ctx *gin.Context) { req.Namespace = namespace req.Name = name - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return nil, h.pvcService.DeletePVC(ctx, &req) }) } @@ -213,15 +213,15 @@ func (h *K8sPVCHandler) DeletePVC(ctx *gin.Context) { func (h *K8sPVCHandler) CreatePVCByYaml(ctx *gin.Context) { var req model.CreatePVCByYamlReq - clusterID, err := utils.GetCustomParamID(ctx, "cluster_id") + clusterID, err := base.GetCustomParamID(ctx, "cluster_id") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } req.ClusterID = clusterID - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return nil, h.pvcService.CreatePVCByYaml(ctx, &req) }) } @@ -229,21 +229,21 @@ func (h *K8sPVCHandler) CreatePVCByYaml(ctx *gin.Context) { func (h *K8sPVCHandler) UpdatePVCByYaml(ctx *gin.Context) { var req model.UpdatePVCByYamlReq - clusterID, err := utils.GetCustomParamID(ctx, "cluster_id") + clusterID, err := base.GetCustomParamID(ctx, "cluster_id") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } - namespace, err := utils.GetParamCustomName(ctx, "namespace") + namespace, err := base.GetParamCustomName(ctx, "namespace") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } - name, err := utils.GetParamCustomName(ctx, "name") + name, err := base.GetParamCustomName(ctx, "name") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } @@ -251,7 +251,7 @@ func (h *K8sPVCHandler) UpdatePVCByYaml(ctx *gin.Context) { req.Namespace = namespace req.Name = name - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return nil, h.pvcService.UpdatePVCByYaml(ctx, &req) }) } @@ -259,21 +259,21 @@ func (h *K8sPVCHandler) UpdatePVCByYaml(ctx *gin.Context) { func (h *K8sPVCHandler) ExpandPVC(ctx *gin.Context) { var req model.ExpandPVCReq - clusterID, err := utils.GetCustomParamID(ctx, "cluster_id") + clusterID, err := base.GetCustomParamID(ctx, "cluster_id") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } - namespace, err := utils.GetParamCustomName(ctx, "namespace") + namespace, err := base.GetParamCustomName(ctx, "namespace") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } - name, err := utils.GetParamCustomName(ctx, "name") + name, err := base.GetParamCustomName(ctx, "name") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } @@ -281,7 +281,7 @@ func (h *K8sPVCHandler) ExpandPVC(ctx *gin.Context) { req.Namespace = namespace req.Name = name - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return nil, h.pvcService.ExpandPVC(ctx, &req) }) } @@ -289,21 +289,21 @@ func (h *K8sPVCHandler) ExpandPVC(ctx *gin.Context) { func (h *K8sPVCHandler) GetPVCPods(ctx *gin.Context) { var req model.GetPVCPodsReq - clusterID, err := utils.GetCustomParamID(ctx, "cluster_id") + clusterID, err := base.GetCustomParamID(ctx, "cluster_id") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } - namespace, err := utils.GetParamCustomName(ctx, "namespace") + namespace, err := base.GetParamCustomName(ctx, "namespace") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } - name, err := utils.GetParamCustomName(ctx, "name") + name, err := base.GetParamCustomName(ctx, "name") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } @@ -311,7 +311,7 @@ func (h *K8sPVCHandler) GetPVCPods(ctx *gin.Context) { req.Namespace = namespace req.Name = name - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return h.pvcService.GetPVCPods(ctx, &req) }) } diff --git a/internal/k8s/api/rbac.go b/internal/k8s/api/rbac.go index cdd8bdbe..ea134f85 100644 --- a/internal/k8s/api/rbac.go +++ b/internal/k8s/api/rbac.go @@ -28,7 +28,7 @@ package api import ( "github.com/GoSimplicity/AI-CloudOps/internal/k8s/service" "github.com/GoSimplicity/AI-CloudOps/internal/model" - "github.com/GoSimplicity/AI-CloudOps/pkg/utils" + "github.com/GoSimplicity/AI-CloudOps/pkg/base" "github.com/gin-gonic/gin" ) @@ -57,15 +57,15 @@ func (h *K8sRBACHandler) RegisterRouters(server *gin.Engine) { func (h *K8sRBACHandler) AnalyzeRBACPermissions(ctx *gin.Context) { var req model.AnalyzeRBACPermissionsReq - clusterID, err := utils.GetCustomParamID(ctx, "cluster_id") + clusterID, err := base.GetCustomParamID(ctx, "cluster_id") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } req.ClusterID = clusterID - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return h.rbacService.AnalyzeRBACPermissions(ctx, &req) }) } @@ -73,15 +73,15 @@ func (h *K8sRBACHandler) AnalyzeRBACPermissions(ctx *gin.Context) { func (h *K8sRBACHandler) CheckRBACPermission(ctx *gin.Context) { var req model.CheckRBACPermissionReq - clusterID, err := utils.GetCustomParamID(ctx, "cluster_id") + clusterID, err := base.GetCustomParamID(ctx, "cluster_id") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } req.ClusterID = clusterID - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return h.rbacService.CheckRBACPermission(ctx, &req) }) } diff --git a/internal/k8s/api/role.go b/internal/k8s/api/role.go index d19590ff..a87b1671 100644 --- a/internal/k8s/api/role.go +++ b/internal/k8s/api/role.go @@ -28,7 +28,7 @@ package api import ( "github.com/GoSimplicity/AI-CloudOps/internal/k8s/service" "github.com/GoSimplicity/AI-CloudOps/internal/model" - "github.com/GoSimplicity/AI-CloudOps/pkg/utils" + "github.com/GoSimplicity/AI-CloudOps/pkg/base" "github.com/gin-gonic/gin" ) @@ -59,15 +59,15 @@ func (h *K8sRoleHandler) RegisterRouters(server *gin.Engine) { func (h *K8sRoleHandler) GetRoleList(ctx *gin.Context) { var req model.GetRoleListReq - clusterID, err := utils.GetCustomParamID(ctx, "cluster_id") + clusterID, err := base.GetCustomParamID(ctx, "cluster_id") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } req.ClusterID = clusterID - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return h.roleService.GetRoleList(ctx, &req) }) } @@ -75,21 +75,21 @@ func (h *K8sRoleHandler) GetRoleList(ctx *gin.Context) { func (h *K8sRoleHandler) GetRoleDetails(ctx *gin.Context) { var req model.GetRoleDetailsReq - clusterID, err := utils.GetCustomParamID(ctx, "cluster_id") + clusterID, err := base.GetCustomParamID(ctx, "cluster_id") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } - namespace, err := utils.GetParamCustomName(ctx, "namespace") + namespace, err := base.GetParamCustomName(ctx, "namespace") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } - name, err := utils.GetParamCustomName(ctx, "name") + name, err := base.GetParamCustomName(ctx, "name") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } @@ -97,7 +97,7 @@ func (h *K8sRoleHandler) GetRoleDetails(ctx *gin.Context) { req.Namespace = namespace req.Name = name - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return h.roleService.GetRoleDetails(ctx, &req) }) } @@ -105,21 +105,21 @@ func (h *K8sRoleHandler) GetRoleDetails(ctx *gin.Context) { func (h *K8sRoleHandler) GetRoleYaml(ctx *gin.Context) { var req model.GetRoleYamlReq - clusterID, err := utils.GetCustomParamID(ctx, "cluster_id") + clusterID, err := base.GetCustomParamID(ctx, "cluster_id") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } - namespace, err := utils.GetParamCustomName(ctx, "namespace") + namespace, err := base.GetParamCustomName(ctx, "namespace") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } - name, err := utils.GetParamCustomName(ctx, "name") + name, err := base.GetParamCustomName(ctx, "name") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } @@ -127,7 +127,7 @@ func (h *K8sRoleHandler) GetRoleYaml(ctx *gin.Context) { req.Namespace = namespace req.Name = name - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return h.roleService.GetRoleYaml(ctx, &req) }) } @@ -135,15 +135,15 @@ func (h *K8sRoleHandler) GetRoleYaml(ctx *gin.Context) { func (h *K8sRoleHandler) CreateRole(ctx *gin.Context) { var req model.CreateRoleReq - clusterID, err := utils.GetCustomParamID(ctx, "cluster_id") + clusterID, err := base.GetCustomParamID(ctx, "cluster_id") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } req.ClusterID = clusterID - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return nil, h.roleService.CreateRole(ctx, &req) }) } @@ -151,15 +151,15 @@ func (h *K8sRoleHandler) CreateRole(ctx *gin.Context) { func (h *K8sRoleHandler) CreateRoleByYaml(ctx *gin.Context) { var req model.CreateRoleByYamlReq - clusterID, err := utils.GetCustomParamID(ctx, "cluster_id") + clusterID, err := base.GetCustomParamID(ctx, "cluster_id") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } req.ClusterID = clusterID - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return nil, h.roleService.CreateRoleByYaml(ctx, &req) }) } @@ -167,21 +167,21 @@ func (h *K8sRoleHandler) CreateRoleByYaml(ctx *gin.Context) { func (h *K8sRoleHandler) UpdateRole(ctx *gin.Context) { var req model.UpdateRoleReq - clusterID, err := utils.GetCustomParamID(ctx, "cluster_id") + clusterID, err := base.GetCustomParamID(ctx, "cluster_id") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } - namespace, err := utils.GetParamCustomName(ctx, "namespace") + namespace, err := base.GetParamCustomName(ctx, "namespace") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } - name, err := utils.GetParamCustomName(ctx, "name") + name, err := base.GetParamCustomName(ctx, "name") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } @@ -189,7 +189,7 @@ func (h *K8sRoleHandler) UpdateRole(ctx *gin.Context) { req.Namespace = namespace req.Name = name - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return nil, h.roleService.UpdateRole(ctx, &req) }) } @@ -197,21 +197,21 @@ func (h *K8sRoleHandler) UpdateRole(ctx *gin.Context) { func (h *K8sRoleHandler) UpdateRoleByYaml(ctx *gin.Context) { var req model.UpdateRoleByYamlReq - clusterID, err := utils.GetCustomParamID(ctx, "cluster_id") + clusterID, err := base.GetCustomParamID(ctx, "cluster_id") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } - namespace, err := utils.GetParamCustomName(ctx, "namespace") + namespace, err := base.GetParamCustomName(ctx, "namespace") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } - name, err := utils.GetParamCustomName(ctx, "name") + name, err := base.GetParamCustomName(ctx, "name") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } @@ -219,7 +219,7 @@ func (h *K8sRoleHandler) UpdateRoleByYaml(ctx *gin.Context) { req.Namespace = namespace req.Name = name - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return nil, h.roleService.UpdateRoleYaml(ctx, &req) }) } @@ -227,21 +227,21 @@ func (h *K8sRoleHandler) UpdateRoleByYaml(ctx *gin.Context) { func (h *K8sRoleHandler) DeleteRole(ctx *gin.Context) { var req model.DeleteRoleReq - clusterID, err := utils.GetCustomParamID(ctx, "cluster_id") + clusterID, err := base.GetCustomParamID(ctx, "cluster_id") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } - namespace, err := utils.GetParamCustomName(ctx, "namespace") + namespace, err := base.GetParamCustomName(ctx, "namespace") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } - name, err := utils.GetParamCustomName(ctx, "name") + name, err := base.GetParamCustomName(ctx, "name") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } @@ -249,7 +249,7 @@ func (h *K8sRoleHandler) DeleteRole(ctx *gin.Context) { req.Namespace = namespace req.Name = name - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return nil, h.roleService.DeleteRole(ctx, &req) }) } diff --git a/internal/k8s/api/rolebinding.go b/internal/k8s/api/rolebinding.go index d1e4faca..d04d14a3 100644 --- a/internal/k8s/api/rolebinding.go +++ b/internal/k8s/api/rolebinding.go @@ -28,7 +28,7 @@ package api import ( "github.com/GoSimplicity/AI-CloudOps/internal/k8s/service" "github.com/GoSimplicity/AI-CloudOps/internal/model" - "github.com/GoSimplicity/AI-CloudOps/pkg/utils" + "github.com/GoSimplicity/AI-CloudOps/pkg/base" "github.com/gin-gonic/gin" ) @@ -59,14 +59,14 @@ func (h *K8sRoleBindingHandler) RegisterRouters(server *gin.Engine) { func (h *K8sRoleBindingHandler) GetRoleBindingList(ctx *gin.Context) { var req model.GetRoleBindingListReq - clusterID, err := utils.GetCustomParamID(ctx, "cluster_id") + clusterID, err := base.GetCustomParamID(ctx, "cluster_id") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } req.ClusterID = clusterID - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return h.roleBindingService.GetRoleBindingList(ctx, &req) }) } @@ -74,21 +74,21 @@ func (h *K8sRoleBindingHandler) GetRoleBindingList(ctx *gin.Context) { func (h *K8sRoleBindingHandler) GetRoleBindingDetails(ctx *gin.Context) { var req model.GetRoleBindingDetailsReq - clusterID, err := utils.GetCustomParamID(ctx, "cluster_id") + clusterID, err := base.GetCustomParamID(ctx, "cluster_id") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } - namespace, err := utils.GetParamCustomName(ctx, "namespace") + namespace, err := base.GetParamCustomName(ctx, "namespace") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } - name, err := utils.GetParamCustomName(ctx, "name") + name, err := base.GetParamCustomName(ctx, "name") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } @@ -96,7 +96,7 @@ func (h *K8sRoleBindingHandler) GetRoleBindingDetails(ctx *gin.Context) { req.Namespace = namespace req.Name = name - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return h.roleBindingService.GetRoleBindingDetails(ctx, &req) }) } @@ -104,7 +104,7 @@ func (h *K8sRoleBindingHandler) GetRoleBindingDetails(ctx *gin.Context) { func (h *K8sRoleBindingHandler) CreateRoleBinding(ctx *gin.Context) { var req model.CreateRoleBindingReq - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return nil, h.roleBindingService.CreateRoleBinding(ctx, &req) }) } @@ -112,15 +112,15 @@ func (h *K8sRoleBindingHandler) CreateRoleBinding(ctx *gin.Context) { func (h *K8sRoleBindingHandler) CreateRoleBindingByYaml(ctx *gin.Context) { var req model.CreateRoleBindingByYamlReq - clusterID, err := utils.GetCustomParamID(ctx, "cluster_id") + clusterID, err := base.GetCustomParamID(ctx, "cluster_id") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } req.ClusterID = clusterID - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return nil, h.roleBindingService.CreateRoleBindingByYaml(ctx, &req) }) } @@ -128,7 +128,7 @@ func (h *K8sRoleBindingHandler) CreateRoleBindingByYaml(ctx *gin.Context) { func (h *K8sRoleBindingHandler) UpdateRoleBinding(ctx *gin.Context) { var req model.UpdateRoleBindingReq - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return nil, h.roleBindingService.UpdateRoleBinding(ctx, &req) }) } @@ -136,21 +136,21 @@ func (h *K8sRoleBindingHandler) UpdateRoleBinding(ctx *gin.Context) { func (h *K8sRoleBindingHandler) DeleteRoleBinding(ctx *gin.Context) { var req model.DeleteRoleBindingReq - clusterID, err := utils.GetCustomParamID(ctx, "cluster_id") + clusterID, err := base.GetCustomParamID(ctx, "cluster_id") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } - namespace, err := utils.GetParamCustomName(ctx, "namespace") + namespace, err := base.GetParamCustomName(ctx, "namespace") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } - name, err := utils.GetParamCustomName(ctx, "name") + name, err := base.GetParamCustomName(ctx, "name") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } @@ -158,7 +158,7 @@ func (h *K8sRoleBindingHandler) DeleteRoleBinding(ctx *gin.Context) { req.Namespace = namespace req.Name = name - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return nil, h.roleBindingService.DeleteRoleBinding(ctx, &req) }) } @@ -166,21 +166,21 @@ func (h *K8sRoleBindingHandler) DeleteRoleBinding(ctx *gin.Context) { func (h *K8sRoleBindingHandler) GetRoleBindingYaml(ctx *gin.Context) { var req model.GetRoleBindingYamlReq - clusterID, err := utils.GetCustomParamID(ctx, "cluster_id") + clusterID, err := base.GetCustomParamID(ctx, "cluster_id") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } - namespace, err := utils.GetParamCustomName(ctx, "namespace") + namespace, err := base.GetParamCustomName(ctx, "namespace") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } - name, err := utils.GetParamCustomName(ctx, "name") + name, err := base.GetParamCustomName(ctx, "name") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } @@ -188,7 +188,7 @@ func (h *K8sRoleBindingHandler) GetRoleBindingYaml(ctx *gin.Context) { req.Namespace = namespace req.Name = name - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return h.roleBindingService.GetRoleBindingYaml(ctx, &req) }) } @@ -196,7 +196,7 @@ func (h *K8sRoleBindingHandler) GetRoleBindingYaml(ctx *gin.Context) { func (h *K8sRoleBindingHandler) UpdateRoleBindingYaml(ctx *gin.Context) { var req model.UpdateRoleBindingByYamlReq - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return nil, h.roleBindingService.UpdateRoleBindingYaml(ctx, &req) }) } diff --git a/internal/k8s/api/secret.go b/internal/k8s/api/secret.go index 2952f9e7..ea76c39f 100644 --- a/internal/k8s/api/secret.go +++ b/internal/k8s/api/secret.go @@ -28,7 +28,7 @@ package api import ( "github.com/GoSimplicity/AI-CloudOps/internal/k8s/service" "github.com/GoSimplicity/AI-CloudOps/internal/model" - "github.com/GoSimplicity/AI-CloudOps/pkg/utils" + "github.com/GoSimplicity/AI-CloudOps/pkg/base" "github.com/gin-gonic/gin" ) @@ -61,15 +61,15 @@ func (h *K8sSecretHandler) RegisterRouters(server *gin.Engine) { func (h *K8sSecretHandler) GetSecretList(ctx *gin.Context) { var req model.GetSecretListReq - clusterID, err := utils.GetCustomParamID(ctx, "cluster_id") + clusterID, err := base.GetCustomParamID(ctx, "cluster_id") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } req.ClusterID = clusterID - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return h.secretService.GetSecretList(ctx, &req) }) } @@ -77,21 +77,21 @@ func (h *K8sSecretHandler) GetSecretList(ctx *gin.Context) { func (h *K8sSecretHandler) GetSecret(ctx *gin.Context) { var req model.GetSecretDetailsReq - clusterID, err := utils.GetCustomParamID(ctx, "cluster_id") + clusterID, err := base.GetCustomParamID(ctx, "cluster_id") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } - namespace, err := utils.GetParamCustomName(ctx, "namespace") + namespace, err := base.GetParamCustomName(ctx, "namespace") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } - name, err := utils.GetParamCustomName(ctx, "name") + name, err := base.GetParamCustomName(ctx, "name") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } @@ -99,7 +99,7 @@ func (h *K8sSecretHandler) GetSecret(ctx *gin.Context) { req.Namespace = namespace req.Name = name - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return h.secretService.GetSecret(ctx, &req) }) } @@ -107,15 +107,15 @@ func (h *K8sSecretHandler) GetSecret(ctx *gin.Context) { func (h *K8sSecretHandler) CreateSecret(ctx *gin.Context) { var req model.CreateSecretReq - clusterID, err := utils.GetCustomParamID(ctx, "cluster_id") + clusterID, err := base.GetCustomParamID(ctx, "cluster_id") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } req.ClusterID = clusterID - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return nil, h.secretService.CreateSecret(ctx, &req) }) } @@ -123,21 +123,21 @@ func (h *K8sSecretHandler) CreateSecret(ctx *gin.Context) { func (h *K8sSecretHandler) UpdateSecret(ctx *gin.Context) { var req model.UpdateSecretReq - clusterID, err := utils.GetCustomParamID(ctx, "cluster_id") + clusterID, err := base.GetCustomParamID(ctx, "cluster_id") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } - namespace, err := utils.GetParamCustomName(ctx, "namespace") + namespace, err := base.GetParamCustomName(ctx, "namespace") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } - name, err := utils.GetParamCustomName(ctx, "name") + name, err := base.GetParamCustomName(ctx, "name") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } @@ -145,7 +145,7 @@ func (h *K8sSecretHandler) UpdateSecret(ctx *gin.Context) { req.Namespace = namespace req.Name = name - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return nil, h.secretService.UpdateSecret(ctx, &req) }) } @@ -153,21 +153,21 @@ func (h *K8sSecretHandler) UpdateSecret(ctx *gin.Context) { func (h *K8sSecretHandler) DeleteSecret(ctx *gin.Context) { var req model.DeleteSecretReq - clusterID, err := utils.GetCustomParamID(ctx, "cluster_id") + clusterID, err := base.GetCustomParamID(ctx, "cluster_id") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } - namespace, err := utils.GetParamCustomName(ctx, "namespace") + namespace, err := base.GetParamCustomName(ctx, "namespace") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } - name, err := utils.GetParamCustomName(ctx, "name") + name, err := base.GetParamCustomName(ctx, "name") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } @@ -175,7 +175,7 @@ func (h *K8sSecretHandler) DeleteSecret(ctx *gin.Context) { req.Namespace = namespace req.Name = name - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return nil, h.secretService.DeleteSecret(ctx, &req) }) } @@ -183,21 +183,21 @@ func (h *K8sSecretHandler) DeleteSecret(ctx *gin.Context) { func (h *K8sSecretHandler) GetSecretYAML(ctx *gin.Context) { var req model.GetSecretYamlReq - clusterID, err := utils.GetCustomParamID(ctx, "cluster_id") + clusterID, err := base.GetCustomParamID(ctx, "cluster_id") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } - namespace, err := utils.GetParamCustomName(ctx, "namespace") + namespace, err := base.GetParamCustomName(ctx, "namespace") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } - name, err := utils.GetParamCustomName(ctx, "name") + name, err := base.GetParamCustomName(ctx, "name") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } @@ -205,7 +205,7 @@ func (h *K8sSecretHandler) GetSecretYAML(ctx *gin.Context) { req.Namespace = namespace req.Name = name - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return h.secretService.GetSecretYAML(ctx, &req) }) } @@ -213,15 +213,15 @@ func (h *K8sSecretHandler) GetSecretYAML(ctx *gin.Context) { func (h *K8sSecretHandler) CreateSecretByYaml(ctx *gin.Context) { var req model.CreateSecretByYamlReq - clusterID, err := utils.GetCustomParamID(ctx, "cluster_id") + clusterID, err := base.GetCustomParamID(ctx, "cluster_id") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } req.ClusterID = clusterID - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return nil, h.secretService.CreateSecretByYaml(ctx, &req) }) } @@ -229,21 +229,21 @@ func (h *K8sSecretHandler) CreateSecretByYaml(ctx *gin.Context) { func (h *K8sSecretHandler) UpdateSecretByYaml(ctx *gin.Context) { var req model.UpdateSecretByYamlReq - clusterID, err := utils.GetCustomParamID(ctx, "cluster_id") + clusterID, err := base.GetCustomParamID(ctx, "cluster_id") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } - namespace, err := utils.GetParamCustomName(ctx, "namespace") + namespace, err := base.GetParamCustomName(ctx, "namespace") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } - name, err := utils.GetParamCustomName(ctx, "name") + name, err := base.GetParamCustomName(ctx, "name") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } @@ -251,7 +251,7 @@ func (h *K8sSecretHandler) UpdateSecretByYaml(ctx *gin.Context) { req.Namespace = namespace req.Name = name - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return nil, h.secretService.UpdateSecretByYaml(ctx, &req) }) } diff --git a/internal/k8s/api/serviceaccount.go b/internal/k8s/api/serviceaccount.go index 23c44f21..ccc884a7 100644 --- a/internal/k8s/api/serviceaccount.go +++ b/internal/k8s/api/serviceaccount.go @@ -28,7 +28,7 @@ package api import ( "github.com/GoSimplicity/AI-CloudOps/internal/k8s/service" "github.com/GoSimplicity/AI-CloudOps/internal/model" - "github.com/GoSimplicity/AI-CloudOps/pkg/utils" + "github.com/GoSimplicity/AI-CloudOps/pkg/base" "github.com/gin-gonic/gin" ) @@ -61,15 +61,15 @@ func (h *K8sServiceAccountHandler) RegisterRouters(server *gin.Engine) { func (h *K8sServiceAccountHandler) GetServiceAccountList(ctx *gin.Context) { var req model.GetServiceAccountListReq - clusterID, err := utils.GetCustomParamID(ctx, "cluster_id") + clusterID, err := base.GetCustomParamID(ctx, "cluster_id") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } req.ClusterID = clusterID - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return h.serviceAccountService.GetServiceAccountList(ctx, &req) }) } @@ -77,21 +77,21 @@ func (h *K8sServiceAccountHandler) GetServiceAccountList(ctx *gin.Context) { func (h *K8sServiceAccountHandler) GetServiceAccountDetails(ctx *gin.Context) { var req model.GetServiceAccountDetailsReq - clusterID, err := utils.GetCustomParamID(ctx, "cluster_id") + clusterID, err := base.GetCustomParamID(ctx, "cluster_id") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } - namespace, err := utils.GetParamCustomName(ctx, "namespace") + namespace, err := base.GetParamCustomName(ctx, "namespace") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } - name, err := utils.GetParamCustomName(ctx, "name") + name, err := base.GetParamCustomName(ctx, "name") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } @@ -99,7 +99,7 @@ func (h *K8sServiceAccountHandler) GetServiceAccountDetails(ctx *gin.Context) { req.Namespace = namespace req.Name = name - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return h.serviceAccountService.GetServiceAccountDetails(ctx, &req) }) } @@ -107,15 +107,15 @@ func (h *K8sServiceAccountHandler) GetServiceAccountDetails(ctx *gin.Context) { func (h *K8sServiceAccountHandler) CreateServiceAccount(ctx *gin.Context) { var req model.CreateServiceAccountReq - clusterID, err := utils.GetCustomParamID(ctx, "cluster_id") + clusterID, err := base.GetCustomParamID(ctx, "cluster_id") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } req.ClusterID = clusterID - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return nil, h.serviceAccountService.CreateServiceAccount(ctx, &req) }) } @@ -123,15 +123,15 @@ func (h *K8sServiceAccountHandler) CreateServiceAccount(ctx *gin.Context) { func (h *K8sServiceAccountHandler) CreateServiceAccountByYaml(ctx *gin.Context) { var req model.CreateServiceAccountByYamlReq - clusterID, err := utils.GetCustomParamID(ctx, "cluster_id") + clusterID, err := base.GetCustomParamID(ctx, "cluster_id") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } req.ClusterID = clusterID - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return nil, h.serviceAccountService.CreateServiceAccountByYaml(ctx, &req) }) } @@ -139,21 +139,21 @@ func (h *K8sServiceAccountHandler) CreateServiceAccountByYaml(ctx *gin.Context) func (h *K8sServiceAccountHandler) UpdateServiceAccount(ctx *gin.Context) { var req model.UpdateServiceAccountReq - clusterID, err := utils.GetCustomParamID(ctx, "cluster_id") + clusterID, err := base.GetCustomParamID(ctx, "cluster_id") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } - namespace, err := utils.GetParamCustomName(ctx, "namespace") + namespace, err := base.GetParamCustomName(ctx, "namespace") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } - name, err := utils.GetParamCustomName(ctx, "name") + name, err := base.GetParamCustomName(ctx, "name") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } @@ -161,7 +161,7 @@ func (h *K8sServiceAccountHandler) UpdateServiceAccount(ctx *gin.Context) { req.Namespace = namespace req.Name = name - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return nil, h.serviceAccountService.UpdateServiceAccount(ctx, &req) }) } @@ -169,21 +169,21 @@ func (h *K8sServiceAccountHandler) UpdateServiceAccount(ctx *gin.Context) { func (h *K8sServiceAccountHandler) DeleteServiceAccount(ctx *gin.Context) { var req model.DeleteServiceAccountReq - clusterID, err := utils.GetCustomParamID(ctx, "cluster_id") + clusterID, err := base.GetCustomParamID(ctx, "cluster_id") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } - namespace, err := utils.GetParamCustomName(ctx, "namespace") + namespace, err := base.GetParamCustomName(ctx, "namespace") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } - name, err := utils.GetParamCustomName(ctx, "name") + name, err := base.GetParamCustomName(ctx, "name") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } @@ -191,7 +191,7 @@ func (h *K8sServiceAccountHandler) DeleteServiceAccount(ctx *gin.Context) { req.Namespace = namespace req.Name = name - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return nil, h.serviceAccountService.DeleteServiceAccount(ctx, &req) }) } @@ -199,21 +199,21 @@ func (h *K8sServiceAccountHandler) DeleteServiceAccount(ctx *gin.Context) { func (h *K8sServiceAccountHandler) GetServiceAccountYaml(ctx *gin.Context) { var req model.GetServiceAccountYamlReq - clusterID, err := utils.GetCustomParamID(ctx, "cluster_id") + clusterID, err := base.GetCustomParamID(ctx, "cluster_id") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } - namespace, err := utils.GetParamCustomName(ctx, "namespace") + namespace, err := base.GetParamCustomName(ctx, "namespace") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } - name, err := utils.GetParamCustomName(ctx, "name") + name, err := base.GetParamCustomName(ctx, "name") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } @@ -221,7 +221,7 @@ func (h *K8sServiceAccountHandler) GetServiceAccountYaml(ctx *gin.Context) { req.Namespace = namespace req.Name = name - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return h.serviceAccountService.GetServiceAccountYaml(ctx, &req) }) } @@ -229,21 +229,21 @@ func (h *K8sServiceAccountHandler) GetServiceAccountYaml(ctx *gin.Context) { func (h *K8sServiceAccountHandler) UpdateServiceAccountYaml(ctx *gin.Context) { var req model.UpdateServiceAccountByYamlReq - clusterID, err := utils.GetCustomParamID(ctx, "cluster_id") + clusterID, err := base.GetCustomParamID(ctx, "cluster_id") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } - namespace, err := utils.GetParamCustomName(ctx, "namespace") + namespace, err := base.GetParamCustomName(ctx, "namespace") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } - name, err := utils.GetParamCustomName(ctx, "name") + name, err := base.GetParamCustomName(ctx, "name") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } @@ -251,7 +251,7 @@ func (h *K8sServiceAccountHandler) UpdateServiceAccountYaml(ctx *gin.Context) { req.Namespace = namespace req.Name = name - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return nil, h.serviceAccountService.UpdateServiceAccountYaml(ctx, &req) }) } @@ -259,21 +259,21 @@ func (h *K8sServiceAccountHandler) UpdateServiceAccountYaml(ctx *gin.Context) { func (h *K8sServiceAccountHandler) GetServiceAccountToken(ctx *gin.Context) { var req model.GetServiceAccountTokenReq - clusterID, err := utils.GetCustomParamID(ctx, "cluster_id") + clusterID, err := base.GetCustomParamID(ctx, "cluster_id") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } - namespace, err := utils.GetParamCustomName(ctx, "namespace") + namespace, err := base.GetParamCustomName(ctx, "namespace") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } - name, err := utils.GetParamCustomName(ctx, "name") + name, err := base.GetParamCustomName(ctx, "name") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } @@ -281,7 +281,7 @@ func (h *K8sServiceAccountHandler) GetServiceAccountToken(ctx *gin.Context) { req.Namespace = namespace req.Name = name - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return h.serviceAccountService.GetServiceAccountToken(ctx, &req) }) } @@ -289,21 +289,21 @@ func (h *K8sServiceAccountHandler) GetServiceAccountToken(ctx *gin.Context) { func (h *K8sServiceAccountHandler) CreateServiceAccountToken(ctx *gin.Context) { var req model.CreateServiceAccountTokenReq - clusterID, err := utils.GetCustomParamID(ctx, "cluster_id") + clusterID, err := base.GetCustomParamID(ctx, "cluster_id") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } - namespace, err := utils.GetParamCustomName(ctx, "namespace") + namespace, err := base.GetParamCustomName(ctx, "namespace") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } - name, err := utils.GetParamCustomName(ctx, "name") + name, err := base.GetParamCustomName(ctx, "name") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } @@ -311,7 +311,7 @@ func (h *K8sServiceAccountHandler) CreateServiceAccountToken(ctx *gin.Context) { req.Namespace = namespace req.ServiceAccountName = name - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return h.serviceAccountService.CreateServiceAccountToken(ctx, &req) }) } diff --git a/internal/k8s/api/statefulset.go b/internal/k8s/api/statefulset.go index a9dc0171..2f8096ae 100644 --- a/internal/k8s/api/statefulset.go +++ b/internal/k8s/api/statefulset.go @@ -28,7 +28,7 @@ package api import ( "github.com/GoSimplicity/AI-CloudOps/internal/k8s/service" "github.com/GoSimplicity/AI-CloudOps/internal/model" - "github.com/GoSimplicity/AI-CloudOps/pkg/utils" + "github.com/GoSimplicity/AI-CloudOps/pkg/base" "github.com/gin-gonic/gin" ) @@ -64,15 +64,15 @@ func (h *K8sStatefulSetHandler) RegisterRouters(server *gin.Engine) { func (h *K8sStatefulSetHandler) GetStatefulSetList(ctx *gin.Context) { var req model.GetStatefulSetListReq - clusterID, err := utils.GetCustomParamID(ctx, "cluster_id") + clusterID, err := base.GetCustomParamID(ctx, "cluster_id") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } req.ClusterID = clusterID - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return h.statefulSetService.GetStatefulSetList(ctx, &req) }) } @@ -80,21 +80,21 @@ func (h *K8sStatefulSetHandler) GetStatefulSetList(ctx *gin.Context) { func (h *K8sStatefulSetHandler) GetStatefulSetDetails(ctx *gin.Context) { var req model.GetStatefulSetDetailsReq - clusterID, err := utils.GetCustomParamID(ctx, "cluster_id") + clusterID, err := base.GetCustomParamID(ctx, "cluster_id") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } - namespace, err := utils.GetParamCustomName(ctx, "namespace") + namespace, err := base.GetParamCustomName(ctx, "namespace") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } - name, err := utils.GetParamCustomName(ctx, "name") + name, err := base.GetParamCustomName(ctx, "name") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } @@ -102,7 +102,7 @@ func (h *K8sStatefulSetHandler) GetStatefulSetDetails(ctx *gin.Context) { req.Namespace = namespace req.Name = name - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return h.statefulSetService.GetStatefulSetDetails(ctx, &req) }) } @@ -110,21 +110,21 @@ func (h *K8sStatefulSetHandler) GetStatefulSetDetails(ctx *gin.Context) { func (h *K8sStatefulSetHandler) GetStatefulSetYaml(ctx *gin.Context) { var req model.GetStatefulSetYamlReq - clusterID, err := utils.GetCustomParamID(ctx, "cluster_id") + clusterID, err := base.GetCustomParamID(ctx, "cluster_id") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } - namespace, err := utils.GetParamCustomName(ctx, "namespace") + namespace, err := base.GetParamCustomName(ctx, "namespace") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } - name, err := utils.GetParamCustomName(ctx, "name") + name, err := base.GetParamCustomName(ctx, "name") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } @@ -132,7 +132,7 @@ func (h *K8sStatefulSetHandler) GetStatefulSetYaml(ctx *gin.Context) { req.Namespace = namespace req.Name = name - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return h.statefulSetService.GetStatefulSetYaml(ctx, &req) }) } @@ -140,15 +140,15 @@ func (h *K8sStatefulSetHandler) GetStatefulSetYaml(ctx *gin.Context) { func (h *K8sStatefulSetHandler) CreateStatefulSet(ctx *gin.Context) { var req model.CreateStatefulSetReq - clusterID, err := utils.GetCustomParamID(ctx, "cluster_id") + clusterID, err := base.GetCustomParamID(ctx, "cluster_id") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } req.ClusterID = clusterID - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return nil, h.statefulSetService.CreateStatefulSet(ctx, &req) }) } @@ -156,15 +156,15 @@ func (h *K8sStatefulSetHandler) CreateStatefulSet(ctx *gin.Context) { func (h *K8sStatefulSetHandler) CreateStatefulSetByYaml(ctx *gin.Context) { var req model.CreateStatefulSetByYamlReq - clusterID, err := utils.GetCustomParamID(ctx, "cluster_id") + clusterID, err := base.GetCustomParamID(ctx, "cluster_id") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } req.ClusterID = clusterID - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return nil, h.statefulSetService.CreateStatefulSetByYaml(ctx, &req) }) } @@ -172,21 +172,21 @@ func (h *K8sStatefulSetHandler) CreateStatefulSetByYaml(ctx *gin.Context) { func (h *K8sStatefulSetHandler) UpdateStatefulSet(ctx *gin.Context) { var req model.UpdateStatefulSetReq - clusterID, err := utils.GetCustomParamID(ctx, "cluster_id") + clusterID, err := base.GetCustomParamID(ctx, "cluster_id") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } - namespace, err := utils.GetParamCustomName(ctx, "namespace") + namespace, err := base.GetParamCustomName(ctx, "namespace") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } - name, err := utils.GetParamCustomName(ctx, "name") + name, err := base.GetParamCustomName(ctx, "name") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } @@ -194,7 +194,7 @@ func (h *K8sStatefulSetHandler) UpdateStatefulSet(ctx *gin.Context) { req.Namespace = namespace req.Name = name - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return nil, h.statefulSetService.UpdateStatefulSet(ctx, &req) }) } @@ -202,21 +202,21 @@ func (h *K8sStatefulSetHandler) UpdateStatefulSet(ctx *gin.Context) { func (h *K8sStatefulSetHandler) UpdateStatefulSetByYaml(ctx *gin.Context) { var req model.UpdateStatefulSetByYamlReq - clusterID, err := utils.GetCustomParamID(ctx, "cluster_id") + clusterID, err := base.GetCustomParamID(ctx, "cluster_id") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } - namespace, err := utils.GetParamCustomName(ctx, "namespace") + namespace, err := base.GetParamCustomName(ctx, "namespace") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } - name, err := utils.GetParamCustomName(ctx, "name") + name, err := base.GetParamCustomName(ctx, "name") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } @@ -224,7 +224,7 @@ func (h *K8sStatefulSetHandler) UpdateStatefulSetByYaml(ctx *gin.Context) { req.Namespace = namespace req.Name = name - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return nil, h.statefulSetService.UpdateStatefulSetByYaml(ctx, &req) }) } @@ -232,21 +232,21 @@ func (h *K8sStatefulSetHandler) UpdateStatefulSetByYaml(ctx *gin.Context) { func (h *K8sStatefulSetHandler) DeleteStatefulSet(ctx *gin.Context) { var req model.DeleteStatefulSetReq - clusterID, err := utils.GetCustomParamID(ctx, "cluster_id") + clusterID, err := base.GetCustomParamID(ctx, "cluster_id") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } - namespace, err := utils.GetParamCustomName(ctx, "namespace") + namespace, err := base.GetParamCustomName(ctx, "namespace") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } - name, err := utils.GetParamCustomName(ctx, "name") + name, err := base.GetParamCustomName(ctx, "name") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } @@ -254,7 +254,7 @@ func (h *K8sStatefulSetHandler) DeleteStatefulSet(ctx *gin.Context) { req.Namespace = namespace req.Name = name - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return nil, h.statefulSetService.DeleteStatefulSet(ctx, &req) }) } @@ -262,21 +262,21 @@ func (h *K8sStatefulSetHandler) DeleteStatefulSet(ctx *gin.Context) { func (h *K8sStatefulSetHandler) RestartStatefulSet(ctx *gin.Context) { var req model.RestartStatefulSetReq - clusterID, err := utils.GetCustomParamID(ctx, "cluster_id") + clusterID, err := base.GetCustomParamID(ctx, "cluster_id") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } - namespace, err := utils.GetParamCustomName(ctx, "namespace") + namespace, err := base.GetParamCustomName(ctx, "namespace") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } - name, err := utils.GetParamCustomName(ctx, "name") + name, err := base.GetParamCustomName(ctx, "name") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } @@ -284,7 +284,7 @@ func (h *K8sStatefulSetHandler) RestartStatefulSet(ctx *gin.Context) { req.Namespace = namespace req.Name = name - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return nil, h.statefulSetService.RestartStatefulSet(ctx, &req) }) } @@ -293,21 +293,21 @@ func (h *K8sStatefulSetHandler) RestartStatefulSet(ctx *gin.Context) { func (h *K8sStatefulSetHandler) ScaleStatefulSet(ctx *gin.Context) { var req model.ScaleStatefulSetReq - clusterID, err := utils.GetCustomParamID(ctx, "cluster_id") + clusterID, err := base.GetCustomParamID(ctx, "cluster_id") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } - namespace, err := utils.GetParamCustomName(ctx, "namespace") + namespace, err := base.GetParamCustomName(ctx, "namespace") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } - name, err := utils.GetParamCustomName(ctx, "name") + name, err := base.GetParamCustomName(ctx, "name") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } @@ -315,7 +315,7 @@ func (h *K8sStatefulSetHandler) ScaleStatefulSet(ctx *gin.Context) { req.Namespace = namespace req.Name = name - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return nil, h.statefulSetService.ScaleStatefulSet(ctx, &req) }) } @@ -323,21 +323,21 @@ func (h *K8sStatefulSetHandler) ScaleStatefulSet(ctx *gin.Context) { func (h *K8sStatefulSetHandler) RollbackStatefulSet(ctx *gin.Context) { var req model.RollbackStatefulSetReq - clusterID, err := utils.GetCustomParamID(ctx, "cluster_id") + clusterID, err := base.GetCustomParamID(ctx, "cluster_id") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } - namespace, err := utils.GetParamCustomName(ctx, "namespace") + namespace, err := base.GetParamCustomName(ctx, "namespace") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } - name, err := utils.GetParamCustomName(ctx, "name") + name, err := base.GetParamCustomName(ctx, "name") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } @@ -345,7 +345,7 @@ func (h *K8sStatefulSetHandler) RollbackStatefulSet(ctx *gin.Context) { req.Namespace = namespace req.Name = name - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return nil, h.statefulSetService.RollbackStatefulSet(ctx, &req) }) } @@ -353,21 +353,21 @@ func (h *K8sStatefulSetHandler) RollbackStatefulSet(ctx *gin.Context) { func (h *K8sStatefulSetHandler) GetStatefulSetPods(ctx *gin.Context) { var req model.GetStatefulSetPodsReq - clusterID, err := utils.GetCustomParamID(ctx, "cluster_id") + clusterID, err := base.GetCustomParamID(ctx, "cluster_id") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } - namespace, err := utils.GetParamCustomName(ctx, "namespace") + namespace, err := base.GetParamCustomName(ctx, "namespace") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } - name, err := utils.GetParamCustomName(ctx, "name") + name, err := base.GetParamCustomName(ctx, "name") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } @@ -375,7 +375,7 @@ func (h *K8sStatefulSetHandler) GetStatefulSetPods(ctx *gin.Context) { req.Namespace = namespace req.Name = name - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return h.statefulSetService.GetStatefulSetPods(ctx, &req) }) } @@ -383,21 +383,21 @@ func (h *K8sStatefulSetHandler) GetStatefulSetPods(ctx *gin.Context) { func (h *K8sStatefulSetHandler) GetStatefulSetHistory(ctx *gin.Context) { var req model.GetStatefulSetHistoryReq - clusterID, err := utils.GetCustomParamID(ctx, "cluster_id") + clusterID, err := base.GetCustomParamID(ctx, "cluster_id") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } - namespace, err := utils.GetParamCustomName(ctx, "namespace") + namespace, err := base.GetParamCustomName(ctx, "namespace") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } - name, err := utils.GetParamCustomName(ctx, "name") + name, err := base.GetParamCustomName(ctx, "name") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } @@ -405,7 +405,7 @@ func (h *K8sStatefulSetHandler) GetStatefulSetHistory(ctx *gin.Context) { req.Namespace = namespace req.Name = name - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return h.statefulSetService.GetStatefulSetHistory(ctx, &req) }) } diff --git a/internal/k8s/api/svc.go b/internal/k8s/api/svc.go index 992f42c8..c82f3db4 100644 --- a/internal/k8s/api/svc.go +++ b/internal/k8s/api/svc.go @@ -28,7 +28,7 @@ package api import ( "github.com/GoSimplicity/AI-CloudOps/internal/k8s/service" "github.com/GoSimplicity/AI-CloudOps/internal/model" - "github.com/GoSimplicity/AI-CloudOps/pkg/utils" + "github.com/GoSimplicity/AI-CloudOps/pkg/base" "github.com/gin-gonic/gin" ) @@ -60,15 +60,15 @@ func (h *K8sSvcHandler) RegisterRouters(server *gin.Engine) { func (h *K8sSvcHandler) GetServiceList(ctx *gin.Context) { var req model.GetServiceListReq - clusterID, err := utils.GetCustomParamID(ctx, "cluster_id") + clusterID, err := base.GetCustomParamID(ctx, "cluster_id") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } req.ClusterID = clusterID - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return h.svcService.GetServiceList(ctx, &req) }) } @@ -76,21 +76,21 @@ func (h *K8sSvcHandler) GetServiceList(ctx *gin.Context) { func (h *K8sSvcHandler) GetServiceDetails(ctx *gin.Context) { var req model.GetServiceDetailsReq - clusterID, err := utils.GetCustomParamID(ctx, "cluster_id") + clusterID, err := base.GetCustomParamID(ctx, "cluster_id") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } - namespace, err := utils.GetParamCustomName(ctx, "namespace") + namespace, err := base.GetParamCustomName(ctx, "namespace") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } - name, err := utils.GetParamCustomName(ctx, "name") + name, err := base.GetParamCustomName(ctx, "name") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } @@ -98,7 +98,7 @@ func (h *K8sSvcHandler) GetServiceDetails(ctx *gin.Context) { req.Namespace = namespace req.Name = name - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return h.svcService.GetServiceDetails(ctx, &req) }) } @@ -106,21 +106,21 @@ func (h *K8sSvcHandler) GetServiceDetails(ctx *gin.Context) { func (h *K8sSvcHandler) GetServiceYaml(ctx *gin.Context) { var req model.GetServiceYamlReq - clusterID, err := utils.GetCustomParamID(ctx, "cluster_id") + clusterID, err := base.GetCustomParamID(ctx, "cluster_id") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } - namespace, err := utils.GetParamCustomName(ctx, "namespace") + namespace, err := base.GetParamCustomName(ctx, "namespace") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } - name, err := utils.GetParamCustomName(ctx, "name") + name, err := base.GetParamCustomName(ctx, "name") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } @@ -128,7 +128,7 @@ func (h *K8sSvcHandler) GetServiceYaml(ctx *gin.Context) { req.Namespace = namespace req.Name = name - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return h.svcService.GetServiceYaml(ctx, &req) }) } @@ -136,15 +136,15 @@ func (h *K8sSvcHandler) GetServiceYaml(ctx *gin.Context) { func (h *K8sSvcHandler) CreateService(ctx *gin.Context) { var req model.CreateServiceReq - clusterID, err := utils.GetCustomParamID(ctx, "cluster_id") + clusterID, err := base.GetCustomParamID(ctx, "cluster_id") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } req.ClusterID = clusterID - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return nil, h.svcService.CreateService(ctx, &req) }) } @@ -152,21 +152,21 @@ func (h *K8sSvcHandler) CreateService(ctx *gin.Context) { func (h *K8sSvcHandler) UpdateService(ctx *gin.Context) { var req model.UpdateServiceReq - clusterID, err := utils.GetCustomParamID(ctx, "cluster_id") + clusterID, err := base.GetCustomParamID(ctx, "cluster_id") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } - namespace, err := utils.GetParamCustomName(ctx, "namespace") + namespace, err := base.GetParamCustomName(ctx, "namespace") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } - name, err := utils.GetParamCustomName(ctx, "name") + name, err := base.GetParamCustomName(ctx, "name") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } @@ -174,7 +174,7 @@ func (h *K8sSvcHandler) UpdateService(ctx *gin.Context) { req.Namespace = namespace req.Name = name - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return nil, h.svcService.UpdateService(ctx, &req) }) } @@ -182,21 +182,21 @@ func (h *K8sSvcHandler) UpdateService(ctx *gin.Context) { func (h *K8sSvcHandler) DeleteService(ctx *gin.Context) { var req model.DeleteServiceReq - clusterID, err := utils.GetCustomParamID(ctx, "cluster_id") + clusterID, err := base.GetCustomParamID(ctx, "cluster_id") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } - namespace, err := utils.GetParamCustomName(ctx, "namespace") + namespace, err := base.GetParamCustomName(ctx, "namespace") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } - name, err := utils.GetParamCustomName(ctx, "name") + name, err := base.GetParamCustomName(ctx, "name") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } @@ -204,7 +204,7 @@ func (h *K8sSvcHandler) DeleteService(ctx *gin.Context) { req.Namespace = namespace req.Name = name - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return nil, h.svcService.DeleteService(ctx, &req) }) } @@ -212,21 +212,21 @@ func (h *K8sSvcHandler) DeleteService(ctx *gin.Context) { func (h *K8sSvcHandler) GetServiceEndpoints(ctx *gin.Context) { var req model.GetServiceEndpointsReq - clusterID, err := utils.GetCustomParamID(ctx, "cluster_id") + clusterID, err := base.GetCustomParamID(ctx, "cluster_id") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } - namespace, err := utils.GetParamCustomName(ctx, "namespace") + namespace, err := base.GetParamCustomName(ctx, "namespace") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } - name, err := utils.GetParamCustomName(ctx, "name") + name, err := base.GetParamCustomName(ctx, "name") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } @@ -234,22 +234,22 @@ func (h *K8sSvcHandler) GetServiceEndpoints(ctx *gin.Context) { req.Namespace = namespace req.Name = name - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return h.svcService.GetServiceEndpoints(ctx, &req) }) } func (h *K8sSvcHandler) CreateServiceByYaml(ctx *gin.Context) { var req model.CreateServiceByYamlReq - clusterID, err := utils.GetCustomParamID(ctx, "cluster_id") + clusterID, err := base.GetCustomParamID(ctx, "cluster_id") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } req.ClusterID = clusterID - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return nil, h.svcService.CreateServiceByYaml(ctx, &req) }) } @@ -257,21 +257,21 @@ func (h *K8sSvcHandler) CreateServiceByYaml(ctx *gin.Context) { func (h *K8sSvcHandler) UpdateServiceByYaml(ctx *gin.Context) { var req model.UpdateServiceByYamlReq - clusterID, err := utils.GetCustomParamID(ctx, "cluster_id") + clusterID, err := base.GetCustomParamID(ctx, "cluster_id") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } - namespace, err := utils.GetParamCustomName(ctx, "namespace") + namespace, err := base.GetParamCustomName(ctx, "namespace") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } - name, err := utils.GetParamCustomName(ctx, "name") + name, err := base.GetParamCustomName(ctx, "name") if err != nil { - utils.BadRequestError(ctx, err.Error()) + base.BadRequestError(ctx, err.Error()) return } @@ -279,7 +279,7 @@ func (h *K8sSvcHandler) UpdateServiceByYaml(ctx *gin.Context) { req.Namespace = namespace req.Name = name - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return nil, h.svcService.UpdateServiceByYaml(ctx, &req) }) } diff --git a/internal/k8s/api/yaml_task.go b/internal/k8s/api/yaml_task.go index d4e7b55e..7b4d8e6b 100644 --- a/internal/k8s/api/yaml_task.go +++ b/internal/k8s/api/yaml_task.go @@ -28,7 +28,8 @@ package api import ( "github.com/GoSimplicity/AI-CloudOps/internal/k8s/service" "github.com/GoSimplicity/AI-CloudOps/internal/model" - "github.com/GoSimplicity/AI-CloudOps/pkg/utils" + "github.com/GoSimplicity/AI-CloudOps/pkg/base" + "github.com/GoSimplicity/AI-CloudOps/pkg/jwt" "github.com/gin-gonic/gin" ) @@ -57,15 +58,15 @@ func (h *K8sYamlTaskHandler) RegisterRouters(server *gin.Engine) { func (h *K8sYamlTaskHandler) GetYamlTaskList(ctx *gin.Context) { var req model.YamlTaskListReq - clusterId, err := utils.GetCustomParamID(ctx, "cluster_id") + clusterId, err := base.GetCustomParamID(ctx, "cluster_id") if err != nil { - utils.BadRequestError(ctx, "缺少 'cluster_id' 参数") + base.BadRequestError(ctx, "缺少 'cluster_id' 参数") return } req.ClusterID = clusterId - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return h.yamlTaskService.GetYamlTaskList(ctx, &req) }) } @@ -73,17 +74,17 @@ func (h *K8sYamlTaskHandler) GetYamlTaskList(ctx *gin.Context) { func (h *K8sYamlTaskHandler) CreateYamlTask(ctx *gin.Context) { var req model.YamlTaskCreateReq - clusterId, err := utils.GetCustomParamID(ctx, "cluster_id") + clusterId, err := base.GetCustomParamID(ctx, "cluster_id") if err != nil { - utils.BadRequestError(ctx, "缺少 'cluster_id' 参数") + base.BadRequestError(ctx, "缺少 'cluster_id' 参数") return } - uc := ctx.MustGet("user").(utils.UserClaims) + uc := ctx.MustGet("user").(jwt.UserClaims) req.UserID = uc.Uid req.ClusterID = clusterId - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return nil, h.yamlTaskService.CreateYamlTask(ctx, &req) }) } @@ -91,24 +92,24 @@ func (h *K8sYamlTaskHandler) CreateYamlTask(ctx *gin.Context) { func (h *K8sYamlTaskHandler) UpdateYamlTask(ctx *gin.Context) { var req model.YamlTaskUpdateReq - clusterId, err := utils.GetCustomParamID(ctx, "cluster_id") + clusterId, err := base.GetCustomParamID(ctx, "cluster_id") if err != nil { - utils.BadRequestError(ctx, "缺少 'cluster_id' 参数") + base.BadRequestError(ctx, "缺少 'cluster_id' 参数") return } - id, err := utils.GetParamID(ctx) + id, err := base.GetParamID(ctx) if err != nil { - utils.BadRequestError(ctx, "缺少 'id' 参数") + base.BadRequestError(ctx, "缺少 'id' 参数") return } - uc := ctx.MustGet("user").(utils.UserClaims) + uc := ctx.MustGet("user").(jwt.UserClaims) req.UserID = uc.Uid req.ClusterID = clusterId req.ID = id - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return nil, h.yamlTaskService.UpdateYamlTask(ctx, &req) }) } @@ -116,22 +117,22 @@ func (h *K8sYamlTaskHandler) UpdateYamlTask(ctx *gin.Context) { func (h *K8sYamlTaskHandler) ApplyYamlTask(ctx *gin.Context) { var req model.YamlTaskExecuteReq - id, err := utils.GetParamID(ctx) + id, err := base.GetParamID(ctx) if err != nil { - utils.BadRequestError(ctx, "缺少 'id' 参数") + base.BadRequestError(ctx, "缺少 'id' 参数") return } - clusterId, err := utils.GetCustomParamID(ctx, "cluster_id") + clusterId, err := base.GetCustomParamID(ctx, "cluster_id") if err != nil { - utils.BadRequestError(ctx, "缺少 'cluster_id' 参数") + base.BadRequestError(ctx, "缺少 'cluster_id' 参数") return } req.ID = id req.ClusterID = clusterId - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return nil, h.yamlTaskService.ApplyYamlTask(ctx, &req) }) } @@ -139,22 +140,22 @@ func (h *K8sYamlTaskHandler) ApplyYamlTask(ctx *gin.Context) { func (h *K8sYamlTaskHandler) DeleteYamlTask(ctx *gin.Context) { var req model.YamlTaskDeleteReq - id, err := utils.GetParamID(ctx) + id, err := base.GetParamID(ctx) if err != nil { - utils.BadRequestError(ctx, "缺少 'id' 参数") + base.BadRequestError(ctx, "缺少 'id' 参数") return } - clusterId, err := utils.GetCustomParamID(ctx, "cluster_id") + clusterId, err := base.GetCustomParamID(ctx, "cluster_id") if err != nil { - utils.BadRequestError(ctx, "缺少 'cluster_id' 参数") + base.BadRequestError(ctx, "缺少 'cluster_id' 参数") return } req.ID = id req.ClusterID = clusterId - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return nil, h.yamlTaskService.DeleteYamlTask(ctx, &req) }) } @@ -162,22 +163,22 @@ func (h *K8sYamlTaskHandler) DeleteYamlTask(ctx *gin.Context) { func (h *K8sYamlTaskHandler) GetYamlTaskDetail(ctx *gin.Context) { var req model.YamlTaskDetailReq - clusterId, err := utils.GetCustomParamID(ctx, "cluster_id") + clusterId, err := base.GetCustomParamID(ctx, "cluster_id") if err != nil { - utils.BadRequestError(ctx, "缺少 'cluster_id' 参数") + base.BadRequestError(ctx, "缺少 'cluster_id' 参数") return } - id, err := utils.GetParamID(ctx) + id, err := base.GetParamID(ctx) if err != nil { - utils.BadRequestError(ctx, "缺少 'id' 参数") + base.BadRequestError(ctx, "缺少 'id' 参数") return } req.ID = id req.ClusterID = clusterId - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return h.yamlTaskService.GetYamlTaskDetail(ctx, &req) }) } diff --git a/internal/k8s/api/yaml_template.go b/internal/k8s/api/yaml_template.go index 7feabd77..e174926f 100644 --- a/internal/k8s/api/yaml_template.go +++ b/internal/k8s/api/yaml_template.go @@ -28,7 +28,8 @@ package api import ( "github.com/GoSimplicity/AI-CloudOps/internal/k8s/service" "github.com/GoSimplicity/AI-CloudOps/internal/model" - "github.com/GoSimplicity/AI-CloudOps/pkg/utils" + "github.com/GoSimplicity/AI-CloudOps/pkg/base" + "github.com/GoSimplicity/AI-CloudOps/pkg/jwt" "github.com/gin-gonic/gin" ) @@ -57,15 +58,15 @@ func (h *K8sYamlTemplateHandler) RegisterRouters(server *gin.Engine) { func (h *K8sYamlTemplateHandler) GetYamlTemplateList(ctx *gin.Context) { var req model.YamlTemplateListReq - clusterId, err := utils.GetCustomParamID(ctx, "cluster_id") + clusterId, err := base.GetCustomParamID(ctx, "cluster_id") if err != nil { - utils.BadRequestError(ctx, "缺少 'cluster_id' 参数") + base.BadRequestError(ctx, "缺少 'cluster_id' 参数") return } req.ClusterID = clusterId - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return h.yamlTemplateService.GetYamlTemplateList(ctx, &req) }) } @@ -73,17 +74,17 @@ func (h *K8sYamlTemplateHandler) GetYamlTemplateList(ctx *gin.Context) { func (h *K8sYamlTemplateHandler) CreateYamlTemplate(ctx *gin.Context) { var req model.YamlTemplateCreateReq - clusterId, err := utils.GetCustomParamID(ctx, "cluster_id") + clusterId, err := base.GetCustomParamID(ctx, "cluster_id") if err != nil { - utils.BadRequestError(ctx, "缺少 'cluster_id' 参数") + base.BadRequestError(ctx, "缺少 'cluster_id' 参数") return } - uc := ctx.MustGet("user").(utils.UserClaims) + uc := ctx.MustGet("user").(jwt.UserClaims) req.ClusterID = clusterId req.UserID = uc.Uid - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return nil, h.yamlTemplateService.CreateYamlTemplate(ctx, &req) }) } @@ -91,24 +92,24 @@ func (h *K8sYamlTemplateHandler) CreateYamlTemplate(ctx *gin.Context) { func (h *K8sYamlTemplateHandler) UpdateYamlTemplate(ctx *gin.Context) { var req model.YamlTemplateUpdateReq - clusterId, err := utils.GetCustomParamID(ctx, "cluster_id") + clusterId, err := base.GetCustomParamID(ctx, "cluster_id") if err != nil { - utils.BadRequestError(ctx, "缺少 'cluster_id' 参数") + base.BadRequestError(ctx, "缺少 'cluster_id' 参数") return } - id, err := utils.GetParamID(ctx) + id, err := base.GetParamID(ctx) if err != nil { - utils.BadRequestError(ctx, "缺少 'id' 参数") + base.BadRequestError(ctx, "缺少 'id' 参数") return } - uc := ctx.MustGet("user").(utils.UserClaims) + uc := ctx.MustGet("user").(jwt.UserClaims) req.ClusterID = clusterId req.UserID = uc.Uid req.ID = id - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return nil, h.yamlTemplateService.UpdateYamlTemplate(ctx, &req) }) } @@ -116,22 +117,22 @@ func (h *K8sYamlTemplateHandler) UpdateYamlTemplate(ctx *gin.Context) { func (h *K8sYamlTemplateHandler) DeleteYamlTemplate(ctx *gin.Context) { var req model.YamlTemplateDeleteReq - id, err := utils.GetParamID(ctx) + id, err := base.GetParamID(ctx) if err != nil { - utils.BadRequestError(ctx, "缺少 'id' 参数") + base.BadRequestError(ctx, "缺少 'id' 参数") return } - clusterId, err := utils.GetCustomParamID(ctx, "cluster_id") + clusterId, err := base.GetCustomParamID(ctx, "cluster_id") if err != nil { - utils.BadRequestError(ctx, "缺少 'cluster_id' 参数") + base.BadRequestError(ctx, "缺少 'cluster_id' 参数") return } req.ID = id req.ClusterID = clusterId - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return nil, h.yamlTemplateService.DeleteYamlTemplate(ctx, &req) }) } @@ -139,15 +140,15 @@ func (h *K8sYamlTemplateHandler) DeleteYamlTemplate(ctx *gin.Context) { func (h *K8sYamlTemplateHandler) CheckYamlTemplate(ctx *gin.Context) { var req model.YamlTemplateCheckReq - clusterId, err := utils.GetCustomParamID(ctx, "cluster_id") + clusterId, err := base.GetCustomParamID(ctx, "cluster_id") if err != nil { - utils.BadRequestError(ctx, "缺少 'cluster_id' 参数") + base.BadRequestError(ctx, "缺少 'cluster_id' 参数") return } req.ClusterID = clusterId - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return nil, h.yamlTemplateService.CheckYamlTemplate(ctx, &req) }) } @@ -155,22 +156,22 @@ func (h *K8sYamlTemplateHandler) CheckYamlTemplate(ctx *gin.Context) { func (h *K8sYamlTemplateHandler) GetYamlTemplateDetail(ctx *gin.Context) { var req model.YamlTemplateDetailReq - id, err := utils.GetParamID(ctx) + id, err := base.GetParamID(ctx) if err != nil { - utils.BadRequestError(ctx, "缺少 'id' 参数") + base.BadRequestError(ctx, "缺少 'id' 参数") return } - clusterId, err := utils.GetCustomParamID(ctx, "cluster_id") + clusterId, err := base.GetCustomParamID(ctx, "cluster_id") if err != nil { - utils.BadRequestError(ctx, "缺少 'cluster_id' 参数") + base.BadRequestError(ctx, "缺少 'cluster_id' 参数") return } req.ID = id req.ClusterID = clusterId - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return h.yamlTemplateService.GetYamlTemplateDetail(ctx, &req) }) } diff --git a/internal/k8s/manager/pod_manager.go b/internal/k8s/manager/pod_manager.go index 195bf5bb..fcad39f4 100644 --- a/internal/k8s/manager/pod_manager.go +++ b/internal/k8s/manager/pod_manager.go @@ -39,9 +39,9 @@ import ( "github.com/GoSimplicity/AI-CloudOps/internal/k8s/utils" k8sutils "github.com/GoSimplicity/AI-CloudOps/internal/k8s/utils" "github.com/GoSimplicity/AI-CloudOps/internal/model" - pkg "github.com/GoSimplicity/AI-CloudOps/pkg/utils" - "github.com/GoSimplicity/AI-CloudOps/pkg/utils/retry" - "github.com/GoSimplicity/AI-CloudOps/pkg/utils/terminal" + "github.com/GoSimplicity/AI-CloudOps/pkg/base" + "github.com/GoSimplicity/AI-CloudOps/pkg/retry" + "github.com/GoSimplicity/AI-CloudOps/pkg/terminal" "github.com/gin-gonic/gin" "github.com/gorilla/websocket" "go.uber.org/zap" @@ -263,7 +263,7 @@ func (m *podManager) BatchDeletePods(ctx context.Context, clusterID int, namespa m.logger.Warn("批量删除Pod失败", zap.Error(err)) - return pkg.NewBusinessError(constants.ErrK8sResourceDelete, "批量删除Pod失败") + return base.NewBusinessError(constants.ErrK8sResourceDelete, "批量删除Pod失败") } return nil } @@ -461,7 +461,7 @@ func (m *podManager) PortForward(ctx context.Context, ports []string, dialer htt forwarder, err := portforward.New(dialer, ports, stopChan, readyChan, io.Discard, io.Discard) if err != nil { - return pkg.NewBusinessError(constants.ErrK8sPortForward, err.Error()) + return base.NewBusinessError(constants.ErrK8sPortForward, err.Error()) } // 自动关闭转发 diff --git a/internal/k8s/service/pod_service.go b/internal/k8s/service/pod_service.go index 5612ea3d..aa80cf2b 100644 --- a/internal/k8s/service/pod_service.go +++ b/internal/k8s/service/pod_service.go @@ -40,7 +40,7 @@ import ( "github.com/GoSimplicity/AI-CloudOps/internal/k8s/utils" "github.com/GoSimplicity/AI-CloudOps/internal/model" "github.com/GoSimplicity/AI-CloudOps/pkg/sse" - pkg "github.com/GoSimplicity/AI-CloudOps/pkg/utils" + "github.com/GoSimplicity/AI-CloudOps/pkg/ssh" "github.com/gin-gonic/gin" "go.uber.org/zap" corev1 "k8s.io/api/core/v1" @@ -605,7 +605,7 @@ func (s *podService) PodExec(ctx *gin.Context, req *model.PodExecReq) error { return fmt.Errorf("Pod名称不能为空") } - conn, err := pkg.UpGrader.Upgrade(ctx.Writer, ctx.Request, nil) + conn, err := ssh.UpGrader.Upgrade(ctx.Writer, ctx.Request, nil) if err != nil { s.logger.Error("升级ws失败", zap.Error(err)) return fmt.Errorf("初始化WebSocket失败: %w", err) diff --git a/internal/k8s/service/pv_service.go b/internal/k8s/service/pv_service.go index b3659e67..d2a19909 100644 --- a/internal/k8s/service/pv_service.go +++ b/internal/k8s/service/pv_service.go @@ -37,7 +37,7 @@ import ( "github.com/GoSimplicity/AI-CloudOps/internal/k8s/manager" "github.com/GoSimplicity/AI-CloudOps/internal/k8s/utils" "github.com/GoSimplicity/AI-CloudOps/internal/model" - pkg "github.com/GoSimplicity/AI-CloudOps/pkg/utils" + "github.com/GoSimplicity/AI-CloudOps/pkg/base" "go.uber.org/zap" corev1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -91,7 +91,7 @@ func (s *pvService) GetPVList(ctx context.Context, req *model.GetPVListReq) (mod s.logger.Error("获取Kubernetes客户端失败", zap.Int("clusterID", req.ClusterID), zap.Error(err)) - return model.ListResp[*model.K8sPV]{}, pkg.NewBusinessError(constants.ErrK8sClientInit, "无法连接到Kubernetes集群") + return model.ListResp[*model.K8sPV]{}, base.NewBusinessError(constants.ErrK8sClientInit, "无法连接到Kubernetes集群") } listOptions := utils.BuildPVListOptions(req) @@ -101,7 +101,7 @@ func (s *pvService) GetPVList(ctx context.Context, req *model.GetPVListReq) (mod s.logger.Error("获取PV列表失败", zap.Int("clusterID", req.ClusterID), zap.Error(err)) - return model.ListResp[*model.K8sPV]{}, pkg.NewBusinessError(constants.ErrK8sResourceList, "获取PV列表失败") + return model.ListResp[*model.K8sPV]{}, base.NewBusinessError(constants.ErrK8sResourceList, "获取PV列表失败") } entities := make([]*model.K8sPV, 0, len(pvs.Items)) @@ -206,7 +206,7 @@ func (s *pvService) GetPVDetails(ctx context.Context, req *model.GetPVDetailsReq kubeClient, err := s.client.GetKubeClient(req.ClusterID) if err != nil { s.logger.Error("获取Kubernetes客户端失败", zap.Error(err)) - return nil, pkg.NewBusinessError(constants.ErrK8sClientInit, "无法连接到Kubernetes集群") + return nil, base.NewBusinessError(constants.ErrK8sClientInit, "无法连接到Kubernetes集群") } pv, err := kubeClient.CoreV1().PersistentVolumes().Get(ctx, req.Name, metav1.GetOptions{}) @@ -215,7 +215,7 @@ func (s *pvService) GetPVDetails(ctx context.Context, req *model.GetPVDetailsReq zap.Int("clusterID", req.ClusterID), zap.String("name", req.Name), zap.Error(err)) - return nil, pkg.NewBusinessError(constants.ErrK8sResourceGet, "获取PV详情失败") + return nil, base.NewBusinessError(constants.ErrK8sResourceGet, "获取PV详情失败") } return s.convertPVToEntity(pv, req.ClusterID), nil @@ -237,7 +237,7 @@ func (s *pvService) GetPVYaml(ctx context.Context, req *model.GetPVYamlReq) (*mo kubeClient, err := s.client.GetKubeClient(req.ClusterID) if err != nil { s.logger.Error("获取Kubernetes客户端失败", zap.Error(err)) - return nil, pkg.NewBusinessError(constants.ErrK8sClientInit, "无法连接到Kubernetes集群") + return nil, base.NewBusinessError(constants.ErrK8sClientInit, "无法连接到Kubernetes集群") } pv, err := kubeClient.CoreV1().PersistentVolumes().Get(ctx, req.Name, metav1.GetOptions{}) @@ -246,7 +246,7 @@ func (s *pvService) GetPVYaml(ctx context.Context, req *model.GetPVYamlReq) (*mo zap.Int("clusterID", req.ClusterID), zap.String("name", req.Name), zap.Error(err)) - return nil, pkg.NewBusinessError(constants.ErrK8sResourceGet, "获取PV失败") + return nil, base.NewBusinessError(constants.ErrK8sResourceGet, "获取PV失败") } yamlContent, err := utils.PVToYAML(pv) @@ -319,7 +319,7 @@ func (s *pvService) UpdatePV(ctx context.Context, req *model.UpdatePVReq) error kubeClient, err := s.client.GetKubeClient(req.ClusterID) if err != nil { s.logger.Error("获取Kubernetes客户端失败", zap.Error(err)) - return pkg.NewBusinessError(constants.ErrK8sClientInit, "无法连接到Kubernetes集群") + return base.NewBusinessError(constants.ErrK8sClientInit, "无法连接到Kubernetes集群") } existingPV, err := kubeClient.CoreV1().PersistentVolumes().Get(ctx, req.Name, metav1.GetOptions{}) @@ -328,7 +328,7 @@ func (s *pvService) UpdatePV(ctx context.Context, req *model.UpdatePVReq) error zap.Int("clusterID", req.ClusterID), zap.String("name", req.Name), zap.Error(err)) - return pkg.NewBusinessError(constants.ErrK8sResourceGet, "获取现有PV失败") + return base.NewBusinessError(constants.ErrK8sResourceGet, "获取现有PV失败") } // 基于现有PV对象更新可变字段 @@ -337,7 +337,7 @@ func (s *pvService) UpdatePV(ctx context.Context, req *model.UpdatePVReq) error s.logger.Error("转换PV更新请求失败", zap.Int("clusterID", req.ClusterID), zap.String("name", req.Name)) - return pkg.NewBusinessError(constants.ErrInvalidParam, "无效的更新请求") + return base.NewBusinessError(constants.ErrInvalidParam, "无效的更新请求") } if err := utils.ValidatePV(pv); err != nil { @@ -377,7 +377,7 @@ func (s *pvService) DeletePV(ctx context.Context, req *model.DeletePVReq) error s.logger.Error("获取Kubernetes客户端失败", zap.Int("clusterID", req.ClusterID), zap.Error(err)) - return pkg.NewBusinessError(constants.ErrK8sClientInit, "无法连接到Kubernetes集群") + return base.NewBusinessError(constants.ErrK8sClientInit, "无法连接到Kubernetes集群") } err = kubeClient.CoreV1().PersistentVolumes().Delete(ctx, req.Name, metav1.DeleteOptions{}) @@ -386,7 +386,7 @@ func (s *pvService) DeletePV(ctx context.Context, req *model.DeletePVReq) error zap.Int("clusterID", req.ClusterID), zap.String("name", req.Name), zap.Error(err)) - return pkg.NewBusinessError(constants.ErrK8sResourceDelete, "删除PV失败") + return base.NewBusinessError(constants.ErrK8sResourceDelete, "删除PV失败") } s.logger.Info("成功删除PV", @@ -398,10 +398,10 @@ func (s *pvService) DeletePV(ctx context.Context, req *model.DeletePVReq) error // ReclaimPV 回收PV func (s *pvService) ReclaimPV(ctx context.Context, req *model.ReclaimPVReq) error { if req == nil { - return pkg.NewBusinessError(constants.ErrInvalidParam, "请求不能为空") + return base.NewBusinessError(constants.ErrInvalidParam, "请求不能为空") } if req.ClusterID <= 0 || req.Name == "" { - return pkg.NewBusinessError(constants.ErrInvalidParam, "参数无效") + return base.NewBusinessError(constants.ErrInvalidParam, "参数无效") } return s.pvManager.ReclaimPV(ctx, req.ClusterID, req.Name) } @@ -525,58 +525,58 @@ func (s *pvService) pvStatusToString(status model.K8sPVStatus) string { func (s *pvService) CreatePVByYaml(ctx context.Context, req *model.CreatePVByYamlReq) error { if req == nil { - return pkg.NewBusinessError(constants.ErrInvalidParam, "通过YAML创建PV请求不能为空") + return base.NewBusinessError(constants.ErrInvalidParam, "通过YAML创建PV请求不能为空") } if req.ClusterID <= 0 { - return pkg.NewBusinessError(constants.ErrInvalidParam, "集群ID不能为空") + return base.NewBusinessError(constants.ErrInvalidParam, "集群ID不能为空") } if req.YAML == "" { - return pkg.NewBusinessError(constants.ErrInvalidParam, "YAML内容不能为空") + return base.NewBusinessError(constants.ErrInvalidParam, "YAML内容不能为空") } pv, err := utils.YAMLToPV(req.YAML) if err != nil { s.logger.Error("解析PV YAML失败", zap.Error(err)) - return pkg.NewBusinessError(constants.ErrK8sResourceOperation, "解析YAML失败") + return base.NewBusinessError(constants.ErrK8sResourceOperation, "解析YAML失败") } if err := utils.ValidatePV(pv); err != nil { s.logger.Error("PV配置验证失败", zap.Error(err)) - return pkg.NewBusinessError(constants.ErrInvalidParam, "PV配置验证失败") + return base.NewBusinessError(constants.ErrInvalidParam, "PV配置验证失败") } if err := s.pvManager.CreatePV(ctx, req.ClusterID, pv); err != nil { s.logger.Error("创建PV失败", zap.Error(err), zap.Int("clusterID", req.ClusterID), zap.String("name", pv.Name)) - return pkg.NewBusinessError(constants.ErrK8sResourceCreate, "创建PV失败") + return base.NewBusinessError(constants.ErrK8sResourceCreate, "创建PV失败") } return nil } func (s *pvService) UpdatePVByYaml(ctx context.Context, req *model.UpdatePVByYamlReq) error { if req == nil { - return pkg.NewBusinessError(constants.ErrInvalidParam, "通过YAML更新PV请求不能为空") + return base.NewBusinessError(constants.ErrInvalidParam, "通过YAML更新PV请求不能为空") } if req.ClusterID <= 0 { - return pkg.NewBusinessError(constants.ErrInvalidParam, "集群ID不能为空") + return base.NewBusinessError(constants.ErrInvalidParam, "集群ID不能为空") } if req.YAML == "" { - return pkg.NewBusinessError(constants.ErrInvalidParam, "YAML内容不能为空") + return base.NewBusinessError(constants.ErrInvalidParam, "YAML内容不能为空") } desired, err := utils.YAMLToPV(req.YAML) if err != nil { s.logger.Error("解析PV YAML失败", zap.Error(err)) - return pkg.NewBusinessError(constants.ErrK8sResourceOperation, "解析YAML失败") + return base.NewBusinessError(constants.ErrK8sResourceOperation, "解析YAML失败") } if desired.Name == "" { desired.Name = req.Name } if desired.Name != req.Name { - return pkg.NewBusinessError(constants.ErrInvalidParam, "请求名称与YAML不一致") + return base.NewBusinessError(constants.ErrInvalidParam, "请求名称与YAML不一致") } if err := utils.ValidatePV(desired); err != nil { s.logger.Error("PV配置验证失败", zap.Error(err)) - return pkg.NewBusinessError(constants.ErrInvalidParam, "PV配置验证失败") + return base.NewBusinessError(constants.ErrInvalidParam, "PV配置验证失败") } if err := s.pvManager.UpdatePV(ctx, req.ClusterID, desired); err != nil { s.logger.Error("更新PV失败", zap.Error(err), zap.Int("clusterID", req.ClusterID), zap.String("name", req.Name)) - return pkg.NewBusinessError(constants.ErrK8sResourceUpdate, "更新PV失败") + return base.NewBusinessError(constants.ErrK8sResourceUpdate, "更新PV失败") } return nil } diff --git a/internal/k8s/service/pvc_service.go b/internal/k8s/service/pvc_service.go index 35514b59..f45301e9 100644 --- a/internal/k8s/service/pvc_service.go +++ b/internal/k8s/service/pvc_service.go @@ -37,7 +37,7 @@ import ( "github.com/GoSimplicity/AI-CloudOps/internal/k8s/manager" k8sutils "github.com/GoSimplicity/AI-CloudOps/internal/k8s/utils" "github.com/GoSimplicity/AI-CloudOps/internal/model" - pkg "github.com/GoSimplicity/AI-CloudOps/pkg/utils" + "github.com/GoSimplicity/AI-CloudOps/pkg/base" "go.uber.org/zap" corev1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -90,7 +90,7 @@ func (s *pvcService) GetPVCList(ctx context.Context, req *model.GetPVCListReq) ( s.logger.Error("获取Kubernetes客户端失败", zap.Int("clusterID", req.ClusterID), zap.Error(err)) - return model.ListResp[*model.K8sPVC]{}, pkg.NewBusinessError(constants.ErrK8sClientInit, "无法连接到Kubernetes集群") + return model.ListResp[*model.K8sPVC]{}, base.NewBusinessError(constants.ErrK8sClientInit, "无法连接到Kubernetes集群") } listOptions := k8sutils.BuildPVCListOptions(req) @@ -101,7 +101,7 @@ func (s *pvcService) GetPVCList(ctx context.Context, req *model.GetPVCListReq) ( zap.Int("clusterID", req.ClusterID), zap.String("namespace", req.Namespace), zap.Error(err)) - return model.ListResp[*model.K8sPVC]{}, pkg.NewBusinessError(constants.ErrK8sResourceList, "获取PVC列表失败") + return model.ListResp[*model.K8sPVC]{}, base.NewBusinessError(constants.ErrK8sResourceList, "获取PVC列表失败") } entities := make([]*model.K8sPVC, 0, len(pvcs.Items)) @@ -206,7 +206,7 @@ func (s *pvcService) GetPVCDetails(ctx context.Context, req *model.GetPVCDetails kubeClient, err := s.client.GetKubeClient(req.ClusterID) if err != nil { s.logger.Error("获取Kubernetes客户端失败", zap.Error(err)) - return nil, pkg.NewBusinessError(constants.ErrK8sClientInit, "无法连接到Kubernetes集群") + return nil, base.NewBusinessError(constants.ErrK8sClientInit, "无法连接到Kubernetes集群") } pvc, err := kubeClient.CoreV1().PersistentVolumeClaims(req.Namespace).Get(ctx, req.Name, metav1.GetOptions{}) @@ -216,7 +216,7 @@ func (s *pvcService) GetPVCDetails(ctx context.Context, req *model.GetPVCDetails zap.String("namespace", req.Namespace), zap.String("name", req.Name), zap.Error(err)) - return nil, pkg.NewBusinessError(constants.ErrK8sResourceGet, "获取PVC详情失败") + return nil, base.NewBusinessError(constants.ErrK8sResourceGet, "获取PVC详情失败") } return s.convertPVCToEntity(pvc, req.ClusterID), nil @@ -242,7 +242,7 @@ func (s *pvcService) GetPVCYaml(ctx context.Context, req *model.GetPVCYamlReq) ( kubeClient, err := s.client.GetKubeClient(req.ClusterID) if err != nil { s.logger.Error("获取Kubernetes客户端失败", zap.Error(err)) - return nil, pkg.NewBusinessError(constants.ErrK8sClientInit, "无法连接到Kubernetes集群") + return nil, base.NewBusinessError(constants.ErrK8sClientInit, "无法连接到Kubernetes集群") } pvc, err := kubeClient.CoreV1().PersistentVolumeClaims(req.Namespace).Get(ctx, req.Name, metav1.GetOptions{}) @@ -252,7 +252,7 @@ func (s *pvcService) GetPVCYaml(ctx context.Context, req *model.GetPVCYamlReq) ( zap.String("namespace", req.Namespace), zap.String("name", req.Name), zap.Error(err)) - return nil, pkg.NewBusinessError(constants.ErrK8sResourceGet, "获取PVC失败") + return nil, base.NewBusinessError(constants.ErrK8sResourceGet, "获取PVC失败") } yamlContent, err := k8sutils.PVCToYAML(pvc) @@ -291,7 +291,7 @@ func (s *pvcService) CreatePVC(ctx context.Context, req *model.CreatePVCReq) err s.logger.Error("构建PVC对象失败", zap.String("name", req.Name), zap.String("namespace", req.Namespace)) - return pkg.NewBusinessError(constants.ErrInvalidParam, "PVC配置转换失败") + return base.NewBusinessError(constants.ErrInvalidParam, "PVC配置转换失败") } if err := k8sutils.ValidatePVC(pvc); err != nil { @@ -343,7 +343,7 @@ func (s *pvcService) UpdatePVC(ctx context.Context, req *model.UpdatePVCReq) err zap.Int("clusterID", req.ClusterID), zap.String("namespace", req.Namespace), zap.String("name", req.Name)) - return pkg.NewBusinessError(constants.ErrInvalidParam, "PVC配置转换失败") + return base.NewBusinessError(constants.ErrInvalidParam, "PVC配置转换失败") } if err := k8sutils.ValidatePVC(pvc); err != nil { @@ -510,18 +510,18 @@ func (s *pvcService) pvcStatusToString(status model.K8sPVCStatus) string { func (s *pvcService) CreatePVCByYaml(ctx context.Context, req *model.CreatePVCByYamlReq) error { if req == nil { - return pkg.NewBusinessError(constants.ErrInvalidParam, "通过YAML创建PVC请求不能为空") + return base.NewBusinessError(constants.ErrInvalidParam, "通过YAML创建PVC请求不能为空") } if req.ClusterID <= 0 { - return pkg.NewBusinessError(constants.ErrInvalidParam, "集群ID不能为空") + return base.NewBusinessError(constants.ErrInvalidParam, "集群ID不能为空") } if req.YAML == "" { - return pkg.NewBusinessError(constants.ErrInvalidParam, "YAML内容不能为空") + return base.NewBusinessError(constants.ErrInvalidParam, "YAML内容不能为空") } pvc, err := k8sutils.YAMLToPVC(req.YAML) if err != nil { s.logger.Error("解析PVC YAML失败", zap.Error(err)) - return pkg.NewBusinessError(constants.ErrK8sResourceOperation, "解析YAML失败") + return base.NewBusinessError(constants.ErrK8sResourceOperation, "解析YAML失败") } // 如果YAML中没有指定namespace,使用default命名空间 if pvc.Namespace == "" { @@ -532,32 +532,32 @@ func (s *pvcService) CreatePVCByYaml(ctx context.Context, req *model.CreatePVCBy } if err := k8sutils.ValidatePVC(pvc); err != nil { s.logger.Error("PVC配置验证失败", zap.Error(err)) - return pkg.NewBusinessError(constants.ErrInvalidParam, "PVC配置验证失败") + return base.NewBusinessError(constants.ErrInvalidParam, "PVC配置验证失败") } if err := s.pvcManager.CreatePVC(ctx, req.ClusterID, pvc.Namespace, pvc); err != nil { s.logger.Error("创建PVC失败", zap.Error(err), zap.Int("clusterID", req.ClusterID), zap.String("namespace", pvc.Namespace), zap.String("name", pvc.Name)) - return pkg.NewBusinessError(constants.ErrK8sResourceCreate, "创建PVC失败") + return base.NewBusinessError(constants.ErrK8sResourceCreate, "创建PVC失败") } return nil } func (s *pvcService) UpdatePVCByYaml(ctx context.Context, req *model.UpdatePVCByYamlReq) error { if req == nil { - return pkg.NewBusinessError(constants.ErrInvalidParam, "通过YAML更新PVC请求不能为空") + return base.NewBusinessError(constants.ErrInvalidParam, "通过YAML更新PVC请求不能为空") } if req.ClusterID <= 0 { - return pkg.NewBusinessError(constants.ErrInvalidParam, "集群ID不能为空") + return base.NewBusinessError(constants.ErrInvalidParam, "集群ID不能为空") } if req.YAML == "" { - return pkg.NewBusinessError(constants.ErrInvalidParam, "YAML内容不能为空") + return base.NewBusinessError(constants.ErrInvalidParam, "YAML内容不能为空") } if req.Name == "" || req.Namespace == "" { - return pkg.NewBusinessError(constants.ErrInvalidParam, "资源名称与命名空间不能为空") + return base.NewBusinessError(constants.ErrInvalidParam, "资源名称与命名空间不能为空") } desired, err := k8sutils.YAMLToPVC(req.YAML) if err != nil { s.logger.Error("解析PVC YAML失败", zap.Error(err)) - return pkg.NewBusinessError(constants.ErrK8sResourceOperation, "解析YAML失败") + return base.NewBusinessError(constants.ErrK8sResourceOperation, "解析YAML失败") } if desired.Name == "" { desired.Name = req.Name @@ -566,15 +566,15 @@ func (s *pvcService) UpdatePVCByYaml(ctx context.Context, req *model.UpdatePVCBy desired.Namespace = req.Namespace } if desired.Name != req.Name || desired.Namespace != req.Namespace { - return pkg.NewBusinessError(constants.ErrInvalidParam, "请求的名称/命名空间与YAML不一致") + return base.NewBusinessError(constants.ErrInvalidParam, "请求的名称/命名空间与YAML不一致") } if err := k8sutils.ValidatePVC(desired); err != nil { s.logger.Error("PVC配置验证失败", zap.Error(err)) - return pkg.NewBusinessError(constants.ErrInvalidParam, "PVC配置验证失败") + return base.NewBusinessError(constants.ErrInvalidParam, "PVC配置验证失败") } if err := s.pvcManager.UpdatePVC(ctx, req.ClusterID, req.Namespace, desired); err != nil { s.logger.Error("更新PVC失败", zap.Error(err), zap.Int("clusterID", req.ClusterID), zap.String("namespace", req.Namespace), zap.String("name", req.Name)) - return pkg.NewBusinessError(constants.ErrK8sResourceUpdate, "更新PVC失败") + return base.NewBusinessError(constants.ErrK8sResourceUpdate, "更新PVC失败") } return nil } @@ -582,21 +582,21 @@ func (s *pvcService) UpdatePVCByYaml(ctx context.Context, req *model.UpdatePVCBy // ExpandPVC 扩容PVC func (s *pvcService) ExpandPVC(ctx context.Context, req *model.ExpandPVCReq) error { if req == nil { - return pkg.NewBusinessError(constants.ErrInvalidParam, "扩容PVC请求不能为空") + return base.NewBusinessError(constants.ErrInvalidParam, "扩容PVC请求不能为空") } if req.ClusterID <= 0 { - return pkg.NewBusinessError(constants.ErrInvalidParam, "集群ID不能为空") + return base.NewBusinessError(constants.ErrInvalidParam, "集群ID不能为空") } if req.Namespace == "" || req.Name == "" { - return pkg.NewBusinessError(constants.ErrInvalidParam, "命名空间和PVC名称不能为空") + return base.NewBusinessError(constants.ErrInvalidParam, "命名空间和PVC名称不能为空") } if req.NewCapacity == "" { - return pkg.NewBusinessError(constants.ErrInvalidParam, "新容量不能为空") + return base.NewBusinessError(constants.ErrInvalidParam, "新容量不能为空") } if err := s.pvcManager.ExpandPVC(ctx, req.ClusterID, req.Namespace, req.Name, req.NewCapacity); err != nil { s.logger.Error("扩容PVC失败", zap.Error(err), zap.Int("clusterID", req.ClusterID), zap.String("namespace", req.Namespace), zap.String("name", req.Name)) - return pkg.NewBusinessError(constants.ErrK8sResourceUpdate, err.Error()) + return base.NewBusinessError(constants.ErrK8sResourceUpdate, err.Error()) } s.logger.Info("成功扩容PVC", zap.Int("clusterID", req.ClusterID), zap.String("namespace", req.Namespace), zap.String("name", req.Name), zap.String("newCapacity", req.NewCapacity)) @@ -605,13 +605,13 @@ func (s *pvcService) ExpandPVC(ctx context.Context, req *model.ExpandPVCReq) err func (s *pvcService) GetPVCPods(ctx context.Context, req *model.GetPVCPodsReq) (model.ListResp[*model.K8sPod], error) { if req == nil { - return model.ListResp[*model.K8sPod]{}, pkg.NewBusinessError(constants.ErrInvalidParam, "获取PVC Pods请求不能为空") + return model.ListResp[*model.K8sPod]{}, base.NewBusinessError(constants.ErrInvalidParam, "获取PVC Pods请求不能为空") } if req.ClusterID <= 0 { - return model.ListResp[*model.K8sPod]{}, pkg.NewBusinessError(constants.ErrInvalidParam, "集群ID不能为空") + return model.ListResp[*model.K8sPod]{}, base.NewBusinessError(constants.ErrInvalidParam, "集群ID不能为空") } if req.Namespace == "" || req.Name == "" { - return model.ListResp[*model.K8sPod]{}, pkg.NewBusinessError(constants.ErrInvalidParam, "命名空间和PVC名称不能为空") + return model.ListResp[*model.K8sPod]{}, base.NewBusinessError(constants.ErrInvalidParam, "命名空间和PVC名称不能为空") } // 通过 Manager 层获取使用该 PVC 的所有 Pod @@ -622,7 +622,7 @@ func (s *pvcService) GetPVCPods(ctx context.Context, req *model.GetPVCPodsReq) ( zap.Int("clusterID", req.ClusterID), zap.String("namespace", req.Namespace), zap.String("pvcName", req.Name)) - return model.ListResp[*model.K8sPod]{}, pkg.NewBusinessError(constants.ErrK8sResourceList, "获取PVC关联的Pod失败") + return model.ListResp[*model.K8sPod]{}, base.NewBusinessError(constants.ErrK8sResourceList, "获取PVC关联的Pod失败") } // 转换为 model.K8sPod diff --git a/internal/k8s/service/role_service.go b/internal/k8s/service/role_service.go index 610c37d2..881e1d67 100644 --- a/internal/k8s/service/role_service.go +++ b/internal/k8s/service/role_service.go @@ -47,7 +47,6 @@ type RoleService interface { UpdateRole(ctx context.Context, req *model.UpdateRoleReq) error DeleteRole(ctx context.Context, req *model.DeleteRoleReq) error CreateRoleByYaml(ctx context.Context, req *model.CreateRoleByYamlReq) error - GetRoleYaml(ctx context.Context, req *model.GetRoleYamlReq) (*model.K8sYaml, error) UpdateRoleYaml(ctx context.Context, req *model.UpdateRoleByYamlReq) error } diff --git a/internal/k8s/utils/ingress.go b/internal/k8s/utils/ingress.go index 9a561326..b4ca6d67 100644 --- a/internal/k8s/utils/ingress.go +++ b/internal/k8s/utils/ingress.go @@ -31,7 +31,7 @@ import ( "time" "github.com/GoSimplicity/AI-CloudOps/internal/model" - pkg "github.com/GoSimplicity/AI-CloudOps/pkg/utils" + "github.com/GoSimplicity/AI-CloudOps/pkg/base" networkingv1 "k8s.io/api/networking/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "sigs.k8s.io/yaml" @@ -49,7 +49,7 @@ func ConvertToK8sIngress(ingress *networkingv1.Ingress, clusterID int) *model.K8 } } - age := pkg.GetAge(ingress.CreationTimestamp.Time) + age := base.GetAge(ingress.CreationTimestamp.Time) status := IngressStatus(ingress) rules := make([]model.IngressRule, 0, len(ingress.Spec.Rules)) diff --git a/internal/k8s/utils/serviceaccount.go b/internal/k8s/utils/serviceaccount.go index 81fbc856..b6420234 100644 --- a/internal/k8s/utils/serviceaccount.go +++ b/internal/k8s/utils/serviceaccount.go @@ -30,6 +30,7 @@ import ( "fmt" "time" + "github.com/GoSimplicity/AI-CloudOps/pkg/base" corev1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "sigs.k8s.io/yaml" @@ -38,7 +39,6 @@ import ( "k8s.io/client-go/kubernetes" "github.com/GoSimplicity/AI-CloudOps/internal/model" - "github.com/GoSimplicity/AI-CloudOps/pkg/utils" ) func BuildServiceAccountResponse(sa *corev1.ServiceAccount, clusterID int) *model.K8sServiceAccount { @@ -54,7 +54,7 @@ func BuildServiceAccountResponse(sa *corev1.ServiceAccount, clusterID int) *mode Labels: sa.Labels, Annotations: sa.Annotations, CreatedAt: sa.CreationTimestamp.Time.Format(time.RFC3339), - Age: utils.GetAge(sa.CreationTimestamp.Time), + Age: base.GetAge(sa.CreationTimestamp.Time), AutomountServiceAccountToken: sa.AutomountServiceAccountToken, ResourceVersion: sa.ResourceVersion, RawServiceAccount: sa, diff --git a/internal/middleware/audit.go b/internal/middleware/audit.go index 62c64802..926ea127 100644 --- a/internal/middleware/audit.go +++ b/internal/middleware/audit.go @@ -37,7 +37,7 @@ import ( "github.com/GoSimplicity/AI-CloudOps/internal/model" "github.com/GoSimplicity/AI-CloudOps/internal/system/service" - "github.com/GoSimplicity/AI-CloudOps/pkg/utils" + "github.com/GoSimplicity/AI-CloudOps/pkg/jwt" "github.com/gin-gonic/gin" "go.uber.org/zap" "gorm.io/datatypes" @@ -159,7 +159,7 @@ func (m *AuditLogMiddleware) AuditLog() gin.HandlerFunc { // 获取用户ID var userID int - if user, exists := c.MustGet("user").(utils.UserClaims); exists { + if user, exists := c.MustGet("user").(jwt.UserClaims); exists { userID = int(user.Uid) } diff --git a/internal/middleware/auth.go b/internal/middleware/auth.go index dc2846aa..6758b563 100644 --- a/internal/middleware/auth.go +++ b/internal/middleware/auth.go @@ -29,7 +29,8 @@ import ( "strings" "github.com/GoSimplicity/AI-CloudOps/internal/system/service" - "github.com/GoSimplicity/AI-CloudOps/pkg/utils" + "github.com/GoSimplicity/AI-CloudOps/pkg/base" + "github.com/GoSimplicity/AI-CloudOps/pkg/jwt" "github.com/gin-gonic/gin" ) @@ -131,12 +132,6 @@ func (am *AuthMiddleware) CheckAuth() gin.HandlerFunc { return } - // 跳过swagger文档 - if strings.HasPrefix(path, "/swagger/") { - c.Next() - return - } - // 跳过静态资源和WebSocket路径 if path == "/" || hasPrefix(path, skipPrefixes) || strings.Contains(path, "/exec") { c.Next() @@ -151,13 +146,13 @@ func (am *AuthMiddleware) CheckAuth() gin.HandlerFunc { c.Next() return } - utils.ForbiddenError(c, "未登录或登录已过期") + base.ForbiddenError(c, "未登录或登录已过期") c.Abort() return } - user, ok := userVal.(utils.UserClaims) + user, ok := userVal.(jwt.UserClaims) if !ok { - utils.ForbiddenError(c, "用户信息异常") + base.ForbiddenError(c, "用户信息异常") c.Abort() return } @@ -178,7 +173,7 @@ func (am *AuthMiddleware) CheckAuth() gin.HandlerFunc { method := c.Request.Method methodCode, exists := methodMapping[method] if !exists { - utils.ErrorWithMessage(c, "不支持的HTTP方法") + base.ErrorWithMessage(c, "不支持的HTTP方法") c.Abort() return } @@ -186,7 +181,7 @@ func (am *AuthMiddleware) CheckAuth() gin.HandlerFunc { // 获取用户角色 roles, err := am.roleService.GetUserRoles(c, user.Uid) if err != nil { - utils.ErrorWithMessage(c, "获取用户角色失败") + base.ErrorWithMessage(c, "获取用户角色失败") c.Abort() return } @@ -208,7 +203,7 @@ func (am *AuthMiddleware) CheckAuth() gin.HandlerFunc { } // 无权限访问 - utils.ForbiddenError(c, "无权限访问该接口") + base.ForbiddenError(c, "无权限访问该接口") c.Abort() } } diff --git a/internal/middleware/login.go b/internal/middleware/login.go index 922246ba..3f365c5f 100644 --- a/internal/middleware/login.go +++ b/internal/middleware/login.go @@ -28,8 +28,7 @@ package middleware import ( "strings" - ijwt "github.com/GoSimplicity/AI-CloudOps/pkg/utils" - + ijwt "github.com/GoSimplicity/AI-CloudOps/pkg/jwt" "github.com/gin-gonic/gin" "github.com/golang-jwt/jwt/v5" _ "github.com/golang-jwt/jwt/v5" @@ -57,7 +56,6 @@ func (m *JWTMiddleware) CheckLogin() gin.HandlerFunc { path == "/api/user/signup" || path == "/api/not_auth/getBindIps" || path == "/api/not_auth/getTreeNodeBindIps" || strings.HasPrefix(path, "/api/monitor/prometheus_configs/") || - strings.HasPrefix(path, "/swagger/") || path == "/favicon.ico" || path == "/" { ctx.Next() diff --git a/internal/model/system_user.go b/internal/model/system_user.go index 467f5941..0e46edc7 100644 --- a/internal/model/system_user.go +++ b/internal/model/system_user.go @@ -76,11 +76,11 @@ type UserSignUpReq struct { // TokenRequest 刷新令牌请求 type TokenRequest struct { - RefreshToken string `json:"refreshToken" binding:"required"` // 刷新令牌 - UserID int `json:"user_id" binding:"required"` // 用户ID - Username string `json:"username" binding:"required"` // 用户名 - Ssid string `json:"ssid" binding:"required"` // 会话ID - AccountType int8 `json:"account_type" binding:"required,oneof=1 2"` // 账号类型 1普通用户 2服务账号 + RefreshToken string `json:"refreshToken" binding:"required"` // 刷新令牌 + UserID int `json:"-"` // 服务器侧注入 + Username string `json:"-"` // 服务器侧注入 + Ssid string `json:"-"` // 服务器侧注入 + AccountType int8 `json:"-"` // 服务器侧注入 } // ProfileReq 获取用户信息请求 @@ -105,13 +105,12 @@ type ChangePasswordReq struct { // GetUserListReq 获取用户列表请求 type GetUserListReq struct { ListReq - Enable int8 `json:"enable" form:"enable" default:"1"` // 用户状态 1正常 2冻结 - AccountType int8 `json:"account_type" form:"account_type" default:"1"` // 账号类型 1普通用户 2服务账号 + Enable *int8 `json:"enable" form:"enable" binding:"omitempty"` // 用户状态 1正常 2冻结 + AccountType *int8 `json:"account_type" form:"account_type" binding:"omitempty"` // 账号类型 1普通用户 2服务账号 } // WriteOffReq 注销账号请求 type WriteOffReq struct { - Username string `json:"username" binding:"required"` // 用户名 Password string `json:"password" binding:"required"` // 密码 } diff --git a/internal/not_auth/api/handler.go b/internal/not_auth/api/handler.go index 12ea8b80..a36e429f 100644 --- a/internal/not_auth/api/handler.go +++ b/internal/not_auth/api/handler.go @@ -31,7 +31,7 @@ import ( "strings" "github.com/GoSimplicity/AI-CloudOps/internal/not_auth/service" - "github.com/GoSimplicity/AI-CloudOps/pkg/utils" + "github.com/GoSimplicity/AI-CloudOps/pkg/base" "github.com/gin-gonic/gin" ) @@ -54,15 +54,15 @@ func (n *NotAuthHandler) RegisterRouters(server *gin.Engine) { // GetBindIps 获取绑定IP地址 func (n *NotAuthHandler) GetBindIps(ctx *gin.Context) { - port, err := utils.GetQueryParam[int](ctx, "port") + port, err := base.GetQueryParam[int](ctx, "port") if err != nil { - utils.ErrorWithMessage(ctx, "参数错误: "+err.Error()) + base.ErrorWithMessage(ctx, "参数错误: "+err.Error()) return } - idsStr, err := utils.GetQueryParam[string](ctx, "tree_node_ids") + idsStr, err := base.GetQueryParam[string](ctx, "tree_node_ids") if err != nil || idsStr == "" { - utils.ErrorWithMessage(ctx, "参数错误: 缺少tree_node_ids") + base.ErrorWithMessage(ctx, "参数错误: 缺少tree_node_ids") return } @@ -80,7 +80,7 @@ func (n *NotAuthHandler) GetBindIps(ctx *gin.Context) { res, err := n.svc.BuildPrometheusServiceDiscovery(ctx, port, ids) if err != nil { - utils.ErrorWithMessage(ctx, "服务器内部错误") + base.ErrorWithMessage(ctx, "服务器内部错误") return } diff --git a/internal/prometheus/api/alert_event.go b/internal/prometheus/api/alert_event.go index 505143ce..46509de3 100644 --- a/internal/prometheus/api/alert_event.go +++ b/internal/prometheus/api/alert_event.go @@ -26,10 +26,10 @@ package api import ( - "github.com/GoSimplicity/AI-CloudOps/pkg/utils" - "github.com/GoSimplicity/AI-CloudOps/internal/model" alertEventService "github.com/GoSimplicity/AI-CloudOps/internal/prometheus/service/alert" + "github.com/GoSimplicity/AI-CloudOps/pkg/base" + "github.com/GoSimplicity/AI-CloudOps/pkg/jwt" "github.com/gin-gonic/gin" ) @@ -57,7 +57,7 @@ func (h *AlertEventHandler) RegisterRouters(server *gin.Engine) { func (h *AlertEventHandler) GetMonitorAlertEventList(ctx *gin.Context) { var req model.GetMonitorAlertEventListReq - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return h.svc.GetMonitorAlertEventList(ctx, &req) }) } @@ -66,17 +66,17 @@ func (h *AlertEventHandler) GetMonitorAlertEventList(ctx *gin.Context) { func (h *AlertEventHandler) EventAlertSilence(ctx *gin.Context) { var req model.EventAlertSilenceReq - uc := ctx.MustGet("user").(utils.UserClaims) - id, err := utils.GetParamID(ctx) + uc := ctx.MustGet("user").(jwt.UserClaims) + id, err := base.GetParamID(ctx) if err != nil { - utils.ErrorWithMessage(ctx, "参数错误") + base.ErrorWithMessage(ctx, "参数错误") return } req.ID = id req.UserID = uc.Uid - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return nil, h.svc.EventAlertSilence(ctx, &req) }) } @@ -85,17 +85,17 @@ func (h *AlertEventHandler) EventAlertSilence(ctx *gin.Context) { func (h *AlertEventHandler) EventAlertClaim(ctx *gin.Context) { var req model.EventAlertClaimReq - uc := ctx.MustGet("user").(utils.UserClaims) - id, err := utils.GetParamID(ctx) + uc := ctx.MustGet("user").(jwt.UserClaims) + id, err := base.GetParamID(ctx) if err != nil { - utils.ErrorWithMessage(ctx, "参数错误") + base.ErrorWithMessage(ctx, "参数错误") return } req.ID = id req.UserID = uc.Uid - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return nil, h.svc.EventAlertClaim(ctx, &req) }) } @@ -104,17 +104,17 @@ func (h *AlertEventHandler) EventAlertClaim(ctx *gin.Context) { func (h *AlertEventHandler) EventAlertUnSilence(ctx *gin.Context) { var req model.EventAlertUnSilenceReq - uc := ctx.MustGet("user").(utils.UserClaims) - id, err := utils.GetParamID(ctx) + uc := ctx.MustGet("user").(jwt.UserClaims) + id, err := base.GetParamID(ctx) if err != nil { - utils.ErrorWithMessage(ctx, "参数错误") + base.ErrorWithMessage(ctx, "参数错误") return } req.ID = id req.UserID = uc.Uid - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return nil, h.svc.EventAlertUnSilence(ctx, &req) }) } diff --git a/internal/prometheus/api/alert_pool.go b/internal/prometheus/api/alert_pool.go index 8d5c865c..05802379 100644 --- a/internal/prometheus/api/alert_pool.go +++ b/internal/prometheus/api/alert_pool.go @@ -28,7 +28,8 @@ package api import ( "github.com/GoSimplicity/AI-CloudOps/internal/model" alertEventService "github.com/GoSimplicity/AI-CloudOps/internal/prometheus/service/alert" - "github.com/GoSimplicity/AI-CloudOps/pkg/utils" + "github.com/GoSimplicity/AI-CloudOps/pkg/base" + "github.com/GoSimplicity/AI-CloudOps/pkg/jwt" "github.com/gin-gonic/gin" ) @@ -57,7 +58,7 @@ func (h *AlertPoolHandler) RegisterRouters(server *gin.Engine) { func (h *AlertPoolHandler) GetMonitorAlertManagerPoolList(ctx *gin.Context) { var req model.GetMonitorAlertManagerPoolListReq - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return h.svc.GetMonitorAlertManagerPoolList(ctx, &req) }) } @@ -66,11 +67,11 @@ func (h *AlertPoolHandler) GetMonitorAlertManagerPoolList(ctx *gin.Context) { func (h *AlertPoolHandler) CreateMonitorAlertManagerPool(ctx *gin.Context) { var req model.CreateMonitorAlertManagerPoolReq - uc := ctx.MustGet("user").(utils.UserClaims) + uc := ctx.MustGet("user").(jwt.UserClaims) req.UserID = uc.Uid req.CreateUserName = uc.Username - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return nil, h.svc.CreateMonitorAlertManagerPool(ctx, &req) }) } @@ -79,7 +80,7 @@ func (h *AlertPoolHandler) CreateMonitorAlertManagerPool(ctx *gin.Context) { func (h *AlertPoolHandler) UpdateMonitorAlertManagerPool(ctx *gin.Context) { var req model.UpdateMonitorAlertManagerPoolReq - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return nil, h.svc.UpdateMonitorAlertManagerPool(ctx, &req) }) } @@ -88,15 +89,15 @@ func (h *AlertPoolHandler) UpdateMonitorAlertManagerPool(ctx *gin.Context) { func (h *AlertPoolHandler) DeleteMonitorAlertManagerPool(ctx *gin.Context) { var req model.DeleteMonitorAlertManagerPoolReq - id, err := utils.GetParamID(ctx) + id, err := base.GetParamID(ctx) if err != nil { - utils.ErrorWithMessage(ctx, err.Error()) + base.ErrorWithMessage(ctx, err.Error()) return } req.ID = id - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return nil, h.svc.DeleteMonitorAlertManagerPool(ctx, &req) }) } @@ -105,15 +106,15 @@ func (h *AlertPoolHandler) DeleteMonitorAlertManagerPool(ctx *gin.Context) { func (h *AlertPoolHandler) GetMonitorAlertManagerPool(ctx *gin.Context) { var req model.GetMonitorAlertManagerPoolReq - id, err := utils.GetParamID(ctx) + id, err := base.GetParamID(ctx) if err != nil { - utils.ErrorWithMessage(ctx, err.Error()) + base.ErrorWithMessage(ctx, err.Error()) return } req.ID = id - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return h.svc.GetMonitorAlertManagerPool(ctx, &req) }) } diff --git a/internal/prometheus/api/alert_rule.go b/internal/prometheus/api/alert_rule.go index 43f3a23b..9836493a 100644 --- a/internal/prometheus/api/alert_rule.go +++ b/internal/prometheus/api/alert_rule.go @@ -28,8 +28,8 @@ package api import ( "github.com/GoSimplicity/AI-CloudOps/internal/model" alertService "github.com/GoSimplicity/AI-CloudOps/internal/prometheus/service/alert" - "github.com/GoSimplicity/AI-CloudOps/pkg/utils" - ijwt "github.com/GoSimplicity/AI-CloudOps/pkg/utils" + "github.com/GoSimplicity/AI-CloudOps/pkg/base" + ijwt "github.com/GoSimplicity/AI-CloudOps/pkg/jwt" "github.com/gin-gonic/gin" ) @@ -63,7 +63,7 @@ func (h *AlertRuleHandler) CreateMonitorAlertRule(ctx *gin.Context) { req.UserID = uc.Uid req.CreateUserName = uc.Username - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return nil, h.svc.CreateMonitorAlertRule(ctx, &req) }) } @@ -72,15 +72,15 @@ func (h *AlertRuleHandler) CreateMonitorAlertRule(ctx *gin.Context) { func (h *AlertRuleHandler) UpdateMonitorAlertRule(ctx *gin.Context) { var req model.UpdateMonitorAlertRuleReq - id, err := utils.GetParamID(ctx) + id, err := base.GetParamID(ctx) if err != nil { - utils.ErrorWithMessage(ctx, err.Error()) + base.ErrorWithMessage(ctx, err.Error()) return } req.ID = id - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return nil, h.svc.UpdateMonitorAlertRule(ctx, &req) }) } @@ -89,15 +89,15 @@ func (h *AlertRuleHandler) UpdateMonitorAlertRule(ctx *gin.Context) { func (h *AlertRuleHandler) DeleteMonitorAlertRule(ctx *gin.Context) { var req model.DeleteMonitorAlertRuleReq - id, err := utils.GetParamID(ctx) + id, err := base.GetParamID(ctx) if err != nil { - utils.ErrorWithMessage(ctx, err.Error()) + base.ErrorWithMessage(ctx, err.Error()) return } req.ID = id - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return nil, h.svc.DeleteMonitorAlertRule(ctx, &req) }) } @@ -106,7 +106,7 @@ func (h *AlertRuleHandler) DeleteMonitorAlertRule(ctx *gin.Context) { func (h *AlertRuleHandler) GetMonitorAlertRuleList(ctx *gin.Context) { var req model.GetMonitorAlertRuleListReq - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return h.svc.GetMonitorAlertRuleList(ctx, &req) }) } @@ -115,7 +115,7 @@ func (h *AlertRuleHandler) GetMonitorAlertRuleList(ctx *gin.Context) { func (h *AlertRuleHandler) PromqlExprCheck(ctx *gin.Context) { var promql model.PromqlAlertRuleExprCheckReq - utils.HandleRequest(ctx, &promql, func() (interface{}, error) { + base.HandleRequest(ctx, &promql, func() (interface{}, error) { return h.svc.PromqlExprCheck(ctx, &promql) }) } @@ -124,15 +124,15 @@ func (h *AlertRuleHandler) PromqlExprCheck(ctx *gin.Context) { func (h *AlertRuleHandler) GetMonitorAlertRule(ctx *gin.Context) { var req model.GetMonitorAlertRuleReq - id, err := utils.GetParamID(ctx) + id, err := base.GetParamID(ctx) if err != nil { - utils.ErrorWithMessage(ctx, err.Error()) + base.ErrorWithMessage(ctx, err.Error()) return } req.ID = id - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return h.svc.GetMonitorAlertRule(ctx, &req) }) } diff --git a/internal/prometheus/api/config.go b/internal/prometheus/api/config.go index fdbc38ce..5693ed30 100644 --- a/internal/prometheus/api/config.go +++ b/internal/prometheus/api/config.go @@ -26,11 +26,11 @@ package api import ( + "github.com/GoSimplicity/AI-CloudOps/pkg/base" "github.com/gin-gonic/gin" "github.com/GoSimplicity/AI-CloudOps/internal/model" configService "github.com/GoSimplicity/AI-CloudOps/internal/prometheus/service/config" - "github.com/GoSimplicity/AI-CloudOps/pkg/utils" ) type MonitorConfigHandler struct { @@ -58,7 +58,7 @@ func (h *MonitorConfigHandler) RegisterRouters(server *gin.Engine) { func (h *MonitorConfigHandler) GetMonitorConfigList(ctx *gin.Context) { var req model.GetMonitorConfigListReq - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return h.svc.GetMonitorConfigList(ctx, &req) }) } @@ -67,15 +67,15 @@ func (h *MonitorConfigHandler) GetMonitorConfigList(ctx *gin.Context) { func (h *MonitorConfigHandler) GetMonitorConfig(ctx *gin.Context) { var req model.GetMonitorConfigReq - id, err := utils.GetParamID(ctx) + id, err := base.GetParamID(ctx) if err != nil { - utils.ErrorWithMessage(ctx, err.Error()) + base.ErrorWithMessage(ctx, err.Error()) return } req.ID = id - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return h.svc.GetMonitorConfigByID(ctx, &req) }) } @@ -84,7 +84,7 @@ func (h *MonitorConfigHandler) GetMonitorConfig(ctx *gin.Context) { func (h *MonitorConfigHandler) CreateMonitorConfig(ctx *gin.Context) { var req model.CreateMonitorConfigReq - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return nil, h.svc.CreateMonitorConfig(ctx, &req) }) } @@ -93,15 +93,15 @@ func (h *MonitorConfigHandler) CreateMonitorConfig(ctx *gin.Context) { func (h *MonitorConfigHandler) UpdateMonitorConfig(ctx *gin.Context) { var req model.UpdateMonitorConfigReq - id, err := utils.GetParamID(ctx) + id, err := base.GetParamID(ctx) if err != nil { - utils.ErrorWithMessage(ctx, err.Error()) + base.ErrorWithMessage(ctx, err.Error()) return } req.ID = id - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return nil, h.svc.UpdateMonitorConfig(ctx, &req) }) } @@ -110,15 +110,15 @@ func (h *MonitorConfigHandler) UpdateMonitorConfig(ctx *gin.Context) { func (h *MonitorConfigHandler) DeleteMonitorConfig(ctx *gin.Context) { var req model.DeleteMonitorConfigReq - id, err := utils.GetParamID(ctx) + id, err := base.GetParamID(ctx) if err != nil { - utils.ErrorWithMessage(ctx, err.Error()) + base.ErrorWithMessage(ctx, err.Error()) return } req.ID = id - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return nil, h.svc.DeleteMonitorConfig(ctx, &req) }) } diff --git a/internal/prometheus/api/onduty_group.go b/internal/prometheus/api/onduty_group.go index b6549339..3a071448 100644 --- a/internal/prometheus/api/onduty_group.go +++ b/internal/prometheus/api/onduty_group.go @@ -28,7 +28,8 @@ package api import ( "github.com/GoSimplicity/AI-CloudOps/internal/model" "github.com/GoSimplicity/AI-CloudOps/internal/prometheus/service/alert" - "github.com/GoSimplicity/AI-CloudOps/pkg/utils" + "github.com/GoSimplicity/AI-CloudOps/pkg/base" + "github.com/GoSimplicity/AI-CloudOps/pkg/jwt" "github.com/gin-gonic/gin" ) @@ -61,7 +62,7 @@ func (h *OnDutyGroupHandler) RegisterRouters(server *gin.Engine) { func (h *OnDutyGroupHandler) GetMonitorOnDutyGroupList(ctx *gin.Context) { var req model.GetMonitorOnDutyGroupListReq - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return h.alertOnDutyService.GetMonitorOnDutyGroupList(ctx, &req) }) } @@ -70,11 +71,11 @@ func (h *OnDutyGroupHandler) GetMonitorOnDutyGroupList(ctx *gin.Context) { func (h *OnDutyGroupHandler) CreateMonitorOnDutyGroup(ctx *gin.Context) { var req model.CreateMonitorOnDutyGroupReq - uc := ctx.MustGet("user").(utils.UserClaims) + uc := ctx.MustGet("user").(jwt.UserClaims) req.UserID = uc.Uid req.CreateUserName = uc.Username - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return nil, h.alertOnDutyService.CreateMonitorOnDutyGroup(ctx, &req) }) } @@ -83,11 +84,11 @@ func (h *OnDutyGroupHandler) CreateMonitorOnDutyGroup(ctx *gin.Context) { func (h *OnDutyGroupHandler) CreateMonitorOnDutyGroupChange(ctx *gin.Context) { var req model.CreateMonitorOnDutyGroupChangeReq - uc := ctx.MustGet("user").(utils.UserClaims) + uc := ctx.MustGet("user").(jwt.UserClaims) req.UserID = uc.Uid req.CreateUserName = uc.Username - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return nil, h.alertOnDutyService.CreateMonitorOnDutyGroupChange(ctx, &req) }) } @@ -96,15 +97,15 @@ func (h *OnDutyGroupHandler) CreateMonitorOnDutyGroupChange(ctx *gin.Context) { func (h *OnDutyGroupHandler) UpdateMonitorOnDutyGroup(ctx *gin.Context) { var req model.UpdateMonitorOnDutyGroupReq - id, err := utils.GetParamID(ctx) + id, err := base.GetParamID(ctx) if err != nil { - utils.ErrorWithMessage(ctx, err.Error()) + base.ErrorWithMessage(ctx, err.Error()) return } req.ID = id - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return nil, h.alertOnDutyService.UpdateMonitorOnDutyGroup(ctx, &req) }) } @@ -113,15 +114,15 @@ func (h *OnDutyGroupHandler) UpdateMonitorOnDutyGroup(ctx *gin.Context) { func (h *OnDutyGroupHandler) DeleteMonitorOnDutyGroup(ctx *gin.Context) { var req model.DeleteMonitorOnDutyGroupReq - id, err := utils.GetParamID(ctx) + id, err := base.GetParamID(ctx) if err != nil { - utils.ErrorWithMessage(ctx, err.Error()) + base.ErrorWithMessage(ctx, err.Error()) return } req.ID = id - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return nil, h.alertOnDutyService.DeleteMonitorOnDutyGroup(ctx, &req) }) } @@ -130,15 +131,15 @@ func (h *OnDutyGroupHandler) DeleteMonitorOnDutyGroup(ctx *gin.Context) { func (h *OnDutyGroupHandler) GetMonitorOnDutyGroup(ctx *gin.Context) { var req model.GetMonitorOnDutyGroupReq - id, err := utils.GetParamID(ctx) + id, err := base.GetParamID(ctx) if err != nil { - utils.ErrorWithMessage(ctx, err.Error()) + base.ErrorWithMessage(ctx, err.Error()) return } req.ID = id - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return h.alertOnDutyService.GetMonitorOnDutyGroup(ctx, &req) }) } @@ -147,15 +148,15 @@ func (h *OnDutyGroupHandler) GetMonitorOnDutyGroup(ctx *gin.Context) { func (h *OnDutyGroupHandler) GetMonitorOnDutyGroupFuturePlan(ctx *gin.Context) { var req model.GetMonitorOnDutyGroupFuturePlanReq - id, err := utils.GetParamID(ctx) + id, err := base.GetParamID(ctx) if err != nil { - utils.ErrorWithMessage(ctx, err.Error()) + base.ErrorWithMessage(ctx, err.Error()) return } req.ID = id - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return h.alertOnDutyService.GetMonitorOnDutyGroupFuturePlan(ctx, &req) }) } @@ -164,15 +165,15 @@ func (h *OnDutyGroupHandler) GetMonitorOnDutyGroupFuturePlan(ctx *gin.Context) { func (h *OnDutyGroupHandler) GetMonitorOnDutyHistory(ctx *gin.Context) { var req model.GetMonitorOnDutyHistoryReq - id, err := utils.GetParamID(ctx) + id, err := base.GetParamID(ctx) if err != nil { - utils.ErrorWithMessage(ctx, err.Error()) + base.ErrorWithMessage(ctx, err.Error()) return } req.OnDutyGroupID = id - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return h.alertOnDutyService.GetMonitorOnDutyHistory(ctx, &req) }) } @@ -181,15 +182,15 @@ func (h *OnDutyGroupHandler) GetMonitorOnDutyHistory(ctx *gin.Context) { func (h *OnDutyGroupHandler) GetMonitorOnDutyGroupChangeList(ctx *gin.Context) { var req model.GetMonitorOnDutyGroupChangeListReq - id, err := utils.GetParamID(ctx) + id, err := base.GetParamID(ctx) if err != nil { - utils.ErrorWithMessage(ctx, err.Error()) + base.ErrorWithMessage(ctx, err.Error()) return } req.OnDutyGroupID = id - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return h.alertOnDutyService.GetMonitorOnDutyGroupChangeList(ctx, &req) }) } diff --git a/internal/prometheus/api/record_rule.go b/internal/prometheus/api/record_rule.go index b20b6ad0..d161ea9b 100644 --- a/internal/prometheus/api/record_rule.go +++ b/internal/prometheus/api/record_rule.go @@ -26,11 +26,10 @@ package api import ( - ijwt "github.com/GoSimplicity/AI-CloudOps/pkg/utils" - "github.com/GoSimplicity/AI-CloudOps/internal/model" alertEventService "github.com/GoSimplicity/AI-CloudOps/internal/prometheus/service/alert" - "github.com/GoSimplicity/AI-CloudOps/pkg/utils" + "github.com/GoSimplicity/AI-CloudOps/pkg/base" + "github.com/GoSimplicity/AI-CloudOps/pkg/jwt" "github.com/gin-gonic/gin" ) @@ -59,7 +58,7 @@ func (h *RecordRuleHandler) RegisterRouters(server *gin.Engine) { func (h *RecordRuleHandler) GetMonitorRecordRuleList(ctx *gin.Context) { var req model.GetMonitorRecordRuleListReq - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return h.alertRecordService.GetMonitorRecordRuleList(ctx, &req) }) } @@ -68,11 +67,11 @@ func (h *RecordRuleHandler) GetMonitorRecordRuleList(ctx *gin.Context) { func (h *RecordRuleHandler) CreateMonitorRecordRule(ctx *gin.Context) { var req model.CreateMonitorRecordRuleReq - uc := ctx.MustGet("user").(ijwt.UserClaims) + uc := ctx.MustGet("user").(jwt.UserClaims) req.UserID = uc.Uid req.CreateUserName = uc.Username - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return nil, h.alertRecordService.CreateMonitorRecordRule(ctx, &req) }) } @@ -81,15 +80,15 @@ func (h *RecordRuleHandler) CreateMonitorRecordRule(ctx *gin.Context) { func (h *RecordRuleHandler) UpdateMonitorRecordRule(ctx *gin.Context) { var req model.UpdateMonitorRecordRuleReq - id, err := utils.GetParamID(ctx) + id, err := base.GetParamID(ctx) if err != nil { - utils.ErrorWithMessage(ctx, "参数错误") + base.ErrorWithMessage(ctx, "参数错误") return } req.ID = id - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return nil, h.alertRecordService.UpdateMonitorRecordRule(ctx, &req) }) } @@ -98,15 +97,15 @@ func (h *RecordRuleHandler) UpdateMonitorRecordRule(ctx *gin.Context) { func (h *RecordRuleHandler) DeleteMonitorRecordRule(ctx *gin.Context) { var req model.DeleteMonitorRecordRuleReq - id, err := utils.GetParamID(ctx) + id, err := base.GetParamID(ctx) if err != nil { - utils.ErrorWithMessage(ctx, "参数错误") + base.ErrorWithMessage(ctx, "参数错误") return } req.ID = id - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return nil, h.alertRecordService.DeleteMonitorRecordRule(ctx, &req) }) } @@ -115,15 +114,15 @@ func (h *RecordRuleHandler) DeleteMonitorRecordRule(ctx *gin.Context) { func (h *RecordRuleHandler) GetMonitorRecordRule(ctx *gin.Context) { var req model.GetMonitorRecordRuleReq - id, err := utils.GetParamID(ctx) + id, err := base.GetParamID(ctx) if err != nil { - utils.ErrorWithMessage(ctx, "参数错误") + base.ErrorWithMessage(ctx, "参数错误") return } req.ID = id - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return h.alertRecordService.GetMonitorRecordRule(ctx, &req) }) } diff --git a/internal/prometheus/api/scrape_job.go b/internal/prometheus/api/scrape_job.go index a2dc20bf..b63c6ff5 100644 --- a/internal/prometheus/api/scrape_job.go +++ b/internal/prometheus/api/scrape_job.go @@ -26,11 +26,10 @@ package api import ( - ijwt "github.com/GoSimplicity/AI-CloudOps/pkg/utils" - "github.com/GoSimplicity/AI-CloudOps/internal/model" scrapeJobService "github.com/GoSimplicity/AI-CloudOps/internal/prometheus/service/scrape" - "github.com/GoSimplicity/AI-CloudOps/pkg/utils" + "github.com/GoSimplicity/AI-CloudOps/pkg/base" + "github.com/GoSimplicity/AI-CloudOps/pkg/jwt" "github.com/gin-gonic/gin" ) @@ -59,7 +58,7 @@ func (h *ScrapeJobHandler) RegisterRouters(server *gin.Engine) { func (h *ScrapeJobHandler) GetMonitorScrapeJobList(ctx *gin.Context) { var req model.GetMonitorScrapeJobListReq - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return h.scrapeJobService.GetMonitorScrapeJobList(ctx, &req) }) } @@ -68,11 +67,11 @@ func (h *ScrapeJobHandler) GetMonitorScrapeJobList(ctx *gin.Context) { func (h *ScrapeJobHandler) CreateMonitorScrapeJob(ctx *gin.Context) { var req model.CreateMonitorScrapeJobReq - uc := ctx.MustGet("user").(ijwt.UserClaims) + uc := ctx.MustGet("user").(jwt.UserClaims) req.UserID = uc.Uid req.CreateUserName = uc.Username - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return nil, h.scrapeJobService.CreateMonitorScrapeJob(ctx, &req) }) } @@ -81,15 +80,15 @@ func (h *ScrapeJobHandler) CreateMonitorScrapeJob(ctx *gin.Context) { func (h *ScrapeJobHandler) UpdateMonitorScrapeJob(ctx *gin.Context) { var req model.UpdateMonitorScrapeJobReq - id, err := utils.GetParamID(ctx) + id, err := base.GetParamID(ctx) if err != nil { - utils.ErrorWithMessage(ctx, "参数错误") + base.ErrorWithMessage(ctx, "参数错误") return } req.ID = id - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return nil, h.scrapeJobService.UpdateMonitorScrapeJob(ctx, &req) }) } @@ -98,15 +97,15 @@ func (h *ScrapeJobHandler) UpdateMonitorScrapeJob(ctx *gin.Context) { func (h *ScrapeJobHandler) DeleteMonitorScrapeJob(ctx *gin.Context) { var req model.DeleteMonitorScrapeJobReq - id, err := utils.GetParamID(ctx) + id, err := base.GetParamID(ctx) if err != nil { - utils.ErrorWithMessage(ctx, "参数错误") + base.ErrorWithMessage(ctx, "参数错误") return } req.ID = id - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return nil, h.scrapeJobService.DeleteMonitorScrapeJob(ctx, req.ID) }) } @@ -115,15 +114,15 @@ func (h *ScrapeJobHandler) DeleteMonitorScrapeJob(ctx *gin.Context) { func (h *ScrapeJobHandler) GetMonitorScrapeJobDetail(ctx *gin.Context) { var req model.GetMonitorScrapeJobDetailReq - id, err := utils.GetParamID(ctx) + id, err := base.GetParamID(ctx) if err != nil { - utils.ErrorWithMessage(ctx, "参数错误") + base.ErrorWithMessage(ctx, "参数错误") return } req.ID = id - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return h.scrapeJobService.GetMonitorScrapeJobDetail(ctx, &req) }) } diff --git a/internal/prometheus/api/scrape_pool.go b/internal/prometheus/api/scrape_pool.go index 32d9cbf3..36e3722c 100644 --- a/internal/prometheus/api/scrape_pool.go +++ b/internal/prometheus/api/scrape_pool.go @@ -26,11 +26,10 @@ package api import ( - ijwt "github.com/GoSimplicity/AI-CloudOps/pkg/utils" - "github.com/GoSimplicity/AI-CloudOps/internal/model" scrapeJobService "github.com/GoSimplicity/AI-CloudOps/internal/prometheus/service/scrape" - "github.com/GoSimplicity/AI-CloudOps/pkg/utils" + "github.com/GoSimplicity/AI-CloudOps/pkg/base" + "github.com/GoSimplicity/AI-CloudOps/pkg/jwt" "github.com/gin-gonic/gin" "go.uber.org/zap" ) @@ -62,7 +61,7 @@ func (h *ScrapePoolHandler) RegisterRouters(server *gin.Engine) { func (h *ScrapePoolHandler) GetMonitorScrapePoolList(ctx *gin.Context) { var req model.GetMonitorScrapePoolListReq - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return h.scrapePoolService.GetMonitorScrapePoolList(ctx, &req) }) } @@ -71,11 +70,11 @@ func (h *ScrapePoolHandler) GetMonitorScrapePoolList(ctx *gin.Context) { func (h *ScrapePoolHandler) CreateMonitorScrapePool(ctx *gin.Context) { var req model.CreateMonitorScrapePoolReq - uc := ctx.MustGet("user").(ijwt.UserClaims) + uc := ctx.MustGet("user").(jwt.UserClaims) req.UserID = uc.Uid req.CreateUserName = uc.Username - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return nil, h.scrapePoolService.CreateMonitorScrapePool(ctx, &req) }) } @@ -84,14 +83,14 @@ func (h *ScrapePoolHandler) CreateMonitorScrapePool(ctx *gin.Context) { func (h *ScrapePoolHandler) UpdateMonitorScrapePool(ctx *gin.Context) { var req model.UpdateMonitorScrapePoolReq - id, err := utils.GetParamID(ctx) + id, err := base.GetParamID(ctx) if err != nil { - utils.ErrorWithMessage(ctx, "参数错误") + base.ErrorWithMessage(ctx, "参数错误") return } req.ID = id - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return nil, h.scrapePoolService.UpdateMonitorScrapePool(ctx, &req) }) } @@ -100,15 +99,15 @@ func (h *ScrapePoolHandler) UpdateMonitorScrapePool(ctx *gin.Context) { func (h *ScrapePoolHandler) DeleteMonitorScrapePool(ctx *gin.Context) { var req model.DeleteMonitorScrapePoolReq - id, err := utils.GetParamID(ctx) + id, err := base.GetParamID(ctx) if err != nil { - utils.ErrorWithMessage(ctx, "参数错误") + base.ErrorWithMessage(ctx, "参数错误") return } req.ID = id - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return nil, h.scrapePoolService.DeleteMonitorScrapePool(ctx, &req) }) } @@ -117,15 +116,15 @@ func (h *ScrapePoolHandler) DeleteMonitorScrapePool(ctx *gin.Context) { func (h *ScrapePoolHandler) GetMonitorScrapePoolDetail(ctx *gin.Context) { var req model.GetMonitorScrapePoolDetailReq - id, err := utils.GetParamID(ctx) + id, err := base.GetParamID(ctx) if err != nil { - utils.ErrorWithMessage(ctx, "参数错误") + base.ErrorWithMessage(ctx, "参数错误") return } req.ID = id - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return h.scrapePoolService.GetMonitorScrapePoolDetail(ctx, &req) }) } diff --git a/internal/prometheus/api/send_group.go b/internal/prometheus/api/send_group.go index d1ef9fa2..cc81b57a 100644 --- a/internal/prometheus/api/send_group.go +++ b/internal/prometheus/api/send_group.go @@ -26,11 +26,10 @@ package api import ( - ijwt "github.com/GoSimplicity/AI-CloudOps/pkg/utils" - "github.com/GoSimplicity/AI-CloudOps/internal/model" alertEventService "github.com/GoSimplicity/AI-CloudOps/internal/prometheus/service/alert" - "github.com/GoSimplicity/AI-CloudOps/pkg/utils" + "github.com/GoSimplicity/AI-CloudOps/pkg/base" + "github.com/GoSimplicity/AI-CloudOps/pkg/jwt" "github.com/gin-gonic/gin" ) @@ -59,7 +58,7 @@ func (h *SendGroupHandler) RegisterRouters(server *gin.Engine) { func (h *SendGroupHandler) GetMonitorSendGroupList(ctx *gin.Context) { var req model.GetMonitorSendGroupListReq - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return h.alertSendService.GetMonitorSendGroupList(ctx, &req) }) } @@ -68,11 +67,11 @@ func (h *SendGroupHandler) GetMonitorSendGroupList(ctx *gin.Context) { func (h *SendGroupHandler) CreateMonitorSendGroup(ctx *gin.Context) { var req model.CreateMonitorSendGroupReq - uc := ctx.MustGet("user").(ijwt.UserClaims) + uc := ctx.MustGet("user").(jwt.UserClaims) req.UserID = uc.Uid req.CreateUserName = uc.Username - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return nil, h.alertSendService.CreateMonitorSendGroup(ctx, &req) }) } @@ -81,15 +80,15 @@ func (h *SendGroupHandler) CreateMonitorSendGroup(ctx *gin.Context) { func (h *SendGroupHandler) UpdateMonitorSendGroup(ctx *gin.Context) { var req model.UpdateMonitorSendGroupReq - id, err := utils.GetParamID(ctx) + id, err := base.GetParamID(ctx) if err != nil { - utils.ErrorWithMessage(ctx, "参数错误") + base.ErrorWithMessage(ctx, "参数错误") return } req.ID = id - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return nil, h.alertSendService.UpdateMonitorSendGroup(ctx, &req) }) } @@ -98,15 +97,15 @@ func (h *SendGroupHandler) UpdateMonitorSendGroup(ctx *gin.Context) { func (h *SendGroupHandler) DeleteMonitorSendGroup(ctx *gin.Context) { var req model.DeleteMonitorSendGroupReq - id, err := utils.GetParamID(ctx) + id, err := base.GetParamID(ctx) if err != nil { - utils.ErrorWithMessage(ctx, "参数错误") + base.ErrorWithMessage(ctx, "参数错误") return } req.ID = id - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return nil, h.alertSendService.DeleteMonitorSendGroup(ctx, &req) }) } @@ -115,15 +114,15 @@ func (h *SendGroupHandler) DeleteMonitorSendGroup(ctx *gin.Context) { func (h *SendGroupHandler) GetMonitorSendGroup(ctx *gin.Context) { var req model.GetMonitorSendGroupReq - id, err := utils.GetParamID(ctx) + id, err := base.GetParamID(ctx) if err != nil { - utils.ErrorWithMessage(ctx, "参数错误") + base.ErrorWithMessage(ctx, "参数错误") return } req.ID = id - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return h.alertSendService.GetMonitorSendGroup(ctx, &req) }) } diff --git a/internal/prometheus/cache/alert_cache.go b/internal/prometheus/cache/alert_cache.go index 5a53de15..bf808d4e 100644 --- a/internal/prometheus/cache/alert_cache.go +++ b/internal/prometheus/cache/alert_cache.go @@ -35,7 +35,7 @@ import ( "github.com/GoSimplicity/AI-CloudOps/internal/model" alertPoolDao "github.com/GoSimplicity/AI-CloudOps/internal/prometheus/dao/alert" configDao "github.com/GoSimplicity/AI-CloudOps/internal/prometheus/dao/config" - "github.com/GoSimplicity/AI-CloudOps/pkg/utils" + "github.com/GoSimplicity/AI-CloudOps/internal/prometheus/utils" altconfig "github.com/prometheus/alertmanager/config" al "github.com/prometheus/alertmanager/pkg/labels" pm "github.com/prometheus/common/model" diff --git a/internal/prometheus/cache/prom_cache.go b/internal/prometheus/cache/prom_cache.go index bfde37c2..d88adebc 100644 --- a/internal/prometheus/cache/prom_cache.go +++ b/internal/prometheus/cache/prom_cache.go @@ -31,7 +31,7 @@ import ( "sync" "time" - "github.com/GoSimplicity/AI-CloudOps/pkg/utils" + "github.com/GoSimplicity/AI-CloudOps/internal/prometheus/utils" "gopkg.in/yaml.v3" "github.com/GoSimplicity/AI-CloudOps/internal/model" @@ -294,8 +294,8 @@ func (p *prometheusConfigCache) GenerateMainConfig(ctx context.Context) error { func (p *prometheusConfigCache) CreateBaseConfig(pool *model.MonitorScrapePool) (pc.Config, error) { var config pc.Config - if pool.ScrapeInterval <= 0 || pool.ScrapeTimeout <= 0 || pool.ScrapeTimeout > pool.ScrapeInterval { - return pc.Config{}, fmt.Errorf("采集间隔和采集超时时间不能小于等于0,且采集超时时间不能大于采集间隔") + if err := utils.ValidateScrapeTiming(pool.ScrapeInterval, pool.ScrapeTimeout); err != nil { + return pc.Config{}, err } config.GlobalConfig = pc.GlobalConfig{ ScrapeInterval: utils.GenPromDuration(int(pool.ScrapeInterval)), diff --git a/internal/prometheus/cache/rule_cache.go b/internal/prometheus/cache/rule_cache.go index 0bff14c3..60afbc49 100644 --- a/internal/prometheus/cache/rule_cache.go +++ b/internal/prometheus/cache/rule_cache.go @@ -35,7 +35,7 @@ import ( alertRuleDao "github.com/GoSimplicity/AI-CloudOps/internal/prometheus/dao/alert" configDao "github.com/GoSimplicity/AI-CloudOps/internal/prometheus/dao/config" scrapePoolDao "github.com/GoSimplicity/AI-CloudOps/internal/prometheus/dao/scrape" - "github.com/GoSimplicity/AI-CloudOps/pkg/utils" + "github.com/GoSimplicity/AI-CloudOps/internal/prometheus/utils" pm "github.com/prometheus/common/model" "github.com/prometheus/prometheus/model/rulefmt" "github.com/redis/go-redis/v9" diff --git a/internal/prometheus/dao/alert/event_dao.go b/internal/prometheus/dao/alert/event_dao.go index 1ca3082f..0fa7537f 100644 --- a/internal/prometheus/dao/alert/event_dao.go +++ b/internal/prometheus/dao/alert/event_dao.go @@ -31,10 +31,9 @@ import ( "net/http" "time" - pkg "github.com/GoSimplicity/AI-CloudOps/pkg/utils" - "github.com/GoSimplicity/AI-CloudOps/internal/model" - userDao "github.com/GoSimplicity/AI-CloudOps/internal/user/dao" + "github.com/GoSimplicity/AI-CloudOps/internal/prometheus/utils" + userDao "github.com/GoSimplicity/AI-CloudOps/internal/system/dao" "go.uber.org/zap" "gorm.io/gorm" ) @@ -254,7 +253,7 @@ func (d *alertManagerEventDAO) SendMessageToGroup(ctx context.Context, url strin content := fmt.Sprintf(`{"msg_type":"text","content":{"text":"%s"}}`, message) // 发送消息到群组 - body, err := pkg.PostWithJson(ctx, d.httpClient, d.l, url, content, nil, nil) + body, err := utils.PostWithJson(ctx, d.httpClient, d.l, url, content, nil, nil) if err != nil { d.l.Error("发送飞书群聊消息失败", zap.Error(err), diff --git a/internal/prometheus/dao/alert/onduty_dao.go b/internal/prometheus/dao/alert/onduty_dao.go index bb1d0c9d..05c9d049 100644 --- a/internal/prometheus/dao/alert/onduty_dao.go +++ b/internal/prometheus/dao/alert/onduty_dao.go @@ -30,7 +30,7 @@ import ( "errors" "github.com/GoSimplicity/AI-CloudOps/internal/model" - userDao "github.com/GoSimplicity/AI-CloudOps/internal/user/dao" + userDao "github.com/GoSimplicity/AI-CloudOps/internal/system/dao" "go.uber.org/zap" "gorm.io/gorm" ) diff --git a/internal/prometheus/dao/alert/record_dao.go b/internal/prometheus/dao/alert/record_dao.go index d2e37606..19c0bb5f 100644 --- a/internal/prometheus/dao/alert/record_dao.go +++ b/internal/prometheus/dao/alert/record_dao.go @@ -30,7 +30,7 @@ import ( "fmt" "github.com/GoSimplicity/AI-CloudOps/internal/model" - userDao "github.com/GoSimplicity/AI-CloudOps/internal/user/dao" + userDao "github.com/GoSimplicity/AI-CloudOps/internal/system/dao" "go.uber.org/zap" "gorm.io/gorm" ) diff --git a/internal/prometheus/dao/alert/rule_dao.go b/internal/prometheus/dao/alert/rule_dao.go index 1563eeda..1bc8fa83 100644 --- a/internal/prometheus/dao/alert/rule_dao.go +++ b/internal/prometheus/dao/alert/rule_dao.go @@ -30,7 +30,7 @@ import ( "fmt" "github.com/GoSimplicity/AI-CloudOps/internal/model" - userDao "github.com/GoSimplicity/AI-CloudOps/internal/user/dao" + userDao "github.com/GoSimplicity/AI-CloudOps/internal/system/dao" "go.uber.org/zap" "gorm.io/gorm" ) diff --git a/internal/prometheus/dao/scrape/pool_dao.go b/internal/prometheus/dao/scrape/pool_dao.go index 56af4670..5e6e5dc7 100644 --- a/internal/prometheus/dao/scrape/pool_dao.go +++ b/internal/prometheus/dao/scrape/pool_dao.go @@ -30,7 +30,7 @@ import ( "fmt" "github.com/GoSimplicity/AI-CloudOps/internal/model" - userDao "github.com/GoSimplicity/AI-CloudOps/internal/user/dao" + userDao "github.com/GoSimplicity/AI-CloudOps/internal/system/dao" "go.uber.org/zap" "gorm.io/gorm" ) diff --git a/internal/prometheus/service/alert/event_service.go b/internal/prometheus/service/alert/event_service.go index 934e86ef..822b4d2c 100644 --- a/internal/prometheus/service/alert/event_service.go +++ b/internal/prometheus/service/alert/event_service.go @@ -26,18 +26,19 @@ package alert import ( + "bytes" "context" "encoding/json" "fmt" + "io" + "net/http" "time" - pkg "github.com/GoSimplicity/AI-CloudOps/pkg/utils" - "github.com/GoSimplicity/AI-CloudOps/internal/model" "github.com/GoSimplicity/AI-CloudOps/internal/prometheus/cache" "github.com/GoSimplicity/AI-CloudOps/internal/prometheus/dao/alert" - userDao "github.com/GoSimplicity/AI-CloudOps/internal/user/dao" - "github.com/GoSimplicity/AI-CloudOps/pkg/utils" + "github.com/GoSimplicity/AI-CloudOps/internal/prometheus/utils" + userDao "github.com/GoSimplicity/AI-CloudOps/internal/system/dao" "github.com/prometheus/alertmanager/types" promModel "github.com/prometheus/common/model" "go.uber.org/zap" @@ -102,7 +103,7 @@ func (a *alertManagerEventService) EventAlertSilence(ctx context.Context, req *m } // 获取用户信息 - user, err := a.userDao.GetUserByID(ctx, req.UserID) + user, err := a.userDao.GetByID(ctx, req.UserID) if err != nil { a.l.Error("设置静默失败: 无效的用户ID", zap.Int("userId", req.UserID), zap.Error(err)) return fmt.Errorf("无效的用户ID: %d, %v", req.UserID, err) @@ -150,12 +151,8 @@ func (a *alertManagerEventService) EventAlertSilence(ctx context.Context, req *m return fmt.Errorf("告警管理器实例未配置") } - // 构建请求URL - alertAddr := fmt.Sprintf("http://%v:9093", alertPool.AlertManagerInstances[0]) - alertUrl := fmt.Sprintf("%s/api/v1/silences", alertAddr) - // 发送静默请求 - silenceID, err := pkg.SendSilenceRequest(ctx, a.l, alertUrl, silenceData) + silenceID, err := a.sendSilenceRequest(ctx, alertPool, silenceData) if err != nil { a.l.Error("设置静默失败: 发送静默请求失败", zap.Error(err)) return fmt.Errorf("发送静默请求失败: %v", err) @@ -192,7 +189,7 @@ func (a *alertManagerEventService) EventAlertClaim(ctx context.Context, req *mod } // 获取用户信息 - user, err := a.userDao.GetUserByID(ctx, req.UserID) + user, err := a.userDao.GetByID(ctx, req.UserID) if err != nil { a.l.Error("认领告警事件失败: 获取用户信息失败", zap.Error(err)) return fmt.Errorf("获取用户信息失败: %v", err) @@ -355,12 +352,46 @@ func (a *alertManagerEventService) sendSilenceRequest(ctx context.Context, alert } alertAddr := fmt.Sprintf("http://%v:9093", alertPool.AlertManagerInstances[0]) - alertUrl := fmt.Sprintf("%s/api/v1/silences", alertAddr) + alertURL := fmt.Sprintf("%s/api/v1/silences", alertAddr) + + req, err := http.NewRequestWithContext(ctx, http.MethodPost, alertURL, bytes.NewBuffer(silenceData)) + if err != nil { + a.l.Error("sendSilenceRequest failed: create HTTP request error", zap.Error(err)) + return "", err + } + req.Header.Set("Content-Type", "application/json") - silenceID, err := pkg.SendSilenceRequest(ctx, a.l, alertUrl, silenceData) + client := &http.Client{Timeout: 10 * time.Second} + resp, err := client.Do(req) if err != nil { - return "", fmt.Errorf("发送静默请求失败: %v", err) + a.l.Error("sendSilenceRequest failed: send HTTP request error", zap.Error(err)) + return "", err + } + defer resp.Body.Close() + + if resp.StatusCode != http.StatusOK && resp.StatusCode != http.StatusCreated { + body, _ := io.ReadAll(resp.Body) + a.l.Error("sendSilenceRequest failed: AlertManager response error", + zap.Int("status", resp.StatusCode), + zap.String("body", string(body))) + return "", fmt.Errorf("AlertManager request failed, status: %d, response: %s", resp.StatusCode, string(body)) + } + + var result struct { + Status string `json:"status"` + Data struct { + ID string `json:"id"` + } `json:"data"` + } + if err := json.NewDecoder(resp.Body).Decode(&result); err != nil { + a.l.Error("sendSilenceRequest failed: decode response error", zap.Error(err)) + return "", err + } + + if result.Status != "success" { + a.l.Error("sendSilenceRequest failed: AlertManager status not success", zap.String("status", result.Status)) + return "", fmt.Errorf("AlertManager status not success, status: %s", result.Status) } - return silenceID, nil + return result.Data.ID, nil } diff --git a/internal/prometheus/service/alert/onduty_service.go b/internal/prometheus/service/alert/onduty_service.go index 33262605..376a99c4 100644 --- a/internal/prometheus/service/alert/onduty_service.go +++ b/internal/prometheus/service/alert/onduty_service.go @@ -33,7 +33,7 @@ import ( "github.com/GoSimplicity/AI-CloudOps/internal/model" "github.com/GoSimplicity/AI-CloudOps/internal/prometheus/cache" "github.com/GoSimplicity/AI-CloudOps/internal/prometheus/dao/alert" - userDao "github.com/GoSimplicity/AI-CloudOps/internal/user/dao" + userDao "github.com/GoSimplicity/AI-CloudOps/internal/system/dao" "go.uber.org/zap" "gorm.io/gorm" ) @@ -125,7 +125,7 @@ func (s *onDutyService) CreateMonitorOnDutyGroup(ctx context.Context, req *model } // 获取并验证所有成员是否存在 - users, err := s.userDao.GetUserByIDs(ctx, req.UserIDs) + users, err := s.userDao.GetByIDs(ctx, req.UserIDs) if err != nil { s.logger.Error("获取成员信息失败", zap.Error(err)) return err @@ -189,7 +189,7 @@ func (s *onDutyService) UpdateMonitorOnDutyGroup(ctx context.Context, req *model } // 获取并验证所有成员是否存在 - users, err := s.userDao.GetUserByIDs(ctx, req.UserIDs) + users, err := s.userDao.GetByIDs(ctx, req.UserIDs) if err != nil { s.logger.Error("获取成员信息失败", zap.Error(err)) return err @@ -531,7 +531,7 @@ func (s *onDutyService) findUserByID(ctx context.Context, users []*model.User, i return user } } - user, err := s.userDao.GetUserByID(ctx, id) + user, err := s.userDao.GetByID(ctx, id) if err == nil && user != nil { return user } diff --git a/internal/prometheus/service/alert/send_service.go b/internal/prometheus/service/alert/send_service.go index f1da7dec..bf99df9e 100644 --- a/internal/prometheus/service/alert/send_service.go +++ b/internal/prometheus/service/alert/send_service.go @@ -33,7 +33,7 @@ import ( "github.com/GoSimplicity/AI-CloudOps/internal/model" "github.com/GoSimplicity/AI-CloudOps/internal/prometheus/cache" "github.com/GoSimplicity/AI-CloudOps/internal/prometheus/dao/alert" - userDao "github.com/GoSimplicity/AI-CloudOps/internal/user/dao" + userDao "github.com/GoSimplicity/AI-CloudOps/internal/system/dao" "go.uber.org/zap" "gorm.io/gorm" ) diff --git a/internal/prometheus/service/scrape/job_service.go b/internal/prometheus/service/scrape/job_service.go index 753dd8e2..2d16f66d 100644 --- a/internal/prometheus/service/scrape/job_service.go +++ b/internal/prometheus/service/scrape/job_service.go @@ -32,7 +32,7 @@ import ( "github.com/GoSimplicity/AI-CloudOps/internal/model" "github.com/GoSimplicity/AI-CloudOps/internal/prometheus/cache" scrapeJobDao "github.com/GoSimplicity/AI-CloudOps/internal/prometheus/dao/scrape" - userDao "github.com/GoSimplicity/AI-CloudOps/internal/user/dao" + userDao "github.com/GoSimplicity/AI-CloudOps/internal/system/dao" "go.uber.org/zap" ) diff --git a/internal/prometheus/service/scrape/pool_service.go b/internal/prometheus/service/scrape/pool_service.go index 916e0c57..d4cb69d0 100644 --- a/internal/prometheus/service/scrape/pool_service.go +++ b/internal/prometheus/service/scrape/pool_service.go @@ -28,13 +28,13 @@ package scrape import ( "context" "errors" - - "github.com/GoSimplicity/AI-CloudOps/pkg/utils" + "fmt" "github.com/GoSimplicity/AI-CloudOps/internal/model" "github.com/GoSimplicity/AI-CloudOps/internal/prometheus/cache" scrapeJobDao "github.com/GoSimplicity/AI-CloudOps/internal/prometheus/dao/scrape" - userDao "github.com/GoSimplicity/AI-CloudOps/internal/user/dao" + "github.com/GoSimplicity/AI-CloudOps/internal/prometheus/utils" + userDao "github.com/GoSimplicity/AI-CloudOps/internal/system/dao" "go.uber.org/zap" ) @@ -159,14 +159,14 @@ func (s *scrapePoolService) CreateMonitorScrapePool(ctx context.Context, req *mo } // 检查新的抓取池 IP 是否已被其他池使用 - if err := utils.CheckPoolIpExists(allPools, pool); err != nil { + if err := checkPoolIPConflicts(allPools, pool); err != nil { s.l.Error("检查抓取池 IP 是否存在失败", zap.Error(err)) return err } // 检查配置有效性 - if pool.ScrapeInterval <= 0 || pool.ScrapeTimeout <= 0 || pool.ScrapeTimeout > pool.ScrapeInterval { - return errors.New("采集间隔和采集超时时间不能小于等于0,且采集超时时间不能大于采集间隔") + if err := utils.ValidateScrapeTiming(pool.ScrapeInterval, pool.ScrapeTimeout); err != nil { + return err } // 创建抓取池 @@ -261,7 +261,7 @@ func (s *scrapePoolService) UpdateMonitorScrapePool(ctx context.Context, req *mo } // 检查新的抓取池 IP 是否已被其他池使用 - if err := utils.CheckPoolIpExists(allPools, pool); err != nil { + if err := checkPoolIPConflicts(allPools, pool); err != nil { s.l.Error("检查抓取池 IP 是否存在失败", zap.Error(err)) return err } @@ -323,3 +323,24 @@ func (s *scrapePoolService) DeleteMonitorScrapePool(ctx context.Context, req *mo return nil } + +// checkPoolIPConflicts 校验待保存的抓取池实例IP是否与其他池冲突 +func checkPoolIPConflicts(pools []*model.MonitorScrapePool, req *model.MonitorScrapePool) error { + existing := make(map[string]struct{}) + for _, pool := range pools { + if pool.ID == req.ID { + continue + } + for _, ip := range pool.PrometheusInstances { + existing[ip] = struct{}{} + } + } + + for _, ip := range req.PrometheusInstances { + if _, ok := existing[ip]; ok { + return fmt.Errorf("PrometheusInstances %s 已存在", ip) + } + } + + return nil +} diff --git a/internal/prometheus/utils/config.go b/internal/prometheus/utils/config.go new file mode 100644 index 00000000..8aa85390 --- /dev/null +++ b/internal/prometheus/utils/config.go @@ -0,0 +1,76 @@ +/* + * MIT License + * + * Copyright (c) 2024 Bamboo + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + */ + +package utils + +import ( + "fmt" + "net/url" + "time" + + pcc "github.com/prometheus/common/config" + promModel "github.com/prometheus/common/model" + pc "github.com/prometheus/prometheus/config" + "github.com/prometheus/prometheus/discovery" + "github.com/prometheus/prometheus/model/relabel" +) + +// ParseURL 解析字符串为URL,返回错误而非 panic +func ParseURL(u string) (*pcc.URL, error) { + parsed, err := url.Parse(u) + if err != nil { + return nil, fmt.Errorf("无效的URL: %s", u) + } + + return &pcc.URL{URL: parsed}, nil +} + +// GenPromDuration 转换秒为Prometheus Duration +func GenPromDuration(seconds int) promModel.Duration { + if seconds <= 0 { + return promModel.Duration(5 * time.Second) + } + return promModel.Duration(time.Duration(seconds) * time.Second) +} + +// DeepCopyScrapeConfig 深度拷贝 ScrapeConfig +func DeepCopyScrapeConfig(sc *pc.ScrapeConfig) *pc.ScrapeConfig { + copySc := *sc + + if sc.RelabelConfigs != nil { + copySc.RelabelConfigs = make([]*relabel.Config, len(sc.RelabelConfigs)) + for i, rc := range sc.RelabelConfigs { + copyRC := *rc + copySc.RelabelConfigs[i] = ©RC + } + } + + if sc.ServiceDiscoveryConfigs != nil { + copySc.ServiceDiscoveryConfigs = make(discovery.Configs, len(sc.ServiceDiscoveryConfigs)) + copy(copySc.ServiceDiscoveryConfigs, sc.ServiceDiscoveryConfigs) + } + + return ©Sc +} diff --git a/internal/prometheus/utils/hash.go b/internal/prometheus/utils/hash.go new file mode 100644 index 00000000..d316f8dd --- /dev/null +++ b/internal/prometheus/utils/hash.go @@ -0,0 +1,115 @@ +/* + * MIT License + * + * Copyright (c) 2024 Bamboo + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + */ + +package utils + +import ( + "crypto/sha256" + "encoding/hex" + "encoding/json" + "sort" + + "github.com/GoSimplicity/AI-CloudOps/internal/model" +) + +type promHashPayload struct { + Name string `json:"name"` + PrometheusInstances []string `json:"prometheus_instances"` + AlertManagerInstances []string `json:"alert_manager_instances"` + ScrapeInterval int `json:"scrape_interval"` + ScrapeTimeout int `json:"scrape_timeout"` + RemoteTimeoutSeconds int `json:"remote_timeout_seconds"` + SupportAlert int8 `json:"support_alert"` + SupportRecord int8 `json:"support_record"` + ExternalLabels []string `json:"external_labels"` + RemoteWriteUrl string `json:"remote_write_url"` + RemoteReadUrl string `json:"remote_read_url"` + AlertManagerUrl string `json:"alert_manager_url"` + RecordFilePath string `json:"record_file_path"` +} + +// CalculatePromHash 计算哈希值(不修改入参数据) +func CalculatePromHash(pool *model.MonitorScrapePool) string { + instancesCopy := append([]string(nil), pool.PrometheusInstances...) + labelsCopy := append([]string(nil), pool.Tags...) + sort.Strings(instancesCopy) + sort.Strings(labelsCopy) + + payload := promHashPayload{ + Name: pool.Name, + PrometheusInstances: instancesCopy, + ScrapeInterval: pool.ScrapeInterval, + ScrapeTimeout: pool.ScrapeTimeout, + RemoteTimeoutSeconds: pool.RemoteTimeoutSeconds, + SupportAlert: pool.SupportAlert, + SupportRecord: pool.SupportRecord, + ExternalLabels: labelsCopy, + RemoteWriteUrl: pool.RemoteWriteUrl, + RemoteReadUrl: pool.RemoteReadUrl, + AlertManagerUrl: pool.AlertManagerUrl, + RecordFilePath: pool.RecordFilePath, + } + + data, _ := json.Marshal(payload) + + hash := sha256.New() + hash.Write(data) + return hex.EncodeToString(hash.Sum(nil)) +} + +type alertHashPayload struct { + Name string `json:"name"` + AlertManagerInstances []string `json:"alert_manager_instances"` + ResolveTimeout string `json:"resolve_timeout"` + GroupWait string `json:"group_wait"` + GroupInterval string `json:"group_interval"` + RepeatInterval string `json:"repeat_interval"` + GroupBy []string `json:"group_by"` + Receiver string `json:"receiver"` +} + +func CalculateAlertHash(pool *model.MonitorAlertManagerPool) string { + instancesCopy := append([]string(nil), pool.AlertManagerInstances...) + groupByCopy := append([]string(nil), pool.GroupBy...) + sort.Strings(instancesCopy) + sort.Strings(groupByCopy) + + payload := alertHashPayload{ + Name: pool.Name, + AlertManagerInstances: instancesCopy, + ResolveTimeout: pool.ResolveTimeout, + GroupWait: pool.GroupWait, + GroupInterval: pool.GroupInterval, + RepeatInterval: pool.RepeatInterval, + GroupBy: groupByCopy, + Receiver: pool.Receiver, + } + + data, _ := json.Marshal(payload) + + hash := sha256.New() + hash.Write(data) + return hex.EncodeToString(hash.Sum(nil)) +} diff --git a/internal/prometheus/utils/http.go b/internal/prometheus/utils/http.go new file mode 100644 index 00000000..e8f7d586 --- /dev/null +++ b/internal/prometheus/utils/http.go @@ -0,0 +1,92 @@ +/* + * MIT License + * + * Copyright (c) 2024 Bamboo + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + */ + +package utils + +import ( + "bytes" + "context" + "fmt" + "io" + "net/http" + + "go.uber.org/zap" +) + +// PostWithJson 发送带有JSON字符串的POST请求 +func PostWithJson(ctx context.Context, client *http.Client, l *zap.Logger, url string, jsonStr string, params map[string]string, headers map[string]string) ([]byte, error) { + req, err := http.NewRequestWithContext(ctx, "POST", url, bytes.NewBuffer([]byte(jsonStr))) + if err != nil { + l.Error("创建 HTTP 请求失败", + zap.Error(err), + zap.String("url", url), + ) + return nil, err + } + + q := req.URL.Query() + for k, v := range params { + q.Add(k, v) + } + req.URL.RawQuery = q.Encode() + + for key, value := range headers { + req.Header.Set(key, value) + } + + if _, exists := headers["Content-Type"]; !exists { + req.Header.Set("Content-Type", "application/json") + } + + resp, err := client.Do(req) + if err != nil { + l.Error("发送 HTTP 请求失败", + zap.Error(err), + zap.String("url", url), + ) + return nil, err + } + defer resp.Body.Close() + + bodyBytes, err := io.ReadAll(resp.Body) + if err != nil { + l.Error("读取响应体失败", + zap.Error(err), + zap.String("url", url), + ) + return nil, err + } + + if resp.StatusCode < 200 || resp.StatusCode >= 300 { + l.Error("服务器返回非2xx状态码", + zap.String("url", url), + zap.Int("statusCode", resp.StatusCode), + zap.String("responseBody", string(bodyBytes)), + ) + return bodyBytes, fmt.Errorf("server returned HTTP status %s", resp.Status) + } + + return bodyBytes, nil +} diff --git a/internal/prometheus/utils/labels.go b/internal/prometheus/utils/labels.go new file mode 100644 index 00000000..560074ef --- /dev/null +++ b/internal/prometheus/utils/labels.go @@ -0,0 +1,111 @@ +/* + * MIT License + * + * Copyright (c) 2024 Bamboo + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + */ + +package utils + +import ( + "fmt" + "strings" + + "github.com/GoSimplicity/AI-CloudOps/internal/model" + "github.com/prometheus/alertmanager/pkg/labels" + promModel "github.com/prometheus/common/model" + "go.uber.org/zap" +) + +// ParseTags 将 ECS 的 Tags 切片解析为 Prometheus 的标签映射 +func ParseTags(tags []string) (map[promModel.LabelName]promModel.LabelValue, error) { + labelMap := make(map[promModel.LabelName]promModel.LabelValue) + + for i := 0; i < len(tags); i += 2 { + key := strings.TrimSpace(tags[i]) + if key == "" { + return nil, fmt.Errorf("标签键不能为空") + } + + if i+1 >= len(tags) { + return nil, fmt.Errorf("标签值缺失,键: '%s' 无对应值", key) + } + + value := strings.TrimSpace(tags[i+1]) + labelMap[promModel.LabelName(key)] = promModel.LabelValue(value) + } + + return labelMap, nil +} + +// ParseExternalLabels 解析外部标签 +func ParseExternalLabels(labelsList []string) []string { + var parsed []string + + for _, label := range labelsList { + parts := strings.SplitN(label, "=", 2) + if len(parts) == 2 { + parsed = append(parsed, parts[0], parts[1]) + } + } + + return parsed +} + +func BuildMatchers(alertEvent *model.MonitorAlertEvent, l *zap.Logger, useName int8) ([]*labels.Matcher, error) { + var matchers []*labels.Matcher + if useName == 1 { + alertName, exists := alertEvent.LabelsMap["alertname"] + if !exists { + l.Error("EventAlertSilence failed: alertname missing in LabelsMatcher", zap.Int("id", alertEvent.ID)) + return nil, fmt.Errorf("alertname missing in LabelsMatcher") + } + matchers = []*labels.Matcher{ + { + Type: labels.MatchEqual, + Name: "alertname", + Value: alertName, + }, + } + } else { + for key, val := range alertEvent.LabelsMap { + matcher := &labels.Matcher{ + Type: labels.MatchEqual, + Name: key, + Value: val, + } + matchers = append(matchers, matcher) + } + } + return matchers, nil +} + +func FromSliceTuMap(kvs []string) map[string]string { + labelsMap := make(map[string]string) + for _, i := range kvs { + parts := strings.Split(i, "=") + if len(parts) != 2 { + continue + } + labelsMap[parts[0]] = parts[1] + } + return labelsMap +} diff --git a/internal/prometheus/utils/map_utils.go b/internal/prometheus/utils/map_utils.go new file mode 100644 index 00000000..8b25f7ba --- /dev/null +++ b/internal/prometheus/utils/map_utils.go @@ -0,0 +1,61 @@ +/* + * MIT License + * + * Copyright (c) 2024 Bamboo + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + */ + +package utils + +import ( + "fmt" + "strings" +) + +// CloneMap 克隆一个字符串到字符串的映射 +func CloneMap(original map[string]string) map[string]string { + if original == nil { + return nil + } + cloned := make(map[string]string, len(original)) + for k, v := range original { + cloned[k] = v + } + return cloned +} + +// FormatMap 将 map[string]string 格式化为字符串,每个键值对占一行 +func FormatMap(m map[string]string) string { + var builder strings.Builder + for k, v := range m { + builder.WriteString(fmt.Sprintf("%s=%s ", k, v)) + } + return strings.TrimSpace(builder.String()) +} + +// CopyMap 深拷贝一个 map +func CopyMap[K comparable, V any](src map[K]V) map[K]V { + dst := make(map[K]V, len(src)) + for k, v := range src { + dst[k] = v + } + return dst +} diff --git a/pkg/utils/workorder.go b/internal/prometheus/utils/promql.go similarity index 77% rename from pkg/utils/workorder.go rename to internal/prometheus/utils/promql.go index 348ca2d5..b6560404 100644 --- a/pkg/utils/workorder.go +++ b/internal/prometheus/utils/promql.go @@ -24,3 +24,22 @@ */ package utils + +import ( + "fmt" + + "github.com/prometheus/prometheus/promql/parser" +) + +func PromqlExprCheck(expr string) (bool, error) { + if expr == "" { + return false, fmt.Errorf("expression cannot be empty") + } + + _, err := parser.ParseExpr(expr) + if err != nil { + return false, fmt.Errorf("invalid PromQL expression: %v", err) + } + + return true, nil +} diff --git a/internal/prometheus/utils/validation.go b/internal/prometheus/utils/validation.go new file mode 100644 index 00000000..3c06fe3c --- /dev/null +++ b/internal/prometheus/utils/validation.go @@ -0,0 +1,39 @@ +/* + * MIT License + * + * Copyright (c) 2024 Bamboo + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + */ + +package utils + +import "fmt" + +// ValidateScrapeTiming 校验采集间隔与超时时间 +func ValidateScrapeTiming(interval, timeout int) error { + if interval <= 0 || timeout <= 0 { + return fmt.Errorf("采集间隔和采集超时时间不能小于等于0") + } + if timeout > interval { + return fmt.Errorf("采集超时时间不能大于采集间隔") + } + return nil +} diff --git a/internal/prometheus/webhook/api/handler.go b/internal/prometheus/webhook/api/handler.go index 4aa56a5f..b8ca01e4 100644 --- a/internal/prometheus/webhook/api/handler.go +++ b/internal/prometheus/webhook/api/handler.go @@ -35,7 +35,7 @@ import ( "github.com/GoSimplicity/AI-CloudOps/internal/model" "github.com/GoSimplicity/AI-CloudOps/internal/prometheus/webhook/dao" - "github.com/GoSimplicity/AI-CloudOps/pkg/utils" + "github.com/GoSimplicity/AI-CloudOps/pkg/base" "github.com/gin-gonic/gin" "github.com/prometheus/alertmanager/notify/webhook" "github.com/prometheus/alertmanager/pkg/labels" @@ -81,7 +81,7 @@ func (w *WebHookHandler) MonitorAlertReceive(ctx *gin.Context) { if err := ctx.ShouldBindJSON(&msg); err != nil { w.l.Error("解析告警JSON失败", zap.Error(err)) - utils.ErrorWithMessage(ctx, "无效的JSON数据") + base.ErrorWithMessage(ctx, "无效的JSON数据") return } @@ -99,12 +99,12 @@ func (w *WebHookHandler) MonitorAlertReceive(ctx *gin.Context) { default: w.l.Warn("告警队列已满", zap.String("告警名称", alert.Labels["alertname"])) - utils.ErrorWithMessage(ctx, "告警队列已满,请稍后重试") + base.ErrorWithMessage(ctx, "告警队列已满,请稍后重试") return } } - utils.SuccessWithMessage(ctx, "告警接收成功,正在处理中") + base.SuccessWithMessage(ctx, "告警接收成功,正在处理中") } // MonitorAlertSilence 处理静默告警的请求 @@ -114,13 +114,13 @@ func (w *WebHookHandler) MonitorAlertSilence(ctx *gin.Context) { // 参数校验 if fingerprint == "" { - utils.ErrorWithMessage(ctx, "缺少必要的fingerprint参数") + base.ErrorWithMessage(ctx, "缺少必要的fingerprint参数") return } hourInt, err := strconv.Atoi(hour) if err != nil || hourInt <= 0 { - utils.ErrorWithMessage(ctx, "无效的静默时长") + base.ErrorWithMessage(ctx, "无效的静默时长") return } @@ -128,11 +128,11 @@ func (w *WebHookHandler) MonitorAlertSilence(ctx *gin.Context) { event, err := w.dao.GetMonitorAlertEventByFingerprintId(ctx, fingerprint) if err != nil { w.l.Error("获取告警事件失败", zap.Error(err)) - utils.ErrorWithMessage(ctx, "获取告警事件失败") + base.ErrorWithMessage(ctx, "获取告警事件失败") return } if event == nil { - utils.ErrorWithMessage(ctx, "未找到对应的告警事件") + base.ErrorWithMessage(ctx, "未找到对应的告警事件") return } @@ -170,12 +170,12 @@ func (w *WebHookHandler) MonitorAlertSilence(ctx *gin.Context) { jsonData, err := json.Marshal(silence) if err != nil { w.l.Error("序列化静默请求失败", zap.Error(err)) - utils.ErrorWithMessage(ctx, "创建静默请求失败") + base.ErrorWithMessage(ctx, "创建静默请求失败") return } url := fmt.Sprintf("%s/api/v2/silences", viper.GetString("webhook.alert_manager_api")) - resp, err := utils.PostWithJsonString(w.l, "AlertSilence", + resp, err := base.PostWithJsonString(w.l, "AlertSilence", viper.GetInt("webhook.im_feishu.request_timeout_seconds"), url, string(jsonData), nil, nil) @@ -184,7 +184,7 @@ func (w *WebHookHandler) MonitorAlertSilence(ctx *gin.Context) { zap.Error(err), zap.String("url", url), zap.String("request", string(jsonData))) - utils.ErrorWithMessage(ctx, "设置静默失败") + base.ErrorWithMessage(ctx, "设置静默失败") return } @@ -194,7 +194,7 @@ func (w *WebHookHandler) MonitorAlertSilence(ctx *gin.Context) { } if err := json.Unmarshal([]byte(resp), &silenceResp); err != nil { w.l.Error("解析静默响应失败", zap.Error(err)) - utils.ErrorWithMessage(ctx, "设置静默失败") + base.ErrorWithMessage(ctx, "设置静默失败") return } @@ -210,14 +210,14 @@ func (w *WebHookHandler) MonitorAlertSilence(ctx *gin.Context) { zap.Int("hour", hourInt), zap.String("silenceID", silenceResp.SilenceID)) - utils.SuccessWithMessage(ctx, "静默设置成功") + base.SuccessWithMessage(ctx, "静默设置成功") } // MonitorAlertUnSilence 处理取消静默告警的请求 func (w *WebHookHandler) MonitorAlertUnSilence(ctx *gin.Context) { fingerprint := ctx.Query("fingerprint") if fingerprint == "" { - utils.ErrorWithMessage(ctx, "缺少必要的fingerprint参数") + base.ErrorWithMessage(ctx, "缺少必要的fingerprint参数") return } @@ -225,17 +225,17 @@ func (w *WebHookHandler) MonitorAlertUnSilence(ctx *gin.Context) { event, err := w.dao.GetMonitorAlertEventByFingerprintId(ctx, fingerprint) if err != nil { w.l.Error("获取告警事件失败", zap.Error(err)) - utils.ErrorWithMessage(ctx, "获取告警事件失败") + base.ErrorWithMessage(ctx, "获取告警事件失败") return } if event == nil { - utils.ErrorWithMessage(ctx, "未找到对应的告警事件") + base.ErrorWithMessage(ctx, "未找到对应的告警事件") return } if event.Status != model.MonitorAlertEventStatusSilenced { - utils.ErrorWithMessage(ctx, "该告警未处于静默状态") + base.ErrorWithMessage(ctx, "该告警未处于静默状态") return } @@ -245,7 +245,7 @@ func (w *WebHookHandler) MonitorAlertUnSilence(ctx *gin.Context) { event.SilenceID) // 调用AlertManager API取消静默 - _, err = utils.DeleteWithId(w.l, "MonitorAlertUnSilence", + _, err = base.DeleteWithId(w.l, "MonitorAlertUnSilence", viper.GetInt("webhook.im_feishu.request_timeout_seconds"), silenceURL, nil, nil) @@ -253,7 +253,7 @@ func (w *WebHookHandler) MonitorAlertUnSilence(ctx *gin.Context) { w.l.Error("取消静默失败", zap.Error(err), zap.String("url", silenceURL)) - utils.ErrorWithMessage(ctx, "取消静默失败") + base.ErrorWithMessage(ctx, "取消静默失败") return } @@ -267,5 +267,5 @@ func (w *WebHookHandler) MonitorAlertUnSilence(ctx *gin.Context) { w.l.Info("取消静默成功", zap.String("fingerprint", fingerprint)) - utils.SuccessWithMessage(ctx, "取消静默成功") + base.SuccessWithMessage(ctx, "取消静默成功") } diff --git a/internal/prometheus/webhook/content/content.go b/internal/prometheus/webhook/content/content.go index 3365244f..287a62b7 100644 --- a/internal/prometheus/webhook/content/content.go +++ b/internal/prometheus/webhook/content/content.go @@ -33,7 +33,7 @@ import ( "strings" "time" - pkg "github.com/GoSimplicity/AI-CloudOps/pkg/utils" + "github.com/GoSimplicity/AI-CloudOps/internal/prometheus/utils" "github.com/spf13/viper" "github.com/GoSimplicity/AI-CloudOps/internal/model" @@ -193,17 +193,17 @@ func (wc *webhookContent) GenerateFeishuCardContentOneAlert(ctx context.Context, } // 处理告警标签和注释 - labelMap := pkg.CloneMap(alert.Labels) + labelMap := utils.CloneMap(alert.Labels) delete(labelMap, "alertname") delete(labelMap, "severity") delete(labelMap, "alert_rule_id") delete(labelMap, "alert_send_group") - anno := pkg.CloneMap(alert.Annotations) + anno := utils.CloneMap(alert.Annotations) delete(anno, "description_value") - msgLabel := fmt.Sprintf(`**🛶标签信息:**\n%s`, pkg.FormatMap(labelMap)) - msgAnno := fmt.Sprintf(`**🚂注释信息:**\n%s`, pkg.FormatMap(anno)) + msgLabel := fmt.Sprintf(`**🛶标签信息:**\n%s`, utils.FormatMap(labelMap)) + msgAnno := fmt.Sprintf(`**🚂注释信息:**\n%s`, utils.FormatMap(anno)) // 构建发送组信息 sendGroupUrl := fmt.Sprintf(constant.SendGroupURLTemplate, @@ -318,7 +318,7 @@ func (wc *webhookContent) SentFeishuGroup(ctx context.Context, msg string, robot url := fmt.Sprintf("%s/%s", viper.GetString("webhook.im_feishu.group_message_api"), robotToken) // 发送 HTTP POST 请求 - response, err := pkg.PostWithJson(ctx, wc.client, wc.l, url, msg, nil, nil) + response, err := utils.PostWithJson(ctx, wc.client, wc.l, url, msg, nil, nil) if err != nil { wc.l.Error("发送飞书群聊卡片消息失败", zap.Error(err), @@ -370,7 +370,7 @@ func (wc *webhookContent) SentFeishuPrivate(ctx context.Context, cardContent str params := map[string]string{"receive_id_type": "user_id"} // 发送 HTTP POST 请求 - response, err := pkg.PostWithJson(ctx, wc.client, wc.l, url, string(data), params, headers) + response, err := utils.PostWithJson(ctx, wc.client, wc.l, url, string(data), params, headers) if err != nil { wc.l.Error("发送飞书私聊卡片消息失败", zap.Error(err), diff --git a/internal/system/api/api_handler.go b/internal/system/api/api_handler.go index b78c95b6..b8657006 100644 --- a/internal/system/api/api_handler.go +++ b/internal/system/api/api_handler.go @@ -28,7 +28,7 @@ package api import ( "github.com/GoSimplicity/AI-CloudOps/internal/model" "github.com/GoSimplicity/AI-CloudOps/internal/system/service" - "github.com/GoSimplicity/AI-CloudOps/pkg/utils" + "github.com/GoSimplicity/AI-CloudOps/pkg/base" "github.com/gin-gonic/gin" ) @@ -57,7 +57,7 @@ func (h *ApiHandler) RegisterRouters(server *gin.Engine) { func (h *ApiHandler) ListApis(ctx *gin.Context) { var req model.ListApisRequest - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return h.svc.ListApis(ctx, &req) }) } @@ -66,7 +66,7 @@ func (h *ApiHandler) ListApis(ctx *gin.Context) { func (h *ApiHandler) CreateAPI(ctx *gin.Context) { var req model.CreateApiRequest - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return nil, h.svc.CreateApi(ctx, &req) }) } @@ -75,15 +75,15 @@ func (h *ApiHandler) CreateAPI(ctx *gin.Context) { func (h *ApiHandler) UpdateAPI(ctx *gin.Context) { var req model.UpdateApiRequest - id, err := utils.GetParamID(ctx) + id, err := base.GetParamID(ctx) if err != nil { - utils.ErrorWithMessage(ctx, err.Error()) + base.ErrorWithMessage(ctx, err.Error()) return } req.ID = id - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return nil, h.svc.UpdateApi(ctx, &req) }) } @@ -92,15 +92,15 @@ func (h *ApiHandler) UpdateAPI(ctx *gin.Context) { func (h *ApiHandler) DeleteAPI(ctx *gin.Context) { var req model.DeleteApiRequest - id, err := utils.GetParamID(ctx) + id, err := base.GetParamID(ctx) if err != nil { - utils.ErrorWithMessage(ctx, err.Error()) + base.ErrorWithMessage(ctx, err.Error()) return } req.ID = id - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return nil, h.svc.DeleteApi(ctx, req.ID) }) } @@ -109,22 +109,22 @@ func (h *ApiHandler) DeleteAPI(ctx *gin.Context) { func (h *ApiHandler) DetailAPI(ctx *gin.Context) { var req model.GetApiRequest - id, err := utils.GetParamID(ctx) + id, err := base.GetParamID(ctx) if err != nil { - utils.ErrorWithMessage(ctx, err.Error()) + base.ErrorWithMessage(ctx, err.Error()) return } req.ID = id - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return h.svc.GetApiById(ctx, id) }) } // GetApiStatistics 获取API统计 func (h *ApiHandler) GetApiStatistics(ctx *gin.Context) { - utils.HandleRequest(ctx, nil, func() (interface{}, error) { + base.HandleRequest(ctx, nil, func() (interface{}, error) { return h.svc.GetApiStatistics(ctx) }) } diff --git a/internal/system/api/audit_handler.go b/internal/system/api/audit_handler.go index 909647e3..b420f56b 100644 --- a/internal/system/api/audit_handler.go +++ b/internal/system/api/audit_handler.go @@ -28,7 +28,7 @@ package api import ( "github.com/GoSimplicity/AI-CloudOps/internal/model" "github.com/GoSimplicity/AI-CloudOps/internal/system/service" - "github.com/GoSimplicity/AI-CloudOps/pkg/utils" + "github.com/GoSimplicity/AI-CloudOps/pkg/base" "github.com/gin-gonic/gin" "go.uber.org/zap" ) @@ -71,7 +71,7 @@ func (h *AuditHandler) RegisterRouters(server *gin.Engine) { func (h *AuditHandler) CreateAuditLog(ctx *gin.Context) { var req model.CreateAuditLogRequest - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return nil, h.svc.CreateAuditLog(ctx, &req) }) } @@ -80,7 +80,7 @@ func (h *AuditHandler) CreateAuditLog(ctx *gin.Context) { func (h *AuditHandler) BatchCreateAuditLogs(ctx *gin.Context) { var req model.AuditLogBatch - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return nil, h.svc.BatchCreateAuditLogs(ctx, req.Logs) }) } @@ -89,7 +89,7 @@ func (h *AuditHandler) BatchCreateAuditLogs(ctx *gin.Context) { func (h *AuditHandler) ListAuditLogs(ctx *gin.Context) { var req model.ListAuditLogsRequest - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return h.svc.ListAuditLogs(ctx, &req) }) } @@ -98,15 +98,15 @@ func (h *AuditHandler) ListAuditLogs(ctx *gin.Context) { func (h *AuditHandler) GetAuditLogDetail(ctx *gin.Context) { var req model.GetAuditLogDetailRequest - id, err := utils.GetParamID(ctx) + id, err := base.GetParamID(ctx) if err != nil { - utils.ErrorWithMessage(ctx, "无效的审计日志ID") + base.ErrorWithMessage(ctx, "无效的审计日志ID") return } req.ID = id - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return h.svc.GetAuditLogDetail(ctx, req.ID) }) } @@ -115,21 +115,21 @@ func (h *AuditHandler) GetAuditLogDetail(ctx *gin.Context) { func (h *AuditHandler) SearchAuditLogs(ctx *gin.Context) { var req model.SearchAuditLogsRequest - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return h.svc.SearchAuditLogs(ctx, &req) }) } // GetAuditStatistics 获取审计统计信息 func (h *AuditHandler) GetAuditStatistics(ctx *gin.Context) { - utils.HandleRequest(ctx, nil, func() (interface{}, error) { + base.HandleRequest(ctx, nil, func() (interface{}, error) { return h.svc.GetAuditStatistics(ctx) }) } // GetAuditTypes 获取审计类型列表 func (h *AuditHandler) GetAuditTypes(ctx *gin.Context) { - utils.HandleRequest(ctx, nil, func() (interface{}, error) { + base.HandleRequest(ctx, nil, func() (interface{}, error) { return h.svc.GetAuditTypes(ctx) }) } @@ -138,15 +138,15 @@ func (h *AuditHandler) GetAuditTypes(ctx *gin.Context) { func (h *AuditHandler) DeleteAuditLog(ctx *gin.Context) { var req model.DeleteAuditLogRequest - id, err := utils.GetParamID(ctx) + id, err := base.GetParamID(ctx) if err != nil { - utils.ErrorWithMessage(ctx, "无效的审计日志ID") + base.ErrorWithMessage(ctx, "无效的审计日志ID") return } req.ID = id - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return nil, h.svc.DeleteAuditLog(ctx, req.ID) }) } @@ -155,7 +155,7 @@ func (h *AuditHandler) DeleteAuditLog(ctx *gin.Context) { func (h *AuditHandler) BatchDeleteLogs(ctx *gin.Context) { var req model.BatchDeleteRequest - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return nil, h.svc.BatchDeleteAuditLogs(ctx, req.IDs) }) } @@ -164,7 +164,7 @@ func (h *AuditHandler) BatchDeleteLogs(ctx *gin.Context) { func (h *AuditHandler) ArchiveAuditLogs(ctx *gin.Context) { var req model.ArchiveAuditLogsRequest - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return nil, h.svc.ArchiveAuditLogs(ctx, &req) }) } diff --git a/internal/system/api/role_handler.go b/internal/system/api/role_handler.go index ed265cff..95666776 100644 --- a/internal/system/api/role_handler.go +++ b/internal/system/api/role_handler.go @@ -28,7 +28,8 @@ package api import ( "github.com/GoSimplicity/AI-CloudOps/internal/model" "github.com/GoSimplicity/AI-CloudOps/internal/system/service" - "github.com/GoSimplicity/AI-CloudOps/pkg/utils" + "github.com/GoSimplicity/AI-CloudOps/pkg/base" + "github.com/GoSimplicity/AI-CloudOps/pkg/jwt" "github.com/gin-gonic/gin" ) @@ -73,7 +74,7 @@ func (h *RoleHandler) RegisterRouters(server *gin.Engine) { func (h *RoleHandler) ListRoles(ctx *gin.Context) { var req model.ListRolesRequest - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return h.svc.ListRoles(ctx, &req) }) } @@ -82,7 +83,7 @@ func (h *RoleHandler) ListRoles(ctx *gin.Context) { func (h *RoleHandler) CreateRole(ctx *gin.Context) { var req model.CreateRoleRequest - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return h.svc.CreateRole(ctx, &req) }) } @@ -91,7 +92,7 @@ func (h *RoleHandler) CreateRole(ctx *gin.Context) { func (h *RoleHandler) UpdateRole(ctx *gin.Context) { var req model.UpdateRoleRequest - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return h.svc.UpdateRole(ctx, &req) }) } @@ -100,7 +101,7 @@ func (h *RoleHandler) UpdateRole(ctx *gin.Context) { func (h *RoleHandler) DeleteRole(ctx *gin.Context) { var req model.DeleteRoleRequest - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return nil, h.svc.DeleteRole(ctx, req.ID) }) } @@ -109,13 +110,13 @@ func (h *RoleHandler) DeleteRole(ctx *gin.Context) { func (h *RoleHandler) GetRoleDetail(ctx *gin.Context) { var req model.GetRoleRequest - id, err := utils.GetParamID(ctx) + id, err := base.GetParamID(ctx) if err != nil { - utils.ErrorWithMessage(ctx, err.Error()) + base.ErrorWithMessage(ctx, err.Error()) return } - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return h.svc.GetRoleByID(ctx, id) }) } @@ -124,7 +125,7 @@ func (h *RoleHandler) GetRoleDetail(ctx *gin.Context) { func (h *RoleHandler) AssignApisToRole(ctx *gin.Context) { var req model.AssignRoleApiRequest - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return nil, h.svc.AssignApisToRole(ctx, req.RoleID, req.ApiIds) }) } @@ -133,7 +134,7 @@ func (h *RoleHandler) AssignApisToRole(ctx *gin.Context) { func (h *RoleHandler) RevokeApisFromRole(ctx *gin.Context) { var req model.RevokeRoleApiRequest - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return nil, h.svc.RevokeApisFromRole(ctx, req.RoleID, req.ApiIds) }) } @@ -142,13 +143,13 @@ func (h *RoleHandler) RevokeApisFromRole(ctx *gin.Context) { func (h *RoleHandler) GetRoleApis(ctx *gin.Context) { var req model.GetRoleApiRequest - id, err := utils.GetParamID(ctx) + id, err := base.GetParamID(ctx) if err != nil { - utils.ErrorWithMessage(ctx, err.Error()) + base.ErrorWithMessage(ctx, err.Error()) return } - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return h.svc.GetRoleApis(ctx, id) }) } @@ -157,11 +158,11 @@ func (h *RoleHandler) GetRoleApis(ctx *gin.Context) { func (h *RoleHandler) AssignRolesToUser(ctx *gin.Context) { var req model.AssignRolesToUserRequest - user := ctx.MustGet("user").(utils.UserClaims) + user := ctx.MustGet("user").(jwt.UserClaims) req.UserID = user.Uid - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return nil, h.svc.AssignRolesToUser(ctx, req.UserID, req.RoleIds, 0) }) } @@ -170,11 +171,11 @@ func (h *RoleHandler) AssignRolesToUser(ctx *gin.Context) { func (h *RoleHandler) RevokeRolesFromUser(ctx *gin.Context) { var req model.RevokeRolesFromUserRequest - user := ctx.MustGet("user").(utils.UserClaims) + user := ctx.MustGet("user").(jwt.UserClaims) req.UserID = user.Uid - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return nil, h.svc.RevokeRolesFromUser(ctx, req.UserID, req.RoleIds) }) } @@ -183,13 +184,13 @@ func (h *RoleHandler) RevokeRolesFromUser(ctx *gin.Context) { func (h *RoleHandler) GetRoleUsers(ctx *gin.Context) { var req model.GetRoleUsersRequest - id, err := utils.GetParamID(ctx) + id, err := base.GetParamID(ctx) if err != nil { - utils.ErrorWithMessage(ctx, err.Error()) + base.ErrorWithMessage(ctx, err.Error()) return } - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return h.svc.GetRoleUsers(ctx, id) }) } @@ -198,15 +199,15 @@ func (h *RoleHandler) GetRoleUsers(ctx *gin.Context) { func (h *RoleHandler) GetUserRoles(ctx *gin.Context) { var req model.GetUserRolesRequest - id, err := utils.GetParamID(ctx) + id, err := base.GetParamID(ctx) if err != nil { - utils.ErrorWithMessage(ctx, err.Error()) + base.ErrorWithMessage(ctx, err.Error()) return } req.ID = id - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return h.svc.GetUserRoles(ctx, req.ID) }) } @@ -215,10 +216,10 @@ func (h *RoleHandler) GetUserRoles(ctx *gin.Context) { func (h *RoleHandler) CheckUserPermission(ctx *gin.Context) { var req model.CheckUserPermissionRequest - user := ctx.MustGet("user").(utils.UserClaims) + user := ctx.MustGet("user").(jwt.UserClaims) req.UserID = user.Uid - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return h.svc.CheckUserPermission(ctx, req.UserID, req.Method, req.Path) }) } @@ -227,15 +228,15 @@ func (h *RoleHandler) CheckUserPermission(ctx *gin.Context) { func (h *RoleHandler) GetUserPermissions(ctx *gin.Context) { var req model.GetUserPermissionsRequest - id, err := utils.GetParamID(ctx) + id, err := base.GetParamID(ctx) if err != nil { - utils.ErrorWithMessage(ctx, err.Error()) + base.ErrorWithMessage(ctx, err.Error()) return } req.ID = id - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return h.svc.GetUserPermissions(ctx, req.ID) }) } diff --git a/internal/system/api/system_handler.go b/internal/system/api/system_handler.go index 03579eae..6e29d8b3 100644 --- a/internal/system/api/system_handler.go +++ b/internal/system/api/system_handler.go @@ -28,7 +28,7 @@ package api import ( "github.com/GoSimplicity/AI-CloudOps/internal/system/service" systemutils "github.com/GoSimplicity/AI-CloudOps/internal/system/utils" - "github.com/GoSimplicity/AI-CloudOps/pkg/utils" + "github.com/GoSimplicity/AI-CloudOps/pkg/base" "github.com/gin-gonic/gin" ) @@ -52,7 +52,7 @@ func (h *SystemHandler) RegisterRouters(server *gin.Engine) { // GetSystemInfo 获取系统基本信息 func (h *SystemHandler) GetSystemInfo(ctx *gin.Context) { - utils.HandleRequest(ctx, nil, func() (interface{}, error) { + base.HandleRequest(ctx, nil, func() (interface{}, error) { system, err := h.svc.GetCurrentSystemInfo(ctx) if err != nil { return nil, err @@ -63,7 +63,7 @@ func (h *SystemHandler) GetSystemInfo(ctx *gin.Context) { // GetSystemMetrics 获取系统性能指标 func (h *SystemHandler) GetSystemMetrics(ctx *gin.Context) { - utils.HandleRequest(ctx, nil, func() (interface{}, error) { + base.HandleRequest(ctx, nil, func() (interface{}, error) { system, err := h.svc.GetSystemMetrics(ctx) if err != nil { return nil, err @@ -74,7 +74,7 @@ func (h *SystemHandler) GetSystemMetrics(ctx *gin.Context) { // RefreshSystemInfo 刷新系统信息 func (h *SystemHandler) RefreshSystemInfo(ctx *gin.Context) { - utils.HandleRequest(ctx, nil, func() (interface{}, error) { + base.HandleRequest(ctx, nil, func() (interface{}, error) { system, err := h.svc.RefreshSystemInfo(ctx) if err != nil { return nil, err diff --git a/internal/user/api/user_handler.go b/internal/system/api/user_handler.go similarity index 63% rename from internal/user/api/user_handler.go rename to internal/system/api/user_handler.go index cfd1bc63..9442688f 100644 --- a/internal/user/api/user_handler.go +++ b/internal/system/api/user_handler.go @@ -31,9 +31,10 @@ import ( "github.com/GoSimplicity/AI-CloudOps/internal/constants" "github.com/GoSimplicity/AI-CloudOps/internal/model" - "github.com/GoSimplicity/AI-CloudOps/internal/user/service" - "github.com/GoSimplicity/AI-CloudOps/pkg/utils" - ijwt "github.com/GoSimplicity/AI-CloudOps/pkg/utils" + "github.com/GoSimplicity/AI-CloudOps/internal/system/service" + userutils "github.com/GoSimplicity/AI-CloudOps/internal/system/utils" + "github.com/GoSimplicity/AI-CloudOps/pkg/base" + jwt2 "github.com/GoSimplicity/AI-CloudOps/pkg/jwt" "github.com/gin-gonic/gin" "github.com/golang-jwt/jwt/v5" "github.com/spf13/viper" @@ -41,13 +42,13 @@ import ( type UserHandler struct { service service.UserService - ijwt ijwt.Handler + jwt jwt2.Handler } -func NewUserHandler(service service.UserService, ijwt ijwt.Handler) *UserHandler { +func NewUserHandler(service service.UserService, jwt jwt2.Handler) *UserHandler { return &UserHandler{ service: service, - ijwt: ijwt, + jwt: jwt, } } @@ -65,7 +66,7 @@ func (h *UserHandler) RegisterRoutes(server *gin.Engine) { userGroup.POST("/change_password", h.ChangePassword) userGroup.POST("/write_off", h.WriteOff) userGroup.PUT("/profile/update/:id", h.UpdateProfile) - userGroup.DELETE("/:id", h.DeleteUser) + userGroup.DELETE("/:id/delete", h.DeleteUser) userGroup.GET("/statistics", h.GetUserStatistics) } } @@ -74,7 +75,7 @@ func (h *UserHandler) RegisterRoutes(server *gin.Engine) { func (h *UserHandler) SignUp(ctx *gin.Context) { var req model.UserSignUpReq - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return nil, h.service.SignUp(ctx, &req) }) } @@ -83,7 +84,7 @@ func (h *UserHandler) SignUp(ctx *gin.Context) { func (h *UserHandler) Login(ctx *gin.Context) { var req model.UserLoginReq - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { user, err := h.service.Login(ctx, &req) if err != nil { switch { @@ -96,7 +97,7 @@ func (h *UserHandler) Login(ctx *gin.Context) { } } - accessToken, refreshToken, err := h.ijwt.SetLoginToken(ctx, user.ID, user.Username, user.AccountType) + accessToken, refreshToken, err := h.jwt.SetLoginToken(ctx, user.ID, user.Username, user.AccountType) if err != nil { return nil, fmt.Errorf("生成令牌失败: %w", err) } @@ -115,8 +116,8 @@ func (h *UserHandler) Login(ctx *gin.Context) { // Logout 用户登出处理 func (h *UserHandler) Logout(ctx *gin.Context) { - utils.HandleRequest(ctx, nil, func() (interface{}, error) { - return nil, h.ijwt.ClearToken(ctx) + base.HandleRequest(ctx, nil, func() (interface{}, error) { + return nil, h.jwt.ClearToken(ctx) }) } @@ -124,10 +125,14 @@ func (h *UserHandler) Logout(ctx *gin.Context) { func (h *UserHandler) Profile(ctx *gin.Context) { var req model.ProfileReq - uc := ctx.MustGet("user").(ijwt.UserClaims) + uc, err := userutils.ExtractClaims(ctx) + if err != nil { + base.ErrorWithMessage(ctx, err.Error()) + return + } req.ID = uc.Uid - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return h.service.GetProfile(ctx, req.ID) }) } @@ -136,30 +141,23 @@ func (h *UserHandler) Profile(ctx *gin.Context) { func (h *UserHandler) RefreshToken(ctx *gin.Context) { var req model.TokenRequest - rc := ijwt.RefreshClaims{} + base.HandleRequest(ctx, &req, func() (interface{}, error) { + rc := jwt2.RefreshClaims{} - key := viper.GetString("jwt.key2") - token, err := jwt.ParseWithClaims(req.RefreshToken, &rc, func(token *jwt.Token) (interface{}, error) { - return []byte(key), nil - }) - - if err != nil || token == nil || !token.Valid { - utils.ErrorWithMessage(ctx, "令牌无效,请重新登录") - return - } + key := viper.GetString("jwt.key2") + token, err := jwt.ParseWithClaims(req.RefreshToken, &rc, func(token *jwt.Token) (interface{}, error) { + return []byte(key), nil + }) - if err = h.ijwt.CheckSession(ctx, rc.Ssid); err != nil { - utils.ErrorWithMessage(ctx, "会话已过期,请重新登录") - return - } + if err != nil || token == nil || !token.Valid { + return nil, fmt.Errorf("令牌无效,请重新登录") + } - req.UserID = rc.Uid - req.Username = rc.Username - req.Ssid = rc.Ssid - req.AccountType = rc.AccountType + if err = h.jwt.CheckSession(ctx, rc.Ssid); err != nil { + return nil, fmt.Errorf("会话已过期,请重新登录") + } - utils.HandleRequest(ctx, &req, func() (interface{}, error) { - return h.ijwt.SetJWTToken(ctx, req.UserID, req.Username, req.Ssid, req.AccountType) + return h.jwt.SetJWTToken(ctx, rc.Uid, rc.Username, rc.Ssid, rc.AccountType) }) } @@ -167,10 +165,14 @@ func (h *UserHandler) RefreshToken(ctx *gin.Context) { func (h *UserHandler) GetPermCode(ctx *gin.Context) { var req model.GetPermCodeReq - uc := ctx.MustGet("user").(ijwt.UserClaims) + uc, err := userutils.ExtractClaims(ctx) + if err != nil { + base.ErrorWithMessage(ctx, err.Error()) + return + } req.ID = uc.Uid - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return h.service.GetPermCode(ctx, req.ID) }) } @@ -179,7 +181,7 @@ func (h *UserHandler) GetPermCode(ctx *gin.Context) { func (h *UserHandler) GetUserList(ctx *gin.Context) { var req model.GetUserListReq - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return h.service.GetUserList(ctx, &req) }) } @@ -188,10 +190,14 @@ func (h *UserHandler) GetUserList(ctx *gin.Context) { func (h *UserHandler) ChangePassword(ctx *gin.Context) { var req model.ChangePasswordReq - uc := ctx.MustGet("user").(ijwt.UserClaims) + uc, err := userutils.ExtractClaims(ctx) + if err != nil { + base.ErrorWithMessage(ctx, err.Error()) + return + } req.UserID = uc.Uid - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return nil, h.service.ChangePassword(ctx, &req) }) } @@ -200,8 +206,14 @@ func (h *UserHandler) ChangePassword(ctx *gin.Context) { func (h *UserHandler) WriteOff(ctx *gin.Context) { var req model.WriteOffReq - utils.HandleRequest(ctx, &req, func() (interface{}, error) { - return nil, h.service.WriteOff(ctx, req.Username, req.Password) + uc, err := userutils.ExtractClaims(ctx) + if err != nil { + base.ErrorWithMessage(ctx, err.Error()) + return + } + + base.HandleRequest(ctx, &req, func() (interface{}, error) { + return nil, h.service.WriteOff(ctx, uc.Uid, req.Password) }) } @@ -209,14 +221,25 @@ func (h *UserHandler) WriteOff(ctx *gin.Context) { func (h *UserHandler) UpdateProfile(ctx *gin.Context) { var req model.UpdateProfileReq - id, err := utils.GetParamID(ctx) + uc, err := userutils.ExtractClaims(ctx) if err != nil { - utils.ErrorWithMessage(ctx, "用户ID格式错误") + base.ErrorWithMessage(ctx, err.Error()) + return + } + + id, err := base.GetParamID(ctx) + if err != nil { + base.ErrorWithMessage(ctx, "用户ID格式错误") return } req.ID = id - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + if uc.Username != "admin" && uc.AccountType != constants.AccountTypeService && uc.Uid != req.ID { + base.ForbiddenError(ctx, "无权限修改该用户信息") + return + } + + base.HandleRequest(ctx, &req, func() (interface{}, error) { return nil, h.service.UpdateProfile(ctx, &req) }) } @@ -225,15 +248,15 @@ func (h *UserHandler) UpdateProfile(ctx *gin.Context) { func (h *UserHandler) DeleteUser(ctx *gin.Context) { var req model.DeleteUserReq - id, err := utils.GetParamID(ctx) + id, err := base.GetParamID(ctx) if err != nil { - utils.ErrorWithMessage(ctx, "用户ID格式错误") + base.ErrorWithMessage(ctx, "用户ID格式错误") return } req.ID = id - utils.HandleRequest(ctx, nil, func() (interface{}, error) { + base.HandleRequest(ctx, nil, func() (interface{}, error) { return nil, h.service.DeleteUser(ctx, req.ID) }) } @@ -242,22 +265,22 @@ func (h *UserHandler) DeleteUser(ctx *gin.Context) { func (h *UserHandler) GetUserDetail(ctx *gin.Context) { var req model.GetUserDetailReq - id, err := utils.GetParamID(ctx) + id, err := base.GetParamID(ctx) if err != nil { - utils.ErrorWithMessage(ctx, "用户ID格式错误") + base.ErrorWithMessage(ctx, "用户ID格式错误") return } req.ID = id - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return h.service.GetUserDetail(ctx, req.ID) }) } // GetUserStatistics 获取用户统计 func (h *UserHandler) GetUserStatistics(ctx *gin.Context) { - utils.HandleRequest(ctx, nil, func() (interface{}, error) { + base.HandleRequest(ctx, nil, func() (interface{}, error) { return h.service.GetUserStatistics(ctx) }) } diff --git a/internal/system/dao/role_dao.go b/internal/system/dao/role_dao.go index becd54cb..b4b46fbe 100644 --- a/internal/system/dao/role_dao.go +++ b/internal/system/dao/role_dao.go @@ -33,29 +33,22 @@ import ( ) type RoleDAO interface { - // 角色管理 - ListRoles(ctx context.Context, req *model.ListRolesRequest) ([]*model.Role, int64, error) - CreateRole(ctx context.Context, role *model.Role, apiIds []int) (*model.Role, error) - UpdateRole(ctx context.Context, role *model.Role, apiIds []int) (*model.Role, error) - DeleteRole(ctx context.Context, id int) error - GetRoleByID(ctx context.Context, id int) (*model.Role, error) - CheckRoleExists(ctx context.Context, name, code string, excludeID int) (bool, error) - CheckRoleHasUsers(ctx context.Context, roleID int) (bool, error) - - // 角色权限管理 - AssignApisToRole(ctx context.Context, roleID int, apiIds []int) error - RevokeApisFromRole(ctx context.Context, roleID int, apiIds []int) error - GetRoleApis(ctx context.Context, roleID int) ([]*model.Api, error) - - // 用户角色管理 + List(ctx context.Context, req *model.ListRolesRequest) ([]*model.Role, int64, error) + Create(ctx context.Context, role *model.Role, apiIds []int) (*model.Role, error) + Update(ctx context.Context, role *model.Role, apiIds []int) (*model.Role, error) + Delete(ctx context.Context, id int) error + GetByID(ctx context.Context, id int) (*model.Role, error) + CheckExists(ctx context.Context, name, code string, excludeID int) (bool, error) + CheckHasUsers(ctx context.Context, roleID int) (bool, error) + AssignApis(ctx context.Context, roleID int, apiIds []int) error + RevokeApis(ctx context.Context, roleID int, apiIds []int) error + GetApis(ctx context.Context, roleID int) ([]*model.Api, error) AssignRolesToUser(ctx context.Context, userID int, roleIds []int, grantedBy int) error RevokeRolesFromUser(ctx context.Context, userID int, roleIds []int) error - GetRoleUsers(ctx context.Context, roleID int) ([]*model.User, error) - GetUserRoles(ctx context.Context, userID int) ([]*model.Role, error) - - // 权限检查 - CheckUserPermission(ctx context.Context, userID int, method, path string) (bool, error) - GetUserPermissions(ctx context.Context, userID int) ([]*model.Api, error) + GetUsers(ctx context.Context, roleID int) ([]*model.User, error) + GetRoles(ctx context.Context, userID int) ([]*model.Role, error) + CheckPermission(ctx context.Context, userID int, method, path string) (bool, error) + GetPermissions(ctx context.Context, userID int) ([]*model.Api, error) } type roleDAO struct { @@ -68,8 +61,8 @@ func NewRoleDAO(db *gorm.DB) RoleDAO { } } -// ListRoles 获取角色列表 -func (d *roleDAO) ListRoles(ctx context.Context, req *model.ListRolesRequest) ([]*model.Role, int64, error) { +// List 获取角色列表 +func (d *roleDAO) List(ctx context.Context, req *model.ListRolesRequest) ([]*model.Role, int64, error) { var roles []*model.Role var total int64 @@ -101,8 +94,8 @@ func (d *roleDAO) ListRoles(ctx context.Context, req *model.ListRolesRequest) ([ return roles, total, nil } -// CreateRole 创建角色 -func (d *roleDAO) CreateRole(ctx context.Context, role *model.Role, apiIds []int) (*model.Role, error) { +// Create 创建角色 +func (d *roleDAO) Create(ctx context.Context, role *model.Role, apiIds []int) (*model.Role, error) { tx := d.db.WithContext(ctx).Begin() defer func() { if r := recover(); r != nil { @@ -136,11 +129,11 @@ func (d *roleDAO) CreateRole(ctx context.Context, role *model.Role, apiIds []int } // 重新加载角色数据 - return d.GetRoleByID(ctx, role.ID) + return d.GetByID(ctx, role.ID) } -// UpdateRole 更新角色 -func (d *roleDAO) UpdateRole(ctx context.Context, role *model.Role, apiIds []int) (*model.Role, error) { +// Update 更新角色 +func (d *roleDAO) Update(ctx context.Context, role *model.Role, apiIds []int) (*model.Role, error) { tx := d.db.WithContext(ctx).Begin() defer func() { if r := recover(); r != nil { @@ -185,11 +178,11 @@ func (d *roleDAO) UpdateRole(ctx context.Context, role *model.Role, apiIds []int } // 重新加载角色数据 - return d.GetRoleByID(ctx, role.ID) + return d.GetByID(ctx, role.ID) } -// DeleteRole 删除角色 -func (d *roleDAO) DeleteRole(ctx context.Context, id int) error { +// Delete 删除角色 +func (d *roleDAO) Delete(ctx context.Context, id int) error { tx := d.db.WithContext(ctx).Begin() defer func() { if r := recover(); r != nil { @@ -218,8 +211,8 @@ func (d *roleDAO) DeleteRole(ctx context.Context, id int) error { return tx.Commit().Error } -// GetRoleByID 根据ID获取角色 -func (d *roleDAO) GetRoleByID(ctx context.Context, id int) (*model.Role, error) { +// GetByID 根据ID获取角色 +func (d *roleDAO) GetByID(ctx context.Context, id int) (*model.Role, error) { var role model.Role if err := d.db.WithContext(ctx).Preload("Apis").Preload("Users"). First(&role, id).Error; err != nil { @@ -228,8 +221,8 @@ func (d *roleDAO) GetRoleByID(ctx context.Context, id int) (*model.Role, error) return &role, nil } -// CheckRoleExists 检查角色名称或编码是否已存在 -func (d *roleDAO) CheckRoleExists(ctx context.Context, name, code string, excludeID int) (bool, error) { +// CheckExists 检查角色名称或编码是否已存在 +func (d *roleDAO) CheckExists(ctx context.Context, name, code string, excludeID int) (bool, error) { var count int64 query := d.db.WithContext(ctx).Model(&model.Role{}). Where("(name = ? OR code = ?)", name, code) @@ -245,8 +238,8 @@ func (d *roleDAO) CheckRoleExists(ctx context.Context, name, code string, exclud return count > 0, nil } -// CheckRoleHasUsers 检查角色是否有关联用户 -func (d *roleDAO) CheckRoleHasUsers(ctx context.Context, roleID int) (bool, error) { +// CheckHasUsers 检查角色是否有关联用户 +func (d *roleDAO) CheckHasUsers(ctx context.Context, roleID int) (bool, error) { var count int64 if err := d.db.WithContext(ctx).Model(&model.UserRole{}). Where("role_id = ?", roleID).Count(&count).Error; err != nil { @@ -256,8 +249,8 @@ func (d *roleDAO) CheckRoleHasUsers(ctx context.Context, roleID int) (bool, erro return count > 0, nil } -// AssignApisToRole 为角色分配API权限 -func (d *roleDAO) AssignApisToRole(ctx context.Context, roleID int, apiIds []int) error { +// AssignApis 为角色分配API权限 +func (d *roleDAO) AssignApis(ctx context.Context, roleID int, apiIds []int) error { tx := d.db.WithContext(ctx).Begin() defer func() { if r := recover(); r != nil { @@ -289,14 +282,14 @@ func (d *roleDAO) AssignApisToRole(ctx context.Context, roleID int, apiIds []int return tx.Commit().Error } -// RevokeApisFromRole 撤销角色的API权限 -func (d *roleDAO) RevokeApisFromRole(ctx context.Context, roleID int, apiIds []int) error { +// RevokeApis 撤销角色的API权限 +func (d *roleDAO) RevokeApis(ctx context.Context, roleID int, apiIds []int) error { return d.db.WithContext(ctx).Where("role_id = ? AND api_id IN ?", roleID, apiIds). Delete(&model.RoleApi{}).Error } -// GetRoleApis 获取角色的API权限列表 -func (d *roleDAO) GetRoleApis(ctx context.Context, roleID int) ([]*model.Api, error) { +// GetApis 获取角色的API权限列表 +func (d *roleDAO) GetApis(ctx context.Context, roleID int) ([]*model.Api, error) { var apis []*model.Api if err := d.db.WithContext(ctx).Model(&model.Api{}). Joins("JOIN cl_system_role_apis ON cl_system_apis.id = cl_system_role_apis.api_id"). @@ -308,7 +301,7 @@ func (d *roleDAO) GetRoleApis(ctx context.Context, roleID int) ([]*model.Api, er return apis, nil } -// AssignRolesToUser 为用户分配角色 +// AssignRoles 为用户分配角色 func (d *roleDAO) AssignRolesToUser(ctx context.Context, userID int, roleIds []int, grantedBy int) error { tx := d.db.WithContext(ctx).Begin() defer func() { @@ -341,14 +334,17 @@ func (d *roleDAO) AssignRolesToUser(ctx context.Context, userID int, roleIds []i return tx.Commit().Error } -// RevokeRolesFromUser 撤销用户角色 +// RevokeRoles 撤销用户角色 func (d *roleDAO) RevokeRolesFromUser(ctx context.Context, userID int, roleIds []int) error { - return d.db.WithContext(ctx).Where("user_id = ? AND role_id IN ?", userID, roleIds). - Delete(&model.UserRole{}).Error + query := d.db.WithContext(ctx).Where("user_id = ?", userID) + if len(roleIds) > 0 { + query = query.Where("role_id IN ?", roleIds) + } + return query.Delete(&model.UserRole{}).Error } -// GetRoleUsers 获取角色下的用户列表 -func (d *roleDAO) GetRoleUsers(ctx context.Context, roleID int) ([]*model.User, error) { +// GetUsers 获取角色下的用户列表 +func (d *roleDAO) GetUsers(ctx context.Context, roleID int) ([]*model.User, error) { var users []*model.User if err := d.db.WithContext(ctx).Model(&model.User{}). Joins("JOIN cl_system_user_roles ON cl_system_users.id = cl_system_user_roles.user_id"). @@ -361,7 +357,7 @@ func (d *roleDAO) GetRoleUsers(ctx context.Context, roleID int) ([]*model.User, } // GetUserRoles 获取用户的角色列表 -func (d *roleDAO) GetUserRoles(ctx context.Context, userID int) ([]*model.Role, error) { +func (d *roleDAO) GetRoles(ctx context.Context, userID int) ([]*model.Role, error) { var roles []*model.Role if err := d.db.WithContext(ctx). Preload("Apis"). @@ -376,7 +372,7 @@ func (d *roleDAO) GetUserRoles(ctx context.Context, userID int) ([]*model.Role, } // CheckUserPermission 检查用户权限 -func (d *roleDAO) CheckUserPermission(ctx context.Context, userID int, method, path string) (bool, error) { +func (d *roleDAO) CheckPermission(ctx context.Context, userID int, method, path string) (bool, error) { var count int64 // 通过用户角色查询是否有对应的API权限 @@ -400,7 +396,7 @@ func (d *roleDAO) CheckUserPermission(ctx context.Context, userID int, method, p } // GetUserPermissions 获取用户的所有权限 -func (d *roleDAO) GetUserPermissions(ctx context.Context, userID int) ([]*model.Api, error) { +func (d *roleDAO) GetPermissions(ctx context.Context, userID int) ([]*model.Api, error) { var apis []*model.Api query := ` diff --git a/internal/user/dao/user_dao.go b/internal/system/dao/user_dao.go similarity index 70% rename from internal/user/dao/user_dao.go rename to internal/system/dao/user_dao.go index df9949c6..4c3ba087 100644 --- a/internal/user/dao/user_dao.go +++ b/internal/system/dao/user_dao.go @@ -30,22 +30,23 @@ import ( "errors" "github.com/GoSimplicity/AI-CloudOps/internal/model" + userutils "github.com/GoSimplicity/AI-CloudOps/internal/system/utils" "go.uber.org/zap" "gorm.io/gorm" ) type UserDAO interface { - CreateUser(ctx context.Context, user *model.User) error - GetUserByUsername(ctx context.Context, username string) (*model.User, error) - GetUserList(ctx context.Context, page, size int, search string, enable int8, accountType int8) ([]*model.User, int64, error) - GetUserByID(ctx context.Context, id int) (*model.User, error) - GetUserByIDs(ctx context.Context, ids []int) ([]*model.User, error) - GetPermCode(ctx context.Context, uid int) ([]string, error) + Create(ctx context.Context, user *model.User) error + GetByUsername(ctx context.Context, username string) (*model.User, error) + List(ctx context.Context, page, size int, search string, enable *int8, accountType *int8) ([]*model.User, int64, error) + GetByID(ctx context.Context, id int) (*model.User, error) + GetByIDs(ctx context.Context, ids []int) ([]*model.User, error) + GetPermCodes(ctx context.Context, uid int) ([]string, error) ChangePassword(ctx context.Context, uid int, password string) error - WriteOff(ctx context.Context, username, password string) error - UpdateProfile(ctx context.Context, user *model.User) error - DeleteUser(ctx context.Context, uid int) error - GetUserStatistics(ctx context.Context) (*model.UserStatistics, error) + WriteOff(ctx context.Context, uid int) error + Update(ctx context.Context, user *model.User) error + Delete(ctx context.Context, uid int) error + GetStatistics(ctx context.Context) (*model.UserStatistics, error) } type userDAO struct { @@ -61,10 +62,13 @@ func NewUserDAO(db *gorm.DB, l *zap.Logger) UserDAO { } // CreateUser 创建用户 -func (d *userDAO) CreateUser(ctx context.Context, user *model.User) error { +func (d *userDAO) Create(ctx context.Context, user *model.User) error { if user == nil { return errors.New("用户信息不能为空") } + if err := userutils.RequireNonEmpty(user.Username, "用户名"); err != nil { + return err + } // 使用事务和一次性查询检查唯一性约束 err := d.db.WithContext(ctx).Transaction(func(tx *gorm.DB) error { @@ -109,9 +113,9 @@ func (d *userDAO) CreateUser(ctx context.Context, user *model.User) error { } // GetUserByUsername 根据用户名获取用户信息 -func (d *userDAO) GetUserByUsername(ctx context.Context, username string) (*model.User, error) { - if username == "" { - return nil, errors.New("username 不能为空") +func (d *userDAO) GetByUsername(ctx context.Context, username string) (*model.User, error) { + if err := userutils.RequireNonEmpty(username, "用户名"); err != nil { + return nil, err } var user model.User @@ -124,21 +128,28 @@ func (d *userDAO) GetUserByUsername(ctx context.Context, username string) (*mode } // GetAllUsers 获取所有用户 -func (d *userDAO) GetUserList(ctx context.Context, page, size int, search string, enable int8, accountType int8) ([]*model.User, int64, error) { +func (d *userDAO) List(ctx context.Context, page, size int, search string, enable *int8, accountType *int8) ([]*model.User, int64, error) { var users []*model.User var count int64 + if page <= 0 { + page = 1 + } + if size <= 0 { + size = 10 + } + query := d.db.WithContext(ctx).Model(&model.User{}) if search != "" { query = query.Where("username LIKE ? OR real_name LIKE ?", "%"+search+"%", "%"+search+"%") } - if enable != 0 { - query = query.Where("enable = ?", enable) + if enable != nil { + query = query.Where("enable = ?", *enable) } - if accountType != 0 { - query = query.Where("account_type = ?", accountType) + if accountType != nil { + query = query.Where("account_type = ?", *accountType) } if err := query.Count(&count).Error; err != nil { @@ -155,9 +166,9 @@ func (d *userDAO) GetUserList(ctx context.Context, page, size int, search string } // GetUserByID 根据用户ID获取用户信息 -func (d *userDAO) GetUserByID(ctx context.Context, id int) (*model.User, error) { - if id <= 0 { - return nil, errors.New("无效的用户ID") +func (d *userDAO) GetByID(ctx context.Context, id int) (*model.User, error) { + if err := userutils.RequirePositiveID(id, "用户ID"); err != nil { + return nil, err } var user model.User @@ -173,22 +184,34 @@ func (d *userDAO) GetUserByID(ctx context.Context, id int) (*model.User, error) } // GetPermCode 获取用户权限码 -func (d *userDAO) GetPermCode(ctx context.Context, uid int) ([]string, error) { - if uid <= 0 { - return nil, errors.New("无效的用户ID") +func (d *userDAO) GetPermCodes(ctx context.Context, uid int) ([]string, error) { + if err := userutils.RequirePositiveID(uid, "用户ID"); err != nil { + return nil, err } - // TODO: 实现权限码获取逻辑 - return []string{}, nil + var codes []string + if err := d.db.WithContext(ctx). + Table("cl_system_apis AS a"). + Joins("JOIN cl_system_role_apis AS ra ON a.id = ra.api_id"). + Joins("JOIN cl_system_roles AS r ON ra.role_id = r.id"). + Joins("JOIN cl_system_user_roles AS ur ON ur.role_id = r.id"). + Where("ur.user_id = ? AND r.status = ?", uid, 1). + Distinct(). + Pluck("a.path", &codes).Error; err != nil { + d.l.Error("获取用户权限码失败", zap.Int("uid", uid), zap.Error(err)) + return nil, err + } + + return codes, nil } // ChangePassword 修改密码 func (d *userDAO) ChangePassword(ctx context.Context, uid int, password string) error { - if uid <= 0 { - return errors.New("无效的用户ID") + if err := userutils.RequirePositiveID(uid, "用户ID"); err != nil { + return err } - if password == "" { - return errors.New("密码不能为空") + if err := userutils.RequireNonEmpty(password, "密码"); err != nil { + return err } result := d.db.WithContext(ctx). @@ -211,10 +234,13 @@ func (d *userDAO) ChangePassword(ctx context.Context, uid int, password string) } // UpdateProfile 更新用户信息 -func (d *userDAO) UpdateProfile(ctx context.Context, user *model.User) error { +func (d *userDAO) Update(ctx context.Context, user *model.User) error { if user == nil || user.ID <= 0 { return errors.New("无效的用户信息") } + if err := userutils.RequirePositiveID(user.ID, "用户ID"); err != nil { + return err + } // 使用事务和一次性查询检查唯一性约束 err := d.db.WithContext(ctx).Transaction(func(tx *gorm.DB) error { @@ -275,18 +301,18 @@ func (d *userDAO) UpdateProfile(ctx context.Context, user *model.User) error { } // WriteOff 注销用户 -func (d *userDAO) WriteOff(ctx context.Context, username string, password string) error { - if username == "" || password == "" { - return errors.New("用户名和密码不能为空") +func (d *userDAO) WriteOff(ctx context.Context, uid int) error { + if err := userutils.RequirePositiveID(uid, "用户ID"); err != nil { + return err } result := d.db.WithContext(ctx). Model(&model.User{}). - Where("username = ?", username). + Where("id = ?", uid). Delete(&model.User{}) if result.Error != nil { - d.l.Error("注销用户失败", zap.String("username", username), zap.Error(result.Error)) + d.l.Error("注销用户失败", zap.Int("uid", uid), zap.Error(result.Error)) return result.Error } @@ -298,9 +324,9 @@ func (d *userDAO) WriteOff(ctx context.Context, username string, password string } // DeleteUser 删除用户 -func (d *userDAO) DeleteUser(ctx context.Context, uid int) error { - if uid <= 0 { - return errors.New("无效的用户ID") +func (d *userDAO) Delete(ctx context.Context, uid int) error { + if err := userutils.RequirePositiveID(uid, "用户ID"); err != nil { + return err } return d.db.WithContext(ctx).Transaction(func(tx *gorm.DB) error { @@ -310,6 +336,11 @@ func (d *userDAO) DeleteUser(ctx context.Context, uid int) error { // 继续执行,不中断事务 } + // 删除用户角色关联 + if err := tx.Table("cl_system_user_roles").Where("user_id = ?", uid).Delete(nil).Error; err != nil { + d.l.Warn("删除用户角色关联失败", zap.Int("uid", uid), zap.Error(err)) + } + // 删除用户 result := tx.Where("id = ?", uid).Delete(&model.User{}) if result.Error != nil { @@ -326,10 +357,15 @@ func (d *userDAO) DeleteUser(ctx context.Context, uid int) error { } // GetUserByIDs 批量获取用户信息 -func (d *userDAO) GetUserByIDs(ctx context.Context, ids []int) ([]*model.User, error) { +func (d *userDAO) GetByIDs(ctx context.Context, ids []int) ([]*model.User, error) { if len(ids) == 0 { return nil, errors.New("用户ID列表不能为空") } + for _, id := range ids { + if err := userutils.RequirePositiveID(id, "用户ID"); err != nil { + return nil, err + } + } var users []*model.User if err := d.db.WithContext(ctx). @@ -342,7 +378,7 @@ func (d *userDAO) GetUserByIDs(ctx context.Context, ids []int) ([]*model.User, e return users, nil } -func (d *userDAO) GetUserStatistics(ctx context.Context) (*model.UserStatistics, error) { +func (d *userDAO) GetStatistics(ctx context.Context) (*model.UserStatistics, error) { var statistics model.UserStatistics // 获取管理员总数 diff --git a/internal/system/service/role_service.go b/internal/system/service/role_service.go index 4290e1e8..f728b004 100644 --- a/internal/system/service/role_service.go +++ b/internal/system/service/role_service.go @@ -73,7 +73,7 @@ func NewRoleService(roleDao dao.RoleDAO, l *zap.Logger) RoleService { // ListRoles 获取角色列表 func (s *roleService) ListRoles(ctx context.Context, req *model.ListRolesRequest) (*model.ListResp[*model.Role], error) { - roles, total, err := s.roleDao.ListRoles(ctx, req) + roles, total, err := s.roleDao.List(ctx, req) if err != nil { s.l.Error("获取角色列表失败", zap.Error(err)) return nil, err @@ -88,7 +88,7 @@ func (s *roleService) ListRoles(ctx context.Context, req *model.ListRolesRequest // CreateRole 创建角色 func (s *roleService) CreateRole(ctx context.Context, req *model.CreateRoleRequest) (*model.Role, error) { // 检查角色名称和编码是否已存在 - exists, err := s.roleDao.CheckRoleExists(ctx, req.Name, req.Code, 0) + exists, err := s.roleDao.CheckExists(ctx, req.Name, req.Code, 0) if err != nil { s.l.Error("检查角色是否存在失败", zap.Error(err)) return nil, err @@ -106,7 +106,7 @@ func (s *roleService) CreateRole(ctx context.Context, req *model.CreateRoleReque IsSystem: 0, // 创建的角色默认不是系统角色 } - createdRole, err := s.roleDao.CreateRole(ctx, role, req.ApiIds) + createdRole, err := s.roleDao.Create(ctx, role, req.ApiIds) if err != nil { s.l.Error("创建角色失败", zap.Error(err)) return nil, err @@ -118,7 +118,7 @@ func (s *roleService) CreateRole(ctx context.Context, req *model.CreateRoleReque // UpdateRole 更新角色 func (s *roleService) UpdateRole(ctx context.Context, req *model.UpdateRoleRequest) (*model.Role, error) { // 检查角色是否存在 - existingRole, err := s.roleDao.GetRoleByID(ctx, req.ID) + existingRole, err := s.roleDao.GetByID(ctx, req.ID) if err != nil { s.l.Error("获取角色失败", zap.Error(err)) return nil, err @@ -131,7 +131,7 @@ func (s *roleService) UpdateRole(ctx context.Context, req *model.UpdateRoleReque } // 检查角色名称和编码是否已被其他角色使用 - exists, err := s.roleDao.CheckRoleExists(ctx, req.Name, req.Code, req.ID) + exists, err := s.roleDao.CheckExists(ctx, req.Name, req.Code, req.ID) if err != nil { s.l.Error("检查角色是否存在失败", zap.Error(err)) return nil, err @@ -149,7 +149,7 @@ func (s *roleService) UpdateRole(ctx context.Context, req *model.UpdateRoleReque Status: int8(req.Status), } - updatedRole, err := s.roleDao.UpdateRole(ctx, role, req.ApiIds) + updatedRole, err := s.roleDao.Update(ctx, role, req.ApiIds) if err != nil { s.l.Error("更新角色失败", zap.Error(err)) return nil, err @@ -161,7 +161,7 @@ func (s *roleService) UpdateRole(ctx context.Context, req *model.UpdateRoleReque // DeleteRole 删除角色 func (s *roleService) DeleteRole(ctx context.Context, id int) error { // 检查角色是否存在 - role, err := s.roleDao.GetRoleByID(ctx, id) + role, err := s.roleDao.GetByID(ctx, id) if err != nil && err != gorm.ErrRecordNotFound { s.l.Error("获取角色失败", zap.Error(err)) return err @@ -178,7 +178,7 @@ func (s *roleService) DeleteRole(ctx context.Context, id int) error { } // 检查是否有用户关联该角色 - hasUsers, err := s.roleDao.CheckRoleHasUsers(ctx, id) + hasUsers, err := s.roleDao.CheckHasUsers(ctx, id) if err != nil { s.l.Error("检查角色是否有关联用户失败", zap.Error(err)) return err @@ -188,7 +188,7 @@ func (s *roleService) DeleteRole(ctx context.Context, id int) error { return errors.New("角色下还有关联用户,不允许删除") } - err = s.roleDao.DeleteRole(ctx, id) + err = s.roleDao.Delete(ctx, id) if err != nil { s.l.Error("删除角色失败", zap.Error(err)) return err @@ -199,7 +199,7 @@ func (s *roleService) DeleteRole(ctx context.Context, id int) error { // GetRoleByID 根据ID获取角色 func (s *roleService) GetRoleByID(ctx context.Context, id int) (*model.Role, error) { - role, err := s.roleDao.GetRoleByID(ctx, id) + role, err := s.roleDao.GetByID(ctx, id) if err != nil { s.l.Error("获取角色详情失败", zap.Error(err)) return nil, err @@ -212,7 +212,7 @@ func (s *roleService) GetRoleByID(ctx context.Context, id int) (*model.Role, err func (s *roleService) AssignApisToRole(ctx context.Context, roleID int, apiIds []int) error { s.l.Info("为角色分配API权限", zap.Int("role_id", roleID), zap.Ints("api_ids", apiIds)) - err := s.roleDao.AssignApisToRole(ctx, roleID, apiIds) + err := s.roleDao.AssignApis(ctx, roleID, apiIds) if err != nil { s.l.Error("为角色分配API权限失败", zap.Error(err)) return err @@ -223,7 +223,7 @@ func (s *roleService) AssignApisToRole(ctx context.Context, roleID int, apiIds [ // RevokeApisFromRole 撤销角色的API权限 func (s *roleService) RevokeApisFromRole(ctx context.Context, roleID int, apiIds []int) error { - err := s.roleDao.RevokeApisFromRole(ctx, roleID, apiIds) + err := s.roleDao.RevokeApis(ctx, roleID, apiIds) if err != nil { s.l.Error("撤销角色API权限失败", zap.Error(err)) return err @@ -234,7 +234,7 @@ func (s *roleService) RevokeApisFromRole(ctx context.Context, roleID int, apiIds // GetRoleApis 获取角色的API权限列表 func (s *roleService) GetRoleApis(ctx context.Context, roleID int) (*model.ListResp[*model.Api], error) { - apis, err := s.roleDao.GetRoleApis(ctx, roleID) + apis, err := s.roleDao.GetApis(ctx, roleID) if err != nil { s.l.Error("获取角色API权限失败", zap.Error(err)) return nil, err @@ -269,7 +269,7 @@ func (s *roleService) RevokeRolesFromUser(ctx context.Context, userID int, roleI // GetRoleUsers 获取角色下的用户列表 func (s *roleService) GetRoleUsers(ctx context.Context, roleID int) (*model.ListResp[*model.User], error) { - users, err := s.roleDao.GetRoleUsers(ctx, roleID) + users, err := s.roleDao.GetUsers(ctx, roleID) if err != nil { s.l.Error("获取角色用户列表失败", zap.Error(err)) return nil, err @@ -282,7 +282,7 @@ func (s *roleService) GetRoleUsers(ctx context.Context, roleID int) (*model.List // GetUserRoles 获取用户的角色列表 func (s *roleService) GetUserRoles(ctx context.Context, userID int) (*model.ListResp[*model.Role], error) { - roles, err := s.roleDao.GetUserRoles(ctx, userID) + roles, err := s.roleDao.GetRoles(ctx, userID) if err != nil { s.l.Error("获取用户角色列表失败", zap.Error(err)) return nil, err @@ -295,7 +295,7 @@ func (s *roleService) GetUserRoles(ctx context.Context, userID int) (*model.List // CheckUserPermission 检查用户权限 func (s *roleService) CheckUserPermission(ctx context.Context, userID int, method, path string) (bool, error) { - hasPermission, err := s.roleDao.CheckUserPermission(ctx, userID, method, path) + hasPermission, err := s.roleDao.CheckPermission(ctx, userID, method, path) if err != nil { s.l.Error("检查用户权限失败", zap.Error(err)) return false, err @@ -306,7 +306,7 @@ func (s *roleService) CheckUserPermission(ctx context.Context, userID int, metho // GetUserPermissions 获取用户的所有权限 func (s *roleService) GetUserPermissions(ctx context.Context, userID int) (*model.ListResp[*model.Api], error) { - permissions, err := s.roleDao.GetUserPermissions(ctx, userID) + permissions, err := s.roleDao.GetPermissions(ctx, userID) if err != nil { s.l.Error("获取用户权限列表失败", zap.Error(err)) return nil, err diff --git a/internal/user/service/user_service.go b/internal/system/service/user_service.go similarity index 59% rename from internal/user/service/user_service.go rename to internal/system/service/user_service.go index 7124b7f4..194caca5 100644 --- a/internal/user/service/user_service.go +++ b/internal/system/service/user_service.go @@ -28,14 +28,13 @@ package service import ( "context" "errors" + "fmt" "github.com/GoSimplicity/AI-CloudOps/internal/constants" - "github.com/GoSimplicity/AI-CloudOps/internal/system/service" - "go.uber.org/zap" - "github.com/GoSimplicity/AI-CloudOps/internal/model" - "github.com/GoSimplicity/AI-CloudOps/internal/user/dao" - "golang.org/x/crypto/bcrypt" + "github.com/GoSimplicity/AI-CloudOps/internal/system/dao" + userutils "github.com/GoSimplicity/AI-CloudOps/internal/system/utils" + "go.uber.org/zap" "gorm.io/gorm" ) @@ -47,7 +46,7 @@ type UserService interface { GetUserDetail(ctx context.Context, uid int) (*model.User, error) GetUserList(ctx context.Context, req *model.GetUserListReq) (model.ListResp[*model.User], error) ChangePassword(ctx context.Context, req *model.ChangePasswordReq) error - WriteOff(ctx context.Context, username, password string) error + WriteOff(ctx context.Context, uid int, password string) error UpdateProfile(ctx context.Context, req *model.UpdateProfileReq) error DeleteUser(ctx context.Context, uid int) error GetUserStatistics(ctx context.Context) (*model.UserStatistics, error) @@ -55,38 +54,28 @@ type UserService interface { type userService struct { dao dao.UserDAO - roleSvc service.RoleService - l *zap.Logger + logger *zap.Logger + roleDao dao.RoleDAO } -func NewUserService(dao dao.UserDAO, roleSvc service.RoleService, l *zap.Logger) UserService { +func NewUserService(dao dao.UserDAO, roleDao dao.RoleDAO, logger *zap.Logger) UserService { return &userService{ dao: dao, - roleSvc: roleSvc, - l: l, + roleDao: roleDao, + logger: logger, } } // SignUp 用户注册 func (us *userService) SignUp(ctx context.Context, user *model.UserSignUpReq) error { - hash, err := bcrypt.GenerateFromPassword([]byte(user.Password), bcrypt.DefaultCost) + hash, err := userutils.HashPassword(user.Password) if err != nil { + us.logger.Error("生成密码失败", zap.Error(err)) return err } - user.Password = string(hash) - - if err := us.dao.CreateUser(ctx, &model.User{ - Username: user.Username, - Password: user.Password, - RealName: user.RealName, - Desc: user.Desc, - Mobile: user.Mobile, - FeiShuUserId: user.FeiShuUserId, - AccountType: user.AccountType, - HomePath: user.HomePath, - Enable: user.Enable, - }); err != nil { + if err := us.dao.Create(ctx, userutils.BuildUserForCreate(user, hash)); err != nil { + us.logger.Error("创建用户失败", zap.Error(err)) return err } @@ -95,15 +84,16 @@ func (us *userService) SignUp(ctx context.Context, user *model.UserSignUpReq) er // Login 用户登录 func (us *userService) Login(ctx context.Context, user *model.UserLoginReq) (*model.User, error) { - u, err := us.dao.GetUserByUsername(ctx, user.Username) + u, err := us.dao.GetByUsername(ctx, user.Username) if errors.Is(err, gorm.ErrRecordNotFound) { return &model.User{}, constants.ErrorUserNotExist } else if err != nil { + us.logger.Error("获取用户失败", zap.Error(err)) return &model.User{}, err } - err = bcrypt.CompareHashAndPassword([]byte(u.Password), []byte(user.Password)) - if err != nil { + if err = userutils.ComparePassword(u.Password, user.Password); err != nil { + us.logger.Error("密码错误", zap.Error(err)) return &model.User{}, constants.ErrorPasswordIncorrect } @@ -112,13 +102,14 @@ func (us *userService) Login(ctx context.Context, user *model.UserLoginReq) (*mo // GetProfile 获取用户信息 func (us *userService) GetProfile(ctx context.Context, uid int) (*model.User, error) { - return us.dao.GetUserByID(ctx, uid) + return us.dao.GetByID(ctx, uid) } // GetPermCode 获取用户权限 func (us *userService) GetPermCode(ctx context.Context, uid int) ([]string, error) { - codes, err := us.dao.GetPermCode(ctx, uid) + codes, err := us.dao.GetPermCodes(ctx, uid) if err != nil { + us.logger.Error("获取用户权限码失败", zap.Error(err)) return nil, err } @@ -127,8 +118,34 @@ func (us *userService) GetPermCode(ctx context.Context, uid int) ([]string, erro // GetUserList 获取用户列表 func (us *userService) GetUserList(ctx context.Context, req *model.GetUserListReq) (model.ListResp[*model.User], error) { - users, count, err := us.dao.GetUserList(ctx, req.Page, req.Size, req.Search, req.Enable, req.AccountType) + page := req.Page + if page <= 0 { + page = 1 + } + size := req.Size + if size <= 0 { + size = 10 + } + + if req.Enable != nil { + if *req.Enable == 0 { + req.Enable = nil + } else if *req.Enable != 1 && *req.Enable != 2 { + return model.ListResp[*model.User]{}, fmt.Errorf("用户状态只支持 1(正常)/2(冻结)") + } + } + + if req.AccountType != nil { + if *req.AccountType == 0 { + req.AccountType = nil + } else if *req.AccountType != 1 && *req.AccountType != 2 { + return model.ListResp[*model.User]{}, fmt.Errorf("账号类型只支持 1(普通)/2(服务)") + } + } + + users, count, err := us.dao.List(ctx, page, size, req.Search, req.Enable, req.AccountType) if err != nil { + us.logger.Error("获取用户列表失败", zap.Error(err)) return model.ListResp[*model.User]{}, err } @@ -141,80 +158,78 @@ func (us *userService) GetUserList(ctx context.Context, req *model.GetUserListRe // ChangePassword 修改密码 func (us *userService) ChangePassword(ctx context.Context, req *model.ChangePasswordReq) error { if req.Password == req.NewPassword { + us.logger.Error("新密码不能与旧密码相同") return errors.New("新密码不能与旧密码相同") } // 验证旧密码是否正确 - user, err := us.dao.GetUserByID(ctx, req.UserID) + user, err := us.dao.GetByID(ctx, req.UserID) if err != nil { + us.logger.Error("获取用户失败", zap.Error(err)) return err } - if err := bcrypt.CompareHashAndPassword([]byte(user.Password), []byte(req.Password)); err != nil { + if err := userutils.ComparePassword(user.Password, req.Password); err != nil { + us.logger.Error("密码错误", zap.Error(err)) return constants.ErrorPasswordIncorrect } - hash, err := bcrypt.GenerateFromPassword([]byte(req.NewPassword), bcrypt.DefaultCost) + hash, err := userutils.HashPassword(req.NewPassword) if err != nil { + us.logger.Error("生成密码失败", zap.Error(err)) return err } // 修改密码 - return us.dao.ChangePassword(ctx, req.UserID, string(hash)) + return us.dao.ChangePassword(ctx, req.UserID, hash) } // UpdateProfile 修改用户信息 func (us *userService) UpdateProfile(ctx context.Context, req *model.UpdateProfileReq) error { // 验证用户是否存在 - user, err := us.dao.GetUserByID(ctx, req.ID) + user, err := us.dao.GetByID(ctx, req.ID) if err != nil { + us.logger.Error("获取用户失败", zap.Error(err)) return err } // 更新用户信息 - user.RealName = req.RealName - user.Desc = req.Desc - user.Mobile = req.Mobile - user.FeiShuUserId = req.FeiShuUserId - user.AccountType = req.AccountType - user.HomePath = req.HomePath - user.Enable = req.Enable - user.Email = req.Email - user.Avatar = req.Avatar - - return us.dao.UpdateProfile(ctx, user) + userutils.ApplyProfileUpdates(user, req) + return us.dao.Update(ctx, user) } // WriteOff 注销账号 -func (us *userService) WriteOff(ctx context.Context, username string, password string) error { +func (us *userService) WriteOff(ctx context.Context, uid int, password string) error { // 验证用户是否存在 - user, err := us.dao.GetUserByUsername(ctx, username) + user, err := us.dao.GetByID(ctx, uid) if err != nil { + us.logger.Error("获取用户失败", zap.Error(err)) return err } // 验证密码是否正确 - if err := bcrypt.CompareHashAndPassword([]byte(user.Password), []byte(password)); err != nil { + if err := userutils.ComparePassword(user.Password, password); err != nil { + us.logger.Error("密码错误", zap.Error(err)) return constants.ErrorPasswordIncorrect } - return us.dao.WriteOff(ctx, username, password) + return us.dao.WriteOff(ctx, uid) } func (us *userService) DeleteUser(ctx context.Context, uid int) error { // 删除用户角色关联 - if err := us.roleSvc.DeleteRole(ctx, uid); err != nil { - us.l.Error("删除用户角色关联失败", zap.Int("uid", uid), zap.Error(err)) + if err := us.roleDao.RevokeRolesFromUser(ctx, uid, nil); err != nil { + us.logger.Error("删除用户角色关联失败", zap.Int("uid", uid), zap.Error(err)) return err } - return us.dao.DeleteUser(ctx, uid) + return us.dao.Delete(ctx, uid) } func (us *userService) GetUserDetail(ctx context.Context, uid int) (*model.User, error) { - user, err := us.dao.GetUserByID(ctx, uid) + user, err := us.dao.GetByID(ctx, uid) if err != nil { - us.l.Error("获取用户详情失败", zap.Int("uid", uid), zap.Error(err)) + us.logger.Error("获取用户详情失败", zap.Int("uid", uid), zap.Error(err)) return nil, err } @@ -222,9 +237,9 @@ func (us *userService) GetUserDetail(ctx context.Context, uid int) (*model.User, } func (us *userService) GetUserStatistics(ctx context.Context) (*model.UserStatistics, error) { - statistics, err := us.dao.GetUserStatistics(ctx) + statistics, err := us.dao.GetStatistics(ctx) if err != nil { - us.l.Error("获取用户统计失败", zap.Error(err)) + us.logger.Error("获取用户统计失败", zap.Error(err)) return nil, err } diff --git a/internal/system/utils/context.go b/internal/system/utils/context.go new file mode 100644 index 00000000..808f0d22 --- /dev/null +++ b/internal/system/utils/context.go @@ -0,0 +1,23 @@ +package utils + +import ( + "fmt" + + pkgutils "github.com/GoSimplicity/AI-CloudOps/pkg/jwt" + "github.com/gin-gonic/gin" +) + +// ExtractClaims 从 gin 上下文安全提取登录用户信息 +func ExtractClaims(ctx *gin.Context) (pkgutils.UserClaims, error) { + value, exists := ctx.Get("user") + if !exists { + return pkgutils.UserClaims{}, fmt.Errorf("用户信息缺失") + } + + claims, ok := value.(pkgutils.UserClaims) + if !ok { + return pkgutils.UserClaims{}, fmt.Errorf("用户信息格式错误") + } + + return claims, nil +} diff --git a/internal/system/utils/mapper.go b/internal/system/utils/mapper.go new file mode 100644 index 00000000..b1995f17 --- /dev/null +++ b/internal/system/utils/mapper.go @@ -0,0 +1,31 @@ +package utils + +import "github.com/GoSimplicity/AI-CloudOps/internal/model" + +// BuildUserForCreate 将注册请求转换为可持久化的用户实体 +func BuildUserForCreate(req *model.UserSignUpReq, hashedPassword string) *model.User { + return &model.User{ + Username: req.Username, + Password: hashedPassword, + RealName: req.RealName, + Desc: req.Desc, + Mobile: req.Mobile, + FeiShuUserId: req.FeiShuUserId, + AccountType: req.AccountType, + HomePath: req.HomePath, + Enable: req.Enable, + } +} + +// ApplyProfileUpdates 应用可编辑的用户资料字段 +func ApplyProfileUpdates(user *model.User, req *model.UpdateProfileReq) { + user.RealName = req.RealName + user.Desc = req.Desc + user.Mobile = req.Mobile + user.FeiShuUserId = req.FeiShuUserId + user.AccountType = req.AccountType + user.HomePath = req.HomePath + user.Enable = req.Enable + user.Email = req.Email + user.Avatar = req.Avatar +} diff --git a/internal/system/utils/password.go b/internal/system/utils/password.go new file mode 100644 index 00000000..3e58ad57 --- /dev/null +++ b/internal/system/utils/password.go @@ -0,0 +1,30 @@ +package utils + +import ( + "fmt" + + "golang.org/x/crypto/bcrypt" +) + +// HashPassword 对密码进行统一校验与加密 +func HashPassword(password string) (string, error) { + if err := RequireNonEmpty(password, "密码"); err != nil { + return "", err + } + + hash, err := bcrypt.GenerateFromPassword([]byte(password), bcrypt.DefaultCost) + if err != nil { + return "", fmt.Errorf("生成密码失败: %w", err) + } + + return string(hash), nil +} + +// ComparePassword 对比明文密码与密文密码 +func ComparePassword(hashedPassword, rawPassword string) error { + if err := RequireNonEmpty(rawPassword, "密码"); err != nil { + return err + } + + return bcrypt.CompareHashAndPassword([]byte(hashedPassword), []byte(rawPassword)) +} diff --git a/internal/system/utils/validation.go b/internal/system/utils/validation.go new file mode 100644 index 00000000..e87bee50 --- /dev/null +++ b/internal/system/utils/validation.go @@ -0,0 +1,22 @@ +package utils + +import ( + "fmt" + "strings" +) + +// RequireNonEmpty 校验字符串是否为空 +func RequireNonEmpty(value, field string) error { + if strings.TrimSpace(value) == "" { + return fmt.Errorf("%s不能为空", field) + } + return nil +} + +// RequirePositiveID 校验 ID 是否大于零 +func RequirePositiveID(id int, field string) error { + if id <= 0 { + return fmt.Errorf("%s必须为正整数", field) + } + return nil +} diff --git a/internal/tree/api/cloud_account_handler.go b/internal/tree/api/cloud_account_handler.go index c668a1d0..5839e21b 100644 --- a/internal/tree/api/cloud_account_handler.go +++ b/internal/tree/api/cloud_account_handler.go @@ -28,7 +28,8 @@ package api import ( "github.com/GoSimplicity/AI-CloudOps/internal/model" "github.com/GoSimplicity/AI-CloudOps/internal/tree/service" - "github.com/GoSimplicity/AI-CloudOps/pkg/utils" + "github.com/GoSimplicity/AI-CloudOps/pkg/base" + "github.com/GoSimplicity/AI-CloudOps/pkg/jwt" "github.com/gin-gonic/gin" ) @@ -63,7 +64,7 @@ func (h *CloudAccountHandler) RegisterRouters(server *gin.Engine) { func (h *CloudAccountHandler) GetCloudAccountList(ctx *gin.Context) { var req model.GetCloudAccountListReq - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return h.service.GetCloudAccountList(ctx, &req) }) } @@ -72,15 +73,15 @@ func (h *CloudAccountHandler) GetCloudAccountList(ctx *gin.Context) { func (h *CloudAccountHandler) GetCloudAccountDetail(ctx *gin.Context) { var req model.GetCloudAccountDetailReq - id, err := utils.GetParamID(ctx) + id, err := base.GetParamID(ctx) if err != nil { - utils.ErrorWithMessage(ctx, "无效的账户ID") + base.ErrorWithMessage(ctx, "无效的账户ID") return } req.ID = id - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return h.service.GetCloudAccountDetail(ctx, &req) }) } @@ -89,9 +90,9 @@ func (h *CloudAccountHandler) GetCloudAccountDetail(ctx *gin.Context) { func (h *CloudAccountHandler) CreateCloudAccount(ctx *gin.Context) { var req model.CreateCloudAccountReq - user := ctx.MustGet("user").(utils.UserClaims) + user := ctx.MustGet("user").(jwt.UserClaims) - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return nil, h.service.CreateCloudAccount(ctx, &req, user.Uid, user.Username) }) } @@ -100,15 +101,15 @@ func (h *CloudAccountHandler) CreateCloudAccount(ctx *gin.Context) { func (h *CloudAccountHandler) UpdateCloudAccount(ctx *gin.Context) { var req model.UpdateCloudAccountReq - id, err := utils.GetParamID(ctx) + id, err := base.GetParamID(ctx) if err != nil { - utils.ErrorWithMessage(ctx, "无效的账户ID") + base.ErrorWithMessage(ctx, "无效的账户ID") return } req.ID = id - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return nil, h.service.UpdateCloudAccount(ctx, &req) }) } @@ -117,15 +118,15 @@ func (h *CloudAccountHandler) UpdateCloudAccount(ctx *gin.Context) { func (h *CloudAccountHandler) DeleteCloudAccount(ctx *gin.Context) { var req model.DeleteCloudAccountReq - id, err := utils.GetParamID(ctx) + id, err := base.GetParamID(ctx) if err != nil { - utils.ErrorWithMessage(ctx, "无效的账户ID") + base.ErrorWithMessage(ctx, "无效的账户ID") return } req.ID = id - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return nil, h.service.DeleteCloudAccount(ctx, &req) }) } @@ -134,15 +135,15 @@ func (h *CloudAccountHandler) DeleteCloudAccount(ctx *gin.Context) { func (h *CloudAccountHandler) UpdateCloudAccountStatus(ctx *gin.Context) { var req model.UpdateCloudAccountStatusReq - id, err := utils.GetParamID(ctx) + id, err := base.GetParamID(ctx) if err != nil { - utils.ErrorWithMessage(ctx, "无效的账户ID") + base.ErrorWithMessage(ctx, "无效的账户ID") return } req.ID = id - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return nil, h.service.UpdateCloudAccountStatus(ctx, &req) }) } @@ -151,15 +152,15 @@ func (h *CloudAccountHandler) UpdateCloudAccountStatus(ctx *gin.Context) { func (h *CloudAccountHandler) VerifyCloudAccount(ctx *gin.Context) { var req model.VerifyCloudAccountReq - id, err := utils.GetParamID(ctx) + id, err := base.GetParamID(ctx) if err != nil { - utils.ErrorWithMessage(ctx, "无效的账户ID") + base.ErrorWithMessage(ctx, "无效的账户ID") return } req.ID = id - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return nil, h.service.VerifyCloudAccount(ctx, &req) }) } @@ -168,7 +169,7 @@ func (h *CloudAccountHandler) VerifyCloudAccount(ctx *gin.Context) { func (h *CloudAccountHandler) BatchDeleteCloudAccount(ctx *gin.Context) { var req model.BatchDeleteCloudAccountReq - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return nil, h.service.BatchDeleteCloudAccount(ctx, &req) }) } @@ -177,7 +178,7 @@ func (h *CloudAccountHandler) BatchDeleteCloudAccount(ctx *gin.Context) { func (h *CloudAccountHandler) BatchUpdateCloudAccountStatus(ctx *gin.Context) { var req model.BatchUpdateCloudAccountStatusReq - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return nil, h.service.BatchUpdateCloudAccountStatus(ctx, &req) }) } @@ -186,9 +187,9 @@ func (h *CloudAccountHandler) BatchUpdateCloudAccountStatus(ctx *gin.Context) { func (h *CloudAccountHandler) ImportCloudAccount(ctx *gin.Context) { var req model.ImportCloudAccountReq - user := ctx.MustGet("user").(utils.UserClaims) + user := ctx.MustGet("user").(jwt.UserClaims) - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return h.service.ImportCloudAccount(ctx, &req, user.Uid, user.Username) }) } @@ -197,7 +198,7 @@ func (h *CloudAccountHandler) ImportCloudAccount(ctx *gin.Context) { func (h *CloudAccountHandler) ExportCloudAccount(ctx *gin.Context) { var req model.ExportCloudAccountReq - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return h.service.ExportCloudAccount(ctx, &req) }) } diff --git a/internal/tree/api/cloud_account_region_handler.go b/internal/tree/api/cloud_account_region_handler.go index 8570fe66..d23156cb 100644 --- a/internal/tree/api/cloud_account_region_handler.go +++ b/internal/tree/api/cloud_account_region_handler.go @@ -28,7 +28,8 @@ package api import ( "github.com/GoSimplicity/AI-CloudOps/internal/model" "github.com/GoSimplicity/AI-CloudOps/internal/tree/service" - "github.com/GoSimplicity/AI-CloudOps/pkg/utils" + "github.com/GoSimplicity/AI-CloudOps/pkg/base" + "github.com/GoSimplicity/AI-CloudOps/pkg/jwt" "github.com/gin-gonic/gin" ) @@ -60,7 +61,7 @@ func (h *CloudAccountRegionHandler) RegisterRouters(server *gin.Engine) { func (h *CloudAccountRegionHandler) GetCloudAccountRegionList(ctx *gin.Context) { var req model.GetCloudAccountRegionListReq - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return h.service.GetCloudAccountRegionList(ctx, &req) }) } @@ -69,15 +70,15 @@ func (h *CloudAccountRegionHandler) GetCloudAccountRegionList(ctx *gin.Context) func (h *CloudAccountRegionHandler) GetCloudAccountRegionDetail(ctx *gin.Context) { var req model.GetCloudAccountDetailReq - id, err := utils.GetParamID(ctx) + id, err := base.GetParamID(ctx) if err != nil { - utils.ErrorWithMessage(ctx, "无效的区域ID") + base.ErrorWithMessage(ctx, "无效的区域ID") return } req.ID = id - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return h.service.GetCloudAccountRegionDetail(ctx, req.ID) }) } @@ -86,12 +87,12 @@ func (h *CloudAccountRegionHandler) GetCloudAccountRegionDetail(ctx *gin.Context func (h *CloudAccountRegionHandler) CreateCloudAccountRegion(ctx *gin.Context) { var req model.CreateCloudAccountRegionReq - user := ctx.MustGet("user").(utils.UserClaims) + user := ctx.MustGet("user").(jwt.UserClaims) req.CreateUserID = user.Uid req.CreateUserName = user.Username - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return nil, h.service.CreateCloudAccountRegion(ctx, &req) }) } @@ -100,12 +101,12 @@ func (h *CloudAccountRegionHandler) CreateCloudAccountRegion(ctx *gin.Context) { func (h *CloudAccountRegionHandler) BatchCreateCloudAccountRegion(ctx *gin.Context) { var req model.BatchCreateCloudAccountRegionReq - user := ctx.MustGet("user").(utils.UserClaims) + user := ctx.MustGet("user").(jwt.UserClaims) req.CreateUserID = user.Uid req.CreateUserName = user.Username - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return nil, h.service.BatchCreateCloudAccountRegion(ctx, &req) }) } @@ -114,15 +115,15 @@ func (h *CloudAccountRegionHandler) BatchCreateCloudAccountRegion(ctx *gin.Conte func (h *CloudAccountRegionHandler) UpdateCloudAccountRegion(ctx *gin.Context) { var req model.UpdateCloudAccountRegionReq - id, err := utils.GetParamID(ctx) + id, err := base.GetParamID(ctx) if err != nil { - utils.ErrorWithMessage(ctx, "无效的区域ID") + base.ErrorWithMessage(ctx, "无效的区域ID") return } req.ID = id - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return nil, h.service.UpdateCloudAccountRegion(ctx, &req) }) } @@ -131,15 +132,15 @@ func (h *CloudAccountRegionHandler) UpdateCloudAccountRegion(ctx *gin.Context) { func (h *CloudAccountRegionHandler) DeleteCloudAccountRegion(ctx *gin.Context) { var req model.DeleteCloudAccountRegionReq - id, err := utils.GetParamID(ctx) + id, err := base.GetParamID(ctx) if err != nil { - utils.ErrorWithMessage(ctx, "无效的区域ID") + base.ErrorWithMessage(ctx, "无效的区域ID") return } req.ID = id - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return nil, h.service.DeleteCloudAccountRegion(ctx, &req) }) } @@ -148,15 +149,15 @@ func (h *CloudAccountRegionHandler) DeleteCloudAccountRegion(ctx *gin.Context) { func (h *CloudAccountRegionHandler) UpdateCloudAccountRegionStatus(ctx *gin.Context) { var req model.UpdateCloudAccountRegionStatusReq - id, err := utils.GetParamID(ctx) + id, err := base.GetParamID(ctx) if err != nil { - utils.ErrorWithMessage(ctx, "无效的区域ID") + base.ErrorWithMessage(ctx, "无效的区域ID") return } req.ID = id - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return nil, h.service.UpdateCloudAccountRegionStatus(ctx, &req) }) } @@ -165,7 +166,7 @@ func (h *CloudAccountRegionHandler) UpdateCloudAccountRegionStatus(ctx *gin.Cont func (h *CloudAccountRegionHandler) GetAvailableRegions(ctx *gin.Context) { var req model.GetAvailableRegionsReq - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return h.service.GetAvailableRegions(ctx, &req) }) } diff --git a/internal/tree/api/tree_cloud_handler.go b/internal/tree/api/tree_cloud_handler.go index 892d44c5..96dd4799 100644 --- a/internal/tree/api/tree_cloud_handler.go +++ b/internal/tree/api/tree_cloud_handler.go @@ -28,8 +28,9 @@ package api import ( "github.com/GoSimplicity/AI-CloudOps/internal/model" "github.com/GoSimplicity/AI-CloudOps/internal/tree/service" + "github.com/GoSimplicity/AI-CloudOps/pkg/base" + "github.com/GoSimplicity/AI-CloudOps/pkg/jwt" "github.com/GoSimplicity/AI-CloudOps/pkg/ssh" - "github.com/GoSimplicity/AI-CloudOps/pkg/utils" "github.com/gin-gonic/gin" ) @@ -69,7 +70,7 @@ func (h *TreeCloudHandler) RegisterRouters(server *gin.Engine) { func (h *TreeCloudHandler) GetTreeCloudResourceList(ctx *gin.Context) { var req model.GetTreeCloudResourceListReq - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return h.service.GetTreeCloudResourceList(ctx, &req) }) } @@ -78,15 +79,15 @@ func (h *TreeCloudHandler) GetTreeCloudResourceList(ctx *gin.Context) { func (h *TreeCloudHandler) GetTreeCloudResourceDetail(ctx *gin.Context) { var req model.GetTreeCloudResourceDetailReq - id, err := utils.GetParamID(ctx) + id, err := base.GetParamID(ctx) if err != nil { - utils.ErrorWithMessage(ctx, "无效的资源ID") + base.ErrorWithMessage(ctx, "无效的资源ID") return } req.ID = id - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return h.service.GetTreeCloudResourceDetail(ctx, &req) }) } @@ -95,19 +96,19 @@ func (h *TreeCloudHandler) GetTreeCloudResourceDetail(ctx *gin.Context) { func (h *TreeCloudHandler) UpdateTreeCloudResource(ctx *gin.Context) { var req model.UpdateTreeCloudResourceReq - id, err := utils.GetParamID(ctx) + id, err := base.GetParamID(ctx) if err != nil { - utils.ErrorWithMessage(ctx, "无效的资源ID") + base.ErrorWithMessage(ctx, "无效的资源ID") return } // 获取当前用户信息 - uc := ctx.MustGet("user").(utils.UserClaims) + uc := ctx.MustGet("user").(jwt.UserClaims) req.ID = id req.OperatorID = uc.Uid req.OperatorName = uc.Username - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return nil, h.service.UpdateTreeCloudResource(ctx, &req) }) } @@ -116,19 +117,19 @@ func (h *TreeCloudHandler) UpdateTreeCloudResource(ctx *gin.Context) { func (h *TreeCloudHandler) DeleteTreeCloudResource(ctx *gin.Context) { var req model.DeleteTreeCloudResourceReq - id, err := utils.GetParamID(ctx) + id, err := base.GetParamID(ctx) if err != nil { - utils.ErrorWithMessage(ctx, "无效的资源ID") + base.ErrorWithMessage(ctx, "无效的资源ID") return } // 获取当前用户信息 - uc := ctx.MustGet("user").(utils.UserClaims) + uc := ctx.MustGet("user").(jwt.UserClaims) req.ID = id req.OperatorID = uc.Uid req.OperatorName = uc.Username - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return nil, h.service.DeleteTreeCloudResource(ctx, &req) }) } @@ -137,15 +138,15 @@ func (h *TreeCloudHandler) DeleteTreeCloudResource(ctx *gin.Context) { func (h *TreeCloudHandler) BindTreeCloudResource(ctx *gin.Context) { var req model.BindTreeCloudResourceReq - id, err := utils.GetParamID(ctx) + id, err := base.GetParamID(ctx) if err != nil { - utils.ErrorWithMessage(ctx, "无效的资源ID") + base.ErrorWithMessage(ctx, "无效的资源ID") return } req.ID = id - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return nil, h.service.BindTreeCloudResource(ctx, &req) }) } @@ -154,15 +155,15 @@ func (h *TreeCloudHandler) BindTreeCloudResource(ctx *gin.Context) { func (h *TreeCloudHandler) UnBindTreeCloudResource(ctx *gin.Context) { var req model.UnBindTreeCloudResourceReq - id, err := utils.GetParamID(ctx) + id, err := base.GetParamID(ctx) if err != nil { - utils.ErrorWithMessage(ctx, "无效的资源ID") + base.ErrorWithMessage(ctx, "无效的资源ID") return } req.ID = id - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return nil, h.service.UnBindTreeCloudResource(ctx, &req) }) } @@ -172,11 +173,11 @@ func (h *TreeCloudHandler) SyncTreeCloudResource(ctx *gin.Context) { var req model.SyncTreeCloudResourceReq // 获取当前用户信息 - uc := ctx.MustGet("user").(utils.UserClaims) + uc := ctx.MustGet("user").(jwt.UserClaims) req.OperatorID = uc.Uid req.OperatorName = uc.Username - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return h.service.SyncTreeCloudResource(ctx, &req) }) } @@ -185,7 +186,7 @@ func (h *TreeCloudHandler) SyncTreeCloudResource(ctx *gin.Context) { func (h *TreeCloudHandler) GetSyncHistory(ctx *gin.Context) { var req model.GetCloudResourceSyncHistoryReq - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return h.service.GetSyncHistory(ctx, &req) }) } @@ -194,7 +195,7 @@ func (h *TreeCloudHandler) GetSyncHistory(ctx *gin.Context) { func (h *TreeCloudHandler) GetChangeLog(ctx *gin.Context) { var req model.GetCloudResourceChangeLogReq - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return h.service.GetChangeLog(ctx, &req) }) } @@ -203,15 +204,15 @@ func (h *TreeCloudHandler) GetChangeLog(ctx *gin.Context) { func (h *TreeCloudHandler) GetTreeNodeCloudResources(ctx *gin.Context) { var req model.GetTreeNodeCloudResourcesReq - nodeId, err := utils.GetParamID(ctx) + nodeId, err := base.GetParamID(ctx) if err != nil { - utils.ErrorWithMessage(ctx, "无效的节点ID") + base.ErrorWithMessage(ctx, "无效的节点ID") return } req.NodeID = nodeId - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return h.service.GetTreeNodeCloudResources(ctx, &req) }) } @@ -220,13 +221,13 @@ func (h *TreeCloudHandler) GetTreeNodeCloudResources(ctx *gin.Context) { func (h *TreeCloudHandler) ConnectCloudResourceTerminal(ctx *gin.Context) { var req model.ConnectTreeCloudResourceTerminalReq - id, err := utils.GetParamID(ctx) + id, err := base.GetParamID(ctx) if err != nil { - utils.ErrorWithMessage(ctx, "无效的资源ID") + base.ErrorWithMessage(ctx, "无效的资源ID") return } - uc := ctx.MustGet("user").(utils.UserClaims) + uc := ctx.MustGet("user").(jwt.UserClaims) req.ID = id req.UserID = uc.Uid @@ -234,13 +235,13 @@ func (h *TreeCloudHandler) ConnectCloudResourceTerminal(ctx *gin.Context) { detailReq := &model.GetTreeCloudResourceDetailReq{ID: req.ID} cloud, err := h.service.GetTreeCloudResourceForConnection(ctx, detailReq) if err != nil { - utils.ErrorWithMessage(ctx, "获取云资源信息失败: "+err.Error()) + base.ErrorWithMessage(ctx, "获取云资源信息失败: "+err.Error()) return } // 仅支持ECS类型的云资源连接终端 if cloud.ResourceType != model.ResourceTypeECS { - utils.ErrorWithMessage(ctx, "仅支持ECS类型的云资源连接终端") + base.ErrorWithMessage(ctx, "仅支持ECS类型的云资源连接终端") return } @@ -251,7 +252,7 @@ func (h *TreeCloudHandler) ConnectCloudResourceTerminal(ctx *gin.Context) { } if ipAddr == "" { - utils.ErrorWithMessage(ctx, "云资源没有可用的IP地址") + base.ErrorWithMessage(ctx, "云资源没有可用的IP地址") return } @@ -280,28 +281,28 @@ func (h *TreeCloudHandler) ConnectCloudResourceTerminal(ctx *gin.Context) { // 建立SSH连接 if err := h.sshClient.Connect(sshConfig); err != nil { - utils.ErrorWithMessage(ctx, "连接SSH失败: "+err.Error()) + base.ErrorWithMessage(ctx, "连接SSH失败: "+err.Error()) return } // 确保SSH连接在函数退出时关闭 defer func() { if closeErr := h.sshClient.Close(); closeErr != nil { - utils.ErrorWithMessage(ctx, "关闭SSH连接失败: "+closeErr.Error()) + base.ErrorWithMessage(ctx, "关闭SSH连接失败: "+closeErr.Error()) } }() // 升级WebSocket连接 - ws, err := utils.UpGrader.Upgrade(ctx.Writer, ctx.Request, nil) + ws, err := ssh.UpGrader.Upgrade(ctx.Writer, ctx.Request, nil) if err != nil { - utils.ErrorWithMessage(ctx, "升级WebSocket连接失败: "+err.Error()) + base.ErrorWithMessage(ctx, "升级WebSocket连接失败: "+err.Error()) return } defer ws.Close() // 启动终端会话 if err := h.sshClient.WebTerminal(uc.Uid, ws); err != nil { - utils.ErrorWithMessage(ctx, "启动Web终端失败: "+err.Error()) + base.ErrorWithMessage(ctx, "启动Web终端失败: "+err.Error()) return } } @@ -310,15 +311,15 @@ func (h *TreeCloudHandler) ConnectCloudResourceTerminal(ctx *gin.Context) { func (h *TreeCloudHandler) UpdateCloudResourceStatus(ctx *gin.Context) { var req model.UpdateCloudResourceStatusReq - id, err := utils.GetParamID(ctx) + id, err := base.GetParamID(ctx) if err != nil { - utils.ErrorWithMessage(ctx, "无效的资源ID") + base.ErrorWithMessage(ctx, "无效的资源ID") return } req.ID = id - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return nil, h.service.UpdateCloudResourceStatus(ctx, &req) }) } @@ -328,11 +329,11 @@ func (h *TreeCloudHandler) BatchDeleteTreeCloudResource(ctx *gin.Context) { var req model.BatchDeleteTreeCloudResourceReq // 获取当前用户信息 - uc := ctx.MustGet("user").(utils.UserClaims) + uc := ctx.MustGet("user").(jwt.UserClaims) req.OperatorID = uc.Uid req.OperatorName = uc.Username - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return nil, h.service.BatchDeleteTreeCloudResource(ctx, &req) }) } @@ -342,11 +343,11 @@ func (h *TreeCloudHandler) BatchUpdateCloudResourceStatus(ctx *gin.Context) { var req model.BatchUpdateCloudResourceStatusReq // 获取当前用户信息 - uc := ctx.MustGet("user").(utils.UserClaims) + uc := ctx.MustGet("user").(jwt.UserClaims) req.OperatorID = uc.Uid req.OperatorName = uc.Username - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return nil, h.service.BatchUpdateCloudResourceStatus(ctx, &req) }) } diff --git a/internal/tree/api/tree_local_handler.go b/internal/tree/api/tree_local_handler.go index ebef9422..3201e697 100644 --- a/internal/tree/api/tree_local_handler.go +++ b/internal/tree/api/tree_local_handler.go @@ -28,8 +28,9 @@ package api import ( "github.com/GoSimplicity/AI-CloudOps/internal/model" "github.com/GoSimplicity/AI-CloudOps/internal/tree/service" + "github.com/GoSimplicity/AI-CloudOps/pkg/base" + "github.com/GoSimplicity/AI-CloudOps/pkg/jwt" "github.com/GoSimplicity/AI-CloudOps/pkg/ssh" - "github.com/GoSimplicity/AI-CloudOps/pkg/utils" "github.com/gin-gonic/gin" ) @@ -63,7 +64,7 @@ func (h *TreeLocalHandler) RegisterRouters(server *gin.Engine) { func (h *TreeLocalHandler) GetTreeLocalList(ctx *gin.Context) { var req model.GetTreeLocalResourceListReq - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return h.service.GetTreeLocalList(ctx, &req) }) } @@ -72,15 +73,15 @@ func (h *TreeLocalHandler) GetTreeLocalList(ctx *gin.Context) { func (h *TreeLocalHandler) GetTreeLocalDetail(ctx *gin.Context) { var req model.GetTreeLocalResourceDetailReq - id, err := utils.GetParamID(ctx) + id, err := base.GetParamID(ctx) if err != nil { - utils.ErrorWithMessage(ctx, "无效的资源ID") + base.ErrorWithMessage(ctx, "无效的资源ID") return } req.ID = id - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return h.service.GetTreeLocalDetail(ctx, &req) }) } @@ -89,12 +90,12 @@ func (h *TreeLocalHandler) GetTreeLocalDetail(ctx *gin.Context) { func (h *TreeLocalHandler) CreateTreeLocal(ctx *gin.Context) { var req model.CreateTreeLocalResourceReq - user := ctx.MustGet("user").(utils.UserClaims) + user := ctx.MustGet("user").(jwt.UserClaims) req.CreateUserID = user.Uid req.CreateUserName = user.Username - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return nil, h.service.CreateTreeLocal(ctx, &req) }) } @@ -103,15 +104,15 @@ func (h *TreeLocalHandler) CreateTreeLocal(ctx *gin.Context) { func (h *TreeLocalHandler) UpdateTreeLocal(ctx *gin.Context) { var req model.UpdateTreeLocalResourceReq - id, err := utils.GetParamID(ctx) + id, err := base.GetParamID(ctx) if err != nil { - utils.ErrorWithMessage(ctx, "无效的资源ID") + base.ErrorWithMessage(ctx, "无效的资源ID") return } req.ID = id - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return nil, h.service.UpdateTreeLocal(ctx, &req) }) } @@ -120,15 +121,15 @@ func (h *TreeLocalHandler) UpdateTreeLocal(ctx *gin.Context) { func (h *TreeLocalHandler) DeleteTreeLocal(ctx *gin.Context) { var req model.DeleteTreeLocalResourceReq - id, err := utils.GetParamID(ctx) + id, err := base.GetParamID(ctx) if err != nil { - utils.ErrorWithMessage(ctx, "无效的资源ID") + base.ErrorWithMessage(ctx, "无效的资源ID") return } req.ID = id - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return nil, h.service.DeleteTreeLocal(ctx, &req) }) } @@ -137,24 +138,24 @@ func (h *TreeLocalHandler) DeleteTreeLocal(ctx *gin.Context) { func (h *TreeLocalHandler) ConnectTerminal(ctx *gin.Context) { var req model.GetTreeLocalResourceDetailReq - id, err := utils.GetParamID(ctx) + id, err := base.GetParamID(ctx) if err != nil { - utils.ErrorWithMessage(ctx, "无效的资源ID") + base.ErrorWithMessage(ctx, "无效的资源ID") return } - uc := ctx.MustGet("user").(utils.UserClaims) + uc := ctx.MustGet("user").(jwt.UserClaims) req.ID = id ld, err := h.service.GetTreeLocalForConnection(ctx, &req) if err != nil { - utils.ErrorWithMessage(ctx, "获取主机信息失败: "+err.Error()) + base.ErrorWithMessage(ctx, "获取主机信息失败: "+err.Error()) return } defer func() { if closeErr := h.sshClient.Close(); closeErr != nil { - utils.ErrorWithMessage(ctx, "关闭SSH连接失败: "+closeErr.Error()) + base.ErrorWithMessage(ctx, "关闭SSH连接失败: "+closeErr.Error()) } }() @@ -171,21 +172,21 @@ func (h *TreeLocalHandler) ConnectTerminal(ctx *gin.Context) { // 建立SSH连接 if err := h.sshClient.Connect(sshConfig); err != nil { - utils.ErrorWithMessage(ctx, "连接SSH失败: "+err.Error()) + base.ErrorWithMessage(ctx, "连接SSH失败: "+err.Error()) return } // 升级WebSocket连接 - ws, err := utils.UpGrader.Upgrade(ctx.Writer, ctx.Request, nil) + ws, err := ssh.UpGrader.Upgrade(ctx.Writer, ctx.Request, nil) if err != nil { - utils.ErrorWithMessage(ctx, "升级WebSocket连接失败: "+err.Error()) + base.ErrorWithMessage(ctx, "升级WebSocket连接失败: "+err.Error()) return } defer ws.Close() // 启动终端会话 if err := h.sshClient.WebTerminal(uc.Uid, ws); err != nil { - utils.ErrorWithMessage(ctx, "启动Web终端失败: "+err.Error()) + base.ErrorWithMessage(ctx, "启动Web终端失败: "+err.Error()) return } } @@ -194,15 +195,15 @@ func (h *TreeLocalHandler) ConnectTerminal(ctx *gin.Context) { func (h *TreeLocalHandler) BindTreeLocal(ctx *gin.Context) { var req model.BindTreeLocalResourceReq - id, err := utils.GetParamID(ctx) + id, err := base.GetParamID(ctx) if err != nil { - utils.ErrorWithMessage(ctx, "无效的资源ID") + base.ErrorWithMessage(ctx, "无效的资源ID") return } req.ID = id - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return nil, h.service.BindTreeLocal(ctx, &req) }) @@ -212,15 +213,15 @@ func (h *TreeLocalHandler) BindTreeLocal(ctx *gin.Context) { func (h *TreeLocalHandler) UnbindTreeLocal(ctx *gin.Context) { var req model.UnBindTreeLocalResourceReq - id, err := utils.GetParamID(ctx) + id, err := base.GetParamID(ctx) if err != nil { - utils.ErrorWithMessage(ctx, "无效的资源ID") + base.ErrorWithMessage(ctx, "无效的资源ID") return } req.ID = id - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return nil, h.service.UnBindLocalResource(ctx, &req) }) } diff --git a/internal/tree/api/tree_node_handler.go b/internal/tree/api/tree_node_handler.go index 3fe743d3..83121370 100644 --- a/internal/tree/api/tree_node_handler.go +++ b/internal/tree/api/tree_node_handler.go @@ -28,7 +28,8 @@ package api import ( "github.com/GoSimplicity/AI-CloudOps/internal/model" "github.com/GoSimplicity/AI-CloudOps/internal/tree/service" - "github.com/GoSimplicity/AI-CloudOps/pkg/utils" + "github.com/GoSimplicity/AI-CloudOps/pkg/base" + "github.com/GoSimplicity/AI-CloudOps/pkg/jwt" "github.com/gin-gonic/gin" ) @@ -70,19 +71,19 @@ func (h *TreeNodeHandler) RegisterRouters(server *gin.Engine) { // GetChildNodes 获取直接子节点列表 func (h *TreeNodeHandler) GetChildNodes(ctx *gin.Context) { - id, err := utils.GetParamID(ctx) + id, err := base.GetParamID(ctx) if err != nil { - utils.ErrorWithMessage(ctx, "无效的父节点ID") + base.ErrorWithMessage(ctx, "无效的父节点ID") return } - utils.HandleRequest(ctx, nil, func() (interface{}, error) { + base.HandleRequest(ctx, nil, func() (interface{}, error) { return h.service.GetChildNodes(ctx, id) }) } // GetTreeStatistics 获取服务树统计信息 func (h *TreeNodeHandler) GetTreeStatistics(ctx *gin.Context) { - utils.HandleRequest(ctx, nil, func() (interface{}, error) { + base.HandleRequest(ctx, nil, func() (interface{}, error) { return h.service.GetTreeStatistics(ctx) }) } @@ -91,7 +92,7 @@ func (h *TreeNodeHandler) GetTreeStatistics(ctx *gin.Context) { func (h *TreeNodeHandler) GetTreeList(ctx *gin.Context) { var req model.GetTreeNodeListReq - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return h.service.GetTreeList(ctx, &req) }) } @@ -99,14 +100,14 @@ func (h *TreeNodeHandler) GetTreeList(ctx *gin.Context) { // GetNodeDetail 获取节点详情 func (h *TreeNodeHandler) GetNodeDetail(ctx *gin.Context) { var req model.GetTreeNodeDetailReq - id, err := utils.GetParamID(ctx) + id, err := base.GetParamID(ctx) if err != nil { - utils.ErrorWithMessage(ctx, "无效的节点ID") + base.ErrorWithMessage(ctx, "无效的节点ID") return } req.ID = id - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return h.service.GetNodeDetail(ctx, req.ID) }) } @@ -115,12 +116,12 @@ func (h *TreeNodeHandler) GetNodeDetail(ctx *gin.Context) { func (h *TreeNodeHandler) CreateNode(ctx *gin.Context) { var req model.CreateTreeNodeReq - user := ctx.MustGet("user").(utils.UserClaims) + user := ctx.MustGet("user").(jwt.UserClaims) req.CreateUserID = user.Uid req.CreateUserName = user.Username - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return nil, h.service.CreateNode(ctx, &req) }) } @@ -129,14 +130,14 @@ func (h *TreeNodeHandler) CreateNode(ctx *gin.Context) { func (h *TreeNodeHandler) UpdateNode(ctx *gin.Context) { var req model.UpdateTreeNodeReq - id, err := utils.GetParamID(ctx) + id, err := base.GetParamID(ctx) if err != nil { - utils.ErrorWithMessage(ctx, "无效的节点ID") + base.ErrorWithMessage(ctx, "无效的节点ID") return } req.ID = id - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return nil, h.service.UpdateNode(ctx, &req) }) } @@ -145,14 +146,14 @@ func (h *TreeNodeHandler) UpdateNode(ctx *gin.Context) { func (h *TreeNodeHandler) DeleteNode(ctx *gin.Context) { var req model.DeleteTreeNodeReq - id, err := utils.GetParamID(ctx) + id, err := base.GetParamID(ctx) if err != nil { - utils.ErrorWithMessage(ctx, "无效的节点ID") + base.ErrorWithMessage(ctx, "无效的节点ID") return } req.ID = id - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return nil, h.service.DeleteNode(ctx, req.ID) }) } @@ -161,14 +162,14 @@ func (h *TreeNodeHandler) DeleteNode(ctx *gin.Context) { func (h *TreeNodeHandler) MoveNode(ctx *gin.Context) { var req model.MoveTreeNodeReq - id, err := utils.GetParamID(ctx) + id, err := base.GetParamID(ctx) if err != nil { - utils.ErrorWithMessage(ctx, "无效的节点ID") + base.ErrorWithMessage(ctx, "无效的节点ID") return } req.ID = id - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return nil, h.service.MoveNode(ctx, req.ID, req.NewParentID) }) } @@ -177,14 +178,14 @@ func (h *TreeNodeHandler) MoveNode(ctx *gin.Context) { func (h *TreeNodeHandler) GetNodeMembers(ctx *gin.Context) { var req model.GetTreeNodeMembersReq - id, err := utils.GetParamID(ctx) + id, err := base.GetParamID(ctx) if err != nil { - utils.ErrorWithMessage(ctx, "无效的节点ID") + base.ErrorWithMessage(ctx, "无效的节点ID") return } req.ID = id - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { // 将数值型的成员类型映射为服务层使用的语义化字符串 memberType := "all" switch req.Type { @@ -203,7 +204,7 @@ func (h *TreeNodeHandler) GetNodeMembers(ctx *gin.Context) { func (h *TreeNodeHandler) AddNodeMember(ctx *gin.Context) { var req model.AddTreeNodeMemberReq - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return nil, h.service.AddNodeMember(ctx, &req) }) } @@ -212,15 +213,15 @@ func (h *TreeNodeHandler) AddNodeMember(ctx *gin.Context) { func (h *TreeNodeHandler) RemoveNodeMember(ctx *gin.Context) { var req model.RemoveTreeNodeMemberReq - id, err := utils.GetParamID(ctx) + id, err := base.GetParamID(ctx) if err != nil { - utils.ErrorWithMessage(ctx, "无效的节点ID") + base.ErrorWithMessage(ctx, "无效的节点ID") return } req.NodeID = id - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return nil, h.service.RemoveNodeMember(ctx, &req) }) } @@ -229,7 +230,7 @@ func (h *TreeNodeHandler) RemoveNodeMember(ctx *gin.Context) { func (h *TreeNodeHandler) BindResource(ctx *gin.Context) { var req model.BindTreeNodeResourceReq - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return nil, h.service.BindResource(ctx, &req) }) } @@ -238,7 +239,7 @@ func (h *TreeNodeHandler) BindResource(ctx *gin.Context) { func (h *TreeNodeHandler) UnbindResource(ctx *gin.Context) { var req model.UnbindTreeNodeResourceReq - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return nil, h.service.UnbindResource(ctx, &req) }) } diff --git a/internal/tree/service/tree_node_service.go b/internal/tree/service/tree_node_service.go index 4151c827..5f17584a 100644 --- a/internal/tree/service/tree_node_service.go +++ b/internal/tree/service/tree_node_service.go @@ -31,9 +31,9 @@ import ( "strings" "github.com/GoSimplicity/AI-CloudOps/internal/model" + userDao "github.com/GoSimplicity/AI-CloudOps/internal/system/dao" "github.com/GoSimplicity/AI-CloudOps/internal/tree/dao" treeUtils "github.com/GoSimplicity/AI-CloudOps/internal/tree/utils" - userDao "github.com/GoSimplicity/AI-CloudOps/internal/user/dao" "go.uber.org/zap" ) diff --git a/internal/tree/utils/common_util.go b/internal/tree/utils/common_util.go index 32c1323f..b6f8cdd1 100644 --- a/internal/tree/utils/common_util.go +++ b/internal/tree/utils/common_util.go @@ -31,7 +31,7 @@ import ( "fmt" "github.com/GoSimplicity/AI-CloudOps/internal/model" - pkgUtils "github.com/GoSimplicity/AI-CloudOps/pkg/utils" + pkgUtils "github.com/GoSimplicity/AI-CloudOps/pkg/base" "github.com/spf13/viper" "go.uber.org/zap" ) diff --git a/internal/workorder/api/category_group.go b/internal/workorder/api/category_group.go index 43c5b57a..95d3b63a 100644 --- a/internal/workorder/api/category_group.go +++ b/internal/workorder/api/category_group.go @@ -28,7 +28,8 @@ package api import ( "github.com/GoSimplicity/AI-CloudOps/internal/model" "github.com/GoSimplicity/AI-CloudOps/internal/workorder/service" - "github.com/GoSimplicity/AI-CloudOps/pkg/utils" + "github.com/GoSimplicity/AI-CloudOps/pkg/base" + "github.com/GoSimplicity/AI-CloudOps/pkg/jwt" "github.com/gin-gonic/gin" ) @@ -57,12 +58,12 @@ func (h *CategoryGroupHandler) RegisterRouters(server *gin.Engine) { func (h *CategoryGroupHandler) CreateCategory(ctx *gin.Context) { var req model.CreateWorkorderCategoryReq - user := ctx.MustGet("user").(utils.UserClaims) + user := ctx.MustGet("user").(jwt.UserClaims) req.OperatorID = user.Uid req.OperatorName = user.Username - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return nil, h.service.CreateCategory(ctx, &req) }) } @@ -71,14 +72,14 @@ func (h *CategoryGroupHandler) CreateCategory(ctx *gin.Context) { func (h *CategoryGroupHandler) UpdateCategory(ctx *gin.Context) { var req model.UpdateWorkorderCategoryReq - id, err := utils.GetParamID(ctx) + id, err := base.GetParamID(ctx) if err != nil { return } req.ID = id - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return nil, h.service.UpdateCategory(ctx, &req) }) } @@ -87,14 +88,14 @@ func (h *CategoryGroupHandler) UpdateCategory(ctx *gin.Context) { func (h *CategoryGroupHandler) DeleteCategory(ctx *gin.Context) { var req model.DeleteWorkorderCategoryReq - id, err := utils.GetParamID(ctx) + id, err := base.GetParamID(ctx) if err != nil { return } req.ID = id - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return nil, h.service.DeleteCategory(ctx, req.ID) }) } @@ -102,7 +103,7 @@ func (h *CategoryGroupHandler) DeleteCategory(ctx *gin.Context) { // ListCategory 获取工单分类列表 func (h *CategoryGroupHandler) ListCategory(ctx *gin.Context) { var req model.ListWorkorderCategoryReq - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return h.service.ListCategory(ctx, req) }) } @@ -111,14 +112,14 @@ func (h *CategoryGroupHandler) ListCategory(ctx *gin.Context) { func (h *CategoryGroupHandler) DetailCategory(ctx *gin.Context) { var req model.DetailWorkorderCategoryReq - id, err := utils.GetParamID(ctx) + id, err := base.GetParamID(ctx) if err != nil { return } req.ID = id - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return h.service.GetCategory(ctx, req.ID) }) } diff --git a/internal/workorder/api/form_design.go b/internal/workorder/api/form_design.go index c05cfc33..6434dc0c 100644 --- a/internal/workorder/api/form_design.go +++ b/internal/workorder/api/form_design.go @@ -28,7 +28,8 @@ package api import ( "github.com/GoSimplicity/AI-CloudOps/internal/model" "github.com/GoSimplicity/AI-CloudOps/internal/workorder/service" - "github.com/GoSimplicity/AI-CloudOps/pkg/utils" + "github.com/GoSimplicity/AI-CloudOps/pkg/base" + "github.com/GoSimplicity/AI-CloudOps/pkg/jwt" "github.com/gin-gonic/gin" ) @@ -57,12 +58,12 @@ func (h *FormDesignHandler) RegisterRouters(server *gin.Engine) { func (h *FormDesignHandler) CreateFormDesign(ctx *gin.Context) { var req model.CreateWorkorderFormDesignReq - user := ctx.MustGet("user").(utils.UserClaims) + user := ctx.MustGet("user").(jwt.UserClaims) req.OperatorID = user.Uid req.OperatorName = user.Username - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return nil, h.service.CreateFormDesign(ctx, &req) }) } @@ -71,13 +72,13 @@ func (h *FormDesignHandler) CreateFormDesign(ctx *gin.Context) { func (h *FormDesignHandler) UpdateFormDesign(ctx *gin.Context) { var req model.UpdateWorkorderFormDesignReq - id, err := utils.GetParamID(ctx) + id, err := base.GetParamID(ctx) if err != nil { return } req.ID = id - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return nil, h.service.UpdateFormDesign(ctx, &req) }) } @@ -86,13 +87,13 @@ func (h *FormDesignHandler) UpdateFormDesign(ctx *gin.Context) { func (h *FormDesignHandler) DeleteFormDesign(ctx *gin.Context) { var req model.DeleteWorkorderFormDesignReq - id, err := utils.GetParamID(ctx) + id, err := base.GetParamID(ctx) if err != nil { return } req.ID = id - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return nil, h.service.DeleteFormDesign(ctx, req.ID) }) } @@ -101,7 +102,7 @@ func (h *FormDesignHandler) DeleteFormDesign(ctx *gin.Context) { func (h *FormDesignHandler) ListFormDesign(ctx *gin.Context) { var req model.ListWorkorderFormDesignReq - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return h.service.ListFormDesign(ctx, &req) }) } @@ -110,13 +111,13 @@ func (h *FormDesignHandler) ListFormDesign(ctx *gin.Context) { func (h *FormDesignHandler) DetailFormDesign(ctx *gin.Context) { var req model.DetailWorkorderFormDesignReq - id, err := utils.GetParamID(ctx) + id, err := base.GetParamID(ctx) if err != nil { return } req.ID = id - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return h.service.GetFormDesign(ctx, req.ID) }) } diff --git a/internal/workorder/api/instance.go b/internal/workorder/api/instance.go index ff2d8113..6d956593 100644 --- a/internal/workorder/api/instance.go +++ b/internal/workorder/api/instance.go @@ -28,7 +28,8 @@ package api import ( "github.com/GoSimplicity/AI-CloudOps/internal/model" "github.com/GoSimplicity/AI-CloudOps/internal/workorder/service" - "github.com/GoSimplicity/AI-CloudOps/pkg/utils" + "github.com/GoSimplicity/AI-CloudOps/pkg/base" + "github.com/GoSimplicity/AI-CloudOps/pkg/jwt" "github.com/gin-gonic/gin" ) @@ -66,12 +67,12 @@ func (h *InstanceHandler) RegisterRouters(server *gin.Engine) { // CreateInstance 创建工单实例 func (h *InstanceHandler) CreateInstance(ctx *gin.Context) { var req model.CreateWorkorderInstanceReq - user := ctx.MustGet("user").(utils.UserClaims) + user := ctx.MustGet("user").(jwt.UserClaims) req.OperatorID = user.Uid req.OperatorName = user.Username - utils.HandleRequest(ctx, &req, func() (any, error) { + base.HandleRequest(ctx, &req, func() (any, error) { return nil, h.service.CreateInstance(ctx, &req) }) } @@ -79,18 +80,18 @@ func (h *InstanceHandler) CreateInstance(ctx *gin.Context) { // CreateInstanceFromTemplate 从模板创建工单实例 func (h *InstanceHandler) CreateInstanceFromTemplate(ctx *gin.Context) { var req model.CreateWorkorderInstanceFromTemplateReq - user := ctx.MustGet("user").(utils.UserClaims) + user := ctx.MustGet("user").(jwt.UserClaims) - templateID, err := utils.GetParamID(ctx) + templateID, err := base.GetParamID(ctx) if err != nil { - utils.ErrorWithMessage(ctx, "无效的模板ID") + base.ErrorWithMessage(ctx, "无效的模板ID") return } req.OperatorID = user.Uid req.OperatorName = user.Username - utils.HandleRequest(ctx, &req, func() (any, error) { + base.HandleRequest(ctx, &req, func() (any, error) { return nil, h.service.CreateInstanceFromTemplate(ctx, templateID, &req) }) } @@ -99,41 +100,41 @@ func (h *InstanceHandler) CreateInstanceFromTemplate(ctx *gin.Context) { func (h *InstanceHandler) UpdateInstance(ctx *gin.Context) { var req model.UpdateWorkorderInstanceReq - id, err := utils.GetParamID(ctx) + id, err := base.GetParamID(ctx) if err != nil { - utils.ErrorWithMessage(ctx, "无效的工单ID") + base.ErrorWithMessage(ctx, "无效的工单ID") return } req.ID = id - utils.HandleRequest(ctx, &req, func() (any, error) { + base.HandleRequest(ctx, &req, func() (any, error) { return nil, h.service.UpdateInstance(ctx, &req) }) } // DeleteInstance 删除工单实例 func (h *InstanceHandler) DeleteInstance(ctx *gin.Context) { - id, err := utils.GetParamID(ctx) + id, err := base.GetParamID(ctx) if err != nil { - utils.ErrorWithMessage(ctx, "无效的工单ID") + base.ErrorWithMessage(ctx, "无效的工单ID") return } - utils.HandleRequest(ctx, nil, func() (any, error) { + base.HandleRequest(ctx, nil, func() (any, error) { return nil, h.service.DeleteInstance(ctx, id) }) } // DetailInstance 获取工单实例详情 func (h *InstanceHandler) DetailInstance(ctx *gin.Context) { - id, err := utils.GetParamID(ctx) + id, err := base.GetParamID(ctx) if err != nil { - utils.ErrorWithMessage(ctx, "无效的工单ID") + base.ErrorWithMessage(ctx, "无效的工单ID") return } - utils.HandleRequest(ctx, nil, func() (any, error) { + base.HandleRequest(ctx, nil, func() (any, error) { return h.service.GetInstance(ctx, id) }) } @@ -142,7 +143,7 @@ func (h *InstanceHandler) DetailInstance(ctx *gin.Context) { func (h *InstanceHandler) ListInstance(ctx *gin.Context) { var req model.ListWorkorderInstanceReq - utils.HandleRequest(ctx, &req, func() (any, error) { + base.HandleRequest(ctx, &req, func() (any, error) { return h.service.ListInstance(ctx, &req) }) } @@ -151,16 +152,16 @@ func (h *InstanceHandler) ListInstance(ctx *gin.Context) { func (h *InstanceHandler) SubmitInstance(ctx *gin.Context) { var req model.SubmitWorkorderInstanceReq - id, err := utils.GetParamID(ctx) + id, err := base.GetParamID(ctx) if err != nil { - utils.ErrorWithMessage(ctx, "无效的工单ID") + base.ErrorWithMessage(ctx, "无效的工单ID") return } req.ID = id - user := ctx.MustGet("user").(utils.UserClaims) + user := ctx.MustGet("user").(jwt.UserClaims) - utils.HandleRequest(ctx, &req, func() (any, error) { + base.HandleRequest(ctx, &req, func() (any, error) { return nil, h.service.SubmitInstance(ctx, req.ID, user.Uid, user.Username) }) } @@ -169,16 +170,16 @@ func (h *InstanceHandler) SubmitInstance(ctx *gin.Context) { func (h *InstanceHandler) AssignInstance(ctx *gin.Context) { var req model.AssignWorkorderInstanceReq - id, err := utils.GetParamID(ctx) + id, err := base.GetParamID(ctx) if err != nil { - utils.ErrorWithMessage(ctx, "无效的工单ID") + base.ErrorWithMessage(ctx, "无效的工单ID") return } req.ID = id - user := ctx.MustGet("user").(utils.UserClaims) + user := ctx.MustGet("user").(jwt.UserClaims) - utils.HandleRequest(ctx, &req, func() (any, error) { + base.HandleRequest(ctx, &req, func() (any, error) { return nil, h.service.AssignInstance(ctx, req.ID, req.AssigneeID, user.Uid, user.Username) }) } @@ -187,16 +188,16 @@ func (h *InstanceHandler) AssignInstance(ctx *gin.Context) { func (h *InstanceHandler) ApproveInstance(ctx *gin.Context) { var req model.ApproveWorkorderInstanceReq - id, err := utils.GetParamID(ctx) + id, err := base.GetParamID(ctx) if err != nil { - utils.ErrorWithMessage(ctx, "无效的工单ID") + base.ErrorWithMessage(ctx, "无效的工单ID") return } req.ID = id - user := ctx.MustGet("user").(utils.UserClaims) + user := ctx.MustGet("user").(jwt.UserClaims) - utils.HandleRequest(ctx, &req, func() (any, error) { + base.HandleRequest(ctx, &req, func() (any, error) { return nil, h.service.ApproveInstance(ctx, req.ID, user.Uid, user.Username, req.Comment) }) } @@ -205,16 +206,16 @@ func (h *InstanceHandler) ApproveInstance(ctx *gin.Context) { func (h *InstanceHandler) RejectInstance(ctx *gin.Context) { var req model.RejectWorkorderInstanceReq - id, err := utils.GetParamID(ctx) + id, err := base.GetParamID(ctx) if err != nil { - utils.ErrorWithMessage(ctx, "无效的工单ID") + base.ErrorWithMessage(ctx, "无效的工单ID") return } req.ID = id - user := ctx.MustGet("user").(utils.UserClaims) + user := ctx.MustGet("user").(jwt.UserClaims) - utils.HandleRequest(ctx, &req, func() (any, error) { + base.HandleRequest(ctx, &req, func() (any, error) { return nil, h.service.RejectInstance(ctx, req.ID, user.Uid, user.Username, req.Comment) }) } @@ -223,16 +224,16 @@ func (h *InstanceHandler) RejectInstance(ctx *gin.Context) { func (h *InstanceHandler) CancelInstance(ctx *gin.Context) { var req model.CancelWorkorderInstanceReq - id, err := utils.GetParamID(ctx) + id, err := base.GetParamID(ctx) if err != nil { - utils.ErrorWithMessage(ctx, "无效的工单ID") + base.ErrorWithMessage(ctx, "无效的工单ID") return } req.ID = id - user := ctx.MustGet("user").(utils.UserClaims) + user := ctx.MustGet("user").(jwt.UserClaims) - utils.HandleRequest(ctx, &req, func() (any, error) { + base.HandleRequest(ctx, &req, func() (any, error) { return nil, h.service.CancelInstance(ctx, req.ID, user.Uid, user.Username, req.Comment) }) } @@ -241,16 +242,16 @@ func (h *InstanceHandler) CancelInstance(ctx *gin.Context) { func (h *InstanceHandler) CompleteInstance(ctx *gin.Context) { var req model.CompleteWorkorderInstanceReq - id, err := utils.GetParamID(ctx) + id, err := base.GetParamID(ctx) if err != nil { - utils.ErrorWithMessage(ctx, "无效的工单ID") + base.ErrorWithMessage(ctx, "无效的工单ID") return } req.ID = id - user := ctx.MustGet("user").(utils.UserClaims) + user := ctx.MustGet("user").(jwt.UserClaims) - utils.HandleRequest(ctx, &req, func() (any, error) { + base.HandleRequest(ctx, &req, func() (any, error) { return nil, h.service.CompleteInstance(ctx, req.ID, user.Uid, user.Username, req.Comment) }) } @@ -259,16 +260,16 @@ func (h *InstanceHandler) CompleteInstance(ctx *gin.Context) { func (h *InstanceHandler) ReturnInstance(ctx *gin.Context) { var req model.ReturnWorkorderInstanceReq - id, err := utils.GetParamID(ctx) + id, err := base.GetParamID(ctx) if err != nil { - utils.ErrorWithMessage(ctx, "无效的工单ID") + base.ErrorWithMessage(ctx, "无效的工单ID") return } req.ID = id - user := ctx.MustGet("user").(utils.UserClaims) + user := ctx.MustGet("user").(jwt.UserClaims) - utils.HandleRequest(ctx, &req, func() (any, error) { + base.HandleRequest(ctx, &req, func() (any, error) { return nil, h.service.ReturnInstance(ctx, req.ID, user.Uid, user.Username, req.Comment) }) } @@ -276,17 +277,17 @@ func (h *InstanceHandler) ReturnInstance(ctx *gin.Context) { // GetAvailableActions 获取可执行动作 func (h *InstanceHandler) GetAvailableActions(ctx *gin.Context) { var req model.GetAvailableActionsReq - id, err := utils.GetParamID(ctx) + id, err := base.GetParamID(ctx) if err != nil { - utils.ErrorWithMessage(ctx, "无效的工单ID") + base.ErrorWithMessage(ctx, "无效的工单ID") return } req.ID = id - user := ctx.MustGet("user").(utils.UserClaims) + user := ctx.MustGet("user").(jwt.UserClaims) - utils.HandleRequest(ctx, nil, func() (any, error) { + base.HandleRequest(ctx, nil, func() (any, error) { return h.service.GetAvailableActions(ctx, req.ID, user.Uid) }) } @@ -294,15 +295,15 @@ func (h *InstanceHandler) GetAvailableActions(ctx *gin.Context) { // GetCurrentStep 获取当前步骤 func (h *InstanceHandler) GetCurrentStep(ctx *gin.Context) { var req model.GetCurrentStepReq - id, err := utils.GetParamID(ctx) + id, err := base.GetParamID(ctx) if err != nil { - utils.ErrorWithMessage(ctx, "无效的工单ID") + base.ErrorWithMessage(ctx, "无效的工单ID") return } req.ID = id - utils.HandleRequest(ctx, nil, func() (any, error) { + base.HandleRequest(ctx, nil, func() (any, error) { return h.service.GetCurrentStep(ctx, req.ID) }) } diff --git a/internal/workorder/api/instance_comment.go b/internal/workorder/api/instance_comment.go index 44fabf40..d4f68a1e 100644 --- a/internal/workorder/api/instance_comment.go +++ b/internal/workorder/api/instance_comment.go @@ -28,7 +28,8 @@ package api import ( "github.com/GoSimplicity/AI-CloudOps/internal/model" "github.com/GoSimplicity/AI-CloudOps/internal/workorder/service" - "github.com/GoSimplicity/AI-CloudOps/pkg/utils" + "github.com/GoSimplicity/AI-CloudOps/pkg/base" + "github.com/GoSimplicity/AI-CloudOps/pkg/jwt" "github.com/gin-gonic/gin" ) @@ -58,12 +59,12 @@ func (h *InstanceCommentHandler) RegisterRouters(server *gin.Engine) { // CreateInstanceComment 创建工单评论 func (h *InstanceCommentHandler) CreateInstanceComment(ctx *gin.Context) { var req model.CreateWorkorderInstanceCommentReq - user := ctx.MustGet("user").(utils.UserClaims) + user := ctx.MustGet("user").(jwt.UserClaims) req.OperatorID = user.Uid req.OperatorName = user.Username - utils.HandleRequest(ctx, &req, func() (any, error) { + base.HandleRequest(ctx, &req, func() (any, error) { return nil, h.commentService.CreateInstanceComment(ctx, &req) }) } @@ -73,15 +74,15 @@ func (h *InstanceCommentHandler) CreateInstanceComment(ctx *gin.Context) { func (h *InstanceCommentHandler) UpdateInstanceComment(ctx *gin.Context) { var req model.UpdateWorkorderInstanceCommentReq - id, err := utils.GetParamID(ctx) + id, err := base.GetParamID(ctx) if err != nil { return } req.ID = id - user := ctx.MustGet("user").(utils.UserClaims) + user := ctx.MustGet("user").(jwt.UserClaims) - utils.HandleRequest(ctx, &req, func() (any, error) { + base.HandleRequest(ctx, &req, func() (any, error) { return nil, h.commentService.UpdateInstanceComment(ctx, &req, user.Uid) }) } @@ -89,14 +90,14 @@ func (h *InstanceCommentHandler) UpdateInstanceComment(ctx *gin.Context) { // DeleteInstanceComment 删除工单评论 // DeleteInstanceComment 删除工单评论 func (h *InstanceCommentHandler) DeleteInstanceComment(ctx *gin.Context) { - id, err := utils.GetParamID(ctx) + id, err := base.GetParamID(ctx) if err != nil { return } - user := ctx.MustGet("user").(utils.UserClaims) + user := ctx.MustGet("user").(jwt.UserClaims) - utils.HandleRequest(ctx, nil, func() (any, error) { + base.HandleRequest(ctx, nil, func() (any, error) { return nil, h.commentService.DeleteInstanceComment(ctx, id, user.Uid) }) } @@ -104,12 +105,12 @@ func (h *InstanceCommentHandler) DeleteInstanceComment(ctx *gin.Context) { // GetInstanceComment 获取工单评论详情 // GetInstanceComment 获取工单评论详情 func (h *InstanceCommentHandler) GetInstanceComment(ctx *gin.Context) { - id, err := utils.GetParamID(ctx) + id, err := base.GetParamID(ctx) if err != nil { return } - utils.HandleRequest(ctx, nil, func() (any, error) { + base.HandleRequest(ctx, nil, func() (any, error) { return h.commentService.GetInstanceComment(ctx, id) }) } @@ -119,7 +120,7 @@ func (h *InstanceCommentHandler) GetInstanceComment(ctx *gin.Context) { func (h *InstanceCommentHandler) ListInstanceComments(ctx *gin.Context) { var req model.ListWorkorderInstanceCommentReq - utils.HandleRequest(ctx, &req, func() (any, error) { + base.HandleRequest(ctx, &req, func() (any, error) { return h.commentService.ListInstanceComments(ctx, &req) }) } @@ -129,14 +130,14 @@ func (h *InstanceCommentHandler) ListInstanceComments(ctx *gin.Context) { func (h *InstanceCommentHandler) GetInstanceCommentsTree(ctx *gin.Context) { var req model.GetInstanceCommentsTreeReq - id, err := utils.GetParamID(ctx) + id, err := base.GetParamID(ctx) if err != nil { return } req.ID = id - utils.HandleRequest(ctx, &req, func() (any, error) { + base.HandleRequest(ctx, &req, func() (any, error) { return h.commentService.GetInstanceCommentsTree(ctx, req.ID) }) } diff --git a/internal/workorder/api/instance_flow.go b/internal/workorder/api/instance_flow.go index b248da45..99a6804f 100644 --- a/internal/workorder/api/instance_flow.go +++ b/internal/workorder/api/instance_flow.go @@ -28,7 +28,7 @@ package api import ( "github.com/GoSimplicity/AI-CloudOps/internal/model" "github.com/GoSimplicity/AI-CloudOps/internal/workorder/service" - "github.com/GoSimplicity/AI-CloudOps/pkg/utils" + "github.com/GoSimplicity/AI-CloudOps/pkg/base" "github.com/gin-gonic/gin" ) @@ -55,7 +55,7 @@ func (h *InstanceFlowHandler) RegisterRouters(server *gin.Engine) { func (h *InstanceFlowHandler) ListInstanceFlows(ctx *gin.Context) { var req model.ListWorkorderInstanceFlowReq - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return h.flowService.ListInstanceFlows(ctx, &req) }) } @@ -65,14 +65,14 @@ func (h *InstanceFlowHandler) ListInstanceFlows(ctx *gin.Context) { func (h *InstanceFlowHandler) DetailInstanceFlow(ctx *gin.Context) { var req model.DetailWorkorderInstanceFlowReq - id, err := utils.GetParamID(ctx) + id, err := base.GetParamID(ctx) if err != nil { return } req.ID = id - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return h.flowService.DetailInstanceFlow(ctx, req.ID) }) } diff --git a/internal/workorder/api/instance_time_line.go b/internal/workorder/api/instance_time_line.go index 1a3a3f37..ad40e92e 100644 --- a/internal/workorder/api/instance_time_line.go +++ b/internal/workorder/api/instance_time_line.go @@ -28,7 +28,8 @@ package api import ( "github.com/GoSimplicity/AI-CloudOps/internal/model" "github.com/GoSimplicity/AI-CloudOps/internal/workorder/service" - "github.com/GoSimplicity/AI-CloudOps/pkg/utils" + "github.com/GoSimplicity/AI-CloudOps/pkg/base" + "github.com/GoSimplicity/AI-CloudOps/pkg/jwt" "github.com/gin-gonic/gin" ) @@ -55,9 +56,9 @@ func (h *InstanceTimeLineHandler) RegisterRouters(server *gin.Engine) { // CreateInstanceTimeLine 创建工单时间线记录 func (h *InstanceTimeLineHandler) CreateInstanceTimeLine(ctx *gin.Context) { var req model.CreateWorkorderInstanceTimelineReq - user := ctx.MustGet("user").(utils.UserClaims) + user := ctx.MustGet("user").(jwt.UserClaims) - utils.HandleRequest(ctx, &req, func() (any, error) { + base.HandleRequest(ctx, &req, func() (any, error) { return h.service.CreateInstanceTimeLine(ctx, &req, user.Uid, user.Username) }) } @@ -67,14 +68,14 @@ func (h *InstanceTimeLineHandler) CreateInstanceTimeLine(ctx *gin.Context) { func (h *InstanceTimeLineHandler) DetailInstanceTimeLine(ctx *gin.Context) { var req model.DetailWorkorderInstanceTimelineReq - id, err := utils.GetParamID(ctx) + id, err := base.GetParamID(ctx) if err != nil { return } req.ID = id - utils.HandleRequest(ctx, &req, func() (any, error) { + base.HandleRequest(ctx, &req, func() (any, error) { return h.service.GetInstanceTimeLine(ctx, req.ID) }) } @@ -84,7 +85,7 @@ func (h *InstanceTimeLineHandler) DetailInstanceTimeLine(ctx *gin.Context) { func (h *InstanceTimeLineHandler) ListInstanceTimeLine(ctx *gin.Context) { var req model.ListWorkorderInstanceTimelineReq - utils.HandleRequest(ctx, &req, func() (any, error) { + base.HandleRequest(ctx, &req, func() (any, error) { return h.service.ListInstanceTimeLine(ctx, &req) }) } diff --git a/internal/workorder/api/notification.go b/internal/workorder/api/notification.go index 15b576c7..f70cb6d4 100644 --- a/internal/workorder/api/notification.go +++ b/internal/workorder/api/notification.go @@ -28,7 +28,8 @@ package api import ( "github.com/GoSimplicity/AI-CloudOps/internal/model" "github.com/GoSimplicity/AI-CloudOps/internal/workorder/service" - "github.com/GoSimplicity/AI-CloudOps/pkg/utils" + "github.com/GoSimplicity/AI-CloudOps/pkg/base" + "github.com/GoSimplicity/AI-CloudOps/pkg/jwt" "github.com/gin-gonic/gin" ) @@ -61,10 +62,10 @@ func (h *NotificationHandler) RegisterRouters(server *gin.Engine) { func (h *NotificationHandler) CreateNotification(ctx *gin.Context) { var req model.CreateWorkorderNotificationReq - user := ctx.MustGet("user").(utils.UserClaims) + user := ctx.MustGet("user").(jwt.UserClaims) req.UserID = user.Uid - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return nil, h.service.CreateNotification(ctx, &req) }) @@ -74,15 +75,15 @@ func (h *NotificationHandler) CreateNotification(ctx *gin.Context) { func (h *NotificationHandler) UpdateNotification(ctx *gin.Context) { var req model.UpdateWorkorderNotificationReq - id, err := utils.GetParamID(ctx) + id, err := base.GetParamID(ctx) if err != nil { - utils.ErrorWithMessage(ctx, err.Error()) + base.ErrorWithMessage(ctx, err.Error()) return } req.ID = id - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return nil, h.service.UpdateNotification(ctx, &req) }) } @@ -91,15 +92,15 @@ func (h *NotificationHandler) UpdateNotification(ctx *gin.Context) { func (h *NotificationHandler) DeleteNotification(ctx *gin.Context) { var req model.DeleteWorkorderNotificationReq - id, err := utils.GetParamID(ctx) + id, err := base.GetParamID(ctx) if err != nil { - utils.ErrorWithMessage(ctx, err.Error()) + base.ErrorWithMessage(ctx, err.Error()) return } req.ID = id - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return nil, h.service.DeleteNotification(ctx, &req) }) } @@ -108,7 +109,7 @@ func (h *NotificationHandler) DeleteNotification(ctx *gin.Context) { func (h *NotificationHandler) ListNotification(ctx *gin.Context) { var req model.ListWorkorderNotificationReq - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return h.service.ListNotification(ctx, &req) }) } @@ -117,14 +118,14 @@ func (h *NotificationHandler) ListNotification(ctx *gin.Context) { func (h *NotificationHandler) DetailNotification(ctx *gin.Context) { var req model.DetailWorkorderNotificationReq - id, err := utils.GetParamID(ctx) + id, err := base.GetParamID(ctx) if err != nil { - utils.ErrorWithMessage(ctx, err.Error()) + base.ErrorWithMessage(ctx, err.Error()) return } req.ID = id - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return h.service.DetailNotification(ctx, &req) }) } @@ -133,7 +134,7 @@ func (h *NotificationHandler) DetailNotification(ctx *gin.Context) { func (h *NotificationHandler) GetSendLogs(ctx *gin.Context) { var req model.ListWorkorderNotificationLogReq - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return h.service.GetSendLogs(ctx, &req) }) } @@ -142,14 +143,14 @@ func (h *NotificationHandler) GetSendLogs(ctx *gin.Context) { func (h *NotificationHandler) TestSendNotification(ctx *gin.Context) { var req model.TestSendWorkorderNotificationReq - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return nil, h.service.TestSendNotification(ctx, &req) }) } // GetAvailableChannels 获取可用的通知渠道 func (h *NotificationHandler) GetAvailableChannels(ctx *gin.Context) { - utils.HandleRequest(ctx, nil, func() (interface{}, error) { + base.HandleRequest(ctx, nil, func() (interface{}, error) { return h.service.GetAvailableChannels(), nil }) } @@ -158,7 +159,7 @@ func (h *NotificationHandler) GetAvailableChannels(ctx *gin.Context) { func (h *NotificationHandler) SendNotificationManually(ctx *gin.Context) { var req model.ManualSendNotificationReq - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return nil, h.service.SendNotificationByChannels(ctx, req.Channels, req.Recipient, req.Subject, req.Content) }) } diff --git a/internal/workorder/api/process.go b/internal/workorder/api/process.go index 148e2661..b94fbe41 100644 --- a/internal/workorder/api/process.go +++ b/internal/workorder/api/process.go @@ -28,7 +28,8 @@ package api import ( "github.com/GoSimplicity/AI-CloudOps/internal/model" "github.com/GoSimplicity/AI-CloudOps/internal/workorder/service" - "github.com/GoSimplicity/AI-CloudOps/pkg/utils" + "github.com/GoSimplicity/AI-CloudOps/pkg/base" + "github.com/GoSimplicity/AI-CloudOps/pkg/jwt" "github.com/gin-gonic/gin" ) @@ -57,11 +58,11 @@ func (h *WorkorderProcessHandler) RegisterRouters(server *gin.Engine) { func (h *WorkorderProcessHandler) CreateWorkorderProcess(ctx *gin.Context) { var req model.CreateWorkorderProcessReq - user := ctx.MustGet("user").(utils.UserClaims) + user := ctx.MustGet("user").(jwt.UserClaims) req.OperatorID = user.Uid req.OperatorName = user.Username - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return nil, h.service.CreateWorkorderProcess(ctx, &req) }) } @@ -70,13 +71,13 @@ func (h *WorkorderProcessHandler) CreateWorkorderProcess(ctx *gin.Context) { func (h *WorkorderProcessHandler) UpdateWorkorderProcess(ctx *gin.Context) { var req model.UpdateWorkorderProcessReq - id, err := utils.GetParamID(ctx) + id, err := base.GetParamID(ctx) if err != nil { return } req.ID = id - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return nil, h.service.UpdateWorkorderProcess(ctx, &req) }) } @@ -85,13 +86,13 @@ func (h *WorkorderProcessHandler) UpdateWorkorderProcess(ctx *gin.Context) { func (h *WorkorderProcessHandler) DeleteWorkorderProcess(ctx *gin.Context) { var req model.DeleteWorkorderProcessReq - id, err := utils.GetParamID(ctx) + id, err := base.GetParamID(ctx) if err != nil { return } req.ID = id - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return nil, h.service.DeleteWorkorderProcess(ctx, req.ID) }) } @@ -100,7 +101,7 @@ func (h *WorkorderProcessHandler) DeleteWorkorderProcess(ctx *gin.Context) { func (h *WorkorderProcessHandler) ListWorkorderProcess(ctx *gin.Context) { var req model.ListWorkorderProcessReq - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return h.service.ListWorkorderProcess(ctx, &req) }) } @@ -109,13 +110,13 @@ func (h *WorkorderProcessHandler) ListWorkorderProcess(ctx *gin.Context) { func (h *WorkorderProcessHandler) DetailWorkorderProcess(ctx *gin.Context) { var req model.DetailWorkorderProcessReq - id, err := utils.GetParamID(ctx) + id, err := base.GetParamID(ctx) if err != nil { return } req.ID = id - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return h.service.DetailWorkorderProcess(ctx, req.ID) }) } diff --git a/internal/workorder/api/template.go b/internal/workorder/api/template.go index f2e43c22..b317c99e 100644 --- a/internal/workorder/api/template.go +++ b/internal/workorder/api/template.go @@ -28,7 +28,8 @@ package api import ( "github.com/GoSimplicity/AI-CloudOps/internal/model" "github.com/GoSimplicity/AI-CloudOps/internal/workorder/service" - "github.com/GoSimplicity/AI-CloudOps/pkg/utils" + "github.com/GoSimplicity/AI-CloudOps/pkg/base" + "github.com/GoSimplicity/AI-CloudOps/pkg/jwt" "github.com/gin-gonic/gin" ) @@ -57,11 +58,11 @@ func (h *TemplateHandler) RegisterRouters(server *gin.Engine) { func (h *TemplateHandler) CreateTemplate(ctx *gin.Context) { var req model.CreateWorkorderTemplateReq - user := ctx.MustGet("user").(utils.UserClaims) + user := ctx.MustGet("user").(jwt.UserClaims) req.OperatorID = user.Uid req.OperatorName = user.Username - utils.HandleRequest(ctx, &req, func() (any, error) { + base.HandleRequest(ctx, &req, func() (any, error) { return nil, h.service.CreateTemplate(ctx, &req) }) } @@ -70,15 +71,15 @@ func (h *TemplateHandler) CreateTemplate(ctx *gin.Context) { func (h *TemplateHandler) UpdateTemplate(ctx *gin.Context) { var req model.UpdateWorkorderTemplateReq - id, err := utils.GetParamID(ctx) + id, err := base.GetParamID(ctx) if err != nil { - utils.ErrorWithMessage(ctx, "无效的模板ID") + base.ErrorWithMessage(ctx, "无效的模板ID") return } req.ID = id - utils.HandleRequest(ctx, &req, func() (any, error) { + base.HandleRequest(ctx, &req, func() (any, error) { return nil, h.service.UpdateTemplate(ctx, &req) }) } @@ -86,15 +87,15 @@ func (h *TemplateHandler) UpdateTemplate(ctx *gin.Context) { // DeleteTemplate 删除模板 func (h *TemplateHandler) DeleteTemplate(ctx *gin.Context) { var req model.DeleteWorkorderTemplateReq - id, err := utils.GetParamID(ctx) + id, err := base.GetParamID(ctx) if err != nil { - utils.ErrorWithMessage(ctx, "无效的模板ID") + base.ErrorWithMessage(ctx, "无效的模板ID") return } req.ID = id - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return nil, h.service.DeleteTemplate(ctx, &req) }) } @@ -103,7 +104,7 @@ func (h *TemplateHandler) DeleteTemplate(ctx *gin.Context) { func (h *TemplateHandler) ListTemplate(ctx *gin.Context) { var req model.ListWorkorderTemplateReq - utils.HandleRequest(ctx, &req, func() (any, error) { + base.HandleRequest(ctx, &req, func() (any, error) { return h.service.ListTemplate(ctx, &req) }) } @@ -112,15 +113,15 @@ func (h *TemplateHandler) ListTemplate(ctx *gin.Context) { func (h *TemplateHandler) DetailTemplate(ctx *gin.Context) { var req model.DetailWorkorderTemplateReq - id, err := utils.GetParamID(ctx) + id, err := base.GetParamID(ctx) if err != nil { - utils.ErrorWithMessage(ctx, "无效的模板ID") + base.ErrorWithMessage(ctx, "无效的模板ID") return } req.ID = id - utils.HandleRequest(ctx, &req, func() (interface{}, error) { + base.HandleRequest(ctx, &req, func() (interface{}, error) { return h.service.DetailTemplate(ctx, &req) }) } diff --git a/internal/workorder/service/category_group_service.go b/internal/workorder/service/category_group_service.go index 90428d51..4243de79 100644 --- a/internal/workorder/service/category_group_service.go +++ b/internal/workorder/service/category_group_service.go @@ -31,7 +31,7 @@ import ( "fmt" "github.com/GoSimplicity/AI-CloudOps/internal/model" - userdao "github.com/GoSimplicity/AI-CloudOps/internal/user/dao" + userdao "github.com/GoSimplicity/AI-CloudOps/internal/system/dao" "github.com/GoSimplicity/AI-CloudOps/internal/workorder/dao" "go.uber.org/zap" "gorm.io/gorm" diff --git a/internal/workorder/service/notification_service.go b/internal/workorder/service/notification_service.go index 9b69b66c..c1a500af 100644 --- a/internal/workorder/service/notification_service.go +++ b/internal/workorder/service/notification_service.go @@ -34,7 +34,7 @@ import ( "time" "github.com/GoSimplicity/AI-CloudOps/internal/model" - userDao "github.com/GoSimplicity/AI-CloudOps/internal/user/dao" + userDao "github.com/GoSimplicity/AI-CloudOps/internal/system/dao" workorderDao "github.com/GoSimplicity/AI-CloudOps/internal/workorder/dao" "github.com/GoSimplicity/AI-CloudOps/internal/workorder/notification" "github.com/GoSimplicity/AI-CloudOps/internal/workorder/utils" @@ -377,7 +377,7 @@ func (s *workorderNotificationService) getRecipients(ctx context.Context, notifi case model.RecipientTypeAssignee: if instance.AssigneeID != nil { assigneeName := "处理人" - if user, err := s.userDAO.GetUserByID(ctx, *instance.AssigneeID); err == nil { + if user, err := s.userDAO.GetByID(ctx, *instance.AssigneeID); err == nil { assigneeName = user.RealName } @@ -397,7 +397,7 @@ func (s *workorderNotificationService) getRecipients(ctx context.Context, notifi } userName := "指定用户" - if user, err := s.userDAO.GetUserByID(ctx, userID); err == nil { + if user, err := s.userDAO.GetByID(ctx, userID); err == nil { userName = user.RealName } @@ -569,7 +569,7 @@ func (s *workorderNotificationService) buildMessageContent(notificationConfig *m // 处理处理人名称 assigneeName := "待分配" if instance.AssigneeID != nil { - if user, err := s.userDAO.GetUserByID(context.Background(), *instance.AssigneeID); err == nil && user != nil { + if user, err := s.userDAO.GetByID(context.Background(), *instance.AssigneeID); err == nil && user != nil { assigneeName = user.RealName } } @@ -664,7 +664,7 @@ func (s *workorderNotificationService) getRecipientAddress(recipient RecipientIn return "" } - user, err := s.userDAO.GetUserByID(context.Background(), userID) + user, err := s.userDAO.GetByID(context.Background(), userID) if err != nil { s.logger.Error("获取用户信息失败", zap.Int("user_id", userID), diff --git a/main.go b/main.go index 30e5b94a..54425d55 100644 --- a/main.go +++ b/main.go @@ -32,22 +32,18 @@ import ( "net/http" "os" "os/signal" - "strings" "syscall" "time" - _ "github.com/GoSimplicity/AI-CloudOps/docs" "github.com/GoSimplicity/AI-CloudOps/mock" + "github.com/GoSimplicity/AI-CloudOps/pkg/base" "github.com/GoSimplicity/AI-CloudOps/pkg/di" - "github.com/GoSimplicity/AI-CloudOps/pkg/utils" "github.com/fatih/color" "github.com/gin-contrib/gzip" "github.com/gin-gonic/gin" "github.com/hibiken/asynq" "github.com/joho/godotenv" "github.com/spf13/viper" - swaggerFiles "github.com/swaggo/files" - ginSwagger "github.com/swaggo/gin-swagger" "gorm.io/driver/mysql" "gorm.io/gorm" "gorm.io/gorm/logger" @@ -105,18 +101,6 @@ func run() error { }) }) - // 条件注册Swagger文档路由 - if shouldEnableSwagger() { - cmd.Server.GET("/swagger/*any", ginSwagger.WrapHandler(swaggerFiles.Handler)) - if viper.GetBool("server.debug") { - log.Printf("Swagger文档已启用: http://localhost:%s/swagger/index.html", viper.GetString("server.port")) - } - } else { - if viper.GetBool("server.debug") { - log.Printf("Swagger文档已禁用") - } - } - // mock数据 if viper.GetBool("mock.enabled") && di.IsDBAvailable(db) { if err := initMock(); err != nil { @@ -260,41 +244,14 @@ func initMock() error { } func showBootInfo(port string) { - ips, _ := utils.GetLocalIPs() + ips, _ := base.GetLocalIPs() color.Green("AI-CloudOps API 服务启动成功") fmt.Printf("%s ", color.GreenString("➜")) fmt.Printf("%s ", color.New(color.Bold).Sprint("Local:")) fmt.Printf("%s\n", color.MagentaString("http://localhost:%s/", port)) - if shouldEnableSwagger() { - fmt.Printf("%s ", color.GreenString("➜")) - fmt.Printf("%s ", color.New(color.Bold).Sprint("Swagger:")) - fmt.Printf("%s\n", color.MagentaString("http://localhost:%s/swagger/index.html", port)) - } for _, ip := range ips { fmt.Printf("%s ", color.GreenString("➜")) fmt.Printf("%s ", color.New(color.Bold).Sprint("Network:")) fmt.Printf("%s\n", color.MagentaString("http://%s:%s/", ip, port)) } } - -func isEnvTrue(key string) bool { - value := strings.ToLower(os.Getenv(key)) - return value == "true" || value == "1" || value == "yes" || value == "y" || value == "on" -} - -// 检查是否应该启用Swagger -func shouldEnableSwagger() bool { - // 优先检查环境变量 - if swaggerEnabled := os.Getenv("SWAGGER_ENABLED"); swaggerEnabled != "" { - return isEnvTrue("SWAGGER_ENABLED") - } - - // 检查配置文件 - if viper.IsSet("swagger.enabled") { - return viper.GetBool("swagger.enabled") - } - - // 默认情况下,开发环境启用,生产环境禁用 - env := strings.ToLower(os.Getenv("GIN_MODE")) - return env != "release" && env != "production" -} diff --git a/pkg/utils/apiresponse.go b/pkg/base/apiresponse.go similarity index 89% rename from pkg/utils/apiresponse.go rename to pkg/base/apiresponse.go index ddb93913..3e4f638c 100644 --- a/pkg/utils/apiresponse.go +++ b/pkg/base/apiresponse.go @@ -23,7 +23,7 @@ * */ -package utils +package base import ( "bytes" @@ -37,56 +37,6 @@ import ( "go.uber.org/zap" ) -// LabelOption 通用返回结构体,用于前后端交互的数据格式 -type LabelOption struct { - Label string `json:"label"` - Value string `json:"value"` - Children []*LabelOption `json:"children"` -} - -type K8sBatchRequest struct { - Cluster string `json:"cluster"` - Items []K8sRequestItem `json:"items"` -} - -type K8sRequestItem struct { - Namespace string `json:"namespace"` - Name string `json:"name"` -} - -type K8sObjectRequest struct { - Cluster string `json:"cluster"` - Namespace string `json:"namespace"` - Name string `json:"name"` -} - -type OperationData struct { - Success bool `json:"success"` - Error string `json:"error"` -} - -type SelectOption struct { - Label string `json:"label"` - Value string `json:"value"` -} - -type KeyValuePair struct { - Key string `json:"key"` - Value string `json:"value"` -} - -type SelectOptionInt struct { - Label string `json:"label"` - Value int `json:"value"` -} - -type SilenceResponse struct { - Status string `json:"status"` - Data struct { - SilenceID string `json:"silence_id"` - } `json:"data"` -} - // ApiResponse 通用的API响应结构体 type ApiResponse struct { Code int `json:"code"` // 状态码,表示业务逻辑的状态,而非HTTP状态码 @@ -101,11 +51,6 @@ const ( ) // ApiData 通用的返回函数,用于标准化API响应格式 -// 参数: -// - c: gin 上下文 -// - code: 状态码 -// - data: 返回的数据 -// - message: 返回的消息 func ApiData(c *gin.Context, code int, data interface{}, message string) { c.JSON(http.StatusOK, ApiResponse{ Code: code, diff --git a/pkg/utils/base64.go b/pkg/base/base64.go similarity index 99% rename from pkg/utils/base64.go rename to pkg/base/base64.go index 1fac69dc..64188784 100644 --- a/pkg/utils/base64.go +++ b/pkg/base/base64.go @@ -23,7 +23,7 @@ * */ -package utils +package base import ( "encoding/base64" diff --git a/pkg/utils/context.go b/pkg/base/context.go similarity index 98% rename from pkg/utils/context.go rename to pkg/base/context.go index 141c56d5..a81d4705 100644 --- a/pkg/utils/context.go +++ b/pkg/base/context.go @@ -23,7 +23,7 @@ * */ -package utils +package base import ( "context" @@ -33,6 +33,7 @@ import ( "strconv" "strings" + "github.com/GoSimplicity/AI-CloudOps/pkg/jwt" "github.com/gin-gonic/gin" ) @@ -54,7 +55,7 @@ func GetUserInfoFromGinContext(c *gin.Context) *UserInfo { // 尝试从gin.Context中获取用户信息 if user, exists := c.Get("user"); exists { switch claims := user.(type) { - case UserClaims: + case jwt.UserClaims: userInfo.UserID = claims.Uid userInfo.Username = claims.Username case map[string]interface{}: diff --git a/pkg/utils/crypto.go b/pkg/base/crypto.go similarity index 99% rename from pkg/utils/crypto.go rename to pkg/base/crypto.go index be1236a8..11c72195 100644 --- a/pkg/utils/crypto.go +++ b/pkg/base/crypto.go @@ -23,7 +23,7 @@ * */ -package utils +package base import ( "crypto/aes" diff --git a/pkg/utils/general.go b/pkg/base/general.go similarity index 99% rename from pkg/utils/general.go rename to pkg/base/general.go index d2e12778..265a34de 100644 --- a/pkg/utils/general.go +++ b/pkg/base/general.go @@ -23,7 +23,7 @@ * */ -package utils +package base import ( "context" diff --git a/pkg/di/middleware.go b/pkg/di/middleware.go index 05b0f534..56887efa 100644 --- a/pkg/di/middleware.go +++ b/pkg/di/middleware.go @@ -29,10 +29,9 @@ import ( "strings" "time" - ijwt "github.com/GoSimplicity/AI-CloudOps/pkg/utils" - "github.com/GoSimplicity/AI-CloudOps/internal/middleware" "github.com/GoSimplicity/AI-CloudOps/internal/system/service" + ijwt "github.com/GoSimplicity/AI-CloudOps/pkg/jwt" "github.com/gin-contrib/cors" "github.com/gin-gonic/gin" "go.uber.org/zap" diff --git a/pkg/di/web.go b/pkg/di/web.go index 668ed042..97725d7b 100644 --- a/pkg/di/web.go +++ b/pkg/di/web.go @@ -32,7 +32,6 @@ import ( prometheusApi "github.com/GoSimplicity/AI-CloudOps/internal/prometheus/api" systemApi "github.com/GoSimplicity/AI-CloudOps/internal/system/api" resourceApi "github.com/GoSimplicity/AI-CloudOps/internal/tree/api" - userApi "github.com/GoSimplicity/AI-CloudOps/internal/user/api" workorderApi "github.com/GoSimplicity/AI-CloudOps/internal/workorder/api" "github.com/gin-gonic/gin" ) @@ -40,7 +39,7 @@ import ( // InitGinServer 初始化web服务 func InitGinServer( m []gin.HandlerFunc, - userHdl *userApi.UserHandler, + userHdl *systemApi.UserHandler, authApiHdl *systemApi.ApiHandler, authRoleHdl *systemApi.RoleHandler, systemHdl *systemApi.SystemHandler, diff --git a/pkg/di/wire.go b/pkg/di/wire.go index 06437a67..a86780bb 100644 --- a/pkg/di/wire.go +++ b/pkg/di/wire.go @@ -56,16 +56,13 @@ import ( treeHandler "github.com/GoSimplicity/AI-CloudOps/internal/tree/api" treeDao "github.com/GoSimplicity/AI-CloudOps/internal/tree/dao" treeService "github.com/GoSimplicity/AI-CloudOps/internal/tree/service" - userHandler "github.com/GoSimplicity/AI-CloudOps/internal/user/api" - userDao "github.com/GoSimplicity/AI-CloudOps/internal/user/dao" - userService "github.com/GoSimplicity/AI-CloudOps/internal/user/service" workorderHandler "github.com/GoSimplicity/AI-CloudOps/internal/workorder/api" workorderDao "github.com/GoSimplicity/AI-CloudOps/internal/workorder/dao" workorderService "github.com/GoSimplicity/AI-CloudOps/internal/workorder/service" + ijwt "github.com/GoSimplicity/AI-CloudOps/pkg/jwt" "github.com/GoSimplicity/AI-CloudOps/pkg/sse" pkgSSH "github.com/GoSimplicity/AI-CloudOps/pkg/ssh" - ijwt "github.com/GoSimplicity/AI-CloudOps/pkg/utils" - "github.com/GoSimplicity/AI-CloudOps/pkg/utils/terminal" + "github.com/GoSimplicity/AI-CloudOps/pkg/terminal" "github.com/gin-gonic/gin" "github.com/google/wire" _ "github.com/google/wire" @@ -87,7 +84,7 @@ var HandlerSet = wire.NewSet( authHandler.NewApiHandler, authHandler.NewAuditHandler, authHandler.NewSystemHandler, - userHandler.NewUserHandler, + authHandler.NewUserHandler, notAuthHandler.NewNotAuthHandler, k8sHandler.NewK8sNodeHandler, k8sHandler.NewK8sClusterHandler, @@ -162,7 +159,7 @@ var ServiceSet = wire.NewSet( k8sService.NewSecretService, k8sService.NewPVService, k8sService.NewPVCService, - userService.NewUserService, + authService.NewUserService, authService.NewApiService, authService.NewRoleService, authService.NewAuditService, @@ -204,7 +201,7 @@ var DaoSet = wire.NewSet( scrapeJobDao.NewScrapeJobDAO, scrapeJobDao.NewScrapePoolDAO, configDao.NewMonitorConfigDAO, - userDao.NewUserDAO, + authDao.NewUserDAO, authDao.NewRoleDAO, authDao.NewApiDAO, authDao.NewAuditDAO, diff --git a/pkg/di/wire_gen.go b/pkg/di/wire_gen.go index 07598727..6ae7bbd1 100644 --- a/pkg/di/wire_gen.go +++ b/pkg/di/wire_gen.go @@ -8,19 +8,19 @@ package di import ( "github.com/GoSimplicity/AI-CloudOps/internal/cron" - api8 "github.com/GoSimplicity/AI-CloudOps/internal/cron/api" - dao6 "github.com/GoSimplicity/AI-CloudOps/internal/cron/dao" + api7 "github.com/GoSimplicity/AI-CloudOps/internal/cron/api" + dao5 "github.com/GoSimplicity/AI-CloudOps/internal/cron/dao" "github.com/GoSimplicity/AI-CloudOps/internal/cron/handler" "github.com/GoSimplicity/AI-CloudOps/internal/cron/scheduler" - service7 "github.com/GoSimplicity/AI-CloudOps/internal/cron/service" - api4 "github.com/GoSimplicity/AI-CloudOps/internal/k8s/api" + service6 "github.com/GoSimplicity/AI-CloudOps/internal/cron/service" + api3 "github.com/GoSimplicity/AI-CloudOps/internal/k8s/api" "github.com/GoSimplicity/AI-CloudOps/internal/k8s/client" - dao3 "github.com/GoSimplicity/AI-CloudOps/internal/k8s/dao" + dao2 "github.com/GoSimplicity/AI-CloudOps/internal/k8s/dao" "github.com/GoSimplicity/AI-CloudOps/internal/k8s/manager" - service4 "github.com/GoSimplicity/AI-CloudOps/internal/k8s/service" - api3 "github.com/GoSimplicity/AI-CloudOps/internal/not_auth/api" - service3 "github.com/GoSimplicity/AI-CloudOps/internal/not_auth/service" - api5 "github.com/GoSimplicity/AI-CloudOps/internal/prometheus/api" + service3 "github.com/GoSimplicity/AI-CloudOps/internal/k8s/service" + api2 "github.com/GoSimplicity/AI-CloudOps/internal/not_auth/api" + service2 "github.com/GoSimplicity/AI-CloudOps/internal/not_auth/service" + api4 "github.com/GoSimplicity/AI-CloudOps/internal/prometheus/api" "github.com/GoSimplicity/AI-CloudOps/internal/prometheus/cache" "github.com/GoSimplicity/AI-CloudOps/internal/prometheus/dao/alert" "github.com/GoSimplicity/AI-CloudOps/internal/prometheus/dao/config" @@ -29,22 +29,19 @@ import ( config2 "github.com/GoSimplicity/AI-CloudOps/internal/prometheus/service/config" scrape2 "github.com/GoSimplicity/AI-CloudOps/internal/prometheus/service/scrape" "github.com/GoSimplicity/AI-CloudOps/internal/startup" - api2 "github.com/GoSimplicity/AI-CloudOps/internal/system/api" + "github.com/GoSimplicity/AI-CloudOps/internal/system/api" "github.com/GoSimplicity/AI-CloudOps/internal/system/dao" "github.com/GoSimplicity/AI-CloudOps/internal/system/service" - api7 "github.com/GoSimplicity/AI-CloudOps/internal/tree/api" - dao5 "github.com/GoSimplicity/AI-CloudOps/internal/tree/dao" - service6 "github.com/GoSimplicity/AI-CloudOps/internal/tree/service" - "github.com/GoSimplicity/AI-CloudOps/internal/user/api" - dao2 "github.com/GoSimplicity/AI-CloudOps/internal/user/dao" - service2 "github.com/GoSimplicity/AI-CloudOps/internal/user/service" - api6 "github.com/GoSimplicity/AI-CloudOps/internal/workorder/api" - dao4 "github.com/GoSimplicity/AI-CloudOps/internal/workorder/dao" - service5 "github.com/GoSimplicity/AI-CloudOps/internal/workorder/service" + api6 "github.com/GoSimplicity/AI-CloudOps/internal/tree/api" + dao4 "github.com/GoSimplicity/AI-CloudOps/internal/tree/dao" + service5 "github.com/GoSimplicity/AI-CloudOps/internal/tree/service" + api5 "github.com/GoSimplicity/AI-CloudOps/internal/workorder/api" + dao3 "github.com/GoSimplicity/AI-CloudOps/internal/workorder/dao" + service4 "github.com/GoSimplicity/AI-CloudOps/internal/workorder/service" + "github.com/GoSimplicity/AI-CloudOps/pkg/jwt" "github.com/GoSimplicity/AI-CloudOps/pkg/sse" "github.com/GoSimplicity/AI-CloudOps/pkg/ssh" - "github.com/GoSimplicity/AI-CloudOps/pkg/utils" - "github.com/GoSimplicity/AI-CloudOps/pkg/utils/terminal" + "github.com/GoSimplicity/AI-CloudOps/pkg/terminal" "github.com/gin-gonic/gin" "github.com/google/wire" "github.com/hibiken/asynq" @@ -58,81 +55,81 @@ import ( func ProvideCmd() *Cmd { cmdable := InitRedis() - utilsHandler := utils.NewJWTHandler(cmdable) + jwtHandler := jwt.NewJWTHandler(cmdable) logger := InitLogger() db := InitDB() roleDAO := dao.NewRoleDAO(db) roleService := service.NewRoleService(roleDAO, logger) auditDAO := dao.NewAuditDAO(db) auditService := service.NewAuditService(auditDAO, logger) - v := InitMiddlewares(utilsHandler, logger, roleService, auditService) - userDAO := dao2.NewUserDAO(db, logger) - userService := service2.NewUserService(userDAO, roleService, logger) - userHandler := api.NewUserHandler(userService, utilsHandler) + v := InitMiddlewares(jwtHandler, logger, roleService, auditService) + userDAO := dao.NewUserDAO(db, logger) + userService := service.NewUserService(userDAO, roleDAO, logger) + userHandler := api.NewUserHandler(userService, jwtHandler) apiDAO := dao.NewApiDAO(db, logger) apiService := service.NewApiService(logger, apiDAO) - apiHandler := api2.NewApiHandler(apiService) - roleHandler := api2.NewRoleHandler(roleService) + apiHandler := api.NewApiHandler(apiService) + roleHandler := api.NewRoleHandler(roleService) systemService := service.NewSystemService(logger, cmdable) - systemHandler := api2.NewSystemHandler(systemService) - notAuthService := service3.NewNotAuthService(logger) - notAuthHandler := api3.NewNotAuthHandler(notAuthService) - clusterDAO := dao3.NewClusterDAO(db, logger) + systemHandler := api.NewSystemHandler(systemService) + notAuthService := service2.NewNotAuthService(logger) + notAuthHandler := api2.NewNotAuthHandler(notAuthService) + clusterDAO := dao2.NewClusterDAO(db, logger) k8sClient := client.NewK8sClient(logger, clusterDAO) clusterManager := manager.NewClusterManager(logger, k8sClient, clusterDAO) - clusterService := service4.NewClusterService(clusterDAO, k8sClient, clusterManager, logger) - k8sClusterHandler := api4.NewK8sClusterHandler(clusterService) + clusterService := service3.NewClusterService(clusterDAO, k8sClient, clusterManager, logger) + k8sClusterHandler := api3.NewK8sClusterHandler(clusterService) deploymentManager := manager.NewDeploymentManager(k8sClient, logger) - deploymentService := service4.NewDeploymentService(deploymentManager, logger) - k8sDeploymentHandler := api4.NewK8sDeploymentHandler(deploymentService) + deploymentService := service3.NewDeploymentService(deploymentManager, logger) + k8sDeploymentHandler := api3.NewK8sDeploymentHandler(deploymentService) namespaceManager := manager.NewNamespaceManager(k8sClient, logger) - namespaceService := service4.NewNamespaceService(k8sClient, namespaceManager, logger) - k8sNamespaceHandler := api4.NewK8sNamespaceHandler(namespaceService) + namespaceService := service3.NewNamespaceService(k8sClient, namespaceManager, logger) + k8sNamespaceHandler := api3.NewK8sNamespaceHandler(namespaceService) nodeManager := manager.NewNodeManager(k8sClient, logger) - nodeService := service4.NewNodeService(clusterDAO, k8sClient, nodeManager, logger) + nodeService := service3.NewNodeService(clusterDAO, k8sClient, nodeManager, logger) taintManager := manager.NewTaintManager(k8sClient, clusterDAO, logger) - taintService := service4.NewTaintService(taintManager, logger) - k8sNodeHandler := api4.NewK8sNodeHandler(nodeService, taintService) + taintService := service3.NewTaintService(taintManager, logger) + k8sNodeHandler := api3.NewK8sNodeHandler(nodeService, taintService) serviceManager := manager.NewServiceManager(k8sClient, logger) - svcService := service4.NewSvcService(serviceManager, logger) - k8sSvcHandler := api4.NewK8sSvcHandler(svcService) - yamlTemplateDAO := dao3.NewYamlTemplateDAO(db, logger) - yamlTaskDAO := dao3.NewYamlTaskDAO(db, logger) + svcService := service3.NewSvcService(serviceManager, logger) + k8sSvcHandler := api3.NewK8sSvcHandler(svcService) + yamlTemplateDAO := dao2.NewYamlTemplateDAO(db, logger) + yamlTaskDAO := dao2.NewYamlTaskDAO(db, logger) yamlManager := manager.NewYamlManager(yamlTemplateDAO, yamlTaskDAO, clusterDAO, k8sClient, logger) - yamlTaskService := service4.NewYamlTaskService(yamlManager, logger) - k8sYamlTaskHandler := api4.NewK8sYamlTaskHandler(yamlTaskService) - yamlTemplateService := service4.NewYamlTemplateService(yamlManager, logger) - k8sYamlTemplateHandler := api4.NewK8sYamlTemplateHandler(yamlTemplateService) + yamlTaskService := service3.NewYamlTaskService(yamlManager, logger) + k8sYamlTaskHandler := api3.NewK8sYamlTaskHandler(yamlTaskService) + yamlTemplateService := service3.NewYamlTemplateService(yamlManager, logger) + k8sYamlTemplateHandler := api3.NewK8sYamlTemplateHandler(yamlTemplateService) daemonSetManager := manager.NewDaemonSetManager(k8sClient, logger) - daemonSetService := service4.NewDaemonSetService(daemonSetManager, logger) - k8sDaemonSetHandler := api4.NewK8sDaemonSetHandler(daemonSetService) + daemonSetService := service3.NewDaemonSetService(daemonSetManager, logger) + k8sDaemonSetHandler := api3.NewK8sDaemonSetHandler(daemonSetService) eventManager := manager.NewEventManager(k8sClient, logger) - eventService := service4.NewEventService(eventManager, logger) - k8sEventHandler := api4.NewK8sEventHandler(eventService) + eventService := service3.NewEventService(eventManager, logger) + k8sEventHandler := api3.NewK8sEventHandler(eventService) statefulSetManager := manager.NewStatefulSetManager(k8sClient, logger) - statefulSetService := service4.NewStatefulSetService(statefulSetManager, logger) - k8sStatefulSetHandler := api4.NewK8sStatefulSetHandler(statefulSetService) + statefulSetService := service3.NewStatefulSetService(statefulSetManager, logger) + k8sStatefulSetHandler := api3.NewK8sStatefulSetHandler(statefulSetService) serviceAccountManager := manager.NewServiceAccountManager(logger, k8sClient) - serviceAccountService := service4.NewServiceAccountService(serviceAccountManager, logger) - k8sServiceAccountHandler := api4.NewK8sServiceAccountHandler(serviceAccountService) + serviceAccountService := service3.NewServiceAccountService(serviceAccountManager, logger) + k8sServiceAccountHandler := api3.NewK8sServiceAccountHandler(serviceAccountService) roleManager := manager.NewRoleManager(k8sClient, logger) - serviceRoleService := service4.NewRoleService(roleManager, logger) - k8sRoleHandler := api4.NewK8sRoleHandler(serviceRoleService) + serviceRoleService := service3.NewRoleService(roleManager, logger) + k8sRoleHandler := api3.NewK8sRoleHandler(serviceRoleService) clusterRoleManager := manager.NewClusterRoleManager(k8sClient, logger) - clusterRoleService := service4.NewClusterRoleService(clusterRoleManager, logger) - k8sClusterRoleHandler := api4.NewK8sClusterRoleHandler(clusterRoleService) + clusterRoleService := service3.NewClusterRoleService(clusterRoleManager, logger) + k8sClusterRoleHandler := api3.NewK8sClusterRoleHandler(clusterRoleService) roleBindingManager := manager.NewRoleBindingManager(k8sClient, logger) - roleBindingService := service4.NewRoleBindingService(roleBindingManager, logger) - k8sRoleBindingHandler := api4.NewK8sRoleBindingHandler(roleBindingService) + roleBindingService := service3.NewRoleBindingService(roleBindingManager, logger) + k8sRoleBindingHandler := api3.NewK8sRoleBindingHandler(roleBindingService) clusterRoleBindingManager := manager.NewClusterRoleBindingManager(k8sClient, logger) - clusterRoleBindingService := service4.NewClusterRoleBindingService(clusterRoleBindingManager, logger) - k8sClusterRoleBindingHandler := api4.NewK8sClusterRoleBindingHandler(clusterRoleBindingService) + clusterRoleBindingService := service3.NewClusterRoleBindingService(clusterRoleBindingManager, logger) + k8sClusterRoleBindingHandler := api3.NewK8sClusterRoleBindingHandler(clusterRoleBindingService) configMapManager := manager.NewConfigMapManager(k8sClient, logger) - configMapService := service4.NewConfigMapService(k8sClient, configMapManager, logger) - k8sConfigMapHandler := api4.NewK8sConfigMapHandler(configMapService) + configMapService := service3.NewConfigMapService(k8sClient, configMapManager, logger) + k8sConfigMapHandler := api3.NewK8sConfigMapHandler(configMapService) secretManager := manager.NewSecretManager(k8sClient, logger) - secretService := service4.NewSecretService(secretManager, logger) - k8sSecretHandler := api4.NewK8sSecretHandler(secretService) + secretService := service3.NewSecretService(secretManager, logger) + k8sSecretHandler := api3.NewK8sSecretHandler(secretService) alertManagerEventDAO := alert.NewAlertManagerEventDAO(db, logger, userDAO) scrapePoolDAO := scrape.NewScrapePoolDAO(db, logger, userDAO) scrapeJobDAO := scrape.NewScrapeJobDAO(db, logger) @@ -148,89 +145,89 @@ func ProvideCmd() *Cmd { recordRuleConfigCache := cache.NewRecordRuleConfigCache(logger, scrapePoolDAO, alertManagerRecordDAO, monitorConfigDAO, batchConfigManager, cmdable) monitorCache := cache.NewMonitorCache(prometheusConfigCache, alertManagerConfigCache, alertRuleConfigCache, recordRuleConfigCache, logger) alertManagerEventService := alert2.NewAlertManagerEventService(alertManagerEventDAO, monitorCache, logger, userDAO, alertManagerSendDAO) - alertEventHandler := api5.NewAlertEventHandler(alertManagerEventService) + alertEventHandler := api4.NewAlertEventHandler(alertManagerEventService) alertManagerPoolService := alert2.NewAlertManagerPoolService(alertManagerPoolDAO, alertManagerSendDAO, logger, monitorCache) - alertPoolHandler := api5.NewAlertPoolHandler(alertManagerPoolService) + alertPoolHandler := api4.NewAlertPoolHandler(alertManagerPoolService) alertManagerRuleService := alert2.NewAlertManagerRuleService(logger, alertManagerRuleDAO, alertManagerPoolDAO, alertManagerSendDAO, monitorCache) - alertRuleHandler := api5.NewAlertRuleHandler(alertManagerRuleService) + alertRuleHandler := api4.NewAlertRuleHandler(alertManagerRuleService) monitorConfigService := config2.NewMonitorConfigService(logger, monitorConfigDAO) - monitorConfigHandler := api5.NewMonitorConfigHandler(monitorConfigService) + monitorConfigHandler := api4.NewMonitorConfigHandler(monitorConfigService) alertManagerOnDutyDAO := alert.NewAlertManagerOnDutyDAO(db, logger, userDAO) alertManagerOnDutyService := alert2.NewAlertManagerOnDutyService(alertManagerOnDutyDAO, alertManagerSendDAO, monitorCache, logger, userDAO) - onDutyGroupHandler := api5.NewOnDutyGroupHandler(alertManagerOnDutyService) + onDutyGroupHandler := api4.NewOnDutyGroupHandler(alertManagerOnDutyService) alertManagerRecordService := alert2.NewAlertManagerRecordService(alertManagerRecordDAO, scrapePoolDAO, logger, monitorCache) - recordRuleHandler := api5.NewRecordRuleHandler(alertManagerRecordService) + recordRuleHandler := api4.NewRecordRuleHandler(alertManagerRecordService) scrapePoolService := scrape2.NewPrometheusPoolService(scrapePoolDAO, monitorCache, logger, userDAO, scrapeJobDAO) - scrapePoolHandler := api5.NewScrapePoolHandler(logger, scrapePoolService) + scrapePoolHandler := api4.NewScrapePoolHandler(logger, scrapePoolService) scrapeJobService := scrape2.NewPrometheusScrapeService(scrapeJobDAO, monitorCache, logger, userDAO) - scrapeJobHandler := api5.NewScrapeJobHandler(scrapeJobService) + scrapeJobHandler := api4.NewScrapeJobHandler(scrapeJobService) alertManagerSendService := alert2.NewAlertManagerSendService(alertManagerSendDAO, alertManagerRuleDAO, logger, userDAO, monitorCache) - sendGroupHandler := api5.NewSendGroupHandler(alertManagerSendService) - auditHandler := api2.NewAuditHandler(auditService, logger) - workorderFormDesignDAO := dao4.NewWorkorderFormDesignDAO(db, logger) - workorderCategoryDAO := dao4.NewWorkorderCategoryDAO(db, logger) - formDesignService := service5.NewFormDesignService(workorderFormDesignDAO, workorderCategoryDAO, logger) - formDesignHandler := api6.NewFormDesignHandler(formDesignService) - workorderProcessDAO := dao4.NewProcessDAO(db, logger) - workorderInstanceDAO := dao4.NewWorkorderInstanceDAO(db, logger) - workorderProcessService := service5.NewWorkorderProcessService(workorderProcessDAO, workorderFormDesignDAO, workorderCategoryDAO, workorderInstanceDAO, logger) - workorderProcessHandler := api6.NewWorkorderProcessHandler(workorderProcessService) - workorderTemplateDAO := dao4.NewTemplateDAO(db, logger) - workorderTemplateService := service5.NewWorkorderTemplateService(workorderTemplateDAO, workorderProcessDAO, workorderCategoryDAO, workorderInstanceDAO, logger) - templateHandler := api6.NewTemplateHandler(workorderTemplateService) - workorderInstanceFlowDAO := dao4.NewInstanceFlowDAO(db, logger) - workorderInstanceTimelineDAO := dao4.NewInstanceTimeLineDAO(db, logger) - workorderInstanceCommentDAO := dao4.NewWorkorderInstanceCommentDAO(db, logger) - workorderNotificationDAO := dao4.NewNotificationDAO(db, logger) + sendGroupHandler := api4.NewSendGroupHandler(alertManagerSendService) + auditHandler := api.NewAuditHandler(auditService, logger) + workorderFormDesignDAO := dao3.NewWorkorderFormDesignDAO(db, logger) + workorderCategoryDAO := dao3.NewWorkorderCategoryDAO(db, logger) + formDesignService := service4.NewFormDesignService(workorderFormDesignDAO, workorderCategoryDAO, logger) + formDesignHandler := api5.NewFormDesignHandler(formDesignService) + workorderProcessDAO := dao3.NewProcessDAO(db, logger) + workorderInstanceDAO := dao3.NewWorkorderInstanceDAO(db, logger) + workorderProcessService := service4.NewWorkorderProcessService(workorderProcessDAO, workorderFormDesignDAO, workorderCategoryDAO, workorderInstanceDAO, logger) + workorderProcessHandler := api5.NewWorkorderProcessHandler(workorderProcessService) + workorderTemplateDAO := dao3.NewTemplateDAO(db, logger) + workorderTemplateService := service4.NewWorkorderTemplateService(workorderTemplateDAO, workorderProcessDAO, workorderCategoryDAO, workorderInstanceDAO, logger) + templateHandler := api5.NewTemplateHandler(workorderTemplateService) + workorderInstanceFlowDAO := dao3.NewInstanceFlowDAO(db, logger) + workorderInstanceTimelineDAO := dao3.NewInstanceTimeLineDAO(db, logger) + workorderInstanceCommentDAO := dao3.NewWorkorderInstanceCommentDAO(db, logger) + workorderNotificationDAO := dao3.NewNotificationDAO(db, logger) notificationConfig := InitNotificationConfig() asynqClient := InitAsynqClient() notificationManager := InitNotificationManager(notificationConfig, asynqClient, logger) - workorderNotificationService := service5.NewWorkorderNotificationService(workorderNotificationDAO, notificationManager, logger, workorderInstanceDAO, userDAO) - instanceService := service5.NewInstanceService(workorderInstanceDAO, workorderInstanceFlowDAO, workorderInstanceTimelineDAO, workorderInstanceCommentDAO, workorderProcessDAO, workorderFormDesignDAO, workorderTemplateDAO, workorderNotificationService, logger) - instanceHandler := api6.NewInstanceHandler(instanceService) - instanceFlowService := service5.NewInstanceFlowService(workorderInstanceFlowDAO, logger) - instanceFlowHandler := api6.NewInstanceFlowHandler(instanceFlowService) - instanceCommentService := service5.NewInstanceCommentService(workorderInstanceCommentDAO, workorderInstanceDAO, workorderNotificationService, logger) - instanceCommentHandler := api6.NewInstanceCommentHandler(instanceCommentService) - categoryGroupService := service5.NewCategoryGroupService(workorderCategoryDAO, userDAO, logger) - categoryGroupHandler := api6.NewCategoryGroupHandler(categoryGroupService) - workorderInstanceTimeLineService := service5.NewWorkorderInstanceTimeLineService(logger, workorderInstanceTimelineDAO) - instanceTimeLineHandler := api6.NewInstanceTimeLineHandler(workorderInstanceTimeLineService) - treeNodeDAO := dao5.NewTreeNodeDAO(logger, db) - treeNodeService := service6.NewTreeNodeService(logger, treeNodeDAO, userDAO) - treeNodeHandler := api7.NewTreeNodeHandler(treeNodeService) - treeLocalDAO := dao5.NewTreeLocalDAO(db, logger) - treeLocalService := service6.NewTreeLocalService(logger, treeLocalDAO) + workorderNotificationService := service4.NewWorkorderNotificationService(workorderNotificationDAO, notificationManager, logger, workorderInstanceDAO, userDAO) + instanceService := service4.NewInstanceService(workorderInstanceDAO, workorderInstanceFlowDAO, workorderInstanceTimelineDAO, workorderInstanceCommentDAO, workorderProcessDAO, workorderFormDesignDAO, workorderTemplateDAO, workorderNotificationService, logger) + instanceHandler := api5.NewInstanceHandler(instanceService) + instanceFlowService := service4.NewInstanceFlowService(workorderInstanceFlowDAO, logger) + instanceFlowHandler := api5.NewInstanceFlowHandler(instanceFlowService) + instanceCommentService := service4.NewInstanceCommentService(workorderInstanceCommentDAO, workorderInstanceDAO, workorderNotificationService, logger) + instanceCommentHandler := api5.NewInstanceCommentHandler(instanceCommentService) + categoryGroupService := service4.NewCategoryGroupService(workorderCategoryDAO, userDAO, logger) + categoryGroupHandler := api5.NewCategoryGroupHandler(categoryGroupService) + workorderInstanceTimeLineService := service4.NewWorkorderInstanceTimeLineService(logger, workorderInstanceTimelineDAO) + instanceTimeLineHandler := api5.NewInstanceTimeLineHandler(workorderInstanceTimeLineService) + treeNodeDAO := dao4.NewTreeNodeDAO(logger, db) + treeNodeService := service5.NewTreeNodeService(logger, treeNodeDAO, userDAO) + treeNodeHandler := api6.NewTreeNodeHandler(treeNodeService) + treeLocalDAO := dao4.NewTreeLocalDAO(db, logger) + treeLocalService := service5.NewTreeLocalService(logger, treeLocalDAO) sshClient := ssh.NewClient(logger) - treeLocalHandler := api7.NewTreeLocalHandler(treeLocalService, sshClient) - treeCloudDAO := dao5.NewTreeCloudDAO(db, logger) - cloudAccountDAO := dao5.NewCloudAccountDAO(db, logger) - treeCloudService := service6.NewTreeCloudService(logger, treeCloudDAO, cloudAccountDAO) - treeCloudHandler := api7.NewTreeCloudHandler(treeCloudService, sshClient) - cloudAccountService := service6.NewCloudAccountService(logger, cloudAccountDAO) - cloudAccountHandler := api7.NewCloudAccountHandler(cloudAccountService) - cloudAccountRegionDAO := dao5.NewCloudAccountRegionDAO(db, logger) - cloudAccountRegionService := service6.NewCloudAccountRegionService(logger, cloudAccountRegionDAO, cloudAccountService) - cloudAccountRegionHandler := api7.NewCloudAccountRegionHandler(cloudAccountRegionService) - notificationHandler := api6.NewNotificationHandler(workorderNotificationService) + treeLocalHandler := api6.NewTreeLocalHandler(treeLocalService, sshClient) + treeCloudDAO := dao4.NewTreeCloudDAO(db, logger) + cloudAccountDAO := dao4.NewCloudAccountDAO(db, logger) + treeCloudService := service5.NewTreeCloudService(logger, treeCloudDAO, cloudAccountDAO) + treeCloudHandler := api6.NewTreeCloudHandler(treeCloudService, sshClient) + cloudAccountService := service5.NewCloudAccountService(logger, cloudAccountDAO) + cloudAccountHandler := api6.NewCloudAccountHandler(cloudAccountService) + cloudAccountRegionDAO := dao4.NewCloudAccountRegionDAO(db, logger) + cloudAccountRegionService := service5.NewCloudAccountRegionService(logger, cloudAccountRegionDAO, cloudAccountService) + cloudAccountRegionHandler := api6.NewCloudAccountRegionHandler(cloudAccountRegionService) + notificationHandler := api5.NewNotificationHandler(workorderNotificationService) ingressManager := manager.NewIngressManager(k8sClient, logger) - ingressService := service4.NewIngressService(ingressManager, logger) - k8sIngressHandler := api4.NewK8sIngressHandler(ingressService) + ingressService := service3.NewIngressService(ingressManager, logger) + k8sIngressHandler := api3.NewK8sIngressHandler(ingressService) podManager := manager.NewPodManager(k8sClient, logger) sseHandler := sse.NewHandler(logger) - podService := service4.NewPodService(podManager, sseHandler, logger) - k8sPodHandler := api4.NewK8sPodHandler(podService) + podService := service3.NewPodService(podManager, sseHandler, logger) + k8sPodHandler := api3.NewK8sPodHandler(podService) pvManager := manager.NewPVManager(logger, k8sClient) - pvService := service4.NewPVService(clusterDAO, k8sClient, pvManager, logger) - k8sPVHandler := api4.NewK8sPVHandler(pvService) + pvService := service3.NewPVService(clusterDAO, k8sClient, pvManager, logger) + k8sPVHandler := api3.NewK8sPVHandler(pvService) pvcManager := manager.NewPVCManager(logger, k8sClient) - pvcService := service4.NewPVCService(clusterDAO, k8sClient, pvcManager, logger) - k8sPVCHandler := api4.NewK8sPVCHandler(pvcService) - cronJobDAO := dao6.NewCronJobDAO(logger, db) + pvcService := service3.NewPVCService(clusterDAO, k8sClient, pvcManager, logger) + k8sPVCHandler := api3.NewK8sPVCHandler(pvcService) + cronJobDAO := dao5.NewCronJobDAO(logger, db) asynqScheduler := InitScheduler() cronScheduler := scheduler.NewCronScheduler(logger, cronJobDAO, asynqScheduler, asynqClient) - cronService := service7.NewCronService(logger, cronJobDAO, userDAO, asynqClient, cronScheduler) - cronJobHandler := api8.NewCronJobHandler(logger, cronService) + cronService := service6.NewCronService(logger, cronJobDAO, userDAO, asynqClient, cronScheduler) + cronJobHandler := api7.NewCronJobHandler(logger, cronService) engine := InitGinServer(v, userHandler, apiHandler, roleHandler, systemHandler, notAuthHandler, k8sClusterHandler, k8sDeploymentHandler, k8sNamespaceHandler, k8sNodeHandler, k8sSvcHandler, k8sYamlTaskHandler, k8sYamlTemplateHandler, k8sDaemonSetHandler, k8sEventHandler, k8sStatefulSetHandler, k8sServiceAccountHandler, k8sRoleHandler, k8sClusterRoleHandler, k8sRoleBindingHandler, k8sClusterRoleBindingHandler, k8sConfigMapHandler, k8sSecretHandler, alertEventHandler, alertPoolHandler, alertRuleHandler, monitorConfigHandler, onDutyGroupHandler, recordRuleHandler, scrapePoolHandler, scrapeJobHandler, sendGroupHandler, auditHandler, formDesignHandler, workorderProcessHandler, templateHandler, instanceHandler, instanceFlowHandler, instanceCommentHandler, categoryGroupHandler, instanceTimeLineHandler, treeNodeHandler, treeLocalHandler, treeCloudHandler, cloudAccountHandler, cloudAccountRegionHandler, notificationHandler, k8sIngressHandler, k8sPodHandler, k8sPVHandler, k8sPVCHandler, cronJobHandler) applicationBootstrap := startup.NewApplicationBootstrap(clusterManager, logger) builtinTaskManager := cron.NewBuiltinTaskManager(logger, cronJobDAO) @@ -261,15 +258,15 @@ type Cmd struct { CronHandlers *handler.CronHandlers } -var HandlerSet = wire.NewSet(api2.NewRoleHandler, api2.NewApiHandler, api2.NewAuditHandler, api2.NewSystemHandler, api.NewUserHandler, api3.NewNotAuthHandler, api4.NewK8sNodeHandler, api4.NewK8sClusterHandler, api4.NewK8sDeploymentHandler, api4.NewK8sNamespaceHandler, api4.NewK8sSvcHandler, api4.NewK8sYamlTaskHandler, api4.NewK8sYamlTemplateHandler, api4.NewK8sDaemonSetHandler, api4.NewK8sEventHandler, api4.NewK8sStatefulSetHandler, api4.NewK8sServiceAccountHandler, api4.NewK8sRoleHandler, api4.NewK8sClusterRoleHandler, api4.NewK8sRoleBindingHandler, api4.NewK8sClusterRoleBindingHandler, api4.NewK8sRBACHandler, api4.NewK8sIngressHandler, api4.NewK8sPodHandler, api4.NewK8sConfigMapHandler, api4.NewK8sSecretHandler, api4.NewK8sPVHandler, api4.NewK8sPVCHandler, api5.NewAlertPoolHandler, api5.NewMonitorConfigHandler, api5.NewOnDutyGroupHandler, api5.NewRecordRuleHandler, api5.NewAlertRuleHandler, api5.NewSendGroupHandler, api5.NewScrapeJobHandler, api5.NewScrapePoolHandler, api5.NewAlertEventHandler, api6.NewFormDesignHandler, api6.NewInstanceHandler, api6.NewInstanceFlowHandler, api6.NewInstanceCommentHandler, api6.NewInstanceTimeLineHandler, api6.NewTemplateHandler, api6.NewWorkorderProcessHandler, api6.NewCategoryGroupHandler, api6.NewNotificationHandler, api7.NewTreeNodeHandler, api7.NewTreeLocalHandler, api7.NewTreeCloudHandler, api7.NewCloudAccountHandler, api7.NewCloudAccountRegionHandler, terminal.NewTerminalHandler, api8.NewCronJobHandler) +var HandlerSet = wire.NewSet(api.NewRoleHandler, api.NewApiHandler, api.NewAuditHandler, api.NewSystemHandler, api.NewUserHandler, api2.NewNotAuthHandler, api3.NewK8sNodeHandler, api3.NewK8sClusterHandler, api3.NewK8sDeploymentHandler, api3.NewK8sNamespaceHandler, api3.NewK8sSvcHandler, api3.NewK8sYamlTaskHandler, api3.NewK8sYamlTemplateHandler, api3.NewK8sDaemonSetHandler, api3.NewK8sEventHandler, api3.NewK8sStatefulSetHandler, api3.NewK8sServiceAccountHandler, api3.NewK8sRoleHandler, api3.NewK8sClusterRoleHandler, api3.NewK8sRoleBindingHandler, api3.NewK8sClusterRoleBindingHandler, api3.NewK8sRBACHandler, api3.NewK8sIngressHandler, api3.NewK8sPodHandler, api3.NewK8sConfigMapHandler, api3.NewK8sSecretHandler, api3.NewK8sPVHandler, api3.NewK8sPVCHandler, api4.NewAlertPoolHandler, api4.NewMonitorConfigHandler, api4.NewOnDutyGroupHandler, api4.NewRecordRuleHandler, api4.NewAlertRuleHandler, api4.NewSendGroupHandler, api4.NewScrapeJobHandler, api4.NewScrapePoolHandler, api4.NewAlertEventHandler, api5.NewFormDesignHandler, api5.NewInstanceHandler, api5.NewInstanceFlowHandler, api5.NewInstanceCommentHandler, api5.NewInstanceTimeLineHandler, api5.NewTemplateHandler, api5.NewWorkorderProcessHandler, api5.NewCategoryGroupHandler, api5.NewNotificationHandler, api6.NewTreeNodeHandler, api6.NewTreeLocalHandler, api6.NewTreeCloudHandler, api6.NewCloudAccountHandler, api6.NewCloudAccountRegionHandler, terminal.NewTerminalHandler, api7.NewCronJobHandler) -var ServiceSet = wire.NewSet(service4.NewClusterService, service4.NewDeploymentService, service4.NewNamespaceService, service4.NewSvcService, service4.NewNodeService, service4.NewTaintService, service4.NewYamlTaskService, service4.NewYamlTemplateService, service4.NewDaemonSetService, service4.NewEventService, service4.NewStatefulSetService, service4.NewServiceAccountService, service4.NewRoleService, service4.NewClusterRoleService, service4.NewRoleBindingService, service4.NewClusterRoleBindingService, service4.NewRBACService, service4.NewIngressService, service4.NewPodService, service4.NewConfigMapService, service4.NewSecretService, service4.NewPVService, service4.NewPVCService, service2.NewUserService, service.NewApiService, service.NewRoleService, service.NewAuditService, service.NewSystemService, alert2.NewAlertManagerEventService, alert2.NewAlertManagerOnDutyService, alert2.NewAlertManagerPoolService, alert2.NewAlertManagerRecordService, alert2.NewAlertManagerRuleService, alert2.NewAlertManagerSendService, scrape2.NewPrometheusScrapeService, scrape2.NewPrometheusPoolService, config2.NewMonitorConfigService, service3.NewNotAuthService, service5.NewFormDesignService, service5.NewInstanceService, service5.NewInstanceFlowService, service5.NewInstanceCommentService, service5.NewWorkorderInstanceTimeLineService, service5.NewWorkorderTemplateService, service5.NewWorkorderProcessService, service5.NewCategoryGroupService, service5.NewWorkorderNotificationService, service6.NewTreeNodeService, service6.NewTreeLocalService, service6.NewTreeCloudService, service6.NewCloudAccountService, service6.NewCloudAccountRegionService, service7.NewCronService) +var ServiceSet = wire.NewSet(service3.NewClusterService, service3.NewDeploymentService, service3.NewNamespaceService, service3.NewSvcService, service3.NewNodeService, service3.NewTaintService, service3.NewYamlTaskService, service3.NewYamlTemplateService, service3.NewDaemonSetService, service3.NewEventService, service3.NewStatefulSetService, service3.NewServiceAccountService, service3.NewRoleService, service3.NewClusterRoleService, service3.NewRoleBindingService, service3.NewClusterRoleBindingService, service3.NewRBACService, service3.NewIngressService, service3.NewPodService, service3.NewConfigMapService, service3.NewSecretService, service3.NewPVService, service3.NewPVCService, service.NewUserService, service.NewApiService, service.NewRoleService, service.NewAuditService, service.NewSystemService, alert2.NewAlertManagerEventService, alert2.NewAlertManagerOnDutyService, alert2.NewAlertManagerPoolService, alert2.NewAlertManagerRecordService, alert2.NewAlertManagerRuleService, alert2.NewAlertManagerSendService, scrape2.NewPrometheusScrapeService, scrape2.NewPrometheusPoolService, config2.NewMonitorConfigService, service2.NewNotAuthService, service4.NewFormDesignService, service4.NewInstanceService, service4.NewInstanceFlowService, service4.NewInstanceCommentService, service4.NewWorkorderInstanceTimeLineService, service4.NewWorkorderTemplateService, service4.NewWorkorderProcessService, service4.NewCategoryGroupService, service4.NewWorkorderNotificationService, service5.NewTreeNodeService, service5.NewTreeLocalService, service5.NewTreeCloudService, service5.NewCloudAccountService, service5.NewCloudAccountRegionService, service6.NewCronService) -var DaoSet = wire.NewSet(alert.NewAlertManagerEventDAO, alert.NewAlertManagerOnDutyDAO, alert.NewAlertManagerPoolDAO, alert.NewAlertManagerRecordDAO, alert.NewAlertManagerRuleDAO, alert.NewAlertManagerSendDAO, scrape.NewScrapeJobDAO, scrape.NewScrapePoolDAO, config.NewMonitorConfigDAO, dao2.NewUserDAO, dao.NewRoleDAO, dao.NewApiDAO, dao.NewAuditDAO, dao3.NewClusterDAO, dao3.NewYamlTaskDAO, dao3.NewYamlTemplateDAO, dao4.NewWorkorderFormDesignDAO, dao4.NewTemplateDAO, dao4.NewWorkorderInstanceDAO, dao4.NewProcessDAO, dao4.NewWorkorderCategoryDAO, dao4.NewWorkorderInstanceCommentDAO, dao4.NewInstanceFlowDAO, dao4.NewInstanceTimeLineDAO, dao4.NewNotificationDAO, dao5.NewTreeNodeDAO, dao5.NewTreeLocalDAO, dao5.NewTreeCloudDAO, dao5.NewCloudAccountDAO, dao5.NewCloudAccountRegionDAO, dao6.NewCronJobDAO) +var DaoSet = wire.NewSet(alert.NewAlertManagerEventDAO, alert.NewAlertManagerOnDutyDAO, alert.NewAlertManagerPoolDAO, alert.NewAlertManagerRecordDAO, alert.NewAlertManagerRuleDAO, alert.NewAlertManagerSendDAO, scrape.NewScrapeJobDAO, scrape.NewScrapePoolDAO, config.NewMonitorConfigDAO, dao.NewUserDAO, dao.NewRoleDAO, dao.NewApiDAO, dao.NewAuditDAO, dao2.NewClusterDAO, dao2.NewYamlTaskDAO, dao2.NewYamlTemplateDAO, dao3.NewWorkorderFormDesignDAO, dao3.NewTemplateDAO, dao3.NewWorkorderInstanceDAO, dao3.NewProcessDAO, dao3.NewWorkorderCategoryDAO, dao3.NewWorkorderInstanceCommentDAO, dao3.NewInstanceFlowDAO, dao3.NewInstanceTimeLineDAO, dao3.NewNotificationDAO, dao4.NewTreeNodeDAO, dao4.NewTreeLocalDAO, dao4.NewTreeCloudDAO, dao4.NewCloudAccountDAO, dao4.NewCloudAccountRegionDAO, dao5.NewCronJobDAO) var SSHSet = wire.NewSet(ssh.NewClient) -var UtilSet = wire.NewSet(utils.NewJWTHandler, sse.NewHandler) +var UtilSet = wire.NewSet(jwt.NewJWTHandler, sse.NewHandler) var ManagerSet = wire.NewSet(manager.NewClusterManager, manager.NewDeploymentManager, manager.NewNamespaceManager, manager.NewServiceManager, manager.NewNodeManager, manager.NewEventManager, manager.NewStatefulSetManager, manager.NewDaemonSetManager, manager.NewServiceAccountManager, manager.NewTaintManager, manager.NewYamlManager, manager.NewConfigMapManager, manager.NewSecretManager, manager.NewPVManager, manager.NewPVCManager, manager.NewClusterRoleManager, manager.NewClusterRoleBindingManager, manager.NewRoleManager, manager.NewRoleBindingManager, manager.NewIngressManager, manager.NewPodManager) diff --git a/pkg/utils/jwt.go b/pkg/jwt/jwt.go similarity index 81% rename from pkg/utils/jwt.go rename to pkg/jwt/jwt.go index 99a4fecb..14174f98 100644 --- a/pkg/utils/jwt.go +++ b/pkg/jwt/jwt.go @@ -23,7 +23,7 @@ * */ -package utils +package jwt import ( "errors" @@ -39,6 +39,14 @@ import ( "github.com/redis/go-redis/v9" ) +const ( + bearerPrefix = "Bearer " + authorizationHeaderKey = "Authorization" + defaultJWTExpirationMinutes = 30 + sessionKeyPattern = "cloudops:user:ssid:%s" + tokenBlacklistKeyPattern = "cloudops:blacklist:token:%s" +) + type Handler interface { SetLoginToken(ctx *gin.Context, uid int, username string, accountType int8) (string, string, error) SetJWTToken(ctx *gin.Context, uid int, username string, ssid string, accountType int8) (string, error) @@ -69,6 +77,7 @@ type RefreshClaims struct { type handler struct { client redis.Cmdable signingMethod jwt.SigningMethod + jwtExpiration time.Duration rcExpiration time.Duration key1 []byte key2 []byte @@ -79,10 +88,15 @@ func NewJWTHandler(c redis.Cmdable) Handler { key1 := viper.GetString("jwt.key1") key2 := viper.GetString("jwt.key2") issuer := viper.GetString("jwt.issuer") + expirationMinutes := viper.GetInt64("jwt.expiration") + if expirationMinutes <= 0 { + expirationMinutes = defaultJWTExpirationMinutes + } return &handler{ client: c, signingMethod: jwt.SigningMethodHS512, + jwtExpiration: time.Minute * time.Duration(expirationMinutes), rcExpiration: time.Hour * 24 * 7, key1: []byte(key1), key2: []byte(key2), @@ -109,15 +123,6 @@ func (h *handler) SetLoginToken(ctx *gin.Context, uid int, username string, acco // SetJWTToken 设置短Token func (h *handler) SetJWTToken(ctx *gin.Context, uid int, username string, ssid string, accountType int8) (string, error) { - // 从配置文件中获取JWT的过期时间 - expirationMinutes := viper.GetInt64("jwt.expiration") - - // 如果未设置或值无效,设置一个默认值,例如30分钟 - if expirationMinutes <= 0 { - expirationMinutes = 30 - } - - // 构建用户声明信息 uc := UserClaims{ Uid: uid, Username: username, @@ -126,19 +131,12 @@ func (h *handler) SetJWTToken(ctx *gin.Context, uid int, username string, ssid s ContentType: ctx.GetHeader("Content-Type"), AccountType: accountType, RegisteredClaims: jwt.RegisteredClaims{ - ExpiresAt: jwt.NewNumericDate(time.Now().Add(time.Minute * time.Duration(expirationMinutes))), + ExpiresAt: jwt.NewNumericDate(time.Now().Add(h.jwtExpiration)), Issuer: h.issuer, }, } - token := jwt.NewWithClaims(h.signingMethod, uc) - // 进行签名 - signedString, err := token.SignedString(h.key1) - if err != nil { - return "", err - } - - return signedString, nil + return h.signClaims(uc, h.key1) } // setRefreshToken 设置长Token @@ -154,36 +152,22 @@ func (h *handler) setRefreshToken(_ *gin.Context, uid int, username string, ssid }, } - t := jwt.NewWithClaims(h.signingMethod, rc) - signedString, err := t.SignedString(h.key2) - if err != nil { - return "", err - } - - return signedString, nil + return h.signClaims(rc, h.key2) } // ExtractToken 提取 Authorization 头部中的 Token func (h *handler) ExtractToken(ctx *gin.Context) string { - authCode := ctx.GetHeader("Authorization") - if authCode == "" { - return "" - } - - // Authorization 头部格式需为 Bearer string - s := strings.Split(authCode, " ") - - if len(s) != 2 { + token, err := h.extractBearerToken(ctx) + if err != nil { return "" } - - return s[1] + return token } // CheckSession 检查会话状态 func (h *handler) CheckSession(ctx *gin.Context, ssid string) error { // 判断缓存中是否存在指定键 - c, err := h.client.Exists(ctx, fmt.Sprintf("linkme:user:ssid:%s", ssid)).Result() + c, err := h.client.Exists(ctx, fmt.Sprintf(sessionKeyPattern, ssid)).Result() if err != nil { return err } @@ -223,23 +207,31 @@ func (h *handler) ClearToken(ctx *gin.Context) error { // 提取 Bearer Token func (h *handler) extractBearerToken(ctx *gin.Context) (string, error) { - authHeader := ctx.GetHeader("Authorization") + authHeader := strings.TrimSpace(ctx.GetHeader(authorizationHeaderKey)) if authHeader == "" { return "", errors.New("missing authorization token") } - const bearerPrefix = "Bearer " - if len(authHeader) <= len(bearerPrefix) || authHeader[:len(bearerPrefix)] != bearerPrefix { + if !strings.HasPrefix(authHeader, bearerPrefix) { return "", errors.New("invalid authorization token format") } - return authHeader[len(bearerPrefix):], nil + token := strings.TrimSpace(authHeader[len(bearerPrefix):]) + if token == "" { + return "", errors.New("authorization token is empty") + } + return token, nil } // 将 token 加入 Redis 黑名单 func (h *handler) addToBlacklist(ctx *gin.Context, authToken string, expiresAt time.Time) error { remainingTime := time.Until(expiresAt) - blacklistKey := fmt.Sprintf("blacklist:token:%s", authToken) + if remainingTime <= 0 { + // 保证Redis中至少缓存一个极短的过期时间,避免永久存留 + remainingTime = time.Second + } + + blacklistKey := fmt.Sprintf(tokenBlacklistKeyPattern, authToken) // 将 token 存入 Redis,并设置过期时间 if err := h.client.Set(ctx, blacklistKey, "invalid", remainingTime).Err(); err != nil { @@ -247,3 +239,8 @@ func (h *handler) addToBlacklist(ctx *gin.Context, authToken string, expiresAt t } return nil } + +func (h *handler) signClaims(claims jwt.Claims, key []byte) (string, error) { + t := jwt.NewWithClaims(h.signingMethod, claims) + return t.SignedString(key) +} diff --git a/pkg/utils/net/dialer_others.go b/pkg/net/dialer_others.go similarity index 100% rename from pkg/utils/net/dialer_others.go rename to pkg/net/dialer_others.go diff --git a/pkg/utils/net/dialer_windows.go b/pkg/net/dialer_windows.go similarity index 100% rename from pkg/utils/net/dialer_windows.go rename to pkg/net/dialer_windows.go diff --git a/pkg/utils/net/net.go b/pkg/net/net.go similarity index 100% rename from pkg/utils/net/net.go rename to pkg/net/net.go diff --git a/pkg/utils/retry/retry.go b/pkg/retry/retry.go similarity index 100% rename from pkg/utils/retry/retry.go rename to pkg/retry/retry.go diff --git a/pkg/utils/retry/retry_test.go b/pkg/retry/retry_test.go similarity index 100% rename from pkg/utils/retry/retry_test.go rename to pkg/retry/retry_test.go diff --git a/pkg/utils/ssh.go b/pkg/ssh/ssh.go similarity index 99% rename from pkg/utils/ssh.go rename to pkg/ssh/ssh.go index 1d6d7e5b..49b34558 100644 --- a/pkg/utils/ssh.go +++ b/pkg/ssh/ssh.go @@ -23,7 +23,7 @@ * */ -package utils +package ssh import ( "net/http" diff --git a/pkg/utils/stream/sse.go b/pkg/stream/sse.go similarity index 100% rename from pkg/utils/stream/sse.go rename to pkg/stream/sse.go diff --git a/pkg/utils/terminal/terminal.go b/pkg/terminal/terminal.go similarity index 100% rename from pkg/utils/terminal/terminal.go rename to pkg/terminal/terminal.go diff --git a/pkg/utils/prometheus.go b/pkg/utils/prometheus.go deleted file mode 100644 index d5adba07..00000000 --- a/pkg/utils/prometheus.go +++ /dev/null @@ -1,518 +0,0 @@ -/* - * MIT License - * - * Copyright (c) 2024 Bamboo - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -package utils - -import ( - "bytes" - "context" - "crypto/sha256" - "encoding/hex" - "encoding/json" - "fmt" - "io" - "log" - "net/http" - "net/url" - "os" - "slices" - "sort" - "strings" - "time" - - "github.com/GoSimplicity/AI-CloudOps/internal/model" - "github.com/prometheus/alertmanager/pkg/labels" - pcc "github.com/prometheus/common/config" - promModel "github.com/prometheus/common/model" - pc "github.com/prometheus/prometheus/config" - "github.com/prometheus/prometheus/discovery" - "github.com/prometheus/prometheus/model/relabel" - "github.com/prometheus/prometheus/promql/parser" - "go.uber.org/zap" -) - -func CheckPoolIpExists(pools []*model.MonitorScrapePool, req *model.MonitorScrapePool) error { - var ipPrometheus []string - - for _, pool := range pools { - if pool.ID == req.ID { - continue - } - - ipPrometheus = append(ipPrometheus, pool.PrometheusInstances...) - } - - for _, ip := range req.PrometheusInstances { - if slices.Contains(ipPrometheus, ip) { - return fmt.Errorf("PrometheusInstances %v 已存在", ip) - } - } - - return nil -} - -func CheckAlertsIpExists(req *model.MonitorAlertManagerPool, rules []*model.MonitorAlertManagerPool) bool { - ips := make(map[string]string) - - for _, rule := range rules { - if req.ID == rule.ID { - continue - } - - for _, ip := range rule.AlertManagerInstances { - ips[ip] = rule.Name - } - } - - for _, ip := range req.AlertManagerInstances { - if req.ID != 0 && ips[ip] == req.Name { - continue - } - - if _, ok := ips[ip]; ok { - return true - } - } - - return false -} - -func CheckAlertIpExists(req *model.MonitorAlertManagerPool, pools []*model.MonitorAlertManagerPool) error { - var ips []string - - for _, pool := range pools { - if pool.ID == req.ID { - continue - } - - ips = append(ips, pool.AlertManagerInstances...) - } - - for _, ip := range req.AlertManagerInstances { - if slices.Contains(ips, ip) { - return fmt.Errorf("AlertManagerInstances %v 已存在", ip) - } - } - - return nil -} - -// ParseTags 将 ECS 的 Tags 切片解析为 Prometheus 的标签映射 -func ParseTags(tags []string) (map[promModel.LabelName]promModel.LabelValue, error) { - labels := make(map[promModel.LabelName]promModel.LabelValue) - - // 遍历 tags 切片,每两个元素构成一个键值对 - for i := 0; i < len(tags); i += 2 { - key := strings.TrimSpace(tags[i]) - if key == "" { - return nil, fmt.Errorf("标签键不能为空") - } - - // 确保有对应的值 - if i+1 >= len(tags) { - return nil, fmt.Errorf("标签值缺失,键: '%s' 无对应值", key) - } - - value := strings.TrimSpace(tags[i+1]) - labels[promModel.LabelName(key)] = promModel.LabelValue(value) - } - - return labels, nil -} - -// ParseExternalLabels 解析外部标签 -func ParseExternalLabels(labelsList []string) []string { - var parsed []string - - // 示例:["key1=value1", "key2=value2"] - for _, label := range labelsList { - // 根据 "=" 分割字符串 - parts := strings.SplitN(label, "=", 2) - if len(parts) == 2 { - parsed = append(parsed, parts[0], parts[1]) - } - } - - // 返回的格式为 ["key1", "value1", "key2", "value2"] - return parsed -} - -// ParseURL 解析字符串为URL,返回错误而非 panic -func ParseURL(u string) (*pcc.URL, error) { - parsed, err := url.Parse(u) - if err != nil { - return nil, fmt.Errorf("无效的URL: %s", u) - } - - return &pcc.URL{URL: parsed}, nil -} - -// GenPromDuration 转换秒为Prometheus Duration -func GenPromDuration(seconds int) promModel.Duration { - if seconds <= 0 { - return promModel.Duration(5 * time.Second) - } - return promModel.Duration(time.Duration(seconds) * time.Second) -} - -// DeepCopyScrapeConfig 深度拷贝 ScrapeConfig -func DeepCopyScrapeConfig(sc *pc.ScrapeConfig) *pc.ScrapeConfig { - copySc := *sc - - // 深度拷贝 RelabelConfigs - if sc.RelabelConfigs != nil { - copySc.RelabelConfigs = make([]*relabel.Config, len(sc.RelabelConfigs)) - for i, rc := range sc.RelabelConfigs { - copyRC := *rc - copySc.RelabelConfigs[i] = ©RC - } - } - - // 深度拷贝 ServiceDiscoveryConfigs - if sc.ServiceDiscoveryConfigs != nil { - copySc.ServiceDiscoveryConfigs = make(discovery.Configs, len(sc.ServiceDiscoveryConfigs)) - copy(copySc.ServiceDiscoveryConfigs, sc.ServiceDiscoveryConfigs) - } - - return ©Sc -} - -func PromqlExprCheck(expr string) (bool, error) { - if expr == "" { - return false, fmt.Errorf("expression cannot be empty") - } - - // 解析 PromQL 表达式 - _, err := parser.ParseExpr(expr) - if err != nil { - return false, fmt.Errorf("invalid PromQL expression: %v", err) - } - - return true, nil -} - -func BuildMatchers(alertEvent *model.MonitorAlertEvent, l *zap.Logger, useName int8) ([]*labels.Matcher, error) { - var matchers []*labels.Matcher - if useName == 1 { - // 如果 useName 为 true,仅使用 alertname 匹配器 - alertName, exists := alertEvent.LabelsMap["alertname"] - if !exists { - l.Error("EventAlertSilence failed: alertname missing in LabelsMatcher", zap.Int("id", alertEvent.ID)) - return nil, fmt.Errorf("alertname missing in LabelsMatcher") - } - matchers = []*labels.Matcher{ - { - Type: labels.MatchEqual, - Name: "alertname", - Value: alertName, - }, - } - } else { - // 否则,使用所有标签匹配器 - for key, val := range alertEvent.LabelsMap { - matcher := &labels.Matcher{ - Type: labels.MatchEqual, - Name: key, - Value: val, - } - matchers = append(matchers, matcher) - } - } - return matchers, nil -} - -func SendSilenceRequest(ctx context.Context, l *zap.Logger, url string, data []byte) (string, error) { - req, err := http.NewRequestWithContext(ctx, "POST", url, bytes.NewBuffer(data)) - if err != nil { - l.Error("sendSilenceRequest failed: create HTTP request error", zap.Error(err)) - return "", err - } - req.Header.Set("Content-Type", "application/json") - - client := &http.Client{Timeout: 10 * time.Second} - resp, err := client.Do(req) - if err != nil { - l.Error("sendSilenceRequest failed: send HTTP request error", zap.Error(err)) - return "", err - } - defer resp.Body.Close() - - if resp.StatusCode != http.StatusOK && resp.StatusCode != http.StatusCreated { - body, _ := io.ReadAll(resp.Body) - l.Error("sendSilenceRequest failed: AlertManager response error", zap.Int("status", resp.StatusCode), zap.String("body", string(body))) - return "", fmt.Errorf("AlertManager request failed, status: %d, response: %s", resp.StatusCode, string(body)) - } - - // 解析响应 - var result struct { - Status string `json:"status"` - Data struct { - ID string `json:"id"` - } `json:"data"` - } - if err := json.NewDecoder(resp.Body).Decode(&result); err != nil { - l.Error("sendSilenceRequest failed: decode response error", zap.Error(err)) - return "", err - } - - if result.Status != "success" { - l.Error("sendSilenceRequest failed: AlertManager status not success", zap.String("status", result.Status)) - return "", fmt.Errorf("AlertManager status not success, status: %s", result.Status) - } - - return result.Data.ID, nil -} - -func FromSliceTuMap(kvs []string) map[string]string { - labelsMap := make(map[string]string) - for _, i := range kvs { - parts := strings.Split(i, "=") - if len(parts) != 2 { - continue - } - labelsMap[parts[0]] = parts[1] - } - return labelsMap -} - -// PostWithJson 发送带有JSON字符串的POST请求 -func PostWithJson(ctx context.Context, client *http.Client, l *zap.Logger, url string, jsonStr string, params map[string]string, headers map[string]string) ([]byte, error) { - // 创建 HTTP 请求 - req, err := http.NewRequestWithContext(ctx, "POST", url, bytes.NewBuffer([]byte(jsonStr))) - if err != nil { - l.Error("创建 HTTP 请求失败", - zap.Error(err), - zap.String("url", url), - ) - return nil, err - } - - // 设置查询参数 - q := req.URL.Query() - for k, v := range params { - q.Add(k, v) - } - - req.URL.RawQuery = q.Encode() - - // 设置请求头 - for key, value := range headers { - req.Header.Set(key, value) - } - - // 设置默认 Content-Type - if _, exists := headers["Content-Type"]; !exists { - req.Header.Set("Content-Type", "application/json") - } - - // 发送请求 - resp, err := client.Do(req) - if err != nil { - l.Error("发送 HTTP 请求失败", - zap.Error(err), - zap.String("url", url), - ) - return nil, err - } - defer resp.Body.Close() - - // 读取响应体 - bodyBytes, err := io.ReadAll(resp.Body) - if err != nil { - l.Error("读取响应体失败", - zap.Error(err), - zap.String("url", url), - ) - return nil, err - } - - // 检查 HTTP 状态码 - if resp.StatusCode < 200 || resp.StatusCode >= 300 { - l.Error("服务器返回非2xx状态码", - zap.String("url", url), - zap.Int("statusCode", resp.StatusCode), - zap.String("responseBody", string(bodyBytes)), - ) - return bodyBytes, fmt.Errorf("server returned HTTP status %s", resp.Status) - } - - return bodyBytes, nil -} - -// CloneMap 克隆一个字符串到字符串的映射 -func CloneMap(original map[string]string) map[string]string { - if original == nil { - return nil - } - cloned := make(map[string]string, len(original)) - for k, v := range original { - cloned[k] = v - } - return cloned -} - -// FormatMap 将 map[string]string 格式化为字符串,每个键值对占一行 -func FormatMap(m map[string]string) string { - var builder strings.Builder - for k, v := range m { - builder.WriteString(fmt.Sprintf("%s=%s ", k, v)) - } - return strings.TrimSpace(builder.String()) -} - -type promHashPayload struct { - Name string `json:"name"` - PrometheusInstances []string `json:"prometheus_instances"` - AlertManagerInstances []string `json:"alert_manager_instances"` - ScrapeInterval int `json:"scrape_interval"` - ScrapeTimeout int `json:"scrape_timeout"` - RemoteTimeoutSeconds int `json:"remote_timeout_seconds"` - SupportAlert int8 `json:"support_alert"` - SupportRecord int8 `json:"support_record"` - ExternalLabels []string `json:"external_labels"` - RemoteWriteUrl string `json:"remote_write_url"` - RemoteReadUrl string `json:"remote_read_url"` - AlertManagerUrl string `json:"alert_manager_url"` - RecordFilePath string `json:"record_file_path"` -} - -// CalculateHash 计算哈希值(不修改入参数据) -func CalculatePromHash(pool *model.MonitorScrapePool) string { - // 使用副本进行排序,避免修改入参 - instancesCopy := append([]string(nil), pool.PrometheusInstances...) - labelsCopy := append([]string(nil), pool.Tags...) - sort.Strings(instancesCopy) - sort.Strings(labelsCopy) - - payload := promHashPayload{ - Name: pool.Name, - PrometheusInstances: instancesCopy, - ScrapeInterval: pool.ScrapeInterval, - ScrapeTimeout: pool.ScrapeTimeout, - RemoteTimeoutSeconds: pool.RemoteTimeoutSeconds, - SupportAlert: pool.SupportAlert, - SupportRecord: pool.SupportRecord, - ExternalLabels: labelsCopy, - RemoteWriteUrl: pool.RemoteWriteUrl, - RemoteReadUrl: pool.RemoteReadUrl, - AlertManagerUrl: pool.AlertManagerUrl, - RecordFilePath: pool.RecordFilePath, - } - - // 稳定序列化 - data, _ := json.Marshal(payload) - - // 计算哈希 - hash := sha256.New() - hash.Write(data) - return hex.EncodeToString(hash.Sum(nil)) -} - -type alertHashPayload struct { - Name string `json:"name"` - AlertManagerInstances []string `json:"alert_manager_instances"` - ResolveTimeout string `json:"resolve_timeout"` - GroupWait string `json:"group_wait"` - GroupInterval string `json:"group_interval"` - RepeatInterval string `json:"repeat_interval"` - GroupBy []string `json:"group_by"` - Receiver string `json:"receiver"` -} - -func CalculateAlertHash(pool *model.MonitorAlertManagerPool) string { - // 使用副本进行排序,避免修改入参 - instancesCopy := append([]string(nil), pool.AlertManagerInstances...) - groupByCopy := append([]string(nil), pool.GroupBy...) - sort.Strings(instancesCopy) - sort.Strings(groupByCopy) - - payload := alertHashPayload{ - Name: pool.Name, - AlertManagerInstances: instancesCopy, - ResolveTimeout: pool.ResolveTimeout, - GroupWait: pool.GroupWait, - GroupInterval: pool.GroupInterval, - RepeatInterval: pool.RepeatInterval, - GroupBy: groupByCopy, - Receiver: pool.Receiver, - } - - // 稳定序列化 - data, _ := json.Marshal(payload) - - // 计算哈希 - hash := sha256.New() - hash.Write(data) - return hex.EncodeToString(hash.Sum(nil)) -} - -// 深拷贝map -func CopyMap[K comparable, V any](src map[K]V) map[K]V { - dst := make(map[K]V, len(src)) - for k, v := range src { - dst[k] = v - } - return dst -} - -// 清理失败池子的临时文件 -func CleanupFailedPool(localYamlDir string, pool *model.MonitorScrapePool, instances int) { - for i := 0; i < instances; i++ { - filePath := fmt.Sprintf("%s/%s/prometheus_pool_%s_%d.yaml", - localYamlDir, pool.Name, pool.Name, i) - if err := os.Remove(filePath); err != nil && !os.IsNotExist(err) { - log.Println("清理临时文件失败", filePath, err) - } - } -} - -// 清理已更新池子的旧IP -func CleanupOldIPs(tempConfigMap map[string]string, - updatedPools map[string]struct{}, validIPs map[string]struct{}) { - - for ip := range tempConfigMap { - if _, ok := validIPs[ip]; !ok { - // 检查该IP是否属于被修改的池子 - for poolName := range updatedPools { - if strings.HasPrefix(ip, poolName+"_") { - delete(tempConfigMap, ip) - break - } - } - } - } -} - -// 原子性写入文件 -func AtomicWriteFile(filePath string, data []byte) error { - tmpFilePath := filePath + ".tmp" - if err := os.WriteFile(tmpFilePath, data, 0644); err != nil { - return fmt.Errorf("写入临时文件失败: %w", err) - } - if err := os.Rename(tmpFilePath, filePath); err != nil { - return fmt.Errorf("重命名临时文件失败: %w", err) - } - return nil -} diff --git a/scripts/generate-swagger.sh b/scripts/generate-swagger.sh deleted file mode 100755 index 4233b4e6..00000000 --- a/scripts/generate-swagger.sh +++ /dev/null @@ -1,79 +0,0 @@ -#!/bin/bash - -# AI-CloudOps Swagger 文档生成脚本 -# 设置环境变量并生成 Swagger 文档 - -set -e - -echo "🚀 AI-CloudOps Swagger 文档生成器" -echo "==================================" - -# 检查环境变量,如果没有设置则使用默认值 -if [ -z "$SWAGGER_ENABLED" ]; then - export SWAGGER_ENABLED=true -fi - -if [ -z "$SWAGGER_VERBOSE" ]; then - export SWAGGER_VERBOSE=true -fi - -echo "⚙️ 环境配置:" -echo " SWAGGER_ENABLED=$SWAGGER_ENABLED" -echo " SWAGGER_VERBOSE=$SWAGGER_VERBOSE" -echo "" - -# 检查工具是否存在 -if [ ! -f "tools/swagger-auto-gen/swagger-auto-gen" ]; then - echo "🔧 构建生成工具..." - cd tools/swagger-auto-gen && go build -o swagger-auto-gen . && cd ../.. -fi - -# 检查是否启用 Swagger 生成 -if [ "$SWAGGER_ENABLED" = "false" ]; then - echo "⏭️ Swagger文档生成已禁用,跳过生成过程" - echo "" - echo "💡 提示:" - echo " - 使用 'export SWAGGER_ENABLED=true' 重新启用" - echo " - 使用 'make swagger' 快速生成文档" - exit 0 -fi - -# 生成文档 -echo "📄 生成 Swagger 文档..." -./tools/swagger-auto-gen/swagger-auto-gen -root . -output ./docs -v - -# 验证生成结果 -echo "" -echo "✅ 验证生成结果..." -if [ -f "docs/swagger.json" ]; then - echo " ✅ swagger.json 已生成" - echo " 📊 文件大小: $(du -h docs/swagger.json | cut -f1)" -else - echo " ❌ swagger.json 生成失败" - exit 1 -fi - -if [ -f "docs/swagger.yaml" ]; then - echo " ✅ swagger.yaml 已生成" - echo " 📊 文件大小: $(du -h docs/swagger.yaml | cut -f1)" -else - echo " ❌ swagger.yaml 生成失败" - exit 1 -fi - -if [ -f "docs/docs.go" ]; then - echo " ✅ docs.go 已生成" - echo " 📊 文件大小: $(du -h docs/docs.go | cut -f1)" -else - echo " ❌ docs.go 生成失败" - exit 1 -fi - -echo "" -echo "🎉 Swagger 文档生成完成!" -echo "🌐 访问地址: http://localhost:8889/swagger/index.html" -echo "" -echo "💡 提示:" -echo " - 使用 'go run main.go' 启动服务器" -echo " - 使用 'make swagger' 快速生成文档" -echo " - 使用 'go generate' 执行所有生成任务" diff --git a/scripts/setup-git-hooks.sh b/scripts/setup-git-hooks.sh index abea7e82..405c9a3e 100755 --- a/scripts/setup-git-hooks.sh +++ b/scripts/setup-git-hooks.sh @@ -45,15 +45,7 @@ show_setup_result() { echo "🎉 Git Hooks 设置完成!" echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" echo "" - echo "📝 注意:" - echo " Swagger 自动生成功能已禁用" - echo " 请使用以下命令手动生成文档:" - echo "" - echo " make swagger - 生成 Swagger 文档" - echo " make swagger-manual - 使用传统方式生成" - echo " make swagger-validate - 验证生成的文档" - echo " make swagger-clean - 清理生成的文档" - echo "" + echo "你可以现在开始愉快地开发啦 🚀" echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" } @@ -63,9 +55,6 @@ main() { check_git_repo - log_warning "Swagger 自动生成功能已被禁用" - log_info "文档生成已改为纯手动方式" - show_setup_result } diff --git a/scripts/swagger-helper.sh b/scripts/swagger-helper.sh deleted file mode 100755 index 889b550d..00000000 --- a/scripts/swagger-helper.sh +++ /dev/null @@ -1,266 +0,0 @@ -#!/bin/bash - -set -e - -# 颜色定义 -RED='\033[0;31m' -GREEN='\033[0;32m' -YELLOW='\033[1;33m' -BLUE='\033[0;34m' -NC='\033[0m' # No Color - -# 项目根目录 -PROJECT_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" -cd "$PROJECT_ROOT" - -# 日志函数 -log_info() { - echo -e "${BLUE}[INFO]${NC} $1" -} - -log_success() { - echo -e "${GREEN}[SUCCESS]${NC} $1" -} - -log_warning() { - echo -e "${YELLOW}[WARNING]${NC} $1" -} - -log_error() { - echo -e "${RED}[ERROR]${NC} $1" -} - -# 检查依赖 -check_dependencies() { - log_info "检查依赖工具..." - - if ! command -v swag &> /dev/null; then - log_error "swag 工具未安装,请运行: go install github.com/swaggo/swag/cmd/swag@latest" - exit 1 - fi - - if ! command -v go &> /dev/null; then - log_error "Go 工具未安装" - exit 1 - fi - - log_success "依赖检查通过" -} - -# 生成 Swagger 文档 -generate_docs() { - log_info "生成 Swagger API 文档..." - - # 清理旧文档 - rm -f docs/docs.go docs/swagger.json docs/swagger.yaml - - # 生成新文档 - swag init --output ./docs --parseDependency --parseInternal --exclude ./internal/*/service --dir ./ --generalInfo main.go - - if [ -f "docs/swagger.json" ]; then - local file_size=$(du -h docs/swagger.json | cut -f1) - log_success "文档生成成功!文件大小: $file_size" - log_info "访问地址: http://localhost:8889/swagger/index.html" - else - log_error "文档生成失败!" - exit 1 - fi -} - -# 检查 Swagger 注解完整性 -check_annotations() { - log_info "检查 Swagger 注解完整性..." - - # 统计 API 函数 - 修复语法错误 - echo "正在统计 API 函数..." - find internal/*/api -name "*.go" -exec grep -c "func.*Handler" {} \; -exec echo {} \; | paste - - | while read count file; do - echo "$file:$count" - done - - echo "包含 Swagger 注解的函数:" - find internal/*/api -name "*.go" -exec grep -c "@Summary" {} \; -exec echo {} \; | paste - - | while read count file; do - echo "$file:$count" - done - - # 计算总数 - 使用更安全的方法 - local total_funcs=0 - local swagger_funcs=0 - - while IFS=: read -r file count; do - if [[ "$count" =~ ^[0-9]+$ ]]; then - total_funcs=$((total_funcs + count)) - fi - done < <(find internal/*/api -name "*.go" -exec grep -c "func.*Handler" {} \; -exec echo {} \; | paste - -) - - while IFS=: read -r file count; do - if [[ "$count" =~ ^[0-9]+$ ]]; then - swagger_funcs=$((swagger_funcs + count)) - fi - done < <(find internal/*/api -name "*.go" -exec grep -c "@Summary" {} \; -exec echo {} \; | paste - -) - - echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" - echo "📊 Swagger 注解统计报告" - echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" - echo "总 API 处理函数数量: $total_funcs" - echo "包含 @Summary 注解的函数: $swagger_funcs" - - # 使用数字比较而不是字符串比较 - if [[ "$swagger_funcs" -lt "$total_funcs" ]] && [[ "$total_funcs" -gt 0 ]]; then - local missing=$((total_funcs - swagger_funcs)) - log_warning "发现 $missing 个函数缺少 Swagger 注解" - - echo "" - echo "缺少注解的文件:" - find internal/*/api -name "*.go" -exec grep -L "@Summary" {} \; 2>/dev/null || true - - echo "" - log_info "建议运行 'bash scripts/swagger-helper.sh fix' 来自动修复" - else - log_success "所有 API 函数都包含 Swagger 注解!" - fi - echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" -} - -# 验证生成的文档 -validate_docs() { - log_info "验证生成的文档..." - - # 检查文件是否存在 - if [ ! -f "docs/swagger.json" ]; then - log_error "swagger.json 不存在,请先生成文档" - return 1 - fi - - if [ ! -f "docs/swagger.yaml" ]; then - log_error "swagger.yaml 不存在,请先生成文档" - return 1 - fi - - # 统计 API 数量 - local api_count=$(grep -c '"paths"' docs/swagger.json || echo "0") - local method_count=$(grep -o '"get"\|"post"\|"put"\|"delete"\|"patch"' docs/swagger.json | wc -l || echo "0") - - log_success "文档验证通过" - echo " - swagger.json: $(du -h docs/swagger.json | cut -f1)" - echo " - swagger.yaml: $(du -h docs/swagger.yaml | cut -f1)" - echo " - API 路径数量: $api_count" - echo " - HTTP 方法数量: $method_count" -} - -# 启动服务器并打开 Swagger UI -serve_docs() { - log_info "打开 Swagger UI..." - - # 检查服务器是否运行 - if ! pgrep -f "AI-CloudOps" > /dev/null; then - log_warning "服务器未运行,请先启动服务器:" - echo " make dev # 使用 Docker" - echo " go run main.go # 直接运行" - return 1 - fi - - local swagger_url="http://localhost:8889/swagger/index.html" - log_info "Swagger UI 地址: $swagger_url" - - # 根据操作系统打开浏览器 - if command -v open > /dev/null; then - open "$swagger_url" - elif command -v xdg-open > /dev/null; then - xdg-open "$swagger_url" - else - log_info "请手动在浏览器中打开: $swagger_url" - fi -} - -# 修复缺失的 Swagger 注解 (基础版本) -fix_annotations() { - log_info "自动修复缺失的 Swagger 注解..." - - # 查找缺少注解的文件 - local files_to_fix=$(find internal/*/api -name "*.go" -exec grep -L "@Summary" {} \;) - - if [ -z "$files_to_fix" ]; then - log_success "没有发现缺少注解的文件" - return 0 - fi - - log_warning "以下文件需要添加 Swagger 注解:" - echo "$files_to_fix" - echo "" - - log_info "请手动为这些文件添加 Swagger 注解。" - log_info "参考格式:" - echo "// @Summary 功能描述" - echo "// @Description 详细描述" - echo "// @Tags 模块标签" - echo "// @Accept json" - echo "// @Produce json" - echo "// @Param param_name param_location param_type required \"描述\"" - echo "// @Success 200 {object} utils.ApiResponse \"成功\"" - echo "// @Failure 400 {object} utils.ApiResponse \"参数错误\"" - echo "// @Security BearerAuth" - echo "// @Router /api/path [method]" -} - -# 显示帮助信息 -show_help() { - echo "Swagger 文档助手" - echo "" - echo "用法:" - echo " bash scripts/swagger-helper.sh " - echo "" - echo "命令:" - echo " generate 生成 Swagger API 文档" - echo " check 检查 Swagger 注解完整性" - echo " validate 验证生成的文档" - echo " serve 启动服务器并打开 Swagger UI" - echo " fix 修复缺失的 Swagger 注解" - echo " all 执行完整的工作流 (generate + validate + check)" - echo " help 显示此帮助信息" - echo "" - echo "示例:" - echo " bash scripts/swagger-helper.sh generate" - echo " bash scripts/swagger-helper.sh all" -} - -# 主函数 -main() { - local command="${1:-help}" - - case "$command" in - "generate") - check_dependencies - generate_docs - ;; - "check") - check_annotations - ;; - "validate") - validate_docs - ;; - "serve") - serve_docs - ;; - "fix") - fix_annotations - ;; - "all") - check_dependencies - generate_docs - validate_docs - check_annotations - log_success "🎉 Swagger 文档工作流完成!" - ;; - "help"|"-h"|"--help") - show_help - ;; - *) - log_error "未知命令: $command" - show_help - exit 1 - ;; - esac -} - -# 执行主函数 -main "$@" \ No newline at end of file diff --git a/tools/swagger-auto-gen/README.md b/tools/swagger-auto-gen/README.md deleted file mode 100644 index 8e608167..00000000 --- a/tools/swagger-auto-gen/README.md +++ /dev/null @@ -1,116 +0,0 @@ -# Swagger Auto-Gen Tool - -AI-CloudOps 项目的 Swagger 文档生成工具。 - -## 功能特性 - -- 自动解析 Go 代码中的路由和结构体定义 -- 生成符合 OpenAPI 2.0 规范的 Swagger 文档 -- 支持 JSON、YAML 和 Go docs 格式输出 -- 识别参数类型(路径、查询、请求体) -- 支持 Gin 框架的路由解析 -- 生产环境优化,性能高效 - -## 使用方法 - -### 编译 - -```bash -cd tools/swagger-auto-gen -go build -o ../../bin/swagger-auto-gen . -``` - -### 运行 - -```bash -# 在项目根目录运行 -./bin/swagger-auto-gen -root . -output ./docs - -# 详细输出模式 -./bin/swagger-auto-gen -root . -output ./docs -v - -# 禁用Swagger生成 -./bin/swagger-auto-gen -root . -output ./docs -enabled=false -``` - -### 参数说明 - -- `-root`: 项目根目录路径(默认: `.`) -- `-output`: 输出目录路径(默认: `./docs`) -- `-v`: 详细输出模式(默认: `false`) -- `-enabled`: 是否启用Swagger生成(默认: `true`) - -## 输出文件 - -- `swagger.json` - JSON 格式的 Swagger 文档 -- `swagger.yaml` - YAML 格式的 Swagger 文档 -- `docs.go` - Go 代码形式的文档,用于 gin-swagger - -## 支持的注解 - -工具会自动识别以下 Go 结构体标签: - -- `json:"fieldname"` - JSON 字段名 -- `form:"fieldname"` - 查询参数名 -- `uri:"fieldname"` - 路径参数名 -- `binding:"required"` - 必填字段 - -## 环境变量控制 - -工具支持通过环境变量控制行为,这在不同环境下特别有用: - -### 文档生成控制 - -- `SWAGGER_ENABLED`: 是否启用Swagger生成(默认: `true`) - - 设置为 `false`、`0`、`no`、`n`、`off` 则禁用生成 - - 在生产环境中可以设置为 `false` 以禁用Swagger - -- `SWAGGER_ROOT`: 项目根目录路径(等同于 `-root` 参数) - -- `SWAGGER_OUTPUT`: 输出目录路径(等同于 `-output` 参数) - -- `SWAGGER_VERBOSE`: 是否启用详细输出(等同于 `-v` 参数) - -### 应用服务器控制 - -在启动 AI-CloudOps 应用服务器时,同样可以通过环境变量控制 Swagger: - -- `SWAGGER_ENABLED`: 控制是否启用Swagger路由和文档加载 - - `false`: 完全禁用Swagger,不注册 `/swagger/*` 路由,提高安全性和性能 - - `true`: 启用Swagger文档(默认开发环境启用,生产环境禁用) - -- `GIN_MODE`: Gin框架模式 - - `release` 或 `production`: 生产模式,默认禁用Swagger - - `debug`: 开发模式,默认启用Swagger - -### 使用示例 - -```bash -# 禁用Swagger文档生成 -SWAGGER_ENABLED=false ./bin/swagger-auto-gen - -# 设置输出目录和详细模式 -SWAGGER_OUTPUT=./api-docs SWAGGER_VERBOSE=true ./bin/swagger-auto-gen - -# 启动应用服务器时禁用Swagger -SWAGGER_ENABLED=false go run main.go - -# 生产环境启动(自动禁用Swagger) -GIN_MODE=release go run main.go - -# 开发环境强制启用Swagger -SWAGGER_ENABLED=true GIN_MODE=debug go run main.go -``` - -## 注意事项 - -1. 确保 Go 代码能够正常编译 -2. 路由注册方法需要命名为 `RegisterRouters` 或 `RegisterRoutes` -3. 工具会自动排除测试文件和内部结构体 -4. 生产环境建议关闭详细输出模式(不使用 `-v` 参数) -5. 在生产环境中可以设置 `SWAGGER_ENABLED=false` 完全禁用Swagger - -## 版本要求 - -- Go 1.21+ -- 依赖包会管理,无需手动安装 diff --git a/tools/swagger-auto-gen/generator/docs_template.go b/tools/swagger-auto-gen/generator/docs_template.go deleted file mode 100644 index 0d757fc0..00000000 --- a/tools/swagger-auto-gen/generator/docs_template.go +++ /dev/null @@ -1,55 +0,0 @@ -package generator - -// DocsGoTemplate 是生成docs.go文件的模板 -const DocsGoTemplate = `// Package docs 自动生成的API文档包. DO NOT EDIT. - -package docs - -import ( - "os" - "strings" - - "github.com/swaggo/swag" -) - -// SwaggerInfo holds exported Swagger Info so clients can modify it -var SwaggerInfo = &swag.Spec{ - Version: "{{.Version}}", - Host: "{{.Host}}", - BasePath: "{{.BasePath}}", - Schemes: []string{ {{range .Schemes}}"{{.}}", {{end}} }, - Title: "{{.Title}}", - Description: "{{.Description}}", - InfoInstanceName: "{{.InstanceName}}", - SwaggerTemplate: docTemplate, - LeftDelim: "{{", - RightDelim: "}}", -} - -// isEnvTrue 检查环境变量是否为true -func isEnvTrue(key string) bool { - value := strings.ToLower(os.Getenv(key)) - return value == "true" || value == "1" || value == "yes" || value == "y" || value == "on" -} - -// isSwaggerEnabled 检查是否应该启用Swagger -func isSwaggerEnabled() bool { - // 优先检查环境变量 - if swaggerEnabled := os.Getenv("SWAGGER_ENABLED"); swaggerEnabled != "" { - return isEnvTrue("SWAGGER_ENABLED") - } - - // 默认情况下,开发环境启用,生产环境禁用 - env := strings.ToLower(os.Getenv("GIN_MODE")) - return env != "release" && env != "production" -} - -func init() { - // 只有当环境变量允许时才注册Swagger - if isSwaggerEnabled() { - swag.Register(SwaggerInfo.InstanceName(), SwaggerInfo) - } -} - -const docTemplate = ` + "`{{.DocJSON}}`" + ` -` diff --git a/tools/swagger-auto-gen/generator/generator.go b/tools/swagger-auto-gen/generator/generator.go deleted file mode 100644 index c4fc3d9d..00000000 --- a/tools/swagger-auto-gen/generator/generator.go +++ /dev/null @@ -1,919 +0,0 @@ -/* - * MIT License - * - * Copyright (c) 2024 Bamboo - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -package generator - -import ( - "encoding/json" - "fmt" - "go/ast" - "os" - "path/filepath" - "regexp" - "strings" - - "gopkg.in/yaml.v3" -) - -// SwaggerGenerator Swagger文档生成器 -type SwaggerGenerator struct { - projectRoot string - outputDir string - verbose bool - parser *Parser -} - -// NewSwaggerGenerator 创建新的生成器 -func NewSwaggerGenerator(projectRoot, outputDir string, verbose bool) *SwaggerGenerator { - return &SwaggerGenerator{ - projectRoot: projectRoot, - outputDir: outputDir, - verbose: verbose, - parser: NewParser(projectRoot, verbose), - } -} - -// Generate 生成Swagger文档 -func (g *SwaggerGenerator) Generate() error { - if g.verbose { - fmt.Println("🔧 开始生成 Swagger 文档...") - } - - // 解析项目 - if err := g.parser.ParseProject(); err != nil { - return fmt.Errorf("解析项目失败: %v", err) - } - - // 构建Swagger文档 - swaggerDoc := g.buildSwaggerDoc() - - // 生成JSON文档 - if err := g.writeJSON(swaggerDoc); err != nil { - return fmt.Errorf("生成JSON文档失败: %v", err) - } - - // 生成YAML文档 - if err := g.writeYAML(swaggerDoc); err != nil { - return fmt.Errorf("生成YAML文档失败: %v", err) - } - - // 生成Go文档 - if err := g.writeGoDoc(swaggerDoc); err != nil { - return fmt.Errorf("生成Go文档失败: %v", err) - } - - return nil -} - -// buildSwaggerDoc 构建Swagger文档 -func (g *SwaggerGenerator) buildSwaggerDoc() *SwaggerDoc { - doc := &SwaggerDoc{ - Swagger: "2.0", - Info: SwaggerInfo{ - Title: "AI-CloudOps API", - Version: "1.0.0", - Description: "AI-CloudOps云原生运维平台API文档", - }, - Host: "localhost:8889", - BasePath: "/", - Schemes: []string{"http", "https"}, - Consumes: []string{"application/json"}, - Produces: []string{"application/json"}, - Paths: make(map[string]map[string]APIEndpoint), - Definitions: make(map[string]Definition), - SecurityDefinitions: map[string]SecurityDefinition{ - "BearerAuth": { - Type: "apiKey", - Name: "Authorization", - In: "header", - Description: "Bearer Token认证", - }, - }, - Tags: make([]Tag, 0), - } - - // 构建路径和端点 - g.buildPaths(doc) - - // 构建定义 - g.buildDefinitions(doc) - - // 构建标签 - g.buildTags(doc) - - return doc -} - -// buildPaths 构建API路径 -func (g *SwaggerGenerator) buildPaths(doc *SwaggerDoc) { - routes := g.parser.GetRoutes() - - for _, route := range routes { - path := g.normalizePath(route.Path) - method := strings.ToLower(route.Method) - - if doc.Paths[path] == nil { - doc.Paths[path] = make(map[string]APIEndpoint) - } - - endpoint := g.buildEndpoint(route) - doc.Paths[path][method] = endpoint - } -} - -// buildEndpoint 构建API端点 -func (g *SwaggerGenerator) buildEndpoint(route RouteInfo) APIEndpoint { - endpoint := APIEndpoint{ - Path: route.Path, - Method: route.Method, - Summary: g.generateSummary(route), - Description: g.generateDescription(route), - Tags: g.generateTags(route), - Parameters: g.generateParameters(route), - Responses: g.generateResponses(route), - OperationID: g.generateOperationID(route), - } - - // 添加安全认证 - if g.needsAuth(route) { - endpoint.Security = []map[string][]string{ - {"BearerAuth": []string{}}, - } - } - - return endpoint -} - -// generateSummary 生成摘要 -func (g *SwaggerGenerator) generateSummary(route RouteInfo) string { - // 从路径生成摘要 - pathParts := strings.Split(strings.Trim(route.Path, "/"), "/") - if len(pathParts) > 0 { - resource := pathParts[len(pathParts)-1] - - // 处理路径参数 - if strings.HasPrefix(resource, ":") { - resource = pathParts[len(pathParts)-2] - } - - switch route.Method { - case "GET": - if strings.Contains(route.Path, "/:") { - return fmt.Sprintf("获取%s详情", resource) - } - return fmt.Sprintf("获取%s列表", resource) - case "POST": - return fmt.Sprintf("创建%s", resource) - case "PUT": - return fmt.Sprintf("更新%s", resource) - case "DELETE": - return fmt.Sprintf("删除%s", resource) - case "PATCH": - return fmt.Sprintf("部分更新%s", resource) - } - } - - return fmt.Sprintf("%s %s", route.Method, route.Path) -} - -// generateDescription 生成描述 -func (g *SwaggerGenerator) generateDescription(route RouteInfo) string { - if route.HandlerInfo != nil && route.HandlerInfo.FuncDecl.Doc != nil { - return strings.TrimSpace(route.HandlerInfo.FuncDecl.Doc.Text()) - } - return g.generateSummary(route) -} - -// generateTags 生成标签 -func (g *SwaggerGenerator) generateTags(route RouteInfo) []string { - tags := make([]string, 0) - - // 从路径提取标签 - pathParts := strings.Split(strings.Trim(route.Path, "/"), "/") - if len(pathParts) > 1 { - // 使用第二级路径作为标签 (跳过api) - if pathParts[0] == "api" && len(pathParts) > 2 { - tags = append(tags, strings.Title(pathParts[1])) - } else if len(pathParts) > 1 { - tags = append(tags, strings.Title(pathParts[0])) - } - } - - // 从处理器名称提取标签 - if route.HandlerInfo != nil && route.HandlerInfo.ReceiverType != "" { - receiverType := route.HandlerInfo.ReceiverType - // 移除Handler后缀 - receiverType = strings.TrimSuffix(receiverType, "Handler") - if receiverType != "" { - tags = append(tags, receiverType) - } - } - - if len(tags) == 0 { - tags = append(tags, "Default") - } - - return g.removeDuplicates(tags) -} - -// generateParameters 生成参数 -func (g *SwaggerGenerator) generateParameters(route RouteInfo) []Parameter { - parameters := make([]Parameter, 0) - - if route.HandlerInfo == nil || route.HandlerInfo.FuncDecl == nil || route.HandlerInfo.FuncDecl.Body == nil { - return parameters - } - - // 分析函数体中的参数绑定调用 - bindingInfo := g.analyzeParameterBindings(route.HandlerInfo.FuncDecl.Body) - - // 1. 处理路径参数(URI绑定) - for structName := range bindingInfo.URIBindings { - uriParams := g.extractURIParametersFromStruct(structName) - parameters = append(parameters, uriParams...) - } - - // 2. 处理查询参数(Query绑定) - for structName := range bindingInfo.QueryBindings { - queryParams := g.extractQueryParametersFromStruct(structName) - parameters = append(parameters, queryParams...) - } - - // 3. 处理请求体参数(Body绑定) - for structName := range bindingInfo.BodyBindings { - parameters = append(parameters, Parameter{ - Name: "body", - In: "body", - Description: "请求体", - Schema: &Schema{ - Ref: fmt.Sprintf("#/definitions/%s", g.getShortName(structName)), - }, - }) - break // 只处理第一个body绑定 - } - - return parameters -} - -// ParameterBindingInfo 参数绑定信息 -type ParameterBindingInfo struct { - URIBindings map[string]bool // 结构体名 -> 是否存在 - QueryBindings map[string]bool // 结构体名 -> 是否存在 - BodyBindings map[string]bool // 结构体名 -> 是否存在 -} - -// analyzeParameterBindings 分析函数体中的参数绑定调用 -func (g *SwaggerGenerator) analyzeParameterBindings(body *ast.BlockStmt) *ParameterBindingInfo { - bindingInfo := &ParameterBindingInfo{ - URIBindings: make(map[string]bool), - QueryBindings: make(map[string]bool), - BodyBindings: make(map[string]bool), - } - - // 遍历函数体,查找绑定调用 - ast.Inspect(body, func(n ast.Node) bool { - if callExpr, ok := n.(*ast.CallExpr); ok { - if selectorExpr, ok := callExpr.Fun.(*ast.SelectorExpr); ok { - methodName := selectorExpr.Sel.Name - - // 检查不同的绑定方法 - switch methodName { - case "ShouldBindUri": - if structType := g.extractStructFromBindCall(callExpr, body); structType != "" { - bindingInfo.URIBindings[structType] = true - } - case "ShouldBindQuery": - if structType := g.extractStructFromBindCall(callExpr, body); structType != "" { - bindingInfo.QueryBindings[structType] = true - } - case "ShouldBind", "ShouldBindJSON": - if structType := g.extractStructFromBindCall(callExpr, body); structType != "" { - bindingInfo.BodyBindings[structType] = true - } - case "HandleRequest": - // 检查 utils.HandleRequest 的第二个参数 - if len(callExpr.Args) >= 2 { - if structType := g.extractStructFromHandleRequest(callExpr.Args[1], body); structType != "" { - bindingInfo.BodyBindings[structType] = true - } - } - } - } - } - return true - }) - - return bindingInfo -} - -// extractStructFromBindCall 从绑定调用中提取结构体类型 -func (g *SwaggerGenerator) extractStructFromBindCall(callExpr *ast.CallExpr, body *ast.BlockStmt) string { - if len(callExpr.Args) == 0 { - return "" - } - - // 处理 &req 形式的参数 - if unaryExpr, ok := callExpr.Args[0].(*ast.UnaryExpr); ok { - if unaryExpr.Op.String() == "&" { - if ident, ok := unaryExpr.X.(*ast.Ident); ok { - // 查找变量声明来确定类型 - return g.findVariableTypeInFunction(body, ident.Name) - } - } - } - - return "" -} - -// extractStructFromHandleRequest 从HandleRequest调用中提取结构体类型 -func (g *SwaggerGenerator) extractStructFromHandleRequest(arg ast.Expr, body *ast.BlockStmt) string { - // 处理 &req 形式的参数 - if unaryExpr, ok := arg.(*ast.UnaryExpr); ok { - if unaryExpr.Op.String() == "&" { - if ident, ok := unaryExpr.X.(*ast.Ident); ok { - return g.findVariableTypeInFunction(body, ident.Name) - } - } - } - - // 处理 nil 参数 - if ident, ok := arg.(*ast.Ident); ok { - if ident.Name == "nil" { - return "" - } - } - - return "" -} - -// findVariableTypeInFunction 在函数中查找变量类型 -func (g *SwaggerGenerator) findVariableTypeInFunction(body *ast.BlockStmt, varName string) string { - var varType string - - ast.Inspect(body, func(n ast.Node) bool { - // 查找变量声明语句 var req model.UserLoginReq - if declStmt, ok := n.(*ast.DeclStmt); ok { - if genDecl, ok := declStmt.Decl.(*ast.GenDecl); ok { - for _, spec := range genDecl.Specs { - if valueSpec, ok := spec.(*ast.ValueSpec); ok { - for i, name := range valueSpec.Names { - if name.Name == varName && valueSpec.Type != nil { - varType = g.exprToString(valueSpec.Type) - return false - } - // 处理短声明 req := model.UserLoginReq{} - if name.Name == varName && i < len(valueSpec.Values) { - if compositeLit, ok := valueSpec.Values[i].(*ast.CompositeLit); ok { - varType = g.exprToString(compositeLit.Type) - return false - } - } - } - } - } - } - } - - // 查找短声明语句 req := model.UserLoginReq{} - if assignStmt, ok := n.(*ast.AssignStmt); ok { - if assignStmt.Tok.String() == ":=" { - for i, lhs := range assignStmt.Lhs { - if ident, ok := lhs.(*ast.Ident); ok { - if ident.Name == varName && i < len(assignStmt.Rhs) { - if compositeLit, ok := assignStmt.Rhs[i].(*ast.CompositeLit); ok { - varType = g.exprToString(compositeLit.Type) - return false - } - } - } - } - } - } - - return true - }) - - return varType -} - -// extractURIParametersFromStruct 从结构体中提取URI参数 -func (g *SwaggerGenerator) extractURIParametersFromStruct(structName string) []Parameter { - parameters := make([]Parameter, 0) - - structs := g.parser.GetStructs() - structInfo, exists := structs[structName] - if !exists { - return parameters - } - - // 遍历结构体字段,查找有 uri tag 的字段 - for _, field := range structInfo.Fields { - if field.URIName != "" { - param := Parameter{ - Name: field.URIName, - In: "path", - Type: g.mapGoTypeToSwagger(field.Type), - Description: g.getFieldDescription(field), - Required: true, // URI参数总是必需的 - } - parameters = append(parameters, param) - } - } - - return parameters -} - -// extractQueryParametersFromStruct 从结构体中提取查询参数 -func (g *SwaggerGenerator) extractQueryParametersFromStruct(structName string) []Parameter { - parameters := make([]Parameter, 0) - - structs := g.parser.GetStructs() - structInfo, exists := structs[structName] - if !exists { - return parameters - } - - // 处理继承的基础结构体(如 ListReq) - for _, embedded := range structInfo.EmbeddedTypes { - if embeddedParams := g.extractQueryParametersFromStruct(embedded); len(embeddedParams) > 0 { - parameters = append(parameters, embeddedParams...) - } - } - - // 遍历结构体字段,查找有 form tag 的字段 - for _, field := range structInfo.Fields { - if field.FormName != "" { - param := Parameter{ - Name: field.FormName, - In: "query", - Type: g.mapGoTypeToSwagger(field.Type), - Description: g.getFieldDescription(field), - Required: field.Required, - } - parameters = append(parameters, param) - } - } - - return parameters -} - -// getFieldDescription 获取字段描述 -func (g *SwaggerGenerator) getFieldDescription(field FieldInfo) string { - if field.Description != "" { - return field.Description - } - return fmt.Sprintf("%s参数", field.Name) -} - -// mapGoTypeToSwagger 将Go类型映射为Swagger类型 -func (g *SwaggerGenerator) mapGoTypeToSwagger(goType string) string { - switch { - case strings.HasPrefix(goType, "string"): - return "string" - case strings.HasPrefix(goType, "int"), strings.HasPrefix(goType, "uint"): - return "integer" - case strings.HasPrefix(goType, "float"): - return "number" - case strings.HasPrefix(goType, "bool"): - return "boolean" - case strings.HasPrefix(goType, "time.Time"): - return "string" - default: - return "string" - } -} - -// generateResponses 生成响应 -func (g *SwaggerGenerator) generateResponses(route RouteInfo) map[string]Response { - responses := make(map[string]Response) - - // 默认成功响应 - successCode := "200" - if route.Method == "POST" { - successCode = "201" - } - - responses[successCode] = Response{ - Description: "成功", - Schema: &Schema{ - Ref: "#/definitions/ApiResponse", - }, - } - - // 错误响应 - responses["400"] = Response{ - Description: "请求参数错误", - Schema: &Schema{ - Ref: "#/definitions/ApiResponse", - }, - } - - responses["500"] = Response{ - Description: "服务器内部错误", - Schema: &Schema{ - Ref: "#/definitions/ApiResponse", - }, - } - - // 需要认证的接口添加401响应 - if g.needsAuth(route) { - responses["401"] = Response{ - Description: "未授权", - Schema: &Schema{ - Ref: "#/definitions/ApiResponse", - }, - } - } - - return responses -} - -// generateOperationID 生成操作ID -func (g *SwaggerGenerator) generateOperationID(route RouteInfo) string { - if route.HandlerInfo != nil { - return fmt.Sprintf("%s_%s", route.HandlerInfo.ReceiverType, route.HandlerInfo.Name) - } - - pathParts := strings.Split(strings.Trim(route.Path, "/"), "/") - resource := "unknown" - if len(pathParts) > 0 { - resource = pathParts[len(pathParts)-1] - if strings.HasPrefix(resource, ":") && len(pathParts) > 1 { - resource = pathParts[len(pathParts)-2] - } - } - - return fmt.Sprintf("%s_%s", strings.ToLower(route.Method), resource) -} - -// buildDefinitions 构建数据模型定义 -func (g *SwaggerGenerator) buildDefinitions(doc *SwaggerDoc) { - structs := g.parser.GetStructs() - - // 添加通用响应模型 - doc.Definitions["ApiResponse"] = Definition{ - Type: "object", - Properties: map[string]*Schema{ - "code": { - Type: "integer", - Description: "响应码", - Example: 200, - }, - "message": { - Type: "string", - Description: "响应消息", - Example: "success", - }, - "data": { - Type: "object", - Description: "响应数据", - AdditionalProperties: true, - }, - }, - Description: "通用API响应", - } - - // 添加结构体定义 - for name, structInfo := range structs { - if g.shouldIncludeStruct(structInfo) { - definition := g.buildDefinition(structInfo) - shortName := g.getShortName(name) - doc.Definitions[shortName] = definition - } - } -} - -// buildDefinition 构建单个定义 -func (g *SwaggerGenerator) buildDefinition(structInfo *StructInfo) Definition { - definition := Definition{ - Type: "object", - Properties: make(map[string]*Schema), - Required: make([]string, 0), - Description: fmt.Sprintf("%s数据模型", structInfo.Name), - } - - for _, field := range structInfo.Fields { - if field.JSONName == "" || field.JSONName == "-" { - continue - } - - schema := g.buildFieldSchema(field) - definition.Properties[field.JSONName] = schema - - if field.Required { - definition.Required = append(definition.Required, field.JSONName) - } - } - - return definition -} - -// buildFieldSchema 构建字段Schema -func (g *SwaggerGenerator) buildFieldSchema(field FieldInfo) *Schema { - schema := &Schema{ - Description: field.Description, - } - - // 根据Go类型映射到Swagger类型 - switch { - case strings.HasPrefix(field.Type, "string"): - schema.Type = "string" - case strings.HasPrefix(field.Type, "int"), strings.HasPrefix(field.Type, "uint"): - schema.Type = "integer" - case strings.HasPrefix(field.Type, "float"): - schema.Type = "number" - case strings.HasPrefix(field.Type, "bool"): - schema.Type = "boolean" - case strings.HasPrefix(field.Type, "[]"): - schema.Type = "array" - itemType := strings.TrimPrefix(field.Type, "[]") - schema.Items = &Schema{ - Type: g.mapGoTypeToSwagger(itemType), - } - case strings.HasPrefix(field.Type, "map["): - schema.Type = "object" - schema.AdditionalProperties = true - case strings.Contains(field.Type, "time.Time"): - schema.Type = "string" - schema.Format = "date-time" - default: - // 可能是自定义类型 - if g.isCustomType(field.Type) { - schema.Ref = fmt.Sprintf("#/definitions/%s", field.Type) - } else { - schema.Type = "object" - } - } - - return schema -} - -// buildTags 构建标签 -func (g *SwaggerGenerator) buildTags(doc *SwaggerDoc) { - tagMap := make(map[string]bool) - - // 从路径中提取标签 - for _, pathMethods := range doc.Paths { - for _, endpoint := range pathMethods { - for _, tag := range endpoint.Tags { - if !tagMap[tag] { - doc.Tags = append(doc.Tags, Tag{ - Name: tag, - Description: fmt.Sprintf("%s相关接口", tag), - }) - tagMap[tag] = true - } - } - } - } -} - -// 辅助方法 - -// normalizePath 标准化路径 -func (g *SwaggerGenerator) normalizePath(path string) string { - // 将Gin路径参数格式转换为Swagger格式 - // 支持 :param 和 *param 格式 - re := regexp.MustCompile(`:([a-zA-Z_][a-zA-Z0-9_]*)`) - path = re.ReplaceAllString(path, "{$1}") - - // 处理通配符参数 *param - re2 := regexp.MustCompile(`\*([a-zA-Z_][a-zA-Z0-9_]*)`) - path = re2.ReplaceAllString(path, "{$1}") - - return path -} - -// extractPathParams 提取路径参数 -func (g *SwaggerGenerator) extractPathParams(path string) []string { - params := make([]string, 0) - - // 提取 :param 格式的参数 - re := regexp.MustCompile(`:([a-zA-Z_][a-zA-Z0-9_]*)`) - matches := re.FindAllStringSubmatch(path, -1) - for _, match := range matches { - if len(match) > 1 { - params = append(params, match[1]) - } - } - - // 提取 *param 格式的参数 - re2 := regexp.MustCompile(`\*([a-zA-Z_][a-zA-Z0-9_]*)`) - matches2 := re2.FindAllStringSubmatch(path, -1) - for _, match := range matches2 { - if len(match) > 1 { - params = append(params, match[1]) - } - } - - return params -} - -// hasRequestBody 检查是否有请求体 -func (g *SwaggerGenerator) hasRequestBody(method string) bool { - return method == "POST" || method == "PUT" || method == "PATCH" -} - -// exprToString 将表达式转换为字符串 -func (g *SwaggerGenerator) exprToString(expr ast.Expr) string { - switch t := expr.(type) { - case *ast.Ident: - return t.Name - case *ast.StarExpr: - return "*" + g.exprToString(t.X) - case *ast.ArrayType: - return "[]" + g.exprToString(t.Elt) - case *ast.SelectorExpr: - return g.exprToString(t.X) + "." + t.Sel.Name - case *ast.MapType: - return "map[" + g.exprToString(t.Key) + "]" + g.exprToString(t.Value) - case *ast.InterfaceType: - return "interface{}" - default: - return "unknown" - } -} - -// needsAuth 检查是否需要认证 -func (g *SwaggerGenerator) needsAuth(route RouteInfo) bool { - // 不需要认证的路径 - noAuthPaths := []string{ - "/api/not_auth", - "/health", - "/swagger", - } - - for _, path := range noAuthPaths { - if strings.HasPrefix(route.Path, path) { - return false - } - } - - return true -} - -// shouldIncludeStruct 检查是否应该包含结构体 -func (g *SwaggerGenerator) shouldIncludeStruct(structInfo *StructInfo) bool { - // 排除一些内部结构体 - excludePatterns := []string{"wire", "test", "Test", "Mock", "mock"} - - name := structInfo.Name - pkg := structInfo.Package - - for _, pattern := range excludePatterns { - if strings.Contains(name, pattern) || strings.Contains(pkg, pattern) { - return false - } - } - - // 只包含有JSON标签的结构体 - for _, field := range structInfo.Fields { - if field.JSONName != "" && field.JSONName != "-" { - return true - } - } - - return false -} - -// getShortName 获取短名称 -func (g *SwaggerGenerator) getShortName(fullName string) string { - parts := strings.Split(fullName, ".") - if len(parts) > 0 { - return parts[len(parts)-1] - } - return fullName -} - -// isCustomType 检查是否是自定义类型 -func (g *SwaggerGenerator) isCustomType(typeName string) bool { - structs := g.parser.GetStructs() - for name := range structs { - if strings.HasSuffix(name, "."+typeName) { - return true - } - } - return false -} - -// removeDuplicates 移除重复项 -func (g *SwaggerGenerator) removeDuplicates(slice []string) []string { - if len(slice) <= 1 { - return slice - } - - keys := make(map[string]bool, len(slice)) - result := make([]string, 0, len(slice)) - - for _, item := range slice { - if !keys[item] { - keys[item] = true - result = append(result, item) - } - } - - return result -} - -// 文件输出方法 - -// writeJSON 写入JSON文档 -func (g *SwaggerGenerator) writeJSON(doc *SwaggerDoc) error { - jsonFile := filepath.Join(g.outputDir, "swagger.json") - - data, err := json.MarshalIndent(doc, "", " ") - if err != nil { - return fmt.Errorf("JSON序列化失败: %w", err) - } - - if err := os.WriteFile(jsonFile, data, 0644); err != nil { - return fmt.Errorf("写入JSON文件失败: %w", err) - } - - if g.verbose { - fmt.Printf("📄 JSON文档已生成: %s\n", jsonFile) - } - - return nil -} - -// writeYAML 写入YAML文档 -func (g *SwaggerGenerator) writeYAML(doc *SwaggerDoc) error { - yamlFile := filepath.Join(g.outputDir, "swagger.yaml") - - data, err := yaml.Marshal(doc) - if err != nil { - return fmt.Errorf("YAML序列化失败: %w", err) - } - - if err := os.WriteFile(yamlFile, data, 0644); err != nil { - return fmt.Errorf("写入YAML文件失败: %w", err) - } - - if g.verbose { - fmt.Printf("📄 YAML文档已生成: %s\n", yamlFile) - } - - return nil -} - -// writeGoDoc 写入Go文档 -func (g *SwaggerGenerator) writeGoDoc(doc *SwaggerDoc) error { - goFile := filepath.Join(g.outputDir, "docs.go") - - jsonData, err := json.Marshal(doc) - if err != nil { - return fmt.Errorf("JSON序列化失败: %w", err) - } - - // 使用模板生成内容 - content := strings.ReplaceAll(DocsGoTemplate, "{{.DocJSON}}", string(jsonData)) - content = strings.ReplaceAll(content, "{{.Version}}", doc.Info.Version) - content = strings.ReplaceAll(content, "{{.Host}}", doc.Host) - content = strings.ReplaceAll(content, "{{.BasePath}}", doc.BasePath) - content = strings.ReplaceAll(content, "{{.Title}}", doc.Info.Title) - content = strings.ReplaceAll(content, "{{.Description}}", doc.Info.Description) - content = strings.ReplaceAll(content, "{{.InstanceName}}", "swagger") - - // 处理 Schemes 数组 - var schemesStr string - for i, scheme := range doc.Schemes { - if i > 0 { - schemesStr += ", " - } - schemesStr += `"` + scheme + `"` - } - content = strings.ReplaceAll(content, "{{range .Schemes}}\"{{.}}\", {{end}}", schemesStr) - - if err := os.WriteFile(goFile, []byte(content), 0644); err != nil { - return fmt.Errorf("写入Go文件失败: %w", err) - } - - if g.verbose { - fmt.Printf("📄 Go文档已生成: %s\n", goFile) - } - - return nil -} diff --git a/tools/swagger-auto-gen/generator/parser.go b/tools/swagger-auto-gen/generator/parser.go deleted file mode 100644 index 1c901a5c..00000000 --- a/tools/swagger-auto-gen/generator/parser.go +++ /dev/null @@ -1,681 +0,0 @@ -/* - * MIT License - * - * Copyright (c) 2024 Bamboo - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -package generator - -import ( - "fmt" - "go/ast" - "go/parser" - "go/token" - "path/filepath" - "regexp" - "strings" - - "golang.org/x/tools/go/packages" -) - -// Parser AST解析器 -type Parser struct { - projectRoot string - fileSet *token.FileSet - packages map[string]*PackageInfo - handlers map[string]*HandlerInfo - routes []RouteInfo - structs map[string]*StructInfo - verbose bool -} - -// NewParser 创建新的解析器 -func NewParser(projectRoot string, verbose bool) *Parser { - return &Parser{ - projectRoot: projectRoot, - fileSet: token.NewFileSet(), - packages: make(map[string]*PackageInfo), - handlers: make(map[string]*HandlerInfo), - routes: make([]RouteInfo, 0), - structs: make(map[string]*StructInfo), - verbose: verbose, - } -} - -// ParseProject 解析整个项目 -func (p *Parser) ParseProject() error { - if p.verbose { - fmt.Println("🔍 开始解析项目...") - } - - // 加载包信息 - cfg := &packages.Config{ - Mode: packages.NeedName | packages.NeedFiles | packages.NeedCompiledGoFiles | - packages.NeedImports | packages.NeedTypes | packages.NeedSyntax | - packages.NeedTypesInfo, - Dir: p.projectRoot, - } - - pkgs, err := packages.Load(cfg, "./...") - if err != nil { - return fmt.Errorf("加载包失败: %v", err) - } - - // 处理每个包 - for _, pkg := range pkgs { - if len(pkg.Errors) > 0 { - continue // 跳过有错误的包 - } - - packageInfo := &PackageInfo{ - Name: pkg.Name, - Path: pkg.PkgPath, - Files: pkg.Syntax, - } - - p.packages[pkg.PkgPath] = packageInfo - - // 解析包中的文件 - for _, file := range pkg.Syntax { - p.parseFile(file, pkg.PkgPath) - } - } - - // 解析路由 - if err := p.parseRoutes(); err != nil { - return fmt.Errorf("解析路由失败: %v", err) - } - - if p.verbose { - fmt.Printf("✅ 解析完成: 找到 %d 个处理器, %d 个路由, %d 个结构体\n", - len(p.handlers), len(p.routes), len(p.structs)) - } - - return nil -} - -// parseFile 解析单个文件 -func (p *Parser) parseFile(file *ast.File, packagePath string) { - ast.Inspect(file, func(n ast.Node) bool { - switch node := n.(type) { - case *ast.FuncDecl: - p.parseHandler(node, packagePath) - case *ast.TypeSpec: - if structType, ok := node.Type.(*ast.StructType); ok { - p.parseStruct(node.Name.Name, structType, packagePath) - } - } - return true - }) -} - -// parseStruct 解析结构体 -func (p *Parser) parseStruct(name string, structType *ast.StructType, packagePath string) { - structInfo := &StructInfo{ - Name: name, - Fields: make([]FieldInfo, 0), - Package: packagePath, - EmbeddedTypes: make([]string, 0), - } - - if structType.Fields != nil { - for _, field := range structType.Fields.List { - p.parseStructField(field, structInfo) - } - } - - // 构建完整的结构体名称(包含包路径) - fullName := fmt.Sprintf("%s.%s", packagePath, name) - p.structs[fullName] = structInfo - - if p.verbose { - fmt.Printf("✅ 结构体解析完成: %s (字段数: %d)\n", name, len(structInfo.Fields)) - } -} - -// parseStructField 解析结构体字段 -func (p *Parser) parseStructField(field *ast.Field, structInfo *StructInfo) { - // 处理嵌入类型(匿名字段) - if len(field.Names) == 0 { - embeddedType := p.exprToString(field.Type) - structInfo.EmbeddedTypes = append(structInfo.EmbeddedTypes, embeddedType) - return - } - - // 处理命名字段 - for _, name := range field.Names { - if !name.IsExported() { - continue // 跳过未导出的字段 - } - - fieldType := p.exprToString(field.Type) - tag := "" - if field.Tag != nil { - tag = field.Tag.Value - } - - fieldInfo := FieldInfo{ - Name: name.Name, - Type: fieldType, - Tag: tag, - JSONName: p.extractJSONName(tag), - FormName: p.extractFormName(tag), - URIName: p.extractURIName(tag), - Required: p.isRequired(tag), - Description: p.extractDescription(tag), - } - - structInfo.Fields = append(structInfo.Fields, fieldInfo) - } -} - -// extractDescription 从tag或注释中提取描述 -func (p *Parser) extractDescription(tag string) string { - // 从comment tag中提取描述 - re := regexp.MustCompile(`comment:"([^"]*)"`) - matches := re.FindStringSubmatch(tag) - if len(matches) > 1 { - return matches[1] - } - - // 从gorm tag中提取描述 - re = regexp.MustCompile(`gorm:"[^"]*comment:([^;"]*)[;"]*"`) - matches = re.FindStringSubmatch(tag) - if len(matches) > 1 { - return strings.TrimSpace(matches[1]) - } - - return "" -} - -// parseHandler 解析处理函数 -func (p *Parser) parseHandler(funcDecl *ast.FuncDecl, packagePath string) { - handlerName := funcDecl.Name.Name - receiverType := "" - - // 获取接收者类型 - if funcDecl.Recv != nil && len(funcDecl.Recv.List) > 0 { - if starExpr, ok := funcDecl.Recv.List[0].Type.(*ast.StarExpr); ok { - if ident, ok := starExpr.X.(*ast.Ident); ok { - receiverType = ident.Name - } - } - } - - // 检查是否是路由注册器、gin.Context处理器或者是Handler结构体的方法 - isRouteRegister := handlerName == "RegisterRouters" || handlerName == "RegisterRoutes" - isGinHandler := false - isHandlerMethod := false - - if funcDecl.Type.Params != nil && len(funcDecl.Type.Params.List) > 0 { - for _, param := range funcDecl.Type.Params.List { - if p.isGinContext(param.Type) { - isGinHandler = true - break - } - if p.isGinEngine(param.Type) { - isGinHandler = true - break - } - } - } - - // 检查是否是Handler结构体的方法(包含"Handler"的接收者类型) - if receiverType != "" && strings.Contains(receiverType, "Handler") { - isHandlerMethod = true - } - - // 只有当函数是导出的且满足条件时才解析 - if funcDecl.Name.IsExported() && (isRouteRegister || isGinHandler || isHandlerMethod) { - handlerInfo := &HandlerInfo{ - Name: handlerName, - FuncDecl: funcDecl, - ReceiverType: receiverType, - PackageName: packagePath, - } - - key := fmt.Sprintf("%s.%s", receiverType, handlerName) - if receiverType == "" { - key = handlerName - } - - p.handlers[key] = handlerInfo - - if p.verbose { - if isRouteRegister { - fmt.Printf("📝 找到路由注册器: %s (方法: %s)\n", key, handlerName) - } else if isGinHandler { - fmt.Printf("📝 找到Gin处理器: %s (方法: %s)\n", key, handlerName) - } else if isHandlerMethod { - fmt.Printf("📝 找到Handler方法: %s (方法: %s)\n", key, handlerName) - } - } - } -} - -// isGinContext 检查是否是gin.Context类型 -func (p *Parser) isGinContext(expr ast.Expr) bool { - switch t := expr.(type) { - case *ast.StarExpr: - if selectorExpr, ok := t.X.(*ast.SelectorExpr); ok { - if ident, ok := selectorExpr.X.(*ast.Ident); ok { - return ident.Name == "gin" && selectorExpr.Sel.Name == "Context" - } - } - case *ast.SelectorExpr: - if ident, ok := t.X.(*ast.Ident); ok { - return ident.Name == "gin" && t.Sel.Name == "Context" - } - } - return false -} - -// isGinEngine 检查是否是gin.Engine类型 -func (p *Parser) isGinEngine(expr ast.Expr) bool { - switch t := expr.(type) { - case *ast.StarExpr: - if selectorExpr, ok := t.X.(*ast.SelectorExpr); ok { - if ident, ok := selectorExpr.X.(*ast.Ident); ok { - return ident.Name == "gin" && selectorExpr.Sel.Name == "Engine" - } - } - case *ast.SelectorExpr: - if ident, ok := t.X.(*ast.Ident); ok { - return ident.Name == "gin" && t.Sel.Name == "Engine" - } - } - return false -} - -// parseRoutes 解析路由注册 -func (p *Parser) parseRoutes() error { - // 查找web.go中的路由注册 - webFiles, err := filepath.Glob(filepath.Join(p.projectRoot, "pkg/di/web.go")) - if err != nil { - return fmt.Errorf("查找web.go文件失败: %w", err) - } - - for _, webFile := range webFiles { - if err := p.parseWebFile(webFile); err != nil { - return fmt.Errorf("解析web文件%s失败: %w", webFile, err) - } - } - - // 查找各个handler中的RegisterRouters方法 - registeredCount := 0 - - for handlerKey, handler := range p.handlers { - if handler.Name == "RegisterRouters" || handler.Name == "RegisterRoutes" { - if p.verbose { - fmt.Printf("🔧 正在解析路由注册方法: %s (接收者: %s)\n", handlerKey, handler.ReceiverType) - } - if err := p.parseRegisterRoutes(handler); err != nil { - if p.verbose { - fmt.Printf("⚠️ 解析路由注册失败 %s: %v\n", handlerKey, err) - } - continue - } - registeredCount++ - } - } - - if p.verbose { - fmt.Printf("📊 共处理了 %d 个 RegisterRouters 方法\n", registeredCount) - } - - return nil -} - -// parseWebFile 解析web.go文件 -func (p *Parser) parseWebFile(filePath string) error { - file, err := parser.ParseFile(p.fileSet, filePath, nil, parser.ParseComments) - if err != nil { - return fmt.Errorf("解析文件%s失败: %w", filePath, err) - } - - // 查找InitGinServer函数 - ast.Inspect(file, func(n ast.Node) bool { - if funcDecl, ok := n.(*ast.FuncDecl); ok { - if funcDecl.Name.Name == "InitGinServer" { - p.parseInitGinServer(funcDecl) - } - } - return true - }) - - return nil -} - -// parseInitGinServer 解析InitGinServer函数 -func (p *Parser) parseInitGinServer(funcDecl *ast.FuncDecl) { - if funcDecl.Body == nil { - return - } - - for _, stmt := range funcDecl.Body.List { - if exprStmt, ok := stmt.(*ast.ExprStmt); ok { - if callExpr, ok := exprStmt.X.(*ast.CallExpr); ok { - if selectorExpr, ok := callExpr.Fun.(*ast.SelectorExpr); ok { - if selectorExpr.Sel.Name == "RegisterRouters" || selectorExpr.Sel.Name == "RegisterRoutes" { - // 找到路由注册调用 - if ident, ok := selectorExpr.X.(*ast.Ident); ok { - handlerName := ident.Name - if p.verbose { - fmt.Printf("🔗 找到路由注册: %s\n", handlerName) - } - } - } - } - } - } - } -} - -// parseRegisterRoutes 解析RegisterRoutes方法 -func (p *Parser) parseRegisterRoutes(handler *HandlerInfo) error { - if handler.FuncDecl.Body == nil { - if p.verbose { - fmt.Printf("⚠️ RegisterRoutes 方法没有函数体: %s\n", handler.Name) - } - return nil - } - - if p.verbose { - fmt.Printf("🔧 开始解析 RegisterRoutes 方法: %s.%s\n", handler.ReceiverType, handler.Name) - } - - // 存储路由组映射:变量名 -> 路径 - routeGroups := make(map[string]string) - - // 第一遍:查找路由组定义 - for _, stmt := range handler.FuncDecl.Body.List { - p.findRouteGroups(stmt, routeGroups) - } - - if p.verbose && len(routeGroups) > 0 { - fmt.Printf("📂 找到路由组: %v\n", routeGroups) - } - - // 第二遍:解析路由定义 - routesFound := 0 - for _, stmt := range handler.FuncDecl.Body.List { - routesInStmt := p.parseRoutesInStatement(stmt, routeGroups, handler) - routesFound += routesInStmt - } - - if p.verbose { - fmt.Printf("✅ %s.%s 解析完成,找到 %d 个路由\n", handler.ReceiverType, handler.Name, routesFound) - } - - return nil -} - -// findRouteGroups 查找路由组定义 -func (p *Parser) findRouteGroups(stmt ast.Stmt, routeGroups map[string]string) { - switch s := stmt.(type) { - case *ast.AssignStmt: - // 查找形如 group := server.Group("/api/xxx") 的语句 - if len(s.Lhs) == 1 && len(s.Rhs) == 1 { - if ident, ok := s.Lhs[0].(*ast.Ident); ok { - if callExpr, ok := s.Rhs[0].(*ast.CallExpr); ok { - if selectorExpr, ok := callExpr.Fun.(*ast.SelectorExpr); ok { - if selectorExpr.Sel.Name == "Group" && len(callExpr.Args) > 0 { - if basicLit, ok := callExpr.Args[0].(*ast.BasicLit); ok { - groupPath := strings.Trim(basicLit.Value, "\"") - routeGroups[ident.Name] = groupPath - if p.verbose { - fmt.Printf("📂 找到路由组: %s -> %s\n", ident.Name, groupPath) - } - } - } - } - } - } - } - case *ast.BlockStmt: - // 递归处理嵌套的块 - for _, subStmt := range s.List { - p.findRouteGroups(subStmt, routeGroups) - } - } -} - -// parseRoutesInStatement 在语句中解析路由 -func (p *Parser) parseRoutesInStatement(stmt ast.Stmt, routeGroups map[string]string, handler *HandlerInfo) int { - routesCount := 0 - - switch s := stmt.(type) { - case *ast.BlockStmt: - // 解析块中的路由(通常在 {} 中) - if p.verbose { - fmt.Printf("🔍 解析代码块中的路由 (语句数: %d)\n", len(s.List)) - } - for _, subStmt := range s.List { - routesCount += p.parseRoutesInStatement(subStmt, routeGroups, handler) - } - case *ast.ExprStmt: - // 解析表达式语句中的路由定义 - if p.parseRouteExprStatement(s, routeGroups, handler) { - routesCount++ - } - } - - return routesCount -} - -// parseRouteExprStatement 解析路由表达式语句 -func (p *Parser) parseRouteExprStatement(stmt *ast.ExprStmt, routeGroups map[string]string, handler *HandlerInfo) bool { - if callExpr, ok := stmt.X.(*ast.CallExpr); ok { - if selectorExpr, ok := callExpr.Fun.(*ast.SelectorExpr); ok { - method := strings.ToUpper(selectorExpr.Sel.Name) - - if p.verbose { - fmt.Printf("🔍 检查方法调用: %s\n", method) - } - - // 检查是否是HTTP方法 - if p.isHTTPMethod(method) && len(callExpr.Args) >= 2 { - // 获取路径 - var path string - if basicLit, ok := callExpr.Args[0].(*ast.BasicLit); ok { - path = strings.Trim(basicLit.Value, "\"") - } - - // 获取处理函数名 - var handlerFunc string - var targetHandler *HandlerInfo - - if selectorExpr2, ok := callExpr.Args[1].(*ast.SelectorExpr); ok { - if ident, ok := selectorExpr2.X.(*ast.Ident); ok { - methodName := selectorExpr2.Sel.Name - // 处理 h.methodName 或 k.methodName 的情况,通常指向当前handler - receiverShort := strings.ToLower(handler.ReceiverType) - if ident.Name == "h" || ident.Name == "a" || ident.Name == "k" || - ident.Name == "u" || strings.HasPrefix(receiverShort, ident.Name) { - handlerFunc = methodName - targetHandler = p.findHandlerMethod(handler.ReceiverType, methodName) - if targetHandler == nil { - targetHandler = handler // 如果找不到,使用当前handler - } - } else { - handlerFunc = fmt.Sprintf("%s.%s", ident.Name, methodName) - } - } - } else if ident, ok := callExpr.Args[1].(*ast.Ident); ok { - handlerFunc = ident.Name - targetHandler = handler - } - - // 获取路由组前缀 - var groupPath string - if ident, ok := selectorExpr.X.(*ast.Ident); ok { - if groupPrefix, exists := routeGroups[ident.Name]; exists { - groupPath = groupPrefix - } - } - - // 组合完整路径 - fullPath := path - if groupPath != "" { - fullPath = groupPath + path - } - - // 如果还没有找到targetHandler,再次尝试查找 - if targetHandler == nil && handlerFunc != "" { - targetHandler = p.findHandlerMethod(handler.ReceiverType, handlerFunc) - } - - // 创建路由信息 - route := RouteInfo{ - Method: method, - Path: fullPath, - Handler: handlerFunc, - HandlerInfo: targetHandler, - Group: groupPath, - } - - p.routes = append(p.routes, route) - - if p.verbose { - fmt.Printf("🚏 找到路由: %s %s -> %s\n", method, fullPath, handlerFunc) - } - - return true - } else if p.verbose && p.isHTTPMethod(method) { - fmt.Printf("⚠️ HTTP方法 %s 参数不足 (参数数量: %d)\n", method, len(callExpr.Args)) - } - } - } - - return false -} - -// findHandlerMethod 查找handler方法 -func (p *Parser) findHandlerMethod(receiverType, methodName string) *HandlerInfo { - // 首先尝试完整匹配 - key := fmt.Sprintf("%s.%s", receiverType, methodName) - if handler, exists := p.handlers[key]; exists { - return handler - } - - // 然后遍历所有handlers查找匹配的方法 - for _, handler := range p.handlers { - if handler.ReceiverType == receiverType && handler.Name == methodName { - return handler - } - } - - return nil -} - -// isHTTPMethod 检查是否是HTTP方法 -func (p *Parser) isHTTPMethod(method string) bool { - httpMethods := []string{"GET", "POST", "PUT", "DELETE", "PATCH", "HEAD", "OPTIONS"} - for _, m := range httpMethods { - if method == m { - return true - } - } - return false -} - -// exprToString 将表达式转换为字符串 -func (p *Parser) exprToString(expr ast.Expr) string { - switch t := expr.(type) { - case *ast.Ident: - return t.Name - case *ast.StarExpr: - return "*" + p.exprToString(t.X) - case *ast.ArrayType: - return "[]" + p.exprToString(t.Elt) - case *ast.SelectorExpr: - return p.exprToString(t.X) + "." + t.Sel.Name - case *ast.MapType: - return "map[" + p.exprToString(t.Key) + "]" + p.exprToString(t.Value) - case *ast.InterfaceType: - return "interface{}" - default: - return "unknown" - } -} - -// extractJSONName 从标签中提取JSON名称 -func (p *Parser) extractJSONName(tag string) string { - return p.extractTagValue(tag, "json") -} - -// extractFormName 从标签中提取Form名称 -func (p *Parser) extractFormName(tag string) string { - return p.extractTagValue(tag, "form") -} - -// extractURIName 从标签中提取URI名称 -func (p *Parser) extractURIName(tag string) string { - return p.extractTagValue(tag, "uri") -} - -// extractTagValue 从标签中提取指定tag的值 -func (p *Parser) extractTagValue(tagString, tagName string) string { - pattern := fmt.Sprintf(`%s:"([^"]*)"`, tagName) - re := regexp.MustCompile(pattern) - matches := re.FindStringSubmatch(tagString) - if len(matches) > 1 { - tagValue := matches[1] - parts := strings.Split(tagValue, ",") - if len(parts) > 0 && parts[0] != "" && parts[0] != "-" { - return parts[0] - } - } - return "" -} - -// isRequired 检查字段是否必需 -func (p *Parser) isRequired(tag string) bool { - // 检查binding tag中是否包含required - re := regexp.MustCompile(`binding:"([^"]*)"`) - matches := re.FindStringSubmatch(tag) - if len(matches) > 1 { - bindingTag := matches[1] - return strings.Contains(bindingTag, "required") - } - return false -} - -// GetHandlers 获取所有处理器 -func (p *Parser) GetHandlers() map[string]*HandlerInfo { - return p.handlers -} - -// GetRoutes 获取所有路由 -func (p *Parser) GetRoutes() []RouteInfo { - return p.routes -} - -// GetStructs 获取所有结构体 -func (p *Parser) GetStructs() map[string]*StructInfo { - return p.structs -} - -// GetPackages 获取所有包 -func (p *Parser) GetPackages() map[string]*PackageInfo { - return p.packages -} diff --git a/tools/swagger-auto-gen/generator/types.go b/tools/swagger-auto-gen/generator/types.go deleted file mode 100644 index 5e8d1c75..00000000 --- a/tools/swagger-auto-gen/generator/types.go +++ /dev/null @@ -1,181 +0,0 @@ -/* - * MIT License - * - * Copyright (c) 2024 Bamboo - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -package generator - -import ( - "go/ast" -) - -// SwaggerInfo Swagger文档基本信息 -type SwaggerInfo struct { - Title string `json:"title"` - Version string `json:"version"` - Description string `json:"description"` - Host string `json:"host"` - BasePath string `json:"basePath"` - Schemes []string `json:"schemes"` -} - -// APIEndpoint API端点信息 -type APIEndpoint struct { - Path string `json:"path"` - Method string `json:"method"` - Summary string `json:"summary,omitempty"` - Description string `json:"description,omitempty"` - Tags []string `json:"tags,omitempty"` - Parameters []Parameter `json:"parameters,omitempty"` - Responses map[string]Response `json:"responses"` - Security []map[string][]string `json:"security,omitempty"` - OperationID string `json:"operationId,omitempty"` -} - -// Parameter 参数信息 -type Parameter struct { - Name string `json:"name"` - In string `json:"in"` // query, path, header, body, formData - Type string `json:"type,omitempty"` - Format string `json:"format,omitempty"` - Required bool `json:"required,omitempty"` - Description string `json:"description,omitempty"` - Schema *Schema `json:"schema,omitempty"` - Items *Items `json:"items,omitempty"` -} - -// Response 响应信息 -type Response struct { - Description string `json:"description"` - Schema *Schema `json:"schema,omitempty"` - Headers map[string]Header `json:"headers,omitempty"` -} - -// Header 响应头信息 -type Header struct { - Type string `json:"type"` - Format string `json:"format,omitempty"` - Description string `json:"description,omitempty"` -} - -// Schema 数据模型 -type Schema struct { - Type string `json:"type,omitempty"` - Format string `json:"format,omitempty"` - Ref string `json:"$ref,omitempty"` - Items *Schema `json:"items,omitempty"` - Properties map[string]*Schema `json:"properties,omitempty"` - Required []string `json:"required,omitempty"` - Description string `json:"description,omitempty"` - Example interface{} `json:"example,omitempty"` - AdditionalProperties interface{} `json:"additionalProperties,omitempty"` -} - -// Items 数组项信息 -type Items struct { - Type string `json:"type,omitempty"` - Format string `json:"format,omitempty"` - Ref string `json:"$ref,omitempty"` -} - -// Definition 数据模型定义 -type Definition struct { - Type string `json:"type"` - Properties map[string]*Schema `json:"properties,omitempty"` - Required []string `json:"required,omitempty"` - Description string `json:"description,omitempty"` -} - -// SwaggerDoc 完整的Swagger文档 -type SwaggerDoc struct { - Swagger string `json:"swagger"` - Info SwaggerInfo `json:"info"` - Host string `json:"host,omitempty"` - BasePath string `json:"basePath,omitempty"` - Schemes []string `json:"schemes,omitempty"` - Consumes []string `json:"consumes,omitempty"` - Produces []string `json:"produces,omitempty"` - Paths map[string]map[string]APIEndpoint `json:"paths"` - Definitions map[string]Definition `json:"definitions,omitempty"` - SecurityDefinitions map[string]SecurityDefinition `json:"securityDefinitions,omitempty"` - Tags []Tag `json:"tags,omitempty"` -} - -// SecurityDefinition 安全定义 -type SecurityDefinition struct { - Type string `json:"type"` - Name string `json:"name,omitempty"` - In string `json:"in,omitempty"` - Description string `json:"description,omitempty"` -} - -// Tag 标签 -type Tag struct { - Name string `json:"name"` - Description string `json:"description,omitempty"` -} - -// HandlerInfo 处理函数信息 -type HandlerInfo struct { - Name string - FuncDecl *ast.FuncDecl - ReceiverType string - PackageName string -} - -// RouteInfo 路由信息 -type RouteInfo struct { - Method string - Path string - Handler string - HandlerInfo *HandlerInfo - Middleware []string - Group string -} - -// StructInfo 结构体信息 -type StructInfo struct { - Name string - Fields []FieldInfo - Package string - EmbeddedTypes []string // 嵌入的类型列表(如 ListReq) -} - -// FieldInfo 字段信息 -type FieldInfo struct { - Name string - Type string - Tag string - JSONName string - FormName string // form tag 用于查询参数 - URIName string // uri tag 用于路径参数 - Required bool - Description string -} - -// PackageInfo 包信息 -type PackageInfo struct { - Name string - Path string - Files []*ast.File -} diff --git a/tools/swagger-auto-gen/go.mod b/tools/swagger-auto-gen/go.mod deleted file mode 100644 index ead5aa26..00000000 --- a/tools/swagger-auto-gen/go.mod +++ /dev/null @@ -1,14 +0,0 @@ -module github.com/GoSimplicity/AI-CloudOps/tools/swagger-auto-gen - -go 1.21 - -require ( - golang.org/x/tools v0.15.0 - gopkg.in/yaml.v3 v3.0.1 -) - -require ( - github.com/joho/godotenv v1.5.1 // indirect - golang.org/x/mod v0.14.0 // indirect - golang.org/x/sys v0.14.0 // indirect -) diff --git a/tools/swagger-auto-gen/go.sum b/tools/swagger-auto-gen/go.sum deleted file mode 100644 index b8a13542..00000000 --- a/tools/swagger-auto-gen/go.sum +++ /dev/null @@ -1,14 +0,0 @@ -github.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0= -github.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4= -golang.org/x/mod v0.14.0 h1:dGoOF9QVLYng8IHTm7BAyWqCqSheQ5pYWGhzW00YJr0= -golang.org/x/mod v0.14.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= -golang.org/x/sync v0.5.0 h1:60k92dhOjHxJkrqnwsfl8KuaHbn/5dl0lUPUklKo3qE= -golang.org/x/sync v0.5.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= -golang.org/x/sys v0.14.0 h1:Vz7Qs629MkJkGyHxUlRHizWJRG2j8fbQKjELVSNhy7Q= -golang.org/x/sys v0.14.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/tools v0.15.0 h1:zdAyfUGbYmuVokhzVmghFl2ZJh5QhcfebBgmVPFYA+8= -golang.org/x/tools v0.15.0/go.mod h1:hpksKq4dtpQWS1uQ61JkdqWM3LscIS6Slf+VVkm+wQk= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= -gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/tools/swagger-auto-gen/main.go b/tools/swagger-auto-gen/main.go deleted file mode 100644 index 3c347ca7..00000000 --- a/tools/swagger-auto-gen/main.go +++ /dev/null @@ -1,107 +0,0 @@ -/* - * MIT License - * - * Copyright (c) 2024 Bamboo - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -package main - -import ( - "flag" - "fmt" - "log" - "os" - "path/filepath" - "strings" - - "github.com/GoSimplicity/AI-CloudOps/tools/swagger-auto-gen/generator" -) - -// 获取环境变量的值,如果不存在则返回默认值 -func getEnvOrDefault(key, defaultValue string) string { - value := os.Getenv(key) - if value == "" { - return defaultValue - } - return value -} - -// 检查环境变量是否为true -func isEnvTrue(key string) bool { - value := strings.ToLower(os.Getenv(key)) - return value == "true" || value == "1" || value == "yes" || value == "y" || value == "on" -} - -func main() { - var ( - projectRoot = flag.String("root", getEnvOrDefault("SWAGGER_ROOT", "."), "项目根目录") - outputDir = flag.String("output", getEnvOrDefault("SWAGGER_OUTPUT", "./docs"), "输出目录") - verbose = flag.Bool("v", isEnvTrue("SWAGGER_VERBOSE"), "详细输出") - enabled = flag.Bool("enabled", isEnvTrue("SWAGGER_ENABLED"), "是否启用Swagger生成") - ) - flag.Parse() - - // 获取绝对路径 - absRoot, err := filepath.Abs(*projectRoot) - if err != nil { - log.Fatalf("获取项目根目录绝对路径失败: %v", err) - } - - absOutput, err := filepath.Abs(*outputDir) - if err != nil { - log.Fatalf("获取输出目录绝对路径失败: %v", err) - } - - // 检查是否启用Swagger生成 - if !*enabled { - if *verbose { - fmt.Println("⏭️ Swagger文档生成已禁用,跳过生成过程") - } - return - } - - // 创建输出目录 - if err := os.MkdirAll(absOutput, 0755); err != nil { - log.Fatalf("创建输出目录失败: %v", err) - } - - if *verbose { - fmt.Println("🚀 AI-CloudOps Swagger 文档生成器") - fmt.Printf("📁 项目根目录: %s\n", absRoot) - fmt.Printf("📄 输出目录: %s\n", absOutput) - fmt.Printf("⚙️ 环境配置: SWAGGER_ENABLED=%v\n", isEnvTrue("SWAGGER_ENABLED")) - } - - // 创建生成器 - gen := generator.NewSwaggerGenerator(absRoot, absOutput, *verbose) - - // 生成文档 - if err := gen.Generate(); err != nil { - log.Fatalf("生成 Swagger 文档失败: %v", err) - } - - if *verbose { - fmt.Println("✅ Swagger 文档生成完成!") - } else { - fmt.Println("生成完成") - } -}