diff --git a/internal/framework/runnables/runnables.go b/internal/framework/runnables/runnables.go index d960475008..8304c326c0 100644 --- a/internal/framework/runnables/runnables.go +++ b/internal/framework/runnables/runnables.go @@ -34,29 +34,34 @@ func (r *LeaderOrNonLeader) NeedLeaderElection() bool { return false } -// EnableAfterBecameLeader is a Runnable that will call the enable function when the current instance becomes +// CallFunctionsAfterBecameLeader is a Runnable that will call the given functions when the current instance becomes // the leader. -type EnableAfterBecameLeader struct { - enable func(context.Context) +type CallFunctionsAfterBecameLeader struct { + enableFunctions []func(context.Context) } var ( - _ manager.LeaderElectionRunnable = &EnableAfterBecameLeader{} - _ manager.Runnable = &EnableAfterBecameLeader{} + _ manager.LeaderElectionRunnable = &CallFunctionsAfterBecameLeader{} + _ manager.Runnable = &CallFunctionsAfterBecameLeader{} ) -// NewEnableAfterBecameLeader creates a new EnableAfterBecameLeader Runnable. -func NewEnableAfterBecameLeader(enable func(context.Context)) *EnableAfterBecameLeader { - return &EnableAfterBecameLeader{ - enable: enable, +// NewCallFunctionsAfterBecameLeader creates a new CallFunctionsAfterBecameLeader Runnable. +func NewCallFunctionsAfterBecameLeader( + enableFunctions []func(context.Context), +) *CallFunctionsAfterBecameLeader { + return &CallFunctionsAfterBecameLeader{ + enableFunctions: enableFunctions, } } -func (j *EnableAfterBecameLeader) Start(ctx context.Context) error { - j.enable(ctx) +func (j *CallFunctionsAfterBecameLeader) Start(ctx context.Context) error { + for _, f := range j.enableFunctions { + f(ctx) + } + return nil } -func (j *EnableAfterBecameLeader) NeedLeaderElection() bool { +func (j *CallFunctionsAfterBecameLeader) NeedLeaderElection() bool { return true } diff --git a/internal/framework/runnables/runnables_test.go b/internal/framework/runnables/runnables_test.go index 9f34d9ccba..6da01a0236 100644 --- a/internal/framework/runnables/runnables_test.go +++ b/internal/framework/runnables/runnables_test.go @@ -23,19 +23,22 @@ func TestLeaderOrNonLeader(t *testing.T) { g.Expect(leaderOrNonLeader.NeedLeaderElection()).To(BeFalse()) } -func TestEnableAfterBecameLeader(t *testing.T) { +func TestCallFunctionsAfterBecameLeader(t *testing.T) { t.Parallel() - enabled := false - enableAfterBecameLeader := NewEnableAfterBecameLeader(func(_ context.Context) { - enabled = true + statusUpdaterEnabled := false + provisionerEnabled := false + + callFunctionsAfterBecameLeader := NewCallFunctionsAfterBecameLeader([]func(ctx context.Context){ + func(_ context.Context) { statusUpdaterEnabled = true }, + func(_ context.Context) { provisionerEnabled = true }, }) g := NewWithT(t) - g.Expect(enableAfterBecameLeader.NeedLeaderElection()).To(BeTrue()) - g.Expect(enabled).To(BeFalse()) + g.Expect(callFunctionsAfterBecameLeader.NeedLeaderElection()).To(BeTrue()) - err := enableAfterBecameLeader.Start(context.Background()) + err := callFunctionsAfterBecameLeader.Start(context.Background()) g.Expect(err).ToNot(HaveOccurred()) - g.Expect(enabled).To(BeTrue()) + g.Expect(statusUpdaterEnabled).To(BeTrue()) + g.Expect(provisionerEnabled).To(BeTrue()) } diff --git a/internal/mode/static/manager.go b/internal/mode/static/manager.go index c99752a825..5eb31b3462 100644 --- a/internal/mode/static/manager.go +++ b/internal/mode/static/manager.go @@ -262,6 +262,13 @@ func StartManager(cfg config.Config) error { return fmt.Errorf("cannot register event loop: %w", err) } + if err = mgr.Add(runnables.NewCallFunctionsAfterBecameLeader([]func(context.Context){ + groupStatusUpdater.Enable, + nginxProvisioner.Enable, + })); err != nil { + return fmt.Errorf("cannot register functions that get called after Pod becomes leader: %w", err) + } + if cfg.ProductTelemetryConfig.Enabled { dataCollector := telemetry.NewDataCollectorImpl(telemetry.DataCollectorConfig{ K8sClientReader: mgr.GetAPIReader(),