FIX: Revert l3fwd patching
[csit.git] / resources / libraries / python / DPDK / L3fwdTest.py
1 # Copyright (c) 2018 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:
5 #
6 #     http://www.apache.org/licenses/LICENSE-2.0
7 #
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.
13
14 """
15 This module exists to provide the l3fwd test for DPDK on topology nodes.
16 """
17
18 from resources.libraries.python.ssh import SSH
19 from resources.libraries.python.constants import Constants
20 from resources.libraries.python.topology import NodeType, Topology
21
22 class L3fwdTest(object):
23     """Test the DPDK l3fwd performance."""
24
25     @staticmethod
26     def start_the_l3fwd_test(nodes_info, dut_node, dut_if1, dut_if2,
27                              nb_cores, lcores_list, queue_nums, jumbo_frames):
28         """
29         Execute the l3fwd on the dut_node.
30
31         :param nodes_info: All the nodes info in the topology file.
32         :param dut_node: Will execute the l3fwd on this node
33         :param dut_if1: The test link interface 1.
34         :param dut_if2: The test link interface 2.
35         :param nb_cores: The cores number for the forwarding
36         :param lcores_list: The lcore list string for the l3fwd routing
37         :param queue_nums: The queues number for the NIC
38         :param jumbo_frames: Indication if the jumbo frames are used (True) or
39                              not (False).
40         :type nodes_info: dict
41         :type dut_node: dict
42         :type dut_if1: str
43         :type dut_if2: str
44         :type nb_cores: str
45         :type lcores_list: str
46         :type queue_nums: str
47         :type jumbo_frames: bool
48         """
49         if dut_node['type'] == NodeType.DUT:
50             adj_mac0, adj_mac1 = L3fwdTest.get_adj_mac(nodes_info, dut_node,
51                                                        dut_if1, dut_if2)
52
53             list_cores = lcores_list.split(',')
54
55             # prepare the port config param
56             index = 0
57             port_config = ''
58             for port in range(0, 2):
59                 for queue in range(0, int(queue_nums)):
60                     if int(nb_cores) == 1:
61                         index = 0
62                         temp_str = '({port}, {queue}, {core}),'.\
63                         format(port=port, queue=queue,
64                                core=int(list_cores[index]))
65                     else:
66                         temp_str = '({port}, {queue}, {core}),'.\
67                         format(port=port, queue=queue,
68                                core=int(list_cores[index]))
69
70                     port_config += temp_str
71                     index = index + 1
72
73             ssh = SSH()
74             ssh.connect(dut_node)
75
76             jumbo = 'yes' if jumbo_frames else 'no'
77             cmd = '{fwdir}/tests/dpdk/dpdk_scripts/run_l3fwd.sh ' \
78                   '"{lcores}" "{ports}" {mac1} {mac2} {jumbo}'.\
79                   format(fwdir=Constants.REMOTE_FW_DIR, lcores=lcores_list,
80                          ports=port_config.rstrip(','), mac1=adj_mac0,
81                          mac2=adj_mac1, jumbo=jumbo)
82
83             ret_code, _, _ = ssh.exec_command_sudo(cmd, timeout=600)
84             if ret_code != 0:
85                 raise Exception('Failed to execute l3fwd test at node {name}'
86                                 .format(name=dut_node['host']))
87
88     @staticmethod
89     def get_adj_mac(nodes_info, dut_node, dut_if1, dut_if2):
90         """
91         Get adjacency MAC addresses of the DUT node.
92
93         :param nodes_info: All the nodes info in the topology file.
94         :param dut_node: Will execute the l3fwd on this node
95         :param dut_if1: The test link interface 1.
96         :param dut_if2: The test link interface 2.
97         :type nodes_info: dict
98         :type dut_node: dict
99         :type dut_if1: str
100         :type dut_if2: str
101         :returns: Returns MAC addresses of adjacency DUT nodes.
102         :rtype: str
103         """
104         if_key0 = dut_if1
105         if_key1 = dut_if2
106         if_pci0 = Topology.get_interface_pci_addr(dut_node, if_key0)
107         if_pci1 = Topology.get_interface_pci_addr(dut_node, if_key1)
108
109         # detect which is the port 0
110         if min(if_pci0, if_pci1) != if_pci0:
111             if_key0, if_key1 = if_key1, if_key0
112
113         adj_node0, adj_if_key0 = Topology.get_adjacent_node_and_interface( \
114                                  nodes_info, dut_node, if_key0)
115         adj_node1, adj_if_key1 = Topology.get_adjacent_node_and_interface( \
116                                  nodes_info, dut_node, if_key1)
117
118         adj_mac0 = Topology.get_interface_mac(adj_node0, adj_if_key0)
119         adj_mac1 = Topology.get_interface_mac(adj_node1, adj_if_key1)
120
121         return adj_mac0, adj_mac1
122
123     @staticmethod
124     def patch_l3fwd(node, patch):
125         """
126         Patch l3fwd application and recompile.
127
128         :param node: Dictionary created from topology.
129         :param patch: Patch to apply.
130         :type node: dict
131         :type patch: str
132         :raises RuntimeError: Patching of l3fwd failed.
133         """
134         arch = Topology.get_node_arch(node)
135
136         ssh = SSH()
137         ssh.connect(node)
138
139         ret_code, _, _ = ssh.exec_command(
140             '{fwdir}/tests/dpdk/dpdk_scripts/patch_l3fwd.sh {arch} '
141             '{fwdir}/tests/dpdk/dpdk_scripts/{patch}'.
142             format(fwdir=Constants.REMOTE_FW_DIR, arch=arch, patch=patch),
143                    timeout=600)
144
145         if ret_code != 0:
146             raise RuntimeError('Patch of l3fwd failed.')