Skip to content

Commit 7d7c85e

Browse files
Modular chassis: Psud set master led on first run (sonic-net#206)
On first run, the PSU master-led on supervisor of modular-chassis is not set. Description The PSU master-led on modular chassis indicates the power-buget status. Similar to individual PSU leds that are set on first_run, the master-led also will be set to based on initial status (RED or GREEN with LED status ON). Motivation and Context Without the forced setting of first_run, the master-led status will default to per vendor default. In some cases, this could be amber blinking etc
1 parent 7195dcc commit 7d7c85e

File tree

2 files changed

+78
-22
lines changed

2 files changed

+78
-22
lines changed

sonic-psud/scripts/psud

+24-20
Original file line numberDiff line numberDiff line change
@@ -175,6 +175,7 @@ class PsuChassisInfo(logger.Logger):
175175
super(PsuChassisInfo, self).__init__(log_identifier)
176176

177177
self.chassis = chassis
178+
self.first_run = True
178179
self.master_status_good = True
179180
self.total_consumed_power = 0.0
180181
self.total_supplied_power = 0.0
@@ -242,30 +243,30 @@ class PsuChassisInfo(logger.Logger):
242243
chassis_tbl.set(CHASSIS_INFO_POWER_KEY_TEMPLATE.format(1), fvs)
243244

244245
def update_master_status(self):
245-
if not self.total_supplied_power or not self.total_consumed_power:
246-
if self.master_status_good is not True:
247-
self.master_status_good = True
248-
return False
249-
250-
master_status_good = (self.total_consumed_power < self.total_supplied_power)
251-
if master_status_good == self.master_status_good:
252-
return False
246+
set_led = self.first_run
247+
master_status_good = False
253248

254-
self.master_status_good = master_status_good
249+
if self.total_supplied_power != 0.0 and self.total_consumed_power != 0.0:
250+
master_status_good = (self.total_consumed_power < self.total_supplied_power)
251+
if master_status_good != self.master_status_good:
252+
set_led = True
255253

256-
# Update the PSU master status LED
257-
# set_status_master_led() is a class method implemented in PsuBase
258-
# so we do not need to catch NotImplementedError here
259-
color = Psu.STATUS_LED_COLOR_GREEN if master_status_good else Psu.STATUS_LED_COLOR_RED
260-
Psu.set_status_master_led(color)
254+
self.master_status_good = master_status_good
261255

262-
log_on_status_changed(self, self.master_status_good,
263-
'PSU supplied power warning cleared: supplied power is back to normal.',
264-
'PSU supplied power warning: {}W supplied-power less than {}W consumed-power'.format(
265-
self.total_supplied_power, self.total_consumed_power)
266-
)
256+
if set_led:
257+
# Update the PSU master status LED
258+
# set_status_master_led() is a class method implemented in PsuBase
259+
# so we do not need to catch NotImplementedError here
260+
color = Psu.STATUS_LED_COLOR_GREEN if master_status_good else Psu.STATUS_LED_COLOR_RED
261+
Psu.set_status_master_led(color)
262+
263+
log_on_status_changed(self, self.master_status_good,
264+
'PSU supplied power warning cleared: supplied power is back to normal.',
265+
'PSU supplied power warning: {}W supplied-power less than {}W consumed-power'.format(
266+
self.total_supplied_power, self.total_consumed_power)
267+
)
267268

268-
return True
269+
return set_led
269270

270271
# PSU status ===================================================================
271272
#
@@ -605,6 +606,9 @@ class DaemonPsud(daemon_base.DaemonBase):
605606
self.psu_chassis_info.run_power_budget(self.chassis_tbl)
606607
self.psu_chassis_info.update_master_status()
607608

609+
if self.first_run:
610+
self.first_run = False
611+
608612

609613
#
610614
# Main =========================================================================

sonic-psud/tests/test_PsuChassisInfo.py

+54-2
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,7 @@ def test_update_master_status(self):
6565
chassis = MockChassis()
6666
chassis_info = psud.PsuChassisInfo(SYSLOG_IDENTIFIER, chassis)
6767

68+
# With first_run set as True
6869
# Test good values while in bad state
6970
chassis_info.total_supplied_power = 510.0
7071
chassis_info.total_consumed_power = 350.0
@@ -75,13 +76,44 @@ def test_update_master_status(self):
7576

7677
# Test good values while in good state
7778
ret = chassis_info.update_master_status()
78-
assert ret == False
79+
assert ret == True
7980
assert chassis_info.master_status_good == True
8081

8182
# Test unknown total_supplied_power (0.0)
8283
chassis_info.total_supplied_power = 0.0
8384
chassis_info.master_status_good = False
8485
ret = chassis_info.update_master_status()
86+
assert ret == True
87+
assert chassis_info.master_status_good == False
88+
89+
# Test bad values while in good state
90+
chassis_info.total_supplied_power = 300.0
91+
chassis_info.total_consumed_power = 350.0
92+
chassis_info.master_status_good = True
93+
ret = chassis_info.update_master_status()
94+
assert ret == True
95+
assert chassis_info.master_status_good == False
96+
97+
# With first_run set as False
98+
chassis_info.first_run = False
99+
100+
# Test good values while in bad state
101+
chassis_info.total_supplied_power = 510.0
102+
chassis_info.total_consumed_power = 350.0
103+
chassis_info.master_status_good = False
104+
ret = chassis_info.update_master_status()
105+
assert ret == True
106+
assert chassis_info.master_status_good == True
107+
108+
# Test good values while in good state
109+
ret = chassis_info.update_master_status()
110+
assert ret == False
111+
assert chassis_info.master_status_good == True
112+
113+
# Test unknown total_supplied_power (0.0)
114+
chassis_info.total_supplied_power = 0.0
115+
chassis_info.master_status_good = True
116+
ret = chassis_info.update_master_status()
85117
assert ret == False
86118
assert chassis_info.master_status_good == True
87119

@@ -91,7 +123,7 @@ def test_update_master_status(self):
91123
chassis_info.master_status_good = False
92124
ret = chassis_info.update_master_status()
93125
assert ret == False
94-
assert chassis_info.master_status_good == True
126+
assert chassis_info.master_status_good == False
95127

96128
# Test bad values while in good state
97129
chassis_info.total_supplied_power = 300.0
@@ -106,6 +138,7 @@ def test_update_master_status(self):
106138
assert ret == False
107139
assert chassis_info.master_status_good == False
108140

141+
109142
def test_supplied_power(self):
110143
chassis = MockChassis()
111144
psu1 = MockPsu("PSU 1", 0, True, True)
@@ -204,6 +237,7 @@ def test_power_budget(self):
204237
state_db = daemon_base.db_connect("STATE_DB")
205238
chassis_tbl = mock_swsscommon.Table(state_db, CHASSIS_INFO_TABLE)
206239
chassis_info = psud.PsuChassisInfo(SYSLOG_IDENTIFIER, chassis)
240+
chassis_info.first_run = False
207241

208242
# Check case where supplied_power < consumed_power
209243
chassis_info.run_power_budget(chassis_tbl)
@@ -237,6 +271,24 @@ def test_power_budget(self):
237271
# so we must call it on the class there.
238272
assert psud.Psu.get_status_master_led() == MockPsu.STATUS_LED_COLOR_GREEN
239273

274+
def test_first_run(self):
275+
chassis = MockChassis()
276+
chassis_info = psud.PsuChassisInfo(SYSLOG_IDENTIFIER, chassis)
277+
278+
chassis_info.total_supplied_power = 0.0
279+
chassis_info.total_consumed_power = 350.0
280+
chassis_info.master_status_good = False
281+
ret = chassis_info.update_master_status()
282+
assert ret == True
283+
assert psud.Psu.get_status_master_led() == MockPsu.STATUS_LED_COLOR_RED
284+
285+
chassis_info.total_supplied_power = 510.0
286+
chassis_info.total_consumed_power = 350.0
287+
chassis_info.master_status_good = True
288+
ret = chassis_info.update_master_status()
289+
assert ret == True
290+
assert psud.Psu.get_status_master_led() == MockPsu.STATUS_LED_COLOR_GREEN
291+
240292
def test_get_psu_key(self):
241293
assert psud.get_psu_key(0) == psud.PSU_INFO_KEY_TEMPLATE.format(0)
242294
assert psud.get_psu_key(1) == psud.PSU_INFO_KEY_TEMPLATE.format(1)

0 commit comments

Comments
 (0)