name: CI-mariadb10-galera-g3

on:
  workflow_dispatch:
  workflow_call:
    inputs:
      trigger:
        type: string

env:
  SHA: ${{ inputs.trigger && fromJson(inputs.trigger).event.workflow_run.head_sha || github.sha }}

jobs:
  tests:
    runs-on: ubuntu-22.04
    strategy:
      fail-fast: false
      matrix:
        infradb: [ 'mariadb10' ]
    env:
      BLDCACHE: ${{ inputs.trigger && fromJson(inputs.trigger).event.workflow_run.head_sha || github.sha }}_ubuntu22-tap_src
      MATRIX: '(${{ matrix.infradb }})'

    steps:

    - uses: LouisBrunner/checks-action@v2.0.0
      id: checks
      if: always()
      with:
        token: ${{ secrets.GITHUB_TOKEN }}
        name: '${{ github.workflow }} / ${{ github.job }} ${{ env.MATRIX }}'
        repo: ${{ github.repository }}
        sha: ${{ env.SHA }}
        status: 'in_progress'
        details_url: 'https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }}'

    - name: Checkout repository
      uses: actions/checkout@v4
      with:
        repository: ${{ github.repository }}
        ref: ${{ env.SHA }}
        path: 'proxysql'
        sparse-checkout: |
          test/infra
          test/tap/groups
          test/scripts

    - name: Cache restore src
      id: cache-src
      uses: actions/cache/restore@v4
      with:
        key: ${{ env.BLDCACHE }}
        fail-on-cache-miss: true
        path: |
          proxysql/src/

    - name: Cache restore test
      id: cache-test
      uses: actions/cache/restore@v4
      with:
        key: ${{ inputs.trigger && fromJson(inputs.trigger).event.workflow_run.head_sha || github.sha }}_ubuntu22-tap_test
        fail-on-cache-miss: true
        path: |
          proxysql/test/

    - name: Verify binary
      run: |
        chmod +x proxysql/src/proxysql
        file proxysql/src/proxysql

    - name: Log in to GHCR and pull CI base image
      # Both `docker login` and `docker pull` against ghcr.io have been
      # observed to fail transiently with `net/http: request canceled
      # (Client.Timeout exceeded while awaiting headers)`. Wrap both in
      # a short retry loop with linear backoff so a single network blip
      # does not red the whole TAP group.
      env:
        GHCR_USER: ${{ github.actor }}
        GHCR_TOKEN: ${{ secrets.GITHUB_TOKEN }}
      run: |
        set +e
        attempt=0
        max_attempts=5
        while [ $attempt -lt $max_attempts ]; do
          attempt=$((attempt + 1))
          echo ">>> GHCR login+pull attempt ${attempt}/${max_attempts}"
          if echo "$GHCR_TOKEN" | docker login ghcr.io \
              -u "$GHCR_USER" --password-stdin \
              && docker pull ghcr.io/sysown/proxysql-ci-base:latest; then
            echo ">>> GHCR login+pull OK on attempt ${attempt}"
            docker tag ghcr.io/sysown/proxysql-ci-base:latest \
                proxysql-ci-base:latest
            exit 0
          fi
          if [ $attempt -lt $max_attempts ]; then
            sleep_for=$((attempt * 10))
            echo ">>> attempt ${attempt} failed; sleeping ${sleep_for}s"
            sleep $sleep_for
          fi
        done
        echo ">>> all ${max_attempts} GHCR attempts failed"
        exit 1

    - name: Start infrastructure
      run: |
        cd proxysql
        export INFRA_ID="ci-mariadb10-galera-g3"
        export TAP_GROUP="mariadb10-galera-g3"
        export SKIP_CLUSTER_START=1
        test/infra/control/ensure-infras.bash

    - name: Run mariadb10-galera-g3 tests
      run: |
        cd proxysql
        export INFRA_ID="ci-mariadb10-galera-g3"
        export TAP_GROUP="mariadb10-galera-g3"
        export SKIP_CLUSTER_START=1
        test/infra/control/run-tests-isolated.bash

    - name: Cleanup
      if: always()
      run: |
        set +e
        cd proxysql
        export INFRA_ID="ci-mariadb10-galera-g3"
        export TAP_GROUP="mariadb10-galera-g3"
        docker logs proxysql.ci-mariadb10-galera-g3 2>&1 | tail -50 || true
        test/infra/control/stop-proxysql-isolated.bash
        test/infra/control/destroy-infras.bash

    - name: Fix artifact permissions
      if: ${{ failure() && !cancelled() }}
      run: |
        sudo chmod -R a+rX proxysql/ci_*_logs/ 2>/dev/null || true

    - name: Archive artifacts logs
      if: ${{ failure() && !cancelled() }}
      uses: actions/upload-artifact@v4
      with:
        name: ${{ github.workflow }}-${{ env.SHA }}-logs-run#${{ github.run_number }}
        path: |
          proxysql/ci_*_logs/

    - uses: LouisBrunner/checks-action@v2.0.0
      if: always()
      with:
        token: ${{ secrets.GITHUB_TOKEN }}
        check_id: ${{ steps.checks.outputs.check_id }}
        repo: ${{ github.repository }}
        sha: ${{ env.SHA }}
        conclusion: ${{ job.status }}
        details_url: 'https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }}'
