Properly indent console WARN messages that appear inside of START-END
groups. Also, modify the parser to interpret the status of a group as
being the "worst" status message logged in that group, not just
whatever status is associated with the END message.
Signed-off-by: John Admanski <jadmanski@google.com>
git-svn-id: http://test.kernel.org/svn/autotest/trunk@1299 592f7852-d20e-0410-864c-8624ca9c26a4
diff --git a/server/server_job.py b/server/server_job.py
index e76ab3e..a32869b 100755
--- a/server/server_job.py
+++ b/server/server_job.py
@@ -556,7 +556,11 @@
def _format_warnings(self, last_line, warnings):
+ # use the indentation of whatever the last log line was
indent = self.extract_indent.match(last_line).group(1)
+ # if the last line starts a new group, add an extra indent
+ if last_line.lstrip('\t').startswith("START\t"):
+ indent += '\t'
return [self.job._render_record("WARN", None, None, msg,
timestamp, indent).rstrip('\n')
for timestamp, msg in warnings]
diff --git a/tko/parse.py b/tko/parse.py
index d525486..f3a1e17 100755
--- a/tko/parse.py
+++ b/tko/parse.py
@@ -71,7 +71,41 @@
return val
+class status_stack:
+ def __init__(self, job):
+ self.job = job
+ self.status_stack = [self.job.statuses[-1]]
+
+
+ def current_status(self):
+ return self.status_stack[-1]
+
+
+ def update(self, new_status):
+ if new_status not in self.job.statuses:
+ return
+ old = self.job.statuses.index(self.current_status())
+ new = self.job.statuses.index(new_status)
+ if new < old:
+ self.status_stack[-1] = new_status
+
+
+ def start(self):
+ self.status_stack.append(self.job.statuses[-1])
+
+
+ def end(self):
+ result = self.status_stack.pop()
+ if len(self.status_stack) == 0:
+ self.status_stack.append(self.job.statuses[-1])
+ return result
+
+
+
class job:
+ statuses = ['NOSTATUS', 'ERROR', 'ABORT', 'FAIL', 'WARN', 'GOOD',
+ 'ALERT']
+
def __init__(self, dir):
self.dir = dir
self.control = os.path.join(dir, "control")
@@ -122,7 +156,7 @@
except:
pass
raise "Could not figure out machine name"
-
+
def grope_status(self):
"""
@@ -138,12 +172,11 @@
dprint('=====================================================')
self.kernel = kernel(self.dir)
- statuses = ['NOSTATUS', 'ERROR', 'ABORT', 'FAIL', 'WARN',
- 'GOOD', 'ALERT']
reboot_inprogress = 0 # Saw reboot start and not finish
boot_count = 0
alert_pending = None # Saw an ALERT for this test
group_subdir = None
+ group_status = status_stack(self)
sought_level = 0 # we log events at indent level 0
for line in open(self.status, 'r').readlines():
dprint('\nSTATUS: ' + line.rstrip())
@@ -160,6 +193,7 @@
line = line.rstrip('\n')
if line.startswith('START\t'):
group_subdir = None
+ group_status.start()
dprint('start line, ignoring')
continue # ignore start lines
reason = None
@@ -175,8 +209,10 @@
reason = elements[-1]
optional_fields = dict(element.split('=', 1)
for element in elements[3:-1])
+ group_status.update(status)
dprint('GROPE_STATUS: ' +
- str([status, subdir, testname, reason]))
+ str([group_status.current_status(), status,
+ subdir, testname, reason]))
if status == 'ALERT':
dprint('job level alert, recording')
alert_pending = reason
@@ -195,7 +231,8 @@
# REMOVE THIS SECTION ONCE OLD FORMAT JOBS ARE GONE
################################################
if re.search(r'^(GOOD|FAIL|WARN) ', line):
- (status, testname, reason) = line.split(None, 2)
+ status, testname, reason = line.split(None, 2)
+
if testname.startswith('kernel.'):
subdir = 'build'
else:
@@ -232,16 +269,18 @@
status = 'ALERT'
reason = alert_pending
alert_pending = None
- if status in statuses:
- dprint('Adding: %s\nSubdir:%s\nTestname:%s\n%s'%
- (status, subdir, testname, reason))
+ if status in self.statuses:
+ dprint('Adding: %s\nSubdir:%s\nTestname:%s\n%s'
+ % (group_status.current_status(),
+ subdir, testname, reason))
else:
dprint('WARNING: Invalid status code. Ignoring')
continue
finished_time = get_timestamp(optional_fields,
'timestamp')
- self.tests.append(test(subdir, testname, status,
+ test_status = group_status.end()
+ self.tests.append(test(subdir, testname, test_status,
reason, self.kernel, self,
finished_time))
dprint('')