Skip to content

Commit b772899

Browse files
authored
Multi-asic support for snmp_queue_counters test (#13637)
Approach What is the motivation for this PR? Currently, 'test_snmp_queue_counters' test doesn't have multi-asic support and the test is failing for multi-asic chassis due to the lack of support. How did you do it? Added multi-asic support for test 'test_snmp_queue_counters' and made sure the current test logic is not affected. How did you verify/test it? Ran the above-mentioned test case on a T2 chassis and verified.
1 parent 38f202c commit b772899

File tree

2 files changed

+83
-15
lines changed

2 files changed

+83
-15
lines changed

.azure-pipelines/pr_test_scripts.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -414,6 +414,7 @@ multi-asic-t1-lag:
414414
- snmp/test_snmp_loopback.py
415415
- snmp/test_snmp_pfc_counters.py
416416
- snmp/test_snmp_queue.py
417+
- snmp/test_snmp_queue_counters.py
417418
- tacacs/test_accounting.py
418419
- tacacs/test_authorization.py
419420
- tacacs/test_jit_user.py

tests/snmp/test_snmp_queue_counters.py

Lines changed: 82 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
2759
def 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

Comments
 (0)