2025-03-30 18:18:03 +08:00

78 lines
1.8 KiB
Go

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")
}