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

71 lines
2.0 KiB
Go

package runner
import (
"context"
"errors"
"fmt"
"github.com/openHPI/poseidon/pkg/dto"
"github.com/openHPI/poseidon/pkg/logging"
"k8s.io/client-go/kubernetes"
"time"
)
var (
log = logging.GetLogger("runner")
ErrUnknownExecutionEnvironment = errors.New("execution environment not found")
ErrNoRunnersAvailable = errors.New("no runners available for this execution environment")
ErrRunnerNotFound = errors.New("no runner found with this id")
)
type KubernetesRunnerManager struct {
*AbstractManager
clientSet *kubernetes.Clientset
}
// NewKubernetesRunnerManager creates a new runner manager that keeps track of all runners in Kubernetes.
func NewKubernetesRunnerManager(ctx context.Context, clientSet *kubernetes.Clientset) *KubernetesRunnerManager {
return &KubernetesRunnerManager{
AbstractManager: NewAbstractManager(ctx),
clientSet: clientSet,
}
}
func (k *KubernetesRunnerManager) Claim(id dto.EnvironmentID, duration int) (Runner, error) {
environment, ok := k.GetEnvironment(id)
if !ok {
r, err := k.NextHandler().Claim(id, duration)
if err != nil {
return nil, fmt.Errorf("kubernetes wrapped: %w", err)
}
return r, nil
}
runner, ok := environment.Sample()
if !ok {
log.Warn("no kubernetes runner available")
return nil, ErrNoRunnersAvailable
}
k.usedRunners.Add(runner.ID(), runner)
runner.SetupTimeout(time.Duration(duration) * time.Second)
// Here you might want to add Kubernetes-specific logic
// For example, updating the pod status or adding labels
return runner, nil
}
func (k *KubernetesRunnerManager) Return(r Runner) error {
_, isKubernetesRunner := r.(*KubernetesPodWorkload)
if isKubernetesRunner {
k.usedRunners.Delete(r.ID())
// Here you might want to add Kubernetes-specific logic
// For example, cleaning up the pod or updating its status
} else if err := k.NextHandler().Return(r); err != nil {
return fmt.Errorf("kubernetes wrapped: %w", err)
}
return nil
}