From 5d6eca6642c5749099513f1f66bb44e004aa0938 Mon Sep 17 00:00:00 2001 From: Michael Crosby Date: Mon, 15 Dec 2014 11:44:15 -0800 Subject: [PATCH 1/2] Add docker-py integration tests aginst the docker daemon This clones and run the integration tests for docker-py master as part of the integration tests created on master. docker-py hits the api directly and should be a good way to identify regressions in the api. Signed-off-by: Michael Crosby --- Dockerfile | 2 ++ Makefile | 2 +- project/make/test-docker-py | 43 +++++++++++++++++++++++++++++++++++++ 3 files changed, 46 insertions(+), 1 deletion(-) create mode 100644 project/make/test-docker-py diff --git a/Dockerfile b/Dockerfile index cbddccac2..c276eb3e7 100644 --- a/Dockerfile +++ b/Dockerfile @@ -42,6 +42,8 @@ RUN apt-get update && apt-get install -y \ lxc=1.0* \ mercurial \ parallel \ + python-mock \ + python-pip \ reprepro \ ruby1.9.1 \ ruby1.9.1-dev \ diff --git a/Makefile b/Makefile index 6f76fa4d2..70799d3c2 100644 --- a/Makefile +++ b/Makefile @@ -56,7 +56,7 @@ docs-release: docs-build $(DOCKER_RUN_DOCS) -e OPTIONS -e BUILD_ROOT "$(DOCKER_DOCS_IMAGE)" ./release.sh test: build - $(DOCKER_RUN_DOCKER) hack/make.sh binary cross test-unit test-integration test-integration-cli + $(DOCKER_RUN_DOCKER) hack/make.sh binary cross test-unit test-integration test-integration-cli test-docker-py test-unit: build $(DOCKER_RUN_DOCKER) hack/make.sh test-unit diff --git a/project/make/test-docker-py b/project/make/test-docker-py new file mode 100644 index 000000000..2a39c6fa5 --- /dev/null +++ b/project/make/test-docker-py @@ -0,0 +1,43 @@ +#!/bin/bash +set -e + +DEST=$1 + +DOCKER_GRAPHDRIVER=${DOCKER_GRAPHDRIVER:-vfs} +DOCKER_EXECDRIVER=${DOCKER_EXECDRIVER:-native} + +# subshell so that we can export PATH without breaking other things +exec > >(tee -a $DEST/test.log) 2>&1 +( + export PATH="$DEST/../binary:$DEST/../dynbinary:$PATH" + + if ! command -v docker &> /dev/null; then + echo >&2 'error: binary or dynbinary must be run before test-docker-py' + false + fi + + # intentionally open a couple bogus file descriptors to help test that they get scrubbed in containers + exec 41>&1 42>&2 + + ( set -x; exec \ + docker --daemon --debug \ + --storage-driver "$DOCKER_GRAPHDRIVER" \ + --exec-driver "$DOCKER_EXECDRIVER" \ + --pidfile "$DEST/docker.pid" \ + &> "$DEST/docker.log" + ) & + + mkdir -p /tmp/dockerpy-tests && cd /tmp/dockerpy-tests + git clone https://github.com/docker/docker-py.git + cd docker-py + git checkout 0.6.0-integration + python setup.py install + python tests/integration_test.py + + for pid in $(find "$DEST" -name docker.pid); do + DOCKER_PID=$(set -x; cat "$pid") + ( set -x; kill $DOCKER_PID ) + wait $DOCKERD_PID || true + done +) + From 100267de81985bbf3b976bfde850def89487dc11 Mon Sep 17 00:00:00 2001 From: Tianon Gravi Date: Fri, 19 Dec 2014 00:20:59 -0700 Subject: [PATCH 2/2] Tweak test-docker-py feature - move docker/docker-py clone to the Dockerfile - put "integration test daemon startup" code in a separate file for both scripts to source - add new test-docker-py Makefile target - include "python-websocket" package in Dockerfile for running the tests Signed-off-by: Andrew "Tianon" Page --- Dockerfile | 4 +++ Makefile | 5 +++- project/make.sh | 1 + project/make/.integration-daemon-start | 24 ++++++++++++++++ project/make/.integration-daemon-stop | 7 +++++ project/make/test-docker-py | 39 ++++++-------------------- project/make/test-integration-cli | 27 ++---------------- 7 files changed, 51 insertions(+), 56 deletions(-) create mode 100644 project/make/.integration-daemon-start create mode 100644 project/make/.integration-daemon-stop diff --git a/Dockerfile b/Dockerfile index c276eb3e7..a7b6bbc42 100644 --- a/Dockerfile +++ b/Dockerfile @@ -44,6 +44,7 @@ RUN apt-get update && apt-get install -y \ parallel \ python-mock \ python-pip \ + python-websocket \ reprepro \ ruby1.9.1 \ ruby1.9.1-dev \ @@ -95,6 +96,9 @@ RUN git clone -b buildroot-2014.02 https://github.com/jpetazzo/docker-busybox.gi # Get the "cirros" image source so we can import it instead of fetching it during tests RUN curl -sSL -o /cirros.tar.gz https://github.com/ewindisch/docker-cirros/raw/1cded459668e8b9dbf4ef976c94c05add9bbd8e9/cirros-0.3.0-x86_64-lxc.tar.gz +# Get the "docker-py" source so we can run their integration tests +RUN git clone -b 0.7.0 https://github.com/docker/docker-py.git /docker-py + # Setup s3cmd config RUN /bin/echo -e '[default]\naccess_key=$AWS_ACCESS_KEY\nsecret_key=$AWS_SECRET_KEY' > $HOME/.s3cfg diff --git a/Makefile b/Makefile index 70799d3c2..f1ae554a0 100644 --- a/Makefile +++ b/Makefile @@ -1,4 +1,4 @@ -.PHONY: all binary build cross default docs docs-build docs-shell shell test test-unit test-integration test-integration-cli validate +.PHONY: all binary build cross default docs docs-build docs-shell shell test test-unit test-integration test-integration-cli test-docker-py validate # env vars passed through directly to Docker's build scripts # to allow things like `make DOCKER_CLIENTONLY=1 binary` easily @@ -67,6 +67,9 @@ test-integration: build test-integration-cli: build $(DOCKER_RUN_DOCKER) hack/make.sh binary test-integration-cli +test-docker-py: build + $(DOCKER_RUN_DOCKER) hack/make.sh binary test-docker-py + validate: build $(DOCKER_RUN_DOCKER) hack/make.sh validate-gofmt validate-dco diff --git a/project/make.sh b/project/make.sh index 2b3a530ea..cf1201649 100755 --- a/project/make.sh +++ b/project/make.sh @@ -50,6 +50,7 @@ DEFAULT_BUNDLES=( test-unit test-integration test-integration-cli + test-docker-py dynbinary dyntest-unit diff --git a/project/make/.integration-daemon-start b/project/make/.integration-daemon-start new file mode 100644 index 000000000..b974422cd --- /dev/null +++ b/project/make/.integration-daemon-start @@ -0,0 +1,24 @@ +#!/bin/bash + +# see test-integration-cli for example usage of this script + +export PATH="$DEST/../binary:$DEST/../dynbinary:$PATH" + +if ! command -v docker &> /dev/null; then + echo >&2 'error: binary or dynbinary must be run before .integration-daemon-start' + false +fi + +# intentionally open a couple bogus file descriptors to help test that they get scrubbed in containers +exec 41>&1 42>&2 + +DOCKER_GRAPHDRIVER=${DOCKER_GRAPHDRIVER:-vfs} +DOCKER_EXECDRIVER=${DOCKER_EXECDRIVER:-native} + +( set -x; exec \ + docker --daemon --debug \ + --storage-driver "$DOCKER_GRAPHDRIVER" \ + --exec-driver "$DOCKER_EXECDRIVER" \ + --pidfile "$DEST/docker.pid" \ + &> "$DEST/docker.log" +) & diff --git a/project/make/.integration-daemon-stop b/project/make/.integration-daemon-stop new file mode 100644 index 000000000..57dc651d4 --- /dev/null +++ b/project/make/.integration-daemon-stop @@ -0,0 +1,7 @@ +#!/bin/bash + +for pid in $(find "$DEST" -name docker.pid); do + DOCKER_PID=$(set -x; cat "$pid") + ( set -x; kill $DOCKER_PID ) + wait $DOCKERD_PID || true +done diff --git a/project/make/test-docker-py b/project/make/test-docker-py index 2a39c6fa5..1096c9cbf 100644 --- a/project/make/test-docker-py +++ b/project/make/test-docker-py @@ -3,41 +3,20 @@ set -e DEST=$1 -DOCKER_GRAPHDRIVER=${DOCKER_GRAPHDRIVER:-vfs} -DOCKER_EXECDRIVER=${DOCKER_EXECDRIVER:-native} - # subshell so that we can export PATH without breaking other things exec > >(tee -a $DEST/test.log) 2>&1 ( - export PATH="$DEST/../binary:$DEST/../dynbinary:$PATH" + source "$(dirname "$BASH_SOURCE")/.integration-daemon-start" - if ! command -v docker &> /dev/null; then - echo >&2 'error: binary or dynbinary must be run before test-docker-py' - false - fi + dockerPy='/docker-py' + [ -d "$dockerPy" ] || { + dockerPy="$DEST/docker-py" + git clone https://github.com/docker/docker-py.git "$dockerPy" + } - # intentionally open a couple bogus file descriptors to help test that they get scrubbed in containers - exec 41>&1 42>&2 - - ( set -x; exec \ - docker --daemon --debug \ - --storage-driver "$DOCKER_GRAPHDRIVER" \ - --exec-driver "$DOCKER_EXECDRIVER" \ - --pidfile "$DEST/docker.pid" \ - &> "$DEST/docker.log" - ) & - - mkdir -p /tmp/dockerpy-tests && cd /tmp/dockerpy-tests - git clone https://github.com/docker/docker-py.git - cd docker-py - git checkout 0.6.0-integration - python setup.py install + cd "$dockerPy" + export PYTHONPATH=. # import "docker" from "." python tests/integration_test.py - for pid in $(find "$DEST" -name docker.pid); do - DOCKER_PID=$(set -x; cat "$pid") - ( set -x; kill $DOCKER_PID ) - wait $DOCKERD_PID || true - done + source "$(dirname "$BASH_SOURCE")/.integration-daemon-stop" ) - diff --git a/project/make/test-integration-cli b/project/make/test-integration-cli index e371fac07..b8647ef76 100644 --- a/project/make/test-integration-cli +++ b/project/make/test-integration-cli @@ -3,9 +3,6 @@ set -e DEST=$1 -DOCKER_GRAPHDRIVER=${DOCKER_GRAPHDRIVER:-vfs} -DOCKER_EXECDRIVER=${DOCKER_EXECDRIVER:-native} - bundle_test_integration_cli() { go_test_dir ./integration-cli } @@ -13,23 +10,7 @@ bundle_test_integration_cli() { # subshell so that we can export PATH without breaking other things exec > >(tee -a $DEST/test.log) 2>&1 ( - export PATH="$DEST/../binary:$DEST/../dynbinary:$PATH" - - if ! command -v docker &> /dev/null; then - echo >&2 'error: binary or dynbinary must be run before test-integration-cli' - false - fi - - # intentionally open a couple bogus file descriptors to help test that they get scrubbed in containers - exec 41>&1 42>&2 - - ( set -x; exec \ - docker --daemon --debug \ - --storage-driver "$DOCKER_GRAPHDRIVER" \ - --exec-driver "$DOCKER_EXECDRIVER" \ - --pidfile "$DEST/docker.pid" \ - &> "$DEST/docker.log" - ) & + source "$(dirname "$BASH_SOURCE")/.integration-daemon-start" # pull the busybox image before running the tests sleep 2 @@ -38,9 +19,5 @@ exec > >(tee -a $DEST/test.log) 2>&1 bundle_test_integration_cli - for pid in $(find "$DEST" -name docker.pid); do - DOCKER_PID=$(set -x; cat "$pid") - ( set -x; kill $DOCKER_PID ) - wait $DOCKERD_PID || true - done + source "$(dirname "$BASH_SOURCE")/.integration-daemon-stop" )