Skip to content

Commit 7c0be24

Browse files
authored
[CMIS]Improved 400G link bring up sequence (#254)
* Improved 400G link bring up sequence * Event based handling * Remove unused functions * Force DP to remain in DpInitialized State state on admin shutdown * Added test case * Skip CMIS task manager based upon flag * Addressed review comments * Fix xcvrd crash * Fix test failure * Listen only to 'APPL_DB's admin_status * Fix typo
1 parent df447b4 commit 7c0be24

File tree

3 files changed

+230
-136
lines changed

3 files changed

+230
-136
lines changed

sonic-xcvrd/tests/test_xcvrd.py

+37-24
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
#from unittest.mock import DEFAULT
12
from xcvrd.xcvrd_utilities.port_mapping import *
23
from xcvrd.xcvrd_utilities.sfp_status_helper import *
34
from xcvrd.xcvrd import *
@@ -28,6 +29,7 @@
2829
modules_path = os.path.dirname(test_path)
2930
scripts_path = os.path.join(modules_path, "xcvrd")
3031
sys.path.insert(0, modules_path)
32+
DEFAULT_NAMESPACE = ['']
3133

3234
os.environ["XCVRD_UNIT_TESTING"] = "1"
3335

@@ -242,7 +244,7 @@ def test_post_port_sfp_dom_info_to_db(self):
242244
port_change_event = PortChangeEvent('Ethernet0', 1, 0, PortChangeEvent.PORT_ADD)
243245
port_mapping.handle_port_change_event(port_change_event)
244246
stop_event = threading.Event()
245-
xcvr_table_helper = XcvrTableHelper()
247+
xcvr_table_helper = XcvrTableHelper(DEFAULT_NAMESPACE)
246248
post_port_sfp_dom_info_to_db(True, port_mapping, xcvr_table_helper, stop_event)
247249

248250
@patch('xcvrd.xcvrd_utilities.port_mapping.PortMapping.logical_port_name_to_physical_port_list', MagicMock(return_value=[0]))
@@ -255,7 +257,7 @@ def test_init_port_sfp_status_tbl(self):
255257
port_change_event = PortChangeEvent('Ethernet0', 1, 0, PortChangeEvent.PORT_ADD)
256258
port_mapping.handle_port_change_event(port_change_event)
257259
stop_event = threading.Event()
258-
xcvr_table_helper = XcvrTableHelper()
260+
xcvr_table_helper = XcvrTableHelper(DEFAULT_NAMESPACE)
259261
init_port_sfp_status_tbl(port_mapping, xcvr_table_helper, stop_event)
260262

261263
def test_get_media_settings_key(self):
@@ -339,7 +341,7 @@ def test_handle_port_config_change(self, mock_select, mock_sub_table):
339341
mock_select.return_value = (swsscommon.Select.OBJECT, mock_selectable)
340342
mock_sub_table.return_value = mock_selectable
341343

342-
sel, asic_context = subscribe_port_config_change()
344+
sel, asic_context = subscribe_port_config_change(DEFAULT_NAMESPACE)
343345
port_mapping = PortMapping()
344346
stop_event = threading.Event()
345347
stop_event.is_set = MagicMock(return_value=False)
@@ -367,7 +369,7 @@ def test_get_port_mapping(self, mock_swsscommon_table):
367369
mock_table.getKeys = MagicMock(return_value=['Ethernet0', 'Ethernet4', 'Ethernet-IB0'])
368370
mock_table.get = MagicMock(side_effect=[(True, (('index', 1), )), (True, (('index', 2), )), (True, (('index', 3), ))])
369371
mock_swsscommon_table.return_value = mock_table
370-
port_mapping = get_port_mapping()
372+
port_mapping = get_port_mapping(DEFAULT_NAMESPACE)
371373
assert port_mapping.logical_port_list.count('Ethernet0')
372374
assert port_mapping.get_asic_id_for_logical_port('Ethernet0') == 0
373375
assert port_mapping.get_physical_to_logical(1) == ['Ethernet0']
@@ -382,7 +384,7 @@ def test_get_port_mapping(self, mock_swsscommon_table):
382384
assert port_mapping.get_asic_id_for_logical_port('Ethernet-IB0') == None
383385
assert port_mapping.get_physical_to_logical(3) == None
384386
assert port_mapping.get_logical_to_physical('Ethernet-IB0') == None
385-
387+
386388
@patch('swsscommon.swsscommon.Select.addSelectable', MagicMock())
387389
@patch('swsscommon.swsscommon.SubscriberStateTable')
388390
@patch('swsscommon.swsscommon.Select.select')
@@ -418,7 +420,7 @@ def test_DaemonXcvrd_run(self, mock_task_stop1, mock_task_stop2, mock_task_run1,
418420
@patch('xcvrd.xcvrd._wrapper_get_sfp_type', MagicMock(return_value='QSFP_DD'))
419421
def test_CmisManagerTask_handle_port_change_event(self):
420422
port_mapping = PortMapping()
421-
task = CmisManagerTask(port_mapping)
423+
task = CmisManagerTask(DEFAULT_NAMESPACE, port_mapping)
422424

423425
assert not task.isPortConfigDone
424426
port_change_event = PortChangeEvent('PortConfigDone', -1, 0, PortChangeEvent.PORT_SET)
@@ -450,7 +452,7 @@ def test_CmisManagerTask_task_run_stop(self, mock_chassis):
450452
mock_chassis.get_all_sfps = MagicMock(return_value=[mock_object, mock_object])
451453

452454
port_mapping = PortMapping()
453-
task = CmisManagerTask(port_mapping)
455+
task = CmisManagerTask(DEFAULT_NAMESPACE, port_mapping)
454456
task.task_run()
455457
task.task_stop()
456458
assert task.task_process is None
@@ -536,7 +538,7 @@ def test_CmisManagerTask_task_worker(self, mock_chassis):
536538
mock_chassis.get_sfp = MagicMock(return_value=mock_sfp)
537539

538540
port_mapping = PortMapping()
539-
task = CmisManagerTask(port_mapping)
541+
task = CmisManagerTask(DEFAULT_NAMESPACE, port_mapping)
540542

541543
port_change_event = PortChangeEvent('PortConfigDone', -1, 0, PortChangeEvent.PORT_SET)
542544
task.on_port_update_event(port_change_event)
@@ -547,33 +549,44 @@ def test_CmisManagerTask_task_worker(self, mock_chassis):
547549
task.on_port_update_event(port_change_event)
548550
assert len(task.port_dict) == 1
549551

552+
task.get_host_tx_status = MagicMock(return_value='true')
553+
task.get_port_admin_status = MagicMock(return_value='up')
554+
550555
# Case 1: Module Inserted --> DP_DEINIT
556+
task.task_stopping_event.is_set = MagicMock(side_effect=[False, False, True])
557+
task.task_worker()
558+
assert task.port_dict['Ethernet0']['cmis_state'] == 'DP_DEINIT'
559+
551560
task.task_stopping_event.is_set = MagicMock(side_effect=[False, False, True])
552561
task.task_worker()
553562
assert mock_xcvr_api.set_datapath_deinit.call_count == 1
554563
assert mock_xcvr_api.tx_disable_channel.call_count == 1
555-
assert mock_xcvr_api.set_lpmode.call_count == 2
564+
assert mock_xcvr_api.set_lpmode.call_count == 1
565+
assert task.port_dict['Ethernet0']['cmis_state'] == 'AP_CONFIGURED'
556566

557567
# Case 2: DP_DEINIT --> AP Configured
558568
task.task_stopping_event.is_set = MagicMock(side_effect=[False, False, True])
559569
task.task_worker()
560570
assert mock_xcvr_api.set_application.call_count == 1
571+
assert task.port_dict['Ethernet0']['cmis_state'] == 'DP_INIT'
561572

562573
# Case 3: AP Configured --> DP_INIT
563574
task.task_stopping_event.is_set = MagicMock(side_effect=[False, False, True])
564575
task.task_worker()
565576
assert mock_xcvr_api.set_datapath_init.call_count == 1
577+
assert task.port_dict['Ethernet0']['cmis_state'] == 'DP_TXON'
566578

567579
# Case 4: DP_INIT --> DP_TXON
568580
task.task_stopping_event.is_set = MagicMock(side_effect=[False, False, True])
569581
task.task_worker()
570582
assert mock_xcvr_api.tx_disable_channel.call_count == 2
583+
assert task.port_dict['Ethernet0']['cmis_state'] == 'DP_ACTIVATION'
571584

572585
@patch('xcvrd.xcvrd.XcvrTableHelper', MagicMock())
573586
def test_DomInfoUpdateTask_handle_port_change_event(self):
574587
port_mapping = PortMapping()
575-
task = DomInfoUpdateTask(port_mapping)
576-
task.xcvr_table_helper = XcvrTableHelper()
588+
task = DomInfoUpdateTask(DEFAULT_NAMESPACE, port_mapping)
589+
task.xcvr_table_helper = XcvrTableHelper(DEFAULT_NAMESPACE)
577590
port_change_event = PortChangeEvent('Ethernet0', 1, 0, PortChangeEvent.PORT_ADD)
578591
task.on_port_config_change(port_change_event)
579592
assert task.port_mapping.logical_port_list.count('Ethernet0')
@@ -592,7 +605,7 @@ def test_DomInfoUpdateTask_handle_port_change_event(self):
592605
@patch('xcvrd.xcvrd_utilities.port_mapping.handle_port_config_change', MagicMock())
593606
def test_DomInfoUpdateTask_task_run_stop(self):
594607
port_mapping = PortMapping()
595-
task = DomInfoUpdateTask(port_mapping)
608+
task = DomInfoUpdateTask(DEFAULT_NAMESPACE, port_mapping)
596609
task.task_run()
597610
task.task_stop()
598611
assert not task.task_thread.is_alive()
@@ -612,8 +625,8 @@ def test_DomInfoUpdateTask_task_worker(self, mock_select, mock_sub_table, mock_p
612625
mock_sub_table.return_value = mock_selectable
613626

614627
port_mapping = PortMapping()
615-
task = DomInfoUpdateTask(port_mapping)
616-
task.xcvr_table_helper = XcvrTableHelper()
628+
task = DomInfoUpdateTask(DEFAULT_NAMESPACE, port_mapping)
629+
task.xcvr_table_helper = XcvrTableHelper(DEFAULT_NAMESPACE)
617630
task.task_stopping_event.wait = MagicMock(side_effect=[False, True])
618631
mock_detect_error.return_value = True
619632
task.task_worker()
@@ -640,8 +653,8 @@ def test_SfpStateUpdateTask_handle_port_change_event(self, mock_table_helper):
640653
stopping_event = multiprocessing.Event()
641654
port_mapping = PortMapping()
642655
retry_eeprom_set = set()
643-
task = SfpStateUpdateTask(port_mapping, retry_eeprom_set)
644-
task.xcvr_table_helper = XcvrTableHelper()
656+
task = SfpStateUpdateTask(DEFAULT_NAMESPACE, port_mapping, retry_eeprom_set)
657+
task.xcvr_table_helper = XcvrTableHelper(DEFAULT_NAMESPACE)
645658
port_change_event = PortChangeEvent('Ethernet0', 1, 0, PortChangeEvent.PORT_ADD)
646659
wait_time = 5
647660
while wait_time > 0:
@@ -671,7 +684,7 @@ def test_SfpStateUpdateTask_handle_port_change_event(self, mock_table_helper):
671684
def test_SfpStateUpdateTask_task_run_stop(self):
672685
port_mapping = PortMapping()
673686
retry_eeprom_set = set()
674-
task = SfpStateUpdateTask(port_mapping, retry_eeprom_set)
687+
task = SfpStateUpdateTask(DEFAULT_NAMESPACE, port_mapping, retry_eeprom_set)
675688
sfp_error_event = multiprocessing.Event()
676689
task.task_run(sfp_error_event)
677690
assert wait_until(5, 1, task.task_process.is_alive)
@@ -686,8 +699,8 @@ def test_SfpStateUpdateTask_retry_eeprom_reading(self, mock_post_sfp_info):
686699

687700
port_mapping = PortMapping()
688701
retry_eeprom_set = set()
689-
task = SfpStateUpdateTask(port_mapping, retry_eeprom_set)
690-
task.xcvr_table_helper = XcvrTableHelper()
702+
task = SfpStateUpdateTask(DEFAULT_NAMESPACE, port_mapping, retry_eeprom_set)
703+
task.xcvr_table_helper = XcvrTableHelper(DEFAULT_NAMESPACE)
691704
task.xcvr_table_helper.get_intf_tbl = MagicMock(return_value=mock_table)
692705
task.xcvr_table_helper.get_dom_tbl = MagicMock(return_value=mock_table)
693706
task.xcvr_table_helper.get_app_port_tbl = MagicMock(return_value=mock_table)
@@ -712,7 +725,7 @@ def test_SfpStateUpdateTask_retry_eeprom_reading(self, mock_post_sfp_info):
712725
def test_SfpStateUpdateTask_mapping_event_from_change_event(self):
713726
port_mapping = PortMapping()
714727
retry_eeprom_set = set()
715-
task = SfpStateUpdateTask(port_mapping, retry_eeprom_set)
728+
task = SfpStateUpdateTask(DEFAULT_NAMESPACE, port_mapping, retry_eeprom_set)
716729
port_dict = {}
717730
assert task._mapping_event_from_change_event(False, port_dict) == SYSTEM_FAIL
718731
assert port_dict[EVENT_ON_ALL_SFP] == SYSTEM_FAIL
@@ -744,8 +757,8 @@ def test_SfpStateUpdateTask_mapping_event_from_change_event(self):
744757
def test_SfpStateUpdateTask_task_worker(self, mock_updata_status, mock_post_sfp_info, mock_post_dom_info, mock_post_dom_th, mock_update_media_setting, mock_del_dom, mock_change_event, mock_mapping_event, mock_os_kill):
745758
port_mapping = PortMapping()
746759
retry_eeprom_set = set()
747-
task = SfpStateUpdateTask(port_mapping, retry_eeprom_set)
748-
task.xcvr_table_helper = XcvrTableHelper()
760+
task = SfpStateUpdateTask(DEFAULT_NAMESPACE, port_mapping, retry_eeprom_set)
761+
task.xcvr_table_helper = XcvrTableHelper(DEFAULT_NAMESPACE)
749762
stop_event = multiprocessing.Event()
750763
sfp_error_event = multiprocessing.Event()
751764
mock_change_event.return_value = (True, {0: 0}, {})
@@ -854,8 +867,8 @@ class MockTable:
854867

855868
port_mapping = PortMapping()
856869
retry_eeprom_set = set()
857-
task = SfpStateUpdateTask(port_mapping, retry_eeprom_set)
858-
task.xcvr_table_helper = XcvrTableHelper()
870+
task = SfpStateUpdateTask(DEFAULT_NAMESPACE, port_mapping, retry_eeprom_set)
871+
task.xcvr_table_helper = XcvrTableHelper(DEFAULT_NAMESPACE)
859872
task.xcvr_table_helper.get_status_tbl = mock_table_helper.get_status_tbl
860873
task.xcvr_table_helper.get_intf_tbl = mock_table_helper.get_intf_tbl
861874
task.xcvr_table_helper.get_dom_tbl = mock_table_helper.get_dom_tbl

0 commit comments

Comments
 (0)