@@ -23,6 +23,7 @@ class TestMuxTunnelBase():
2323 ASIC_VRF_TABLE = "ASIC_STATE:SAI_OBJECT_TYPE_VIRTUAL_ROUTER"
2424 ASIC_NEIGH_TABLE = "ASIC_STATE:SAI_OBJECT_TYPE_NEIGHBOR_ENTRY"
2525 ASIC_NEXTHOP_TABLE = "ASIC_STATE:SAI_OBJECT_TYPE_NEXT_HOP"
26+ ASIC_NHG_MEMBER_TABLE = "ASIC_STATE:SAI_OBJECT_TYPE_NEXT_HOP_GROUP_MEMBER"
2627 ASIC_ROUTE_TABLE = "ASIC_STATE:SAI_OBJECT_TYPE_ROUTE_ENTRY"
2728 ASIC_FDB_TABLE = "ASIC_STATE:SAI_OBJECT_TYPE_FDB_ENTRY"
2829 ASIC_SWITCH_TABLE = "ASIC_STATE:SAI_OBJECT_TYPE_SWITCH"
@@ -242,6 +243,26 @@ def check_nexthop_in_asic_db(self, asicdb, key, standby=False):
242243 else :
243244 assert (nhid != tunnel_nh_id )
244245
246+ def check_exact_nexthops_in_asic_group (self , asicdb , rtkey , nexthops ):
247+ route_fvs = asicdb .get_entry (self .ASIC_ROUTE_TABLE , rtkey )
248+ nhg_id = route_fvs ["SAI_ROUTE_ENTRY_ATTR_NEXT_HOP_ID" ]
249+
250+ asicdb .wait_for_entry ("ASIC_STATE:SAI_OBJECT_TYPE_NEXT_HOP_GROUP" , nhg_id )
251+
252+ nexthop_oids = []
253+ for nexthop in nexthops :
254+ nexthop_oid = self .get_nexthop_oid (nexthop , asicdb )
255+ if nexthop_oid == '' :
256+ assert False
257+ nexthop_oids .append (nexthop_oid )
258+
259+ nhg_keys = asicdb .get_keys (self .ASIC_NHG_MEMBER_TABLE )
260+ for key in nhg_keys :
261+ entry = asicdb .get_entry (self .ASIC_NHG_MEMBER_TABLE , key )
262+ if nhg_id != entry ["SAI_NEXT_HOP_GROUP_MEMBER_ATTR_NEXT_HOP_GROUP_ID" ]:
263+ continue
264+ assert nexthop_oids .__contains__ (entry ["SAI_NEXT_HOP_GROUP_MEMBER_ATTR_NEXT_HOP_ID" ])
265+
245266 def check_nexthop_group_in_asic_db (self , asicdb , key , num_tnl_nh = 0 ):
246267
247268 fvs = asicdb .get_entry ("ASIC_STATE:SAI_OBJECT_TYPE_ROUTE_ENTRY" , key )
@@ -561,11 +582,6 @@ def create_and_test_multi_nexthop_routes(self, dvs, dvs_route, appdb, mac0, mac4
561582 self .add_neighbor (dvs , NH1_ipv6 , mac0 )
562583 self .add_neighbor (dvs , NH2_ipv6 , mac4 )
563584
564- NH1_oid = self .get_nexthop_oid (NH1 , asicdb )
565- NH2_oid = self .get_nexthop_oid (NH2 , asicdb )
566- NH1_ipv6_oid = self .get_nexthop_oid (NH1_ipv6 , asicdb )
567- NH2_ipv6_oid = self .get_nexthop_oid (NH2_ipv6 , asicdb )
568-
569585 # program route with 1 neighbor
570586 ps = swsscommon .ProducerStateTable (apdb .db_connection , "ROUTE_TABLE" )
571587 fvs = swsscommon .FieldValuePairs (
@@ -588,20 +604,14 @@ def create_and_test_multi_nexthop_routes(self, dvs, dvs_route, appdb, mac0, mac4
588604 rtkeys = dvs_route .check_asicdb_route_entries ([route ])
589605 rtkeys_ipv6 = dvs_route .check_asicdb_route_entries ([route_ipv6 ])
590606
591- route_oid = self .get_route_nexthop_oid (rtkeys [0 ], asicdb )
592- route_ipv6_oid = self .get_route_nexthop_oid (rtkeys_ipv6 [0 ], asicdb )
593-
594- assert NH1_oid == route_oid
595- assert NH1_ipv6_oid == route_ipv6_oid
607+ self .check_exact_nexthops_in_asic_group (asicdb , rtkeys [0 ], [NH1 ])
608+ self .check_exact_nexthops_in_asic_group (asicdb , rtkeys_ipv6 [0 ], [NH1_ipv6 ])
596609
597610 # set first neighbor to standby
598611 self .set_mux_state (appdb , "Ethernet0" , "standby" )
599612
600- route_oid = self .get_route_nexthop_oid (rtkeys [0 ], asicdb )
601- route_ipv6_oid = self .get_route_nexthop_oid (rtkeys_ipv6 [0 ], asicdb )
602-
603- assert NH2_oid == route_oid
604- assert NH2_ipv6_oid == route_ipv6_oid
613+ self .check_exact_nexthops_in_asic_group (asicdb , rtkeys [0 ], [NH2 ])
614+ self .check_exact_nexthops_in_asic_group (asicdb , rtkeys_ipv6 [0 ], [NH2_ipv6 ])
605615
606616 # set second neighbor to standby
607617 self .set_mux_state (appdb , "Ethernet4" , "standby" )
@@ -615,26 +625,14 @@ def create_and_test_multi_nexthop_routes(self, dvs, dvs_route, appdb, mac0, mac4
615625 # set second neighbor to active
616626 self .set_mux_state (appdb , "Ethernet4" , "active" )
617627
618- NH2_oid = self .get_nexthop_oid (NH2 , asicdb )
619- NH2_ipv6_oid = self .get_nexthop_oid (NH2_ipv6 , asicdb )
620-
621- route_oid = self .get_route_nexthop_oid (rtkeys [0 ], asicdb )
622- route_ipv6_oid = self .get_route_nexthop_oid (rtkeys_ipv6 [0 ], asicdb )
623-
624- assert NH2_oid == route_oid
625- assert NH2_ipv6_oid == route_ipv6_oid
628+ self .check_exact_nexthops_in_asic_group (asicdb , rtkeys [0 ], [NH2 ])
629+ self .check_exact_nexthops_in_asic_group (asicdb , rtkeys_ipv6 [0 ], [NH2_ipv6 ])
626630
627631 # set first neighbor to active
628632 self .set_mux_state (appdb , "Ethernet0" , "active" )
629633
630- NH1_oid = self .get_nexthop_oid (NH1 , asicdb )
631- NH1_ipv6_oid = self .get_nexthop_oid (NH1_ipv6 , asicdb )
632-
633- route_oid = self .get_route_nexthop_oid (rtkeys [0 ], asicdb )
634- route_ipv6_oid = self .get_route_nexthop_oid (rtkeys_ipv6 [0 ], asicdb )
635-
636- assert NH1_oid == route_oid
637- assert NH1_ipv6_oid == route_ipv6_oid
634+ self .check_exact_nexthops_in_asic_group (asicdb , rtkeys [0 ], [NH1 ])
635+ self .check_exact_nexthops_in_asic_group (asicdb , rtkeys_ipv6 [0 ], [NH1_ipv6 ])
638636
639637 # Cleanup
640638 ps ._del (route )
@@ -681,8 +679,8 @@ def create_and_test_multi_nexthop_routes(self, dvs, dvs_route, appdb, mac0, mac4
681679 rtkeys_ipv6 = dvs_route .check_asicdb_route_entries ([route_ipv6 ])
682680
683681 # Check for nexthop group - should not be deleted by update_Route()
684- self .check_nexthop_group_in_asic_db (asicdb , rtkeys [0 ])
685- self .check_nexthop_group_in_asic_db (asicdb , rtkeys_ipv6 [0 ])
682+ self .check_exact_nexthops_in_asic_group (asicdb , rtkeys [0 ], [ non_mux , non_mux2 ])
683+ self .check_exact_nexthops_in_asic_group (asicdb , rtkeys_ipv6 [0 ], [ non_mux_ipv6 , non_mux2_ipv6 ])
686684
687685 # Cleanup
688686 ps ._del (route )
0 commit comments