import java.util.regex.Pattern
/**
 *
 * OS images build pipeline
 *
 * Expected parameters:
 *    BUILD_OS
 *    BUILD_ONLY
 *    PACKER_DEBUG
 *    PACKER_URL
 *    PACKER_ZIP
 *    PACKER_ZIP_MD5
 *    PACKER_ARGS
 *    UPLOAD_URL
 *    SKIP_UPLOAD
 *    CLEANUP_OLD
 *    CLEANUP_KEEP
 *    PIPELINE_LIBS_URL
 *    PIPELINE_LIBS_BRANCH
 *    PIPELINE_LIBS_CREDENTIALS_ID
 *    GLANCE_UPLOAD
 *    GLANCE_IMG_TYPES
 *    GLANCE_URL
 *    GLANCE_CREDENTIALS_ID
 *    GLANCE_PROJECT
 *    GLANCE_ARGS
 *    OPENSTACK_API_CLIENT
 */

// Load shared libs
common = new com.mirantis.mk.Common()

node('qemu') {
    // Define global variables
    def workspace = common.getWorkspace()
    def buildTypes = BUILD_ONLY.tokenize(" ")
    def createdImages=[]
    def uploadedImages=[]
    def cleanedImages=[]

    checkout scm
    try {
        stage("prepare") {
            if (!fileExists("${workspace}/tmp")) {
                sh "mkdir -p ${workspace}/tmp"
            }
            if (!fileExists("${workspace}/images")) {
                sh "mkdir ${workspace}/images"
            }
        }
        if (!fileExists("bin")) {
            println("Downloading packer")
            sh "mkdir bin"
            dir("bin") {
                sh "wget -O ${PACKER_ZIP} ${PACKER_URL}"
                sh "echo \"${PACKER_ZIP_MD5} ${PACKER_ZIP}\" >> md5sum"
                sh "md5sum -c --status md5sum"
                sh "unzip ${PACKER_ZIP}"
            }
        }
        // clean images dir before building
        sh(script: String.format("rm -rf %s/images/*", BUILD_OS), returnStatus: true)
        // clean virtualenv is exists
        sh(script: String.format("rm -rf %s/venv", workspace), returnStatus: true)

        stage("build") {
            dir(BUILD_OS) {
                withEnv([String.format("PATH=%s:%s/bin", env.PATH, workspace),
                    "PACKER_LOG_PATH=${workspace}/packer.log",
                    "PACKER_LOG=1",
                    "TMPDIR=${workspace}/tmp"
                ]) {
                    if (PACKER_DEBUG == 'true') {
                        PACKER_ARGS = "${PACKER_ARGS} -debug"
                    }

                    wrap([$class: 'AnsiColorBuildWrapper']) {
                        sh "packer build -only=${BUILD_ONLY} ${PACKER_ARGS} -parallel=false template.json"
                    }

                    def packerStatus = sh(script: "grep \"Some builds didn't complete successfully and had errors\" ${PACKER_LOG_PATH}", returnStatus: true)
                    // grep returns 0 if find something
                    if (packerStatus != 0) {
                        if (buildTypes.contains("qemu")) {
                            def imageQemu = sh(script: "find images/ | grep -- '-qemu-' | tail -1", returnStdout: true).trim()
                            if (imageQemu != null && imageQemu != "") {
                                def qemuConvertStatus = sh(script: "qemu-img convert -c -O qcow2 ${imageQemu} ${imageQemu}.qcow2", returnStatus:true)
                                if(qemuConvertStatus == 0){
                                    def imageDir = imageQemu.substring(0, imageQemu.lastIndexOf("/") + 1)
                                    def imageQemuName = imageQemu.substring(imageQemu.lastIndexOf("/") + 1)
                                    def moveResult = sh(script: "mv ${imageQemu}.qcow2  ${imageDir}..", returnStatus: true)
                                    if(moveResult == 0){
                                        sh "rm -rf ${imageDir}"
                                        sh "rm -f ${imageQemu}"
                                        createdImages.add(imageQemuName+".qcow2")
                                    }
                                }else{
                                    throw new Exception("Qemu image convert failed")
                                }
                            }
                        }
                        if (buildTypes.contains("docker")) {
                            def imageDocker = sh(script: "find images/ | grep -- '-docker-' | grep '.tar\$' | tail -1", returnStdout: true).trim()
                            if (imageDocker != null && imageDocker != "") {
                                def pbZip2Status = sh(script: "pbzip2 ${imageDocker}", returnStatus: true)
                                if(pbZip2Status == 0){
                                    sh "rm -f ${imageDocker}"
                                    createdImages.add(imageDocker+".bz2")
                                }else{
                                    throw new Exception("pbzip2 image convert failed")
                                }
                            }
                        }
                    } else {
                      throw new Exception("Packer build failed")
                    }
                }
            }
        }
        stage("upload"){
            dir(BUILD_OS + "/images") {
                def images = findFiles(glob: "*.*")
                def imageBuilds = [:]
                def openstack = new com.mirantis.mk.Openstack()
                def openstackEnv = String.format("%s/venv", workspace);
                def openstackVersion = OPENSTACK_API_CLIENT ? OPENSTACK_API_CLIENT : 'liberty'
                def rcFile = openstack.createOpenstackEnv(GLANCE_URL, GLANCE_CREDENTIALS_ID, GLANCE_PROJECT)
                def glanceImgTypes = GLANCE_IMG_TYPES.tokenize(" ")
                openstack.setupOpenstackVirtualenv(openstackEnv, openstackVersion)
                openstack.runOpenstackCommand("pip install python-glanceclient==1.0.0", rcFile, openstackEnv)
                for (int i = 0; i < images.size(); i++) {
                    def imageName = images[i].name
                    def imageNameList = imageName.tokenize(".")
                    def imageType = "." + imageNameList[imageNameList.size() - 1]
                    if(imageType.equals(".md5")){
                        continue;
                    }

                    imageBuilds["build${i}"]={
                        if (SKIP_UPLOAD != 'true') {
                            sh "md5sum ${imageName} > ${imageName}.md5"
                            println("Uploading image " + imageName)
                            def uploadImageStatus = sh(script: "curl -f -T ${imageName} ${UPLOAD_URL}", returnStatus: true)
                            def uploadMd5Status = sh(script: "curl -f -T ${imageName}.md5 ${UPLOAD_URL}", returnStatus: true)

                            if (GLANCE_UPLOAD == 'true' && glanceImgTypes.contains(imageType.substring(1))) {
                                def glanceRunArgs = String.format("%s --disk-format %s --container-format bare", GLANCE_ARGS, imageType.substring(1))
                                if (GLANCE_PUBLIC == 'true') {
                                    glanceRunArgs += " --visibility public"
                                }

                                def imageShortName = imageNameList.get(0)
                                openstack.runOpenstackCommand(String.format("glance image-create --name '%s' %s --file %s", imageShortName, glanceRunArgs, imageName), rcFile, openstackEnv)
                            }
                            if(uploadImageStatus==0 && uploadMd5Status == 0){
                                uploadedImages.add(imageName)
                                sh(String.format("rm -r %s %s.md5",imageName, imageName))
                                createdImages.remove(imageName)
                            }else{
                                throw new Exception("Image upload failed")
                            }
                        }
                        if (CLEANUP_OLD == 'true') {
                            def remoteImages = sh(script: "curl -f -sss ${UPLOAD_URL} | grep -Eo '>.*\\.(qcow2|box|tar\\.bz2)</a>' | sed -e 's,>,,g' -e 's,</a,,g'", returnStdout: true)
                            if (remoteImages != "") {
                                def cleanupImages = getCleanupImageList(remoteImages, imageType, BUILD_OS)
                                def deleteCount = cleanupImages.size() - Integer.parseInt(CLEANUP_KEEP)
                                if (deleteCount > 0) {
                                    for (int j = 0; j < deleteCount; j++) {
                                        println(String.format("Deleting image %s from aptly", cleanupImages[j]))
                                        sh "curl -f -X DELETE ${UPLOAD_URL}" + cleanupImages[j]
                                        sh "curl -f -X DELETE ${UPLOAD_URL}" + cleanupImages[j] + ".md5"
                                        cleanedImages.add(cleanupImages[j])
                                    }
                                }
                            }
                        }
                    }
                }
                parallel imageBuilds
                println(String.format("Uploaded %s images with names %s", uploadedImages.size(), uploadedImages.toString()))
                println(String.format("Cleaned %s images with names %s", cleanedImages.size(), cleanedImages.toString()))
            }
        }
    } catch (Throwable e) {
        // If there was an error or exception thrown, the build failed
        currentBuild.result = "FAILURE"
        throw e
    } finally {
        common.sendNotification(currentBuild.result, "", ["slack"])
        if (buildTypes.contains("docker")) {
            withEnv(["PACKER_LOG_PATH=${workspace}/packer.log"]) {
                sh "docker rmi --force \$(grep \"docker: Image ID:\" ${PACKER_LOG_PATH} | cut -d : -f 6 | head -1 | sed s,\\ ,,g) || true"
            }
        }
        // clean created images if error occured
        if(!createdImages.isEmpty()){
            dir(BUILD_OS + "/images"){
                for(int i=0;i<createdImages.size();i++){
                    sh String.format("rm -f %s",createdImages.get(i))
                }
            }
        }
    }
}

@NonCPS
def getCleanupImageList(remoteImagesString, imageType, osImage) {
    def remoteImages = remoteImagesString.tokenize("\n")
    def imageTypeForRegex = Pattern.quote(imageType)
    def osImageForRegex = Pattern.quote(osImage.replaceAll(/\./,"-"))
    def remoteImagesSameType = remoteImages.findAll { it ->
        it =~ /${imageTypeForRegex}$/
    }
    return remoteImagesSameType.toSorted().findAll { it ->
        it =~ /^${osImageForRegex}-/
    }
}
