add key to support wsrx

This commit is contained in:
starryskymeow
2025-07-05 20:12:17 +08:00
parent 44a21791ff
commit fc5abbc589
2 changed files with 30 additions and 10 deletions

View File

@@ -56,13 +56,13 @@ func (h *Handler) createWorkspace(c *gin.Context) {
Namespace: Namespace, Namespace: Namespace,
} }
err := k8s.CreateWorkspace(k8sReq) keyword, err := k8s.CreateWorkspace(k8sReq)
if err != nil { if err != nil {
c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()}) c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
return return
} }
c.JSON(http.StatusAccepted, gin.H{"status": "creating", "workspaceId": req.WorkspaceID}) c.JSON(http.StatusAccepted, gin.H{"status": "creating", "workspaceId": req.WorkspaceID, "keyword": keyword})
} }
func (h *Handler) deleteWorkspace(c *gin.Context) { func (h *Handler) deleteWorkspace(c *gin.Context) {

View File

@@ -2,6 +2,8 @@ package k8s
import ( import (
"context" "context"
"crypto/rand"
"encoding/hex"
"fmt" "fmt"
"time" "time"
@@ -38,12 +40,27 @@ type ResourceLimits struct {
Storage string `json:"storage"` Storage string `json:"storage"`
} }
func CreateWorkspace(req *WorkspaceRequest) error { func generateRandomString(length int) (string, error) {
bytes := make([]byte, length)
if _, err := rand.Read(bytes); err != nil {
return "", err
}
return hex.EncodeToString(bytes), nil
}
func CreateWorkspace(req *WorkspaceRequest) (string, error) {
// Generate a random keyword for wsrx
wsrxKeyword, err := generateRandomString(8)
if err != nil {
return "", fmt.Errorf("failed to generate random string for wsrx keyword: %w", err)
}
// Define StatefulSet // Define StatefulSet
sts := &appsv1.StatefulSet{ sts := &appsv1.StatefulSet{
ObjectMeta: metav1.ObjectMeta{ ObjectMeta: metav1.ObjectMeta{
Name: req.WorkspaceID, Name: req.WorkspaceID,
Namespace: req.Namespace, Namespace: req.Namespace,
Labels: map[string]string{"educode/autodelete": "true"},
Annotations: map[string]string{ Annotations: map[string]string{
"educode/expires-at": time.Now().Add(1 * time.Hour).Format(time.RFC3339), "educode/expires-at": time.Now().Add(1 * time.Hour).Format(time.RFC3339),
}, },
@@ -93,9 +110,9 @@ func CreateWorkspace(req *WorkspaceRequest) error {
} }
// Create resources // Create resources
sts, err := req.Clientset.AppsV1().StatefulSets(req.Namespace).Create(context.TODO(), sts, metav1.CreateOptions{}) sts, err = req.Clientset.AppsV1().StatefulSets(req.Namespace).Create(context.TODO(), sts, metav1.CreateOptions{})
if err != nil { if err != nil {
return fmt.Errorf("failed to create statefulset: %w", err) return "", fmt.Errorf("failed to create statefulset: %w", err)
} }
// Define Service // Define Service
@@ -103,6 +120,8 @@ func CreateWorkspace(req *WorkspaceRequest) error {
ObjectMeta: metav1.ObjectMeta{ ObjectMeta: metav1.ObjectMeta{
Name: req.WorkspaceID, Name: req.WorkspaceID,
Namespace: req.Namespace, Namespace: req.Namespace,
Labels: map[string]string{"wsrx/enabled": "true"},
Annotations: map[string]string{"wsrx/keyword": wsrxKeyword},
OwnerReferences: []metav1.OwnerReference{ OwnerReferences: []metav1.OwnerReference{
{ {
APIVersion: "apps/v1", APIVersion: "apps/v1",
@@ -120,6 +139,7 @@ func CreateWorkspace(req *WorkspaceRequest) error {
{Name: "ssh", Port: 22, TargetPort: intstr.FromInt(22)}, {Name: "ssh", Port: 22, TargetPort: intstr.FromInt(22)},
}, },
Type: corev1.ServiceTypeClusterIP, Type: corev1.ServiceTypeClusterIP,
ClusterIP: "None",
}, },
} }
@@ -130,10 +150,10 @@ func CreateWorkspace(req *WorkspaceRequest) error {
req.Clientset.AppsV1().StatefulSets(req.Namespace).Delete(context.TODO(), req.WorkspaceID, metav1.DeleteOptions{ req.Clientset.AppsV1().StatefulSets(req.Namespace).Delete(context.TODO(), req.WorkspaceID, metav1.DeleteOptions{
PropagationPolicy: &deletePolicy, PropagationPolicy: &deletePolicy,
}) })
return fmt.Errorf("failed to create service: %w", err) return "", fmt.Errorf("failed to create service: %w", err)
} }
return nil return wsrxKeyword, nil
} }
func DeleteWorkspace(clientset *kubernetes.Clientset, namespace, workspaceID string) error { func DeleteWorkspace(clientset *kubernetes.Clientset, namespace, workspaceID string) error {