Trending: Add graph with statistics
[csit.git] / resources / tools / presentation / generator_alerts.py
index b0606b6..4dd78fe 100644 (file)
@@ -1,4 +1,4 @@
-# Copyright (c) 2019 Cisco and/or its affiliates.
+# Copyright (c) 2021 Cisco and/or its affiliates.
 # Licensed under the Apache License, Version 2.0 (the "License");
 # you may not use this file except in compliance with the License.
 # You may obtain a copy of the License at:
 # Licensed under the Apache License, Version 2.0 (the "License");
 # you may not use this file except in compliance with the License.
 # You may obtain a copy of the License at:
 
 import smtplib
 import logging
 
 import smtplib
 import logging
+import re
 
 from email.mime.text import MIMEText
 from email.mime.multipart import MIMEMultipart
 from os.path import isdir
 from collections import OrderedDict
 
 
 from email.mime.text import MIMEText
 from email.mime.multipart import MIMEMultipart
 from os.path import isdir
 from collections import OrderedDict
 
-from pal_utils import get_last_completed_build_number
 from pal_errors import PresentationError
 
 
 from pal_errors import PresentationError
 
 
@@ -246,7 +246,7 @@ class Alerting:
         :type sort: bool
         :returns: CSIT build number, VPP version, Number of passed tests,
             Number of failed tests, Compressed failed tests.
         :type sort: bool
         :returns: CSIT build number, VPP version, Number of passed tests,
             Number of failed tests, Compressed failed tests.
-        :rtype: tuple(str, str, int, int, OrderedDict)
+        :rtype: tuple(str, str, int, int, str, OrderedDict)
         """
 
         directory = self.configs[alert[u"way"]][u"output-dir"]
         """
 
         directory = self.configs[alert[u"way"]][u"output-dir"]
@@ -268,6 +268,10 @@ class Alerting:
                     if idx == 3:
                         failed = line[:-1]
                         continue
                     if idx == 3:
                         failed = line[:-1]
                         continue
+                    if idx == 4:
+                        minutes = int(line[:-1]) // 60000
+                        duration = f"{(minutes // 60):02d}:{(minutes % 60):02d}"
+                        continue
                     try:
                         test = line[:-1].split(u'-')
                         name = u'-'.join(test[3:-1])
                     try:
                         test = line[:-1].split(u'-')
                         name = u'-'.join(test[3:-1])
@@ -285,14 +289,14 @@ class Alerting:
                         failed_tests[name][u"cores"].append(test[2])
         except IOError:
             logging.error(f"No such file or directory: {file_path}")
                         failed_tests[name][u"cores"].append(test[2])
         except IOError:
             logging.error(f"No such file or directory: {file_path}")
-            return None, None, None, None, None
+            return None, None, None, None, None, None
         if sort:
             sorted_failed_tests = OrderedDict()
             for key in sorted(failed_tests.keys()):
                 sorted_failed_tests[key] = failed_tests[key]
         if sort:
             sorted_failed_tests = OrderedDict()
             for key in sorted(failed_tests.keys()):
                 sorted_failed_tests[key] = failed_tests[key]
-            return build, version, passed, failed, sorted_failed_tests
+            return build, version, passed, failed, duration, sorted_failed_tests
 
 
-        return build, version, passed, failed, failed_tests
+        return build, version, passed, failed, duration, failed_tests
 
     def _list_gressions(self, alert, idx, header, re_pro):
         """Create a file with regressions or progressions for the test set
 
     def _list_gressions(self, alert, idx, header, re_pro):
         """Create a file with regressions or progressions for the test set
@@ -346,26 +350,39 @@ class Alerting:
             )
 
         text = u""
             )
 
         text = u""
-        for idx, test_set in enumerate(alert.get(u"include", [])):
-            build, version, passed, failed, failed_tests = \
+        for idx, test_set in enumerate(alert.get(u"include", list())):
+            test_set_short = u""
+            device = u""
+            try:
+                groups = re.search(
+                    re.compile(
+                        r'((vpp|dpdk)-\dn-(skx|clx|tsh|dnv|zn2|tx2)-.*)'
+                    ),
+                    test_set
+                )
+                test_set_short = groups.group(1)
+                device = groups.group(2)
+            except (AttributeError, IndexError):
+                logging.error(
+                    f"The test set {test_set} does not include information "
+                    f"about test bed. Using empty string instead."
+                )
+            build, version, passed, failed, duration, failed_tests = \
                 self._get_compressed_failed_tests(alert, test_set)
             if build is None:
                 self._get_compressed_failed_tests(alert, test_set)
             if build is None:
-                ret_code, build_nr, _ = get_last_completed_build_number(
-                    self._spec.environment[u"urls"][u"URL[JENKINS,CSIT]"],
-                    alert[u"urls"][idx].split(u'/')[-1])
-                if ret_code != 0:
-                    build_nr = u''
                 text += (
                 text += (
-                    f"\n\nNo input data available for "
-                    f"{u'-'.join(test_set.split('-')[-2:])}. See CSIT build "
-                    f"{alert[u'urls'][idx]}/{build_nr} for more information.\n"
+                    f"\n\nNo input data available for {test_set_short}. "
+                    f"See CSIT job {alert[u'urls'][idx]} for more "
+                    f"information.\n"
                 )
                 continue
             text += (
                 )
                 continue
             text += (
-                f"\n\n{test_set.split('-')[-2]}-{test_set.split('-')[-1]}, "
+                f"\n\n{test_set_short}, "
                 f"{failed} tests failed, "
                 f"{failed} tests failed, "
-                f"{passed} tests passed, CSIT build: "
-                f"{alert[u'urls'][idx]}/{build}, VPP version: {version}\n\n"
+                f"{passed} tests passed, "
+                f"duration: {duration}, "
+                f"CSIT build: {alert[u'urls'][idx]}/{build}, "
+                f"{device} version: {version}\n\n"
             )
 
             class MaxLens():
             )
 
             class MaxLens():
@@ -414,9 +431,9 @@ class Alerting:
                 )
 
             gression_hdr = (
                 )
 
             gression_hdr = (
-                f"\n\n{test_set.split(u'-')[-2]}-{test_set.split(u'-')[-1]}, "
+                f"\n\n{test_set_short}, "
                 f"CSIT build: {alert[u'urls'][idx]}/{build}, "
                 f"CSIT build: {alert[u'urls'][idx]}/{build}, "
-                f"VPP version: {version}\n\n"
+                f"{device} version: {version}\n\n"
             )
             # Add list of regressions:
             self._list_gressions(alert, idx, gression_hdr, u"regressions")
             )
             # Add list of regressions:
             self._list_gressions(alert, idx, gression_hdr, u"regressions")