#
# 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.
#

on:
  pull_request:
  push:
    branches:
      - dev

name: E2E

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


jobs:
  paths-filter:
    name: E2E-Path-Filter
    runs-on: ubuntu-latest
    outputs:
      not-ignore: ${{ steps.filter.outputs.not-ignore }}
    steps:
      - uses: actions/checkout@v2
      - uses: dorny/paths-filter@b2feaf19c27470162a626bd6fa8438ae5b263721
        id: filter
        with:
          filters: |
            not-ignore:
              - '!(docs/**)'
  build:
    name: E2E-Build
    needs: paths-filter
    if: ${{ (needs.paths-filter.outputs.not-ignore == 'true') || (github.event_name == 'push') }}
    runs-on: ubuntu-latest
    timeout-minutes: 20
    steps:
      - uses: actions/checkout@v2
        with:
          submodules: true
      - name: Sanity Check
        uses: ./.github/actions/sanity-check
        with:
          token: ${{ secrets.GITHUB_TOKEN }}
      - name: Cache local Maven repository
        uses: actions/cache@v3
        with:
          path: ~/.m2/repository
          key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }}
          restore-keys: ${{ runner.os }}-maven-
      - name: Build Image
        run: |
          ./mvnw -B clean install \
          -Dmaven.test.skip \
          -Dmaven.javadoc.skip \
          -Dcheckstyle.skip=true \
          -Pdocker,release -Ddocker.tag=ci \
          -pl dolphinscheduler-standalone-server -am
      - name: Export Docker Images
        run: |
          docker save apache/dolphinscheduler-standalone-server:ci -o /tmp/standalone-image.tar \
          && du -sh /tmp/standalone-image.tar
      - uses: actions/upload-artifact@v2
        name: Upload Docker Images
        with:
          name: standalone-image
          path: /tmp/standalone-image.tar
          retention-days: 1
  e2e:
    name: ${{ matrix.case.name }}
    needs: build
    runs-on: ubuntu-latest
    timeout-minutes: 30
    strategy:
      matrix:
        case:
          - name: Tenant
            class: org.apache.dolphinscheduler.e2e.cases.TenantE2ETest
          - name: User
            class: org.apache.dolphinscheduler.e2e.cases.UserE2ETest
          - name: WorkerGroup
            class: org.apache.dolphinscheduler.e2e.cases.WorkerGroupE2ETest
          - name: Project
            class: org.apache.dolphinscheduler.e2e.cases.ProjectE2ETest
          - name: Queue
            class: org.apache.dolphinscheduler.e2e.cases.QueueE2ETest
          - name: Environment
            class: org.apache.dolphinscheduler.e2e.cases.EnvironmentE2ETest
          - name: Cluster
            class: org.apache.dolphinscheduler.e2e.cases.ClusterE2ETest
          - name: Token
            class: org.apache.dolphinscheduler.e2e.cases.TokenE2ETest
          - name: Workflow
            class: org.apache.dolphinscheduler.e2e.cases.WorkflowE2ETest
#          - name: WorkflowForSwitch
#            class: org.apache.dolphinscheduler.e2e.cases.WorkflowSwitchE2ETest
          - name: FileManage
            class: org.apache.dolphinscheduler.e2e.cases.FileManageE2ETest
          - name: UdfManage
            class: org.apache.dolphinscheduler.e2e.cases.UdfManageE2ETest
          - name: FunctionManage
            class: org.apache.dolphinscheduler.e2e.cases.FunctionManageE2ETest
          - name: MysqlDataSource
            class: org.apache.dolphinscheduler.e2e.cases.MysqlDataSourceE2ETest
          - name: ClickhouseDataSource
            class: org.apache.dolphinscheduler.e2e.cases.ClickhouseDataSourceE2ETest
          - name: PostgresDataSource
            class: org.apache.dolphinscheduler.e2e.cases.PostgresDataSourceE2ETest
          - name: SqlServerDataSource
            class: org.apache.dolphinscheduler.e2e.cases.SqlServerDataSourceE2ETest
          - name: HiveDataSource
            class: org.apache.dolphinscheduler.e2e.cases.HiveDataSourceE2ETest
    env:
      RECORDING_PATH: /tmp/recording-${{ matrix.case.name }}
    steps:
      - uses: actions/checkout@v2
        with:
          submodules: true
      - name: Cache local Maven repository
        uses: actions/cache@v3
        with:
          path: ~/.m2/repository
          key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }}
          restore-keys: ${{ runner.os }}-maven-
      - uses: actions/download-artifact@v2
        name: Download Docker Images
        with:
          name: standalone-image
          path: /tmp
      - name: Load Docker Images
        run: |
            docker load -i /tmp/standalone-image.tar
      - name: Run Test
        run: |
          ./mvnw -B -f dolphinscheduler-e2e/pom.xml -am \
            -DfailIfNoTests=false \
            -Dtest=${{ matrix.case.class }} test
      - uses: actions/upload-artifact@v2
        if: always()
        name: Upload Recording
        with:
          name: recording-${{ matrix.case.name }}
          path: ${{ env.RECORDING_PATH }}
          retention-days: 1
  result:
    name: E2E
    runs-on: ubuntu-latest
    timeout-minutes: 30
    needs: [ e2e, paths-filter ]
    if: always()
    steps:
      - name: Status
        run: |
          if [[ ${{ needs.paths-filter.outputs.not-ignore }} == 'false' && ${{ github.event_name }} == 'pull_request' ]]; then
            echo "Skip E2E!"
            exit 0
          fi
          if [[ ${{ needs.e2e.result }} != 'success' ]]; then
            echo "E2E Failed!"
            exit -1
          fi
