Delay role/rolebinding creation to gha-runner-scale-set installation time (#2363)
This commit is contained in:
		
							parent
							
								
									9fbcafa703
								
							
						
					
					
						commit
						9e6c7d019f
					
				|  | @ -72,12 +72,20 @@ Create the name of the service account to use | ||||||
| {{- end }} | {{- end }} | ||||||
| {{- end }} | {{- end }} | ||||||
| 
 | 
 | ||||||
| {{- define "gha-runner-scale-set-controller.managerRoleName" -}} | {{- define "gha-runner-scale-set-controller.managerClusterRoleName" -}} | ||||||
| {{- include "gha-runner-scale-set-controller.fullname" . }}-manager-role | {{- include "gha-runner-scale-set-controller.fullname" . }}-manager-cluster-role | ||||||
| {{- end }} | {{- end }} | ||||||
| 
 | 
 | ||||||
| {{- define "gha-runner-scale-set-controller.managerRoleBinding" -}} | {{- define "gha-runner-scale-set-controller.managerClusterRoleBinding" -}} | ||||||
| {{- include "gha-runner-scale-set-controller.fullname" . }}-manager-rolebinding | {{- include "gha-runner-scale-set-controller.fullname" . }}-manager-cluster-rolebinding | ||||||
|  | {{- end }} | ||||||
|  | 
 | ||||||
|  | {{- define "gha-runner-scale-set-controller.managerListenerRoleName" -}} | ||||||
|  | {{- include "gha-runner-scale-set-controller.fullname" . }}-manager-listener-role | ||||||
|  | {{- end }} | ||||||
|  | 
 | ||||||
|  | {{- define "gha-runner-scale-set-controller.managerListenerRoleBinding" -}} | ||||||
|  | {{- include "gha-runner-scale-set-controller.fullname" . }}-manager-listener-rolebinding | ||||||
| {{- end }} | {{- end }} | ||||||
| 
 | 
 | ||||||
| {{- define "gha-runner-scale-set-controller.leaderElectionRoleName" -}} | {{- define "gha-runner-scale-set-controller.leaderElectionRoleName" -}} | ||||||
|  |  | ||||||
|  | @ -5,6 +5,8 @@ metadata: | ||||||
|   namespace: {{ .Release.Namespace }} |   namespace: {{ .Release.Namespace }} | ||||||
|   labels: |   labels: | ||||||
|     {{- include "gha-runner-scale-set-controller.labels" . | nindent 4 }} |     {{- include "gha-runner-scale-set-controller.labels" . | nindent 4 }} | ||||||
|  |     actions.github.com/controller-service-account-namespace: {{ .Release.Namespace }} | ||||||
|  |     actions.github.com/controller-service-account-name: {{ include "gha-runner-scale-set-controller.serviceAccountName" . }} | ||||||
| spec: | spec: | ||||||
|   replicas: {{ default 1 .Values.replicaCount }} |   replicas: {{ default 1 .Values.replicaCount }} | ||||||
|   selector: |   selector: | ||||||
|  |  | ||||||
|  | @ -1,7 +1,7 @@ | ||||||
| apiVersion: rbac.authorization.k8s.io/v1 | apiVersion: rbac.authorization.k8s.io/v1 | ||||||
| kind: ClusterRole | kind: ClusterRole | ||||||
| metadata: | metadata: | ||||||
|   name: {{ include "gha-runner-scale-set-controller.managerRoleName" . }} |   name: {{ include "gha-runner-scale-set-controller.managerClusterRoleName" . }} | ||||||
| rules: | rules: | ||||||
| - apiGroups: | - apiGroups: | ||||||
|   - actions.github.com |   - actions.github.com | ||||||
|  | @ -112,43 +112,13 @@ rules: | ||||||
|   resources: |   resources: | ||||||
|   - pods |   - pods | ||||||
|   verbs: |   verbs: | ||||||
|   - create |  | ||||||
|   - delete |  | ||||||
|   - get |  | ||||||
|   - list |   - list | ||||||
|   - patch |  | ||||||
|   - update |  | ||||||
|   - watch |   - watch | ||||||
| - apiGroups: |  | ||||||
|   - "" |  | ||||||
|   resources: |  | ||||||
|   - pods/status |  | ||||||
|   verbs: |  | ||||||
|   - get |  | ||||||
| - apiGroups: |  | ||||||
|   - "" |  | ||||||
|   resources: |  | ||||||
|   - secrets |  | ||||||
|   verbs: |  | ||||||
|   - create |  | ||||||
|   - delete |  | ||||||
|   - get |  | ||||||
|   - update |  | ||||||
| - apiGroups: | - apiGroups: | ||||||
|   - "" |   - "" | ||||||
|   resources: |   resources: | ||||||
|   - serviceaccounts |   - serviceaccounts | ||||||
|   verbs: |   verbs: | ||||||
|   - create |  | ||||||
|   - delete |  | ||||||
|   - get |  | ||||||
|   - list |  | ||||||
|   - watch |  | ||||||
| - apiGroups: |  | ||||||
|   - "" |  | ||||||
|   resources: |  | ||||||
|   - configmaps |  | ||||||
|   verbs: |  | ||||||
|   - list |   - list | ||||||
|   - watch |   - watch | ||||||
| - apiGroups: | - apiGroups: | ||||||
|  | @ -156,10 +126,6 @@ rules: | ||||||
|   resources: |   resources: | ||||||
|   - rolebindings |   - rolebindings | ||||||
|   verbs: |   verbs: | ||||||
|   - create |  | ||||||
|   - delete |  | ||||||
|   - get |  | ||||||
|   - update |  | ||||||
|   - list |   - list | ||||||
|   - watch |   - watch | ||||||
| - apiGroups: | - apiGroups: | ||||||
|  | @ -167,9 +133,5 @@ rules: | ||||||
|   resources: |   resources: | ||||||
|   - roles |   - roles | ||||||
|   verbs: |   verbs: | ||||||
|   - create |  | ||||||
|   - delete |  | ||||||
|   - get |  | ||||||
|   - update |  | ||||||
|   - list |   - list | ||||||
|   - watch |   - watch | ||||||
|  | @ -1,11 +1,11 @@ | ||||||
| apiVersion: rbac.authorization.k8s.io/v1 | apiVersion: rbac.authorization.k8s.io/v1 | ||||||
| kind: ClusterRoleBinding | kind: ClusterRoleBinding | ||||||
| metadata: | metadata: | ||||||
|   name: {{ include "gha-runner-scale-set-controller.managerRoleBinding" . }} |   name: {{ include "gha-runner-scale-set-controller.managerClusterRoleBinding" . }} | ||||||
| roleRef: | roleRef: | ||||||
|   apiGroup: rbac.authorization.k8s.io |   apiGroup: rbac.authorization.k8s.io | ||||||
|   kind: ClusterRole |   kind: ClusterRole | ||||||
|   name: {{ include "gha-runner-scale-set-controller.managerRoleName" . }} |   name: {{ include "gha-runner-scale-set-controller.managerClusterRoleName" . }} | ||||||
| subjects: | subjects: | ||||||
| - kind: ServiceAccount | - kind: ServiceAccount | ||||||
|   name: {{ include "gha-runner-scale-set-controller.serviceAccountName" . }} |   name: {{ include "gha-runner-scale-set-controller.serviceAccountName" . }} | ||||||
|  | @ -0,0 +1,40 @@ | ||||||
|  | apiVersion: rbac.authorization.k8s.io/v1 | ||||||
|  | kind: Role | ||||||
|  | metadata: | ||||||
|  |   name: {{ include "gha-runner-scale-set-controller.managerListenerRoleName" . }} | ||||||
|  |   namespace: {{ .Release.Namespace }} | ||||||
|  | rules: | ||||||
|  | - apiGroups: | ||||||
|  |   - "" | ||||||
|  |   resources: | ||||||
|  |   - pods | ||||||
|  |   verbs: | ||||||
|  |   - create | ||||||
|  |   - delete | ||||||
|  |   - get | ||||||
|  | - apiGroups: | ||||||
|  |   - "" | ||||||
|  |   resources: | ||||||
|  |   - pods/status | ||||||
|  |   verbs: | ||||||
|  |   - get | ||||||
|  | - apiGroups: | ||||||
|  |   - "" | ||||||
|  |   resources: | ||||||
|  |   - secrets | ||||||
|  |   verbs: | ||||||
|  |   - create | ||||||
|  |   - delete | ||||||
|  |   - get | ||||||
|  |   - patch | ||||||
|  |   - update | ||||||
|  | - apiGroups: | ||||||
|  |   - "" | ||||||
|  |   resources: | ||||||
|  |   - serviceaccounts | ||||||
|  |   verbs: | ||||||
|  |   - create | ||||||
|  |   - delete | ||||||
|  |   - get | ||||||
|  |   - patch | ||||||
|  |   - update | ||||||
|  | @ -0,0 +1,13 @@ | ||||||
|  | apiVersion: rbac.authorization.k8s.io/v1 | ||||||
|  | kind: RoleBinding | ||||||
|  | metadata: | ||||||
|  |   name: {{ include "gha-runner-scale-set-controller.managerListenerRoleBinding" . }} | ||||||
|  |   namespace: {{ .Release.Namespace }} | ||||||
|  | roleRef: | ||||||
|  |   apiGroup: rbac.authorization.k8s.io | ||||||
|  |   kind: Role | ||||||
|  |   name: {{ include "gha-runner-scale-set-controller.managerListenerRoleName" . }} | ||||||
|  | subjects: | ||||||
|  | - kind: ServiceAccount | ||||||
|  |   name: {{ include "gha-runner-scale-set-controller.serviceAccountName" . }} | ||||||
|  |   namespace: {{ .Release.Namespace }} | ||||||
|  | @ -147,7 +147,7 @@ func TestTemplate_NotCreateServiceAccount_ServiceAccountNotSet(t *testing.T) { | ||||||
| 	assert.ErrorContains(t, err, "serviceAccount.name must be set if serviceAccount.create is false", "We should get an error because the default service account cannot be used") | 	assert.ErrorContains(t, err, "serviceAccount.name must be set if serviceAccount.create is false", "We should get an error because the default service account cannot be used") | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func TestTemplate_CreateManagerRole(t *testing.T) { | func TestTemplate_CreateManagerClusterRole(t *testing.T) { | ||||||
| 	t.Parallel() | 	t.Parallel() | ||||||
| 
 | 
 | ||||||
| 	// Path to the helm chart we will test
 | 	// Path to the helm chart we will test
 | ||||||
|  | @ -162,17 +162,17 @@ func TestTemplate_CreateManagerRole(t *testing.T) { | ||||||
| 		KubectlOptions: k8s.NewKubectlOptions("", "", namespaceName), | 		KubectlOptions: k8s.NewKubectlOptions("", "", namespaceName), | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	output := helm.RenderTemplate(t, options, helmChartPath, releaseName, []string{"templates/manager_role.yaml"}) | 	output := helm.RenderTemplate(t, options, helmChartPath, releaseName, []string{"templates/manager_cluster_role.yaml"}) | ||||||
| 
 | 
 | ||||||
| 	var managerRole rbacv1.ClusterRole | 	var managerClusterRole rbacv1.ClusterRole | ||||||
| 	helm.UnmarshalK8SYaml(t, output, &managerRole) | 	helm.UnmarshalK8SYaml(t, output, &managerClusterRole) | ||||||
| 
 | 
 | ||||||
| 	assert.Empty(t, managerRole.Namespace, "ClusterRole should not have a namespace") | 	assert.Empty(t, managerClusterRole.Namespace, "ClusterRole should not have a namespace") | ||||||
| 	assert.Equal(t, "test-arc-gha-runner-scale-set-controller-manager-role", managerRole.Name) | 	assert.Equal(t, "test-arc-gha-runner-scale-set-controller-manager-cluster-role", managerClusterRole.Name) | ||||||
| 	assert.Equal(t, 18, len(managerRole.Rules)) | 	assert.Equal(t, 15, len(managerClusterRole.Rules)) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func TestTemplate_ManagerRoleBinding(t *testing.T) { | func TestTemplate_ManagerClusterRoleBinding(t *testing.T) { | ||||||
| 	t.Parallel() | 	t.Parallel() | ||||||
| 
 | 
 | ||||||
| 	// Path to the helm chart we will test
 | 	// Path to the helm chart we will test
 | ||||||
|  | @ -189,16 +189,74 @@ func TestTemplate_ManagerRoleBinding(t *testing.T) { | ||||||
| 		KubectlOptions: k8s.NewKubectlOptions("", "", namespaceName), | 		KubectlOptions: k8s.NewKubectlOptions("", "", namespaceName), | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	output := helm.RenderTemplate(t, options, helmChartPath, releaseName, []string{"templates/manager_role_binding.yaml"}) | 	output := helm.RenderTemplate(t, options, helmChartPath, releaseName, []string{"templates/manager_cluster_role_binding.yaml"}) | ||||||
| 
 | 
 | ||||||
| 	var managerRoleBinding rbacv1.ClusterRoleBinding | 	var managerClusterRoleBinding rbacv1.ClusterRoleBinding | ||||||
| 	helm.UnmarshalK8SYaml(t, output, &managerRoleBinding) | 	helm.UnmarshalK8SYaml(t, output, &managerClusterRoleBinding) | ||||||
| 
 | 
 | ||||||
| 	assert.Empty(t, managerRoleBinding.Namespace, "ClusterRoleBinding should not have a namespace") | 	assert.Empty(t, managerClusterRoleBinding.Namespace, "ClusterRoleBinding should not have a namespace") | ||||||
| 	assert.Equal(t, "test-arc-gha-runner-scale-set-controller-manager-rolebinding", managerRoleBinding.Name) | 	assert.Equal(t, "test-arc-gha-runner-scale-set-controller-manager-cluster-rolebinding", managerClusterRoleBinding.Name) | ||||||
| 	assert.Equal(t, "test-arc-gha-runner-scale-set-controller-manager-role", managerRoleBinding.RoleRef.Name) | 	assert.Equal(t, "test-arc-gha-runner-scale-set-controller-manager-cluster-role", managerClusterRoleBinding.RoleRef.Name) | ||||||
| 	assert.Equal(t, "test-arc-gha-runner-scale-set-controller", managerRoleBinding.Subjects[0].Name) | 	assert.Equal(t, "test-arc-gha-runner-scale-set-controller", managerClusterRoleBinding.Subjects[0].Name) | ||||||
| 	assert.Equal(t, namespaceName, managerRoleBinding.Subjects[0].Namespace) | 	assert.Equal(t, namespaceName, managerClusterRoleBinding.Subjects[0].Namespace) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func TestTemplate_CreateManagerListenerRole(t *testing.T) { | ||||||
|  | 	t.Parallel() | ||||||
|  | 
 | ||||||
|  | 	// Path to the helm chart we will test
 | ||||||
|  | 	helmChartPath, err := filepath.Abs("../../gha-runner-scale-set-controller") | ||||||
|  | 	require.NoError(t, err) | ||||||
|  | 
 | ||||||
|  | 	releaseName := "test-arc" | ||||||
|  | 	namespaceName := "test-" + strings.ToLower(random.UniqueId()) | ||||||
|  | 
 | ||||||
|  | 	options := &helm.Options{ | ||||||
|  | 		SetValues:      map[string]string{}, | ||||||
|  | 		KubectlOptions: k8s.NewKubectlOptions("", "", namespaceName), | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	output := helm.RenderTemplate(t, options, helmChartPath, releaseName, []string{"templates/manager_listener_role.yaml"}) | ||||||
|  | 
 | ||||||
|  | 	var managerListenerRole rbacv1.Role | ||||||
|  | 	helm.UnmarshalK8SYaml(t, output, &managerListenerRole) | ||||||
|  | 
 | ||||||
|  | 	assert.Equal(t, namespaceName, managerListenerRole.Namespace, "Role should have a namespace") | ||||||
|  | 	assert.Equal(t, "test-arc-gha-runner-scale-set-controller-manager-listener-role", managerListenerRole.Name) | ||||||
|  | 	assert.Equal(t, 4, len(managerListenerRole.Rules)) | ||||||
|  | 	assert.Equal(t, "pods", managerListenerRole.Rules[0].Resources[0]) | ||||||
|  | 	assert.Equal(t, "pods/status", managerListenerRole.Rules[1].Resources[0]) | ||||||
|  | 	assert.Equal(t, "secrets", managerListenerRole.Rules[2].Resources[0]) | ||||||
|  | 	assert.Equal(t, "serviceaccounts", managerListenerRole.Rules[3].Resources[0]) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func TestTemplate_ManagerListenerRoleBinding(t *testing.T) { | ||||||
|  | 	t.Parallel() | ||||||
|  | 
 | ||||||
|  | 	// Path to the helm chart we will test
 | ||||||
|  | 	helmChartPath, err := filepath.Abs("../../gha-runner-scale-set-controller") | ||||||
|  | 	require.NoError(t, err) | ||||||
|  | 
 | ||||||
|  | 	releaseName := "test-arc" | ||||||
|  | 	namespaceName := "test-" + strings.ToLower(random.UniqueId()) | ||||||
|  | 
 | ||||||
|  | 	options := &helm.Options{ | ||||||
|  | 		SetValues: map[string]string{ | ||||||
|  | 			"serviceAccount.create": "true", | ||||||
|  | 		}, | ||||||
|  | 		KubectlOptions: k8s.NewKubectlOptions("", "", namespaceName), | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	output := helm.RenderTemplate(t, options, helmChartPath, releaseName, []string{"templates/manager_listener_role_binding.yaml"}) | ||||||
|  | 
 | ||||||
|  | 	var managerListenerRoleBinding rbacv1.RoleBinding | ||||||
|  | 	helm.UnmarshalK8SYaml(t, output, &managerListenerRoleBinding) | ||||||
|  | 
 | ||||||
|  | 	assert.Equal(t, namespaceName, managerListenerRoleBinding.Namespace, "RoleBinding should have a namespace") | ||||||
|  | 	assert.Equal(t, "test-arc-gha-runner-scale-set-controller-manager-listener-rolebinding", managerListenerRoleBinding.Name) | ||||||
|  | 	assert.Equal(t, "test-arc-gha-runner-scale-set-controller-manager-listener-role", managerListenerRoleBinding.RoleRef.Name) | ||||||
|  | 	assert.Equal(t, "test-arc-gha-runner-scale-set-controller", managerListenerRoleBinding.Subjects[0].Name) | ||||||
|  | 	assert.Equal(t, namespaceName, managerListenerRoleBinding.Subjects[0].Namespace) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func TestTemplate_ControllerDeployment_Defaults(t *testing.T) { | func TestTemplate_ControllerDeployment_Defaults(t *testing.T) { | ||||||
|  | @ -237,6 +295,8 @@ func TestTemplate_ControllerDeployment_Defaults(t *testing.T) { | ||||||
| 	assert.Equal(t, "test-arc", deployment.Labels["app.kubernetes.io/instance"]) | 	assert.Equal(t, "test-arc", deployment.Labels["app.kubernetes.io/instance"]) | ||||||
| 	assert.Equal(t, chart.AppVersion, deployment.Labels["app.kubernetes.io/version"]) | 	assert.Equal(t, chart.AppVersion, deployment.Labels["app.kubernetes.io/version"]) | ||||||
| 	assert.Equal(t, "Helm", deployment.Labels["app.kubernetes.io/managed-by"]) | 	assert.Equal(t, "Helm", deployment.Labels["app.kubernetes.io/managed-by"]) | ||||||
|  | 	assert.Equal(t, namespaceName, deployment.Labels["actions.github.com/controller-service-account-namespace"]) | ||||||
|  | 	assert.Equal(t, "test-arc-gha-runner-scale-set-controller", deployment.Labels["actions.github.com/controller-service-account-name"]) | ||||||
| 
 | 
 | ||||||
| 	assert.Equal(t, int32(1), *deployment.Spec.Replicas) | 	assert.Equal(t, int32(1), *deployment.Spec.Replicas) | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -458,3 +458,83 @@ volumeMounts: | ||||||
| {{- end }} | {{- end }} | ||||||
| {{- end }} | {{- end }} | ||||||
| {{- end }} | {{- end }} | ||||||
|  | 
 | ||||||
|  | {{- define "gha-runner-scale-set.managerRoleName" -}} | ||||||
|  | {{- include "gha-runner-scale-set.fullname" . }}-manager-role | ||||||
|  | {{- end }} | ||||||
|  | 
 | ||||||
|  | {{- define "gha-runner-scale-set.managerRoleBinding" -}} | ||||||
|  | {{- include "gha-runner-scale-set.fullname" . }}-manager-role-binding | ||||||
|  | {{- end }} | ||||||
|  | 
 | ||||||
|  | {{- define "gha-runner-scale-set.managerServiceAccountName" -}} | ||||||
|  | {{- $searchControllerDeployment := 1 }} | ||||||
|  | {{- if .Values.controllerServiceAccount }} | ||||||
|  |   {{- if .Values.controllerServiceAccount.name }} | ||||||
|  |     {{- $searchControllerDeployment = 0 }} | ||||||
|  | {{- .Values.controllerServiceAccount.name }} | ||||||
|  |   {{- end }} | ||||||
|  | {{- end }} | ||||||
|  | {{- if eq $searchControllerDeployment 1 }} | ||||||
|  |   {{- $counter := 0 }} | ||||||
|  |   {{- $controllerDeployment := dict }} | ||||||
|  |   {{- $managerServiceAccountName := "" }} | ||||||
|  |   {{- range $index, $deployment := (lookup "apps/v1" "Deployment" "" "").items }} | ||||||
|  |     {{- range $key, $val := $deployment.metadata.labels }} | ||||||
|  |       {{- if and (eq $key "app.kubernetes.io/part-of") (eq $val "gha-runner-scale-set-controller") }} | ||||||
|  |         {{- $counter = add $counter 1 }} | ||||||
|  |         {{- $controllerDeployment = $deployment }} | ||||||
|  |       {{- end }} | ||||||
|  |     {{- end }} | ||||||
|  |   {{- end }} | ||||||
|  |   {{- if lt $counter 1 }} | ||||||
|  |     {{- fail "No gha-runner-scale-set-controller deployment found using label (app.kubernetes.io/part-of=gha-runner-scale-set-controller), consider setting controllerServiceAccount.name in values.yaml to be explicit if you think the discovery is wrong." }} | ||||||
|  |   {{- end }} | ||||||
|  |   {{- if gt $counter 1 }} | ||||||
|  |     {{- fail "More than one gha-runner-scale-set-controller deployment found using label (app.kubernetes.io/part-of=gha-runner-scale-set-controller), consider setting controllerServiceAccount.name in values.yaml to be explicit if you think the discovery is wrong." }} | ||||||
|  |   {{- end }} | ||||||
|  |   {{- with $controllerDeployment.metadata }} | ||||||
|  |     {{- $managerServiceAccountName = (get $controllerDeployment.metadata.labels "actions.github.com/controller-service-account-name") }} | ||||||
|  |   {{- end }} | ||||||
|  |   {{- if eq $managerServiceAccountName "" }} | ||||||
|  |     {{- fail "No service account name found for gha-runner-scale-set-controller deployment using label (actions.github.com/controller-service-account-name), consider setting controllerServiceAccount.name in values.yaml to be explicit if you think the discovery is wrong." }} | ||||||
|  |   {{- end }} | ||||||
|  | {{- $managerServiceAccountName }} | ||||||
|  | {{- end }} | ||||||
|  | {{- end }} | ||||||
|  | 
 | ||||||
|  | {{- define "gha-runner-scale-set.managerServiceAccountNamespace" -}} | ||||||
|  | {{- $searchControllerDeployment := 1 }} | ||||||
|  | {{- if .Values.controllerServiceAccount }} | ||||||
|  |   {{- if .Values.controllerServiceAccount.namespace }} | ||||||
|  |     {{- $searchControllerDeployment = 0 }} | ||||||
|  | {{- .Values.controllerServiceAccount.namespace }} | ||||||
|  |   {{- end }} | ||||||
|  | {{- end }} | ||||||
|  | {{- if eq $searchControllerDeployment 1 }} | ||||||
|  |   {{- $counter := 0 }} | ||||||
|  |   {{- $controllerDeployment := dict }} | ||||||
|  |   {{- $managerServiceAccountNamespace := "" }} | ||||||
|  |   {{- range $index, $deployment := (lookup "apps/v1" "Deployment" "" "").items }} | ||||||
|  |     {{- range $key, $val := $deployment.metadata.labels }} | ||||||
|  |       {{- if and (eq $key "app.kubernetes.io/part-of") (eq $val "gha-runner-scale-set-controller") }} | ||||||
|  |         {{- $counter = add $counter 1 }} | ||||||
|  |         {{- $controllerDeployment = $deployment }} | ||||||
|  |       {{- end }} | ||||||
|  |     {{- end }} | ||||||
|  |   {{- end }} | ||||||
|  |   {{- if lt $counter 1 }} | ||||||
|  |     {{- fail "No gha-runner-scale-set-controller deployment found using label (app.kubernetes.io/part-of=gha-runner-scale-set-controller), consider setting controllerServiceAccount.name to be explicit if you think the discovery is wrong." }} | ||||||
|  |   {{- end }} | ||||||
|  |   {{- if gt $counter 1 }} | ||||||
|  |     {{- fail "More than one gha-runner-scale-set-controller deployment found using label (app.kubernetes.io/part-of=gha-runner-scale-set-controller), consider setting controllerServiceAccount.name to be explicit if you think the discovery is wrong." }} | ||||||
|  |   {{- end }} | ||||||
|  |   {{- with $controllerDeployment.metadata }} | ||||||
|  |     {{- $managerServiceAccountNamespace = (get $controllerDeployment.metadata.labels "actions.github.com/controller-service-account-namespace") }} | ||||||
|  |   {{- end }} | ||||||
|  |   {{- if eq $managerServiceAccountNamespace "" }} | ||||||
|  |     {{- fail "No service account namespace found for gha-runner-scale-set-controller deployment using label (actions.github.com/controller-service-account-namespace), consider setting controllerServiceAccount.name to be explicit if you think the discovery is wrong." }} | ||||||
|  |   {{- end }} | ||||||
|  | {{- $managerServiceAccountNamespace }} | ||||||
|  | {{- end }} | ||||||
|  | {{- end }} | ||||||
|  |  | ||||||
|  | @ -0,0 +1,59 @@ | ||||||
|  | apiVersion: rbac.authorization.k8s.io/v1 | ||||||
|  | kind: Role | ||||||
|  | metadata: | ||||||
|  |   name: {{ include "gha-runner-scale-set.managerRoleName" . }} | ||||||
|  |   namespace: {{ .Release.Namespace }} | ||||||
|  | rules: | ||||||
|  | - apiGroups: | ||||||
|  |   - "" | ||||||
|  |   resources: | ||||||
|  |   - pods | ||||||
|  |   verbs: | ||||||
|  |   - create | ||||||
|  |   - delete | ||||||
|  |   - get | ||||||
|  | - apiGroups: | ||||||
|  |   - "" | ||||||
|  |   resources: | ||||||
|  |   - pods/status | ||||||
|  |   verbs: | ||||||
|  |   - get | ||||||
|  | - apiGroups: | ||||||
|  |   - "" | ||||||
|  |   resources: | ||||||
|  |   - secrets | ||||||
|  |   verbs: | ||||||
|  |   - create | ||||||
|  |   - delete | ||||||
|  |   - get | ||||||
|  |   - list | ||||||
|  |   - patch | ||||||
|  |   - update | ||||||
|  | - apiGroups: | ||||||
|  |   - rbac.authorization.k8s.io | ||||||
|  |   resources: | ||||||
|  |   - rolebindings | ||||||
|  |   verbs: | ||||||
|  |   - create | ||||||
|  |   - delete | ||||||
|  |   - get | ||||||
|  |   - patch | ||||||
|  |   - update | ||||||
|  | - apiGroups: | ||||||
|  |   - rbac.authorization.k8s.io | ||||||
|  |   resources: | ||||||
|  |   - roles | ||||||
|  |   verbs: | ||||||
|  |   - create | ||||||
|  |   - delete | ||||||
|  |   - get | ||||||
|  |   - patch | ||||||
|  |   - update | ||||||
|  | {{- if .Values.githubServerTLS }} | ||||||
|  | - apiGroups: | ||||||
|  |   - "" | ||||||
|  |   resources: | ||||||
|  |   - configmaps | ||||||
|  |   verbs: | ||||||
|  |   - get | ||||||
|  | {{- end }} | ||||||
|  | @ -0,0 +1,13 @@ | ||||||
|  | apiVersion: rbac.authorization.k8s.io/v1 | ||||||
|  | kind: RoleBinding | ||||||
|  | metadata: | ||||||
|  |   name: {{ include "gha-runner-scale-set.managerRoleBinding" . }} | ||||||
|  |   namespace: {{ .Release.Namespace }} | ||||||
|  | roleRef: | ||||||
|  |   apiGroup: rbac.authorization.k8s.io | ||||||
|  |   kind: Role | ||||||
|  |   name: {{ include "gha-runner-scale-set.managerRoleName" . }} | ||||||
|  | subjects: | ||||||
|  | - kind: ServiceAccount | ||||||
|  |   name: {{ include "gha-runner-scale-set.managerServiceAccountName" . | nindent 4 }} | ||||||
|  |   namespace: {{ include "gha-runner-scale-set.managerServiceAccountNamespace" . | nindent 4 }} | ||||||
|  | @ -29,6 +29,8 @@ func TestTemplateRenderedGitHubSecretWithGitHubToken(t *testing.T) { | ||||||
| 		SetValues: map[string]string{ | 		SetValues: map[string]string{ | ||||||
| 			"githubConfigUrl":                    "https://github.com/actions", | 			"githubConfigUrl":                    "https://github.com/actions", | ||||||
| 			"githubConfigSecret.github_token":    "gh_token12345", | 			"githubConfigSecret.github_token":    "gh_token12345", | ||||||
|  | 			"controllerServiceAccount.name":      "arc", | ||||||
|  | 			"controllerServiceAccount.namespace": "arc-system", | ||||||
| 		}, | 		}, | ||||||
| 		KubectlOptions: k8s.NewKubectlOptions("", "", namespaceName), | 		KubectlOptions: k8s.NewKubectlOptions("", "", namespaceName), | ||||||
| 	} | 	} | ||||||
|  | @ -60,6 +62,8 @@ func TestTemplateRenderedGitHubSecretWithGitHubApp(t *testing.T) { | ||||||
| 			"githubConfigSecret.github_app_id":              "10", | 			"githubConfigSecret.github_app_id":              "10", | ||||||
| 			"githubConfigSecret.github_app_installation_id": "100", | 			"githubConfigSecret.github_app_installation_id": "100", | ||||||
| 			"githubConfigSecret.github_app_private_key":     "private_key", | 			"githubConfigSecret.github_app_private_key":     "private_key", | ||||||
|  | 			"controllerServiceAccount.name":                 "arc", | ||||||
|  | 			"controllerServiceAccount.namespace":            "arc-system", | ||||||
| 		}, | 		}, | ||||||
| 		KubectlOptions: k8s.NewKubectlOptions("", "", namespaceName), | 		KubectlOptions: k8s.NewKubectlOptions("", "", namespaceName), | ||||||
| 	} | 	} | ||||||
|  | @ -90,6 +94,8 @@ func TestTemplateRenderedGitHubSecretErrorWithMissingAuthInput(t *testing.T) { | ||||||
| 			"githubConfigUrl":                    "https://github.com/actions", | 			"githubConfigUrl":                    "https://github.com/actions", | ||||||
| 			"githubConfigSecret.github_app_id":   "", | 			"githubConfigSecret.github_app_id":   "", | ||||||
| 			"githubConfigSecret.github_token":    "", | 			"githubConfigSecret.github_token":    "", | ||||||
|  | 			"controllerServiceAccount.name":      "arc", | ||||||
|  | 			"controllerServiceAccount.namespace": "arc-system", | ||||||
| 		}, | 		}, | ||||||
| 		KubectlOptions: k8s.NewKubectlOptions("", "", namespaceName), | 		KubectlOptions: k8s.NewKubectlOptions("", "", namespaceName), | ||||||
| 	} | 	} | ||||||
|  | @ -114,6 +120,8 @@ func TestTemplateRenderedGitHubSecretErrorWithMissingAppInput(t *testing.T) { | ||||||
| 		SetValues: map[string]string{ | 		SetValues: map[string]string{ | ||||||
| 			"githubConfigUrl":                    "https://github.com/actions", | 			"githubConfigUrl":                    "https://github.com/actions", | ||||||
| 			"githubConfigSecret.github_app_id":   "10", | 			"githubConfigSecret.github_app_id":   "10", | ||||||
|  | 			"controllerServiceAccount.name":      "arc", | ||||||
|  | 			"controllerServiceAccount.namespace": "arc-system", | ||||||
| 		}, | 		}, | ||||||
| 		KubectlOptions: k8s.NewKubectlOptions("", "", namespaceName), | 		KubectlOptions: k8s.NewKubectlOptions("", "", namespaceName), | ||||||
| 	} | 	} | ||||||
|  | @ -138,6 +146,8 @@ func TestTemplateNotRenderedGitHubSecretWithPredefinedSecret(t *testing.T) { | ||||||
| 		SetValues: map[string]string{ | 		SetValues: map[string]string{ | ||||||
| 			"githubConfigUrl":                    "https://github.com/actions", | 			"githubConfigUrl":                    "https://github.com/actions", | ||||||
| 			"githubConfigSecret":                 "pre-defined-secret", | 			"githubConfigSecret":                 "pre-defined-secret", | ||||||
|  | 			"controllerServiceAccount.name":      "arc", | ||||||
|  | 			"controllerServiceAccount.namespace": "arc-system", | ||||||
| 		}, | 		}, | ||||||
| 		KubectlOptions: k8s.NewKubectlOptions("", "", namespaceName), | 		KubectlOptions: k8s.NewKubectlOptions("", "", namespaceName), | ||||||
| 	} | 	} | ||||||
|  | @ -160,6 +170,8 @@ func TestTemplateRenderedSetServiceAccountToNoPermission(t *testing.T) { | ||||||
| 		SetValues: map[string]string{ | 		SetValues: map[string]string{ | ||||||
| 			"githubConfigUrl":                    "https://github.com/actions", | 			"githubConfigUrl":                    "https://github.com/actions", | ||||||
| 			"githubConfigSecret.github_token":    "gh_token12345", | 			"githubConfigSecret.github_token":    "gh_token12345", | ||||||
|  | 			"controllerServiceAccount.name":      "arc", | ||||||
|  | 			"controllerServiceAccount.namespace": "arc-system", | ||||||
| 		}, | 		}, | ||||||
| 		KubectlOptions: k8s.NewKubectlOptions("", "", namespaceName), | 		KubectlOptions: k8s.NewKubectlOptions("", "", namespaceName), | ||||||
| 	} | 	} | ||||||
|  | @ -193,6 +205,8 @@ func TestTemplateRenderedSetServiceAccountToKubeMode(t *testing.T) { | ||||||
| 			"githubConfigUrl":                    "https://github.com/actions", | 			"githubConfigUrl":                    "https://github.com/actions", | ||||||
| 			"githubConfigSecret.github_token":    "gh_token12345", | 			"githubConfigSecret.github_token":    "gh_token12345", | ||||||
| 			"containerMode.type":                 "kubernetes", | 			"containerMode.type":                 "kubernetes", | ||||||
|  | 			"controllerServiceAccount.name":      "arc", | ||||||
|  | 			"controllerServiceAccount.namespace": "arc-system", | ||||||
| 		}, | 		}, | ||||||
| 		KubectlOptions: k8s.NewKubectlOptions("", "", namespaceName), | 		KubectlOptions: k8s.NewKubectlOptions("", "", namespaceName), | ||||||
| 	} | 	} | ||||||
|  | @ -251,6 +265,8 @@ func TestTemplateRenderedUserProvideSetServiceAccount(t *testing.T) { | ||||||
| 			"githubConfigUrl":                    "https://github.com/actions", | 			"githubConfigUrl":                    "https://github.com/actions", | ||||||
| 			"githubConfigSecret.github_token":    "gh_token12345", | 			"githubConfigSecret.github_token":    "gh_token12345", | ||||||
| 			"template.spec.serviceAccountName":   "test-service-account", | 			"template.spec.serviceAccountName":   "test-service-account", | ||||||
|  | 			"controllerServiceAccount.name":      "arc", | ||||||
|  | 			"controllerServiceAccount.namespace": "arc-system", | ||||||
| 		}, | 		}, | ||||||
| 		KubectlOptions: k8s.NewKubectlOptions("", "", namespaceName), | 		KubectlOptions: k8s.NewKubectlOptions("", "", namespaceName), | ||||||
| 	} | 	} | ||||||
|  | @ -279,6 +295,8 @@ func TestTemplateRenderedAutoScalingRunnerSet(t *testing.T) { | ||||||
| 		SetValues: map[string]string{ | 		SetValues: map[string]string{ | ||||||
| 			"githubConfigUrl":                    "https://github.com/actions", | 			"githubConfigUrl":                    "https://github.com/actions", | ||||||
| 			"githubConfigSecret.github_token":    "gh_token12345", | 			"githubConfigSecret.github_token":    "gh_token12345", | ||||||
|  | 			"controllerServiceAccount.name":      "arc", | ||||||
|  | 			"controllerServiceAccount.namespace": "arc-system", | ||||||
| 		}, | 		}, | ||||||
| 		KubectlOptions: k8s.NewKubectlOptions("", "", namespaceName), | 		KubectlOptions: k8s.NewKubectlOptions("", "", namespaceName), | ||||||
| 	} | 	} | ||||||
|  | @ -325,6 +343,8 @@ func TestTemplateRenderedAutoScalingRunnerSet_RunnerScaleSetName(t *testing.T) { | ||||||
| 			"githubConfigUrl":                    "https://github.com/actions", | 			"githubConfigUrl":                    "https://github.com/actions", | ||||||
| 			"githubConfigSecret.github_token":    "gh_token12345", | 			"githubConfigSecret.github_token":    "gh_token12345", | ||||||
| 			"runnerScaleSetName":                 "test-runner-scale-set-name", | 			"runnerScaleSetName":                 "test-runner-scale-set-name", | ||||||
|  | 			"controllerServiceAccount.name":      "arc", | ||||||
|  | 			"controllerServiceAccount.namespace": "arc-system", | ||||||
| 		}, | 		}, | ||||||
| 		KubectlOptions: k8s.NewKubectlOptions("", "", namespaceName), | 		KubectlOptions: k8s.NewKubectlOptions("", "", namespaceName), | ||||||
| 	} | 	} | ||||||
|  | @ -375,6 +395,8 @@ func TestTemplateRenderedAutoScalingRunnerSet_ProvideMetadata(t *testing.T) { | ||||||
| 			"template.metadata.labels.test2":      "test2", | 			"template.metadata.labels.test2":      "test2", | ||||||
| 			"template.metadata.annotations.test3": "test3", | 			"template.metadata.annotations.test3": "test3", | ||||||
| 			"template.metadata.annotations.test4": "test4", | 			"template.metadata.annotations.test4": "test4", | ||||||
|  | 			"controllerServiceAccount.name":       "arc", | ||||||
|  | 			"controllerServiceAccount.namespace":  "arc-system", | ||||||
| 		}, | 		}, | ||||||
| 		KubectlOptions: k8s.NewKubectlOptions("", "", namespaceName), | 		KubectlOptions: k8s.NewKubectlOptions("", "", namespaceName), | ||||||
| 	} | 	} | ||||||
|  | @ -417,6 +439,8 @@ func TestTemplateRenderedAutoScalingRunnerSet_MaxRunnersValidationError(t *testi | ||||||
| 			"githubConfigUrl":                    "https://github.com/actions", | 			"githubConfigUrl":                    "https://github.com/actions", | ||||||
| 			"githubConfigSecret.github_token":    "gh_token12345", | 			"githubConfigSecret.github_token":    "gh_token12345", | ||||||
| 			"maxRunners":                         "-1", | 			"maxRunners":                         "-1", | ||||||
|  | 			"controllerServiceAccount.name":      "arc", | ||||||
|  | 			"controllerServiceAccount.namespace": "arc-system", | ||||||
| 		}, | 		}, | ||||||
| 		KubectlOptions: k8s.NewKubectlOptions("", "", namespaceName), | 		KubectlOptions: k8s.NewKubectlOptions("", "", namespaceName), | ||||||
| 	} | 	} | ||||||
|  | @ -443,6 +467,8 @@ func TestTemplateRenderedAutoScalingRunnerSet_MinRunnersValidationError(t *testi | ||||||
| 			"githubConfigSecret.github_token":    "gh_token12345", | 			"githubConfigSecret.github_token":    "gh_token12345", | ||||||
| 			"maxRunners":                         "1", | 			"maxRunners":                         "1", | ||||||
| 			"minRunners":                         "-1", | 			"minRunners":                         "-1", | ||||||
|  | 			"controllerServiceAccount.name":      "arc", | ||||||
|  | 			"controllerServiceAccount.namespace": "arc-system", | ||||||
| 		}, | 		}, | ||||||
| 		KubectlOptions: k8s.NewKubectlOptions("", "", namespaceName), | 		KubectlOptions: k8s.NewKubectlOptions("", "", namespaceName), | ||||||
| 	} | 	} | ||||||
|  | @ -469,6 +495,8 @@ func TestTemplateRenderedAutoScalingRunnerSet_MinMaxRunnersValidationError(t *te | ||||||
| 			"githubConfigSecret.github_token":    "gh_token12345", | 			"githubConfigSecret.github_token":    "gh_token12345", | ||||||
| 			"maxRunners":                         "0", | 			"maxRunners":                         "0", | ||||||
| 			"minRunners":                         "1", | 			"minRunners":                         "1", | ||||||
|  | 			"controllerServiceAccount.name":      "arc", | ||||||
|  | 			"controllerServiceAccount.namespace": "arc-system", | ||||||
| 		}, | 		}, | ||||||
| 		KubectlOptions: k8s.NewKubectlOptions("", "", namespaceName), | 		KubectlOptions: k8s.NewKubectlOptions("", "", namespaceName), | ||||||
| 	} | 	} | ||||||
|  | @ -495,6 +523,8 @@ func TestTemplateRenderedAutoScalingRunnerSet_MinMaxRunnersValidationSameValue(t | ||||||
| 			"githubConfigSecret.github_token":    "gh_token12345", | 			"githubConfigSecret.github_token":    "gh_token12345", | ||||||
| 			"maxRunners":                         "0", | 			"maxRunners":                         "0", | ||||||
| 			"minRunners":                         "0", | 			"minRunners":                         "0", | ||||||
|  | 			"controllerServiceAccount.name":      "arc", | ||||||
|  | 			"controllerServiceAccount.namespace": "arc-system", | ||||||
| 		}, | 		}, | ||||||
| 		KubectlOptions: k8s.NewKubectlOptions("", "", namespaceName), | 		KubectlOptions: k8s.NewKubectlOptions("", "", namespaceName), | ||||||
| 	} | 	} | ||||||
|  | @ -523,6 +553,8 @@ func TestTemplateRenderedAutoScalingRunnerSet_MinMaxRunnersValidation_OnlyMin(t | ||||||
| 			"githubConfigUrl":                    "https://github.com/actions", | 			"githubConfigUrl":                    "https://github.com/actions", | ||||||
| 			"githubConfigSecret.github_token":    "gh_token12345", | 			"githubConfigSecret.github_token":    "gh_token12345", | ||||||
| 			"minRunners":                         "5", | 			"minRunners":                         "5", | ||||||
|  | 			"controllerServiceAccount.name":      "arc", | ||||||
|  | 			"controllerServiceAccount.namespace": "arc-system", | ||||||
| 		}, | 		}, | ||||||
| 		KubectlOptions: k8s.NewKubectlOptions("", "", namespaceName), | 		KubectlOptions: k8s.NewKubectlOptions("", "", namespaceName), | ||||||
| 	} | 	} | ||||||
|  | @ -551,6 +583,8 @@ func TestTemplateRenderedAutoScalingRunnerSet_MinMaxRunnersValidation_OnlyMax(t | ||||||
| 			"githubConfigUrl":                    "https://github.com/actions", | 			"githubConfigUrl":                    "https://github.com/actions", | ||||||
| 			"githubConfigSecret.github_token":    "gh_token12345", | 			"githubConfigSecret.github_token":    "gh_token12345", | ||||||
| 			"maxRunners":                         "5", | 			"maxRunners":                         "5", | ||||||
|  | 			"controllerServiceAccount.name":      "arc", | ||||||
|  | 			"controllerServiceAccount.namespace": "arc-system", | ||||||
| 		}, | 		}, | ||||||
| 		KubectlOptions: k8s.NewKubectlOptions("", "", namespaceName), | 		KubectlOptions: k8s.NewKubectlOptions("", "", namespaceName), | ||||||
| 	} | 	} | ||||||
|  | @ -605,6 +639,10 @@ func TestTemplateRenderedAutoScalingRunnerSet_ExtraVolumes(t *testing.T) { | ||||||
| 	namespaceName := "test-" + strings.ToLower(random.UniqueId()) | 	namespaceName := "test-" + strings.ToLower(random.UniqueId()) | ||||||
| 
 | 
 | ||||||
| 	options := &helm.Options{ | 	options := &helm.Options{ | ||||||
|  | 		SetValues: map[string]string{ | ||||||
|  | 			"controllerServiceAccount.name":      "arc", | ||||||
|  | 			"controllerServiceAccount.namespace": "arc-system", | ||||||
|  | 		}, | ||||||
| 		ValuesFiles:    []string{testValuesPath}, | 		ValuesFiles:    []string{testValuesPath}, | ||||||
| 		KubectlOptions: k8s.NewKubectlOptions("", "", namespaceName), | 		KubectlOptions: k8s.NewKubectlOptions("", "", namespaceName), | ||||||
| 	} | 	} | ||||||
|  | @ -635,6 +673,10 @@ func TestTemplateRenderedAutoScalingRunnerSet_DinD_ExtraVolumes(t *testing.T) { | ||||||
| 	namespaceName := "test-" + strings.ToLower(random.UniqueId()) | 	namespaceName := "test-" + strings.ToLower(random.UniqueId()) | ||||||
| 
 | 
 | ||||||
| 	options := &helm.Options{ | 	options := &helm.Options{ | ||||||
|  | 		SetValues: map[string]string{ | ||||||
|  | 			"controllerServiceAccount.name":      "arc", | ||||||
|  | 			"controllerServiceAccount.namespace": "arc-system", | ||||||
|  | 		}, | ||||||
| 		ValuesFiles:    []string{testValuesPath}, | 		ValuesFiles:    []string{testValuesPath}, | ||||||
| 		KubectlOptions: k8s.NewKubectlOptions("", "", namespaceName), | 		KubectlOptions: k8s.NewKubectlOptions("", "", namespaceName), | ||||||
| 	} | 	} | ||||||
|  | @ -667,6 +709,10 @@ func TestTemplateRenderedAutoScalingRunnerSet_K8S_ExtraVolumes(t *testing.T) { | ||||||
| 	namespaceName := "test-" + strings.ToLower(random.UniqueId()) | 	namespaceName := "test-" + strings.ToLower(random.UniqueId()) | ||||||
| 
 | 
 | ||||||
| 	options := &helm.Options{ | 	options := &helm.Options{ | ||||||
|  | 		SetValues: map[string]string{ | ||||||
|  | 			"controllerServiceAccount.name":      "arc", | ||||||
|  | 			"controllerServiceAccount.namespace": "arc-system", | ||||||
|  | 		}, | ||||||
| 		ValuesFiles:    []string{testValuesPath}, | 		ValuesFiles:    []string{testValuesPath}, | ||||||
| 		KubectlOptions: k8s.NewKubectlOptions("", "", namespaceName), | 		KubectlOptions: k8s.NewKubectlOptions("", "", namespaceName), | ||||||
| 	} | 	} | ||||||
|  | @ -698,6 +744,8 @@ func TestTemplateRenderedAutoScalingRunnerSet_EnableDinD(t *testing.T) { | ||||||
| 			"githubConfigUrl":                    "https://github.com/actions", | 			"githubConfigUrl":                    "https://github.com/actions", | ||||||
| 			"githubConfigSecret.github_token":    "gh_token12345", | 			"githubConfigSecret.github_token":    "gh_token12345", | ||||||
| 			"containerMode.type":                 "dind", | 			"containerMode.type":                 "dind", | ||||||
|  | 			"controllerServiceAccount.name":      "arc", | ||||||
|  | 			"controllerServiceAccount.namespace": "arc-system", | ||||||
| 		}, | 		}, | ||||||
| 		KubectlOptions: k8s.NewKubectlOptions("", "", namespaceName), | 		KubectlOptions: k8s.NewKubectlOptions("", "", namespaceName), | ||||||
| 	} | 	} | ||||||
|  | @ -787,6 +835,8 @@ func TestTemplateRenderedAutoScalingRunnerSet_EnableKubernetesMode(t *testing.T) | ||||||
| 			"githubConfigUrl":                    "https://github.com/actions", | 			"githubConfigUrl":                    "https://github.com/actions", | ||||||
| 			"githubConfigSecret.github_token":    "gh_token12345", | 			"githubConfigSecret.github_token":    "gh_token12345", | ||||||
| 			"containerMode.type":                 "kubernetes", | 			"containerMode.type":                 "kubernetes", | ||||||
|  | 			"controllerServiceAccount.name":      "arc", | ||||||
|  | 			"controllerServiceAccount.namespace": "arc-system", | ||||||
| 		}, | 		}, | ||||||
| 		KubectlOptions: k8s.NewKubectlOptions("", "", namespaceName), | 		KubectlOptions: k8s.NewKubectlOptions("", "", namespaceName), | ||||||
| 	} | 	} | ||||||
|  | @ -841,6 +891,8 @@ func TestTemplateRenderedAutoScalingRunnerSet_UsePredefinedSecret(t *testing.T) | ||||||
| 		SetValues: map[string]string{ | 		SetValues: map[string]string{ | ||||||
| 			"githubConfigUrl":                    "https://github.com/actions", | 			"githubConfigUrl":                    "https://github.com/actions", | ||||||
| 			"githubConfigSecret":                 "pre-defined-secrets", | 			"githubConfigSecret":                 "pre-defined-secrets", | ||||||
|  | 			"controllerServiceAccount.name":      "arc", | ||||||
|  | 			"controllerServiceAccount.namespace": "arc-system", | ||||||
| 		}, | 		}, | ||||||
| 		KubectlOptions: k8s.NewKubectlOptions("", "", namespaceName), | 		KubectlOptions: k8s.NewKubectlOptions("", "", namespaceName), | ||||||
| 	} | 	} | ||||||
|  | @ -873,6 +925,8 @@ func TestTemplateRenderedAutoScalingRunnerSet_ErrorOnEmptyPredefinedSecret(t *te | ||||||
| 		SetValues: map[string]string{ | 		SetValues: map[string]string{ | ||||||
| 			"githubConfigUrl":                    "https://github.com/actions", | 			"githubConfigUrl":                    "https://github.com/actions", | ||||||
| 			"githubConfigSecret":                 "", | 			"githubConfigSecret":                 "", | ||||||
|  | 			"controllerServiceAccount.name":      "arc", | ||||||
|  | 			"controllerServiceAccount.namespace": "arc-system", | ||||||
| 		}, | 		}, | ||||||
| 		KubectlOptions: k8s.NewKubectlOptions("", "", namespaceName), | 		KubectlOptions: k8s.NewKubectlOptions("", "", namespaceName), | ||||||
| 	} | 	} | ||||||
|  | @ -897,6 +951,8 @@ func TestTemplateRenderedWithProxy(t *testing.T) { | ||||||
| 		SetValues: map[string]string{ | 		SetValues: map[string]string{ | ||||||
| 			"githubConfigUrl":                    "https://github.com/actions", | 			"githubConfigUrl":                    "https://github.com/actions", | ||||||
| 			"githubConfigSecret":                 "pre-defined-secrets", | 			"githubConfigSecret":                 "pre-defined-secrets", | ||||||
|  | 			"controllerServiceAccount.name":      "arc", | ||||||
|  | 			"controllerServiceAccount.namespace": "arc-system", | ||||||
| 			"proxy.http.url":                     "http://proxy.example.com", | 			"proxy.http.url":                     "http://proxy.example.com", | ||||||
| 			"proxy.http.credentialSecretRef":     "http-secret", | 			"proxy.http.credentialSecretRef":     "http-secret", | ||||||
| 			"proxy.https.url":                    "https://proxy.example.com", | 			"proxy.https.url":                    "https://proxy.example.com", | ||||||
|  | @ -961,6 +1017,8 @@ func TestTemplateRenderedWithTLS(t *testing.T) { | ||||||
| 					"githubServerTLS.certificateFrom.configMapKeyRef.name": "certs-configmap", | 					"githubServerTLS.certificateFrom.configMapKeyRef.name": "certs-configmap", | ||||||
| 					"githubServerTLS.certificateFrom.configMapKeyRef.key":  "cert.pem", | 					"githubServerTLS.certificateFrom.configMapKeyRef.key":  "cert.pem", | ||||||
| 					"githubServerTLS.runnerMountPath":                      "/runner/mount/path", | 					"githubServerTLS.runnerMountPath":                      "/runner/mount/path", | ||||||
|  | 					"controllerServiceAccount.name":                        "arc", | ||||||
|  | 					"controllerServiceAccount.namespace":                   "arc-system", | ||||||
| 				}, | 				}, | ||||||
| 				KubectlOptions: k8s.NewKubectlOptions("", "", namespaceName), | 				KubectlOptions: k8s.NewKubectlOptions("", "", namespaceName), | ||||||
| 			} | 			} | ||||||
|  | @ -1018,6 +1076,8 @@ func TestTemplateRenderedWithTLS(t *testing.T) { | ||||||
| 					"githubServerTLS.certificateFrom.configMapKeyRef.key":  "cert.pem", | 					"githubServerTLS.certificateFrom.configMapKeyRef.key":  "cert.pem", | ||||||
| 					"githubServerTLS.runnerMountPath":                      "/runner/mount/path/", | 					"githubServerTLS.runnerMountPath":                      "/runner/mount/path/", | ||||||
| 					"containerMode.type":                                   "dind", | 					"containerMode.type":                                   "dind", | ||||||
|  | 					"controllerServiceAccount.name":                        "arc", | ||||||
|  | 					"controllerServiceAccount.namespace":                   "arc-system", | ||||||
| 				}, | 				}, | ||||||
| 				KubectlOptions: k8s.NewKubectlOptions("", "", namespaceName), | 				KubectlOptions: k8s.NewKubectlOptions("", "", namespaceName), | ||||||
| 			} | 			} | ||||||
|  | @ -1075,6 +1135,8 @@ func TestTemplateRenderedWithTLS(t *testing.T) { | ||||||
| 					"githubServerTLS.certificateFrom.configMapKeyRef.key":  "cert.pem", | 					"githubServerTLS.certificateFrom.configMapKeyRef.key":  "cert.pem", | ||||||
| 					"githubServerTLS.runnerMountPath":                      "/runner/mount/path", | 					"githubServerTLS.runnerMountPath":                      "/runner/mount/path", | ||||||
| 					"containerMode.type":                                   "kubernetes", | 					"containerMode.type":                                   "kubernetes", | ||||||
|  | 					"controllerServiceAccount.name":                        "arc", | ||||||
|  | 					"controllerServiceAccount.namespace":                   "arc-system", | ||||||
| 				}, | 				}, | ||||||
| 				KubectlOptions: k8s.NewKubectlOptions("", "", namespaceName), | 				KubectlOptions: k8s.NewKubectlOptions("", "", namespaceName), | ||||||
| 			} | 			} | ||||||
|  | @ -1132,6 +1194,8 @@ func TestTemplateRenderedWithTLS(t *testing.T) { | ||||||
| 					"githubConfigSecret": "pre-defined-secrets", | 					"githubConfigSecret": "pre-defined-secrets", | ||||||
| 					"githubServerTLS.certificateFrom.configMapKeyRef.name": "certs-configmap", | 					"githubServerTLS.certificateFrom.configMapKeyRef.name": "certs-configmap", | ||||||
| 					"githubServerTLS.certificateFrom.configMapKeyRef.key":  "cert.pem", | 					"githubServerTLS.certificateFrom.configMapKeyRef.key":  "cert.pem", | ||||||
|  | 					"controllerServiceAccount.name":                        "arc", | ||||||
|  | 					"controllerServiceAccount.namespace":                   "arc-system", | ||||||
| 				}, | 				}, | ||||||
| 				KubectlOptions: k8s.NewKubectlOptions("", "", namespaceName), | 				KubectlOptions: k8s.NewKubectlOptions("", "", namespaceName), | ||||||
| 			} | 			} | ||||||
|  | @ -1185,6 +1249,8 @@ func TestTemplateRenderedWithTLS(t *testing.T) { | ||||||
| 					"githubServerTLS.certificateFrom.configMapKeyRef.name": "certs-configmap", | 					"githubServerTLS.certificateFrom.configMapKeyRef.name": "certs-configmap", | ||||||
| 					"githubServerTLS.certificateFrom.configMapKeyRef.key":  "cert.pem", | 					"githubServerTLS.certificateFrom.configMapKeyRef.key":  "cert.pem", | ||||||
| 					"containerMode.type":                 "dind", | 					"containerMode.type":                 "dind", | ||||||
|  | 					"controllerServiceAccount.name":      "arc", | ||||||
|  | 					"controllerServiceAccount.namespace": "arc-system", | ||||||
| 				}, | 				}, | ||||||
| 				KubectlOptions: k8s.NewKubectlOptions("", "", namespaceName), | 				KubectlOptions: k8s.NewKubectlOptions("", "", namespaceName), | ||||||
| 			} | 			} | ||||||
|  | @ -1238,6 +1304,8 @@ func TestTemplateRenderedWithTLS(t *testing.T) { | ||||||
| 					"githubServerTLS.certificateFrom.configMapKeyRef.name": "certs-configmap", | 					"githubServerTLS.certificateFrom.configMapKeyRef.name": "certs-configmap", | ||||||
| 					"githubServerTLS.certificateFrom.configMapKeyRef.key":  "cert.pem", | 					"githubServerTLS.certificateFrom.configMapKeyRef.key":  "cert.pem", | ||||||
| 					"containerMode.type":                 "kubernetes", | 					"containerMode.type":                 "kubernetes", | ||||||
|  | 					"controllerServiceAccount.name":      "arc", | ||||||
|  | 					"controllerServiceAccount.namespace": "arc-system", | ||||||
| 				}, | 				}, | ||||||
| 				KubectlOptions: k8s.NewKubectlOptions("", "", namespaceName), | 				KubectlOptions: k8s.NewKubectlOptions("", "", namespaceName), | ||||||
| 			} | 			} | ||||||
|  | @ -1295,6 +1363,8 @@ func TestTemplateNamingConstraints(t *testing.T) { | ||||||
| 	setValues := map[string]string{ | 	setValues := map[string]string{ | ||||||
| 		"githubConfigUrl":                    "https://github.com/actions", | 		"githubConfigUrl":                    "https://github.com/actions", | ||||||
| 		"githubConfigSecret":                 "", | 		"githubConfigSecret":                 "", | ||||||
|  | 		"controllerServiceAccount.name":      "arc", | ||||||
|  | 		"controllerServiceAccount.namespace": "arc-system", | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	tt := map[string]struct { | 	tt := map[string]struct { | ||||||
|  | @ -1341,6 +1411,8 @@ func TestTemplateRenderedGitHubConfigUrlEndsWIthSlash(t *testing.T) { | ||||||
| 		SetValues: map[string]string{ | 		SetValues: map[string]string{ | ||||||
| 			"githubConfigUrl":                    "https://github.com/actions/", | 			"githubConfigUrl":                    "https://github.com/actions/", | ||||||
| 			"githubConfigSecret.github_token":    "gh_token12345", | 			"githubConfigSecret.github_token":    "gh_token12345", | ||||||
|  | 			"controllerServiceAccount.name":      "arc", | ||||||
|  | 			"controllerServiceAccount.namespace": "arc-system", | ||||||
| 		}, | 		}, | ||||||
| 		KubectlOptions: k8s.NewKubectlOptions("", "", namespaceName), | 		KubectlOptions: k8s.NewKubectlOptions("", "", namespaceName), | ||||||
| 	} | 	} | ||||||
|  | @ -1354,3 +1426,97 @@ func TestTemplateRenderedGitHubConfigUrlEndsWIthSlash(t *testing.T) { | ||||||
| 	assert.Equal(t, "test-runners", ars.Name) | 	assert.Equal(t, "test-runners", ars.Name) | ||||||
| 	assert.Equal(t, "https://github.com/actions", ars.Spec.GitHubConfigUrl) | 	assert.Equal(t, "https://github.com/actions", ars.Spec.GitHubConfigUrl) | ||||||
| } | } | ||||||
|  | 
 | ||||||
|  | func TestTemplate_CreateManagerRole(t *testing.T) { | ||||||
|  | 	t.Parallel() | ||||||
|  | 
 | ||||||
|  | 	// Path to the helm chart we will test
 | ||||||
|  | 	helmChartPath, err := filepath.Abs("../../gha-runner-scale-set") | ||||||
|  | 	require.NoError(t, err) | ||||||
|  | 
 | ||||||
|  | 	releaseName := "test-runners" | ||||||
|  | 	namespaceName := "test-" + strings.ToLower(random.UniqueId()) | ||||||
|  | 
 | ||||||
|  | 	options := &helm.Options{ | ||||||
|  | 		SetValues: map[string]string{ | ||||||
|  | 			"githubConfigUrl":                    "https://github.com/actions", | ||||||
|  | 			"githubConfigSecret.github_token":    "gh_token12345", | ||||||
|  | 			"controllerServiceAccount.name":      "arc", | ||||||
|  | 			"controllerServiceAccount.namespace": "arc-system", | ||||||
|  | 		}, | ||||||
|  | 		KubectlOptions: k8s.NewKubectlOptions("", "", namespaceName), | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	output := helm.RenderTemplate(t, options, helmChartPath, releaseName, []string{"templates/manager_role.yaml"}) | ||||||
|  | 
 | ||||||
|  | 	var managerRole rbacv1.Role | ||||||
|  | 	helm.UnmarshalK8SYaml(t, output, &managerRole) | ||||||
|  | 
 | ||||||
|  | 	assert.Equal(t, namespaceName, managerRole.Namespace, "namespace should match the namespace of the Helm release") | ||||||
|  | 	assert.Equal(t, "test-runners-gha-runner-scale-set-manager-role", managerRole.Name) | ||||||
|  | 	assert.Equal(t, 5, len(managerRole.Rules)) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func TestTemplate_CreateManagerRole_UseConfigMaps(t *testing.T) { | ||||||
|  | 	t.Parallel() | ||||||
|  | 
 | ||||||
|  | 	// Path to the helm chart we will test
 | ||||||
|  | 	helmChartPath, err := filepath.Abs("../../gha-runner-scale-set") | ||||||
|  | 	require.NoError(t, err) | ||||||
|  | 
 | ||||||
|  | 	releaseName := "test-runners" | ||||||
|  | 	namespaceName := "test-" + strings.ToLower(random.UniqueId()) | ||||||
|  | 
 | ||||||
|  | 	options := &helm.Options{ | ||||||
|  | 		SetValues: map[string]string{ | ||||||
|  | 			"githubConfigUrl":                                      "https://github.com/actions", | ||||||
|  | 			"githubConfigSecret.github_token":                      "gh_token12345", | ||||||
|  | 			"controllerServiceAccount.name":                        "arc", | ||||||
|  | 			"controllerServiceAccount.namespace":                   "arc-system", | ||||||
|  | 			"githubServerTLS.certificateFrom.configMapKeyRef.name": "test", | ||||||
|  | 		}, | ||||||
|  | 		KubectlOptions: k8s.NewKubectlOptions("", "", namespaceName), | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	output := helm.RenderTemplate(t, options, helmChartPath, releaseName, []string{"templates/manager_role.yaml"}) | ||||||
|  | 
 | ||||||
|  | 	var managerRole rbacv1.Role | ||||||
|  | 	helm.UnmarshalK8SYaml(t, output, &managerRole) | ||||||
|  | 
 | ||||||
|  | 	assert.Equal(t, namespaceName, managerRole.Namespace, "namespace should match the namespace of the Helm release") | ||||||
|  | 	assert.Equal(t, "test-runners-gha-runner-scale-set-manager-role", managerRole.Name) | ||||||
|  | 	assert.Equal(t, 6, len(managerRole.Rules)) | ||||||
|  | 	assert.Equal(t, "configmaps", managerRole.Rules[5].Resources[0]) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func TestTemplate_CreateManagerRoleBinding(t *testing.T) { | ||||||
|  | 	t.Parallel() | ||||||
|  | 
 | ||||||
|  | 	// Path to the helm chart we will test
 | ||||||
|  | 	helmChartPath, err := filepath.Abs("../../gha-runner-scale-set") | ||||||
|  | 	require.NoError(t, err) | ||||||
|  | 
 | ||||||
|  | 	releaseName := "test-runners" | ||||||
|  | 	namespaceName := "test-" + strings.ToLower(random.UniqueId()) | ||||||
|  | 
 | ||||||
|  | 	options := &helm.Options{ | ||||||
|  | 		SetValues: map[string]string{ | ||||||
|  | 			"githubConfigUrl":                    "https://github.com/actions", | ||||||
|  | 			"githubConfigSecret.github_token":    "gh_token12345", | ||||||
|  | 			"controllerServiceAccount.name":      "arc", | ||||||
|  | 			"controllerServiceAccount.namespace": "arc-system", | ||||||
|  | 		}, | ||||||
|  | 		KubectlOptions: k8s.NewKubectlOptions("", "", namespaceName), | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	output := helm.RenderTemplate(t, options, helmChartPath, releaseName, []string{"templates/manager_role_binding.yaml"}) | ||||||
|  | 
 | ||||||
|  | 	var managerRoleBinding rbacv1.RoleBinding | ||||||
|  | 	helm.UnmarshalK8SYaml(t, output, &managerRoleBinding) | ||||||
|  | 
 | ||||||
|  | 	assert.Equal(t, namespaceName, managerRoleBinding.Namespace, "namespace should match the namespace of the Helm release") | ||||||
|  | 	assert.Equal(t, "test-runners-gha-runner-scale-set-manager-role-binding", managerRoleBinding.Name) | ||||||
|  | 	assert.Equal(t, "test-runners-gha-runner-scale-set-manager-role", managerRoleBinding.RoleRef.Name) | ||||||
|  | 	assert.Equal(t, "arc", managerRoleBinding.Subjects[0].Name) | ||||||
|  | 	assert.Equal(t, "arc-system", managerRoleBinding.Subjects[0].Namespace) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | @ -3,3 +3,6 @@ githubConfigSecret: | ||||||
|   github_token: test |   github_token: test | ||||||
| maxRunners: 10 | maxRunners: 10 | ||||||
| minRunners: 5 | minRunners: 5 | ||||||
|  | controllerServiceAccount: | ||||||
|  |   name: "arc" | ||||||
|  |   namespace: "arc-system" | ||||||
|  | @ -161,3 +161,13 @@ containerMode: | ||||||
|     resources: |     resources: | ||||||
|       requests: |       requests: | ||||||
|         storage: 1Gi |         storage: 1Gi | ||||||
|  | 
 | ||||||
|  | ## Optional controller service account that needs to have required Role and RoleBinding  | ||||||
|  | ## to operate this gha-runner-scale-set installation. | ||||||
|  | ## The helm chart will try to find the controller deployment and its service account at installation time. | ||||||
|  | ## In case the helm chart can't find the right service account, you can explicitly pass in the following value | ||||||
|  | ## to help it finish RoleBinding with the right service account. | ||||||
|  | ## Note: if your controller is installed to only watch a single namespace, you have to pass these values explicitly. | ||||||
|  | # controllerServiceAccount: | ||||||
|  | #   namespace: arc-system | ||||||
|  | #   name: test-arc-gha-runner-scale-set-controller | ||||||
		Loading…
	
		Reference in New Issue