Merge "Add unit test for zuul_json text result parsing"
commit
4b3ee7a66b
|
@ -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
|
|
@ -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()
|
|
@ -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
|
|
@ -0,0 +1,6 @@
|
|||
- tenant:
|
||||
name: tenant-one
|
||||
source:
|
||||
gerrit:
|
||||
config-projects:
|
||||
- org/project
|
|
@ -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'
|
||||
|
||||
|
|
Loading…
Reference in New Issue