Add script that "vendors" notary into docker and runs trust integration tests.

Signed-off-by: Ying Li <ying.li@docker.com>
This commit is contained in:
Ying Li 2016-02-22 16:12:27 -08:00
parent 7fe071b57a
commit a434db4064
1 changed files with 94 additions and 0 deletions

94
misc/docker-integration-test.py Executable file
View File

@ -0,0 +1,94 @@
"""
"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 <directory to build notary>
"""
from __future__ import print_function
import inspect
import os
import re
import shutil
import subprocess
import sys
def this_script_location():
"""
Returns the absolute path to directory where this script lives, so that
we don't depend on the CWD for looking for things.
"""
script_filename = inspect.getfile(inspect.currentframe())
return os.path.dirname(os.path.abspath(script_filename))
def fake_vendor(docker_dir="docker"):
"""
"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_dir = os.path.abspath(os.path.expanduser(docker_dir))
docker_notary_relpath = "vendor/src/github.com/docker/notary"
notary_loc = os.path.dirname(this_script_location()) # this script is in misc
docker_notary_abspath = os.path.join(docker_dir, docker_notary_relpath)
print("copying notary ({0}) into {1}".format(notary_loc, 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_loc:
return [".git", ".cover", "docs", "bin"]
elif walked_dir == os.path.join(notary_loc, "fixtures"):
return ["compatibility"]
elif walked_dir == os.path.dirname(docker_dir): # don't recursively copy!
return [os.path.basename(docker_dir)]
return []
if os.path.exists(docker_notary_abspath):
shutil.rmtree(docker_notary_abspath)
shutil.copytree(
notary_loc, 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
with open(os.path.join(docker_dir, "Dockerfile"), 'a+') as dockerfile:
dockerfile.write(
"\n"
"RUN set -x && "
"GOPATH=$(pwd)/vendor/src/github.com/docker/notary/Godeps/_workspace:$GOPATH "
"go build -o /usr/local/bin/notary-server github.com/docker/notary/cmd/notary-server &&"
"GOPATH=$(pwd)/vendor/src/github.com/docker/notary/Godeps/_workspace:$GOPATH "
"go build -o /usr/local/bin/notary github.com/docker/notary/cmd/notary")
# 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(docker_dir="docker"):
"""
Presumes that the fake vendoring has already happened - this runs the
integration tests.
"""
docker_dir = os.path.abspath(os.path.expanduser(docker_dir))
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) != 2:
print("\nUsage: python {0} <docker source directory>\n".format(sys.argv[0]))
sys.exit(1)
fake_vendor(sys.argv[1])
run_integration_test(sys.argv[1])