Skip to content

Commit 290de20

Browse files
authored
[xcvrd] Create TRANSCEIVER_FIRMWARE_INFO table for all subports (#668)
Signed-off-by: Mihir Patel <[email protected]>
1 parent e61a48a commit 290de20

File tree

2 files changed

+48
-3
lines changed

2 files changed

+48
-3
lines changed

sonic-xcvrd/tests/test_xcvrd.py

Lines changed: 41 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -468,26 +468,65 @@ def test_is_npu_si_settings_update_required(self):
468468
@patch('xcvrd.xcvrd_utilities.port_event_helper.PortMapping.logical_port_name_to_physical_port_list', MagicMock(return_value=[0]))
469469
@patch('xcvrd.xcvrd._wrapper_get_transceiver_firmware_info', MagicMock(return_value={'active_firmware': '2.1.1',
470470
'inactive_firmware': '1.2.4'}))
471-
@patch('xcvrd.xcvrd._wrapper_is_flat_memory')
471+
@patch('xcvrd.xcvrd._wrapper_is_flat_memory', MagicMock(return_value=False))
472472
@patch('xcvrd.xcvrd._wrapper_get_presence')
473-
def test_post_port_sfp_firmware_info_to_db(self, mock_get_presence, mock_is_flat_memory):
473+
def test_post_port_sfp_firmware_info_to_db(self, mock_get_presence):
474474
logical_port_name = "Ethernet0"
475475
port_mapping = PortMapping()
476+
port_mapping.get_physical_to_logical = MagicMock(return_value=["Ethernet0", "Ethernet4"])
476477
mock_sfp_obj_dict = MagicMock()
477478
stop_event = threading.Event()
478479
mock_cmis_manager = MagicMock()
479480
dom_info_update = DomInfoUpdateTask(DEFAULT_NAMESPACE, port_mapping, mock_sfp_obj_dict, stop_event, mock_cmis_manager)
480481
firmware_info_tbl = Table("STATE_DB", TRANSCEIVER_FIRMWARE_INFO_TABLE)
482+
483+
# Test 1: stop_event is set - should not update table
481484
stop_event.set()
482485
dom_info_update.post_port_sfp_firmware_info_to_db(logical_port_name, port_mapping, firmware_info_tbl, stop_event)
483486
assert firmware_info_tbl.get_size() == 0
487+
488+
# Test 2: transceiver not present - should not update table
484489
stop_event.clear()
485490
mock_get_presence.return_value = False
486491
dom_info_update.post_port_sfp_firmware_info_to_db(logical_port_name, port_mapping, firmware_info_tbl, stop_event)
487492
assert firmware_info_tbl.get_size() == 0
493+
494+
# Test 3: transceiver present - should update table for both logical ports
488495
mock_get_presence.return_value = True
489496
dom_info_update.post_port_sfp_firmware_info_to_db(logical_port_name, port_mapping, firmware_info_tbl, stop_event)
497+
# Verify firmware info is posted for Ethernet0 (2 entries: active + inactive firmware)
490498
assert firmware_info_tbl.get_size_for_key(logical_port_name) == 2
499+
# Verify firmware info is also posted for Ethernet4 (2 entries: active + inactive firmware)
500+
assert firmware_info_tbl.get_size_for_key("Ethernet4") == 2
501+
# Verify total table has 2 logical ports (keys)
502+
assert firmware_info_tbl.get_size() == 2
503+
504+
@patch('xcvrd.xcvrd_utilities.port_event_helper.PortMapping.logical_port_name_to_physical_port_list', MagicMock(return_value=[0]))
505+
@patch('xcvrd.xcvrd._wrapper_get_transceiver_firmware_info', MagicMock(return_value={'active_firmware': '2.1.1',
506+
'inactive_firmware': '1.2.4'}))
507+
@patch('xcvrd.xcvrd._wrapper_is_flat_memory', MagicMock(return_value=False))
508+
@patch('xcvrd.xcvrd._wrapper_get_presence')
509+
def test_post_port_sfp_firmware_info_to_db_lport_list_None(self, mock_get_presence):
510+
logical_port_name = "Ethernet0"
511+
port_mapping = PortMapping()
512+
port_mapping.get_physical_to_logical = MagicMock(return_value=None)
513+
port_mapping.logical_port_name_to_physical_port_list = MagicMock(return_value=[0])
514+
mock_sfp_obj_dict = MagicMock()
515+
stop_event = threading.Event()
516+
mock_cmis_manager = MagicMock()
517+
dom_info_update = DomInfoUpdateTask(DEFAULT_NAMESPACE, port_mapping, mock_sfp_obj_dict, stop_event, mock_cmis_manager)
518+
firmware_info_tbl = MagicMock()
519+
firmware_info_tbl.get_size.return_value = 0
520+
stop_event.set()
521+
dom_info_update.post_port_sfp_firmware_info_to_db(logical_port_name, port_mapping, firmware_info_tbl, stop_event)
522+
assert firmware_info_tbl.get_size() == 0
523+
stop_event.clear()
524+
mock_get_presence.return_value = False
525+
dom_info_update.post_port_sfp_firmware_info_to_db(logical_port_name, port_mapping, firmware_info_tbl, stop_event)
526+
assert firmware_info_tbl.get_size() == 0
527+
mock_get_presence.return_value = True
528+
dom_info_update.post_port_sfp_firmware_info_to_db(logical_port_name, port_mapping, firmware_info_tbl, stop_event)
529+
assert firmware_info_tbl.set.call_count == 0
491530

492531
def test_post_port_dom_sensor_info_to_db(self):
493532
def mock_get_transceiver_dom_sensor_real_value(physical_port):

sonic-xcvrd/xcvrd/dom/dom_mgr.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -160,7 +160,13 @@ def post_port_sfp_firmware_info_to_db(self, logical_port_name, port_mapping, tab
160160
firmware_info_cache[physical_port] = transceiver_firmware_info_dict
161161
if transceiver_firmware_info_dict:
162162
fvs = swsscommon.FieldValuePairs([(k, v) for k, v in transceiver_firmware_info_dict.items()])
163-
table.set(physical_port_name, fvs)
163+
# For firmware info, we update all logical ports associated with this physical port
164+
logical_port_list = self.port_mapping.get_physical_to_logical(physical_port)
165+
if logical_port_list is None:
166+
self.log_warning("Got unknown physical port index {} while updating firmware info".format(physical_port))
167+
continue
168+
for logical_port in logical_port_list:
169+
table.set(logical_port, fvs)
164170
else:
165171
return xcvrd.SFP_EEPROM_NOT_READY
166172

0 commit comments

Comments
 (0)