@Library("cadoles") _

pipeline {

    agent {
        label 'common'
    }

    parameters {
        string(
            name: 'packageName', 
            description: 'Nom du paquet à installer'
        )
        string(
            name: 'packageVersion', 
            defaultValue: '', 
            description: 'Version du paquet à installer'
        )
        string(
            name: 'packageRepository',
            description: 'Dépôt de paquets à utiliser sur Vulcain'
        )
        string(
            name: 'vmTemplate',
            description: 'Template OpenNebula de la VM à utiliser pour le test d\'installation'
        )
    }

    stages {

        stage("Check parameters") {
            steps {
                script {
                    if (!params.packageName?.trim()) {
                        error("Le nom du paquet n'est pas défini !")
                    }
                    if (!params.vmTemplate?.trim()) {
                        error("Le template de VM n'est pas défini !")
                    }
                    if (!params.packageRepository?.trim()) {
                        error("Le dépôt de paquets n'est pas défini !")
                    }
                }
            }
        }

        stage("Test package installation") {
            steps {
                script {
                    nebula.runInNewVM([vmTemplate: params.vmTemplate]) { shell ->

                        // On ajoute le dépôt Vulcain sur la machine et on met
                        // à jour la liste des paquets
                        stage("Add Vulcain '${params.packageRepository}' repository") {
                            shell("""
                            set -xeo pipefail
                            wget -qO - https://vulcain.cadoles.com/cadoles.gpg | apt-key add -
                            echo 'deb https://vulcain.cadoles.com ${params.packageRepository} main' > /etc/apt/sources.list.d/${params.packageRepository}.list
                            apt-get update -y
                            """)
                        }

                        // On installe le paquet dans la version demandée (si celle ci est fournie)
                        stage("Install package '${params.packageName}${ params.packageVersion?.trim() ? '=' + params.packageVersion?.trim() : ''}'") {
                            hook("pre-install")
                            shell("""
                            set -xeo pipefail
                            apt-get install -y ${params.packageName}${ params.packageVersion?.trim() ? '=' + params.packageVersion?.trim() : ''}
                            """)
                            hook("post-install")
                        }

                        // Si le template de VM est basé sur EOLE, alors on tente
                        // d'appliquer un CreoleLint sur les dicos/templates qui pourraient être
                        // distribués par le paquet nouvellement installé
                        if (params.vmTemplate.contains('eole')) {
                            stage("Lint Creole templates") {
                                shell("""
                                set -xeo pipefail
                                TEMPLATES=\$(dpkg -L ${params.packageName} | grep /usr/share/eole/creole/distrib/ || true)
                                if [ -z "\$TEMPLATES" ]; then
                                    echo "Aucun template Creole dans le paquet."
                                    exit 0
                                fi
                                for tmpl in \$TEMPLATES; do
                                    CreoleLint -t \$(basename \$tmpl)
                                done
                                """)
                            }
                            stage("Lint Creole dictionnaries") {
                                shell("""
                                set -xeo pipefail
                                DICOS=\$(dpkg -L ${params.packageName} | grep /usr/share/eole/creole/dicos/ || true)
                                if [ -z "\$DICOS" ]; then
                                    echo "Aucun dictionnaire Creole dans le paquet."
                                    exit 0
                                fi
                                for dico in \$DICOS; do
                                    CreoleLint -d \$(basename \$DICOS)
                                done
                                """)
                            }
                        }
                    }
                }
            }
        }
    }

    post {
        failure {
            wrap([$class: 'BuildUser']) {
                rocketSend (
                    avatar: 'https://jenkins.cadol.es/static/b5f67753/images/headshot.png',
                    message: """
                    Le test d'installation du paquet `${params.packageName}` a échoué:
                    
                    - Version `${params.packageVersion}`
                    - Dépôt `${params.packageRepository}`
                    - Template de la VM  `${params.vmTemplate}`

                    [Voir le job](${env.RUN_DISPLAY_URL})
                    
                    @${env.BUILD_USER_ID ? env.BUILD_USER_ID : 'here'}
                    """.stripIndent(),
                    rawMessage: true
                )
            }
        }
    }

}