From ccd64a3df94b8ec93012595a62adb52ef3eaa43e Mon Sep 17 00:00:00 2001 From: Stefan Prodan Date: Mon, 21 Dec 2020 00:38:45 +0200 Subject: [PATCH] Add Kubernetes B/G e2e tests Signed-off-by: Stefan Prodan --- .github/workflows/e2e.yaml | 1 + test/kubernetes/install.sh | 15 +++ test/kubernetes/run.sh | 12 ++ test/kubernetes/test-daemonset.sh | 189 +++++++++++++++++++++++++++++ test/kubernetes/test-deployment.sh | 100 +++++++++++++++ test/traefik/install.sh | 2 +- 6 files changed, 318 insertions(+), 1 deletion(-) create mode 100755 test/kubernetes/install.sh create mode 100755 test/kubernetes/run.sh create mode 100755 test/kubernetes/test-daemonset.sh create mode 100755 test/kubernetes/test-deployment.sh diff --git a/.github/workflows/e2e.yaml b/.github/workflows/e2e.yaml index 851a57d7..a2545c17 100644 --- a/.github/workflows/e2e.yaml +++ b/.github/workflows/e2e.yaml @@ -19,6 +19,7 @@ jobs: - nginx - traefik - gloo + - kubernetes steps: - name: Checkout uses: actions/checkout@v2 diff --git a/test/kubernetes/install.sh b/test/kubernetes/install.sh new file mode 100755 index 00000000..01862271 --- /dev/null +++ b/test/kubernetes/install.sh @@ -0,0 +1,15 @@ +#!/usr/bin/env bash + +set -o errexit + +REPO_ROOT=$(git rev-parse --show-toplevel) + +mkdir -p ${REPO_ROOT}/bin + +echo '>>> Installing Flagger' +kubectl apply -k ${REPO_ROOT}/kustomize/kubernetes + +kubectl -n flagger-system set image deployment/flagger flagger=test/flagger:latest + +kubectl -n flagger-system rollout status deployment/flagger +kubectl -n flagger-system rollout status deployment/flagger-prometheus \ No newline at end of file diff --git a/test/kubernetes/run.sh b/test/kubernetes/run.sh new file mode 100755 index 00000000..03fad0fc --- /dev/null +++ b/test/kubernetes/run.sh @@ -0,0 +1,12 @@ +#!/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-deployment.sh +"$DIR"/test-daemonset.sh diff --git a/test/kubernetes/test-daemonset.sh b/test/kubernetes/test-daemonset.sh new file mode 100755 index 00000000..cd94f38a --- /dev/null +++ b/test/kubernetes/test-daemonset.sh @@ -0,0 +1,189 @@ +#!/usr/bin/env bash + +# This script runs e2e tests for Blue/Green initialization, analysis and promotion +# Prerequisites: Kubernetes Kind, Kustomize + +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-ds | grep 'Initialized' && ok=true || ok=false + sleep 5 + count=$(($count + 1)) + if [[ ${count} -eq ${retries} ]]; then + kubectl -n flagger-system logs deployment/flagger + echo "No more retries left" + exit 1 + fi +done + +echo '✔ Canary initialization test passed' + +echo '>>> Triggering canary daemonset' +kubectl -n test set image daemonset/podinfo-ds podinfod=stefanprodan/podinfo:3.1.1 + +echo '>>> Waiting for canary promotion' +retries=50 +count=0 +ok=false +until ${ok}; do + kubectl -n test describe daemonset/podinfo-ds-primary | grep '3.1.1' && ok=true || ok=false + sleep 10 + kubectl -n flagger-system logs deployment/flagger --tail 1 + count=$(($count + 1)) + if [[ ${count} -eq ${retries} ]]; then + kubectl -n test describe daemonset/podinfo-ds + kubectl -n test describe daemonset/podinfo-primary-ds + kubectl -n flagger-system logs deployment/flagger + echo "No more retries left" + exit 1 + fi +done + +echo '✔ Canary promotion test passed' + + +cat <>> Waiting for finalizers to be present' +retries=50 +count=0 +ok=false +until ${ok}; do + kubectl get canary podinfo-ds -n test -o jsonpath='{.metadata.finalizers}' | grep "finalizer.flagger.app" && ok=true || ok=false + sleep 10 + count=$(($count + 1)) + if [[ ${count} -eq ${retries} ]]; then + kubectl -n test describe canary/podinfo + echo "No more retries left" + exit 1 + fi +done + +kubectl delete canary podinfo -n test + +echo '>>> Waiting for primary to revert' +retries=50 +count=0 +ok=false +until ${ok}; do + kubectl get daemonset podinfo-ds -n test -o jsonpath='{.status.numberReady}' | grep 1 && ok=true || ok=false + sleep 10 + kubectl -n flagger-system logs deployment/flagger --tail 1 + count=$(($count + 1)) + if [[ ${count} -eq ${retries} ]]; then + kubectl -n test describe-ds canary/podinfo + echo "No more retries left" + exit 1 + fi +done + +echo '✔ Canary finalize passed' + +kubectl -n flagger-system logs deployment/flagger diff --git a/test/kubernetes/test-deployment.sh b/test/kubernetes/test-deployment.sh new file mode 100755 index 00000000..42cb7a2d --- /dev/null +++ b/test/kubernetes/test-deployment.sh @@ -0,0 +1,100 @@ +#!/usr/bin/env bash + +# This script runs e2e tests for Blue/Green initialization, analysis and promotion +# Prerequisites: Kubernetes Kind, Kustomize + +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 flagger-system logs deployment/flagger + echo "No more retries left" + exit 1 + fi +done + +echo '✔ Canary initialization 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=50 +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 flagger-system 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 flagger-system logs deployment/flagger + echo "No more retries left" + exit 1 + fi +done + +echo '✔ Canary promotion test passed' + +kubectl -n flagger-system logs deployment/flagger diff --git a/test/traefik/install.sh b/test/traefik/install.sh index f3d1f677..62ce237c 100755 --- a/test/traefik/install.sh +++ b/test/traefik/install.sh @@ -34,4 +34,4 @@ helm upgrade -i flagger ${REPO_ROOT}/charts/flagger \ --set image.tag=latest \ kubectl -n traefik rollout status deployment/flagger -kubectl -n projectcontour rollout status deployment/flagger-prometheus +kubectl -n traefik rollout status deployment/flagger-prometheus