name: Install Script
on:
  push:
    branches: [main, master]
    paths:
      - "channel.yaml"
      - "install.sh"
      - "tests/install/**"
      - ".github/workflows/install.yaml"

  pull_request:
    branches: [main, master]
    paths:
      - "install.sh"
      - "tests/install/**"
      - ".github/workflows/install.yaml"
  workflow_dispatch: {}

permissions:
  contents: read
  
jobs:
  build:
    uses: ./.github/workflows/build-k3s.yaml
  test:
    name: "Smoke Test"
    needs: build
    runs-on: ubuntu-latest
    timeout-minutes: 40
    strategy:
      fail-fast: false
      matrix:
        vm: [centos-9, rocky-8, rocky-9, fedora, opensuse-leap, ubuntu-2404]
      max-parallel: 3
    defaults:
      run:
        working-directory: tests/install/${{ matrix.vm }}
    env:
      INSTALL_K3S_SKIP_DOWNLOAD: binary
    steps:
      - name: "Checkout"
        uses: actions/checkout@v6
        with: {fetch-depth: 1}
      - name: Set up vagrant and libvirt
        uses: ./.github/actions/vagrant-setup
      - name: "Vagrant Cache"
        uses: actions/cache@v4
        with:
          path: |
             ~/.vagrant.d/boxes
          key: vagrant-box-${{ matrix.vm }}
      - name: "Vagrant Plugin(s)"
        run: vagrant plugin install vagrant-k3s vagrant-reload vagrant-scp
      - name: "Download k3s binary"
        uses: actions/download-artifact@v6
        with:
          name: k3s-amd64
          path: tests/install/${{ matrix.vm }}
      - name: Remove Unnecessary Tools
        run: |
          sudo rm -rf \
            /home/linuxbrew \
            /home/packer \
            /opt/az \
            /opt/microsoft \
            /usr/lib/firefox \
            /usr/lib/google-cloud-sdk \
            /usr/local/julia* \
            /usr/local/share/boost \
            /usr/local/share/chromium \
            /usr/local/share/powershell \
            /usr/share/az* \
            /usr/share/dotnet \
            /usr/share/miniconda \
            /usr/share/swift
          df -khl
      - name: "Vagrant Up"
        run: vagrant up --no-tty --no-provision
      - name: "Upload k3s binary to VM"
        run: |
          chmod +x k3s
          vagrant scp k3s /tmp/k3s
          vagrant ssh -c "sudo mv /tmp/k3s /usr/local/bin/k3s"
          vagrant provision --provision-with=k3s-upload
      - name: Add binary to PATH
        if: matrix.vm == 'centos-9' || matrix.vm == 'rocky-8' || matrix.vm == 'rocky-9' || matrix.vm == 'opensuse-leap'
        run: vagrant provision --provision-with=add-bin-path
      - name: "⏩ Install K3s"
        run: |
          vagrant provision --provision-with=k3s-prepare
          vagrant provision --provision-with=k3s-install
          if [ ${{ matrix.vm }} = 'opensuse-microos' ]; then vagrant reload --no-provision; fi
      - name: "⏳ Node"
        run: vagrant provision --provision-with=k3s-wait-for-node
      - name: "⏳ CoreDNS"
        run: vagrant provision --provision-with=k3s-wait-for-coredns
      - name: "⏳ Local Storage"
        run: vagrant provision --provision-with=k3s-wait-for-local-storage
        continue-on-error: true
      - name: "⏳ Metrics Server"
        run: vagrant provision --provision-with=k3s-wait-for-metrics-server
        continue-on-error: true
      - name: "⏳ Traefik"
        run: vagrant provision --provision-with=k3s-wait-for-traefik
        continue-on-error: true
      - name: "k3s-status"
        run: vagrant provision --provision-with=k3s-status
      - name: "k3s-procps"
        run: vagrant provision --provision-with=k3s-procps
      - name: "k3s-mount-directory"
        run: vagrant provision --provision-with=k3s-mount-directory
      - name: "k3s-uninstall"
        run: vagrant provision --provision-with=k3s-uninstall
      - name: "k3s-check-mount"
        run: vagrant provision --provision-with=k3s-check-mount
      - name: "k3s-unmount-dir"
        run: vagrant provision --provision-with=k3s-unmount-dir
      - name: Cleanup VM
        run: vagrant destroy -f
      - name: On Failure, launch debug session
        uses: lhotari/action-upterm@v1
        if: ${{ failure() }}
        with:
          ## If no one connects after 5 minutes, shut down server.
          wait-timeout-minutes: 5
