dev-pod-api-build/internal/k8s/namespace.go
2026-04-16 04:16:36 +00:00

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
}