Skip to content

Commit d513eca

Browse files
authored
Added support for file system based sensors implementation. (#438)
* Added support for file system based sensors implementation. * Fixed UT * Fixed UT coverage
1 parent 04b0f88 commit d513eca

File tree

3 files changed

+76
-29
lines changed

3 files changed

+76
-29
lines changed

sonic-sensormond/scripts/sensormond

+36-8
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,12 @@ import signal
99
import sys
1010
import threading
1111
import time
12+
import yaml
1213

1314
import sonic_platform
14-
from sonic_py_common import daemon_base, logger
15+
from sonic_py_common import daemon_base, logger, device_info
1516
from swsscommon import swsscommon
17+
from sonic_platform_base.sensor_fs import VoltageSensorFs, CurrentSensorFs
1618

1719

1820
SYSLOG_IDENTIFIER = 'sensormond'
@@ -175,7 +177,7 @@ class VoltageUpdater(SensorUpdater):
175177
# Voltage information table name in database
176178
VOLTAGE_INFO_TABLE_NAME = 'VOLTAGE_INFO'
177179

178-
def __init__(self, chassis):
180+
def __init__(self, chassis, fs_sensors):
179181
'''
180182
Initializer of VoltageUpdater
181183
:param chassis: Object representing a platform chassis
@@ -187,14 +189,18 @@ class VoltageUpdater(SensorUpdater):
187189
if self.is_chassis_system:
188190
self.module_voltage_sensors = set()
189191

192+
self.fs_sensors = fs_sensors
193+
190194
def update(self):
191195
'''
192196
Update all voltage information to database
193197
:return:
194198
'''
195199
self.log_debug("Start voltage update")
196-
for index, voltage_sensor in enumerate(self.chassis.get_all_voltage_sensors()):
197200

201+
sensor_list = self.fs_sensors + self.chassis.get_all_voltage_sensors()
202+
203+
for index, voltage_sensor in enumerate(sensor_list):
198204
self._refresh_voltage_status(CHASSIS_INFO_KEY, voltage_sensor, index)
199205

200206
if self.is_chassis_system:
@@ -303,7 +309,7 @@ class CurrentUpdater(SensorUpdater):
303309
# Current information table name in database
304310
CURRENT_INFO_TABLE_NAME = 'CURRENT_INFO'
305311

306-
def __init__(self, chassis):
312+
def __init__(self, chassis, fs_sensors):
307313
'''
308314
Initializer of CurrentUpdater
309315
:param chassis: Object representing a platform chassis
@@ -314,14 +320,18 @@ class CurrentUpdater(SensorUpdater):
314320
if self.is_chassis_system:
315321
self.module_current_sensors = set()
316322

323+
self.fs_sensors = fs_sensors
324+
317325
def update(self):
318326
'''
319327
Update all current information to database
320328
:return:
321329
'''
322330
self.log_debug("Start current updating")
323-
for index, current_sensor in enumerate(self.chassis.get_all_current_sensors()):
324331

332+
sensor_list = self.fs_sensors + self.chassis.get_all_current_sensors()
333+
334+
for index, current_sensor in enumerate(sensor_list):
325335
self._refresh_current_status(CHASSIS_INFO_KEY, current_sensor, index)
326336

327337
if self.is_chassis_system:
@@ -450,14 +460,32 @@ class SensorMonitorDaemon(daemon_base.DaemonBase):
450460

451461
self.interval = self.UPDATE_INTERVAL
452462

463+
self._voltage_sensor_fs = []
464+
self._current_sensor_fs = []
465+
453466
try:
454467
self.chassis = sonic_platform.platform.Platform().get_chassis()
455468
except Exception as e:
456469
self.log_error("Failed to get chassis info, err: {}".format(repr(e)))
457470

458-
self.voltage_updater = VoltageUpdater(self.chassis)
471+
# Initialize voltage and current sensors lists from data file if available
472+
try:
473+
(platform_path, _) = device_info.get_paths_to_platform_and_hwsku_dirs()
474+
self.sensors_yaml_file = platform_path + "/sensors.yaml"
475+
476+
with open(self.sensors_yaml_file, 'r') as f:
477+
sensors_data = yaml.safe_load(f)
478+
if 'voltage_sensors' in sensors_data:
479+
self._voltage_sensor_fs = VoltageSensorFs.factory(VoltageSensorFs, sensors_data['voltage_sensors'])
480+
if 'current_sensors' in sensors_data:
481+
self._current_sensor_fs = CurrentSensorFs.factory(CurrentSensorFs, sensors_data['current_sensors'])
482+
except:
483+
# Sensors yaml file is not available
484+
pass
485+
486+
self.voltage_updater = VoltageUpdater(self.chassis, self._voltage_sensor_fs)
459487

460-
self.current_updater = CurrentUpdater(self.chassis)
488+
self.current_updater = CurrentUpdater(self.chassis, self._current_sensor_fs)
461489

462490

463491
# Override signal handler from DaemonBase
@@ -504,7 +532,7 @@ class SensorMonitorDaemon(daemon_base.DaemonBase):
504532
self.wait_time = self.INITIAL_INTERVAL
505533

506534
if elapsed > self.UPDATE_ELAPSED_THRESHOLD:
507-
self.logger.log_warning('Sensors update took a long time : '
535+
self.log_warning('Sensors update took a long time : '
508536
'{} seconds'.format(elapsed))
509537

510538
return True

sonic-sensormond/tests/sensors.yaml

+18
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
voltage_sensors:
2+
- name : VSENSOR1
3+
sensor: 'sensor_data/VSENSOR1'
4+
high_thresholds: [ 1000, 1050, 1080 ]
5+
low_thresholds: [ 800, 850, 890 ]
6+
- name : VSENSOR2
7+
sensor: 'sensor_data/VSENSOR2'
8+
high_thresholds: [ 800, 850, 870 ]
9+
low_thresholds: [ 600, 620, 750 ]
10+
current_sensors:
11+
- name : CSENSOR1
12+
sensor: 'sensor_data/CSENSOR1'
13+
high_thresholds: [ 1000, 1050, 1080 ]
14+
low_thresholds: [ 800, 850, 890 ]
15+
- name : CSENSOR2
16+
sensor: 'sensor_data/CSENSOR2'
17+
high_thresholds: [ 800, 850, 870 ]
18+
low_thresholds: [ 600, 620, 750 ]

sonic-sensormond/tests/test_sensormond.py

+22-21
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import os
22
import sys
3+
import yaml
34
import multiprocessing
45
from imp import load_source
56
from unittest import mock
@@ -106,7 +107,7 @@ class TestVoltageUpdater(object):
106107
"""
107108
def test_deinit(self):
108109
chassis = MockChassis()
109-
voltage_updater = sensormond.VoltageUpdater(chassis)
110+
voltage_updater = sensormond.VoltageUpdater(chassis, [])
110111
voltage_updater.voltage_status_dict = {'key1': 'value1', 'key2': 'value2'}
111112
voltage_updater.table = Table("STATE_DB", "xtable")
112113
voltage_updater.table._del = mock.MagicMock()
@@ -127,7 +128,7 @@ def test_deinit(self):
127128
def test_over_voltage(self):
128129
chassis = MockChassis()
129130
chassis.make_over_threshold_voltage_sensor()
130-
voltage_updater = sensormond.VoltageUpdater(chassis)
131+
voltage_updater = sensormond.VoltageUpdater(chassis, [])
131132
voltage_updater.update()
132133
voltage_sensor_list = chassis.get_all_voltage_sensors()
133134
assert voltage_updater.log_warning.call_count == 1
@@ -141,7 +142,7 @@ def test_over_voltage(self):
141142
def test_under_voltage(self):
142143
chassis = MockChassis()
143144
chassis.make_under_threshold_voltage_sensor()
144-
voltage_updater = sensormond.VoltageUpdater(chassis)
145+
voltage_updater = sensormond.VoltageUpdater(chassis, [])
145146
voltage_updater.update()
146147
voltage_sensor_list = chassis.get_all_voltage_sensors()
147148
assert voltage_updater.log_warning.call_count == 1
@@ -159,7 +160,7 @@ def test_update_voltage_sensor_with_exception(self):
159160
voltage_sensor.make_over_threshold()
160161
chassis.get_all_voltage_sensors().append(voltage_sensor)
161162

162-
voltage_updater = sensormond.VoltageUpdater(chassis)
163+
voltage_updater = sensormond.VoltageUpdater(chassis, [])
163164
voltage_updater.update()
164165
assert voltage_updater.log_warning.call_count == 2
165166

@@ -179,7 +180,7 @@ def test_update_module_voltage_sensors(self):
179180
chassis = MockChassis()
180181
chassis.make_module_voltage_sensor()
181182
chassis.set_modular_chassis(True)
182-
voltage_updater = sensormond.VoltageUpdater(chassis)
183+
voltage_updater = sensormond.VoltageUpdater(chassis, [])
183184
voltage_updater.update()
184185
assert len(voltage_updater.module_voltage_sensors) == 1
185186

@@ -194,7 +195,7 @@ class TestCurrentUpdater(object):
194195
"""
195196
def test_deinit(self):
196197
chassis = MockChassis()
197-
current_updater = sensormond.CurrentUpdater(chassis)
198+
current_updater = sensormond.CurrentUpdater(chassis, [])
198199
current_updater.current_status_dict = {'key1': 'value1', 'key2': 'value2'}
199200
current_updater.table = Table("STATE_DB", "xtable")
200201
current_updater.table._del = mock.MagicMock()
@@ -215,7 +216,7 @@ def test_deinit(self):
215216
def test_over_current(self):
216217
chassis = MockChassis()
217218
chassis.make_over_threshold_current_sensor()
218-
current_updater = sensormond.CurrentUpdater(chassis)
219+
current_updater = sensormond.CurrentUpdater(chassis, [])
219220
current_updater.update()
220221
current_sensor_list = chassis.get_all_current_sensors()
221222
assert current_updater.log_warning.call_count == 1
@@ -229,7 +230,7 @@ def test_over_current(self):
229230
def test_under_current(self):
230231
chassis = MockChassis()
231232
chassis.make_under_threshold_current_sensor()
232-
current_updater = sensormond.CurrentUpdater(chassis)
233+
current_updater = sensormond.CurrentUpdater(chassis, [])
233234
current_updater.update()
234235
current_sensor_list = chassis.get_all_current_sensors()
235236
assert current_updater.log_warning.call_count == 1
@@ -247,7 +248,7 @@ def test_update_current_sensor_with_exception(self):
247248
current_sensor.make_over_threshold()
248249
chassis.get_all_current_sensors().append(current_sensor)
249250

250-
current_updater = sensormond.CurrentUpdater(chassis)
251+
current_updater = sensormond.CurrentUpdater(chassis, [])
251252
current_updater.update()
252253
assert current_updater.log_warning.call_count == 2
253254

@@ -267,7 +268,7 @@ def test_update_module_current_sensors(self):
267268
chassis = MockChassis()
268269
chassis.make_module_current_sensor()
269270
chassis.set_modular_chassis(True)
270-
current_updater = sensormond.CurrentUpdater(chassis)
271+
current_updater = sensormond.CurrentUpdater(chassis, [])
271272
current_updater.update()
272273
assert len(current_updater.module_current_sensors) == 1
273274

@@ -282,17 +283,17 @@ def test_updater_voltage_sensor_check_modular_chassis():
282283
chassis = MockChassis()
283284
assert chassis.is_modular_chassis() == False
284285

285-
voltage_updater = sensormond.VoltageUpdater(chassis)
286+
voltage_updater = sensormond.VoltageUpdater(chassis, [])
286287
assert voltage_updater.chassis_table == None
287288

288289
chassis.set_modular_chassis(True)
289290
chassis.set_my_slot(-1)
290-
voltage_updater = sensormond.VoltageUpdater(chassis)
291+
voltage_updater = sensormond.VoltageUpdater(chassis, [])
291292
assert voltage_updater.chassis_table == None
292293

293294
my_slot = 1
294295
chassis.set_my_slot(my_slot)
295-
voltage_updater = sensormond.VoltageUpdater(chassis)
296+
voltage_updater = sensormond.VoltageUpdater(chassis, [])
296297
assert voltage_updater.chassis_table != None
297298
assert voltage_updater.chassis_table.table_name == '{}_{}'.format(VOLTAGE_INFO_TABLE_NAME, str(my_slot))
298299

@@ -305,7 +306,7 @@ def test_updater_voltage_sensor_check_chassis_table():
305306

306307
chassis.set_modular_chassis(True)
307308
chassis.set_my_slot(1)
308-
voltage_updater = sensormond.VoltageUpdater(chassis)
309+
voltage_updater = sensormond.VoltageUpdater(chassis, [])
309310

310311
voltage_updater.update()
311312
assert voltage_updater.chassis_table.get_size() == chassis.get_num_voltage_sensors()
@@ -323,7 +324,7 @@ def test_updater_voltage_sensor_check_min_max():
323324

324325
chassis.set_modular_chassis(True)
325326
chassis.set_my_slot(1)
326-
voltage_updater = sensormond.VoltageUpdater(chassis)
327+
voltage_updater = sensormond.VoltageUpdater(chassis, [])
327328

328329
voltage_updater.update()
329330
slot_dict = voltage_updater.chassis_table.get(voltage_sensor.get_name())
@@ -335,17 +336,17 @@ def test_updater_current_sensor_check_modular_chassis():
335336
chassis = MockChassis()
336337
assert chassis.is_modular_chassis() == False
337338

338-
current_updater = sensormond.CurrentUpdater(chassis)
339+
current_updater = sensormond.CurrentUpdater(chassis, [])
339340
assert current_updater.chassis_table == None
340341

341342
chassis.set_modular_chassis(True)
342343
chassis.set_my_slot(-1)
343-
current_updater = sensormond.CurrentUpdater(chassis)
344+
current_updater = sensormond.CurrentUpdater(chassis, [])
344345
assert current_updater.chassis_table == None
345346

346347
my_slot = 1
347348
chassis.set_my_slot(my_slot)
348-
current_updater = sensormond.CurrentUpdater(chassis)
349+
current_updater = sensormond.CurrentUpdater(chassis, [])
349350
assert current_updater.chassis_table != None
350351
assert current_updater.chassis_table.table_name == '{}_{}'.format(CURRENT_INFO_TABLE_NAME, str(my_slot))
351352

@@ -358,7 +359,7 @@ def test_updater_current_sensor_check_chassis_table():
358359

359360
chassis.set_modular_chassis(True)
360361
chassis.set_my_slot(1)
361-
current_updater = sensormond.CurrentUpdater(chassis)
362+
current_updater = sensormond.CurrentUpdater(chassis, [])
362363

363364
current_updater.update()
364365
assert current_updater.chassis_table.get_size() == chassis.get_num_current_sensors()
@@ -377,7 +378,7 @@ def test_updater_current_sensor_check_min_max():
377378

378379
chassis.set_modular_chassis(True)
379380
chassis.set_my_slot(1)
380-
current_updater = sensormond.CurrentUpdater(chassis)
381+
current_updater = sensormond.CurrentUpdater(chassis, [])
381382

382383
current_updater.update()
383384
slot_dict = current_updater.chassis_table.get(current_sensor.get_name())
@@ -437,7 +438,7 @@ def test_signal_handler():
437438
assert daemon_sensormond.stop_event.set.call_count == 0
438439
assert sensormond.exit_code == 1
439440

440-
441+
@mock.patch('sonic_py_common.device_info.get_paths_to_platform_and_hwsku_dirs', mock.MagicMock(return_value=(tests_path, '')))
441442
def test_daemon_run():
442443

443444
import sonic_platform.platform

0 commit comments

Comments
 (0)