diff --git a/test/nginx/test-canary.sh b/test/nginx/test-canary.sh index 980c5f76..baaccf28 100755 --- a/test/nginx/test-canary.sh +++ b/test/nginx/test-canary.sh @@ -244,7 +244,7 @@ spec: timeout: 5s metadata: type: bash - cmd: "curl -sH 'x-user: insider' -H 'Host: app.example.com' http://ingress-nginx-controller.ingress-nginx | grep '3.1.1'" + cmd: "curl -sH 'x-user: insider' -H 'Host: app.example.com' http://ingress-nginx-controller.ingress-nginx" - name: load-test type: rollout url: http://flagger-loadtester.test/ diff --git a/test/traefik/install.sh b/test/traefik/install.sh new file mode 100755 index 00000000..e238edd5 --- /dev/null +++ b/test/traefik/install.sh @@ -0,0 +1,36 @@ +#!/usr/bin/env bash + +set -o errexit + +TRAEFIK_CHART_VERSION="9.11.0" # traefik 2.3.3 +REPO_ROOT=$(git rev-parse --show-toplevel) + +mkdir -p ${REPO_ROOT}/bin + +echo '>>> Creating traefik namespace' +kubectl create ns traefik + +echo '>>> Installing Traefik' +helm repo add traefik https://helm.traefik.io/traefik +cat <>> Installing Flagger' +helm upgrade -i flagger ${REPO_ROOT}/charts/flagger \ +--set crd.create=false \ +--namespace traefik \ +--set prometheus.install=true \ +--set meshProvider=traefik \ +--set image.repository=test\/flagger \ +--set image.tag=latest \ + +kubectl -n traefik rollout status deployment/flagger +kubectl -n projectcontour rollout status deployment/flagger-prometheus diff --git a/test/traefik/run.sh b/test/traefik/run.sh new file mode 100755 index 00000000..67153fa9 --- /dev/null +++ b/test/traefik/run.sh @@ -0,0 +1,11 @@ +#!/usr/bin/env bash + +set -o errexit + +REPO_ROOT=$(git rev-parse --show-toplevel) +DIR="$(cd "$(dirname "$0")" && pwd)" + +"$DIR"/install.sh + +"$REPO_ROOT"/test/workloads/init.sh +"$DIR"/test-canary.sh diff --git a/test/traefik/test-canary.sh b/test/traefik/test-canary.sh new file mode 100755 index 00000000..8847bda9 --- /dev/null +++ b/test/traefik/test-canary.sh @@ -0,0 +1,146 @@ +#!/usr/bin/env bash + +# This script runs e2e tests for Canary initialization, analysis and promotion +# Prerequisites: Kubernetes Kind, Helm and Traefik ingress controller + +set -o errexit + +REPO_ROOT=$(git rev-parse --show-toplevel) + +cat <>> Waiting for primary to be ready' +retries=50 +count=0 +ok=false +until ${ok}; do + kubectl -n test get canary/podinfo | grep 'Initialized' && ok=true || ok=false + sleep 5 + count=$(($count + 1)) + if [[ ${count} -eq ${retries} ]]; then + kubectl -n traefik logs deployment/flagger + echo "No more retries left" + exit 1 + fi +done + +echo '✔ Canary initialization test passed' + +passed=$(kubectl -n test get svc/podinfo -o jsonpath='{.spec.selector.app}' 2>&1 | { grep podinfo-primary || true; }) +if [ -z "$passed" ]; then + echo -e '\u2716 podinfo selector test failed' + exit 1 +fi +passed=$(kubectl -n test get traefikservice/podinfo -o jsonpath='{.metadata.labels}' 2>&1 | { grep test-label || true; }) +if [ -z "$passed" ]; then + echo -e '\u2716 TraefikService does not have required labels' + exit 1 +fi +passed=$(kubectl -n test get traefikservice/podinfo -o jsonpath='{.metadata.annotations}' 2>&1 | { grep test-annotation || true; }) +if [ -z "$passed" ]; then + echo -e '\u2716 TraefikService does not have required annotations' + exit 1 +fi + +echo '✔ Canary service custom metadata test passed' + +echo '>>> Triggering canary deployment' +kubectl -n test set image deployment/podinfo podinfod=stefanprodan/podinfo:3.1.1 + +echo '>>> Waiting for canary promotion' +retries=60 +count=0 +ok=false +until ${ok}; do + kubectl -n test describe deployment/podinfo-primary | grep '3.1.1' && ok=true || ok=false + sleep 10 + kubectl -n traefik logs deployment/flagger --tail 1 + count=$(($count + 1)) + if [[ ${count} -eq ${retries} ]]; then + kubectl -n test describe deployment/podinfo + kubectl -n test describe deployment/podinfo-primary + kubectl -n test logs deployment/flagger-loadtester + kubectl -n traefik logs deployment/flagger + kubectl -n traefik get all + echo "No more retries left" + exit 1 + fi +done + +echo '✔ Canary promotion test passed'