From b2328d17a438d0f454bfb0323143dcc7f84424be Mon Sep 17 00:00:00 2001 From: Jake McDermott Date: Tue, 1 Dec 2020 12:34:28 -0500 Subject: [PATCH] Render result tracebacks as stdout --- .../src/screens/Job/JobOutput/JobOutput.jsx | 29 ++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) diff --git a/awx/ui_next/src/screens/Job/JobOutput/JobOutput.jsx b/awx/ui_next/src/screens/Job/JobOutput/JobOutput.jsx index 88e32be49f..ed3a988ab1 100644 --- a/awx/ui_next/src/screens/Job/JobOutput/JobOutput.jsx +++ b/awx/ui_next/src/screens/Job/JobOutput/JobOutput.jsx @@ -225,7 +225,7 @@ class JobOutput extends Component { this.state = { contentError: null, deletionError: null, - hasContentLoading: true, + hasContentLoading: !props?.job?.result_traceback, results: {}, currentlyLoading: [], remoteRowCount: 0, @@ -241,6 +241,7 @@ class JobOutput extends Component { this._isMounted = false; this.loadJobEvents = this.loadJobEvents.bind(this); + this.loadTracebackEvents = this.loadTracebackEvents.bind(this); this.handleDeleteJob = this.handleDeleteJob.bind(this); this.rowRenderer = this.rowRenderer.bind(this); this.handleHostEventClick = this.handleHostEventClick.bind(this); @@ -261,6 +262,8 @@ class JobOutput extends Component { this._isMounted = true; this.loadJobEvents(); + if (job.result_traceback) return; + connectJobSocket(job, data => { if (data.counter && data.counter > this.jobSocketCounter) { this.jobSocketCounter = data.counter; @@ -308,8 +311,32 @@ class JobOutput extends Component { } } + loadTracebackEvents() { + // When a job has traceback results, render it as a job event + // with the traceback as the stdout text + const { job } = this.props; + const remoteRowCount = 1; + const results = [ + { + counter: -1, + created: null, + event: null, + type: null, + stdout: job?.result_traceback || '', + start_line: 0, + }, + ]; + this._isMounted && this.setState({ results, remoteRowCount }); + } + async loadJobEvents() { const { job, type } = this.props; + if (job.result_traceback) { + // Jobs with tracebacks don't have actual job events to show, + // so just render the traceback as stdout + this.loadTracebackEvents(); + return; + } const loadRange = range(1, 50); this._isMounted &&