e1f3d30d33e0b3770e642074feca464d155390d5
[csit.git] / resources / libraries / python / Memif.py
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:
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 """Memif interface library."""
15
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
19
20
21 class Memif(object):
22     """Memif interface class."""
23
24     def __init__(self):
25         pass
26
27     @staticmethod
28     def create_memif_interface(node, filename, mid, sid, role='master'):
29         """Create Memif interface on the given node.
30
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.
36         :type node: dict
37         :type filename: str
38         :type mid: str
39         :type sid: str
40         :type role: str
41         :returns: SW interface index.
42         :rtype: int
43         :raises ValueError: If command 'create memif' fails.
44         """
45
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:
53                 try:
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(
59                         node, sw_if_idx)
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,
64                                                            '/tmp/'+filename)
65                     Topology.update_interface_memif_id(node, if_key, mid)
66                     Topology.update_interface_memif_role(node, if_key, role)
67                     return sw_if_idx
68                 except KeyError:
69                     raise ValueError('Create Memif interface failed on node '
70                                      '{}'.format(node['host']))
71             else:
72                 raise ValueError('Create Memif interface failed on node '
73                                  '{}'.format(node['host']))
74
75     @staticmethod
76     def show_memif(node):
77         """Show Memif data for the given node.
78
79         :param node: Given node to show Memif data on.
80         :type node: dict
81         """
82         vat = VatExecutor()
83         vat.execute_script("memif_dump.vat", node, json_out=False)
84
85     @staticmethod
86     def clear_memif_socks(node, *socks):
87         """Clear Memif sockets for the given node.
88
89         :param node: Given node to clear Memif sockets on.
90         :param socks: Memif sockets.
91         :type node: dict
92         :type socks: list
93         """
94         ssh = SSH()
95         ssh.connect(node)
96
97         for sock in socks:
98             ssh.exec_command_sudo('rm -f {}'.format(sock))
99
100     @staticmethod
101     def parse_memif_dump_data(memif_data):
102         """Convert Memif data to dictionary.
103
104         :param memif_data: Dump of Memif interfaces data.
105         :type memif_data: str
106         :returns: Memif interfaces data in dictionary.
107         :rtype: dict
108         :raises RuntimeError: If there is no memif interface name found in
109             provided data.
110         """
111         memif_name = None
112         memif_dict = dict()
113         memif_data = str(memif_data)
114         values = dict()
115
116         clutter = ['vat#']
117         for garbage in clutter:
118             memif_data = memif_data.replace(garbage, '')
119
120         for line in memif_data.splitlines():
121             if line.startswith('Sending') or len(line) == 0:
122                 continue
123             elif line.startswith('memif'):
124                 if memif_name:
125                     memif_dict[memif_name] = values
126                 line_split = line.split(':', 1)
127                 memif_name = str(line_split[0])
128                 values = dict()
129                 line = line_split[1]
130             line_split = line.split()
131             for i in range(0, len(line_split), 2):
132                 key = str(line_split[i])
133                 try:
134                     value = line_split[i+1]
135                 except IndexError:
136                     value = None
137                 values[key] = value
138         if memif_name:
139             memif_dict[memif_name] = values
140         else:
141             raise RuntimeError('No memif interface name found')
142
143         return memif_dict
144
145     @staticmethod
146     def vpp_get_memif_interface_name(node, sw_if_idx):
147         """Get Memif interface name from Memif interfaces dump.
148
149         :param node: DUT node.
150         :param sw_if_idx: DUT node.
151         :type node: dict
152         :type sw_if_idx: int
153         :returns: Memif interface name.
154         :rtype: str
155         """
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):
161                     return item
162                 return None
163
164     @staticmethod
165     def vpp_get_memif_interface_mac(node, sw_if_idx):
166         """Get Memif interface MAC address from Memif interfaces dump.
167
168         :param node: DUT node.
169         :param sw_if_idx: DUT node.
170         :type node: dict
171         :type sw_if_idx: int
172         :returns: Memif interface MAC address.
173         :rtype: str
174         """
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)
181
182     @staticmethod
183     def vpp_get_memif_interface_socket(node, sw_if_idx):
184         """Get Memif interface socket path from Memif interfaces dump.
185
186         :param node: DUT node.
187         :param sw_if_idx: DUT node.
188         :type node: dict
189         :type sw_if_idx: int
190         :returns: Memif interface socket path.
191         :rtype: str
192         """
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)
199
200     @staticmethod
201     def vpp_get_memif_interface_id(node, sw_if_idx):
202         """Get Memif interface ID from Memif interfaces dump.
203
204         :param node: DUT node.
205         :param sw_if_idx: DUT node.
206         :type node: dict
207         :type sw_if_idx: int
208         :returns: Memif interface ID.
209         :rtype: int
210         """
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))
217
218     @staticmethod
219     def vpp_get_memif_interface_role(node, sw_if_idx):
220         """Get Memif interface role from Memif interfaces dump.
221
222         :param node: DUT node.
223         :param sw_if_idx: DUT node.
224         :type node: dict
225         :type sw_if_idx: int
226         :returns: Memif interface role.
227         :rtype: int
228         """
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)