#!/usr/bin/env groovy
//-------------------------------------------------------------------------------
// Copyright (c) 2020-2022, Arm Limited and Contributors. All rights reserved.
//
// SPDX-License-Identifier: BSD-3-Clause
//
//-------------------------------------------------------------------------------

@NonCPS
def isPerPatchJob() {
  def upstream_job = manager.build.getAction(hudson.model.CauseAction.class).getCauses()[0]
  if (upstream_job instanceof hudson.model.Cause.UpstreamCause) {
    def gp_causes = upstream_job.getUpstreamCauses()
    if (gp_causes.size() > 0 && gp_causes[0] instanceof hudson.model.Cause.UpstreamCause) {
      print("Grand-parent project cause: ")
      println(gp_causes[0].upstreamProject)
      if (gp_causes[0].upstreamProject.endsWith("tf-m-static")) {
        return true
      }
    }
  }
  return false
}

def filterTestDevice() {
  def device_type = env.DEVICE_FILTER

  if (env.DEVICE_FILTER != "") {
    return device_type
  }
  // For AN521 builds running per-patch (started by the tf-m-static job),
  // run tests only on FVP to improve turnaround/performance.
  if (isPerPatchJob()) {
    if (env.TARGET_PLATFORM == "AN521") {
      device_type = "--fvp-only "
      print("Run test cases only on FVP in tf-m-static.")
    }
  }

  return device_type
}

def submitJobs(device_type) {
  dir("tf-m-ci-scripts") {
    def res = sh(script: """./lava_helper/lava_create_jobs.py \
      --output-dir lava_jobs ${device_type} \
      --jenkins-build-url ${env.BUILD_URL} \
      --docker-prefix ${env.DOCKER_PREFIX} --license-variable "${env.LICENSE_VARIABLE}" \
      --enable-code-coverage "${env.CODE_COVERAGE_EN}"
      """, returnStdout: true).trim()
    print(res)
    job_ids = sh(script: """./lava_helper/lava_submit_jobs.py \
      --lava-url ${env.LAVA_URL} --job-dir lava_jobs \
      --lava-user ${LAVA_USER} --lava-token ${LAVA_TOKEN} | egrep "^JOBS"
      """, returnStdout: true).trim()
    print("${job_ids}")
    currentBuild.setDescription(job_ids)
  }
}

timestamps {
  node("docker-amd64-tf-m-bionic") {
    stage("Init") {
      cleanWs()
      dir("tf-m-ci-scripts") {
        checkout([$class: 'GitSCM', branches: [[name: '$CI_SCRIPTS_BRANCH']], userRemoteConfigs: [[credentialsId: 'GIT_SSH_KEY', url: '$CI_SCRIPTS_REPO']]])
      }
    }
    stage("LAVA") {
      // Workaround for Groovy CPS idiosyncrasies. See e.g.
      // https://blog.thesparktree.com/you-dont-know-jenkins-part-3#solutions
      upstream_job = null
      gp_causes = null
      def device_type = filterTestDevice()

      withCredentials([usernamePassword(credentialsId: env.LAVA_CREDENTIALS, passwordVariable: 'LAVA_TOKEN', usernameVariable: 'LAVA_USER')]) {
        print("Generating LAVA jobs...")
        try {
          submitJobs(device_type)
        } catch (Exception ex) {
          print("LAVA-Submit failed! Exception: ${ex}")
          print("Try to submit again...")
          submitJobs(device_type)
          currentBuild.setDescription(currentBuild.getDescription() + " Submitted twice!")
        }
      }
    }
    stage("Post") {
      archiveArtifacts artifacts: 'tf-m-ci-scripts/lava_jobs/**', allowEmptyArchive: true
      cleanWs()
    }
  }
}
