Skip to content

Commit 35e1969

Browse files
[SNMP][multi-asic]: Modify snmp interfaces test case to support multi-asic platform. (#3372)
What is the motivation for this PR? Modify the newly added test_snmp_interfaces_mib to support multi-asic platform. How did you do it? Modify the test_snmp_interfaces_mib function to run for all asic namespaces. Modify functions to check ports/mtu to compare data in snmp facts against config_facts.
1 parent 15c28e7 commit 35e1969

File tree

1 file changed

+55
-25
lines changed

1 file changed

+55
-25
lines changed

tests/snmp/test_snmp_interfaces.py

+55-25
Original file line numberDiff line numberDiff line change
@@ -7,22 +7,23 @@
77
]
88

99

10-
def collect_all_facts(duthost):
10+
def collect_all_facts(duthost, ports_list, namespace=None):
1111
"""
1212
Collect all data needed for test per each port from DUT
1313
:param duthost: DUT host object
1414
:return: dict with data collected from DUT per each port
1515
"""
1616
result = {}
17-
setup = duthost.setup()['ansible_facts']
18-
config_facts = duthost.config_facts(host=duthost.hostname, source="running")['ansible_facts']
19-
cmd = 'redis-cli -n 0 --raw hget "PORT_TABLE:{}" "{}"'
20-
ports_list = []
21-
_ = [ports_list.extend(config_facts.get(i, {}).keys())
22-
for i in ['port_name_to_alias_map', 'PORTCHANNEL', 'MGMT_INTERFACE']]
17+
setup = duthost.interface_facts(namespace=namespace)['ansible_facts']['ansible_interface_facts']
18+
config_facts = duthost.config_facts(host=duthost.hostname, source="running", namespace=namespace)['ansible_facts']
19+
20+
if not namespace:
21+
sonic_db_cmd = "sonic-db-cli"
22+
else:
23+
sonic_db_cmd = "sonic-db-cli -n {}".format(namespace)
2324

2425
for name in ports_list:
25-
key = 'ansible_{}'.format(name)
26+
key = name
2627
# 6 stands for ethernet-csmacd and 161 stands for ieee8023adLag
2728
if_type = '161' if name.startswith("PortChannel") else '6'
2829
if name.startswith("Eth"):
@@ -35,21 +36,27 @@ def collect_all_facts(duthost):
3536
try:
3637
admin = config_facts.get('PORT', {})[name]['admin_status']
3738
except KeyError:
38-
admin = duthost.shell(cmd.format(name, 'admin_status'))['stdout']
39+
admin = duthost.shell('{} APPL_DB HGET "PORT_TABLE:{}" "admin_status"'.format(sonic_db_cmd, name), module_ignore_errors=False)['stdout']
3940
result[portname].update({'adminstatus': admin})
40-
oper = duthost.shell(cmd.format(name, 'oper_status'))['stdout']
41+
oper = duthost.shell('{} APPL_DB HGET "PORT_TABLE:{}" "oper_status"'.format(sonic_db_cmd, name), module_ignore_errors=False)['stdout']
4142
result[portname].update({'operstatus': oper})
4243
result[portname].update({'description': config_facts.get('PORT', {})[name]['description']})
44+
elif name.startswith("PortChannel"):
45+
result.setdefault(name, {})
46+
key_word = "PORTCHANNEL"
47+
result[name].update({'mtu': str(setup[key]['mtu'])})
48+
result[name].update({'type': if_type})
49+
result[name].update({'adminstatus': config_facts.get(key_word, {})[name]['admin_status']})
50+
oper = duthost.shell('{} APPL_DB HGET "LAG_TABLE:{}" "oper_status"'.format(sonic_db_cmd, name), module_ignore_errors=False)
51+
result[name].update({'operstatus': oper['stdout']})
52+
result[name].update({'description': config_facts.get(key_word, {})[name].get('description', '')})
4353
else:
54+
key_word = "MGMT_PORT"
4455
result.setdefault(name, {})
45-
key_word = "PORTCHANNEL" if name.startswith("PortChannel") else 'MGMT_PORT'
4656
result[name].update({'mtu': str(setup[key]['mtu'])})
4757
result[name].update({'type': if_type})
4858
result[name].update({'adminstatus': config_facts.get(key_word, {})[name]['admin_status']})
49-
if name.startswith("PortChannel"):
50-
oper = duthost.shell('redis-cli -n 0 --raw hget "LAG_TABLE:{}" "oper_status"'.format(name))
51-
else:
52-
oper = duthost.shell('redis-cli -n 6 --raw hget "MGMT_PORT_TABLE|{}" "oper_status"'.format(name))
59+
oper = duthost.shell('{} STATE_DB HGET "MGMT_PORT_TABLE|{}" "oper_status"'.format(sonic_db_cmd, name), module_ignore_errors=False)
5360
result[name].update({'operstatus': oper['stdout']})
5461
result[name].update({'description': config_facts.get(key_word, {})[name].get('description', '')})
5562
return result
@@ -62,12 +69,14 @@ def verify_port_snmp(facts, snmp_facts):
6269
:return: Dict with unequal snmp_facts
6370
"""
6471
missed = {}
65-
for _, port_snmp in snmp_facts['snmp_interfaces'].items():
66-
port_name = port_snmp['name']
72+
snmp_port_map = { snmp_facts['snmp_interfaces'][idx]['name'] : idx for idx in snmp_facts['snmp_interfaces'] }
73+
74+
for port_name in facts:
75+
idx = snmp_port_map[port_name]
76+
port_snmp = snmp_facts['snmp_interfaces'][idx]
6777
compare = ['operstatus', 'adminstatus', 'mtu', 'description', 'type']
6878
missed.setdefault(port_name, {})
6979
for field in compare:
70-
# Skip MTU on mgmt port for now, due to not implemented in Sonic for mgmt port
7180
if field == 'mtu' and port_name.startswith('eth0'):
7281
continue
7382
elif facts[port_name][field] != port_snmp[field]:
@@ -82,10 +91,12 @@ def verify_port_ifindex(snmp_facts, results):
8291
:return: dict with unequal snmp_facts per port
8392
"""
8493
unique = []
85-
for port_index, port_snmp in snmp_facts['snmp_interfaces'].items():
86-
port_name = port_snmp['name']
94+
snmp_port_map = { snmp_facts['snmp_interfaces'][idx]['name'] : idx for idx in snmp_facts['snmp_interfaces'] }
95+
for port_name in results:
96+
idx = snmp_port_map[port_name]
97+
port_snmp = snmp_facts['snmp_interfaces'][idx]
8798
unique.append(port_snmp['ifindex'])
88-
if int(port_index) - 1 != int(port_snmp['ifindex']):
99+
if int(idx) - 1 != int(port_snmp['ifindex']):
89100
results[port_name].update({'ifindex': port_snmp['ifindex']})
90101
if len(unique) != len(set(unique)):
91102
pytest.fail("Ifindex MIB values are not unique {}".format(unique))
@@ -100,8 +111,10 @@ def verify_snmp_speed(facts, snmp_facts, results):
100111
:return: Updated dict with unequal snmp_facts
101112
"""
102113
speed, high_speed = "speed", "ifHighSpeed"
103-
for _, port_snmp in snmp_facts['snmp_interfaces'].items():
104-
port_name = port_snmp['name']
114+
snmp_port_map = { snmp_facts['snmp_interfaces'][idx]['name'] : idx for idx in snmp_facts['snmp_interfaces'] }
115+
for port_name in results:
116+
idx = snmp_port_map[port_name]
117+
port_snmp = snmp_facts['snmp_interfaces'][idx]
105118
if port_name.startswith('Eth'):
106119
speed_to_bps = facts[port_name][speed] * 1000000
107120
if speed_to_bps > int(port_snmp[speed]):
@@ -159,14 +172,31 @@ def test_snmp_mgmt_interface(localhost, creds_all_duts, duthosts, enum_rand_one_
159172
for name in config_facts.get('MGMT_INTERFACE', {}):
160173
assert name in snmp_ifnames, "Management Interface not found in SNMP facts."
161174

162-
def test_snmp_interfaces_mibs(duthosts, enum_rand_one_per_hwsku_hostname, localhost, creds_all_duts):
175+
# TODO: Remove this check after operational status of mgmt interface
176+
# is implemented for multi-asic platform
177+
if duthost.num_asics() == 1:
178+
ports_list = []
179+
ports_list.extend(config_facts.get('MGMT_INTERFACE', {}).keys())
180+
dut_facts = collect_all_facts(duthost, ports_list)
181+
ports_snmps = verify_port_snmp(dut_facts, snmp_facts)
182+
speed_snmp = verify_snmp_speed(dut_facts, snmp_facts, ports_snmps)
183+
result = verify_port_ifindex(snmp_facts, speed_snmp)
184+
pytest_assert(not result, "Unexpected comparsion of SNMP: {}".format(result))
185+
186+
def test_snmp_interfaces_mibs(duthosts, enum_rand_one_per_hwsku_hostname, localhost, creds_all_duts, enum_asic_index):
163187
"""Verify correct behaviour of port MIBs ifIndex, ifMtu, ifSpeed,
164188
ifAdminStatus, ifOperStatus, ifAlias, ifHighSpeed, ifType """
165189
duthost = duthosts[enum_rand_one_per_hwsku_hostname]
190+
namespace = duthost.get_namespace_from_asic_id(enum_asic_index)
166191
hostip = duthost.host.options['inventory_manager'].get_host(duthost.hostname).vars['ansible_host']
167192
snmp_facts = localhost.snmp_facts(host=hostip, version="v2c", community=creds_all_duts[duthost]["snmp_rocommunity"])['ansible_facts']
193+
config_facts = duthost.config_facts(host=duthost.hostname, source="persistent", namespace=namespace)['ansible_facts']
194+
195+
ports_list = []
196+
for i in ['port_name_to_alias_map', 'PORTCHANNEL']:
197+
ports_list.extend(config_facts.get(i, {}).keys())
168198

169-
dut_facts = collect_all_facts(duthost)
199+
dut_facts = collect_all_facts(duthost, ports_list, namespace)
170200
ports_snmps = verify_port_snmp(dut_facts, snmp_facts)
171201
speed_snmp = verify_snmp_speed(dut_facts, snmp_facts, ports_snmps)
172202
result = verify_port_ifindex(snmp_facts, speed_snmp)

0 commit comments

Comments
 (0)