Skip to content

Commit 6a3f0d6

Browse files
authored
Add new liquid cooling base object (#603)
Signed-off-by: Yuanzhe, Liu <[email protected]>
1 parent a615dbc commit 6a3f0d6

File tree

2 files changed

+150
-0
lines changed

2 files changed

+150
-0
lines changed
Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
"""
2+
liquid_cooling_base.py
3+
4+
Abstract base class for implementing a platform-specific class with which
5+
to interact with a liquid cooling module in SONiC
6+
"""
7+
8+
from . import device_base
9+
from .sensor_base import SensorBase
10+
import sys
11+
12+
class LeakageSensorBase(SensorBase):
13+
def __init__(self, name):
14+
self.name = name
15+
self.leaking = False
16+
17+
def get_name(self):
18+
"""
19+
Retrieves the name of the leakage sensor
20+
21+
Returns:
22+
tring: the name of the leakage sensor
23+
"""
24+
return self.name
25+
26+
def is_leak(self):
27+
"""
28+
Retrieves the leak status of the sensor
29+
30+
Returns:
31+
bool: True if leak is detected, False if not
32+
"""
33+
return self.leaking
34+
35+
class LiquidCoolingBase(device_base.DeviceBase):
36+
"""
37+
Base class for implementing liquid cooling system
38+
"""
39+
40+
def __init__(self, leakage_sensors_num = 0, leakage_sensors_list = None):
41+
self.leakage_sensors_num = leakage_sensors_num
42+
self.leakage_sensors = leakage_sensors_list if leakage_sensors_list else []
43+
44+
def get_num_leak_sensors(self):
45+
"""
46+
Retrieves the number of leakage sensors
47+
48+
Returns:
49+
int: The number of leakage sensors
50+
"""
51+
return self.leakage_sensors_num
52+
53+
def get_leak_sensor(self, index):
54+
"""
55+
Retrieves the leakage sensor by index
56+
"""
57+
sensor = None
58+
59+
try:
60+
sensor = self.leakage_sensors[index]
61+
except IndexError:
62+
sys.stderr.write("Leakage sensor index {} out of range (0-{})\n".format(
63+
index, len(self.leakage_sensors)-1))
64+
65+
return sensor
66+
67+
def get_all_leak_sensors(self):
68+
"""
69+
Retrieves the list of leakage sensors
70+
71+
Returns:
72+
list: A list of leakage sensor names
73+
"""
74+
return self.leakage_sensors
75+
76+
def get_leak_sensor_status(self):
77+
"""
78+
Retrieves the leak status of the sensors
79+
80+
Returns:
81+
list: A list of leakage sensor names that are leaking, empty list if no leakage
82+
"""
83+
leaking_sensors = []
84+
for sensor in self.leakage_sensors:
85+
if sensor.is_leak():
86+
leaking_sensors.append(sensor)
87+
return leaking_sensors
88+

tests/liquid_cooling_base_test.py

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
'''
2+
Test liquid_cooling_base module
3+
'''
4+
import unittest
5+
import sys
6+
from io import StringIO
7+
from sonic_platform_base.liquid_cooling_base import LeakageSensorBase
8+
from sonic_platform_base.liquid_cooling_base import LiquidCoolingBase
9+
10+
class TestLeakageSensorBase:
11+
'''
12+
Collection of LeakageSensorBase test methods
13+
'''
14+
15+
@staticmethod
16+
def test_leakage_sensor_base_init():
17+
'''
18+
Test leakage sensor base default implementation
19+
'''
20+
leakage_sensor = LeakageSensorBase("test_sensor")
21+
22+
assert leakage_sensor.get_name() == "test_sensor"
23+
assert leakage_sensor.is_leak() == False
24+
25+
class TestLiquidCoolingBase():
26+
'''
27+
Collection of LiquidCoolingBase test methods
28+
'''
29+
30+
@staticmethod
31+
def test_liquid_cooling_base_init():
32+
'''
33+
Test liquid cooling base default implementation
34+
'''
35+
liquid_cooling = LiquidCoolingBase()
36+
37+
assert liquid_cooling.get_num_leak_sensors() == 0
38+
assert liquid_cooling.get_all_leak_sensors() == []
39+
assert liquid_cooling.get_leak_sensor_status() == []
40+
41+
@staticmethod
42+
def test_get_leak_sensor_out_of_range():
43+
'''
44+
Test get_leak_sensor method with an out-of-range index
45+
'''
46+
liquid_cooling = LiquidCoolingBase()
47+
liquid_cooling.leakage_sensors = [LeakageSensorBase("Sensor1"),
48+
LeakageSensorBase("Sensor2"),
49+
LeakageSensorBase("Sensor3")]
50+
51+
# Redirect stderr to capture error message
52+
captured_output = StringIO()
53+
sys.stderr = captured_output
54+
55+
# Call get_leak_sensor and check the return value
56+
sensor = liquid_cooling.get_leak_sensor(5)
57+
assert sensor == None
58+
59+
captured_output.seek(0)
60+
error_message = captured_output.read()
61+
assert "Leakage sensor index 5 out of range (0-2)" in error_message
62+

0 commit comments

Comments
 (0)