name: Common Library Tests

on:
  pull_request:
    paths:
      - library/common/**
      - library/common-test/**
      - .github/ct-install-config/common*.yaml
      - '!.github/ct-install-config/charts*'
      - .github/workflows/common_library_tests.yaml

jobs:
  lint:
    name: Lint Common
    runs-on: ubuntu-22.04
    strategy:
      fail-fast: false
      matrix:
        helm-version:
          - v3.9.4
          - v3.10.3
          - v3.11.1
    steps:
      - name: Checkout
        uses: actions/checkout@2541b1294d2704b0964813337f33b291d3f8596b # tag=v3
        with:
          # Depth 0 is required for chart-testing to work properly
          fetch-depth: 0

      - name: Install Helm
        uses: azure/setup-helm@5119fcb9089d432beecbf79bb2c7915207344b78 # tag=v3
        with:
          version: ${{ matrix.helm-version }}

      - uses: actions/setup-python@2c3dd9e7e29afd70cc0950079bde6c979d1f69f9 # tag=v4
        with:
          python-version: "3.10"

      - name: Set up chart-testing
        uses: helm/chart-testing-action@afea100a513515fbd68b0e72a7bb0ae34cb62aec # tag=v2.3.1

      - name: Run chart-testing (lint)
        id: lint
        run: |
          ct lint --config .github/ct-install-config/common-ct-lint.yaml

  unittest:
    needs:
      - lint
    name: Unit Tests
    runs-on: ubuntu-22.04
    env:
      helmUnitVersion: 0.2.11
    strategy:
      fail-fast: false
      matrix:
        helm-version:
          - v3.9.4
          - v3.10.3
          - v3.11.1
    steps:
      - name: Checkout
        uses: actions/checkout@2541b1294d2704b0964813337f33b291d3f8596b # tag=v3
        with:
          # Depth 0 is required for chart-testing to work properly
          fetch-depth: 0

      - name: Install Helm
        uses: azure/setup-helm@f382f75448129b3be48f8121b9857be18d815a82 # tag=v3
        with:
          version: ${{ matrix.helm-version }}

      - name: Run Unit-tests
        shell: bash
        run: |
          # Retry helm plugin install
          helm plugin install https://github.com/quintush/helm-unittest --version v${helmUnitVersion} || \
          helm plugin install https://github.com/quintush/helm-unittest --version v${helmUnitVersion} || \
          helm plugin install https://github.com/quintush/helm-unittest --version v${helmUnitVersion} || \
          helm plugin install https://github.com/quintush/helm-unittest --version v${helmUnitVersion}

          # Run tests
          cd library/common-test/
          helm dependency update
          helm unittest --helm3 -f "tests/*/*.yaml" .

  install:
    needs:
      - lint
    name: Install Charts
    runs-on: ubuntu-22.04
    strategy:
      fail-fast: false
      matrix:
        # We run tests on k3s version of latest SCALE release, SCALE nightly and manually defined "latest"
        k3s-version:
          - v1.25.3+k3s1
        # We run tests on Helm version of latest SCALE release, SCALE nightly and manually defined "latest"
        helm-version:
          - v3.11.1
        values:
          - basic-values.yaml
          - configmap-values.yaml
          - secrets-values.yaml
          - imagePullSecret-values.yaml
          - job-values.yaml
          - cron-values.yaml
          - persistence-values.yaml
          - rbac-values.yaml
          - init-values.yaml

    steps:
      - name: Checkout
        uses: actions/checkout@2541b1294d2704b0964813337f33b291d3f8596b # tag=v3
        with:
          # Depth 0 is required for chart-testing to work properly
          fetch-depth: 0

      - name: Install Helm
        uses: azure/setup-helm@f382f75448129b3be48f8121b9857be18d815a82 # tag=v3
        with:
          version: ${{ matrix.helm-version }}

      - uses: actions/setup-python@2c3dd9e7e29afd70cc0950079bde6c979d1f69f9 # tag=v4
        with:
          python-version: "3.10"

      - name: Set up chart-testing
        uses: helm/chart-testing-action@afea100a513515fbd68b0e72a7bb0ae34cb62aec # tag=v2.3.1

      - name: Create k3d cluster - Attempt 1/3
        continue-on-error: true
        id: createc1
        uses: nolar/setup-k3d-k3s@293b8e5822a20bc0d5bcdd4826f1a665e72aba96 # tag=v1.0.9
        with:
          github-token: ${{ secrets.GITHUB_TOKEN }}
          version: ${{ matrix.k3s-version }}
          # Flags found here https://github.com/k3d-io/k3d
          k3d-args: --k3s-arg --disable=metrics-server@server:*

      - name: Wait 10 second to retry
        if: steps.createc1.outcome=='failure'
        run: |
          sleep 10
      - name: Create k3d cluster - Attempt 2/3
        continue-on-error: true
        if: steps.createc1.outcome=='failure'
        id: createc2
        uses: nolar/setup-k3d-k3s@293b8e5822a20bc0d5bcdd4826f1a665e72aba96 # tag=v1.0.9
        with:
          github-token: ${{ secrets.GITHUB_TOKEN }}
          version: ${{ matrix.k3s-version }}
          # Flags found here https://github.com/k3d-io/k3d
          k3d-args: --k3s-arg --disable=metrics-server@server:*

      - name: Wait 10 second to retry
        if: steps.createc2.outcome=='failure'
        run: |
          sleep 10
      - name: Create k3d cluster - Attempt 3/3
        id: createc3
        if: steps.createc2.outcome=='failure'
        uses: nolar/setup-k3d-k3s@293b8e5822a20bc0d5bcdd4826f1a665e72aba96 # tag=v1.0.9
        with:
          github-token: ${{ secrets.GITHUB_TOKEN }}
          version: ${{ matrix.k3s-version }}
          # Flags found here https://github.com/k3d-io/k3d
          k3d-args: --k3s-arg --disable=metrics-server@server:*

      - name: Run chart-testing (install)
        run: |
          # This is done to improve speed of the tests, so we can run tests in parallel
          # Move all ci values on a temp location (or skip if already moved from another matrix job)
          mv library/common-test/ci library/common-test/runtests || echo "Nothing to move"

          # Move one values.yaml to the correct location to run the test
          mv -f library/common-test/runtests/${{ matrix.values }} library/common-test/values.yaml

          # Actually run the test
          ct install --config .github/ct-install-config/common-ct-install.yaml
