diff --git a/tests_new/integration/destructive.yml b/tests_new/integration/destructive.yml index 26258424e98..d3e0001d91f 100644 --- a/tests_new/integration/destructive.yml +++ b/tests_new/integration/destructive.yml @@ -1,6 +1,7 @@ - hosts: testhost gather_facts: True roles: + - { role: test_service, tags: test_service } - { role: test_pip, tags: test_pip } - { role: test_gem, tags: test_gem } diff --git a/tests_new/integration/roles/test_service/files/ansible.systemd b/tests_new/integration/roles/test_service/files/ansible.systemd new file mode 100644 index 00000000000..4517433fd2c --- /dev/null +++ b/tests_new/integration/roles/test_service/files/ansible.systemd @@ -0,0 +1,7 @@ +[Unit] +Description=Ansible Test Service + +[Service] +ExecStart=/usr/sbin/ansible_test_service +ExecReload=/bin/true +Type=forking diff --git a/tests_new/integration/roles/test_service/files/ansible.sysv b/tests_new/integration/roles/test_service/files/ansible.sysv new file mode 100755 index 00000000000..372ea6e5b98 --- /dev/null +++ b/tests_new/integration/roles/test_service/files/ansible.sysv @@ -0,0 +1,134 @@ +#!/bin/sh +# + +# LSB header + +### BEGIN INIT INFO +# Provides: ansible-test +# Default-Start: 3 4 5 +# Default-Stop: 0 1 2 6 +# Short-Description: test daemon for ansible +# Description: This is a test daemon used by ansible for testing only +### END INIT INFO + +# chkconfig header + +# chkconfig: 345 99 99 +# description: This is a test daemon used by ansible for testing only +# +# processname: /usr/sbin/ansible_test_service + +# Sanity checks. +[ -x /usr/sbin/ansible_test_service ] || exit 0 + +DEBIAN_VERSION=/etc/debian_version +SUSE_RELEASE=/etc/SuSE-release +# Source function library. +if [ -f $DEBIAN_VERSION ]; then + . /lib/lsb/init-functions +elif [ -f $SUSE_RELEASE -a -r /etc/rc.status ]; then + . /etc/rc.status +else + . /etc/rc.d/init.d/functions +fi + +SERVICE=ansible_test_service +PROCESS=ansible_test_service +CONFIG_ARGS=" " +if [ -f $DEBIAN_VERSION ]; then + LOCKFILE=/var/lock/$SERVICE +else + LOCKFILE=/var/lock/subsys/$SERVICE +fi + +RETVAL=0 + +start() { + echo -n "Starting ansible test daemon: " + if [ -f $SUSE_RELEASE ]; then + startproc -p /var/run/${SERVICE}.pid -f /usr/sbin/ansible_test_service + rc_status -v + elif [ -e $DEBIAN_VERSION ]; then + if [ -f $LOCKFILE ]; then + echo -n "already started, lock file found" + RETVAL=1 + elif /bin/python /usr/sbin/ansible_test_service; then + echo -n "OK" + RETVAL=0 + fi + else + daemon --check $SERVICE $PROCESS --daemonize $CONFIG_ARGS + fi + RETVAL=$? + echo + [ $RETVAL -eq 0 ] && touch $LOCKFILE + return $RETVAL +} + +stop() { + echo -n "Stopping ansible test daemon: " + if [ -f $SUSE_RELEASE ]; then + killproc -TERM /usr/sbin/ansible_test_service + rc_status -v + elif [ -f $DEBIAN_VERSION ]; then + # Added this since Debian's start-stop-daemon doesn't support spawned processes + if ps -ef | grep "/bin/python /usr/sbin/ansible_test_service" | grep -v grep | awk '{print $2}' | xargs kill &> /dev/null; then + echo -n "OK" + RETVAL=0 + else + echo -n "Daemon is not started" + RETVAL=1 + fi + else + killproc -p /var/run/${SERVICE}.pid + fi + RETVAL=$? + echo + if [ $RETVAL -eq 0 ]; then + rm -f $LOCKFILE + rm -f /var/run/$SERVICE.pid + fi +} + +restart() { + stop + start +} + +# See how we were called. +case "$1" in + start|stop|restart) + $1 + ;; + status) + if [ -f $SUSE_RELEASE ]; then + echo -n "Checking for ansible test service " + checkproc /usr/sbin/ansible_test_service + rc_status -v + elif [ -f $DEBIAN_VERSION ]; then + if [ -f $LOCKFILE ]; then + RETVAL=0 + echo "ansible test is running." + else + RETVAL=1 + echo "ansible test is stopped." + fi + else + status $PROCESS + RETVAL=$? + fi + ;; + condrestart) + [ -f $LOCKFILE ] && restart || : + ;; + reload) + echo "ok" + RETVAL=0 + ;; + *) + echo "Usage: $0 {start|stop|status|restart|condrestart|reload}" + exit 1 + ;; +esac +exit $RETVAL + diff --git a/tests_new/integration/roles/test_service/files/ansible.upstart b/tests_new/integration/roles/test_service/files/ansible.upstart new file mode 100644 index 00000000000..369f61a83cb --- /dev/null +++ b/tests_new/integration/roles/test_service/files/ansible.upstart @@ -0,0 +1,9 @@ +description "ansible test daemon" + +start on runlevel [345] +stop on runlevel [!345] + +expect daemon + +exec ansible_test_service + diff --git a/tests_new/integration/roles/test_service/files/ansible_test_service b/tests_new/integration/roles/test_service/files/ansible_test_service new file mode 100755 index 00000000000..66c3a3a2d4c --- /dev/null +++ b/tests_new/integration/roles/test_service/files/ansible_test_service @@ -0,0 +1,67 @@ +#!/usr/bin/env python + +# this is mostly based off of the code found here: +# http://code.activestate.com/recipes/278731-creating-a-daemon-the-python-way/ + +import os +import resource +import sys +import time + +UMASK = 0 +WORKDIR = "/" +MAXFD = 1024 + +if (hasattr(os, "devnull")): + REDIRECT_TO = os.devnull +else: + REDIRECT_TO = "/dev/null" + +def createDaemon(): + try: + pid = os.fork() + except OSError, e: + raise Exception, "%s [%d]" % (e.strerror, e.errno) + + if (pid == 0): + os.setsid() + + try: + pid = os.fork() + except OSError, e: + raise Exception, "%s [%d]" % (e.strerror, e.errno) + + if (pid == 0): + os.chdir(WORKDIR) + os.umask(UMASK) + else: + f = open('/var/run/ansible_test_service.pid', 'w') + f.write("%d\n" % pid) + f.close() + os._exit(0) + else: + os._exit(0) + + maxfd = resource.getrlimit(resource.RLIMIT_NOFILE)[1] + if (maxfd == resource.RLIM_INFINITY): + maxfd = MAXFD + + for fd in range(0, maxfd): + try: + os.close(fd) + except OSError: # ERROR, fd wasn't open to begin with (ignored) + pass + + os.open(REDIRECT_TO, os.O_RDWR) + os.dup2(0, 1) + os.dup2(0, 2) + + return(0) + +if __name__ == "__main__": + + retCode = createDaemon() + + while True: + time.sleep(1000) + diff --git a/tests_new/integration/roles/test_service/meta/main.yml b/tests_new/integration/roles/test_service/meta/main.yml new file mode 100644 index 00000000000..07faa217762 --- /dev/null +++ b/tests_new/integration/roles/test_service/meta/main.yml @@ -0,0 +1,2 @@ +dependencies: + - prepare_tests diff --git a/tests_new/integration/roles/test_service/tasks/main.yml b/tests_new/integration/roles/test_service/tasks/main.yml new file mode 100644 index 00000000000..a9da5d951a8 --- /dev/null +++ b/tests_new/integration/roles/test_service/tasks/main.yml @@ -0,0 +1,108 @@ +- name: install the test daemon script + copy: src=ansible_test_service dest=/usr/sbin/ansible_test_service mode=755 + register: install_result + +- name: assert that the daemon script was installed + assert: + that: + - "install_result.dest == '/usr/sbin/ansible_test_service'" + - "install_result.md5sum == '9ad49eaf390b30b1206b793ec71200ed'" + - "install_result.state == 'file'" + - "install_result.mode == '0755'" + +- include: 'sysv_setup.yml' + when: ansible_distribution in ('RHEL', 'CentOS', 'ScientificLinux') +- include: 'systemd_setup.yml' + when: ansible_distribution == 'Fedora' +- include: 'upstart_setup.yml' + when: ansible_distribution == 'Ubuntu' + +- name: enable the ansible test service + service: name=ansible_test enabled=yes + register: enable_result + +- name: assert that the service was enabled + assert: + that: + - "enable_result.enabled == true" + +- name: start the ansible test service + service: name=ansible_test state=started + register: start_result + +- name: assert that the service was started + assert: + that: + - "start_result.state == 'started'" + +- name: find the service with a pattern + service: name=ansible_test pattern="ansible_test_ser*" state=started + register: start2_result + +- name: assert that the service was started via the pattern + assert: + that: + - "start2_result.name == 'ansible_test'" + - "start2_result.state == 'started'" + +- name: restart the ansible test service + service: name=ansible_test state=restarted + register: restart_result + +- name: assert that the service was restarted + assert: + that: + - "restart_result.state == 'started'" + +- name: restart the ansible test service with a sleep + service: name=ansible_test state=restarted sleep=2 + register: restart_sleep_result + +- name: assert that the service was restarted with a sleep + assert: + that: + - "restart_sleep_result.state == 'started'" + +- name: reload the ansible test service + service: name=ansible_test state=reloaded + register: reload_result + +- name: assert that the service was reloaded + assert: + that: + - "reload_result.state == 'started'" + +- name: stop the ansible test service + service: name=ansible_test state=stopped + register: stop_result + +- name: assert that the service was stopped + assert: + that: + - "stop_result.state == 'stopped'" + +- name: disable the ansible test service + service: name=ansible_test enabled=no + register: disable_result + +- name: assert that the service was disabled + assert: + that: + - "disable_result.enabled == false" + +- name: remove the test daemon script + file: path=/usr/sbin/ansible_test_service state=absent + register: remove_result + +- name: assert that the test daemon script was removed + assert: + that: + - "remove_result.path == '/usr/sbin/ansible_test_service'" + - "remove_result.state == 'absent'" + +- include: 'sysv_cleanup.yml' + when: ansible_distribution in ('RHEL', 'CentOS', 'ScientificLinux') +- include: 'systemd_cleanup.yml' + when: ansible_distribution == 'Fedora' +- include: 'upstart_cleanup.yml' + when: ansible_distribution == 'Ubuntu' diff --git a/tests_new/integration/roles/test_service/tasks/systemd_cleanup.yml b/tests_new/integration/roles/test_service/tasks/systemd_cleanup.yml new file mode 100644 index 00000000000..5a3abf46f0f --- /dev/null +++ b/tests_new/integration/roles/test_service/tasks/systemd_cleanup.yml @@ -0,0 +1,19 @@ +- name: remove the systemd unit file + file: path=/usr/lib/systemd/system/ansible_test.service state=absent + register: remove_systemd_result + +- name: assert that the systemd unit file was removed + assert: + that: + - "remove_systemd_result.path == '/usr/lib/systemd/system/ansible_test.service'" + - "remove_systemd_result.state == 'absent'" + +- name: make sure systemd is reloaded + shell: systemctl daemon-reload + register: restart_systemd_result + +- name: assert that systemd was reloaded + assert: + that: + - "restart_systemd_result.rc == 0" + diff --git a/tests_new/integration/roles/test_service/tasks/systemd_setup.yml b/tests_new/integration/roles/test_service/tasks/systemd_setup.yml new file mode 100644 index 00000000000..ca8d4078e64 --- /dev/null +++ b/tests_new/integration/roles/test_service/tasks/systemd_setup.yml @@ -0,0 +1,12 @@ +- name: install the systemd unit file + copy: src=ansible.systemd dest=/usr/lib/systemd/system/ansible_test.service + register: install_systemd_result + +- name: assert that the systemd unit file was installed + assert: + that: + - "install_systemd_result.dest == '/usr/lib/systemd/system/ansible_test.service'" + - "install_systemd_result.state == 'file'" + - "install_systemd_result.mode == '0644'" + - "install_systemd_result.md5sum == 'f634df77d9160ab05bad4ed49d82a0d0'" + diff --git a/tests_new/integration/roles/test_service/tasks/sysv_cleanup.yml b/tests_new/integration/roles/test_service/tasks/sysv_cleanup.yml new file mode 100644 index 00000000000..b42744391bb --- /dev/null +++ b/tests_new/integration/roles/test_service/tasks/sysv_cleanup.yml @@ -0,0 +1,10 @@ +- name: remove the sysV init file + file: path=/etc/init.d/ansible_test state=absent + register: remove_sysv_result + +- name: assert that the sysV init file was removed + assert: + that: + - "remove_sysv_result.path == '/etc/init.d/ansible_test'" + - "remove_sysv_result.state == 'absent'" + diff --git a/tests_new/integration/roles/test_service/tasks/sysv_setup.yml b/tests_new/integration/roles/test_service/tasks/sysv_setup.yml new file mode 100644 index 00000000000..83a1d6a8c48 --- /dev/null +++ b/tests_new/integration/roles/test_service/tasks/sysv_setup.yml @@ -0,0 +1,12 @@ +- name: install the sysV init file + copy: src=ansible.sysv dest=/etc/init.d/ansible_test mode=0755 + register: install_sysv_result + +- name: assert that the sysV init file was installed + assert: + that: + - "install_sysv_result.dest == '/etc/init.d/ansible_test'" + - "install_sysv_result.state == 'file'" + - "install_sysv_result.mode == '0755'" + - "install_sysv_result.md5sum == 'ebf6a9064ca8628187f3a6caf8e2a279'" + diff --git a/tests_new/integration/roles/test_service/tasks/upstart_cleanup.yml b/tests_new/integration/roles/test_service/tasks/upstart_cleanup.yml new file mode 100644 index 00000000000..3c4e4e50477 --- /dev/null +++ b/tests_new/integration/roles/test_service/tasks/upstart_cleanup.yml @@ -0,0 +1,10 @@ +- name: remove the upstart init file + file: path=/etc/init/ansible_test state=absent + register: remove_upstart_result + +- name: assert that the upstart init file was removed + assert: + that: + - "remove_upstart_result.path == '/etc/init/ansible_test'" + - "remove_upstart_result.state == 'absent'" + diff --git a/tests_new/integration/roles/test_service/tasks/upstart_setup.yml b/tests_new/integration/roles/test_service/tasks/upstart_setup.yml new file mode 100644 index 00000000000..70fbee26d05 --- /dev/null +++ b/tests_new/integration/roles/test_service/tasks/upstart_setup.yml @@ -0,0 +1,12 @@ +- name: install the upstart init file + copy: src=ansible.upstart dest=/etc/init/ansible_test mode=0755 + register: install_upstart_result + +- name: assert that the upstart init file was installed + assert: + that: + - "install_upstart_result.dest == '/etc/init/ansible_test'" + - "install_upstart_result.state == 'file'" + - "install_upstart_result.mode == '0755'" + - "install_upstart_result.md5sum == 'ab3900ea4de8423add764c12aeb90c01'" + diff --git a/tests_new/integration/roles/test_service/templates/main.yml b/tests_new/integration/roles/test_service/templates/main.yml new file mode 100644 index 00000000000..e69de29bb2d