diff --git a/cmd/poseidon/main.go b/cmd/poseidon/main.go index 75ee82e..60ecc9f 100644 --- a/cmd/poseidon/main.go +++ b/cmd/poseidon/main.go @@ -169,8 +169,9 @@ func createNomadManager(ctx context.Context) ( return runnerManager, environmentManager } -func createAWSManager(_ context.Context) (runnerManager runner.Manager, environmentManager environment.ManagerHandler) { - runnerManager = runner.NewAWSRunnerManager() +func createAWSManager(ctx context.Context) ( + runnerManager runner.Manager, environmentManager environment.ManagerHandler) { + runnerManager = runner.NewAWSRunnerManager(ctx) return runnerManager, environment.NewAWSEnvironmentManager(runnerManager) } diff --git a/cmd/poseidon/main_test.go b/cmd/poseidon/main_test.go index c7acf3f..4c2a604 100644 --- a/cmd/poseidon/main_test.go +++ b/cmd/poseidon/main_test.go @@ -17,7 +17,7 @@ func TestAWSDisabledUsesNomadManager(t *testing.T) { cancel() runnerManager, environmentManager := createManagerHandler(createNomadManager, true, - runner.NewAbstractManager(), &environment.AbstractManager{}, disableRecovery) + runner.NewAbstractManager(disableRecovery), &environment.AbstractManager{}, disableRecovery) awsRunnerManager, awsEnvironmentManager := createManagerHandler(createAWSManager, false, runnerManager, environmentManager, disableRecovery) assert.Equal(t, runnerManager, awsRunnerManager) @@ -29,7 +29,7 @@ func TestAWSEnabledWrappesNomadManager(t *testing.T) { cancel() runnerManager, environmentManager := createManagerHandler(createNomadManager, true, - runner.NewAbstractManager(), &environment.AbstractManager{}, disableRecovery) + runner.NewAbstractManager(disableRecovery), &environment.AbstractManager{}, disableRecovery) awsRunnerManager, awsEnvironmentManager := createManagerHandler(createAWSManager, true, runnerManager, environmentManager, disableRecovery) assert.NotEqual(t, runnerManager, awsRunnerManager) diff --git a/internal/environment/aws_manager_test.go b/internal/environment/aws_manager_test.go index 2bc7c95..26b789d 100644 --- a/internal/environment/aws_manager_test.go +++ b/internal/environment/aws_manager_test.go @@ -13,7 +13,9 @@ import ( ) func TestAWSEnvironmentManager_CreateOrUpdate(t *testing.T) { - runnerManager := runner.NewAWSRunnerManager() + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + runnerManager := runner.NewAWSRunnerManager(ctx) m := NewAWSEnvironmentManager(runnerManager) uniqueImage := "java11Exec" @@ -45,7 +47,9 @@ func TestAWSEnvironmentManager_CreateOrUpdate(t *testing.T) { } func TestAWSEnvironmentManager_Get(t *testing.T) { - runnerManager := runner.NewAWSRunnerManager() + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + runnerManager := runner.NewAWSRunnerManager(ctx) m := NewAWSEnvironmentManager(runnerManager) t.Run("Calls next handler when not found", func(t *testing.T) { @@ -79,7 +83,9 @@ func TestAWSEnvironmentManager_Get(t *testing.T) { } func TestAWSEnvironmentManager_List(t *testing.T) { - runnerManager := runner.NewAWSRunnerManager() + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + runnerManager := runner.NewAWSRunnerManager(ctx) m := NewAWSEnvironmentManager(runnerManager) t.Run("also returns environments of the rest of the manager chain", func(t *testing.T) { diff --git a/internal/runner/abstract_manager.go b/internal/runner/abstract_manager.go index cae4dd0..236f69d 100644 --- a/internal/runner/abstract_manager.go +++ b/internal/runner/abstract_manager.go @@ -24,12 +24,12 @@ type AbstractManager struct { // NewAbstractManager creates a new abstract runner manager that keeps track of all runners of one kind. // Since this manager is currently directly bound to the lifespan of Poseidon, it does not need a context cancel. -func NewAbstractManager() *AbstractManager { +func NewAbstractManager(ctx context.Context) *AbstractManager { return &AbstractManager{ environments: storage.NewMonitoredLocalStorage[ExecutionEnvironment]( - monitoring.MeasurementEnvironments, monitorEnvironmentData, 0, context.Background()), + monitoring.MeasurementEnvironments, monitorEnvironmentData, 0, ctx), usedRunners: storage.NewMonitoredLocalStorage[Runner]( - monitoring.MeasurementUsedRunner, MonitorRunnersEnvironmentID, time.Hour, context.Background()), + monitoring.MeasurementUsedRunner, MonitorRunnersEnvironmentID, time.Hour, ctx), } } @@ -55,7 +55,9 @@ func (n *AbstractManager) NextHandler() AccessorHandler { if n.HasNextHandler() { return n.nextHandler } else { - return NewAbstractManager() + ctx, cancel := context.WithCancel(context.Background()) + cancel() + return NewAbstractManager(ctx) } } diff --git a/internal/runner/aws_manager.go b/internal/runner/aws_manager.go index d3a250d..500211b 100644 --- a/internal/runner/aws_manager.go +++ b/internal/runner/aws_manager.go @@ -1,6 +1,7 @@ package runner import ( + "context" "fmt" "github.com/openHPI/poseidon/pkg/dto" "time" @@ -11,8 +12,8 @@ type AWSRunnerManager struct { } // NewAWSRunnerManager creates a new runner manager that keeps track of all runners at AWS. -func NewAWSRunnerManager() *AWSRunnerManager { - return &AWSRunnerManager{NewAbstractManager()} +func NewAWSRunnerManager(ctx context.Context) *AWSRunnerManager { + return &AWSRunnerManager{NewAbstractManager(ctx)} } func (a AWSRunnerManager) Claim(id dto.EnvironmentID, duration int) (Runner, error) { diff --git a/internal/runner/aws_manager_test.go b/internal/runner/aws_manager_test.go index 389a94e..caf5e27 100644 --- a/internal/runner/aws_manager_test.go +++ b/internal/runner/aws_manager_test.go @@ -1,6 +1,7 @@ package runner import ( + "context" "github.com/openHPI/poseidon/pkg/dto" "github.com/openHPI/poseidon/tests" "github.com/stretchr/testify/assert" @@ -9,7 +10,9 @@ import ( ) func TestAWSRunnerManager_EnvironmentAccessor(t *testing.T) { - m := NewAWSRunnerManager() + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + m := NewAWSRunnerManager(ctx) environments := m.ListEnvironments() assert.Empty(t, environments) @@ -30,7 +33,9 @@ func TestAWSRunnerManager_EnvironmentAccessor(t *testing.T) { } func TestAWSRunnerManager_Claim(t *testing.T) { - m := NewAWSRunnerManager() + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + m := NewAWSRunnerManager(ctx) environment := createBasicEnvironmentMock(defaultEnvironmentID) r, err := NewAWSFunctionWorkload(environment, nil) assert.NoError(t, err) @@ -56,7 +61,9 @@ func TestAWSRunnerManager_Claim(t *testing.T) { } func TestAWSRunnerManager_Return(t *testing.T) { - m := NewAWSRunnerManager() + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + m := NewAWSRunnerManager(ctx) environment := createBasicEnvironmentMock(defaultEnvironmentID) m.StoreEnvironment(environment) r, err := NewAWSFunctionWorkload(environment, nil) diff --git a/internal/runner/nomad_manager.go b/internal/runner/nomad_manager.go index bfdd5ac..4e61602 100644 --- a/internal/runner/nomad_manager.go +++ b/internal/runner/nomad_manager.go @@ -32,7 +32,7 @@ type NomadRunnerManager struct { // It uses the apiClient for all requests and runs a background task to keep the runners in sync with Nomad. // If you cancel the context the background synchronization will be stopped. func NewNomadRunnerManager(apiClient nomad.ExecutorAPI, ctx context.Context) *NomadRunnerManager { - m := &NomadRunnerManager{NewAbstractManager(), apiClient} + m := &NomadRunnerManager{NewAbstractManager(ctx), apiClient} go m.keepRunnersSynced(ctx) return m }