Skip to content

Commit f507630

Browse files
authored
Check low power mode before vdm handling (#653)
* Check lp mode before vdm handling. * Check lp mode before vdm handling. * Add unit tests. * Fix failing unit tests. * Get platform independent method to get lpmode * Update test.
1 parent 290de20 commit f507630

File tree

3 files changed

+37
-1
lines changed

3 files changed

+37
-1
lines changed

sonic-xcvrd/tests/test_xcvrd.py

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3673,6 +3673,7 @@ def test_DomInfoUpdateTask_task_worker(self, mock_post_pm_info,
36733673
task.status_db_utils.post_port_transceiver_hw_status_to_db = MagicMock()
36743674
task.status_db_utils.post_port_transceiver_hw_status_flags_to_db = MagicMock()
36753675
task.vdm_utils.is_transceiver_vdm_supported = MagicMock(return_value=True)
3676+
task.xcvrd_utils.is_transceiver_lpmode_on = MagicMock(return_value=False)
36763677
task.vdm_db_utils = MagicMock()
36773678
task.vdm_db_utils.post_port_vdm_real_values_to_db = MagicMock()
36783679
task.task_worker()
@@ -3737,6 +3738,7 @@ def test_DomInfoUpdateTask_task_worker_vdm_failure(self, mock_post_pm_info):
37373738
task.vdm_utils._unfreeze_vdm_stats_and_confirm = MagicMock(return_value=True)
37383739
task.vdm_db_utils.post_port_vdm_real_values_to_db = MagicMock()
37393740
task.vdm_db_utils.post_port_vdm_flags_to_db = MagicMock()
3741+
task.xcvrd_utils.is_transceiver_lpmode_on = MagicMock(return_value=False)
37403742
task.task_worker()
37413743
assert task.vdm_utils._unfreeze_vdm_stats_and_confirm.call_count == 1
37423744
assert task.vdm_db_utils.post_port_vdm_real_values_to_db.call_count == 0
@@ -4698,6 +4700,33 @@ def test_is_transceiver_flat_memory(self):
46984700
mock_api.is_flat_memory = MagicMock(side_effect=NotImplementedError)
46994701
assert xcvrd_util.is_transceiver_flat_memory(1)
47004702

4703+
def test_is_transceiver_lpmode_on(self):
4704+
from xcvrd.xcvrd_utilities.utils import XCVRDUtils
4705+
mock_sfp = MagicMock()
4706+
xcvrd_util = XCVRDUtils({1: mock_sfp}, MagicMock())
4707+
4708+
# Test case where get_xcvr_api returns None
4709+
mock_sfp.get_lpmode = MagicMock(return_value=None)
4710+
assert not xcvrd_util.is_transceiver_lpmode_on(1)
4711+
4712+
# Test case where get_lpmode returns True
4713+
mock_sfp.get_lpmode = MagicMock(return_value=True)
4714+
assert xcvrd_util.is_transceiver_lpmode_on(1)
4715+
4716+
# Test case where get_lpmode returns False
4717+
4718+
mock_sfp.get_lpmode = MagicMock(return_value=False)
4719+
assert not xcvrd_util.is_transceiver_lpmode_on(1)
4720+
4721+
# Test case where get_xcvr_api raises KeyError
4722+
xcvrd_util.sfp_obj_dict = {}
4723+
assert not xcvrd_util.is_transceiver_lpmode_on(1)
4724+
4725+
# Test case where is_flat_memory raises NotImplementedError
4726+
xcvrd_util.sfp_obj_dict = {1: mock_sfp}
4727+
mock_sfp.get_lpmode = MagicMock(side_effect=NotImplementedError)
4728+
assert not xcvrd_util.is_transceiver_lpmode_on(1)
4729+
47014730
@patch('time.sleep', MagicMock())
47024731
@patch('xcvrd.xcvrd.XcvrTableHelper', MagicMock())
47034732
@patch('xcvrd.xcvrd._wrapper_soak_sfp_insert_event', MagicMock())

sonic-xcvrd/xcvrd/dom/dom_mgr.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -303,7 +303,7 @@ def task_worker(self):
303303
self.log_warning("Got exception {} while processing transceiver status hw flags for "
304304
"port {}, ignored".format(repr(e), logical_port_name))
305305
continue
306-
if self.vdm_utils.is_transceiver_vdm_supported(physical_port):
306+
if self.vdm_utils.is_transceiver_vdm_supported(physical_port) and (not self.xcvrd_utils.is_transceiver_lpmode_on(physical_port)):
307307
# Freeze VDM stats before reading VDM values
308308
with self.vdm_utils.vdm_freeze_context(physical_port) as vdm_frozen:
309309
if not vdm_frozen:

sonic-xcvrd/xcvrd/xcvrd_utilities/utils.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,3 +23,10 @@ def is_transceiver_flat_memory(self, physical_port):
2323
except (KeyError, NotImplementedError):
2424
self.logger.log_error(f"Failed to check flat memory for port {physical_port}")
2525
return True
26+
27+
def is_transceiver_lpmode_on(self, physical_port):
28+
try:
29+
return self.sfp_obj_dict[physical_port].get_lpmode()
30+
except Exception as e:
31+
self.logger.log_error(f"Failed to get low power mode for port {physical_port}. Exception: {e}")
32+
return False

0 commit comments

Comments
 (0)