-# 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:
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 pal_utils import get_last_completed_build_number
from pal_errors import PresentationError
: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"]
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])
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]
- 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
in_file = (
f"{self.configs[alert[u'way']][u'output-dir']}/"
- f"cpta-{re_pro}-{alert[u'urls'][idx].split(u'/')[-1]}.txt"
+ f"{re_pro}-{alert[u'urls'][idx].split(u'/')[-1]}.txt"
)
out_file = (
f"{self.configs[alert[u'way']][u'output-dir']}/"
)
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:
- 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 += (
- 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 += (
- f"\n\n{test_set.split('-')[-2]}-{test_set.split('-')[-1]}, "
+ f"\n\n{test_set_short}, "
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():
)
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"VPP version: {version}\n\n"
+ f"{device} version: {version}\n\n"
)
# Add list of regressions:
self._list_gressions(alert, idx, gression_hdr, u"regressions")