# This is a GitHub workflow defining a set of jobs with a set of steps.
# ref: https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions
#
name: Test chart

on:
  pull_request:
    paths:
      - "chart/**"
      - "!**.md"
      - ".github/workflows/test-chart.yml"
  push:
    paths:
      - "chart/**"
      - "!**.md"
      - ".github/workflows/test-chart.yml"
    branches-ignore:
      - "dependabot/**"
  workflow_dispatch:

permissions:
  contents: read

defaults:
  run:
    working-directory: chart

jobs:
  lint-templates:
    runs-on: ubuntu-22.04

    steps:
      - uses: actions/checkout@v3
      - uses: actions/setup-python@v4
        with:
          python-version: "3.x"

      - name: Install dependencies (yamllint)
        run: pip install yamllint

      - run: helm dependency update

      - name: helm lint
        run: |
          helm lint . \
              --values dev-values.yaml

      - name: helm template
        run: |
          helm template . \
              --values dev-values.yaml \
              --output-dir rendered-templates

      - name: yamllint (only on templates we manage)
        run: |
          rm -rf rendered-templates/mastodon/charts

          yamllint rendered-templates \
            --config-data "{rules: {indentation: {spaces: 2}, line-length: disable}}"

  # This job helps us validate that rendered templates are valid k8s resources
  # against a k8s api-server, via "helm template --validate", but also that a
  # basic configuration can be used to successfully startup mastodon.
  #
  test-install:
    runs-on: ubuntu-22.04
    timeout-minutes: 15

    strategy:
      fail-fast: false
      matrix:
        include:
          # k3s-channel reference: https://update.k3s.io/v1-release/channels
          - k3s-channel: latest
          - k3s-channel: stable

          # This represents the oldest configuration we test against.
          #
          # The k8s version chosen is based on the oldest still supported k8s
          # version among two managed k8s services, GKE, EKS.
          # - GKE: https://endoflife.date/google-kubernetes-engine
          # - EKS: https://endoflife.date/amazon-eks
          #
          # The helm client's version can influence what helper functions is
          # available for use in the templates, currently we need v3.6.0 or
          # higher.
          #
          - k3s-channel: v1.21
            helm-version: v3.6.0

    steps:
      - uses: actions/checkout@v3

      # This action starts a k8s cluster with NetworkPolicy enforcement and
      # installs both kubectl and helm.
      #
      # ref: https://github.com/jupyterhub/action-k3s-helm#readme
      #
      - uses: jupyterhub/action-k3s-helm@v3
        with:
          k3s-channel: ${{ matrix.k3s-channel }}
          helm-version: ${{ matrix.helm-version }}
          metrics-enabled: false
          traefik-enabled: false
          docker-enabled: false

      - run: helm dependency update

      # Validate rendered helm templates against the k8s api-server
      - name: helm template --validate
        run: |
          helm template --validate mastodon . \
              --values dev-values.yaml

      - name: helm install
        run: |
          helm install mastodon . \
              --values dev-values.yaml \
              --timeout 10m

      # This actions provides a report about the state of the k8s cluster,
      # providing logs etc on anything that has failed and workloads marked as
      # important.
      #
      # ref: https://github.com/jupyterhub/action-k8s-namespace-report#readme
      #
      - name: Kubernetes namespace report
        uses: jupyterhub/action-k8s-namespace-report@v1
        if: always()
        with:
          important-workloads: >-
            deploy/mastodon-sidekiq
            deploy/mastodon-streaming
            deploy/mastodon-web
            job/mastodon-assets-precompile
            job/mastodon-chewy-upgrade
            job/mastodon-create-admin
            job/mastodon-db-migrate
