2013-04-09 09:05:55 +04:00
# Copyright (c) 2013 AnsibleWorks, Inc.
2013-03-29 09:02:07 +04:00
#
2013-04-09 09:05:55 +04:00
# This file is part of Ansible Commander.
#
2013-03-29 09:02:07 +04:00
# Ansible Commander is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
2013-04-09 09:05:55 +04:00
# the Free Software Foundation, version 3 of the License.
2013-03-29 09:02:07 +04:00
#
# Ansible Commander is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
2013-04-09 09:05:55 +04:00
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
2013-03-29 09:02:07 +04:00
# GNU General Public License for more details.
2013-04-09 09:05:55 +04:00
#
2013-03-29 09:02:07 +04:00
# You should have received a copy of the GNU General Public License
2013-04-09 09:05:55 +04:00
# along with Ansible Commander. If not, see <http://www.gnu.org/licenses/>.
2013-03-29 09:02:07 +04:00
2013-04-01 01:25:18 +04:00
import os
2013-04-19 23:40:08 +04:00
import shutil
2013-04-01 01:25:18 +04:00
import tempfile
from django . conf import settings
from django . test . utils import override_settings
2013-03-29 09:02:07 +04:00
from lib . main . models import *
2013-04-01 01:25:18 +04:00
from lib . main . tests . base import BaseTransactionTest
2013-03-29 09:02:07 +04:00
2013-04-01 01:25:18 +04:00
TEST_PLAYBOOK = ''' - hosts: test-group
gather_facts : False
tasks :
- name : should pass
command : test 1 = 1
2013-04-16 03:22:57 +04:00
- name : should also pass
command : test 2 = 2
2013-04-01 01:25:18 +04:00
'''
2013-04-01 07:23:15 +04:00
TEST_PLAYBOOK2 = ''' - hosts: test-group
gather_facts : False
tasks :
- name : should fail
command : test 1 = 0
'''
2013-04-01 01:25:18 +04:00
@override_settings ( CELERY_ALWAYS_EAGER = True ,
CELERY_EAGER_PROPAGATES_EXCEPTIONS = True )
class BaseCeleryTest ( BaseTransactionTest ) :
'''
Base class for celery task tests .
'''
@override_settings ( ANSIBLE_TRANSPORT = ' local ' )
2013-04-18 02:59:21 +04:00
class RunJobTest ( BaseCeleryTest ) :
2013-03-29 09:02:07 +04:00
'''
2013-04-18 02:59:21 +04:00
Test cases for run_job celery task .
2013-03-29 09:02:07 +04:00
'''
def setUp ( self ) :
2013-04-18 02:59:21 +04:00
super ( RunJobTest , self ) . setUp ( )
2013-04-19 23:40:08 +04:00
self . test_project_path = None
2013-04-01 01:25:18 +04:00
self . setup_users ( )
self . organization = self . make_organizations ( self . super_django_user , 1 ) [ 0 ]
self . inventory = Inventory . objects . create ( name = ' test-inventory ' ,
description = ' description for test-inventory ' ,
organization = self . organization )
self . host = self . inventory . hosts . create ( name = ' host.example.com ' ,
inventory = self . inventory )
self . group = self . inventory . groups . create ( name = ' test-group ' ,
inventory = self . inventory )
self . group . hosts . add ( self . host )
# Pass test database name in environment for use by the inventory script.
os . environ [ ' ACOM_TEST_DATABASE_NAME ' ] = settings . DATABASES [ ' default ' ] [ ' NAME ' ]
def tearDown ( self ) :
2013-04-18 02:59:21 +04:00
super ( RunJobTest , self ) . tearDown ( )
2013-04-01 01:25:18 +04:00
os . environ . pop ( ' ACOM_TEST_DATABASE_NAME ' , None )
2013-04-19 23:40:08 +04:00
if self . test_project_path :
shutil . rmtree ( self . test_project_path , True )
def create_test_project ( self , playbook_content ) :
self . project = self . make_projects ( self . normal_django_user , 1 , playbook_content ) [ 0 ]
self . organization . projects . add ( self . project )
2013-04-01 01:25:18 +04:00
2013-04-19 23:40:08 +04:00
def create_test_job ( self , * * kwargs ) :
opts = {
2013-04-20 02:11:31 +04:00
' name ' : ' test-job-template ' ,
2013-04-19 23:40:08 +04:00
' inventory ' : self . inventory ,
' project ' : self . project ,
' playbook ' : self . project . available_playbooks [ 0 ] ,
}
opts . update ( kwargs )
2013-04-20 02:11:31 +04:00
self . job_template = JobTemplate . objects . create ( * * opts )
return self . job_template . create_job ( )
2013-04-01 07:23:15 +04:00
2013-04-18 02:59:21 +04:00
def test_run_job ( self ) :
2013-04-19 23:40:08 +04:00
self . create_test_project ( TEST_PLAYBOOK )
job = self . create_test_job ( )
2013-04-20 02:11:31 +04:00
self . assertEqual ( job . status , ' new ' )
job . start ( )
2013-04-18 02:59:21 +04:00
self . assertEqual ( job . status , ' pending ' )
job = Job . objects . get ( pk = job . pk )
2013-04-19 23:40:08 +04:00
#print 'stdout:', job.result_stdout
#print 'stderr:', job.result_stderr
#print job.status
2013-04-04 21:59:32 +04:00
#print settings.DATABASES
2013-04-18 02:59:21 +04:00
self . assertEqual ( job . status , ' successful ' )
self . assertTrue ( job . result_stdout )
job_events = job . job_events . all ( )
self . assertEqual ( job_events . filter ( event = ' playbook_on_start ' ) . count ( ) , 1 )
self . assertEqual ( job_events . filter ( event = ' playbook_on_play_start ' ) . count ( ) , 1 )
self . assertEqual ( job_events . filter ( event = ' playbook_on_task_start ' ) . count ( ) , 2 )
self . assertEqual ( job_events . filter ( event = ' runner_on_ok ' ) . count ( ) , 2 )
for evt in job_events . filter ( event = ' runner_on_ok ' ) :
2013-04-16 03:22:57 +04:00
self . assertEqual ( evt . host , self . host )
2013-04-18 02:59:21 +04:00
self . assertEqual ( job_events . filter ( event = ' playbook_on_stats ' ) . count ( ) , 1 )
2013-04-18 05:45:35 +04:00
self . assertEqual ( job . successful_hosts . count ( ) , 1 )
self . assertEqual ( job . failed_hosts . count ( ) , 0 )
self . assertEqual ( job . changed_hosts . count ( ) , 1 )
self . assertEqual ( job . unreachable_hosts . count ( ) , 0 )
self . assertEqual ( job . skipped_hosts . count ( ) , 0 )
self . assertEqual ( job . processed_hosts . count ( ) , 1 )
2013-04-01 01:25:18 +04:00
2013-04-18 02:59:21 +04:00
def test_check_job ( self ) :
2013-04-19 23:40:08 +04:00
self . create_test_project ( TEST_PLAYBOOK )
job = self . create_test_job ( job_type = ' check ' )
2013-04-20 02:11:31 +04:00
self . assertEqual ( job . status , ' new ' )
job . start ( )
2013-04-18 02:59:21 +04:00
self . assertEqual ( job . status , ' pending ' )
job = Job . objects . get ( pk = job . pk )
self . assertEqual ( job . status , ' successful ' )
self . assertTrue ( job . result_stdout )
job_events = job . job_events . all ( )
self . assertEqual ( job_events . filter ( event = ' playbook_on_start ' ) . count ( ) , 1 )
self . assertEqual ( job_events . filter ( event = ' playbook_on_play_start ' ) . count ( ) , 1 )
self . assertEqual ( job_events . filter ( event = ' playbook_on_task_start ' ) . count ( ) , 2 )
self . assertEqual ( job_events . filter ( event = ' runner_on_skipped ' ) . count ( ) , 2 )
for evt in job_events . filter ( event = ' runner_on_skipped ' ) :
2013-04-16 03:22:57 +04:00
self . assertEqual ( evt . host , self . host )
2013-04-18 02:59:21 +04:00
self . assertEqual ( job_events . filter ( event = ' playbook_on_stats ' ) . count ( ) , 1 )
2013-04-18 05:45:35 +04:00
self . assertEqual ( job . successful_hosts . count ( ) , 0 )
self . assertEqual ( job . failed_hosts . count ( ) , 0 )
self . assertEqual ( job . changed_hosts . count ( ) , 0 )
self . assertEqual ( job . unreachable_hosts . count ( ) , 0 )
self . assertEqual ( job . skipped_hosts . count ( ) , 1 )
self . assertEqual ( job . processed_hosts . count ( ) , 1 )
2013-04-04 22:47:32 +04:00
2013-04-18 02:59:21 +04:00
def test_run_job_that_fails ( self ) :
2013-04-19 23:40:08 +04:00
self . create_test_project ( TEST_PLAYBOOK2 )
job = self . create_test_job ( )
2013-04-20 02:11:31 +04:00
self . assertEqual ( job . status , ' new ' )
job . start ( )
2013-04-18 02:59:21 +04:00
self . assertEqual ( job . status , ' pending ' )
job = Job . objects . get ( pk = job . pk )
self . assertEqual ( job . status , ' failed ' )
self . assertTrue ( job . result_stdout )
job_events = job . job_events . all ( )
self . assertEqual ( job_events . filter ( event = ' playbook_on_start ' ) . count ( ) , 1 )
self . assertEqual ( job_events . filter ( event = ' playbook_on_play_start ' ) . count ( ) , 1 )
self . assertEqual ( job_events . filter ( event = ' playbook_on_task_start ' ) . count ( ) , 1 )
self . assertEqual ( job_events . filter ( event = ' runner_on_failed ' ) . count ( ) , 1 )
self . assertEqual ( job_events . get ( event = ' runner_on_failed ' ) . host , self . host )
self . assertEqual ( job_events . filter ( event = ' playbook_on_stats ' ) . count ( ) , 1 )
2013-04-18 05:45:35 +04:00
self . assertEqual ( job . successful_hosts . count ( ) , 0 )
self . assertEqual ( job . failed_hosts . count ( ) , 1 )
self . assertEqual ( job . changed_hosts . count ( ) , 0 )
self . assertEqual ( job . unreachable_hosts . count ( ) , 0 )
self . assertEqual ( job . skipped_hosts . count ( ) , 0 )
self . assertEqual ( job . processed_hosts . count ( ) , 1 )
2013-04-04 22:47:32 +04:00
2013-04-18 02:59:21 +04:00
def test_check_job_where_task_would_fail ( self ) :
2013-04-19 23:40:08 +04:00
self . create_test_project ( TEST_PLAYBOOK2 )
job = self . create_test_job ( job_type = ' check ' )
2013-04-20 02:11:31 +04:00
self . assertEqual ( job . status , ' new ' )
job . start ( )
2013-04-18 02:59:21 +04:00
self . assertEqual ( job . status , ' pending ' )
job = Job . objects . get ( pk = job . pk )
2013-04-04 22:47:32 +04:00
# Since we don't actually run the task, the --check should indicate
# everything is successful.
2013-04-18 02:59:21 +04:00
self . assertEqual ( job . status , ' successful ' )
self . assertTrue ( job . result_stdout )
job_events = job . job_events . all ( )
self . assertEqual ( job_events . filter ( event = ' playbook_on_start ' ) . count ( ) , 1 )
self . assertEqual ( job_events . filter ( event = ' playbook_on_play_start ' ) . count ( ) , 1 )
self . assertEqual ( job_events . filter ( event = ' playbook_on_task_start ' ) . count ( ) , 1 )
self . assertEqual ( job_events . filter ( event = ' runner_on_skipped ' ) . count ( ) , 1 )
self . assertEqual ( job_events . get ( event = ' runner_on_skipped ' ) . host , self . host )
self . assertEqual ( job_events . filter ( event = ' playbook_on_stats ' ) . count ( ) , 1 )
2013-04-18 05:45:35 +04:00
self . assertEqual ( job . successful_hosts . count ( ) , 0 )
self . assertEqual ( job . failed_hosts . count ( ) , 0 )
self . assertEqual ( job . changed_hosts . count ( ) , 0 )
self . assertEqual ( job . unreachable_hosts . count ( ) , 0 )
self . assertEqual ( job . skipped_hosts . count ( ) , 1 )
self . assertEqual ( job . processed_hosts . count ( ) , 1 )