feat(rdp): 新增 RDP 远程桌面/SMB/账单同步能力 + 清理编译产物
主要变更: - RDP 远程桌面:新增 backend/pkg/rdp(RDP 引擎 + credssp/display/rle/trace)、 backend/controller/rdp*(连接/凭证/文件/会话/实时)、frontend RDP 组件与 API - Windows SMB 文件传输:backend/pkg/winsmb - 云账单同步:backend/pkg/billingsync + billing_sync/aliyun_billing,前端账单详情 - Agent CLI Kubernetes 工具:kubernetes_action/get、pod_execute/logs - 服务器导入助手:server_import_helpers、ImportCredentialSettings - 国际化与组件重构(cloud/deploy/monitor/server/system 等多模块) - 清理编译产物二进制:移除 backend/server、backend/agent/bin/aiops-agent-* - .gitignore:新增 backend/agent/ 与 .cache/(避免 334MB go-build 缓存误入库) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
1 parent
777d9e4e71
commit
76ec9387f0
202 files changed
+16555
-2543
No files matched your search
@@ -0,0 +1,131 @@
|
||||
// kubernetes_action.go - Kubernetes 集群变更操作(高风险,需用户确认) // Logan.Li
|
||||
package tools
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"strings"
|
||||
|
||||
k8sclient "ezops/pkg/kubernetesclient"
|
||||
)
|
||||
|
||||
// KubernetesActionTool 执行 Kubernetes 变更动作 // Logan.Li
|
||||
type KubernetesActionTool struct {
|
||||
client *k8sclient.Client
|
||||
namespace string
|
||||
}
|
||||
|
||||
// NewKubernetesActionTool 创建变更工具 // Logan.Li
|
||||
func NewKubernetesActionTool(client *k8sclient.Client, namespace string) *KubernetesActionTool {
|
||||
return &KubernetesActionTool{client: client, namespace: namespace}
|
||||
}
|
||||
|
||||
// Name 工具名 // Logan.Li
|
||||
func (t *KubernetesActionTool) Name() string { return "kubernetes_action" }
|
||||
|
||||
// Description 给 LLM 的说明 // Logan.Li
|
||||
func (t *KubernetesActionTool) Description() string {
|
||||
return "对 Kubernetes 资源执行变更操作(高风险,需用户确认)。" +
|
||||
"action 支持: restart_deployment, scale_deployment, update_image, restart_statefulset, delete_pod, suspend_cronjob。" +
|
||||
"变更前请先用 kubernetes_get 确认当前状态。"
|
||||
}
|
||||
|
||||
// Parameters JSON Schema // Logan.Li
|
||||
func (t *KubernetesActionTool) Parameters() map[string]interface{} {
|
||||
return map[string]interface{}{
|
||||
"type": "object",
|
||||
"properties": map[string]interface{}{
|
||||
"action": map[string]interface{}{
|
||||
"type": "string",
|
||||
"description": "操作类型: restart_deployment|scale_deployment|update_image|restart_statefulset|delete_pod|suspend_cronjob",
|
||||
},
|
||||
"namespace": map[string]interface{}{
|
||||
"type": "string",
|
||||
"description": "命名空间,默认会话绑定命名空间",
|
||||
},
|
||||
"name": map[string]interface{}{
|
||||
"type": "string",
|
||||
"description": "资源名称(Deployment/StatefulSet/CronJob/Pod)",
|
||||
},
|
||||
"replicas": map[string]interface{}{
|
||||
"type": "integer",
|
||||
"description": "scale_deployment 目标副本数",
|
||||
},
|
||||
"image": map[string]interface{}{
|
||||
"type": "string",
|
||||
"description": "update_image 新镜像地址",
|
||||
},
|
||||
"container": map[string]interface{}{
|
||||
"type": "string",
|
||||
"description": "update_image 目标容器名,可省略(默认第一个)",
|
||||
},
|
||||
"suspend": map[string]interface{}{
|
||||
"type": "boolean",
|
||||
"description": "suspend_cronjob: true=暂停, false=恢复",
|
||||
},
|
||||
},
|
||||
"required": []string{"action", "name"},
|
||||
}
|
||||
}
|
||||
|
||||
// RiskLevel 静态高风险 // Logan.Li
|
||||
func (t *KubernetesActionTool) RiskLevel() RiskLevel { return RiskHigh }
|
||||
|
||||
// Execute 执行变更 // Logan.Li
|
||||
func (t *KubernetesActionTool) Execute(ctx context.Context, args map[string]interface{}) (*Result, error) {
|
||||
action := strings.ToLower(strings.TrimSpace(StringParam(args, "action")))
|
||||
name := strings.TrimSpace(StringParam(args, "name"))
|
||||
ns := strings.TrimSpace(StringParam(args, "namespace"))
|
||||
if ns == "" {
|
||||
ns = t.namespace
|
||||
}
|
||||
if action == "" || name == "" {
|
||||
return &Result{Success: false, Error: "action 和 name 不能为空"}, nil
|
||||
}
|
||||
|
||||
var err error
|
||||
var msg string
|
||||
switch action {
|
||||
case "restart_deployment":
|
||||
err = t.client.RestartDeployment(ns, name)
|
||||
msg = fmt.Sprintf("已触发 Deployment %s/%s 滚动重启", ns, name)
|
||||
case "scale_deployment":
|
||||
replicas := IntParam(args, "replicas")
|
||||
if replicas < 0 {
|
||||
return &Result{Success: false, Error: "replicas 不能为负数"}, nil
|
||||
}
|
||||
err = t.client.ScaleDeployment(ns, name, replicas)
|
||||
msg = fmt.Sprintf("已将 Deployment %s/%s 扩缩容至 %d 副本", ns, name, replicas)
|
||||
case "update_image":
|
||||
image := strings.TrimSpace(StringParam(args, "image"))
|
||||
if image == "" {
|
||||
return &Result{Success: false, Error: "update_image 需要 image 参数"}, nil
|
||||
}
|
||||
container := strings.TrimSpace(StringParam(args, "container"))
|
||||
err = t.client.UpdateDeploymentImage(ns, name, container, image)
|
||||
msg = fmt.Sprintf("已更新 Deployment %s/%s 镜像为 %s", ns, name, image)
|
||||
case "restart_statefulset":
|
||||
err = t.client.RestartStatefulSet(ns, name)
|
||||
msg = fmt.Sprintf("已触发 StatefulSet %s/%s 滚动重启", ns, name)
|
||||
case "delete_pod":
|
||||
err = t.client.DeletePod(ns, name)
|
||||
msg = fmt.Sprintf("已删除 Pod %s/%s(控制器将视情况重建)", ns, name)
|
||||
case "suspend_cronjob":
|
||||
suspend := true
|
||||
if v, ok := args["suspend"].(bool); ok {
|
||||
suspend = v
|
||||
}
|
||||
err = t.client.SuspendCronJob(ns, name, suspend)
|
||||
if suspend {
|
||||
msg = fmt.Sprintf("已暂停 CronJob %s/%s", ns, name)
|
||||
} else {
|
||||
msg = fmt.Sprintf("已恢复 CronJob %s/%s", ns, name)
|
||||
}
|
||||
default:
|
||||
return &Result{Success: false, Error: fmt.Sprintf("不支持的 action: %s", action)}, nil
|
||||
}
|
||||
if err != nil {
|
||||
return &Result{Success: false, Error: fmt.Sprintf("操作失败: %v", err)}, nil
|
||||
}
|
||||
return &Result{Success: true, Output: msg}, nil
|
||||
}
|
||||
Reference in new issue
Block a user