properties([
    parameters([
        string(name: 'SUITE_FILE', defaultValue: 'cases/regression/suite.jsonnet', description: '', trim: true),
        string(name: 'SELECTOR', defaultValue: '.cases[].name', description: '', trim: true),
        string(name: 'CASES', defaultValue: '', description: '', trim: true),
        string(name: 'IMAGE', defaultValue: 'hub.pingcap.net/qa/utf-python:dev', 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_FILE}")
        container("suite") {
            sh("cp -r /automated-tests automated-tests")
            dir('automated-tests') {
                if (params.MANIFEST) {
                    sh("chown -R 1000:1000 ./")
                    writeFile(file: params.SUITE_FILE, text: params.MANIFEST)
                }

                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 = "python -m cases.cli info -i ${params.SUITE_FILE} | jq -r '${params.SELECTOR}' | xargs python -m cases.cli run -i ${params.SUITE_FILE} $args"
                if (params.CASES) { runSuite = "python -m cases.cli run -i ${params.SUITE_FILE} $args ${params.CASES}" }

                try {
                    withCredentials([usernameColonPassword(credentialsId: "result-store", variable: "AUTH")]) { sh(runSuite) }
                } finally {
                    archiveArtifacts(artifacts: 'logs/*.log', allowEmptyArchive: true)
                }
            }
        }
    }
}

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) { body() } }
}

catchError {
    run("test-utf-python", params.IMAGE) { main(params.IMAGE) }
}
