49 lines
1.3 KiB
Go
49 lines
1.3 KiB
Go
package k8s
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
|
|
corev1 "k8s.io/api/core/v1"
|
|
"k8s.io/apimachinery/pkg/api/errors"
|
|
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
|
|
|
"github.com/iliaivanov/spec-kit-remote/cmd/dev-pod-api/internal/model"
|
|
)
|
|
|
|
// EnsureNamespace creates a namespace for the user if it doesn't already exist.
|
|
// Returns nil if the namespace already exists (idempotent).
|
|
func (c *Client) EnsureNamespace(ctx context.Context, user string) error {
|
|
ns := &corev1.Namespace{
|
|
ObjectMeta: metav1.ObjectMeta{
|
|
Name: model.NamespaceName(user),
|
|
Labels: map[string]string{
|
|
"app": "dev-pod",
|
|
"managed-by": "dev-pod-api",
|
|
"user": user,
|
|
},
|
|
},
|
|
}
|
|
|
|
_, err := c.Clientset.CoreV1().Namespaces().Create(ctx, ns, metav1.CreateOptions{})
|
|
if err != nil {
|
|
if errors.IsAlreadyExists(err) {
|
|
return nil
|
|
}
|
|
return fmt.Errorf("create namespace %s: %w", ns.Name, err)
|
|
}
|
|
return nil
|
|
}
|
|
|
|
// DeleteNamespace deletes the user's namespace and all resources in it.
|
|
func (c *Client) DeleteNamespace(ctx context.Context, user string) error {
|
|
nsName := model.NamespaceName(user)
|
|
err := c.Clientset.CoreV1().Namespaces().Delete(ctx, nsName, metav1.DeleteOptions{})
|
|
if err != nil {
|
|
if errors.IsNotFound(err) {
|
|
return nil
|
|
}
|
|
return fmt.Errorf("delete namespace %s: %w", nsName, err)
|
|
}
|
|
return nil
|
|
}
|