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

@NonCPS
def getUpstreamJob() {
  def cause = manager.build.getAction(hudson.model.CauseAction.class).getCauses()
  return cause
}

def submitJobs(fvp_only_cmd, 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 ${fvp_only_cmd}\
      --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}"
      """, 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()
    currentBuild.setDescription(job_ids)
  }
}

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") {
    def fvp_only_cmd = ""
    def upstreamProject = getUpstreamJob()[0].upstreamProject
    if (upstreamProject == "tf-m-build-and-test") {
      fvp_only_cmd = "--fvp-only "
      print("Run test cases only on FVP in per-patch.")
    }

    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(fvp_only_cmd, bl2_string, psa_string)
      } catch (Exception ex) {
        print("LAVA-Submit failed! Exception: ${ex}")
        print("Try to submit again...")
        submitJobs(fvp_only_cmd, bl2_string, psa_string)
        currentBuild.setDescription(currentBuild.getDescription() + " Submitted twice!")
      }
    }
  }
  stage("Post") {
    archiveArtifacts artifacts: 'tf-m-ci-scripts/lava_jobs/**', allowEmptyArchive: true
    cleanWs()
  }
}
