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"
  workflow_dispatch: {}

permissions:
  contents: read

env:
  GOCOVERDIR: /tmp/k3scov
  
jobs:
  build:
    uses: ./.github/workflows/build-k3s.yaml
  itest:
    needs: build
    name: Integration Tests
    runs-on: ubuntu-latest
    timeout-minutes: 45
    strategy:
      fail-fast: false
      matrix:
        itest: [certrotation, etcdrestore, localstorage, startup, custometcdargs, etcdsnapshot, kubeflags, longhorn, secretsencryption, flannelnone]
      max-parallel: 3
    steps:
    - name: Checkout
      uses: actions/checkout@v4
      with:
        fetch-depth: 1
    - name: Install Go
      uses: ./.github/actions/setup-go
    - name: "Download k3s binary"
      uses: actions/download-artifact@v4
      with:
        name: k3s
        path: ./dist/artifacts
    - name: Run Integration Tests
      run: | 
        chmod +x ./dist/artifacts/k3s
        mkdir -p $GOCOVERDIR
        sudo -E env "PATH=$PATH" go test -v -timeout=45m ./tests/integration/${{ matrix.itest }}/... -run Integration
    - 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@v4
      with:
        token: ${{ secrets.CODECOV_TOKEN }}
        files: ./${{ matrix.itest }}.out
        flags: inttests # optional
        verbose: true # optional (default = false)