Make the autotest results email to be more concise and
legible. The current specification of the format follows:

Subject: Autotest <#jobid> | <job name> | success: <x%>

<job name>
<job URL>
Tests run: <n>; pass: <n>; skip: <n>; fail: <n>; sucess rate: <x%>

FAIL (n):
  <shortened test name>
      <failure description, restricted to 76 collumns, no
      trailling whitespaces, idented and aligned>
  <shortened test name>
      <failure description, restricted to 76 collumns, no
      trailling whitespaces, idented and aligned>

SKIPPED (n):
  <shortened test name>
      <reason>
  <shortened test name>
      <reason>
  <shortened test name>
      <reason>
  <shortened test name>
      <reason>
  <shortened test name>
      <reason>

PASS (n):
  <shortened test name>
  <shortened test name>

This patch implements this new formatting. Some adjustment
and tweaking is expected until we get to a final version.

Signed-off-by: Lucas Meneghel Rodrigues <l...@redhat.com>
---
 scheduler/scheduler_models.py |   84 +++++++++++++++++++++++++++++------------
 1 file changed, 60 insertions(+), 24 deletions(-)

diff --git a/scheduler/scheduler_models.py b/scheduler/scheduler_models.py
index 44a28f8..17aa910 100644
--- a/scheduler/scheduler_models.py
+++ b/scheduler/scheduler_models.py
@@ -607,34 +607,33 @@ class HostQueueEntry(DBObject):
         """
         job_stats = Job(id=self.job.id).get_execution_details()
 
-        subject = ('Autotest | Job ID: %s "%s" | Status: %s ' %
-                   (self.job.id, self.job.name, status))
+        subject = ('Autotest #%s | "%s"' %
+                   (self.job.id, self.job.name))
 
         if hostname is not None:
             subject += '| Hostname: %s ' % hostname
 
         if status not in ["1 Failed", "Failed"]:
-            subject += '| Success Rate: %.2f %%' % job_stats['success_rate']
+            subject += '| success: %.2f %%' % job_stats['success_rate']
 
-        body =  "Job ID: %s\n" % self.job.id
-        body += "Job name: %s\n" % self.job.name
+        body = "%s\n" % self.job.name
+        body += "%s\n" % self._view_job_url()
+        if int(job_stats['total_executed']) > 0:
+            body += ("Tests run: %s | pass: %s | skip: %s | fail: %s"
+                     "success rate: %.2f" % (job_stats['total_executed'],
+                                             job_stats['total_passed'],
+                                             job_stats['total_skipped'],
+                                             job_stats['total_failed'],
+                                             job_stats['success_rate']))
         if hostname is not None:
             body += "Host: %s\n" % hostname
         if summary is not None:
             body += "Summary: %s\n" % summary
-        body += "Status: %s\n" % status
-        body += "Results interface URL: %s\n" % self._view_job_url()
         body += "Execution time (HH:MM:SS): %s\n" % job_stats['execution_time']
-        if int(job_stats['total_executed']) > 0:
-            body += "User tests executed: %s\n" % job_stats['total_executed']
-            body += "User tests passed: %s\n" % job_stats['total_passed']
-            body += "User tests failed: %s\n" % job_stats['total_failed']
-            body += ("User tests success rate: %.2f %%\n" %
-                     job_stats['success_rate'])
-
-        if job_stats['failed_rows']:
-            body += "Failures:\n"
-            body += job_stats['failed_rows']
+        body += job_stats['fail_detail']
+        body += job_stats['warn_detail']
+        body += job_stats['skip_detail']
+        body += job_stats['pass_detail']
 
         return subject, body
 
@@ -883,6 +882,41 @@ class Job(DBObject):
 
             return n_test_jobs
 
+        def _format_rows(rows, max_length=80):
+            """
+            Format failure rows, so they are legible on the resulting email.
+
+            @param rows: List of rows (matrix) with database results.
+            @param field: Field of the stats dict we want to fill.
+            @param max_length: Int with maximum length of a line printed.
+            """
+            formatted_row = ""
+
+            if rows:
+                formatted_row += "%s (%s)\n" % (rows[0][1], len(rows))
+                for row in rows:
+                    # Add test name, status and count
+                    formatted_row += "%s\n" % (row[0])
+                    # start to add reasons
+                    if row[2]:
+                        reason = row[2].split()
+                        curr_length = 0
+                        formatted_row += "    "
+                        for word in reason:
+                            previous_length = curr_length
+                            curr_length += len(word)
+                            if curr_length > max_length:
+                                curr_length = 0
+                                if previous_length != 0:
+                                    formatted_row += "\n    %s " % word
+                                else:
+                                    # Corner case, len(word) > 80 char
+                                    formatted_row += "%s\n    " % word
+                            else:
+                                formatted_row += "%s " % word
+                        formatted_row += "\n"
+            return formatted_row
+
         stats = {}
 
         rows = _db.execute("""
@@ -894,7 +928,11 @@ class Job(DBObject):
                 ORDER BY t.reason
                 """ % self.id)
 
-        failed_rows = [r for r in rows if not r[1] == 'GOOD']
+        failed_rows = [r for r in rows if r[1] != 'GOOD']
+        explicitly_failed_rows = [r for r in rows if r[1] == 'FAIL']
+        warn_rows = [r for r in rows if r[1] == 'WARN']
+        skipped_rows = [r for r in rows if r[1] == 'TEST_NA']
+        passed_rows = [r for r in rows if r[1] == 'GOOD']
 
         n_test_jobs = _find_test_jobs(rows)
         n_test_jobs_failed = _find_test_jobs(failed_rows)
@@ -912,12 +950,10 @@ class Job(DBObject):
         stats['total_passed'] = total_executed - total_failed
         stats['success_rate'] = success_rate
 
-        status_header = ("Test Name", "Status", "Reason")
-        if failed_rows:
-            stats['failed_rows'] = utils.matrix_to_string(failed_rows,
-                                                          status_header)
-        else:
-            stats['failed_rows'] = ''
+        stats['fail_detail'] = _format_rows(explicitly_failed_rows)
+        stats['warn_detail'] = _format_rows(warn_rows)
+        stats['skip_detail'] = _format_rows(skipped_rows)
+        stats['pass_detail'] = _format_rows(passed_rows)
 
         time_row = _db.execute("""
                    SELECT started_time, finished_time
-- 
1.7.10.4

_______________________________________________
Autotest mailing list
Autotest@test.kernel.org
http://test.kernel.org/cgi-bin/mailman/listinfo/autotest

Reply via email to