#!/usr/bin/env groovy

def lib

pipeline {
    agent {
        node {
            label 'strimzi-pr'
        }
    }
    parameters {
        string(name: 'TEST_CASE', defaultValue: '*ST', description: 'maven parameter for executing specific tests')
        string(name: 'TEST_PROFILE', defaultValue: 'acceptance', description: 'maven parameter for executing specific test profile')
        string(name: 'EXCLUDE', defaultValue: 'networkpolicies', description: 'maven parameter for exclude specific test tag')
    }
    options {
        timeout(time: 22, unit: 'HOURS')
        ansiColor('xterm')
    }
    environment {
        ARTIFACTS_DIR = 'systemtest/target/logs'
        JOB_NAME_SUB = "${String.format("%.15s", JOB_NAME).toLowerCase()}"
        ORIGIN_BASE_DIR = "${env.WORKSPACE}/origin/"
        KUBE_CONFIG_PATH = "${env.WORKSPACE}/origin/kube-apiserver/admin.kubeconfig"
    }
    stages {
        stage('Clean WS') {
            steps {
                cleanWs()
            }
        }
        stage('Checkout Strimzi') {
            steps {
                checkout scm
            }
        }
        stage('Parse parameters from comment') {
            steps {
                script {
                    echo "Comment body: ${env.ghprbCommentBody}"
                    env.TEST_CASE = params.TEST_CASE
                    env.TEST_PROFILE = params.TEST_PROFILE
                    env.EXCLUDE_GROUPS = params.EXCLUDE
                    if (env.ghprbCommentBody.contains('testcase=')) {
                        env.TEST_CASE = env.ghprbCommentBody.split('testcase=')[1].split(/\s/)[0]
                    }
                    echo "TEST_CASE: ${env.TEST_CASE}"
                    if (env.ghprbCommentBody.contains('profile=')) {
                        env.TEST_PROFILE = env.ghprbCommentBody.split('profile=')[1].split(/\s/)[0]
                    }
                    echo "EXCLUDE_GROUPS: ${env.EXCLUDE_GROUPS}"
                    if (env.ghprbCommentBody.contains('exclude=')) {
                        env.EXCLUDE_GROUPS = env.ghprbCommentBody.split('exclude=')[1].split(/\s/)[0]
                        env.EXCLUDE_GROUPS = env.EXCLUDE_GROUPS + ",networkpolicies"
                    }
                    echo "TEST_PROFILE: ${env.TEST_PROFILE}"
                    if (env.ghprbCommentBody.contains('test_only')) {
                        env.TEST_ONLY = true
                        env.DOCKER_REGISTRY = "docker.io"
                        env.DOCKER_ORG="strimzi"
                        env.DOCKER_TAG = "latest"
                    } else {
                        env.TEST_ONLY = false
                        env.DOCKER_ORG="strimzi"
                        env.DOCKER_REGISTRY="172.30.1.1:5000"
                        env.DOCKER_TAG="pr"
                    }
                    echo "TEST_ONLY: ${env.TEST_ONLY}"
                    echo "DOCKER_REGISTRY: ${env.DOCKER_REGISTRY}"
                    echo "DOCKER_ORG: ${env.DOCKER_ORG}"
                    echo "DOCKER_TAG: ${env.DOCKER_TAG}"
                }
            }
        }
        stage('Start Openshift') {
            steps {
                timeout(time: 25, unit: 'MINUTES') {
                    script {
                        lib = evaluate readFile('./jenkins.groovy')
                        lib.startOrigin()
                    }
                }
            }
        }
        stage('Build project') {
            steps {
                script {
                    withMaven(mavenOpts: '-Djansi.force=true') {
                        sh "mvn clean install -DskipTests -Dstyle.color=always --no-transfer-progress"
                    }
                }
            }
        }
        stage('Build images') {
            when {
                environment name: 'TEST_ONLY', value: 'false'
            }
            steps {
                script {
                    lib.buildStrimziImages()
                }
            }
        }
        stage('Execute system tests') {
            steps {
                script {
                    catchError {
                        lib.runSystemTests(env.WORKSPACE, env.TEST_CASE, env.TEST_PROFILE, env.EXCLUDE_GROUPS)
                    }
                }
            }
        }
    }
    post {
        always {
            script {
                sh "sudo ./systemtest/scripts/results_info.sh ./systemtest/target/failsafe-reports/ ${env.TEST_CASE} ${env.TEST_PROFILE}"
                lib.postGithubPrComment("results.json")
                lib.postAction(env.ARTIFACTS_DIR, env.ghprbPullId, env.ghprbActualCommitAuthor, env.ghprbPullTitle, env.ghprbPullLink, env.BUILD_URL, env.WORKSPACE, env.STRIMZI_MAILING_LIST)
            }
        }
        failure {
            echo "Build failed"
            script {
                lib.sendMail(env.STRIMZI_MAILING_LIST, "failed", env.ghprbPullId, env.ghprbActualCommitAuthor, env.ghprbPullTitle, env.ghprbPullLink, env.BUILD_URL)
            }
        }
    }
}
