@@ -415,6 +415,39 @@ def parse_meta(meta, hname):
415
415
deployment_id = value
416
416
return syslog_servers , dhcp_servers , ntp_servers , tacacs_servers , mgmt_routes , erspan_dst , deployment_id
417
417
418
+
419
+ def parse_linkmeta (meta , hname ):
420
+ link = meta .find (str (QName (ns , "Link" )))
421
+ linkmetas = {}
422
+ for linkmeta in link .findall (str (QName (ns1 , "LinkMetadata" ))):
423
+ port = None
424
+ fec_disabled = None
425
+
426
+ # Sample: ARISTA05T1:Ethernet1/33;switch-t0:fortyGigE0/4
427
+ key = linkmeta .find (str (QName (ns1 , "Key" ))).text
428
+ endpoints = key .split (';' )
429
+ for endpoint in endpoints :
430
+ t = endpoint .split (':' )
431
+ if len (t ) == 2 and t [0 ].lower () == hname .lower ():
432
+ port = t [1 ]
433
+ break
434
+ else :
435
+ # Cannot find a matching hname, something went wrong
436
+ continue
437
+
438
+ properties = linkmeta .find (str (QName (ns1 , "Properties" )))
439
+ for device_property in properties .findall (str (QName (ns1 , "DeviceProperty" ))):
440
+ name = device_property .find (str (QName (ns1 , "Name" ))).text
441
+ value = device_property .find (str (QName (ns1 , "Value" ))).text
442
+ if name == "FECDisabled" :
443
+ fec_disabled = value
444
+
445
+ linkmetas [port ] = {}
446
+ if fec_disabled :
447
+ linkmetas [port ]["FECDisabled" ] = fec_disabled
448
+ return linkmetas
449
+
450
+
418
451
def parse_deviceinfo (meta , hwsku ):
419
452
port_speeds = {}
420
453
port_descriptions = {}
@@ -468,7 +501,6 @@ def filter_acl_mirror_table_bindings(acls, neighbors, port_channels):
468
501
469
502
def parse_xml (filename , platform = None , port_config_file = None ):
470
503
root = ET .parse (filename ).getroot ()
471
- mini_graph_path = filename
472
504
473
505
u_neighbors = None
474
506
u_devices = None
@@ -500,6 +532,7 @@ def parse_xml(filename, platform=None, port_config_file=None):
500
532
erspan_dst = []
501
533
bgp_peers_with_range = None
502
534
deployment_id = None
535
+ linkmetas = {}
503
536
504
537
hwsku_qn = QName (ns , "HwSku" )
505
538
hostname_qn = QName (ns , "Hostname" )
@@ -525,6 +558,8 @@ def parse_xml(filename, platform=None, port_config_file=None):
525
558
(u_neighbors , u_devices , _ , _ , _ , _ , _ , _ ) = parse_png (child , hostname )
526
559
elif child .tag == str (QName (ns , "MetadataDeclaration" )):
527
560
(syslog_servers , dhcp_servers , ntp_servers , tacacs_servers , mgmt_routes , erspan_dst , deployment_id ) = parse_meta (child , hostname )
561
+ elif child .tag == str (QName (ns , "LinkMetadataDeclaration" )):
562
+ linkmetas = parse_linkmeta (child , hostname )
528
563
elif child .tag == str (QName (ns , "DeviceInfos" )):
529
564
(port_speeds_default , port_descriptions ) = parse_deviceinfo (child , hwsku )
530
565
@@ -596,7 +631,14 @@ def parse_xml(filename, platform=None, port_config_file=None):
596
631
ports .setdefault (port_name , {})['speed' ] = port_speed_png [port_name ]
597
632
598
633
for port_name , port in ports .items ():
599
- if port .get ('speed' ) == '100000' :
634
+ # get port alias from port_config.ini
635
+ if port_config_file :
636
+ alias = port .get ('alias' )
637
+ else :
638
+ alias = port_name
639
+ # generate default 100G FEC
640
+ # Note: FECDisabled only be effective on 100G port right now
641
+ if port .get ('speed' ) == '100000' and linkmetas .get (alias , {}).get ('FECDisabled' , '' ).lower () != 'true' :
600
642
port ['fec' ] = 'rs'
601
643
602
644
# set port description if parsed from deviceinfo
0 commit comments