fix(seaweed-volume): eliminate global S3 tier registry races in tests #6
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| name: "helm: lint and test charts" | |
| on: | |
| push: | |
| branches: [ master ] | |
| paths: ['k8s/**'] | |
| pull_request: | |
| branches: [ master ] | |
| paths: ['k8s/**'] | |
| permissions: | |
| contents: read | |
| jobs: | |
| lint-test: | |
| runs-on: ubuntu-latest | |
| steps: | |
| - name: Checkout | |
| uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd | |
| with: | |
| fetch-depth: 0 | |
| - name: Set up Helm | |
| uses: azure/setup-helm@v5 | |
| with: | |
| version: v3.18.4 | |
| - uses: actions/setup-python@v6 | |
| with: | |
| python-version: '3.10' | |
| check-latest: true | |
| - name: Set up chart-testing | |
| uses: helm/chart-testing-action@v2.8.0 | |
| - name: Run chart-testing (list-changed) | |
| id: list-changed | |
| run: | | |
| changed=$(ct list-changed --target-branch ${{ github.event.repository.default_branch }} --chart-dirs k8s/charts) | |
| if [[ -n "$changed" ]]; then | |
| echo "::set-output name=changed::true" | |
| fi | |
| - name: Run chart-testing (lint) | |
| run: ct lint --target-branch ${{ github.event.repository.default_branch }} --all --validate-maintainers=false --chart-dirs k8s/charts | |
| - name: Verify template rendering | |
| run: | | |
| set -e | |
| CHART_DIR="k8s/charts/seaweedfs" | |
| echo "=== Testing default configuration ===" | |
| helm template test $CHART_DIR > /tmp/default.yaml | |
| echo "✓ Default configuration renders successfully" | |
| echo "=== Testing with S3 enabled ===" | |
| helm template test $CHART_DIR --set s3.enabled=true > /tmp/s3.yaml | |
| grep -q "kind: Deployment" /tmp/s3.yaml && grep -q "seaweedfs-s3" /tmp/s3.yaml | |
| echo "✓ S3 deployment renders correctly" | |
| echo "=== Testing with all-in-one mode ===" | |
| helm template test $CHART_DIR --set allInOne.enabled=true > /tmp/allinone.yaml | |
| grep -q "seaweedfs-all-in-one" /tmp/allinone.yaml | |
| echo "✓ All-in-one deployment renders correctly" | |
| echo "=== Testing with security enabled ===" | |
| helm template test $CHART_DIR --set global.seaweedfs.enableSecurity=true > /tmp/security.yaml | |
| grep -q "security-config" /tmp/security.yaml | |
| echo "✓ Security configuration renders correctly" | |
| echo "=== Testing with monitoring enabled ===" | |
| helm template test $CHART_DIR \ | |
| --set global.seaweedfs.monitoring.enabled=true \ | |
| --set global.seaweedfs.monitoring.gatewayHost=prometheus \ | |
| --set global.seaweedfs.monitoring.gatewayPort=9091 > /tmp/monitoring.yaml | |
| echo "✓ Monitoring configuration renders correctly" | |
| echo "=== Testing with PVC storage ===" | |
| helm template test $CHART_DIR \ | |
| --set master.data.type=persistentVolumeClaim \ | |
| --set master.data.size=10Gi \ | |
| --set master.data.storageClass=standard > /tmp/pvc.yaml | |
| grep -q "PersistentVolumeClaim" /tmp/pvc.yaml | |
| echo "✓ PVC configuration renders correctly" | |
| echo "=== Testing with custom replicas ===" | |
| helm template test $CHART_DIR \ | |
| --set master.replicas=3 \ | |
| --set filer.replicas=2 \ | |
| --set volume.replicas=3 > /tmp/replicas.yaml | |
| echo "✓ Custom replicas configuration renders correctly" | |
| echo "=== Testing filer with S3 gateway ===" | |
| helm template test $CHART_DIR \ | |
| --set filer.s3.enabled=true \ | |
| --set filer.s3.enableAuth=true > /tmp/filer-s3.yaml | |
| echo "✓ Filer S3 gateway renders correctly" | |
| echo "=== Testing SFTP enabled ===" | |
| helm template test $CHART_DIR --set sftp.enabled=true > /tmp/sftp.yaml | |
| grep -q "seaweedfs-sftp" /tmp/sftp.yaml | |
| echo "✓ SFTP deployment renders correctly" | |
| echo "=== Testing ingress configurations ===" | |
| helm template test $CHART_DIR \ | |
| --set master.ingress.enabled=true \ | |
| --set filer.ingress.enabled=true \ | |
| --set s3.enabled=true \ | |
| --set s3.ingress.enabled=true > /tmp/ingress.yaml | |
| grep -q "kind: Ingress" /tmp/ingress.yaml | |
| echo "✓ Ingress configurations render correctly" | |
| echo "=== Testing COSI driver ===" | |
| helm template test $CHART_DIR --set cosi.enabled=true > /tmp/cosi.yaml | |
| 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.seaweedfs.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 "<svc>.<namespace>:<port>"; 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.seaweedfs.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 "=== Testing security+S3: no blank lines in shell command blocks ===" | |
| # Render the three manifests that include seaweedfs.s3.tlsArgs: | |
| # filer-statefulset, s3-deployment, all-in-one-deployment | |
| helm template test $CHART_DIR \ | |
| --set global.seaweedfs.enableSecurity=true \ | |
| --set filer.s3.enabled=true \ | |
| --set s3.enabled=true > /tmp/security-s3.yaml | |
| helm template test $CHART_DIR \ | |
| --set global.seaweedfs.enableSecurity=true \ | |
| --set allInOne.enabled=true \ | |
| --set allInOne.s3.enabled=true > /tmp/security-aio.yaml | |
| pip install pyyaml -q | |
| python3 - /tmp/security-s3.yaml /tmp/security-aio.yaml <<'PYEOF' | |
| import yaml, sys | |
| errors = [] | |
| for path in sys.argv[1:]: | |
| with open(path) as f: | |
| docs = list(yaml.safe_load_all(f)) | |
| for doc in docs: | |
| if not doc or doc.get("kind") not in ("Deployment", "StatefulSet"): | |
| continue | |
| name = doc["metadata"]["name"] | |
| for c in doc["spec"]["template"]["spec"].get("containers", []): | |
| cmd = c.get("command", []) | |
| if len(cmd) >= 3 and cmd[0] == "/bin/sh" and cmd[1] == "-ec": | |
| script = cmd[2] | |
| for i, line in enumerate(script.splitlines(), 1): | |
| if line.strip() == "": | |
| errors.append(f"{path}: {name}/{c['name']} has blank line at script line {i}") | |
| if errors: | |
| for e in errors: | |
| print(f"FAIL: {e}", file=sys.stderr) | |
| print("Rendered with: global.seaweedfs.enableSecurity=true, filer.s3.enabled=true, s3.enabled=true, allInOne.enabled=true", file=sys.stderr) | |
| sys.exit(1) | |
| print("✓ No blank lines in security+S3 command blocks") | |
| PYEOF | |
| echo "✅ All template rendering tests passed!" | |
| - name: Create kind cluster | |
| uses: helm/kind-action@v1.14.0 | |
| - name: Run chart-testing (install) | |
| run: ct install --target-branch ${{ github.event.repository.default_branch }} --all --chart-dirs k8s/charts |