7
7
]
8
8
9
9
10
- def collect_all_facts (duthost ):
10
+ def collect_all_facts (duthost , ports_list , namespace = None ):
11
11
"""
12
12
Collect all data needed for test per each port from DUT
13
13
:param duthost: DUT host object
14
14
:return: dict with data collected from DUT per each port
15
15
"""
16
16
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 )
23
24
24
25
for name in ports_list :
25
- key = 'ansible_{}' . format ( name )
26
+ key = name
26
27
# 6 stands for ethernet-csmacd and 161 stands for ieee8023adLag
27
28
if_type = '161' if name .startswith ("PortChannel" ) else '6'
28
29
if name .startswith ("Eth" ):
@@ -35,21 +36,27 @@ def collect_all_facts(duthost):
35
36
try :
36
37
admin = config_facts .get ('PORT' , {})[name ]['admin_status' ]
37
38
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' ]
39
40
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' ]
41
42
result [portname ].update ({'operstatus' : oper })
42
43
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' , '' )})
43
53
else :
54
+ key_word = "MGMT_PORT"
44
55
result .setdefault (name , {})
45
- key_word = "PORTCHANNEL" if name .startswith ("PortChannel" ) else 'MGMT_PORT'
46
56
result [name ].update ({'mtu' : str (setup [key ]['mtu' ])})
47
57
result [name ].update ({'type' : if_type })
48
58
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 )
53
60
result [name ].update ({'operstatus' : oper ['stdout' ]})
54
61
result [name ].update ({'description' : config_facts .get (key_word , {})[name ].get ('description' , '' )})
55
62
return result
@@ -62,12 +69,14 @@ def verify_port_snmp(facts, snmp_facts):
62
69
:return: Dict with unequal snmp_facts
63
70
"""
64
71
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 ]
67
77
compare = ['operstatus' , 'adminstatus' , 'mtu' , 'description' , 'type' ]
68
78
missed .setdefault (port_name , {})
69
79
for field in compare :
70
- # Skip MTU on mgmt port for now, due to not implemented in Sonic for mgmt port
71
80
if field == 'mtu' and port_name .startswith ('eth0' ):
72
81
continue
73
82
elif facts [port_name ][field ] != port_snmp [field ]:
@@ -82,10 +91,12 @@ def verify_port_ifindex(snmp_facts, results):
82
91
:return: dict with unequal snmp_facts per port
83
92
"""
84
93
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 ]
87
98
unique .append (port_snmp ['ifindex' ])
88
- if int (port_index ) - 1 != int (port_snmp ['ifindex' ]):
99
+ if int (idx ) - 1 != int (port_snmp ['ifindex' ]):
89
100
results [port_name ].update ({'ifindex' : port_snmp ['ifindex' ]})
90
101
if len (unique ) != len (set (unique )):
91
102
pytest .fail ("Ifindex MIB values are not unique {}" .format (unique ))
@@ -100,8 +111,10 @@ def verify_snmp_speed(facts, snmp_facts, results):
100
111
:return: Updated dict with unequal snmp_facts
101
112
"""
102
113
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 ]
105
118
if port_name .startswith ('Eth' ):
106
119
speed_to_bps = facts [port_name ][speed ] * 1000000
107
120
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_
159
172
for name in config_facts .get ('MGMT_INTERFACE' , {}):
160
173
assert name in snmp_ifnames , "Management Interface not found in SNMP facts."
161
174
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 ):
163
187
"""Verify correct behaviour of port MIBs ifIndex, ifMtu, ifSpeed,
164
188
ifAdminStatus, ifOperStatus, ifAlias, ifHighSpeed, ifType """
165
189
duthost = duthosts [enum_rand_one_per_hwsku_hostname ]
190
+ namespace = duthost .get_namespace_from_asic_id (enum_asic_index )
166
191
hostip = duthost .host .options ['inventory_manager' ].get_host (duthost .hostname ).vars ['ansible_host' ]
167
192
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 ())
168
198
169
- dut_facts = collect_all_facts (duthost )
199
+ dut_facts = collect_all_facts (duthost , ports_list , namespace )
170
200
ports_snmps = verify_port_snmp (dut_facts , snmp_facts )
171
201
speed_snmp = verify_snmp_speed (dut_facts , snmp_facts , ports_snmps )
172
202
result = verify_port_ifindex (snmp_facts , speed_snmp )
0 commit comments