Skip to content

CLOUDP-316083: Third Party Integrations Controller #599

CLOUDP-316083: Third Party Integrations Controller

CLOUDP-316083: Third Party Integrations Controller #599

name: Tests-selectable
# This workflow is for running tests based on PR labels
# NOTE:
# The label filter app is used to select tests based on GitHub PR labels
# Tests in the ./int directory are considered an integration test and executed in a separate job
# Tests in the ./e2e directory are considered an end-to-end test and executed in a separate job
# Tests in the ./e2e directory are considered a GOV test ONLY IF their labels contain "atlas-gov" and executed in a separate job
on:
pull_request:
types: [opened, synchronize, labeled, unlabeled]
workflow_dispatch:
inputs:
testLabels:
description: 'Test labels to run'
required: false
default: '[]'
branchName:
description: 'The branch name to checkout'
required: false
default: 'main'
jobs:
detect-tests:
name: "Select tests to run"
runs-on: ubuntu-latest
outputs:
int_matrix: ${{ steps.set-matrix.outputs.int_matrix }}
e2e_matrix: ${{ steps.set-matrix.outputs.e2e_matrix }}
e2e_gov_matrix: ${{ steps.set-matrix.outputs.e2e_gov_matrix }}
steps:
- name: Checkout Code
uses: actions/checkout@v4
with:
ref: ${{ github.event_name == 'workflow_dispatch' && github.event.inputs.branchName || github.head_ref }}
- name: Setup GO
uses: actions/setup-go@v5
with:
go-version-file: "${{ github.workspace }}/go.mod"
- name: Install Ginkgo
run: go install github.com/onsi/ginkgo/v2/ginkgo@latest
- name: Get test labels from PR or input
env:
TEST_LABELS: ${{ github.event.inputs.testLabels }}
id: get-labels
uses: actions/github-script@v7
with:
script: |
if (context.eventName === 'pull_request') {
prLabels = context.payload.pull_request.labels.map(label => label.name);
console.log("PR Labels:", prLabels);
return prLabels;
}
if (context.eventName === "workflow_dispatch") {
inputLabels = process.env.TEST_LABELS;
console.log("Input labels:", inputLabels);
return inputLabels.split(",").map(label => label.trim()).filter(label => label !== "");
}
console.log("Not a PullRequest or WorkflowDispatch event skipping");
return [];
- name: List available Ginkgo test labels
id: fetch-labels
run: |
INT_LABELS=$(cd ./test/int && ginkgo labels | sed 's/^int: //' | jq -s -c '.[0]')
E2E_LABELS=$(cd ./test/e2e && ginkgo labels | sed 's/^e2e: //' | jq -s -c '.[0]')
echo "int_labels=$INT_LABELS" >> $GITHUB_ENV
echo "e2e_labels=$E2E_LABELS" >> $GITHUB_ENV
echo "Available Integration Tests: $INT_LABELS"
echo "Available E2E Tests: $E2E_LABELS"
- name: Compute Test Matrix
id: set-matrix
env:
PR_LABELS: ${{ steps.get-labels.outputs.result }}
INT_LABELS: ${{ env.int_labels }}
E2E_LABELS: ${{ env.e2e_labels }}
USE_JSON: true
run: |
make compute-labels
./bin/ginkgo-labels > result.json
echo "Int tests to execute $(cat result.json | jq -c .int)"
echo "E2E tests to execute $(cat result.json | jq -c .e2e)"
echo "E2E GOV tests to execute $(cat result.json | jq -c .e2e_gov)"
echo "int_matrix=$(cat result.json | jq -c .int)" >> $GITHUB_OUTPUT
echo "e2e_matrix=$(cat result.json | jq -c .e2e)" >> $GITHUB_OUTPUT
echo "e2e_gov_matrix=$(cat result.json | jq -c .e2e_gov)" >> $GITHUB_OUTPUT
compute:
needs: detect-tests
name: "Compute test matrix for k8s versions"
runs-on: ubuntu-latest
outputs:
test_matrix: ${{ steps.test.outputs.matrix }}
steps:
- id: test
name: Compute test matrix for k8s versions
run: |
# Note the use of external single quotes to allow for double quotes at inline YAML array
matrix='["v1.30.10-kind"]'
if [ "${{ github.ref }}" == "refs/heads/main" ];then
matrix='["v1.30.10-kind", "v1.32.2-kind"]'
fi
echo "matrix=${matrix}" >> "${GITHUB_OUTPUT}"
cat "${GITHUB_OUTPUT}"
prepare-e2e:
needs: detect-tests
name: Prepare E2E configuration and image
if: ${{ needs.detect-tests.outputs.e2e_matrix != '[]' }}
environment: release
runs-on: ubuntu-latest
env:
REPOSITORY: ${{ github.repository_owner }}/mongodb-atlas-kubernetes-operator-prerelease
steps:
- name: Check out code
uses: actions/checkout@v4
with:
ref: ${{github.event.pull_request.head.sha}}
submodules: true
fetch-depth: 0
- name: Prepare tag
id: prepare
uses: ./.github/actions/set-tag
- name: Log in to ghcr.io registry
run: echo "${{ secrets.GITHUB_TOKEN }}" | docker login ghcr.io -u $ --password-stdin
- name: Build and Push image
uses: ./.github/actions/build-push-image
with:
file: fast.Dockerfile
repository: ghcr.io/${{ env.REPOSITORY }}
version: ${{ steps.prepare.outputs.tag }}
tags: ghcr.io/${{ env.REPOSITORY }}:${{ steps.prepare.outputs.tag }}
platforms: linux/amd64
push_to_docker: false
- name: Do preflight-check on test image
uses: ./.github/actions/certify-openshift-images
with:
registry: ghcr.io
registry_password: ${{ secrets.GITHUB_TOKEN }}
repository: ${{ env.REPOSITORY }}
version: ${{ steps.prepare.outputs.tag }}
rhcc_token: ${{ secrets.RH_CERTIFICATION_PYXIS_API_TOKEN }}
rhcc_project: ${{ secrets.RH_CERTIFICATION_OSPID }}
submit: false
prepare-e2e-bundle:
needs: detect-tests
name: Prepare E2E Bundle configuration and image
if: ${{ needs.detect-tests.outputs.e2e_matrix != '[]' }}
runs-on: ubuntu-latest
env:
GHCR_REPO: ghcr.io/mongodb/mongodb-atlas-kubernetes-operator-prerelease
GHCR_BUNDLES_REPO: ghcr.io/mongodb/mongodb-atlas-kubernetes-bundles-prerelease
steps:
- name: Check out code
uses: actions/checkout@v4
with:
ref: ${{github.event.pull_request.head.sha}}
submodules: true
fetch-depth: 0
- name: Prepare tag
id: prepare
uses: ./.github/actions/set-tag
- name: Generate configuration for the tests
uses: ./.github/actions/gen-install-scripts
with:
IMAGE_URL: ${{ env.GHCR_REPO }}:${{ steps.prepare.outputs.tag }}
VERSION: ${{ steps.prepare.outputs.tag }}
ENV: dev
- name: Change URL for the test
run: |
awk '{gsub(/cloud.mongodb.com/, "cloud-qa.mongodb.com", $0); print}' bundle/manifests/mongodb-atlas-kubernetes.clusterserviceversion.yaml > tmp && mv tmp bundle/manifests/mongodb-atlas-kubernetes.clusterserviceversion.yaml
- name: Cache repo files
uses: actions/cache@v4
with:
path: |
./*
key: ${{ github.sha }}
- name: Prepare docker tag
id: prepare-docker-bundle-tag
run: |
REPOSITORY=${{ env.GHCR_BUNDLES_REPO }}
TAG=${{ steps.prepare.outputs.tag }}
TAGS="${REPOSITORY}:${TAG}"
echo "tags=$TAGS" >> $GITHUB_OUTPUT
- name: Log in to ghcr.io registry
run: echo "${{ secrets.GITHUB_TOKEN }}" | docker login ghcr.io -u $ --password-stdin
- name: Build and Push image
uses: ./.github/actions/build-push-image
with:
file: fast.Dockerfile
repository: ${{ env.GHCR_BUNDLES_REPO }}
version: ${{ steps.prepare.outputs.tag }}
tags: ${{ env.GHCR_BUNDLES_REPO }}:${{ steps.prepare.outputs.tag }}
platforms: linux/amd64
push_to_docker: false
run-integration-tests:
environment: test
needs: detect-tests
if: ${{ needs.detect-tests.outputs.int_matrix != '[]' && fromJSON(needs.detect-tests.outputs.int_matrix) != '[]' }}
strategy:
fail-fast: false
matrix:
test: ${{ fromJSON(needs.detect-tests.outputs.int_matrix) }}
target: [ "test/int" ]
nodes: [12]
runs-on: ubuntu-latest
name: "integration: ${{ matrix.test }}"
steps:
- name: Checkout Code
uses: actions/checkout@v4
with:
ref: ${{ github.event.pull_request.head.sha }}
- name: Install devbox
uses: jetify-com/[email protected]
with:
enable-cache: 'true'
- name: Run integration test
env:
ATLAS_ORG_ID: ${{ secrets.ATLAS_ORG_ID }}
ATLAS_PUBLIC_KEY: ${{ secrets.ATLAS_PUBLIC_KEY }}
ATLAS_PRIVATE_KEY: ${{ secrets.ATLAS_PRIVATE_KEY }}
GINKGO_FILTER_LABEL: ${{ matrix.test }}
GINKGO_NODES: ${{ matrix.nodes }}
GO111MODULE: on
GINKGO_EDITOR_INTEGRATION: "true"
run: |
devbox run -- 'make ${{ matrix.target }}'
run-e2e-tests:
needs: [detect-tests, prepare-e2e, prepare-e2e-bundle, compute]
environment: test
if: ${{ needs.detect-tests.outputs.e2e_matrix != '[]' && fromJSON(needs.detect-tests.outputs.e2e_matrix) != '[]' }}
strategy:
fail-fast: false
matrix:
test: ${{ fromJSON(needs.detect-tests.outputs.e2e_matrix) }}
k8s: ${{ fromJSON(needs.compute.outputs.test_matrix) }}
runs-on: ubuntu-latest
name: "e2e: ${{ matrix.test }}"
steps:
- name: Get repo files from cache
id: get-repo-files-from-cache
uses: actions/cache@v4
with:
path: ./*
key: ${{ github.sha }}
- name: Checkout if cache repo files missed
if: steps.get-repo-files-from-cache.outputs.cache-hit != 'true'
uses: actions/checkout@v4
with:
ref: ${{github.event.pull_request.head.sha}}
submodules: true
fetch-depth: 0
- name: Install devbox
uses: jetify-com/[email protected]
with:
enable-cache: 'true'
- name: Prepare tag
id: prepare
uses: ./.github/actions/set-tag
- name: Set properties
id: properties
run: |
version=$(echo ${{ matrix.k8s }} | awk -F "-" '{print $1}')
platform=$(echo ${{ matrix.k8s }} | awk -F "-" '{print $2}')
echo "k8s_version=$version" >> $GITHUB_OUTPUT
echo "k8s_platform=$platform" >> $GITHUB_OUTPUT
- name: Generate configuration for the tests
uses: ./.github/actions/gen-install-scripts
with:
IMAGE_URL: ${{ env.GHCR_REPO }}:${{ steps.prepare.outputs.tag }}
VERSION: ${{ steps.prepare.outputs.tag }}
ENV: dev
- name: Change path for the test
run: |
awk '{gsub(/cloud.mongodb.com/, "cloud-qa.mongodb.com", $0); print}' bundle/manifests/mongodb-atlas-kubernetes.clusterserviceversion.yaml > tmp && mv tmp bundle/manifests/mongodb-atlas-kubernetes.clusterserviceversion.yaml
- name: Create k8s Kind Cluster
if: ${{ steps.properties.outputs.k8s_platform == 'kind' && !env.ACT }}
uses: helm/[email protected]
with:
version: v0.26.0
config: test/helper/e2e/config/kind.yaml
node_image: kindest/node:${{ steps.properties.outputs.k8s_version }}
cluster_name: ${{ matrix.test }}
wait: 180s
- name: Print kubectl version
run: |
devbox run -- 'kubectl version'
- name: Print kubectl version
run: |
devbox run -- 'kubectl version'
- name: Install CRDs if needed
if: ${{ !( matrix.test == 'helm-update' || matrix.test == 'helm-wide' || matrix.test == 'helm-ns' || matrix.test == 'bundle-test' ) }}
run: |
devbox run -- 'kubectl apply -f deploy/crds'
- name: Run E2E test
env:
MCLI_PUBLIC_API_KEY: ${{ secrets.ATLAS_PUBLIC_KEY }}
MCLI_PRIVATE_API_KEY: ${{ secrets.ATLAS_PRIVATE_KEY }}
MCLI_ORG_ID: ${{ secrets.ATLAS_ORG_ID}}
MCLI_OPS_MANAGER_URL: "https://cloud-qa.mongodb.com/"
IMAGE_URL: "${{ env.GHCR_REPO }}:${{ steps.prepare.outputs.tag }}"
IMAGE_PULL_SECRET_REGISTRY: ghcr.io
IMAGE_PULL_SECRET_USERNAME: $
IMAGE_PULL_SECRET_PASSWORD: "${{ secrets.GITHUB_TOKEN }}"
BUNDLE_IMAGE: "${{ env.GHCR_BUNDLES_REPO}}:${{ steps.prepare.outputs.tag }}"
K8S_PLATFORM: "${{ steps.properties.outputs.k8s_platform }}"
K8S_VERSION: "${{ steps.properties.outputs.k8s_version }}"
TEST_NAME: "${{ matrix.test }}"
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
AWS_ACCOUNT_ARN_LIST: ${{ secrets.AWS_ACCOUNT_ARN_LIST }}
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
AZURE_CLIENT_ID: ${{ secrets.AZURE_CLIENT_ID }}
AZURE_TENANT_ID: ${{ secrets.AZURE_TENANT_ID }}
AZURE_CLIENT_SECRET: ${{ secrets.AZURE_CLIENT_SECRET }}
AZURE_SUBSCRIPTION_ID: ${{ secrets.AZURE_SUBSCRIPTION_ID }}
GCP_SA_CRED: ${{ secrets.GCP_SA_CRED }}
DATADOG_KEY: ${{ secrets.DATADOG_KEY }}
PAGER_DUTY_SERVICE_KEY: ${{ secrets.PAGER_DUTY_SERVICE_KEY }}
run: |
echo "Using ENV: ${{ steps.select-env.outputs.ENV }}"
devbox run -- ./scripts/launch-ci-e2e.sh
- name: Upload operator logs
if: ${{ failure() }}
uses: actions/upload-artifact@v4
with:
name: logs
path: output/**
run-e2e-gov-tests:
needs: detect-tests
environment: gov-test
if: ${{ needs.detect-tests.outputs.e2e_gov_matrix != '[]' && fromJSON(needs.detect-tests.outputs.e2e_gov_matrix) != '[]' }}
strategy:
fail-fast: false
matrix:
test: ${{ fromJSON(needs.detect-tests.outputs.e2e_gov_matrix) }}
runs-on: ubuntu-latest
name: "e2e gov: ${{ matrix.test }}"
steps:
- name: Get repo files from cache
id: get-repo-files-from-cache
uses: actions/cache@v4
with:
path: ./*
key: ${{ github.sha }}
- name: Checkout if cache repo files missed
if: steps.get-repo-files-from-cache.outputs.cache-hit != 'true'
uses: actions/checkout@v4
with:
ref: ${{github.event.pull_request.head.sha}}
submodules: true
fetch-depth: 0
- name: Create k8s Kind Cluster
if: ${{ !env.ACT }}
uses: helm/[email protected]
with:
version: v0.26.0
config: test/helper/e2e/config/kind.yaml
cluster_name: "atlas-gov-e2e-test"
wait: 180s
- name: Install devbox
uses: jetify-com/[email protected]
with:
enable-cache: 'true'
- name: Install CRDs
run: devbox run -- 'make install'
- name: Run e2e test
env:
MCLI_PUBLIC_API_KEY: ${{ secrets.ATLAS_GOV_PUBLIC_KEY }}
MCLI_PRIVATE_API_KEY: ${{ secrets.ATLAS_GOV_PRIVATE_KEY }}
MCLI_ORG_ID: ${{ secrets.ATLAS_GOV_ORG_ID}}
MCLI_OPS_MANAGER_URL: "https://cloud-qa.mongodbgov.com/"
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
AWS_ACCOUNT_ARN_LIST: ${{ secrets.AWS_ACCOUNT_ARN_LIST }}
PAGER_DUTY_SERVICE_KEY: ${{ secrets.PAGER_DUTY_SERVICE_KEY }}
TEST_NAME: "${{ matrix.test }}"
run: devbox run -- ./scripts/launch-ci-e2e.sh
- name: Upload operator logs
if: ${{ failure() }}
uses: actions/upload-artifact@v4
with:
name: logs
path: output/**