diff --git a/awx/ui/src/screens/Job/JobOutput/HostEventModal.js b/awx/ui/src/screens/Job/JobOutput/HostEventModal.js index f23fd154d3..82dfcb9bd5 100644 --- a/awx/ui/src/screens/Job/JobOutput/HostEventModal.js +++ b/awx/ui/src/screens/Job/JobOutput/HostEventModal.js @@ -40,6 +40,8 @@ const processCodeEditorValue = (value) => { codeEditorValue = ''; } else if (typeof value === 'string') { codeEditorValue = encode(value); + } else if (Array.isArray(value)) { + codeEditorValue = encode(value.join(' ')); } else { codeEditorValue = value; } diff --git a/awx/ui/src/screens/Job/JobOutput/HostEventModal.test.js b/awx/ui/src/screens/Job/JobOutput/HostEventModal.test.js index 5872011874..96866c4b03 100644 --- a/awx/ui/src/screens/Job/JobOutput/HostEventModal.test.js +++ b/awx/ui/src/screens/Job/JobOutput/HostEventModal.test.js @@ -52,6 +52,60 @@ const hostEvent = { }, }; +/* +Some libraries return a list of string in stdout +Example: https://github.com/ansible-collections/cisco.ios/blob/main/plugins/modules/ios_command.py#L124-L128 +*/ +const hostEventWithArray = { + changed: true, + event: 'runner_on_ok', + event_data: { + host: 'foo', + play: 'all', + playbook: 'run_command.yml', + res: { + ansible_loop_var: 'item', + changed: true, + item: '1', + msg: 'This is a debug message: 1', + stdout: [ + ' total used free shared buff/cache available\nMem: 7973 3005 960 30 4007 4582\nSwap: 1023 0 1023', + ], + stderr: 'problems', + cmd: ['free', '-m'], + stderr_lines: [], + stdout_lines: [ + ' total used free shared buff/cache available', + 'Mem: 7973 3005 960 30 4007 4582', + 'Swap: 1023 0 1023', + ], + }, + task: 'command', + task_action: 'command', + }, + event_display: 'Host OK', + event_level: 3, + failed: false, + host: 1, + host_name: 'foo', + id: 123, + job: 4, + play: 'all', + playbook: 'run_command.yml', + stdout: `stdout: "changed: [localhost] => {"changed": true, "cmd": ["free", "-m"], "delta": "0:00:01.479609", "end": "2019-09-10 14:21:45.469533", "rc": 0, "start": "2019-09-10 14:21:43.989924", "stderr": "", "stderr_lines": [], "stdout": " total used free shared buff/cache available\nMem: 7973 3005 960 30 4007 4582\nSwap: 1023 0 1023", "stdout_lines": [" total used free shared buff/cache available", "Mem: 7973 3005 960 30 4007 4582", "Swap: 1023 0 1023"]}" + `, + task: 'command', + type: 'job_event', + url: '/api/v2/job_events/123/', + summary_fields: { + host: { + id: 1, + name: 'foo', + description: 'Bar', + }, + }, +}; + /* eslint-disable no-useless-escape */ const jsonValue = `{ \"ansible_loop_var\": \"item\", @@ -281,4 +335,25 @@ describe('HostEventModal', () => { expect(codeEditor.prop('readOnly')).toBe(true); expect(codeEditor.prop('value')).toEqual('baz\nbar'); }); + + test('should display Standard Out array stdout content', () => { + const wrapper = shallow( + {}} + isOpen + /> + ); + + const handleTabClick = wrapper.find('Tabs').prop('onSelect'); + handleTabClick(null, 2); + wrapper.update(); + + const codeEditor = wrapper.find('Tab[eventKey=2] CodeEditor'); + expect(codeEditor.prop('mode')).toBe('javascript'); + expect(codeEditor.prop('readOnly')).toBe(true); + expect(codeEditor.prop('value')).toEqual( + hostEventWithArray.event_data.res.stdout.join(' ') + ); + }); });