|
| 1 | +#!/bin/bash |
| 2 | +# |
| 3 | +# Ansible role test shim. |
| 4 | +# |
| 5 | +# Usage: [OPTIONS] ./tests/test.sh |
| 6 | +# - distro: a supported Docker distro version (default = "centos7") |
| 7 | +# - playbook: a playbook in the tests directory (default = "test.yml") |
| 8 | +# - cleanup: whether to remove the Docker container (default = true) |
| 9 | +# - container_id: the --name to set for the container (default = timestamp) |
| 10 | + |
| 11 | +# Exit on any individual command failure. |
| 12 | +set -e |
| 13 | + |
| 14 | +# Pretty colors. |
| 15 | +red='\033[0;31m' |
| 16 | +green='\033[0;32m' |
| 17 | +neutral='\033[0m' |
| 18 | + |
| 19 | +timestamp=$(date +%s) |
| 20 | + |
| 21 | +# Allow environment variables to override defaults. |
| 22 | +distro=${distro:-"ubuntu1804"} |
| 23 | +playbook=${playbook:-"test.yml"} |
| 24 | +cleanup=${cleanup:-"true"} |
| 25 | +container_id=${container_id:-$timestamp} |
| 26 | + |
| 27 | +## Set up vars for Docker setup. |
| 28 | +init="/lib/systemd/systemd" |
| 29 | +opts="--privileged --volume=/sys/fs/cgroup:/sys/fs/cgroup:ro" |
| 30 | + |
| 31 | +# Run the container using the supplied OS. |
| 32 | +printf ${green}"Starting Docker container: geerlingguy/docker-$distro-ansible."${neutral}"\n" |
| 33 | +docker pull geerlingguy/docker-$distro-ansible:latest |
| 34 | +docker run --detach --volume="$PWD":/etc/ansible/roles/role_under_test:rw --name $container_id $opts geerlingguy/docker-$distro-ansible:latest $init |
| 35 | + |
| 36 | +printf "\n" |
| 37 | + |
| 38 | +# Install requirements if `requirements.yml` is present. |
| 39 | +if [ -f "$PWD/tests/requirements.yml" ]; then |
| 40 | + printf ${green}"Requirements file detected; installing dependencies."${neutral}"\n" |
| 41 | + docker exec --tty $container_id env TERM=xterm ansible-galaxy install -r /etc/ansible/roles/role_under_test/tests/requirements.yml |
| 42 | +fi |
| 43 | + |
| 44 | +printf "\n" |
| 45 | + |
| 46 | +# Test Ansible syntax. |
| 47 | +printf ${green}"Checking Ansible playbook syntax."${neutral} |
| 48 | +docker exec --tty $container_id env TERM=xterm ansible-playbook /etc/ansible/roles/role_under_test/tests/$playbook --syntax-check |
| 49 | + |
| 50 | +printf "\n" |
| 51 | + |
| 52 | +# Run Ansible playbook. |
| 53 | +printf ${green}"Running command: docker exec $container_id env TERM=xterm ansible-playbook /etc/ansible/roles/role_under_test/tests/$playbook"${neutral} |
| 54 | +docker exec $container_id env TERM=xterm env ANSIBLE_FORCE_COLOR=1 ansible-playbook /etc/ansible/roles/role_under_test/tests/$playbook |
| 55 | + |
| 56 | +# Run Ansible playbook again (idempotence test). |
| 57 | +printf ${green}"Running playbook again: idempotence test"${neutral} |
| 58 | +idempotence=$(mktemp) |
| 59 | +docker exec $container_id ansible-playbook /etc/ansible/roles/role_under_test/tests/$playbook | tee -a $idempotence |
| 60 | +tail $idempotence \ |
| 61 | + | grep -q 'changed=0.*failed=0' \ |
| 62 | + && (printf ${green}'Idempotence test: pass'${neutral}"\n") \ |
| 63 | + || (printf ${red}'Idempotence test: fail'${neutral}"\n" && exit 1) |
| 64 | + |
| 65 | + |
| 66 | +printf ${green}"Testing Start Handlers and Service\n"${neutral} |
| 67 | +docker exec $container_id ansible-playbook /etc/ansible/roles/role_under_test/tests/$playbook -e 'test_handlers=True test_service=True' |
| 68 | +printf ${green}"Handlers and Service test passed\n"${neutra} |
| 69 | + |
| 70 | + |
| 71 | +# Remove the Docker container (if configured). |
| 72 | +if [ "$cleanup" = true ]; then |
| 73 | + printf "Removing Docker container...\n" |
| 74 | + docker rm -f $container_id |
| 75 | +fi |
0 commit comments