From bfd0d5c0846531b458a820befcc3f0c93e673b8b Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Thu, 12 Mar 2026 11:59:24 -0700 Subject: [PATCH] fix(helm): use componentName for all service names to fix truncation mismatch (#8612) * fix(helm): use componentName for all service names to fix truncation mismatch (#8610) PR #8143 updated statefulsets and deployments to use the componentName helper (which truncates the fullname before appending the suffix), but left service definitions using the old `printf + trunc 63` pattern. When release names are long enough, these two strategies produce different names, causing DNS resolution failures (e.g., S3 cannot find the filer-client service and falls back to localhost:8888). Unify all service name definitions and cluster address helpers to use the componentName helper consistently. * refactor(helm): simplify cluster address helpers with ternary * test(helm): add regression test for service name truncation with long release names Renders the chart with a >63-char fullname in both normal and all-in-one modes, then asserts that Service metadata.name values match the hostnames produced by cluster.masterAddress, cluster.filerAddress, and the S3 deployment's -filer= argument. Prevents future truncation/DNS mismatch regressions like #8610. * fix(helm-ci): limit S3_FILER_HOST extraction to first match --- .github/workflows/helm_ci.yml | 63 +++++++++++++++++++ .../all-in-one/all-in-one-service.yml | 2 +- .../templates/filer/filer-service-client.yaml | 2 +- .../templates/filer/filer-service.yaml | 2 +- .../templates/master/master-service.yaml | 2 +- .../seaweedfs/templates/s3/s3-service.yaml | 2 +- .../templates/sftp/sftp-service.yaml | 2 +- .../seaweedfs/templates/shared/_helpers.tpl | 14 ++--- .../templates/volume/volume-service.yaml | 2 +- .../templates/worker/worker-service.yaml | 2 +- 10 files changed, 75 insertions(+), 18 deletions(-) diff --git a/.github/workflows/helm_ci.yml b/.github/workflows/helm_ci.yml index 8146c8588..0b12bc1a1 100644 --- a/.github/workflows/helm_ci.yml +++ b/.github/workflows/helm_ci.yml @@ -115,6 +115,69 @@ jobs: grep -q "seaweedfs-cosi" /tmp/cosi.yaml echo "✓ COSI driver renders correctly" + echo "" + echo "=== Testing long release name: service names match DNS references ===" + # Use a release name that, combined with chart name "seaweedfs", exceeds 63 chars. + # fullname = "my-very-long-release-name-that-will-cause-truncation-seaweedfs" (65 chars before trunc) + LONG_RELEASE="my-very-long-release-name-that-will-cause-truncation" + + # --- Normal mode: master + filer-client services vs helper-produced addresses --- + helm template "$LONG_RELEASE" $CHART_DIR \ + --set s3.enabled=true \ + --set global.createBuckets[0].name=test > /tmp/longname.yaml + + # Extract Service names from metadata + MASTER_SVC=$(awk '/kind: Service/{found=1} found && /^ *name:/{print $2; found=0}' /tmp/longname.yaml \ + | grep -- '-master$') + FILER_CLIENT_SVC=$(awk '/kind: Service/{found=1} found && /^ *name:/{print $2; found=0}' /tmp/longname.yaml \ + | grep -- '-filer-client$') + + # Extract the hostname from WEED_CLUSTER_SW_MASTER in post-install-bucket-hook + MASTER_ADDR=$(grep 'WEED_CLUSTER_SW_MASTER' -A1 /tmp/longname.yaml \ + | grep 'value:' | head -1 | sed 's/.*value: *"\{0,1\}\([^":]*\).*/\1/') + FILER_ADDR=$(grep 'WEED_CLUSTER_SW_FILER' -A1 /tmp/longname.yaml \ + | grep 'value:' | head -1 | sed 's/.*value: *"\{0,1\}\([^":]*\).*/\1/') + + # Extract the hostname from S3 deployment -filer= argument + S3_FILER_HOST=$(grep '\-filer=' /tmp/longname.yaml \ + | head -1 | sed 's/.*-filer=\([^:]*\).*/\1/') + + # The address helpers produce ".:"; extract just the svc name + MASTER_ADDR_SVC=$(echo "$MASTER_ADDR" | cut -d. -f1) + FILER_ADDR_SVC=$(echo "$FILER_ADDR" | cut -d. -f1) + S3_FILER_SVC=$(echo "$S3_FILER_HOST" | cut -d. -f1) + + echo " master Service.name: $MASTER_SVC" + echo " cluster.masterAddress svc: $MASTER_ADDR_SVC" + echo " filer-client Service.name: $FILER_CLIENT_SVC" + echo " cluster.filerAddress svc: $FILER_ADDR_SVC" + echo " S3 -filer= svc: $S3_FILER_SVC" + + [ "$MASTER_SVC" = "$MASTER_ADDR_SVC" ] || { echo "FAIL: master service name mismatch"; exit 1; } + [ "$FILER_CLIENT_SVC" = "$FILER_ADDR_SVC" ] || { echo "FAIL: filer-client service name mismatch"; exit 1; } + [ "$FILER_CLIENT_SVC" = "$S3_FILER_SVC" ] || { echo "FAIL: S3 -filer= does not match filer-client service"; exit 1; } + echo "✓ Normal mode: service names match DNS references with long release name" + + # --- All-in-one mode: all-in-one service vs both helper addresses --- + helm template "$LONG_RELEASE" $CHART_DIR \ + --set allInOne.enabled=true \ + --set global.createBuckets[0].name=test > /tmp/longname-aio.yaml + + AIO_SVC=$(awk '/kind: Service/{found=1} found && /^ *name:/{print $2; found=0}' /tmp/longname-aio.yaml \ + | grep -- '-all-in-one$') + AIO_MASTER_ADDR_SVC=$(grep 'WEED_CLUSTER_SW_MASTER' -A1 /tmp/longname-aio.yaml \ + | grep 'value:' | head -1 | sed 's/.*value: *"\{0,1\}\([^":]*\).*/\1/' | cut -d. -f1) + AIO_FILER_ADDR_SVC=$(grep 'WEED_CLUSTER_SW_FILER' -A1 /tmp/longname-aio.yaml \ + | grep 'value:' | head -1 | sed 's/.*value: *"\{0,1\}\([^":]*\).*/\1/' | cut -d. -f1) + + echo " all-in-one Service.name: $AIO_SVC" + echo " cluster.masterAddress svc: $AIO_MASTER_ADDR_SVC" + echo " cluster.filerAddress svc: $AIO_FILER_ADDR_SVC" + + [ "$AIO_SVC" = "$AIO_MASTER_ADDR_SVC" ] || { echo "FAIL: all-in-one master address mismatch"; exit 1; } + [ "$AIO_SVC" = "$AIO_FILER_ADDR_SVC" ] || { echo "FAIL: all-in-one filer address mismatch"; exit 1; } + echo "✓ All-in-one mode: service names match DNS references with long release name" + echo "" echo "✅ All template rendering tests passed!" diff --git a/k8s/charts/seaweedfs/templates/all-in-one/all-in-one-service.yml b/k8s/charts/seaweedfs/templates/all-in-one/all-in-one-service.yml index 90f2f112a..f0747267d 100644 --- a/k8s/charts/seaweedfs/templates/all-in-one/all-in-one-service.yml +++ b/k8s/charts/seaweedfs/templates/all-in-one/all-in-one-service.yml @@ -2,7 +2,7 @@ apiVersion: v1 kind: Service metadata: - name: {{ printf "%s-all-in-one" (include "seaweedfs.fullname" .) | trunc 63 | trimSuffix "-" }} + name: {{ include "seaweedfs.componentName" (list . "all-in-one") }} namespace: {{ .Release.Namespace }} labels: app.kubernetes.io/name: {{ template "seaweedfs.name" . }} diff --git a/k8s/charts/seaweedfs/templates/filer/filer-service-client.yaml b/k8s/charts/seaweedfs/templates/filer/filer-service-client.yaml index 7eb0d27f9..d3d585bfb 100644 --- a/k8s/charts/seaweedfs/templates/filer/filer-service-client.yaml +++ b/k8s/charts/seaweedfs/templates/filer/filer-service-client.yaml @@ -2,7 +2,7 @@ apiVersion: v1 kind: Service metadata: - name: {{ printf "%s-filer-client" (include "seaweedfs.fullname" .) | trunc 63 | trimSuffix "-" }} + name: {{ include "seaweedfs.componentName" (list . "filer-client") }} namespace: {{ .Release.Namespace }} labels: app.kubernetes.io/name: {{ template "seaweedfs.name" . }} diff --git a/k8s/charts/seaweedfs/templates/filer/filer-service.yaml b/k8s/charts/seaweedfs/templates/filer/filer-service.yaml index 0a9e1621d..ff335f98f 100644 --- a/k8s/charts/seaweedfs/templates/filer/filer-service.yaml +++ b/k8s/charts/seaweedfs/templates/filer/filer-service.yaml @@ -4,7 +4,7 @@ kind: Service metadata: annotations: service.alpha.kubernetes.io/tolerate-unready-endpoints: "true" - name: {{ printf "%s-filer" (include "seaweedfs.fullname" .) | trunc 63 | trimSuffix "-" }} + name: {{ include "seaweedfs.componentName" (list . "filer") }} namespace: {{ .Release.Namespace }} labels: app.kubernetes.io/name: {{ template "seaweedfs.name" . }} diff --git a/k8s/charts/seaweedfs/templates/master/master-service.yaml b/k8s/charts/seaweedfs/templates/master/master-service.yaml index 411a214a4..7b2c5cfd1 100644 --- a/k8s/charts/seaweedfs/templates/master/master-service.yaml +++ b/k8s/charts/seaweedfs/templates/master/master-service.yaml @@ -2,7 +2,7 @@ apiVersion: v1 kind: Service metadata: - name: {{ printf "%s-master" (include "seaweedfs.fullname" .) | trunc 63 | trimSuffix "-" }} + name: {{ include "seaweedfs.componentName" (list . "master") }} namespace: {{ .Release.Namespace }} labels: app.kubernetes.io/name: {{ template "seaweedfs.name" . }} diff --git a/k8s/charts/seaweedfs/templates/s3/s3-service.yaml b/k8s/charts/seaweedfs/templates/s3/s3-service.yaml index 2471186a1..c4452ec96 100644 --- a/k8s/charts/seaweedfs/templates/s3/s3-service.yaml +++ b/k8s/charts/seaweedfs/templates/s3/s3-service.yaml @@ -2,7 +2,7 @@ apiVersion: v1 kind: Service metadata: - name: {{ printf "%s-s3" (include "seaweedfs.fullname" .) | trunc 63 | trimSuffix "-" }} + name: {{ include "seaweedfs.componentName" (list . "s3") }} namespace: {{ .Release.Namespace }} labels: app.kubernetes.io/name: {{ template "seaweedfs.name" . }} diff --git a/k8s/charts/seaweedfs/templates/sftp/sftp-service.yaml b/k8s/charts/seaweedfs/templates/sftp/sftp-service.yaml index a3ea58542..11c4d8f4e 100644 --- a/k8s/charts/seaweedfs/templates/sftp/sftp-service.yaml +++ b/k8s/charts/seaweedfs/templates/sftp/sftp-service.yaml @@ -2,7 +2,7 @@ apiVersion: v1 kind: Service metadata: - name: {{ printf "%s-sftp" (include "seaweedfs.fullname" .) | trunc 63 | trimSuffix "-" }} + name: {{ include "seaweedfs.componentName" (list . "sftp") }} namespace: {{ .Release.Namespace }} labels: app.kubernetes.io/name: {{ template "seaweedfs.name" . }} diff --git a/k8s/charts/seaweedfs/templates/shared/_helpers.tpl b/k8s/charts/seaweedfs/templates/shared/_helpers.tpl index 52e798b29..8056cb73c 100644 --- a/k8s/charts/seaweedfs/templates/shared/_helpers.tpl +++ b/k8s/charts/seaweedfs/templates/shared/_helpers.tpl @@ -287,11 +287,8 @@ Compute the master service address to be used in cluster env vars. If allInOne is enabled, point to the all-in-one service; otherwise, point to the master service. */}} {{- define "seaweedfs.cluster.masterAddress" -}} -{{- $serviceNameSuffix := "-master" -}} -{{- if .Values.allInOne.enabled -}} -{{- $serviceNameSuffix = "-all-in-one" -}} -{{- end -}} -{{- printf "%s.%s:%d" (printf "%s%s" (include "seaweedfs.fullname" .) $serviceNameSuffix | trunc 63 | trimSuffix "-") .Release.Namespace (int .Values.master.port) -}} +{{- $component := ternary "all-in-one" "master" .Values.allInOne.enabled -}} +{{- printf "%s.%s:%d" (include "seaweedfs.componentName" (list . $component)) .Release.Namespace (int .Values.master.port) -}} {{- end -}} {{/* @@ -299,11 +296,8 @@ Compute the filer service address to be used in cluster env vars. If allInOne is enabled, point to the all-in-one service; otherwise, point to the filer-client service. */}} {{- define "seaweedfs.cluster.filerAddress" -}} -{{- $serviceNameSuffix := "-filer-client" -}} -{{- if .Values.allInOne.enabled -}} -{{- $serviceNameSuffix = "-all-in-one" -}} -{{- end -}} -{{- printf "%s.%s:%d" (printf "%s%s" (include "seaweedfs.fullname" .) $serviceNameSuffix | trunc 63 | trimSuffix "-") .Release.Namespace (int .Values.filer.port) -}} +{{- $component := ternary "all-in-one" "filer-client" .Values.allInOne.enabled -}} +{{- printf "%s.%s:%d" (include "seaweedfs.componentName" (list . $component)) .Release.Namespace (int .Values.filer.port) -}} {{- end -}} {{/* diff --git a/k8s/charts/seaweedfs/templates/volume/volume-service.yaml b/k8s/charts/seaweedfs/templates/volume/volume-service.yaml index 22fc3c3e5..53ca2c409 100644 --- a/k8s/charts/seaweedfs/templates/volume/volume-service.yaml +++ b/k8s/charts/seaweedfs/templates/volume/volume-service.yaml @@ -8,7 +8,7 @@ apiVersion: v1 kind: Service metadata: - name: {{ printf "%s-%s" (include "seaweedfs.fullname" $) $volumeName | trunc 63 | trimSuffix "-" }} + name: {{ include "seaweedfs.componentName" (list $ $volumeName) }} namespace: {{ $.Release.Namespace }} labels: app.kubernetes.io/name: {{ template "seaweedfs.name" $ }} diff --git a/k8s/charts/seaweedfs/templates/worker/worker-service.yaml b/k8s/charts/seaweedfs/templates/worker/worker-service.yaml index d3c719e12..d78e0cf78 100644 --- a/k8s/charts/seaweedfs/templates/worker/worker-service.yaml +++ b/k8s/charts/seaweedfs/templates/worker/worker-service.yaml @@ -2,7 +2,7 @@ apiVersion: v1 kind: Service metadata: - name: {{ printf "%s-worker" (include "seaweedfs.fullname" .) | trunc 63 | trimSuffix "-" }} + name: {{ include "seaweedfs.componentName" (list . "worker") }} namespace: {{ .Release.Namespace }} labels: app.kubernetes.io/name: {{ template "seaweedfs.name" . }}