From b3ad34b2005d46d1efe2c7b5c4ebc00338517957 Mon Sep 17 00:00:00 2001 From: shaun-nx Date: Wed, 17 Sep 2025 16:12:22 +0100 Subject: [PATCH 1/8] Add IPv6 testing script for use in release process --- docs/developer/release-process.md | 2 + tests/Makefile | 7 ++ tests/ipv6/config/kind-ipv6-only.yaml | 8 ++ tests/ipv6/manifests/gateway.yaml | 11 ++ tests/ipv6/manifests/ipv6-test-app.yaml | 62 ++++++++++++ tests/ipv6/manifests/ipv6-test-client.yaml | 33 ++++++ tests/ipv6/run-ipv6-test.sh | 112 +++++++++++++++++++++ 7 files changed, 235 insertions(+) create mode 100644 tests/ipv6/config/kind-ipv6-only.yaml create mode 100644 tests/ipv6/manifests/gateway.yaml create mode 100644 tests/ipv6/manifests/ipv6-test-app.yaml create mode 100644 tests/ipv6/manifests/ipv6-test-client.yaml create mode 100755 tests/ipv6/run-ipv6-test.sh diff --git a/docs/developer/release-process.md b/docs/developer/release-process.md index 7cd056c9a3..eeeb8bea6a 100644 --- a/docs/developer/release-process.md +++ b/docs/developer/release-process.md @@ -44,6 +44,8 @@ To create a new release, follow these steps: 4. Once the release branch pipeline completes, run tests using the `release-X.X-rc` images that are pushed to Github (for example, `release-1.3-rc`). 1. Kick off the [longevity tests](https://github.com/nginx/nginx-gateway-fabric/blob/main/tests/README.md#longevity-testing) for both OSS and Plus. You'll need to create two clusters and VMs for this. Before running, update your `vars.env` file with the proper image tag and prefixes. NGF and nginx images will be available from `ghcr.io`, and nginx plus will be available in GCP (`us-docker.pkg.dev//nginx-gateway-fabric/nginx-plus`). These tests need to run for 4 days before releasing. The results should be committed to the main branch and then cherry-picked to the release branch. 2. Kick off the [NFR workflow](https://github.com/nginx/nginx-gateway-fabric/actions/workflows/nfr.yml) in the browser. For `image_tag`, use `release-X.X-rc`, and for `version`, use the upcoming `X.Y.Z` NGF version. Run the workflow on the new release branch. This will run all of the NFR tests which are automated and open a PR with the results files when it is complete. Review this PR and make any necessary changes before merging. Once merged, be sure to cherry-pick the commit to the main branch as well (the original PR targets the release branch). + 3. Run the IPv6 tests using the `make ipv6-tests` target. This must be run from within the `tests` directory. This script need two arguments. The release version (e.g. `vX.Y.Z`) and the release image tag (e.g. `release-X.X-rc`). + For example, when running this script for release 2.1.0, it would look like this: `make ipv6-test RELEASE=vX.Y.Z RELEASE_IMAGE=release-X.X-rc` 5. Run the [Release PR](https://github.com/nginx/nginx-gateway-fabric/actions/workflows/release-pr.yml) workflow to update the repo files for the release. Then there are a few manual steps to complete: 1. Update the [README](/README.md) to include information about the release. 2. Update the [changelog](/CHANGELOG.md). There is going to be a new blank section generated by the automation that needs to be adjusted accordingly. diff --git a/tests/Makefile b/tests/Makefile index 668fd879e3..ad8290f6af 100644 --- a/tests/Makefile +++ b/tests/Makefile @@ -16,6 +16,8 @@ SUPPORTED_EXTENDED_FEATURES = HTTPRouteQueryParamMatching,HTTPRouteMethodMatchin STANDARD_CONFORMANCE_PROFILES = GATEWAY-HTTP,GATEWAY-GRPC EXPERIMENTAL_CONFORMANCE_PROFILES = GATEWAY-TLS CONFORMANCE_PROFILES = $(STANDARD_CONFORMANCE_PROFILES) # by default we use the standard conformance profiles. If experimental is enabled we override this and add the experimental profiles. +RELEASE ?= main # e.g. v2.1.0 +RELEASE_IMAGE ?= latest # e.g. release-2.1.0-rc SKIP_TESTS = CEL_TEST_TARGET = @@ -118,6 +120,11 @@ start-longevity-test: nfr-test ## Start the longevity test to run for 4 days in stop-longevity-test: export STOP_LONGEVITY=true stop-longevity-test: nfr-test ## Stop the longevity test and collects results +.PHONY: ipv6-tests +ipv6-tests: GOARCH=amd64 +ipv6-tests: ## Example usage: make ipv6-tests RELEASE=vX.Y.Z RELEASE_IMAGE=release-X.Y-rc + ./ipv6/run-ipv6-test.sh $(RELEASE) $(RELEASE_IMAGE) + .PHONY: .vm-nfr-test .vm-nfr-test: ## Runs the NFR tests on the GCP VM (called by `nfr-test`) diff --git a/tests/ipv6/config/kind-ipv6-only.yaml b/tests/ipv6/config/kind-ipv6-only.yaml new file mode 100644 index 0000000000..88d102e864 --- /dev/null +++ b/tests/ipv6/config/kind-ipv6-only.yaml @@ -0,0 +1,8 @@ +kind: Cluster +apiVersion: kind.x-k8s.io/v1alpha4 +networking: + ipFamily: ipv6 # Explicitly set the cluster to use IPv6 + apiServerAddress: "::1" + disableDefaultCNI: false # Use Kind's default CNI +nodes: +- role: control-plane \ No newline at end of file diff --git a/tests/ipv6/manifests/gateway.yaml b/tests/ipv6/manifests/gateway.yaml new file mode 100644 index 0000000000..af281113bc --- /dev/null +++ b/tests/ipv6/manifests/gateway.yaml @@ -0,0 +1,11 @@ +apiVersion: gateway.networking.k8s.io/v1 +kind: Gateway +metadata: + name: gateway +spec: + gatewayClassName: nginx + listeners: + - name: http + port: 80 + protocol: HTTP + hostname: "*.example.com" \ No newline at end of file diff --git a/tests/ipv6/manifests/ipv6-test-app.yaml b/tests/ipv6/manifests/ipv6-test-app.yaml new file mode 100644 index 0000000000..caffae83b2 --- /dev/null +++ b/tests/ipv6/manifests/ipv6-test-app.yaml @@ -0,0 +1,62 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: test-app-ipv6 + namespace: default +spec: + replicas: 1 + selector: + matchLabels: + app: test-app-ipv6 + template: + metadata: + labels: + app: test-app-ipv6 + spec: + containers: + - name: nginx + image: nginx:alpine + ports: + - containerPort: 80 + resources: + limits: + cpu: "100m" + memory: "128Mi" + requests: + cpu: "50m" + memory: "64Mi" +--- +apiVersion: v1 +kind: Service +metadata: + name: test-app-ipv6-service + namespace: default +spec: + selector: + app: test-app-ipv6 + ports: + - port: 80 + targetPort: 80 + ipFamilies: [IPv6] + ipFamilyPolicy: SingleStack +--- +apiVersion: gateway.networking.k8s.io/v1 +kind: HTTPRoute +metadata: + name: test-route-ipv6 + namespace: default +spec: + parentRefs: + - name: gateway + sectionName: http + namespace: default + hostnames: + - "ipv6-test.example.com" + rules: + - matches: + - path: + type: PathPrefix + value: / + backendRefs: + - name: test-app-ipv6-service + port: 80 \ No newline at end of file diff --git a/tests/ipv6/manifests/ipv6-test-client.yaml b/tests/ipv6/manifests/ipv6-test-client.yaml new file mode 100644 index 0000000000..b7559cd8df --- /dev/null +++ b/tests/ipv6/manifests/ipv6-test-client.yaml @@ -0,0 +1,33 @@ +apiVersion: v1 +kind: Pod +metadata: + name: ipv6-test-client + namespace: default + labels: + app: ipv6-test-client +spec: + restartPolicy: Never + containers: + - name: test-client + image: curlimages/curl:8.11.1 + imagePullPolicy: IfNotPresent + command: ["sleep", "3600"] # Keep pod alive for exec commands + resources: + limits: + cpu: "100m" + memory: "128Mi" + requests: + cpu: "50m" + memory: "64Mi" + securityContext: + allowPrivilegeEscalation: false + runAsNonRoot: true + runAsUser: 65534 + capabilities: + drop: + - ALL + dnsConfig: + options: + - name: single-request-reopen + - name: ndots + value: "2" \ No newline at end of file diff --git a/tests/ipv6/run-ipv6-test.sh b/tests/ipv6/run-ipv6-test.sh new file mode 100755 index 0000000000..1284917142 --- /dev/null +++ b/tests/ipv6/run-ipv6-test.sh @@ -0,0 +1,112 @@ +#!/usr/bin/env bash + +set -e # Exit immediately if a command exits with a non-zero status + +RELEASE=$1 +RELEASE_IMAGE=$2 + +if [[ -z "$RELEASE" || -z "$RELEASE_IMAGE" ]]; then + echo "Usage: $0 [HELM_RELEASE_NAME] [NAMESPACE] [CLUSTER_NAME]" + echo "Error: RELEASE and RELEASE_IMAGE are required parameters. Example usage `make ipv6-test RELEASE=vX.Y.Z RELEASE_IMAGE=release-X.Y-rc`" + exit 1 +fi + +HELM_RELEASE_NAME=${3:-ngf} +NAMESPACE=${4:-nginx-gateway} +CLUSTER_NAME=${5:-ipv6-only-${RELEASE}} +RELEASE_REPO=ghcr.io/nginx/nginx-gateway-fabric + +cleanup() { + echo "Cleaning up resources..." + kubectl delete -f ipv6/manifests/ipv6-test-app.yaml || true + kubectl delete -f ipv6/manifests/ipv6-test-client.yaml || true + kubectl delete -f ipv6/manifests/gateway.yaml || true + helm uninstall ${HELM_RELEASE_NAME} -n ${NAMESPACE} || true + kind delete cluster --name ${CLUSTER_NAME} || true +} + +trap cleanup EXIT + +kind create cluster --name ${CLUSTER_NAME} --config ipv6/config/kind-ipv6-only.yaml + +echo "Applying Gateway API CRDs" +kubectl kustomize "https://github.com/nginx/nginx-gateway-fabric/config/crd/gateway-api/standard?ref=${RELEASE}" | kubectl apply -f - + +docker pull ${RELEASE_REPO}:${RELEASE_IMAGE} + +docker save ${RELEASE_REPO}:${RELEASE_IMAGE} | docker exec -i ${CLUSTER_NAME}-control-plane ctr --namespace=k8s.io images import - + +helm upgrade --install ${HELM_RELEASE_NAME} oci://ghcr.io/nginx/charts/nginx-gateway-fabric \ + --create-namespace -n ${NAMESPACE} \ + --set nginx.config.ipFamily=ipv6 \ + --set nginx.service.type=ClusterIP \ + --set nginxGateway.image.repository=${RELEASE_REPO} \ + --set nginxGateway.image.tag=${RELEASE_IMAGE} + +echo "Deploying Gateway..." +kubectl apply -f ipv6/manifests/gateway.yaml + +echo "Waiting for NGINX Gateway to be ready..." +kubectl wait --for=condition=accepted --timeout=300s gateway/gateway +POD_NAME=$(kubectl get pods -l app.kubernetes.io/instance=${HELM_RELEASE_NAME} -o jsonpath='{.items[0].metadata.name}') +kubectl wait --for=condition=ready --timeout=300s pod/${POD_NAME} + +echo "Deploying IPv6 test application" +kubectl apply -f ipv6/manifests/ipv6-test-app.yaml + +echo "Waiting for NGF to be ready..." +kubectl wait --for=condition=available --timeout=300s deployment/${HELM_RELEASE_NAME}-nginx-gateway-fabric -n ${NAMESPACE} + +echo "Waiting for test applications to be ready..." +kubectl wait --for=condition=available --timeout=300s deployment/test-app-ipv6 + +echo "Deploying IPv6 test client" +kubectl apply -f ipv6/manifests/ipv6-test-client.yaml +kubectl wait --for=condition=ready --timeout=300s pod/ipv6-test-client + +echo "Getting NGF service IPv6 address" +NGF_IPV6=$(kubectl get service gateway-nginx -o jsonpath='{.spec.clusterIP}') +echo "NGF IPv6 Address: $NGF_IPV6" + +echo "=== Running IPv6-Only Tests ===" + +echo "== Test 1: Basic IPv6 connectivity ==" +kubectl exec ipv6-test-client -- curl --version +kubectl exec ipv6-test-client -- nslookup gateway-nginx.default.svc.cluster.local || echo "Test 1: Basic IPv6 connectivity failed" +test1_status=$? + +if [[ $test1_status -eq 0 ]]; then + echo "✅ Test 1: Basic IPv6 connectivity succeeded" +fi + +echo "== Test 2: NGF Service IPv6 connectivity ==" +kubectl exec ipv6-test-client -- curl -6 --connect-timeout 30 --max-time 60 -v \ + -H "Host: ipv6-test.example.com" \ + "http://[${NGF_IPV6}]:80/" || echo "Test 2: NGF Service IPv6 connectivity failed" +test2_status=$? + +if [[ $test2_status -eq 0 ]]; then + echo "✅ Test 2: NGF Service IPv6 connectivity succeeded" +fi + +echo "== Test 3: Service DNS IPv6 connectivity ==" +kubectl exec ipv6-test-client -- curl -6 --connect-timeout 30 --max-time 60 -v \ + -H "Host: ipv6-test.example.com" \ + "http://gateway-nginx.default.svc.cluster.local:80/" || echo "Test 3: Service DNS IPv6 connectivity failed" +test3_status=$? + +if [[ $test3_status -eq 0 ]]; then + echo "✅ Test 3: Service DNS IPv6 connectivity succeeded" +fi + +echo "=== Displaying IPv6-Only Configuration ===" +echo "NGF Pod IPv6 addresses:" +kubectl get pods -n nginx-gateway -o wide || true +echo "NGF Service configuration:" +kubectl get service ${HELM_RELEASE_NAME}-nginx-gateway-fabric -n nginx-gateway -o yaml || true + +if [[ $test1_status -eq 0 && $test2_status -eq 0 && $test3_status -eq 0 ]]; then + echo -e "✅ All tests passed!" +else + echo -e "❌ One or more tests failed. Check the output above to help debug any issues." +fi \ No newline at end of file From d3e7041fd3bed99db7d91b0687d7a25f574e0631 Mon Sep 17 00:00:00 2001 From: shaun-nx Date: Wed, 17 Sep 2025 16:25:09 +0100 Subject: [PATCH 2/8] Fix pre-commit errors --- tests/ipv6/config/kind-ipv6-only.yaml | 2 +- tests/ipv6/manifests/gateway.yaml | 2 +- tests/ipv6/manifests/ipv6-test-app.yaml | 2 +- tests/ipv6/manifests/ipv6-test-client.yaml | 2 +- tests/ipv6/run-ipv6-test.sh | 28 ++++++++-------- .../snippets-filter/invalid-duplicate-sf.yaml | 32 +++++++++---------- 6 files changed, 34 insertions(+), 34 deletions(-) diff --git a/tests/ipv6/config/kind-ipv6-only.yaml b/tests/ipv6/config/kind-ipv6-only.yaml index 88d102e864..ab17d5f307 100644 --- a/tests/ipv6/config/kind-ipv6-only.yaml +++ b/tests/ipv6/config/kind-ipv6-only.yaml @@ -5,4 +5,4 @@ networking: apiServerAddress: "::1" disableDefaultCNI: false # Use Kind's default CNI nodes: -- role: control-plane \ No newline at end of file +- role: control-plane diff --git a/tests/ipv6/manifests/gateway.yaml b/tests/ipv6/manifests/gateway.yaml index af281113bc..e6507f613b 100644 --- a/tests/ipv6/manifests/gateway.yaml +++ b/tests/ipv6/manifests/gateway.yaml @@ -8,4 +8,4 @@ spec: - name: http port: 80 protocol: HTTP - hostname: "*.example.com" \ No newline at end of file + hostname: "*.example.com" diff --git a/tests/ipv6/manifests/ipv6-test-app.yaml b/tests/ipv6/manifests/ipv6-test-app.yaml index caffae83b2..202759eb23 100644 --- a/tests/ipv6/manifests/ipv6-test-app.yaml +++ b/tests/ipv6/manifests/ipv6-test-app.yaml @@ -59,4 +59,4 @@ spec: value: / backendRefs: - name: test-app-ipv6-service - port: 80 \ No newline at end of file + port: 80 diff --git a/tests/ipv6/manifests/ipv6-test-client.yaml b/tests/ipv6/manifests/ipv6-test-client.yaml index b7559cd8df..0eb7313742 100644 --- a/tests/ipv6/manifests/ipv6-test-client.yaml +++ b/tests/ipv6/manifests/ipv6-test-client.yaml @@ -30,4 +30,4 @@ spec: options: - name: single-request-reopen - name: ndots - value: "2" \ No newline at end of file + value: "2" diff --git a/tests/ipv6/run-ipv6-test.sh b/tests/ipv6/run-ipv6-test.sh index 1284917142..724f3a2a50 100755 --- a/tests/ipv6/run-ipv6-test.sh +++ b/tests/ipv6/run-ipv6-test.sh @@ -5,10 +5,10 @@ set -e # Exit immediately if a command exits with a non-zero status RELEASE=$1 RELEASE_IMAGE=$2 -if [[ -z "$RELEASE" || -z "$RELEASE_IMAGE" ]]; then - echo "Usage: $0 [HELM_RELEASE_NAME] [NAMESPACE] [CLUSTER_NAME]" - echo "Error: RELEASE and RELEASE_IMAGE are required parameters. Example usage `make ipv6-test RELEASE=vX.Y.Z RELEASE_IMAGE=release-X.Y-rc`" - exit 1 +if [[ -z $RELEASE || -z $RELEASE_IMAGE ]]; then + echo "Usage: $0 [HELM_RELEASE_NAME] [NAMESPACE] [CLUSTER_NAME]" + echo "Error: RELEASE and RELEASE_IMAGE are required parameters. Example usage $(make ipv6-test RELEASE=vX.Y.Z RELEASE_IMAGE=release-X.Y-rc)" + exit 1 fi HELM_RELEASE_NAME=${3:-ngf} @@ -76,27 +76,27 @@ kubectl exec ipv6-test-client -- nslookup gateway-nginx.default.svc.cluster.loca test1_status=$? if [[ $test1_status -eq 0 ]]; then - echo "✅ Test 1: Basic IPv6 connectivity succeeded" + echo "✅ Test 1: Basic IPv6 connectivity succeeded" fi echo "== Test 2: NGF Service IPv6 connectivity ==" kubectl exec ipv6-test-client -- curl -6 --connect-timeout 30 --max-time 60 -v \ - -H "Host: ipv6-test.example.com" \ - "http://[${NGF_IPV6}]:80/" || echo "Test 2: NGF Service IPv6 connectivity failed" + -H "Host: ipv6-test.example.com" \ + "http://[${NGF_IPV6}]:80/" || echo "Test 2: NGF Service IPv6 connectivity failed" test2_status=$? if [[ $test2_status -eq 0 ]]; then - echo "✅ Test 2: NGF Service IPv6 connectivity succeeded" + echo "✅ Test 2: NGF Service IPv6 connectivity succeeded" fi echo "== Test 3: Service DNS IPv6 connectivity ==" kubectl exec ipv6-test-client -- curl -6 --connect-timeout 30 --max-time 60 -v \ - -H "Host: ipv6-test.example.com" \ - "http://gateway-nginx.default.svc.cluster.local:80/" || echo "Test 3: Service DNS IPv6 connectivity failed" + -H "Host: ipv6-test.example.com" \ + "http://gateway-nginx.default.svc.cluster.local:80/" || echo "Test 3: Service DNS IPv6 connectivity failed" test3_status=$? if [[ $test3_status -eq 0 ]]; then - echo "✅ Test 3: Service DNS IPv6 connectivity succeeded" + echo "✅ Test 3: Service DNS IPv6 connectivity succeeded" fi echo "=== Displaying IPv6-Only Configuration ===" @@ -106,7 +106,7 @@ echo "NGF Service configuration:" kubectl get service ${HELM_RELEASE_NAME}-nginx-gateway-fabric -n nginx-gateway -o yaml || true if [[ $test1_status -eq 0 && $test2_status -eq 0 && $test3_status -eq 0 ]]; then - echo -e "✅ All tests passed!" + echo -e "✅ All tests passed!" else - echo -e "❌ One or more tests failed. Check the output above to help debug any issues." -fi \ No newline at end of file + echo -e "❌ One or more tests failed. Check the output above to help debug any issues." +fi diff --git a/tests/suite/manifests/snippets-filter/invalid-duplicate-sf.yaml b/tests/suite/manifests/snippets-filter/invalid-duplicate-sf.yaml index ba7e5b6c55..137771ed4e 100644 --- a/tests/suite/manifests/snippets-filter/invalid-duplicate-sf.yaml +++ b/tests/suite/manifests/snippets-filter/invalid-duplicate-sf.yaml @@ -19,21 +19,21 @@ metadata: name: tea spec: parentRefs: - - name: gateway - sectionName: http + - name: gateway + sectionName: http hostnames: - - "cafe.example.com" + - "cafe.example.com" rules: - - matches: - - path: - type: Exact - value: /tea - filters: - - type: ExtensionRef - extensionRef: - group: gateway.nginx.org - kind: SnippetsFilter - name: duplicate-directive - backendRefs: - - name: tea - port: 80 + - matches: + - path: + type: Exact + value: /tea + filters: + - type: ExtensionRef + extensionRef: + group: gateway.nginx.org + kind: SnippetsFilter + name: duplicate-directive + backendRefs: + - name: tea + port: 80 From 90040b18eaa679ce6be73606884e2b6f0156607e Mon Sep 17 00:00:00 2001 From: shaun-nx Date: Wed, 17 Sep 2025 16:46:18 +0100 Subject: [PATCH 3/8] Update wording in release process --- docs/developer/release-process.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/developer/release-process.md b/docs/developer/release-process.md index eeeb8bea6a..5263c2d45c 100644 --- a/docs/developer/release-process.md +++ b/docs/developer/release-process.md @@ -44,7 +44,7 @@ To create a new release, follow these steps: 4. Once the release branch pipeline completes, run tests using the `release-X.X-rc` images that are pushed to Github (for example, `release-1.3-rc`). 1. Kick off the [longevity tests](https://github.com/nginx/nginx-gateway-fabric/blob/main/tests/README.md#longevity-testing) for both OSS and Plus. You'll need to create two clusters and VMs for this. Before running, update your `vars.env` file with the proper image tag and prefixes. NGF and nginx images will be available from `ghcr.io`, and nginx plus will be available in GCP (`us-docker.pkg.dev//nginx-gateway-fabric/nginx-plus`). These tests need to run for 4 days before releasing. The results should be committed to the main branch and then cherry-picked to the release branch. 2. Kick off the [NFR workflow](https://github.com/nginx/nginx-gateway-fabric/actions/workflows/nfr.yml) in the browser. For `image_tag`, use `release-X.X-rc`, and for `version`, use the upcoming `X.Y.Z` NGF version. Run the workflow on the new release branch. This will run all of the NFR tests which are automated and open a PR with the results files when it is complete. Review this PR and make any necessary changes before merging. Once merged, be sure to cherry-pick the commit to the main branch as well (the original PR targets the release branch). - 3. Run the IPv6 tests using the `make ipv6-tests` target. This must be run from within the `tests` directory. This script need two arguments. The release version (e.g. `vX.Y.Z`) and the release image tag (e.g. `release-X.X-rc`). + 3. Run the IPv6 tests using the `make ipv6-tests` target. This must be run from within the `tests` directory. This script requires two arguments. The release version (e.g. `vX.Y.Z`) and the release image tag (e.g. `release-X.X-rc`). For example, when running this script for release 2.1.0, it would look like this: `make ipv6-test RELEASE=vX.Y.Z RELEASE_IMAGE=release-X.X-rc` 5. Run the [Release PR](https://github.com/nginx/nginx-gateway-fabric/actions/workflows/release-pr.yml) workflow to update the repo files for the release. Then there are a few manual steps to complete: 1. Update the [README](/README.md) to include information about the release. From 1d53be65c761f827060bbb90c9f31763d237edea Mon Sep 17 00:00:00 2001 From: shaun-nx Date: Thu, 18 Sep 2025 10:01:50 +0100 Subject: [PATCH 4/8] Use NGINX release channel image and get IPv6 address from gateway status --- tests/Makefile | 2 +- tests/ipv6/manifests/ipv6-test-app.yaml | 2 +- tests/ipv6/manifests/ipv6-test-client.yaml | 2 +- tests/ipv6/run-ipv6-test.sh | 24 ++++++++-------------- 4 files changed, 12 insertions(+), 18 deletions(-) diff --git a/tests/Makefile b/tests/Makefile index 542b2a98b9..0d894b9c01 100644 --- a/tests/Makefile +++ b/tests/Makefile @@ -17,7 +17,7 @@ STANDARD_CONFORMANCE_PROFILES = GATEWAY-HTTP,GATEWAY-GRPC EXPERIMENTAL_CONFORMANCE_PROFILES = GATEWAY-TLS CONFORMANCE_PROFILES = $(STANDARD_CONFORMANCE_PROFILES) # by default we use the standard conformance profiles. If experimental is enabled we override this and add the experimental profiles. RELEASE ?= main # e.g. v2.1.0 -RELEASE_IMAGE ?= latest # e.g. release-2.1.0-rc +RELEASE_IMAGE ?= edge # e.g. release-2.1.0-rc SKIP_TESTS = CEL_TEST_TARGET = diff --git a/tests/ipv6/manifests/ipv6-test-app.yaml b/tests/ipv6/manifests/ipv6-test-app.yaml index 202759eb23..6593fabdb2 100644 --- a/tests/ipv6/manifests/ipv6-test-app.yaml +++ b/tests/ipv6/manifests/ipv6-test-app.yaml @@ -15,7 +15,7 @@ spec: spec: containers: - name: nginx - image: nginx:alpine + image: nginxdemos/nginx-hello:plain-text ports: - containerPort: 80 resources: diff --git a/tests/ipv6/manifests/ipv6-test-client.yaml b/tests/ipv6/manifests/ipv6-test-client.yaml index 0eb7313742..fffecbf840 100644 --- a/tests/ipv6/manifests/ipv6-test-client.yaml +++ b/tests/ipv6/manifests/ipv6-test-client.yaml @@ -9,7 +9,7 @@ spec: restartPolicy: Never containers: - name: test-client - image: curlimages/curl:8.11.1 + image: curlimages/curl:8.16.0 imagePullPolicy: IfNotPresent command: ["sleep", "3600"] # Keep pod alive for exec commands resources: diff --git a/tests/ipv6/run-ipv6-test.sh b/tests/ipv6/run-ipv6-test.sh index 724f3a2a50..1678c055a9 100755 --- a/tests/ipv6/run-ipv6-test.sh +++ b/tests/ipv6/run-ipv6-test.sh @@ -18,10 +18,6 @@ RELEASE_REPO=ghcr.io/nginx/nginx-gateway-fabric cleanup() { echo "Cleaning up resources..." - kubectl delete -f ipv6/manifests/ipv6-test-app.yaml || true - kubectl delete -f ipv6/manifests/ipv6-test-client.yaml || true - kubectl delete -f ipv6/manifests/gateway.yaml || true - helm uninstall ${HELM_RELEASE_NAME} -n ${NAMESPACE} || true kind delete cluster --name ${CLUSTER_NAME} || true } @@ -32,21 +28,22 @@ kind create cluster --name ${CLUSTER_NAME} --config ipv6/config/kind-ipv6-only.y echo "Applying Gateway API CRDs" kubectl kustomize "https://github.com/nginx/nginx-gateway-fabric/config/crd/gateway-api/standard?ref=${RELEASE}" | kubectl apply -f - -docker pull ${RELEASE_REPO}:${RELEASE_IMAGE} +echo "Installing NGINX Gateway Fabric..." +echo "Using NGF from ${RELEASE_REPO}:${RELEASE_IMAGE}..." +echo "Using NGINX from ${RELEASE_REPO}/nginx:${RELEASE_IMAGE}..." -docker save ${RELEASE_REPO}:${RELEASE_IMAGE} | docker exec -i ${CLUSTER_NAME}-control-plane ctr --namespace=k8s.io images import - - -helm upgrade --install ${HELM_RELEASE_NAME} oci://ghcr.io/nginx/charts/nginx-gateway-fabric \ +helm install ${HELM_RELEASE_NAME} --wait oci://ghcr.io/nginx/charts/nginx-gateway-fabric \ --create-namespace -n ${NAMESPACE} \ --set nginx.config.ipFamily=ipv6 \ --set nginx.service.type=ClusterIP \ --set nginxGateway.image.repository=${RELEASE_REPO} \ - --set nginxGateway.image.tag=${RELEASE_IMAGE} + --set nginxGateway.image.tag=${RELEASE_IMAGE} \ + --set nginx.image.repository=${RELEASE_REPO}/nginx \ + --set nginx.image.tag=${RELEASE_IMAGE} \ echo "Deploying Gateway..." kubectl apply -f ipv6/manifests/gateway.yaml -echo "Waiting for NGINX Gateway to be ready..." kubectl wait --for=condition=accepted --timeout=300s gateway/gateway POD_NAME=$(kubectl get pods -l app.kubernetes.io/instance=${HELM_RELEASE_NAME} -o jsonpath='{.items[0].metadata.name}') kubectl wait --for=condition=ready --timeout=300s pod/${POD_NAME} @@ -54,9 +51,6 @@ kubectl wait --for=condition=ready --timeout=300s pod/${POD_NAME} echo "Deploying IPv6 test application" kubectl apply -f ipv6/manifests/ipv6-test-app.yaml -echo "Waiting for NGF to be ready..." -kubectl wait --for=condition=available --timeout=300s deployment/${HELM_RELEASE_NAME}-nginx-gateway-fabric -n ${NAMESPACE} - echo "Waiting for test applications to be ready..." kubectl wait --for=condition=available --timeout=300s deployment/test-app-ipv6 @@ -64,8 +58,8 @@ echo "Deploying IPv6 test client" kubectl apply -f ipv6/manifests/ipv6-test-client.yaml kubectl wait --for=condition=ready --timeout=300s pod/ipv6-test-client -echo "Getting NGF service IPv6 address" -NGF_IPV6=$(kubectl get service gateway-nginx -o jsonpath='{.spec.clusterIP}') +echo "Getting NGF service IPv6 address from gateway status" +NGF_IPV6=$(kubectl get gateway -o jsonpath='{.items[0].status.addresses[0].value}') echo "NGF IPv6 Address: $NGF_IPV6" echo "=== Running IPv6-Only Tests ===" From 0a492a85cd5da18407155f9614d957ee6bd6972c Mon Sep 17 00:00:00 2001 From: shaun-nx Date: Thu, 18 Sep 2025 10:03:59 +0100 Subject: [PATCH 5/8] Fix pre-commit error --- tests/ipv6/run-ipv6-test.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/ipv6/run-ipv6-test.sh b/tests/ipv6/run-ipv6-test.sh index 1678c055a9..836d71f88d 100755 --- a/tests/ipv6/run-ipv6-test.sh +++ b/tests/ipv6/run-ipv6-test.sh @@ -39,7 +39,7 @@ helm install ${HELM_RELEASE_NAME} --wait oci://ghcr.io/nginx/charts/nginx-gatewa --set nginxGateway.image.repository=${RELEASE_REPO} \ --set nginxGateway.image.tag=${RELEASE_IMAGE} \ --set nginx.image.repository=${RELEASE_REPO}/nginx \ - --set nginx.image.tag=${RELEASE_IMAGE} \ + --set nginx.image.tag=${RELEASE_IMAGE} echo "Deploying Gateway..." kubectl apply -f ipv6/manifests/gateway.yaml From 9d59dfaaa5017001c7e873ea6d2fc27a9b7596b9 Mon Sep 17 00:00:00 2001 From: shaun-nx Date: Thu, 18 Sep 2025 13:06:36 +0100 Subject: [PATCH 6/8] Update echo outputs --- tests/ipv6/run-ipv6-test.sh | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/tests/ipv6/run-ipv6-test.sh b/tests/ipv6/run-ipv6-test.sh index 836d71f88d..45df9c4125 100755 --- a/tests/ipv6/run-ipv6-test.sh +++ b/tests/ipv6/run-ipv6-test.sh @@ -25,12 +25,12 @@ trap cleanup EXIT kind create cluster --name ${CLUSTER_NAME} --config ipv6/config/kind-ipv6-only.yaml -echo "Applying Gateway API CRDs" +echo "== Applying Gateway API CRDs" kubectl kustomize "https://github.com/nginx/nginx-gateway-fabric/config/crd/gateway-api/standard?ref=${RELEASE}" | kubectl apply -f - -echo "Installing NGINX Gateway Fabric..." -echo "Using NGF from ${RELEASE_REPO}:${RELEASE_IMAGE}..." -echo "Using NGINX from ${RELEASE_REPO}/nginx:${RELEASE_IMAGE}..." +echo "== Installing NGINX Gateway Fabric..." +echo "== Using NGF from ${RELEASE_REPO}:${RELEASE_IMAGE}..." +echo "== Using NGINX from ${RELEASE_REPO}/nginx:${RELEASE_IMAGE}..." helm install ${HELM_RELEASE_NAME} --wait oci://ghcr.io/nginx/charts/nginx-gateway-fabric \ --create-namespace -n ${NAMESPACE} \ @@ -41,29 +41,29 @@ helm install ${HELM_RELEASE_NAME} --wait oci://ghcr.io/nginx/charts/nginx-gatewa --set nginx.image.repository=${RELEASE_REPO}/nginx \ --set nginx.image.tag=${RELEASE_IMAGE} -echo "Deploying Gateway..." +echo "== Deploying Gateway..." kubectl apply -f ipv6/manifests/gateway.yaml kubectl wait --for=condition=accepted --timeout=300s gateway/gateway POD_NAME=$(kubectl get pods -l app.kubernetes.io/instance=${HELM_RELEASE_NAME} -o jsonpath='{.items[0].metadata.name}') kubectl wait --for=condition=ready --timeout=300s pod/${POD_NAME} -echo "Deploying IPv6 test application" +echo "== Deploying IPv6 test application" kubectl apply -f ipv6/manifests/ipv6-test-app.yaml -echo "Waiting for test applications to be ready..." +echo "== Waiting for test applications to be ready..." kubectl wait --for=condition=available --timeout=300s deployment/test-app-ipv6 -echo "Deploying IPv6 test client" -kubectl apply -f ipv6/manifests/ipv6-test-client.yaml -kubectl wait --for=condition=ready --timeout=300s pod/ipv6-test-client - -echo "Getting NGF service IPv6 address from gateway status" +echo " ==Getting NGF service IPv6 address from gateway status" NGF_IPV6=$(kubectl get gateway -o jsonpath='{.items[0].status.addresses[0].value}') echo "NGF IPv6 Address: $NGF_IPV6" echo "=== Running IPv6-Only Tests ===" +echo "== Starting IPv6 test client" +kubectl apply -f ipv6/manifests/ipv6-test-client.yaml +kubectl wait --for=condition=ready --timeout=300s pod/ipv6-test-client + echo "== Test 1: Basic IPv6 connectivity ==" kubectl exec ipv6-test-client -- curl --version kubectl exec ipv6-test-client -- nslookup gateway-nginx.default.svc.cluster.local || echo "Test 1: Basic IPv6 connectivity failed" From 643a7b0352fd52946a5d9ce8109beb603d0a95d6 Mon Sep 17 00:00:00 2001 From: shaun-nx Date: Fri, 19 Sep 2025 11:23:39 +0100 Subject: [PATCH 7/8] Update script to use make commands. Update make commands with new variables for user to override --- Makefile | 6 ++-- docs/developer/release-process.md | 3 +- tests/Makefile | 6 ++-- tests/ipv6/run-ipv6-test.sh | 46 +++++++++++++++---------------- 4 files changed, 29 insertions(+), 32 deletions(-) diff --git a/Makefile b/Makefile index c794b3a9e2..2b9249a497 100644 --- a/Makefile +++ b/Makefile @@ -43,6 +43,8 @@ HELM_SCHEMA_VERSION = 0.18.1 PREFIX ?= nginx-gateway-fabric## The name of the NGF image. For example, nginx-gateway-fabric NGINX_PREFIX ?= $(PREFIX)/nginx## The name of the nginx image. For example: nginx-gateway-fabric/nginx NGINX_PLUS_PREFIX ?= $(PREFIX)/nginx-plus## The name of the nginx plus image. For example: nginx-gateway-fabric/nginx-plus +NGINX_SERVICE_TYPE ?= NodePort## The type of the nginx service. Possible values: NodePort, LoadBalancer, ClusterIP +PULL_POLICY ?= Never## The pull policy of the images. Possible values: Always, IfNotPresent, Never TAG ?= $(VERSION:v%=%)## The tag of the image. For example, 1.1.0 TARGET ?= local## The target of the build. Possible values: local and container OUT_DIR ?= build/out## The folder where the binary will be stored @@ -226,13 +228,13 @@ install-ngf-local-build-with-plus: check-for-plus-usage-endpoint build-images-wi .PHONY: helm-install-local helm-install-local: install-gateway-crds ## Helm install NGF on configured kind cluster with local images. To build, load, and install with helm run make install-ngf-local-build. - helm install nginx-gateway $(CHART_DIR) --set nginx.image.repository=$(NGINX_PREFIX) --create-namespace --wait --set nginxGateway.image.pullPolicy=Never --set nginx.service.type=NodePort --set nginxGateway.image.repository=$(PREFIX) --set nginxGateway.image.tag=$(TAG) --set nginx.image.tag=$(TAG) --set nginx.image.pullPolicy=Never --set nginxGateway.gwAPIExperimentalFeatures.enable=$(ENABLE_EXPERIMENTAL) -n nginx-gateway $(HELM_PARAMETERS) + helm install nginx-gateway $(CHART_DIR) --set nginx.image.repository=$(NGINX_PREFIX) --create-namespace --wait --set nginxGateway.image.pullPolicy=$(PULL_POLICY) --set nginx.service.type=$(NGINX_SERVICE_TYPE) --set nginxGateway.image.repository=$(PREFIX) --set nginxGateway.image.tag=$(TAG) --set nginx.image.tag=$(TAG) --set nginx.image.pullPolicy=$(PULL_POLICY) --set nginxGateway.gwAPIExperimentalFeatures.enable=$(ENABLE_EXPERIMENTAL) -n nginx-gateway $(HELM_PARAMETERS) .PHONY: helm-install-local-with-plus helm-install-local-with-plus: check-for-plus-usage-endpoint install-gateway-crds ## Helm install NGF with NGINX Plus on configured kind cluster with local images. To build, load, and install with helm run make install-ngf-local-build-with-plus. kubectl create namespace nginx-gateway || true kubectl -n nginx-gateway create secret generic nplus-license --from-file $(PLUS_LICENSE_FILE) || true - helm install nginx-gateway $(CHART_DIR) --set nginx.image.repository=$(NGINX_PLUS_PREFIX) --wait --set nginxGateway.image.pullPolicy=Never --set nginx.service.type=NodePort --set nginxGateway.image.repository=$(PREFIX) --set nginxGateway.image.tag=$(TAG) --set nginx.image.tag=$(TAG) --set nginx.image.pullPolicy=Never --set nginxGateway.gwAPIExperimentalFeatures.enable=$(ENABLE_EXPERIMENTAL) -n nginx-gateway --set nginx.plus=true --set nginx.usage.endpoint=$(PLUS_USAGE_ENDPOINT) $(HELM_PARAMETERS) + helm install nginx-gateway $(CHART_DIR) --set nginx.image.repository=$(NGINX_PLUS_PREFIX) --wait --set nginxGateway.image.pullPolicy=$(PULL_POLICY) --set nginx.service.type=$(NGINX_SERVICE_TYPE) --set nginxGateway.image.repository=$(PREFIX) --set nginxGateway.image.tag=$(TAG) --set nginx.image.tag=$(TAG) --set nginx.image.pullPolicy=$(PULL_POLICY) --set nginxGateway.gwAPIExperimentalFeatures.enable=$(ENABLE_EXPERIMENTAL) -n nginx-gateway --set nginx.plus=true --set nginx.usage.endpoint=$(PLUS_USAGE_ENDPOINT) $(HELM_PARAMETERS) .PHONY: check-for-plus-usage-endpoint check-for-plus-usage-endpoint: ## Checks that the PLUS_USAGE_ENDPOINT is set in the environment. This env var is required when deploying or testing with N+. diff --git a/docs/developer/release-process.md b/docs/developer/release-process.md index 5263c2d45c..1a2d25a099 100644 --- a/docs/developer/release-process.md +++ b/docs/developer/release-process.md @@ -44,8 +44,7 @@ To create a new release, follow these steps: 4. Once the release branch pipeline completes, run tests using the `release-X.X-rc` images that are pushed to Github (for example, `release-1.3-rc`). 1. Kick off the [longevity tests](https://github.com/nginx/nginx-gateway-fabric/blob/main/tests/README.md#longevity-testing) for both OSS and Plus. You'll need to create two clusters and VMs for this. Before running, update your `vars.env` file with the proper image tag and prefixes. NGF and nginx images will be available from `ghcr.io`, and nginx plus will be available in GCP (`us-docker.pkg.dev//nginx-gateway-fabric/nginx-plus`). These tests need to run for 4 days before releasing. The results should be committed to the main branch and then cherry-picked to the release branch. 2. Kick off the [NFR workflow](https://github.com/nginx/nginx-gateway-fabric/actions/workflows/nfr.yml) in the browser. For `image_tag`, use `release-X.X-rc`, and for `version`, use the upcoming `X.Y.Z` NGF version. Run the workflow on the new release branch. This will run all of the NFR tests which are automated and open a PR with the results files when it is complete. Review this PR and make any necessary changes before merging. Once merged, be sure to cherry-pick the commit to the main branch as well (the original PR targets the release branch). - 3. Run the IPv6 tests using the `make ipv6-tests` target. This must be run from within the `tests` directory. This script requires two arguments. The release version (e.g. `vX.Y.Z`) and the release image tag (e.g. `release-X.X-rc`). - For example, when running this script for release 2.1.0, it would look like this: `make ipv6-test RELEASE=vX.Y.Z RELEASE_IMAGE=release-X.X-rc` + 3. Run the IPv6 tests using the `make ipv6-tests` target. This must be run from within the `tests` directory. An example of running this script for release 2.1.0 would look like this: `make ipv6-test TAG=release-2.1-rc` 5. Run the [Release PR](https://github.com/nginx/nginx-gateway-fabric/actions/workflows/release-pr.yml) workflow to update the repo files for the release. Then there are a few manual steps to complete: 1. Update the [README](/README.md) to include information about the release. 2. Update the [changelog](/CHANGELOG.md). There is going to be a new blank section generated by the automation that needs to be adjusted accordingly. diff --git a/tests/Makefile b/tests/Makefile index 0d894b9c01..ec0fe2edb5 100644 --- a/tests/Makefile +++ b/tests/Makefile @@ -16,8 +16,6 @@ SUPPORTED_EXTENDED_FEATURES = HTTPRouteQueryParamMatching,HTTPRouteMethodMatchin STANDARD_CONFORMANCE_PROFILES = GATEWAY-HTTP,GATEWAY-GRPC EXPERIMENTAL_CONFORMANCE_PROFILES = GATEWAY-TLS CONFORMANCE_PROFILES = $(STANDARD_CONFORMANCE_PROFILES) # by default we use the standard conformance profiles. If experimental is enabled we override this and add the experimental profiles. -RELEASE ?= main # e.g. v2.1.0 -RELEASE_IMAGE ?= edge # e.g. release-2.1.0-rc SKIP_TESTS = CEL_TEST_TARGET = @@ -122,8 +120,8 @@ stop-longevity-test: nfr-test ## Stop the longevity test and collects results .PHONY: ipv6-tests ipv6-tests: GOARCH=amd64 -ipv6-tests: ## Example usage: make ipv6-tests RELEASE=vX.Y.Z RELEASE_IMAGE=release-X.Y-rc - ./ipv6/run-ipv6-test.sh $(RELEASE) $(RELEASE_IMAGE) +ipv6-tests: ## Example usage: make ipv6-tests TAG=release-X.Y-rc + ./ipv6/run-ipv6-test.sh $(TAG) .PHONY: .vm-nfr-test diff --git a/tests/ipv6/run-ipv6-test.sh b/tests/ipv6/run-ipv6-test.sh index 45df9c4125..84b8534303 100755 --- a/tests/ipv6/run-ipv6-test.sh +++ b/tests/ipv6/run-ipv6-test.sh @@ -2,18 +2,20 @@ set -e # Exit immediately if a command exits with a non-zero status -RELEASE=$1 -RELEASE_IMAGE=$2 +SCRIPT_DIR=$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" &>/dev/null && pwd) +REPO_DIR=$(dirname $(dirname "$SCRIPT_DIR")) -if [[ -z $RELEASE || -z $RELEASE_IMAGE ]]; then - echo "Usage: $0 [HELM_RELEASE_NAME] [NAMESPACE] [CLUSTER_NAME]" - echo "Error: RELEASE and RELEASE_IMAGE are required parameters. Example usage $(make ipv6-test RELEASE=vX.Y.Z RELEASE_IMAGE=release-X.Y-rc)" +TAG=$1 + +if [[ -z $TAG ]]; then + echo "Usage: $0 [RELEASE_NAME] [NAMESPACE] [CLUSTER_NAME]" + echo "Error: TAG is a required parameter. Example usage: `make ipv6-test TAG=release-X.Y-rc`" exit 1 fi -HELM_RELEASE_NAME=${3:-ngf} -NAMESPACE=${4:-nginx-gateway} -CLUSTER_NAME=${5:-ipv6-only-${RELEASE}} +RELEASE_NAME=${2:-nginx-gateway} +NAMESPACE=${3:-nginx-gateway} +CLUSTER_NAME=${4:-ipv6-only-${TAG}} RELEASE_REPO=ghcr.io/nginx/nginx-gateway-fabric cleanup() { @@ -25,27 +27,23 @@ trap cleanup EXIT kind create cluster --name ${CLUSTER_NAME} --config ipv6/config/kind-ipv6-only.yaml -echo "== Applying Gateway API CRDs" -kubectl kustomize "https://github.com/nginx/nginx-gateway-fabric/config/crd/gateway-api/standard?ref=${RELEASE}" | kubectl apply -f - - echo "== Installing NGINX Gateway Fabric..." -echo "== Using NGF from ${RELEASE_REPO}:${RELEASE_IMAGE}..." -echo "== Using NGINX from ${RELEASE_REPO}/nginx:${RELEASE_IMAGE}..." - -helm install ${HELM_RELEASE_NAME} --wait oci://ghcr.io/nginx/charts/nginx-gateway-fabric \ - --create-namespace -n ${NAMESPACE} \ - --set nginx.config.ipFamily=ipv6 \ - --set nginx.service.type=ClusterIP \ - --set nginxGateway.image.repository=${RELEASE_REPO} \ - --set nginxGateway.image.tag=${RELEASE_IMAGE} \ - --set nginx.image.repository=${RELEASE_REPO}/nginx \ - --set nginx.image.tag=${RELEASE_IMAGE} +echo "== Using NGF from ${RELEASE_REPO}:${TAG}..." +echo "== Using NGINX from ${RELEASE_REPO}/nginx:${TAG}..." + +HELM_PARAMETERS="--set nginx.config.ipFamily=ipv6" +make helm-install-local HELM_PARAMETERS="${HELM_PARAMETERS}" \ + PREFIX="${RELEASE_REPO}" \ + TAG="${TAG}" \ + SELF_DIR="${REPO_DIR}/" \ + NGINX_SERVICE_TYPE="ClusterIP" \ + PULL_POLICY="Always" echo "== Deploying Gateway..." kubectl apply -f ipv6/manifests/gateway.yaml kubectl wait --for=condition=accepted --timeout=300s gateway/gateway -POD_NAME=$(kubectl get pods -l app.kubernetes.io/instance=${HELM_RELEASE_NAME} -o jsonpath='{.items[0].metadata.name}') +POD_NAME=$(kubectl get pods -l app.kubernetes.io/instance=${RELEASE_NAME} -o jsonpath='{.items[0].metadata.name}') kubectl wait --for=condition=ready --timeout=300s pod/${POD_NAME} echo "== Deploying IPv6 test application" @@ -54,7 +52,7 @@ kubectl apply -f ipv6/manifests/ipv6-test-app.yaml echo "== Waiting for test applications to be ready..." kubectl wait --for=condition=available --timeout=300s deployment/test-app-ipv6 -echo " ==Getting NGF service IPv6 address from gateway status" +echo "== Getting NGF service IPv6 address from gateway status" NGF_IPV6=$(kubectl get gateway -o jsonpath='{.items[0].status.addresses[0].value}') echo "NGF IPv6 Address: $NGF_IPV6" From b413a3ffb9e60e0f611529b399249580ab9b1e8a Mon Sep 17 00:00:00 2001 From: shaun-nx Date: Fri, 19 Sep 2025 11:26:25 +0100 Subject: [PATCH 8/8] Run pre-commit --- tests/ipv6/run-ipv6-test.sh | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/tests/ipv6/run-ipv6-test.sh b/tests/ipv6/run-ipv6-test.sh index 84b8534303..b558f528a0 100755 --- a/tests/ipv6/run-ipv6-test.sh +++ b/tests/ipv6/run-ipv6-test.sh @@ -9,7 +9,7 @@ TAG=$1 if [[ -z $TAG ]]; then echo "Usage: $0 [RELEASE_NAME] [NAMESPACE] [CLUSTER_NAME]" - echo "Error: TAG is a required parameter. Example usage: `make ipv6-test TAG=release-X.Y-rc`" + echo "Error: TAG is a required parameter. Example usage: $(make ipv6-test TAG=release-X.Y-rc)" exit 1 fi @@ -33,11 +33,11 @@ echo "== Using NGINX from ${RELEASE_REPO}/nginx:${TAG}..." HELM_PARAMETERS="--set nginx.config.ipFamily=ipv6" make helm-install-local HELM_PARAMETERS="${HELM_PARAMETERS}" \ - PREFIX="${RELEASE_REPO}" \ - TAG="${TAG}" \ - SELF_DIR="${REPO_DIR}/" \ - NGINX_SERVICE_TYPE="ClusterIP" \ - PULL_POLICY="Always" + PREFIX="${RELEASE_REPO}" \ + TAG="${TAG}" \ + SELF_DIR="${REPO_DIR}/" \ + NGINX_SERVICE_TYPE="ClusterIP" \ + PULL_POLICY="Always" echo "== Deploying Gateway..." kubectl apply -f ipv6/manifests/gateway.yaml