Merge "Add unit test for zuul_json text result parsing"

This commit is contained in:
Zuul 2022-05-03 05:37:45 +00:00 committed by Gerrit Code Review
commit 4b3ee7a66b
5 changed files with 136 additions and 0 deletions

View File

@ -0,0 +1,18 @@
- hosts: localhost
gather_facts: no
tasks:
- name: Ensure we handle string returns properly
return_strings:
an_arg: 'if you see this string, it is working'
- name: Ensure this never shows up
return_strings:
an_arg: 'this is a secret string'
no_log: '{{ item }}'
# If any loop iteration is no_log, they all are; see
# https://github.com/ansible/ansible/commit/bda074d34e46ee9862a48ed067ad42260d3f92ab
loop:
- true
- false

View File

@ -0,0 +1,40 @@
# Copyright (c) 2022 Red Hat
#
# This module 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.
#
# This software 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 this software. If not, see <http://www.gnu.org/licenses/>.
# This file, by existing, should be found instead of ansible's built in
# file module.
from ansible.module_utils.basic import * # noqa
from ansible.module_utils.basic import AnsibleModule
def main():
module = AnsibleModule(
argument_spec=dict(
an_arg=dict(required=True, type='str'),
)
)
results = [
'this is a string',
module.params['an_arg'],
'a final string'
]
module.exit_json(msg="A plugin message", results=results)
if __name__ == '__main__':
main()

View File

@ -0,0 +1,27 @@
- pipeline:
name: check
manager: independent
post-review: true
trigger:
gerrit:
- event: patchset-created
success:
gerrit:
Verified: 1
failure:
gerrit:
Verified: -1
- job:
name: base
parent: null
- job:
name: json-results-strings
attempts: 1
run: playbooks/json-results-strings.yaml
- project:
check:
jobs:
- json-results-strings

View File

@ -0,0 +1,6 @@
- tenant:
name: tenant-one
source:
gerrit:
config-projects:
- org/project

View File

@ -6499,6 +6499,51 @@ class TestNoLog(AnsibleZuulTestCase):
self.assertNotIn('my-very-secret-password-2', text_log)
class TestJsonStringResults(AnsibleZuulTestCase):
tenant_config_file = 'config/ansible-json-string-results/main.yaml'
def _get_file(self, build, path):
p = os.path.join(build.jobdir.root, path)
with open(p) as f:
return f.read()
def test_ansible_json_string_results(self):
"""Test modules that return string results are captured
The yum/dnf modules are seemily almost unique in setting
"results" in their module return value to a list of strings
(other things might too, but not many other built-in
components). Confusingly, when using loops in ansible the
output also has a "results" which is a list of dicts with
return values from each iteration.
The zuul_json callback handler needs to deal with both; We've
broken this before making changes to its results parsing.
This test fakes some string return values like the yum modules
do, and ensures they are captured.
"""
self.executor_server.keep_jobdir = True
A = self.fake_gerrit.addFakeChange('org/project', 'master', 'A')
self.fake_gerrit.addEvent(A.getPatchsetCreatedEvent(1))
self.waitUntilSettled()
json_log = self._get_file(self.history[0], 'work/logs/job-output.json')
text_log = self._get_file(self.history[0], 'work/logs/job-output.txt')
self.assertIn('if you see this string, it is working', json_log)
# Note the text log doesn't include the detail of the returned
# results, just the msg field, hence to following "not in"
self.assertNotIn('if you see this string, it is working', text_log)
self.assertIn('A plugin message', text_log)
# no_log checking
self.assertNotIn('this is a secret string', json_log)
self.assertNotIn('this is a secret string', text_log)
class TestUnreachable(AnsibleZuulTestCase):
tenant_config_file = 'config/ansible-unreachable/main.yaml'