fix: start testpmd and l3fwd in 3 cycles
[csit.git] / resources / libraries / python / DPDK / TestpmdTest.py
index f88b368..091110f 100644 (file)
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-"""This module implements functionality which sets L2 forwarding for DPDK on
-DUT nodes.
+"""
+This module exists to start testpmd on topology nodes.
 """
 
+from robot.libraries.BuiltIn import BuiltIn
 from resources.libraries.python.Constants import Constants
+from resources.libraries.python.CpuUtils import CpuUtils
 from resources.libraries.python.DpdkUtil import DpdkUtil
 from resources.libraries.python.ssh import exec_cmd_no_error
 from resources.libraries.python.topology import NodeType, Topology
 
 
 class TestpmdTest:
-    """Setup the DPDK for testpmd performance test."""
+    """
+    This class start testpmd on topology nodes and check if properly started.
+    """
+    
+    @staticmethod
+    def start_testpmd_on_all_duts(
+            nodes, topology_info, phy_cores, rx_queues=None, jumbo_frames=False,
+            rxd=None, txd=None, nic_rxq_size=None, nic_txq_size=None):
+        """
+        Start the testpmd with M worker threads and rxqueues N and jumbo
+        support frames on/off on all DUTs.
+
+        :param nodes: All the nodes info from the topology file.
+        :param topology_info: All the info from the topology file.
+        :param phy_cores: Number of physical cores to use.
+        :param rx_queues: Number of RX queues.
+        :param jumbo_frames: Jumbo frames on/off.
+        :param rxd: Number of RX descriptors.
+        :param txd: Number of TX descriptors.
+        :param nic_rxq_size: RX queue size.
+        :param nic_txq_size: TX queue size.
+
+        :type nodes: dict
+        :type topology_info: dict
+        :type phy_cores: int
+        :type rx_queues: int
+        :type jumbo_frames: bool
+        :type rxd: int
+        :type txd: int
+        :type nic_rxq_size: int
+        :type nic_txq_size: int
+        :raises RuntimeError: If bash return code is not 0.
+        """
+
+        cpu_count_int = dp_count_int = int(phy_cores)
+        dp_cores = cpu_count_int+1
+        for node in nodes:
+            if u"DUT" in node:
+                compute_resource_info = CpuUtils.get_affinity_vswitch(
+                    nodes, node, phy_cores, rx_queues=rx_queues,
+                    rxd=rxd, txd=txd
+                )
+                if dp_count_int > 1:
+                    BuiltIn().set_tags('MTHREAD')
+                else:
+                    BuiltIn().set_tags('STHREAD')
+                BuiltIn().set_tags(
+                    f"{dp_count_int}T{cpu_count_int}C"
+                )
+
+                cpu_dp = compute_resource_info[u"cpu_dp"]
+                rxq_count_int = compute_resource_info[u"rxq_count_int"]
+                if1 = topology_info[f"{node}_pf1"][0]
+                if2 = topology_info[f"{node}_pf2"][0]
+                TestpmdTest.start_testpmd(
+                    nodes[node], if1=if1, if2=if2, lcores_list=cpu_dp,
+                    nb_cores=dp_count_int, queue_nums=rxq_count_int,
+                    jumbo_frames=jumbo_frames, rxq_size=nic_rxq_size,
+                    txq_size=nic_txq_size
+                )
+        for node in nodes:
+            if u"DUT" in node:
+                for i in range(3):
+                    try:
+                        TestpmdTest.check_testpmd(nodes[node])
+                        break
+                    except RuntimeError:
+                        TestpmdTest.start_testpmd(
+                            nodes[node], if1=if1, if2=if2,
+                            lcores_list=cpu_dp, nb_cores=dp_count_int,
+                            queue_nums=rxq_count_int,
+                            jumbo_frames=jumbo_frames,
+                            rxq_size=nic_rxq_size, txq_size=nic_txq_size
+                        )
+                else:
+                    message = f"Failed to start testpmd at node {node}"
+                    raise RuntimeError(message)
 
     @staticmethod
     def start_testpmd(
@@ -45,7 +123,7 @@ class TestpmdTest:
         :type if1: str
         :type if2: str
         :type lcores_list: str
-        :type nb_cores: str
+        :type nb_cores: int
         :type queue_nums: str
         :type jumbo_frames: bool
         :type rxq_size: int
@@ -83,3 +161,18 @@ class TestpmdTest:
                 f"/entry/run_testpmd.sh \"{testpmd_args}\""
             message = f"Failed to execute testpmd at node {node['host']}"
             exec_cmd_no_error(node, command, timeout=1800, message=message)
+
+    @staticmethod
+    def check_testpmd(node):
+        """
+        Execute the testpmd check on the DUT node.
+
+        :param node: DUT node.
+        :type node: dict
+        :raises RuntimeError: If the script "check_testpmd.sh" fails.
+        """
+        if node[u"type"] == NodeType.DUT:
+            command = f"{Constants.REMOTE_FW_DIR}/{Constants.RESOURCES_LIB_SH}"\
+                      f"/entry/check_testpmd.sh"
+            message = "Testpmd not started properly"
+            exec_cmd_no_error(node, command, timeout=1800, message=message)