Adapt autogen for SFd tests
[csit.git] / resources / libraries / python / autogen / Regenerator.py
index 30dc7b7..64bcea9 100644 (file)
@@ -16,7 +16,6 @@
 from glob import glob
 from os import getcwd
 
 from glob import glob
 from os import getcwd
 
-from .Testcase import Testcase
 from .DefaultTestcase import DefaultTestcase
 
 
 from .DefaultTestcase import DefaultTestcase
 
 
@@ -36,7 +35,7 @@ class Regenerator(object):
         """
         self.testcase_class = testcase_class
 
         """
         self.testcase_class = testcase_class
 
-    def regenerate_glob(self, pattern, is_ip6=False, tc_kwargs_list=None):
+    def regenerate_glob(self, pattern, protocol="ip4", tc_kwargs_list=None):
         """Regenerate files matching glob pattern based on arguments.
 
         In the current working directory, find all files matching
         """Regenerate files matching glob pattern based on arguments.
 
         In the current working directory, find all files matching
@@ -56,25 +55,94 @@ class Regenerator(object):
         :type tc_kwargs_list: list of tuple or None
         """
 
         :type tc_kwargs_list: list of tuple or None
         """
 
-        def get_suite_id(filename):
+        protocol_to_min_framesize = {
+            "ip4": 64,
+            "ip6": 78,
+            "vxlan+ip4": 114  # What is the real minimum for latency stream?
+        }
+        min_framesize_values = protocol_to_min_framesize.values()
+
+        def get_iface_and_suite_id(filename):
+            """Get interface and suite ID.
+
+            :param filename: Suite file.
+            :type filename: str
+            :returns: Interface ID, Suite ID.
+            :rtype: tuple
+            """
             dash_split = filename.split("-", 1)
             if len(dash_split[0]) <= 4:
                 # It was something like "2n1l", we need one more split.
                 dash_split = dash_split[1].split("-", 1)
             dash_split = filename.split("-", 1)
             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[1].split(".", 1)[0]
+            return dash_split[0], dash_split[1].split(".", 1)[0]
 
 
-        def add_testcase(file_out, num, **kwargs):
-            file_out.write(testcase.generate(num=num, **kwargs))
+        def add_testcase(testcase, iface, suite_id, file_out, num, **kwargs):
+            """Add testcase to file.
+
+            :param testcase: Testcase class.
+            :param iface: Interface.
+            :param suite_id: Suite ID.
+            :param file_out: File to write testcases to.
+            :param num: Testcase number.
+            :param kwargs: Key-value pairs used to construct testcase.
+            :type testcase: Testcase
+            :type iface: str
+            :type suite_id: str
+            :type file_out: file
+            :type num: int
+            :type kwargs: dict
+            :returns: Next testcase number.
+            :rtype: int
+            """
+            # TODO: Is there a better way to disable some combinations?
+            emit = True
+            if kwargs["framesize"] == 9000:
+                if "vic1227" in iface:
+                    # Not supported in HW.
+                    emit = False
+                if "avf" in suite_id:
+                    # Not supported by AVF driver.
+                    # https://git.fd.io/vpp/tree/src/plugins/avf/README.md
+                    emit = False
+            if "-16vm-" in suite_id or "-16dcr-" in suite_id:
+                if kwargs["phy_cores"] > 3:
+                    # 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:
+                # Soak test take too long, do not risk other than tc01.
+                if kwargs["phy_cores"] != 1:
+                    emit = False
+                if kwargs["framesize"] not in min_framesize_values:
+                    emit = False
+            if emit:
+                file_out.write(testcase.generate(num=num, **kwargs))
+            # We bump tc number in any case, so that future enables/disables
+            # do not affect the numbering of other test cases.
             return num + 1
 
             return num + 1
 
-        def add_testcases(file_out, tc_kwargs_list):
+        def add_testcases(testcase, iface, suite_id, file_out, tc_kwargs_list):
+            """Add testcases to file.
+
+            :param testcase: Testcase class.
+            :param iface: Interface.
+            :param suite_id: Suite ID.
+            :param file_out: File to write testcases to.
+            :param tc_kwargs_list: Key-value pairs used to construct testcases.
+            :type testcase: Testcase
+            :type iface: str
+            :type suite_id: str
+            :type file_out: file
+            :type tc_kwargs_list: dict
+            """
             num = 1
             for tc_kwargs in tc_kwargs_list:
             num = 1
             for tc_kwargs in tc_kwargs_list:
-                num = add_testcase(file_out, num, **tc_kwargs)
+                num = add_testcase(testcase, iface, suite_id, file_out, num,
+                                   **tc_kwargs)
 
         print "Regenerator starts at {cwd}".format(cwd=getcwd())
 
         print "Regenerator starts at {cwd}".format(cwd=getcwd())
-        min_framesize = 78 if is_ip6 else 64
-        kwargs_list = tc_kwargs_list if tc_kwargs_list is not None else [
+        min_framesize = protocol_to_min_framesize[protocol]
+        kwargs_list = tc_kwargs_list if tc_kwargs_list else [
             {"framesize": min_framesize, "phy_cores": 1},
             {"framesize": min_framesize, "phy_cores": 2},
             {"framesize": min_framesize, "phy_cores": 4},
             {"framesize": min_framesize, "phy_cores": 1},
             {"framesize": min_framesize, "phy_cores": 2},
             {"framesize": min_framesize, "phy_cores": 4},
@@ -89,15 +157,14 @@ class Regenerator(object):
             {"framesize": "IMIX_v4_1", "phy_cores": 4}
         ]
         for filename in glob(pattern):
             {"framesize": "IMIX_v4_1", "phy_cores": 4}
         ]
         for filename in glob(pattern):
+            print "Regenerating filename:", filename
             with open(filename, "r") as file_in:
                 text = file_in.read()
                 text_prolog = "".join(text.partition("*** Test Cases ***")[:-1])
             with open(filename, "r") as file_in:
                 text = file_in.read()
                 text_prolog = "".join(text.partition("*** Test Cases ***")[:-1])
-            # TODO: Make the following work for 2n suites.
-            suite_id = get_suite_id(filename)
-            print "Regenerating suite_id:", suite_id
+            iface, suite_id = get_iface_and_suite_id(filename)
             testcase = self.testcase_class(suite_id)
             with open(filename, "w") as file_out:
                 file_out.write(text_prolog)
             testcase = self.testcase_class(suite_id)
             with open(filename, "w") as file_out:
                 file_out.write(text_prolog)
-                add_testcases(file_out, kwargs_list)
+                add_testcases(testcase, iface, suite_id, file_out, kwargs_list)
         print "Regenerator ends."
         print  # To make autogen check output more readable.
         print "Regenerator ends."
         print  # To make autogen check output more readable.