From 7bfe48cc00318f9d4cf388237855012aafac56b0 Mon Sep 17 00:00:00 2001 From: Sebastiaan van Stijn Date: Mon, 20 May 2019 16:36:40 +0200 Subject: [PATCH 1/6] Bump docker-py to 4.0.2, and run tests from upstream repository This removes all the installation steps for docker-py from the Dockerfile, and instead builds the upstream Dockerfile, and runs docker-py tests in a container. To test; ``` make test-docker-py ... Removing bundles/ ---> Making bundle: dynbinary (in bundles/dynbinary) Building: bundles/dynbinary-daemon/dockerd-dev Created binary: bundles/dynbinary-daemon/dockerd-dev ---> Making bundle: test-docker-py (in bundles/test-docker-py) ---> Making bundle: .integration-daemon-start (in bundles/test-docker-py) Using test binary docker Starting dockerd INFO: Waiting for daemon to start... . INFO: Building docker-sdk-python3:3.7.0... sha256:686428ae28479e9b5c8fdad1cadc9b7a39b462e66bd13a7e35bd79c6a152a402 INFO: Starting docker-py tests... ============================= test session starts ============================== platform linux -- Python 3.6.8, pytest-4.1.0, py-1.8.0, pluggy-0.9.0 rootdir: /src, inifile: pytest.ini plugins: timeout-1.3.3, cov-2.6.1 collected 359 items tests/integration/api_build_test.py .......s.... .... ``` Signed-off-by: Sebastiaan van Stijn --- Dockerfile | 35 ------------------------------- hack/make/test-docker-py | 45 +++++++++++++++++++++++++++++++++------- 2 files changed, 37 insertions(+), 43 deletions(-) diff --git a/Dockerfile b/Dockerfile index bc02ef809a..1c9c714684 100644 --- a/Dockerfile +++ b/Dockerfile @@ -72,17 +72,6 @@ RUN set -x \ esac \ && rm -rf "$GOPATH" - - -FROM base AS docker-py -# Get the "docker-py" source so we can run their integration tests -ENV DOCKER_PY_COMMIT ac922192959870774ad8428344d9faa0555f7ba6 -RUN git clone https://github.com/docker/docker-py.git /build \ - && cd /build \ - && git checkout -q $DOCKER_PY_COMMIT - - - FROM base AS swagger # Install go-swagger for validating swagger.yaml ENV GO_SWAGGER_COMMIT c28258affb0b6251755d92489ef685af8d4ff3eb @@ -93,7 +82,6 @@ RUN set -x \ && go build -o /build/swagger github.com/go-swagger/go-swagger/cmd/swagger \ && rm -rf "$GOPATH" - FROM base AS frozen-images RUN apt-get update && apt-get install -y jq ca-certificates --no-install-recommends # Get useful and necessary Hub images so we can "docker load" locally instead of pulling @@ -227,25 +215,12 @@ RUN apt-get update && apt-get install -y \ jq \ libcap2-bin \ libdevmapper-dev \ -# libffi-dev and libssl-dev appear to be required for compiling paramiko on s390x/ppc64le - libffi-dev \ - libssl-dev \ libudev-dev \ libsystemd-dev \ binutils-mingw-w64 \ g++-mingw-w64-x86-64 \ net-tools \ pigz \ - python-backports.ssl-match-hostname \ - python-dev \ -# python-cffi appears to be required for compiling paramiko on s390x/ppc64le - python-cffi \ - python-mock \ - python-pip \ - python-requests \ - python-setuptools \ - python-websocket \ - python-wheel \ thin-provisioning-tools \ vim \ vim-common \ @@ -269,16 +244,6 @@ COPY --from=proxy /build/ /usr/local/bin/ COPY --from=dockercli /build/ /usr/local/cli COPY --from=registry /build/registry* /usr/local/bin/ COPY --from=criu /build/ /usr/local/ -COPY --from=docker-py /build/ /docker-py -# TODO: This is for the docker-py tests, which shouldn't really be needed for -# this image, but currently CI is expecting to run this image. This should be -# split out into a separate image, including all the `python-*` deps installed -# above. -RUN cd /docker-py \ - && pip install docker-pycreds==0.4.0 \ - && pip install paramiko==2.4.2 \ - && pip install yamllint==1.5.0 \ - && pip install -r test-requirements.txt COPY --from=rootlesskit /build/ /usr/local/bin/ COPY --from=djs55/vpnkit@sha256:e508a17cfacc8fd39261d5b4e397df2b953690da577e2c987a47630cd0c42f8e /vpnkit /usr/local/bin/vpnkit.x86_64 diff --git a/hack/make/test-docker-py b/hack/make/test-docker-py index b30879e3a0..877ce5d4bb 100644 --- a/hack/make/test-docker-py +++ b/hack/make/test-docker-py @@ -3,18 +3,47 @@ set -e source hack/make/.integration-test-helpers -# subshell so that we can export PATH without breaking other things +# The commit or tag to use for testing +# TODO docker 17.06 cli client used in CI fails to build using a sha; +# unable to prepare context: unable to 'git clone' to temporary context directory: error fetching: error: no such remote ref ead0bb9e08c13dd3d1712759491eee06bf5a5602 +#: exit status 128 +: ${DOCKER_PY_COMMIT:=4.0.2} ( bundle .integration-daemon-start - dockerPy='/docker-py' - [ -d "$dockerPy" ] || { - dockerPy="$DEST/docker-py" - git clone https://github.com/docker/docker-py.git "$dockerPy" - } + docker_host_scheme=`echo "${DOCKER_HOST}" | cut -d: -f1 -` - # exporting PYTHONPATH to import "docker" from our local docker-py - test_env PYTHONPATH="$dockerPy" py.test --junitxml="$DEST/results.xml" "$dockerPy/tests/integration" + case "${docker_host_scheme}" in + unix) + # trim the tcp:// scheme, and bind-mount the docker socket into the container + run_opts="-v ${DOCKER_HOST#unix://}:/var/run/docker.sock" + ;; + tcp) + # run container in host-mode networking so that it can connect to the + # daemon from the current networking namespace (e.g., to connect to localhost) + run_opts="--network=host -e DOCKER_HOST=${DOCKER_HOST}" + ;; + + *) + echo "WARN: Skipping test-docker-py: connecting to docker daemon using ${docker_host_scheme} (${DOCKER_HOST}) not supported" + bundle .integration-daemon-stop + return 0 + esac + + docker_py_image="docker-sdk-python3:${DOCKER_PY_COMMIT}" + if ! docker image inspect "dockerPyImage" &> /dev/null; then + echo INFO: Building ${docker_py_image}... + ( + [ -n "${TESTDEBUG}" ] && set -x + exec docker build --quiet -t ${docker_py_image} -f tests/Dockerfile "https://github.com/docker/docker-py.git#${DOCKER_PY_COMMIT}" + ) + fi + + echo INFO: Starting docker-py tests... + ( + [ -n "${TESTDEBUG}" ] && set -x + exec docker run -t --rm ${run_opts} ${docker_py_image} py.test tests/integration + ) bundle .integration-daemon-stop ) 2>&1 | tee -a "$DEST/test.log" From 968345bc5c0e3817d5d271124a2da11092e7447e Mon Sep 17 00:00:00 2001 From: Sebastiaan van Stijn Date: Tue, 16 Apr 2019 17:28:49 +0200 Subject: [PATCH 2/6] Makefile: Allow passing DOCKER_TEST_HOST and TESTDEBUG to container Signed-off-by: Sebastiaan van Stijn --- Makefile | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Makefile b/Makefile index f59ce72350..14b01c78f1 100644 --- a/Makefile +++ b/Makefile @@ -50,9 +50,11 @@ DOCKER_ENVS := \ -e DOCKER_PORT \ -e DOCKER_REMAP_ROOT \ -e DOCKER_STORAGE_OPTS \ + -e DOCKER_TEST_HOST \ -e DOCKER_USERLANDPROXY \ -e DOCKERD_ARGS \ -e TEST_INTEGRATION_DIR \ + -e TESTDEBUG \ -e TESTDIRS \ -e TESTFLAGS \ -e TIMEOUT \ From ba8f4c7994668992c27619d63e7056770ffb08ad Mon Sep 17 00:00:00 2001 From: Sebastiaan van Stijn Date: Sat, 13 Jul 2019 18:47:36 +0200 Subject: [PATCH 3/6] docker-py: don't build --quiet is TESTDEBUG is set Signed-off-by: Sebastiaan van Stijn --- hack/make/test-docker-py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/hack/make/test-docker-py b/hack/make/test-docker-py index 877ce5d4bb..37401e1c8d 100644 --- a/hack/make/test-docker-py +++ b/hack/make/test-docker-py @@ -36,7 +36,8 @@ source hack/make/.integration-test-helpers echo INFO: Building ${docker_py_image}... ( [ -n "${TESTDEBUG}" ] && set -x - exec docker build --quiet -t ${docker_py_image} -f tests/Dockerfile "https://github.com/docker/docker-py.git#${DOCKER_PY_COMMIT}" + [ -z "${TESTDEBUG}" ] && build_opts="--quiet" + exec docker build ${build_opts} -t ${docker_py_image} -f tests/Dockerfile "https://github.com/docker/docker-py.git#${DOCKER_PY_COMMIT}" ) fi From 3c15cea650e356f11550e435efa79bea4be88504 Mon Sep 17 00:00:00 2001 From: Sebastiaan van Stijn Date: Tue, 16 Jul 2019 12:01:55 +0200 Subject: [PATCH 4/6] docker-py: use host-network for nested build of docker-py When building this image docker-in-docker, the DNS in the environment may not be usable for the build-container, causing resolution to fail: ``` 02:35:31 W: Failed to fetch http://deb.debian.org/debian/dists/jessie/Release.gpg Temporary failure resolving 'deb.debian.org' ``` This patch detects if we're building from within a container, and if so, skips creating a networking namespace for the build by using `--network=host`. Signed-off-by: Sebastiaan van Stijn --- hack/make/test-docker-py | 1 + 1 file changed, 1 insertion(+) diff --git a/hack/make/test-docker-py b/hack/make/test-docker-py index 37401e1c8d..540fab4970 100644 --- a/hack/make/test-docker-py +++ b/hack/make/test-docker-py @@ -37,6 +37,7 @@ source hack/make/.integration-test-helpers ( [ -n "${TESTDEBUG}" ] && set -x [ -z "${TESTDEBUG}" ] && build_opts="--quiet" + [ -f /.dockerenv ] || build_opts="${build_opts} --network=host" exec docker build ${build_opts} -t ${docker_py_image} -f tests/Dockerfile "https://github.com/docker/docker-py.git#${DOCKER_PY_COMMIT}" ) fi From 980f2813b435166b0fa3509a84f5e435e355f623 Mon Sep 17 00:00:00 2001 From: Sebastiaan van Stijn Date: Sat, 13 Jul 2019 13:59:18 +0200 Subject: [PATCH 5/6] docker-py: skip flaky tests Signed-off-by: Sebastiaan van Stijn --- hack/make/test-docker-py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/hack/make/test-docker-py b/hack/make/test-docker-py index 540fab4970..2dc55a5454 100644 --- a/hack/make/test-docker-py +++ b/hack/make/test-docker-py @@ -8,6 +8,10 @@ source hack/make/.integration-test-helpers # unable to prepare context: unable to 'git clone' to temporary context directory: error fetching: error: no such remote ref ead0bb9e08c13dd3d1712759491eee06bf5a5602 #: exit status 128 : ${DOCKER_PY_COMMIT:=4.0.2} + +# custom options to pass py.test +# TODO remove these skip once we update to a docker-py version that has https://github.com/docker/docker-py/pull/2369 and https://github.com/docker/docker-py/pull/2380 +: ${PY_TEST_OPTIONS:="--deselect=tests/integration/api_swarm_test.py::SwarmTest::test_init_swarm_data_path_addr --deselect=tests/integration/api_exec_test.py::ExecTest::test_detach_with_arg --deselect=tests/integration/api_exec_test.py::ExecDemuxTest::test_exec_command_tty_stream_no_demux"} ( bundle .integration-daemon-start @@ -45,7 +49,7 @@ source hack/make/.integration-test-helpers echo INFO: Starting docker-py tests... ( [ -n "${TESTDEBUG}" ] && set -x - exec docker run -t --rm ${run_opts} ${docker_py_image} py.test tests/integration + exec docker run -t --rm ${run_opts} ${docker_py_image} pytest ${PY_TEST_OPTIONS} tests/integration ) bundle .integration-daemon-stop ) 2>&1 | tee -a "$DEST/test.log" From 6aafe0fd9ed34c4d91adde62c86e47518274a5e8 Mon Sep 17 00:00:00 2001 From: Sebastiaan van Stijn Date: Tue, 16 Jul 2019 19:53:17 +0200 Subject: [PATCH 6/6] WIP Move docker-py tests first again See if networking works if we run it first Signed-off-by: Sebastiaan van Stijn --- hack/ci/janky | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/hack/ci/janky b/hack/ci/janky index 458a74f7c1..ec48165896 100755 --- a/hack/ci/janky +++ b/hack/ci/janky @@ -8,7 +8,7 @@ hack/test/unit hack/make.sh \ binary-daemon \ dynbinary \ + test-docker-py \ test-integration-flaky \ test-integration \ - cross \ - test-docker-py + cross