/**
 * Utility to build docker images based in gradle projects
 *
 * This extends gradle's 'application' plugin logic with a 'distDocker' task which builds
 * a docker image from the Dockerfile of the project that applies this file. The image
 * is automatically tagged and pushed if a tag and/or a registry is given.
 *
 * Parameters that can be set on project level:
 * - dockerImageName (required): The name of the image to build (e.g. controller)
 * - dockerRegistry (optional): The registry to push to
 * - dockerImageTag (optional, default 'latest'): The tag for the image
 * - dockerImagePrefix (optional, default 'whisk'): The prefix for the image,
 *       'controller' becomes 'whisk/controller' per default
 * - dockerTimeout (optional, default 840): Timeout for docker operations in seconds
 * - dockerRetries (optional, default 3): How many times to retry docker operations
 * - dockerBinary (optional, default 'docker'): The binary to execute docker commands
 * - dockerBuildArgs (options, default ''): Project specific custom docker build arguments
 * - dockerHost (optional): The docker host to run commands on, default behaviour is
 *       docker's own DOCKER_HOST environment variable
 */

ext {
    dockerRegistry = project.hasProperty('dockerRegistry') ? dockerRegistry + '/' : ''
    dockerImageTag = project.hasProperty('dockerImageTag') ? dockerImageTag : 'latest'
    dockerImagePrefix = project.hasProperty('dockerImagePrefix') ? dockerImagePrefix : 'whisk'
    dockerTimeout = project.hasProperty('dockerTimeout') ? dockerTimeout.toInteger() : 840
    dockerRetries = project.hasProperty('dockerRetries') ? dockerRetries.toInteger() : 3
    dockerBinary = project.hasProperty('dockerBinary') ? [dockerBinary] : ['docker']
    dockerBuildArg = ['build']
}
ext.dockerTaggedImageName = dockerRegistry + dockerImagePrefix + '/' + dockerImageName + ':' + dockerImageTag

if(project.hasProperty('dockerHost')) {
    dockerBinary += ['--host', project.dockerHost]
}

if(project.hasProperty('dockerBuildArgs')) {
    dockerBuildArg += ['--build-arg', project.dockerBuildArgs]
}

task distDocker << {
    def cmd = dockerBinary + dockerBuildArg + ['-t', dockerImageName, project.buildscript.sourceFile.getParentFile().getAbsolutePath()]
    retry(cmd, dockerRetries, dockerTimeout)
}
task tagImage << {
    def cmd = dockerBinary + ['tag', '-f', dockerImageName, dockerTaggedImageName]
    retry(cmd, dockerRetries, dockerTimeout)
}
task pushImage << {
    def cmd = dockerBinary + ['push', dockerTaggedImageName]
    retry(cmd, dockerRetries, dockerTimeout)
}
pushImage.dependsOn tagImage
pushImage.onlyIf { dockerRegistry != '' }
distDocker.finalizedBy pushImage

def retry(cmd, retries, timeout) {
    println("Executing '${cmd.join(" ")}'")
    def proc = cmd.execute()
    proc.consumeProcessOutput(System.out, System.err)
    proc.waitForOrKill(timeout * 1000)
    if(proc.exitValue() != 0) {
        def message = "Command '${cmd.join(" ")}' failed with exitCode ${proc.exitValue()}"
        if(proc.exitValue() == 143) { // 143 means the process was killed (SIGTERM signal)
            message = "Command '${cmd.join(" ")}' was killed after ${timeout} seconds"
        }

        if(retries > 1) {
            println("${message}, ${retries-1} retries left, retrying...")
            retry(cmd, retries-1, timeout)
        }
        else {
            println("${message}, no more retries left, aborting...")
            throw new GradleException(message)
        }
    }
}
