1 # Copyright (c) 2017 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.
14 """Memif interface library."""
16 from resources.libraries.python.ssh import SSH
17 from resources.libraries.python.VatExecutor import VatExecutor, VatTerminal
18 from resources.libraries.python.topology import Topology
22 """Memif interface class."""
28 def create_memif_interface(node, socket, mid, role='master'):
29 """Create Memif interface on the given node.
31 :param node: Given node to create Memif interface on.
32 :param socket: Memif interface socket path.
33 :param mid: Memif interface ID.
34 :param role: Memif interface role [master|slave]. Default is master.
39 :returns: SW interface index.
41 :raises ValueError: If command 'create memif' fails.
44 with VatTerminal(node, json_param=False) as vat:
45 vat.vat_terminal_exec_cmd_from_template(
47 socket=socket, id=mid, role=role)
48 if 'sw_if_index' in vat.vat_stdout:
50 sw_if_idx = int(vat.vat_stdout.split()[4])
51 if_key = Topology.add_new_port(node, 'memif')
52 Topology.update_interface_sw_if_index(
53 node, if_key, sw_if_idx)
54 ifc_name = Memif.vpp_get_memif_interface_name(
56 Topology.update_interface_name(node, if_key, ifc_name)
57 ifc_mac = Memif.vpp_get_memif_interface_mac(node, sw_if_idx)
58 Topology.update_interface_mac_address(node, if_key, ifc_mac)
59 Topology.update_interface_memif_socket(node, if_key, socket)
60 Topology.update_interface_memif_id(node, if_key, mid)
61 Topology.update_interface_memif_role(node, if_key, role)
64 raise ValueError('Create Memif interface failed on node '
65 '{}'.format(node['host']))
67 raise ValueError('Create Memif interface failed on node '
68 '{}'.format(node['host']))
72 """Show Memif data for the given node.
74 :param node: Given node to show Memif data on.
78 vat.execute_script("memif_dump.vat", node, json_out=False)
81 def clear_memif_socks(node, *socks):
82 """Clear Memif sockets for the given node.
84 :param node: Given node to clear Memif sockets on.
85 :param socks: Memif sockets.
93 ssh.exec_command_sudo('rm -f {}'.format(sock))
96 def parse_memif_dump_data(memif_data):
97 """Convert Memif data to dictionary.
99 :param memif_data: Dump of Memif interfaces data.
100 :type memif_data: str
101 :returns: Memif interfaces data in dictionary.
103 :raises RuntimeError: If there is no memif interface name found in
108 memif_data = str(memif_data)
112 for garbage in clutter:
113 memif_data = memif_data.replace(garbage, '')
115 for line in memif_data.splitlines():
116 if line.startswith('Sending') or len(line) == 0:
118 elif line.startswith('memif'):
120 memif_dict[memif_name] = values
121 line_split = line.split(':', 1)
122 memif_name = str(line_split[0])
125 line_split = line.split()
126 for i in range(0, len(line_split), 2):
127 key = str(line_split[i])
129 value = line_split[i+1]
134 memif_dict[memif_name] = values
136 raise RuntimeError('No memif interface name found')
141 def vpp_get_memif_interface_name(node, sw_if_idx):
142 """Get Memif interface name from Memif interfaces dump.
144 :param node: DUT node.
145 :param sw_if_idx: DUT node.
148 :returns: Memif interface name.
151 with VatTerminal(node, json_param=False) as vat:
152 vat.vat_terminal_exec_cmd_from_template('memif_dump.vat')
153 memif_data = Memif.parse_memif_dump_data(vat.vat_stdout)
154 for item in memif_data:
155 if memif_data[item]['sw_if_index'] == str(sw_if_idx):
160 def vpp_get_memif_interface_mac(node, sw_if_idx):
161 """Get Memif interface MAC address from Memif interfaces dump.
163 :param node: DUT node.
164 :param sw_if_idx: DUT node.
167 :returns: Memif interface MAC address.
170 with VatTerminal(node, json_param=False) as vat:
171 vat.vat_terminal_exec_cmd_from_template('memif_dump.vat')
172 memif_data = Memif.parse_memif_dump_data(vat.vat_stdout)
173 for item in memif_data:
174 if memif_data[item]['sw_if_index'] == str(sw_if_idx):
175 return memif_data[item].get('mac', None)
178 def vpp_get_memif_interface_socket(node, sw_if_idx):
179 """Get Memif interface socket path from Memif interfaces dump.
181 :param node: DUT node.
182 :param sw_if_idx: DUT node.
185 :returns: Memif interface socket path.
188 with VatTerminal(node, json_param=False) as vat:
189 vat.vat_terminal_exec_cmd_from_template('memif_dump.vat')
190 memif_data = Memif.parse_memif_dump_data(vat.vat_stdout)
191 for item in memif_data:
192 if memif_data[item]['sw_if_index'] == str(sw_if_idx):
193 return memif_data[item].get('socket', None)
196 def vpp_get_memif_interface_id(node, sw_if_idx):
197 """Get Memif interface ID from Memif interfaces dump.
199 :param node: DUT node.
200 :param sw_if_idx: DUT node.
203 :returns: Memif interface ID.
206 with VatTerminal(node, json_param=False) as vat:
207 vat.vat_terminal_exec_cmd_from_template('memif_dump.vat')
208 memif_data = Memif.parse_memif_dump_data(vat.vat_stdout)
209 for item in memif_data:
210 if memif_data[item]['sw_if_index'] == str(sw_if_idx):
211 return int(memif_data[item].get('id', None))
214 def vpp_get_memif_interface_role(node, sw_if_idx):
215 """Get Memif interface role from Memif interfaces dump.
217 :param node: DUT node.
218 :param sw_if_idx: DUT node.
221 :returns: Memif interface role.
224 with VatTerminal(node, json_param=False) as vat:
225 vat.vat_terminal_exec_cmd_from_template('memif_dump.vat')
226 memif_data = Memif.parse_memif_dump_data(vat.vat_stdout)
227 for item in memif_data:
228 if memif_data[item]['sw_if_index'] == str(sw_if_idx):
229 return memif_data[item].get('role', None)