[test] combine_logs: append node stderr and stdout if it exists

This commit is contained in:
MarcoFalke 2019-04-17 17:03:14 -04:00
parent dae72998e8
commit fa90a89eee
No known key found for this signature in database
GPG key ID: CE2B75697E69A548

View file

@ -11,6 +11,7 @@ from collections import defaultdict, namedtuple
import heapq import heapq
import itertools import itertools
import os import os
import pathlib
import re import re
import sys import sys
import tempfile import tempfile
@ -51,9 +52,23 @@ def main():
if not args.testdir: if not args.testdir:
print("Opening latest test directory: {}".format(testdir), file=sys.stderr) print("Opening latest test directory: {}".format(testdir), file=sys.stderr)
colors = defaultdict(lambda: '')
if args.color:
colors["test"] = "\033[0;36m" # CYAN
colors["node0"] = "\033[0;34m" # BLUE
colors["node1"] = "\033[0;32m" # GREEN
colors["node2"] = "\033[0;31m" # RED
colors["node3"] = "\033[0;33m" # YELLOW
colors["reset"] = "\033[0m" # Reset font color
log_events = read_logs(testdir) log_events = read_logs(testdir)
print_logs(log_events, color=args.color, html=args.html) if args.html:
print_logs_html(log_events)
else:
print_logs_plain(log_events, colors)
print_node_warnings(testdir, colors)
def read_logs(tmp_dir): def read_logs(tmp_dir):
"""Reads log files. """Reads log files.
@ -71,6 +86,26 @@ def read_logs(tmp_dir):
return heapq.merge(*[get_log_events(source, f) for source, f in files]) return heapq.merge(*[get_log_events(source, f) for source, f in files])
def print_node_warnings(tmp_dir, colors):
"""Print nodes' errors and warnings"""
warnings = []
for stream in ['stdout', 'stderr']:
for i in itertools.count():
folder = "{}/node{}/{}".format(tmp_dir, i, stream)
if not os.path.isdir(folder):
break
for (_, _, fns) in os.walk(folder):
for fn in fns:
warning = pathlib.Path('{}/{}'.format(folder, fn)).read_text().strip()
if warning:
warnings.append(("node{} {}".format(i, stream), warning))
print()
for w in warnings:
print("{} {} {} {}".format(colors[w[0].split()[0]], w[0], w[1], colors["reset"]))
def find_latest_test_dir(): def find_latest_test_dir():
"""Returns the latest tmpfile test directory prefix.""" """Returns the latest tmpfile test directory prefix."""
tmpdir = tempfile.gettempdir() tmpdir = tempfile.gettempdir()
@ -127,18 +162,9 @@ def get_log_events(source, logfile):
except FileNotFoundError: except FileNotFoundError:
print("File %s could not be opened. Continuing without it." % logfile, file=sys.stderr) print("File %s could not be opened. Continuing without it." % logfile, file=sys.stderr)
def print_logs(log_events, color=False, html=False):
"""Renders the iterator of log events into text or html."""
if not html:
colors = defaultdict(lambda: '')
if color:
colors["test"] = "\033[0;36m" # CYAN
colors["node0"] = "\033[0;34m" # BLUE
colors["node1"] = "\033[0;32m" # GREEN
colors["node2"] = "\033[0;31m" # RED
colors["node3"] = "\033[0;33m" # YELLOW
colors["reset"] = "\033[0m" # Reset font color
def print_logs_plain(log_events, colors):
"""Renders the iterator of log events into text."""
for event in log_events: for event in log_events:
lines = event.event.splitlines() lines = event.event.splitlines()
print("{0} {1: <5} {2} {3}".format(colors[event.source.rstrip()], event.source, lines[0], colors["reset"])) print("{0} {1: <5} {2} {3}".format(colors[event.source.rstrip()], event.source, lines[0], colors["reset"]))
@ -146,7 +172,9 @@ def print_logs(log_events, color=False, html=False):
for line in lines[1:]: for line in lines[1:]:
print("{0}{1}{2}".format(colors[event.source.rstrip()], line, colors["reset"])) print("{0}{1}{2}".format(colors[event.source.rstrip()], line, colors["reset"]))
else:
def print_logs_html(log_events):
"""Renders the iterator of log events into html."""
try: try:
import jinja2 import jinja2
except ImportError: except ImportError: