Python3: resources and libraries
[csit.git] / resources / libraries / python / autogen / Regenerator.py
index eb5f9bd..7271fbc 100644 (file)
 
 """Module defining utilities for test directory regeneration."""
 
 
 """Module defining utilities for test directory regeneration."""
 
-from __future__ import print_function
+import sys
 
 from glob import glob
 
 from glob import glob
+from io import open
 from os import getcwd
 from os import getcwd
-import sys
+
 
 from resources.libraries.python.Constants import Constants
 from resources.libraries.python.autogen.Testcase import Testcase
 
 
 PROTOCOL_TO_MIN_FRAME_SIZE = {
 
 from resources.libraries.python.Constants import Constants
 from resources.libraries.python.autogen.Testcase import Testcase
 
 
 PROTOCOL_TO_MIN_FRAME_SIZE = {
-    "ip4": 64,
-    "ip6": 78,
-    "ethip4vxlan": 114,  # What is the real minimum for latency stream?
-    "dot1qip4vxlan": 118
+    u"ip4": 64,
+    u"ip6": 78,
+    u"ethip4vxlan": 114,  # What is the real minimum for latency stream?
+    u"dot1qip4vxlan": 118
 }
 }
-MIN_FRAME_SIZE_VALUES = PROTOCOL_TO_MIN_FRAME_SIZE.values()
-
-
-# Copied from https://stackoverflow.com/a/14981125
-def eprint(*args, **kwargs):
-    """Print to stderr."""
-    print(*args, file=sys.stderr, **kwargs)
+MIN_FRAME_SIZE_VALUES = list(PROTOCOL_TO_MIN_FRAME_SIZE.values())
 
 
 def replace_defensively(
         whole, to_replace, replace_with, how_many, msg, in_filename):
 
 
 def replace_defensively(
         whole, to_replace, replace_with, how_many, msg, in_filename):
-    """Replace substrings while checking the number of occurences.
+    """Replace substrings while checking the number of occurrences.
 
     Return edited copy of the text. Assuming "whole" is really a string,
     or something else with .replace not affecting it.
 
     :param whole: The text to perform replacements on.
 
     Return edited copy of the text. Assuming "whole" is really a string,
     or something else with .replace not affecting it.
 
     :param whole: The text to perform replacements on.
-    :param to_replace: Substring occurences of which to replace.
-    :param replace_with: Substring to replace occurences with.
-    :param how_many: Number of occurences to expect.
+    :param to_replace: Substring occurrences of which to replace.
+    :param replace_with: Substring to replace occurrences with.
+    :param how_many: Number of occurrences to expect.
     :param msg: Error message to raise.
     :param msg: Error message to raise.
-    :param in_filename: File name in which the error occured.
+    :param in_filename: File name in which the error occurred.
     :type whole: str
     :type to_replace: str
     :type replace_with: str
     :type whole: str
     :type to_replace: str
     :type replace_with: str
@@ -59,11 +54,11 @@ def replace_defensively(
     :type in_filename: str
     :return: The whole text after replacements are done.
     :rtype: str
     :type in_filename: str
     :return: The whole text after replacements are done.
     :rtype: str
-    :raise ValueError: If number of occurences does not match.
+    :raise ValueError: If number of occurrences does not match.
     """
     found = whole.count(to_replace)
     if found != how_many:
     """
     found = whole.count(to_replace)
     if found != how_many:
-        raise ValueError(in_filename + ": " + msg)
+        raise ValueError(f"{in_filename}: {msg}")
     return whole.replace(to_replace, replace_with)
 
 
     return whole.replace(to_replace, replace_with)
 
 
@@ -73,18 +68,18 @@ def get_iface_and_suite_id(filename):
     Interface ID is the part of suite name
     which should be replaced for other NIC.
     Suite ID is the part os suite name
     Interface ID is the part of suite name
     which should be replaced for other NIC.
     Suite ID is the part os suite name
-    which si appended to testcase names.
+    which si appended to test case names.
 
     :param filename: Suite file.
     :type filename: str
     :returns: Interface ID, Suite ID.
     :rtype: (str, str)
     """
 
     :param filename: Suite file.
     :type filename: str
     :returns: Interface ID, Suite ID.
     :rtype: (str, str)
     """
-    dash_split = filename.split("-", 1)
+    dash_split = filename.split(u"-", 1)
     if len(dash_split[0]) <= 4:
         # It was something like "2n1l", we need one more split.
     if len(dash_split[0]) <= 4:
         # It was something like "2n1l", we need one more split.
-        dash_split = dash_split[1].split("-", 1)
-    return dash_split[0], dash_split[1].split(".", 1)[0]
+        dash_split = dash_split[1].split(u"-", 1)
+    return dash_split[0], dash_split[1].split(u".", 1)[0]
 
 
 def add_default_testcases(testcase, iface, suite_id, file_out, tc_kwargs_list):
 
 
 def add_default_testcases(testcase, iface, suite_id, file_out, tc_kwargs_list):
@@ -106,32 +101,32 @@ def add_default_testcases(testcase, iface, suite_id, file_out, tc_kwargs_list):
     for num, kwargs in enumerate(tc_kwargs_list, start=1):
         # TODO: Is there a better way to disable some combinations?
         emit = True
     for num, kwargs in enumerate(tc_kwargs_list, start=1):
         # TODO: Is there a better way to disable some combinations?
         emit = True
-        if kwargs["frame_size"] == 9000:
-            if "vic1227" in iface:
+        if kwargs[u"frame_size"] == 9000:
+            if u"vic1227" in iface:
                 # Not supported in HW.
                 emit = False
                 # Not supported in HW.
                 emit = False
-            if "vic1385" in iface:
+            if u"vic1385" in iface:
                 # Not supported in HW.
                 emit = False
                 # Not supported in HW.
                 emit = False
-            if "ipsec" in suite_id:
+            if u"ipsec" in suite_id:
                 # IPsec code does not support chained buffers.
                 # Tracked by Jira ticket VPP-1207.
                 emit = False
                 # IPsec code does not support chained buffers.
                 # Tracked by Jira ticket VPP-1207.
                 emit = False
-        if "-16vm2t-" in suite_id or "-16dcr2t-" in suite_id:
-            if kwargs["phy_cores"] > 3:
+        if u"-16vm2t-" in suite_id or u"-16dcr2t-" in suite_id:
+            if kwargs[u"phy_cores"] > 3:
                 # CSIT lab only has 28 (physical) core processors,
                 # so these test would fail when attempting to assign cores.
                 emit = False
                 # CSIT lab only has 28 (physical) core processors,
                 # so these test would fail when attempting to assign cores.
                 emit = False
-        if "-24vm1t-" in suite_id or "-24dcr1t-" in suite_id:
-            if kwargs["phy_cores"] > 3:
+        if u"-24vm1t-" in suite_id or u"-24dcr1t-" in suite_id:
+            if kwargs[u"phy_cores"] > 3:
                 # CSIT lab only has 28 (physical) core processors,
                 # so these test would fail when attempting to assign cores.
                 emit = False
                 # CSIT lab only has 28 (physical) core processors,
                 # so these test would fail when attempting to assign cores.
                 emit = False
-        if "soak" in suite_id:
+        if u"soak" in suite_id:
             # Soak test take too long, do not risk other than tc01.
             # Soak test take too long, do not risk other than tc01.
-            if kwargs["phy_cores"] != 1:
+            if kwargs[u"phy_cores"] != 1:
                 emit = False
                 emit = False
-            if kwargs["frame_size"] not in MIN_FRAME_SIZE_VALUES:
+            if kwargs[u"frame_size"] not in MIN_FRAME_SIZE_VALUES:
                 emit = False
         if emit:
             file_out.write(testcase.generate(num=num, **kwargs))
                 emit = False
         if emit:
             file_out.write(testcase.generate(num=num, **kwargs))
@@ -163,52 +158,61 @@ def write_default_files(in_filename, in_prolog, kwargs_list):
     """
     for suite_type in Constants.PERF_TYPE_TO_KEYWORD:
         tmp_filename = replace_defensively(
     """
     for suite_type in Constants.PERF_TYPE_TO_KEYWORD:
         tmp_filename = replace_defensively(
-            in_filename, "ndrpdr", suite_type, 1,
-            "File name should contain suite type once.", in_filename)
+            in_filename, u"ndrpdr", suite_type, 1,
+            u"File name should contain suite type once.", in_filename
+        )
         tmp_prolog = replace_defensively(
         tmp_prolog = replace_defensively(
-            in_prolog, "ndrpdr".upper(), suite_type.upper(), 1,
-            "Suite type should appear once in uppercase (as tag).",
-            in_filename)
+            in_prolog, u"ndrpdr".upper(), suite_type.upper(), 1,
+            u"Suite type should appear once in uppercase (as tag).",
+            in_filename
+        )
         tmp_prolog = replace_defensively(
             tmp_prolog,
         tmp_prolog = replace_defensively(
             tmp_prolog,
-            "Find NDR and PDR intervals using optimized search",
+            u"Find NDR and PDR intervals using optimized search",
             Constants.PERF_TYPE_TO_KEYWORD[suite_type], 1,
             Constants.PERF_TYPE_TO_KEYWORD[suite_type], 1,
-            "Main search keyword should appear once in suite.",
-            in_filename)
+            u"Main search keyword should appear once in suite.",
+            in_filename
+        )
         tmp_prolog = replace_defensively(
             tmp_prolog,
         tmp_prolog = replace_defensively(
             tmp_prolog,
-            Constants.PERF_TYPE_TO_SUITE_DOC_VER["ndrpdr"],
+            Constants.PERF_TYPE_TO_SUITE_DOC_VER[u"ndrpdr"],
             Constants.PERF_TYPE_TO_SUITE_DOC_VER[suite_type],
             Constants.PERF_TYPE_TO_SUITE_DOC_VER[suite_type],
-            1, "Exact suite type doc not found.", in_filename)
+            1, u"Exact suite type doc not found.", in_filename
+        )
         tmp_prolog = replace_defensively(
             tmp_prolog,
         tmp_prolog = replace_defensively(
             tmp_prolog,
-            Constants.PERF_TYPE_TO_TEMPLATE_DOC_VER["ndrpdr"],
+            Constants.PERF_TYPE_TO_TEMPLATE_DOC_VER[u"ndrpdr"],
             Constants.PERF_TYPE_TO_TEMPLATE_DOC_VER[suite_type],
             Constants.PERF_TYPE_TO_TEMPLATE_DOC_VER[suite_type],
-            1, "Exact template type doc not found.", in_filename)
+            1, u"Exact template type doc not found.", in_filename
+        )
         _, suite_id = get_iface_and_suite_id(tmp_filename)
         testcase = Testcase.default(suite_id)
         for nic_name in Constants.NIC_NAME_TO_CODE:
             out_filename = replace_defensively(
         _, suite_id = get_iface_and_suite_id(tmp_filename)
         testcase = Testcase.default(suite_id)
         for nic_name in Constants.NIC_NAME_TO_CODE:
             out_filename = replace_defensively(
-                tmp_filename, "10ge2p1x710",
+                tmp_filename, u"10ge2p1x710",
                 Constants.NIC_NAME_TO_CODE[nic_name], 1,
                 Constants.NIC_NAME_TO_CODE[nic_name], 1,
-                "File name should contain NIC code once.", in_filename)
+                u"File name should contain NIC code once.", in_filename
+            )
             out_prolog = replace_defensively(
             out_prolog = replace_defensively(
-                tmp_prolog, "Intel-X710", nic_name, 2,
-                "NIC name should appear twice (tag and variable).",
-                in_filename)
-            if out_prolog.count("HW_") == 2:
+                tmp_prolog, u"Intel-X710", nic_name, 2,
+                u"NIC name should appear twice (tag and variable).",
+                in_filename
+            )
+            if out_prolog.count(u"HW_") == 2:
                 # TODO CSIT-1481: Crypto HW should be read
                 # from topology file instead.
                 if nic_name in Constants.NIC_NAME_TO_CRYPTO_HW:
                     out_prolog = replace_defensively(
                 # TODO CSIT-1481: Crypto HW should be read
                 # from topology file instead.
                 if nic_name in Constants.NIC_NAME_TO_CRYPTO_HW:
                     out_prolog = replace_defensively(
-                        out_prolog, "HW_DH895xcc",
+                        out_prolog, u"HW_DH895xcc",
                         Constants.NIC_NAME_TO_CRYPTO_HW[nic_name], 1,
                         Constants.NIC_NAME_TO_CRYPTO_HW[nic_name], 1,
-                        "HW crypto name should appear.", in_filename)
+                        u"HW crypto name should appear.", in_filename
+                    )
             iface, suite_id = get_iface_and_suite_id(out_filename)
             iface, suite_id = get_iface_and_suite_id(out_filename)
-            with open(out_filename, "w") as file_out:
+            with open(out_filename, "wt") as file_out:
                 file_out.write(out_prolog)
                 add_default_testcases(
                 file_out.write(out_prolog)
                 add_default_testcases(
-                    testcase, iface, suite_id, file_out, kwargs_list)
+                    testcase, iface, suite_id, file_out, kwargs_list
+                )
 
 
 def write_reconf_files(in_filename, in_prolog, kwargs_list):
 
 
 def write_reconf_files(in_filename, in_prolog, kwargs_list):
@@ -229,26 +233,30 @@ def write_reconf_files(in_filename, in_prolog, kwargs_list):
     testcase = Testcase.default(suite_id)
     for nic_name in Constants.NIC_NAME_TO_CODE:
         out_filename = replace_defensively(
     testcase = Testcase.default(suite_id)
     for nic_name in Constants.NIC_NAME_TO_CODE:
         out_filename = replace_defensively(
-            in_filename, "10ge2p1x710",
+            in_filename, u"10ge2p1x710",
             Constants.NIC_NAME_TO_CODE[nic_name], 1,
             Constants.NIC_NAME_TO_CODE[nic_name], 1,
-            "File name should contain NIC code once.", in_filename)
+            u"File name should contain NIC code once.", in_filename
+        )
         out_prolog = replace_defensively(
         out_prolog = replace_defensively(
-            in_prolog, "Intel-X710", nic_name, 2,
-            "NIC name should appear twice (tag and variable).",
-            in_filename)
-        if out_prolog.count("HW_") == 2:
+            in_prolog, u"Intel-X710", nic_name, 2,
+            u"NIC name should appear twice (tag and variable).",
+            in_filename
+        )
+        if out_prolog.count(u"HW_") == 2:
             # TODO CSIT-1481: Crypto HW should be read
             # from topology file instead.
             # TODO CSIT-1481: Crypto HW should be read
             # from topology file instead.
-            if nic_name in Constants.NIC_NAME_TO_CRYPTO_HW.keys():
+            if nic_name in list(Constants.NIC_NAME_TO_CRYPTO_HW.keys()):
                 out_prolog = replace_defensively(
                 out_prolog = replace_defensively(
-                    out_prolog, "HW_DH895xcc",
+                    out_prolog, u"HW_DH895xcc",
                     Constants.NIC_NAME_TO_CRYPTO_HW[nic_name], 1,
                     Constants.NIC_NAME_TO_CRYPTO_HW[nic_name], 1,
-                    "HW crypto name should appear.", in_filename)
+                    u"HW crypto name should appear.", in_filename
+                )
         iface, suite_id = get_iface_and_suite_id(out_filename)
         iface, suite_id = get_iface_and_suite_id(out_filename)
-        with open(out_filename, "w") as file_out:
+        with open(out_filename, "wt") as file_out:
             file_out.write(out_prolog)
             add_default_testcases(
             file_out.write(out_prolog)
             add_default_testcases(
-                testcase, iface, suite_id, file_out, kwargs_list)
+                testcase, iface, suite_id, file_out, kwargs_list
+            )
 
 
 def write_tcp_files(in_filename, in_prolog, kwargs_list):
 
 
 def write_tcp_files(in_filename, in_prolog, kwargs_list):
@@ -266,19 +274,21 @@ def write_tcp_files(in_filename, in_prolog, kwargs_list):
     testcase = Testcase.tcp(suite_id)
     for nic_name in Constants.NIC_NAME_TO_CODE:
         out_filename = replace_defensively(
     testcase = Testcase.tcp(suite_id)
     for nic_name in Constants.NIC_NAME_TO_CODE:
         out_filename = replace_defensively(
-            in_filename, "10ge2p1x710",
+            in_filename, u"10ge2p1x710",
             Constants.NIC_NAME_TO_CODE[nic_name], 1,
             Constants.NIC_NAME_TO_CODE[nic_name], 1,
-            "File name should contain NIC code once.", in_filename)
+            u"File name should contain NIC code once.", in_filename
+        )
         out_prolog = replace_defensively(
         out_prolog = replace_defensively(
-            in_prolog, "Intel-X710", nic_name, 2,
-            "NIC name should appear twice (tag and variable).",
-            in_filename)
-        with open(out_filename, "w") as file_out:
+            in_prolog, u"Intel-X710", nic_name, 2,
+            u"NIC name should appear twice (tag and variable).",
+            in_filename
+        )
+        with open(out_filename, "wt") as file_out:
             file_out.write(out_prolog)
             add_tcp_testcases(testcase, file_out, kwargs_list)
 
 
             file_out.write(out_prolog)
             add_tcp_testcases(testcase, file_out, kwargs_list)
 
 
-class Regenerator(object):
+class Regenerator:
     """Class containing file generating methods."""
 
     def __init__(self, quiet=True):
     """Class containing file generating methods."""
 
     def __init__(self, quiet=True):
@@ -289,15 +299,15 @@ class Regenerator(object):
         """
         self.quiet = quiet
 
         """
         self.quiet = quiet
 
-    def regenerate_glob(self, pattern, protocol="ip4"):
+    def regenerate_glob(self, pattern, protocol=u"ip4"):
         """Regenerate files matching glob pattern based on arguments.
 
         In the current working directory, find all files matching
         the glob pattern. Use testcase template according to suffix
         """Regenerate files matching glob pattern based on arguments.
 
         In the current working directory, find all files matching
         the glob pattern. Use testcase template according to suffix
-        to regenerate test cases, autonumbering them,
+        to regenerate test cases, auto-numbering them,
         taking arguments from list.
 
         taking arguments from list.
 
-        Log-like prints are emited to sys.stderr.
+        Log-like prints are emitted to sys.stderr.
 
         :param pattern: Glob pattern to select files. Example: *-ndrpdr.robot
         :param protocol: String determining minimal frame size. Default: "ip4"
 
         :param pattern: Glob pattern to select files. Example: *-ndrpdr.robot
         :param protocol: String determining minimal frame size. Default: "ip4"
@@ -306,45 +316,50 @@ class Regenerator(object):
         :raises RuntimeError: If invalid source suite is encountered.
         """
         if not self.quiet:
         :raises RuntimeError: If invalid source suite is encountered.
         """
         if not self.quiet:
-            eprint("Regenerator starts at {cwd}".format(cwd=getcwd()))
+            print(f"Regenerator starts at {getcwd()}", file=sys.stderr)
 
         min_frame_size = PROTOCOL_TO_MIN_FRAME_SIZE[protocol]
         default_kwargs_list = [
 
         min_frame_size = PROTOCOL_TO_MIN_FRAME_SIZE[protocol]
         default_kwargs_list = [
-            {"frame_size": min_frame_size, "phy_cores": 1},
-            {"frame_size": min_frame_size, "phy_cores": 2},
-            {"frame_size": min_frame_size, "phy_cores": 4},
-            {"frame_size": 1518, "phy_cores": 1},
-            {"frame_size": 1518, "phy_cores": 2},
-            {"frame_size": 1518, "phy_cores": 4},
-            {"frame_size": 9000, "phy_cores": 1},
-            {"frame_size": 9000, "phy_cores": 2},
-            {"frame_size": 9000, "phy_cores": 4},
-            {"frame_size": "IMIX_v4_1", "phy_cores": 1},
-            {"frame_size": "IMIX_v4_1", "phy_cores": 2},
-            {"frame_size": "IMIX_v4_1", "phy_cores": 4}
+            {u"frame_size": min_frame_size, u"phy_cores": 1},
+            {u"frame_size": min_frame_size, u"phy_cores": 2},
+            {u"frame_size": min_frame_size, u"phy_cores": 4},
+            {u"frame_size": 1518, u"phy_cores": 1},
+            {u"frame_size": 1518, u"phy_cores": 2},
+            {u"frame_size": 1518, u"phy_cores": 4},
+            {u"frame_size": 9000, u"phy_cores": 1},
+            {u"frame_size": 9000, u"phy_cores": 2},
+            {u"frame_size": 9000, u"phy_cores": 4},
+            {u"frame_size": u"IMIX_v4_1", u"phy_cores": 1},
+            {u"frame_size": u"IMIX_v4_1", u"phy_cores": 2},
+            {u"frame_size": u"IMIX_v4_1", u"phy_cores": 4}
+        ]
+        tcp_kwargs_list = [
+            {u"phy_cores": i, u"frame_size": 0} for i in (1, 2, 4)
         ]
         ]
-        tcp_kwargs_list = [{"phy_cores": i, "frame_size": 0} for i in (1, 2, 4)]
         for in_filename in glob(pattern):
             if not self.quiet:
         for in_filename in glob(pattern):
             if not self.quiet:
-                eprint("Regenerating in_filename:", in_filename)
+                print(
+                    u"Regenerating in_filename:", in_filename, file=sys.stderr
+                )
             iface, _ = get_iface_and_suite_id(in_filename)
             iface, _ = get_iface_and_suite_id(in_filename)
-            if not iface.endswith("10ge2p1x710"):
+            if not iface.endswith(u"10ge2p1x710"):
                 raise RuntimeError(
                 raise RuntimeError(
-                    "Error in {fil}: non-primary NIC found.".format(
-                        fil=in_filename))
-            with open(in_filename, "r") as file_in:
-                in_prolog = "".join(
-                    file_in.read().partition("*** Test Cases ***")[:-1])
-            if in_filename.endswith("-ndrpdr.robot"):
+                    f"Error in {in_filename}: non-primary NIC found."
+                )
+            with open(in_filename, "rt") as file_in:
+                in_prolog = u"".join(
+                    file_in.read().partition("*** Test Cases ***")[:-1]
+                )
+            if in_filename.endswith(u"-ndrpdr.robot"):
                 write_default_files(in_filename, in_prolog, default_kwargs_list)
                 write_default_files(in_filename, in_prolog, default_kwargs_list)
-            elif in_filename.endswith("-reconf.robot"):
+            elif in_filename.endswith(u"-reconf.robot"):
                 write_reconf_files(in_filename, in_prolog, default_kwargs_list)
                 write_reconf_files(in_filename, in_prolog, default_kwargs_list)
-            elif in_filename[-10:] in ("-cps.robot", "-rps.robot"):
+            elif in_filename[-10:] in (u"-cps.robot", u"-rps.robot"):
                 write_tcp_files(in_filename, in_prolog, tcp_kwargs_list)
             else:
                 raise RuntimeError(
                 write_tcp_files(in_filename, in_prolog, tcp_kwargs_list)
             else:
                 raise RuntimeError(
-                    "Error in {fil}: non-primary suite type found.".format(
-                        fil=in_filename))
+                    f"Error in {in_filename}: non-primary suite type found."
+                )
         if not self.quiet:
         if not self.quiet:
-            eprint("Regenerator ends.")
-        eprint()  # To make autogen check output more readable.
+            print(u"Regenerator ends.", file=sys.stderr)
+        print(file=sys.stderr)  # To make autogen check output more readable.