#!/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')
    }
    options {
        timeout(time: 16, unit: 'HOURS')
        ansiColor('xterm')
    }
    environment {
        OPENSHIFT_URL="https://github.com/openshift/origin/releases/download/v3.11.0/openshift-origin-client-tools-v3.11.0-0cbc58b-linux-64bit.tar.gz"
        // Workaround for skip flaky tests
        MVN_ARGS="-Dfailsafe.rerunFailingTestsCount=5"

        ARTIFACTS_DIR = 'systemtest/target/logs'
        JOB_NAME_SUB = "${String.format("%.15s", JOB_NAME).toLowerCase()}"
    }
    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
                    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 "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="localhost: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.setupEnvironment(env.WORKSPACE, env.OPENSHIFT_URL)
                    }
                }
            }
        }
        stage('Build project') {
            steps {
                script {
                    sh "mvn clean install -DskipTests"
                }
            }
        }
        stage('Build images') {
            when {
                environment name: 'TEST_ONLY', value: 'false'
            }
            steps {
                script {
                    lib.buildStrimziImages()
                }
            }
        }
        stage('Execute system tests') {
            steps {
                script {
                    lib.runSystemTests(env.WORKSPACE, env.TEST_CASE, env.TEST_PROFILE)
                }
            }
        }
    }
    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)
            }
        }
    }
}
