catchError {

    def combine = { lst -> lst.inject([]) { acc, x -> acc + x } }

    def params = [
        string(name: "TITLE", value: "release-4.0-fault-injection"),
        string(name: "IMAGE", value: "hub.pingcap.net/qa/jepsen-control:stable"),
        string(name: "TARBALL_URL", value: "http://fileserver.pingcap.net/download/pingcap/qa/archives/jepsen/tidb-release-4.0.tar.gz"),
        booleanParam(name: "REPORT", value: true),
    ]

    def plist = []

    def run = { ->
        def nemesis = [
            [string(name: "NEMESIS", value: "none")],
            [string(name: "NEMESIS", value: "shuffle-leader,shuffle-region,partition-one")],
        ]
        [[params], nemesis, plist].combinations().collect(combine).each {
            try {
                build(job: "jepsen-test", parameters: it)
            } catch (e) {
                echo("Error: $e")
            }
        }
    }

    // bank
    plist = []
    plist.addAll([[
        [string(name: "WORKLOAD", value: "bank")],
        [string(name: "WORKLOAD", value: "bank-multitable")],
    ], [
        [string(name: "TXN_MODE", value: "pessimistic"), string(name: "ISOLATION", value: "read-committed")],
    ], [
        [booleanParam(name: "UPDATE_IN_PLACE", value: true)],
        [booleanParam(name: "UPDATE_IN_PLACE", value: false)],
    ]].combinations().collect(combine))
    run()

    // txn-cycle
    plist = []
    plist.addAll([[
        [string(name: "WORKLOAD", value: "txn-cycle")],
    ], [
        [string(name: "TXN_MODE", value: "pessimistic"), string(name: "ISOLATION", value: "read-committed")],
    ], [
        [booleanParam(name: "USE_INDEX", value: true)],
        [booleanParam(name: "USE_INDEX", value: false)],
    ]].combinations().collect(combine))
    run()


    // set
    plist = []
    plist.addAll([[
        [string(name: "WORKLOAD", value: "set")],
    ], [
        [string(name: "TXN_MODE", value: "pessimistic"), string(name: "ISOLATION", value: "read-committed")],
    ], [
        [string(name: "READ_LOCK", value: "")],
        [string(name: "READ_LOCK", value: "update")],
    ]].combinations().collect(combine))
    run()

    // append
    plist = []
    plist.addAll([[
        [string(name: "WORKLOAD", value: "append")],
    ], [
        [string(name: "TXN_MODE", value: "pessimistic"), string(name: "ISOLATION", value: "read-committed")],
    ]].combinations().collect(combine))
    run()

}
