name: Docker

on:
  workflow_dispatch:
  pull_request:
    branches:
      - main
    paths-ignore:
      - 'site/**'

permissions:
  contents: read

jobs:
  docker:
    name: Docker
    runs-on: ubuntu-24.04
    timeout-minutes: 30
    strategy:
      fail-fast: false
      matrix:
        ipFamily: [ipv4, ipv6]
        deployment: [singleNode, multiNode, multiMaster]
    env:
      JOB_NAME: "docker-${{ matrix.deployment }}-${{ matrix.ipFamily }}"
      IP_FAMILY: ${{ matrix.ipFamily }}
    steps:
      - name: Check out code into the Go module directory
        uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2

      - uses: ./.github/actions/setup-env

      - name: Create single node cluster
        if: ${{ matrix.deployment == 'singleNode' }}
        run: |
          cat <<EOF | /usr/local/bin/kind create cluster -v7 --wait 1m --retain --config=-
          kind: Cluster
          apiVersion: kind.x-k8s.io/v1alpha4
          networking:
            ipFamily: ${IP_FAMILY}
          EOF

      - name: Create multi node cluster
        if: ${{ matrix.deployment == 'multiNode' }}
        run: |
          cat <<EOF | /usr/local/bin/kind create cluster -v7 --wait 1m --retain --config=-
          kind: Cluster
          apiVersion: kind.x-k8s.io/v1alpha4
          networking:
            ipFamily: ${IP_FAMILY}
          nodes:
          - role: control-plane
          - role: worker
          - role: worker
          EOF

      - name: Create multi master cluster
        if: ${{ matrix.deployment == 'multiMaster' }}
        run: |
          cat <<EOF | /usr/local/bin/kind create cluster -v7 --wait 1m --retain --config=-
          kind: Cluster
          apiVersion: kind.x-k8s.io/v1alpha4
          networking:
            ipFamily: ${IP_FAMILY}
          nodes:
          - role: control-plane
          - role: control-plane
          - role: worker
          EOF

      - name: Get Cluster status
        run: |
          # wait network is ready
          kubectl wait --for=condition=ready pods --namespace=kube-system -l k8s-app=kube-dns
          kubectl get nodes -o wide
          kubectl get pods -A

      - name: Load docker image
        run: |
          docker pull busybox
          /usr/local/bin/kind load docker-image busybox

      - name: Export logs
        if: always()
        run: |
          mkdir -p /tmp/kind/logs
          /usr/local/bin/kind export logs /tmp/kind/logs
          sudo chown -R $USER:$USER /tmp/kind/logs

      - name: Upload logs
        if: always()
        uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
        with:
          name: kind-logs-${{ env.JOB_NAME }}-${{ github.run_id }}
          path: /tmp/kind/logs

      - name: Delete cluster
        run: /usr/local/bin/kind delete cluster
