adding azul openjdk 10 to all images (#144)

* adding azul openjdk 10 to all images

* add the binary packages to the images and file existence +
version tests (same as currently pinned in bazel repo)

* add srcs for openJDK to images 

* add new runtimes for jdk10 to ubuntu1604 and debian8 latest configs
diff --git a/configs/debian8_clang/0.3.0/BUILD b/configs/debian8_clang/0.3.0/BUILD
index b576449..d189dba 100644
--- a/configs/debian8_clang/0.3.0/BUILD
+++ b/configs/debian8_clang/0.3.0/BUILD
@@ -14,12 +14,23 @@
 
 package(default_visibility = ["//visibility:public"])
 
+load(
+    "//third_party/openjdk:revision.bzl",
+    "JDK_VERSION",
+)
+
 java_runtime(
     name = "jdk8",
     srcs = [],
     java_home = "/usr/lib/jvm/java-8-openjdk-amd64",
 )
 
+java_runtime(
+    name = "jdk10",
+    srcs = [],
+    java_home = "/usr/lib/jvm/zulu" + JDK_VERSION + "-linux_x64-allmodules",
+)
+
 # Latest RBE Debian8 container.
 # Update every time when a new container is released.
 alias(
diff --git a/configs/ubuntu16_04_clang/1.0/BUILD b/configs/ubuntu16_04_clang/1.0/BUILD
index 0d911b8..27ce5df 100644
--- a/configs/ubuntu16_04_clang/1.0/BUILD
+++ b/configs/ubuntu16_04_clang/1.0/BUILD
@@ -14,12 +14,23 @@
 
 package(default_visibility = ["//visibility:public"])
 
+load(
+    "//third_party/openjdk:revision.bzl",
+    "JDK_VERSION",
+)
+
 java_runtime(
     name = "jdk8",
     srcs = [],
     java_home = "/usr/lib/jvm/java-8-openjdk-amd64",
 )
 
+java_runtime(
+    name = "jdk10",
+    srcs = [],
+    java_home = "/usr/lib/jvm/zulu" + JDK_VERSION + "-linux_x64-allmodules",
+)
+
 # Latest RBE Ubuntu16_04 container
 # Update every time when a new container is released.
 alias(
diff --git a/container/common/BUILD b/container/common/BUILD
index 4596d46..badda5a 100644
--- a/container/common/BUILD
+++ b/container/common/BUILD
@@ -26,6 +26,11 @@
     "//third_party/golang:revision.bzl",
     "GOLANG_REVISION",
 )
+load(
+    "//third_party/openjdk:revision.bzl",
+    "JDK_VERSION",
+    "JDK_VERSION_DECODED",
+)
 
 genrule(
     name = "generate_clang_yaml",
@@ -40,3 +45,12 @@
     outs = ["go.yaml"],
     cmd = "sed 's|{_GOLANG_REVISION}|" + GOLANG_REVISION + "|' <$< >$@",
 )
+
+genrule(
+    name = "generate_java_yaml",
+    srcs = ["java.yaml.tpl"],
+    outs = ["java.yaml"],
+    cmd = (
+        "sed 's|{_JDK_VERSION}|" + JDK_VERSION + "|g; s|{_JDK_VERSION_DECODED}|" + JDK_VERSION_DECODED + "|g' <$< >$@"
+    ),
+)
diff --git a/container/common/java.yaml b/container/common/java.yaml
deleted file mode 100644
index b45e0c1..0000000
--- a/container/common/java.yaml
+++ /dev/null
@@ -1,22 +0,0 @@
-schemaVersion: "2.0.0"
-
-commandTests:
-- name: 'java-version'
-  command: 'java'
-  args: ['-version']
-  # java outputs to stderr.
-  expectedError: ["openjdk version \"1.8.*"]
-- name: 'check-openssl'
-  command: 'openssl'
-  args: ['version']
-  expectedOutput: ['OpenSSL .*']
-
-fileExistenceTests:
-- name: 'OpenJDK'
-  path: '/usr/lib/jvm/java-8-openjdk-amd64'
-  shouldExist: true
-
-metadataTest:
-  env:
-    - key: 'JAVA_HOME'
-      value: '/usr/lib/jvm/java-8-openjdk-amd64'
diff --git a/container/common/java.yaml.tpl b/container/common/java.yaml.tpl
new file mode 100644
index 0000000..cfff8b6
--- /dev/null
+++ b/container/common/java.yaml.tpl
@@ -0,0 +1,33 @@
+schemaVersion: "2.0.0"
+
+commandTests:
+- name: 'java-version'
+  command: 'java'
+  args: ['-version']
+  # java outputs to stderr.
+  expectedError: ["openjdk version \"1.8.*"]
+- name: 'java10-version'
+  command: '/usr/lib/jvm/zulu{_JDK_VERSION_DECODED}-linux_x64-allmodules/bin/java'
+  args: ['-version']
+  # java outputs to stderr.
+  expectedError: ["openjdk version \"10.*"]
+- name: 'check-openssl'
+  command: 'openssl'
+  args: ['version']
+  expectedOutput: ['OpenSSL .*']
+
+fileExistenceTests:
+- name: 'OpenJDK'
+  path: '/usr/lib/jvm/java-8-openjdk-amd64'
+  shouldExist: true
+- name: 'OpenJDK 10'
+  path: '/usr/lib/jvm/zulu{_JDK_VERSION_DECODED}-linux_x64-allmodules'
+  shouldExist: true
+- name: 'OpenJDK 10 srcs'
+  path: '/usr/src/jdk/zsrc{_JDK_VERSION}.zip'
+  shouldExist: true
+
+metadataTest:
+  env:
+    - key: 'JAVA_HOME'
+      value: '/usr/lib/jvm/java-8-openjdk-amd64'
diff --git a/container/debian8/builders/rbe-debian8/BUILD b/container/debian8/builders/rbe-debian8/BUILD
index a0c9d32..1c76b34 100644
--- a/container/debian8/builders/rbe-debian8/BUILD
+++ b/container/debian8/builders/rbe-debian8/BUILD
@@ -64,6 +64,7 @@
         "//container/debian8/layers/clang:clang-ltl",
         "//container/debian8/layers/go:go-ltl",
         "//container/debian8/layers/java:java-ltl",
+        "//container/debian8/layers/java:java10-ltl",
         "//container/debian8/layers/python:python-ltl",
     ],
 )
diff --git a/container/debian8/layers/java/BUILD b/container/debian8/layers/java/BUILD
index f564a16..e2da70e 100644
--- a/container/debian8/layers/java/BUILD
+++ b/container/debian8/layers/java/BUILD
@@ -47,3 +47,12 @@
         "/usr/bin/java": "/usr/lib/jvm/java-8-openjdk-amd64/jre/bin/java",
     },
 )
+
+language_tool_layer(
+    name = "java10-ltl",
+    base = "@debian8//image",
+    tars = [
+        "//third_party/openjdk:open_jdk_tar",
+        "//third_party/openjdk:open_jdk_src_tar",
+    ],
+)
diff --git a/container/experimental/rbe-debian9/BUILD b/container/experimental/rbe-debian9/BUILD
index 03e03d6..cf819e1 100644
--- a/container/experimental/rbe-debian9/BUILD
+++ b/container/experimental/rbe-debian9/BUILD
@@ -55,6 +55,7 @@
         "clang-ltl",
         "go-ltl",
         "java-ltl",
+        "java10-ltl",
         "python-ltl",
     ],
 )
@@ -127,6 +128,15 @@
 )
 
 language_tool_layer(
+    name = "java10-ltl",
+    base = "@debian9//image",
+    tars = [
+        "//third_party/openjdk:open_jdk_tar",
+        "//third_party/openjdk:open_jdk_src_tar",
+    ],
+)
+
+language_tool_layer(
     name = "python-ltl",
     additional_repos = [
         "deb http://httpredir.debian.org/debian testing main",
diff --git a/container/ubuntu16_04/builders/bazel/BUILD b/container/ubuntu16_04/builders/bazel/BUILD
index 8926dd4..63fd334 100644
--- a/container/ubuntu16_04/builders/bazel/BUILD
+++ b/container/ubuntu16_04/builders/bazel/BUILD
@@ -37,6 +37,7 @@
     language_layers = [
         "//container/ubuntu16_04/layers/clang:clang-ltl",
         "//container/ubuntu16_04/layers/java:java-ltl",
+        "//container/ubuntu16_04/layers/java:java10-ltl",
         "//container/ubuntu16_04/layers/python:python-ltl",
         "//container/ubuntu16_04/layers/bazel:bazel-tools",
         "//container/ubuntu16_04/layers/bazel:bazel_%s-ltl" % bazel_version,
diff --git a/container/ubuntu16_04/builders/bazel_docker_gcloud/BUILD b/container/ubuntu16_04/builders/bazel_docker_gcloud/BUILD
index 5120013..db218e6 100644
--- a/container/ubuntu16_04/builders/bazel_docker_gcloud/BUILD
+++ b/container/ubuntu16_04/builders/bazel_docker_gcloud/BUILD
@@ -37,6 +37,7 @@
     language_layers = [
         "//container/ubuntu16_04/layers/clang:clang-ltl",
         "//container/ubuntu16_04/layers/java:java-ltl",
+        "//container/ubuntu16_04/layers/java:java10-ltl",
         "//container/ubuntu16_04/layers/python:python-ltl",
         "//container/ubuntu16_04/layers/bazel:bazel-tools",
         "//container/ubuntu16_04/layers/bazel:bazel_%s-ltl" % bazel_version,
diff --git a/container/ubuntu16_04/builders/rbe-ubuntu16_04/BUILD b/container/ubuntu16_04/builders/rbe-ubuntu16_04/BUILD
index 29c6f6e..23e7cb5 100644
--- a/container/ubuntu16_04/builders/rbe-ubuntu16_04/BUILD
+++ b/container/ubuntu16_04/builders/rbe-ubuntu16_04/BUILD
@@ -66,6 +66,7 @@
         "//container/ubuntu16_04/layers/clang:clang-ltl",
         "//container/ubuntu16_04/layers/go:go-ltl",
         "//container/ubuntu16_04/layers/java:java-ltl",
+        "//container/ubuntu16_04/layers/java:java10-ltl",
         "//container/ubuntu16_04/layers/python:python-ltl",
     ],
 )
diff --git a/container/ubuntu16_04/layers/java/BUILD b/container/ubuntu16_04/layers/java/BUILD
index f6435a4..de95efc 100644
--- a/container/ubuntu16_04/layers/java/BUILD
+++ b/container/ubuntu16_04/layers/java/BUILD
@@ -44,3 +44,12 @@
         "/usr/bin/java": "/usr/lib/jvm/java-8-openjdk-amd64/jre/bin/java",
     },
 )
+
+language_tool_layer(
+    name = "java10-ltl",
+    base = "@ubuntu16_04//image",
+    tars = [
+        "//third_party/openjdk:open_jdk_tar",
+        "//third_party/openjdk:open_jdk_src_tar",
+    ],
+)
diff --git a/repositories/repositories.bzl b/repositories/repositories.bzl
index 0aaa122..26d66f4 100644
--- a/repositories/repositories.bzl
+++ b/repositories/repositories.bzl
@@ -36,6 +36,12 @@
     "UBUNTU16_04_LIBCXX_SHA256",
 )
 load(
+    "//third_party/openjdk:revision.bzl",
+    "JDK_VERSION",
+    "OPENJDK_SHA256",
+    "OPENJDK_SRC_SHA256",
+)
+load(
     "//container/ubuntu16_04/layers/bazel:version.bzl",
     "BAZEL_VERSION_SHA256S",
 )
@@ -176,3 +182,18 @@
                     "https://github.com/bazelbuild/bazel/releases/download/" + bazel_version + "/bazel-" + bazel_version + "-installer-linux-x86_64.sh",
                 ],
             )
+
+    # ============================ Azul OpenJDK packages ============================
+    if "azul_open_jdk" not in excludes:
+        native.http_file(
+            name = "azul_open_jdk",
+            sha256 = OPENJDK_SHA256,
+            urls = ["https://mirror.bazel.build/openjdk/azul-zulu" + JDK_VERSION + "/zulu" + JDK_VERSION + "-linux_x64-allmodules.tar.gz"],
+        )
+
+    if "azul_open_jdk_src" not in excludes:
+        native.http_file(
+            name = "azul_open_jdk_src",
+            sha256 = OPENJDK_SRC_SHA256,
+            urls = ["https://mirror.bazel.build/openjdk/azul-zulu" + JDK_VERSION + "/zsrc" + JDK_VERSION + ".zip"],
+        )
diff --git a/third_party/openjdk/BUILD b/third_party/openjdk/BUILD
new file mode 100644
index 0000000..5b5c0be
--- /dev/null
+++ b/third_party/openjdk/BUILD
@@ -0,0 +1,44 @@
+# 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.
+
+# This BUILD file is used for installing clang.tar.gz into /usr/local
+# of debian8-clang-fully-loaded container. The clang.tar.gz file was
+# downloaded by gsutil_cp rule in the WORKSPACE file, and contains
+# the same compiled clang binary as in
+# https://console.cloud.google.com/launcher/details/google/clang-debian8
+
+licenses(["notice"])  # Apache 2.0
+
+package(default_visibility = ["//visibility:public"])
+
+load("@bazel_tools//tools/build_defs/pkg:pkg.bzl", "pkg_tar")
+
+pkg_tar(
+    name = "open_jdk_tar",
+    package_dir = "/usr/lib/jvm/",
+    strip_prefix = ".",
+    tags = ["manual"],
+    deps = [
+        "@azul_open_jdk//file",
+    ],
+)
+
+pkg_tar(
+    name = "open_jdk_src_tar",
+    srcs = [
+        "@azul_open_jdk_src//file",
+    ],
+    package_dir = "/usr/src/jdk/",
+    tags = ["manual"],
+)
diff --git a/third_party/openjdk/revision.bzl b/third_party/openjdk/revision.bzl
new file mode 100644
index 0000000..bdefd5b
--- /dev/null
+++ b/third_party/openjdk/revision.bzl
@@ -0,0 +1,10 @@
+JDK_VERSION = "10.2%2B3-jdk10.0.1"
+
+# JDK version 10 includes a '+' sign, so we need to keep track of the
+# version with both encodings for the java.yaml test.
+# TODO: remove for future versions of Java that do not need it
+JDK_VERSION_DECODED = "10.2+3-jdk10.0.1"
+
+OPENJDK_SHA256 = "57fad3602e74c79587901d6966d3b54ef32cb811829a2552163185d5064fe9b5"
+
+OPENJDK_SRC_SHA256 = "0ab6c7a1a8fc32992bcec4d7c77a587c02b8816f67bcb7d16154a60de2dce8a4"