package environment import ( "context" "fmt" "github.com/openHPI/poseidon/internal/config" "github.com/openHPI/poseidon/internal/runner" "github.com/openHPI/poseidon/pkg/dto" "k8s.io/client-go/kubernetes" ) // KubernetesEnvironmentManager manages Kubernetes environments. type KubernetesEnvironmentManager struct { *AbstractManager clientSet *kubernetes.Clientset } func NewKubernetesEnvironmentManager(runnerManager runner.Manager, clientset *kubernetes.Clientset) *KubernetesEnvironmentManager { return &KubernetesEnvironmentManager{ AbstractManager: &AbstractManager{nil, runnerManager}, clientSet: clientset, } } func (k *KubernetesEnvironmentManager) List(fetch bool) ([]runner.ExecutionEnvironment, error) { list, err := k.NextHandler().List(fetch) if err != nil { return nil, fmt.Errorf("kubernetes wrapped: %w", err) } return append(list, k.runnerManager.ListEnvironments()...), nil } func (k *KubernetesEnvironmentManager) Get(id dto.EnvironmentID, fetch bool) (runner.ExecutionEnvironment, error) { e, ok := k.runnerManager.GetEnvironment(id) if ok { return e, nil } else { e, err := k.NextHandler().Get(id, fetch) if err != nil { return nil, fmt.Errorf("kubernetes wrapped: %w", err) } return e, nil } } func (k *KubernetesEnvironmentManager) CreateOrUpdate( id dto.EnvironmentID, request dto.ExecutionEnvironmentRequest, ctx context.Context) (bool, error) { if !isKubernetesEnvironment(request) { isCreated, err := k.NextHandler().CreateOrUpdate(id, request, ctx) if err != nil { return false, fmt.Errorf("kubernetes wrapped: %w", err) } return isCreated, nil } _, ok := k.runnerManager.GetEnvironment(id) e := NewKubernetesEnvironment(k.runnerManager.Return, k.clientSet) e.SetID(id) e.SetImage(request.Image) k.runnerManager.StoreEnvironment(e) return !ok, nil } func isKubernetesEnvironment(request dto.ExecutionEnvironmentRequest) bool { for _, image := range config.Config.Kubernetes.Images { if request.Image == image { return true } } return false }