Sometimes, we just want to have important data about the job
readily available, without having to open the web interface.

This patch adds important info to the regular status e-mails:

 * Number of tests executed
 * Success rate
 * Details about test failures

So people can decide whether they actually want to inspect
the results more carefully.

Here's how the notification e-mails appear after the test

Subject:        Autotest | Job ID: 27 "Longer test" | Status: 1 Completed | 
Success Rate: 40.0 %

Job ID: 27
Job Name: Longer test
Status: 1 Completed
Results interface URL: http://autotest/afe/#tab_id=view_job&object_id=27
Summary:
Host: 192.168.122.198 Status: Completed
Execution Time (HH:MM:SS): 00:01:38
Tests Executed: 5
Tests Passed: 2

In the future, we might encapsulate this code and create a way to do site
overrides for different email needs. I consider that what's in this patch is
sufficiently good and interesting for all users, hence I'm sending it.

Signed-off-by: Lucas Meneghel Rodrigues <[email protected]>
---
 scheduler/scheduler_models.py |  105 +++++++++++++++++++++++++++++++++++++----
 1 files changed, 95 insertions(+), 10 deletions(-)

diff --git a/scheduler/scheduler_models.py b/scheduler/scheduler_models.py
index bafaf5f..6ad8df3 100644
--- a/scheduler/scheduler_models.py
+++ b/scheduler/scheduler_models.py
@@ -594,11 +594,34 @@ class HostQueueEntry(DBObject):
     def _email_on_status(self, status):
         hostname = self._get_hostname()
 
-        subject = 'Autotest: Job ID: %s "%s" Host: %s %s' % (
-                self.job.id, self.job.name, hostname, status)
-        body = "Job ID: %s\nJob Name: %s\nHost: %s\nStatus: %s\n%s\n" % (
-                self.job.id, self.job.name, hostname, status,
-                self._view_job_url())
+        job_stats = Job(id=self.job.id).get_test_execution_details()
+
+        subject = ('Autotest | Job ID: %s "%s" | Host: %s | Status: %s '
+                    (self.job.id, self.job.name, hostname, status))
+
+        if status != "Failed":
+            subject += '| Success Rate: %s %%' % job_stats['success_rate']
+
+        body = ("Job ID: %s\n"
+                "Job Name: %s\n"
+                "Host: %s\n"
+                "Status: %s\n"
+                "Results interface URL: %s\n"
+                "Execution Time (HH:MM:SS): %s\n"
+                "Tests Executed: %s\n"
+                "Tests Passed: %s\n"
+                "Tests Failed: %s\n"
+                "Success Rate: %s %%\n"
+                "Summary of failed tests:\n" % (self.job.id, self.job.name,
+                                                hostname, status,
+                                                self._view_job_url(),
+                                                job_stats['execution_time'],
+                                                job_stats['total_executed'],
+                                                job_stats['total_passed'],
+                                                job_stats['total_failed'],
+                                                job_stats['success_rate']))
+        body += job_stats['failed_rows']
+
         email_manager.manager.send_email(self.job.email_list, subject, body)
 
 
@@ -619,11 +642,34 @@ class HostQueueEntry(DBObject):
         status = ', '.join('%d %s' % (count, status) for status, count
                     in status_counts.iteritems())
 
-        subject = 'Autotest: Job ID: %s "%s" %s' % (
-                self.job.id, self.job.name, status)
-        body = "Job ID: %s\nJob Name: %s\nStatus: %s\n%s\nSummary:\n%s" % (
-                self.job.id, self.job.name, status,  self._view_job_url(),
-                summary_text)
+        job_stats = Job(id=self.job.id).get_test_execution_details()
+
+        subject = ('Autotest | Job ID: %s "%s" | Status: %s ' %
+                   (self.job.id, self.job.name, status))
+
+        if status != "Failed":
+            subject += '| Success Rate: %s %%' % job_stats['success_rate']
+
+        body = ("Job ID: %s\n"
+                "Job Name: %s\n"
+                "Status: %s\n"
+                "Results interface URL: %s\n"
+                "Summary:\n%s\n"
+                "Execution Time (HH:MM:SS): %s\n"
+                "Tests Executed: %s\n"
+                "Tests Passed: %s\n"
+                "Tests Failed: %s\n"
+                "Success Rate: %s %%\n"
+                "Summary of failed tests:\n" % (self.job.id, self.job.name,
+                                                  status, self._view_job_url(),
+                                                  summary_text,
+                                                  job_stats['execution_time'],
+                                                  job_stats['total_executed'],
+                                                  job_stats['total_passed'],
+                                                  job_stats['total_failed'],
+                                                  job_stats['success_rate']))
+        body += job_stats['failed_rows']
+
         email_manager.manager.send_email(self.job.email_list, subject, body)
 
 
@@ -821,6 +867,45 @@ class Job(DBObject):
         return entries
 
 
+    def get_test_execution_details(self):
+        stats = {}
+        rows = _db.execute("""
+                SELECT t.test, s.word, t.reason
+                FROM tko_tests AS t, tko_jobs AS j, tko_status AS s
+                WHERE t.job_idx = j.job_idx
+                AND s.status_idx = t.status
+                AND j.afe_job_id = %s
+                """ % self.id)
+        total_executed = len(rows)
+        # We have to discount SERVER_JOB and CLIENT_JOB.0
+        if total_executed > 2:
+            total_executed -= 2
+        failed_rows = [r for r in rows if not 'GOOD' in r]
+        failed_str = '%-30s %-10s %-40s\n' % ("Test Name", "Status", "Reason")
+        for row in failed_rows:
+            failed_str += '%-30s %-10s %-40s\n' % row
+        total_failed = len(failed_rows)
+        success_rate = 100 - ((total_failed / float(total_executed)) * 100)
+        stats['total_executed'] = total_executed
+        stats['total_failed'] = total_failed
+        stats['total_passed'] = total_executed - total_failed
+        stats['success_rate'] = success_rate
+        stats['failed_rows'] = failed_str
+
+        time_row = _db.execute("""
+                   SELECT started_time, finished_time
+                   FROM tko_jobs
+                   WHERE afe_job_id = %s;
+                   """ % self.id)
+        t_begin, t_end = time_row[0]
+        delta = t_end - t_begin
+        minutes, seconds = divmod(delta.seconds, 60)
+        hours, minutes = divmod(minutes, 60)
+        stats['execution_time'] = "%02d:%02d:%02d" % (hours, minutes, seconds)
+
+        return stats
+
+
     def set_status(self, status, update_queues=False):
         self.update_field('status',status)
 
-- 
1.7.2.1

_______________________________________________
Autotest mailing list
[email protected]
http://test.kernel.org/cgi-bin/mailman/listinfo/autotest

Reply via email to