140 lines
3.6 KiB
Go
140 lines
3.6 KiB
Go
package environment
|
|
|
|
import (
|
|
"encoding/json"
|
|
"fmt"
|
|
"github.com/openHPI/poseidon/internal/runner"
|
|
"github.com/openHPI/poseidon/pkg/dto"
|
|
"k8s.io/client-go/kubernetes"
|
|
)
|
|
|
|
type KubernetesEnvironment struct {
|
|
id dto.EnvironmentID
|
|
image string
|
|
cpuLimit uint
|
|
memoryLimit uint
|
|
networkEnabled bool
|
|
mappedPorts []uint16
|
|
prewarmingPool uint
|
|
onDestroyRunner runner.DestroyRunnerHandler
|
|
clientset *kubernetes.Clientset
|
|
}
|
|
|
|
func NewKubernetesEnvironment(onDestroyRunner runner.DestroyRunnerHandler, clientset *kubernetes.Clientset) *KubernetesEnvironment {
|
|
return &KubernetesEnvironment{
|
|
onDestroyRunner: onDestroyRunner,
|
|
clientset: clientset,
|
|
cpuLimit: 500, // Default CPU limit (in millicores)
|
|
memoryLimit: 512, // Default memory limit (in MB)
|
|
networkEnabled: false,
|
|
prewarmingPool: 1,
|
|
}
|
|
}
|
|
|
|
func (k *KubernetesEnvironment) MarshalJSON() ([]byte, error) {
|
|
res, err := json.Marshal(dto.ExecutionEnvironmentData{
|
|
ID: int(k.ID()),
|
|
ExecutionEnvironmentRequest: dto.ExecutionEnvironmentRequest{Image: k.Image()},
|
|
})
|
|
if err != nil {
|
|
return res, fmt.Errorf("couldn't marshal kubernetes execution environment: %w", err)
|
|
}
|
|
return res, nil
|
|
}
|
|
|
|
func (k *KubernetesEnvironment) ID() dto.EnvironmentID {
|
|
return k.id
|
|
}
|
|
|
|
func (k *KubernetesEnvironment) SetID(id dto.EnvironmentID) {
|
|
k.id = id
|
|
}
|
|
|
|
func (k *KubernetesEnvironment) Image() string {
|
|
return k.image
|
|
}
|
|
|
|
func (k *KubernetesEnvironment) SetImage(image string) {
|
|
k.image = image
|
|
}
|
|
|
|
func (k *KubernetesEnvironment) Delete(_ runner.DestroyReason) error {
|
|
// Implement Kubernetes-specific deletion logic here
|
|
return nil
|
|
}
|
|
|
|
func (k *KubernetesEnvironment) Sample() (r runner.Runner, ok bool) {
|
|
workload, err := runner.NewKubernetesPodWorkload(k, k.onDestroyRunner, k.clientset)
|
|
if err != nil {
|
|
return nil, false
|
|
}
|
|
return workload, true
|
|
}
|
|
|
|
func (k *KubernetesEnvironment) IdleRunnerCount() uint {
|
|
// Implement logic to count idle runners in Kubernetes
|
|
return 0
|
|
}
|
|
|
|
func (k *KubernetesEnvironment) PrewarmingPoolSize() uint {
|
|
return k.prewarmingPool
|
|
}
|
|
|
|
func (k *KubernetesEnvironment) SetPrewarmingPoolSize(size uint) {
|
|
k.prewarmingPool = size
|
|
}
|
|
|
|
func (k *KubernetesEnvironment) ApplyPrewarmingPoolSize() error {
|
|
// Implement logic to apply prewarming pool size in Kubernetes
|
|
return nil
|
|
}
|
|
|
|
func (k *KubernetesEnvironment) CPULimit() uint {
|
|
return k.cpuLimit
|
|
}
|
|
|
|
func (k *KubernetesEnvironment) SetCPULimit(limit uint) {
|
|
k.cpuLimit = limit
|
|
}
|
|
|
|
func (k *KubernetesEnvironment) MemoryLimit() uint {
|
|
return k.memoryLimit
|
|
}
|
|
|
|
func (k *KubernetesEnvironment) SetMemoryLimit(limit uint) {
|
|
k.memoryLimit = limit
|
|
}
|
|
|
|
func (k *KubernetesEnvironment) NetworkAccess() (enabled bool, mappedPorts []uint16) {
|
|
return k.networkEnabled, k.mappedPorts
|
|
}
|
|
|
|
func (k *KubernetesEnvironment) SetNetworkAccess(enabled bool, ports []uint16) {
|
|
k.networkEnabled = enabled
|
|
k.mappedPorts = ports
|
|
}
|
|
|
|
func (k *KubernetesEnvironment) SetConfigFrom(env runner.ExecutionEnvironment) {
|
|
if kEnv, ok := env.(*KubernetesEnvironment); ok {
|
|
k.cpuLimit = kEnv.cpuLimit
|
|
k.memoryLimit = kEnv.memoryLimit
|
|
k.networkEnabled = kEnv.networkEnabled
|
|
k.mappedPorts = kEnv.mappedPorts
|
|
k.prewarmingPool = kEnv.prewarmingPool
|
|
}
|
|
}
|
|
|
|
func (k *KubernetesEnvironment) Register() error {
|
|
// Implement Kubernetes-specific registration logic here
|
|
return nil
|
|
}
|
|
|
|
func (k *KubernetesEnvironment) AddRunner(runner runner.Runner) {
|
|
// Implement logic to add a runner to the Kubernetes environment
|
|
}
|
|
|
|
func (k *KubernetesEnvironment) DeleteRunner(id string) (r runner.Runner, ok bool) {
|
|
// Implement logic to delete a runner from the Kubernetes environment
|
|
return nil, false
|
|
}
|