API: Change ip4_address and ip6_address to use type alias.
[vpp.git] / test / vpp_papi_provider.py
index 1adcc1b..6cbde71 100644 (file)
@@ -1,9 +1,12 @@
-import os
 import fnmatch
+import os
 import time
-from hook import Hook
 from collections import deque
 
+from six import moves
+
+from hook import Hook
+
 # Sphinx creates auto-generated documentation by importing the python source
 # files and collecting the docstrings from them. The NO_VPP_PAPI flag allows
 # the vpp_papi_provider.py file to be importable without having to build
@@ -44,6 +47,17 @@ class QOS_SOURCE:
     IP = 3
 
 
+class SYSLOG_SEVERITY:
+    EMERG = 0
+    ALERT = 1
+    CRIT = 2
+    ERR = 3
+    WARN = 4
+    NOTICE = 5
+    INFO = 6
+    DBG = 7
+
+
 class UnexpectedApiReturnValueError(Exception):
     """ exception raised when the API return value is unexpected """
     pass
@@ -66,7 +80,7 @@ class VppPapiProvider(object):
         self._expect_stack = []
         jsonfiles = []
 
-        install_dir = os.getenv('VPP_TEST_INSTALL_PATH')
+        install_dir = os.getenv('VPP_INSTALL_PATH')
         for root, dirnames, filenames in os.walk(install_dir):
             for filename in fnmatch.filter(filenames, '*.api.json'):
                 jsonfiles.append(os.path.join(root, filename))
@@ -78,14 +92,23 @@ class VppPapiProvider(object):
     def __enter__(self):
         return self
 
-    def expect_negative_api_retval(self):
-        """ Expect API failure """
+    def assert_negative_api_retval(self):
+        """ Expect API failure - used with with, e.g.:
+            with self.vapi.assert_negative_api_retval():
+                self.vapi.<api call expected to fail>
+        """
         self._expect_stack.append(self._expect_api_retval)
         self._expect_api_retval = self._negative
         return self
 
-    def expect_zero_api_retval(self):
-        """ Expect API success """
+    def assert_zero_api_retval(self):
+        """ Expect API success - used with with, e.g.:
+            with self.vapi.assert_negative_api_retval():
+                self.vapi.<api call expected to succeed>
+
+            note: this is useful only inside another with block
+                  as success is the default expected value
+        """
         self._expect_stack.append(self._expect_api_retval)
         self._expect_api_retval = self._zero
         return self
@@ -164,14 +187,14 @@ class VppPapiProvider(object):
             if hasattr(reply, 'retval') and reply.retval >= 0:
                 msg = "API call passed unexpectedly: expected negative "\
                     "return value instead of %d in %s" % \
-                    (reply.retval, repr(reply))
+                    (reply.retval, moves.reprlib.repr(reply))
                 self.test_class.logger.info(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 %d return value instead "\
                     "of %d in %s" % (expected_retval, reply.retval,
-                                     repr(reply))
+                                     moves.reprlib.repr(reply))
                 self.test_class.logger.info(msg)
                 raise UnexpectedApiReturnValueError(msg)
         else:
@@ -2678,11 +2701,8 @@ class VppPapiProvider(object):
 
     def map_add_domain(self,
                        ip6_prefix,
-                       ip6_prefix_len,
                        ip6_src,
-                       ip6_src_prefix_len,
                        ip4_prefix,
-                       ip4_prefix_len,
                        ea_bits_len=0,
                        psid_offset=0,
                        psid_length=0,
@@ -2693,11 +2713,8 @@ class VppPapiProvider(object):
             self.papi.map_add_domain,
             {
                 'ip6_prefix': ip6_prefix,
-                'ip6_prefix_len': ip6_prefix_len,
                 'ip4_prefix': ip4_prefix,
-                'ip4_prefix_len': ip4_prefix_len,
                 'ip6_src': ip6_src,
-                'ip6_src_prefix_len': ip6_src_prefix_len,
                 'ea_bits_len': ea_bits_len,
                 'psid_offset': psid_offset,
                 'psid_length': psid_length,
@@ -3151,15 +3168,18 @@ class VppPapiProvider(object):
     def ip_punt_redirect(self,
                          rx_sw_if_index,
                          tx_sw_if_index,
-                         nh,
-                         is_ip6=0,
+                         address,
                          is_add=1):
         return self.api(self.papi.ip_punt_redirect,
-                        {'rx_sw_if_index': rx_sw_if_index,
-                         'tx_sw_if_index': tx_sw_if_index,
-                         'nh': nh,
-                         'is_add': is_add,
-                         'is_ip6': is_ip6})
+                        {'punt': {'rx_sw_if_index': rx_sw_if_index,
+                                  'tx_sw_if_index': tx_sw_if_index,
+                                  'nh': address},
+                         'is_add': is_add})
+
+    def ip_punt_redirect_dump(self, sw_if_index, is_ipv6=0):
+        return self.api(self.papi.ip_punt_redirect_dump,
+                        {'sw_if_index': sw_if_index,
+                         'is_ipv6': is_ipv6})
 
     def bier_table_add_del(self,
                            bti,
@@ -3328,7 +3348,9 @@ class VppPapiProvider(object):
                                 is_tunnel=1,
                                 is_tunnel_ipv6=0,
                                 is_add=1,
-                                udp_encap=0):
+                                udp_encap=0,
+                                use_anti_replay=0,
+                                use_extended_sequence_number=0):
         """ IPSEC SA add/del
         :param sad_id: security association ID
         :param spi: security param index of the SA in decimal
@@ -3361,7 +3383,9 @@ class VppPapiProvider(object):
              'is_add': is_add,
              'is_tunnel': is_tunnel,
              'is_tunnel_ipv6': is_tunnel_ipv6,
-             'udp_encap': udp_encap})
+             'udp_encap': udp_encap,
+             'use_extended_sequence_number': use_extended_sequence_number,
+             'use_anti_replay': use_anti_replay})
 
     def ipsec_spd_add_del_entry(self,
                                 spd_id,
@@ -3443,6 +3467,13 @@ class VppPapiProvider(object):
              'show_instance': show_instance
              })
 
+    def ipsec_select_backend(self, protocol, index):
+        return self.api(self.papi.ipsec_select_backend,
+                        {'protocol': protocol, 'index': index})
+
+    def ipsec_backend_dump(self):
+        return self.api(self.papi.ipsec_backend_dump, {})
+
     def app_namespace_add(self,
                           namespace_id,
                           ip4_fib_id=0,
@@ -3537,13 +3568,14 @@ class VppPapiProvider(object):
         """ GBP endpoint group Dump """
         return self.api(self.papi.gbp_endpoint_group_dump, {})
 
-    def gbp_bridge_domain_add(self, bd_id,
+    def gbp_bridge_domain_add(self, bd_id, flags,
                               bvi_sw_if_index,
                               uu_fwd_sw_if_index):
         """ GBP bridge-domain Add """
         return self.api(self.papi.gbp_bridge_domain_add,
                         {'bd':
                          {
+                             'flags': flags,
                              'bvi_sw_if_index': bvi_sw_if_index,
                              'uu_fwd_sw_if_index': uu_fwd_sw_if_index,
                              'bd_id': bd_id
@@ -3596,6 +3628,19 @@ class VppPapiProvider(object):
         """ GBP recirc Dump """
         return self.api(self.papi.gbp_recirc_dump, {})
 
+    def gbp_ext_itf_add_del(self, is_add, sw_if_index, bd_id, rd_id):
+        """ GBP recirc Add/Del """
+        return self.api(self.papi.gbp_ext_itf_add_del,
+                        {'is_add': is_add,
+                         'ext_itf': {
+                             'sw_if_index': sw_if_index,
+                             'bd_id': bd_id,
+                             'rd_id': rd_id}})
+
+    def gbp_ext_itf_dump(self):
+        """ GBP recirc Dump """
+        return self.api(self.papi.gbp_ext_itf_dump, {})
+
     def gbp_subnet_add_del(self, is_add, rd_id,
                            prefix, type,
                            sw_if_index=0xffffffff,
@@ -3614,14 +3659,16 @@ class VppPapiProvider(object):
         """ GBP Subnet Dump """
         return self.api(self.papi.gbp_subnet_dump, {})
 
-    def gbp_contract_add_del(self, is_add, src_epg, dst_epg, acl_index):
+    def gbp_contract_add_del(self, is_add, src_epg, dst_epg, acl_index, rules):
         """ GBP contract Add/Del """
         return self.api(self.papi.gbp_contract_add_del,
                         {'is_add': is_add,
                          'contract': {
                              'acl_index': acl_index,
                              'src_epg': src_epg,
-                             'dst_epg': dst_epg}})
+                             'dst_epg': dst_epg,
+                             'n_rules': len(rules),
+                             'rules': rules}})
 
     def gbp_contract_dump(self):
         """ GBP contract Dump """
@@ -3753,10 +3800,7 @@ class VppPapiProvider(object):
                                 'sw_if_index': sw_if_index,
                                 'n_srcs': len(saddrs),
                                 'saddrs': saddrs,
-                                'gaddr':
-                                {
-                                    'address': gaddr
-                                }
+                                'gaddr':  gaddr
                             }
                         })
 
@@ -4007,3 +4051,40 @@ class VppPapiProvider(object):
 
     def svs_dump(self):
         return self.api(self.papi.svs_dump, {})
+
+    def syslog_set_sender(
+            self,
+            collector,
+            src,
+            collector_port=514,
+            vrf_id=0,
+            max_msg_size=480):
+        """Set syslog sender configuration
+
+        :param collector: colector IP address
+        :param src: source IP address
+        :param collector_port: collector UDP port (Default value = 514)
+        :param vrf_id: VRF id (Default value = 0)
+        :param max_msg_size: maximum message length (Default value = 480)
+        """
+        return self.api(self.papi.syslog_set_sender,
+                        {'collector_address': collector,
+                         'src_address': src,
+                         'collector_port': collector_port,
+                         'vrf_id': vrf_id,
+                         'max_msg_size': max_msg_size})
+
+    def syslog_get_sender(self):
+        """Return syslog sender configuration"""
+        return self.api(self.papi.syslog_get_sender, {})
+
+    def syslog_set_filter(self, severity):
+        """Set syslog filter parameters
+
+        :param severity: severity filter (specified severity and greater match)
+        """
+        return self.api(self.papi.syslog_set_filter, {'severity': severity})
+
+    def syslog_get_filter(self):
+        """Return syslog filter parameters"""
+        return self.api(self.papi.syslog_get_filter, {})