From de16e50d87f63fb3ab3cfa9f52c8d2557de67ebb Mon Sep 17 00:00:00 2001 From: Anoop Kamath <115578705+AnoopKamath@users.noreply.github.com> Date: Tue, 30 Apr 2024 18:49:49 -0700 Subject: [PATCH] DPinit timeout seen for Innolight transceiver during CMIS init + transceiver OIR causing CMIS init failure (#450) * Create fr8_800g.py Implementation of Innolight FR8 module specific in addition to the CMIS specification. * Update xcvr_api_factory.py Assign CMIS api implementation for Cisco-Innolight * return items in list format * Update and rename fr8_800g.py to fr_800g.py * Update xcvr_api_factory.py * Add mock test case for INL * Create test_fr_800g.py Add test_fr_800g.py to mock INL get_fw_info api --- .../sonic_xcvr/api/innolight/fr_800g.py | 19 +++++++++++++ .../sonic_xcvr/xcvr_api_factory.py | 7 +++++ tests/sonic_xcvr/test_fr_800g.py | 27 +++++++++++++++++++ tests/sonic_xcvr/test_xcvr_api_factory.py | 11 ++++++++ 4 files changed, 64 insertions(+) create mode 100644 sonic_platform_base/sonic_xcvr/api/innolight/fr_800g.py create mode 100644 tests/sonic_xcvr/test_fr_800g.py diff --git a/sonic_platform_base/sonic_xcvr/api/innolight/fr_800g.py b/sonic_platform_base/sonic_xcvr/api/innolight/fr_800g.py new file mode 100644 index 000000000..2680e6984 --- /dev/null +++ b/sonic_platform_base/sonic_xcvr/api/innolight/fr_800g.py @@ -0,0 +1,19 @@ +""" + fr_800g.py + + Implementation of Innolight FR module specific in addition to the CMIS specification. +""" + +from ...fields import consts +from ..public.cmis import CmisApi + +class CmisFr800gApi(CmisApi): + def get_transceiver_info_firmware_versions(self): + return_dict = {"active_firmware" : "N/A", "inactive_firmware" : "N/A"} + + InactiveFirmware = self.get_module_inactive_firmware() + ActiveFirmware = self.get_module_active_firmware() + + return_dict["active_firmware"] = ActiveFirmware + ".0" + return_dict["inactive_firmware"] = InactiveFirmware + ".0" + return return_dict diff --git a/sonic_platform_base/sonic_xcvr/xcvr_api_factory.py b/sonic_platform_base/sonic_xcvr/xcvr_api_factory.py index b4d0af814..0a04b2e30 100644 --- a/sonic_platform_base/sonic_xcvr/xcvr_api_factory.py +++ b/sonic_platform_base/sonic_xcvr/xcvr_api_factory.py @@ -17,6 +17,8 @@ from .api.credo.aec_800g import CmisAec800gApi from .mem_maps.credo.aec_800g import CmisAec800gMemMap +from .api.innolight.fr_800g import CmisFr800gApi + from .codes.public.sff8436 import Sff8436Codes from .api.public.sff8436 import Sff8436Api from .mem_maps.public.sff8436 import Sff8436MemMap @@ -79,6 +81,11 @@ def create_xcvr_api(self): mem_map = CmisAec800gMemMap(CmisAec800gCodes) xcvr_eeprom = XcvrEeprom(self.reader, self.writer, mem_map) api = CmisAec800gApi(xcvr_eeprom) + elif vendor_name == 'CISCO-INNOLIGHT' and vendor_pn == 'T-DH8CNT-NCI': + codes = CmisCodes + mem_map = CmisMemMap(codes) + xcvr_eeprom = XcvrEeprom(self.reader, self.writer, mem_map) + api = CmisFr800gApi(xcvr_eeprom) else: codes = CmisCodes mem_map = CmisMemMap(codes) diff --git a/tests/sonic_xcvr/test_fr_800g.py b/tests/sonic_xcvr/test_fr_800g.py new file mode 100644 index 000000000..b3daec205 --- /dev/null +++ b/tests/sonic_xcvr/test_fr_800g.py @@ -0,0 +1,27 @@ +from unittest.mock import patch +from mock import MagicMock +import pytest + +from sonic_platform_base.sonic_xcvr.api.public.cmis import CmisApi +from sonic_platform_base.sonic_xcvr.mem_maps.public.cmis import CmisMemMap +from sonic_platform_base.sonic_xcvr.xcvr_eeprom import XcvrEeprom +from sonic_platform_base.sonic_xcvr.codes.public.cmis import CmisCodes +from sonic_platform_base.sonic_xcvr.fields import consts +from sonic_platform_base.sonic_xcvr.api.innolight.fr_800g import CmisFr800gApi + +class TestCmisFr800gApi(object): + codes = CmisCodes + mem_map = CmisMemMap(codes) + reader = MagicMock(return_value=None) + writer = MagicMock() + eeprom = XcvrEeprom(reader, writer, mem_map) + api = CmisFr800gApi(eeprom) + + def test_get_transceiver_info_firmware_versions(self): + self.api.get_module_inactive_firmware = MagicMock() + self.api.get_module_inactive_firmware.return_value = "1.0" + self.api.get_module_active_firmware = MagicMock() + self.api.get_module_active_firmware.return_value = "1.1" + expected_result = {"active_firmware" : "1.1.0", "inactive_firmware" : "1.0.0"} + result = self.api.get_transceiver_info_firmware_versions() + assert result == expected_result diff --git a/tests/sonic_xcvr/test_xcvr_api_factory.py b/tests/sonic_xcvr/test_xcvr_api_factory.py index 87175b7c0..2b0da1ddd 100644 --- a/tests/sonic_xcvr/test_xcvr_api_factory.py +++ b/tests/sonic_xcvr/test_xcvr_api_factory.py @@ -6,6 +6,7 @@ from sonic_platform_base.sonic_xcvr.mem_maps.credo.aec_800g import CmisAec800gMemMap from sonic_platform_base.sonic_xcvr.xcvr_eeprom import XcvrEeprom from sonic_platform_base.sonic_xcvr.codes.credo.aec_800g import CmisAec800gCodes +from sonic_platform_base.sonic_xcvr.api.innolight.fr_800g import CmisFr800gApi from sonic_platform_base.sonic_xcvr.fields import consts from sonic_platform_base.sonic_xcvr.xcvr_api_factory import XcvrApiFactory from sonic_platform_base.sonic_xcvr.api.public.sff8636 import Sff8636Api @@ -53,6 +54,16 @@ def test_create_xcvr_api(self): CmisAec800gApi = MagicMock() self.api.create_xcvr_api() + @patch('sonic_platform_base.sonic_xcvr.xcvr_api_factory.XcvrApiFactory._get_vendor_name', MagicMock(return_value='CISCO-INNOLIGHT')) + @patch('sonic_platform_base.sonic_xcvr.xcvr_api_factory.XcvrApiFactory._get_vendor_part_num', MagicMock(return_value='T-DH8CNT-NCI')) + def test_create_xcvr_api(self): + self.api.reader = self.mock_reader + CmisCodes = MagicMock() + CmisMemMap = MagicMock() + XcvrEeprom = MagicMock() + CmisFr800gApi = MagicMock() + self.api.create_xcvr_api() + @pytest.mark.parametrize("reader, expected_api", [ (mock_reader_sff8636, Sff8636Api), (mock_reader_sff8436, Sff8436Api),