CSIT-1504: Soak tests - box plots
[csit.git] / resources / tools / presentation / utils.py
index a2aa0dc..c350fae 100644 (file)
@@ -24,7 +24,8 @@ import prettytable
 from os import walk, makedirs, environ
 from os.path import join, isdir
 from shutil import move, Error
 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
 
 from errors import PresentationError
 from jumpavg.BitCountingClassifier import BitCountingClassifier
@@ -50,11 +51,7 @@ def stdev(items):
     :returns: Stdev.
     :rtype: float
     """
     :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):
 
 
 def relative_change(nr1, nr2):
@@ -120,8 +117,8 @@ def execute_command(cmd):
 
     :param cmd: Command to execute.
     :type cmd: str
 
     :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()
     """
 
     env = environ.copy()
@@ -178,6 +175,29 @@ def get_last_completed_build_number(jenkins_url, job_name):
     return execute_command(cmd)
 
 
     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.
 
 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.
     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.
     :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)
                  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():
     values_left = 0
     avg = 0.0
     for _, sample in data.iteritems():
-        if np.isnan(sample):
+        if np.isnan(sample.avg):
             classification.append("outlier")
             classification.append("outlier")
-            avgs.append(sample)
+            avgs.append(sample.avg)
             continue
         if values_left < 1 or active_group is None:
             values_left = 0
             continue
         if values_left < 1 or active_group is None:
             values_left = 0