Report: Download first from logs.fd.io 74/21274/1
authorTibor Frank <tifrank@cisco.com>
Fri, 9 Aug 2019 10:45:27 +0000 (12:45 +0200)
committerTibor Frank <tifrank@cisco.com>
Tue, 13 Aug 2019 12:40:13 +0000 (12:40 +0000)
Change-Id: I308d7a7f72e0ea2e23b96be7db1ba35920bae519
Signed-off-by: Tibor Frank <tifrank@cisco.com>
(cherry picked from commit cd2a57aba61553f36c638dc6e8d949e1739fb6bf)

resources/tools/presentation/input_data_files.py
resources/tools/presentation/specification.yaml
resources/tools/presentation/specification_CPTA.yaml
resources/tools/presentation/utils.py

index 3ab99c3..0f32ed5 100644 (file)
@@ -17,6 +17,7 @@ Download all data.
 
 import re
 import requests
+import logging
 
 from os import rename, mkdir
 from os.path import join
@@ -28,7 +29,7 @@ from requests import codes, RequestException, Timeout, TooManyRedirects, \
     HTTPError, ConnectionError
 
 from errors import PresentationError
-from utils import execute_command
+
 
 # Chunk size used for file download
 CHUNK_SIZE = 512
@@ -39,15 +40,17 @@ SEPARATOR = "__"
 REGEX_RELEASE = re.compile(r'(\D*)(\d{4}|master)(\D*)')
 
 
-def _download_file(url, file_name, log):
+def _download_file(url, file_name, log, arch=False):
     """Download a file with input data.
 
     :param url: URL to the file to download.
     :param file_name: Name of file to download.
     :param log: List of log messages.
+    :param arch: If True, also .gz file is downloaded
     :type url: str
     :type file_name: str
     :type log: list of tuples (severity, msg)
+    :type arch: bool
     :returns: True if the download was successful, otherwise False.
     :rtype: bool
     """
@@ -57,10 +60,16 @@ def _download_file(url, file_name, log):
                                status_forcelist=(500, 502, 504)):
         """
 
-        :param retries:
-        :param backoff_factor:
-        :param status_forcelist:
-        :returns:
+        :param retries: Total number of retries to allow.
+        :param backoff_factor: A backoff factor to apply between attempts after
+            the second try.
+        :param status_forcelist: A set of integer HTTP status codes that are
+            forced to retry.
+        :type retries: int
+        :type backoff_factor: float
+        :type status_forcelist: iterable
+        :returns: Session object.
+        :rtype: requests.Session
         """
 
         retry = Retry(
@@ -96,10 +105,16 @@ def _download_file(url, file_name, log):
         log.append(("INFO", "    Downloading the file '{0}' to '{1}' ...".
                     format(url, file_name)))
 
-        with open(file_name, "wb") as file_handle:
+        dst_file_name = file_name.replace(".gz", "")
+        with open(dst_file_name, "wb") as file_handle:
             for chunk in response.iter_content(chunk_size=CHUNK_SIZE):
                 if chunk:
                     file_handle.write(chunk)
+
+        if arch and ".gz" in file_name:
+            with open(file_name, "wb") as file_handle:
+                file_handle.write(response.raw.read())
+
         success = True
     except ConnectionError as err:
         log.append(("ERROR", "Not possible to connect to '{0}'.".format(url)))
@@ -138,8 +153,12 @@ def _unzip_file(spec, build, pid, log):
     :rtype: bool
     """
 
-    data_file = spec.input["extract"]
     file_name = build["file-name"]
+    if ".zip" in file_name:
+        data_file = spec.input["zip-extract"]
+    else:
+        data_file = spec.input["extract"]
+
     directory = spec.environment["paths"]["DIR[WORKING,DATA]"]
     tmp_dir = join(directory, str(pid))
     try:
@@ -187,42 +206,52 @@ def download_and_unzip_data_file(spec, job, build, pid, log):
     :rtype: bool
     """
 
-    if job.startswith("csit-"):
-        if spec.input["file-name"].endswith(".zip"):
-            url = spec.environment["urls"]["URL[JENKINS,CSIT]"]
-        elif spec.input["file-name"].endswith(".gz"):
-            url = spec.environment["urls"]["URL[NEXUS,LOG]"]
-        else:
-            log.append(("ERROR", "Not supported file format."))
-            return False
-    elif job.startswith("hc2vpp-"):
-        url = spec.environment["urls"]["URL[JENKINS,HC]"]
-    elif job.startswith("intel-dnv-"):
-        url = spec.environment["urls"]["URL[VIRL,DNV]"].format(release=job[-4:])
-    else:
-        raise PresentationError("No url defined for the job '{}'.".format(job))
+    # Try to download .gz from logs.fd.io
+
     file_name = spec.input["file-name"]
-    full_name = spec.input["download-path"]. \
-        format(job=job, build=build["build"], filename=file_name)
-    if not job.startswith("intel-dnv-"):
-        url = "{0}/{1}".format(url, full_name)
+    url = "{0}/{1}".format(
+        spec.environment["urls"]["URL[NEXUS,LOG]"],
+        spec.input["download-path"].format(
+            job=job, build=build["build"], filename=file_name))
     new_name = join(spec.environment["paths"]["DIR[WORKING,DATA]"],
-                    "{job}{sep}{build}{sep}{name}".
-                    format(job=job, sep=SEPARATOR, build=build["build"],
-                           name=file_name))
+                    "{job}{sep}{build}{sep}{name}".format(
+                        job=job, sep=SEPARATOR, build=build["build"],
+                        name=file_name))
 
-    # Download the file from the defined source (Jenkins, logs.fd.io):
-    success, downloaded_name = _download_file(url, new_name, log)
-    if success:
-        new_name = downloaded_name
+    logging.info("Downloading {0}".format(url))
 
-    if success and new_name.endswith(".zip"):
-        if not is_zipfile(new_name):
-            success = False
+    arch = True if spec.configuration.get("archive-inputs", True) else False
+    success, downloaded_name = _download_file(url, new_name, log, arch=arch)
 
-    # If not successful, download from docs.fd.io:
     if not success:
-        log.append(("INFO", "    Trying to download from https://docs.fd.io:"))
+
+        # Try to download .gz from docs.fd.io
+
+        file_name = spec.input["file-name"]
+        url = "{0}/{1}".format(
+            spec.environment["urls"]["URL[NEXUS,DOC]"],
+            spec.input["download-path"].format(
+                job=job, build=build["build"], filename=file_name))
+        new_name = join(spec.environment["paths"]["DIR[WORKING,DATA]"],
+                        "{job}{sep}{build}{sep}{name}".format(
+                            job=job, sep=SEPARATOR, build=build["build"],
+                            name=file_name))
+
+        logging.info("Downloading {0}".format(url))
+
+        if spec.configuration.get("archive-inputs", True):
+            arch = True
+        success, downloaded_name = _download_file(url, new_name, log, arch=arch)
+
+    if not success:
+
+        # Try to download .zip from docs.fd.io
+
+        file_name = spec.input["zip-file-name"]
+        new_name = join(spec.environment["paths"]["DIR[WORKING,DATA]"],
+                        "{job}{sep}{build}{sep}{name}".format(
+                            job=job, sep=SEPARATOR, build=build["build"],
+                            name=file_name))
         release = re.search(REGEX_RELEASE, job).group(2)
         for rls in (release, "master"):
             nexus_file_name = "{job}{sep}{build}{sep}{name}". \
@@ -231,37 +260,59 @@ def download_and_unzip_data_file(spec, job, build, pid, log):
             try:
                 rls = "rls{0}".format(int(rls))
             except ValueError:
+                # It is 'master'
                 pass
             url = "{url}/{release}/{dir}/{file}". \
-                format(url=spec.environment["urls"]["URL[NEXUS]"],
+                format(url=spec.environment["urls"]["URL[NEXUS,DOC]"],
                        release=rls,
-                       dir=spec.environment["urls"]["DIR[NEXUS]"],
+                       dir=spec.environment["urls"]["DIR[NEXUS,DOC]"],
                        file=nexus_file_name)
-            success, new_name = _download_file(url, new_name, log)
+
+            logging.info("Downloading {0}".format(url))
+
+            success, downloaded_name = _download_file(url, new_name, log)
             if success:
                 break
 
-    if success:
-        build["file-name"] = new_name
-    else:
-        return False
+    if not success:
 
-    if spec.input["file-name"].endswith(".gz"):
-        if "docs.fd.io" in url:
-            execute_command("gzip --decompress --keep --force {0}".
-                            format(new_name))
-        else:
-            rename(new_name, new_name[:-3])
-            if spec.configuration.get("archive-inputs", True):
-                execute_command("gzip --keep {0}".format(new_name[:-3]))
-        build["file-name"] = new_name[:-3]
-
-    if new_name.endswith(".zip"):
-        if is_zipfile(new_name):
-            return _unzip_file(spec, build, pid, log)
+        # Try to download .zip from jenkins.fd.io
+
+        file_name = spec.input["zip-file-name"]
+        download_path = spec.input["zip-download-path"]
+        if job.startswith("csit-"):
+            url = spec.environment["urls"]["URL[JENKINS,CSIT]"]
+        elif job.startswith("hc2vpp-"):
+            url = spec.environment["urls"]["URL[JENKINS,HC]"]
         else:
+            raise PresentationError(
+                "No url defined for the job '{}'.".format(job))
+
+        full_name = download_path.format(
+            job=job, build=build["build"], filename=file_name)
+        url = "{0}/{1}".format(url, full_name)
+        new_name = join(spec.environment["paths"]["DIR[WORKING,DATA]"],
+                        "{job}{sep}{build}{sep}{name}".
+                        format(job=job, sep=SEPARATOR, build=build["build"],
+                               name=file_name))
+
+        logging.info("Downloading {0}".format(url))
+
+        success, downloaded_name = _download_file(url, new_name, log)
+
+    if success and downloaded_name.endswith(".zip"):
+        if not is_zipfile(downloaded_name):
             log.append(("ERROR",
                         "Zip file '{0}' is corrupted.".format(new_name)))
-            return False
-    else:
-        return True
+            success = False
+
+    if success:
+        build["file-name"] = downloaded_name
+
+        if file_name.endswith(".gz"):
+            build["file-name"] = downloaded_name[:-3]
+
+        if downloaded_name.endswith(".zip"):
+            success = _unzip_file(spec, build, pid, log)
+
+    return success
index d709747..2f29c4b 100644 (file)
@@ -76,8 +76,9 @@
     URL[JENKINS,HC]: "https://jenkins.fd.io/view/hc2vpp/job"
     URL[VIRL,DNV]: "http://10.30.51.28/download/denverton/{release}/robot-plugin.zip"
     # URL[VIRL,DNV]: "http://download.it/from/nexus"
-    URL[NEXUS]: "https://docs.fd.io/csit"
-    DIR[NEXUS]: "report/_static/archive"
+    URL[NEXUS,LOG]: "https://logs.fd.io/production/vex-yul-rot-jenkins-1"
+    URL[NEXUS,DOC]: "https://docs.fd.io/csit"
+    DIR[NEXUS,DOC]: "report/_static/archive"
 
   make-dirs:
   # List the directories which are created while preparing the environment.
 
 - type: "input"
   general:
-    file-name: "robot-plugin.zip"
-    file-format: ".zip"
-    download-path: "{job}/{build}/robot/report/*zip*/{filename}"
-    extract: "robot-plugin/output.xml"
+    file-name: "output_info.xml.gz"
+    file-format: ".gz"
+    arch-file-format:
+      - ".gz"
+      - ".zip"
+    download-path: "{job}/{build}/archives/{filename}"
+    extract: "output.xml"
+
+    zip-file-name: "robot-plugin.zip"
+    zip-file-format: ".zip"
+    zip-download-path: "{job}/{build}/robot/report/*zip*/{filename}"
+    zip-extract: "robot-plugin/output.xml"
 
   builds:
 #    intel-dnv-vpp-release-1904:
     csit-hc2vpp-verify-func-1904-ubuntu1604:
       - 4
 
-#    csit-vpp-functional-1908-ubuntu1604-virl:
-#      -
+    csit-vpp-functional-1908-ubuntu1604-virl:
+      - 19
 #    csit-vpp-functional-1908-centos7-virl:
 #      -
 #    csit-vpp-device-1908-ubuntu1804-1n-skx:
index 128ab5e..5e86948 100644 (file)
@@ -45,8 +45,8 @@
   urls:
     URL[JENKINS,CSIT]: "https://jenkins.fd.io/view/csit/job"
     URL[NEXUS,LOG]: "https://logs.fd.io/production/vex-yul-rot-jenkins-1"
-    URL[NEXUS]: "https://docs.fd.io/csit"
-    DIR[NEXUS]: "trending/_static/archive"
+    URL[NEXUS,DOC]: "https://docs.fd.io/csit"
+    DIR[NEXUS,DOC]: "trending/_static/archive"
 
   make-dirs:
   # List the directories which are created while preparing the environment.
     # 3n-hsw
     plot-performance-trending-all-3n-hsw:
       csit-vpp-perf-mrr-daily-master:
-        start: 670
+        start: 685
         end: "lastCompletedBuild"
         skip:
-          - 672
-          - 673
-          - 674
-          - 675
-          - 676
-          - 677
-          - 678
-          - 679
-          - 680
           - 688
           - 689
           - 690
 
     plot-performance-trending-vpp-3n-hsw:
       csit-vpp-perf-mrr-daily-master:
-        start: 670
+        start: 685
         end: "lastCompletedBuild"
         skip:
-          - 672
-          - 673
-          - 674
-          - 675
-          - 676
-          - 677
-          - 678
-          - 679
-          - 680
           - 688
           - 689
           - 690
     # 3n-skx
     plot-performance-trending-all-3n-skx:
       csit-vpp-perf-mrr-daily-master-3n-skx:
-        start: 420
+        start: 435
         end: "lastCompletedBuild"
         skip:
-          - 423
-          - 424
-          - 425
-          - 426
-          - 427
-          - 428
-          - 429
-          - 430
           - 440
           - 444
           - 446
 
     plot-performance-trending-vpp-3n-skx:
       csit-vpp-perf-mrr-daily-master-3n-skx:
-        start: 420
+        start: 435
         end: "lastCompletedBuild"
         skip:
-          - 423
-          - 424
-          - 425
-          - 426
-          - 427
-          - 428
-          - 429
-          - 430
           - 440
           - 444
           - 446
     # 2n-skx
     plot-performance-trending-all-2n-skx:
       csit-vpp-perf-mrr-daily-master-2n-skx:
-        start: 420
+        start: 435
         end: "lastCompletedBuild"
         skip:
-          - 423
-          - 424
-          - 425
-          - 426
-          - 427
-          - 428
-          - 429
-          - 430
-          - 431
           - 441
           - 444
           - 477
 
     plot-performance-trending-vpp-2n-skx:
       csit-vpp-perf-mrr-daily-master-2n-skx:
-        start: 420
+        start: 435
         end: "lastCompletedBuild"
         skip:
-          - 423
-          - 424
-          - 425
-          - 426
-          - 427
-          - 428
-          - 429
-          - 430
-          - 431
           - 441
           - 444
           - 477
     # time period are used.
     time-period: 90
 
+    zip-file-name: "robot-plugin.zip"
+    zip-file-format: ".zip"
+    zip-download-path: "{job}/{build}/robot/report/*zip*/{filename}"
+    zip-extract: "robot-plugin/output.xml"
+
   builds:
 
     # 3n-hsw
     csit-vpp-perf-mrr-daily-master:
-      start: 670
+      start: 685
       end: "lastCompletedBuild"
       skip:
-        - 672
-        - 673
-        - 674
-        - 675
-        - 676
-        - 677
-        - 678
-        - 679
-        - 680
         - 688
         - 689
         - 690
 
     # 3n-skx
     csit-vpp-perf-mrr-daily-master-3n-skx:
-      start: 420
+      start: 435
       end: "lastCompletedBuild"
       skip:
-        - 423
-        - 424
-        - 425
-        - 426
-        - 427
-        - 428
-        - 429
-        - 430
         - 440
         - 444
         - 446
 
     # 2n-skx
     csit-vpp-perf-mrr-daily-master-2n-skx:
-      start: 420
+      start: 435
       end: "lastCompletedBuild"
       skip:
-        - 423
-        - 424
-        - 425
-        - 426
-        - 427
-        - 428
-        - 429
-        - 430
-        - 431
         - 441
         - 444
         - 477
index 8f56300..3f0d6ff 100644 (file)
@@ -235,9 +235,11 @@ def archive_input_data(spec):
 
     logging.info("    Archiving the input data files ...")
 
-    extension = spec.input["file-format"]
-    data_files = get_files(spec.environment["paths"]["DIR[WORKING,DATA]"],
-                           extension=extension)
+    extension = spec.input["arch-file-format"]
+    data_files = list()
+    for ext in extension:
+        data_files.extend(get_files(
+            spec.environment["paths"]["DIR[WORKING,DATA]"], extension=ext))
     dst = spec.environment["paths"]["DIR[STATIC,ARCH]"]
     logging.info("      Destination: {0}".format(dst))