Skip to content

Commit d0fd1e1

Browse files
[warm/fast-reboot] Retain TRANSCEIVER_INFO/STATUS tables on deinit (#454)
* [warmboot] Retain TRANSCEIVER_INFO/STATUS tables on deinit Signed-off-by: Stepan Blyschak <[email protected]> * add UT Signed-off-by: Stepan Blyschak <[email protected]> * Update IT Signed-off-by: Stepan Blyschak <[email protected]> --------- Signed-off-by: Stepan Blyschak <[email protected]>
1 parent 2770fd2 commit d0fd1e1

File tree

2 files changed

+61
-8
lines changed

2 files changed

+61
-8
lines changed

sonic-xcvrd/tests/test_xcvrd.py

+44
Original file line numberDiff line numberDiff line change
@@ -2434,7 +2434,13 @@ def test_get_media_val_str(self):
24342434
media_str = get_media_val_str(num_logical_ports, lane_dict, logical_idx)
24352435
assert media_str == '3,4'
24362436

2437+
class MockPortMapping:
2438+
logical_port_list = [0, 1, 2]
2439+
logical_port_name_to_physical_port_list = MagicMock()
2440+
get_asic_id_for_logical_port = MagicMock()
2441+
24372442
@patch('xcvrd.xcvrd.DaemonXcvrd.load_platform_util', MagicMock())
2443+
@patch('xcvrd.xcvrd_utilities.port_event_helper.get_port_mapping', MagicMock(return_value=MockPortMapping))
24382444
@patch('sonic_py_common.device_info.get_paths_to_platform_and_hwsku_dirs', MagicMock(return_value=('/tmp', None)))
24392445
@patch('swsscommon.swsscommon.WarmStart', MagicMock())
24402446
@patch('xcvrd.xcvrd.DaemonXcvrd.wait_for_port_config_done', MagicMock())
@@ -2444,8 +2450,46 @@ def test_DaemonXcvrd_init_deinit_fastboot_enabled(self):
24442450
mock_run.return_value = "true"
24452451

24462452
xcvrd.init()
2453+
2454+
status_tbl = MagicMock()
2455+
xcvrd.xcvr_table_helper.get_status_tbl = MagicMock(return_value=status_tbl)
2456+
xcvrd.xcvr_table_helper.get_dom_tbl = MagicMock(return_value=MagicMock)
2457+
xcvrd.xcvr_table_helper.get_dom_threshold_tbl = MagicMock(return_value=MagicMock)
2458+
xcvrd.xcvr_table_helper.get_pm_tbl = MagicMock(return_value=MagicMock)
2459+
xcvrd.xcvr_table_helper.get_firmware_info_tbl = MagicMock(return_value=MagicMock)
2460+
24472461
xcvrd.deinit()
24482462

2463+
status_tbl.hdel.assert_not_called()
2464+
2465+
@patch('xcvrd.xcvrd.DaemonXcvrd.load_platform_util', MagicMock())
2466+
@patch('xcvrd.xcvrd_utilities.port_event_helper.get_port_mapping', MagicMock(return_value=MockPortMapping))
2467+
@patch('sonic_py_common.device_info.get_paths_to_platform_and_hwsku_dirs', MagicMock(return_value=('/tmp', None)))
2468+
@patch('xcvrd.xcvrd.is_warm_reboot_enabled', MagicMock(return_value=False))
2469+
@patch('xcvrd.xcvrd.DaemonXcvrd.wait_for_port_config_done', MagicMock())
2470+
@patch('subprocess.check_output', MagicMock(return_value='false'))
2471+
def test_DaemonXcvrd_init_deinit_cold(self):
2472+
xcvrd.platform_chassis = MagicMock()
2473+
2474+
xcvrdaemon = DaemonXcvrd(SYSLOG_IDENTIFIER)
2475+
with patch("subprocess.check_output") as mock_run:
2476+
mock_run.return_value = "false"
2477+
2478+
xcvrdaemon.init()
2479+
2480+
status_tbl = MagicMock()
2481+
xcvrdaemon.xcvr_table_helper.get_status_tbl = MagicMock(return_value=status_tbl)
2482+
xcvrdaemon.xcvr_table_helper.get_dom_tbl = MagicMock(return_value=MagicMock)
2483+
xcvrdaemon.xcvr_table_helper.get_dom_threshold_tbl = MagicMock(return_value=MagicMock)
2484+
xcvrdaemon.xcvr_table_helper.get_pm_tbl = MagicMock(return_value=MagicMock)
2485+
xcvrdaemon.xcvr_table_helper.get_firmware_info_tbl = MagicMock(return_value=MagicMock)
2486+
xcvrdaemon.xcvr_table_helper.get_intf_tbl = MagicMock(return_value=MagicMock)
2487+
2488+
xcvrdaemon.deinit()
2489+
2490+
status_tbl.hdel.assert_called()
2491+
2492+
24492493
def wait_until(total_wait_time, interval, call_back, *args, **kwargs):
24502494
wait_time = 0
24512495
while wait_time <= total_wait_time:

sonic-xcvrd/xcvrd/xcvrd.py

+17-8
Original file line numberDiff line numberDiff line change
@@ -777,6 +777,14 @@ def is_fast_reboot_enabled():
777777
fastboot_enabled = subprocess.check_output('sonic-db-cli STATE_DB hget "FAST_RESTART_ENABLE_TABLE|system" enable', shell=True, universal_newlines=True)
778778
return "true" in fastboot_enabled
779779

780+
781+
def is_warm_reboot_enabled():
782+
warmstart = swsscommon.WarmStart()
783+
warmstart.initialize("xcvrd", "pmon")
784+
warmstart.checkWarmStart("xcvrd", "pmon", False)
785+
is_warm_start = warmstart.isWarmStart()
786+
return is_warm_start
787+
780788
#
781789
# Helper classes ===============================================================
782790
#
@@ -1837,11 +1845,7 @@ def _post_port_sfp_info_and_dom_thr_to_db_once(self, port_mapping, xcvr_table_he
18371845
transceiver_dict = {}
18381846
retry_eeprom_set = set()
18391847

1840-
warmstart = swsscommon.WarmStart()
1841-
warmstart.initialize("xcvrd", "pmon")
1842-
warmstart.checkWarmStart("xcvrd", "pmon", False)
1843-
is_warm_start = warmstart.isWarmStart()
1844-
1848+
is_warm_start = is_warm_reboot_enabled()
18451849
# Post all the current interface sfp/dom threshold info to STATE_DB
18461850
logical_port_list = port_mapping.logical_port_list
18471851
for logical_port_name in logical_port_list:
@@ -2425,6 +2429,8 @@ def init(self):
24252429
def deinit(self):
24262430
self.log_info("Start daemon deinit...")
24272431

2432+
is_warm_fast_reboot = is_warm_reboot_enabled() or is_fast_reboot_enabled()
2433+
24282434
# Delete all the information from DB and then exit
24292435
port_mapping_data = port_event_helper.get_port_mapping(self.namespaces)
24302436
logical_port_list = port_mapping_data.logical_port_list
@@ -2435,15 +2441,18 @@ def deinit(self):
24352441
helper_logger.log_warning("Got invalid asic index for {}, ignored".format(logical_port_name))
24362442
continue
24372443

2444+
intf_tbl = self.xcvr_table_helper.get_intf_tbl(asic_index) if not is_warm_fast_reboot else None
2445+
24382446
del_port_sfp_dom_info_from_db(logical_port_name, port_mapping_data,
2439-
self.xcvr_table_helper.get_intf_tbl(asic_index),
2447+
intf_tbl,
24402448
self.xcvr_table_helper.get_dom_tbl(asic_index),
24412449
self.xcvr_table_helper.get_dom_threshold_tbl(asic_index),
24422450
self.xcvr_table_helper.get_pm_tbl(asic_index),
24432451
self.xcvr_table_helper.get_firmware_info_tbl(asic_index))
2444-
delete_port_from_status_table_sw(logical_port_name, self.xcvr_table_helper.get_status_tbl(asic_index))
2445-
delete_port_from_status_table_hw(logical_port_name, port_mapping_data, self.xcvr_table_helper.get_status_tbl(asic_index))
24462452

2453+
if not is_warm_fast_reboot:
2454+
delete_port_from_status_table_sw(logical_port_name, self.xcvr_table_helper.get_status_tbl(asic_index))
2455+
delete_port_from_status_table_hw(logical_port_name, port_mapping_data, self.xcvr_table_helper.get_status_tbl(asic_index))
24472456

24482457
del globals()['platform_chassis']
24492458

0 commit comments

Comments
 (0)