# Copyright 2015 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.

# Creation of the docker container for the jenkins master.

load("@bazel_tools//tools/build_defs/docker:docker.bzl", "docker_build")
load(":templates.bzl", "merge_files", "strip_suffix")
load(":vars.bzl", "MAIL_SUBSTITUTIONS")

def _build_jobs_impl(ctx):
  output = ctx.outputs.out
  folders_to_create = {}
  args = [
    "--output=" + output.path,
    "--mode=0644",
    "--directory=/usr/share/jenkins/ref/jobs",
    ]
  suffixes = ctx.attr.strip_suffixes
  # Group fob by folders
  for f in ctx.files.jobs:
    if f.owner and "/" in f.owner.name:
      segments = f.owner.name.split("/")
      for i in range(1, len(segments)):
        folders_to_create["/jobs/".join(segments[:i])] = True
      p = strip_suffix(f.owner.name.replace("/", "/jobs/"), suffixes)
      args.append("--file=%s=%s/config.xml" % (f.path, p))
    else:
      p = strip_suffix(f.basename[:-len(f.extension)-1], suffixes)
      args.append("--file=%s=%s/config.xml" % (f.path, p))

  for folder in folders_to_create:
    args.append("--file=%s=%s/config.xml" % (ctx.file._folder_xml.path, folder))

  ctx.action(
      executable = ctx.executable._build_tar,
      arguments = args,
      inputs = ctx.files.jobs + [ctx.file._folder_xml],
      outputs = [output],
      mnemonic="TarJobs"
      )

_build_jobs = rule(
    attrs = {
        "jobs": attr.label_list(allow_files=True),
        "strip_suffixes": attr.string_list(default=["-staging", "-test"]),
        "_folder_xml": attr.label(
            default=Label("//jenkins/build_defs:folder.xml"),
            allow_files=True,
            single_file=True),
        "_build_tar": attr.label(
            default=Label("@bazel_tools//tools/build_defs/pkg:build_tar"),
            cfg="host",
            executable=True,
            allow_files=True),
    },
    outputs = {"out": "%{name}.tar"},
    implementation = _build_jobs_impl,
)


def jenkins_docker_build(name, plugins = None, base = "//jenkins/base", configs = [],
                  jobs = [], substitutions = {}, visibility = None, tars = []):
  """Build the docker image for the Jenkins instance."""
  substitutions = substitutions + MAIL_SUBSTITUTIONS
  # Expands config files in a tar ball
  merge_files(
      name = "%s-configs" % name,
      srcs = configs,
      directory = "/usr/share/jenkins/ref",
      strip_prefixes = [
          "jenkins/config",
          "jenkins",
      ],
      substitutions = substitutions)
  tars += ["%s-configs" % name]

  # Create the structures for jobs
  _build_jobs(name=name + "-jobs", jobs=jobs)
  tars += ["%s-jobs" % name]

  ### FINAL IMAGE ###
  docker_build(
      name = name,
      tars = tars,
      # Workaround no way to specify owner in pkg_tar
      # TODO(dmarting): use https://cr.bazel.build/10255 when it hits a release.
      user = "root",
      entrypoint = [
          "/bin/tini",
          "--",
          "/bin/bash",
          "-c",
          "[ -d /opt/lib ] && chown -R jenkins /opt/lib; su jenkins -c /usr/local/bin/jenkins.sh",
      ],
      # End of workaround
      base = base,
      directory = "/",
      visibility = visibility,
  )
