add key to support wsrx
This commit is contained in:
@@ -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) {
|
||||||
|
|||||||
@@ -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 {
|
||||||
|
|||||||
Reference in New Issue
Block a user