name: Nerdctl

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

permissions:
  contents: read

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

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

      - name: Install nerdctl
        run: |
          # Remove Docker and Podman
          sudo systemctl is-active --quiet docker.service || systemctl stop docker.service
          sudo apt-get remove -y docker-ce docker-ce-cli podman containerd.io
          sudo rm -rf /etc/systemd/system/containerd.service # clean up the cotnainerd systemd file
          # Install nerdctl full package
          sudo curl -sSL https://github.com/containerd/nerdctl/releases/download/v${NERDCTL_VERSION}/nerdctl-full-${NERDCTL_VERSION}-linux-amd64.tar.gz | sudo tar -xvz -C /usr/local
          # Start Containerd
          sudo systemctl daemon-reload
          sudo systemctl enable --now containerd
          # Show Versions
          sudo ctr version
          sudo nerdctl version

      - name: Create single node cluster
        if: ${{ matrix.deployment == 'singleNode' }}
        run: |
          cat <<EOF | sudo /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 | sudo /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: Get Cluster status
        run: |
          # wait network is ready
          sudo kubectl wait --for=condition=ready pods --namespace=kube-system -l k8s-app=kube-dns
          sudo kubectl get nodes -o wide
          sudo kubectl get pods -A

      # TODO: similar to podman, this fails because the imageID() code in KinD is hardcoded to run a docker command
      # need to solve this code before this test will work properly
      - name: Load nerdctl image
        run: |
          sudo nerdctl pull busybox
          sudo /usr/local/bin/kind load docker-image busybox
        continue-on-error: true

      - name: Export logs
        if: always()
        run: |
          sudo find /etc/cni/net.d/ -type f -exec sh -c 'echo "{}" && cat "{}"' \;
          sudo mkdir -p /tmp/kind/logs
          sudo /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@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6.0.0
        with:
          name: kind-logs-${{ env.JOB_NAME }}-${{ github.run_id }}
          path: /tmp/kind/logs

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