Skip to content

Commit be616c8

Browse files
stephenxsjleveque
authored andcommitted
[xcvrd] Support both new platform API and old platform plugins (sonic-net#38)
1. wrap the apis that are supported by new platform api in a way that to call npapi first and to call sfputil if the former returns NotImplementError. 2. for the functions that only available in sfputil, a helper module is introduced to replace sfputil.
1 parent dc5e05f commit be616c8

File tree

1 file changed

+80
-19
lines changed

1 file changed

+80
-19
lines changed

sonic-xcvrd/scripts/xcvrd

Lines changed: 80 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,8 @@ media_settings = ''
5959
g_dict = {}
6060
# Global platform specific sfputil class instance
6161
platform_sfputil = None
62+
# Global chassis object based on new platform api
63+
platform_chassis = None
6264

6365
# Global logger class instance
6466
logger = Logger(SYSLOG_IDENTIFIER)
@@ -90,11 +92,53 @@ def get_physical_port_name(logical_port, physical_port, ganged):
9092
# Strip units and beautify
9193
def strip_unit_and_beautify(value, unit):
9294
# Strip unit from raw data
93-
width = len(unit)
94-
if value[-width:] == unit:
95-
value = value[:-width]
95+
if type(value) is str:
96+
width = len(unit)
97+
if value[-width:] == unit:
98+
value = value[:-width]
99+
return value
100+
else:
101+
return str(value)
96102

97-
return value
103+
def _wrapper_get_presence(physical_port):
104+
if platform_chassis is not None:
105+
try:
106+
return platform_chassis.get_sfp(physical_port).get_presence()
107+
except NotImplementedError:
108+
pass
109+
return platform_sfputil.get_presence(physical_port)
110+
111+
def _wrapper_get_transceiver_info(physical_port):
112+
if platform_chassis is not None:
113+
try:
114+
return platform_chassis.get_sfp(physical_port).get_transceiver_info()
115+
except NotImplementedError:
116+
pass
117+
return platform_sfputil.get_transceiver_info_dict(physical_port)
118+
119+
def _wrapper_get_transceiver_dom_info(physical_port):
120+
if platform_chassis is not None:
121+
try:
122+
return platform_chassis.get_sfp(physical_port).get_transceiver_bulk_status()
123+
except NotImplementedError:
124+
pass
125+
return platform_sfputil.get_transceiver_dom_info_dict(physical_port)
126+
127+
def _wrapper_get_transceiver_dom_threshold_info(physical_port):
128+
if platform_chassis is not None:
129+
return None
130+
131+
return platform_sfputil.get_transceiver_dom_threshold_info_dict(physical_port)
132+
133+
def _wrapper_get_transceiver_change_event():
134+
if platform_chassis is not None:
135+
try:
136+
status, events = platform_chassis.get_change_event()
137+
sfp_events = events['sfp']
138+
return status, sfp_events
139+
except NotImplementedError:
140+
pass
141+
return platform_sfputil.get_transceiver_change_event()
98142

99143
# Remove unnecessary unit from the raw data
100144
def beautify_dom_info_dict(dom_info_dict):
@@ -157,14 +201,14 @@ def post_port_sfp_info_to_db(logical_port_name, table, transceiver_dict,
157201
if stop_event.is_set():
158202
break
159203

160-
if not platform_sfputil.get_presence(physical_port):
204+
if not _wrapper_get_presence(physical_port):
161205
continue
162206

163207
port_name = get_physical_port_name(logical_port_name, ganged_member_num, ganged_port)
164208
ganged_member_num += 1
165209

166210
try:
167-
port_info_dict = platform_sfputil.get_transceiver_info_dict(physical_port)
211+
port_info_dict = _wrapper_get_transceiver_info(physical_port)
168212
if port_info_dict is not None:
169213
transceiver_dict[physical_port]=port_info_dict
170214
fvs = swsscommon.FieldValuePairs([('type', port_info_dict['type']),
@@ -209,15 +253,15 @@ def post_port_dom_threshold_info_to_db(logical_port_name, table,
209253
if stop.is_set():
210254
break
211255

212-
if not platform_sfputil.get_presence(physical_port):
256+
if not _wrapper_get_presence(physical_port):
213257
continue
214258

215259
port_name = get_physical_port_name(logical_port_name,
216260
ganged_member_num, ganged_port)
217261
ganged_member_num += 1
218262

219263
try:
220-
dom_info_dict = platform_sfputil.get_transceiver_dom_threshold_info_dict(physical_port)
264+
dom_info_dict = _wrapper_get_transceiver_dom_threshold_info(physical_port)
221265
if dom_info_dict is not None:
222266
beautify_dom_threshold_info_dict(dom_info_dict)
223267
fvs = swsscommon.FieldValuePairs(
@@ -267,14 +311,14 @@ def post_port_dom_info_to_db(logical_port_name, table, stop_event=threading.Even
267311
if stop_event.is_set():
268312
break
269313

270-
if not platform_sfputil.get_presence(physical_port):
314+
if not _wrapper_get_presence(physical_port):
271315
continue
272316

273317
port_name = get_physical_port_name(logical_port_name, ganged_member_num, ganged_port)
274318
ganged_member_num += 1
275319

276320
try:
277-
dom_info_dict = platform_sfputil.get_transceiver_dom_info_dict(physical_port)
321+
dom_info_dict = _wrapper_get_transceiver_dom_info(physical_port)
278322
if dom_info_dict is not None:
279323
beautify_dom_info_dict(dom_info_dict)
280324
fvs = swsscommon.FieldValuePairs(
@@ -537,7 +581,7 @@ def notify_media_setting(logical_port_name, transceiver_dict,
537581
logical_port_list = platform_sfputil.get_physical_to_logical(physical_port)
538582
num_logical_ports = len(logical_port_list)
539583
logical_idx = logical_port_list.index(logical_port_name)
540-
if not platform_sfputil.get_presence(physical_port):
584+
if not _wrapper_get_presence(physical_port):
541585
logger.log_info("Media %d presence not detected during notify"
542586
% physical_port)
543587
continue
@@ -553,7 +597,7 @@ def notify_media_setting(logical_port_name, transceiver_dict,
553597
media_dict = get_media_settings_value(physical_port, key)
554598

555599
if(len(media_dict) == 0):
556-
logger.log_error("Error in obtainning media setting")
600+
logger.log_error("Error in obtaining media setting")
557601
return
558602

559603
fvs = swsscommon.FieldValuePairs(len(media_dict))
@@ -629,13 +673,13 @@ class sfp_state_update_task:
629673

630674
# Start loop to listen to the sfp change event
631675
while not stopping_event.is_set():
632-
status, port_dict = platform_sfputil.get_transceiver_change_event()
676+
status, port_dict = _wrapper_get_transceiver_change_event()
633677
if status:
634678
for key, value in port_dict.iteritems():
635679
logical_port_list = platform_sfputil.get_physical_to_logical(int(key))
636680
for logical_port in logical_port_list:
637681
if value == SFP_STATUS_INSERTED:
638-
logger.log_info("Got SFP inserted event")
682+
logger.log_info("Got SFP inserted event {}".format(logical_port))
639683
rc = post_port_sfp_info_to_db(logical_port, int_tbl, transceiver_dict)
640684
# If we didn't get the sfp info, assuming the eeprom is not ready, give a try again.
641685
if rc == SFP_EEPROM_NOT_READY:
@@ -647,7 +691,7 @@ class sfp_state_update_task:
647691
notify_media_setting(logical_port, transceiver_dict, app_port_tbl)
648692
transceiver_dict.clear()
649693
elif value == SFP_STATUS_REMOVED:
650-
logger.log_info("Got SFP removed event")
694+
logger.log_info("Got SFP removed event {}".format(logical_port))
651695
del_port_sfp_dom_info_from_db(logical_port, int_tbl, dom_tbl)
652696
else:
653697
# TODO, SFP return error code, need handle accordingly.
@@ -735,15 +779,32 @@ class DaemonXcvrd(DaemonBase):
735779
# Initialize daemon
736780
def init(self):
737781
global platform_sfputil
782+
global platform_chassis
738783

739784
logger.log_info("Start daemon init...")
740785

741-
# Load platform specific sfputil class
786+
# Load new platform api class
742787
try:
743-
platform_sfputil = self.load_platform_util(PLATFORM_SPECIFIC_MODULE_NAME, PLATFORM_SPECIFIC_CLASS_NAME)
788+
import sonic_platform.platform
789+
import sonic_platform_base.sonic_sfp.sfputilhelper
790+
platform_chassis = sonic_platform.platform.Platform().get_chassis()
791+
logger.log_info("chassis loaded {}".format(platform_chassis))
792+
# we have to make use of sfputil for some features
793+
# even though when new platform api is used for all vendors.
794+
# in this sense, we treat it as a part of new platform api.
795+
# we have already moved sfputil to sonic_platform_base
796+
# which is the root of new platform api.
797+
platform_sfputil = sonic_platform_base.sonic_sfp.sfputilhelper.SfpUtilHelper()
744798
except Exception as e:
745-
logger.log_error("Failed to load sfputil: %s" % (str(e)), True)
746-
sys.exit(SFPUTIL_LOAD_ERROR)
799+
logger.log_warning("Failed to load chassis due to {}".format(repr(e)))
800+
801+
# Load platform specific sfputil class
802+
if platform_chassis is None or platform_sfputil is None:
803+
try:
804+
platform_sfputil = self.load_platform_util(PLATFORM_SPECIFIC_MODULE_NAME, PLATFORM_SPECIFIC_CLASS_NAME)
805+
except Exception as e:
806+
logger.log_error("Failed to load sfputil: %s" % (str(e)), True)
807+
sys.exit(SFPUTIL_LOAD_ERROR)
747808

748809
# Load port info
749810
try:

0 commit comments

Comments
 (0)