20032: Fix unnecessary race in test.
[arvados.git] / apps / workbench / app / assets / javascripts / log_viewer.js
index 405c8ef637a034e3abd034bc0e8df3843fcd8643..b201ed7f105229488763c64d49c2761eb17312a0 100644 (file)
@@ -1,3 +1,7 @@
+// Copyright (C) The Arvados Authors. All rights reserved.
+//
+// SPDX-License-Identifier: AGPL-3.0
+
 function newTaskState() {
     return {"complete_count": 0,
             "failure_count": 0,
@@ -10,11 +14,12 @@ function addToLogViewer(logViewer, lines, taskState) {
     var re = /((\d\d\d\d)-(\d\d)-(\d\d))_((\d\d):(\d\d):(\d\d)) ([a-z0-9]{5}-[a-z0-9]{5}-[a-z0-9]{15}) (\d+) (\d+)? (.*)/;
 
     var items = [];
+    var count = logViewer.items.length;
     for (var a in lines) {
         var v = lines[a].match(re);
         if (v != null) {
 
-            var ts = new Date(Date.UTC(v[2], v[3], v[4], v[6], v[7], v[8]));
+            var ts = new Date(Date.UTC(v[2], v[3]-1, v[4], v[6], v[7], v[8]));
 
             v11 = v[11];
             if (typeof v[11] === 'undefined') {
@@ -41,7 +46,7 @@ function addToLogViewer(logViewer, lines, taskState) {
                     } else if (/^srun: /.test(message) || /^slurmd/.test(message)) {
                         type = "task-dispatch";
                     } else {
-                        type = "task-output";
+                        type = "task-print";
                     }
                 } else {
                     var m;
@@ -82,17 +87,18 @@ function addToLogViewer(logViewer, lines, taskState) {
             }
 
             items.push({
-                id: logViewer.items.length,
+                id: count,
                 ts: ts,
                 timestamp: ts.toLocaleDateString() + " " + ts.toLocaleTimeString(),
                 taskid: v11,
                 node: node,
                 slot: slot,
-                message: message,
+                message: message.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;'),
                 type: type
             });
+            count += 1;
         } else {
-            console.log("Did not parse: " + lines[a]);
+            console.log("Did not parse line " + a + ": " + lines[a]);
         }
     }
     logViewer.add(items);
@@ -181,13 +187,9 @@ function dumbPluralize(n, s, p) {
 function generateJobOverview(id, logViewer, taskState) {
     var html = "";
 
-    var first = logViewer.items[1];
-    var last = logViewer.items[logViewer.items.length-1];
-
-    {
-        html += "<div>";
-        html += "Started at " + first.values().timestamp;
-
+    if (logViewer.items.length > 2) {
+        var first = logViewer.items[1];
+        var last = logViewer.items[logViewer.items.length-1];
         var duration = (last.values().ts.getTime() - first.values().ts.getTime()) / 1000;
 
         var hours = 0;
@@ -206,7 +208,9 @@ function generateJobOverview(id, logViewer, taskState) {
 
         var tcount = taskState.task_count;
 
-        html += ".  Ran " + dumbPluralize(tcount, " task") + " over ";
+        html += "<p>";
+        html += "Started at " + first.values().timestamp + ".  ";
+        html += "Ran " + dumbPluralize(tcount, " task") + " over ";
         if (hours > 0) {
             html += dumbPluralize(hours, " hour");
         }
@@ -224,7 +228,9 @@ function generateJobOverview(id, logViewer, taskState) {
         html += " (" + dumbPluralize(taskState.failure_count, " failure") + ")";
 
         html += ".  Finished at " + last.values().timestamp + ".";
-        html += "</div>";
+        html += "</p>";
+    } else {
+       html = "<p>Job log is empty or failed to load.</p>";
     }
 
     $(id).html(html);
@@ -277,4 +283,4 @@ function nextPage(logViewer, page, id) {
 
 function prevPage(logViewer, page, id) {
     gotoPage(logViewer.page_offset-1, logViewer, page, id);
-}
\ No newline at end of file
+}