name: "PR Testing"

on: [pull_request]

env:
  HONEYCOMB_WRITEKEY: 7f3c63a70eecc61d635917de46bea4e6
  HONEYCOMB_DATASET: litmus tests

jobs:
  setup_matrix:
    name: "Setup Test Matrix"
    runs-on: ubuntu-20.04
    outputs:
      matrix: ${{ steps.get-matrix.outputs.matrix }}

    steps:
    - name: "Honeycomb: Start recording"
      uses: kvrhdn/gha-buildevents@v1.0.2
      with:
        apikey: ${{ env.HONEYCOMB_WRITEKEY }}
        dataset: ${{ env.HONEYCOMB_DATASET }}
        job-status: ${{ job.status }}

    - name: "Honeycomb: Start first step"
      run: |
        echo STEP_ID=0 >> $GITHUB_ENV
        echo STEP_START=$(date +%s) >> $GITHUB_ENV

    - name: Checkout Source
      uses: actions/checkout@v2
      if: ${{ github.repository_owner == 'puppetlabs' }}

    - name: Activate Ruby 2.7
      uses: actions/setup-ruby@v1
      if: ${{ github.repository_owner == 'puppetlabs' }}
      with:
        ruby-version: "2.7"

    - name: Cache gems
      uses: actions/cache@v2
      if: ${{ github.repository_owner == 'puppetlabs' }}
      with:
        path: vendor/gems
        key: ${{ runner.os }}-${{ github.event_name }}-${{ hashFiles('**/Gemfile') }}
        restore-keys: |
          ${{ runner.os }}-${{ github.event_name }}-
          ${{ runner.os }}-

    - name: Install gems
      if: ${{ github.repository_owner == 'puppetlabs' }}
      run: |
        buildevents cmd $TRACE_ID $STEP_ID 'bundle config path vendor/gems' -- bundle config path vendor/gems
        buildevents cmd $TRACE_ID $STEP_ID 'bundle config jobs 8' -- bundle config jobs 8
        buildevents cmd $TRACE_ID $STEP_ID 'bundle config retry 3' -- bundle config retry 3
        buildevents cmd $TRACE_ID $STEP_ID 'bundle install' -- bundle install
        buildevents cmd $TRACE_ID $STEP_ID 'bundle clean' -- bundle clean

    - name: Setup Acceptance Test Matrix
      id: get-matrix
      if: ${{ github.repository_owner == 'puppetlabs' }}
      run: |
        if [ '${{ github.repository_owner }}' == 'puppetlabs' ]; then
          buildevents cmd $TRACE_ID $STEP_ID matrix_from_metadata -- bundle exec matrix_from_metadata
        else
          echo  "::set-output name=matrix::{}"
        fi

    - name: "Honeycomb: Record setup time"
      if: ${{ always() }}
      run: |
        buildevents step $TRACE_ID $STEP_ID $STEP_START 'Setup Test Matrix'

  Acceptance:
    needs:
      - setup_matrix

    runs-on: ubuntu-20.04
    strategy:
      fail-fast: false
      matrix: ${{fromJson(needs.setup_matrix.outputs.matrix)}}

    env:
      BUILDEVENT_FILE: '../buildevents.txt'

    steps:
    - run: |
        echo 'platform=${{ matrix.platform }}' >> $BUILDEVENT_FILE
        echo 'collection=${{ matrix.collection }}' >> $BUILDEVENT_FILE

    - name: "Honeycomb: Start recording"
      uses: kvrhdn/gha-buildevents@v1.0.2
      with:
        apikey: ${{ env.HONEYCOMB_WRITEKEY }}
        dataset: ${{ env.HONEYCOMB_DATASET }}
        job-status: ${{ job.status }}
        matrix-key: ${{ matrix.platform }}-${{ matrix.collection }}

    - name: "Honeycomb: start first step"
      run: |
        echo STEP_ID=${{ matrix.platform }}-${{ matrix.collection }}-1 >> $GITHUB_ENV
        echo STEP_START=$(date +%s) >> $GITHUB_ENV

    - name: Checkout Source
      uses: actions/checkout@v2

    - name: Activate Ruby 2.7
      uses: actions/setup-ruby@v1
      with:
        ruby-version: "2.7"

    - name: Cache gems
      uses: actions/cache@v2
      with:
        path: vendor/gems
        key: ${{ runner.os }}-${{ github.event_name }}-${{ hashFiles('**/Gemfile') }}
        restore-keys: |
          ${{ runner.os }}-${{ github.event_name }}-
          ${{ runner.os }}-

    - name: "Honeycomb: Record cache setup time"
      if: ${{ always() }}
      run: |
        buildevents step $TRACE_ID $STEP_ID $STEP_START 'Cache retrieval'
        echo STEP_ID=${{ matrix.platform }}-${{ matrix.collection }}-2 >> $GITHUB_ENV
        echo STEP_START=$(date +%s) >> $GITHUB_ENV

    - name: Bundler Setup
      run: |
        buildevents cmd $TRACE_ID $STEP_ID 'bundle config path vendor/gems' -- bundle config path vendor/gems
        buildevents cmd $TRACE_ID $STEP_ID 'bundle config jobs 8' -- bundle config jobs 8
        buildevents cmd $TRACE_ID $STEP_ID 'bundle config retry 3' -- bundle config retry 3
        buildevents cmd $TRACE_ID $STEP_ID 'bundle install' -- bundle install
        buildevents cmd $TRACE_ID $STEP_ID 'bundle clean' -- bundle clean
        echo ::group::bundler environment
        buildevents cmd $TRACE_ID $STEP_ID 'bundle env' -- bundle env
        echo ::endgroup::

    - name: "Honeycomb: Record Bundler Setup time"
      if: ${{ always() }}
      run: |
        buildevents step $TRACE_ID $STEP_ID $STEP_START 'Bundler Setup'
        echo STEP_ID=${{ matrix.platform }}-${{ matrix.collection }}-3 >> $GITHUB_ENV
        echo STEP_START=$(date +%s) >> $GITHUB_ENV

    - name: Provision test environment
      run: |
        buildevents cmd $TRACE_ID $STEP_ID 'rake litmus:provision ${{ matrix.platform }}' -- bundle exec rake 'litmus:provision[provision::provision_service,${{ matrix.platform }}]'
        echo ::group::=== REQUEST ===
        cat request.json || true
        echo
        echo ::endgroup::
        echo ::group::=== INVENTORY ===
        sed -e 's/password: .*/password: "[redacted]"/' < inventory.yaml || true
        echo ::endgroup::

    # The provision service hands out machines as soon as they're provisioned.
    # The GCP VMs might still take a while to spool up and configure themselves fully.
    # This retry loop spins until all agents have been installed successfully.
    - name: Install agent
      uses: nick-invision/retry@v1
      with:
        timeout_minutes: 30
        max_attempts: 5
        retry_wait_seconds: 60
        command: buildevents cmd $TRACE_ID $STEP_ID 'rake litmus:install_agent ${{ matrix.collection }}' -- bundle exec rake 'litmus:install_agent[${{ matrix.collection }}]'

    # The agent installer on windows does not finish in time for this to work. To
    # work around this for now, retry after a minute if installing the module failed.
    - name: Install module
      uses: nick-invision/retry@v1
      with:
        timeout_minutes: 30
        max_attempts: 2
        retry_wait_seconds: 60
        command: buildevents cmd $TRACE_ID $STEP_ID 'rake litmus:install_module' -- bundle exec rake 'litmus:install_module'

    - name: "Honeycomb: Record deployment times"
      if: ${{ always() }}
      run: |
        echo ::group::honeycomb step
        buildevents step $TRACE_ID $STEP_ID $STEP_START 'Deploy test system'
        echo STEP_ID=${{ matrix.platform }}-${{ matrix.collection }}-4 >> $GITHUB_ENV
        echo STEP_START=$(date +%s) >> $GITHUB_ENV
        echo ::endgroup::

    - name: Run acceptance tests
      run: |
        buildevents cmd $TRACE_ID $STEP_ID 'rake litmus:acceptance:parallel' -- bundle exec rake 'litmus:acceptance:parallel'

    - name: "Honeycomb: Record acceptance testing times"
      if: ${{ always() }}
      run: |
        buildevents step $TRACE_ID $STEP_ID $STEP_START 'Run acceptance tests'
        echo STEP_ID=${{ matrix.platform }}-${{ matrix.collection }}-5 >> $GITHUB_ENV
        echo STEP_START=$(date +%s) >> $GITHUB_ENV

    - name: Remove test environment
      if: ${{ always() }}
      run: |
        if [ -f inventory.yaml ]; then
          buildevents cmd $TRACE_ID $STEP_ID 'rake litmus:tear_down' -- bundle exec rake 'litmus:tear_down'
          echo ::group::=== REQUEST ===
          cat request.json || true
          echo
          echo ::endgroup::
        fi

    - name: "Honeycomb: Record removal times"
      if: ${{ always() }}
      run: |
        buildevents step $TRACE_ID $STEP_ID $STEP_START 'Remove test environment'
