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

# To learn more about GitHub Actions in Apache Beam check the CI.md

name: Python tests

on:
  schedule:
    - cron: '10 2 * * *'
  push:
    branches: ['master', 'release-*']
    tags: 'v*'
  pull_request:
    branches: ['master', 'release-*']
    tags: 'v*'
    paths: ['sdks/python/**', 'model/**']
  workflow_dispatch:
    inputs:
      runDataflow:
        description: 'Type "true" if you want to run Dataflow tests (GCP variables must be configured, check CI.md)'
        default: false


jobs:

  check_gcp_variables:
    timeout-minutes: 5
    name: "Check GCP variables"
    runs-on: ubuntu-latest
    outputs:
      gcp-variables-set: ${{ steps.check_gcp_variables.outputs.gcp-variables-set }}
    steps:
      - uses: actions/checkout@v2
      - name: "Check are GCP variables set"
        run: "./scripts/ci/ci_check_are_gcp_variables_set.sh"
        id: check_gcp_variables
        env:
          GCP_PROJECT_ID: ${{ secrets.GCP_PROJECT_ID }}
          GCP_REGION: ${{ secrets.GCP_REGION }}
          GCP_SA_EMAIL: ${{ secrets.GCP_SA_EMAIL }}
          GCP_SA_KEY: ${{ secrets.GCP_SA_KEY }}
          GCP_TESTING_BUCKET: ${{ secrets.GCP_TESTING_BUCKET }}
          GCP_PYTHON_WHEELS_BUCKET: "not-needed-here"

  build_python_sdk_source:
    name: 'Build python source distribution'
    if: |
      needs.check_gcp_variables.outputs.gcp-variables-set == 'true' && (
        (github.event_name == 'push' || github.event_name == 'schedule') ||
        (github.event_name == 'workflow_dispatch' && github.event.inputs.runDataflow == 'true')
      )
    needs:
      - check_gcp_variables
    runs-on: ubuntu-latest
    steps:
      - name: Checkout code
        uses: actions/checkout@v2
      - name: Install python
        uses: actions/setup-python@v2
        with:
          python-version: 3.7
      - name: Get build dependencies
        working-directory: ./sdks/python
        run: pip install pip setuptools --upgrade && pip install -r build-requirements.txt
      - name: Build source
        working-directory: ./sdks/python
        run: python setup.py sdist
      - name: Rename source file
        working-directory: ./sdks/python/dist
        run: mv $(ls | grep "apache-beam.*tar\.gz") apache-beam-source.tar.gz
      - name: Upload compressed sources as artifacts
        uses: actions/upload-artifact@v2
        with:
          name: python_sdk_source
          path: sdks/python/dist/apache-beam-source.tar.gz

  python_unit_tests:
    name: 'Python Unit Tests'
    runs-on: ${{ matrix.os }}
    strategy:
      fail-fast: false
      matrix:
        os: [ubuntu-latest, macos-latest, windows-latest]
        params: [
          {"py_ver": "3.6", "tox_env": "py36"},
          {"py_ver": "3.7", "tox_env": "py37"},
          {"py_ver": "3.8", "tox_env": "py38"},
        ]
        exclude:
          # TODO remove exclusion after issue with protobuf is solved
          # https://github.com/protocolbuffers/protobuf/issues/7765
          - os: windows-latest
            params: {"py_ver": "3.8", "tox_env": "py38"}
    steps:
      - name: Checkout code
        uses: actions/checkout@v2
      - name: Install python
        uses: actions/setup-python@v2
        with:
          python-version: ${{ matrix.params.py_ver }}
      - name: Get build dependencies
        working-directory: ./sdks/python
        run: pip install -r build-requirements.txt
      - name: Install tox
        run: pip install tox
      - name: Run tests basic unix
        if: startsWith(matrix.os, 'ubuntu') || startsWith(matrix.os, 'macos')
        working-directory: ./sdks/python
        run: tox -c tox.ini -e ${{ matrix.params.tox_env }}
      - name: Run tests basic windows
        if: startsWith(matrix.os, 'windows')
        working-directory: ./sdks/python
        run: tox -c tox.ini -e ${{ matrix.params.tox_env }}-win
      - name: Upload test logs
        uses: actions/upload-artifact@v2
        if: always()
        with:
          name: pytest-${{matrix.os}}-${{matrix.params.py_ver}}
          path: sdks/python/pytest**.xml

  python_wordcount_direct_runner:
    name: 'Python Wordcount Direct Runner'
    runs-on: ${{ matrix.os }}
    strategy:
      fail-fast: false
      matrix:
        os: [ubuntu-latest, macos-latest, windows-latest]
        python: [3.6, 3.7, 3.8]
        exclude:
          # TODO remove exclusion after issue with protobuf is solved
          # https://github.com/protocolbuffers/protobuf/issues/7765
          - os: windows-latest
            python: 3.8
    steps:
      - name: Checkout code
        uses: actions/checkout@v2
      - name: Install python
        uses: actions/setup-python@v2
        with:
          python-version: ${{ matrix.python }}
      - name: Get build dependencies
        working-directory: ./sdks/python
        run: pip install -r build-requirements.txt
      - name: Install requirements
        working-directory: ./sdks/python
        run: pip install setuptools --upgrade && pip install -e .
      - name: Run WordCount
        working-directory: ./sdks/python
        shell: bash
        run: python -m apache_beam.examples.wordcount --input MANIFEST.in --output counts

  python_wordcount_dataflow:
    name: 'Python Wordcount Dataflow'
    needs:
      - build_python_sdk_source
    runs-on: ${{ matrix.os }}
    strategy:
      fail-fast: false
      matrix:
        os: [ubuntu-latest, macos-latest, windows-latest]
        python: [3.6, 3.7, 3.8]
        exclude:
          # TODO remove exclusion after issue with protobuf is solved
          # https://github.com/protocolbuffers/protobuf/issues/7765
          - os: windows-latest
            python: 3.8
    steps:
      - name: Checkout code
        uses: actions/checkout@v2
      - name: Install python
        uses: actions/setup-python@v2
        with:
          python-version: ${{ matrix.python }}
      - name: Download source from artifacts
        uses: actions/download-artifact@v2
        with:
          name: python_sdk_source
          path: apache-beam-source
      - name: Authenticate on GCP
        uses: google-github-actions/setup-gcloud@master
        with:
          service_account_email: ${{ secrets.GCP_SA_EMAIL }}
          service_account_key: ${{ secrets.GCP_SA_KEY }}
          project_id: ${{ secrets.GCP_PROJECT_ID }}
          export_default_credentials: true
      - name: Get build dependencies
        working-directory: ./sdks/python
        run: pip install -r build-requirements.txt
      - name: Install requirements
        working-directory: ./sdks/python
        run: pip install setuptools --upgrade && pip install -e ".[gcp]"
      - name: Run WordCount
        working-directory: ./sdks/python
        shell: bash
        run: |
          python -m apache_beam.examples.wordcount \
            --input gs://dataflow-samples/shakespeare/kinglear.txt \
            --output gs://${{ secrets.GCP_TESTING_BUCKET }}/python_wordcount_dataflow/counts \
            --runner DataflowRunner \
            --project ${{ secrets.GCP_PROJECT_ID }} \
            --region ${{ secrets.GCP_REGION }} \
            --temp_location gs://${{ secrets.GCP_TESTING_BUCKET }}/tmp/python_wordcount_dataflow/ \
            --sdk_location ../../apache-beam-source/apache-beam-source.tar.gz
