From aa89492db8e36ccbc0aa0aa68a3adc89834c746bd8d189be15aafb9e91be6169 Mon Sep 17 00:00:00 2001 From: Aleksa Sarai Date: Tue, 12 Mar 2019 07:51:12 +0000 Subject: [PATCH] - docker-test: improvements to test packaging (we don't need to ship around the entire source tree, and we also need to build the born-again integration/ tests which contain a suite-per-directory). We also need a new patch which fixes the handling of *-test images. bsc#1128746 + bsc1128746-0001-integration-cli-don-t-build-test-images-if-they-alre.patch OBS-URL: https://build.opensuse.org/package/show/Virtualization:containers/docker?expand=0&rev=301 --- ...don-t-build-test-images-if-they-alre.patch | 95 +++++++++++++++++++ docker.changes | 4 +- docker.spec | 22 +++-- tests.sh | 42 ++++---- 4 files changed, 131 insertions(+), 32 deletions(-) create mode 100644 bsc1128746-0001-integration-cli-don-t-build-test-images-if-they-alre.patch diff --git a/bsc1128746-0001-integration-cli-don-t-build-test-images-if-they-alre.patch b/bsc1128746-0001-integration-cli-don-t-build-test-images-if-they-alre.patch new file mode 100644 index 0000000..1eb52ab --- /dev/null +++ b/bsc1128746-0001-integration-cli-don-t-build-test-images-if-they-alre.patch @@ -0,0 +1,95 @@ +From 911af815ea12dacb81afef0a6704c73d48df01d3 Mon Sep 17 00:00:00 2001 +From: Aleksa Sarai +Date: Tue, 12 Mar 2019 18:48:38 +1100 +Subject: [PATCH] integration-cli: don't build -test images if they already + exist + +There's no need to try to re-build the test images if they already +exist. This change makes basically no difference to the upstream +integration test-suite running, but for users who want to run the +integration-cli suite on a host machine (such as distributions doing +tests) this change allows images to be pre-loaded such that compilers +aren't needed on the test machine. + +SUSE-Bugs: bsc#1128746 +Signed-off-by: Aleksa Sarai +--- + .../fixtures_linux_daemon_test.go | 20 +++++++++++-------- + .../internal/test/environment/environment.go | 20 +++++++++++++++++++ + 2 files changed, 32 insertions(+), 8 deletions(-) + +diff --git a/components/engine/integration-cli/fixtures_linux_daemon_test.go b/components/engine/integration-cli/fixtures_linux_daemon_test.go +index 2387a9ebee2b..ae01180d8523 100644 +--- a/components/engine/integration-cli/fixtures_linux_daemon_test.go ++++ b/components/engine/integration-cli/fixtures_linux_daemon_test.go +@@ -24,17 +24,13 @@ type logT interface { + Logf(string, ...interface{}) + } + +-var ensureSyscallTestOnce sync.Once +- + func ensureSyscallTest(c *check.C) { +- var doIt bool +- ensureSyscallTestOnce.Do(func() { +- doIt = true +- }) +- if !doIt { ++ defer testEnv.ProtectImage(c, "syscall-test:latest") ++ ++ // If the image already exists, there's nothing left to do. ++ if testEnv.HasExistingImage(c, "syscall-test:latest") { + return + } +- defer testEnv.ProtectImage(c, "syscall-test:latest") + + // if no match, must build in docker, which is significantly slower + // (slower mostly because of the vfs graphdriver) +@@ -93,6 +89,14 @@ func ensureSyscallTestBuild(c *check.C) { + + func ensureNNPTest(c *check.C) { + defer testEnv.ProtectImage(c, "nnp-test:latest") ++ ++ // If the image already exists, there's nothing left to do. ++ if testEnv.HasExistingImage(c, "nnp-test:latest") { ++ return ++ } ++ ++ // if no match, must build in docker, which is significantly slower ++ // (slower mostly because of the vfs graphdriver) + if testEnv.OSType != runtime.GOOS { + ensureNNPTestBuild(c) + return +diff --git a/components/engine/internal/test/environment/environment.go b/components/engine/internal/test/environment/environment.go +index 74c8e2ce0ad7..56692a4f6594 100644 +--- a/components/engine/internal/test/environment/environment.go ++++ b/components/engine/internal/test/environment/environment.go +@@ -145,6 +145,26 @@ func (e *Execution) APIClient() client.APIClient { + return e.client + } + ++// HasExistingImage checks whether there is an image with the given reference. ++// Note that this is done by filtering and then checking whether there were any ++// results -- so ambiguous references might result in false-positives. ++func (e *Execution) HasExistingImage(t TestingT, reference string) bool { ++ if ht, ok := t.(test.HelperT); ok { ++ ht.Helper() ++ } ++ client := e.APIClient() ++ filter := filters.NewArgs() ++ filter.Add("dangling", "false") ++ filter.Add("reference", reference) ++ imageList, err := client.ImageList(context.Background(), types.ImageListOptions{ ++ All: true, ++ Filters: filter, ++ }) ++ assert.NilError(t, err, "failed to list images") ++ ++ return len(imageList) > 0 ++} ++ + // EnsureFrozenImagesLinux loads frozen test images into the daemon + // if they aren't already loaded + func EnsureFrozenImagesLinux(testEnv *Execution) error { +-- +2.21.0 + diff --git a/docker.changes b/docker.changes index c7bdbbf..cc63274 100644 --- a/docker.changes +++ b/docker.changes @@ -3,7 +3,9 @@ Sun Mar 10 21:12:09 UTC 2019 - Aleksa Sarai - docker-test: improvements to test packaging (we don't need to ship around the entire source tree, and we also need to build the born-again integration/ - tests which contain a suite-per-directory). + tests which contain a suite-per-directory). We also need a new patch which + fixes the handling of *-test images. bsc#1128746 + + bsc1128746-0001-integration-cli-don-t-build-test-images-if-they-alre.patch ------------------------------------------------------------------- Tue Feb 26 09:39:57 UTC 2019 - Michal Jura diff --git a/docker.spec b/docker.spec index b305c57..a2d02f1 100644 --- a/docker.spec +++ b/docker.spec @@ -90,6 +90,8 @@ Patch405: bsc1001161-0002-cli-add-a-separate-domainname-flag.patch # SUSE-FEATURE: Add support to mirror inofficial/private registries # (https://github.com/docker/docker/pull/34319) Patch500: private-registry-0001-Add-private-registry-mirror-support.patch +# SUSE-BACKPORT: Backport of test-only patch https://github.com/moby/moby/pull/38853. bsc1128746 +Patch900: bsc1128746-0001-integration-cli-don-t-build-test-images-if-they-alre.patch BuildRequires: audit BuildRequires: bash-completion BuildRequires: ca-certificates @@ -273,6 +275,8 @@ docker container runtime configuration for kubeadm # PATCH-SUSE: Mirror patch. %patch500 -p1 %endif +# bsc#1128746 +%patch900 -p1 cp %{SOURCE7} . @@ -371,12 +375,6 @@ install -Dd -m 0755 \ install -D -m0644 components/cli/contrib/completion/bash/docker "%{buildroot}%{_sysconfdir}/bash_completion.d/%{realname}" install -D -m0644 components/cli/contrib/completion/zsh/_docker "%{buildroot}%{_sysconfdir}/zsh_completion.d/%{realname}" -# We only need all our built tests.main, contrib/, and hack/ for testing purposes. -install -d %{buildroot}%{_prefix}/src/docker/ -install -D -m0755 %{SOURCE9} %{buildroot}%{_prefix}/src/docker/tests.sh -cp -a components/engine/{hack,contrib,integration{,-cli}} %{buildroot}%{_prefix}/src/docker/ -echo "%{version}" > %{buildroot}%{_prefix}/src/docker/VERSION - # # systemd service # @@ -409,6 +407,18 @@ install -p -m 644 components/cli/man/man5/Dockerfile.5 %{buildroot}%{_mandir}/ma install -d %{buildroot}%{_mandir}/man8 install -p -m 644 components/cli/man/man8/*.8 %{buildroot}%{_mandir}/man8 +# install docker-test files -- we want to avoid installing the entire source tree. +install -d %{buildroot}%{_prefix}/src/docker/ +install -D -m0755 %{SOURCE9} %{buildroot}%{_prefix}/src/docker/tests.sh +# We need hack/, contrib/, profiles/, and the integration*/ trees. +cp -a components/engine/{hack,contrib,profiles,integration{,-cli}} %{buildroot}%{_prefix}/src/docker/ +echo "%{version}" > %{buildroot}%{_prefix}/src/docker/VERSION +# And now we can remove all *_test.go files -- since we already have test +# binaries. Due to a lot of hacks within the Docker integration tests, we can't +# really do a bigger cleanup than this. +find %{buildroot}%{_prefix}/src/docker \ + -type f -name '*_test.go' -delete + %if "%flavour" == "kubic" # place kubelet.env in fillupdir (for kubeadm-criconfig) install -D -m 0644 %{SOURCE5} %{buildroot}%{_fillupdir}/sysconfig.kubelet diff --git a/tests.sh b/tests.sh index b239554..a61fd60 100644 --- a/tests.sh +++ b/tests.sh @@ -11,10 +11,8 @@ SCRIPTS_DIR="$DOCKER_DIR/hack" VERSION="$(cat "$DOCKER_DIR/VERSION")" # working dirs -TEST_TMPDIR=/tmp/docker-int-tests -FROZEN_IMAGES_DIR="$TEST_TMPDIR/frozen-images" +FROZEN_IMAGES_DIR="/tmp/docker-frozen-images" FROZEN_IMAGES_LINK=/docker-frozen-images -BUNDLES_DIR="$TEST_TMPDIR/run/bundles" readarray -t TESTS < <(find "$DOCKER_DIR/integration-cli" -type f -executable -name 'tests.main') CHECK_TIMEOUT="${CHECK_TIMEOUT:-15m}" @@ -46,17 +44,6 @@ bundle() { set "-$oldFlags" } -fix_expected() { - EXPECTED="$1" - EXISTING="$2" - - exp_base="$(basename "$EXPECTED")" - exp_dir="$(dirname "$EXPECTED")" - [ -d "$exp_dir" ] || mkdir -p "$exp_dir" - rm -f "$exp_dir/$exp_base" - ( cd "$exp_dir" && ln -sf "$EXISTING" "$exp_base" ) -} - save_backup() { for x in $@ ; do if [ ! -f "$x" ] ; then @@ -130,11 +117,6 @@ fi /usr/sbin/groupadd -r docker >/dev/null 2>&1 || /bin/true /usr/sbin/useradd --create-home --gid docker unprivilegeduser >/dev/null 2>&1 || /bin/true -# prepare some expected dirs, files, etc... -fix_expected "$TEST_TMPDIR/contrib" "$DOCKER_DIR/contrib" -fix_expected "$DEST/fixtures" "$DOCKER_DIR/integration-cli/fixtures" -fix_expected "$DEST/../Dockerfile" "$DOCKER_DIR/Dockerfile" - export DOCKER_TEST_HOST="tcp://127.0.0.1:2375" export PATH="/usr/local/bin:$PATH" export TZ=utc @@ -186,17 +168,16 @@ CFG_DOCKER_EOF systemctl restart docker.service cleanup() { - log "Restoring the Docker service..." - restore_backup "$CFG_DOCKER" - systemctl restart docker.service + log "Restoring configuration files..." + restore_backup /etc/subuid /etc/subgid "$CFG_DOCKER" + rm -f "$FROZEN_IMAGES_LINK" log "Removing images and containers..." docker ps -aq | xargs docker rm -f &>/dev/null || : docker images -q | xargs docker rmi -f &>/dev/null || : - log "Removing extra files and restoring backups..." - restore_backup /etc/subuid /etc/subgid - rm -f "$TEST_TMPDIR/contrib" "$DEST/fixtures" "$FROZEN_IMAGES_LINK" + log "Restarting the Docker service in a pristine state..." + systemctl restart docker.service } trap cleanup EXIT @@ -225,6 +206,17 @@ ln -sf "$FROZEN_IMAGES_DIR" "$FROZEN_IMAGES_LINK" debian:jessie@sha256:287a20c5f73087ab406e6b364833e3fb7b3ae63ca0eb3486555dc27ed32c6e60 \ hello-world:latest@sha256:be0cd392e45be79ffeffa6b05338b98ebb16c87b255f48e297ec7f98e123905c +# The code within integration-cli which handles building *-test images doesn't +# appear to work within our setup, not to mention we don't want to Require: a +# bunch of build tools so we just use the provided Dockerfile and +# buildpack-deps. +tar -cC "$FROZEN_IMAGES_DIR" . | docker load +for dir in "$DOCKER_DIR"/contrib/*-test +do + log "Building *-test images ($dir)..." + docker build -t "$(basename "$dir")" "$dir" +done + rm -f "$TEST_LOG" for TEST in "${TESTS[@]}" do