From 1cd46e5b0125f405af0aa6c9aa715f543428f1d7 Mon Sep 17 00:00:00 2001 From: Viliam Luc Date: Fri, 1 Jul 2022 10:53:51 +0200 Subject: fix: start testpmd and l3fwd in 3 cycles Signed-off-by: Viliam Luc Change-Id: I935ee5cf5bd7e760ef29fdc338f981e4e7cc333f --- resources/libraries/python/DPDK/L3fwdCheck.py | 36 --------- resources/libraries/python/DPDK/L3fwdTest.py | 90 ++++++++++++++++++++- resources/libraries/python/DPDK/TestpmdCheck.py | 35 -------- resources/libraries/python/DPDK/TestpmdTest.py | 101 +++++++++++++++++++++++- 4 files changed, 183 insertions(+), 79 deletions(-) delete mode 100644 resources/libraries/python/DPDK/L3fwdCheck.py delete mode 100644 resources/libraries/python/DPDK/TestpmdCheck.py (limited to 'resources/libraries/python') diff --git a/resources/libraries/python/DPDK/L3fwdCheck.py b/resources/libraries/python/DPDK/L3fwdCheck.py deleted file mode 100644 index a2f3ce655e..0000000000 --- a/resources/libraries/python/DPDK/L3fwdCheck.py +++ /dev/null @@ -1,36 +0,0 @@ -# Copyright (c) 2022 Cisco and/or its affiliates. -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at: -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -from resources.libraries.python.Constants import Constants -from resources.libraries.python.DpdkUtil import DpdkUtil -from resources.libraries.python.ssh import exec_cmd_no_error, exec_cmd -from resources.libraries.python.topology import NodeType, Topology - - -class L3fwdCheck: - """Test the DPDK l3fwd is ready.""" - - @staticmethod - def check_l3fwd(node): - """ - Execute the l3fwd check on the DUT node. - - :param node: DUT node. - :type node: dict - :raises RuntimeError: If the script "check_l3fwd.sh" fails. - """ - if node[u"type"] == NodeType.DUT: - command = f"{Constants.REMOTE_FW_DIR}/{Constants.RESOURCES_LIB_SH}"\ - f"/entry/check_l3fwd.sh" - message = f"Failed to check l3fwd state at node {node['host']}" - exec_cmd_no_error(node, command, timeout=1800, message=message) diff --git a/resources/libraries/python/DPDK/L3fwdTest.py b/resources/libraries/python/DPDK/L3fwdTest.py index 1c6e618c01..2ceeab2a51 100644 --- a/resources/libraries/python/DPDK/L3fwdTest.py +++ b/resources/libraries/python/DPDK/L3fwdTest.py @@ -1,4 +1,4 @@ -# Copyright (c) 2021 Cisco and/or its affiliates. +# Copyright (c) 2022 Cisco and/or its affiliates. # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at: @@ -12,19 +12,87 @@ # limitations under the License. """ -This module exists to provide the l3fwd test for DPDK on topology nodes. +This module exists to start l3fwd 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, exec_cmd from resources.libraries.python.topology import NodeType, Topology - NB_PORTS = 2 + class L3fwdTest: - """Test the DPDK l3fwd performance.""" + """This class start l3fwd on topology nodes and check if properly started. + """ + + @staticmethod + def start_l3fwd_on_all_duts( + nodes, topology_info, phy_cores, rx_queues=None, jumbo_frames=False, + rxd=None, txd=None): + """ + Execute the l3fwd on all dut nodes. + + :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. + + :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 + :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] + L3fwdTest.start_l3fwd( + nodes, nodes[node], if1=if1, if2=if2, lcores_list=cpu_dp, + nb_cores=dp_count_int, queue_nums=rxq_count_int, + jumbo_frames=jumbo_frames + ) + for node in nodes: + if u"DUT" in node: + for i in range(3): + try: + L3fwdTest.check_l3fwd(nodes[node]) + break + except RuntimeError: + L3fwdTest.start_l3fwd( + nodes, nodes[node], if1=if1, if2=if2, + lcores_list=cpu_dp, nb_cores=dp_count_int, + queue_nums=rxq_count_int, jumbo_frames=jumbo_frames + ) + else: + message = f"Failed to start l3fwd at node {node}" + raise RuntimeError(message) @staticmethod def start_l3fwd( @@ -100,6 +168,20 @@ class L3fwdTest: message = f"Failed to execute l3fwd test at node {node['host']}" exec_cmd_no_error(node, command, timeout=1800, message=message) + @staticmethod + def check_l3fwd(node): + """ + Execute the l3fwd check on the DUT node. + + :param node: DUT node. + :type node: dict + :raises RuntimeError: If the script "check_l3fwd.sh" fails. + """ + if node[u"type"] == NodeType.DUT: + command = f"{Constants.REMOTE_FW_DIR}/{Constants.RESOURCES_LIB_SH}"\ + f"/entry/check_l3fwd.sh" + message = "L3fwd not started properly" + exec_cmd_no_error(node, command, timeout=1800, message=message) @staticmethod def get_adj_mac(nodes, node, if1, if2): diff --git a/resources/libraries/python/DPDK/TestpmdCheck.py b/resources/libraries/python/DPDK/TestpmdCheck.py deleted file mode 100644 index fb6f4dc791..0000000000 --- a/resources/libraries/python/DPDK/TestpmdCheck.py +++ /dev/null @@ -1,35 +0,0 @@ -# Copyright (c) 2022 Cisco and/or its affiliates. -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at: -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -from resources.libraries.python.Constants import Constants -from resources.libraries.python.ssh import exec_cmd_no_error -from resources.libraries.python.topology import NodeType - - -class TestpmdCheck: - """Test the DPDK testpmd is ready.""" - - @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 = f"Failed to check testpmd state at node {node['host']}" - exec_cmd_no_error(node, command, timeout=1800, message=message) diff --git a/resources/libraries/python/DPDK/TestpmdTest.py b/resources/libraries/python/DPDK/TestpmdTest.py index f88b368e93..091110f129 100644 --- a/resources/libraries/python/DPDK/TestpmdTest.py +++ b/resources/libraries/python/DPDK/TestpmdTest.py @@ -11,18 +11,96 @@ # 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) -- cgit 1.2.3-korg