From bd0f75c3ecfd2e9978cce7eee8fb64f38ed1a418 Mon Sep 17 00:00:00 2001 From: Nikola Jokic Date: Wed, 9 Sep 2026 15:29:21 +0200 Subject: [PATCH] Wire APIReader into the hand-built EphemeralRunnerSet reconcilers in tests Six specs construct an EphemeralRunnerSetReconciler literal and call Reconcile directly instead of going through SetupWithManager, so the APIReader backfill never runs and the field stays nil. Nothing is broken today: those specs either publish patch ID 0 or return via the stale-outdated path, so they never reach the scale-up branch where the reader is consulted. But the next direct-Reconcile spec that exercises scale-up with a non-zero patch ID would fail with "APIReader is not configured" instead of the behaviour it meant to test, and the cause would not be obvious from the failure. Set the field the way SetupWithManager does in production, so the specs exercise the same wiring the real controller has. The helper still errors on a nil reader; falling back to the cached read is the race that fix exists to prevent. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> --- .../ephemeralrunnerset_controller_test.go | 42 +++++++++++-------- 1 file changed, 24 insertions(+), 18 deletions(-) diff --git a/controllers/actions.github.com/ephemeralrunnerset_controller_test.go b/controllers/actions.github.com/ephemeralrunnerset_controller_test.go index 9e664925..2fc4da1f 100644 --- a/controllers/actions.github.com/ephemeralrunnerset_controller_test.go +++ b/controllers/actions.github.com/ephemeralrunnerset_controller_test.go @@ -2330,9 +2330,10 @@ var _ = Describe("Test EphemeralRunnerSet actionable revision cleanup", func() { It("does not clean up runners on initial creation without an actionable revision", func() { controller := &EphemeralRunnerSetReconciler{ - Client: mgr.GetClient(), - Scheme: mgr.GetScheme(), - Log: logf.Log, + Client: mgr.GetClient(), + APIReader: mgr.GetAPIReader(), + Scheme: mgr.GetScheme(), + Log: logf.Log, ResourceBuilder: ResourceBuilder{ ResourceCache: newTestResourceCache(), SecretResolver: secretresolver.New(mgr.GetClient(), fake.NewMultiClient( @@ -2383,9 +2384,10 @@ var _ = Describe("Test EphemeralRunnerSet actionable revision cleanup", func() { It("deletes runner-a-idle, keeps runner-b-busy, and advances applied actionable revision 3 to 4", func() { controller := &EphemeralRunnerSetReconciler{ - Client: mgr.GetClient(), - Scheme: mgr.GetScheme(), - Log: logf.Log, + Client: mgr.GetClient(), + APIReader: mgr.GetAPIReader(), + Scheme: mgr.GetScheme(), + Log: logf.Log, ResourceBuilder: ResourceBuilder{ ResourceCache: newTestResourceCache(), SecretResolver: secretresolver.New(mgr.GetClient(), fake.NewMultiClient( @@ -2495,9 +2497,10 @@ var _ = Describe("Test EphemeralRunnerSet actionable revision cleanup", func() { It("keeps applied actionable revision at 3 when cleanup fails", func() { controller := &EphemeralRunnerSetReconciler{ - Client: mgr.GetClient(), - Scheme: mgr.GetScheme(), - Log: logf.Log, + Client: mgr.GetClient(), + APIReader: mgr.GetAPIReader(), + Scheme: mgr.GetScheme(), + Log: logf.Log, ResourceBuilder: ResourceBuilder{ ResourceCache: newTestResourceCache(), SecretResolver: secretresolver.New(mgr.GetClient(), fake.NewMultiClient( @@ -2573,9 +2576,10 @@ var _ = Describe("Test EphemeralRunnerSet actionable revision cleanup", func() { It("deletes unregistered pending runner during actionable revision cleanup after restart with no cache", func() { controller := &EphemeralRunnerSetReconciler{ - Client: mgr.GetClient(), - Scheme: mgr.GetScheme(), - Log: logf.Log, + Client: mgr.GetClient(), + APIReader: mgr.GetAPIReader(), + Scheme: mgr.GetScheme(), + Log: logf.Log, ResourceBuilder: ResourceBuilder{ ResourceCache: newTestResourceCache(), // fresh empty cache simulating restart SecretResolver: secretresolver.New(mgr.GetClient(), fake.NewMultiClient()), @@ -2652,9 +2656,10 @@ var _ = Describe("Test EphemeralRunnerSet actionable revision cleanup", func() { It("preserves AppliedActionableRevision during status-only phase updates", func() { controller := &EphemeralRunnerSetReconciler{ - Client: mgr.GetClient(), - Scheme: mgr.GetScheme(), - Log: logf.Log, + Client: mgr.GetClient(), + APIReader: mgr.GetAPIReader(), + Scheme: mgr.GetScheme(), + Log: logf.Log, ResourceBuilder: ResourceBuilder{ ResourceCache: newTestResourceCache(), SecretResolver: secretresolver.New(mgr.GetClient(), fake.NewMultiClient( @@ -2770,9 +2775,10 @@ var _ = Describe("Test EphemeralRunnerSet actionable revision cleanup", func() { // built from the current spec. It("replaces outdated runners from a superseded revision instead of going Outdated", func() { controller := &EphemeralRunnerSetReconciler{ - Client: mgr.GetClient(), - Scheme: mgr.GetScheme(), - Log: logf.Log, + Client: mgr.GetClient(), + APIReader: mgr.GetAPIReader(), + Scheme: mgr.GetScheme(), + Log: logf.Log, ResourceBuilder: ResourceBuilder{ ResourceCache: newTestResourceCache(), SecretResolver: secretresolver.New(mgr.GetClient(), fake.NewMultiClient(