ptf/saiisolationgroup.py (222 lines of code) (raw):

# Copyright 2021-present Intel Corporation. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. ''' Thrift SAI interface Port Isolation tests ''' from sai_thrift.sai_headers import * from sai_base_test import * @group("draft") class PortIsolationTest(SaiHelper): ''' Port isolation test class ''' def setUp(self): super(PortIsolationTest, self).setUp() self.mac11 = '00:11:11:11:11:11:11' self.mac22 = '00:22:22:22:22:22:22' self.mac33 = '00:33:33:33:33:33:33' # Create ingress RIFs, use port10_rif and port24_rif as ingress self.port24_rif = sai_thrift_create_router_interface( self.client, type=SAI_ROUTER_INTERFACE_TYPE_PORT, virtual_router_id=self.default_vrf, port_id=self.port24) # Create nhop for port11_rif self.nhop1 = sai_thrift_create_next_hop( self.client, ip=sai_ipaddress('10.10.0.2'), router_interface_id=self.port11_rif, type=SAI_NEXT_HOP_TYPE_IP) self.neighbor_entry1 = sai_thrift_neighbor_entry_t( rif_id=self.port11_rif, ip_address=sai_ipaddress('10.10.0.2')) sai_thrift_create_neighbor_entry(self.client, self.neighbor_entry1, dst_mac_address=self.mac11) self.nhop2 = sai_thrift_create_next_hop( self.client, ip=sai_ipaddress('20.20.0.2'), router_interface_id=self.port12_rif, type=SAI_NEXT_HOP_TYPE_IP) self.neighbor_entry2 = sai_thrift_neighbor_entry_t( rif_id=self.port12_rif, ip_address=sai_ipaddress('20.20.0.2')) sai_thrift_create_neighbor_entry(self.client, self.neighbor_entry2, dst_mac_address=self.mac22) self.nhop3 = sai_thrift_create_next_hop( self.client, ip=sai_ipaddress('30.30.0.3'), router_interface_id=self.port13_rif, type=SAI_NEXT_HOP_TYPE_IP) self.neighbor_entry3 = sai_thrift_neighbor_entry_t( rif_id=self.port13_rif, ip_address=sai_ipaddress('30.30.0.3')) sai_thrift_create_neighbor_entry(self.client, self.neighbor_entry3, dst_mac_address=self.mac33) self.route_entry1 = sai_thrift_route_entry_t( vr_id=self.default_vrf, destination=sai_ipprefix('10.10.10.1/32')) sai_thrift_create_route_entry(self.client, self.route_entry1, next_hop_id=self.nhop1) self.route_entry2 = sai_thrift_route_entry_t( vr_id=self.default_vrf, destination=sai_ipprefix('20.20.20.1/32')) sai_thrift_create_route_entry(self.client, self.route_entry2, next_hop_id=self.nhop2) self.route_entry3 = sai_thrift_route_entry_t( vr_id=self.default_vrf, destination=sai_ipprefix('30.30.30.1/32')) sai_thrift_create_route_entry(self.client, self.route_entry3, next_hop_id=self.nhop3) self.isolation_group1 = sai_thrift_create_isolation_group( self.client, type=SAI_ISOLATION_GROUP_TYPE_PORT) self.isolation_group_mbr1 = sai_thrift_create_isolation_group_member( self.client, isolation_group_id=self.isolation_group1, isolation_object=self.port11) self.isolation_group_mbr2 = sai_thrift_create_isolation_group_member( self.client, isolation_group_id=self.isolation_group1, isolation_object=self.port12) self.isolation_group2 = sai_thrift_create_isolation_group( self.client, type=SAI_ISOLATION_GROUP_TYPE_PORT) self.isolation_group_mbr3 = sai_thrift_create_isolation_group_member( self.client, isolation_group_id=self.isolation_group2, isolation_object=self.port12) self.isolation_group_mbr4 = sai_thrift_create_isolation_group_member( self.client, isolation_group_id=self.isolation_group2, isolation_object=self.port13) def runTest(self): self.attributeTest() self.forwardingTest() def tearDown(self): sai_thrift_remove_isolation_group_member(self.client, self.isolation_group_mbr4) sai_thrift_remove_isolation_group_member(self.client, self.isolation_group_mbr3) sai_thrift_remove_isolation_group(self.client, self.isolation_group2) sai_thrift_remove_isolation_group_member(self.client, self.isolation_group_mbr2) sai_thrift_remove_isolation_group_member(self.client, self.isolation_group_mbr1) sai_thrift_remove_isolation_group(self.client, self.isolation_group1) sai_thrift_remove_route_entry(self.client, self.route_entry3) sai_thrift_remove_route_entry(self.client, self.route_entry2) sai_thrift_remove_route_entry(self.client, self.route_entry1) sai_thrift_remove_next_hop(self.client, self.nhop3) sai_thrift_remove_neighbor_entry(self.client, self.neighbor_entry3) sai_thrift_remove_next_hop(self.client, self.nhop2) sai_thrift_remove_neighbor_entry(self.client, self.neighbor_entry2) sai_thrift_remove_next_hop(self.client, self.nhop1) sai_thrift_remove_neighbor_entry(self.client, self.neighbor_entry1) sai_thrift_remove_router_interface(self.client, self.port24_rif) super(PortIsolationTest, self).tearDown() def attributeTest(self): ''' Verify isolation group CRUD operations ''' print("attributeTest") attrs = sai_thrift_get_isolation_group_attribute(self.client, self.isolation_group1, type=True) self.assertEqual(attrs["type"], SAI_ISOLATION_GROUP_TYPE_PORT) attrs = sai_thrift_get_isolation_group_member_attribute( self.client, self.isolation_group_mbr1, isolation_group_id=True, isolation_object=True) self.assertEqual(attrs["isolation_group_id"], self.isolation_group1) self.assertEqual(attrs["isolation_object"], self.port11) def forwardingTest(self): ''' Test forwarding between ports with isolation groups attached Ingress ports: port10 and port24 Isolation groups: grp1: port 11 and port12 grp2: port 12 and port13 ''' print("forwardingTest") try: pkt1 = simple_tcp_packet(eth_dst=ROUTER_MAC, ip_dst='10.10.10.1', ip_ttl=64) exp_pkt1 = simple_tcp_packet(eth_dst=self.mac11, eth_src=ROUTER_MAC, ip_dst='10.10.10.1', ip_ttl=63) pkt2 = simple_tcp_packet(eth_dst=ROUTER_MAC, ip_dst='20.20.20.1', ip_ttl=64) exp_pkt2 = simple_tcp_packet(eth_dst=self.mac22, eth_src=ROUTER_MAC, ip_dst='20.20.20.1', ip_ttl=63) pkt3 = simple_tcp_packet(eth_dst=ROUTER_MAC, ip_dst='30.30.30.1', ip_ttl=64) exp_pkt3 = simple_tcp_packet(eth_dst=self.mac33, eth_src=ROUTER_MAC, ip_dst='30.30.30.1', ip_ttl=63) print("Sending packet from port %d" % self.dev_port10) send_packet(self, self.dev_port10, pkt1) verify_packet(self, exp_pkt1, self.dev_port11) send_packet(self, self.dev_port10, pkt2) verify_packet(self, exp_pkt2, self.dev_port12) send_packet(self, self.dev_port10, pkt3) verify_packet(self, exp_pkt3, self.dev_port13) print("Sending packet from port %d" % self.dev_port24) send_packet(self, self.dev_port24, pkt1) verify_packet(self, exp_pkt1, self.dev_port11) send_packet(self, self.dev_port24, pkt2) verify_packet(self, exp_pkt2, self.dev_port12) send_packet(self, self.dev_port24, pkt3) verify_packet(self, exp_pkt3, self.dev_port13) # Attach isolation groups print("Attach isolation groups to ingress ports") sai_thrift_set_port_attribute( self.client, self.port10, isolation_group=self.isolation_group1) sai_thrift_set_port_attribute( self.client, self.port24, isolation_group=self.isolation_group2) print("Sending packet from port %d" % self.dev_port10) send_packet(self, self.dev_port10, pkt1) verify_no_other_packets(self, timeout=1) send_packet(self, self.dev_port10, pkt2) verify_no_other_packets(self, timeout=1) send_packet(self, self.dev_port10, pkt3) verify_packet(self, exp_pkt3, self.dev_port13) print("Sending packet from port %d" % self.dev_port24) send_packet(self, self.dev_port24, pkt1) verify_packet(self, exp_pkt1, self.dev_port11) send_packet(self, self.dev_port24, pkt2) verify_no_other_packets(self, timeout=1) send_packet(self, self.dev_port24, pkt3) verify_no_other_packets(self, timeout=1) # Detach isolation groups print("Detach isolation groups from ingress ports") sai_thrift_set_port_attribute(self.client, self.port10, isolation_group=SAI_NULL_OBJECT_ID) sai_thrift_set_port_attribute(self.client, self.port24, isolation_group=SAI_NULL_OBJECT_ID) print("Sending packet from port %d" % self.dev_port10) send_packet(self, self.dev_port10, pkt1) verify_packet(self, exp_pkt1, self.dev_port11) send_packet(self, self.dev_port10, pkt2) verify_packet(self, exp_pkt2, self.dev_port12) send_packet(self, self.dev_port10, pkt3) verify_packet(self, exp_pkt3, self.dev_port13) print("Sending packet from port %d" % self.dev_port24) send_packet(self, self.dev_port24, pkt1) verify_packet(self, exp_pkt1, self.dev_port11) send_packet(self, self.dev_port24, pkt2) verify_packet(self, exp_pkt2, self.dev_port12) send_packet(self, self.dev_port24, pkt3) verify_packet(self, exp_pkt3, self.dev_port13) finally: sai_thrift_set_port_attribute(self.client, self.port10, isolation_group=SAI_NULL_OBJECT_ID) sai_thrift_set_port_attribute(self.client, self.port24, isolation_group=SAI_NULL_OBJECT_ID)