properties([
    parameters([
        choice(name: 'SUITE', choices: ["transaction", "rowformat", "ticdc", "gcworker", "readpool"], description: ''),
        string(name: 'TAG', defaultValue: 'dev', description: '', trim: true),
        string(name: 'SELECTOR', defaultValue: '.cases[].name', description: '', trim: true),
        string(name: 'CASES', defaultValue: '', description: '', trim: true),
        string(name: 'IMAGE', defaultValue: '', description: '', trim: true),
        text(name: 'MANIFEST', defaultValue: '', description: ''),
        string(name: 'ANNOTATIONS', defaultValue: '', description: '', trim: true),
        booleanParam(name: 'REPORT', defaultValue: false, description: ''),
    ])
])

def main(image) {
    stage("Test") {
        echo("Run ${params.SUITE} suite")
        container("suite") {
            if (params.MANIFEST) {
                writeFile(file: "suite.jsonnet", text: params.MANIFEST)
            } else {
                sh("cp /suite.jsonnet ./")
            }

            def args = "$ANNOTATIONS"
            args += " --annotation suite.image=$image"
            args += " --annotation jenkins.build=$BUILD_URL"
            args += " --annotation jenkins.started_at=${new Date(currentBuild.startTimeInMillis).format("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'")}"
            if (params.REPORT) { args += " --report-to http://\$AUTH@result-store-es-http.test-infra.svc:9200/tests/_doc/" }


            def runSuite = "/${params.SUITE} info | jq -r '${params.SELECTOR}' | xargs /${params.SUITE} run $args"
            if (params.CASES) { runSuite = "/${params.SUITE} run $args ${params.CASES}" }

            withCredentials([usernameColonPassword(credentialsId: "result-store", variable: "AUTH")]) { sh(runSuite) }
        }
    }
}

def run(label, image, Closure body) {
    podTemplate(name: label, label: label, instanceCap: 5, serviceAccount: 'utf-runner', containers: [
        containerTemplate(name: 'suite', image: image, alwaysPullImage: true, ttyEnabled: true, command: 'cat'),
    ]) { node(label) { dir(params.SUITE) { body() } } }
}

catchError {
    def image = params.IMAGE
    if (image == "") {
        image = "hub.pingcap.net/qa/utf-go-${params.SUITE}"
        if (params.TAG) { image += ":" + params.TAG }
    }

    run("test-utf-go-${params.SUITE}", image) { main(image) }
}
