
In today's unattended upgrade, we have seen how the prewarming pool size dropped to (near) zero. This was based on lost Nomad allocations. The allocations got rescheduled, but not added again to Poseidon. The reason for this is a miscommunication between the Event Handling and the Nomad Manager. `removedByPoseidon` was true even if the runner was not removed by the manager, but an idle runner.
121 lines
3.2 KiB
Go
121 lines
3.2 KiB
Go
package environment
|
|
|
|
import (
|
|
"encoding/json"
|
|
"fmt"
|
|
"github.com/openHPI/poseidon/internal/runner"
|
|
"github.com/openHPI/poseidon/pkg/dto"
|
|
)
|
|
|
|
type AWSEnvironment struct {
|
|
id dto.EnvironmentID
|
|
awsEndpoint string
|
|
onDestroyRunner runner.DestroyRunnerHandler
|
|
}
|
|
|
|
func NewAWSEnvironment(onDestroyRunner runner.DestroyRunnerHandler) *AWSEnvironment {
|
|
return &AWSEnvironment{onDestroyRunner: onDestroyRunner}
|
|
}
|
|
|
|
func (a *AWSEnvironment) MarshalJSON() ([]byte, error) {
|
|
res, err := json.Marshal(dto.ExecutionEnvironmentData{
|
|
ID: int(a.ID()),
|
|
ExecutionEnvironmentRequest: dto.ExecutionEnvironmentRequest{Image: a.Image()},
|
|
})
|
|
if err != nil {
|
|
return res, fmt.Errorf("couldn't marshal aws execution environment: %w", err)
|
|
}
|
|
return res, nil
|
|
}
|
|
|
|
func (a *AWSEnvironment) ID() dto.EnvironmentID {
|
|
return a.id
|
|
}
|
|
|
|
func (a *AWSEnvironment) SetID(id dto.EnvironmentID) {
|
|
a.id = id
|
|
}
|
|
|
|
// Image is used to specify the AWS Endpoint Poseidon is connecting to.
|
|
func (a *AWSEnvironment) Image() string {
|
|
return a.awsEndpoint
|
|
}
|
|
|
|
func (a *AWSEnvironment) SetImage(awsEndpoint string) {
|
|
a.awsEndpoint = awsEndpoint
|
|
}
|
|
|
|
func (a *AWSEnvironment) Delete() error {
|
|
return nil
|
|
}
|
|
|
|
func (a *AWSEnvironment) Sample() (r runner.Runner, ok bool) {
|
|
workload, err := runner.NewAWSFunctionWorkload(a, a.onDestroyRunner)
|
|
if err != nil {
|
|
return nil, false
|
|
}
|
|
return workload, true
|
|
}
|
|
|
|
// The following methods are not supported at this moment.
|
|
|
|
// IdleRunnerCount is not supported as we have no information about the AWS managed prewarming pool.
|
|
func (a *AWSEnvironment) IdleRunnerCount() uint {
|
|
return 0
|
|
}
|
|
|
|
// PrewarmingPoolSize is neither supported nor required. It is handled transparently by AWS.
|
|
// For easy compatibility with CodeOcean, 1 is the static value.
|
|
func (a *AWSEnvironment) PrewarmingPoolSize() uint {
|
|
return 1
|
|
}
|
|
|
|
// SetPrewarmingPoolSize is neither supported nor required. It is handled transparently by AWS.
|
|
func (a *AWSEnvironment) SetPrewarmingPoolSize(_ uint) {}
|
|
|
|
// ApplyPrewarmingPoolSize is neither supported nor required. It is handled transparently by AWS.
|
|
func (a *AWSEnvironment) ApplyPrewarmingPoolSize() error {
|
|
return nil
|
|
}
|
|
|
|
// CPULimit is disabled as one can only set the memory limit with AWS Lambda.
|
|
func (a *AWSEnvironment) CPULimit() uint {
|
|
return 0
|
|
}
|
|
|
|
// SetCPULimit is disabled as one can only set the memory limit with AWS Lambda.
|
|
func (a *AWSEnvironment) SetCPULimit(_ uint) {}
|
|
|
|
func (a *AWSEnvironment) MemoryLimit() uint {
|
|
const memorySizeOfDeployedLambdaFunction = 2048 // configured /deploy/aws/template.yaml
|
|
return memorySizeOfDeployedLambdaFunction
|
|
}
|
|
|
|
func (a *AWSEnvironment) SetMemoryLimit(_ uint) {
|
|
panic("not supported")
|
|
}
|
|
|
|
func (a *AWSEnvironment) NetworkAccess() (enabled bool, mappedPorts []uint16) {
|
|
return true, nil
|
|
}
|
|
|
|
func (a *AWSEnvironment) SetNetworkAccess(_ bool, _ []uint16) {
|
|
panic("not supported")
|
|
}
|
|
|
|
func (a *AWSEnvironment) SetConfigFrom(_ runner.ExecutionEnvironment) {
|
|
panic("not supported")
|
|
}
|
|
|
|
func (a *AWSEnvironment) Register() error {
|
|
panic("not supported")
|
|
}
|
|
|
|
func (a *AWSEnvironment) AddRunner(_ runner.Runner) {
|
|
panic("not supported")
|
|
}
|
|
|
|
func (a *AWSEnvironment) DeleteRunner(_ string) (ok bool) {
|
|
panic("not supported")
|
|
}
|