span: fix wrong next1 feature index in dual loop
[vpp.git] / test / vpp_papi_provider.py
index 454f3ed..aec052c 100644 (file)
@@ -1,11 +1,26 @@
-import vpp_papi
+import os
 from logging import error
 from hook import Hook
 
+do_import = True
+try:
+    no_vpp_papi = os.getenv("NO_VPP_PAPI")
+    if no_vpp_papi == "1":
+        do_import = False
+except:
+    pass
+
+if do_import:
+    import vpp_papi
+
+
 # from vnet/vnet/mpls/mpls_types.h
 MPLS_IETF_MAX_LABEL = 0xfffff
 MPLS_LABEL_INVALID = MPLS_IETF_MAX_LABEL + 1
 
+class L2_VTR_OP:
+    L2_POP_1 = 3
+
 
 class VppPapiProvider(object):
     """VPP-api provider using vpp-papi
@@ -16,7 +31,7 @@ class VppPapiProvider(object):
     """
 
     def __init__(self, name, shm_prefix):
-        self.hook = Hook()
+        self.hook = Hook("vpp-papi-provider")
         self.name = name
         self.shm_prefix = shm_prefix
 
@@ -57,7 +72,8 @@ class VppPapiProvider(object):
         return reply
 
     def cli(self, cli):
-        """Execute a CLI, calling the before/after hooks appropriately
+        """
+        Execute a CLI, calling the before/after hooks appropriately.
 
         :param cli: CLI to execute
         :returns: CLI output
@@ -67,9 +83,21 @@ class VppPapiProvider(object):
         cli += '\n'
         r = vpp_papi.cli_inband(len(cli), cli)
         self.hook.after_cli(cli)
-        if(hasattr(r, 'reply')):
+        if hasattr(r, 'reply'):
             return r.reply[0].decode().rstrip('\x00')
 
+    def ppcli(self, cli):
+        """
+        Helping method to print CLI command in case of info logging level.
+
+        :param cli: CLI to execute
+        :returns: CLI output
+        """
+        return cli + "\n" + str(self.cli(cli))
+
+    def _convert_mac(self, mac):
+        return int(mac.replace(":", ""), 16) << 16
+
     def show_version(self):
         """ """
         return vpp_papi.show_version()
@@ -94,6 +122,18 @@ class VppPapiProvider(object):
             args = (0, b'')
         return self.api(vpp_papi.sw_interface_dump, args)
 
+    def sw_interface_set_table(self, sw_if_index, is_ipv6, table_id):
+        """
+          Set the IPvX Table-id for the Interface
+
+        :param sw_if_index:
+        :param is_ipv6:
+        :param table_id:
+
+        """
+        return self.api(vpp_papi.sw_interface_set_table,
+                        (sw_if_index, is_ipv6, table_id))
+
     def sw_interface_add_del_address(self, sw_if_index, addr, addr_len,
                                      is_ipv6=0, is_add=1, del_all=0):
         """
@@ -109,6 +149,17 @@ class VppPapiProvider(object):
         return self.api(vpp_papi.sw_interface_add_del_address,
                         (sw_if_index, is_add, is_ipv6, del_all, addr_len, addr))
 
+    def sw_interface_enable_disable_mpls(self, sw_if_index,
+                                         is_enable=1):
+        """
+        Enable/Disable MPLS on the interface
+        :param sw_if_index:
+        :param is_enable:  (Default value = 1)
+
+        """
+        return self.api(vpp_papi.sw_interface_set_mpls_enable,
+                        (sw_if_index, is_enable))
+
     def sw_interface_ra_suppress(self, sw_if_index):
         suppress = 1
         managed = 0
@@ -130,7 +181,6 @@ class VppPapiProvider(object):
                          default_router, max_interval, min_interval,
                          lifetime, initial_count, initial_interval, async))
 
-
     def vxlan_add_del_tunnel(
             self,
             src_addr,
@@ -155,16 +205,57 @@ class VppPapiProvider(object):
                         (is_add, is_ipv6, src_addr, dst_addr, encap_vrf_id,
                          decap_next_index, vni))
 
-    def sw_interface_set_l2_bridge(self, sw_if_index, bd_id,
-                                   shg=0, bvi=0, enable=1):
+    def bridge_domain_add_del(self, bd_id, flood=1, uu_flood=1, forward=1,
+                              learn=1, arp_term=0, is_add=1):
+        """Create/delete bridge domain.
+
+        :param int bd_id: Bridge domain index.
+        :param int flood: Enable/disable bcast/mcast flooding in the BD.
+            (Default value = 1)
+        :param int uu_flood: Enable/disable unknown unicast flood in the BD.
+            (Default value = 1)
+        :param int forward: Enable/disable forwarding on all interfaces in
+            the BD. (Default value = 1)
+        :param int learn: Enable/disable learning on all interfaces in the BD.
+            (Default value = 1)
+        :param int arp_term: Enable/disable arp termination in the BD.
+            (Default value = 1)
+        :param int is_add: Add or delete flag. (Default value = 1)
         """
+        return self.api(vpp_papi.bridge_domain_add_del,
+                        (bd_id, flood, uu_flood, forward, learn, arp_term,
+                         is_add))
+
+    def l2fib_add_del(self, mac, bd_id, sw_if_index, is_add=1, static_mac=0,
+                      filter_mac=0, bvi_mac=0):
+        """Create/delete L2 FIB entry.
+
+        :param str mac: MAC address to create FIB entry for.
+        :param int bd_id: Bridge domain index.
+        :param int sw_if_index: Software interface index of the interface.
+        :param int is_add: Add or delete flag. (Default value = 1)
+        :param int static_mac: Set to 1 to create static MAC entry.
+            (Default value = 0)
+        :param int filter_mac: Set to 1 to drop packet that's source or
+            destination MAC address contains defined MAC address.
+            (Default value = 0)
+        :param int bvi_mac: Set to 1 to create entry that points to BVI
+            interface. (Default value = 0)
+        """
+        return self.api(vpp_papi.l2fib_add_del,
+                        (self._convert_mac(mac), bd_id, sw_if_index, is_add,
+                         static_mac, filter_mac, bvi_mac))
 
-        :param bd_id:
-        :param sw_if_index:
-        :param shg:  (Default value = 0)
-        :param bvi:  (Default value = 0)
-        :param enable:  (Default value = 1)
-
+    def sw_interface_set_l2_bridge(self, sw_if_index, bd_id,
+                                   shg=0, bvi=0, enable=1):
+        """Add/remove interface to/from bridge domain.
+
+        :param int sw_if_index: Software interface index of the interface.
+        :param int bd_id: Bridge domain index.
+        :param int shg: Split-horizon group index. (Default value = 0)
+        :param int bvi: Set interface as a bridge group virtual interface.
+            (Default value = 0)
+        :param int enable: Add or remove interface. (Default value = 1)
         """
         return self.api(vpp_papi.sw_interface_set_l2_bridge,
                         (sw_if_index, bd_id, shg, bvi, enable))
@@ -174,18 +265,29 @@ class VppPapiProvider(object):
         """Create or delete unidirectional cross-connect from Tx interface to
         Rx interface.
 
-        :param rx_sw_if_index: Software interface index of Rx interface.
-        :param tx_sw_if_index: Software interface index of Tx interface.
-        :param enable: Create cross-connect if equal to 1, delete cross-connect
-        if equal to 0.
-        :type rx_sw_if_index: str or int
-        :type rx_sw_if_index: str or int
-        :type enable: int
+        :param int rx_sw_if_index: Software interface index of Rx interface.
+        :param int tx_sw_if_index: Software interface index of Tx interface.
+        :param int enable: Create cross-connect if equal to 1, delete
+            cross-connect if equal to 0.
 
         """
         return self.api(vpp_papi.sw_interface_set_l2_xconnect,
                         (rx_sw_if_index, tx_sw_if_index, enable))
 
+    def sw_interface_set_l2_tag_rewrite(self, sw_if_index, vtr_oper, push=0, tag1=0, tag2=0):
+        """L2 interface vlan tag rewrite configure request
+        :param client_index - opaque cookie to identify the sender
+        :param context - sender context, to match reply w/ request
+        :param sw_if_index - interface the operation is applied to
+        :param vtr_op - Choose from l2_vtr_op_t enum values
+        :param push_dot1q - first pushed flag dot1q id set, else dot1ad
+        :param tag1 - Needed for any push or translate vtr op
+        :param tag2 - Needed for any push 2 or translate x-2 vtr ops
+
+        """
+        return self.api(vpp_papi.l2_interface_vlan_tag_rewrite,
+                        (sw_if_index, vtr_oper, push, tag1, tag2))
+
     def sw_interface_set_flags(self, sw_if_index, admin_up_down,
                                link_up_down=0, deleted=0):
         """
@@ -234,6 +336,13 @@ class VppPapiProvider(object):
              outer_vlan,
              inner_vlan))
 
+    def delete_subif(self, sw_if_index):
+        """Delete subinterface
+
+        :param sw_if_index:
+        """
+        return self.api(vpp_papi.delete_subif, ([sw_if_index]))
+
     def create_vlan_subif(self, sw_if_index, vlan):
         """
 
@@ -243,6 +352,13 @@ class VppPapiProvider(object):
         """
         return self.api(vpp_papi.create_vlan_subif, (sw_if_index, vlan))
 
+    def create_loopback(self, mac=''):
+        """
+
+        :param mac: (Optional)
+        """
+        return self.api(vpp_papi.create_loopback, (mac,))
+
     def ip_add_del_route(
             self,
             dst_address,
@@ -318,3 +434,72 @@ class VppPapiProvider(object):
              dst_address_length,
              dst_address,
              next_hop_address))
+
+    def ip_neighbor_add_del(self,
+                            sw_if_index,
+                            mac_address,
+                            dst_address,
+                            vrf_id=0,
+                            is_add=1,
+                            is_ipv6=0,
+                            is_static=0,
+                            ):
+        """ Add neighbor MAC to IPv4 or IPv6 address.
+
+        :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)
+        """
+
+        return self.api(
+            vpp_papi.ip_neighbor_add_del,
+            (vrf_id,
+             sw_if_index,
+             is_add,
+             is_ipv6,
+             is_static,
+             mac_address,
+             dst_address
+             )
+        )
+
+    def sw_interface_span_enable_disable(self, sw_if_index_from, sw_if_index_to, enable=1):
+        """
+
+        :param sw_if_index_from:
+        :param sw_if_index_to:
+        :param enable
+
+        """
+        return self.api(vpp_papi.sw_interface_span_enable_disable, (sw_if_index_from, sw_if_index_to, enable ))
+
+    def gre_tunnel_add_del(self,
+                           src_address,
+                           dst_address,
+                           outer_fib_id=0,
+                           is_teb=0,
+                           is_add=1,
+                           is_ip6=0):
+        """ Add a GRE tunnel
+
+        :param src_address:
+        :param dst_address:
+        :param outer_fib_id:  (Default value = 0)
+        :param is_add:  (Default value = 1)
+        :param is_ipv6:  (Default value = 0)
+        :param is_teb:  (Default value = 0)
+        """
+
+        return self.api(
+            vpp_papi.gre_add_del_tunnel,
+            (is_add,
+             is_ip6,
+             is_teb,
+             src_address,
+             dst_address,
+             outer_fib_id)
+        )