Skip to content

Commit

Permalink
Adding in deploy changes tests for vcluster
Browse files Browse the repository at this point in the history
  • Loading branch information
Sowmya viswam authored and Sowmya viswam committed Aug 8, 2024
1 parent 1e5ccb5 commit 3d2cd9a
Show file tree
Hide file tree
Showing 61 changed files with 542 additions and 92 deletions.
246 changes: 246 additions & 0 deletions .github/workflows/e2e-deploy-changes.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,246 @@
name: E2E Deploy Changes CI

on:
workflow_dispatch:
release:
types: [created]
pull_request:
branches:
- main
- v*
paths:
- "test/deploy_changes/**"

concurrency:
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
cancel-in-progress: true

env:
REPOSITORY_NAME: ghcr.io/${{ github.repository }}-ci
TAG_NAME: PR${{ github.event.number }}
VCLUSTER_SUFFIX: vcluster
VCLUSTER_NAME: vcluster
VCLUSTER_NAMESPACE: vcluster

jobs:
build-and-push-syncer-image:
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v4
with:
fetch-depth: 0
- run: git fetch --force --tags
- name: Set up Go
uses: actions/setup-go@v5
with:
go-version: "1.22"
- name: Setup Just
uses: extractions/setup-just@v2
- name: Setup Syft
uses: anchore/sbom-action/[email protected]
- name: Setup GoReleaser
uses: goreleaser/goreleaser-action@v6
with:
install-only: true
version: latest
- name: Build and save syncer image
run: |
set -x
TELEMETRY_PRIVATE_KEY="" goreleaser build --single-target --snapshot --id vcluster --clean --output ./vcluster
docker build -t "${{ env.REPOSITORY_NAME }}:${{ env.TAG_NAME }}" -f Dockerfile.release --build-arg TARGETARCH=amd64 --build-arg TARGETOS=linux .
docker save -o vcluster_syncer "${{ env.REPOSITORY_NAME }}:${{ env.TAG_NAME }}"
- name: Upload syncer image to artifact
uses: actions/upload-artifact@v4
with:
name: vcluster_syncer
path: ./vcluster_syncer
retention-days: 7

build-vcluster-cli:
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v4
with:
fetch-depth: 0
- run: git fetch --force --tags
- name: Set up Go
uses: actions/setup-go@v5
with:
go-version: "1.22"
- name: Setup Just
uses: extractions/setup-just@v2
- name: Setup Syft
uses: anchore/sbom-action/[email protected]
- name: Setup GoReleaser
uses: goreleaser/goreleaser-action@v6
with:
install-only: true
- name: Build vcluster cli
run: |
set -x
TELEMETRY_PRIVATE_KEY="" goreleaser build --single-target --snapshot --id vcluster-cli --clean --output ./vcluster
- name: Upload vcluster cli to artifact
uses: actions/upload-artifact@v4
with:
name: vcluster
path: ./vcluster
retention-days: 7

build-tests:
name: Build tests binaries
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4

- name: Configure git
run: git config --global url.https://[email protected]/.insteadOf https://github.com/
env:
GH_ACCESS_TOKEN: ${{ secrets.GH_ACCESS_TOKEN }}

- name: Set up Go
uses: actions/setup-go@v4
with:
go-version-file: go.mod

- name: Build e2e binary
run: |
cd ./test/deploy_changes
go run -mod=vendor github.com/onsi/ginkgo/v2/ginkgo build --require-suite -r --mod vendor $(ls *.test | jq -R . | jq -rcs '. | join(" \\\n")')
env:
GOWORK: off

- name: Upload test binaries to artifacts
uses: actions/upload-artifact@v4
with:
name: test-binaries
path: ./test/deploy_changes/*.test
retention-days: 7

deploy-tests:
name: Execute test suites
needs:
- build-and-push-syncer-image
- build-vcluster-cli
- build-tests

runs-on: ubuntu-latest
strategy:
fail-fast: false
steps:
- name: Checkout repository
uses: actions/checkout@v4

- uses: azure/setup-helm@v4
name: Setup Helm
with:
version: "v3.11.0"

- name: Set up kind k8s cluster
uses: engineerd/[email protected]
with:
version: "v0.20.0"
image: kindest/node:v1.30.0@sha256:047357ac0cfea04663786a612ba1eaba9702bef25227a794b52890dd8bcd692e

- name: Testing kind cluster set-up
run: |
set -x
kubectl cluster-info
kubectl get pods -n kube-system
echo "kubectl config current-context:" $(kubectl config current-context)
echo "KUBECONFIG env var:" ${KUBECONFIG}
- name: Download vcluster cli
uses: actions/download-artifact@v4
with:
name: vcluster

- name: Download syncer image
uses: actions/download-artifact@v4
with:
name: vcluster_syncer

- name: Download test binaries
uses: actions/download-artifact@v4
with:
name: test-binaries
path: ./test/deploy_changes

- name: Create vcluster
id: create-vcluster
run: |
set -x
sudo apt-get install -y sed
sed -i "s|REPLACE_REPOSITORY_NAME|${{ env.REPOSITORY_NAME }}|g" ./test/deploy_changes/commonValues.yaml
sed -i "s|REPLACE_TAG_NAME|${{ env.TAG_NAME }}|g" ./test/deploy_changes/commonValues.yaml
kind load image-archive vcluster_syncer
chmod +x vcluster && sudo mv vcluster /usr/bin
vcluster create ${{ env.VCLUSTER_SUFFIX }} -n ${{ env.VCLUSTER_NAMESPACE }} \
--create-namespace \
--debug \
--connect=false \
--local-chart-dir ./chart \
-f ./test/deploy_changes/commonValues.yaml
continue-on-error: true

- name: Wait until vcluster is ready
id: wait-until-vcluster-is-ready
if: steps.create-vcluster.outcome == 'success'
run: |
set -x
./hack/wait-for-pod.sh -l app=${{ env.VCLUSTER_SUFFIX }} -n ${{ env.VCLUSTER_NAMESPACE }}
continue-on-error: true

- name: Collect deployment information in case vcluster fails to start
if: steps.wait-until-vcluster-is-ready.outcome != 'success'
run: |
set -x
kubectl get pods -o yaml -n ${{ env.VCLUSTER_NAMESPACE }}
echo "======================================================================================================================"
kubectl get events -n ${{ env.VCLUSTER_NAMESPACE }} --sort-by='.lastTimestamp'
echo "======================================================================================================================"
kubectl logs -l app=${{ env.VCLUSTER_SUFFIX }} -n ${{ env.VCLUSTER_NAMESPACE }} -c syncer --tail=-1 -p || kubectl logs -l app=${{ env.VCLUSTER_SUFFIX }} -n ${{ env.VCLUSTER_NAMESPACE }} -c syncer --tail=-1
echo "======================================================================================================================"
kubectl describe pods -n ${{ env.VCLUSTER_NAMESPACE }}
exit 1
# Skips NetworkPolicy tests because they require network plugin with support (e.g. Calico)
- name: Execute tests
id: execute-tests
working-directory: ./test
run: |
set -x
sudo chmod +x ./deploy_changes/*.test
VCLUSTER_SUFFIX=${{ env.VCLUSTER_SUFFIX }} VCLUSTER_NAME=${{ env.VCLUSTER_NAME }} VCLUSTER_NAMESPACE=${{ env.VCLUSTER_NAMESPACE }} ./deploy_changes/*.test -test.v --ginkgo.v --ginkgo.skip='.*NetworkPolicy.*' --ginkgo.fail-fast
if kubectl logs -l app=${{ env.VCLUSTER_SUFFIX }} -n ${{ env.VCLUSTER_NAMESPACE }} -c syncer --tail=-1 -p >/dev/null 2>/dev/null; then
echo "vCluster has restarted during testing, failing..."
exit 1
fi
continue-on-error: true

- name: Print logs if tests fail
if: steps.execute-tests.outcome == 'failure'
run: |
set -x
kubectl get pods -o yaml -n ${{ env.VCLUSTER_NAMESPACE }}
echo "======================================================================================================================"
kubectl get events -n ${{ env.VCLUSTER_NAMESPACE }} --sort-by='.lastTimestamp'
echo "======================================================================================================================"
kubectl logs -l app=${{ env.VCLUSTER_SUFFIX }} -n ${{ env.VCLUSTER_NAMESPACE }} -c syncer --tail=-1 -p || kubectl logs -l app=${{ env.VCLUSTER_SUFFIX }} -n ${{ env.VCLUSTER_NAMESPACE }} -c syncer --tail=-1
echo "======================================================================================================================"
kubectl describe pods -n ${{ env.VCLUSTER_NAMESPACE }}
exit 1
44 changes: 22 additions & 22 deletions .github/workflows/e2e.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ on:
paths:
- "**.go"
- "!**_test.go" # exclude test files to ignore unit test changes
- "test/**" # include test files in e2e again
- "test/functional_tests/**" # include test files in e2e again
- "!**.md"
- "Dockerfile.release"
- ".github/workflows/e2e.yaml"
Expand Down Expand Up @@ -104,7 +104,7 @@ jobs:
run: |
set -x
sudo apt-get install -y jq
paths=$(ls -d ./test/e2e*)
paths=$(ls -d ./test/functional_tests/e2e*)
echo "matrix=$(printf '%s\n' "${paths}" | jq -R . | jq -cs .)" >> "$GITHUB_OUTPUT"
outputs:
matrix: ${{ steps.set-paths-matrix.outputs.matrix }}
Expand All @@ -129,15 +129,15 @@ jobs:

- name: Build e2e binary
run: |
go run -mod=vendor github.com/onsi/ginkgo/v2/ginkgo build --require-suite -r --mod vendor $(ls -d ./test/e2e* | jq -R . | jq -rcs '. | join(" \\\n")')
go run -mod=vendor github.com/onsi/ginkgo/v2/ginkgo build --require-suite -r --mod vendor $(ls -d ./test/functional_tests/e2e* | jq -R . | jq -rcs '. | join(" \\\n")')
env:
GOWORK: off

- name: Upload e2e binaries to artifacts
uses: actions/upload-artifact@v4
with:
name: e2e-binaries
path: ./test/*/*.test
path: ./test/functional_tests/*/*.test
retention-days: 7

vcluster-install-delete:
Expand Down Expand Up @@ -287,14 +287,14 @@ jobs:
chmod +x ./vcluster-dev/vcluster
set -x
sed -i "s|REPLACE_REPOSITORY_NAME|${{ env.REPOSITORY_NAME }}|g" test/commonValues.yaml
sed -i "s|REPLACE_TAG_NAME|${{ env.TAG_NAME }}|g" test/commonValues.yaml
sed -i "s|REPLACE_REPOSITORY_NAME|${{ env.REPOSITORY_NAME }}|g" test/functional_tests/commonValues.yaml
sed -i "s|REPLACE_TAG_NAME|${{ env.TAG_NAME }}|g" test/functional_tests/commonValues.yaml
./vcluster-dev/vcluster create vcluster --distro=${{ matrix.distribution }} \
--connect=false \
--upgrade \
--local-chart-dir ./chart \
-f ./test/commonValues.yaml
-f ./test/functional_tests/commonValues.yaml
./hack/wait-for-pod.sh -l app=${{ env.VCLUSTER_SUFFIX }} -n ${{ env.VCLUSTER_NAMESPACE }}
Expand All @@ -317,15 +317,15 @@ jobs:
include:
- distribution: "k8s"
ha: "true"
test-suite-path: "./test/e2e"
test-suite-path: "./test/functional_tests/e2e"
multinamespace-mode: "false"
- distribution: "k3s"
ha: "true"
test-suite-path: "./test/e2e"
test-suite-path: "./test/functional_tests/e2e"
multinamespace-mode: "false"
- distribution: "k0s"
ha: "true"
test-suite-path: "./test/e2e"
test-suite-path: "./test/functional_tests/e2e"
multinamespace-mode: "false"
exclude:
- ha: "true"
Expand All @@ -335,13 +335,13 @@ jobs:
multinamespace-mode: "true"
- distribution: "k3s"
multinamespace-mode: "true"
test-suite-path: "./test/e2e_target_namespace"
test-suite-path: "./test/functional_tests/e2e_target_namespace"
- distribution: "k3s"
multinamespace-mode: "true"
test-suite-path: "./test/e2e_plugin"
test-suite-path: "./test/functional_tests/e2e_plugin"
- distribution: "k3s"
multinamespace-mode: "true"
test-suite-path: "./test/e2e_isolation_mode"
test-suite-path: "./test/functional_tests/e2e_isolation_mode"

steps:
- name: Checkout repository
Expand Down Expand Up @@ -380,7 +380,7 @@ jobs:
uses: actions/download-artifact@v4
with:
name: e2e-binaries
path: ./test
path: ./test/functional_tests

# - name: Setup upterm session for debugging
# uses: lhotari/action-upterm@v1
Expand All @@ -392,18 +392,18 @@ jobs:
extraArgs=()
if [ ${{ matrix.multinamespace-mode }} == "true" ]; then
extraArgs+=( -f ./test/multins_values.yaml )
extraArgs+=( -f ./test/functional_tests/multins_values.yaml )
fi
if [ ${{ matrix.test-suite-path }} == "./test/e2e_metrics_proxy" ]; then
if [ ${{ matrix.test-suite-path }} == "./test/functional_tests/e2e_metrics_proxy" ]; then
helm repo add metrics-server https://kubernetes-sigs.github.io/metrics-server/
helm upgrade --install metrics-server metrics-server/metrics-server --set args={--kubelet-insecure-tls} --set containerPort=4443 -n kube-system
fi
if [ ${{ matrix.ha }} == "true" ]; then
haValues="-f ./test/values_ha.yaml"
haValues="-f ./test/functional_tests/values_ha.yaml"
fi
if [ ${{ matrix.test-suite-path }} == "./test/e2e_target_namespace" ]; then
if [ ${{ matrix.test-suite-path }} == "./test/functional_tests/e2e_target_namespace" ]; then
kubectl apply -f ${{ matrix.test-suite-path }}/role.yaml
fi
Expand All @@ -422,7 +422,7 @@ jobs:
--connect=false \
--distro=${{ matrix.distribution }} \
--local-chart-dir ./chart \
-f ./test/commonValues.yaml \
-f ./test/functional_tests/commonValues.yaml \
$haValues \
-f ${{ matrix.test-suite-path }}/values.yaml \
"${extraArgs[@]}"
Expand All @@ -448,7 +448,7 @@ jobs:
echo "======================================================================================================================"
kubectl logs -l app=${{ env.VCLUSTER_SUFFIX }} -n ${{ env.VCLUSTER_NAMESPACE }} -c syncer --tail=-1 -p || kubectl logs -l app=${{ env.VCLUSTER_SUFFIX }} -n ${{ env.VCLUSTER_NAMESPACE }} -c syncer --tail=-1
echo "======================================================================================================================"
if [[ "${{ matrix.test-suite-path }}" = "./test/e2e_plugin" ]]; then
if [[ "${{ matrix.test-suite-path }}" = "./test/functional_tests/e2e_plugin" ]]; then
kubectl logs -l app=${{ env.VCLUSTER_SUFFIX }} -n ${{ env.VCLUSTER_NAMESPACE }} -c bootstrap-with-deployment --tail=-1 -p || kubectl logs -l app=${{ env.VCLUSTER_SUFFIX }} -n ${{ env.VCLUSTER_NAMESPACE }} -c bootstrap-with-deployment --tail=-1
echo "======================================================================================================================"
fi
Expand All @@ -462,9 +462,9 @@ jobs:
run: |
set -x
sudo chmod +x $(echo "${{ matrix.test-suite-path }}" | sed "s#./test/##g").test
sudo chmod +x $(echo "${{ matrix.test-suite-path }}" | sed "s#./test/functional_tests/##g").test
VCLUSTER_SUFFIX=${{ env.VCLUSTER_SUFFIX }} VCLUSTER_NAME=${{ env.VCLUSTER_NAME }} VCLUSTER_NAMESPACE=${{ env.VCLUSTER_NAMESPACE }} MULTINAMESPACE_MODE=${{ matrix.multinamespace-mode }} ./$(echo "${{ matrix.test-suite-path }}" | sed "s#./test/##g").test -test.v --ginkgo.v --ginkgo.skip='.*NetworkPolicy.*' --ginkgo.fail-fast
VCLUSTER_SUFFIX=${{ env.VCLUSTER_SUFFIX }} VCLUSTER_NAME=${{ env.VCLUSTER_NAME }} VCLUSTER_NAMESPACE=${{ env.VCLUSTER_NAMESPACE }} MULTINAMESPACE_MODE=${{ matrix.multinamespace-mode }} ./$(echo "${{ matrix.test-suite-path }}" | sed "s#./test/functional_tests/##g").test -test.v --ginkgo.v --ginkgo.skip='.*NetworkPolicy.*' --ginkgo.fail-fast
if kubectl logs -l app=${{ env.VCLUSTER_SUFFIX }} -n ${{ env.VCLUSTER_NAMESPACE }} -c syncer --tail=-1 -p >/dev/null 2>/dev/null; then
echo "vCluster has restarted during testing, failing..."
exit 1
Expand Down
Loading

0 comments on commit 3d2cd9a

Please sign in to comment.