// input parameters:
//   boolean: BUILD_FROM_SOURCE
//   boolean: REPO_DISTRO
//   boolean: COMMIT_ID
//   boolean: UPSTREAM_SUFFIX
//   string:  NODE
//   string: RSYNC_DESTINATION
//   string: REPO_BASE_URL
//   string: REPO_KEY_NAME
//   string: RELEASE

node("${params.NODE}") {

    stage("Setup") {
        tag_or_branch = params.COMMIT_ID.replaceAll(/\./,"")
        container_name_prefix = "osm-${tag_or_branch}"
        container_name = "${container_name_prefix}-${BUILD_NUMBER}"
    }

    stage("Checkout") {
        checkout scm
    }

    // Copy the artifacts from the upstream jobs
    stage("Copy Artifacts") {
        // cleanup any previous repo
        sh 'rm -rf repo'

        dir('repo') {
            // grab all stable upstream builds based on the
            // given target UPSTREAM_SUFFIX

            def list = ["SO", "UI", "RO", "openvim", "osmclient"]
            for (component in list) {
                step ([$class: 'CopyArtifact',
                       projectName: "${component}_${params.UPSTREAM_SUFFIX}"])
                sh "dpkg-sig --sign builder -k dpkg1 pool/${component}/*"
                // cleanup any prevously defined dists
                sh "rm -rf dists"
            }

            // now create the distro
            for (component in list) {
                sh "mkdir -p dists/${params.REPO_DISTRO}/${component}/binary-amd64/"
                sh "apt-ftparchive packages pool/${component} > dists/${params.REPO_DISTRO}/${component}/binary-amd64/Packages"
                sh "gzip -9fk dists/${params.REPO_DISTRO}/${component}/binary-amd64/Packages"
            }

            // create and sign the release file
            sh "apt-ftparchive release dists/${params.REPO_DISTRO} > dists/${params.REPO_DISTRO}/Release"
            sh "gpg --yes -abs -u dpkg1 -o dists/${params.REPO_DISTRO}/Release.gpg dists/${params.REPO_DISTRO}/Release"
            sh "rsync -avz . ${params.RSYNC_DESTINATION}/${params.RELEASE}"
        }
    }

    stage("Cleanup") {
        // check for previous containers and clean them up
        sh "jenkins/system/delete_old_containers.sh ${container_name_prefix}"
    }

    stage("Build") {
        from_source = ''
        if ( params.BUILD_FROM_SOURCE )
        {
            from_source = '--source'
        }
 
        sh """
            export OSM_USE_LOCAL_DEVOPS=true
            jenkins/host/start_build system --build-container ${container_name} \
                                            -b ${params.COMMIT_ID} \
                                            -r ${params.REPO_DISTRO} \
                                            -u ${params.REPO_BASE_URL} \
                                            -k ${params.REPO_KEY_NAME} \
                                            -R ${params.RELEASE} \
                                            ${from_source}
           """
    }

    stage("Archive Artifacts") {
        sh "echo ${container_name} > build_version.txt"
        sh "tar -zcvf repo.tar.gz repo"
        archiveArtifacts artifacts: "build_version.txt, repo.tar.gz", fingerprint: true
    }
}
