name: "Ecosystem client tools"
on:
  push:
    branches:
      - main
  pull_request:
    branches: [main]
  release:
    types:
      - published

permissions: read-all

jobs:
  client-tools:
    name: Check client tools
    runs-on: oracle-vm-16cpu-64gb-x86-64
    steps:
      - uses: actions/checkout@v6
      - uses: actions/setup-go@v6
        with:
          cache: false
          go-version: 1.25.x
      - name: Install dependencies
        run: |
          cd $GITHUB_WORKSPACE
          go install github.com/swaggo/swag/cmd/swag@v1.16.2
          go mod download
          sudo apt-get update
          sudo apt-get install -y libgpgme-dev libassuan-dev libbtrfs-dev \
            libdevmapper-dev pkg-config rpm uidmap haproxy jq valkey-tools whois \
            npm
          # install skopeo
          git clone -b v1.12.0 https://github.com/containers/skopeo.git
          cd skopeo
          make bin/skopeo
          sudo cp bin/skopeo /usr/bin
          skopeo -v
          # install cri-o (for crictl)
          OS=xUbuntu_22.04
          CRIO_VERSION=1.26
          curl -fsSL https://download.opensuse.org/repositories/isv:/kubernetes:/addons:/cri-o:/prerelease:/main:/build/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/cri-o-apt-keyring.gpg
          echo "deb [signed-by=/etc/apt/keyrings/cri-o-apt-keyring.gpg] https://download.opensuse.org/repositories/isv:/kubernetes:/addons:/cri-o:/prerelease:/main:/build/deb/ /" | sudo tee /etc/apt/sources.list.d/cri-o.list
          sudo apt update
          sudo apt install -y cri-o runc
          sudo systemctl enable crio.service
          sudo systemctl start crio.service
          sudo chmod 0777 /var/run/crio/crio.sock
          # install docker
          # Add Docker's official GPG key:
          sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
          sudo chmod a+r /etc/apt/keyrings/docker.asc
          echo \
          "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
           $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
          sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
          sudo apt update
          sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
          # install nodejs deps (for oidc claim mapping support)
          sudo npm install -g oidc-provider express
          # install dex
          git clone https://github.com/dexidp/dex.git
          cd dex/
          git checkout v2.39.1
          make bin/dex
          ./bin/dex serve $GITHUB_WORKSPACE/test/dex/config-dev.yaml &
          # Prepare for stacker run on Ubuntu 24
          cd $GITHUB_WORKSPACE
          sudo ./scripts/enable_userns.sh
      - name: Run CI tests
        run: |
          make run-blackbox-ci
      - name: Log in to GitHub Docker Registry
        uses: docker/login-action@v3
        with:
          registry: ghcr.io
          username: ${{ github.actor }}
          password: ${{ github.token }}
      - uses: actions/setup-python@v6
        with:
          python-version: '3.11'
      - name: Install localstack
        run: |
          pip install --upgrade pyopenssl
          pip install localstack==3.3.0 awscli-local[ver1] # install LocalStack cli and awslocal
          docker pull ghcr.io/project-zot/ci-images/localstack:3.3.0  # Make sure to pull a working version of the image
          localstack start -d                       # Start LocalStack in the background

          echo "Waiting for LocalStack startup..."  # Wait 30 seconds for the LocalStack container
          localstack wait -t 30                     # to become ready before timing out
          echo "Startup complete"
      - name: Run cloud-only tests
        run: |
          make run-blackbox-cloud-ci
        env:
          AWS_ACCESS_KEY_ID: fake
          AWS_SECRET_ACCESS_KEY: fake

      # DynamoDB scale-out tests
      - name: Run cloud scale-out DynamoDB tests
        id: dynamodb_scale
        run: |
          make run-cloud-scale-out-tests
        env:
          AWS_ACCESS_KEY_ID: fake
          AWS_SECRET_ACCESS_KEY: fake
        continue-on-error: true
      - name: Print service logs for DynamoDB scale-out
        run: |
          find /tmp/zot-ft-logs -name '*.log' -print0 | xargs -0 cat
      - name: Upload DynamoDB zot logs as build artifact
        uses: actions/upload-artifact@v6
        if: always()
        with:
          name: zot-scale-out-dynamodb-logs
          path: /tmp/zot-ft-logs
          if-no-files-found: error
      - name: DynamoDB multi-hop detection
        id: dynamodb_multihop
        run: |
          if find /tmp/zot-ft-logs -name '*.log' -print0 | xargs -0 cat | grep 'cannot proxy an already proxied request'; then
            echo "detected multi-hop in DynamoDB tests"
            exit 1
          else
            exit 0
          fi
        continue-on-error: true
      - name: Clean up DynamoDB scale-out logs
        run: |
          rm -r /tmp/zot-ft-logs
      - name: Fail job if DynamoDB error
        if: ${{ steps.dynamodb_scale.outcome != 'success' || steps.dynamodb_multihop.outcome != 'success' }}
        run: |
          echo "DynamoDB scale-out tests failed"
          exit 1

      # Redis scale-out tests
      - name: Run cloud scale-out Redis tests
        id: redis_scale
        run: |
          make run-cloud-scale-out-redis-tests
        env:
          AWS_ACCESS_KEY_ID: fake
          AWS_SECRET_ACCESS_KEY: fake
        continue-on-error: true
      - name: Print service logs for Redis scale-out
        run: |
          find /tmp/zot-ft-logs/redis -name '*.log' -print0 | xargs -0 cat
      - name: Upload Redis zot logs as build artifact
        uses: actions/upload-artifact@v6
        if: always()
        with:
          name: zot-scale-out-redis-logs
          path: /tmp/zot-ft-logs
          if-no-files-found: ignore
      - name: Redis multi-hop detection
        id: redis_multihop
        run: |
          if find /tmp/zot-ft-logs/redis -name '*.log' -print0 | xargs -0 cat | grep 'cannot proxy an already proxied request'; then
            echo "detected multi-hop in Redis tests"
            exit 1
          else
            exit 0
          fi
        continue-on-error: true
      - name: Clean up Redis scale-out logs
        run: |
          rm -rf /tmp/zot-ft-logs/redis
      - name: Fail job if Redis error
        if: ${{ steps.redis_scale.outcome != 'success' || steps.redis_multihop.outcome != 'success' }}
        run: |
          echo "Redis scale-out tests failed"
          exit 1
      - name: Upload zb test results zip as build artifact
        uses: actions/upload-artifact@v6
        if: always()
        with:
          name: zb-cloud-scale-out-functional-results-${{ github.sha }}
          path: ./zb-results/
      - uses: ./.github/actions/teardown-localstack
