name: advanced testing

env:
  AWS_EKS_NAME: tip-wlan-main
  AWS_DEFAULT_OUTPUT: json
  AWS_DEFAULT_REGION: us-east-2
  AWS_ACCOUNT_ID: ${{ secrets.AWS_ACCOUNT_ID }}
  AWS_ACCESS_KEY_ID: ${{ secrets.AWS_CLIENT_ID }}
  AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_CLIENT_KEY }}

on:
  workflow_dispatch:

defaults:
  run:
    shell: bash

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v2
    - name: build and push Docker image
      uses: ./.github/actions/build-and-push-docker
      with:
        registry: tip-tip-wlan-cloud-docker-repo.jfrog.io
        registry_user: wlan-testing-cicd
        registry_password: ${{ secrets.DOCKER_USER_PASSWORD }}

  test:
    runs-on: [ self-hosted, small ]
    needs: [ build ]
    timeout-minutes: 1440
     
    strategy:
      fail-fast: false
      matrix:
        testbed: 
        - advanced-01
        - advanced-02

    steps:
    - uses: actions/checkout@v2
    - name: install aws CLI tool
      run: |
        curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
        unzip awscliv2.zip
        sudo ./aws/install

    - name: install kubectl
      run: |
        # TODO WIFI-7839 revert to using stable when issue is resolved on AWS CLI side
        curl -LO "https://dl.k8s.io/release/v1.23.6/bin/linux/amd64/kubectl"
        sudo install -o root -g root -m 0755 kubectl /usr/local/bin/kubectl

    - name: get EKS access credentials
      run: aws eks update-kubeconfig  --name ${{ env.AWS_EKS_NAME }}

    - name: prepare namespace
      id: namespace
      run: |
        NAMESPACE="testing-${{ github.run_number }}-${{ matrix.testbed }}"
        echo "::set-output name=name::${NAMESPACE}"

    - name: run tests
      uses: ./.github/actions/run-tests
      with:
        namespace: ${{ steps.namespace.outputs.name }}
        testbed: ${{ matrix.testbed }}
        marker_expression: advance
        configuration: "${{ secrets.LAB_CONFIGURATION_JSON }}"
        testing_docker_image: tip-tip-wlan-cloud-docker-repo.jfrog.io/cloud-sdk-nightly:${{ github.run_id }}
        allure_results_artifact_name: allure-results-${{ matrix.testbed }}

    # necessary because if conditionals in composite actions are currently not respected
    - name: get tests logs
      if: always()
      continue-on-error: true
      run: |
        podname=$(kubectl get pods -n ${{ steps.namespace.outputs.name }} --no-headers -o custom-columns=":metadata.name" -l job-name=testing | sed "s/pod\///")
        kubectl logs --timestamps -n ${{ steps.namespace.outputs.name }} $podname || true

    - name: delete namespace
      if: always()
      continue-on-error: true
      run: kubectl delete ns --ignore-not-found=true --wait ${{ steps.namespace.outputs.name }}

  report:
    needs: [ test ]
    if: always()
    runs-on: ubuntu-latest
    strategy:
      fail-fast: false
      matrix:
        testbed:
        - advanced-01
        - advanced-02
    steps:
    - uses: actions/checkout@v2
    - uses: actions/download-artifact@v2
      with:
        name: allure-results-${{ matrix.testbed }}
        path: allure-results

    - name: download history of previous run
      continue-on-error: true
      env:
        AWS_EKS_NAME: tip-wlan-main
        AWS_DEFAULT_OUTPUT: json
        AWS_DEFAULT_REGION: us-east-2
        AWS_ACCOUNT_ID: ${{ secrets.AWS_ACCOUNT_ID }}
        AWS_ACCESS_KEY_ID: ${{ secrets.AWS_CLIENT_ID }}
        AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_CLIENT_KEY }}
      run: |
        LAST_RUN_ID=$(aws s3api head-object --bucket openwifi-allure-reports --key advanced/${{ matrix.testbed }}/latest/index.html | jq -r .Metadata.latest)
        aws s3 cp --recursive s3://openwifi-allure-reports/advanced/${{ matrix.testbed }}/$LAST_RUN_ID/history history

    - name: generate Allure report
      uses: ./.github/actions/generate-allure-report
      with:
        results_path: ./allure-results
        history_path: ./history
        additional_metadata: |
          Testbed=${{ matrix.testbed }}

    - name: upload Allure report as artifact
      uses: actions/upload-artifact@v2
      with:
        name: allure-report-${{ matrix.testbed }}
        path: allure-report

    # doing this to be able to aggregate multiple reports together later on
    - name: copy results into report
      run: cp -r allure-results allure-report/results

    - name: upload to S3
      if: github.ref == 'refs/heads/master'
      uses: ./.github/actions/allure-report-to-s3
      with:
        test_type: advanced
        testbed: ${{ matrix.testbed }}
        report_path: allure-report
        s3_access_key_id: ${{ secrets.ALLURE_S3_ACCESS_KEY_ID }}
        s3_access_key_secret: ${{ secrets.ALLURE_S3_ACCESS_KEY_SECRET }}

  cleanup:
    needs: [ test ]
    runs-on: ubuntu-latest
    if: always()
    steps:
    - uses: actions/checkout@v2
    - name: cleanup Docker image
      uses: ./.github/actions/cleanup-docker
      with:
        registry_user: wlan-testing-cicd
        registry_password: ${{ secrets.DOCKER_USER_PASSWORD }}
