properties([pipelineTriggers([githubPush()])])
def runParameters = []
def csdacAnsibleJobPrefix = '/CSDAC/Ansible/csdac-ansible/master/'
def csdacArtifactsInfo = [:]
pipeline {
    agent { label 'csdac-prod' }

    options {
        buildDiscarder(logRotator(daysToKeepStr: '90', artifactDaysToKeepStr: '90'))
        disableConcurrentBuilds()
        timestamps()
       // copyArtifactPermission('identity/Muster/Muster-Images-Promotion')
     }

    environment {
        ARTIFACTORY_URL = 'https://engci-maven-master.cisco.com/artifactory'
        REPO_NAME = 'csdac-fmc-rpm'
        BRANCH = env.BRANCH_NAME.replace("release/", "").replaceAll("[/-]","_")
        COMMIT = env.GIT_COMMIT.take(7)
        VALUES_FILE = 'rpm/rpm.json'
    }

    stages {
           stage("Pack FTD script") {
               when {
                   allOf {
                       changeset 'tar/*'
                       expression { env.CHANGE_ID == null }
                   }
               }
               steps {
                   script {
                       if (env.BRANCH_NAME == 'master') {
                           version = "${env.BUILD_NUMBER}"
                       } else {
                           version = env.BRANCH_NAME.replaceFirst(/^.*\//, '') + "-${env.BUILD_NUMBER}"
                       }
                     
                       sh "tar -cvzf ${WORKSPACE}/csdac-cli-${version}-${env.GIT_COMMIT.take(7)}.tar.gz  -C tar ."
                       
                       def server = Artifactory.newServer url: 'https://engci-maven.cisco.com/artifactory', credentialsId: 'cisco-dockerhub-id'

                       def uploadSpec = """{
                            "files": [
                            {
                                "pattern": "${WORKSPACE}/csdac-cli-${version}-${env.GIT_COMMIT.take(7)}.tar.gz",
                                "target": "firepower-build-maven/components/Identity/csdac-ftd-binaries/${env.BRANCH_NAME.replaceFirst(/^.*\//, '')}/"
                            }
                            ]
                            }"""

                            echo "uploadSpec = " + uploadSpec

                        // Push to Artifactory, fail if nothing uploaded
                        def buildInfo = server.upload spec: uploadSpec, failNoOp: true
                        server.publishBuildInfo(buildInfo)
                        echo "Published files: https://engci-maven.cisco.com/artifactory/firepower-build-group/components/Identity/csdac-ftd-binaries/${env.BRANCH_NAME.replaceFirst(/^.*\//, '')}/csdac-cli-${version}-${env.GIT_COMMIT.take(7)}.tar.gz"
                        def cliArtifactSha = sh(script: "sha256sum ${WORKSPACE}/csdac-cli-${version}-${env.GIT_COMMIT.take(7)}.tar.gz", returnStdout: true). trim()
                        csdacArtifactsInfo["CSDAC-cli Artifact Name"] = "${WORKSPACE}/csdac-cli-${version}-${env.GIT_COMMIT.take(7)}.tar.gz"
                        csdacArtifactsInfo["CSDAC-cli Artifact SHA"] = cliArtifactSha
                    }
                }
            }
            stage("Trigger csdac ansible job") {
                steps {
                    script {
                    runParameters << [$class: 'BooleanParameterValue', name: "RUN_MOLECULE_TEST", value: true]
                    runParameters << [$class: 'StringParameterValue', name: "vm_name", value: "muster_integ_test_vm_master"]
                    runParameters << [$class: 'StringParameterValue', name: "ipv4_address", value: "10.10.10.21"]
                    runParameters << [$class: 'BooleanParameterValue', name: "RUN_MOLECULE_TEST", value: true]
                    runParameters << [$class: 'StringParameterValue', name: "musterAwsConnector", value: "3.0.0-latest"]
                    runParameters << [$class: 'StringParameterValue', name: "musterAzureConnector", value: "3.0.0-latest"]
                    runParameters << [$class: 'StringParameterValue', name: "musterVcenterConnector", value: "3.0.0-latest"]
                    runParameters << [$class: 'StringParameterValue', name: "musterBee", value: "3.0.0-latest"]
                    runParameters << [$class: 'StringParameterValue', name: "musterEtcd", value: "3.0.0-latest"]
                    runParameters << [$class: 'StringParameterValue', name: "musterFmcAdapter", value: "3.0.0-latest"]
                    runParameters << [$class: 'StringParameterValue', name: "musterUiBackend", value: "3.0.0-latest"]
                    runParameters << [$class: 'StringParameterValue', name: "musterUi", value: "3.0.0-latest"]
                    runParameters << [$class: 'StringParameterValue', name: "musterO365Connector", value: "3.0.0-latest"]
                    runParameters << [$class: 'StringParameterValue', name: "musterEnvoy", value: "3.0.0-latest"]
                    runParameters << [$class: 'StringParameterValue', name: "musterGitHubConnector", value: "3.0.0-latest"]
                    runParameters << [$class: 'StringParameterValue', name: "musterGcpConnector", value: "3.0.0-latest"]
                        def ansibleJob = build job: csdacAnsibleJobPrefix, parameters: runParameters, wait: true, propagate: true
                    }
                }
            }
        stage("Build rpm package and push to registry") {
            agent {
                dockerfile {
                    filename 'rpm/Dockerfile.rpm'
                    dir '.'
                    label 'csdac-prod'
                    registryUrl 'https://dockerhub.cisco.com'
                    registryCredentialsId 'cisco-dockerhub-id'
                }
            }

            steps {
                sh "make fmc_rpm"
                withCredentials([usernamePassword(credentialsId: 'cisco-dockerhub-id', usernameVariable: 'USERNAME', passwordVariable: 'PASSWORD')]) {
                    sh 'curl -u$USERNAME:$PASSWORD -XPUT $ARTIFACTORY_URL/$REPO_NAME/ -T /tmp/RPMS/noarch/muster-${BRANCH}-$BUILD_NUMBER.${COMMIT}.noarch.rpm'
                }
                script {
                    def rpmArtifactSha = sh(script: "sha256sum /tmp/RPMS/noarch/muster-${BRANCH}-$BUILD_NUMBER.${COMMIT}.noarch.rpm", returnStdout: true). trim()
                    csdacArtifactsInfo["RPM Artifact Name"] = "/tmp/RPMS/noarch/muster-${BRANCH}-$BUILD_NUMBER.${COMMIT}.noarch.rpm"
                    csdacArtifactsInfo["RPM Artifact SHA"] = rpmArtifactSha
                }
                cleanWs()
            }
        }
        stage('BES Logging') {
                steps {
                    script {
                        //Print build hostname
                        def buildHost = sh(script: 'hostname', returnStdout: true).trim()
                        println("[BES Logging]- Hostname: ${buildHost}")
                        
                        //Print input build parameters
                        println("Build parameters:")
                        params.each { paramName, paramValue ->
                            print("[BES Logging] - Parameter Name: ${paramName}, Value: ${paramValue}")
                        }
                        
                        //Print Build details
                        println("[BES Logging] - Build Number: ${env.BUILD_NUMBER}")
                        println("[BES Logging] - Build URL: ${env.BUILD_URL}")
                        
                        //Print dependency details
                        def dockerVersion = sh(script: 'docker --version; which docker; which docker | sha256sum', returnStdout: true). trim()
                        println("[BES Logging] - Docker information:\n" + "${dockerVersion}")
                        
                        //Prind build trigger details
                        def causes = currentBuild.getBuildCauses()
                        println("[BES Logging] - Build Trigger: \n" + "${causes}")
                        
                        //Print hash of generated artifacts
                        println("Print hash of generated artifacts:")
                        csdacArtifactsInfo.each { paramName, paramValue ->
                            print("[BES Logging] - ${paramName}: ${paramValue}")
                        }
                        
                    }
                }
        }
    }
    post {
        always {
            cleanWs()
        }
    }
}
