name: Integration Test Coverage
on: 
  push:
    paths-ignore:
      - "**.md"
      - "channel.yaml"
      - "install.sh"
      - "tests/**"
      - "!tests/integration**"
      - ".github/**"
      - "!.github/workflows/integration.yaml"
  pull_request:
    paths-ignore:
      - "**.md"
      - "channel.yaml"
      - "install.sh"
      - "tests/**"
      - "!tests/integration**"
      - "!tests/e2e**"
      - ".github/**"
      - "!.github/workflows/integration.yaml"
      - "!.github/workflows/build-k3s.yaml"
  workflow_dispatch: {}

permissions:
  contents: read

env:
  GOCOVERDIR: /tmp/k3scov
  
jobs:
  build:
    uses: ./.github/workflows/build-k3s.yaml
    with:
      os: linux
  build-windows:
    uses: ./.github/workflows/build-k3s.yaml
    with:
      os: windows
  itest:
    needs: build
    name: Integration Tests
    runs-on: ubuntu-latest
    timeout-minutes: 45
    strategy:
      fail-fast: false
      matrix:
        itest: [certrotation, cacertrotation, etcdrestore, localstorage, startup, custometcdargs, etcdsnapshot, kubeflags, longhorn, secretsencryption, flannelnone]
      max-parallel: 3
    steps:
    - name: Checkout
      uses: actions/checkout@v6
      with:
        fetch-depth: 1
    - name: Install Go
      uses: ./.github/actions/setup-go
    - name: "Download k3s binary"
      uses: actions/download-artifact@v6
      with:
        name: k3s-amd64
        path: ./dist/artifacts
    - name: Run Integration Tests
      run: | 
        chmod +x ./dist/artifacts/k3s
        mkdir -p $GOCOVERDIR
        cd tests/integration/${{ matrix.itest }}
        sudo -E env "PATH=$PATH" go test -timeout=45m ./... -run Integration -ginkgo.v -test.v
    - name: On Failure, Upload Logs
      uses: actions/upload-artifact@v5
      if: ${{ failure() }}
      with:
        name: integration-${{ matrix.itest }}-logs
        path: tests/integration/${{ matrix.itest }}/*log.txt
        retention-days: 30
    - 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
    - name: Generate coverage report
      run: go tool covdata textfmt -i $GOCOVERDIR -o ${{ matrix.itest }}.out
    - name: Upload Results To Codecov
      uses: codecov/codecov-action@v5
      with:
        token: ${{ secrets.CODECOV_TOKEN }}
        files: ./${{ matrix.itest }}.out
        flags: inttests # optional
        verbose: true # optional (default = false)
  itest-windows:
    name: Integration Tests (windows)
    needs: build-windows
    runs-on: windows-2022
    timeout-minutes: 10
    env:
      GOCOVERDIR: "D:/tmp/k3scov"
    steps:
    - name: Checkout
      uses: actions/checkout@v6
      with: {fetch-depth: 1}
    - name: Install Go
      uses: ./.github/actions/setup-go
    - name: Download k3s binary
      uses: actions/download-artifact@v6
      with:
        name: k3s-windows
        path: dist/artifacts/
    - name: Run K3s
      timeout-minutes: 5
      env:
        CONTAINERD_LOG_LEVEL: "debug"
      run: |
        $ErrorActionPreference = "Continue"
        $PSNativeCommandUseErrorActionPreference = $true
        New-Item -Type Directory -Force $Env:GOCOVERDIR | Out-Null
        $Server = Start-Job -ScriptBlock { ./dist/artifacts/k3s.exe server --token=token --debug --disable=metrics-server }
        Start-Sleep -Seconds 15
        D:/var/lib/rancher/k3s/data/current/bin/k3s.exe kubectl apply -f ./tests/integration/startup/testdata/agnhost.yaml
        D:/var/lib/rancher/k3s/data/current/bin/k3s.exe kubectl wait --for=jsonpath='{.status.phase}'=Running --timeout=5m pod/agnhost
        D:/var/lib/rancher/k3s/data/current/bin/k3s.exe crictl ps
        D:/var/lib/rancher/k3s/data/current/bin/k3s.exe kubectl get pod -A -o wide
        D:/var/lib/rancher/k3s/data/current/bin/k3s.exe kubectl get node -o wide
        $RET = $LASTEXITCODE
        Stop-Job -Job $Server
        Receive-Job -Wait -Job $Server
        Remove-Job -Job $Server
        exit $RET
    - name: Generate coverage report
      run: go tool covdata textfmt -i $Env:GOCOVERDIR -o windows.out
    - name: Upload Results To Codecov
      uses: codecov/codecov-action@v5
      with:
        token: ${{ secrets.CODECOV_TOKEN }}
        files: ./windows.out
        flags: inttests # optional
        verbose: true # optional (default = false)
