@Library('nf-jenkins-shared-libraries')_  

def repo = "nf-filebeat"

pipeline {
    agent {
        dockerfile { 
            filename 'Dockerfile.build'
            args '-u 0 --privileged'
        }
    }
    environment {
        DOCKER_HUB = credentials('dockerhub')
        BITBUCKET_AUTH = credentials('bitbucket_auth')
        GIT_SSH_COMMAND = "ssh -o StrictHostKeyChecking=no"
        BITBUCKET_ADMIN = credentials('bitbucket_admin')
    }
    parameters {
        booleanParam(name: 'promote', defaultValue: false, description: 'Promote Container')
        choice(name:'environment', choices: "staging\nproduction", description: 'Environment to Deploy To')
    }
    stages {
        stage('Config Test') {
            steps {
                script {
                    bitbucketStatus repo: "${repo}", BRANCH_NAME: "${BRANCH_NAME}", GIT_COMMIT: "${GIT_COMMIT}", status: "INPROGRESS"
                    def dep_environment = "sandbox"
                    if( params.promote == true){
                        dep_environment = params.environment
                    }
                    def account_id = nfAWSAccounts account_name: "${dep_environment}"
                    withAWS(credentials: 'jenkins-central-mgt', region: 'us-east-1', role:'jenkins-central-mgt',  roleAccount: "${account_id}") {
                        def es_siem_filebeat_psw = sh (script: "aws secretsmanager get-secret-value --secret-id es_siem_filebeat_psw --query SecretString --region us-east-1 --output text", label: "Reading secret es_siem_filebeat_psw from SecretsManager", returnStdout: true).trim()
                        def kibana_password = sh (script: "aws secretsmanager get-secret-value --secret-id kibana_password --query SecretString --region us-east-1 --output text", label: "Reading kibana_password from SecretsManager", returnStdout: true).trim()
                        withEnv(["ES_PASSWORD=${es_siem_filebeat_psw}", "NF_ENVIRONMENT=${dep_environment}","KIBANA_PASSWORD=${kibana_password}"]){
                            sh "cp filebeat.yml filebeat.yml.${BUILD_ID}"
                            sh "/usr/share/filebeat/bin/filebeat test config -c filebeat.yml.${BUILD_ID}"
                            sh "/usr/share/filebeat/bin/filebeat test output -c filebeat.yml.${BUILD_ID}"
                            sh "rm -f filebeat.yml.${BUILD_ID}"
                        }
                    }
                    
                    
                }
            }
        }

        stage('Terraform'){
            when { expression { BRANCH_NAME == "develop" || params.promote == true }}
            steps {
                script {
                    def workspace = "nf-sandbox" 
                    if( params.promote == true) { 
                        if (params.environment == "staging") { workspace = "nf-staging-int" } else { workspace = "nf-prod-int" }
                    }
                    withCredentials([[$class: 'AmazonWebServicesCredentialsBinding', credentialsId: "ba4f105d-6e90-4b8a-ad8e-6e31ce4c339b", variable: 'AWS_ACCESS_KEY_ID']]) {
                        dir("terraform"){
                            sshagent(['afd18d9b-3d41-4b59-b5cc-05cd7df2ce63']) {
                                sh "rm -rf .terraform"
                                sh "terraform init"
                                sh "terraform workspace select ${workspace}"
                                sh "terraform workspace list"
                                sh "terraform plan"
                                sh "terraform apply -auto-approve"
                            }
                        }
                    }
                }
            }
        }


        stage('Docker') {
            when { expression { BRANCH_NAME == "develop" || BRANCH_NAME ==~ /(release.*)/ }}
            steps {
                script {
                    sh "service docker start"
                    def dockerImage = docker.build ("netfoundry/${repo}:${GIT_COMMIT}",
                        " --build-arg bitbucket_build_number=${BUILD_NUMBER} ."
                    )
                    def TAGS = [ GIT_COMMIT, "latest", "${BRANCH_NAME.replaceAll('/','-')}"]
                    docker.withRegistry('', 'dockerhub') {
                        for (int i =0; i< TAGS.size(); i++ ) {
                            dockerImage.push(TAGS[i])
                        }
                    }  
                }
            }
        }

        stage('Deployment') {
            when { expression { BRANCH_NAME == "develop" || params.promote == true }}
            steps {
                script {
                    def dep_environment = "sandbox"
                    if( params.promote == true ) { 
                        dep_environment = params.environment
                    } 
                    def account_id = nfAWSAccounts account_name: "${dep_environment}"
                    withAWS(credentials: 'jenkins-central-mgt', region: 'us-east-1', role:'jenkins-central-mgt',  roleAccount: "${account_id}") {
                        sh "ecs deploy --region us-east-1 --image ${repo} netfoundry/${repo}:${GIT_COMMIT} --timeout 600 devops ecs-${repo}"
                    }
                }
            }
        }

        stage('Record SSM') {
            when { expression { BRANCH_NAME == "develop" || params.promote == true }}
            steps {
                script {
                    def dep_environment = "sandbox"
                    if( params.promote == true ) { 
                        dep_environment = params.environment
                    } 
                    def account_id = nfAWSAccounts account_name: "${dep_environment}"
                    withAWS(credentials: 'jenkins-central-mgt', region: 'us-east-1', role:'jenkins-central-mgt',  roleAccount: "${account_id}") {
                        sh "aws ssm put-parameter --name /${dep_environment}/container-image/${repo} --type String --value ${GIT_COMMIT} --region us-east-1 --overwrite"
                    }
                }
            }
        }

        stage('BackMerge'){
            when { expression { params.promote == true && params.environment == "production" && BRANCH_NAME ==~ /(release.*)/  }}
            steps {
                script {
                    bitbucketStatus repo: "${repo}", BRANCH_NAME: BRANCH_NAME, GIT_COMMIT: GIT_COMMIT, status: "SUCCESSFUL"
                    sleep 30
                    bitbucketActions action: "merge", source_branch: "${BRANCH_NAME}", repo: repo, dest_branch: "develop"
                    bitbucketActions action: "merge", source_branch: "${BRANCH_NAME}", repo: repo, dest_branch: "master"
                    bitbucketActions action: "tag", source_branch: "master", repo: repo, tag_name: "${BRANCH_NAME.replaceAll('/','-')}"
                    bitbucketActions action: "close", source_branch: "${BRANCH_NAME}", repo: repo
                }
            }
        }
    }
    post {
        aborted {
            bitbucketStatus repo: "${repo}", BRANCH_NAME: BRANCH_NAME, GIT_COMMIT: GIT_COMMIT, status: "STOPPED"
        }
        failure {
            bitbucketStatus repo: "${repo}", BRANCH_NAME: BRANCH_NAME, GIT_COMMIT: GIT_COMMIT, status: "FAILED"
            slackFailureNotification repo: "${repo}", commit: GIT_COMMIT, build_url: RUN_DISPLAY_URL, channel: "continous-deployments"
        }
        success {
            bitbucketStatus repo: "${repo}", BRANCH_NAME: BRANCH_NAME, GIT_COMMIT: GIT_COMMIT, status: "SUCCESSFUL"
        }
    }
}

