@@ -24,15 +24,47 @@ def get_queue_ctrs(duthost, cmd):
2424 return len (duthost .shell (cmd )["stdout_lines" ])
2525
2626
27+ def get_queue_cntrs_oid (interface ):
28+ """
29+ @summary: Returns queue_cntrs_oid value based on the interface chosen
30+ for single/multi-asic sonic host.
31+ Args:
32+ interface: Asic interface selected
33+ Returns:
34+ queue_cntrs_oid
35+ """
36+ intf_num = interface .split ('Ethernet' )[1 ]
37+ queue_cntrs_oid = '1.3.6.1.4.1.9.9.580.1.5.5.1.4.{}' .format (int (intf_num ) + 1 )
38+ return queue_cntrs_oid
39+
40+
41+ def get_asic_interface (inter_facts ):
42+ """
43+ @summary: Returns interface dynamically based on the asic chosen
44+ for single/multi-asic sonic host.
45+ """
46+ ansible_inter_facts = inter_facts ['ansible_interface_facts' ]
47+ interface = None
48+ for key , v in ansible_inter_facts .items ():
49+ # Exclude internal interfaces
50+ if 'IB' in key or 'Rec' in key or 'BP' in key :
51+ continue
52+ if 'Ether' in key and v ['active' ]:
53+ interface = key
54+ break
55+
56+ return interface
57+
58+
2759def test_snmp_queue_counters (duthosts ,
28- enum_rand_one_per_hwsku_frontend_hostname ,
29- creds_all_duts ):
60+ enum_rand_one_per_hwsku_frontend_hostname , enum_frontend_asic_index ,
61+ creds_all_duts , teardown ):
3062 """
3163 Test SNMP queue counters
3264 - Set "create_only_config_db_buffers" to true in config db, to create
3365 only relevant counters
34- - Remove one of the buffer queues, Ethernet0 |3-4 is chosen arbitrary
35- - Using snmpwalk compare number of queue counters on Ethernet0 , assuming
66+ - Remove one of the buffer queues for asic interface chosen, <interface> |3-4 is chosen arbitrary
67+ - Using snmpwalk compare number of queue counters on the interface , assuming
3668 there will be 8 less after removing the buffer. (Assuming unicast only,
3769 4 counters for each queue in this case)
3870 This test covers the issue: 'The feature "polling only configured ports
@@ -41,17 +73,42 @@ def test_snmp_queue_counters(duthosts,
4173 """
4274
4375 duthost = duthosts [enum_rand_one_per_hwsku_frontend_hostname ]
76+ global ORIG_CFG_DB , CFG_DB_PATH
4477 hostip = duthost .host .options ['inventory_manager' ].get_host (
4578 duthost .hostname ).vars ['ansible_host' ]
46- Ethernet0_queue_cntrs_oid = '1.3.6.1.4.1.9.9.580.1.5.5.1.4.1'
79+ asic = duthost .asic_instance (enum_frontend_asic_index )
80+ int_facts = asic .interface_facts ()['ansible_facts' ]
81+ interface = get_asic_interface (int_facts )
82+ if interface is None :
83+ pytest .skip ("No active interface present on the asic {}" .format (asic ))
84+ queue_cntrs_oid = get_queue_cntrs_oid (interface )
4785 get_bfr_queue_cntrs_cmd \
4886 = "docker exec snmp snmpwalk -v2c -c {} {} {}" .format (
4987 creds_all_duts [duthost .hostname ]['snmp_rocommunity' ], hostip ,
50- Ethernet0_queue_cntrs_oid )
88+ queue_cntrs_oid )
89+ # Generate sonic-cfggen commands for multi-asic and single-asic duts
90+ if duthost .sonichost .is_multi_asic and asic is not None :
91+ ORIG_CFG_DB = "/etc/sonic/orig_config_db{}.json" .format (asic .asic_index )
92+ CFG_DB_PATH = "/etc/sonic/config_db{}.json" .format (asic .asic_index )
93+ cmd = "sonic-cfggen -n {} -d --print-data > {}" .format (asic .namespace , ORIG_CFG_DB )
94+ else :
95+ cmd = "sonic-cfggen -d --print-data > {}" .format (ORIG_CFG_DB )
5196
52- duthost .shell ("sonic-cfggen -d --print-data > {}" . format ( ORIG_CFG_DB ) )
97+ duthost .shell (cmd )
5398 data = json .loads (duthost .shell ("cat {}" .format (ORIG_CFG_DB ),
5499 verbose = False )['stdout' ])
100+ buffer_queue_to_del = None
101+ # Get appropriate buffer queue value to delete in case of multi-asic
102+ if duthost .sonichost .is_multi_asic :
103+ buffer_queues = list (data ['BUFFER_QUEUE' ].keys ())
104+ iface_to_check = buffer_queues [0 ].split ('|' )[0 ]
105+ iface_buffer_queues = [bq for bq in buffer_queues if any (val in iface_to_check for val in bq .split ('|' ))]
106+ for queue in iface_buffer_queues :
107+ if asic .namespace in queue and queue .split ('|' )[- 1 ] == '3-4' and queue .split ('|' )[- 2 ] == interface :
108+ buffer_queue_to_del = queue
109+ break
110+ else :
111+ buffer_queue_to_del = "{}|3-4" .format (interface )
55112
56113 # Add create_only_config_db_buffers entry to device metadata to enable
57114 # counters optimization and get number of queue counters of Ethernet0 prior
@@ -63,16 +120,26 @@ def test_snmp_queue_counters(duthosts,
63120
64121 # Remove buffer queue and reload and get number of queue counters of
65122 # Ethernet0 after removing two buffer queues
66- del data ['BUFFER_QUEUE' ]["Ethernet0|3-4" ]
123+ del data ['BUFFER_QUEUE' ][buffer_queue_to_del ]
67124 load_new_cfg (duthost , data )
68125 queue_counters_cnt_post = get_queue_ctrs (duthost , get_bfr_queue_cntrs_cmd )
69126
70- unicast_expected_diff = BUFFER_QUEUES_REMOVED * UNICAST_CTRS
71- multicast_expected_diff = unicast_expected_diff + (BUFFER_QUEUES_REMOVED
72- * MULTICAST_CTRS )
73- pytest_assert ((queue_counters_cnt_pre - queue_counters_cnt_post )
74- in [unicast_expected_diff , multicast_expected_diff ],
75- "Queue counters count differs from expected" )
127+ # For broadcom-dnx voq chassis, number of voq are fixed (static), which cannot be modified dynamically
128+ # Hence, make sure the queue counters before deletion and after deletion are same for broadcom-dnx voq chassis
129+ if duthost .facts .get ("platform_asic" ) == "broadcom-dnx" and duthost .sonichost .is_multi_asic :
130+ pytest_assert ((queue_counters_cnt_pre == queue_counters_cnt_post ),
131+ "Queue counters actual count {} differs from expected values {}" .
132+ format (queue_counters_cnt_post , queue_counters_cnt_pre ))
133+ # check for other duts
134+ else :
135+ unicast_expected_diff = BUFFER_QUEUES_REMOVED * UNICAST_CTRS
136+ multicast_expected_diff = unicast_expected_diff + (BUFFER_QUEUES_REMOVED
137+ * MULTICAST_CTRS )
138+ pytest_assert ((queue_counters_cnt_pre - queue_counters_cnt_post )
139+ in [unicast_expected_diff , multicast_expected_diff ],
140+ "Queue counters actual count {} differs from expected values {}, {}" .
141+ format (queue_counters_cnt_post , (queue_counters_cnt_pre - unicast_expected_diff ),
142+ (queue_counters_cnt_pre - multicast_expected_diff )))
76143
77144
78145@pytest .fixture (scope = "module" )
@@ -83,5 +150,5 @@ def teardown(duthost):
83150 """
84151 yield
85152 # Cleanup
86- duthost .copy (src = ORIG_CFG_DB , dest = CFG_DB_PATH )
153+ duthost .copy (src = ORIG_CFG_DB , dest = CFG_DB_PATH , remote_src = True )
87154 config_reload (duthost , config_source = 'config_db' , safe_reload = True )
0 commit comments