[docker] Add sonobuoy multiarch image build 62/1062/3
authorAlexandru Avadanii <Alexandru.Avadanii@enea.com>
Tue, 25 Jun 2019 15:46:42 +0000 (17:46 +0200)
committerAlexandru Avadanii <Alexandru.Avadanii@enea.com>
Thu, 27 Jun 2019 18:33:07 +0000 (20:33 +0200)
Upstream sonobuoy lacks 2 images for AArch64 architecture, so build
our own multiarch amd64 (x86_64) + arm64 (AArch64) images for:
- sonobuoy-plugin-systemd-logs (tag version 'latest');
- kube-conformance (tag version 'v1.11');

The new images will be pushed to Dockerhub as:
- akraino/validation:sonobuoy-plugin-systemd-logs-latest
- akraino/validation:kube-conformance-v1.11

Since upstream Dockerfiles require small changes for AArch64 support,
implement a new patching mechanism via new make targets in
`docker/build.mk`:
- .submodules_init
  * initializes the (newly added) git submodules in this repository
    and pulls the pinned-down commit for each submodule;
- .submodules_patched
  * Applies patches found in the `patches` and/or `patches/<arch>`
    subdirectories for each submodule (using `git am -3`), so we can
    apply AArch64-specific changes only on arm64 platforms;
- .submodules_clean
  * Un-applies patches by resetting each git submodule to its
    pinned-down commit;

To add support for pre-build actions like submodules init + patching,
turn `.build` make target into a double-colon target and extend it
for the two new containers accordingly.

To prevent tox verify failures, adjust ui .eslintrc and tox.ini to
remove the git submodules first (second one being a temporary
workaround until ci-management allows configuring verify jobs with
git submodule handling disabled).

JIRA: VAL-24

Change-Id: Ibfeb3551e44e82fdade2886985ca4577b7d32522
Signed-off-by: Alexandru Avadanii <Alexandru.Avadanii@enea.com>
12 files changed:
.gitignore
.gitmodules [new file with mode: 0644]
docker/README.rst
docker/build.mk
docker/kube-conformance/Makefile [new file with mode: 0644]
docker/kube-conformance/kube-conformance [new submodule]
docker/kube-conformance/patches/aarch64/0001-Dockerfile-Makefile-Add-AArch64-support.patch [new file with mode: 0644]
docker/sonobuoy-plugin-systemd-logs/Makefile [new file with mode: 0644]
docker/sonobuoy-plugin-systemd-logs/patches/aarch64/0001-Dockerfile-AArch64-support.patch [new file with mode: 0644]
docker/sonobuoy-plugin-systemd-logs/sonobuoy-plugin-systemd-logs [new submodule]
tox.ini
ui/src/main/webapp/.eslintrc

index e83e681..2d802ce 100644 (file)
@@ -49,3 +49,5 @@ pmd-bin-6.15.0*
 !/.coafile
 !/ui/src/main/webapp/.eslintrc
 
 !/.coafile
 !/ui/src/main/webapp/.eslintrc
 
+# git submodule patching mechanism local artifacts
+.submodules_*
diff --git a/.gitmodules b/.gitmodules
new file mode 100644 (file)
index 0000000..a51136e
--- /dev/null
@@ -0,0 +1,8 @@
+[submodule "sonobuoy-plugin-systemd-logs"]
+       path = docker/sonobuoy-plugin-systemd-logs/sonobuoy-plugin-systemd-logs
+       url = https://github.com/heptio/sonobuoy-plugin-systemd-logs
+       branch = master
+[submodule "kube-conformance"]
+       path = docker/kube-conformance/kube-conformance
+       url = https://github.com/heptio/kube-conformance
+       branch = master
index 3a979af..34e7641 100644 (file)
@@ -78,7 +78,7 @@ enter the container, add */bin/sh* at the end of the command above
 
 
 The postgresql container
 
 
 The postgresql container
-=================
+========================
 
 Building and pushing the container
 ----------------------------------
 
 Building and pushing the container
 ----------------------------------
@@ -87,26 +87,28 @@ To build just the postgresql container, use the command:
 
 .. code-block:: console
 
 
 .. code-block:: console
 
-   make postgresql-build [ REGISTRY=<dockerhub_registry> NAME=<image_name>]
+    make postgresql-build [ REGISTRY=<dockerhub_registry> NAME=<image_name>]
 
 To both build and push the container, use the command:
 
 .. code-block:: console
 
 
 To both build and push the container, use the command:
 
 .. code-block:: console
 
-   make postgresql [ REGISTRY=<dockerhub_registry> NAME=<image_name>]
+    make postgresql [ REGISTRY=<dockerhub_registry> NAME=<image_name>]
 
 Using the container
 -------------------
 
 Using the container
 -------------------
+
 If you want to deploy the container, you can run the corresponding deploy.sh script with the appropriate parameters.
 
 Example:
 
 .. code-block:: console
 If you want to deploy the container, you can run the corresponding deploy.sh script with the appropriate parameters.
 
 Example:
 
 .. code-block:: console
+
     ./deploy.sh POSTGRES_PASSWORD=password
 
 
 The ui container
     ./deploy.sh POSTGRES_PASSWORD=password
 
 
 The ui container
-=================
+================
 
 Building and pushing the container
 ----------------------------------
 
 Building and pushing the container
 ----------------------------------
@@ -116,20 +118,104 @@ Then use the command:
 
 .. code-block:: console
 
 
 .. code-block:: console
 
-   make ui-build [ REGISTRY=<dockerhub_registry> NAME=<image_name>]
+    make ui-build [ REGISTRY=<dockerhub_registry> NAME=<image_name>]
 
 To both build and push the container, use the command:
 
 .. code-block:: console
 
 
 To both build and push the container, use the command:
 
 .. code-block:: console
 
-   make ui [ REGISTRY=<dockerhub_registry> NAME=<image_name>]
+    make ui [ REGISTRY=<dockerhub_registry> NAME=<image_name>]
 
 Using the container
 -------------------
 
 Using the container
 -------------------
+
 If you want to deploy the container, you can run the corresponding deploy.sh script with the appropriate parameters.
 Note, that you must also build and run the postgresql container for a functional UI.
 
 Example:
 
 .. code-block:: console
 If you want to deploy the container, you can run the corresponding deploy.sh script with the appropriate parameters.
 Note, that you must also build and run the postgresql container for a functional UI.
 
 Example:
 
 .. code-block:: console
+
     ./deploy.sh postgres_db_user_pwd=password jenkins_url=http://192.168.2.2:8080 jenkins_user_name=name jenkins_user_pwd=jenkins_pwd jenkins_job_name=job1 nexus_results_url=https://nexus.akraino.org/content/sites/logs proxy_ip=172.28.40.9 proxy_port=3128
     ./deploy.sh postgres_db_user_pwd=password jenkins_url=http://192.168.2.2:8080 jenkins_user_name=name jenkins_user_pwd=jenkins_pwd jenkins_job_name=job1 nexus_results_url=https://nexus.akraino.org/content/sites/logs proxy_ip=172.28.40.9 proxy_port=3128
+
+The kube-conformance container
+==============================
+
+Building and pushing the container
+----------------------------------
+
+To build just the kube-conformance container, use the command:
+
+.. code-block:: console
+
+    make kube-conformance-build [ REGISTRY=<dockerhub_registry> NAME=<image_name>]
+
+To both build and push the container, use the command:
+
+.. code-block:: console
+
+    make kube-conformance [ REGISTRY=<dockerhub_registry> NAME=<image_name>]
+
+Using the container
+-------------------
+
+This is a standalone container able to launch Kubernetes end-to-end tests,
+for the purposes of conformance testing.
+
+It is a thin wrapper around the `e2e.test` binary in the upstream Kubernetes
+distribution, which drops results in a predetermined location for use as a
+[Heptio Sonobuoy](https://github.com/heptio/sonobuoy) plugin.
+
+To learn more about conformance testing and its Sonobuoy integration, read the
+[conformance guide](https://github.com/heptio/sonobuoy/blob/master/docs/conformance-testing.md).
+
+Example:
+
+.. code-block:: console
+
+    docker run -ti akraino/validation:kube-conformance-v1.11
+
+By default, the container will run the `run_e2e.sh` script. If you want to
+enter the container, add */bin/sh* at the end of the command above
+
+Normally, this conainer is not used directly, but instead leveraged via
+sonobuoy.
+
+The sonobuoy-plugin-systemd-logs container
+==========================================
+
+Building and pushing the container
+----------------------------------
+
+To build just the sonobuoy-plugin-systemd-logs container, use the command:
+
+.. code-block:: console
+
+    make sonobuoy-plugin-systemd-logs-build [ REGISTRY=<dockerhub_registry> NAME=<image_name>]
+
+To both build and push the container, use the command:
+
+.. code-block:: console
+
+    make sonobuoy-plugin-systemd-logs [ REGISTRY=<dockerhub_registry> NAME=<image_name>]
+
+Using the container
+-------------------
+
+This is a simple standalone container that gathers log information from
+systemd, by chrooting into the node's filesystem and running `journalctl`.
+
+This container is used by [Heptio Sonobuoy](https://github.com/heptio/sonobuoy)
+for gathering host logs in a Kubernetes cluster.
+
+Example:
+
+.. code-block:: console
+
+    docker run -ti akraino/validation:sonobuoy-plugin-systemd-logs-latest
+
+By default, the container will run the `get_systemd_logs.sh` script. If you
+want to enter the container, add */bin/sh* at the end of the command above.
+
+Normally, this conainer is not used directly, but instead leveraged via
+sonobuoy.
index 988f2a9..2f7d398 100644 (file)
 # limitations under the License.                                             #
 ##############################################################################
 
 # limitations under the License.                                             #
 ##############################################################################
 
-
 # declare the variables
 REGISTRY ?= akraino
 NAME ?= validation
 TAG_PRE ?= $(notdir $(CURDIR))
 TAG_VER ?= latest
 DOCKERFILE ?= Dockerfile
 # declare the variables
 REGISTRY ?= akraino
 NAME ?= validation
 TAG_PRE ?= $(notdir $(CURDIR))
 TAG_VER ?= latest
 DOCKERFILE ?= Dockerfile
+WORK_DIR ?= $(CURDIR)
 MTOOL ?= $(dir $(realpath $(lastword $(MAKEFILE_LIST))))/manifest-tool
 
 MTOOL ?= $(dir $(realpath $(lastword $(MAKEFILE_LIST))))/manifest-tool
 
+# git submodule & patch locations for upstream patching before build
+GIT_ROOT    := $(shell git rev-parse --show-toplevel)
+GIT_DIR     := $(shell git rev-parse --git-dir)
+PATCH_DIR   := $(shell pwd)/patches
+AKRAINO_TAG := akraino-validation
+SHELL        = /bin/sh
+PATCHES      = $(shell find $(PATCH_DIR) $(PATCH_DIR)/$$(uname -m) \
+                 -maxdepth 1 -name '*.patch' 2> /dev/null)
+
+export GIT_COMMITTER_NAME?=Akraino Validation
+export GIT_COMMITTER_EMAIL?=validation@akraino.org
+
 # get the architecture of the host
 HOST_ARCH = amd64
 ifeq ($(shell uname -m), aarch64)
 # get the architecture of the host
 HOST_ARCH = amd64
 ifeq ($(shell uname -m), aarch64)
@@ -34,7 +46,8 @@ $(MTOOL):
        sudo chmod +x $@
 
 .PHONY: .build
        sudo chmod +x $@
 
 .PHONY: .build
-.build:
+.build::
+       cd $(WORK_DIR) && \
        docker build \
                -t $(REGISTRY)/$(NAME):$(TAG_PRE)-$(HOST_ARCH)-$(TAG_VER) \
                -f $(DOCKERFILE) \
        docker build \
                -t $(REGISTRY)/$(NAME):$(TAG_PRE)-$(HOST_ARCH)-$(TAG_VER) \
                -f $(DOCKERFILE) \
@@ -50,3 +63,31 @@ $(MTOOL):
                --platforms linux/amd64,linux/arm64 \
                --template $(REGISTRY)/$(NAME):$(TAG_PRE)-ARCH-$(TAG_VER) \
                --target $(REGISTRY)/$(NAME):$(TAG_PRE)-$(TAG_VER)
                --platforms linux/amd64,linux/arm64 \
                --template $(REGISTRY)/$(NAME):$(TAG_PRE)-ARCH-$(TAG_VER) \
                --target $(REGISTRY)/$(NAME):$(TAG_PRE)-$(TAG_VER)
+
+.submodules_init:
+       cd $(GIT_ROOT) && git submodule update --init 2>/dev/null; \
+       touch $@
+
+.submodules_patched: .submodules_init $(PATCHES)
+       $(MAKE) .submodules_clean
+       @cd $(GIT_ROOT) && git submodule -q foreach ' \
+               if [ $$name = $$(basename $(TAG_PRE)) ] && [ -n "$(PATCHES)" ]; then \
+                       git tag $(AKRAINO_TAG)-upstream && \
+                       git checkout -q -b akraino-validation && \
+                       echo "`tput setaf 2`-- patching $$name`tput sgr0`";\
+                       git am -3 --ignore-whitespace --patch-format=mbox \
+                               --committer-date-is-author-date $(PATCHES) && \
+                       git tag $(AKRAINO_TAG) || exit 1; \
+               fi'; \
+       touch $@
+
+.PHONY: .submodules_clean
+.submodules_clean:
+       @cd $(GIT_ROOT) && git submodule -q foreach ' \
+               git am -q --abort > /dev/null 2>&1; \
+               git checkout -q -f $(AKRAINO_TAG)-upstream > /dev/null 2>&1; \
+               git branch -q -D akraino-validation > /dev/null 2>&1; \
+               git tag | grep $(AKRAINO_TAG) | xargs git tag -d > /dev/null 2>&1; \
+               git reset -q --hard HEAD; \
+               git clean -xdff'
+       @rm -f .submodules_patched
diff --git a/docker/kube-conformance/Makefile b/docker/kube-conformance/Makefile
new file mode 100644 (file)
index 0000000..a5b5b99
--- /dev/null
@@ -0,0 +1,30 @@
+##############################################################################
+# Copyright (c) 2019 AT&T, ENEA AB, Nokia and others                         #
+#                                                                            #
+# Licensed under the Apache License, Version 2.0 (the "License");            #
+# you maynot 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.                                             #
+##############################################################################
+
+export WORK_DIR?=$(TAG_PRE)
+export TAG_VER?=v1.11
+
+.PHONY: .build
+.build:: .submodules_patched
+       $(MAKE) -C $(TAG_PRE) e2e.test kubectl ginkgo
+
+.PHONY: all
+all: .push_image .push_manifest
+
+.PHONY: build
+build: .build
+
+include ../build.mk
diff --git a/docker/kube-conformance/kube-conformance b/docker/kube-conformance/kube-conformance
new file mode 160000 (submodule)
index 0000000..32d9e2a
--- /dev/null
@@ -0,0 +1 @@
+Subproject commit 32d9e2a4edd5c354c97da0d1bd308473bf4f0c89
diff --git a/docker/kube-conformance/patches/aarch64/0001-Dockerfile-Makefile-Add-AArch64-support.patch b/docker/kube-conformance/patches/aarch64/0001-Dockerfile-Makefile-Add-AArch64-support.patch
new file mode 100644 (file)
index 0000000..770f6bd
--- /dev/null
@@ -0,0 +1,55 @@
+From: Alexandru Avadanii <Alexandru.Avadanii@enea.com>
+Date: Tue, 25 Jun 2019 17:59:13 +0200
+Subject: [PATCH] Dockerfile, Makefile: Add AArch64 support
+
+Signed-off-by: Alexandru Avadanii <Alexandru.Avadanii@enea.com>
+---
+ Dockerfile | 6 ++++--
+ Makefile   | 8 +++++---
+ 2 files changed, 9 insertions(+), 5 deletions(-)
+
+diff --git a/Dockerfile b/Dockerfile
+index 289ac88..102685d 100644
+--- a/Dockerfile
++++ b/Dockerfile
+@@ -13,10 +13,12 @@
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+
+-FROM buildpack-deps:jessie-scm
++FROM arm64v8/buildpack-deps:jessie-scm
+ MAINTAINER Timothy St. Clair "tstclair@heptio.com"
+
+-RUN apt-get update && apt-get -y --no-install-recommends install \
++RUN echo 'Acquire::Check-Valid-Until "0";' > /etc/apt/apt.conf.d/10no--check-valid-until \
++    && sed -i -e '/security/s/^/#/g' -e 's|deb.debian.org/debian|snapshot.debian.org/archive/debian/20190301T035241Z|g' /etc/apt/sources.list \
++    && apt-get update && apt-get -y --no-install-recommends install \
+     ca-certificates \
+     && rm -rf /var/cache/apt/* \
+     && rm -rf /var/lib/apt/lists/*
+diff --git a/Makefile b/Makefile
+index 4335cfd..bdaa52c 100644
+--- a/Makefile
++++ b/Makefile
+@@ -29,6 +29,8 @@ is_root=$(filter 0,$(shell id -u))
+ DOCKER?=$(if $(or $(in_docker_group),$(is_root)),docker,sudo docker)
+ DIR := ${CURDIR}
+
++export KUBERNETES_SERVER_ARCH=arm64
++
+ .PHONY: all container getbins clean
+
+ all: container
+@@ -47,9 +49,9 @@ _cache/.getbins.$(kube_version_full).timestamp:
+                                         KUBERNETES_DOWNLOAD_TESTS=true \
+                                         KUBERNETES_SKIP_CONFIRM=true ./kubernetes/cluster/get-kube-binaries.sh
+       mv _cache/$(kube_version_full)/kubernetes/cluster ./
+-      mv _cache/$(kube_version_full)/kubernetes/platforms/linux/amd64/e2e.test ./
+-      mv _cache/$(kube_version_full)/kubernetes/platforms/linux/amd64/ginkgo ./
+-      mv _cache/$(kube_version_full)/kubernetes/platforms/linux/amd64/kubectl ./
++      mv _cache/$(kube_version_full)/kubernetes/platforms/linux/arm64/e2e.test ./
++      mv _cache/$(kube_version_full)/kubernetes/platforms/linux/arm64/ginkgo ./
++      mv _cache/$(kube_version_full)/kubernetes/platforms/linux/arm64/kubectl ./
+       touch $@
+
+ container: e2e.test kubectl ginkgo
diff --git a/docker/sonobuoy-plugin-systemd-logs/Makefile b/docker/sonobuoy-plugin-systemd-logs/Makefile
new file mode 100644 (file)
index 0000000..d06875d
--- /dev/null
@@ -0,0 +1,28 @@
+##############################################################################
+# Copyright (c) 2019 AT&T, ENEA AB, Nokia and others                         #
+#                                                                            #
+# Licensed under the Apache License, Version 2.0 (the "License");            #
+# you maynot 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.                                             #
+##############################################################################
+
+export WORK_DIR?=$(TAG_PRE)
+
+.PHONY: .build
+.build:: .submodules_patched
+
+.PHONY: all
+all: .push_image .push_manifest
+
+.PHONY: build
+build: .build
+
+include ../build.mk
diff --git a/docker/sonobuoy-plugin-systemd-logs/patches/aarch64/0001-Dockerfile-AArch64-support.patch b/docker/sonobuoy-plugin-systemd-logs/patches/aarch64/0001-Dockerfile-AArch64-support.patch
new file mode 100644 (file)
index 0000000..199e923
--- /dev/null
@@ -0,0 +1,28 @@
+From: Alexandru Avadanii <Alexandru.Avadanii@enea.com>
+Date: Tue, 25 Jun 2019 17:45:29 +0200
+Subject: [PATCH] Dockerfile: AArch64 support
+
+Signed-off-by: Alexandru Avadanii <Alexandru.Avadanii@enea.com>
+---
+ Dockerfile | 6 ++++--
+ 1 file changed, 4 insertions(+), 2 deletions(-)
+
+diff --git a/Dockerfile b/Dockerfile
+index 06d872c..687d541 100644
+--- a/Dockerfile
++++ b/Dockerfile
+@@ -13,10 +13,12 @@
+ # See the License for the specific language governing permissions and
+ # limitations under the License.
+
+-FROM buildpack-deps:jessie-scm
++FROM arm64v8/buildpack-deps:jessie-scm
+ MAINTAINER Ken Simon "ken@heptio.com"
+
+-RUN apt-get update && apt-get -y --no-install-recommends install \
++RUN echo 'Acquire::Check-Valid-Until "0";' > /etc/apt/apt.conf.d/10no--check-valid-until \
++    && sed -i -e '/security/s/^/#/g' -e 's|deb.debian.org/debian|snapshot.debian.org/archive/debian/20190301T035241Z|g' /etc/apt/sources.list \
++    && apt-get update && apt-get -y --no-install-recommends install \
+     ca-certificates \
+     && rm -rf /var/cache/apt/* \
+     && rm -rf /var/lib/apt/lists/*
diff --git a/docker/sonobuoy-plugin-systemd-logs/sonobuoy-plugin-systemd-logs b/docker/sonobuoy-plugin-systemd-logs/sonobuoy-plugin-systemd-logs
new file mode 160000 (submodule)
index 0000000..f49e35d
--- /dev/null
@@ -0,0 +1 @@
+Subproject commit f49e35d220772879aa057da7d103af35a21439b6
diff --git a/tox.ini b/tox.ini
index a1cdceb..bfba457 100644 (file)
--- a/tox.ini
+++ b/tox.ini
@@ -18,6 +18,7 @@ whitelist_externals =
    wget
    unzip
    bash
    wget
    unzip
    bash
+   rm
 
 passenv = http_proxy HTTP_PROXY https_proxy HTTPS_PROXY no_proxy NO_PROXY
 install_command = python -m pip install --no-cache-dir {opts} {packages}
 
 passenv = http_proxy HTTP_PROXY https_proxy HTTPS_PROXY no_proxy NO_PROXY
 install_command = python -m pip install --no-cache-dir {opts} {packages}
@@ -28,8 +29,9 @@ deps =
    requests~=2.21.0
    nodeenv
 commands =
    requests~=2.21.0
    nodeenv
 commands =
+   rm -rf docker/kube-conformance/kube-conformance docker/sonobuoy-plugin-systemd-logs/sonobuoy-plugin-systemd-logs
    nodeenv -p
    npm install --global write-good eslint complexity-report@2.0.0-alpha
    wget --timeout=120 -q https://github.com/pmd/pmd/releases/download/pmd_releases/6.15.0/pmd-bin-6.15.0.zip
    unzip -q pmd-bin-6.15.0.zip
    nodeenv -p
    npm install --global write-good eslint complexity-report@2.0.0-alpha
    wget --timeout=120 -q https://github.com/pmd/pmd/releases/download/pmd_releases/6.15.0/pmd-bin-6.15.0.zip
    unzip -q pmd-bin-6.15.0.zip
-   bash -c "export PATH=$PATH:$PWD/pmd-bin-6.15.0/bin/ && coala --non-interactive"
\ No newline at end of file
+   bash -c "export PATH=$PATH:$PWD/pmd-bin-6.15.0/bin/ && coala --non-interactive"
index 53fe50e..d1e9531 100644 (file)
@@ -1,9 +1,9 @@
 {
   "globals": {
 {
   "globals": {
-    "angular": 1,
+    "angular": writable,
     "console": 1,
     "confirm":1,
     "localStorage":1,
     "window":1
   }
     "console": 1,
     "confirm":1,
     "localStorage":1,
     "window":1
   }
-}
\ No newline at end of file
+}