# 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: PostCommit Java Nexmark Dataflow

on:
  schedule:
    - cron: '15 4/6 * * *'
  pull_request_target:
    paths: ['release/trigger_all_tests.json', '.github/trigger_files/beam_PostCommit_Java_Nexmark_Dataflow.json']
  workflow_dispatch:

# This allows a subsequently queued workflow run to interrupt previous runs
concurrency:
  group: '${{ github.workflow }} @ ${{ github.event.issue.number || github.sha || github.head_ref || github.ref }}-${{ github.event.schedule || github.event.comment.id || github.event.sender.login }}'
  cancel-in-progress: true

#Setting explicit permissions for the action to avoid the default permissions which are `write-all` in case of pull_request_target event
permissions:
  actions: write
  pull-requests: write
  checks: write
  contents: read
  deployments: read
  id-token: none
  issues: write
  discussions: read
  packages: read
  pages: read
  repository-projects: read
  security-events: read
  statuses: read

env:
  DEVELOCITY_ACCESS_KEY: ${{ secrets.DEVELOCITY_ACCESS_KEY }}
  GRADLE_ENTERPRISE_CACHE_USERNAME: ${{ secrets.GE_CACHE_USERNAME }}
  GRADLE_ENTERPRISE_CACHE_PASSWORD: ${{ secrets.GE_CACHE_PASSWORD }}
  GRADLE_COMMAND_ARGUMENTS: |
    -Pnexmark.args=--manageResources=false 
    --monitorJobs=true 
    --bigQueryTable=nexmark 
    --bigQueryDataset=nexmark 
    --project=apache-beam-testing 
    --resourceNameMode=QUERY_RUNNER_AND_MODE 
    --exportSummaryToBigQuery=true 
    --tempLocation=gs://temp-storage-for-perf-tests/nexmark 
    --influxDatabase=beam_test_metrics 
    --influxHost=http://10.128.0.96:8086 
    --baseInfluxMeasurement=nexmark 
    --exportSummaryToInfluxDB=true 
    --influxRetentionPolicy=forever 
    --region=us-central1 
    --suite=STRESS 
    --numWorkers=4 
    --maxNumWorkers=4 
    --autoscalingAlgorithm=NONE 
    --nexmarkParallel=16 
    --enforceEncodability=true 
    --enforceImmutability=true 
    --runner=DataflowRunner
  INFLUXDB_USER: ${{ secrets.INFLUXDB_USER }}
  INFLUXDB_USER_PASSWORD: ${{ secrets.INFLUXDB_USER_PASSWORD }}

jobs:
  beam_PostCommit_Java_Nexmark_Dataflow:
    name: ${{ matrix.job_name }} (${{ matrix.job_phrase }})
    runs-on: [self-hosted, ubuntu-20.04, main]
    timeout-minutes: 240
    strategy:
      fail-fast: false
      matrix:
        job_name: [beam_PostCommit_Java_Nexmark_Dataflow]
        job_phrase: [Run Dataflow Runner Nexmark Tests]
        streaming: [false, true]
        queryLanguage: [sql, none]
    if: |
      github.event_name == 'workflow_dispatch' ||
      github.event_name == 'pull_request_target' ||
      (github.event_name == 'schedule' && github.repository == 'apache/beam') ||
      github.event.comment.body == 'Run Dataflow Runner Nexmark Tests'
    steps:
      - uses: actions/checkout@v4
      - name: Setup repository
        uses: ./.github/actions/setup-action
        with:
          comment_phrase: ${{ matrix.job_phrase }}
          github_token: ${{ secrets.GITHUB_TOKEN }}
          github_job: ${{ matrix.job_name }} (${{ matrix.job_phrase }})
      - name: Setup environment
        uses: ./.github/actions/setup-environment-action
      - name: run PostCommit Java Nexmark Dataflow (${{ matrix.streaming }} ${{ matrix.queryLanguage }}) script
        if: matrix.queryLanguage != 'none'
        uses: ./.github/actions/gradle-command-self-hosted-action
        with:
          gradle-command: :sdks:java:testing:nexmark:run
          arguments: |
            -Pnexmark.runner=:runners:google-cloud-dataflow-java \
             "${{ env.GRADLE_COMMAND_ARGUMENTS }}--streaming=${{ matrix.streaming }} --queryLanguage=${{ matrix.queryLanguage }}" \
      - name: run PostCommit Java Nexmark Dataflow (${{ matrix.streaming }}) script
        if: matrix.queryLanguage == 'none'
        uses: ./.github/actions/gradle-command-self-hosted-action
        with:
          gradle-command: :sdks:java:testing:nexmark:run
          arguments: |
            -Pnexmark.runner=:runners:google-cloud-dataflow-java \
            "${{ env.GRADLE_COMMAND_ARGUMENTS }}--streaming=${{ matrix.streaming }}"