Skip to content

Commit 057a1e7

Browse files
authored
gha: make MaxConcurrentReconciles for each reconciler configurable (#1)
1 parent 490b569 commit 057a1e7

11 files changed

Lines changed: 119 additions & 54 deletions

charts/gha-runner-scale-set-controller/templates/deployment.yaml

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,18 @@ spec:
8282
{{- range .Values.flags.excludeLabelPropagationPrefixes }}
8383
- "--exclude-label-propagation-prefix={{ . }}"
8484
{{- end }}
85+
{{- with .Values.flags.maxConcurrentReconcilesForAutoscalingRunnerSet }}
86+
- "--max-concurrent-reconciles-for-autoscaling-runner-set={{ . }}"
87+
{{- end }}
88+
{{- with .Values.flags.maxConcurrentReconcilesForEphemeralRunnerSet }}
89+
- "--max-concurrent-reconciles-for-ephemeral-runner-set={{ . }}"
90+
{{- end }}
91+
{{- with .Values.flags.maxConcurrentReconcilesForEphemeralRunner }}
92+
- "--max-concurrent-reconciles-for-ephemeral-runner={{ . }}"
93+
{{- end }}
94+
{{- with .Values.flags.maxConcurrentReconcilesForAutoscalingListener }}
95+
- "--max-concurrent-reconciles-for-autoscaling-listener={{ . }}"
96+
{{- end }}
8597
command:
8698
- "/manager"
8799
{{- with .Values.metrics }}

charts/gha-runner-scale-set-controller/values.yaml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -130,3 +130,9 @@ flags:
130130
## Labels that match prefix specified in the list are excluded from propagation.
131131
# excludeLabelPropagationPrefixes:
132132
# - "argocd.argoproj.io/instance"
133+
134+
## Defines the maximum number of concurrent reconciles for each reconciler.
135+
# maxConcurrentReconcilesForAutoscalingRunnerSet: 1
136+
# maxConcurrentReconcilesForEphemeralRunnerSet: 1
137+
# maxConcurrentReconcilesForEphemeralRunner: 1
138+
# maxConcurrentReconcilesForAutoscalingListener: 1

controllers/actions.github.com/autoscalinglistener_controller.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ import (
2626
"k8s.io/apimachinery/pkg/types"
2727
ctrl "sigs.k8s.io/controller-runtime"
2828
"sigs.k8s.io/controller-runtime/pkg/client"
29+
"sigs.k8s.io/controller-runtime/pkg/controller"
2930
"sigs.k8s.io/controller-runtime/pkg/controller/controllerutil"
3031
"sigs.k8s.io/controller-runtime/pkg/handler"
3132
"sigs.k8s.io/controller-runtime/pkg/predicate"
@@ -55,6 +56,8 @@ type AutoscalingListenerReconciler struct {
5556
ListenerMetricsAddr string
5657
ListenerMetricsEndpoint string
5758

59+
MaxConcurrentReconciles int
60+
5861
ResourceBuilder
5962
}
6063

@@ -730,6 +733,7 @@ func (r *AutoscalingListenerReconciler) SetupWithManager(mgr ctrl.Manager) error
730733
Watches(&rbacv1.Role{}, handler.EnqueueRequestsFromMapFunc(labelBasedWatchFunc)).
731734
Watches(&rbacv1.RoleBinding{}, handler.EnqueueRequestsFromMapFunc(labelBasedWatchFunc)).
732735
WithEventFilter(predicate.ResourceVersionChangedPredicate{}).
736+
WithOptions(controller.Options{MaxConcurrentReconciles: r.MaxConcurrentReconciles}).
733737
Complete(r)
734738
}
735739

controllers/actions.github.com/autoscalinglistener_controller_test.go

Lines changed: 20 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -44,9 +44,10 @@ var _ = Describe("Test AutoScalingListener controller", func() {
4444
configSecret = createDefaultSecret(GinkgoT(), k8sClient, autoscalingNS.Name)
4545

4646
controller := &AutoscalingListenerReconciler{
47-
Client: mgr.GetClient(),
48-
Scheme: mgr.GetScheme(),
49-
Log: logf.Log,
47+
Client: mgr.GetClient(),
48+
Scheme: mgr.GetScheme(),
49+
Log: logf.Log,
50+
MaxConcurrentReconciles: 1,
5051
}
5152
err := controller.SetupWithManager(mgr)
5253
Expect(err).NotTo(HaveOccurred(), "failed to setup controller")
@@ -508,9 +509,10 @@ var _ = Describe("Test AutoScalingListener customization", func() {
508509
configSecret = createDefaultSecret(GinkgoT(), k8sClient, autoscalingNS.Name)
509510

510511
controller := &AutoscalingListenerReconciler{
511-
Client: mgr.GetClient(),
512-
Scheme: mgr.GetScheme(),
513-
Log: logf.Log,
512+
Client: mgr.GetClient(),
513+
Scheme: mgr.GetScheme(),
514+
Log: logf.Log,
515+
MaxConcurrentReconciles: 1,
514516
}
515517
err := controller.SetupWithManager(mgr)
516518
Expect(err).NotTo(HaveOccurred(), "failed to setup controller")
@@ -782,9 +784,10 @@ var _ = Describe("Test AutoScalingListener controller with proxy", func() {
782784
configSecret = createDefaultSecret(GinkgoT(), k8sClient, autoscalingNS.Name)
783785

784786
controller := &AutoscalingListenerReconciler{
785-
Client: mgr.GetClient(),
786-
Scheme: mgr.GetScheme(),
787-
Log: logf.Log,
787+
Client: mgr.GetClient(),
788+
Scheme: mgr.GetScheme(),
789+
Log: logf.Log,
790+
MaxConcurrentReconciles: 1,
788791
}
789792
err := controller.SetupWithManager(mgr)
790793
Expect(err).NotTo(HaveOccurred(), "failed to setup controller")
@@ -978,9 +981,10 @@ var _ = Describe("Test AutoScalingListener controller with template modification
978981
configSecret = createDefaultSecret(GinkgoT(), k8sClient, autoscalingNS.Name)
979982

980983
controller := &AutoscalingListenerReconciler{
981-
Client: mgr.GetClient(),
982-
Scheme: mgr.GetScheme(),
983-
Log: logf.Log,
984+
Client: mgr.GetClient(),
985+
Scheme: mgr.GetScheme(),
986+
Log: logf.Log,
987+
MaxConcurrentReconciles: 1,
984988
}
985989
err := controller.SetupWithManager(mgr)
986990
Expect(err).NotTo(HaveOccurred(), "failed to setup controller")
@@ -1094,9 +1098,10 @@ var _ = Describe("Test GitHub Server TLS configuration", func() {
10941098
Expect(err).NotTo(HaveOccurred(), "failed to create configmap with root CAs")
10951099

10961100
controller := &AutoscalingListenerReconciler{
1097-
Client: mgr.GetClient(),
1098-
Scheme: mgr.GetScheme(),
1099-
Log: logf.Log,
1101+
Client: mgr.GetClient(),
1102+
Scheme: mgr.GetScheme(),
1103+
Log: logf.Log,
1104+
MaxConcurrentReconciles: 1,
11001105
}
11011106
err = controller.SetupWithManager(mgr)
11021107
Expect(err).NotTo(HaveOccurred(), "failed to setup controller")

controllers/actions.github.com/autoscalingrunnerset_controller.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ import (
3434
"k8s.io/apimachinery/pkg/types"
3535
ctrl "sigs.k8s.io/controller-runtime"
3636
"sigs.k8s.io/controller-runtime/pkg/client"
37+
"sigs.k8s.io/controller-runtime/pkg/controller"
3738
"sigs.k8s.io/controller-runtime/pkg/controller/controllerutil"
3839
"sigs.k8s.io/controller-runtime/pkg/handler"
3940
"sigs.k8s.io/controller-runtime/pkg/predicate"
@@ -79,6 +80,7 @@ type AutoscalingRunnerSetReconciler struct {
7980
DefaultRunnerScaleSetListenerImagePullSecrets []string
8081
UpdateStrategy UpdateStrategy
8182
ActionsClient actions.MultiClient
83+
MaxConcurrentReconciles int
8284
ResourceBuilder
8385
}
8486

@@ -763,6 +765,7 @@ func (r *AutoscalingRunnerSetReconciler) SetupWithManager(mgr ctrl.Manager) erro
763765
},
764766
)).
765767
WithEventFilter(predicate.ResourceVersionChangedPredicate{}).
768+
WithOptions(controller.Options{MaxConcurrentReconciles: r.MaxConcurrentReconciles}).
766769
Complete(r)
767770
}
768771

controllers/actions.github.com/autoscalingrunnerset_controller_test.go

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,7 @@ var _ = Describe("Test AutoScalingRunnerSet controller", Ordered, func() {
7171
ControllerNamespace: autoscalingNS.Name,
7272
DefaultRunnerScaleSetListenerImage: "ghcr.io/actions/arc",
7373
ActionsClient: fake.NewMultiClient(),
74+
MaxConcurrentReconciles: 1,
7475
}
7576
err := controller.SetupWithManager(mgr)
7677
Expect(err).NotTo(HaveOccurred(), "failed to setup controller")
@@ -704,6 +705,7 @@ var _ = Describe("Test AutoScalingController updates", Ordered, func() {
704705
nil,
705706
),
706707
),
708+
MaxConcurrentReconciles: 1,
707709
}
708710
err := controller.SetupWithManager(mgr)
709711
Expect(err).NotTo(HaveOccurred(), "failed to setup controller")
@@ -819,6 +821,7 @@ var _ = Describe("Test AutoscalingController creation failures", Ordered, func()
819821
ControllerNamespace: autoscalingNS.Name,
820822
DefaultRunnerScaleSetListenerImage: "ghcr.io/actions/arc",
821823
ActionsClient: fake.NewMultiClient(),
824+
MaxConcurrentReconciles: 1,
822825
}
823826
err := controller.SetupWithManager(mgr)
824827
Expect(err).NotTo(HaveOccurred(), "failed to setup controller")
@@ -945,6 +948,7 @@ var _ = Describe("Test client optional configuration", Ordered, func() {
945948
ControllerNamespace: autoscalingNS.Name,
946949
DefaultRunnerScaleSetListenerImage: "ghcr.io/actions/arc",
947950
ActionsClient: actions.NewMultiClient(logr.Discard()),
951+
MaxConcurrentReconciles: 1,
948952
}
949953

950954
err := controller.SetupWithManager(mgr)
@@ -1128,6 +1132,7 @@ var _ = Describe("Test client optional configuration", Ordered, func() {
11281132
ControllerNamespace: autoscalingNS.Name,
11291133
DefaultRunnerScaleSetListenerImage: "ghcr.io/actions/arc",
11301134
ActionsClient: fake.NewMultiClient(),
1135+
MaxConcurrentReconciles: 1,
11311136
}
11321137
err = controller.SetupWithManager(mgr)
11331138
Expect(err).NotTo(HaveOccurred(), "failed to setup controller")
@@ -1362,6 +1367,7 @@ var _ = Describe("Test external permissions cleanup", Ordered, func() {
13621367
ControllerNamespace: autoscalingNS.Name,
13631368
DefaultRunnerScaleSetListenerImage: "ghcr.io/actions/arc",
13641369
ActionsClient: fake.NewMultiClient(),
1370+
MaxConcurrentReconciles: 1,
13651371
}
13661372
err := controller.SetupWithManager(mgr)
13671373
Expect(err).NotTo(HaveOccurred(), "failed to setup controller")
@@ -1520,6 +1526,7 @@ var _ = Describe("Test external permissions cleanup", Ordered, func() {
15201526
ControllerNamespace: autoscalingNS.Name,
15211527
DefaultRunnerScaleSetListenerImage: "ghcr.io/actions/arc",
15221528
ActionsClient: fake.NewMultiClient(),
1529+
MaxConcurrentReconciles: 1,
15231530
}
15241531
err := controller.SetupWithManager(mgr)
15251532
Expect(err).NotTo(HaveOccurred(), "failed to setup controller")
@@ -1728,6 +1735,7 @@ var _ = Describe("Test resource version and build version mismatch", func() {
17281735
ControllerNamespace: autoscalingNS.Name,
17291736
DefaultRunnerScaleSetListenerImage: "ghcr.io/actions/arc",
17301737
ActionsClient: fake.NewMultiClient(),
1738+
MaxConcurrentReconciles: 1,
17311739
}
17321740
err := controller.SetupWithManager(mgr)
17331741
Expect(err).NotTo(HaveOccurred(), "failed to setup controller")

controllers/actions.github.com/ephemeralrunner_controller.go

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ import (
3333
"k8s.io/apimachinery/pkg/types"
3434
ctrl "sigs.k8s.io/controller-runtime"
3535
"sigs.k8s.io/controller-runtime/pkg/client"
36+
"sigs.k8s.io/controller-runtime/pkg/controller"
3637
"sigs.k8s.io/controller-runtime/pkg/controller/controllerutil"
3738
"sigs.k8s.io/controller-runtime/pkg/predicate"
3839
)
@@ -49,9 +50,10 @@ const (
4950
// EphemeralRunnerReconciler reconciles a EphemeralRunner object
5051
type EphemeralRunnerReconciler struct {
5152
client.Client
52-
Log logr.Logger
53-
Scheme *runtime.Scheme
54-
ActionsClient actions.MultiClient
53+
Log logr.Logger
54+
Scheme *runtime.Scheme
55+
ActionsClient actions.MultiClient
56+
MaxConcurrentReconciles int
5557
ResourceBuilder
5658
}
5759

@@ -828,6 +830,7 @@ func (r *EphemeralRunnerReconciler) SetupWithManager(mgr ctrl.Manager) error {
828830
For(&v1alpha1.EphemeralRunner{}).
829831
Owns(&corev1.Pod{}).
830832
WithEventFilter(predicate.ResourceVersionChangedPredicate{}).
833+
WithOptions(controller.Options{MaxConcurrentReconciles: r.MaxConcurrentReconciles}).
831834
Complete(r)
832835
}
833836

controllers/actions.github.com/ephemeralrunner_controller_test.go

Lines changed: 16 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -101,10 +101,11 @@ var _ = Describe("EphemeralRunner", func() {
101101
configSecret = createDefaultSecret(GinkgoT(), k8sClient, autoscalingNS.Name)
102102

103103
controller = &EphemeralRunnerReconciler{
104-
Client: mgr.GetClient(),
105-
Scheme: mgr.GetScheme(),
106-
Log: logf.Log,
107-
ActionsClient: fake.NewMultiClient(),
104+
Client: mgr.GetClient(),
105+
Scheme: mgr.GetScheme(),
106+
Log: logf.Log,
107+
ActionsClient: fake.NewMultiClient(),
108+
MaxConcurrentReconciles: 1,
108109
}
109110

110111
err := controller.SetupWithManager(mgr)
@@ -681,6 +682,7 @@ var _ = Describe("EphemeralRunner", func() {
681682
nil,
682683
),
683684
),
685+
MaxConcurrentReconciles: 1,
684686
}
685687
err := controller.SetupWithManager(mgr)
686688
Expect(err).To(BeNil(), "failed to setup controller")
@@ -737,10 +739,11 @@ var _ = Describe("EphemeralRunner", func() {
737739
configSecret = createDefaultSecret(GinkgoT(), k8sClient, autoScalingNS.Name)
738740

739741
controller = &EphemeralRunnerReconciler{
740-
Client: mgr.GetClient(),
741-
Scheme: mgr.GetScheme(),
742-
Log: logf.Log,
743-
ActionsClient: fake.NewMultiClient(),
742+
Client: mgr.GetClient(),
743+
Scheme: mgr.GetScheme(),
744+
Log: logf.Log,
745+
ActionsClient: fake.NewMultiClient(),
746+
MaxConcurrentReconciles: 1,
744747
}
745748
err := controller.SetupWithManager(mgr)
746749
Expect(err).To(BeNil(), "failed to setup controller")
@@ -901,10 +904,11 @@ var _ = Describe("EphemeralRunner", func() {
901904
Expect(err).NotTo(HaveOccurred(), "failed to create configmap with root CAs")
902905

903906
controller = &EphemeralRunnerReconciler{
904-
Client: mgr.GetClient(),
905-
Scheme: mgr.GetScheme(),
906-
Log: logf.Log,
907-
ActionsClient: fake.NewMultiClient(),
907+
Client: mgr.GetClient(),
908+
Scheme: mgr.GetScheme(),
909+
Log: logf.Log,
910+
ActionsClient: fake.NewMultiClient(),
911+
MaxConcurrentReconciles: 1,
908912
}
909913

910914
err = controller.SetupWithManager(mgr)

controllers/actions.github.com/ephemeralrunnerset_controller.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ import (
3636
"k8s.io/apimachinery/pkg/types"
3737
ctrl "sigs.k8s.io/controller-runtime"
3838
"sigs.k8s.io/controller-runtime/pkg/client"
39+
"sigs.k8s.io/controller-runtime/pkg/controller"
3940
"sigs.k8s.io/controller-runtime/pkg/controller/controllerutil"
4041
"sigs.k8s.io/controller-runtime/pkg/predicate"
4142
)
@@ -53,6 +54,8 @@ type EphemeralRunnerSetReconciler struct {
5354

5455
PublishMetrics bool
5556

57+
MaxConcurrentReconciles int
58+
5659
ResourceBuilder
5760
}
5861

@@ -575,6 +578,7 @@ func (r *EphemeralRunnerSetReconciler) SetupWithManager(mgr ctrl.Manager) error
575578
For(&v1alpha1.EphemeralRunnerSet{}).
576579
Owns(&v1alpha1.EphemeralRunner{}).
577580
WithEventFilter(predicate.ResourceVersionChangedPredicate{}).
581+
WithOptions(controller.Options{MaxConcurrentReconciles: r.MaxConcurrentReconciles}).
578582
Complete(r)
579583
}
580584

controllers/actions.github.com/ephemeralrunnerset_controller_test.go

Lines changed: 15 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -48,10 +48,11 @@ var _ = Describe("Test EphemeralRunnerSet controller", func() {
4848
configSecret = createDefaultSecret(GinkgoT(), k8sClient, autoscalingNS.Name)
4949

5050
controller := &EphemeralRunnerSetReconciler{
51-
Client: mgr.GetClient(),
52-
Scheme: mgr.GetScheme(),
53-
Log: logf.Log,
54-
ActionsClient: fake.NewMultiClient(),
51+
Client: mgr.GetClient(),
52+
Scheme: mgr.GetScheme(),
53+
Log: logf.Log,
54+
ActionsClient: fake.NewMultiClient(),
55+
MaxConcurrentReconciles: 1,
5556
}
5657
err := controller.SetupWithManager(mgr)
5758
Expect(err).NotTo(HaveOccurred(), "failed to setup controller")
@@ -1098,10 +1099,11 @@ var _ = Describe("Test EphemeralRunnerSet controller with proxy settings", func(
10981099
configSecret = createDefaultSecret(GinkgoT(), k8sClient, autoscalingNS.Name)
10991100

11001101
controller := &EphemeralRunnerSetReconciler{
1101-
Client: mgr.GetClient(),
1102-
Scheme: mgr.GetScheme(),
1103-
Log: logf.Log,
1104-
ActionsClient: actions.NewMultiClient(logr.Discard()),
1102+
Client: mgr.GetClient(),
1103+
Scheme: mgr.GetScheme(),
1104+
Log: logf.Log,
1105+
ActionsClient: actions.NewMultiClient(logr.Discard()),
1106+
MaxConcurrentReconciles: 1,
11051107
}
11061108
err := controller.SetupWithManager(mgr)
11071109
Expect(err).NotTo(HaveOccurred(), "failed to setup controller")
@@ -1397,10 +1399,11 @@ var _ = Describe("Test EphemeralRunnerSet controller with custom root CA", func(
13971399
Expect(err).NotTo(HaveOccurred(), "failed to create configmap with root CAs")
13981400

13991401
controller := &EphemeralRunnerSetReconciler{
1400-
Client: mgr.GetClient(),
1401-
Scheme: mgr.GetScheme(),
1402-
Log: logf.Log,
1403-
ActionsClient: actions.NewMultiClient(logr.Discard()),
1402+
Client: mgr.GetClient(),
1403+
Scheme: mgr.GetScheme(),
1404+
Log: logf.Log,
1405+
ActionsClient: actions.NewMultiClient(logr.Discard()),
1406+
MaxConcurrentReconciles: 1,
14041407
}
14051408
err = controller.SetupWithManager(mgr)
14061409
Expect(err).NotTo(HaveOccurred(), "failed to setup controller")

0 commit comments

Comments
 (0)