Skip to content

Commit de16e50

Browse files
authored
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
1 parent 4163365 commit de16e50

File tree

4 files changed

+64
-0
lines changed

4 files changed

+64
-0
lines changed
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
"""
2+
fr_800g.py
3+
4+
Implementation of Innolight FR module specific in addition to the CMIS specification.
5+
"""
6+
7+
from ...fields import consts
8+
from ..public.cmis import CmisApi
9+
10+
class CmisFr800gApi(CmisApi):
11+
def get_transceiver_info_firmware_versions(self):
12+
return_dict = {"active_firmware" : "N/A", "inactive_firmware" : "N/A"}
13+
14+
InactiveFirmware = self.get_module_inactive_firmware()
15+
ActiveFirmware = self.get_module_active_firmware()
16+
17+
return_dict["active_firmware"] = ActiveFirmware + ".0"
18+
return_dict["inactive_firmware"] = InactiveFirmware + ".0"
19+
return return_dict

sonic_platform_base/sonic_xcvr/xcvr_api_factory.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@
1717
from .api.credo.aec_800g import CmisAec800gApi
1818
from .mem_maps.credo.aec_800g import CmisAec800gMemMap
1919

20+
from .api.innolight.fr_800g import CmisFr800gApi
21+
2022
from .codes.public.sff8436 import Sff8436Codes
2123
from .api.public.sff8436 import Sff8436Api
2224
from .mem_maps.public.sff8436 import Sff8436MemMap
@@ -79,6 +81,11 @@ def create_xcvr_api(self):
7981
mem_map = CmisAec800gMemMap(CmisAec800gCodes)
8082
xcvr_eeprom = XcvrEeprom(self.reader, self.writer, mem_map)
8183
api = CmisAec800gApi(xcvr_eeprom)
84+
elif vendor_name == 'CISCO-INNOLIGHT' and vendor_pn == 'T-DH8CNT-NCI':
85+
codes = CmisCodes
86+
mem_map = CmisMemMap(codes)
87+
xcvr_eeprom = XcvrEeprom(self.reader, self.writer, mem_map)
88+
api = CmisFr800gApi(xcvr_eeprom)
8289
else:
8390
codes = CmisCodes
8491
mem_map = CmisMemMap(codes)

tests/sonic_xcvr/test_fr_800g.py

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
from unittest.mock import patch
2+
from mock import MagicMock
3+
import pytest
4+
5+
from sonic_platform_base.sonic_xcvr.api.public.cmis import CmisApi
6+
from sonic_platform_base.sonic_xcvr.mem_maps.public.cmis import CmisMemMap
7+
from sonic_platform_base.sonic_xcvr.xcvr_eeprom import XcvrEeprom
8+
from sonic_platform_base.sonic_xcvr.codes.public.cmis import CmisCodes
9+
from sonic_platform_base.sonic_xcvr.fields import consts
10+
from sonic_platform_base.sonic_xcvr.api.innolight.fr_800g import CmisFr800gApi
11+
12+
class TestCmisFr800gApi(object):
13+
codes = CmisCodes
14+
mem_map = CmisMemMap(codes)
15+
reader = MagicMock(return_value=None)
16+
writer = MagicMock()
17+
eeprom = XcvrEeprom(reader, writer, mem_map)
18+
api = CmisFr800gApi(eeprom)
19+
20+
def test_get_transceiver_info_firmware_versions(self):
21+
self.api.get_module_inactive_firmware = MagicMock()
22+
self.api.get_module_inactive_firmware.return_value = "1.0"
23+
self.api.get_module_active_firmware = MagicMock()
24+
self.api.get_module_active_firmware.return_value = "1.1"
25+
expected_result = {"active_firmware" : "1.1.0", "inactive_firmware" : "1.0.0"}
26+
result = self.api.get_transceiver_info_firmware_versions()
27+
assert result == expected_result

tests/sonic_xcvr/test_xcvr_api_factory.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
from sonic_platform_base.sonic_xcvr.mem_maps.credo.aec_800g import CmisAec800gMemMap
77
from sonic_platform_base.sonic_xcvr.xcvr_eeprom import XcvrEeprom
88
from sonic_platform_base.sonic_xcvr.codes.credo.aec_800g import CmisAec800gCodes
9+
from sonic_platform_base.sonic_xcvr.api.innolight.fr_800g import CmisFr800gApi
910
from sonic_platform_base.sonic_xcvr.fields import consts
1011
from sonic_platform_base.sonic_xcvr.xcvr_api_factory import XcvrApiFactory
1112
from sonic_platform_base.sonic_xcvr.api.public.sff8636 import Sff8636Api
@@ -53,6 +54,16 @@ def test_create_xcvr_api(self):
5354
CmisAec800gApi = MagicMock()
5455
self.api.create_xcvr_api()
5556

57+
@patch('sonic_platform_base.sonic_xcvr.xcvr_api_factory.XcvrApiFactory._get_vendor_name', MagicMock(return_value='CISCO-INNOLIGHT'))
58+
@patch('sonic_platform_base.sonic_xcvr.xcvr_api_factory.XcvrApiFactory._get_vendor_part_num', MagicMock(return_value='T-DH8CNT-NCI'))
59+
def test_create_xcvr_api(self):
60+
self.api.reader = self.mock_reader
61+
CmisCodes = MagicMock()
62+
CmisMemMap = MagicMock()
63+
XcvrEeprom = MagicMock()
64+
CmisFr800gApi = MagicMock()
65+
self.api.create_xcvr_api()
66+
5667
@pytest.mark.parametrize("reader, expected_api", [
5768
(mock_reader_sff8636, Sff8636Api),
5869
(mock_reader_sff8436, Sff8436Api),

0 commit comments

Comments
 (0)