diff --git a/Dockerfile b/Dockerfile index cbddccac2f..a7b6bbc427 100644 --- a/Dockerfile +++ b/Dockerfile @@ -42,6 +42,9 @@ RUN apt-get update && apt-get install -y \ lxc=1.0* \ mercurial \ parallel \ + python-mock \ + python-pip \ + python-websocket \ reprepro \ ruby1.9.1 \ ruby1.9.1-dev \ @@ -93,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 ae1d295239..180ae314d0 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 @@ -59,7 +59,7 @@ docs-test: docs-build $(DOCKER_RUN_DOCS) "$(DOCKER_DOCS_IMAGE)" ./test.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 @@ -70,6 +70,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 2b3a530ea1..cf12016497 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 0000000000..b974422cd7 --- /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 0000000000..57dc651d46 --- /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 new file mode 100644 index 0000000000..1096c9cbfc --- /dev/null +++ b/project/make/test-docker-py @@ -0,0 +1,22 @@ +#!/bin/bash +set -e + +DEST=$1 + +# subshell so that we can export PATH without breaking other things +exec > >(tee -a $DEST/test.log) 2>&1 +( + source "$(dirname "$BASH_SOURCE")/.integration-daemon-start" + + dockerPy='/docker-py' + [ -d "$dockerPy" ] || { + dockerPy="$DEST/docker-py" + git clone https://github.com/docker/docker-py.git "$dockerPy" + } + + cd "$dockerPy" + export PYTHONPATH=. # import "docker" from "." + python tests/integration_test.py + + source "$(dirname "$BASH_SOURCE")/.integration-daemon-stop" +) diff --git a/project/make/test-integration-cli b/project/make/test-integration-cli index e371fac071..b8647ef763 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" )