From a628793574cac565eb43664a424be6bc8dc41f17 Mon Sep 17 00:00:00 2001 From: Nikola Jokic Date: Thu, 30 Apr 2026 21:59:13 +0200 Subject: [PATCH] Port pprof to experimental charts --- .../templates/_controller_template.tpl | 7 ++ .../controller_deployment_args_test.yaml | 61 ++++++++++++++ .../tests/template_test.go | 79 +++++++++++++++++++ .../values.yaml | 4 + .../tests/template_test.go | 61 -------------- 5 files changed, 151 insertions(+), 61 deletions(-) delete mode 100644 charts/gha-runner-scale-set-experimental/tests/template_test.go diff --git a/charts/gha-runner-scale-set-controller-experimental/templates/_controller_template.tpl b/charts/gha-runner-scale-set-controller-experimental/templates/_controller_template.tpl index 44a17b3c..84a6c305 100644 --- a/charts/gha-runner-scale-set-controller-experimental/templates/_controller_template.tpl +++ b/charts/gha-runner-scale-set-controller-experimental/templates/_controller_template.tpl @@ -64,6 +64,9 @@ args: - "--listener-metrics-endpoint=" - "--metrics-addr=0" {{- end }} +{{- if .Values.controller.pprof.addr }} + - "--pprof-addr={{ .Values.controller.pprof.addr }}" +{{- end }} {{- range .Values.controller.manager.config.excludeLabelPropagationPrefixes }} - "--exclude-label-propagation-prefix={{ . }}" {{- end }} @@ -86,6 +89,10 @@ args: {{- $metricsPort := dict "containerPort" ((regexReplaceAll ":([0-9]+)" .Values.controller.metrics.controllerManagerAddr "${1}") | int) "protocol" "TCP" "name" "metrics" -}} {{- $ports = append $ports $metricsPort -}} {{- end }} +{{- if .Values.controller.pprof.addr }} +{{- $pprofPort := dict "containerPort" ((required "Values.controller.pprof.addr must end with a numeric port" (regexFind "[0-9]+$" .Values.controller.pprof.addr)) | int) "protocol" "TCP" "name" "pprof" -}} +{{- $ports = append $ports $pprofPort -}} +{{- end }} {{- with .Values.controller.manager.container.extraPorts }} {{- if kindIs "slice" . }} {{- $ports = concat $ports . -}} diff --git a/charts/gha-runner-scale-set-controller-experimental/tests/controller_deployment_args_test.yaml b/charts/gha-runner-scale-set-controller-experimental/tests/controller_deployment_args_test.yaml index f2f6b75c..3d9155da 100644 --- a/charts/gha-runner-scale-set-controller-experimental/tests/controller_deployment_args_test.yaml +++ b/charts/gha-runner-scale-set-controller-experimental/tests/controller_deployment_args_test.yaml @@ -73,3 +73,64 @@ tests: - contains: path: spec.template.spec.containers[0].args content: "--listener-metrics-endpoint=/metrics" + + - it: should not include pprof arg by default + release: + name: "test-arc" + namespace: "test-ns" + asserts: + - notContains: + path: spec.template.spec.containers[0].args + content: "--pprof-addr=" + + - it: should not render pprof port by default + release: + name: "test-arc" + namespace: "test-ns" + asserts: + - notContains: + path: spec.template.spec.containers[0].ports + content: + name: pprof + + - it: should include pprof arg when configured + set: + controller: + pprof: + addr: ":6060" + release: + name: "test-arc" + namespace: "test-ns" + asserts: + - contains: + path: spec.template.spec.containers[0].args + content: "--pprof-addr=:6060" + + - it: should render pprof port when configured + set: + controller: + pprof: + addr: ":6060" + release: + name: "test-arc" + namespace: "test-ns" + asserts: + - contains: + path: spec.template.spec.containers[0].ports + content: + name: pprof + containerPort: 6060 + protocol: TCP + + - it: should fail when pprof addr is malformed (no numeric port) + set: + controller: + pprof: + addr: "localhost" + release: + name: "test-arc" + namespace: "test-ns" + asserts: + - failedTemplate: + errorMessage: "Values.controller.pprof.addr must end with a numeric port" + template: deployment.yaml diff --git a/charts/gha-runner-scale-set-controller-experimental/tests/template_test.go b/charts/gha-runner-scale-set-controller-experimental/tests/template_test.go index 80870ec3..767b5d88 100644 --- a/charts/gha-runner-scale-set-controller-experimental/tests/template_test.go +++ b/charts/gha-runner-scale-set-controller-experimental/tests/template_test.go @@ -50,3 +50,82 @@ func TestTemplate_RenderedDeployment_UsesChartMetadataLabels(t *testing.T) { assert.Equal(t, "gha-rs-controller-"+chart.Version, deployment.Labels["helm.sh/chart"]) assert.Equal(t, chart.AppVersion, deployment.Labels["app.kubernetes.io/version"]) } + +func TestTemplate_PprofDisabledByDefault(t *testing.T) { + t.Parallel() + + helmChartPath, err := filepath.Abs("../../gha-runner-scale-set-controller-experimental") + require.NoError(t, err) + + releaseName := "test-arc" + namespaceName := "test-" + strings.ToLower(random.UniqueId()) + + options := &helm.Options{ + Logger: logger.Discard, + KubectlOptions: k8s.NewKubectlOptions("", "", namespaceName), + } + + output := helm.RenderTemplate(t, options, helmChartPath, releaseName, []string{"templates/deployment.yaml"}) + + var deployment appsv1.Deployment + helm.UnmarshalK8SYaml(t, output, &deployment) + + require.NotEmpty(t, deployment.Spec.Template.Spec.Containers, "Expected at least one container") + managerContainer := deployment.Spec.Template.Spec.Containers[0] + + // Assert no pprof arg when default values + for _, arg := range managerContainer.Args { + assert.NotContains(t, arg, "--pprof-addr=", "Expected no pprof arg by default") + } + + // Assert no pprof port when default values + for _, port := range managerContainer.Ports { + assert.NotEqual(t, "pprof", port.Name, "Expected no pprof port by default") + } +} + +func TestTemplate_PprofEnabledWhenConfigured(t *testing.T) { + t.Parallel() + + helmChartPath, err := filepath.Abs("../../gha-runner-scale-set-controller-experimental") + require.NoError(t, err) + + releaseName := "test-arc" + namespaceName := "test-" + strings.ToLower(random.UniqueId()) + + options := &helm.Options{ + Logger: logger.Discard, + KubectlOptions: k8s.NewKubectlOptions("", "", namespaceName), + SetValues: map[string]string{ + "controller.pprof.addr": ":6060", + }, + } + + output := helm.RenderTemplate(t, options, helmChartPath, releaseName, []string{"templates/deployment.yaml"}) + + var deployment appsv1.Deployment + helm.UnmarshalK8SYaml(t, output, &deployment) + + require.NotEmpty(t, deployment.Spec.Template.Spec.Containers, "Expected at least one container") + managerContainer := deployment.Spec.Template.Spec.Containers[0] + + // Assert pprof arg is present + foundPprofArg := false + for _, arg := range managerContainer.Args { + if arg == "--pprof-addr=:6060" { + foundPprofArg = true + break + } + } + assert.True(t, foundPprofArg, "Expected --pprof-addr=:6060 arg when controller.pprof.addr is configured") + + // Assert pprof port is present + foundPprofPort := false + for _, port := range managerContainer.Ports { + if port.Name == "pprof" && port.ContainerPort == 6060 && port.Protocol == "TCP" { + foundPprofPort = true + break + } + } + assert.True(t, foundPprofPort, "Expected pprof port (6060) when controller.pprof.addr is configured") +} diff --git a/charts/gha-runner-scale-set-controller-experimental/values.yaml b/charts/gha-runner-scale-set-controller-experimental/values.yaml index 75bcc314..faa2f2f7 100644 --- a/charts/gha-runner-scale-set-controller-experimental/values.yaml +++ b/charts/gha-runner-scale-set-controller-experimental/values.yaml @@ -108,3 +108,7 @@ controller: # listenerAddr: ":8080" # listenerEndpoint: "/metrics" + # Pprof configuration. If omitted, pprof is disabled. + pprof: {} + # addr: ":6060" + diff --git a/charts/gha-runner-scale-set-experimental/tests/template_test.go b/charts/gha-runner-scale-set-experimental/tests/template_test.go deleted file mode 100644 index 2a1aa615..00000000 --- a/charts/gha-runner-scale-set-experimental/tests/template_test.go +++ /dev/null @@ -1,61 +0,0 @@ -package tests - -import ( - "os" - "path/filepath" - "strings" - "testing" - - v1alpha1 "github.com/actions/actions-runner-controller/apis/actions.github.com/v1alpha1" - "github.com/gruntwork-io/terratest/modules/helm" - "github.com/gruntwork-io/terratest/modules/k8s" - "github.com/gruntwork-io/terratest/modules/logger" - "github.com/gruntwork-io/terratest/modules/random" - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" - "gopkg.in/yaml.v2" -) - -type Chart struct { - Version string `yaml:"version"` - AppVersion string `yaml:"appVersion"` -} - -func TestTemplate_RenderedAutoscalingRunnerSet_UsesChartMetadataLabels(t *testing.T) { - t.Parallel() - - helmChartPath, err := filepath.Abs("../../gha-runner-scale-set-experimental") - require.NoError(t, err) - - chartContent, err := os.ReadFile(filepath.Join(helmChartPath, "Chart.yaml")) - require.NoError(t, err) - - chart := new(Chart) - err = yaml.Unmarshal(chartContent, chart) - require.NoError(t, err) - - releaseName := "test-runners" - namespaceName := "test-" + strings.ToLower(random.UniqueId()) - - options := &helm.Options{ - Logger: logger.Discard, - SetValues: map[string]string{ - "scaleset.name": "test", - "auth.url": "https://github.com/actions", - "auth.githubToken": "gh_token12345", - "controllerServiceAccount.name": "arc", - "controllerServiceAccount.namespace": "arc-system", - }, - KubectlOptions: k8s.NewKubectlOptions("", "", namespaceName), - } - - output := helm.RenderTemplate(t, options, helmChartPath, releaseName, []string{"templates/autoscalingrunnserset.yaml"}) - - var autoscalingRunnerSet v1alpha1.AutoscalingRunnerSet - helm.UnmarshalK8SYaml(t, output, &autoscalingRunnerSet) - - assert.Equal(t, "gha-rs-"+chart.Version, autoscalingRunnerSet.Labels["helm.sh/chart"]) - assert.Equal(t, chart.AppVersion, autoscalingRunnerSet.Labels["app.kubernetes.io/version"]) - assert.Equal(t, "gha-rs-"+chart.Version, autoscalingRunnerSet.Spec.Template.Labels["helm.sh/chart"]) - assert.Equal(t, chart.AppVersion, autoscalingRunnerSet.Spec.Template.Labels["app.kubernetes.io/version"]) -}