diff options
-rw-r--r-- | test-requirements.txt | 1 | ||||
-rw-r--r-- | test/integration/README.md | 35 | ||||
-rwxr-xr-x | test/integration/build-images.sh | 101 | ||||
-rw-r--r-- | test/integration/openshift_health_checker/builds/build-container-images.yml | 19 | ||||
-rw-r--r-- | test/integration/openshift_health_checker/builds/test-target-base/Dockerfile (renamed from test/integration/openshift_health_checker/builds/Dockerfile.test-target-base) | 0 | ||||
-rw-r--r-- | test/integration/openshift_health_checker/common.go | 2 | ||||
-rw-r--r-- | test/integration/openshift_health_checker/setup_container.yml | 2 | ||||
-rwxr-xr-x | test/integration/run-tests.sh | 80 | ||||
-rw-r--r-- | tox.ini | 14 |
9 files changed, 221 insertions, 33 deletions
diff --git a/test-requirements.txt b/test-requirements.txt index 06883390b..585cca0b9 100644 --- a/test-requirements.txt +++ b/test-requirements.txt @@ -12,4 +12,3 @@ coverage==4.3.4 mock==2.0.0 pytest==3.0.7 pytest-cov==2.4.0 -docker-py==1.10.6 diff --git a/test/integration/README.md b/test/integration/README.md index 0edbccd74..948e44c50 100644 --- a/test/integration/README.md +++ b/test/integration/README.md @@ -1,12 +1,39 @@ # Integration tests -Integration tests exercise the OpenShift Ansible playbooks by performing -simulated installations in Docker containers. +Integration tests exercise the OpenShift Ansible playbooks by running them +against an inventory with Docker containers as hosts. + +## Requirements + +The tests assume that: + +* docker is running on localhost and the present user has access to use it. +* golang is installed and the go binary is in PATH. +* python and tox are installed. + +## Building images + +The tests rely on images built in the local docker index. You can build them +from the repository root with: + +``` +./test/integration/build-images.sh +``` + +Use the `--help` option to view available options. ## Running the tests -From the repository root, run with: +From the repository root, run the integration tests with: + +``` +./test/integration/run-tests.sh +``` + +Use the `--help` option to view available options. + +You can also run tests more directly, for example to run a specific check: ``` -tox -e integration +go test ./test/integration/... -run TestPackageUpdateDepMissing ``` diff --git a/test/integration/build-images.sh b/test/integration/build-images.sh new file mode 100755 index 000000000..74a55fa51 --- /dev/null +++ b/test/integration/build-images.sh @@ -0,0 +1,101 @@ +#!/bin/bash + +# This is intended to run either locally (in which case a push is not +# necessary) or in a CI job (where the results should be pushed to a +# registry for use in later CI test jobs). Images are tagged locally with +# both the base name (e.g. "test-target-base") and with the prefix given; +# then only the prefixed name is pushed if --push is specified, assuming +# any necessary credentials are available for the push. The same prefix +# can then be used for the testing script. By default a local (non-registry) +# prefix is used and no push can occur. To push to e.g. dockerhub: +# +# ./build-images.sh --push --prefix=docker.io/openshift/ansible-integration- + +set -o errexit +set -o nounset +set -o pipefail + +STARTTIME=$(date +%s) +source_root=$(dirname "${0}") + +prefix="${PREFIX:-openshift-ansible-integration-}" +push=false +verbose=false +build_options="${DOCKER_BUILD_OPTIONS:-}" +help=false + +for args in "$@" +do + case $args in + --prefix=*) + prefix="${args#*=}" + ;; + --push) + push=true + ;; + --no-cache) + build_options="${build_options} --no-cache" + ;; + --verbose) + verbose=true + ;; + --help) + help=true + ;; + esac +done + +if [ "$help" = true ]; then + echo "Builds the docker images for openshift-ansible integration tests" + echo "and pushes them to a central registry." + echo + echo "Options: " + echo " --prefix=PREFIX" + echo " The prefix to use for the image names." + echo " default: openshift-ansible-integration-" + echo + echo " --push" + echo " If set will push the tagged image" + echo + echo " --no-cache" + echo " If set will perform the build without a cache." + echo + echo " --verbose" + echo " Enables printing of the commands as they run." + echo + echo " --help" + echo " Prints this help message" + echo + exit 0 +fi + +if [ "$verbose" = true ]; then + set -x +fi + + +declare -a build_order ; declare -A images +build_order+=( test-target-base ) ; images[test-target-base]=openshift_health_checker/builds/test-target-base +build_order+=( preflight-aos-package-checks ); images[preflight-aos-package-checks]=openshift_health_checker/builds/aos-package-checks +for image in "${build_order[@]}"; do + BUILD_STARTTIME=$(date +%s) + docker_tag=${prefix}${image} + echo + echo "--- Building component '$image' with docker tag '$docker_tag' ---" + docker build ${build_options} -t $image -t $docker_tag "$source_root/${images[$image]}" + echo + BUILD_ENDTIME=$(date +%s); echo "--- build $docker_tag took $(($BUILD_ENDTIME - $BUILD_STARTTIME)) seconds ---" + if [ "$push" = true ]; then + docker push $docker_tag + PUSH_ENDTIME=$(date +%s); echo "--- push $docker_tag took $(($PUSH_ENDTIME - $BUILD_ENDTIME)) seconds ---" + fi +done + +echo +echo +echo "++ Active images" +docker images | grep ${prefix} | sort +echo + + +ret=$?; ENDTIME=$(date +%s); echo "$0 took $(($ENDTIME - $STARTTIME)) seconds"; exit "$ret" diff --git a/test/integration/openshift_health_checker/builds/build-container-images.yml b/test/integration/openshift_health_checker/builds/build-container-images.yml deleted file mode 100644 index 445d73d29..000000000 --- a/test/integration/openshift_health_checker/builds/build-container-images.yml +++ /dev/null @@ -1,19 +0,0 @@ ---- -- name: Build all the images we need for running integration tests - hosts: localhost - connection: local - tasks: - - - name: test-target-base - docker_image: - state: present - path: ./ - dockerfile: Dockerfile.test-target-base - name: test-target-base - - - name: preflight-aos-package-checks - docker_image: - state: present - pull: no - path: ./aos-package-checks - name: preflight-aos-package-checks diff --git a/test/integration/openshift_health_checker/builds/Dockerfile.test-target-base b/test/integration/openshift_health_checker/builds/test-target-base/Dockerfile index 39b33c057..39b33c057 100644 --- a/test/integration/openshift_health_checker/builds/Dockerfile.test-target-base +++ b/test/integration/openshift_health_checker/builds/test-target-base/Dockerfile diff --git a/test/integration/openshift_health_checker/common.go b/test/integration/openshift_health_checker/common.go index aea85342f..a92d6861d 100644 --- a/test/integration/openshift_health_checker/common.go +++ b/test/integration/openshift_health_checker/common.go @@ -25,7 +25,7 @@ func (p PlaybookTest) Run(t *testing.T) { // A PlaybookTest is intended to be run in parallel with other tests. t.Parallel() - cmd := exec.Command("ansible-playbook", p.Path) + cmd := exec.Command("ansible-playbook", "-i", "/dev/null", p.Path) cmd.Env = append(os.Environ(), "ANSIBLE_FORCE_COLOR=1") b, err := cmd.CombinedOutput() diff --git a/test/integration/openshift_health_checker/setup_container.yml b/test/integration/openshift_health_checker/setup_container.yml index 4dd2c4b1e..8793d954e 100644 --- a/test/integration/openshift_health_checker/setup_container.yml +++ b/test/integration/openshift_health_checker/setup_container.yml @@ -23,7 +23,7 @@ - name: start container docker_container: name: "{{ container_name }}" - image: "{{ image | default('test-target-base') }}" + image: "{{ lookup('env', 'IMAGE_PREFIX') | default('openshift-ansible-integration-', true) }}{{ image | default('test-target-base') }}" command: "{{ command | default('sleep 1800') }}" recreate: yes # NOTE: When/if we need to run containers that are docker hosts as well: diff --git a/test/integration/run-tests.sh b/test/integration/run-tests.sh new file mode 100755 index 000000000..680b64602 --- /dev/null +++ b/test/integration/run-tests.sh @@ -0,0 +1,80 @@ +#!/bin/bash + +# This script runs the golang integration tests in the directories underneath. +# It should be run from the same directory it is in, or in a directory above. +# Specify the same image prefix used (if any) with build-images.sh +# +# Example: +# ./run-tests.sh --prefix=docker.io/openshift/ansible-integration- --parallel=16 + +set -o errexit +set -o nounset +set -o pipefail + +source_root=$(dirname "${0}") + +prefix="${PREFIX:-openshift-ansible-integration-}" +gotest_options="${GOTEST_OPTIONS:--v}" +push=false +verbose=false +help=false + +for args in "$@" +do + case $args in + --prefix=*) + prefix="${args#*=}" + ;; + --parallel=*) + gotest_options="${gotest_options} -parallel ${args#*=}" + ;; + --verbose) + verbose=true + ;; + --help) + help=true + ;; + esac +done + +if [ "$help" = true ]; then + echo "Runs the openshift-ansible integration tests." + echo + echo "Options: " + echo " --prefix=PREFIX" + echo " The prefix to use for the image names." + echo " default: openshift-ansible-integration-" + echo + echo " --parallel=NUMBER" + echo " Number of tests to run in parallel." + echo " default: GOMAXPROCS (typically, number of processors)" + echo + echo " --verbose" + echo " Enables printing of the commands as they run." + echo + echo " --help" + echo " Prints this help message" + echo + exit 0 +fi + + + +if ! [ -d $source_root/../../.tox/integration ]; then + # have tox create a consistent virtualenv + pushd $source_root/../..; tox -e integration; popd +fi +# use the virtualenv from tox +set +o nounset; source $source_root/../../.tox/integration/bin/activate; set -o nounset + +if [ "$verbose" = true ]; then + set -x +fi + +# Run the tests. NOTE: "go test" requires a relative path for this purpose. +# The PWD trick below will only work if cwd is in/above where this script lives. +retval=0 +IMAGE_PREFIX="${prefix}" env -u GOPATH \ + go test ./${source_root#$PWD}/... ${gotest_options} + + @@ -13,8 +13,7 @@ deps = -rrequirements.txt -rtest-requirements.txt py35-flake8: flake8-bugbear==17.3.0 - -whitelist_externals = env + integration: docker-py==1.10.6 commands = unit: pip install -e utils @@ -25,8 +24,9 @@ commands = generate_validation: python setup.py generate_validation # TODO(rhcarvalho): check syntax of other important entrypoint playbooks ansible_syntax: python setup.py ansible_syntax - - # Unset GOPATH because tests use relative imports. This should be removed if - # we require openshift-ansible to live in a Go work space and use absolute - # imports in tests (desirable). - integration: env -u GOPATH go test -v ./test/integration/... + # ansible 2.2.2+ unfortunately breaks the integration test runner + # because it can no longer set facts on the test docker hosts. + # So for now, install separate ansible version for integration. + # PR that fixes it: https://github.com/ansible/ansible/pull/23599 + # Once that PR is available, drop this and use same ansible. + integration: pip install ansible==2.2.1.0 |