X-Git-Url: https://gerrit.fd.io/r/gitweb?p=csit.git;a=blobdiff_plain;f=resources%2Ftools%2Fpresentation%2Futils.py;h=c350fae13543ddd09dcc744e8803b9b80b17a3c5;hp=a2aa0dc0717a925b685bba71482bf040b20f462e;hb=fce7b4b339f7a79b80143bbd796460720489d694;hpb=2e63ef13b419da1198439617e66cb0f1cfe6be65 diff --git a/resources/tools/presentation/utils.py b/resources/tools/presentation/utils.py index a2aa0dc071..c350fae135 100644 --- a/resources/tools/presentation/utils.py +++ b/resources/tools/presentation/utils.py @@ -24,7 +24,8 @@ import prettytable from os import walk, makedirs, environ from os.path import join, isdir from shutil import move, Error -from math import sqrt +from datetime import datetime +from pandas import Series from errors import PresentationError from jumpavg.BitCountingClassifier import BitCountingClassifier @@ -50,11 +51,7 @@ def stdev(items): :returns: Stdev. :rtype: float """ - - avg = mean(items) - variance = [(x - avg) ** 2 for x in items] - stddev = sqrt(mean(variance)) - return stddev + return Series.std(Series(items)) def relative_change(nr1, nr2): @@ -120,8 +117,8 @@ def execute_command(cmd): :param cmd: Command to execute. :type cmd: str - :returns: Return code of the executed command. - :rtype: int + :returns: Return code of the executed command, stdout and stderr. + :rtype: tuple(int, str, str) """ env = environ.copy() @@ -178,6 +175,29 @@ def get_last_completed_build_number(jenkins_url, job_name): return execute_command(cmd) +def get_build_timestamp(jenkins_url, job_name, build_nr): + """Get the timestamp of the build of the given job. + + :param jenkins_url: Jenkins URL. + :param job_name: Job name. + :param build_nr: Build number. + :type jenkins_url: str + :type job_name: str + :type build_nr: int + :returns: The timestamp. + :rtype: datetime.datetime + """ + + url = "{jenkins_url}/{job_name}/{build_nr}".format(jenkins_url=jenkins_url, + job_name=job_name, + build_nr=build_nr) + cmd = "wget -qO- {url}".format(url=url) + + timestamp = execute_command(cmd) + + return datetime.fromtimestamp(timestamp/1000) + + def archive_input_data(spec): """Archive the report. @@ -217,13 +237,13 @@ def classify_anomalies(data): the first value of changed average as a regression, or a progression. :param data: Full data set with unavailable samples replaced by nan. - :type data: pandas.Series + :type data: OrderedDict :returns: Classification and trend values :rtype: 2-tuple, list of strings and list of floats """ # Nan mean something went wrong. # Use 0.0 to cause that being reported as a severe regression. - bare_data = [0.0 if np.isnan(sample) else sample + bare_data = [0.0 if np.isnan(sample.avg) else sample for _, sample in data.iteritems()] # TODO: Put analogous iterator into jumpavg library. groups = BitCountingClassifier().classify(bare_data) @@ -234,9 +254,9 @@ def classify_anomalies(data): values_left = 0 avg = 0.0 for _, sample in data.iteritems(): - if np.isnan(sample): + if np.isnan(sample.avg): classification.append("outlier") - avgs.append(sample) + avgs.append(sample.avg) continue if values_left < 1 or active_group is None: values_left = 0