docs/misc/docker-integration-test.py

114 lines
4.2 KiB
Python
Executable File

"""
"vendors" notary into docker and runs integration tests - then builds the
docker client binary with an API version compatible with the existing
daemon
Usage:
python docker-integration-test.py
This assumes that your docker directory is in $GOPATH/src/github.com/docker/docker
and your notary directory, irrespective of where this script is located, is
at $GOPATH/src/github.com/docker/notary.
"""
from __future__ import print_function
import os
import re
import shutil
import subprocess
import sys
def from_gopath(gopkg):
"""
Gets the location of the go source given go package, based on the $GOPATH.
"""
gopaths = os.getenv("GOPATH")
for path in gopaths.split(":"):
maybe_path = os.path.abspath(os.path.expanduser(os.path.join(
path, "src", *gopkg.split("/"))))
if os.path.isdir(maybe_path):
return maybe_path
return ""
DOCKER_DIR = from_gopath("github.com/docker/docker")
NOTARY_DIR = from_gopath("github.com/docker/notary")
def fake_vendor():
"""
"vendors" notary into docker by copying all of notary into the docker
vendor directory - also appending several lines into the Dockerfile because
it pulls down notary from github and builds the binaries
"""
docker_notary_relpath = "vendor/src/github.com/docker/notary"
docker_notary_abspath = os.path.join(DOCKER_DIR, docker_notary_relpath)
print("copying notary ({0}) into {1}".format(NOTARY_DIR, docker_notary_abspath))
def ignore_dirs(walked_dir, _):
"""
Don't vendor everything, particularly not the docker directory
recursively, if it happened to be in the notary directory
"""
if walked_dir == NOTARY_DIR:
return [".git", ".cover", "docs", "bin"]
elif walked_dir == os.path.join(NOTARY_DIR, "fixtures"):
return ["compatibility"]
return []
if os.path.exists(docker_notary_abspath):
shutil.rmtree(docker_notary_abspath)
shutil.copytree(
NOTARY_DIR, docker_notary_abspath, symlinks=True, ignore=ignore_dirs)
# hack this because docker/docker's Dockerfile checks out a particular version of notary
# based on a tag or SHA, and we want to build based on what was vendored in
dockerfile_addition = ("\n"
"RUN set -x && "
"export GO15VENDOREXPERIMENT=1 && "
"go build -o /usr/local/bin/notary-server github.com/docker/notary/cmd/notary-server &&"
"go build -o /usr/local/bin/notary github.com/docker/notary/cmd/notary")
with open(os.path.join(DOCKER_DIR, "Dockerfile")) as dockerfile:
text = dockerfile.read()
if not text.endswith(dockerfile_addition):
with open(os.path.join(DOCKER_DIR, "Dockerfile"), 'a+') as dockerfile:
dockerfile.write(dockerfile_addition)
# hack the makefile so that we tag the built image as something else so we
# don't interfere with any other docker test builds
with open(os.path.join(DOCKER_DIR, "Makefile"), 'r') as makefile:
makefiletext = makefile.read()
with open(os.path.join(DOCKER_DIR, "Makefile"), 'wb') as makefile:
image_name = os.getenv("DOCKER_TEST_IMAGE_NAME", "notary-docker-vendor-test")
text = re.sub("^DOCKER_IMAGE := .+$", "DOCKER_IMAGE := {0}".format(image_name),
makefiletext, 1, flags=re.M)
makefile.write(text)
def run_integration_test():
"""
Presumes that the fake vendoring has already happened - this runs the
integration tests.
"""
env = os.environ.copy()
env["TESTFLAGS"] = '-check.f DockerTrustSuite*'
subprocess.check_call(
"make test-integration-cli".split(), cwd=DOCKER_DIR, env=env)
if __name__ == "__main__":
if len(sys.argv) > 1:
print("\nWarning: Ignoring all extra arguments: {0}".format(" ".join(sys.argv[1:])))
print("\nUsage: python {0}\n\n".format(sys.argv[0]))
if DOCKER_DIR == "":
print("ERROR: Could not find github.com/docker/docker in your GOPATH='{0}'"
.format(os.getenv("GOPATH")))
sys.exit(1)
if NOTARY_DIR == "":
print("ERROR: Could not find github.com/docker/notary in your GOPATH='{0}'"
.format(os.getenv("GOPATH")))
sys.exit(1)
fake_vendor()
run_integration_test()