X-Git-Url: https://gerrit.fd.io/r/gitweb?p=csit.git;a=blobdiff_plain;f=resources%2Ftools%2Fpresentation%2Finput_data_parser.py;h=703ea33ba1aaa02a2f04c5b084efb9fd0dedae9d;hp=340b7dc372bb3e6b94f2ae1a4fb9cb810c3712ec;hb=6c3d971c8b529d094f7c7355e685ea5ab63904e5;hpb=344ea908c94faf37a10f23627b2f5656ea3e289b diff --git a/resources/tools/presentation/input_data_parser.py b/resources/tools/presentation/input_data_parser.py index 340b7dc372..703ea33ba1 100644 --- a/resources/tools/presentation/input_data_parser.py +++ b/resources/tools/presentation/input_data_parser.py @@ -30,12 +30,20 @@ from robot import errors from collections import OrderedDict from string import replace from os import remove +from os.path import join +from datetime import datetime as dt +from datetime import timedelta +from json import loads from jumpavg.AvgStdevMetadataFactory import AvgStdevMetadataFactory from input_data_files import download_and_unzip_data_file from utils import Worker +# Separator used in file names +SEPARATOR = "__" + + class ExecutionChecker(ResultVisitor): """Class to traverse through the test suite structure. @@ -268,7 +276,8 @@ class ExecutionChecker(ResultVisitor): REGEX_TOLERANCE = re.compile(r'^[\D\d]*LOSS_ACCEPTANCE:\s(\d*\.\d*)\s' r'[\D\d]*') - REGEX_VERSION_VPP = re.compile(r"(return STDOUT Version:\s*)(.*)") + REGEX_VERSION_VPP = re.compile(r"(return STDOUT Version:\s*|" + r"VPP Version:\s*)(.*)") REGEX_VERSION_DPDK = re.compile(r"(return STDOUT testpmd)([\d\D\n]*)" r"(RTE Version: 'DPDK )(.*)(')") @@ -311,6 +320,9 @@ class ExecutionChecker(ResultVisitor): # Timestamp self._timestamp = None + # Testbed. The testbed is identified by TG node IP address. + self._testbed = None + # Mapping of TCs long names self._mapping = mapping @@ -351,7 +363,8 @@ class ExecutionChecker(ResultVisitor): "vpp-version": self._get_vpp_version, "dpdk-version": self._get_dpdk_version, "teardown-vat-history": self._get_vat_history, - "test-show-runtime": self._get_show_run + "test-show-runtime": self._get_show_run, + "testbed": self._get_testbed } @property @@ -363,6 +376,28 @@ class ExecutionChecker(ResultVisitor): """ return self._data + def _get_testbed(self, msg): + """Called when extraction of testbed IP is required. + The testbed is identified by TG node IP address. + + :param msg: Message to process. + :type msg: Message + :returns: Nothing. + """ + + if msg.message.count("Arguments:"): + message = str(msg.message).replace(' ', '').replace('\n', '').\ + replace("'", '"').replace('b"', '"').\ + replace("honeycom", "honeycomb") + message = loads(message[11:-1]) + try: + self._testbed = message["TG"]["host"] + except (KeyError, ValueError): + pass + finally: + self._data["metadata"]["testbed"] = self._testbed + self._msg_type = None + def _get_vpp_version(self, msg): """Called when extraction of VPP version is required. @@ -371,7 +406,8 @@ class ExecutionChecker(ResultVisitor): :returns: Nothing. """ - if msg.message.count("return STDOUT Version:"): + if msg.message.count("return STDOUT Version:") or \ + msg.message.count("VPP Version:"): self._version = str(re.search(self.REGEX_VERSION_VPP, msg.message). group(2)) self._data["metadata"]["version"] = self._version @@ -696,9 +732,9 @@ class ExecutionChecker(ResultVisitor): else: test_result["status"] = "FAIL" self._data["tests"][self._test_ID] = test_result - logging.error("The test '{0}' has no or more than one " + logging.debug("The test '{0}' has no or more than one " "multi-threading tags.".format(self._test_ID)) - logging.error("Tags: {0}".format(test_result["tags"])) + logging.debug("Tags: {0}".format(test_result["tags"])) return if test.status == "PASS" and ("NDRPDRDISC" in tags or @@ -765,8 +801,12 @@ class ExecutionChecker(ResultVisitor): items_str = groups.group(1) items_float = [float(item.strip()) for item in items_str.split(",")] - test_result["result"]["receive-rate"] = \ - AvgStdevMetadataFactory.from_data(items_float) + metadata = AvgStdevMetadataFactory.from_data(items_float) + # Next two lines have been introduced in CSIT-1179, + # to be removed in CSIT-1180. + metadata.size = 1 + metadata.stdev = 0.0 + test_result["result"]["receive-rate"] = metadata else: groups = re.search(self.REGEX_MRR, test.message) test_result["result"]["receive-rate"] = \ @@ -890,6 +930,8 @@ class ExecutionChecker(ResultVisitor): elif setup_kw.name.count("Setup performance global Variables") \ and not self._timestamp: self._msg_type = "timestamp" + elif setup_kw.name.count("Setup Framework") and not self._testbed: + self._msg_type = "testbed" else: return setup_kw.messages.visit(self) @@ -1139,7 +1181,45 @@ class InputData(object): remove(build["file-name"]) except OSError as err: logs.append(("ERROR", "Cannot remove the file '{0}': {1}". - format(build["file-name"], err))) + format(build["file-name"], repr(err)))) + + # If the time-period is defined in the specification file, remove all + # files which are outside the time period. + timeperiod = self._cfg.input.get("time-period", None) + if timeperiod and data: + now = dt.utcnow() + timeperiod = timedelta(int(timeperiod)) + metadata = data.get("metadata", None) + if metadata: + generated = metadata.get("generated", None) + if generated: + generated = dt.strptime(generated, "%Y%m%d %H:%M") + if (now - generated) > timeperiod: + # Remove the data and the file: + state = "removed" + data = None + logs.append( + ("INFO", + " The build {job}/{build} is outdated, will be " + "removed".format(job=job, build=build["build"]))) + file_name = self._cfg.input["file-name"] + full_name = join( + self._cfg.environment["paths"]["DIR[WORKING,DATA]"], + "{job}{sep}{build}{sep}{name}". + format(job=job, + sep=SEPARATOR, + build=build["build"], + name=file_name)) + try: + remove(full_name) + logs.append(("INFO", + " The file {name} has been removed". + format(name=full_name))) + except OSError as err: + logs.append(("ERROR", + "Cannot remove the file '{0}': {1}". + format(full_name, repr(err)))) + logs.append(("INFO", " Done.")) result = {