diff --git a/test/jenkins/checkresult.test b/test/jenkins/checkresult.test new file mode 100755 index 000000000..530145c24 --- /dev/null +++ b/test/jenkins/checkresult.test @@ -0,0 +1,85 @@ +#!/usr/bin/env python +from __future__ import unicode_literals + +import os +import sys +import time + +from ido_mysql import run_query + + +STATE_OK = 0 +TYPE_PASSIVE_CHECK = 1 + +CHECK_INTERVAL = 300 # seconds +CHECKRESULT_READ_INTERVAL = 5 # seconds +CHECKRESULT_LOCATION = '/tmp/icinga2/checkresults' +CHECKRESULT_TEMPLATE = """ +host_name=%(hostname)s +service_description=%(servicename)s +check_type=%(check_type)s +check_options=0 +scheduled_check=0 +reschedule_check=0 +latency=0 +start_time=%(start_time)s +finish_time=%(finish_time)s +early_timeout=0 +exited_ok=%(excited_ok)s +return_code=%(return_code)s +output=%(output)s +""" + + +def main(): + # We need to wait a bit first as Icinga processes a + # checkresult only if its newer than the last check + query = 'select unix_timestamp(s.last_check) as last_check ' \ + 'from icinga_servicestatus as s ' \ + 'inner join icinga_services as c ' \ + 'on s.service_object_id = c.service_object_id ' \ + "where c.display_name = 'PassiveService1'" + state_time = float(next(iter(run_query(query)), {}).get('last_check', '0')) + if state_time == 0: + print '"PassiveService1" seems not to have been checked yet' + return 1 + + if (state_time + CHECK_INTERVAL) - time.time() < 30: + time.sleep(45) + + # Now pass the checkresult in + with open(os.path.join(CHECKRESULT_LOCATION, 'cfoobar'), 'w') as f: + f.write(CHECKRESULT_TEMPLATE % { + 'hostname': 'nsca-ng', + 'servicename': 'PassiveService1', + 'check_type': TYPE_PASSIVE_CHECK, + 'start_time': time.time(), + 'finish_time': time.time(), + 'excited_ok': '1', + 'return_code': STATE_OK, + 'output': 'Passing in CheckResult header files works!' + }) + + # And notfiy Icinga that the file has been completely written... + with open(os.path.join(CHECKRESULT_LOCATION, 'cfoobar.ok'), 'w') as f: + pass + + # Lastly check whether the service changed its state + time.sleep(CHECKRESULT_READ_INTERVAL * 2) + + query = 'select s.output ' \ + 'from icinga_servicestatus as s ' \ + 'inner join icinga_services as c ' \ + 'on s.service_object_id = c.service_object_id ' \ + "where c.display_name = 'PassiveService1'" + output = next(iter(run_query(query)), {}).get('output', '') + if output != 'Passing in CheckResult header files works!': + print 'Checkresult header files seem not to be processed properly' + return 1 + + print 'Checkresult header files are processed properly' + return 0 + + +if __name__ == '__main__': + sys.exit(main()) diff --git a/test/jenkins/files/configs/checkresult.conf b/test/jenkins/files/configs/checkresult.conf new file mode 100644 index 000000000..d5cfd93f4 --- /dev/null +++ b/test/jenkins/files/configs/checkresult.conf @@ -0,0 +1,5 @@ +library "compat" + +object CheckResultReader "reader" { + spool_dir = "/tmp/icinga2/checkresults" +} diff --git a/test/jenkins/files/wait_for_ido.sh b/test/jenkins/files/wait_for_ido.sh new file mode 100755 index 000000000..776f4fc44 --- /dev/null +++ b/test/jenkins/files/wait_for_ido.sh @@ -0,0 +1,38 @@ +#!/bin/sh + +TIMEOUT=30 + +case $1 in + mysql) + TYPE='MySQL' + CMD='/usr/bin/mysql -t -D icinga -u icinga --password=icinga -e' + ;; + pgsql) + TYPE='PostgreSQL' + CMD='/usr/bin/psql -nq -U icinga -d icinga -c' + export PGPASSWORD='icinga' + ;; + *) + echo "No IDO type specifier given!" + exit 1 + ;; +esac + +tries=1 +while true +do + out="`$CMD 'select * from icinga_hosts'`" + + if [ $tries -lt $TIMEOUT ] && [ "$out" == "" ]; + then + sleep 1 + tries=$(($tries + 1)) + else + if [ $tries -eq $TIMEOUT ]; + then + echo "IDO ($TYPE) does not have any hosts or is not responding" >&2 + fi + + break + fi +done diff --git a/test/jenkins/ido_mysql.test b/test/jenkins/ido_mysql.test index 6f9208596..3d1d20a58 100755 --- a/test/jenkins/ido_mysql.test +++ b/test/jenkins/ido_mysql.test @@ -4,7 +4,12 @@ from __future__ import unicode_literals import sys import subprocess -import ido_tests +try: + import ido_tests + IDO_TESTS_FOUND = True +except ImportError: + IDO_TESTS_FOUND = False + MYSQL = b"/usr/bin/mysql" PARAMS = b"-t -D icinga -u icinga --password=icinga -e".split() @@ -82,5 +87,8 @@ def main(): if __name__ == '__main__': + if not IDO_TESTS_FOUND: + raise + sys.exit(main()) diff --git a/test/jenkins/ido_pgsql.test b/test/jenkins/ido_pgsql.test index b03c33a5b..9011e87d8 100755 --- a/test/jenkins/ido_pgsql.test +++ b/test/jenkins/ido_pgsql.test @@ -4,7 +4,12 @@ from __future__ import unicode_literals import sys import subprocess -import ido_tests +try: + import ido_tests + IDO_TESTS_FOUND = True +except ImportError: + IDO_TESTS_FOUND = False + PSQL = b"/usr/bin/psql" PARAMS = b"-nq -U icinga -d icinga -c".split() @@ -87,5 +92,8 @@ def main(): if __name__ == '__main__': + if not IDO_TESTS_FOUND: + raise + sys.exit(main()) diff --git a/test/jenkins/run_tests.conf b/test/jenkins/run_tests.conf index 864af44e3..d257e00d5 100644 --- a/test/jenkins/run_tests.conf +++ b/test/jenkins/run_tests.conf @@ -15,6 +15,31 @@ "teardown": { "clean": ["/tmp/ido_tests.py", "/tmp/ido_tests.pyc"] } + }, + "checkresult.test": { + "setup": { + "copy": [ + "files/configs/checkresult.conf >> /tmp/checkresult.conf", + "files/wait_for_ido.sh >> /tmp/wait_for_ido.sh", + "ido_mysql.test >> /tmp/ido_mysql.py" + ], + "exec": [ + "sudo mv /tmp/checkresult.conf /etc/icinga2/conf.d/", + "mkdir -p -m 0777 /tmp/icinga2/checkresults", + "sudo service icinga2 restart", + "/tmp/wait_for_ido.sh mysql" + ] + }, + "teardown": { + "clean": ["/tmp/ido_mysql.py*"], + "exec": [ + "sudo rm /etc/icinga2/conf.d/checkresult.conf", + "sudo service icinga2 restart", + "rmdir /tmp/icinga2/checkresults", + "/tmp/wait_for_ido.sh mysql", + "/tmp/wait_for_ido.sh pgsql && rm /tmp/wait_for_ido.sh" + ] + } } } }