X-Git-Url: https://git.arvados.org/arvados.git/blobdiff_plain/c3695bc7282996d66fb1922d7971aa86fb497968..0eb72b526bf8bbb011551ecf019f604e17a534f1:/apps/workbench/app/views/jobs/_show_log.html.erb diff --git a/apps/workbench/app/views/jobs/_show_log.html.erb b/apps/workbench/app/views/jobs/_show_log.html.erb index 315c8c1831..b4ede75118 100644 --- a/apps/workbench/app/views/jobs/_show_log.html.erb +++ b/apps/workbench/app/views/jobs/_show_log.html.erb @@ -1,13 +1,19 @@ +<%# Copyright (C) The Arvados Authors. All rights reserved. + +SPDX-License-Identifier: AGPL-3.0 %> + <% if !@object.log %>
+ ><%= @object.stderr_log_lines(Rails.configuration.running_job_log_records_to_fetch).join("\n") %> + <%# Applying a long throttle suppresses the auto-refresh of this partial that would normally be triggered by arv-log-event. %> @@ -61,38 +67,62 @@ var makeFilter = function() { <% if @object.log and !@object.log.empty? %> <% logcollection = Collection.find @object.log %> <% if logcollection %> - log_size = <%= logcollection.files[0][2] %> - log_maxbytes = <%= Rails.configuration.log_viewer_max_bytes %>; - logcollection_url = '<%=j url_for logcollection %>/<%=j logcollection.files[0][1] %>'; + var log_size = <%= logcollection.files[0][2] %> + var log_maxbytes = <%= Rails.configuration.log_viewer_max_bytes %>; + var logcollection_url = '<%=j url_for logcollection %>/<%=j logcollection.files[0][1] %>'; $("#log-viewer-download-url").attr('href', logcollection_url); $("#log-viewer-download-pane").show(); + var headers = {}; if (log_size > log_maxbytes) { - range_header = { 'Range': 'bytes=0-' + log_maxbytes }; - } else { - range_header = null; + headers['Range'] = 'bytes=0-' + log_maxbytes; } - $.ajax(logcollection_url, { headers: range_header }). - done(function(data, status, jqxhr) { - logViewer.filter(); - addToLogViewer(logViewer, data.split("\n"), taskState); - logViewer.filter(makeFilter()); - content_range_hdr = jqxhr.getResponseHeader('Content-Range'); - var v = content_range_hdr && content_range_hdr.match(/bytes \d+-(\d+)\/(.+)/); - short_log = v && (v[2] == '*' || parseInt(v[1]) + 1 < v[2]); - if (jqxhr.status == 206 && short_log) { - $("#log-viewer-overview").html( - '

Showing only ' + data.length + ' bytes of this log.' + - ' Timing information is unavailable since' + - ' the full log was not retrieved.

' - ); - } else { - generateJobOverview("#log-viewer-overview", logViewer, taskState); + var ajax_opts = { dataType: 'text', headers: headers }; + load_log(); + + function load_log() { + $.ajax(logcollection_url, ajax_opts).done(done).fail(fail); + } + function done(data, status, jqxhr) { + if (jqxhr.getResponseHeader('Content-Type').indexOf('application/json') === 0) { + // The browser won't allow a redirect-with-cookie response + // because keep-web isn't same-origin with us. Instead, we + // assure keep-web it's OK to respond with the content + // immediately by setting the token in the request body + // instead and adding disposition=attachment. + logcollection_url = JSON.parse(data).href; + var queryAt = logcollection_url.indexOf('?api_token='); + if (queryAt >= 0) { + ajax_opts.method = 'POST'; + ajax_opts.data = { + api_token: logcollection_url.slice(queryAt+11), + disposition: 'attachment', + }; + logcollection_url = logcollection_url.slice(0, queryAt); } - $("#log-viewer .spinner").detach(); - }). - fail(function(jqxhr, status, error) { - $("#log-viewer .spinner").detach(); - }); + return load_log(); + } + logViewer.filter(); + addToLogViewer(logViewer, data.split("\n"), taskState); + logViewer.filter(makeFilter()); + content_range_hdr = jqxhr.getResponseHeader('Content-Range'); + var v = content_range_hdr && content_range_hdr.match(/bytes \d+-(\d+)\/(.+)/); + short_log = v && (v[2] == '*' || parseInt(v[1]) + 1 < v[2]); + if (jqxhr.status == 206 && short_log) { + $("#log-viewer-overview").html( + '

Showing only ' + data.length + ' bytes of this log.' + + ' Timing information is unavailable since' + + ' the full log was not retrieved.

' + ); + } else { + generateJobOverview("#log-viewer-overview", logViewer, taskState); + } + $("#log-viewer .spinner").detach(); + } + function fail(jqxhr, status, error) { + // TODO: tell the user about the error + console.log('load_log failed: status='+status+' error='+error); + $("#log-viewer .spinner").detach(); + } <% end %> <% else %> <%# Live log loading not implemented yet. %>