2017-02-13 14:01:54 -05:00
#!/usr/bin/env bash
2014-12-15 14:44:15 -05:00
set -e
2016-07-18 17:26:35 -04:00
source hack/make/.integration-test-helpers
2019-05-20 10:36:40 -04:00
# The commit or tag to use for testing
# TODO docker 17.06 cli client used in CI fails to build using a sha;
# unable to prepare context: unable to 'git clone' to temporary context directory: error fetching: error: no such remote ref ead0bb9e08c13dd3d1712759491eee06bf5a5602
#: exit status 128
Temporarily switch docker-py to "master"
The docker-py tests were broken, because the version of
py-test that was used, used a dependency that had a new
major release with a breaking change.
Unfortunately, it was not pinned to a specific version,
so when the dependency did the release, py-test broke;
```
22:16:47 Traceback (most recent call last):
22:16:47 File "/usr/local/bin/pytest", line 10, in <module>
22:16:47 sys.exit(main())
22:16:47 File "/usr/local/lib/python3.6/site-packages/_pytest/config/__init__.py", line 61, in main
22:16:47 config = _prepareconfig(args, plugins)
22:16:47 File "/usr/local/lib/python3.6/site-packages/_pytest/config/__init__.py", line 182, in _prepareconfig
22:16:47 config = get_config()
22:16:47 File "/usr/local/lib/python3.6/site-packages/_pytest/config/__init__.py", line 156, in get_config
22:16:47 pluginmanager.import_plugin(spec)
22:16:47 File "/usr/local/lib/python3.6/site-packages/_pytest/config/__init__.py", line 530, in import_plugin
22:16:47 __import__(importspec)
22:16:47 File "/usr/local/lib/python3.6/site-packages/_pytest/tmpdir.py", line 25, in <module>
22:16:47 class TempPathFactory(object):
22:16:47 File "/usr/local/lib/python3.6/site-packages/_pytest/tmpdir.py", line 35, in TempPathFactory
22:16:47 lambda p: Path(os.path.abspath(six.text_type(p)))
22:16:47 TypeError: attrib() got an unexpected keyword argument 'convert'
```
docker-py master has a fix for this (bumping the version of
`py-test`), but it's not in a release yet, and the docker cli that's used
in our CI is pinned to 17.06, which doesn't support building from a remote
git repository from a specific git commit.
To fix the immediate situation, this patch switches the docker-py
tests to run from the master branch.
Signed-off-by: Sebastiaan van Stijn <github@gone.nl>
2019-10-02 11:54:48 -04:00
: "${DOCKER_PY_COMMIT:=master}"
2019-07-13 07:59:18 -04:00
# custom options to pass py.test
2019-08-09 12:51:29 -04:00
# TODO remove these skip once we update to a docker-py version that has https://github.com/docker/docker-py/pull/2369, https://github.com/docker/docker-py/pull/2380, https://github.com/docker/docker-py/pull/2382
2019-08-10 07:07:02 -04:00
: "${PY_TEST_OPTIONS:=\
2019-08-09 12:51:29 -04:00
--deselect=tests/integration/api_swarm_test.py::SwarmTest::test_init_swarm_data_path_addr \
2019-09-02 09:34:34 -04:00
--deselect=tests/integration/api_container_test.py::AttachContainerTest::test_attach_no_stream \
2019-08-09 12:51:29 -04:00
--deselect=tests/integration/api_exec_test.py::ExecTest::test_detach_with_arg \
--deselect=tests/integration/api_exec_test.py::ExecDemuxTest::test_exec_command_tty_stream_no_demux \
--deselect=tests/integration/api_build_test.py::BuildTest::test_build_invalid_platform \
2019-08-10 06:43:28 -04:00
--deselect=tests/integration/api_image_test.py::PullImageTest::test_pull_invalid_platform \
2019-08-10 16:41:18 -04:00
--junitxml=${DEST}/junit-report.xml \
2019-08-10 07:07:02 -04:00
}"
2014-12-15 14:44:15 -05:00
(
2015-04-20 06:21:21 -04:00
bundle .integration-daemon-start
2014-12-15 14:44:15 -05:00
2019-08-10 07:07:02 -04:00
docker_host_scheme=$(echo "${DOCKER_HOST}" | cut -d: -f1 -)
2014-12-15 14:44:15 -05:00
2019-05-20 10:36:40 -04:00
case "${docker_host_scheme}" in
unix)
# trim the tcp:// scheme, and bind-mount the docker socket into the container
2019-08-10 14:21:21 -04:00
run_opts="--mount type=bind,src=${DOCKER_HOST#unix://},dst=/var/run/docker.sock"
2019-05-20 10:36:40 -04:00
;;
2014-12-15 14:44:15 -05:00
2019-05-20 10:36:40 -04:00
tcp)
# run container in host-mode networking so that it can connect to the
# daemon from the current networking namespace (e.g., to connect to localhost)
run_opts="--network=host -e DOCKER_HOST=${DOCKER_HOST}"
;;
*)
echo "WARN: Skipping test-docker-py: connecting to docker daemon using ${docker_host_scheme} (${DOCKER_HOST}) not supported"
bundle .integration-daemon-stop
return 0
esac
docker_py_image="docker-sdk-python3:${DOCKER_PY_COMMIT}"
if ! docker image inspect "dockerPyImage" &> /dev/null; then
echo INFO: Building ${docker_py_image}...
(
[ -n "${TESTDEBUG}" ] && set -x
2019-07-13 12:47:36 -04:00
[ -z "${TESTDEBUG}" ] && build_opts="--quiet"
2019-07-16 06:01:55 -04:00
[ -f /.dockerenv ] || build_opts="${build_opts} --network=host"
2019-08-10 07:07:02 -04:00
# shellcheck disable=SC2086
exec docker build ${build_opts} -t "${docker_py_image}" -f tests/Dockerfile "https://github.com/docker/docker-py.git#${DOCKER_PY_COMMIT}"
2019-05-20 10:36:40 -04:00
)
fi
echo INFO: Starting docker-py tests...
(
[ -n "${TESTDEBUG}" ] && set -x
2019-08-10 16:41:18 -04:00
# shellcheck disable=SC2086,SC2140
exec docker run --rm ${run_opts} --mount type=bind,"src=${ABS_DEST}","dst=/src/${DEST}" "${docker_py_image}" pytest ${PY_TEST_OPTIONS} tests/integration
2019-05-20 10:36:40 -04:00
)
2015-04-20 06:21:21 -04:00
bundle .integration-daemon-stop
Fix daemon start/stop logic in hack/make/* scripts
From the Bash manual's `set -e` description:
(https://www.gnu.org/software/bash/manual/bashref.html#index-set)
> Exit immediately if a pipeline (see Pipelines), which may consist of a
> single simple command (see Simple Commands), a list (see Lists), or a
> compound command (see Compound Commands) returns a non-zero status.
> The shell does not exit if the command that fails is part of the
> command list immediately following a while or until keyword, part of
> the test in an if statement, part of any command executed in a && or
> || list except the command following the final && or ||, any command
> in a pipeline but the last, or if the command’s return status is being
> inverted with !. If a compound command other than a subshell returns a
> non-zero status because a command failed while -e was being ignored,
> the shell does not exit.
Additionally, further down:
> If a compound command or shell function executes in a context where -e
> is being ignored, none of the commands executed within the compound
> command or function body will be affected by the -e setting, even if
> -e is set and a command returns a failure status. If a compound
> command or shell function sets -e while executing in a context where
> -e is ignored, that setting will not have any effect until the
> compound command or the command containing the function call
> completes.
Thus, the only way to have our `.integration-daemon-stop` script
actually run appropriately to clean up our daemon on test/script failure
is to use `trap ... EXIT`, which we traditionally avoid because it does
not have any stacking capabilities, but in this case is a reasonable
compromise because it's going to be the only script using it (for now,
at least; we can evaluate more complex solutions in the future if they
actually become necessary).
The alternatives were much less reasonable. One is to have the entire
complex chains in any script wanting to use `.integration-daemon-start`
/ `.integration-daemon-stop` be chained together with `&&` in an `if`
block, which is untenable. The other I could think of was taking the
body of these scripts out into separate scripts, essentially meaning
we'd need two files for each of these, which further complicates the
maintenance.
Add to that the fact that our `trap ... EXIT` is scoped to the enclosing
subshell (`( ... )`) and we're in even more reasonable territory with
this pattern.
Signed-off-by: Andrew "Tianon" Page <admwiggin@gmail.com>
2015-04-17 18:19:34 -04:00
) 2>&1 | tee -a "$DEST/test.log"