/*
 * 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.
 */

plugins {
  id 'org.apache.beam.module'
}
applyGroovyNature()
applyPythonNature()

pythonVersion = '3.8'

task generateMetricsReport {
  dependsOn setupVirtualenv
  def metricsReportFilename = "beam-metrics_report.html"
  def generateMetricsReportDir = "${rootDir}/.test-infra/jenkins/metrics_report"
  def generateMetricsReportPath = "${generateMetricsReportDir}/${metricsReportFilename}"
  def toxConfigFilePath = "${rootDir}/.test-infra/jenkins/metrics_report/tox.ini"

  def influxDb = project.findProperty('influxDb')
  def influxHost = project.findProperty('influxHost')
  def influxPort = project.findProperty('influxPort')

  doLast {
    exec {
      executable 'sh'
      args '-c', ". ${envdir}/bin/activate && tox -e py38-test -c ${toxConfigFilePath}"
    }
    exec {
      executable 'sh'
      args '-c', ". ${envdir}/bin/activate && tox -e py38-generate-report -c ${toxConfigFilePath} -- --influx-db=${influxDb} --influx-host=${influxHost} --influx-port=${influxPort} --output-file=${generateMetricsReportPath}"
    }
    logger.info('Create metrics report file {}', generateMetricsReportPath)
  }
  outputs.file "${generateMetricsReportPath}"
}
