Skip to content

Commit a62ca3d

Browse files
authored
Exclude label prefix propagation (#3607)
1 parent 4eb038e commit a62ca3d

10 files changed

Lines changed: 146 additions & 59 deletions

File tree

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,9 @@ spec:
7979
- "--listener-metrics-endpoint="
8080
- "--metrics-addr=0"
8181
{{- end }}
82+
{{- range .Values.flags.excludeLabelPropagationPrefixes }}
83+
- "--exclude-label-propagation-prefix={{ . }}"
84+
{{- end }}
8285
command:
8386
- "/manager"
8487
{{- with .Values.metrics }}

charts/gha-runner-scale-set-controller/tests/template_test.go

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1035,3 +1035,41 @@ func TestControllerDeployment_MetricsPorts(t *testing.T) {
10351035
assert.Equal(t, value.frequency, 1, fmt.Sprintf("frequency of %q is not 1", key))
10361036
}
10371037
}
1038+
1039+
func TestDeployment_excludeLabelPropagationPrefixes(t *testing.T) {
1040+
t.Parallel()
1041+
1042+
// Path to the helm chart we will test
1043+
helmChartPath, err := filepath.Abs("../../gha-runner-scale-set-controller")
1044+
require.NoError(t, err)
1045+
1046+
chartContent, err := os.ReadFile(filepath.Join(helmChartPath, "Chart.yaml"))
1047+
require.NoError(t, err)
1048+
1049+
chart := new(Chart)
1050+
err = yaml.Unmarshal(chartContent, chart)
1051+
require.NoError(t, err)
1052+
1053+
releaseName := "test-arc"
1054+
namespaceName := "test-" + strings.ToLower(random.UniqueId())
1055+
1056+
options := &helm.Options{
1057+
Logger: logger.Discard,
1058+
SetValues: map[string]string{
1059+
"flags.excludeLabelPropagationPrefixes[0]": "prefix.com/",
1060+
"flags.excludeLabelPropagationPrefixes[1]": "complete.io/label",
1061+
},
1062+
KubectlOptions: k8s.NewKubectlOptions("", "", namespaceName),
1063+
}
1064+
1065+
output := helm.RenderTemplate(t, options, helmChartPath, releaseName, []string{"templates/deployment.yaml"})
1066+
1067+
var deployment appsv1.Deployment
1068+
helm.UnmarshalK8SYaml(t, output, &deployment)
1069+
1070+
require.Len(t, deployment.Spec.Template.Spec.Containers, 1, "Expected one container")
1071+
container := deployment.Spec.Template.Spec.Containers[0]
1072+
1073+
assert.Contains(t, container.Args, "--exclude-label-propagation-prefix=prefix.com/")
1074+
assert.Contains(t, container.Args, "--exclude-label-propagation-prefix=complete.io/label")
1075+
}

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

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -121,3 +121,12 @@ flags:
121121
## This can lead to a longer time to apply the change but it will ensure
122122
## that you don't have any overprovisioning of runners.
123123
updateStrategy: "immediate"
124+
125+
## Defines a list of prefixes that should not be propagated to internal resources.
126+
## This is useful when you have labels that are used for internal purposes and should not be propagated to internal resources.
127+
## See https://github.com/actions/actions-runner-controller/issues/3533 for more information.
128+
##
129+
## By default, all labels are propagated to internal resources
130+
## Labels that match prefix specified in the list are excluded from propagation.
131+
# excludeLabelPropagationPrefixes:
132+
# - "argocd.argoproj.io/instance"

controllers/actions.github.com/autoscalinglistener_controller.go

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ type AutoscalingListenerReconciler struct {
5555
ListenerMetricsAddr string
5656
ListenerMetricsEndpoint string
5757

58-
resourceBuilder resourceBuilder
58+
ResourceBuilder
5959
}
6060

6161
// +kubebuilder:rbac:groups=core,resources=pods,verbs=get;list;watch;create;update;patch;delete
@@ -373,7 +373,7 @@ func (r *AutoscalingListenerReconciler) cleanupResources(ctx context.Context, au
373373
}
374374

375375
func (r *AutoscalingListenerReconciler) createServiceAccountForListener(ctx context.Context, autoscalingListener *v1alpha1.AutoscalingListener, logger logr.Logger) (ctrl.Result, error) {
376-
newServiceAccount := r.resourceBuilder.newScaleSetListenerServiceAccount(autoscalingListener)
376+
newServiceAccount := r.ResourceBuilder.newScaleSetListenerServiceAccount(autoscalingListener)
377377

378378
if err := ctrl.SetControllerReference(autoscalingListener, newServiceAccount, r.Scheme); err != nil {
379379
return ctrl.Result{}, err
@@ -458,7 +458,7 @@ func (r *AutoscalingListenerReconciler) createListenerPod(ctx context.Context, a
458458

459459
logger.Info("Creating listener config secret")
460460

461-
podConfig, err := r.resourceBuilder.newScaleSetListenerConfig(autoscalingListener, secret, metricsConfig, cert)
461+
podConfig, err := r.ResourceBuilder.newScaleSetListenerConfig(autoscalingListener, secret, metricsConfig, cert)
462462
if err != nil {
463463
logger.Error(err, "Failed to build listener config secret")
464464
return ctrl.Result{}, err
@@ -477,7 +477,7 @@ func (r *AutoscalingListenerReconciler) createListenerPod(ctx context.Context, a
477477
return ctrl.Result{Requeue: true}, nil
478478
}
479479

480-
newPod, err := r.resourceBuilder.newScaleSetListenerPod(autoscalingListener, &podConfig, serviceAccount, secret, metricsConfig, envs...)
480+
newPod, err := r.ResourceBuilder.newScaleSetListenerPod(autoscalingListener, &podConfig, serviceAccount, secret, metricsConfig, envs...)
481481
if err != nil {
482482
logger.Error(err, "Failed to build listener pod")
483483
return ctrl.Result{}, err
@@ -537,7 +537,7 @@ func (r *AutoscalingListenerReconciler) certificate(ctx context.Context, autosca
537537
}
538538

539539
func (r *AutoscalingListenerReconciler) createSecretsForListener(ctx context.Context, autoscalingListener *v1alpha1.AutoscalingListener, secret *corev1.Secret, logger logr.Logger) (ctrl.Result, error) {
540-
newListenerSecret := r.resourceBuilder.newScaleSetListenerSecretMirror(autoscalingListener, secret)
540+
newListenerSecret := r.ResourceBuilder.newScaleSetListenerSecretMirror(autoscalingListener, secret)
541541

542542
if err := ctrl.SetControllerReference(autoscalingListener, newListenerSecret, r.Scheme); err != nil {
543543
return ctrl.Result{}, err
@@ -609,7 +609,7 @@ func (r *AutoscalingListenerReconciler) updateSecretsForListener(ctx context.Con
609609
}
610610

611611
func (r *AutoscalingListenerReconciler) createRoleForListener(ctx context.Context, autoscalingListener *v1alpha1.AutoscalingListener, logger logr.Logger) (ctrl.Result, error) {
612-
newRole := r.resourceBuilder.newScaleSetListenerRole(autoscalingListener)
612+
newRole := r.ResourceBuilder.newScaleSetListenerRole(autoscalingListener)
613613

614614
logger.Info("Creating listener role", "namespace", newRole.Namespace, "name", newRole.Name, "rules", newRole.Rules)
615615
if err := r.Create(ctx, newRole); err != nil {
@@ -637,7 +637,7 @@ func (r *AutoscalingListenerReconciler) updateRoleForListener(ctx context.Contex
637637
}
638638

639639
func (r *AutoscalingListenerReconciler) createRoleBindingForListener(ctx context.Context, autoscalingListener *v1alpha1.AutoscalingListener, listenerRole *rbacv1.Role, serviceAccount *corev1.ServiceAccount, logger logr.Logger) (ctrl.Result, error) {
640-
newRoleBinding := r.resourceBuilder.newScaleSetListenerRoleBinding(autoscalingListener, listenerRole, serviceAccount)
640+
newRoleBinding := r.ResourceBuilder.newScaleSetListenerRoleBinding(autoscalingListener, listenerRole, serviceAccount)
641641

642642
logger.Info("Creating listener role binding",
643643
"namespace", newRoleBinding.Namespace,

controllers/actions.github.com/autoscalingrunnerset_controller.go

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -79,8 +79,7 @@ type AutoscalingRunnerSetReconciler struct {
7979
DefaultRunnerScaleSetListenerImagePullSecrets []string
8080
UpdateStrategy UpdateStrategy
8181
ActionsClient actions.MultiClient
82-
83-
resourceBuilder resourceBuilder
82+
ResourceBuilder
8483
}
8584

8685
// +kubebuilder:rbac:groups=actions.github.com,resources=autoscalingrunnersets,verbs=get;list;watch;create;update;patch;delete
@@ -623,7 +622,7 @@ func (r *AutoscalingRunnerSetReconciler) deleteRunnerScaleSet(ctx context.Contex
623622
}
624623

625624
func (r *AutoscalingRunnerSetReconciler) createEphemeralRunnerSet(ctx context.Context, autoscalingRunnerSet *v1alpha1.AutoscalingRunnerSet, log logr.Logger) (ctrl.Result, error) {
626-
desiredRunnerSet, err := r.resourceBuilder.newEphemeralRunnerSet(autoscalingRunnerSet)
625+
desiredRunnerSet, err := r.ResourceBuilder.newEphemeralRunnerSet(autoscalingRunnerSet)
627626
if err != nil {
628627
log.Error(err, "Could not create EphemeralRunnerSet")
629628
return ctrl.Result{}, err
@@ -652,7 +651,7 @@ func (r *AutoscalingRunnerSetReconciler) createAutoScalingListenerForRunnerSet(c
652651
})
653652
}
654653

655-
autoscalingListener, err := r.resourceBuilder.newAutoScalingListener(autoscalingRunnerSet, ephemeralRunnerSet, r.ControllerNamespace, r.DefaultRunnerScaleSetListenerImage, imagePullSecrets)
654+
autoscalingListener, err := r.ResourceBuilder.newAutoScalingListener(autoscalingRunnerSet, ephemeralRunnerSet, r.ControllerNamespace, r.DefaultRunnerScaleSetListenerImage, imagePullSecrets)
656655
if err != nil {
657656
log.Error(err, "Could not create AutoscalingListener spec")
658657
return ctrl.Result{}, err

controllers/actions.github.com/ephemeralrunner_controller.go

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -49,10 +49,10 @@ const (
4949
// EphemeralRunnerReconciler reconciles a EphemeralRunner object
5050
type EphemeralRunnerReconciler struct {
5151
client.Client
52-
Log logr.Logger
53-
Scheme *runtime.Scheme
54-
ActionsClient actions.MultiClient
55-
resourceBuilder resourceBuilder
52+
Log logr.Logger
53+
Scheme *runtime.Scheme
54+
ActionsClient actions.MultiClient
55+
ResourceBuilder
5656
}
5757

5858
// +kubebuilder:rbac:groups=actions.github.com,resources=ephemeralrunners,verbs=get;list;watch;create;update;patch;delete
@@ -642,7 +642,7 @@ func (r *EphemeralRunnerReconciler) createPod(ctx context.Context, runner *v1alp
642642
}
643643

644644
log.Info("Creating new pod for ephemeral runner")
645-
newPod := r.resourceBuilder.newEphemeralRunnerPod(ctx, runner, secret, envs...)
645+
newPod := r.ResourceBuilder.newEphemeralRunnerPod(ctx, runner, secret, envs...)
646646

647647
if err := ctrl.SetControllerReference(runner, newPod, r.Scheme); err != nil {
648648
log.Error(err, "Failed to set controller reference to a new pod")
@@ -667,7 +667,7 @@ func (r *EphemeralRunnerReconciler) createPod(ctx context.Context, runner *v1alp
667667

668668
func (r *EphemeralRunnerReconciler) createSecret(ctx context.Context, runner *v1alpha1.EphemeralRunner, log logr.Logger) (ctrl.Result, error) {
669669
log.Info("Creating new secret for ephemeral runner")
670-
jitSecret := r.resourceBuilder.newEphemeralRunnerJitSecret(runner)
670+
jitSecret := r.ResourceBuilder.newEphemeralRunnerJitSecret(runner)
671671

672672
if err := ctrl.SetControllerReference(runner, jitSecret, r.Scheme); err != nil {
673673
return ctrl.Result{}, fmt.Errorf("failed to set controller reference: %v", err)

controllers/actions.github.com/ephemeralrunnerset_controller.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ type EphemeralRunnerSetReconciler struct {
5353

5454
PublishMetrics bool
5555

56-
resourceBuilder resourceBuilder
56+
ResourceBuilder
5757
}
5858

5959
//+kubebuilder:rbac:groups=actions.github.com,resources=ephemeralrunnersets,verbs=get;list;watch;create;update;patch;delete
@@ -360,7 +360,7 @@ func (r *EphemeralRunnerSetReconciler) createEphemeralRunners(ctx context.Contex
360360
// Track multiple errors at once and return the bundle.
361361
errs := make([]error, 0)
362362
for i := 0; i < count; i++ {
363-
ephemeralRunner := r.resourceBuilder.newEphemeralRunner(runnerSet)
363+
ephemeralRunner := r.ResourceBuilder.newEphemeralRunner(runnerSet)
364364
if runnerSet.Spec.EphemeralRunnerSpec.Proxy != nil {
365365
ephemeralRunner.Spec.ProxySecretRef = proxyEphemeralRunnerSetSecretName(runnerSet)
366366
}

0 commit comments

Comments
 (0)