// Licensed to the Apache Software Foundation (ASF) under one
// or more contributor license agreements.  See the NOTICE file
// distributed with this work for additional information
// regarding copyright ownership.  The ASF licenses this file
// to you under the Apache License, Version 2.0 (the
// "License"); you may not use this file except in compliance
// with the License.  You may obtain a copy of the License at
//
//   http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing,
// software distributed under the License is distributed on an
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
// KIND, either express or implied.  See the License for the
// specific language governing permissions and limitations
// under the License.

pipeline {

    agent {
        label 'hbase'
    }

    options {
        // N.B. this is per-branch, which means per PR
        disableConcurrentBuilds()
        buildDiscarder(logRotator(numToKeepStr: '15'))
        timeout (time: 1, unit: 'HOURS')
        timestamps()
        skipDefaultCheckout()
    }

    parameters {
        booleanParam(name: 'DEBUG',
               defaultValue: false,
               description: 'Print extra outputs for debugging the jenkins job and yetus')
        // the hbase and hadoop versions listed here need to match the matrix axes in the test
        // section. it's not currently possible to reuse a single array for both purposes.
        choice(name: 'HBASE_VERSION',
               choices: ['all', '2.2.6', '2.3.3'],
               description: 'HBase releases to test. default is everything in the list.')
        choice(name: 'HADOOP_VERSION',
               choices: ['all', '3.2.1', '2.10.0'],
               description: 'Hadoop versions to run each hbase version on. default is everything in the list.')
    }

    environment {
        SRC_REL = 'src'
        PATCH_REL = 'output'
        YETUS_REL = 'yetus'
        // Branch or tag name.  Yetus release tags are 'rel/X.Y.Z'
        YETUS_VERSION = 'rel/0.12.0'
        DOCKERFILE_REL = "${SRC_REL}/dev-support/jenkins/Dockerfile"
        YETUS_DRIVER_REL = "${SRC_REL}/dev-support/jenkins/jenkins_precommit_github_yetus.sh"
        ARCHIVE_PATTERN_LIST = '*.dump'
        SET_JAVA_HOME = '/usr/local/openjdk-8'
        PLUGINS = 'all'
    }


    stages {
        stage ('precommit checks') {
            when {
                changeRequest()
            }
            environment {
                WORKDIR_REL = 'yetus-precommit-check'
                WORKDIR = "${WORKSPACE}/${WORKDIR_REL}"
                SOURCEDIR = "${WORKDIR}/${SRC_REL}"
                PATCHDIR = "${WORKDIR}/${PATCH_REL}"
                DOCKERFILE = "${WORKDIR}/${DOCKERFILE_REL}"
                YETUS_DRIVER = "${WORKDIR}/${YETUS_DRIVER_REL}"
                YETUSDIR = "${WORKDIR}/${YETUS_REL}"
                BUILD_URL_ARTIFACTS = "artifact/${WORKDIR_REL}/${PATCH_REL}"
            }
            steps {
                dir("${SOURCEDIR}") {
                    checkout scm
                }
                dir("${YETUSDIR}") {
                    checkout([
                      $class           : 'GitSCM',
                      branches         : [[name: "${YETUS_VERSION}"]],
                      userRemoteConfigs: [[url: 'https://github.com/apache/yetus.git']]]
                    )
                }
                dir("${WORKDIR}") {
                    withCredentials([
                      usernamePassword(
                        credentialsId: 'apache-hbase-at-github.com',
                        passwordVariable: 'GITHUB_PASSWORD',
                        usernameVariable: 'GITHUB_USER'
                      )]) {
                        sh label: 'test-patch', script: '''#!/bin/bash -e
                            printenv 2>&1 | sort
                            echo "[INFO] Launching Yetus via ${YETUS_DRIVER}"
                            "${YETUS_DRIVER}"
                        '''
                    }
                }
            }
            post {
                always {
                    // Has to be relative to WORKSPACE.
                    archiveArtifacts artifacts: "${WORKDIR_REL}/${PATCH_REL}/*", excludes: "${WORKDIR_REL}/${PATCH_REL}/precommit"
                    archiveArtifacts artifacts: "${WORKDIR_REL}/${PATCH_REL}/**/*", excludes: "${WORKDIR_REL}/${PATCH_REL}/precommit/**/*"
                    publishHTML target: [
                      allowMissing: true,
                      keepAll: true,
                      alwaysLinkToLastBuild: true,
                      // Has to be relative to WORKSPACE
                      reportDir: "${WORKDIR_REL}/${PATCH_REL}",
                      reportFiles: 'report.html',
                      reportName: 'PR General Check Report'
                    ]
                }
                // Jenkins pipeline jobs fill slaves on PRs without this :(
                cleanup() {
                    script {
                        sh label: 'Cleanup workspace', script: '''#!/bin/bash -e
                            # See YETUS-764
                            if [ -f "${PATCHDIR}/pidfile.txt" ]; then
                              echo "test-patch process appears to still be running: killing"
                              kill `cat "${PATCHDIR}/pidfile.txt"` || true
                              sleep 10
                            fi
                            if [ -f "${PATCHDIR}/cidfile.txt" ]; then
                              echo "test-patch container appears to still be running: killing"
                              docker kill `cat "${PATCHDIR}/cidfile.txt"` || true
                            fi
                            # See HADOOP-13951
                            chmod -R u+rxw "${WORKSPACE}"
                        '''
                        dir ("${WORKDIR}") {
                            deleteDir()
                        }
                    }
                }
            }
        }
        stage ('noop htrace drop in') {
            when {
                anyOf {
                    changeset "hbase-noop-htrace/**"
                    changeset "dev-support/jenkins/Jenkinsfile"
                }
            }
            tools {
                // this needs to be set to the jdk that ought to be used to build releases on the branch the Jenkinsfile is stored in.
                jdk "jdk_1.8_latest"
            }
            stages {
                stage ('setup') {
                    tools {
                        maven 'maven_latest'
                    }
                    environment {
                        WORKDIR = "${WORKSPACE}/htrace-noop"
                        CACHE_DIR = "${WORKSPACE}/cache"
                    }
                    steps {
                        dir ("htrace-noop") {
                            dir ("component") {
                                echo 'Build the htrace replacement artifact.'
                                checkout scm
                                sh 'mvn -DskipTests -pl hbase-noop-htrace clean package'
                            }
                            dir ("tools") {
                                echo 'Downloading enabling scripts from main hbase repo.'
                                sh '''#!/usr/bin/env bash
                                    set -oe
                                    declare script
                                    declare -a needed_files
                                    needed_files=( \
                                        hbase_nightly_pseudo-distributed-test.sh \
                                        jenkins-scripts/cache-apache-project-artifact.sh \
                                    )
                                    for script in "${needed_files[@]}"; do
                                        curl -L -O https://raw.githubusercontent.com/apache/hbase/HEAD/dev-support/"${script}"
                                        chmod +x "$(basename "${script}")"
                                    done
                                '''
                            }
                            stash name: 'scripts', includes: "tools/hbase_nightly_pseudo-distributed-test.sh"
                            dir ("hbase") {
                                script {
                                    def hbase_versions = [ params.HBASE_VERSION ]
                                    if (params.HBASE_VERSION == 'all') {
                                        // this set needs to match the matrix axes below
                                        hbase_versions = [ '2.2.6', '2.3.3' ]
                                    }
                                    hbase_versions.each {
                                        def hbase_version = it
                                        sh """#!/usr/bin/env bash
                                            set -e
                                            set -x
                                            mkdir -p "downloads/hbase-${hbase_version}"
                                            mkdir -p "${CACHE_DIR}"
                                            echo 'downloading hbase version ${hbase_version}'
                                            '${WORKDIR}/tools/cache-apache-project-artifact.sh' \
                                                    --working-dir '${WORKDIR}/hbase/downloads/hbase-${hbase_version}' \
                                                    --keys 'https://downloads.apache.org/hbase/KEYS' \
                                                    '${CACHE_DIR}/hbase-${hbase_version}-bin.tar.gz' \
                                                    'hbase/${hbase_version}/hbase-${hbase_version}-bin.tar.gz'
                                            mkdir 'hbase-${hbase_version}'
                                            declare noop_htrace
                                            noop_htrace="\$(ls -1 '${WORKDIR}/component/hbase-noop-htrace/target/'hbase-noop-htrace-*.jar | head -n 1)"
                                            if [ -z "\${noop_htrace}" ]; then
                                              echo "failed to find htrace noop replacement. did building step work?" >&2
                                              exit 1
                                            fi
                                            '${WORKDIR}/component/dev-support/jenkins/swap_htrace_jar.sh' '${WORKDIR}/hbase/hbase-${hbase_version}' '${CACHE_DIR}/hbase-${hbase_version}-bin.tar.gz' "\${noop_htrace}"
                                        """
                                        stash name: "hbase-${hbase_version}", includes: "hbase-${hbase_version}/**"
                                    }
                                }
                            }
                            dir ("hadoop") {
                                script {
                                    def hadoop_versions = [ params.HADOOP_VERSION ]
                                    if (params.HADOOP_VERSION == 'all') {
                                        // this set needs to match the matrix axes below
                                        hadoop_versions = [ '3.2.1', '2.10.0']
                                    }
                                    hadoop_versions.each {
                                        def hadoop_version = it
                                        sh """#!/usr/bin/env bash
                                            set -e
                                            set -x
                                            mkdir -p "downloads/hadoop-${hadoop_version}"
                                            mkdir -p "${CACHE_DIR}"
                                            echo "downloading hadoop version ${hadoop_version}"
                                            "${WORKDIR}/tools/cache-apache-project-artifact.sh" \
                                                    --working-dir "${WORKDIR}/hadoop/downloads/hadoop-${hadoop_version}" \
                                                    --keys 'https://downloads.apache.org/hadoop/common/KEYS' \
                                                    "${CACHE_DIR}/hadoop-${hadoop_version}-bin.tar.gz" \
                                                    "hadoop/common/hadoop-${hadoop_version}/hadoop-${hadoop_version}.tar.gz"
                                            mkdir "hadoop-${hadoop_version}"
                                            declare noop_htrace
                                            noop_htrace="\$(ls -1 "${WORKDIR}"/component/hbase-noop-htrace/target/hbase-noop-htrace-*.jar | head -n 1)"
                                            if [ -z "\${noop_htrace}" ]; then
                                              echo "failed to find htrace noop replacement. did building step work?" >&2
                                              exit 1
                                            fi
                                            '${WORKDIR}/component/dev-support/jenkins/swap_htrace_jar.sh' "${WORKDIR}/hadoop/hadoop-${hadoop_version}" "${CACHE_DIR}/hadoop-${hadoop_version}-bin.tar.gz" "\${noop_htrace}"
                                        """
                                        stash name: "hadoop-${hadoop_version}", includes: "hadoop-${hadoop_version}/**"
                                    }
                                }
                            }
                        }
                    }
                    post {
                        cleanup {
                            // clean up the working area but don't delete the download cache
                            dir ("htrace-noop") {
                                deleteDir()
                            }
                        }
                    }
                }
                stage ("test htrace drop in replacement") {
                    matrix {
                        agent {
                            label 'hbase'
                        }
                        axes {
                            axis {
                                name 'HBASE'
                                values '2.2.6', '2.3.3'
                            }
                            axis {
                                name 'HADOOP'
                                values '3.2.1', '2.10.0'
                            }
                        }
                        when {
                            allOf {
                                anyOf {
                                    expression { params.HBASE_VERSION == 'all' }
                                    expression { params.HBASE_VERSION == env.HBASE }
                                }
                                anyOf {
                                    expression { params.HADOOP_VERSION == 'all' }
                                    expression { params.HADOOP_VERSION == env.HADOOP }
                                }
                            }
                        }
                        stages {
                            stage ("test a specific hbase on a specific hadoop") {
                                steps {
                                    unstash 'scripts'
                                    unstash "hbase-${env.HBASE}"
                                    unstash "hadoop-${env.HADOOP}"
                                    sh '''#!/usr/bin/env bash
                                        set -eo
                                        set -x
                                        mkdir -p "hbase-${HBASE}.hadoop-${HADOOP}"
                                        ./tools/hbase_nightly_pseudo-distributed-test.sh \
                                                --single-process \
                                                --working-dir "hbase-${HBASE}.hadoop-${HADOOP}" \
                                                "hbase-${HBASE}" \
                                                "hadoop-${HADOOP}/bin/hadoop" \
                                                "hadoop-${HADOOP}"/share/hadoop/yarn/timelineservice \
                                                "hadoop-${HADOOP}"/share/hadoop/yarn/test/hadoop-yarn-server-tests-*-tests.jar \
                                                "hadoop-${HADOOP}"/share/hadoop/mapreduce/hadoop-mapreduce-client-jobclient-*-tests.jar \
                                                "hadoop-${HADOOP}"/bin/mapred \
                                    '''
                                }
                                post {
                                    failure {
                                        sh '''#!/usr/bin/env bash
                                            set -eo
                                            set -x
                                            find "hbase-${HBASE}.hadoop-${HADOOP}" \
                                                    "hbase-${HBASE}" "hadoop-${HADOOP}" \
                                                    -type d -name logs | \
                                                    xargs zip -r "hbase-${HBASE}.hadoop-${HADOOP}.logs.zip"
                                        '''
                                        archiveArtifacts artifacts: "hbase-${env.HBASE}.hadoop-${env.HADOOP}.logs.zip"
                                    }
                                    cleanup {
                                        deleteDir()
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }

    post {
        // Jenkins pipeline jobs fill slaves on PRs without this :(
        cleanup {
            script {
                sh label: 'Cleanup workspace', script: '''#!/bin/bash -e
                    # See HADOOP-13951
                    chmod -R u+rxw "${WORKSPACE}"
                '''
            }
            // we purposefully don't do a top level workspace cleanup so that we can reuse downloads
        }
    }
}
