# Copyright 2017 The Bazel Authors. All rights reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#    http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

# Setup jenkins and build the corresponding docker images

load("@io_bazel_rules_docker//docker:docker.bzl", "docker_build")
load(":templates.bzl", "expand_template")

JENKINS_SERVER = "http://jenkins:80"

def jenkins_node(name, remote_fs = "/home/ci", num_executors = 1, mode = "NORMAL",
                 labels = [], docker_base = None, visibility = None,
                 tunnel = None):
  """Create a node configuration on Jenkins, with possible docker image.

  Args:
    name: Name of the node on Jenkins.
    remote_fs: path to the home of the Jenkins user.
    num_executors: number of executors (i.e. concurrent build) this machine can have.
    mode: NORMAL for "Utilize this node as much as possible"
      EXCLUSIVE for "Only build jobs with label restrictions matching this node"
    labels: list of Jenkins labels for this node (the node name is always added).
    docker_base: base for the corresponding docker image to create if we should create one
      (if docker_base is not specified, then a corresponding machine should be configured
      to connect to the Jenkins master).
    visibility: rule visibility.
  """
  if tunnel:
    tunnel = "<tunnel>%s</tunnel>" % tunnel
  else:
    tunnel = ""
  native.genrule(
      name = name,
      cmd = """cat >$@ <<'EOF'
<?xml version='1.0' encoding='UTF-8'?>
<slave>
  <name>%s</name>
  <description></description>
  <remoteFS>%s</remoteFS>
  <numExecutors>%s</numExecutors>
  <mode>%s</mode>
  <retentionStrategy class="hudson.slaves.RetentionStrategy$$Always"/>
  <launcher class="hudson.slaves.JNLPLauncher">%s</launcher>
  <label>%s</label>
</slave>
EOF
""" % (name, remote_fs, num_executors, mode, tunnel, " ".join([name] + labels)),
      outs = ["nodes/%s/config.xml" % name],
      visibility = visibility,
      )
  if docker_base:
    # Generate docker image startup script
    expand_template(
        name = name + ".docker-launcher",
        out = name + ".docker-launcher.sh",
        template = "slave_setup.sh",
        substitutions = {
            "NODE_NAME": name,
            "HOME_FS": remote_fs,
            "JENKINS_SERVER": JENKINS_SERVER,
            },
        executable = True,
        )
    # Generate docker image
    docker_build(
        name = name + ".docker",
        base = docker_base,
        volumes = [remote_fs],
        files = [":%s.docker-launcher.sh" % name],
        data_path = ".",
        entrypoint = [
            "/bin/bash",
            "/%s.docker-launcher.sh" % name,
        ],
        visibility = visibility,
        )
