ara/ara/tests/unit/common.py

211 lines
6.9 KiB
Python

# Copyright (c) 2017 Red Hat, Inc.
#
# This file is part of ARA: Ansible Run Analysis.
#
# ARA is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# ARA is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with ARA. If not, see <http://www.gnu.org/licenses/>.
import unittest
import ara.webapp as w
import ara.models as m
from ara.models import db
from ara.tests.unit import fakes
class TestAra(unittest.TestCase):
"""
Common setup/teardown for ARA tests
"""
def setUp(self):
self.config = {
'SQLALCHEMY_DATABASE_URI': 'sqlite://',
'TESTING': True
}
self.app = w.create_app(self)
self.app_context = self.app.app_context()
self.app_context.push()
self.client = self.app.test_client()
m.db.create_all()
def tearDown(self):
m.db.session.remove()
m.db.drop_all()
self.app_context.pop()
def ansible_run(complete=True, failed=False, gather_facts=True,
ara_record=False):
"""
Simulates an Ansible run by creating the expected database objects.
This roughly approximates the following playbook:
---
- name: ARA unit tests
hosts: host-<random>
gather_facts: yes
tasks:
- name: Fake task
include: some/path/main.yml
- name: Record something
ara_record:
key: 'test key'
value: 'test value'
when: ara_record
- name: Fail something
fail:
when: failed
Where '<random>' is a random integer generated each time.
Set the 'complete' parameter to 'False' to simulate an aborted Ansible run.
Set the 'failed' parameter to 'True' to simulate a failed Ansible run.
Set the 'gathered_facts' parameter to 'False' to simulate a run with no
facts gathered.
Set the 'ara_record' parameter to 'True' to simulate a run with an
ara_record task.
"""
playbook = fakes.Playbook(complete=complete, path='/playbook.yml').model
pb_file = fakes.File(playbook=playbook,
is_playbook=True,
path=playbook.path).model
pb_content = fakes.FileContent(content=fakes.FAKE_PLAYBOOK_CONTENT).model
play = fakes.Play(playbook=playbook).model
host = fakes.Host(playbook=playbook).model
tasks = []
task_results = []
task_file = fakes.File(playbook=playbook,
is_playbook=False,
path='/some/path/main.yml').model
task_content = fakes.FileContent(content=fakes.FAKE_TASK_CONTENT).model
task = fakes.Task(play=play,
playbook=playbook,
action='fake_action',
file=task_file,
file_id=task_file.id).model
tasks.append(task)
task_result = fakes.TaskResult(task=task,
host=host,
status='ok',
changed=True,
result='fake action result').model
task_results.append(task_result)
record_task = fakes.Task(play=play,
playbook=playbook,
action='ara_record',
file=task_file,
file_id=task_file.id).model
tasks.append(record_task)
ctx = dict(
playbook=playbook,
pb_file=pb_file,
pb_content=pb_content,
play=play,
host=host,
task=task,
task_file=task_file,
task_content=task_content,
result=task_result,
)
items = [playbook, pb_file, pb_content,
task_file, task_content, play, host]
skipped = False
if ara_record:
msg = 'Data recorded in ARA for this playbook.'
record_result = fakes.TaskResult(task=record_task,
host=host,
status='ok',
changed=True,
skipped=skipped,
result=msg).model
data = fakes.Data(playbook=playbook).model
ctx['data'] = data
items.append(data)
else:
skipped = True
msg = 'Conditional check failed'
record_result = fakes.TaskResult(task=record_task,
host=host,
status='skipped',
changed=False,
skipped=skipped,
result=msg).model
task_results.append(record_result)
failed_task = fakes.Task(play=play,
playbook=playbook,
action='fail',
file=task_file,
file_id=task_file.id).model
tasks.append(failed_task)
if failed:
msg = 'FAILED!'
failed_result = fakes.TaskResult(task=failed_task,
host=host,
status='failed',
changed=False,
failed=True,
result=msg).model
else:
skipped = True
msg = 'Conditional check failed'
failed_result = fakes.TaskResult(task=failed_task,
host=host,
status='skipped',
changed=False,
skipped=skipped,
result=msg).model
task_results.append(failed_result)
if gather_facts:
facts = fakes.HostFacts(host=host).model
ctx['facts'] = facts
items.append(facts)
for item in items + tasks + task_results:
if hasattr(item, 'start'):
item.start()
if complete:
stats = fakes.Stats(playbook=playbook,
host=host,
ok=1,
skipped=int(skipped),
failed=int(failed)).model
ctx['stats'] = stats
items.append(stats)
for item in items + tasks + task_results:
if hasattr(item, 'stop'):
item.stop()
for item in items + tasks + task_results:
db.session.add(item)
db.session.commit()
return ctx