#@ load("@ytt:data", "data")
#@yaml/text-templated-strings

#@ def job_names(plugins):
#@   names = []
#@   for p in plugins:
#@     names.append("test-"+p+"-mixed")
#@   end
#@   return names
#@ end

#@ def sharded_job_names(plugin, shard_count):
#@   names = []
#@   for shard_index in range(0, shard_count):
#@     names.append("test-"+plugin+"-"+str(shard_index)+"-mixed")
#@   end
#@   return names
#@ end

---
name: Test Mixed Version Clusters
on:
  push:
    branches:
      - main
      - v4.0.x
      - v3.13.x
      - bump-otp-*
      - bump-elixir-*
      - bump-rbe-*
      - bump-rules_erlang
    paths:
      - 'deps/**'
      - 'scripts/**'
      - Makefile
      - plugins.mk
      - rabbitmq-components.mk
      - .bazelrc
      - .bazelversion
      - BUILD.*
      - '*.bzl'
      - '*.bazel'
      - .github/workflows/test-mixed-versions.yaml
  pull_request:
concurrency:
  group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
  cancel-in-progress: true
jobs:
  ensure-mixed-version-archive:
    runs-on: ubuntu-22.04
    steps:
    - name: CHECKOUT REPOSITORY
      uses: actions/checkout@v4
      with:
        path: primary-umbrella
    #! - name: Setup tmate session
    #!   uses: mxschmitt/action-tmate@v3
    - name: CHECK FOR ARCHIVE ON S3
      id: check
      working-directory: primary-umbrella
      run: |
        set -u

        ARCHIVE_URL="$(grep -Eo 'https://rabbitmq-github-actions.s3.eu-west-1.amazonaws.com.*.tar.xz' bazel/bzlmod/secondary_umbrella.bzl)"
        echo "ARCHIVE_URL: ${ARCHIVE_URL}"

        curl -LO "${ARCHIVE_URL}"

        if xzcat --test package-generic-unix-for-mixed-version-testing-v*.tar.xz; then
          exists=true
        else
          exists=false
        fi
        echo "exists=${exists}" | tee $GITHUB_ENV

        OTP_VERSION=${ARCHIVE_URL#*secondary-umbrellas/}
        OTP_VERSION=${OTP_VERSION%*/package-generic-unix-for-mixed-version-testing-v*.tar.xz}
        echo "otp_version=${OTP_VERSION}" | tee -a $GITHUB_OUTPUT

        VERSION=${ARCHIVE_URL#*package-generic-unix-for-mixed-version-testing-v}
        VERSION=${VERSION%*.tar.xz}
        echo "version=${VERSION}" | tee -a $GITHUB_OUTPUT
    - name: CHECKOUT REPOSITORY (MIXED VERSION)
      if: env.exists != 'true'
      uses: actions/checkout@v4
      with:
        ref: v${{ steps.check.outputs.version }}
        path: secondary-umbrella
    - name: CONFIGURE OTP & ELIXIR
      if: env.exists != 'true'
      uses: erlef/setup-beam@v1.17
      with:
        otp-version: ${{ steps.check.outputs.otp_version }}
        elixir-version: 1.15
        hexpm-mirrors: |
          https://builds.hex.pm
          https://cdn.jsdelivr.net/hex
    - name: AUTHENTICATE TO GOOGLE CLOUD
      uses: google-github-actions/auth@v2.1.7
      with:
        credentials_json: ${{ secrets.REMOTE_CACHE_CREDENTIALS_JSON }}
    - name: BUILD SECONDARY UMBRELLA ARCHIVE
      if: env.exists != 'true'
      working-directory: secondary-umbrella
      run: |
        if [ -n "${{ secrets.REMOTE_CACHE_BUCKET_NAME_MIXED }}" ]; then
        cat << EOF >> user.bazelrc
          build --remote_cache=https://storage.googleapis.com/${{ secrets.REMOTE_CACHE_BUCKET_NAME_MIXED }}
          build --google_default_credentials

          build --remote_download_toplevel
        EOF
        fi

        sed -i"_orig" -E "/APP_VERSION/ s/3\.[0-9]+\.[0-9]+/${{ steps.check.outputs.version }}/" rabbitmq.bzl
        bazelisk build :package-generic-unix \
          --test_build \
          --verbose_failures

        OUTPUT_DIR=${{ github.workspace }}/output
        mkdir -p ${OUTPUT_DIR}/${{ steps.check.outputs.otp_version }}
        cp \
          bazel-bin/package-generic-unix.tar.xz \
          ${OUTPUT_DIR}/${{ steps.check.outputs.otp_version }}/package-generic-unix-for-mixed-version-testing-v${{ steps.check.outputs.version }}.tar.xz
    - name: UPLOAD THE ARCHIVE TO S3
      if: env.exists != 'true'
      uses: jakejarvis/s3-sync-action@v0.5.1
      with:
        args: --acl public-read --follow-symlinks
      env:
        AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
        AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY}}
        AWS_S3_BUCKET: ${{ secrets.AWS_S3_BUCKET }}
        AWS_REGION: ${{ secrets.AWS_REGION }}
        SOURCE_DIR: output
        DEST_DIR: secondary-umbrellas

  check-workflow:
    needs: ensure-mixed-version-archive
    runs-on: ubuntu-latest
    outputs:
      repo_cache_key: ${{ steps.repo-cache-key.outputs.value }}
    steps:
    - name: CHECKOUT REPOSITORY
      uses: actions/checkout@v4
    - name: SETUP ERLANG/ELIXIR
      uses: erlef/setup-beam@v1
      with:
        otp-version: 26
        elixir-version: 1.15
        hexpm-mirrors: |
          https://builds.hex.pm
          https://cdn.jsdelivr.net/hex
    - name: ENSURE WORKFLOWS ARE UP TO DATE
      run: |
        mkdir local-bin/
        curl -L https://carvel.dev/install.sh | K14SIO_INSTALL_BIN_DIR=local-bin bash
        make actions-workflows YTT=$PWD/local-bin/ytt
        git diff --exit-code
    - name: COMPUTE REPO CACHE KEY
      id: repo-cache-key
      run: |
        echo "value=bazel-repo-cache-${{ hashFiles('MODULE.bazel') }}" | tee -a $GITHUB_OUTPUT

#@ for plugin in data.values.internal_deps:
  test-(@= plugin @)-mixed:
    needs: check-workflow
    uses: ./.github/workflows/test-plugin-mixed.yaml
    with:
      repo_cache_key: ${{ needs.check-workflow.outputs.repo_cache_key }}
      plugin: #@ plugin
    secrets: inherit
#@ end

#@ rabbit_shard_count = 10
#@ for shard_index in range(0, rabbit_shard_count):
  test-rabbit-(@= str(shard_index) @)-mixed:
    needs: #@ ["check-workflow"] + job_names(data.values.internal_deps)
    uses: ./.github/workflows/test-plugin-mixed.yaml
    with:
      repo_cache_key: ${{ needs.check-workflow.outputs.repo_cache_key }}
      plugin: rabbit
      shard_index: #@ shard_index
      shard_count: #@ rabbit_shard_count
    secrets: inherit
#@ end

  test-rabbitmq_cli-mixed:
    needs: check-workflow
    uses: ./.github/workflows/test-plugin-mixed.yaml
    with:
      repo_cache_key: ${{ needs.check-workflow.outputs.repo_cache_key }}
      plugin: rabbitmq_cli
    secrets: inherit

#@ for plugin in data.values.tier1_plugins:
  test-(@= plugin @)-mixed:
    needs: #@ ["check-workflow"] + sharded_job_names("rabbit", rabbit_shard_count)
    uses: ./.github/workflows/test-plugin-mixed.yaml
    with:
      repo_cache_key: ${{ needs.check-workflow.outputs.repo_cache_key }}
      plugin: #@ plugin
    secrets: inherit
#@ end

  summary-test:
    needs: #@ job_names(data.values.internal_deps + data.values.tier1_plugins) + sharded_job_names("rabbit", rabbit_shard_count) + ["test-rabbitmq_cli-mixed"]
    runs-on: ubuntu-latest
    steps:
    - name: SUMMARY
      run: |
        cat << 'EOF' | jq -e 'map(.result == "success") | all(.)'
        ${{ toJson(needs) }}
        EOF
