#!/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(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()
    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") {
      def device_type = ""
      def upstreamProject = getUpstreamJob()[0].upstreamProject
      if (upstreamProject == "tf-m-build-and-test") {
        device_type = "--physical-board-only "
        print("Run test cases only on physical boards 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(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()
    }
  }
}
