IPv6 RA improvements
[vpp.git] / test / vpp_papi_provider.py
index 3268042..fe152de 100644 (file)
@@ -1,5 +1,4 @@
 import os
-import socket
 import fnmatch
 import time
 from hook import Hook
@@ -29,6 +28,11 @@ class L2_VTR_OP:
     L2_POP_1 = 3
 
 
+class UnexpectedApiReturnValueError(Exception):
+    """ exception raised when the API return value is unexpected """
+    pass
+
+
 class VppPapiProvider(object):
     """VPP-api provider using vpp-papi
 
@@ -51,7 +55,7 @@ class VppPapiProvider(object):
             for filename in fnmatch.filter(filenames, '*.api.json'):
                 jsonfiles.append(os.path.join(root, filename))
 
-        self.papi = VPP(jsonfiles)
+        self.vpp = VPP(jsonfiles)
         self._events = deque()
 
     def __enter__(self):
@@ -119,12 +123,13 @@ class VppPapiProvider(object):
 
     def connect(self):
         """Connect the API to VPP"""
-        self.papi.connect(self.name, self.shm_prefix)
-        self.papi.register_event_callback(self)
+        self.vpp.connect(self.name, self.shm_prefix)
+        self.papi = self.vpp.api
+        self.vpp.register_event_callback(self)
 
     def disconnect(self):
         """Disconnect the API from VPP"""
-        self.papi.disconnect()
+        self.vpp.disconnect()
 
     def api(self, api_fn, api_args, expected_retval=0):
         """ Call API function and check it's return value.
@@ -144,13 +149,13 @@ class VppPapiProvider(object):
                     "return value instead of %d in %s" % \
                     (reply.retval, repr(reply))
                 self.test_class.logger.info(msg)
-                raise Exception(msg)
+                raise UnexpectedApiReturnValueError(msg)
         elif self._expect_api_retval == self._zero:
             if hasattr(reply, 'retval') and reply.retval != expected_retval:
                 msg = "API call failed, expected zero return value instead "\
                     "of %d in %s" % (expected_retval, repr(reply))
                 self.test_class.logger.info(msg)
-                raise Exception(msg)
+                raise UnexpectedApiReturnValueError(msg)
         else:
             raise Exception("Internal error, unexpected value for "
                             "self._expect_api_retval %s" %
@@ -185,7 +190,7 @@ class VppPapiProvider(object):
 
     def show_version(self):
         """ """
-        return self.papi.show_version()
+        return self.api(self.papi.show_version, {})
 
     def pg_create_interface(self, pg_index):
         """
@@ -240,6 +245,20 @@ class VppPapiProvider(object):
                          'address_length': addr_len,
                          'address': addr})
 
+    def sw_interface_set_unnumbered(self, sw_if_index, ip_sw_if_index,
+                                    is_add=1):
+        """ Set the Interface to be unnumbered
+
+        :param is_add:  (Default value = 1)
+        :param sw_if_index - interface That will be unnumbered
+        :param ip_sw_if_index - interface with an IP addres
+
+        """
+        return self.api(self.papi.sw_interface_set_unnumbered,
+                        {'sw_if_index': ip_sw_if_index,
+                         'unnumbered_sw_if_index': sw_if_index,
+                         'is_add': is_add})
+
     def sw_interface_enable_disable_mpls(self, sw_if_index,
                                          is_enable=1):
         """
@@ -267,6 +286,31 @@ class VppPapiProvider(object):
                          'suppress': suppress,
                          'send_unicast': send_unicast})
 
+    def ip6_sw_interface_ra_prefix(self,
+                                   sw_if_index,
+                                   address,
+                                   address_length,
+                                   use_default=0,
+                                   no_advertise=0,
+                                   off_link=0,
+                                   no_autoconfig=0,
+                                   no_onlink=0,
+                                   is_no=0,
+                                   val_lifetime=0xffffffff,
+                                   pref_lifetime=0xffffffff):
+        return self.api(self.papi.sw_interface_ip6nd_ra_prefix,
+                        {'sw_if_index': sw_if_index,
+                         'address': address,
+                         'address_length': address_length,
+                         'use_default': use_default,
+                         'no_advertise': no_advertise,
+                         'off_link': off_link,
+                         'no_autoconfig': no_autoconfig,
+                         'no_onlink': no_onlink,
+                         'is_no': is_no,
+                         'val_lifetime': val_lifetime,
+                         'pref_lifetime': pref_lifetime})
+
     def ip6_sw_interface_enable_disable(self, sw_if_index, enable):
         """
         Enable/Disable An interface for IPv6
@@ -610,7 +654,6 @@ class VppPapiProvider(object):
                             sw_if_index,
                             mac_address,
                             dst_address,
-                            vrf_id=0,
                             is_add=1,
                             is_ipv6=0,
                             is_static=0,
@@ -620,7 +663,6 @@ class VppPapiProvider(object):
         :param sw_if_index:
         :param mac_address:
         :param dst_address:
-        :param vrf_id:  (Default value = 0)
         :param is_add:  (Default value = 1)
         :param is_ipv6:  (Default value = 0)
         :param is_static:  (Default value = 0)
@@ -628,8 +670,7 @@ class VppPapiProvider(object):
 
         return self.api(
             self.papi.ip_neighbor_add_del,
-            {'vrf_id': vrf_id,
-             'sw_if_index': sw_if_index,
+            {'sw_if_index': sw_if_index,
              'is_add': is_add,
              'is_ipv6': is_ipv6,
              'is_static': is_static,
@@ -638,6 +679,59 @@ class VppPapiProvider(object):
              }
         )
 
+    def ip_neighbor_dump(self,
+                         sw_if_index,
+                         is_ipv6=0):
+        """ Return IP neighbor dump.
+
+        :param sw_if_index:
+        :param int is_ipv6: 1 for IPv6 neighbor, 0 for IPv4. (Default = 0)
+        """
+
+        return self.api(
+            self.papi.ip_neighbor_dump,
+            {'is_ipv6': is_ipv6,
+             'sw_if_index': sw_if_index
+             }
+        )
+
+    def proxy_arp_add_del(self,
+                          low_address,
+                          hi_address,
+                          vrf_id=0,
+                          is_add=1):
+        """ Config Proxy Arp Range.
+
+        :param low_address: Start address in the rnage to Proxy for
+        :param hi_address: End address in the rnage to Proxy for
+        :param vrf_id: The VRF/table in which to proxy
+        """
+
+        return self.api(
+            self.papi.proxy_arp_add_del,
+            {'vrf_id': vrf_id,
+             'is_add': is_add,
+             'low_address': low_address,
+             'hi_address': hi_address,
+             }
+        )
+
+    def proxy_arp_intfc_enable_disable(self,
+                                       sw_if_index,
+                                       is_enable=1):
+        """ Enable/Disable an interface for proxy ARP requests
+
+        :param sw_if_index: Interface
+        :param enable_disable: Enable/Disable
+        """
+
+        return self.api(
+            self.papi.proxy_arp_intfc_enable_disable,
+            {'sw_if_index': sw_if_index,
+             'enable_disable': is_enable
+             }
+        )
+
     def reset_vrf(self,
                   vrf_id,
                   is_ipv6=0,
@@ -1003,6 +1097,29 @@ class VppPapiProvider(object):
              'src_port': src_port,
              'enable': enable})
 
+    def snat_user_session_dump(
+            self,
+            ip_address,
+            vrf_id):
+        """Dump S-NAT user's sessions
+
+        :param ip_address: ip adress of the user to be dumped
+        :param cpu_index: cpu_index on which the user is
+        :param vrf_id: VRF ID
+        :return: Dictionary of S-NAT sessions
+        """
+        return self.api(
+            self.papi.snat_user_session_dump,
+            {'ip_address': ip_address,
+             'vrf_id': vrf_id})
+
+    def snat_user_dump(self):
+        """Dump S-NAT users
+
+        :return: Dictionary of S-NAT users
+        """
+        return self.api(self.papi.snat_user_dump, {})
+
     def control_ping(self):
         self.api(self.papi.control_ping)
 
@@ -1117,6 +1234,13 @@ class VppPapiProvider(object):
     def bfd_auth_keys_dump(self):
         return self.api(self.papi.bfd_auth_keys_dump, {})
 
+    def bfd_udp_set_echo_source(self, sw_if_index):
+        return self.api(self.papi.bfd_udp_set_echo_source,
+                        {'sw_if_index': sw_if_index})
+
+    def bfd_udp_del_echo_source(self):
+        return self.api(self.papi.bfd_udp_del_echo_source, {})
+
     def classify_add_del_table(
             self,
             is_add,
@@ -1240,16 +1364,14 @@ class VppPapiProvider(object):
                           rx_table_id=0,
                           server_table_id=0,
                           is_add=1,
-                          is_ipv6=0,
-                          insert_circuit_id=0):
+                          is_ipv6=0):
         return self.api(
-            self.papi.dhcp_proxy_config_2,
+            self.papi.dhcp_proxy_config,
             {
                 'rx_vrf_id': rx_table_id,
                 'server_vrf_id': server_table_id,
                 'is_ipv6': is_ipv6,
                 'is_add': is_add,
-                'insert_circuit_id': insert_circuit_id,
                 'dhcp_server': dhcp_server,
                 'dhcp_src_address': dhcp_src_address,
             })