Skip to content

Commit

Permalink
DPinit timeout seen for Innolight transceiver during CMIS init + tran…
Browse files Browse the repository at this point in the history
…sceiver OIR causing CMIS init failure (sonic-net#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
  • Loading branch information
AnoopKamath authored May 1, 2024
1 parent 4163365 commit de16e50
Show file tree
Hide file tree
Showing 4 changed files with 64 additions and 0 deletions.
19 changes: 19 additions & 0 deletions sonic_platform_base/sonic_xcvr/api/innolight/fr_800g.py
Original file line number Diff line number Diff line change
@@ -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
7 changes: 7 additions & 0 deletions sonic_platform_base/sonic_xcvr/xcvr_api_factory.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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)
Expand Down
27 changes: 27 additions & 0 deletions tests/sonic_xcvr/test_fr_800g.py
Original file line number Diff line number Diff line change
@@ -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
11 changes: 11 additions & 0 deletions tests/sonic_xcvr/test_xcvr_api_factory.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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),
Expand Down

0 comments on commit de16e50

Please sign in to comment.