bitbake: toaster: Record critical errors

Critical errors (where a build failed for reasons of
misconfiguration, such as a machine being specified which is not
in a project's layers) were being ignored (only log records
up to ERROR level were being logged to Toaster's db). This meant that
the build would fail but would not correctly report why.

Add support for CRITICAL error levels to the LogMessage model,
include errors at this level in the errors property for a build,
and show errors at this level in the build dashboard.

[YOCTO #8320]

(Bitbake rev: b6eacbca9cacb607de864ab7d093deb296da8226)

Signed-off-by: Elliot Smith <elliot.smith@intel.com>
Signed-off-by: Ed Bartosh <ed.bartosh@linux.intel.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
This commit is contained in:
Elliot Smith 2015-10-15 15:45:13 +03:00 committed by Richard Purdie
parent 069a611097
commit 93f0b61749
4 changed files with 24 additions and 12 deletions

View File

@ -1394,7 +1394,9 @@ class BuildInfoHelper(object):
log_information = {}
log_information['build'] = self.internal_state['build']
if event.levelno == formatter.ERROR:
if event.levelno == formatter.CRITICAL:
log_information['level'] = LogMessage.CRITICAL
elif event.levelno == formatter.ERROR:
log_information['level'] = LogMessage.ERROR
elif event.levelno == formatter.WARNING:
log_information['level'] = LogMessage.WARNING
@ -1407,6 +1409,7 @@ class BuildInfoHelper(object):
log_information['pathname'] = event.pathname
log_information['lineno'] = event.lineno
logger.info("Logging error 2: %s", log_information)
self.orm_wrapper.create_logmessage(log_information)
def close(self, errorcode):

View File

@ -145,10 +145,12 @@ def main(server, eventHandler, params ):
event.levelno = formatter.ERROR
buildinfohelper.store_log_event(event)
if event.levelno >= formatter.ERROR:
errors = errors + 1
elif event.levelno == formatter.WARNING:
warnings = warnings + 1
# For "normal" logging conditions, don't show note logs from tasks
# but do show them if the user has changed the default log level to
# include verbose/debug messages

View File

@ -353,7 +353,9 @@ class Build(models.Model):
@property
def errors(self):
return (self.logmessage_set.filter(level=LogMessage.ERROR)|self.logmessage_set.filter(level=LogMessage.EXCEPTION))
return (self.logmessage_set.filter(level=LogMessage.ERROR) |
self.logmessage_set.filter(level=LogMessage.EXCEPTION) |
self.logmessage_set.filter(level=LogMessage.CRITICAL))
@property
def warnings(self):
@ -1285,16 +1287,20 @@ class LogMessage(models.Model):
INFO = 0
WARNING = 1
ERROR = 2
CRITICAL = 3
LOG_LEVEL = ( (INFO, "info"),
(WARNING, "warn"),
(ERROR, "error"),
(EXCEPTION, "toaster exception"))
LOG_LEVEL = (
(INFO, "info"),
(WARNING, "warn"),
(ERROR, "error"),
(CRITICAL, "critical"),
(EXCEPTION, "toaster exception")
)
build = models.ForeignKey(Build)
task = models.ForeignKey(Task, blank = True, null=True)
level = models.IntegerField(choices=LOG_LEVEL, default=INFO)
message=models.CharField(max_length=240)
message = models.CharField(max_length=240)
pathname = models.FilePathField(max_length=255, blank=True)
lineno = models.IntegerField(null=True)

View File

@ -69,11 +69,12 @@
<div class="accordion-body collapse in" id="collapse-errors">
<div class="accordion-inner">
<div class="span10">
{% for error in logmessages %}{% if error.level == 2 %}
<div class="alert alert-error">
<pre>{{error.message}}</pre>
</div>
{% endif %}
{% for error in logmessages %}
{% if error.level == 2 or error.level == 3 %}
<div class="alert alert-error">
<pre>{{error.message}}</pre>
</div>
{% endif %}
{% endfor %}
</div>
</div>