package api import ( "net/http" "github.com/emicklei/go-restful/v3" "github.com/gorilla/websocket" "github.com/infraboard/mcube/v2/http/restful/response" "github.com/infraboard/mcube/v2/ioc" "github.com/infraboard/mcube/v2/ioc/config/gorestful" "github.com/infraboard/mpaas/common/terminal" "github.com/infraboard/mpaas/provider/k8s/workload" "gitlab.com/go-course-project/go17/devcloud-mini/mpaas/apps/deploy" "gitlab.com/go-course-project/go17/devcloud-mini/mpaas/apps/k8s" ) func init() { ioc.Api().Registry(&DeployApiHandler{}) } type DeployApiHandler struct { ioc.ObjectImpl } func (r *DeployApiHandler) Name() string { return deploy.AppName } func (r *DeployApiHandler) Init() error { ws := gorestful.ObjectRouter(r) ws.Route(ws.GET("/container/login").To(r.LoginContainer)) return nil } // 配置 WebSocket 升级器 var upgrader = websocket.Upgrader{ ReadBufferSize: 1024, WriteBufferSize: 1024, CheckOrigin: func(r *http.Request) bool { return true // 允许所有跨域请求(生产环境需限制) }, } func (r *DeployApiHandler) LoginContainer(req *restful.Request, resp *restful.Response) { // 升级 HTTP 连接到 WebSocket conn, err := upgrader.Upgrade(resp, req.Request, nil) if err != nil { response.Failed(resp, err) return } // 创建好叻 ins, err := k8s.GetService().DescribeCluster(req.Request.Context(), &k8s.DescribeClusterRequest{ Id: "docker-desktop", }) if err != nil { panic(err) } client, err := ins.GetK8sClient() if err != nil { panic(err) } term := terminal.NewWebSocketTerminal(conn) loginReq := workload.NewLoginContainerRequest(term) loginReq.Namespace = "default" loginReq.PodName = "nginx-7dbf64989-cr89v" loginReq.Command = []string{"bash"} err = client.WorkLoad().LoginContainer(req.Request.Context(), loginReq) if err != nil { term.Failed(err) return } term.Success("ok") }