#
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements.  See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership.  The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License.  You may obtain a copy of the License at
#
#   http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied.  See the License for the
# specific language governing permissions and limitations
# under the License.
#
name: e2e-test-ci

on:
  push:
    branches:
      - master
  pull_request:
    branches:
      - master
    type: [review_requested, ready_for_review]

concurrency:
  group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
  cancel-in-progress: true

jobs:
  changes:
    runs-on: ubuntu-latest
    outputs:
      docs: ${{ steps.filter.outputs.docs }}
      go: ${{ steps.filter.outputs.go }}
    steps:
      - name: Checkout
        uses: actions/checkout@v2
        with:
          submodules: recursive

      - uses: ./.github/actions/paths-filter
        id: filter
        with:
          token: ${{ secrets.GITHUB_TOKEN }}
          filters: |
            docs:
              - 'docs/**/*'
              - '*.md'
            go:
              - '*.go'
              - '**/*.go'
              - 'go.mod'
              - 'go.sum'
              - 'Makefile'
              - 'Dockerfile'
              - 'test/e2e/**/*'
              - 'conf/**'
              - 'utils/**'

  e2e-test:
    needs: changes
    if: |
      (needs.changes.outputs.go == 'true')
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
        with:
          submodules: recursive
      - name: Install kind
        run: |
          curl -Lo ./kind https://kind.sigs.k8s.io/dl/v0.11.1/kind-linux-amd64
          chmod +x ./kind
          sudo mv kind /usr/local/bin
      - name: Setup Go Env
        uses: actions/setup-go@v1
        with:
          go-version: "1.13"
      - name: Install ginkgo
        run: |
          go get -u github.com/onsi/ginkgo/ginkgo
          sudo cp ~/go/bin/ginkgo /usr/local/bin
      - name: Create K8s cluster
        run: |
          make kind-up
          kubectl wait --for=condition=Ready nodes --all
      - name: Run e2e test cases
        working-directory: ./
        run: |
          make e2e-test E2E_CONCURRENCY=1
      - name: upload coverage profile
        working-directory: ./test/e2e
        run: |
          bash <(curl -s https://codecov.io/bash)
