import groovy.json.JsonSlurperClassic

def schrEndpoint = 'http://schrodinger.pingcap.net/api'
def k8sNodeIP = "172.16.4.4"
def resourcePoolConfigFile = "resource-pool-config.yaml"
def valuesFile = "values.yaml"
def label = "execute-once-simple-cases"

def generateResoucePoolFile(file, nodeIP, nodePort) {
    def content = """---
staticDBPool:
  - host: $nodeIP
    port: $nodePort
    user: root
    pass: ''
    type: TiDB
    tags: ['$release']
"""
    writeFile(file: file, text: content, encoding: "UTF-8")
}

def generateValuesFile(file) {
    def content = """---
casesDir: cases/
"""
    writeFile(file: file, text: content, encoding: "UTF-8")
}

def notifyBuild(status) {
    if (status == null) {
        status = "SUCCESS"
    }
    def msg = """Job Name: ${env.JOB_NAME}
Build Number: ${env.BUILD_NUMBER}
Build Status: $status
Build URL: ${env.BUILD_URL}
"""
    slackSend(message: msg)
}

podTemplate(name: label, label: label, instanceCap: 5, idleMinutes: 60,
                containers: [
                    containerTemplate(name: 'builder', image: 'hub.pingcap.net/jenkins/centos7_golang-1.12', ttyEnabled: true, command: 'cat',
                                      resourceRequestCpu: '4000m', resourceRequestMemory: '8Gi', resourceLimitCpu: '8000m', resourceLimitMemory: '16Gi'),
                ]) {
    node(label) {
        try {
            container("builder") {
                stage("build once") {
                    withCredentials([usernamePassword(credentialsId: "qa-jenkins-repo", passwordVariable:'pass', usernameVariable: 'user')]) {
                        sh "ls qa && rm -rf qa || echo 'do not need to remove qa'"
                        sh "git clone https://$user:$pass@github.com/pingcap/qa"
                    }
                    dir("qa/once/common") {
                        sh "rm -rf go.mod go.sum"
                        sh "go mod init github.com/pingcap/qa/once/common && go mod tidy"
                    }
                    dir("qa/once/test-framework") {
                        sh "rm -rf go.mod go.sum"
                        sh "go mod init github.com/pingcap/qa/once/test-framework && go mod tidy"
                        sh "go mod edit -replace=github.com/pingcap/qa/once/common=../common"
                    }
                    dir("qa/once/resource-pool") {
                        sh "rm -rf go.mod go.sum"
                        sh "go mod init github.com/pingcap/qa/once/resource-pool && go mod tidy"
                        sh "go mod edit -replace=github.com/pingcap/qa/once/common=../common"
                    }
                    dir("qa/once/testkit") {
                        sh "rm -rf go.mod go.sum"
                        sh "go mod init github.com/pingcap/qa/once/tools/testkit && go mod tidy"
                        sh "go mod edit -replace=github.com/pingcap/qa/once/common=../common"
                        sh "go mod edit -replace=github.com/pingcap/qa/once/test-framework=../test-framework"
                    }
                    dir("qa/once") {
                        sh "make"
                    }
                }
                stage("start resource pool") {
                    dir("qa/once/build") {
                        script {
                            def response = httpRequest consoleLogResponseBody: true, validResponseCodes: '200', url: "$schrEndpoint/cats/$cat_id"
                            def res = new JsonSlurperClassic().parseText(response.content)
                            def nodePort = res.data.report.cluster.tidb_service.node_port
                            generateResoucePoolFile(resourcePoolConfigFile, k8sNodeIP, nodePort)
                            sh "nohup timeout 1m bin/resource-pool -c $resourcePoolConfigFile &"
                        }
                    }
                }
                stage("execute once simple cases") {
                    dir("qa/once/build") {
                        script {
                            generateValuesFile(valuesFile)
                            sh "RESOURCE_POOL_ENDPOINT=http://127.0.0.1:8080 bin/testkit run --template conf/template.yaml --values $valuesFile"
                            sh 'tail -n+3 report.json | jq \'"\\(.labels.issue)"+",\\(.pass)"+",\\(.skip)"\' | sed \'s/,/","/g\''
                        }
                    }
                }
            }
        } catch (e) {
            currentBuild.result = "FAILURE"
            throw e
        } finally {
            notifyBuild(currentBuild.result)
        }
    }
}
