1- #!/usr/bin/env python2
1+ #!/usr/bin/env python3
22
33"""
44 psud
99 The loop interval is PSU_INFO_UPDATE_PERIOD_SECS in seconds.
1010"""
1111
12- try :
13- import os
14- import signal
15- import sys
16- import threading
17- from datetime import datetime
18- from sonic_py_common import daemon_base , logger
19-
20- # If unit testing is occurring, mock swsscommon and module_base
21- if os .getenv ("PSUD_UNIT_TESTING" ) == "1" :
22- from tests import mock_swsscommon as swsscommon
23- else :
24- from swsscommon import swsscommon
25- except ImportError as e :
26- raise ImportError ( str ( e ) + " - required module not found" )
12+ import os
13+ import signal
14+ import sys
15+ import threading
16+ from datetime import datetime
17+
18+ from sonic_py_common import daemon_base , logger
19+
20+ # If unit testing is occurring, mock swsscommon and module_base
21+ if os .getenv ("PSUD_UNIT_TESTING" ) == "1" :
22+ from tests . mock_platform import MockPsu as Psu
23+ from tests import mock_swsscommon as swsscommon
24+ else :
25+ from sonic_platform . psu import Psu
26+ from swsscommon import swsscommon
2727
2828
2929#
3030# Constants ====================================================================
3131#
3232
33+ # TODO: Once we no longer support Python 2, we can eliminate this and get the
34+ # name using the 'name' field (e.g., `signal.SIGINT.name`) starting with Python 3.5
35+ SIGNALS_TO_NAMES_DICT = dict ((getattr (signal , n ), n ) \
36+ for n in dir (signal ) if n .startswith ('SIG' ) and '_' not in n )
37+
3338SYSLOG_IDENTIFIER = "psud"
3439
3540PLATFORM_SPECIFIC_MODULE_NAME = "psuutil"
@@ -91,7 +96,7 @@ def _wrapper_get_num_psus():
9196 return platform_psuutil .get_num_psus ()
9297
9398
94- def _wrapper_get_psus_presence (psu_index ):
99+ def _wrapper_get_psu_presence (psu_index ):
95100 if platform_chassis is not None :
96101 try :
97102 return platform_chassis .get_psu (psu_index - 1 ).get_presence ()
@@ -100,7 +105,7 @@ def _wrapper_get_psus_presence(psu_index):
100105 return platform_psuutil .get_psu_presence (psu_index )
101106
102107
103- def _wrapper_get_psus_status (psu_index ):
108+ def _wrapper_get_psu_status (psu_index ):
104109 if platform_chassis is not None :
105110 try :
106111 return platform_chassis .get_psu (psu_index - 1 ).get_powergood_status ()
@@ -120,9 +125,9 @@ def get_psu_key(psu_index):
120125def psu_db_update (psu_tbl , psu_num ):
121126 for psu_index in range (1 , psu_num + 1 ):
122127 fvs = swsscommon .FieldValuePairs ([(PSU_INFO_PRESENCE_FIELD ,
123- 'true' if _wrapper_get_psus_presence (psu_index ) else 'false' ),
128+ 'true' if _wrapper_get_psu_presence (psu_index ) else 'false' ),
124129 (PSU_INFO_STATUS_FIELD ,
125- 'true' if _wrapper_get_psus_status (psu_index ) else 'false' )])
130+ 'true' if _wrapper_get_psu_status (psu_index ) else 'false' )])
126131 psu_tbl .set (get_psu_key (psu_index ), fvs )
127132
128133
@@ -251,22 +256,20 @@ class PsuChassisInfo(logger.Logger):
251256
252257 self .master_status_good = master_status_good
253258
254- return True
255-
256- def _set_psu_master_led (self , master_status ):
259+ # Update the PSU master status LED
257260 try :
258- try :
259- if os .getenv ("PSUD_UNIT_TESTING" ) == "1" :
260- from tests .mock_platform import MockPsu as Psu
261- else :
262- from sonic_platform .psu import Psu
263- except ImportError as e :
264- raise ImportError (str (e ) + " - required module not found" )
265-
266- color = Psu .STATUS_LED_COLOR_GREEN if master_status else Psu .STATUS_LED_COLOR_RED
261+ color = Psu .STATUS_LED_COLOR_GREEN if master_status_good else Psu .STATUS_LED_COLOR_RED
267262 Psu .set_status_master_led (color )
268- except NotImplementedError as e :
269- pass
263+ except NotImplementedError :
264+ self .log_warning ("set_status_master_led() not implemented" )
265+
266+ log_on_status_changed (self , self .master_status_good ,
267+ 'PSU supplied power warning cleared: supplied power is back to normal.' ,
268+ 'PSU supplied power warning: {}W supplied-power less than {}W consumed-power' .format (
269+ self .total_supplied_power , self .total_consumed_power )
270+ )
271+
272+ return True
270273
271274# PSU status ===================================================================
272275#
@@ -365,7 +368,7 @@ class DaemonPsud(daemon_base.DaemonBase):
365368 self .log_info ("Caught SIGTERM - exiting..." )
366369 self .stop .set ()
367370 else :
368- self .log_warning ("Caught unhandled signal '" + sig + "'" )
371+ self .log_warning ("Caught unhandled signal '{}'" . format ( SIGNALS_TO_NAMES_DICT [ sig ]) )
369372
370373 # Run daemon
371374 def run (self ):
@@ -410,9 +413,8 @@ class DaemonPsud(daemon_base.DaemonBase):
410413 self .update_psu_data (psu_tbl )
411414 self ._update_led_color (psu_tbl )
412415
413- if platform_chassis is not None and platform_chassis .is_modular_chassis ():
416+ if platform_chassis and platform_chassis .is_modular_chassis ():
414417 self .update_psu_chassis_info (chassis_tbl )
415- self .update_master_led_color (chassis_tbl )
416418
417419 self .first_run = False
418420
@@ -439,7 +441,7 @@ class DaemonPsud(daemon_base.DaemonBase):
439441
440442 def _update_single_psu_data (self , index , psu , psu_tbl ):
441443 name = get_psu_key (index )
442- presence = _wrapper_get_psus_presence (index )
444+ presence = _wrapper_get_psu_presence (index )
443445 power_good = False
444446 voltage = None
445447 voltage_high_threshold = None
@@ -450,7 +452,7 @@ class DaemonPsud(daemon_base.DaemonBase):
450452 power = None
451453 is_replaceable = try_get (psu .is_replaceable , False )
452454 if presence :
453- power_good = _wrapper_get_psus_status (index )
455+ power_good = _wrapper_get_psu_status (index )
454456 voltage = try_get (psu .get_voltage )
455457 voltage_high_threshold = try_get (psu .get_voltage_high_threshold )
456458 voltage_low_threshold = try_get (psu .get_voltage_low_threshold )
@@ -542,17 +544,17 @@ class DaemonPsud(daemon_base.DaemonBase):
542544 :return:
543545 """
544546 psu_name = get_psu_key (psu_index )
545- presence = _wrapper_get_psus_presence (psu_index )
547+ presence = _wrapper_get_psu_presence (psu_index )
546548 fan_list = psu .get_all_fans ()
547549 for index , fan in enumerate (fan_list ):
548550 fan_name = try_get (fan .get_name , '{} FAN {}' .format (psu_name , index + 1 ))
549- direction = try_get (fan .get_direction ) if presence else NOT_AVAILABLE
550- speed = try_get (fan .get_speed ) if presence else NOT_AVAILABLE
551+ direction = try_get (fan .get_direction , NOT_AVAILABLE ) if presence else NOT_AVAILABLE
552+ speed = try_get (fan .get_speed , NOT_AVAILABLE ) if presence else NOT_AVAILABLE
551553 status = "True" if presence else "False"
552554 fvs = swsscommon .FieldValuePairs (
553555 [(FAN_INFO_PRESENCE_FIELD , str (presence )),
554- (FAN_INFO_STATUS_FIELD , str ( status ) ),
555- (FAN_INFO_DIRECTION_FIELD , str ( direction ) ),
556+ (FAN_INFO_STATUS_FIELD , status ),
557+ (FAN_INFO_DIRECTION_FIELD , direction ),
556558 (FAN_INFO_SPEED_FIELD , str (speed )),
557559 (FAN_INFO_TIMESTAMP_FIELD , datetime .now ().strftime ('%Y%m%d %H:%M:%S' ))
558560 ])
@@ -562,22 +564,16 @@ class DaemonPsud(daemon_base.DaemonBase):
562564 try :
563565 color = psu .STATUS_LED_COLOR_GREEN if psu_status .is_ok () else psu .STATUS_LED_COLOR_RED
564566 psu .set_status_led (color )
565- except NotImplementedError as e :
566- pass
567+ except NotImplementedError :
568+ self . log_warning ( "set_status_led() not implemented" )
567569
568570 def _update_led_color (self , psu_tbl ):
569571 if not platform_chassis :
570572 return
571573
572574 for index , psu_status in self .psu_status_dict .items ():
573- try :
574- fvs = swsscommon .FieldValuePairs ([
575- ('led_status' , str (try_get (psu_status .psu .get_status_led )))
576- ])
577- except Exception as e :
578- self .log_warning ('Failed to get led status for psu {}' .format (index ))
579- fvs = swsscommon .FieldValuePairs ([
580- ('led_status' , NOT_AVAILABLE )
575+ fvs = swsscommon .FieldValuePairs ([
576+ ('led_status' , str (try_get (psu_status .psu .get_status_led , NOT_AVAILABLE )))
581577 ])
582578 psu_tbl .set (get_psu_key (index ), fvs )
583579 self ._update_psu_fan_led_status (psu_status .psu , index )
@@ -587,15 +583,9 @@ class DaemonPsud(daemon_base.DaemonBase):
587583 fan_list = psu .get_all_fans ()
588584 for index , fan in enumerate (fan_list ):
589585 fan_name = try_get (fan .get_name , '{} FAN {}' .format (psu_name , index + 1 ))
590- try :
591- fvs = swsscommon .FieldValuePairs ([
592- (FAN_INFO_LED_STATUS_FIELD , str (try_get (fan .get_status_led )))
593- ])
594- except Exception as e :
595- self .log_warning ('Failed to get led status for fan {}' .format (fan_name ))
596- fvs = swsscommon .FieldValuePairs ([
597- (FAN_INFO_LED_STATUS_FIELD , NOT_AVAILABLE )
598- ])
586+ fvs = swsscommon .FieldValuePairs ([
587+ (FAN_INFO_LED_STATUS_FIELD , str (try_get (fan .get_status_led , NOT_AVAILABLE )))
588+ ])
599589 self .fan_tbl .set (fan_name , fvs )
600590
601591 def update_psu_chassis_info (self , chassis_tbl ):
@@ -606,25 +596,14 @@ class DaemonPsud(daemon_base.DaemonBase):
606596 self .psu_chassis_info = PsuChassisInfo (SYSLOG_IDENTIFIER , platform_chassis )
607597
608598 self .psu_chassis_info .run_power_budget (chassis_tbl )
609-
610- def update_master_led_color (self , chassis_tbl ):
611- if not platform_chassis or not self .psu_chassis_info :
612- return
613-
614- psu_chassis_info = self .psu_chassis_info
615- if psu_chassis_info .update_master_status ():
616- log_on_status_changed (self , psu_chassis_info .master_status_good ,
617- 'PSU supplied power warning cleared: supplied power is back to normal.' ,
618- 'PSU supplied power warning: {}W supplied-power less than {}W consumed-power' .format (
619- psu_chassis_info .total_supplied_power , psu_chassis_info .total_consumed_power )
620- )
621- psu_chassis_info ._set_psu_master_led (psu_chassis_info .master_status_good )
599+ self .psu_chassis_info .update_master_status ()
622600
623601
624602#
625603# Main =========================================================================
626604#
627605
606+
628607def main ():
629608 psud = DaemonPsud (SYSLOG_IDENTIFIER )
630609 psud .run ()
0 commit comments