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