def ansible_run(self): """ Simulates an ansible run by creating stub versions of the information that Ansible passes to the callback, and then calling the various callback methods. """ self.playbook = fakes.Playbook(path='/playbook-%s.yml' % self.tag) self.cb.v2_playbook_on_start(self.playbook) self.play = fakes.Play(playbook=self.playbook.model) self.cb.v2_playbook_on_play_start(self.play) self.task = fakes.Task(name='task-%s' % self.tag, playbook=self.playbook.model, path='/task-%s.yml') self.cb.v2_playbook_on_task_start(self.task, False) self.host_one = fakes.Host(name='host1', playbook=self.playbook.model) self.host_two = fakes.Host(name='host2', playbook=self.playbook.model) self.results = [ self._test_result(self.host_one, 'ok', changed=True), self._test_result(self.host_two, 'failed'), ] processed_stats = { self.host_one.name: defaultdict(int, ok=1, changed=1), self.host_two.name: defaultdict(int, failed=1) } self.stats = fakes.Stats(playbook=self.playbook.model, processed=processed_stats) self.cb.v2_playbook_on_stats(self.stats)
def setUp(self): super(TestModels, self).setUp() self.playbook = fakes.Playbook(path='testing.yml', options={ 'option': 'test' }).model self.file = fakes.File(path=self.playbook.path, playbook=self.playbook, is_playbook=True).model content = fakes.FAKE_PLAYBOOK_CONTENT self.file_content = fakes.FileContent(content=content).model self.play = fakes.Play(name='test play', playbook=self.playbook).model self.task = fakes.Task(name='test task', play=self.play, playbook=self.playbook, tags=['just', 'testing']).model self.data = fakes.Data(playbook=self.playbook, key='test key', value='test value').model self.host = fakes.Host(name='localhost', playbook=self.playbook).model self.host_facts = fakes.HostFacts(host=self.host).model self.task_result = fakes.TaskResult(task=self.task, status='ok', host=self.host).model self.stats = fakes.Stats(playbook=self.playbook, host=self.host, changed=0, failed=0, skipped=0, unreachable=0, ok=0).model for obj in [ self.playbook, self.file, self.file_content, self.play, self.task, self.data, self.host, self.host_facts, self.task_result, self.stats ]: m.db.session.add(obj) m.db.session.commit()
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_tasks: 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