String[] TARGETS = ["4.8", "4",
                    "6.13.1", "6",
                    "7.5", "7",
                    "8.0.0", "8",
                    "9.10.1", "9",
                    "10.0.0", "10",
                    "11.4.0", "11",
                    "12.0.0", "12",
                    "13.0.0", "13",
                    "8.0.0-alpine", "8-alpine",
                    "9.10.1-alpine", "9-alpine",
                    "10-alpine", "11-alpine", "12-alpine", "13-alpine"]

Object RUNNING_TARGETS = [:]
TARGETS.each { it ->
    RUNNING_TARGETS.putAt(it, { test it })
}
RUNNING_TARGETS.putAt("nightly_v10", { tryTest("v10", "vdeturckheim/node_nightly") })
RUNNING_TARGETS.putAt("nightly_v12", { tryTest("v12", "vdeturckheim/node_nightly") })
RUNNING_TARGETS.putAt("nightly_v13", { tryTest("v13", "vdeturckheim/node_nightly") })
RUNNING_TARGETS.putAt("nightly_v14", { tryTest("v14", "vdeturckheim/node_nightly") })
RUNNING_TARGETS.putAt("nightly_v14-v8-canary", { tryTest("v14-v8-canary", "vdeturckheim/node_nightly") })

RUNNING_TARGETS.putAt("v10-rc", { tryTest("v10-rc", "vdeturckheim/node_nightly") })
RUNNING_TARGETS.putAt("v12-rc", { tryTest("v12-rc", "vdeturckheim/node_nightly") })
RUNNING_TARGETS.putAt("v13-rc", { tryTest("v13-rc", "vdeturckheim/node_nightly") })
RUNNING_TARGETS.putAt("v14-rc", { tryTest("v14-rc", "vdeturckheim/node_nightly") })

RUNNING_TARGETS.putAt("nightly_v14-v8-canary", { tryTest("v14-v8-canary", "vdeturckheim/node_nightly") })

def runInAWS(String version, String base_image = "node") {

    withCredentials([[
                             $class: 'AmazonWebServicesCredentialsBinding',
                             credentialsId: 'integration_tests_aws',
                             accessKeyVariable: 'AWS_ACCESS_KEY_ID',
                             secretKeyVariable: 'AWS_SECRET_ACCESS_KEY'
                     ], string(credentialsId: 'NODE_DOCKER_TOKEN', variable: 'NODE_DOCKER_TOKEN')]) {

        awsCodeBuild \
                awsAccessKey: env.AWS_ACCESS_KEY_ID, \
                awsSecretKey: env.AWS_SECRET_ACCESS_KEY, \
                buildSpecFile: 'buildspec.yml', \
                credentialsType: 'keys', \
                envVariables: "[ { NODE_VERSION, ${version} }, { BASE_IMAGE, ${base_image} }, { NODE_DOCKER_TOKEN, ${env.NODE_DOCKER_TOKEN} } ]", \
                projectName: "sqreen-agent-nodejs", \
                region: 'eu-west-1', \
                sourceControlType: 'jenkins',
                exceptionFailureMode: 'ENABLED'
    }
}

def tryTest(String version, String base_image = "node", flacky = false) {

    stage("test (${base_image} ${version})") {

        try {
            retry(3) {
                runInAWS(version, base_image)
            }
        }
        catch (e) {
            print e
            if (!flacky) {
                currentBuild.result = "FAILED"
                throw e
            }
        }
    }
}
def test(String version, String base_image = "node") {
    stage("test (${base_image} ${version})") {
        tryTest(version, base_image)
    }
}

node('master') {

    stage('SCM') {
        checkout scm
    }

    stage('test') {
        parallel RUNNING_TARGETS
    }
}
