[Nvidia] Remove the dependency on python_sdk_api for sfp api (#16545)

Sfp api can now be called from the host which doesn't have the python_sdk_api installed. Also, sfp api has been migrated to use sysfs instead of sdk handle.

Signed-off-by: Vivek Reddy Karri <vkarri@nvidia.com>
This commit is contained in:
Vivek 2023-09-23 00:19:27 -07:00 committed by mssonicbld
parent 4500709c8a
commit 11e9f7c0de
3 changed files with 7 additions and 61 deletions

View File

@ -1,5 +1,5 @@
# #
# Copyright (c) 2019-2021 NVIDIA CORPORATION & AFFILIATES. # Copyright (c) 2019-2023 NVIDIA CORPORATION & AFFILIATES.
# Apache-2.0 # Apache-2.0
# #
# Licensed under the Apache License, Version 2.0 (the "License"); # Licensed under the Apache License, Version 2.0 (the "License");
@ -129,10 +129,6 @@ class Chassis(ChassisBase):
if self.sfp_event: if self.sfp_event:
self.sfp_event.deinitialize() self.sfp_event.deinitialize()
if self._sfp_list:
if self.sfp_module.SFP.shared_sdk_handle:
self.sfp_module.deinitialize_sdk_handle(self.sfp_module.SFP.shared_sdk_handle)
@property @property
def RJ45_port_list(self): def RJ45_port_list(self):
if not self._RJ45_port_inited: if not self._RJ45_port_inited:

View File

@ -35,30 +35,12 @@ try:
except ImportError as e: except ImportError as e:
raise ImportError (str(e) + "- required module not found") raise ImportError (str(e) + "- required module not found")
try: # Define the sdk constants
# python_sdk_api does not support python3 for now. Daemons like thermalctld or psud SX_PORT_MODULE_STATUS_INITIALIZING = 0
# also import this file without actually use the sdk lib. So we catch the ImportError SX_PORT_MODULE_STATUS_PLUGGED = 1
# and ignore it here. Meanwhile, we have to trigger xcvrd using python2 now because it SX_PORT_MODULE_STATUS_UNPLUGGED = 2
# uses the sdk lib. SX_PORT_MODULE_STATUS_PLUGGED_WITH_ERROR = 3
from python_sdk_api.sxd_api import * SX_PORT_MODULE_STATUS_PLUGGED_DISABLED = 4
from python_sdk_api.sx_api import *
except ImportError as e:
pass
try:
if os.environ["PLATFORM_API_UNIT_TESTING"] == "1":
# Unable to import SDK constants under unit test
# Define them here
SX_PORT_MODULE_STATUS_INITIALIZING = 0
SX_PORT_MODULE_STATUS_PLUGGED = 1
SX_PORT_MODULE_STATUS_UNPLUGGED = 2
SX_PORT_MODULE_STATUS_PLUGGED_WITH_ERROR = 3
SX_PORT_MODULE_STATUS_PLUGGED_DISABLED = 4
SX_PORT_ADMIN_STATUS_UP = True
SX_PORT_ADMIN_STATUS_DOWN = False
except KeyError:
pass
# identifier value of xSFP module which is in the first byte of the EEPROM # identifier value of xSFP module which is in the first byte of the EEPROM
# if the identifier value falls into SFP_TYPE_CODE_LIST the module is treated as a SFP module and parsed according to 8472 # if the identifier value falls into SFP_TYPE_CODE_LIST the module is treated as a SFP module and parsed according to 8472
@ -178,42 +160,12 @@ limited_eeprom = {
logger = Logger() logger = Logger()
# SDK initializing stuff, called from chassis
def initialize_sdk_handle():
rc, sdk_handle = sx_api_open(None)
if (rc != SX_STATUS_SUCCESS):
logger.log_warning("Failed to open api handle, please check whether SDK is running.")
sdk_handle = None
return sdk_handle
def deinitialize_sdk_handle(sdk_handle):
if sdk_handle is not None:
rc = sx_api_close(sdk_handle)
if (rc != SX_STATUS_SUCCESS):
logger.log_warning("Failed to close api handle.")
return rc == SXD_STATUS_SUCCESS
else:
logger.log_warning("Sdk handle is none")
return False
class NvidiaSFPCommon(SfpOptoeBase): class NvidiaSFPCommon(SfpOptoeBase):
def __init__(self, sfp_index): def __init__(self, sfp_index):
super(NvidiaSFPCommon, self).__init__() super(NvidiaSFPCommon, self).__init__()
self.index = sfp_index + 1 self.index = sfp_index + 1
self.sdk_index = sfp_index self.sdk_index = sfp_index
@property
def sdk_handle(self):
if not SFP.shared_sdk_handle:
SFP.shared_sdk_handle = initialize_sdk_handle()
if not SFP.shared_sdk_handle:
logger.log_error('Failed to open SDK handle')
return SFP.shared_sdk_handle
@classmethod @classmethod
def _get_module_info(self, sdk_index): def _get_module_info(self, sdk_index):
""" """
@ -233,7 +185,6 @@ class NvidiaSFPCommon(SfpOptoeBase):
class SFP(NvidiaSFPCommon): class SFP(NvidiaSFPCommon):
"""Platform-specific SFP class""" """Platform-specific SFP class"""
shared_sdk_handle = None
SFP_MLNX_ERROR_DESCRIPTION_LONGRANGE_NON_MLNX_CABLE = 'Long range for non-Mellanox cable or module' SFP_MLNX_ERROR_DESCRIPTION_LONGRANGE_NON_MLNX_CABLE = 'Long range for non-Mellanox cable or module'
SFP_MLNX_ERROR_DESCRIPTION_ENFORCE_PART_NUMBER_LIST = 'Enforce part number list' SFP_MLNX_ERROR_DESCRIPTION_ENFORCE_PART_NUMBER_LIST = 'Enforce part number list'
SFP_MLNX_ERROR_DESCRIPTION_PMD_TYPE_NOT_ENABLED = 'PMD type not enabled' SFP_MLNX_ERROR_DESCRIPTION_PMD_TYPE_NOT_ENABLED = 'PMD type not enabled'

View File

@ -55,7 +55,6 @@ class TestSfp:
assert sfp.index == 5 assert sfp.index == 5
@mock.patch('sonic_platform.sfp.SFP.read_eeprom', mock.MagicMock(return_value=None)) @mock.patch('sonic_platform.sfp.SFP.read_eeprom', mock.MagicMock(return_value=None))
@mock.patch('sonic_platform.sfp.SFP.shared_sdk_handle', mock.MagicMock(return_value=2))
@mock.patch('sonic_platform.sfp.SFP._get_module_info') @mock.patch('sonic_platform.sfp.SFP._get_module_info')
@mock.patch('sonic_platform.chassis.Chassis.get_num_sfps', mock.MagicMock(return_value=2)) @mock.patch('sonic_platform.chassis.Chassis.get_num_sfps', mock.MagicMock(return_value=2))
@mock.patch('sonic_platform.chassis.extract_RJ45_ports_index', mock.MagicMock(return_value=[])) @mock.patch('sonic_platform.chassis.extract_RJ45_ports_index', mock.MagicMock(return_value=[]))