#!groovy

pipeline {
    agent any
    parameters {
        string(name: 'INTEGRATION_SUITE', defaultValue: 'e2e', description: 'the suite to run for integration test')
        string(name: 'PROJECT', defaultValue: 'e2e', description: 'the dbaas central project to run e2e')
    }

    options {
        disableConcurrentBuilds()
    }

    environment {
        GOPATH = "/home/jenkins/agent/workspace/pr-check/go"
        GITHUB_BOT = credentials("github-sre-bot")
        GOPRIVATE="github.com/tidbcloud"
        STAGE = "stability"
        AWS_ROLE_ARN = credentials("dbaas-stability-aws-role")
        REGION = "us-west-2"
        AWS_DEFAULT_REGION = "us-west-2"
    }

    stages {
        stage('Check') {
            agent {
                kubernetes {
                    label "dbaas-builder"
                    defaultContainer "main"
                    customWorkspace "/home/jenkins/agent/workspace/pr-check/go/src/github.com/pingcap/dbaas"
                }
            }
            stages {
                stage('E2E') {
                    environment {
                        PROJECT = "${params.PROJECT}"
                        SUITE = "${params.INTEGRATION_SUITE}"
                        ENV = "${env.STAGE}"
                        KUBECONFIG = credentials("dbaas-${env.STAGE}-kubeconfig")
                        IMAGE_TAG = sh(returnStdout: true, script: "git rev-parse HEAD").trim()
                    }
                    stages {
                        stage('Prepare') {
                            environment {
                                PULUMI_CONFIG_PASSPHRASE = credentials("dbaas-${env.STAGE}-pulumi-pwd")
                            }
                            steps {
                                sh '''
                                echo "machine github.com login ${GITHUB_BOT_USR} password ${GITHUB_BOT_PSW}" > ~/.netrc
                                ./hack/prepare-e2e.sh
                                '''
                            }
                        }
                        stage('Run') {
                            environment {
                                AUTH0_CLIENT_ID = credentials("dbaas-auth0-client-id")
                                AUTH0_CLIENT_SECRET = credentials("dbaas-auth0-client-secret")
                                GCP_WORKLOAD_IDENTITY_AUDIENCE = "mock"
                                GCP_IMPERSONATE_SA = "mock"
                            }
                            steps {
                                runE2E()
                            }
                        }
                    }
                }
            }
            post {
                unsuccessful {
                    script {
                        sendNotification("#dbaas-ci", 'FAILURE')
                    }
                }
                success {
                    script {
                        sendNotification("#dbaas-ci", 'SUCCESS')
                    }
                }
            }
        }
    }
}

def runE2E() {
    def ARTIFACTS = "${env.WORKSPACE}/artifacts"
    def builds = [:]
    builds["AWS"] = {
        e2e("./hack/e2e.sh aws us-west-2", "${ARTIFACTS}/aws")
    }
    builds["GCP"] = {
        e2e('PATH=$PATH:/root/google-cloud-sdk/bin ./hack/e2e.sh gcp us-west1', "${ARTIFACTS}/gcp")
    }
    builds.failFast = true
    parallel builds
}

def e2e(SHELL_CODE, ARTIFACTS) {
    sh """#!/bin/bash
    export REPORT_DIR=${ARTIFACTS}
    ${SHELL_CODE}
    """
    dir("${ARTIFACTS}") {
        archiveArtifacts artifacts: "**", allowEmptyArchive: true
        junit testResults: "*.xml", allowEmptyResults: true
    }
}

def sendNotification(CHANNEL="#dbaas-ci", STATUS="SUCCESS") {
    def GIT_AUTHOR_NAME = sh(returnStdout: true, script: "git log -1 --pretty=format:'%an'").trim()
    def GIT_COMMIT_MSG = sh(returnStdout: true, script: "git log --oneline -n 1 --pretty=%B HEAD | head -n 1").trim()
    def slackmsg = "[<${env.RUN_DISPLAY_URL}|DBaaS Master CI>] `${STATUS}`" + "\n" +
            "Commit: <https://github.com/tidbcloud/dbaas/commit/${env.GIT_COMMIT}|${GIT_COMMIT_MSG}>" + "\n" +
            "Branch: `${env.GIT_BRANCH}`, Authored by: `${GIT_AUTHOR_NAME}`"
    def COLOR = 'good'
    if (STATUS != "SUCCESS") {
        COLOR = 'danger'
    }
    if (env.GIT_BRANCH == "master") {
        slackSend channel: CHANNEL, color: COLOR, teamDomain: 'pingcap', tokenCredentialId: 'slack-pingcap-token', message: "${slackmsg}"
    }
}
