Skip to content

Commit 7ae74d5

Browse files
authored
Skip setting lpmode of a xcvr if it's not supported (#697)
* Skip setting lpmode of a xcvr if it's not supported * Add test case
1 parent 011d949 commit 7ae74d5

File tree

2 files changed

+57
-11
lines changed

2 files changed

+57
-11
lines changed

sonic-xcvrd/tests/test_xcvrd.py

Lines changed: 47 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2241,9 +2241,10 @@ def test_SffManagerTask_enable_high_power_class(self):
22412241
assert mock_xcvr_api.get_power_class.call_count == 5
22422242
assert mock_xcvr_api.set_high_power_class.call_count == 1
22432243

2244+
@patch('xcvrd.xcvrd.helper_logger')
22442245
@patch('xcvrd.xcvrd.platform_chassis')
22452246
@patch('xcvrd.sff_mgr.PortChangeObserver', MagicMock(handle_port_update_event=MagicMock()))
2246-
def test_SffManagerTask_task_worker(self, mock_chassis):
2247+
def test_SffManagerTask_task_worker(self, mock_chassis, mock_logger):
22472248
mock_xcvr_api = MagicMock()
22482249
mock_xcvr_api.tx_disable_channel = MagicMock(return_value=True)
22492250
mock_xcvr_api.is_flat_memory = MagicMock(return_value=False)
@@ -2261,7 +2262,7 @@ def test_SffManagerTask_task_worker(self, mock_chassis):
22612262
task = SffManagerTask(DEFAULT_NAMESPACE,
22622263
threading.Event(),
22632264
mock_chassis,
2264-
helper_logger)
2265+
mock_logger)
22652266

22662267
# TX enable case:
22672268
port_change_event = PortChangeEvent('Ethernet0', 1, 0, PortChangeEvent.PORT_SET, {
@@ -2342,8 +2343,52 @@ def test_SffManagerTask_task_worker(self, mock_chassis):
23422343
task.task_worker()
23432344
assert mock_sfp.get_presence.call_count == 1
23442345
assert mock_xcvr_api.tx_disable_channel.call_count == 2
2346+
mock_logger.log_error.assert_called_once_with(
2347+
"SFF-MAIN: Ethernet0: module not present!")
23452348
mock_sfp.get_presence = MagicMock(return_value=True)
23462349

2350+
# lpmode setting case
2351+
# 1. error logged when lpmode is suppoted but unsuccessful
2352+
port_change_event = PortChangeEvent('Ethernet0', 1, 0, PortChangeEvent.PORT_SET,
2353+
{'type': 'QSFP28'})
2354+
task.on_port_update_event(port_change_event)
2355+
mock_xcvr_api.set_lpmode = MagicMock(return_value=False)
2356+
mock_xcvr_api.get_lpmode_support = MagicMock(return_value=True)
2357+
task.port_dict_prev = {}
2358+
task.task_stopping_event.is_set = MagicMock(side_effect=[False, False, True])
2359+
task.task_worker()
2360+
assert len(mock_logger.log_error.call_args_list) == 2
2361+
mock_logger.log_error.assert_called_with(
2362+
"SFF-MAIN: Ethernet0: Failed to take module out of low power mode.")
2363+
2364+
# 2. no error logged when lpmode is suppoted and successful
2365+
port_change_event = PortChangeEvent('Ethernet0', 1, 0, PortChangeEvent.PORT_SET,
2366+
{'type': 'QSFP28'})
2367+
task.on_port_update_event(port_change_event)
2368+
mock_xcvr_api.set_lpmode = MagicMock(return_value=True)
2369+
mock_xcvr_api.get_lpmode_support = MagicMock(return_value=True)
2370+
task.port_dict_prev = {}
2371+
task.task_stopping_event.is_set = MagicMock(side_effect=[False, False, True])
2372+
task.task_worker()
2373+
assert len(mock_logger.log_error.call_args_list) == 2
2374+
mock_logger.log_error.assert_called_with(
2375+
"SFF-MAIN: Ethernet0: Failed to take module out of low power mode.")
2376+
2377+
# 3. no error logged when lpmode is not suppoted
2378+
port_change_event = PortChangeEvent('Ethernet0', 1, 0, PortChangeEvent.PORT_SET,
2379+
{'type': 'QSFP28'})
2380+
task.on_port_update_event(port_change_event)
2381+
mock_xcvr_api.set_lpmode = MagicMock(return_value=False)
2382+
mock_xcvr_api.get_lpmode_support = MagicMock(return_value=False)
2383+
task.port_dict_prev = {}
2384+
task.task_stopping_event.is_set = MagicMock(side_effect=[False, False, True])
2385+
task.task_worker()
2386+
assert len(mock_logger.log_error.call_args_list) == 2
2387+
mock_logger.log_error.assert_called_with(
2388+
"SFF-MAIN: Ethernet0: Failed to take module out of low power mode.")
2389+
mock_xcvr_api.set_lpmode = MagicMock(return_value=True)
2390+
mock_xcvr_api.get_lpmode_support = MagicMock(return_value=True)
2391+
23472392
def test_CmisManagerTask_update_port_transceiver_status_table_sw_cmis_state(self):
23482393
port_mapping = PortMapping()
23492394
stop_event = threading.Event()

sonic-xcvrd/xcvrd/sff_mgr.py

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -478,16 +478,17 @@ def task_worker(self):
478478
if xcvr_inserted or (admin_status_changed and data[self.ADMIN_STATUS] == "up"):
479479
self.enable_high_power_class(api, lport)
480480

481-
set_lp_success = (
482-
sfp.set_lpmode(False)
483-
if isinstance(api, Sff8472Api)
484-
else api.set_lpmode(False)
485-
)
486-
if not set_lp_success:
487-
self.log_error(
488-
"{}: Failed to take module out of low power mode.".format(
489-
lport)
481+
if api.get_lpmode_support():
482+
set_lp_success = (
483+
sfp.set_lpmode(False)
484+
if isinstance(api, Sff8472Api)
485+
else api.set_lpmode(False)
490486
)
487+
if not set_lp_success:
488+
self.log_error(
489+
"{}: Failed to take module out of low power mode.".format(
490+
lport)
491+
)
491492

492493
if active_lanes is None:
493494
active_lanes = self.get_active_lanes_for_lport(lport, subport_idx,

0 commit comments

Comments
 (0)