[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:
parent
4500709c8a
commit
11e9f7c0de
@ -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:
|
||||||
|
@ -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'
|
||||||
|
@ -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=[]))
|
||||||
|
Loading…
Reference in New Issue
Block a user