@@ -99,8 +99,10 @@ def get_portconfig_path(self, slotid=None, asic_id=None):
99
99
return None
100
100
101
101
def get_portmap (self , asic_id = None , include_internal = False ,
102
- hostname = None , switchid = None , slotid = None ):
102
+ hostname = None , switchid = None , slotid = None , card_type = None ):
103
103
aliases = []
104
+ front_panel_aliases = []
105
+ inband_aliases = []
104
106
portmap = {}
105
107
aliasmap = {}
106
108
portspeed = {}
@@ -109,7 +111,8 @@ def get_portmap(self, asic_id=None, include_internal=False,
109
111
front_panel_asic_ifnames = {}
110
112
front_panel_asic_id = {}
111
113
# All asic names
112
- asic_if_names = []
114
+ asic_if_names = {}
115
+ asic_if_ids = {}
113
116
sysports = []
114
117
port_coreid_index = - 1
115
118
port_core_portid_index = - 1
@@ -171,22 +174,27 @@ def get_portmap(self, asic_id=None, include_internal=False,
171
174
else :
172
175
alias = name
173
176
add_port = False
177
+
178
+ if role == "Ext" :
179
+ front_panel_aliases .append (alias )
180
+ if role == "Inb" :
181
+ inband_aliases .append (alias )
182
+
174
183
if role in {"Ext" } or (role in ["Int" , "Inb" , "Rec" ] and include_internal ):
175
184
add_port = True
176
185
aliases .append (
177
186
(alias , - 1 if port_index == - 1 or len (mapping ) <= port_index else mapping [port_index ]))
178
187
portmap [name ] = alias
179
188
aliasmap [alias ] = name
180
- if role == "Ext" and (asic_name_index != - 1 ) and (len (mapping ) > asic_name_index ):
189
+
190
+ if (asic_name_index != - 1 ) and (len (mapping ) > asic_name_index ):
181
191
asicifname = mapping [asic_name_index ]
182
- # we only want following ASIC info in minigraph for multi-asic
183
192
if asic_id is not None :
184
- front_panel_asic_ifnames [alias ] = asicifname
185
- front_panel_asic_id [alias ] = "ASIC" + \
186
- str (asic_id )
187
- if (asic_name_index != - 1 ) and (len (mapping ) > asic_name_index ):
188
- asicifname = mapping [asic_name_index ]
189
- asic_if_names .append (asicifname )
193
+ asic_if_names [alias ] = asicifname
194
+ asic_if_ids [alias ] = "ASIC" + str (asic_id )
195
+ if role == "Ext" :
196
+ front_panel_asic_ifnames [alias ] = asicifname
197
+ front_panel_asic_id [alias ] = "ASIC" + str (asic_id )
190
198
if (speed_index != - 1 ) and (len (mapping ) > speed_index ):
191
199
speed = mapping [speed_index ]
192
200
sysport ['speed' ] = speed
@@ -201,13 +209,16 @@ def get_portmap(self, asic_id=None, include_internal=False,
201
209
if (num_voq_index != - 1 ) and (len (mapping ) > num_voq_index ):
202
210
voq = mapping [num_voq_index ]
203
211
sysport ['num_voq' ] = voq
204
- sysport ['name' ] = name
205
- sysport ['hostname' ] = hostname
206
- sysport ['asic_name' ] = asic_name
207
- sysport ['switchid' ] = switchid
208
212
sysports .append (sysport )
209
213
if port_index != - 1 and len (mapping ) > port_index :
210
214
indexmap [mapping [port_index ]] = name
215
+
216
+ # Special handling for the Cpu port
217
+ if include_internal and card_type == "linecard" :
218
+ aliases .append (("Cpu0/{}" .format (asic_id if asic_id is not None else 0 ), - 1 ))
219
+ if asic_id is not None and card_type == "linecard" :
220
+ asic_if_names ["Cpu0/{}" .format (asic_id )] = "Cpu0"
221
+ asic_if_ids ["Cpu0/{}" .format (asic_id )] = "ASIC" + str (asic_id )
211
222
if len (sysports ) > 0 :
212
223
sysport = {}
213
224
sysport ['name' ] = 'Cpu0'
@@ -220,8 +231,9 @@ def get_portmap(self, asic_id=None, include_internal=False,
220
231
sysport ['hostname' ] = hostname
221
232
sysports .insert (0 , sysport )
222
233
223
- return (aliases , portmap , aliasmap , portspeed , front_panel_asic_ifnames , front_panel_asic_id , asic_if_names ,
224
- sysports , indexmap )
234
+ return (aliases , front_panel_aliases , inband_aliases , portmap , aliasmap , portspeed ,
235
+ front_panel_asic_ifnames , front_panel_asic_id ,
236
+ asic_if_names , asic_if_ids , sysports , indexmap )
225
237
226
238
227
239
def main ():
@@ -233,33 +245,46 @@ def main():
233
245
card_type = dict (type = 'str' , required = False ),
234
246
hostname = dict (type = 'str' , required = False ),
235
247
switchids = dict (type = 'list' , required = False ),
236
- slotid = dict (type = 'str' , required = False )
248
+ slotid = dict (type = 'str' , required = False ),
249
+ sort_by_index = dict (type = 'bool' , required = False , default = True )
237
250
),
238
251
supports_check_mode = True
239
252
)
240
253
m_args = module .params
241
254
try :
242
- aliases = []
243
- portmap = {}
244
- aliasmap = {}
245
- portspeed = {}
246
- sysports = []
247
- indexmap = {}
248
- # Map of ASIC interface names to front panel interfaces
249
- front_panel_asic_ifnames = {}
250
- front_panel_asic_ifs_asic_id = {}
251
- # { asic_name: [ asic interfaces] }
252
- asic_if_names = {}
255
+ aliases = [] # list of port aliases
256
+ front_panel_aliases = [] # list of (front panel port aliases, port indexes)
257
+ portmap = {} # name to alias map
258
+ aliasmap = {} # alias to name map
259
+ portspeed = {} # alias to speed map
260
+ sysports = [] # list of system ports
261
+ indexmap = {} # index to port name map
262
+ front_panel_asic_ifnames = {} # Map of interface aliases to interface names for front panel ports
263
+ front_panel_asic_ifs_asic_id = {} # Map of interface aliases to asic ids for front panel ports
264
+ asic_if_names = {} # Map of interface aliases to interface names for front panel ports
265
+ asic_if_asic_ids = {} # Map of interface aliases to asic ids
266
+ # Chassis related info
267
+ midplane_port_alias = [] # list of (midplane port aliases, port indexes)
268
+ inband_port_alias = [] # list of (inband port aliases, port indexes)
253
269
254
270
if 'card_type' in m_args and m_args ['card_type' ] == 'supervisor' :
271
+ midplane_port_alias .append (("Midplane" , 0 ))
272
+ if 'include_internal' in m_args and m_args ['include_internal' ] is True :
273
+ aliases .append (("Midplane" , - 1 ))
274
+
255
275
module .exit_json (ansible_facts = {'port_alias' : aliases ,
276
+ 'front_panel_port_alias' : front_panel_aliases ,
277
+ 'midplane_port_alias' : midplane_port_alias ,
278
+ 'inband_port_alias' : inband_port_alias ,
256
279
'port_name_map' : portmap ,
257
280
'port_alias_map' : aliasmap ,
258
281
'port_speed' : portspeed ,
259
282
'front_panel_asic_ifnames' : [],
260
283
'front_panel_asic_ids' : [],
261
- 'asic_if_names' : asic_if_names ,
262
- 'sysports' : sysports })
284
+ 'asic_if_names' : [],
285
+ 'asic_if_asic_ids' : [],
286
+ 'sysports' : sysports ,
287
+ 'port_index_map' : indexmap })
263
288
return
264
289
allmap = SonicPortAliasMap (m_args ['hwsku' ])
265
290
switchids = None
@@ -294,16 +319,32 @@ def main():
294
319
hostname = ""
295
320
if 'hostname' in m_args :
296
321
hostname = m_args ['hostname' ]
322
+ card_type = None
323
+ if 'card_type' in m_args :
324
+ card_type = m_args ['card_type' ]
325
+
326
+ if card_type == 'linecard' :
327
+ midplane_port_alias .append (("Midplane" , 0 )) # midplane port is always the first port (after the mgmt port)
328
+ if include_internal :
329
+ aliases .append (("Midplane" , - 1 ))
330
+
331
+ front_panel_aliases_set = set ()
332
+ inband_port_alias_set = set ()
297
333
for asic_id in range (num_asic ):
298
334
if switchids and asic_id is not None :
299
335
switchid = switchids [asic_id ]
300
336
if num_asic == 1 :
301
337
asic_id = None
302
- (aliases_asic , portmap_asic , aliasmap_asic , portspeed_asic , front_panel_asic , front_panel_asic_ids ,
303
- asicifnames_asic , sysport_asic , index_name ) = allmap .get_portmap (
304
- asic_id , include_internal , hostname , switchid , slotid )
338
+ (aliases_asic , front_panel_aliases_asic , inband_port_alias_asic , portmap_asic , aliasmap_asic ,
339
+ portspeed_asic , front_panel_asic , front_panel_asic_ids ,
340
+ asicifnames_asic , asicifids_asic , sysport_asic , indexmap_asic ) = allmap .get_portmap (
341
+ asic_id , include_internal , hostname , switchid , slotid , card_type )
305
342
if aliases_asic is not None :
306
343
aliases .extend (aliases_asic )
344
+ if front_panel_aliases_asic is not None :
345
+ front_panel_aliases_set .update (front_panel_aliases_asic )
346
+ if inband_port_alias_asic is not None :
347
+ inband_port_alias_set .update (inband_port_alias_asic )
307
348
if portmap_asic is not None :
308
349
portmap .update (portmap_asic )
309
350
if aliasmap_asic is not None :
@@ -315,32 +356,52 @@ def main():
315
356
if front_panel_asic_ids is not None :
316
357
front_panel_asic_ifs_asic_id .update (front_panel_asic_ids )
317
358
if asicifnames_asic is not None :
318
- asic = 'ASIC' + str (asic_id )
319
- asic_if_names [asic ] = asicifnames_asic
359
+ asic_if_names .update (asicifnames_asic )
360
+ if asicifids_asic is not None :
361
+ asic_if_asic_ids .update (asicifids_asic )
320
362
if sysport_asic is not None :
321
363
sysports .extend (sysport_asic )
322
- if index_name is not None :
323
- indexmap .update (index_name )
364
+ if indexmap_asic is not None :
365
+ indexmap .update (indexmap_asic )
324
366
325
367
# Sort the Interface Name needed in multi-asic
326
- aliases .sort (key = lambda x : int (x [1 ]))
368
+ if m_args ['sort_by_index' ]:
369
+ # Use the optional argument to enable opt out of sorting by index
370
+ aliases .sort (key = lambda x : int (x [1 ]))
371
+
327
372
# Get ASIC interface names list based on sorted aliases
328
373
front_panel_asic_ifnames_list = []
329
374
front_panel_asic_ifs_asic_id_list = []
375
+ asic_ifnames_list = []
376
+ asic_ifs_asic_id_list = []
330
377
for k in aliases :
331
378
if k [0 ] in front_panel_asic_ifnames :
332
379
front_panel_asic_ifnames_list .append (
333
380
front_panel_asic_ifnames [k [0 ]])
334
381
front_panel_asic_ifs_asic_id_list .append (
335
382
front_panel_asic_ifs_asic_id [k [0 ]])
383
+ if k [0 ] in asic_if_names :
384
+ asic_ifnames_list .append (asic_if_names [k [0 ]])
385
+ asic_ifs_asic_id_list .append (asic_if_asic_ids [k [0 ]])
386
+
387
+ # Get front panel and inband interface alias list based on sorted aliases
388
+ for i , k in enumerate (aliases ):
389
+ if k [0 ] in front_panel_aliases_set :
390
+ front_panel_aliases .append ((k [0 ], i ))
391
+ if k [0 ] in inband_port_alias_set :
392
+ inband_port_alias .append ((k [0 ], i ))
336
393
337
394
module .exit_json (ansible_facts = {'port_alias' : [k [0 ] for k in aliases ],
395
+ 'front_panel_port_alias' : front_panel_aliases ,
396
+ 'midplane_port_alias' : midplane_port_alias ,
397
+ 'inband_port_alias' : inband_port_alias ,
338
398
'port_name_map' : portmap ,
339
399
'port_alias_map' : aliasmap ,
340
400
'port_speed' : portspeed ,
341
401
'front_panel_asic_ifnames' : front_panel_asic_ifnames_list ,
342
402
'front_panel_asic_ifs_asic_id' : front_panel_asic_ifs_asic_id_list ,
343
- 'asic_if_names' : asic_if_names ,
403
+ 'asic_if_names' : asic_ifnames_list ,
404
+ 'asic_if_asic_ids' : asic_ifs_asic_id_list ,
344
405
'sysports' : sysports ,
345
406
'port_index_map' : indexmap })
346
407
@@ -349,7 +410,7 @@ def main():
349
410
module .fail_json (msg = fail_msg )
350
411
except Exception as e :
351
412
fail_msg = "failed to find the correct port config for " + \
352
- m_args ['hwsku' ] + str (e )
413
+ m_args ['hwsku' ] + " \n " + str (e )
353
414
module .fail_json (msg = fail_msg )
354
415
355
416
0 commit comments