aboutsummaryrefslogtreecommitdiffstats
path: root/resources/libraries/python/DPDK
diff options
context:
space:
mode:
authorViliam Luc <vluc@cisco.com>2022-07-01 10:53:51 +0200
committerTibor Frank <tifrank@cisco.com>2022-07-27 07:19:30 +0000
commit1cd46e5b0125f405af0aa6c9aa715f543428f1d7 (patch)
treeeeafceee75c167dd25b4ce8f5eaa4fc078b7dcdd /resources/libraries/python/DPDK
parent9b2e7742555b773b6755833e688265b858ce0f6f (diff)
fix: start testpmd and l3fwd in 3 cycles
Signed-off-by: Viliam Luc <vluc@cisco.com> Change-Id: I935ee5cf5bd7e760ef29fdc338f981e4e7cc333f
Diffstat (limited to 'resources/libraries/python/DPDK')
-rw-r--r--resources/libraries/python/DPDK/L3fwdCheck.py36
-rw-r--r--resources/libraries/python/DPDK/L3fwdTest.py90
-rw-r--r--resources/libraries/python/DPDK/TestpmdCheck.py35
-rw-r--r--resources/libraries/python/DPDK/TestpmdTest.py101
4 files changed, 183 insertions, 79 deletions
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)