diff --git a/.github/workflows/gha-e2e-tests.yaml b/.github/workflows/gha-e2e-tests.yaml index 93879063..0e8b244e 100644 --- a/.github/workflows/gha-e2e-tests.yaml +++ b/.github/workflows/gha-e2e-tests.yaml @@ -16,7 +16,7 @@ env: TARGET_ORG: actions-runner-controller TARGET_REPO: arc_e2e_test_dummy IMAGE_NAME: "arc-test-image" - IMAGE_VERSION: "0.9.1" + IMAGE_VERSION: "0.9.2" concurrency: # This will make sure we only apply the concurrency limits on pull requests diff --git a/.golangci.yaml b/.golangci.yaml index 35520223..eca46937 100644 --- a/.golangci.yaml +++ b/.golangci.yaml @@ -1,7 +1,9 @@ run: timeout: 3m output: - format: github-actions + formats: + - format: github-actions + path: stdout linters-settings: errcheck: exclude-functions: diff --git a/Makefile b/Makefile index 6cc0ac59..5f1302af 100644 --- a/Makefile +++ b/Makefile @@ -6,7 +6,7 @@ endif DOCKER_USER ?= $(shell echo ${DOCKER_IMAGE_NAME} | cut -d / -f1) VERSION ?= dev COMMIT_SHA = $(shell git rev-parse HEAD) -RUNNER_VERSION ?= 2.315.0 +RUNNER_VERSION ?= 2.316.1 TARGETPLATFORM ?= $(shell arch) RUNNER_NAME ?= ${DOCKER_USER}/actions-runner RUNNER_TAG ?= ${VERSION} @@ -68,7 +68,7 @@ endif all: manager lint: - docker run --rm -v $(PWD):/app -w /app golangci/golangci-lint:v1.55.2 golangci-lint run + docker run --rm -v $(PWD):/app -w /app golangci/golangci-lint:v1.57.2 golangci-lint run GO_TEST_ARGS ?= -short diff --git a/charts/gha-runner-scale-set-controller/Chart.yaml b/charts/gha-runner-scale-set-controller/Chart.yaml index e1aec2ca..d3b1ded4 100644 --- a/charts/gha-runner-scale-set-controller/Chart.yaml +++ b/charts/gha-runner-scale-set-controller/Chart.yaml @@ -15,13 +15,13 @@ type: application # This is the chart version. This version number should be incremented each time you make changes # to the chart and its templates, including the app version. # Versions are expected to follow Semantic Versioning (https://semver.org/) -version: 0.9.1 +version: 0.9.2 # This is the version number of the application being deployed. This version number should be # incremented each time you make changes to the application. Versions are not expected to # follow Semantic Versioning. They should reflect the version the application is using. # It is recommended to use it with quotes. -appVersion: "0.9.1" +appVersion: "0.9.2" home: https://github.com/actions/actions-runner-controller diff --git a/charts/gha-runner-scale-set-controller/templates/_helpers.tpl b/charts/gha-runner-scale-set-controller/templates/_helpers.tpl index b4adbd00..075d21ae 100644 --- a/charts/gha-runner-scale-set-controller/templates/_helpers.tpl +++ b/charts/gha-runner-scale-set-controller/templates/_helpers.tpl @@ -126,7 +126,3 @@ Create the name of the service account to use {{- end }} {{- $names | join ","}} {{- end }} - -{{- define "gha-runner-scale-set-controller.serviceMonitorName" -}} -{{- include "gha-runner-scale-set-controller.fullname" . }}-service-monitor -{{- end }} diff --git a/charts/gha-runner-scale-set/Chart.yaml b/charts/gha-runner-scale-set/Chart.yaml index 934d41c1..52514a01 100644 --- a/charts/gha-runner-scale-set/Chart.yaml +++ b/charts/gha-runner-scale-set/Chart.yaml @@ -15,13 +15,13 @@ type: application # This is the chart version. This version number should be incremented each time you make changes # to the chart and its templates, including the app version. # Versions are expected to follow Semantic Versioning (https://semver.org/) -version: 0.9.1 +version: 0.9.2 # This is the version number of the application being deployed. This version number should be # incremented each time you make changes to the application. Versions are not expected to # follow Semantic Versioning. They should reflect the version the application is using. # It is recommended to use it with quotes. -appVersion: "0.9.1" +appVersion: "0.9.2" home: https://github.com/actions/actions-runner-controller diff --git a/cmd/ghalistener/listener/listener.go b/cmd/ghalistener/listener/listener.go index 79009726..a9cf0838 100644 --- a/cmd/ghalistener/listener/listener.go +++ b/cmd/ghalistener/listener/listener.go @@ -295,8 +295,23 @@ func (l *Listener) getMessage(ctx context.Context) (*actions.RunnerScaleSetMessa func (l *Listener) deleteLastMessage(ctx context.Context) error { l.logger.Info("Deleting last message", "lastMessageID", l.lastMessageID) - if err := l.client.DeleteMessage(ctx, l.session.MessageQueueUrl, l.session.MessageQueueAccessToken, l.lastMessageID); err != nil { - return fmt.Errorf("failed to delete message: %w", err) + err := l.client.DeleteMessage(ctx, l.session.MessageQueueUrl, l.session.MessageQueueAccessToken, l.lastMessageID) + if err == nil { // if NO error + return nil + } + + expiredError := &actions.MessageQueueTokenExpiredError{} + if !errors.As(err, &expiredError) { + return fmt.Errorf("failed to delete last message: %w", err) + } + + if err := l.refreshSession(ctx); err != nil { + return err + } + + err = l.client.DeleteMessage(ctx, l.session.MessageQueueUrl, l.session.MessageQueueAccessToken, l.lastMessageID) + if err != nil { + return fmt.Errorf("failed to delete last message after message session refresh: %w", err) } return nil diff --git a/cmd/ghalistener/listener/listener_test.go b/cmd/ghalistener/listener/listener_test.go index d2af2b03..38c1f40f 100644 --- a/cmd/ghalistener/listener/listener_test.go +++ b/cmd/ghalistener/listener/listener_test.go @@ -377,6 +377,93 @@ func TestListener_deleteLastMessage(t *testing.T) { err = l.deleteLastMessage(ctx) assert.NotNil(t, err) }) + + t.Run("RefreshAndSucceeds", func(t *testing.T) { + t.Parallel() + + ctx := context.Background() + config := Config{ + ScaleSetID: 1, + Metrics: metrics.Discard, + } + + client := listenermocks.NewClient(t) + + newUUID := uuid.New() + session := &actions.RunnerScaleSetSession{ + SessionId: &newUUID, + OwnerName: "example", + RunnerScaleSet: &actions.RunnerScaleSet{}, + MessageQueueUrl: "https://example.com", + MessageQueueAccessToken: "1234567890", + Statistics: nil, + } + client.On("RefreshMessageSession", ctx, mock.Anything, mock.Anything).Return(session, nil).Once() + + client.On("DeleteMessage", ctx, mock.Anything, mock.Anything, mock.Anything).Return(&actions.MessageQueueTokenExpiredError{}).Once() + + client.On("DeleteMessage", ctx, mock.Anything, mock.Anything, mock.MatchedBy(func(lastMessageID any) bool { + return lastMessageID.(int64) == int64(5) + })).Return(nil).Once() + config.Client = client + + l, err := New(config) + require.Nil(t, err) + + oldUUID := uuid.New() + l.session = &actions.RunnerScaleSetSession{ + SessionId: &oldUUID, + RunnerScaleSet: &actions.RunnerScaleSet{}, + } + l.lastMessageID = 5 + + config.Client = client + + err = l.deleteLastMessage(ctx) + assert.NoError(t, err) + }) + + t.Run("RefreshAndFails", func(t *testing.T) { + t.Parallel() + + ctx := context.Background() + config := Config{ + ScaleSetID: 1, + Metrics: metrics.Discard, + } + + client := listenermocks.NewClient(t) + + newUUID := uuid.New() + session := &actions.RunnerScaleSetSession{ + SessionId: &newUUID, + OwnerName: "example", + RunnerScaleSet: &actions.RunnerScaleSet{}, + MessageQueueUrl: "https://example.com", + MessageQueueAccessToken: "1234567890", + Statistics: nil, + } + client.On("RefreshMessageSession", ctx, mock.Anything, mock.Anything).Return(session, nil).Once() + + client.On("DeleteMessage", ctx, mock.Anything, mock.Anything, mock.Anything).Return(&actions.MessageQueueTokenExpiredError{}).Twice() + + config.Client = client + + l, err := New(config) + require.Nil(t, err) + + oldUUID := uuid.New() + l.session = &actions.RunnerScaleSetSession{ + SessionId: &oldUUID, + RunnerScaleSet: &actions.RunnerScaleSet{}, + } + l.lastMessageID = 5 + + config.Client = client + + err = l.deleteLastMessage(ctx) + assert.Error(t, err) + }) } func TestListener_Listen(t *testing.T) { diff --git a/cmd/ghalistener/worker/worker.go b/cmd/ghalistener/worker/worker.go index 25fb90e1..9d6266bf 100644 --- a/cmd/ghalistener/worker/worker.go +++ b/cmd/ghalistener/worker/worker.go @@ -38,20 +38,20 @@ type Config struct { // The Worker's role is to process the messages it receives from the listener. // It then initiates Kubernetes API requests to carry out the necessary actions. type Worker struct { - clientset *kubernetes.Clientset - config Config - lastPatch int - lastPatchID int - logger *logr.Logger + clientset *kubernetes.Clientset + config Config + lastPatch int + patchSeq int + logger *logr.Logger } var _ listener.Handler = (*Worker)(nil) func New(config Config, options ...Option) (*Worker, error) { w := &Worker{ - config: config, - lastPatch: -1, - lastPatchID: -1, + config: config, + lastPatch: -1, + patchSeq: -1, } conf, err := rest.InClusterConfig() @@ -163,27 +163,8 @@ func (w *Worker) HandleJobStarted(ctx context.Context, jobInfo *actions.JobStart // The function then scales the ephemeral runner set by applying the merge patch. // Finally, it logs the scaled ephemeral runner set details and returns nil if successful. // If any error occurs during the process, it returns an error with a descriptive message. -func (w *Worker) HandleDesiredRunnerCount(ctx context.Context, count int, jobsCompleted int) (int, error) { - // Max runners should always be set by the resource builder either to the configured value, - // or the maximum int32 (resourcebuilder.newAutoScalingListener()). - targetRunnerCount := min(w.config.MinRunners+count, w.config.MaxRunners) - - logValues := []any{ - "assigned job", count, - "decision", targetRunnerCount, - "min", w.config.MinRunners, - "max", w.config.MaxRunners, - "currentRunnerCount", w.lastPatch, - "jobsCompleted", jobsCompleted, - } - - if count == 0 && jobsCompleted == 0 { - w.lastPatchID = 0 - } else { - w.lastPatchID++ - } - - w.lastPatch = targetRunnerCount +func (w *Worker) HandleDesiredRunnerCount(ctx context.Context, count, jobsCompleted int) (int, error) { + patchID := w.setDesiredWorkerState(count, jobsCompleted) original, err := json.Marshal( &v1alpha1.EphemeralRunnerSet{ @@ -200,8 +181,8 @@ func (w *Worker) HandleDesiredRunnerCount(ctx context.Context, count int, jobsCo patch, err := json.Marshal( &v1alpha1.EphemeralRunnerSet{ Spec: v1alpha1.EphemeralRunnerSetSpec{ - Replicas: targetRunnerCount, - PatchID: w.lastPatchID, + Replicas: w.lastPatch, + PatchID: patchID, }, }, ) @@ -210,14 +191,13 @@ func (w *Worker) HandleDesiredRunnerCount(ctx context.Context, count int, jobsCo return 0, err } + w.logger.Info("Compare", "original", string(original), "patch", string(patch)) mergePatch, err := jsonpatch.CreateMergePatch(original, patch) if err != nil { return 0, fmt.Errorf("failed to create merge patch json for ephemeral runner set: %w", err) } - w.logger.Info("Created merge patch json for EphemeralRunnerSet update", "json", string(mergePatch)) - - w.logger.Info("Scaling ephemeral runner set", logValues...) + w.logger.Info("Preparing EphemeralRunnerSet update", "json", string(mergePatch)) patchedEphemeralRunnerSet := &v1alpha1.EphemeralRunnerSet{} err = w.clientset.RESTClient(). @@ -238,5 +218,40 @@ func (w *Worker) HandleDesiredRunnerCount(ctx context.Context, count int, jobsCo "name", w.config.EphemeralRunnerSetName, "replicas", patchedEphemeralRunnerSet.Spec.Replicas, ) - return targetRunnerCount, nil + return w.lastPatch, nil +} + +// calculateDesiredState calculates the desired state of the worker based on the desired count and the the number of jobs completed. +func (w *Worker) setDesiredWorkerState(count, jobsCompleted int) int { + // Max runners should always be set by the resource builder either to the configured value, + // or the maximum int32 (resourcebuilder.newAutoScalingListener()). + targetRunnerCount := min(w.config.MinRunners+count, w.config.MaxRunners) + w.patchSeq++ + desiredPatchID := w.patchSeq + + if count == 0 && jobsCompleted == 0 { // empty batch + targetRunnerCount = max(w.lastPatch, targetRunnerCount) + if targetRunnerCount == w.config.MinRunners { + // We have an empty batch, and the last patch was the min runners. + // Since this is an empty batch, and we are at the min runners, they should all be idle. + // If controller created few more pods on accident (during scale down events), + // this situation allows the controller to scale down to the min runners. + // However, it is important to keep the patch sequence increasing so we don't ignore one batch. + desiredPatchID = 0 + } + } + + w.lastPatch = targetRunnerCount + + w.logger.Info( + "Calculated target runner count", + "assigned job", count, + "decision", targetRunnerCount, + "min", w.config.MinRunners, + "max", w.config.MaxRunners, + "currentRunnerCount", w.lastPatch, + "jobsCompleted", jobsCompleted, + ) + + return desiredPatchID } diff --git a/cmd/ghalistener/worker/worker_test.go b/cmd/ghalistener/worker/worker_test.go new file mode 100644 index 00000000..d009bccf --- /dev/null +++ b/cmd/ghalistener/worker/worker_test.go @@ -0,0 +1,326 @@ +package worker + +import ( + "math" + "testing" + + "github.com/go-logr/logr" + "github.com/stretchr/testify/assert" +) + +func TestSetDesiredWorkerState_MinMaxDefaults(t *testing.T) { + logger := logr.Discard() + newEmptyWorker := func() *Worker { + return &Worker{ + config: Config{ + MinRunners: 0, + MaxRunners: math.MaxInt32, + }, + lastPatch: -1, + patchSeq: -1, + logger: &logger, + } + } + + t.Run("init calculate with acquired 0", func(t *testing.T) { + w := newEmptyWorker() + patchID := w.setDesiredWorkerState(0, 0) + assert.Equal(t, 0, w.lastPatch) + assert.Equal(t, 0, w.patchSeq) + assert.Equal(t, 0, patchID) + }) + + t.Run("init calculate with acquired 1", func(t *testing.T) { + w := newEmptyWorker() + patchID := w.setDesiredWorkerState(1, 0) + assert.Equal(t, 1, w.lastPatch) + assert.Equal(t, 0, w.patchSeq) + assert.Equal(t, 0, patchID) + }) + + t.Run("increment patch when job done", func(t *testing.T) { + w := newEmptyWorker() + patchID := w.setDesiredWorkerState(1, 0) + assert.Equal(t, 0, patchID) + patchID = w.setDesiredWorkerState(0, 1) + assert.Equal(t, 1, patchID) + assert.Equal(t, 0, w.lastPatch) + assert.Equal(t, 1, w.patchSeq) + }) + + t.Run("increment patch when called with same parameters", func(t *testing.T) { + w := newEmptyWorker() + patchID := w.setDesiredWorkerState(1, 0) + assert.Equal(t, 0, patchID) + patchID = w.setDesiredWorkerState(1, 0) + assert.Equal(t, 1, patchID) + assert.Equal(t, 1, w.lastPatch) + assert.Equal(t, 1, w.patchSeq) + }) + + t.Run("calculate desired scale when acquired > 0 and completed > 0", func(t *testing.T) { + w := newEmptyWorker() + patchID := w.setDesiredWorkerState(1, 1) + assert.Equal(t, 0, patchID) + assert.Equal(t, 1, w.lastPatch) + assert.Equal(t, 0, w.patchSeq) + }) + + t.Run("re-use the last state when acquired == 0 and completed == 0", func(t *testing.T) { + w := newEmptyWorker() + patchID := w.setDesiredWorkerState(1, 0) + assert.Equal(t, 0, patchID) + patchID = w.setDesiredWorkerState(0, 0) + assert.Equal(t, 1, patchID) + assert.Equal(t, 1, w.lastPatch) + assert.Equal(t, 1, w.patchSeq) + }) + + t.Run("adjust when acquired == 0 and completed == 1", func(t *testing.T) { + w := newEmptyWorker() + patchID := w.setDesiredWorkerState(1, 1) + assert.Equal(t, 0, patchID) + patchID = w.setDesiredWorkerState(0, 1) + assert.Equal(t, 1, patchID) + assert.Equal(t, 0, w.lastPatch) + assert.Equal(t, 1, w.patchSeq) + }) +} + +func TestSetDesiredWorkerState_MinSet(t *testing.T) { + logger := logr.Discard() + newEmptyWorker := func() *Worker { + return &Worker{ + config: Config{ + MinRunners: 1, + MaxRunners: math.MaxInt32, + }, + lastPatch: -1, + patchSeq: -1, + logger: &logger, + } + } + + t.Run("initial scale when acquired == 0 and completed == 0", func(t *testing.T) { + w := newEmptyWorker() + patchID := w.setDesiredWorkerState(0, 0) + assert.Equal(t, 0, patchID) + assert.Equal(t, 1, w.lastPatch) + assert.Equal(t, 0, w.patchSeq) + }) + + t.Run("re-use the old state on count == 0 and completed == 0", func(t *testing.T) { + w := newEmptyWorker() + patchID := w.setDesiredWorkerState(2, 0) + assert.Equal(t, 0, patchID) + patchID = w.setDesiredWorkerState(0, 0) + assert.Equal(t, 1, patchID) + assert.Equal(t, 3, w.lastPatch) + assert.Equal(t, 1, w.patchSeq) + }) + + t.Run("request back to 0 on job done", func(t *testing.T) { + w := newEmptyWorker() + patchID := w.setDesiredWorkerState(2, 0) + assert.Equal(t, 0, patchID) + patchID = w.setDesiredWorkerState(0, 1) + assert.Equal(t, 1, patchID) + assert.Equal(t, 1, w.lastPatch) + assert.Equal(t, 1, w.patchSeq) + }) + + t.Run("desired patch is 0 but sequence continues on empty batch and min runners", func(t *testing.T) { + w := newEmptyWorker() + patchID := w.setDesiredWorkerState(3, 0) + assert.Equal(t, 0, patchID) + assert.Equal(t, 4, w.lastPatch) + assert.Equal(t, 0, w.patchSeq) + + patchID = w.setDesiredWorkerState(0, 3) + assert.Equal(t, 1, patchID) + assert.Equal(t, 1, w.lastPatch) + assert.Equal(t, 1, w.patchSeq) + + // Empty batch on min runners + patchID = w.setDesiredWorkerState(0, 0) + assert.Equal(t, 0, patchID) // forcing the state + assert.Equal(t, 1, w.lastPatch) + assert.Equal(t, 2, w.patchSeq) + }) + +} + +func TestSetDesiredWorkerState_MaxSet(t *testing.T) { + logger := logr.Discard() + newEmptyWorker := func() *Worker { + return &Worker{ + config: Config{ + MinRunners: 0, + MaxRunners: 5, + }, + lastPatch: -1, + patchSeq: -1, + logger: &logger, + } + } + + t.Run("initial scale when acquired == 0 and completed == 0", func(t *testing.T) { + w := newEmptyWorker() + patchID := w.setDesiredWorkerState(0, 0) + assert.Equal(t, 0, patchID) + assert.Equal(t, 0, w.lastPatch) + assert.Equal(t, 0, w.patchSeq) + }) + + t.Run("re-use the old state on count == 0 and completed == 0", func(t *testing.T) { + w := newEmptyWorker() + patchID := w.setDesiredWorkerState(2, 0) + assert.Equal(t, 0, patchID) + patchID = w.setDesiredWorkerState(0, 0) + assert.Equal(t, 1, patchID) + assert.Equal(t, 2, w.lastPatch) + assert.Equal(t, 1, w.patchSeq) + }) + + t.Run("request back to 0 on job done", func(t *testing.T) { + w := newEmptyWorker() + patchID := w.setDesiredWorkerState(2, 0) + assert.Equal(t, 0, patchID) + patchID = w.setDesiredWorkerState(0, 1) + assert.Equal(t, 1, patchID) + assert.Equal(t, 0, w.lastPatch) + assert.Equal(t, 1, w.patchSeq) + }) + + t.Run("scale up to max when count > max", func(t *testing.T) { + w := newEmptyWorker() + patchID := w.setDesiredWorkerState(6, 0) + assert.Equal(t, 0, patchID) + assert.Equal(t, 5, w.lastPatch) + assert.Equal(t, 0, w.patchSeq) + }) + + t.Run("scale to max when count == max", func(t *testing.T) { + w := newEmptyWorker() + w.setDesiredWorkerState(5, 0) + assert.Equal(t, 5, w.lastPatch) + assert.Equal(t, 0, w.patchSeq) + }) + + t.Run("scale to max when count > max and completed > 0", func(t *testing.T) { + w := newEmptyWorker() + patchID := w.setDesiredWorkerState(1, 0) + assert.Equal(t, 0, patchID) + patchID = w.setDesiredWorkerState(6, 1) + assert.Equal(t, 1, patchID) + assert.Equal(t, 5, w.lastPatch) + assert.Equal(t, 1, w.patchSeq) + }) + + t.Run("scale back to 0 when count was > max", func(t *testing.T) { + w := newEmptyWorker() + patchID := w.setDesiredWorkerState(6, 0) + assert.Equal(t, 0, patchID) + patchID = w.setDesiredWorkerState(0, 1) + assert.Equal(t, 1, patchID) + assert.Equal(t, 0, w.lastPatch) + assert.Equal(t, 1, w.patchSeq) + }) + + t.Run("force 0 on empty batch and last patch == min runners", func(t *testing.T) { + w := newEmptyWorker() + patchID := w.setDesiredWorkerState(3, 0) + assert.Equal(t, 0, patchID) + assert.Equal(t, 3, w.lastPatch) + assert.Equal(t, 0, w.patchSeq) + + patchID = w.setDesiredWorkerState(0, 3) + assert.Equal(t, 1, patchID) + assert.Equal(t, 0, w.lastPatch) + assert.Equal(t, 1, w.patchSeq) + + // Empty batch on min runners + patchID = w.setDesiredWorkerState(0, 0) + assert.Equal(t, 0, patchID) // forcing the state + assert.Equal(t, 0, w.lastPatch) + assert.Equal(t, 2, w.patchSeq) + }) +} + +func TestSetDesiredWorkerState_MinMaxSet(t *testing.T) { + logger := logr.Discard() + newEmptyWorker := func() *Worker { + return &Worker{ + config: Config{ + MinRunners: 1, + MaxRunners: 3, + }, + lastPatch: -1, + patchSeq: -1, + logger: &logger, + } + } + + t.Run("initial scale when acquired == 0 and completed == 0", func(t *testing.T) { + w := newEmptyWorker() + patchID := w.setDesiredWorkerState(0, 0) + assert.Equal(t, 0, patchID) + assert.Equal(t, 1, w.lastPatch) + assert.Equal(t, 0, w.patchSeq) + }) + + t.Run("re-use the old state on count == 0 and completed == 0", func(t *testing.T) { + w := newEmptyWorker() + patchID := w.setDesiredWorkerState(2, 0) + assert.Equal(t, 0, patchID) + patchID = w.setDesiredWorkerState(0, 0) + assert.Equal(t, 1, patchID) + assert.Equal(t, 3, w.lastPatch) + assert.Equal(t, 1, w.patchSeq) + }) + + t.Run("scale to min when count == 0", func(t *testing.T) { + w := newEmptyWorker() + patchID := w.setDesiredWorkerState(2, 0) + assert.Equal(t, 0, patchID) + patchID = w.setDesiredWorkerState(0, 1) + assert.Equal(t, 1, patchID) + assert.Equal(t, 1, w.lastPatch) + assert.Equal(t, 1, w.patchSeq) + }) + + t.Run("scale up to max when count > max", func(t *testing.T) { + w := newEmptyWorker() + patchID := w.setDesiredWorkerState(4, 0) + assert.Equal(t, 0, patchID) + assert.Equal(t, 3, w.lastPatch) + assert.Equal(t, 0, w.patchSeq) + }) + + t.Run("scale to max when count == max", func(t *testing.T) { + w := newEmptyWorker() + patchID := w.setDesiredWorkerState(3, 0) + assert.Equal(t, 0, patchID) + assert.Equal(t, 3, w.lastPatch) + assert.Equal(t, 0, w.patchSeq) + }) + + t.Run("force 0 on empty batch and last patch == min runners", func(t *testing.T) { + w := newEmptyWorker() + patchID := w.setDesiredWorkerState(3, 0) + assert.Equal(t, 0, patchID) + assert.Equal(t, 3, w.lastPatch) + assert.Equal(t, 0, w.patchSeq) + + patchID = w.setDesiredWorkerState(0, 3) + assert.Equal(t, 1, patchID) + assert.Equal(t, 1, w.lastPatch) + assert.Equal(t, 1, w.patchSeq) + + // Empty batch on min runners + patchID = w.setDesiredWorkerState(0, 0) + assert.Equal(t, 0, patchID) // forcing the state + assert.Equal(t, 1, w.lastPatch) + assert.Equal(t, 2, w.patchSeq) + }) +} diff --git a/controllers/actions.github.com/autoscalinglistener_controller.go b/controllers/actions.github.com/autoscalinglistener_controller.go index 50803c91..f35c85e9 100644 --- a/controllers/actions.github.com/autoscalinglistener_controller.go +++ b/controllers/actions.github.com/autoscalinglistener_controller.go @@ -690,30 +690,6 @@ func (r *AutoscalingListenerReconciler) publishRunningListener(autoscalingListen // SetupWithManager sets up the controller with the Manager. func (r *AutoscalingListenerReconciler) SetupWithManager(mgr ctrl.Manager) error { - groupVersionIndexer := func(rawObj client.Object) []string { - groupVersion := v1alpha1.GroupVersion.String() - owner := metav1.GetControllerOf(rawObj) - if owner == nil { - return nil - } - - // ...make sure it is owned by this controller - if owner.APIVersion != groupVersion || owner.Kind != "AutoscalingListener" { - return nil - } - - // ...and if so, return it - return []string{owner.Name} - } - - if err := mgr.GetFieldIndexer().IndexField(context.Background(), &corev1.Pod{}, resourceOwnerKey, groupVersionIndexer); err != nil { - return err - } - - if err := mgr.GetFieldIndexer().IndexField(context.Background(), &corev1.ServiceAccount{}, resourceOwnerKey, groupVersionIndexer); err != nil { - return err - } - labelBasedWatchFunc := func(_ context.Context, obj client.Object) []reconcile.Request { var requests []reconcile.Request labels := obj.GetLabels() diff --git a/controllers/actions.github.com/autoscalinglistener_controller_test.go b/controllers/actions.github.com/autoscalinglistener_controller_test.go index 63b5c742..994df5d8 100644 --- a/controllers/actions.github.com/autoscalinglistener_controller_test.go +++ b/controllers/actions.github.com/autoscalinglistener_controller_test.go @@ -21,7 +21,7 @@ import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/types" - actionsv1alpha1 "github.com/actions/actions-runner-controller/apis/actions.github.com/v1alpha1" + "github.com/actions/actions-runner-controller/apis/actions.github.com/v1alpha1" ) const ( @@ -34,9 +34,9 @@ var _ = Describe("Test AutoScalingListener controller", func() { var ctx context.Context var mgr ctrl.Manager var autoscalingNS *corev1.Namespace - var autoscalingRunnerSet *actionsv1alpha1.AutoscalingRunnerSet + var autoscalingRunnerSet *v1alpha1.AutoscalingRunnerSet var configSecret *corev1.Secret - var autoscalingListener *actionsv1alpha1.AutoscalingListener + var autoscalingListener *v1alpha1.AutoscalingListener BeforeEach(func() { ctx = context.Background() @@ -53,12 +53,12 @@ var _ = Describe("Test AutoScalingListener controller", func() { min := 1 max := 10 - autoscalingRunnerSet = &actionsv1alpha1.AutoscalingRunnerSet{ + autoscalingRunnerSet = &v1alpha1.AutoscalingRunnerSet{ ObjectMeta: metav1.ObjectMeta{ Name: "test-asrs", Namespace: autoscalingNS.Name, }, - Spec: actionsv1alpha1.AutoscalingRunnerSetSpec{ + Spec: v1alpha1.AutoscalingRunnerSetSpec{ GitHubConfigUrl: "https://github.com/owner/repo", GitHubConfigSecret: configSecret.Name, MaxRunners: &max, @@ -79,12 +79,12 @@ var _ = Describe("Test AutoScalingListener controller", func() { err = k8sClient.Create(ctx, autoscalingRunnerSet) Expect(err).NotTo(HaveOccurred(), "failed to create AutoScalingRunnerSet") - autoscalingListener = &actionsv1alpha1.AutoscalingListener{ + autoscalingListener = &v1alpha1.AutoscalingListener{ ObjectMeta: metav1.ObjectMeta{ Name: "test-asl", Namespace: autoscalingNS.Name, }, - Spec: actionsv1alpha1.AutoscalingListenerSpec{ + Spec: v1alpha1.AutoscalingListenerSpec{ GitHubConfigUrl: "https://github.com/owner/repo", GitHubConfigSecret: configSecret.Name, RunnerScaleSetId: 1, @@ -119,7 +119,7 @@ var _ = Describe("Test AutoScalingListener controller", func() { ).Should(Succeed(), "Config secret should be created") // Check if finalizer is added - created := new(actionsv1alpha1.AutoscalingListener) + created := new(v1alpha1.AutoscalingListener) Eventually( func() (string, error) { err := k8sClient.Get(ctx, client.ObjectKey{Name: autoscalingListener.Name, Namespace: autoscalingListener.Namespace}, created) @@ -298,7 +298,7 @@ var _ = Describe("Test AutoScalingListener controller", func() { // The AutoScalingListener should be deleted Eventually( func() error { - listenerList := new(actionsv1alpha1.AutoscalingListenerList) + listenerList := new(v1alpha1.AutoscalingListenerList) err := k8sClient.List(ctx, listenerList, client.InNamespace(autoscalingListener.Namespace), client.MatchingFields{".metadata.name": autoscalingListener.Name}) if err != nil { return err @@ -415,9 +415,9 @@ var _ = Describe("Test AutoScalingListener customization", func() { var ctx context.Context var mgr ctrl.Manager var autoscalingNS *corev1.Namespace - var autoscalingRunnerSet *actionsv1alpha1.AutoscalingRunnerSet + var autoscalingRunnerSet *v1alpha1.AutoscalingRunnerSet var configSecret *corev1.Secret - var autoscalingListener *actionsv1alpha1.AutoscalingListener + var autoscalingListener *v1alpha1.AutoscalingListener var runAsUser int64 = 1001 @@ -458,12 +458,12 @@ var _ = Describe("Test AutoScalingListener customization", func() { min := 1 max := 10 - autoscalingRunnerSet = &actionsv1alpha1.AutoscalingRunnerSet{ + autoscalingRunnerSet = &v1alpha1.AutoscalingRunnerSet{ ObjectMeta: metav1.ObjectMeta{ Name: "test-asrs", Namespace: autoscalingNS.Name, }, - Spec: actionsv1alpha1.AutoscalingRunnerSetSpec{ + Spec: v1alpha1.AutoscalingRunnerSetSpec{ GitHubConfigUrl: "https://github.com/owner/repo", GitHubConfigSecret: configSecret.Name, MaxRunners: &max, @@ -484,12 +484,12 @@ var _ = Describe("Test AutoScalingListener customization", func() { err = k8sClient.Create(ctx, autoscalingRunnerSet) Expect(err).NotTo(HaveOccurred(), "failed to create AutoScalingRunnerSet") - autoscalingListener = &actionsv1alpha1.AutoscalingListener{ + autoscalingListener = &v1alpha1.AutoscalingListener{ ObjectMeta: metav1.ObjectMeta{ Name: "test-asltest", Namespace: autoscalingNS.Name, }, - Spec: actionsv1alpha1.AutoscalingListenerSpec{ + Spec: v1alpha1.AutoscalingListenerSpec{ GitHubConfigUrl: "https://github.com/owner/repo", GitHubConfigSecret: configSecret.Name, RunnerScaleSetId: 1, @@ -512,7 +512,7 @@ var _ = Describe("Test AutoScalingListener customization", func() { Context("When creating a new AutoScalingListener", func() { It("It should create customized pod with applied configuration", func() { // Check if finalizer is added - created := new(actionsv1alpha1.AutoscalingListener) + created := new(v1alpha1.AutoscalingListener) Eventually( func() (string, error) { err := k8sClient.Get(ctx, client.ObjectKey{Name: autoscalingListener.Name, Namespace: autoscalingListener.Namespace}, created) @@ -570,19 +570,19 @@ var _ = Describe("Test AutoScalingListener controller with proxy", func() { var ctx context.Context var mgr ctrl.Manager var autoscalingNS *corev1.Namespace - var autoscalingRunnerSet *actionsv1alpha1.AutoscalingRunnerSet + var autoscalingRunnerSet *v1alpha1.AutoscalingRunnerSet var configSecret *corev1.Secret - var autoscalingListener *actionsv1alpha1.AutoscalingListener + var autoscalingListener *v1alpha1.AutoscalingListener - createRunnerSetAndListener := func(proxy *actionsv1alpha1.ProxyConfig) { + createRunnerSetAndListener := func(proxy *v1alpha1.ProxyConfig) { min := 1 max := 10 - autoscalingRunnerSet = &actionsv1alpha1.AutoscalingRunnerSet{ + autoscalingRunnerSet = &v1alpha1.AutoscalingRunnerSet{ ObjectMeta: metav1.ObjectMeta{ Name: "test-asrs", Namespace: autoscalingNS.Name, }, - Spec: actionsv1alpha1.AutoscalingRunnerSetSpec{ + Spec: v1alpha1.AutoscalingRunnerSetSpec{ GitHubConfigUrl: "https://github.com/owner/repo", GitHubConfigSecret: configSecret.Name, MaxRunners: &max, @@ -604,12 +604,12 @@ var _ = Describe("Test AutoScalingListener controller with proxy", func() { err := k8sClient.Create(ctx, autoscalingRunnerSet) Expect(err).NotTo(HaveOccurred(), "failed to create AutoScalingRunnerSet") - autoscalingListener = &actionsv1alpha1.AutoscalingListener{ + autoscalingListener = &v1alpha1.AutoscalingListener{ ObjectMeta: metav1.ObjectMeta{ Name: "test-asl", Namespace: autoscalingNS.Name, }, - Spec: actionsv1alpha1.AutoscalingListenerSpec{ + Spec: v1alpha1.AutoscalingListenerSpec{ GitHubConfigUrl: "https://github.com/owner/repo", GitHubConfigSecret: configSecret.Name, RunnerScaleSetId: 1, @@ -658,12 +658,12 @@ var _ = Describe("Test AutoScalingListener controller with proxy", func() { err := k8sClient.Create(ctx, proxyCredentials) Expect(err).NotTo(HaveOccurred(), "failed to create proxy credentials secret") - proxy := &actionsv1alpha1.ProxyConfig{ - HTTP: &actionsv1alpha1.ProxyServerConfig{ + proxy := &v1alpha1.ProxyConfig{ + HTTP: &v1alpha1.ProxyServerConfig{ Url: "http://localhost:8080", CredentialSecretRef: "proxy-credentials", }, - HTTPS: &actionsv1alpha1.ProxyServerConfig{ + HTTPS: &v1alpha1.ProxyServerConfig{ Url: "https://localhost:8443", CredentialSecretRef: "proxy-credentials", }, @@ -766,19 +766,19 @@ var _ = Describe("Test AutoScalingListener controller with template modification var ctx context.Context var mgr ctrl.Manager var autoscalingNS *corev1.Namespace - var autoscalingRunnerSet *actionsv1alpha1.AutoscalingRunnerSet + var autoscalingRunnerSet *v1alpha1.AutoscalingRunnerSet var configSecret *corev1.Secret - var autoscalingListener *actionsv1alpha1.AutoscalingListener + var autoscalingListener *v1alpha1.AutoscalingListener createRunnerSetAndListener := func(listenerTemplate *corev1.PodTemplateSpec) { min := 1 max := 10 - autoscalingRunnerSet = &actionsv1alpha1.AutoscalingRunnerSet{ + autoscalingRunnerSet = &v1alpha1.AutoscalingRunnerSet{ ObjectMeta: metav1.ObjectMeta{ Name: "test-asrs", Namespace: autoscalingNS.Name, }, - Spec: actionsv1alpha1.AutoscalingRunnerSetSpec{ + Spec: v1alpha1.AutoscalingRunnerSetSpec{ GitHubConfigUrl: "https://github.com/owner/repo", GitHubConfigSecret: configSecret.Name, MaxRunners: &max, @@ -800,12 +800,12 @@ var _ = Describe("Test AutoScalingListener controller with template modification err := k8sClient.Create(ctx, autoscalingRunnerSet) Expect(err).NotTo(HaveOccurred(), "failed to create AutoScalingRunnerSet") - autoscalingListener = &actionsv1alpha1.AutoscalingListener{ + autoscalingListener = &v1alpha1.AutoscalingListener{ ObjectMeta: metav1.ObjectMeta{ Name: "test-asl", Namespace: autoscalingNS.Name, }, - Spec: actionsv1alpha1.AutoscalingListenerSpec{ + Spec: v1alpha1.AutoscalingListenerSpec{ GitHubConfigUrl: "https://github.com/owner/repo", GitHubConfigSecret: configSecret.Name, RunnerScaleSetId: 1, @@ -915,9 +915,9 @@ var _ = Describe("Test GitHub Server TLS configuration", func() { var ctx context.Context var mgr ctrl.Manager var autoscalingNS *corev1.Namespace - var autoscalingRunnerSet *actionsv1alpha1.AutoscalingRunnerSet + var autoscalingRunnerSet *v1alpha1.AutoscalingRunnerSet var configSecret *corev1.Secret - var autoscalingListener *actionsv1alpha1.AutoscalingListener + var autoscalingListener *v1alpha1.AutoscalingListener var rootCAConfigMap *corev1.ConfigMap BeforeEach(func() { @@ -955,16 +955,16 @@ var _ = Describe("Test GitHub Server TLS configuration", func() { min := 1 max := 10 - autoscalingRunnerSet = &actionsv1alpha1.AutoscalingRunnerSet{ + autoscalingRunnerSet = &v1alpha1.AutoscalingRunnerSet{ ObjectMeta: metav1.ObjectMeta{ Name: "test-asrs", Namespace: autoscalingNS.Name, }, - Spec: actionsv1alpha1.AutoscalingRunnerSetSpec{ + Spec: v1alpha1.AutoscalingRunnerSetSpec{ GitHubConfigUrl: "https://github.com/owner/repo", GitHubConfigSecret: configSecret.Name, - GitHubServerTLS: &actionsv1alpha1.GitHubServerTLSConfig{ - CertificateFrom: &actionsv1alpha1.TLSCertificateSource{ + GitHubServerTLS: &v1alpha1.GitHubServerTLSConfig{ + CertificateFrom: &v1alpha1.TLSCertificateSource{ ConfigMapKeyRef: &corev1.ConfigMapKeySelector{ LocalObjectReference: corev1.LocalObjectReference{ Name: rootCAConfigMap.Name, @@ -991,16 +991,16 @@ var _ = Describe("Test GitHub Server TLS configuration", func() { err = k8sClient.Create(ctx, autoscalingRunnerSet) Expect(err).NotTo(HaveOccurred(), "failed to create AutoScalingRunnerSet") - autoscalingListener = &actionsv1alpha1.AutoscalingListener{ + autoscalingListener = &v1alpha1.AutoscalingListener{ ObjectMeta: metav1.ObjectMeta{ Name: "test-asl", Namespace: autoscalingNS.Name, }, - Spec: actionsv1alpha1.AutoscalingListenerSpec{ + Spec: v1alpha1.AutoscalingListenerSpec{ GitHubConfigUrl: "https://github.com/owner/repo", GitHubConfigSecret: configSecret.Name, - GitHubServerTLS: &actionsv1alpha1.GitHubServerTLSConfig{ - CertificateFrom: &actionsv1alpha1.TLSCertificateSource{ + GitHubServerTLS: &v1alpha1.GitHubServerTLSConfig{ + CertificateFrom: &v1alpha1.TLSCertificateSource{ ConfigMapKeyRef: &corev1.ConfigMapKeySelector{ LocalObjectReference: corev1.LocalObjectReference{ Name: rootCAConfigMap.Name, diff --git a/controllers/actions.github.com/autoscalingrunnerset_controller.go b/controllers/actions.github.com/autoscalingrunnerset_controller.go index 2ed654e8..f87a11af 100644 --- a/controllers/actions.github.com/autoscalingrunnerset_controller.go +++ b/controllers/actions.github.com/autoscalingrunnerset_controller.go @@ -30,7 +30,6 @@ import ( corev1 "k8s.io/api/core/v1" rbacv1 "k8s.io/api/rbac/v1" kerrors "k8s.io/apimachinery/pkg/api/errors" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/types" ctrl "sigs.k8s.io/controller-runtime" @@ -759,26 +758,6 @@ func (r *AutoscalingRunnerSetReconciler) actionsClientOptionsFor(ctx context.Con // SetupWithManager sets up the controller with the Manager. func (r *AutoscalingRunnerSetReconciler) SetupWithManager(mgr ctrl.Manager) error { - groupVersionIndexer := func(rawObj client.Object) []string { - groupVersion := v1alpha1.GroupVersion.String() - owner := metav1.GetControllerOf(rawObj) - if owner == nil { - return nil - } - - // ...make sure it is owned by this controller - if owner.APIVersion != groupVersion || owner.Kind != "AutoscalingRunnerSet" { - return nil - } - - // ...and if so, return it - return []string{owner.Name} - } - - if err := mgr.GetFieldIndexer().IndexField(context.Background(), &v1alpha1.EphemeralRunnerSet{}, resourceOwnerKey, groupVersionIndexer); err != nil { - return err - } - return ctrl.NewControllerManagedBy(mgr). For(&v1alpha1.AutoscalingRunnerSet{}). Owns(&v1alpha1.EphemeralRunnerSet{}). diff --git a/controllers/actions.github.com/ephemeralrunner_controller.go b/controllers/actions.github.com/ephemeralrunner_controller.go index 8765c1a0..6da084b7 100644 --- a/controllers/actions.github.com/ephemeralrunner_controller.go +++ b/controllers/actions.github.com/ephemeralrunner_controller.go @@ -815,7 +815,6 @@ func (r *EphemeralRunnerReconciler) deleteRunnerFromService(ctx context.Context, // SetupWithManager sets up the controller with the Manager. func (r *EphemeralRunnerReconciler) SetupWithManager(mgr ctrl.Manager) error { - // TODO(nikola-jokic): Add indexing and filtering fields on corev1.Pod{} return ctrl.NewControllerManagedBy(mgr). For(&v1alpha1.EphemeralRunner{}). Owns(&corev1.Pod{}). diff --git a/controllers/actions.github.com/ephemeralrunnerset_controller.go b/controllers/actions.github.com/ephemeralrunnerset_controller.go index b462e177..c5d166a5 100644 --- a/controllers/actions.github.com/ephemeralrunnerset_controller.go +++ b/controllers/actions.github.com/ephemeralrunnerset_controller.go @@ -213,9 +213,6 @@ func (r *EphemeralRunnerSetReconciler) Reconcile(ctx context.Context, req ctrl.R // on the next batch case ephemeralRunnerSet.Spec.PatchID == 0 && total > ephemeralRunnerSet.Spec.Replicas: count := total - ephemeralRunnerSet.Spec.Replicas - if count <= 0 { - break - } log.Info("Deleting ephemeral runners (scale down)", "count", count) if err := r.deleteIdleEphemeralRunners( ctx, @@ -574,28 +571,6 @@ func (r *EphemeralRunnerSetReconciler) actionsClientOptionsFor(ctx context.Conte // SetupWithManager sets up the controller with the Manager. func (r *EphemeralRunnerSetReconciler) SetupWithManager(mgr ctrl.Manager) error { - // Index EphemeralRunner owned by EphemeralRunnerSet so we can perform faster look ups. - if err := mgr.GetFieldIndexer().IndexField(context.Background(), &v1alpha1.EphemeralRunner{}, resourceOwnerKey, func(rawObj client.Object) []string { - groupVersion := v1alpha1.GroupVersion.String() - - // grab the job object, extract the owner... - ephemeralRunner := rawObj.(*v1alpha1.EphemeralRunner) - owner := metav1.GetControllerOf(ephemeralRunner) - if owner == nil { - return nil - } - - // ...make sure it is owned by this controller - if owner.APIVersion != groupVersion || owner.Kind != "EphemeralRunnerSet" { - return nil - } - - // ...and if so, return it - return []string{owner.Name} - }); err != nil { - return err - } - return ctrl.NewControllerManagedBy(mgr). For(&v1alpha1.EphemeralRunnerSet{}). Owns(&v1alpha1.EphemeralRunner{}). diff --git a/controllers/actions.github.com/ephemeralrunnerset_controller_test.go b/controllers/actions.github.com/ephemeralrunnerset_controller_test.go index 79ad2d6e..3c74b72e 100644 --- a/controllers/actions.github.com/ephemeralrunnerset_controller_test.go +++ b/controllers/actions.github.com/ephemeralrunnerset_controller_test.go @@ -23,8 +23,7 @@ import ( . "github.com/onsi/gomega" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - actionsv1alpha1 "github.com/actions/actions-runner-controller/apis/actions.github.com/v1alpha1" - v1alpha1 "github.com/actions/actions-runner-controller/apis/actions.github.com/v1alpha1" + "github.com/actions/actions-runner-controller/apis/actions.github.com/v1alpha1" "github.com/actions/actions-runner-controller/github/actions" "github.com/actions/actions-runner-controller/github/actions/fake" "github.com/actions/actions-runner-controller/github/actions/testserver" @@ -40,7 +39,7 @@ var _ = Describe("Test EphemeralRunnerSet controller", func() { var ctx context.Context var mgr ctrl.Manager var autoscalingNS *corev1.Namespace - var ephemeralRunnerSet *actionsv1alpha1.EphemeralRunnerSet + var ephemeralRunnerSet *v1alpha1.EphemeralRunnerSet var configSecret *corev1.Secret BeforeEach(func() { @@ -57,13 +56,13 @@ var _ = Describe("Test EphemeralRunnerSet controller", func() { err := controller.SetupWithManager(mgr) Expect(err).NotTo(HaveOccurred(), "failed to setup controller") - ephemeralRunnerSet = &actionsv1alpha1.EphemeralRunnerSet{ + ephemeralRunnerSet = &v1alpha1.EphemeralRunnerSet{ ObjectMeta: metav1.ObjectMeta{ Name: "test-asrs", Namespace: autoscalingNS.Name, }, - Spec: actionsv1alpha1.EphemeralRunnerSetSpec{ - EphemeralRunnerSpec: actionsv1alpha1.EphemeralRunnerSpec{ + Spec: v1alpha1.EphemeralRunnerSetSpec{ + EphemeralRunnerSpec: v1alpha1.EphemeralRunnerSpec{ GitHubConfigUrl: "https://github.com/owner/repo", GitHubConfigSecret: configSecret.Name, RunnerScaleSetId: 100, @@ -90,7 +89,7 @@ var _ = Describe("Test EphemeralRunnerSet controller", func() { Context("When creating a new EphemeralRunnerSet", func() { It("It should create/add all required resources for a new EphemeralRunnerSet (finalizer)", func() { // Check if finalizer is added - created := new(actionsv1alpha1.EphemeralRunnerSet) + created := new(v1alpha1.EphemeralRunnerSet) Eventually( func() (string, error) { err := k8sClient.Get(ctx, client.ObjectKey{Name: ephemeralRunnerSet.Name, Namespace: ephemeralRunnerSet.Namespace}, created) @@ -108,7 +107,7 @@ var _ = Describe("Test EphemeralRunnerSet controller", func() { // Check if the number of ephemeral runners are stay 0 Consistently( func() (int, error) { - runnerList := new(actionsv1alpha1.EphemeralRunnerList) + runnerList := new(v1alpha1.EphemeralRunnerList) err := k8sClient.List(ctx, runnerList, client.InNamespace(ephemeralRunnerSet.Namespace)) if err != nil { return -1, err @@ -122,7 +121,7 @@ var _ = Describe("Test EphemeralRunnerSet controller", func() { // Check if the status stay 0 Consistently( func() (int, error) { - runnerSet := new(actionsv1alpha1.EphemeralRunnerSet) + runnerSet := new(v1alpha1.EphemeralRunnerSet) err := k8sClient.Get(ctx, client.ObjectKey{Name: ephemeralRunnerSet.Name, Namespace: ephemeralRunnerSet.Namespace}, runnerSet) if err != nil { return -1, err @@ -142,7 +141,7 @@ var _ = Describe("Test EphemeralRunnerSet controller", func() { // Check if the number of ephemeral runners are created Eventually( func() (int, error) { - runnerList := new(actionsv1alpha1.EphemeralRunnerList) + runnerList := new(v1alpha1.EphemeralRunnerList) err := k8sClient.List(ctx, runnerList, client.InNamespace(ephemeralRunnerSet.Namespace)) if err != nil { return -1, err @@ -176,7 +175,7 @@ var _ = Describe("Test EphemeralRunnerSet controller", func() { // Check if the status is updated Eventually( func() (int, error) { - runnerSet := new(actionsv1alpha1.EphemeralRunnerSet) + runnerSet := new(v1alpha1.EphemeralRunnerSet) err := k8sClient.Get(ctx, client.ObjectKey{Name: ephemeralRunnerSet.Name, Namespace: ephemeralRunnerSet.Namespace}, runnerSet) if err != nil { return -1, err @@ -191,7 +190,7 @@ var _ = Describe("Test EphemeralRunnerSet controller", func() { Context("When deleting a new EphemeralRunnerSet", func() { It("It should cleanup all resources for a deleting EphemeralRunnerSet before removing it", func() { - created := new(actionsv1alpha1.EphemeralRunnerSet) + created := new(v1alpha1.EphemeralRunnerSet) err := k8sClient.Get(ctx, client.ObjectKey{Name: ephemeralRunnerSet.Name, Namespace: ephemeralRunnerSet.Namespace}, created) Expect(err).NotTo(HaveOccurred(), "failed to get EphemeralRunnerSet") @@ -204,7 +203,7 @@ var _ = Describe("Test EphemeralRunnerSet controller", func() { // Wait for the EphemeralRunnerSet to be scaled up Eventually( func() (int, error) { - runnerList := new(actionsv1alpha1.EphemeralRunnerList) + runnerList := new(v1alpha1.EphemeralRunnerList) err := k8sClient.List(ctx, runnerList, client.InNamespace(ephemeralRunnerSet.Namespace)) if err != nil { return -1, err @@ -242,7 +241,7 @@ var _ = Describe("Test EphemeralRunnerSet controller", func() { // Check if all ephemeral runners are deleted Eventually( func() (int, error) { - runnerList := new(actionsv1alpha1.EphemeralRunnerList) + runnerList := new(v1alpha1.EphemeralRunnerList) err := k8sClient.List(ctx, runnerList, client.InNamespace(ephemeralRunnerSet.Namespace)) if err != nil { return -1, err @@ -256,7 +255,7 @@ var _ = Describe("Test EphemeralRunnerSet controller", func() { // Check if the EphemeralRunnerSet is deleted Eventually( func() error { - deleted := new(actionsv1alpha1.EphemeralRunnerSet) + deleted := new(v1alpha1.EphemeralRunnerSet) err = k8sClient.Get(ctx, client.ObjectKey{Name: ephemeralRunnerSet.Name, Namespace: ephemeralRunnerSet.Namespace}, deleted) if err != nil { if kerrors.IsNotFound(err) { @@ -275,7 +274,7 @@ var _ = Describe("Test EphemeralRunnerSet controller", func() { Context("When a new EphemeralRunnerSet scale up and down", func() { It("Should scale up with patch ID 0", func() { - ers := new(actionsv1alpha1.EphemeralRunnerSet) + ers := new(v1alpha1.EphemeralRunnerSet) err := k8sClient.Get(ctx, client.ObjectKey{Name: ephemeralRunnerSet.Name, Namespace: ephemeralRunnerSet.Namespace}, ers) Expect(err).NotTo(HaveOccurred(), "failed to get EphemeralRunnerSet") @@ -286,7 +285,7 @@ var _ = Describe("Test EphemeralRunnerSet controller", func() { err = k8sClient.Patch(ctx, updated, client.MergeFrom(ers)) Expect(err).NotTo(HaveOccurred(), "failed to update EphemeralRunnerSet") - runnerList := new(actionsv1alpha1.EphemeralRunnerList) + runnerList := new(v1alpha1.EphemeralRunnerList) Eventually( func() (int, error) { err := k8sClient.List(ctx, runnerList, client.InNamespace(ephemeralRunnerSet.Namespace)) @@ -302,7 +301,7 @@ var _ = Describe("Test EphemeralRunnerSet controller", func() { }) It("Should scale up when patch ID changes", func() { - ers := new(actionsv1alpha1.EphemeralRunnerSet) + ers := new(v1alpha1.EphemeralRunnerSet) err := k8sClient.Get(ctx, client.ObjectKey{Name: ephemeralRunnerSet.Name, Namespace: ephemeralRunnerSet.Namespace}, ers) Expect(err).NotTo(HaveOccurred(), "failed to get EphemeralRunnerSet") @@ -313,7 +312,7 @@ var _ = Describe("Test EphemeralRunnerSet controller", func() { err = k8sClient.Patch(ctx, updated, client.MergeFrom(ers)) Expect(err).NotTo(HaveOccurred(), "failed to update EphemeralRunnerSet") - runnerList := new(actionsv1alpha1.EphemeralRunnerList) + runnerList := new(v1alpha1.EphemeralRunnerList) Eventually( func() (int, error) { err := k8sClient.List(ctx, runnerList, client.InNamespace(ephemeralRunnerSet.Namespace)) @@ -327,7 +326,7 @@ var _ = Describe("Test EphemeralRunnerSet controller", func() { ephemeralRunnerSetTestInterval, ).Should(BeEquivalentTo(1), "1 EphemeralRunner should be created") - ers = new(actionsv1alpha1.EphemeralRunnerSet) + ers = new(v1alpha1.EphemeralRunnerSet) err = k8sClient.Get(ctx, client.ObjectKey{Name: ephemeralRunnerSet.Name, Namespace: ephemeralRunnerSet.Namespace}, ers) Expect(err).NotTo(HaveOccurred(), "failed to get EphemeralRunnerSet") @@ -338,7 +337,7 @@ var _ = Describe("Test EphemeralRunnerSet controller", func() { err = k8sClient.Patch(ctx, updated, client.MergeFrom(ers)) Expect(err).NotTo(HaveOccurred(), "failed to update EphemeralRunnerSet") - runnerList = new(actionsv1alpha1.EphemeralRunnerList) + runnerList = new(v1alpha1.EphemeralRunnerList) Eventually( func() (int, error) { err := k8sClient.List(ctx, runnerList, client.InNamespace(ephemeralRunnerSet.Namespace)) @@ -354,7 +353,7 @@ var _ = Describe("Test EphemeralRunnerSet controller", func() { }) It("Should clean up finished ephemeral runner when scaling down", func() { - ers := new(actionsv1alpha1.EphemeralRunnerSet) + ers := new(v1alpha1.EphemeralRunnerSet) err := k8sClient.Get(ctx, client.ObjectKey{Name: ephemeralRunnerSet.Name, Namespace: ephemeralRunnerSet.Namespace}, ers) Expect(err).NotTo(HaveOccurred(), "failed to get EphemeralRunnerSet") @@ -365,7 +364,7 @@ var _ = Describe("Test EphemeralRunnerSet controller", func() { err = k8sClient.Patch(ctx, updated, client.MergeFrom(ers)) Expect(err).NotTo(HaveOccurred(), "failed to update EphemeralRunnerSet") - runnerList := new(actionsv1alpha1.EphemeralRunnerList) + runnerList := new(v1alpha1.EphemeralRunnerList) Eventually( func() (int, error) { err := k8sClient.List(ctx, runnerList, client.InNamespace(ephemeralRunnerSet.Namespace)) @@ -390,7 +389,7 @@ var _ = Describe("Test EphemeralRunnerSet controller", func() { Expect(err).NotTo(HaveOccurred(), "failed to update EphemeralRunner") // Keep the ephemeral runner until the next patch - runnerList = new(actionsv1alpha1.EphemeralRunnerList) + runnerList = new(v1alpha1.EphemeralRunnerList) Eventually( func() (int, error) { err := k8sClient.List(ctx, runnerList, client.InNamespace(ephemeralRunnerSet.Namespace)) @@ -405,7 +404,7 @@ var _ = Describe("Test EphemeralRunnerSet controller", func() { ).Should(BeEquivalentTo(2), "1 EphemeralRunner should be up") // The listener was slower to patch the completed, but we should still have 1 running - ers = new(actionsv1alpha1.EphemeralRunnerSet) + ers = new(v1alpha1.EphemeralRunnerSet) err = k8sClient.Get(ctx, client.ObjectKey{Name: ephemeralRunnerSet.Name, Namespace: ephemeralRunnerSet.Namespace}, ers) Expect(err).NotTo(HaveOccurred(), "failed to get EphemeralRunnerSet") @@ -416,7 +415,7 @@ var _ = Describe("Test EphemeralRunnerSet controller", func() { err = k8sClient.Patch(ctx, updated, client.MergeFrom(ers)) Expect(err).NotTo(HaveOccurred(), "failed to update EphemeralRunnerSet") - runnerList = new(actionsv1alpha1.EphemeralRunnerList) + runnerList = new(v1alpha1.EphemeralRunnerList) Eventually( func() (int, error) { err := k8sClient.List(ctx, runnerList, client.InNamespace(ephemeralRunnerSet.Namespace)) @@ -432,7 +431,7 @@ var _ = Describe("Test EphemeralRunnerSet controller", func() { }) It("Should keep finished ephemeral runners until patch id changes", func() { - ers := new(actionsv1alpha1.EphemeralRunnerSet) + ers := new(v1alpha1.EphemeralRunnerSet) err := k8sClient.Get(ctx, client.ObjectKey{Name: ephemeralRunnerSet.Name, Namespace: ephemeralRunnerSet.Namespace}, ers) Expect(err).NotTo(HaveOccurred(), "failed to get EphemeralRunnerSet") @@ -443,7 +442,7 @@ var _ = Describe("Test EphemeralRunnerSet controller", func() { err = k8sClient.Patch(ctx, updated, client.MergeFrom(ers)) Expect(err).NotTo(HaveOccurred(), "failed to update EphemeralRunnerSet") - runnerList := new(actionsv1alpha1.EphemeralRunnerList) + runnerList := new(v1alpha1.EphemeralRunnerList) Eventually( func() (int, error) { err := k8sClient.List(ctx, runnerList, client.InNamespace(ephemeralRunnerSet.Namespace)) @@ -468,7 +467,7 @@ var _ = Describe("Test EphemeralRunnerSet controller", func() { Expect(err).NotTo(HaveOccurred(), "failed to update EphemeralRunner") // confirm they are not deleted - runnerList = new(actionsv1alpha1.EphemeralRunnerList) + runnerList = new(v1alpha1.EphemeralRunnerList) Consistently( func() (int, error) { err := k8sClient.List(ctx, runnerList, client.InNamespace(ephemeralRunnerSet.Namespace)) @@ -484,7 +483,7 @@ var _ = Describe("Test EphemeralRunnerSet controller", func() { }) It("Should handle double scale up", func() { - ers := new(actionsv1alpha1.EphemeralRunnerSet) + ers := new(v1alpha1.EphemeralRunnerSet) err := k8sClient.Get(ctx, client.ObjectKey{Name: ephemeralRunnerSet.Name, Namespace: ephemeralRunnerSet.Namespace}, ers) Expect(err).NotTo(HaveOccurred(), "failed to get EphemeralRunnerSet") @@ -495,7 +494,7 @@ var _ = Describe("Test EphemeralRunnerSet controller", func() { err = k8sClient.Patch(ctx, updated, client.MergeFrom(ers)) Expect(err).NotTo(HaveOccurred(), "failed to update EphemeralRunnerSet") - runnerList := new(actionsv1alpha1.EphemeralRunnerList) + runnerList := new(v1alpha1.EphemeralRunnerList) Eventually( func() (int, error) { err := k8sClient.List(ctx, runnerList, client.InNamespace(ephemeralRunnerSet.Namespace)) @@ -520,7 +519,7 @@ var _ = Describe("Test EphemeralRunnerSet controller", func() { err = k8sClient.Status().Patch(ctx, updatedRunner, client.MergeFrom(&runnerList.Items[1])) Expect(err).NotTo(HaveOccurred(), "failed to update EphemeralRunner") - ers = new(actionsv1alpha1.EphemeralRunnerSet) + ers = new(v1alpha1.EphemeralRunnerSet) err = k8sClient.Get(ctx, client.ObjectKey{Name: ephemeralRunnerSet.Name, Namespace: ephemeralRunnerSet.Namespace}, ers) Expect(err).NotTo(HaveOccurred(), "failed to get EphemeralRunnerSet") @@ -531,7 +530,7 @@ var _ = Describe("Test EphemeralRunnerSet controller", func() { err = k8sClient.Patch(ctx, updated, client.MergeFrom(ers)) Expect(err).NotTo(HaveOccurred(), "failed to update EphemeralRunnerSet") - runnerList = new(actionsv1alpha1.EphemeralRunnerList) + runnerList = new(v1alpha1.EphemeralRunnerList) // We should have 3 runners, and have no Succeeded ones Eventually( func() error { @@ -558,7 +557,7 @@ var _ = Describe("Test EphemeralRunnerSet controller", func() { }) It("Should handle scale down without removing pending runners", func() { - ers := new(actionsv1alpha1.EphemeralRunnerSet) + ers := new(v1alpha1.EphemeralRunnerSet) err := k8sClient.Get(ctx, client.ObjectKey{Name: ephemeralRunnerSet.Name, Namespace: ephemeralRunnerSet.Namespace}, ers) Expect(err).NotTo(HaveOccurred(), "failed to get EphemeralRunnerSet") @@ -569,7 +568,7 @@ var _ = Describe("Test EphemeralRunnerSet controller", func() { err = k8sClient.Patch(ctx, updated, client.MergeFrom(ers)) Expect(err).NotTo(HaveOccurred(), "failed to update EphemeralRunnerSet") - runnerList := new(actionsv1alpha1.EphemeralRunnerList) + runnerList := new(v1alpha1.EphemeralRunnerList) Eventually( func() (int, error) { err := k8sClient.List(ctx, runnerList, client.InNamespace(ephemeralRunnerSet.Namespace)) @@ -594,7 +593,7 @@ var _ = Describe("Test EphemeralRunnerSet controller", func() { Expect(err).NotTo(HaveOccurred(), "failed to update EphemeralRunner") // Wait for these statuses to actually be updated - runnerList = new(actionsv1alpha1.EphemeralRunnerList) + runnerList = new(v1alpha1.EphemeralRunnerList) Eventually( func() error { err := k8sClient.List(ctx, runnerList, client.InNamespace(ephemeralRunnerSet.Namespace)) @@ -623,7 +622,7 @@ var _ = Describe("Test EphemeralRunnerSet controller", func() { ).Should(BeNil(), "1 EphemeralRunner should be in Pending and 1 in Succeeded phase") // Scale down to 0, while 1 is still pending. This simulates the difference between the desired and actual state - ers = new(actionsv1alpha1.EphemeralRunnerSet) + ers = new(v1alpha1.EphemeralRunnerSet) err = k8sClient.Get(ctx, client.ObjectKey{Name: ephemeralRunnerSet.Name, Namespace: ephemeralRunnerSet.Namespace}, ers) Expect(err).NotTo(HaveOccurred(), "failed to get EphemeralRunnerSet") @@ -634,7 +633,7 @@ var _ = Describe("Test EphemeralRunnerSet controller", func() { err = k8sClient.Patch(ctx, updated, client.MergeFrom(ers)) Expect(err).NotTo(HaveOccurred(), "failed to update EphemeralRunnerSet") - runnerList = new(actionsv1alpha1.EphemeralRunnerList) + runnerList = new(v1alpha1.EphemeralRunnerList) // We should have 1 runner up and pending Eventually( func() error { @@ -678,7 +677,7 @@ var _ = Describe("Test EphemeralRunnerSet controller", func() { }) It("Should kill pending and running runners if they are up for some reason and the batch contains no jobs", func() { - ers := new(actionsv1alpha1.EphemeralRunnerSet) + ers := new(v1alpha1.EphemeralRunnerSet) err := k8sClient.Get(ctx, client.ObjectKey{Name: ephemeralRunnerSet.Name, Namespace: ephemeralRunnerSet.Namespace}, ers) Expect(err).NotTo(HaveOccurred(), "failed to get EphemeralRunnerSet") @@ -689,7 +688,7 @@ var _ = Describe("Test EphemeralRunnerSet controller", func() { err = k8sClient.Patch(ctx, updated, client.MergeFrom(ers)) Expect(err).NotTo(HaveOccurred(), "failed to update EphemeralRunnerSet") - runnerList := new(actionsv1alpha1.EphemeralRunnerList) + runnerList := new(v1alpha1.EphemeralRunnerList) Eventually( func() (int, error) { err := k8sClient.List(ctx, runnerList, client.InNamespace(ephemeralRunnerSet.Namespace)) @@ -715,7 +714,7 @@ var _ = Describe("Test EphemeralRunnerSet controller", func() { Expect(err).NotTo(HaveOccurred(), "failed to update EphemeralRunner") // Wait for these statuses to actually be updated - runnerList = new(actionsv1alpha1.EphemeralRunnerList) + runnerList = new(v1alpha1.EphemeralRunnerList) Eventually( func() error { err := k8sClient.List(ctx, runnerList, client.InNamespace(ephemeralRunnerSet.Namespace)) @@ -748,7 +747,7 @@ var _ = Describe("Test EphemeralRunnerSet controller", func() { // Scale down to 0 with patch ID 0. This forces the scale down to self correct on empty batch - ers = new(actionsv1alpha1.EphemeralRunnerSet) + ers = new(v1alpha1.EphemeralRunnerSet) err = k8sClient.Get(ctx, client.ObjectKey{Name: ephemeralRunnerSet.Name, Namespace: ephemeralRunnerSet.Namespace}, ers) Expect(err).NotTo(HaveOccurred(), "failed to get EphemeralRunnerSet") @@ -759,7 +758,7 @@ var _ = Describe("Test EphemeralRunnerSet controller", func() { err = k8sClient.Patch(ctx, updated, client.MergeFrom(ers)) Expect(err).NotTo(HaveOccurred(), "failed to update EphemeralRunnerSet") - runnerList = new(actionsv1alpha1.EphemeralRunnerList) + runnerList = new(v1alpha1.EphemeralRunnerList) Consistently( func() (int, error) { err := k8sClient.List(ctx, runnerList, client.InNamespace(ephemeralRunnerSet.Namespace)) @@ -786,7 +785,7 @@ var _ = Describe("Test EphemeralRunnerSet controller", func() { Expect(err).NotTo(HaveOccurred(), "failed to update EphemeralRunner") // Now, eventually, they should be deleted - runnerList = new(actionsv1alpha1.EphemeralRunnerList) + runnerList = new(v1alpha1.EphemeralRunnerList) Eventually( func() (int, error) { err := k8sClient.List(ctx, runnerList, client.InNamespace(ephemeralRunnerSet.Namespace)) @@ -803,7 +802,7 @@ var _ = Describe("Test EphemeralRunnerSet controller", func() { }) It("Should replace finished ephemeral runners with new ones", func() { - ers := new(actionsv1alpha1.EphemeralRunnerSet) + ers := new(v1alpha1.EphemeralRunnerSet) err := k8sClient.Get(ctx, client.ObjectKey{Name: ephemeralRunnerSet.Name, Namespace: ephemeralRunnerSet.Namespace}, ers) Expect(err).NotTo(HaveOccurred(), "failed to get EphemeralRunnerSet") @@ -814,7 +813,7 @@ var _ = Describe("Test EphemeralRunnerSet controller", func() { err = k8sClient.Patch(ctx, updated, client.MergeFrom(ers)) Expect(err).NotTo(HaveOccurred(), "failed to update EphemeralRunnerSet") - runnerList := new(actionsv1alpha1.EphemeralRunnerList) + runnerList := new(v1alpha1.EphemeralRunnerList) Eventually( func() (int, error) { err := k8sClient.List(ctx, runnerList, client.InNamespace(ephemeralRunnerSet.Namespace)) @@ -841,7 +840,7 @@ var _ = Describe("Test EphemeralRunnerSet controller", func() { // Wait for these statuses to actually be updated - runnerList = new(actionsv1alpha1.EphemeralRunnerList) + runnerList = new(v1alpha1.EphemeralRunnerList) Eventually( func() error { err := k8sClient.List(ctx, runnerList, client.InNamespace(ephemeralRunnerSet.Namespace)) @@ -874,7 +873,7 @@ var _ = Describe("Test EphemeralRunnerSet controller", func() { // Now, let's simulate replacement. The desired count is still 2. // This simulates that we got 1 job assigned, and 1 job completed. - ers = new(actionsv1alpha1.EphemeralRunnerSet) + ers = new(v1alpha1.EphemeralRunnerSet) err = k8sClient.Get(ctx, client.ObjectKey{Name: ephemeralRunnerSet.Name, Namespace: ephemeralRunnerSet.Namespace}, ers) Expect(err).NotTo(HaveOccurred(), "failed to get EphemeralRunnerSet") @@ -885,7 +884,7 @@ var _ = Describe("Test EphemeralRunnerSet controller", func() { err = k8sClient.Patch(ctx, updated, client.MergeFrom(ers)) Expect(err).NotTo(HaveOccurred(), "failed to update EphemeralRunnerSet") - runnerList = new(actionsv1alpha1.EphemeralRunnerList) + runnerList = new(v1alpha1.EphemeralRunnerList) Eventually( func() error { err := k8sClient.List(ctx, runnerList, client.InNamespace(ephemeralRunnerSet.Namespace)) @@ -911,7 +910,7 @@ var _ = Describe("Test EphemeralRunnerSet controller", func() { }) It("Should update status on Ephemeral Runner state changes", func() { - created := new(actionsv1alpha1.EphemeralRunnerSet) + created := new(v1alpha1.EphemeralRunnerSet) Eventually( func() error { return k8sClient.Get(ctx, client.ObjectKey{Name: ephemeralRunnerSet.Name, Namespace: ephemeralRunnerSet.Namespace}, created) @@ -926,7 +925,7 @@ var _ = Describe("Test EphemeralRunnerSet controller", func() { err := k8sClient.Update(ctx, updated) Expect(err).NotTo(HaveOccurred(), "failed to update EphemeralRunnerSet replica count") - runnerList := new(actionsv1alpha1.EphemeralRunnerList) + runnerList := new(v1alpha1.EphemeralRunnerList) Eventually( func() (bool, error) { err := k8sClient.List(ctx, runnerList, client.InNamespace(ephemeralRunnerSet.Namespace)) @@ -1036,7 +1035,7 @@ var _ = Describe("Test EphemeralRunnerSet controller", func() { Eventually( func() (int, error) { - runnerList = new(actionsv1alpha1.EphemeralRunnerList) + runnerList = new(v1alpha1.EphemeralRunnerList) err := k8sClient.List(ctx, runnerList, client.InNamespace(ephemeralRunnerSet.Namespace)) if err != nil { return -1, err @@ -1091,7 +1090,7 @@ var _ = Describe("Test EphemeralRunnerSet controller with proxy settings", func( var ctx context.Context var mgr ctrl.Manager var autoscalingNS *corev1.Namespace - var ephemeralRunnerSet *actionsv1alpha1.EphemeralRunnerSet + var ephemeralRunnerSet *v1alpha1.EphemeralRunnerSet var configSecret *corev1.Secret BeforeEach(func() { @@ -1126,14 +1125,14 @@ var _ = Describe("Test EphemeralRunnerSet controller with proxy settings", func( err := k8sClient.Create(ctx, secretCredentials) Expect(err).NotTo(HaveOccurred(), "failed to create secret credentials") - ephemeralRunnerSet = &actionsv1alpha1.EphemeralRunnerSet{ + ephemeralRunnerSet = &v1alpha1.EphemeralRunnerSet{ ObjectMeta: metav1.ObjectMeta{ Name: "test-asrs", Namespace: autoscalingNS.Name, }, - Spec: actionsv1alpha1.EphemeralRunnerSetSpec{ + Spec: v1alpha1.EphemeralRunnerSetSpec{ Replicas: 1, - EphemeralRunnerSpec: actionsv1alpha1.EphemeralRunnerSpec{ + EphemeralRunnerSpec: v1alpha1.EphemeralRunnerSpec{ GitHubConfigUrl: "http://example.com/owner/repo", GitHubConfigSecret: configSecret.Name, RunnerScaleSetId: 100, @@ -1193,7 +1192,7 @@ var _ = Describe("Test EphemeralRunnerSet controller with proxy settings", func( ).Should(Succeed(), "compiled / flattened proxy secret should exist") Eventually(func(g Gomega) { - runnerList := new(actionsv1alpha1.EphemeralRunnerList) + runnerList := new(v1alpha1.EphemeralRunnerList) err := k8sClient.List(ctx, runnerList, client.InNamespace(ephemeralRunnerSet.Namespace)) g.Expect(err).NotTo(HaveOccurred(), "failed to list EphemeralRunners") @@ -1211,7 +1210,7 @@ var _ = Describe("Test EphemeralRunnerSet controller with proxy settings", func( // Set pods to PodSucceeded to simulate an actual EphemeralRunner stopping Eventually( func(g Gomega) (int, error) { - runnerList := new(actionsv1alpha1.EphemeralRunnerList) + runnerList := new(v1alpha1.EphemeralRunnerList) err := k8sClient.List(ctx, runnerList, client.InNamespace(ephemeralRunnerSet.Namespace)) if err != nil { return -1, err @@ -1293,14 +1292,14 @@ var _ = Describe("Test EphemeralRunnerSet controller with proxy settings", func( proxy.Close() }) - ephemeralRunnerSet = &actionsv1alpha1.EphemeralRunnerSet{ + ephemeralRunnerSet = &v1alpha1.EphemeralRunnerSet{ ObjectMeta: metav1.ObjectMeta{ Name: "test-asrs", Namespace: autoscalingNS.Name, }, - Spec: actionsv1alpha1.EphemeralRunnerSetSpec{ + Spec: v1alpha1.EphemeralRunnerSetSpec{ Replicas: 1, - EphemeralRunnerSpec: actionsv1alpha1.EphemeralRunnerSpec{ + EphemeralRunnerSpec: v1alpha1.EphemeralRunnerSpec{ GitHubConfigUrl: "http://example.com/owner/repo", GitHubConfigSecret: configSecret.Name, RunnerScaleSetId: 100, @@ -1327,7 +1326,7 @@ var _ = Describe("Test EphemeralRunnerSet controller with proxy settings", func( err = k8sClient.Create(ctx, ephemeralRunnerSet) Expect(err).NotTo(HaveOccurred(), "failed to create EphemeralRunnerSet") - runnerList := new(actionsv1alpha1.EphemeralRunnerList) + runnerList := new(v1alpha1.EphemeralRunnerList) Eventually(func() (int, error) { err := k8sClient.List(ctx, runnerList, client.InNamespace(ephemeralRunnerSet.Namespace)) if err != nil { @@ -1346,7 +1345,7 @@ var _ = Describe("Test EphemeralRunnerSet controller with proxy settings", func( err = k8sClient.Status().Patch(ctx, runner, client.MergeFrom(&runnerList.Items[0])) Expect(err).NotTo(HaveOccurred(), "failed to update ephemeral runner status") - runnerSet := new(actionsv1alpha1.EphemeralRunnerSet) + runnerSet := new(v1alpha1.EphemeralRunnerSet) err = k8sClient.Get(ctx, client.ObjectKey{Namespace: ephemeralRunnerSet.Namespace, Name: ephemeralRunnerSet.Name}, runnerSet) Expect(err).NotTo(HaveOccurred(), "failed to get EphemeralRunnerSet") @@ -1369,7 +1368,7 @@ var _ = Describe("Test EphemeralRunnerSet controller with custom root CA", func( var ctx context.Context var mgr ctrl.Manager var autoscalingNS *corev1.Namespace - var ephemeralRunnerSet *actionsv1alpha1.EphemeralRunnerSet + var ephemeralRunnerSet *v1alpha1.EphemeralRunnerSet var configSecret *corev1.Secret var rootCAConfigMap *corev1.ConfigMap @@ -1431,17 +1430,17 @@ var _ = Describe("Test EphemeralRunnerSet controller with custom root CA", func( server.TLS = &tls.Config{Certificates: []tls.Certificate{cert}} server.StartTLS() - ephemeralRunnerSet = &actionsv1alpha1.EphemeralRunnerSet{ + ephemeralRunnerSet = &v1alpha1.EphemeralRunnerSet{ ObjectMeta: metav1.ObjectMeta{ Name: "test-asrs", Namespace: autoscalingNS.Name, }, - Spec: actionsv1alpha1.EphemeralRunnerSetSpec{ + Spec: v1alpha1.EphemeralRunnerSetSpec{ Replicas: 1, - EphemeralRunnerSpec: actionsv1alpha1.EphemeralRunnerSpec{ + EphemeralRunnerSpec: v1alpha1.EphemeralRunnerSpec{ GitHubConfigUrl: server.ConfigURLForOrg("my-org"), GitHubConfigSecret: configSecret.Name, - GitHubServerTLS: &actionsv1alpha1.GitHubServerTLSConfig{ + GitHubServerTLS: &v1alpha1.GitHubServerTLSConfig{ CertificateFrom: &v1alpha1.TLSCertificateSource{ ConfigMapKeyRef: &corev1.ConfigMapKeySelector{ LocalObjectReference: corev1.LocalObjectReference{ @@ -1469,7 +1468,7 @@ var _ = Describe("Test EphemeralRunnerSet controller with custom root CA", func( err = k8sClient.Create(ctx, ephemeralRunnerSet) Expect(err).NotTo(HaveOccurred(), "failed to create EphemeralRunnerSet") - runnerList := new(actionsv1alpha1.EphemeralRunnerList) + runnerList := new(v1alpha1.EphemeralRunnerList) Eventually(func() (int, error) { err := k8sClient.List(ctx, runnerList, client.InNamespace(ephemeralRunnerSet.Namespace)) if err != nil { @@ -1491,7 +1490,7 @@ var _ = Describe("Test EphemeralRunnerSet controller with custom root CA", func( err = k8sClient.Status().Patch(ctx, runner, client.MergeFrom(&runnerList.Items[0])) Expect(err).NotTo(HaveOccurred(), "failed to update ephemeral runner status") - currentRunnerSet := new(actionsv1alpha1.EphemeralRunnerSet) + currentRunnerSet := new(v1alpha1.EphemeralRunnerSet) err = k8sClient.Get(ctx, client.ObjectKey{Namespace: ephemeralRunnerSet.Namespace, Name: ephemeralRunnerSet.Name}, currentRunnerSet) Expect(err).NotTo(HaveOccurred(), "failed to get EphemeralRunnerSet") diff --git a/controllers/actions.github.com/helpers_test.go b/controllers/actions.github.com/helpers_test.go index 99f5d411..5594280f 100644 --- a/controllers/actions.github.com/helpers_test.go +++ b/controllers/actions.github.com/helpers_test.go @@ -18,6 +18,9 @@ const defaultGitHubToken = "gh_token" func startManagers(t ginkgo.GinkgoTInterface, first manager.Manager, others ...manager.Manager) { for _, mgr := range append([]manager.Manager{first}, others...) { + if err := SetupIndexers(mgr); err != nil { + t.Fatalf("failed to setup indexers: %v", err) + } ctx, cancel := context.WithCancel(context.Background()) g, ctx := errgroup.WithContext(ctx) diff --git a/controllers/actions.github.com/indexer.go b/controllers/actions.github.com/indexer.go new file mode 100644 index 00000000..466c9f14 --- /dev/null +++ b/controllers/actions.github.com/indexer.go @@ -0,0 +1,71 @@ +package actionsgithubcom + +import ( + "context" + "slices" + + v1alpha1 "github.com/actions/actions-runner-controller/apis/actions.github.com/v1alpha1" + corev1 "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + ctrl "sigs.k8s.io/controller-runtime" + "sigs.k8s.io/controller-runtime/pkg/client" +) + +func SetupIndexers(mgr ctrl.Manager) error { + if err := mgr.GetFieldIndexer().IndexField( + context.Background(), + &corev1.Pod{}, + resourceOwnerKey, + newGroupVersionOwnerKindIndexer("AutoscalingListener", "EphemeralRunner"), + ); err != nil { + return err + } + + if err := mgr.GetFieldIndexer().IndexField( + context.Background(), + &corev1.ServiceAccount{}, + resourceOwnerKey, + newGroupVersionOwnerKindIndexer("AutoscalingListener"), + ); err != nil { + return err + } + + if err := mgr.GetFieldIndexer().IndexField( + context.Background(), + &v1alpha1.EphemeralRunnerSet{}, + resourceOwnerKey, + newGroupVersionOwnerKindIndexer("AutoscalingRunnerSet"), + ); err != nil { + return err + } + + if err := mgr.GetFieldIndexer().IndexField( + context.Background(), + &v1alpha1.EphemeralRunner{}, + resourceOwnerKey, + newGroupVersionOwnerKindIndexer("EphemeralRunnerSet"), + ); err != nil { + return err + } + + return nil +} + +func newGroupVersionOwnerKindIndexer(ownerKind string, otherOwnerKinds ...string) client.IndexerFunc { + owners := append([]string{ownerKind}, otherOwnerKinds...) + return func(o client.Object) []string { + groupVersion := v1alpha1.GroupVersion.String() + owner := metav1.GetControllerOfNoCopy(o) + if owner == nil { + return nil + } + + // ...make sure it is owned by this controller + if owner.APIVersion != groupVersion || !slices.Contains(owners, owner.Kind) { + return nil + } + + // ...and if so, return it + return []string{owner.Name} + } +} diff --git a/controllers/actions.github.com/resourcebuilder.go b/controllers/actions.github.com/resourcebuilder.go index f6e54b29..49bdcac0 100644 --- a/controllers/actions.github.com/resourcebuilder.go +++ b/controllers/actions.github.com/resourcebuilder.go @@ -85,13 +85,13 @@ func (b *resourceBuilder) newAutoScalingListener(autoscalingRunnerSet *v1alpha1. effectiveMinRunners = *autoscalingRunnerSet.Spec.MinRunners } - labels := map[string]string{ + labels := mergeLabels(autoscalingRunnerSet.Labels, map[string]string{ LabelKeyGitHubScaleSetNamespace: autoscalingRunnerSet.Namespace, LabelKeyGitHubScaleSetName: autoscalingRunnerSet.Name, LabelKeyKubernetesPartOf: labelValueKubernetesPartOf, LabelKeyKubernetesComponent: "runner-scale-set-listener", LabelKeyKubernetesVersion: autoscalingRunnerSet.Labels[LabelKeyKubernetesVersion], - } + }) annotations := map[string]string{ annotationKeyRunnerSpecHash: autoscalingRunnerSet.ListenerSpecHash(), @@ -411,10 +411,10 @@ func (b *resourceBuilder) newScaleSetListenerServiceAccount(autoscalingListener ObjectMeta: metav1.ObjectMeta{ Name: scaleSetListenerServiceAccountName(autoscalingListener), Namespace: autoscalingListener.Namespace, - Labels: map[string]string{ + Labels: mergeLabels(autoscalingListener.Labels, map[string]string{ LabelKeyGitHubScaleSetNamespace: autoscalingListener.Spec.AutoscalingRunnerSetNamespace, LabelKeyGitHubScaleSetName: autoscalingListener.Spec.AutoscalingRunnerSetName, - }, + }), }, } } @@ -426,13 +426,13 @@ func (b *resourceBuilder) newScaleSetListenerRole(autoscalingListener *v1alpha1. ObjectMeta: metav1.ObjectMeta{ Name: scaleSetListenerRoleName(autoscalingListener), Namespace: autoscalingListener.Spec.AutoscalingRunnerSetNamespace, - Labels: map[string]string{ + Labels: mergeLabels(autoscalingListener.Labels, map[string]string{ LabelKeyGitHubScaleSetNamespace: autoscalingListener.Spec.AutoscalingRunnerSetNamespace, LabelKeyGitHubScaleSetName: autoscalingListener.Spec.AutoscalingRunnerSetName, labelKeyListenerNamespace: autoscalingListener.Namespace, labelKeyListenerName: autoscalingListener.Name, "role-policy-rules-hash": rulesHash, - }, + }), }, Rules: rules, } @@ -460,14 +460,14 @@ func (b *resourceBuilder) newScaleSetListenerRoleBinding(autoscalingListener *v1 ObjectMeta: metav1.ObjectMeta{ Name: scaleSetListenerRoleName(autoscalingListener), Namespace: autoscalingListener.Spec.AutoscalingRunnerSetNamespace, - Labels: map[string]string{ + Labels: mergeLabels(autoscalingListener.Labels, map[string]string{ LabelKeyGitHubScaleSetNamespace: autoscalingListener.Spec.AutoscalingRunnerSetNamespace, LabelKeyGitHubScaleSetName: autoscalingListener.Spec.AutoscalingRunnerSetName, labelKeyListenerNamespace: autoscalingListener.Namespace, labelKeyListenerName: autoscalingListener.Name, "role-binding-role-ref-hash": roleRefHash, "role-binding-subject-hash": subjectHash, - }, + }), }, RoleRef: roleRef, Subjects: subjects, @@ -483,11 +483,11 @@ func (b *resourceBuilder) newScaleSetListenerSecretMirror(autoscalingListener *v ObjectMeta: metav1.ObjectMeta{ Name: scaleSetListenerSecretMirrorName(autoscalingListener), Namespace: autoscalingListener.Namespace, - Labels: map[string]string{ + Labels: mergeLabels(autoscalingListener.Labels, map[string]string{ LabelKeyGitHubScaleSetNamespace: autoscalingListener.Spec.AutoscalingRunnerSetNamespace, LabelKeyGitHubScaleSetName: autoscalingListener.Spec.AutoscalingRunnerSetName, "secret-data-hash": dataHash, - }, + }), }, Data: secret.DeepCopy().Data, } @@ -502,13 +502,13 @@ func (b *resourceBuilder) newEphemeralRunnerSet(autoscalingRunnerSet *v1alpha1.A } runnerSpecHash := autoscalingRunnerSet.RunnerSetSpecHash() - labels := map[string]string{ + labels := mergeLabels(autoscalingRunnerSet.Labels, map[string]string{ LabelKeyKubernetesPartOf: labelValueKubernetesPartOf, LabelKeyKubernetesComponent: "runner-set", LabelKeyKubernetesVersion: autoscalingRunnerSet.Labels[LabelKeyKubernetesVersion], LabelKeyGitHubScaleSetName: autoscalingRunnerSet.Name, LabelKeyGitHubScaleSetNamespace: autoscalingRunnerSet.Namespace, - } + }) if err := applyGitHubURLLabels(autoscalingRunnerSet.Spec.GitHubConfigUrl, labels); err != nil { return nil, fmt.Errorf("failed to apply GitHub URL labels: %v", err) @@ -547,18 +547,14 @@ func (b *resourceBuilder) newEphemeralRunnerSet(autoscalingRunnerSet *v1alpha1.A func (b *resourceBuilder) newEphemeralRunner(ephemeralRunnerSet *v1alpha1.EphemeralRunnerSet) *v1alpha1.EphemeralRunner { labels := make(map[string]string) - for _, key := range commonLabelKeys { - switch key { - case LabelKeyKubernetesComponent: - labels[key] = "runner" - default: - v, ok := ephemeralRunnerSet.Labels[key] - if !ok { - continue - } - labels[key] = v + for k, v := range ephemeralRunnerSet.Labels { + if k == LabelKeyKubernetesComponent { + labels[k] = "runner" + } else { + labels[k] = v } } + annotations := make(map[string]string) for key, val := range ephemeralRunnerSet.Annotations { annotations[key] = val @@ -751,3 +747,17 @@ func trimLabelValue(val string) string { } return val } + +func mergeLabels(base, overwrite map[string]string) map[string]string { + mergedLabels := map[string]string{} + + for k, v := range base { + mergedLabels[k] = v + } + + for k, v := range overwrite { + mergedLabels[k] = v + } + + return mergedLabels +} diff --git a/controllers/actions.github.com/resourcebuilder_test.go b/controllers/actions.github.com/resourcebuilder_test.go index 9039de95..52ab19b4 100644 --- a/controllers/actions.github.com/resourcebuilder_test.go +++ b/controllers/actions.github.com/resourcebuilder_test.go @@ -21,6 +21,7 @@ func TestLabelPropagation(t *testing.T) { Labels: map[string]string{ LabelKeyKubernetesPartOf: labelValueKubernetesPartOf, LabelKeyKubernetesVersion: "0.2.0", + "arbitrary-label": "random-value", }, Annotations: map[string]string{ runnerScaleSetIdAnnotationKey: "1", @@ -47,6 +48,7 @@ func TestLabelPropagation(t *testing.T) { assert.Equal(t, "repo", ephemeralRunnerSet.Labels[LabelKeyGitHubRepository]) assert.Equal(t, autoscalingRunnerSet.Annotations[AnnotationKeyGitHubRunnerGroupName], ephemeralRunnerSet.Annotations[AnnotationKeyGitHubRunnerGroupName]) assert.Equal(t, autoscalingRunnerSet.Annotations[AnnotationKeyGitHubRunnerScaleSetName], ephemeralRunnerSet.Annotations[AnnotationKeyGitHubRunnerScaleSetName]) + assert.Equal(t, autoscalingRunnerSet.Labels["arbitrary-label"], ephemeralRunnerSet.Labels["arbitrary-label"]) listener, err := b.newAutoScalingListener(&autoscalingRunnerSet, ephemeralRunnerSet, autoscalingRunnerSet.Namespace, "test:latest", nil) require.NoError(t, err) @@ -59,6 +61,7 @@ func TestLabelPropagation(t *testing.T) { assert.Equal(t, "", listener.Labels[LabelKeyGitHubEnterprise]) assert.Equal(t, "org", listener.Labels[LabelKeyGitHubOrganization]) assert.Equal(t, "repo", listener.Labels[LabelKeyGitHubRepository]) + assert.Equal(t, autoscalingRunnerSet.Labels["arbitrary-label"], listener.Labels["arbitrary-label"]) listenerServiceAccount := &corev1.ServiceAccount{ ObjectMeta: metav1.ObjectMeta{ diff --git a/docs/gha-runner-scale-set-controller/README.md b/docs/gha-runner-scale-set-controller/README.md index f9044acf..f7a353f0 100644 --- a/docs/gha-runner-scale-set-controller/README.md +++ b/docs/gha-runner-scale-set-controller/README.md @@ -43,6 +43,14 @@ You can follow [this troubleshooting guide](https://docs.github.com/en/actions/h ## Changelog +### v0.9.2 + +1. Refresh session if token expires during delete message [#3529](https://github.com/actions/actions-runner-controller/pull/3529) +1. Re-use the last desired patch on empty batch [#3453](https://github.com/actions/actions-runner-controller/pull/3453) +1. Extract single place to set up indexers [#3454](https://github.com/actions/actions-runner-controller/pull/3454) +1. Include controller version in logs [#3473](https://github.com/actions/actions-runner-controller/pull/3473) +1. Propogate arbitrary labels from runnersets to all created resources [#3157](https://github.com/actions/actions-runner-controller/pull/3157) + ### v0.9.1 #### Major changes diff --git a/go.mod b/go.mod index 49969c6c..74a42a3d 100644 --- a/go.mod +++ b/go.mod @@ -18,16 +18,16 @@ require ( github.com/kelseyhightower/envconfig v1.4.0 github.com/onsi/ginkgo v1.16.5 github.com/onsi/ginkgo/v2 v2.17.1 - github.com/onsi/gomega v1.30.0 + github.com/onsi/gomega v1.33.0 github.com/pkg/errors v0.9.1 github.com/prometheus/client_golang v1.17.0 github.com/stretchr/testify v1.9.0 github.com/teambition/rrule-go v1.8.2 go.uber.org/multierr v1.11.0 - go.uber.org/zap v1.26.0 + go.uber.org/zap v1.27.0 golang.org/x/net v0.24.0 - golang.org/x/oauth2 v0.15.0 - golang.org/x/sync v0.6.0 + golang.org/x/oauth2 v0.19.0 + golang.org/x/sync v0.7.0 gomodules.xyz/jsonpatch/v2 v2.4.0 gopkg.in/yaml.v2 v2.4.0 k8s.io/api v0.28.4 diff --git a/go.sum b/go.sum index a01084cd..f1dd2cc9 100644 --- a/go.sum +++ b/go.sum @@ -173,8 +173,8 @@ github.com/onsi/ginkgo/v2 v2.17.1 h1:V++EzdbhI4ZV4ev0UTIj0PzhzOcReJFyJaLjtSF55M8 github.com/onsi/ginkgo/v2 v2.17.1/go.mod h1:llBI3WDLL9Z6taip6f33H76YcWtJv+7R3HigUjbIBOs= github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= -github.com/onsi/gomega v1.30.0 h1:hvMK7xYz4D3HapigLTeGdId/NcfQx1VHMJc60ew99+8= -github.com/onsi/gomega v1.30.0/go.mod h1:9sxs+SwGrKI0+PWe4Fxa9tFQQBG5xSsSbMXOI8PPpoQ= +github.com/onsi/gomega v1.33.0 h1:snPCflnZrpMsy94p4lXVEkHo12lmPnc3vY5XBbreexE= +github.com/onsi/gomega v1.33.0/go.mod h1:+925n5YtiFsLzzafLUHzVMBpvvRAzrydIBiSIxjX3wY= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= @@ -221,12 +221,12 @@ github.com/urfave/cli v1.22.2/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtX github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= -go.uber.org/goleak v1.2.1 h1:NBol2c7O1ZokfZ0LEU9K6Whx/KnwvepVetCUhtKja4A= -go.uber.org/goleak v1.2.1/go.mod h1:qlT2yGI9QafXHhZZLxlSuNsMw3FFLxBr+tBRlmO1xH4= +go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= +go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= -go.uber.org/zap v1.26.0 h1:sI7k6L95XOKS281NhVKOFCUNIvv9e0w4BF8N3u+tCRo= -go.uber.org/zap v1.26.0/go.mod h1:dtElttAiwGvoJ/vj4IwHBS/gXsEu/pZ50mUIRWuG0so= +go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= +go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= @@ -255,16 +255,16 @@ golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= golang.org/x/net v0.24.0 h1:1PcaxkF854Fu3+lvBIx5SYn9wRlBzzcnHZSiaFFAb0w= golang.org/x/net v0.24.0/go.mod h1:2Q7sJY5mzlzWjKtYUEXSlBWCdyaioyXzRB2RtU8KVE8= -golang.org/x/oauth2 v0.15.0 h1:s8pnnxNVzjWyrvYdFUQq5llS1PX2zhPXmccZv99h7uQ= -golang.org/x/oauth2 v0.15.0/go.mod h1:q48ptWNTY5XWf+JNten23lcvHpLJ0ZSxF5ttTHKVCAM= +golang.org/x/oauth2 v0.19.0 h1:9+E/EZBCbTLNrbN35fHv/a/d/mOBatymz1zbtQrXpIg= +golang.org/x/oauth2 v0.19.0/go.mod h1:vYi7skDa1x015PmRRYZ7+s1cWyPgrPiSYRe4rnsexc8= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.6.0 h1:5BMeUDZ7vkXGfEr1x9B4bRcTH4lpkTkpdh0T/J+qjbQ= -golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M= +golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= diff --git a/main.go b/main.go index 284920da..3392377c 100644 --- a/main.go +++ b/main.go @@ -239,6 +239,10 @@ func main() { } if autoScalingRunnerSetOnly { + if err := actionsgithubcom.SetupIndexers(mgr); err != nil { + log.Error(err, "unable to setup indexers") + os.Exit(1) + } managerImage := os.Getenv("CONTROLLER_MANAGER_CONTAINER_IMAGE") if managerImage == "" { log.Error(err, "unable to obtain listener image") @@ -256,7 +260,7 @@ func main() { if err = (&actionsgithubcom.AutoscalingRunnerSetReconciler{ Client: mgr.GetClient(), - Log: log.WithName("AutoscalingRunnerSet"), + Log: log.WithName("AutoscalingRunnerSet").WithValues("version", build.Version), Scheme: mgr.GetScheme(), ControllerNamespace: managerNamespace, DefaultRunnerScaleSetListenerImage: managerImage, @@ -270,7 +274,7 @@ func main() { if err = (&actionsgithubcom.EphemeralRunnerReconciler{ Client: mgr.GetClient(), - Log: log.WithName("EphemeralRunner"), + Log: log.WithName("EphemeralRunner").WithValues("version", build.Version), Scheme: mgr.GetScheme(), ActionsClient: actionsMultiClient, }).SetupWithManager(mgr); err != nil { @@ -280,7 +284,7 @@ func main() { if err = (&actionsgithubcom.EphemeralRunnerSetReconciler{ Client: mgr.GetClient(), - Log: log.WithName("EphemeralRunnerSet"), + Log: log.WithName("EphemeralRunnerSet").WithValues("version", build.Version), Scheme: mgr.GetScheme(), ActionsClient: actionsMultiClient, PublishMetrics: metricsAddr != "0", @@ -291,7 +295,7 @@ func main() { if err = (&actionsgithubcom.AutoscalingListenerReconciler{ Client: mgr.GetClient(), - Log: log.WithName("AutoscalingListener"), + Log: log.WithName("AutoscalingListener").WithValues("version", build.Version), Scheme: mgr.GetScheme(), ListenerMetricsAddr: listenerMetricsAddr, ListenerMetricsEndpoint: listenerMetricsEndpoint, @@ -441,7 +445,7 @@ func main() { } } - log.Info("starting manager") + log.Info("starting manager", "version", build.Version) if err := mgr.Start(ctrl.SetupSignalHandler()); err != nil { log.Error(err, "problem running manager") os.Exit(1) diff --git a/runner/Makefile b/runner/Makefile index 06942fb9..26ece35c 100644 --- a/runner/Makefile +++ b/runner/Makefile @@ -6,7 +6,7 @@ DIND_ROOTLESS_RUNNER_NAME ?= ${DOCKER_USER}/actions-runner-dind-rootless OS_IMAGE ?= ubuntu-22.04 TARGETPLATFORM ?= $(shell arch) -RUNNER_VERSION ?= 2.315.0 +RUNNER_VERSION ?= 2.316.1 RUNNER_CONTAINER_HOOKS_VERSION ?= 0.6.0 DOCKER_VERSION ?= 24.0.7 diff --git a/runner/VERSION b/runner/VERSION index b7ab93f4..f62551d8 100644 --- a/runner/VERSION +++ b/runner/VERSION @@ -1,2 +1,2 @@ -RUNNER_VERSION=2.315.0 +RUNNER_VERSION=2.316.1 RUNNER_CONTAINER_HOOKS_VERSION=0.6.0 \ No newline at end of file diff --git a/test/e2e/e2e_test.go b/test/e2e/e2e_test.go index 1863fe2e..12173fa5 100644 --- a/test/e2e/e2e_test.go +++ b/test/e2e/e2e_test.go @@ -36,7 +36,7 @@ var ( testResultCMNamePrefix = "test-result-" - RunnerVersion = "2.315.0" + RunnerVersion = "2.316.1" RunnerContainerHooksVersion = "0.6.0" )