#!groovy
pipeline {
    agent any
    options {
        ansiColor(colorMapName: 'XTerm')
        disableConcurrentBuilds()
        timestamps()
    }
    stages {
        stage('Create files/build directory') {
            steps {
                dir('assets/marketplace') {
                    sh 'mkdir -p files/build'
                }
            }
        }
        stage('Run Packer') {
            steps {
                dir('assets/marketplace') {
                    sh 'make oss'
                }
            }
        }
        stage('Update AMI IDs)') {
            steps {
                dir('assets/marketplace') {
                    sh 'make update-ami-ids-oss'
                }
            }
        }
        stage('Run Cloudformation and wait for stack') {
            environment {
                JENKINS_CLOUDFORMATION_PARAMETERS_PATH = credentials('7d731ad8-ed03-4e42-a411-605c40c182f6')
            }
            steps {
                dir('assets/marketplace') {
                    sh 'make jenkins-create-stack-vpc'
                    sh 'make jenkins-wait-for-stack-creation-vpc'
                    // get VPC stack outputs as a JSON list of {ParameterKey: key, ParameterValue: value} pairs
                    // write this to vpc.json
                    sh 'make jenkins-describe-stack-outputs-vpc | jq -r "map ( { ParameterKey: ( .OutputKey | tostring ), ParameterValue: ( .OutputValue | tostring) } )" > vpc.json'
                    // use jq to combine Jenkins JSON stack parameters and vpc.json into one list of pairs
                    sh "jq -s add ${JENKINS_CLOUDFORMATION_PARAMETERS_PATH} vpc.json > full-parameters.json"
                    // generate 16 random characters and update the domain name we're using (beware: there is a 64 character limit on the common name field)
                    sh 'dd if=/dev/urandom bs=128 count=1 | tr -dc "a-z0-9" | fold -w 16 | head -n 1 > random-string'
                    sh 'sed -i "s/jenkins-teleport-quickstart-test-stack.gravitational.io/jenkins-teleport-quickstart-$(cat random-string).gravitational.io/g" full-parameters.json'
                    sh 'jq -r \'.[] | select(.ParameterKey == "DomainName") | .ParameterValue\' full-parameters.json > generated-domain-name'
                    sh 'cat full-parameters.json'
                    sh 'cat generated-domain-name'
                    // update path to parameters file and create ASG stack
                    sh 'JENKINS_CLOUDFORMATION_PARAMETERS_PATH=full-parameters.json make jenkins-create-stack'
                    sh 'make jenkins-wait-for-stack-creation'
                    sh 'make jenkins-get-s3-bucket-id > s3-bucket-id'
                    sh 'cat s3-bucket-id'
                }
            }
        }
        stage('Wait for Teleport Web UI to come up') {
            steps {
                timeout(5) {
                    waitUntil {
                        dir('assets/marketplace') {
                            script {
                                sh 'cat generated-domain-name'
                                def r = sh script: 'wget -q https://$(cat generated-domain-name)/web/login', returnStatus: true
                                return (r == 0);
                            }
                        }
                    }
                }
            }
        }
    }
    post {
        always {
            dir('assets/marketplace') {
                script {
                    // we want to run all these shutdown steps in order regardless of success/failure (in case part of the ASG fails)
                    // so we use '|| true' to suppress return codes > 0
                    sh 'make jenkins-delete-stack || true'
                    sh 'make jenkins-wait-for-stack-deletion || true'
                    sh 'make jenkins-delete-stack-vpc || true'
                    sh 'make jenkins-wait-for-stack-deletion-vpc || true'
                    sh 'S3_BUCKET_ID=$(cat s3-bucket-id) make jenkins-delete-s3-bucket || true'
                }
            }            
        }
    }
}
