name: e2e test Terraform module on: workflow_dispatch: inputs: ref: type: string description: "Git ref to checkout" cloudProvider: description: "Which cloud provider to use." type: choice options: - "aws" - "azure" - "gcp" required: true regionZone: description: "Region or zone to create the cluster in. Leave empty for default region/zone." type: string image: description: "OS Image version used in the cluster's VMs, as specified in the Constellation config. If not set, the latest nightly image from main is used." type: string cliVersion: description: "Constellation CLI version to use. Empty value means build from source." type: string workflow_call: inputs: ref: type: string description: "Git ref to checkout" cloudProvider: description: "Which cloud provider to use." type: string required: true regionZone: description: "Which zone to use." type: string image: description: "OS Image version used in the cluster's VMs, as specified in the Constellation config. If not set, the latest nightly image from main is used." type: string cliVersion: description: "Constellation CLI version to use. Empty value means build from source." type: string jobs: tf-module-test: runs-on: ubuntu-22.04 permissions: id-token: write contents: read packages: write steps: - name: Checkout id: checkout uses: actions/checkout@f43a0e5ff2bd294095638e18286ca9a3d1956744 # v3.6.0 with: ref: ${{ inputs.ref || github.head_ref }} - name: Get Latest Image id: find-latest-image uses: ./.github/actions/find_latest_image with: git-ref: ${{ inputs.ref }} imageVersion: ${{ inputs.image }} ref: main stream: nightly - name: Upload Terraform module uses: ./.github/actions/upload_terraform_module with: version: ${{ inputs.cliVersion }} - name: Download Terraform module uses: actions/download-artifact@9bc31d5ccc31df68ecc42ccf4149144866c47d8a # v3.0.2 with: name: terraform-module - name: Unzip Terraform module shell: bash run: | unzip terraform-module.zip -d ${{ github.workspace }} rm terraform-module.zip - name: Create resource prefix id: create-prefix shell: bash run: | run_id=${{ github.run_id }} last_three="${run_id: -3}" echo "prefix=e2e-${last_three}-${{ github.run_attempt }}" | tee -a "$GITHUB_OUTPUT" - name: Create AWS Terraform variable input file if: inputs.cloudProvider == 'aws' working-directory: ${{ github.workspace }}/terraform-module/aws-constellation shell: bash run: | cat > terraform.tfvars < terraform.tfvars < terraform.tfvars <> /etc/hosts' - name: Login to AWS (IAM + Cluster role) if: inputs.cloudProvider == 'aws' uses: aws-actions/configure-aws-credentials@5fd3084fc36e372ff1fff382a39b10d03659f355 # v2.2.0 with: role-to-assume: arn:aws:iam::795746500882:role/GithubActionsE2ETerraform aws-region: eu-central-1 # extend token expiry to 6 hours to ensure constellation can terminate role-duration-seconds: 21600 - name: Login to Azure (IAM + Cluster service principal) if: inputs.cloudProvider == 'azure' uses: ./.github/actions/login_azure with: azure_credentials: ${{ secrets.AZURE_E2E_TF_CREDENTIALS }} - name: Login to GCP (IAM + Cluster service account) if: inputs.cloudProvider == 'gcp' uses: ./.github/actions/login_gcp with: service_account: "terraform-e2e@constellation-e2e.iam.gserviceaccount.com" - name: Apply Terraform Cluster id: apply_terraform working-directory: ${{ github.workspace }}/terraform-module/${{ inputs.cloudProvider }}-constellation shell: bash run: | cp ../../constellation . terraform init terraform apply -var-file=terraform.tfvars -auto-approve - name: Destroy Terraform Cluster # outcome is part of the steps context (https://docs.github.com/en/actions/learn-github-actions/contexts#steps-context) if: always() && steps.apply_terraform.outcome != 'skipped' working-directory: ${{ github.workspace }}/terraform-module/${{ inputs.cloudProvider }}-constellation shell: bash run: | terraform init terraform destroy -var-file=terraform.tfvars -auto-approve - name: Verify cleanup working-directory: ${{ github.workspace }}/terraform-module/${{ inputs.cloudProvider }}-constellation shell: bash run: | if [ -f constellation-mastersecret.json ] || [ -f constellation-conf.yaml ]; then echo "Files constellation-mastersecret.json or constellation-conf.yaml still exist" exit 1 fi - name: Notify about failure if: | failure() && github.ref == 'refs/heads/main' && github.event_name == 'schedule' continue-on-error: true uses: ./.github/actions/notify_e2e_failure with: projectWriteToken: ${{ secrets.PROJECT_WRITE_TOKEN }} test: "terraform-module" provider: ${{ inputs.cloudProvider }}