1+ #!/usr/bin/env python3
2+ #
3+ # Copyright (c) 2024, Nokia
4+ # All rights reserved.
5+
6+ import re
7+ import subprocess
8+ import time
9+ from swsscommon .swsscommon import SonicV2Connector
10+ from sonic_py_common .logger import Logger
11+ from platform_ndk import nokia_common
12+
13+ sfm_hw_slot_mapping = {
14+ 0 : 15 ,
15+ 1 : 16 ,
16+ 2 : 17 ,
17+ 3 : 18 ,
18+ 4 : 19 ,
19+ 5 : 20 ,
20+ 6 : 21 ,
21+ 7 : 22
22+ }
23+
24+ # Name: fabric_module_set_admin_status.py, version: 1.0
25+ # Syntax: fabric_module_set_admin_status <module_name> <up/down>
26+ def fabric_module_set_admin_status (module , state ):
27+ logger = Logger ("fabric_module_set_admin_status.py" )
28+ logger .set_min_log_priority_info ()
29+
30+ if not module .startswith ("FABRIC-CARD" ):
31+ logger .log_warning ("Failed to set {} state. Admin state can only be set on Fabric module." .format (module ))
32+ return
33+
34+ if (state != "up" and state != "down" ):
35+ logger .log_warning ("Failed to set {}. Admin state can only be set to up or down." .format (state ))
36+ return
37+
38+ num = int (re .search (r"(\d+)$" , module ).group ())
39+ chassisdb = SonicV2Connector (host = "127.0.0.1" )
40+ chassisdb .connect ("CHASSIS_STATE_DB" )
41+
42+ if state == "down" :
43+ services_list = chassisdb .keys ("CHASSIS_STATE_DB" , "CHASSIS_FABRIC_ASIC_TABLE*" )
44+ asic_list = []
45+ for service in services_list :
46+ name = chassisdb .get ("CHASSIS_STATE_DB" ,service ,"name" )
47+ if name == module :
48+ asic_id = int (re .search (r"(\d+)$" , service ).group ())
49+ asic_list .append (asic_id )
50+
51+ logger .log_info ("Shutting down chassis module {}" .format (module ))
52+
53+ for asic in asic_list :
54+ logger .log_info ("Stopping swss@{} and syncd@{} ..." .format (asic , asic ))
55+ process = subprocess .Popen (['sudo' , 'systemctl' , 'stop' , 'swss@{}.service' .format (asic )],
56+ stdout = subprocess .PIPE , stderr = subprocess .PIPE )
57+ stdout , stderr = process .communicate ()
58+ outstr = stdout .decode ('ascii' )
59+ # wait for service is down
60+ time .sleep (2 )
61+
62+ logger .log_info ("Power off {} module ..." .format (module ))
63+ hw_slot = sfm_hw_slot_mapping [num ]
64+ nokia_common ._power_onoff_SFM (hw_slot ,False )
65+ logger .log_info ("Chassis module {} shutdown completed" .format (module ))
66+ else :
67+ logger .log_info ("Starting up chassis module {}" .format (module ))
68+ hw_slot = sfm_hw_slot_mapping [num ]
69+ nokia_common ._power_onoff_SFM (hw_slot ,True )
70+ # wait SFM HW init done.
71+ time .sleep (15 )
72+
73+ services_list = chassisdb .keys ("CHASSIS_STATE_DB" , "CHASSIS_FABRIC_ASIC_TABLE*" )
74+ asic_list = []
75+ for service in services_list :
76+ name = chassisdb .get ("CHASSIS_STATE_DB" ,service ,"name" )
77+ if name == module :
78+ asic_id = int (re .search (r"(\d+)$" , service ).group ())
79+ asic_list .append (asic_id )
80+
81+ for asic in asic_list :
82+ logger .log_info ("Start swss@{} and syncd@{} ..." .format (asic , asic ))
83+ # Process state
84+ process = subprocess .Popen (['sudo' , 'systemctl' , 'start' , 'swss@{}.service' .format (asic )],
85+ stdout = subprocess .PIPE , stderr = subprocess .PIPE )
86+ stdout , stderr = process .communicate ()
87+ outstr = stdout .decode ('ascii' )
88+ logger .log_info ("Chassis module {} startup completed" .format (module ))
89+ return
0 commit comments