Add IRB test
[vpp.git] / test / vpp_papi_provider.py
1 import os
2 from logging import error
3 from hook import Hook
4
5 do_import = True
6 try:
7     no_vpp_papi = os.getenv("NO_VPP_PAPI")
8     if no_vpp_papi == "1":
9         do_import = False
10 except:
11     pass
12
13 if do_import:
14     import vpp_papi
15
16
17 # from vnet/vnet/mpls/mpls_types.h
18 MPLS_IETF_MAX_LABEL = 0xfffff
19 MPLS_LABEL_INVALID = MPLS_IETF_MAX_LABEL + 1
20
21
22 class VppPapiProvider(object):
23     """VPP-api provider using vpp-papi
24
25     @property hook: hook object providing before and after api/cli hooks
26
27
28     """
29
30     def __init__(self, name, shm_prefix):
31         self.hook = Hook("vpp-papi-provider")
32         self.name = name
33         self.shm_prefix = shm_prefix
34
35     def register_hook(self, hook):
36         """Replace hook registration with new hook
37
38         :param hook:
39
40         """
41         self.hook = hook
42
43     def connect(self):
44         """Connect the API to VPP"""
45         vpp_papi.connect(self.name, self.shm_prefix)
46
47     def disconnect(self):
48         """Disconnect the API from VPP"""
49         vpp_papi.disconnect()
50
51     def api(self, api_fn, api_args, expected_retval=0):
52         """Call API function and check it's return value
53         Call the appropriate hooks before and after the API call
54
55         :param api_fn: API function to call
56         :param api_args: tuple of API function arguments
57         :param expected_retval: Expected return value (Default value = 0)
58         :returns: reply from the API
59
60         """
61         self.hook.before_api(api_fn.__name__, api_args)
62         reply = api_fn(*api_args)
63         if hasattr(reply, 'retval') and reply.retval != expected_retval:
64             msg = "API call failed, expected retval == %d, got %s" % (
65                 expected_retval, repr(reply))
66             error(msg)
67             raise Exception(msg)
68         self.hook.after_api(api_fn.__name__, api_args)
69         return reply
70
71     def cli(self, cli):
72         """Execute a CLI, calling the before/after hooks appropriately
73
74         :param cli: CLI to execute
75         :returns: CLI output
76
77         """
78         self.hook.before_cli(cli)
79         cli += '\n'
80         r = vpp_papi.cli_inband(len(cli), cli)
81         self.hook.after_cli(cli)
82         if(hasattr(r, 'reply')):
83             return r.reply[0].decode().rstrip('\x00')
84
85     def show_version(self):
86         """ """
87         return vpp_papi.show_version()
88
89     def pg_create_interface(self, pg_index):
90         """
91
92         :param pg_index:
93
94         """
95         return self.api(vpp_papi.pg_create_interface, (pg_index, ))
96
97     def sw_interface_dump(self, filter=None):
98         """
99
100         :param filter:  (Default value = None)
101
102         """
103         if filter is not None:
104             args = (1, filter)
105         else:
106             args = (0, b'')
107         return self.api(vpp_papi.sw_interface_dump, args)
108
109     def sw_interface_set_table(self, sw_if_index, is_ipv6, table_id):
110         """
111           Set the IPvX Table-id for the Interface
112
113         :param sw_if_index:
114         :param is_ipv6:
115         :param table_id:
116
117         """
118         return self.api(vpp_papi.sw_interface_set_table,
119                         (sw_if_index, is_ipv6, table_id))
120
121     def sw_interface_add_del_address(self, sw_if_index, addr, addr_len,
122                                      is_ipv6=0, is_add=1, del_all=0):
123         """
124
125         :param addr: param is_ipv6:  (Default value = 0)
126         :param sw_if_index:
127         :param addr_len:
128         :param is_ipv6:  (Default value = 0)
129         :param is_add:  (Default value = 1)
130         :param del_all:  (Default value = 0)
131
132         """
133         return self.api(vpp_papi.sw_interface_add_del_address,
134                         (sw_if_index, is_add, is_ipv6, del_all, addr_len, addr))
135
136     def sw_interface_enable_disable_mpls(self, sw_if_index,
137                                          is_enable=1):
138         """
139         Enable/Disable MPLS on the interface
140         :param sw_if_index:
141         :param is_enable:  (Default value = 1)
142
143         """
144         return self.api(vpp_papi.sw_interface_set_mpls_enable,
145                         (sw_if_index, is_enable))
146
147     def sw_interface_ra_suppress(self, sw_if_index):
148         suppress = 1
149         managed = 0
150         other = 0
151         ll_option = 0
152         send_unicast = 0
153         cease = 0
154         is_no = 0
155         default_router = 0
156         max_interval = 0
157         min_interval = 0
158         lifetime = 0
159         initial_count = 0
160         initial_interval = 0
161         async = False
162         return self.api(vpp_papi.sw_interface_ip6nd_ra_config,
163                         (sw_if_index, suppress, managed, other,
164                          ll_option, send_unicast, cease, is_no,
165                          default_router, max_interval, min_interval,
166                          lifetime, initial_count, initial_interval, async))
167
168     def vxlan_add_del_tunnel(
169             self,
170             src_addr,
171             dst_addr,
172             is_add=1,
173             is_ipv6=0,
174             encap_vrf_id=0,
175             decap_next_index=0xFFFFFFFF,
176             vni=0):
177         """
178
179         :param dst_addr:
180         :param src_addr:
181         :param is_add:  (Default value = 1)
182         :param is_ipv6:  (Default value = 0)
183         :param encap_vrf_id:  (Default value = 0)
184         :param decap_next_index:  (Default value = 0xFFFFFFFF)
185         :param vni:  (Default value = 0)
186
187         """
188         return self.api(vpp_papi.vxlan_add_del_tunnel,
189                         (is_add, is_ipv6, src_addr, dst_addr, encap_vrf_id,
190                          decap_next_index, vni))
191
192     def sw_interface_set_l2_bridge(self, sw_if_index, bd_id,
193                                    shg=0, bvi=0, enable=1):
194         """
195
196         :param bd_id:
197         :param sw_if_index:
198         :param shg:  (Default value = 0)
199         :param bvi:  (Default value = 0)
200         :param enable:  (Default value = 1)
201
202         """
203         return self.api(vpp_papi.sw_interface_set_l2_bridge,
204                         (sw_if_index, bd_id, shg, bvi, enable))
205
206     def sw_interface_set_l2_xconnect(self, rx_sw_if_index, tx_sw_if_index,
207                                      enable):
208         """Create or delete unidirectional cross-connect from Tx interface to
209         Rx interface.
210
211         :param rx_sw_if_index: Software interface index of Rx interface.
212         :param tx_sw_if_index: Software interface index of Tx interface.
213         :param enable: Create cross-connect if equal to 1, delete cross-connect
214                        if equal to 0.
215         :type rx_sw_if_index: str or int
216         :type rx_sw_if_index: str or int
217         :type enable: int
218
219         """
220         return self.api(vpp_papi.sw_interface_set_l2_xconnect,
221                         (rx_sw_if_index, tx_sw_if_index, enable))
222
223     def sw_interface_set_flags(self, sw_if_index, admin_up_down,
224                                link_up_down=0, deleted=0):
225         """
226
227         :param admin_up_down:
228         :param sw_if_index:
229         :param link_up_down:  (Default value = 0)
230         :param deleted:  (Default value = 0)
231
232         """
233         return self.api(vpp_papi.sw_interface_set_flags,
234                         (sw_if_index, admin_up_down, link_up_down, deleted))
235
236     def create_subif(self, sw_if_index, sub_id, outer_vlan, inner_vlan,
237                      no_tags=0, one_tag=0, two_tags=0, dot1ad=0, exact_match=0,
238                      default_sub=0, outer_vlan_id_any=0, inner_vlan_id_any=0):
239         """Create subinterface
240         from vpe.api: set dot1ad = 0 for dot1q, set dot1ad = 1 for dot1ad
241
242         :param sub_id: param inner_vlan:
243         :param sw_if_index:
244         :param outer_vlan:
245         :param inner_vlan:
246         :param no_tags:  (Default value = 0)
247         :param one_tag:  (Default value = 0)
248         :param two_tags:  (Default value = 0)
249         :param dot1ad:  (Default value = 0)
250         :param exact_match:  (Default value = 0)
251         :param default_sub:  (Default value = 0)
252         :param outer_vlan_id_any:  (Default value = 0)
253         :param inner_vlan_id_any:  (Default value = 0)
254
255         """
256         return self.api(
257             vpp_papi.create_subif,
258             (sw_if_index,
259              sub_id,
260              no_tags,
261              one_tag,
262              two_tags,
263              dot1ad,
264              exact_match,
265              default_sub,
266              outer_vlan_id_any,
267              inner_vlan_id_any,
268              outer_vlan,
269              inner_vlan))
270
271     def create_vlan_subif(self, sw_if_index, vlan):
272         """
273
274         :param vlan:
275         :param sw_if_index:
276
277         """
278         return self.api(vpp_papi.create_vlan_subif, (sw_if_index, vlan))
279
280     def create_loopback(self, mac=''):
281         """
282
283         :param mac: (Optional)
284         """
285         return self.api(vpp_papi.create_loopback, (mac,))
286
287     def ip_add_del_route(
288             self,
289             dst_address,
290             dst_address_length,
291             next_hop_address,
292             next_hop_sw_if_index=0xFFFFFFFF,
293             table_id=0,
294             resolve_attempts=0,
295             classify_table_index=0xFFFFFFFF,
296             next_hop_out_label=MPLS_LABEL_INVALID,
297             next_hop_table_id=0,
298             create_vrf_if_needed=0,
299             resolve_if_needed=0,
300             is_add=1,
301             is_drop=0,
302             is_unreach=0,
303             is_prohibit=0,
304             is_ipv6=0,
305             is_local=0,
306             is_classify=0,
307             is_multipath=0,
308             is_resolve_host=0,
309             is_resolve_attached=0,
310             not_last=0,
311             next_hop_weight=1):
312         """
313
314         :param dst_address_length:
315         :param next_hop_sw_if_index:  (Default value = 0xFFFFFFFF)
316         :param dst_address:
317         :param next_hop_address:
318         :param next_hop_sw_if_index:  (Default value = 0xFFFFFFFF)
319         :param vrf_id:  (Default value = 0)
320         :param lookup_in_vrf:  (Default value = 0)
321         :param resolve_attempts:  (Default value = 0)
322         :param classify_table_index:  (Default value = 0xFFFFFFFF)
323         :param create_vrf_if_needed:  (Default value = 0)
324         :param resolve_if_needed:  (Default value = 0)
325         :param is_add:  (Default value = 1)
326         :param is_drop:  (Default value = 0)
327         :param is_ipv6:  (Default value = 0)
328         :param is_local:  (Default value = 0)
329         :param is_classify:  (Default value = 0)
330         :param is_multipath:  (Default value = 0)
331         :param is_resolve_host:  (Default value = 0)
332         :param is_resolve_attached:  (Default value = 0)
333         :param not_last:  (Default value = 0)
334         :param next_hop_weight:  (Default value = 1)
335
336         """
337         return self.api(
338             vpp_papi.ip_add_del_route,
339             (next_hop_sw_if_index,
340              table_id,
341              resolve_attempts,
342              classify_table_index,
343              next_hop_out_label,
344              next_hop_table_id,
345              create_vrf_if_needed,
346              resolve_if_needed,
347              is_add,
348              is_drop,
349              is_unreach,
350              is_prohibit,
351              is_ipv6,
352              is_local,
353              is_classify,
354              is_multipath,
355              is_resolve_host,
356              is_resolve_attached,
357              not_last,
358              next_hop_weight,
359              dst_address_length,
360              dst_address,
361              next_hop_address))
362
363     def ip_neighbor_add_del(self,
364                             sw_if_index,
365                             mac_address,
366                             dst_address,
367                             vrf_id=0,
368                             is_add=1,
369                             is_ipv6=0,
370                             is_static=0,
371                             ):
372         """ Add neighbor MAC to IPv4 or IPv6 address.
373
374         :param sw_if_index:
375         :param mac_address:
376         :param dst_address:
377         :param vrf_id:  (Default value = 0)
378         :param is_add:  (Default value = 1)
379         :param is_ipv6:  (Default value = 0)
380         :param is_static:  (Default value = 0)
381         """
382
383         return self.api(
384             vpp_papi.ip_neighbor_add_del,
385             (vrf_id,
386              sw_if_index,
387              is_add,
388              is_ipv6,
389              is_static,
390              mac_address,
391              dst_address
392              )
393         )