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, filename, mid, sid, role='master'):
29 """Create Memif interface on the given node.
31 :param node: Given node to create Memif interface on.
32 :param filename: Memif interface socket filename.
33 :param mid: Memif interface ID.
34 :param sid: Socket ID.
35 :param role: Memif interface role [master|slave]. Default is master.
41 :returns: SW interface index.
43 :raises ValueError: If command 'create memif' fails.
46 with VatTerminal(node, json_param=False) as vat:
47 vat.vat_terminal_exec_cmd_from_template(
48 'memif_socket_filename_add_del.vat',
49 add_del='add', id=sid, filename='/tmp/'+filename)
50 vat.vat_terminal_exec_cmd_from_template(
51 'memif_create.vat', id=mid, socket=sid, role=role)
52 if 'sw_if_index' in vat.vat_stdout:
54 sw_if_idx = int(vat.vat_stdout.split()[4])
55 if_key = Topology.add_new_port(node, 'memif')
56 Topology.update_interface_sw_if_index(
57 node, if_key, sw_if_idx)
58 ifc_name = Memif.vpp_get_memif_interface_name(
60 Topology.update_interface_name(node, if_key, ifc_name)
61 ifc_mac = Memif.vpp_get_memif_interface_mac(node, sw_if_idx)
62 Topology.update_interface_mac_address(node, if_key, ifc_mac)
63 Topology.update_interface_memif_socket(node, if_key,
65 Topology.update_interface_memif_id(node, if_key, mid)
66 Topology.update_interface_memif_role(node, if_key, role)
69 raise ValueError('Create Memif interface failed on node '
70 '{}'.format(node['host']))
72 raise ValueError('Create Memif interface failed on node '
73 '{}'.format(node['host']))
77 """Show Memif data for the given node.
79 :param node: Given node to show Memif data on.
83 vat.execute_script("memif_dump.vat", node, json_out=False)
86 def clear_memif_socks(node, *socks):
87 """Clear Memif sockets for the given node.
89 :param node: Given node to clear Memif sockets on.
90 :param socks: Memif sockets.
98 ssh.exec_command_sudo('rm -f {}'.format(sock))
101 def parse_memif_dump_data(memif_data):
102 """Convert Memif data to dictionary.
104 :param memif_data: Dump of Memif interfaces data.
105 :type memif_data: str
106 :returns: Memif interfaces data in dictionary.
108 :raises RuntimeError: If there is no memif interface name found in
113 memif_data = str(memif_data)
117 for garbage in clutter:
118 memif_data = memif_data.replace(garbage, '')
120 for line in memif_data.splitlines():
121 if line.startswith('Sending') or len(line) == 0:
123 elif line.startswith('memif'):
125 memif_dict[memif_name] = values
126 line_split = line.split(':', 1)
127 memif_name = str(line_split[0])
130 line_split = line.split()
131 for i in range(0, len(line_split), 2):
132 key = str(line_split[i])
134 value = line_split[i+1]
139 memif_dict[memif_name] = values
141 raise RuntimeError('No memif interface name found')
146 def vpp_get_memif_interface_name(node, sw_if_idx):
147 """Get Memif interface name from Memif interfaces dump.
149 :param node: DUT node.
150 :param sw_if_idx: DUT node.
153 :returns: Memif interface name.
156 with VatTerminal(node, json_param=False) as vat:
157 vat.vat_terminal_exec_cmd_from_template('memif_dump.vat')
158 memif_data = Memif.parse_memif_dump_data(vat.vat_stdout)
159 for item in memif_data:
160 if memif_data[item]['sw_if_index'] == str(sw_if_idx):
165 def vpp_get_memif_interface_mac(node, sw_if_idx):
166 """Get Memif interface MAC address from Memif interfaces dump.
168 :param node: DUT node.
169 :param sw_if_idx: DUT node.
172 :returns: Memif interface MAC address.
175 with VatTerminal(node, json_param=False) as vat:
176 vat.vat_terminal_exec_cmd_from_template('memif_dump.vat')
177 memif_data = Memif.parse_memif_dump_data(vat.vat_stdout)
178 for item in memif_data:
179 if memif_data[item]['sw_if_index'] == str(sw_if_idx):
180 return memif_data[item].get('mac', None)
183 def vpp_get_memif_interface_socket(node, sw_if_idx):
184 """Get Memif interface socket path from Memif interfaces dump.
186 :param node: DUT node.
187 :param sw_if_idx: DUT node.
190 :returns: Memif interface socket path.
193 with VatTerminal(node, json_param=False) as vat:
194 vat.vat_terminal_exec_cmd_from_template('memif_dump.vat')
195 memif_data = Memif.parse_memif_dump_data(vat.vat_stdout)
196 for item in memif_data:
197 if memif_data[item]['sw_if_index'] == str(sw_if_idx):
198 return memif_data[item].get('socket', None)
201 def vpp_get_memif_interface_id(node, sw_if_idx):
202 """Get Memif interface ID from Memif interfaces dump.
204 :param node: DUT node.
205 :param sw_if_idx: DUT node.
208 :returns: Memif interface ID.
211 with VatTerminal(node, json_param=False) as vat:
212 vat.vat_terminal_exec_cmd_from_template('memif_dump.vat')
213 memif_data = Memif.parse_memif_dump_data(vat.vat_stdout)
214 for item in memif_data:
215 if memif_data[item]['sw_if_index'] == str(sw_if_idx):
216 return int(memif_data[item].get('id', None))
219 def vpp_get_memif_interface_role(node, sw_if_idx):
220 """Get Memif interface role from Memif interfaces dump.
222 :param node: DUT node.
223 :param sw_if_idx: DUT node.
226 :returns: Memif interface role.
229 with VatTerminal(node, json_param=False) as vat:
230 vat.vat_terminal_exec_cmd_from_template('memif_dump.vat')
231 memif_data = Memif.parse_memif_dump_data(vat.vat_stdout)
232 for item in memif_data:
233 if memif_data[item]['sw_if_index'] == str(sw_if_idx):
234 return memif_data[item].get('role', None)