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,
}
err := k8s.CreateWorkspace(k8sReq)
keyword, 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})
c.JSON(http.StatusAccepted, gin.H{"status": "creating", "workspaceId": req.WorkspaceID, "keyword": keyword})
}
func (h *Handler) deleteWorkspace(c *gin.Context) {

View File

@@ -2,6 +2,8 @@ package k8s
import (
"context"
"crypto/rand"
"encoding/hex"
"fmt"
"time"
@@ -38,12 +40,27 @@ type ResourceLimits struct {
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
sts := &appsv1.StatefulSet{
ObjectMeta: metav1.ObjectMeta{
Name: req.WorkspaceID,
Namespace: req.Namespace,
Labels: map[string]string{"educode/autodelete": "true"},
Annotations: map[string]string{
"educode/expires-at": time.Now().Add(1 * time.Hour).Format(time.RFC3339),
},
@@ -93,9 +110,9 @@ func CreateWorkspace(req *WorkspaceRequest) error {
}
// 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 {
return fmt.Errorf("failed to create statefulset: %w", err)
return "", fmt.Errorf("failed to create statefulset: %w", err)
}
// Define Service
@@ -103,6 +120,8 @@ func CreateWorkspace(req *WorkspaceRequest) error {
ObjectMeta: metav1.ObjectMeta{
Name: req.WorkspaceID,
Namespace: req.Namespace,
Labels: map[string]string{"wsrx/enabled": "true"},
Annotations: map[string]string{"wsrx/keyword": wsrxKeyword},
OwnerReferences: []metav1.OwnerReference{
{
APIVersion: "apps/v1",
@@ -120,6 +139,7 @@ func CreateWorkspace(req *WorkspaceRequest) error {
{Name: "ssh", Port: 22, TargetPort: intstr.FromInt(22)},
},
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{
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 {