Accepting request 423068 from home:chbrauner:branches:Virtualization:containers
Add Alvaro's (asaurin@suse.de) work on a integration test binary. OBS-URL: https://build.opensuse.org/request/show/423068 OBS-URL: https://build.opensuse.org/package/show/Virtualization:containers/docker?expand=0&rev=135
This commit is contained in:
parent
e0fc501ae0
commit
bf63e2c24a
@ -1,3 +1,10 @@
|
|||||||
|
-------------------------------------------------------------------
|
||||||
|
Fri Aug 26 12:02:35 UTC 2016 - cbrauner@suse.de
|
||||||
|
|
||||||
|
- Add asaurin@suse.com's test.sh test script.
|
||||||
|
- Add integration test binary in docker.spec file. This is work done by
|
||||||
|
asaurin@suse.com.
|
||||||
|
|
||||||
-------------------------------------------------------------------
|
-------------------------------------------------------------------
|
||||||
Fri Aug 26 10:43:38 UTC 2016 - asarai@suse.com
|
Fri Aug 26 10:43:38 UTC 2016 - asarai@suse.com
|
||||||
|
|
||||||
|
17
docker.spec
17
docker.spec
@ -59,6 +59,7 @@ Source6: docker-rpmlintrc
|
|||||||
Source7: README_SUSE.md
|
Source7: README_SUSE.md
|
||||||
Source8: docker-audit.rules
|
Source8: docker-audit.rules
|
||||||
Source9: docker-update-message.txt
|
Source9: docker-update-message.txt
|
||||||
|
Source10: tests.sh
|
||||||
# Fixes for architecture-specific issues (gcc-go).
|
# Fixes for architecture-specific issues (gcc-go).
|
||||||
Patch100: gcc-go-patches.patch
|
Patch100: gcc-go-patches.patch
|
||||||
Patch101: netlink_gcc_go.patch
|
Patch101: netlink_gcc_go.patch
|
||||||
@ -179,6 +180,7 @@ Test package for docker. It contains the source code and the tests.
|
|||||||
%patch102 -p1
|
%patch102 -p1
|
||||||
%endif
|
%endif
|
||||||
cp %{SOURCE7} .
|
cp %{SOURCE7} .
|
||||||
|
cp %{SOURCE10} .
|
||||||
|
|
||||||
%build
|
%build
|
||||||
%ifnarch %{go_arches}
|
%ifnarch %{go_arches}
|
||||||
@ -204,6 +206,11 @@ man/md2man-all.sh
|
|||||||
./hack/make.sh dyngccgo
|
./hack/make.sh dyngccgo
|
||||||
%endif
|
%endif
|
||||||
|
|
||||||
|
# build the tests binary
|
||||||
|
GOPATH=$(pwd)/vendor:$(pwd)/.gopath/ go test \
|
||||||
|
-tags "$DOCKER_BUILDTAGS daemon autogen" \
|
||||||
|
-c github.com/docker/docker/integration-cli -o tests.main
|
||||||
|
|
||||||
# remove other than systemd
|
# remove other than systemd
|
||||||
# otherwise the resulting package will have extra requires
|
# otherwise the resulting package will have extra requires
|
||||||
rm -rf hack/make/.build-deb
|
rm -rf hack/make/.build-deb
|
||||||
@ -294,6 +301,16 @@ install -D -m0644 contrib/completion/zsh/_docker "%{buildroot}%{_sysconfdir}/zsh
|
|||||||
# copy all for the test package
|
# copy all for the test package
|
||||||
install -d %{buildroot}%{_prefix}/src/docker/
|
install -d %{buildroot}%{_prefix}/src/docker/
|
||||||
cp -av . %{buildroot}%{_prefix}/src/docker/
|
cp -av . %{buildroot}%{_prefix}/src/docker/
|
||||||
|
cp -av contrib %{buildroot}%{_prefix}/src/docker/
|
||||||
|
cp -av hack %{buildroot}%{_prefix}/src/docker/
|
||||||
|
cp -av integration-cli %{buildroot}%{_prefix}/src/docker/
|
||||||
|
cp -av VERSION Dockerfile %{buildroot}%{_prefix}/src/docker/
|
||||||
|
cp -av tests.main tests.sh %{buildroot}%{_prefix}/src/docker/hack/
|
||||||
|
|
||||||
|
# clean some things we don't need in the test package
|
||||||
|
(cd %{buildroot}%{_prefix}/src/docker/contrib && rm -rf builder completion desktop-integration init mkimage* syntax vagrant-docker)
|
||||||
|
(cd %{buildroot}%{_prefix}/src/docker/hack && rm -rf Jenkins dind generate-authors.sh install.sh make.sh release.sh vendor.sh .vendor-helpers.sh)
|
||||||
|
(cd %{buildroot}%{_prefix}/src/docker/integration-cli && rm -rf *.go)
|
||||||
|
|
||||||
#
|
#
|
||||||
# systemd service
|
# systemd service
|
||||||
|
290
tests.sh
Normal file
290
tests.sh
Normal file
@ -0,0 +1,290 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
#
|
||||||
|
# Script for launching the Docker integration tests
|
||||||
|
#
|
||||||
|
|
||||||
|
#set -x
|
||||||
|
|
||||||
|
SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
|
||||||
|
|
||||||
|
DOCKER_DIR=/usr/src/docker
|
||||||
|
SCRIPTS_DIR=$DOCKER_DIR/hack
|
||||||
|
TESTS_EXE=$SCRIPTS_DIR/tests.main
|
||||||
|
VERSION=$(cat $DOCKER_DIR/VERSION)
|
||||||
|
|
||||||
|
# working dirs
|
||||||
|
TESTS_DIR=/tmp/docker-int-tests
|
||||||
|
BUNDLES_DIR=$TESTS_DIR/run/bundles
|
||||||
|
FAKE_GOPATH=$TESTS_DIR/go
|
||||||
|
|
||||||
|
# some test expect the containerd socket here
|
||||||
|
CONTAINERD_SOCK=/run/containerd/containerd.sock
|
||||||
|
EXPECTED_CONTAINERD_SOCK=/var/run/docker/libcontainerd/docker-containerd.sock
|
||||||
|
|
||||||
|
# ... and some programs
|
||||||
|
CONTAINERD_CTR=/usr/sbin/containerd-ctr
|
||||||
|
EXPECTED_CONTAINERD_CTR=/usr/local/bin/docker-containerd-ctr
|
||||||
|
|
||||||
|
TEST_ARGS="-check.vv -check.timeout=5m -test.timeout=60m"
|
||||||
|
TEST_SELECT=
|
||||||
|
TEST_LOG=/tmp/docker-tests.log
|
||||||
|
ENABLE_XUNIT=${ENABLE_XUNIT:-yes}
|
||||||
|
|
||||||
|
# the sysconfig file for Docker
|
||||||
|
SYSCFG_DOCKER=/etc/sysconfig/docker
|
||||||
|
|
||||||
|
# some vars from the Dockerfile
|
||||||
|
ENABLE_NOTARY=${ENABLE_NOTARY:-}
|
||||||
|
ENABLE_REGISTRY=${ENABLE_REGISTRY:-}
|
||||||
|
REGISTRY_COMMIT_SCHEMA1=ec87e9b6971d831f0eff752ddb54fb64693e51cd
|
||||||
|
REGISTRY_COMMIT=47a064d4195a9b56133891bbb13620c3ac83a827
|
||||||
|
NOTARY_VERSION=v0.3.0
|
||||||
|
|
||||||
|
################################################################################
|
||||||
|
|
||||||
|
log() { echo ">>> $@" ; }
|
||||||
|
warn() { log "WARNING: $@" ; }
|
||||||
|
error() { log "ERROR: $@" ; }
|
||||||
|
abort() { log "FATAL: $@" ; exit 1 ; }
|
||||||
|
usage() { echo "$USAGE" ; }
|
||||||
|
abort_usage() { usage ; abort $@ ; }
|
||||||
|
|
||||||
|
bundle() {
|
||||||
|
local bundle="$1"; shift
|
||||||
|
log "Making bundle: $(basename "$bundle") (in $DEST)"
|
||||||
|
source "$SCRIPTS_DIR/make/$bundle" "$@"
|
||||||
|
}
|
||||||
|
|
||||||
|
set_opts() {
|
||||||
|
OPT="$1"
|
||||||
|
VALUE="$2"
|
||||||
|
FILE=$3
|
||||||
|
|
||||||
|
perl -pi -e "s/^$OPT=.*$//g" $FILE
|
||||||
|
echo "$OPT=\"$VALUE\"" >> $FILE
|
||||||
|
}
|
||||||
|
|
||||||
|
set_docker_opts() { set_opts "DOCKER_OPTS" "$DOCKER_OPTS" /etc/sysconfig/docker ; }
|
||||||
|
set_containerd_opts() { set_opts "CONTAINERD_OPTS" "$CONTAINERD_OPTS" /etc/sysconfig/containerd ; }
|
||||||
|
|
||||||
|
fix_expected() {
|
||||||
|
EXPECTED=$1
|
||||||
|
EXISTING=$2
|
||||||
|
|
||||||
|
exp_base=$(basename $EXPECTED)
|
||||||
|
exp_dir=$(dirname $EXPECTED)
|
||||||
|
[ -d $exp_dir ] || mkdir -p $exp_dir
|
||||||
|
rm -f $exp_dir/$exp_base
|
||||||
|
(cd $exp_dir && ln -sf $EXISTING $exp_base)
|
||||||
|
}
|
||||||
|
|
||||||
|
save_backup() {
|
||||||
|
for x in $@ ; do
|
||||||
|
if [ ! -f $x ] ; then
|
||||||
|
touch $x.nbak
|
||||||
|
elif [ -f $x.bak ] ; then
|
||||||
|
warn "$x.bak already exists: no backup will be done"
|
||||||
|
else
|
||||||
|
cp -f $x $x.bak
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
restore_backup() {
|
||||||
|
for x in $@ ; do
|
||||||
|
if [ -f $x.nbak ] ; then
|
||||||
|
rm -f $x.nbak
|
||||||
|
else
|
||||||
|
if [ -f $x.bak ] ; then
|
||||||
|
mv -f $x.bak $x
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
require_go() { go version >/dev/null 2>&1 ; }
|
||||||
|
require_git() { git version >/dev/null 2>&1 ; }
|
||||||
|
|
||||||
|
################################################################################
|
||||||
|
|
||||||
|
[ -x $TESTS_EXE ] || abort "integration tests executable not found at $TESTS_EXE"
|
||||||
|
[ $EUID -eq 0 ] || abort "this script must be run as root"
|
||||||
|
[ -n "$VERSION" ] || abort "could not obtain version"
|
||||||
|
[ -e $CONTAINERD_SOCK ] || abort "containerd socket not found at $CONTAINERD_SOCK"
|
||||||
|
[ -x $CONTAINERD_CTR ] || abort "containerd-ctr not found at $CONTAINERD_CTR"
|
||||||
|
|
||||||
|
if [ $# -gt 0 ] ; then
|
||||||
|
# run only some specific tests
|
||||||
|
TEST_SELECT="-check.f=$(echo $@ | tr ' ' '|')"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# We want this to fail if the bundles already exist and cannot be removed.
|
||||||
|
# This is to avoid mixing bundles from different versions of the code.
|
||||||
|
mkdir -p $BUNDLES_DIR
|
||||||
|
if [ -e "$BUNDLES_DIR/$VERSION" ] && [ -z "$KEEPBUNDLE" ]; then
|
||||||
|
log "$BUNDLES_DIR/$VERSION already exists. Removing."
|
||||||
|
rm -fr "$BUNDLES_DIR/$VERSION" && mkdir "$BUNDLES_DIR/$VERSION" || exit 1
|
||||||
|
echo
|
||||||
|
fi
|
||||||
|
|
||||||
|
DEST="$BUNDLES_DIR/$VERSION/"
|
||||||
|
mkdir -p "$DEST"
|
||||||
|
export DEST=$(realpath $DEST)
|
||||||
|
|
||||||
|
# create a fake go path
|
||||||
|
rm -rf $FAKE_GOPATH
|
||||||
|
mkdir -p $FAKE_GOPATH/src/github.com/docker
|
||||||
|
(cd $FAKE_GOPATH/src/github.com/docker && ln -sf $DOCKER_DIR docker)
|
||||||
|
|
||||||
|
if [ -n "$ENABLE_REGISTRY" ] ; then
|
||||||
|
# build the Docker registry
|
||||||
|
if [ ! -x /usr/local/bin/registry-v2 ] ; then
|
||||||
|
log "Building registry (commit:$REGISTRY_COMMIT)"
|
||||||
|
|
||||||
|
require_git || abort "git is not installed"
|
||||||
|
require_go || abort "the Go compiler is not installed"
|
||||||
|
|
||||||
|
export GOPATH="$(mktemp -d)"
|
||||||
|
|
||||||
|
git clone https://github.com/docker/distribution.git "$GOPATH/src/github.com/docker/distribution"
|
||||||
|
(cd "$GOPATH/src/github.com/docker/distribution" && git checkout -q "$REGISTRY_COMMIT")
|
||||||
|
GOPATH="$GOPATH/src/github.com/docker/distribution/Godeps/_workspace:$GOPATH" \
|
||||||
|
go build -o /usr/local/bin/registry-v2 github.com/docker/distribution/cmd/registry
|
||||||
|
(cd "$GOPATH/src/github.com/docker/distribution" && git checkout -q "$REGISTRY_COMMIT_SCHEMA1")
|
||||||
|
GOPATH="$GOPATH/src/github.com/docker/distribution/Godeps/_workspace:$GOPATH" \
|
||||||
|
go build -o /usr/local/bin/registry-v2-schema1 github.com/docker/distribution/cmd/registry
|
||||||
|
|
||||||
|
chmod 755 /usr/local/bin/registry-v2
|
||||||
|
[ -x /usr/local/bin/registry-v2 ] || abort "registry-v2 could not be built"
|
||||||
|
|
||||||
|
rm -rf "$GOPATH"
|
||||||
|
export -n GOPATH
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -n "$ENABLE_NOTARY" ] ; then
|
||||||
|
# build the Docker notary
|
||||||
|
if [ ! -x /usr/local/bin/notary-server ] ; then
|
||||||
|
export GO15VENDOREXPERIMENT=1
|
||||||
|
export GOPATH="$(mktemp -d)"
|
||||||
|
|
||||||
|
require_git || abort "git is not installed"
|
||||||
|
require_go || abort "the Go compiler is not installed"
|
||||||
|
|
||||||
|
log "Building notary (version:$NOTARY_VERSION)"
|
||||||
|
git clone https://github.com/docker/notary.git "$GOPATH/src/github.com/docker/notary"
|
||||||
|
(cd "$GOPATH/src/github.com/docker/notary" && git checkout -q "$NOTARY_VERSION")
|
||||||
|
GOPATH="$GOPATH/src/github.com/docker/notary/vendor:$GOPATH" \
|
||||||
|
go build -o /usr/local/bin/notary-server github.com/docker/notary/cmd/notary-server
|
||||||
|
GOPATH="$GOPATH/src/github.com/docker/notary/vendor:$GOPATH" \
|
||||||
|
go build -o /usr/local/bin/notary github.com/docker/notary/cmd/notary
|
||||||
|
|
||||||
|
chmod 755 /usr/local/bin/notary-server
|
||||||
|
[ -x /usr/local/bin/notary-server ] || abort "notary could not be built"
|
||||||
|
|
||||||
|
export -n GO15VENDOREXPERIMENT
|
||||||
|
|
||||||
|
rm -rf "$GOPATH"
|
||||||
|
export -n GOPATH
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -n "$ENABLE_XUNIT" ] ; then
|
||||||
|
if [ ! -x /usr/local/bin/go2xunit ] ; then
|
||||||
|
echo >&2 "Installing go2xunit."
|
||||||
|
|
||||||
|
require_go || abort "the Go compiler is not installed"
|
||||||
|
|
||||||
|
export GOPATH="$(mktemp -d)"
|
||||||
|
|
||||||
|
go get -d github.com/tebeka/go2xunit
|
||||||
|
cd $GOPATH/src/github.com/tebeka/go2xunit && go build -o /usr/local/bin/go2xunit .
|
||||||
|
chmod 755 /usr/local/bin/go2xunit
|
||||||
|
[ -x /usr/local/bin/go2xunit ] || abort "go2xunit could not be built"
|
||||||
|
|
||||||
|
rm -rf "$GOPATH"
|
||||||
|
export -n GOPATH
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
# tests require this user and group
|
||||||
|
/usr/sbin/groupadd -r docker >/dev/null 2>&1 || /bin/true
|
||||||
|
/usr/sbin/useradd --create-home --gid docker unprivilegeduser >/dev/null 2>&1 || /bin/true
|
||||||
|
|
||||||
|
# prepare some expected dirs, files, etc...
|
||||||
|
fix_expected $TESTS_DIR/contrib $DOCKER_DIR/contrib
|
||||||
|
fix_expected $DEST/fixtures $DOCKER_DIR/integration-cli/fixtures
|
||||||
|
fix_expected $EXPECTED_CONTAINERD_SOCK $CONTAINERD_SOCK
|
||||||
|
fix_expected $EXPECTED_CONTAINERD_CTR $CONTAINERD_CTR
|
||||||
|
|
||||||
|
export DOCKER_TEST_HOST="tcp://127.0.0.1:2375"
|
||||||
|
export PATH=/usr/local/bin:$PATH
|
||||||
|
export TZ=utc
|
||||||
|
export GOPATH="$FAKE_GOPATH"
|
||||||
|
|
||||||
|
export DOCKER_GRAPHDRIVER="${DOCKER_GRAPHDRIVER:-vfs}"
|
||||||
|
export DOCKER_USERLANDPROXY="${DOCKER_USERLANDPROXY:-true}"
|
||||||
|
#export DOCKER_REMAP_ROOT=default
|
||||||
|
|
||||||
|
# example usage: DOCKER_STORAGE_OPTS="dm.basesize=20G,dm.loopdatasize=200G"
|
||||||
|
storage_params=""
|
||||||
|
if [ -n "$DOCKER_STORAGE_OPTS" ]; then
|
||||||
|
IFS=','
|
||||||
|
for i in ${DOCKER_STORAGE_OPTS}; do
|
||||||
|
storage_params="--storage-opt $i $storage_params"
|
||||||
|
done
|
||||||
|
unset IFS
|
||||||
|
fi
|
||||||
|
# example usage: DOCKER_STORAGE_OPTS="dm.basesize=20G,dm.loopdatasize=200G"
|
||||||
|
extra_params=""
|
||||||
|
|
||||||
|
# deal with remapping
|
||||||
|
save_backup /etc/subuid /etc/subgid
|
||||||
|
echo "dockremap:500000:65536" > /etc/subuid
|
||||||
|
echo "dockremap:500000:65536" > /etc/subgid
|
||||||
|
groupadd dockremap >/dev/null 2>&1 || /bin/true
|
||||||
|
useradd -g dockremap dockremap >/dev/null 2>&1 || /bin/true
|
||||||
|
|
||||||
|
# make sure Docker is stopped, set our config file and then start again
|
||||||
|
save_backup $SYSCFG_DOCKER
|
||||||
|
cat <<SYSCFG_DOCKER_EOF > $SYSCFG_DOCKER
|
||||||
|
DOCKER_OPTS="--log-level=debug \
|
||||||
|
--pidfile=$DEST/docker.pid \
|
||||||
|
-H tcp://127.0.0.1:2375 \
|
||||||
|
--storage-driver=$DOCKER_GRAPHDRIVER \
|
||||||
|
--userland-proxy=$DOCKER_USERLANDPROXY"
|
||||||
|
DOCKER_NETWORK_OPTIONS=""
|
||||||
|
SYSCFG_DOCKER_EOF
|
||||||
|
systemctl reload-or-restart docker.service
|
||||||
|
|
||||||
|
cleanup() {
|
||||||
|
log "Restoring the Docker service..."
|
||||||
|
restore_backup $SYSCFG_DOCKER
|
||||||
|
systemctl reload-or-restart docker.service
|
||||||
|
|
||||||
|
log "Removing extra files and restoring backups..."
|
||||||
|
restore_backup /etc/subuid /etc/subgid
|
||||||
|
rm -f $TESTS_DIR/contrib \
|
||||||
|
$DEST/fixtures \
|
||||||
|
$EXPECTED_CONTAINERD_SOCK \
|
||||||
|
$EXPECTED_CONTAINERD_CTR
|
||||||
|
}
|
||||||
|
trap cleanup EXIT
|
||||||
|
|
||||||
|
cd $DOCKER_DIR
|
||||||
|
|
||||||
|
log "Preparing the environment..."
|
||||||
|
bundle .integration-daemon-start
|
||||||
|
bundle .integration-daemon-setup
|
||||||
|
|
||||||
|
log "Running integration tests..."
|
||||||
|
export DOCKER_HOST=$DOCKER_TEST_HOST
|
||||||
|
cd $DEST && $TESTS_EXE $TEST_ARGS $TEST_SELECT | tee $TEST_LOG || /bin/true
|
||||||
|
if [ -n "$ENABLE_XUNIT" ] ; then
|
||||||
|
log "Generating xunit logs..."
|
||||||
|
go2xunit -fail -gocheck -input $TEST_LOG -output $TEST_LOG.xml
|
||||||
|
fi
|
||||||
|
|
||||||
|
export -n DOCKER_HOST
|
||||||
|
|
||||||
|
bundle .integration-daemon-stop
|
Loading…
Reference in New Issue
Block a user