1 # Copyright (c) 2019 Cisco and/or its affiliates.
2 # Licensed under the Apache License, Version 2.0 (the "License");
3 # you may not use this file except in compliance with the License.
4 # You may obtain a copy of the License at:
6 # http://www.apache.org/licenses/LICENSE-2.0
8 # Unless required by applicable law or agreed to in writing, software
9 # distributed under the License is distributed on an "AS IS" BASIS,
10 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11 # See the License for the specific language governing permissions and
12 # limitations under the License.
15 """This module implements initialization and cleanup of DPDK environment."""
17 from robot.api import logger
19 from resources.libraries.python.Constants import Constants
20 from resources.libraries.python.ssh import SSH, exec_cmd_no_error
21 from resources.libraries.python.topology import NodeType, Topology
25 """This class implements:
26 - Initialization of DPDK environment,
27 - Cleanup of DPDK environment.
31 def initialize_dpdk_environment(dut_node, dut_if1, dut_if2):
33 Initialize the DPDK test environment on the dut_node.
34 Load the module uio and igb_uio, then bind the test NIC to the igb_uio.
36 :param dut_node: Will init the DPDK on this node.
37 :param dut_if1: DUT interface name.
38 :param dut_if2: DUT interface name.
42 :raises RuntimeError: If it fails to bind the interfaces to igb_uio.
44 if dut_node[u"type"] == NodeType.DUT:
45 pci_address1 = Topology.get_interface_pci_addr(dut_node, dut_if1)
46 pci_address2 = Topology.get_interface_pci_addr(dut_node, dut_if2)
51 arch = Topology.get_node_arch(dut_node)
52 cmd = f"{Constants.REMOTE_FW_DIR}/tests/dpdk/dpdk_scripts" \
53 f"/init_dpdk.sh {pci_address1} {pci_address2} {arch}"
55 ret_code, _, _ = ssh.exec_command_sudo(cmd, timeout=600)
58 f"Failed to bind the interfaces to igb_uio at node "
63 def cleanup_dpdk_environment(dut_node, dut_if1, dut_if2):
65 Cleanup the DPDK test environment on the DUT node.
66 Unbind the NIC from the igb_uio and bind them to the kernel driver.
68 :param dut_node: Will cleanup the DPDK on this node.
69 :param dut_if1: DUT interface name.
70 :param dut_if2: DUT interface name.
74 :raises RuntimeError: If it fails to cleanup the dpdk.
76 if dut_node[u"type"] == NodeType.DUT:
77 pci_address1 = Topology.get_interface_pci_addr(dut_node, dut_if1)
78 if1_driver = Topology.get_interface_driver(dut_node, dut_if1)
79 pci_address2 = Topology.get_interface_pci_addr(dut_node, dut_if2)
80 if2_driver = Topology.get_interface_driver(dut_node, dut_if2)
85 cmd = f"{Constants.REMOTE_FW_DIR}/tests/dpdk/dpdk_scripts" \
86 f"/cleanup_dpdk.sh {if1_driver} {pci_address1} {if2_driver} " \
89 ret_code, _, _ = ssh.exec_command_sudo(cmd, timeout=600)
92 f"Failed to cleanup the dpdk at node {dut_node[u'host']}"
96 def install_dpdk_test(node):
98 Prepare the DPDK test environment
100 :param node: Dictionary created from topology
103 :raises RuntimeError: If command returns nonzero return code.
105 arch = Topology.get_node_arch(node)
107 command = f"{Constants.REMOTE_FW_DIR}/tests/dpdk/dpdk_scripts" \
108 f"/install_dpdk.sh {arch}"
109 message = u"Install the DPDK failed!"
110 exec_cmd_no_error(node, command, timeout=600, message=message)
112 command = f"cat {Constants.REMOTE_FW_DIR}/dpdk*/VERSION"
113 message = u"Get DPDK version failed!"
114 stdout, _ = exec_cmd_no_error(node, command, message=message)
116 logger.info(f"DPDK Version: {stdout}")
119 def install_dpdk_test_on_all_duts(nodes):
121 Prepare the DPDK test environment on all DUTs.
123 :param nodes: Nodes from topology file.
127 for node in list(nodes.values()):
128 if node[u"type"] == NodeType.DUT:
129 DPDKTools.install_dpdk_test(node)