#!/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, bl2_string, psa_string) {
  dir("tf-m-ci-scripts") {
    def res = sh(script: """./lava_helper/lava_create_jobs.py \
      --build-number ${env.BUILD_NUMBER} --output-dir lava_jobs ${device_type}\
      --compiler ${env.COMPILER} --platform ${env.TARGET_PLATFORM} \
      ${bl2_string} ${psa_string} --build-type ${env.CMAKE_BUILD_TYPE} \
      --jenkins-build-url ${env.BUILD_URL} --proj-config ${env.PROJ_CONFIG} \
      --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...")
        def bl2_string = ""
        def psa_string = ""
        if (env.BL2.equals("True")) {
          bl2_string = "--bl2"
        }
        // work around this string containing quotes?
        if (env.PSA_API_SUITE != "") {
          psa_string = "--psa-api-suite ${env.PSA_API_SUITE}"
        }
        try {
          submitJobs(device_type, bl2_string, psa_string)
        } catch (Exception ex) {
          print("LAVA-Submit failed! Exception: ${ex}")
          print("Try to submit again...")
          submitJobs(device_type, bl2_string, psa_string)
          currentBuild.setDescription(currentBuild.getDescription() + " Submitted twice!")
        }
      }
    }
    stage("Post") {
      archiveArtifacts artifacts: 'tf-m-ci-scripts/lava_jobs/**', allowEmptyArchive: true
      cleanWs()
    }
  }
}
