Files
polyphem/internal/environment/k8s_manager.go
2024-08-12 10:02:36 +02:00

72 lines
2.0 KiB
Go

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
}