From f431f1f59c1ad8a3bd4afb29766c9e7ea8119686 Mon Sep 17 00:00:00 2001 From: Stef Walter Date: Wed, 27 Sep 2017 13:43:48 +0200 Subject: [PATCH] package_tests: Invoke tests according to the specification Lets invoke tests according to the specification in the following document section 1.7.2 https://fedoraproject.org/wiki/Changes/InvokingTests --- .../ansible/ansible_package_test.sh | 92 +++++++-------- .../package_tests/image/image_package_test.sh | 106 ++++++++---------- 2 files changed, 94 insertions(+), 104 deletions(-) diff --git a/config/Dockerfiles/package_tests/ansible/ansible_package_test.sh b/config/Dockerfiles/package_tests/ansible/ansible_package_test.sh index f5f72555..36f564d2 100755 --- a/config/Dockerfiles/package_tests/ansible/ansible_package_test.sh +++ b/config/Dockerfiles/package_tests/ansible/ansible_package_test.sh @@ -1,50 +1,54 @@ #!/bin/bash +set -eu -# This script requires that the docker run mounts the artifacts -# dir to /tmp/artifacts, the ansible inventory file to /tmp/inventory, -# and the ssh private key to /tmp/ssh_key, so mount some dir with -# the inventory and ssh_key to /tmp and expect artifacts there +# Invoke tests according to section 1.7.2 here: +# https://fedoraproject.org/wiki/Changes/InvokingTests -# Check if there is an upstream first repo for this package -curl -s --head https://upstreamfirst.fedorainfracloud.org/${package} | head -n 1 | grep "HTTP/1.[01] [23].." > /dev/null -if [ $? -ne 0 ]; then - echo "No upstream repo for this package! Exiting..." - exit 0 +if [ -z "${package:-}" ]; then + if [ $# -lt 1 ]; then + echo "No package defined" + exit 2 + else + package="$1" + fi fi -git clone https://upstreamfirst.fedorainfracloud.org/${package} -if [[ $(grep "standard-test-beakerlib" ${package}/*.yml) == "" ]]; then - echo "No beakerlib tests in this repo! Exiting.." - exit 0 + +# Make sure we have or have downloaded the test subject +if [ -z "${TEST_SUBJECTS:-}" ]; then + echo "No subject defined" + exit 2 +elif ! file ${TEST_SUBJECTS:-}; then + wget -q -O testimage.qcow2 ${TEST_SUBJECTS} + export TEST_SUBJECTS=${PWD}/testimage.qcow2 fi -if [ -f ${package}/tests.yml ]; then - if [[ $(ansible-playbook --list-tags ${package}/tests.yml) != *"atomic"* ]]; then - echo "No atomic tagged tests for this package!" - exit 0 - fi - sed 's/hosts: localhost/hosts: all/g' ${package}/tests.yml > ${package}/test_atomic.yml - ansible-playbook -i /tmp/inventory --private-key=/tmp/ssh_key --tags=atomic --start-at-task='Define remote_artifacts if it is not already defined' ${package}/test_atomic.yml - exit $? -# All code from here down is for legacy purposes and does not -# guarantee the tests running are meant to pass on atomic host -elif [ -f ${package}/test_local.yml ]; then - sed 's/hosts: localhost/hosts: all/g' ${package}/test_local.yml > ${package}/test_atomic.yml -else - # Write test_atomic.yml header - cat << EOF > ${package}/test_atomic.yml ---- -- hosts: all - roles: - - role: standard-test-beakerlib - tests: -EOF - # Find the tests - if [ $(find ${package} -name "runtest.sh" | wc -l) -eq 0 ]; then - echo "No runtest.sh files found in package's repo. Exiting..." - exit 1 - fi - for test in $(find ${package} -name "runtest.sh"); do - echo " - $test" >> ${package}/test_atomic.yml - done + +# Check out the dist-git repository for this package +if ! git clone https://src.fedoraproject.org/rpms/${package}; then + echo "No dist-git repo for this package! Exiting..." + exit 0 fi -ansible-playbook -i /tmp/inventory --private-key=/tmp/ssh_key --start-at-task='Define remote_artifacts if it is not already defined' ${package}/test_atomic.yml -exit $? + +# The specification requires us to invoke the tests in the checkout directory +cd ${package} + +# Check out the appropriate branch +# TODO: Where does this branch come from, currently f26? +git checkout f26 + +# The test artifacts must be an empty directory +TEST_ARTIFACTS=${TEST_ARTIFACTS:-$PWD/artifacts} +rm -rf $TEST_ARTIFACTS +export TEST_ARTIFACTS + +# The inventory must be from the test if present (file or directory) or defaults +ANSIBLE_INVENTORY=$(test -e inventory && echo inventory || echo /usr/share/ansible/inventory) +export ANSIBLE_INVENTORY + +# Invoke each playbook according to the specification +for playbook in tests/tests*.yml; do + if [ -f ${playbook} ]; then + ansible-playbook --inventory=$ANSIBLE_INVENTORY \ + --extra-vars "subjects=$TEST_SUBJECTS" --extra-vars "artifacts=$TEST_ARTIFACTS" \ + --tags atomic ${playbook} + fi +done diff --git a/config/Dockerfiles/package_tests/image/image_package_test.sh b/config/Dockerfiles/package_tests/image/image_package_test.sh index b8244dd3..36f564d2 100755 --- a/config/Dockerfiles/package_tests/image/image_package_test.sh +++ b/config/Dockerfiles/package_tests/image/image_package_test.sh @@ -1,68 +1,54 @@ #!/bin/bash +set -eu -# Check if there is an upstream first repo for this package -curl -s --head https://upstreamfirst.fedorainfracloud.org/${package} | head -n 1 | grep "HTTP/1.[01] [23].." > /dev/null -if [ $? -ne 0 ]; then - echo "No upstream repo for this package! Exiting..." - exit 0 -fi -git clone https://upstreamfirst.fedorainfracloud.org/${package} -if [[ $(grep "standard-test-beakerlib" ${package}/*.yml) == "" ]]; then - echo "No beakerlib tests in this repo! Exiting.." - exit 0 +# Invoke tests according to section 1.7.2 here: +# https://fedoraproject.org/wiki/Changes/InvokingTests + +if [ -z "${package:-}" ]; then + if [ $# -lt 1 ]; then + echo "No package defined" + exit 2 + else + package="$1" + fi fi -if [[ $(file ${TEST_SUBJECTS}) == *"No such file or directory"* ]]; then + +# Make sure we have or have downloaded the test subject +if [ -z "${TEST_SUBJECTS:-}" ]; then + echo "No subject defined" + exit 2 +elif ! file ${TEST_SUBJECTS:-}; then wget -q -O testimage.qcow2 ${TEST_SUBJECTS} export TEST_SUBJECTS=${PWD}/testimage.qcow2 fi -if [ -f ${package}/tests.yml ]; then - if [[ $(ansible-playbook --list-tags ${package}/tests.yml) != *"atomic"* ]]; then - echo "No atomic tagged tests for this package!" - exit 0 - fi - # Execute the tests - ansible-playbook --tags atomic ${package}/tests.yml - exit $? + +# Check out the dist-git repository for this package +if ! git clone https://src.fedoraproject.org/rpms/${package}; then + echo "No dist-git repo for this package! Exiting..." + exit 0 fi -# Note: The below code should work, but we are not calling it. -# The reason for this is that if repos do not have a tests.yml file, -# then they have not been modified since test tagging came out, -# which means we have no idea if the tests are meant to run/will pass -# on atomic hosts. -#else -# # Write test_cloud.yml file -# cat << EOF > test_cloud.yml -#--- -#- hosts: localhost -# vars: -# artifacts: ./ -# playbooks: ./${package}/test_local.yml -# vars_prompt: -# - name: subjects -# prompt: "A QCow2/raw test subject file" -# private: no -# -# roles: -# - standard-test-cloud -#EOF -# # Write test_local.yml header -# cat << EOF > ${package}/test_local.yml -#--- -#- hosts: all -# roles: -# - role: standard-test-beakerlib -# tests: -#EOF -# # Find the tests -# if [ $(find ${package} -name "runtest.sh" | wc -l) -eq 0 ]; then -# echo "No runtest.sh files found in package's repo. Exiting..." -# exit 1 -# fi -# for test in $(find ${package} -name "runtest.sh"); do -# echo " - $test" >> ${package}/test_local.yml -# done -# # Execute the tests legacy method -# ansible-playbook test_cloud.yml -e subjects=$TEST_SUBJECTS -e artifacts=$TEST_ARTIFACTS -# exit $? -#fi +# The specification requires us to invoke the tests in the checkout directory +cd ${package} + +# Check out the appropriate branch +# TODO: Where does this branch come from, currently f26? +git checkout f26 + +# The test artifacts must be an empty directory +TEST_ARTIFACTS=${TEST_ARTIFACTS:-$PWD/artifacts} +rm -rf $TEST_ARTIFACTS +export TEST_ARTIFACTS + +# The inventory must be from the test if present (file or directory) or defaults +ANSIBLE_INVENTORY=$(test -e inventory && echo inventory || echo /usr/share/ansible/inventory) +export ANSIBLE_INVENTORY + +# Invoke each playbook according to the specification +for playbook in tests/tests*.yml; do + if [ -f ${playbook} ]; then + ansible-playbook --inventory=$ANSIBLE_INVENTORY \ + --extra-vars "subjects=$TEST_SUBJECTS" --extra-vars "artifacts=$TEST_ARTIFACTS" \ + --tags atomic ${playbook} + fi +done