fib: fib api updates
[vpp.git] / test / vpp_papi_provider.py
index a3d20bf..038a371 100644 (file)
@@ -10,29 +10,11 @@ import time
 from collections import deque
 
 from six import moves, iteritems
-from vpp_papi import VPP, mac_pton
+from vpp_papi import VPPApiClient, mac_pton
 from hook import Hook
 from vpp_ip_route import MPLS_IETF_MAX_LABEL, MPLS_LABEL_INVALID
 
 
-class QOS_SOURCE:
-    EXT = 0
-    VLAN = 1
-    MPLS = 2
-    IP = 3
-
-
-class SYSLOG_SEVERITY:
-    EMERG = 0
-    ALERT = 1
-    CRIT = 2
-    ERR = 3
-    WARN = 4
-    NOTICE = 5
-    INFO = 6
-    DBG = 7
-
-
 #
 # Dictionary keyed on message name to override default values for
 # named parameters
@@ -85,9 +67,9 @@ defaultmapping = {
     'ip_neighbor_add_del': {'is_add': 1, },
     'ip_punt_police': {'is_add': 1, },
     'ip_punt_redirect': {'is_add': 1, },
+    'ip_route_add_del': {'is_add': 1, },
     'ip_table_add_del': {'is_add': 1, },
     'ip_unnumbered_dump': {'sw_if_index': 4294967295, },
-    'ipip_add_tunnel': {'is_ipv6': 1, 'instance': 4294967295, },
     'ipsec_interface_add_del_spd': {'is_add': 1, },
     'ipsec_sad_entry_add_del': {'is_add': 1, },
     'ipsec_spd_add_del': {'is_add': 1, },
@@ -128,10 +110,6 @@ defaultmapping = {
     'policer_add_del': {'is_add': 1, 'conform_action_type': 1, },
     'proxy_arp_add_del': {'is_add': 1, },
     'proxy_arp_intfc_enable_disable': {'is_enable': 1, },
-    'punt_socket_register': {'protocol': 17, 'header_version': 1,
-                             'is_ip4': 1, },
-    'punt_socket_deregister': {'protocol': 17, 'is_ip4': 1, },
-    'punt_socket_dump': {'is_ip6': 1, },
     'set_ip_flow_hash': {'src': 1, 'dst': 1, 'sport': 1, 'dport': 1,
                          'proto': 1, },
     'set_ipfix_exporter': {'collector_port': 4739, },
@@ -170,6 +148,14 @@ defaultmapping = {
 }
 
 
+class CliFailedCommandError(Exception):
+    """ cli command failed."""
+
+
+class CliSyntaxError(Exception):
+    """ cli command had a syntax error."""
+
+
 class UnexpectedApiReturnValueError(Exception):
     """ exception raised when the API return value is unexpected """
     pass
@@ -191,22 +177,21 @@ class VppPapiProvider(object):
         self._expect_api_retval = self._zero
         self._expect_stack = []
 
-        install_dir = os.getenv('VPP_INSTALL_PATH')
-
-        # Vapi requires 'VPP_API_DIR', not set when run from Makefile.
-        if 'VPP_API_DIR' not in os.environ:
-            os.environ['VPP_API_DIR'] = os.getenv('VPP_INSTALL_PATH')
+        # install_dir is a class attribute. We need to set it before
+        # calling the constructor.
+        VPPApiClient.apidir = os.getenv('VPP_INSTALL_PATH')
 
         use_socket = False
         try:
             if os.environ['SOCKET'] == '1':
                 use_socket = True
-        except:
+        except KeyError:
             pass
-        self.vpp = VPP(logger=test_class.logger,
-                       read_timeout=read_timeout,
-                       use_socket=use_socket,
-                       server_address=test_class.api_sock)
+
+        self.vpp = VPPApiClient(logger=test_class.logger,
+                                read_timeout=read_timeout,
+                                use_socket=use_socket,
+                                server_address=test_class.api_sock)
         self._events = deque()
 
     def __enter__(self):
@@ -367,6 +352,10 @@ class VppPapiProvider(object):
         cli += '\n'
         r = self.papi.cli_inband(cmd=cli)
         self.hook.after_cli(cli)
+        if r.retval == -156:
+            raise CliSyntaxError(r.reply)
+        if r.retval != 0:
+            raise CliFailedCommandError(r.reply)
         if hasattr(r, 'reply'):
             return r.reply
 
@@ -518,6 +507,37 @@ class VppPapiProvider(object):
         return self.api(self.papi.create_loopback,
                         {'mac_address': mac})
 
+    def ip_table_add_del(self,
+                         table_id,
+                         is_add=1,
+                         is_ipv6=0):
+        """
+
+        :param table_id
+        :param is_add:  (Default value = 1)
+        :param is_ipv6:  (Default value = 0)
+
+        """
+
+        return self.api(
+            self.papi.ip_table_add_del,
+            {'table':
+             {
+                 'table_id': table_id,
+                 'is_ip6': is_ipv6
+             },
+             'is_add': is_add})
+
+    def ip_table_dump(self):
+        return self.api(self.papi.ip_table_dump, {})
+
+    def ip_route_dump(self, table_id, is_ip6=False):
+        return self.api(self.papi.ip_route_dump,
+                        {'table': {
+                            'table_id': table_id,
+                            'is_ip6': is_ip6
+                        }})
+
     def ip_neighbor_add_del(self,
                             sw_if_index,
                             mac_address,
@@ -643,6 +663,26 @@ class VppPapiProvider(object):
                 }
             })
 
+    def udp_encap_del(self, id):
+        return self.api(self.papi.udp_encap_del, {'id': id})
+
+    def udp_encap_dump(self):
+        return self.api(self.papi.udp_encap_dump, {})
+
+    def want_udp_encap_stats(self, enable=1):
+        return self.api(self.papi.want_udp_encap_stats,
+                        {'enable': enable,
+                         'pid': os.getpid()})
+
+    def mpls_route_dump(self, table_id):
+        return self.api(self.papi.mpls_route_dump,
+                        {'table': {
+                            'mt_table_id': table_id
+                        }})
+
+    def mpls_table_dump(self):
+        return self.api(self.papi.mpls_table_dump, {})
+
     def mpls_table_add_del(
             self,
             table_id,
@@ -656,17 +696,43 @@ class VppPapiProvider(object):
 
         return self.api(
             self.papi.mpls_table_add_del,
-            {'mt_table_id': table_id,
+            {'mt_table':
+             {
+                 'mt_table_id': table_id,
+             },
              'mt_is_add': is_add})
 
+    def mpls_route_add_del(self,
+                           table_id,
+                           label,
+                           eos,
+                           eos_proto,
+                           is_multicast,
+                           paths,
+                           is_add,
+                           is_multipath):
+        """ MPLS Route add/del """
+        return self.api(
+            self.papi.mpls_route_add_del,
+            {'mr_route':
+             {
+                 'mr_table_id': table_id,
+                 'mr_label': label,
+                 'mr_eos': eos,
+                 'mr_eos_proto': eos_proto,
+                 'mr_is_multicast': is_multicast,
+                 'mr_n_paths': len(paths),
+                 'mr_paths': paths,
+             },
+             'mr_is_add': is_add,
+             'mr_is_multipath': is_multipath})
+
     def mpls_ip_bind_unbind(
             self,
             label,
-            dst_address,
-            dst_address_length,
+            prefix,
             table_id=0,
             ip_table_id=0,
-            is_ip4=1,
             is_bind=1):
         """
         """
@@ -676,60 +742,28 @@ class VppPapiProvider(object):
              'mb_label': label,
              'mb_ip_table_id': ip_table_id,
              'mb_is_bind': is_bind,
-             'mb_is_ip4': is_ip4,
-             'mb_address_length': dst_address_length,
-             'mb_address': dst_address})
+             'mb_prefix': prefix})
 
     def mpls_tunnel_add_del(
             self,
             tun_sw_if_index,
-            next_hop_proto_is_ip4,
-            next_hop_address,
-            next_hop_sw_if_index=0xFFFFFFFF,
-            next_hop_table_id=0,
-            next_hop_weight=1,
-            next_hop_n_out_labels=0,
-            next_hop_out_label_stack=[],
-            next_hop_via_label=MPLS_LABEL_INVALID,
+            paths,
             is_add=1,
             l2_only=0,
             is_multicast=0):
         """
-
-        :param dst_address_length:
-        :param next_hop_sw_if_index:  (Default value = 0xFFFFFFFF)
-        :param dst_address:
-        :param next_hop_address:
-        :param next_hop_sw_if_index:  (Default value = 0xFFFFFFFF)
-        :param vrf_id:  (Default value = 0)
-        :param lookup_in_vrf:  (Default value = 0)
-        :param classify_table_index:  (Default value = 0xFFFFFFFF)
-        :param is_add:  (Default value = 1)
-        :param is_drop:  (Default value = 0)
-        :param is_ipv6:  (Default value = 0)
-        :param is_local:  (Default value = 0)
-        :param is_classify:  (Default value = 0)
-        :param is_multipath:  (Default value = 0)
-        :param is_resolve_host:  (Default value = 0)
-        :param is_resolve_attached:  (Default value = 0)
-        :param next_hop_weight:  (Default value = 1)
-        :param is_multicast:  (Default value = 0)
-
         """
         return self.api(
             self.papi.mpls_tunnel_add_del,
-            {'mt_sw_if_index': tun_sw_if_index,
-             'mt_is_add': is_add,
-             'mt_l2_only': l2_only,
-             'mt_is_multicast': is_multicast,
-             'mt_next_hop_proto_is_ip4': next_hop_proto_is_ip4,
-             'mt_next_hop_weight': next_hop_weight,
-             'mt_next_hop': next_hop_address,
-             'mt_next_hop_n_out_labels': next_hop_n_out_labels,
-             'mt_next_hop_sw_if_index': next_hop_sw_if_index,
-             'mt_next_hop_table_id': next_hop_table_id,
-             'mt_next_hop_via_label': next_hop_via_label,
-             'mt_next_hop_out_label_stack': next_hop_out_label_stack})
+            {'mt_is_add': is_add,
+             'mt_tunnel':
+             {
+                 'mt_sw_if_index': tun_sw_if_index,
+                 'mt_l2_only': l2_only,
+                 'mt_is_multicast': is_multicast,
+                 'mt_n_paths': len(paths),
+                 'mt_paths': paths,
+             }})
 
     def bfd_udp_add(self, sw_if_index, desired_min_tx, required_min_rx,
                     detect_mult, local_addr, peer_addr, is_ipv6=0,
@@ -1016,39 +1050,40 @@ class VppPapiProvider(object):
             })
 
     def ip_mroute_add_del(self,
-                          src_address,
-                          grp_address,
-                          grp_address_length,
+                          table_id,
+                          prefix,
                           e_flags,
-                          next_hop_afi,
-                          next_hop_sw_if_index,
-                          next_hop_address,
-                          i_flags,
-                          bier_imp=0,
-                          rpf_id=0,
-                          table_id=0,
+                          rpf_id,
+                          paths,
                           is_add=1,
-                          is_ipv6=0,
-                          is_local=0):
+                          is_multipath=1):
         """
         IP Multicast Route add/del
         """
         return self.api(
             self.papi.ip_mroute_add_del,
-            {'next_hop_sw_if_index': next_hop_sw_if_index,
-             'entry_flags': e_flags,
-             'itf_flags': i_flags,
-             'table_id': table_id,
-             'rpf_id': rpf_id,
-             'is_add': is_add,
-             'is_ipv6': is_ipv6,
-             'is_local': is_local,
-             'bier_imp': bier_imp,
-             'next_hop_afi': next_hop_afi,
-             'grp_address_length': grp_address_length,
-             'grp_address': grp_address,
-             'src_address': src_address,
-             'nh_address': next_hop_address})
+            {
+                'is_add': is_add,
+                'is_multipath': is_multipath,
+                'route': {
+                    'table_id': table_id,
+                    'entry_flags': e_flags,
+                    'rpf_id': rpf_id,
+                    'prefix': prefix,
+                    'n_paths': len(paths),
+                    'paths': paths,
+                }
+            })
+
+    def mfib_signal_dump(self):
+        return self.api(self.papi.mfib_signal_dump, {})
+
+    def ip_mroute_dump(self, table_id, is_ip6=False):
+        return self.api(self.papi.ip_mroute_dump,
+                        {'table': {
+                            'table_id': table_id,
+                            'is_ip6': is_ip6
+                        }})
 
     def lisp_enable_disable(self, is_enabled):
         return self.api(
@@ -1645,14 +1680,18 @@ class VppPapiProvider(object):
         """ BIER Route add/del """
         return self.api(
             self.papi.bier_route_add_del,
-            {'br_tbl_id': {"bt_set": bti.set_id,
-                           "bt_sub_domain": bti.sub_domain_id,
-                           "bt_hdr_len_id": bti.hdr_len_id},
-             'br_bp': bp,
-             'br_n_paths': len(paths),
-             'br_paths': paths,
-             'br_is_add': is_add,
-             'br_is_replace': is_replace})
+            {
+                'br_route': {
+                    'br_tbl_id': {"bt_set": bti.set_id,
+                                  "bt_sub_domain": bti.sub_domain_id,
+                                  "bt_hdr_len_id": bti.hdr_len_id},
+                    'br_bp': bp,
+                    'br_n_paths': len(paths),
+                    'br_paths': paths,
+                },
+                'br_is_add': is_add,
+                'br_is_replace': is_replace
+            })
 
     def bier_route_dump(self, bti):
         return self.api(
@@ -1901,7 +1940,8 @@ class VppPapiProvider(object):
                                 remote_spi, crypto_alg, local_crypto_key,
                                 remote_crypto_key, integ_alg, local_integ_key,
                                 remote_integ_key, is_add=1, esn=0, salt=0,
-                                anti_replay=1, renumber=0, show_instance=0):
+                                anti_replay=1, renumber=0,
+                                udp_encap=0, show_instance=0):
         return self.api(
             self.papi.ipsec_tunnel_if_add_del,
             {
@@ -1924,6 +1964,7 @@ class VppPapiProvider(object):
                 'anti_replay': anti_replay,
                 'renumber': renumber,
                 'show_instance': show_instance,
+                'udp_encap': udp_encap,
                 'salt': salt
             })
 
@@ -1962,27 +2003,18 @@ class VppPapiProvider(object):
              'namespace_id': namespace_id,
              'namespace_id_len': len(namespace_id)})
 
-    def punt_socket_register(self, port, pathname, protocol=0x11,
-                             header_version=1, is_ip4=1):
+    def punt_socket_register(self, reg, pathname,
+                             header_version=1):
         """ Register punt socket """
         return self.api(self.papi.punt_socket_register,
                         {'header_version': header_version,
-                         'punt': {'ipv': is_ip4,
-                                  'l4_protocol': protocol,
-                                  'l4_port': port},
+                         'punt': reg,
                          'pathname': pathname})
 
-    def punt_socket_deregister(self, port, protocol=0x11, is_ip4=1):
+    def punt_socket_deregister(self, reg):
         """ Unregister punt socket """
         return self.api(self.papi.punt_socket_deregister,
-                        {'punt': {'ipv': is_ip4,
-                                  'l4_protocol': protocol,
-                                  'l4_port': port}})
-
-    def punt_socket_dump(self, is_ip6=1):
-        """ Dump punt socket"""
-        return self.api(self.papi.punt_socket_dump,
-                        {'is_ipv6': is_ip6})
+                        {'punt': reg})
 
     def gbp_endpoint_add(self, sw_if_index, ips, mac, sclass, flags,
                          tun_src, tun_dst):
@@ -2257,30 +2289,6 @@ class VppPapiProvider(object):
         return self.api(self.papi.pipe_delete,
                         {'parent_sw_if_index': parent_sw_if_index})
 
-    def memif_create(
-            self,
-            role,
-            mode,
-            rx_queues=None,
-            tx_queues=None,
-            _id=None,
-            socket_id=None,
-            secret=None,
-            ring_size=None,
-            buffer_size=None,
-            hw_addr=None):
-        return self.api(self.papi.memif_create,
-                        {'role': role,
-                         'mode': mode,
-                         'rx_queues': rx_queues,
-                         'tx_queues': tx_queues,
-                         'id': _id,
-                         'socket_id': socket_id,
-                         'secret': secret,
-                         'ring_size': ring_size,
-                         'buffer_size': buffer_size,
-                         'hw_addr': hw_addr})
-
     def svs_table_add_del(self, af, table_id, is_add=1):
         return self.api(self.papi.svs_table_add_del,
                         {