67 lines
1.7 KiB
Go
67 lines
1.7 KiB
Go
package runner
|
|
|
|
import (
|
|
"fmt"
|
|
"github.com/openHPI/poseidon/pkg/dto"
|
|
"time"
|
|
)
|
|
|
|
type AWSRunnerManager struct {
|
|
*AbstractManager
|
|
}
|
|
|
|
// NewAWSRunnerManager creates a new runner manager that keeps track of all runners at AWS.
|
|
func NewAWSRunnerManager() *AWSRunnerManager {
|
|
return &AWSRunnerManager{NewAbstractManager()}
|
|
}
|
|
|
|
func (a AWSRunnerManager) Claim(id dto.EnvironmentID, duration int) (Runner, error) {
|
|
environment, ok := a.environments.Get(id)
|
|
if !ok {
|
|
r, err := a.NextHandler().Claim(id, duration)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("aws wrapped: %w", err)
|
|
}
|
|
return r, nil
|
|
}
|
|
|
|
runner, ok := environment.Sample()
|
|
if !ok {
|
|
log.Warn("no aws runner available")
|
|
return nil, ErrNoRunnersAvailable
|
|
}
|
|
|
|
a.usedRunners.Add(runner)
|
|
runner.SetupTimeout(time.Duration(duration) * time.Second)
|
|
return runner, nil
|
|
}
|
|
|
|
func (a AWSRunnerManager) Return(r Runner) error {
|
|
_, isAWSRunner := r.(*AWSFunctionWorkload)
|
|
if isAWSRunner {
|
|
a.usedRunners.Delete(r.ID())
|
|
} else if err := a.NextHandler().Return(r); err != nil {
|
|
return fmt.Errorf("aws wrapped: %w", err)
|
|
}
|
|
return nil
|
|
}
|
|
|
|
// EnvironmentStatistics returns only the used runner for each environment as the prewarming is handled
|
|
// by AWS transparently.
|
|
func (a AWSRunnerManager) EnvironmentStatistics() map[dto.EnvironmentID]*dto.StatisticalExecutionEnvironmentData {
|
|
environments := a.AbstractManager.EnvironmentStatistics()
|
|
|
|
for _, r := range a.usedRunners.List() {
|
|
workload, isAWSRunner := r.(*AWSFunctionWorkload)
|
|
if !isAWSRunner {
|
|
log.WithField("workload", workload).Error("Stored runners must be AWS runner")
|
|
continue
|
|
}
|
|
|
|
environmentID := workload.environment.ID()
|
|
environments[environmentID].UsedRunners++
|
|
}
|
|
|
|
return environments
|
|
}
|