From 4e89ea4e18d867d5409da31e108a61ce627f757d Mon Sep 17 00:00:00 2001 From: Ian Wienand Date: Fri, 22 Apr 2022 11:32:47 +1000 Subject: [PATCH] Add unit test for zuul_json text result parsing This is a follow-on from I02bcd307bcfad8d99dd0db13d979ce7ba3d5e0e4 which creates a fake library to simulate different result types being returned to zuul_json callback plugin. Change-Id: Ib0d2360f98daf33e05207c9c285528ce2f51cbf9 --- .../playbooks/json-results-strings.yaml | 18 ++++++++ .../playbooks/library/return_strings.py | 40 +++++++++++++++++ .../git/org_project/zuul.yaml | 27 +++++++++++ .../ansible-json-string-results/main.yaml | 6 +++ tests/unit/test_v3.py | 45 +++++++++++++++++++ 5 files changed, 136 insertions(+) create mode 100644 tests/fixtures/config/ansible-json-string-results/git/org_project/playbooks/json-results-strings.yaml create mode 100644 tests/fixtures/config/ansible-json-string-results/git/org_project/playbooks/library/return_strings.py create mode 100644 tests/fixtures/config/ansible-json-string-results/git/org_project/zuul.yaml create mode 100644 tests/fixtures/config/ansible-json-string-results/main.yaml diff --git a/tests/fixtures/config/ansible-json-string-results/git/org_project/playbooks/json-results-strings.yaml b/tests/fixtures/config/ansible-json-string-results/git/org_project/playbooks/json-results-strings.yaml new file mode 100644 index 0000000000..c3aa1c6867 --- /dev/null +++ b/tests/fixtures/config/ansible-json-string-results/git/org_project/playbooks/json-results-strings.yaml @@ -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 diff --git a/tests/fixtures/config/ansible-json-string-results/git/org_project/playbooks/library/return_strings.py b/tests/fixtures/config/ansible-json-string-results/git/org_project/playbooks/library/return_strings.py new file mode 100644 index 0000000000..3cc085fd07 --- /dev/null +++ b/tests/fixtures/config/ansible-json-string-results/git/org_project/playbooks/library/return_strings.py @@ -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 . + +# 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() diff --git a/tests/fixtures/config/ansible-json-string-results/git/org_project/zuul.yaml b/tests/fixtures/config/ansible-json-string-results/git/org_project/zuul.yaml new file mode 100644 index 0000000000..8a17a3ba87 --- /dev/null +++ b/tests/fixtures/config/ansible-json-string-results/git/org_project/zuul.yaml @@ -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 diff --git a/tests/fixtures/config/ansible-json-string-results/main.yaml b/tests/fixtures/config/ansible-json-string-results/main.yaml new file mode 100644 index 0000000000..73787886f0 --- /dev/null +++ b/tests/fixtures/config/ansible-json-string-results/main.yaml @@ -0,0 +1,6 @@ +- tenant: + name: tenant-one + source: + gerrit: + config-projects: + - org/project diff --git a/tests/unit/test_v3.py b/tests/unit/test_v3.py index 5e21cd57f4..05786d2061 100644 --- a/tests/unit/test_v3.py +++ b/tests/unit/test_v3.py @@ -6598,6 +6598,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'