@@ -59,6 +59,8 @@ media_settings = ''
5959g_dict = {}
6060# Global platform specific sfputil class instance
6161platform_sfputil = None
62+ # Global chassis object based on new platform api
63+ platform_chassis = None
6264
6365# Global logger class instance
6466logger = Logger (SYSLOG_IDENTIFIER )
@@ -90,11 +92,53 @@ def get_physical_port_name(logical_port, physical_port, ganged):
9092# Strip units and beautify
9193def 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
100144def 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