package api import ( "net/http" "gitea.starryskymeow.cn/xkm/educode-controller/internal/k8s" "github.com/gin-gonic/gin" "k8s.io/client-go/kubernetes" ) const Namespace = "default" // Or get from config type Handler struct { clientset *kubernetes.Clientset } func NewHandler(clientset *kubernetes.Clientset) *Handler { return &Handler{clientset: clientset} } func (h *Handler) createWorkspace(c *gin.Context) { var req CreateWorkspaceRequest if err := c.ShouldBindJSON(&req); err != nil { c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) return } image := k8s.DefaultImage if req.Image != "" { image = req.Image } k8sReq := &k8s.WorkspaceRequest{ Image: image, Env: req.Env, WorkspaceID: req.WorkspaceID, Clientset: h.clientset, Namespace: Namespace, } if req.ResourceLimits != nil { k8sReq.ResourceLimits = &k8s.ResourceLimits{ CPU: req.ResourceLimits.CPU, Memory: req.ResourceLimits.Memory, } } err := k8s.CreateWorkspace(k8sReq) if err != nil { c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()}) return } c.JSON(http.StatusAccepted, gin.H{"status": "creating", "workspaceId": req.WorkspaceID}) } func (h *Handler) deleteWorkspace(c *gin.Context) { workspaceID := c.Param("workspaceID") err := k8s.DeleteWorkspace(h.clientset, Namespace, workspaceID) if err != nil { c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()}) return } c.JSON(http.StatusAccepted, gin.H{"status": "deleting", "workspaceId": workspaceID}) } func (h *Handler) getWorkspace(c *gin.Context) { workspaceID := c.Param("workspaceID") // TODO: Call k8s manager to get resource status c.JSON(http.StatusOK, gin.H{"status": "ok", "workspaceId": workspaceID}) } func (h *Handler) extendWorkspace(c *gin.Context) { workspaceID := c.Param("workspaceID") // TODO: Call k8s manager to patch resource annotation c.JSON(http.StatusOK, gin.H{"status": "extended", "workspaceId": workspaceID}) }