tests: replace pycodestyle with black
[vpp.git] / test / test_pipe.py
index 2d3c1ec..3054099 100644 (file)
@@ -1,13 +1,18 @@
-#!/usr/bin/env python
+#!/usr/bin/env python3
 from socket import AF_INET, AF_INET6, inet_pton
+import unittest
+from ipaddress import IPv4Network
+
+from scapy.packet import Raw
+from scapy.layers.l2 import Ether
+from scapy.layers.inet import IP, UDP
 
 from framework import VppTestCase, VppTestRunner
 from vpp_interface import VppInterface
 from vpp_ip_route import VppIpTable, VppIpRoute, VppRoutePath
+from vpp_acl import AclRule, VppAcl, VppAclInterface
 
-from scapy.packet import Raw
-from scapy.layers.l2 import Ether
-from scapy.layers.inet import IP, UDP
+NUM_PKTS = 67
 
 
 class VppPipe(VppInterface):
@@ -23,20 +28,19 @@ class VppPipe(VppInterface):
     def west(self):
         return self.result.pipe_sw_if_index[0]
 
-    def __init__(self, test, instance=0xffffffff):
+    def __init__(self, test, instance=0xFFFFFFFF):
         super(VppPipe, self).__init__(test)
         self._test = test
         self.instance = instance
 
     def add_vpp_config(self):
         self.result = self._test.vapi.pipe_create(
-            0 if self.instance == 0xffffffff else 1,
-            self.instance)
+            0 if self.instance == 0xFFFFFFFF else 1, self.instance
+        )
         self.set_sw_if_index(self.result.sw_if_index)
 
     def remove_vpp_config(self):
-        self._test.vapi.pipe_delete(
-            self.result.sw_if_index)
+        self._test.vapi.pipe_delete(self.result.sw_if_index)
 
     def object_id(self):
         return "pipe-%d" % (self._sw_if_index)
@@ -48,15 +52,19 @@ class VppPipe(VppInterface):
                 return True
         return False
 
-    def set_unnumbered(self, ip_sw_if_index, is_add=True):
-        res = self._test.vapi.sw_interface_set_unnumbered(ip_sw_if_index,
-                                                          self.east, is_add)
-        res = self._test.vapi.sw_interface_set_unnumbered(ip_sw_if_index,
-                                                          self.west, is_add)
+    def set_unnumbered(self, ip_sw_if_index, is_east, is_add=True):
+        if is_east:
+            res = self._test.vapi.sw_interface_set_unnumbered(
+                ip_sw_if_index, self.east, is_add
+            )
+        else:
+            res = self._test.vapi.sw_interface_set_unnumbered(
+                ip_sw_if_index, self.west, is_add
+            )
 
 
 class TestPipe(VppTestCase):
-    """ Pipes """
+    """Pipes"""
 
     @classmethod
     def setUpClass(cls):
@@ -81,7 +89,7 @@ class TestPipe(VppTestCase):
         super(TestPipe, self).tearDown()
 
     def test_pipe(self):
-        """ Pipes """
+        """Pipes"""
 
         pipes = [VppPipe(self), VppPipe(self, 10)]
 
@@ -92,68 +100,65 @@ class TestPipe(VppTestCase):
         #
         # L2 cross-connect pipe0 east with pg0 and west with pg1
         #
-        self.vapi.sw_interface_set_l2_xconnect(self.pg0.sw_if_index,
-                                               pipes[0].east,
-                                               enable=1)
-        self.vapi.sw_interface_set_l2_xconnect(pipes[0].east,
-                                               self.pg0.sw_if_index,
-                                               enable=1)
-        self.vapi.sw_interface_set_l2_xconnect(self.pg1.sw_if_index,
-                                               pipes[0].west,
-                                               enable=1)
-        self.vapi.sw_interface_set_l2_xconnect(pipes[0].west,
-                                               self.pg1.sw_if_index,
-                                               enable=1)
+        self.vapi.sw_interface_set_l2_xconnect(
+            self.pg0.sw_if_index, pipes[0].east, enable=1
+        )
+        self.vapi.sw_interface_set_l2_xconnect(
+            pipes[0].east, self.pg0.sw_if_index, enable=1
+        )
+        self.vapi.sw_interface_set_l2_xconnect(
+            self.pg1.sw_if_index, pipes[0].west, enable=1
+        )
+        self.vapi.sw_interface_set_l2_xconnect(
+            pipes[0].west, self.pg1.sw_if_index, enable=1
+        )
 
         # test bi-directional L2 flow pg0<->pg1
-        p = (Ether(src=self.pg0.remote_mac,
-                   dst=self.pg1.remote_mac) /
-             IP(src="1.1.1.1",
-                dst="1.1.1.2") /
-             UDP(sport=1234, dport=1234) /
-             Raw('\xa5' * 100))
+        p = (
+            Ether(src=self.pg0.remote_mac, dst=self.pg1.remote_mac)
+            / IP(src="1.1.1.1", dst="1.1.1.2")
+            / UDP(sport=1234, dport=1234)
+            / Raw(b"\xa5" * 100)
+        )
 
-        self.send_and_expect(self.pg0, p * 65, self.pg1)
-        self.send_and_expect(self.pg1, p * 65, self.pg0)
+        self.send_and_expect(self.pg0, p * NUM_PKTS, self.pg1)
+        self.send_and_expect(self.pg1, p * NUM_PKTS, self.pg0)
 
         #
         # Attach ACL to ensure features are run on the pipe
         #
-        rule_1 = ({'is_permit': 0,
-                   'is_ipv6': 0,
-                   'proto': 17,
-                   'srcport_or_icmptype_first': 1234,
-                   'srcport_or_icmptype_last': 1234,
-                   'src_ip_prefix_len': 32,
-                   'src_ip_addr': inet_pton(AF_INET, "1.1.1.1"),
-                   'dstport_or_icmpcode_first': 1234,
-                   'dstport_or_icmpcode_last': 1234,
-                   'dst_ip_prefix_len': 32,
-                   'dst_ip_addr': inet_pton(AF_INET, "1.1.1.2")})
-        acl = self.vapi.acl_add_replace(acl_index=4294967295,
-                                        r=[rule_1])
+        rule_1 = AclRule(
+            is_permit=0,
+            proto=17,
+            src_prefix=IPv4Network("1.1.1.1/32"),
+            dst_prefix=IPv4Network("1.1.1.2/32"),
+            ports=1234,
+        )
+        acl = VppAcl(self, rules=[rule_1])
+        acl.add_vpp_config()
 
         # Apply the ACL on the pipe on output
-        self.vapi.acl_interface_set_acl_list(pipes[0].east,
-                                             0,
-                                             [acl.acl_index])
-        self.send_and_assert_no_replies(self.pg0, p * 65)
-        self.send_and_expect(self.pg1, p * 65, self.pg0)
+        acl_if_e = VppAclInterface(
+            self, sw_if_index=pipes[0].east, n_input=0, acls=[acl]
+        )
+        acl_if_e.add_vpp_config()
+
+        self.send_and_assert_no_replies(self.pg0, p * NUM_PKTS)
+        self.send_and_expect(self.pg1, p * NUM_PKTS, self.pg0)
 
         # remove from output and apply on input
-        self.vapi.acl_interface_set_acl_list(pipes[0].east,
-                                             0,
-                                             [])
-        self.vapi.acl_interface_set_acl_list(pipes[0].west,
-                                             1,
-                                             [acl.acl_index])
-        self.send_and_assert_no_replies(self.pg0, p * 65)
-        self.send_and_expect(self.pg1, p * 65, self.pg0)
-        self.vapi.acl_interface_set_acl_list(pipes[0].west,
-                                             0,
-                                             [])
-        self.send_and_expect(self.pg0, p * 65, self.pg1)
-        self.send_and_expect(self.pg1, p * 65, self.pg0)
+        acl_if_e.remove_vpp_config()
+        acl_if_w = VppAclInterface(
+            self, sw_if_index=pipes[0].west, n_input=1, acls=[acl]
+        )
+        acl_if_w.add_vpp_config()
+
+        self.send_and_assert_no_replies(self.pg0, p * NUM_PKTS)
+        self.send_and_expect(self.pg1, p * NUM_PKTS, self.pg0)
+
+        acl_if_w.remove_vpp_config()
+        self.send_and_expect(self.pg0, p * NUM_PKTS, self.pg1)
+        self.send_and_expect(self.pg1, p * NUM_PKTS, self.pg0)
 
         #
         # L3 routes in two separate tables so a pipe can be used to L3
@@ -174,76 +179,97 @@ class TestPipe(VppTestCase):
         self.pg3.resolve_arp()
 
         routes = []
-        routes.append(VppIpRoute(self, "1.1.1.1", 32,
-                                 [VppRoutePath(self.pg3.remote_ip4,
-                                               self.pg3.sw_if_index)],
-                                 table_id=2))
-        routes.append(VppIpRoute(self, "1.1.1.1", 32,
-                                 [VppRoutePath("0.0.0.0", pipes[1].east)],
-                                 table_id=1))
-        routes.append(VppIpRoute(self, "1.1.1.2", 32,
-                                 [VppRoutePath("0.0.0.0", pipes[1].west)],
-                                 table_id=2))
-        routes.append(VppIpRoute(self, "1.1.1.2", 32,
-                                 [VppRoutePath(self.pg2.remote_ip4,
-                                               self.pg2.sw_if_index)],
-                                 table_id=1))
+        routes.append(
+            VppIpRoute(
+                self,
+                "1.1.1.1",
+                32,
+                [VppRoutePath(self.pg3.remote_ip4, self.pg3.sw_if_index)],
+                table_id=2,
+            )
+        )
+        routes.append(
+            VppIpRoute(
+                self,
+                "1.1.1.1",
+                32,
+                [VppRoutePath("0.0.0.0", pipes[1].east)],
+                table_id=1,
+            )
+        )
+        routes.append(
+            VppIpRoute(
+                self,
+                "1.1.1.2",
+                32,
+                [VppRoutePath("0.0.0.0", pipes[1].west)],
+                table_id=2,
+            )
+        )
+        routes.append(
+            VppIpRoute(
+                self,
+                "1.1.1.2",
+                32,
+                [VppRoutePath(self.pg2.remote_ip4, self.pg2.sw_if_index)],
+                table_id=1,
+            )
+        )
 
         for r in routes:
             r.add_vpp_config()
 
-        p_east = (Ether(src=self.pg2.remote_mac,
-                        dst=self.pg2.local_mac) /
-                  IP(src="1.1.1.2",
-                     dst="1.1.1.1") /
-                  UDP(sport=1234, dport=1234) /
-                  Raw('\xa5' * 100))
+        p_east = (
+            Ether(src=self.pg2.remote_mac, dst=self.pg2.local_mac)
+            / IP(src="1.1.1.2", dst="1.1.1.1")
+            / UDP(sport=1234, dport=1234)
+            / Raw(b"\xa5" * 100)
+        )
 
         # bind the pipe ends to the correct tables
         self.vapi.sw_interface_set_table(pipes[1].west, 0, 2)
         self.vapi.sw_interface_set_table(pipes[1].east, 0, 1)
 
         # IP is not enabled on the pipes at this point
-        self.send_and_assert_no_replies(self.pg2, p_east * 65)
+        self.send_and_assert_no_replies(self.pg2, p_east * NUM_PKTS)
 
         # IP enable the Pipes by making them unnumbered
-        pipes[0].set_unnumbered(self.pg2.sw_if_index)
-        pipes[1].set_unnumbered(self.pg3.sw_if_index)
+        pipes[1].set_unnumbered(self.pg2.sw_if_index, True)
+        pipes[1].set_unnumbered(self.pg3.sw_if_index, False)
 
-        self.send_and_expect(self.pg2, p_east * 65, self.pg3)
+        self.send_and_expect(self.pg2, p_east * NUM_PKTS, self.pg3)
 
         # and the return path
-        p_west = (Ether(src=self.pg3.remote_mac,
-                        dst=self.pg3.local_mac) /
-                  IP(src="1.1.1.1",
-                     dst="1.1.1.2") /
-                  UDP(sport=1234, dport=1234) /
-                  Raw('\xa5' * 100))
-        self.send_and_expect(self.pg3, p_west * 65, self.pg2)
+        p_west = (
+            Ether(src=self.pg3.remote_mac, dst=self.pg3.local_mac)
+            / IP(src="1.1.1.1", dst="1.1.1.2")
+            / UDP(sport=1234, dport=1234)
+            / Raw(b"\xa5" * 100)
+        )
+        self.send_and_expect(self.pg3, p_west * NUM_PKTS, self.pg2)
 
         #
         # Use ACLs to test features run on the Pipes
         #
-        self.vapi.acl_interface_set_acl_list(pipes[1].east,
-                                             0,
-                                             [acl.acl_index])
-        self.send_and_assert_no_replies(self.pg2, p_east * 65)
-        self.send_and_expect(self.pg3, p_west * 65, self.pg2)
+        acl_if_e1 = VppAclInterface(
+            self, sw_if_index=pipes[1].east, n_input=0, acls=[acl]
+        )
+        acl_if_e1.add_vpp_config()
+        self.send_and_assert_no_replies(self.pg2, p_east * NUM_PKTS)
+        self.send_and_expect(self.pg3, p_west * NUM_PKTS, self.pg2)
 
         # remove from output and apply on input
-        self.vapi.acl_interface_set_acl_list(pipes[1].east,
-                                             0,
-                                             [])
-        self.vapi.acl_interface_set_acl_list(pipes[1].west,
-                                             1,
-                                             [acl.acl_index])
-        self.send_and_assert_no_replies(self.pg2, p_east * 65)
-        self.send_and_expect(self.pg3, p_west * 65, self.pg2)
-        self.vapi.acl_interface_set_acl_list(pipes[1].west,
-                                             0,
-                                             [])
-        self.send_and_expect(self.pg2, p_east * 65, self.pg3)
-        self.send_and_expect(self.pg3, p_west * 65, self.pg2)
+        acl_if_e1.remove_vpp_config()
+        acl_if_w1 = VppAclInterface(
+            self, sw_if_index=pipes[1].west, n_input=1, acls=[acl]
+        )
+        acl_if_w1.add_vpp_config()
+        self.send_and_assert_no_replies(self.pg2, p_east * NUM_PKTS)
+        self.send_and_expect(self.pg3, p_west * NUM_PKTS, self.pg2)
+        acl_if_w1.remove_vpp_config()
+
+        self.send_and_expect(self.pg2, p_east * NUM_PKTS, self.pg3)
+        self.send_and_expect(self.pg3, p_west * NUM_PKTS, self.pg2)
 
         # cleanup (so the tables delete)
         self.pg2.unconfig_ip4()
@@ -254,5 +280,5 @@ class TestPipe(VppTestCase):
         self.vapi.sw_interface_set_table(pipes[1].east, 0, 0)
 
 
-if __name__ == '__main__':
+if __name__ == "__main__":
     unittest.main(testRunner=VppTestRunner)