#!groovy
@Library('infraLib') _

import hudson.plugins.ec2.AmazonEC2Cloud

def latestAmi
def terraformProvidersVersions = '/infra/jenkins/terraform/providers'

pipeline {
  agent {
    label 'linux-agents'
  }

  options {
    ansiColor('xterm')
    disableConcurrentBuilds()
  }

  environment {
    AWS_PROFILE = 'gdb-infra-dev'

    AWS_PROVIDER_VERSION         = "${utility.getParameterValueByNameAndPath(terraformProvidersVersions, '.aws_provider_version', env.AWS_PROFILE)}"
    GOOGLE_PROVIDER_VERSION      = "${utility.getParameterValueByNameAndPath(terraformProvidersVersions, '.google_provider_version', env.AWS_PROFILE)}"
    GOOGLE_BETA_PROVIDER_VERSION = "${utility.getParameterValueByNameAndPath(terraformProvidersVersions, '.google_beta_provider_version', env.AWS_PROFILE)}"
    LOCAL_PROVIDER_VERSION       = "${utility.getParameterValueByNameAndPath(terraformProvidersVersions, '.local_provider_version', env.AWS_PROFILE)}"
    RANDOM_PROVIDER_VERSION      = "${utility.getParameterValueByNameAndPath(terraformProvidersVersions, '.random_provider_version', env.AWS_PROFILE)}"
    ARCHIVE_PROVIDER_VERSION     = "${utility.getParameterValueByNameAndPath(terraformProvidersVersions, '.archive_provider_version', env.AWS_PROFILE)}"
    DNS_PROVIDER_VERSION         = "${utility.getParameterValueByNameAndPath(terraformProvidersVersions, '.dns_provider_version', env.AWS_PROFILE)}"
    NULL_PROVIDER_VERSION        = "${utility.getParameterValueByNameAndPath(terraformProvidersVersions, '.null_provider_version', env.AWS_PROFILE)}"
    TIME_PROVIDER_VERSION        = "${utility.getParameterValueByNameAndPath(terraformProvidersVersions, '.time_provider_version', env.AWS_PROFILE)}"
  }

  stages {
    stage('Validate') {
      steps {
        sh "cd \"${env.WORKSPACE}/Jenkins/packer/linux-agent-ansible/\" && make validate/terraform"
      } /* end: steps */
    } /* end: stage */

    stage('Build') {
      steps {
        sh "cd \"${env.WORKSPACE}/Jenkins/packer/linux-agent-ansible/\" && make build/terraform"
      } /* end: steps */
    } /* end: stage */

    stage('Get latest AMI') {
      steps {
        script {
          latestAmi = sh(script: """
            aws ec2 describe-images \
              --owners self \
              --filters "Name=tag:platform,Values=Delphi" \
                        "Name=tag:environment,Values=Common" \
                        "Name=tag:type,Values=terraform" \
              --query 'sort_by(Images, &CreationDate)[-1].[ImageId]' \
              --output text \
              --region us-east-1
          """, returnStdout: true).trim()
        } /* end: script */
      } /* end: steps */
    } /* end: stage */

    stage('Update cloud settings') {
      steps {
        script {
          def instance = Jenkins.getInstance()
          def clouds = instance.clouds
          clouds.each { cloud ->
            if (cloud instanceof AmazonEC2Cloud) {
              cloud.templates.each { template ->
                if (template.description.startsWith('Terraform')) {
                  template.ami = latestAmi
                } /* end: if */
              } /* end: each */
            } /* end: if */
          } /* end: each */
          instance.save()
        } /* end: script */
      } /* end: steps */
    } /*end: stage */
  } /* end: stages */
} /* end: pipeline */
