[Chassis] parse 400g zr port config from minigraph (#11616)

Signed-off-by: Arvindsrinivasan Lakshmi Narasimhan arlakshm@microsoft.com

Why I did it
Generate the port configuration required 400G ZR port from minigraph.

How I did it
Add parse logic to get tx_power and laser_freq from LinkMetadata section of the minigraph.
Add UT for packet-chassis and voq chassis

How to verify it
UT
Signed-off-by: Arvindsrinivasan Lakshmi Narasimhan <arlakshm@microsoft.com>
This commit is contained in:
arlakshm 2022-08-12 11:55:18 -07:00 committed by Ying Xie
parent 25e48f9a12
commit f9bfa47e8f
4 changed files with 66 additions and 1 deletions

View File

@ -972,7 +972,8 @@ def parse_linkmeta(meta, hname):
lower_tor_hostname = '' lower_tor_hostname = ''
auto_negotiation = None auto_negotiation = None
macsec_enabled = False macsec_enabled = False
tx_power = None
laser_freq = None
properties = linkmeta.find(str(QName(ns1, "Properties"))) properties = linkmeta.find(str(QName(ns1, "Properties")))
for device_property in properties.findall(str(QName(ns1, "DeviceProperty"))): for device_property in properties.findall(str(QName(ns1, "DeviceProperty"))):
name = device_property.find(str(QName(ns1, "Name"))).text name = device_property.find(str(QName(ns1, "Name"))).text
@ -989,6 +990,10 @@ def parse_linkmeta(meta, hname):
auto_negotiation = value auto_negotiation = value
elif name == "MacSecEnabled": elif name == "MacSecEnabled":
macsec_enabled = value macsec_enabled = value
elif name == "TxPower":
tx_power = value
elif name == "Frequency":
laser_freq = value
linkmetas[port] = {} linkmetas[port] = {}
if fec_disabled: if fec_disabled:
@ -1002,6 +1007,11 @@ def parse_linkmeta(meta, hname):
linkmetas[port]["AutoNegotiation"] = auto_negotiation linkmetas[port]["AutoNegotiation"] = auto_negotiation
if macsec_enabled: if macsec_enabled:
linkmetas[port]["MacSecEnabled"] = macsec_enabled linkmetas[port]["MacSecEnabled"] = macsec_enabled
if tx_power:
linkmetas[port]["tx_power"] = tx_power
# Convert the freq in GHz
if laser_freq:
linkmetas[port]["laser_freq"] = int(float(laser_freq)*1000)
return linkmetas return linkmetas
def parse_macsec_profile(val_string): def parse_macsec_profile(val_string):
@ -1613,6 +1623,14 @@ def parse_xml(filename, platform=None, port_config_file=None, asic_name=None, hw
if macsec_enabled and 'PrimaryKey' in macsec_profile: if macsec_enabled and 'PrimaryKey' in macsec_profile:
port['macsec'] = macsec_profile['PrimaryKey'] port['macsec'] = macsec_profile['PrimaryKey']
tx_power = linkmetas.get(alias, {}).get('tx_power')
if tx_power:
port['tx_power'] = tx_power
laser_freq = linkmetas.get(alias, {}).get('laser_freq')
if laser_freq:
port['laser_freq'] = laser_freq
# set port description if parsed from deviceinfo # set port description if parsed from deviceinfo
for port_name in port_descriptions: for port_name in port_descriptions:
# ignore port not in port_config.ini # ignore port not in port_config.ini

View File

@ -222,6 +222,25 @@
</IPNextHops> </IPNextHops>
</DeviceDataPlaneInfo> </DeviceDataPlaneInfo>
</DpgDec> </DpgDec>
<LinkMetadataDeclaration>
<Link xmlns:a="http://schemas.datacontract.org/2004/07/Microsoft.Search.Autopilot.Evolution">
<a:LinkMetadata>
<a:Name i:nil="true"/>
<a:Properties>
<a:DeviceProperty>
<a:Name>Frequency</a:Name>
<a:Value>131</a:Value>
</a:DeviceProperty>
<a:DeviceProperty>
<a:Name>TxPower</a:Name>
<a:Value>7.5</a:Value>
</a:DeviceProperty>
</a:Properties>
<a:Key>str2-8808-lc2-1:Eth1/1/13;ARISTA01-RH:Ethernet1/1</a:Key>
</a:LinkMetadata>
</Link>
<Properties xmlns:a="http://schemas.datacontract.org/2004/07/Microsoft.Search.Autopilot.Evolution"/>
</LinkMetadataDeclaration>
<PngDec> <PngDec>
<DeviceInterfaceLinks> <DeviceInterfaceLinks>
<DeviceLinkBase> <DeviceLinkBase>

View File

@ -79,6 +79,20 @@
</a:Properties> </a:Properties>
<a:Key>linecard-1:Ethernet1/1;ARISTA01-RH:Ethernet1/1</a:Key> <a:Key>linecard-1:Ethernet1/1;ARISTA01-RH:Ethernet1/1</a:Key>
</a:LinkMetadata> </a:LinkMetadata>
<a:LinkMetadata>
<a:Name i:nil="true"/>
<a:Properties>
<a:DeviceProperty>
<a:Name>Frequency</a:Name>
<a:Value>195.875</a:Value>
</a:DeviceProperty>
<a:DeviceProperty>
<a:Name>TxPower</a:Name>
<a:Value>-10</a:Value>
</a:DeviceProperty>
</a:Properties>
<a:Key>linecard-1:Ethernet2/1;ARISTA01-RH:Ethernet1/1</a:Key>
</a:LinkMetadata>
</Link> </Link>
<Properties xmlns:a="http://schemas.datacontract.org/2004/07/Microsoft.Search.Autopilot.Evolution"/> <Properties xmlns:a="http://schemas.datacontract.org/2004/07/Microsoft.Search.Autopilot.Evolution"/>
</LinkMetadataDeclaration> </LinkMetadataDeclaration>

View File

@ -1008,3 +1008,17 @@ class TestCfgGen(TestCase):
utils.to_dict(output.strip()), utils.to_dict(output.strip()),
utils.to_dict("{('PortChannel32.2', '192.168.1.4/24'): {}, 'PortChannel32.2': {'admin_status': 'up'}, ('PortChannel33.2', '192.168.2.4/24'): {}, 'PortChannel33.2': {'admin_status': 'up'}}") utils.to_dict("{('PortChannel32.2', '192.168.1.4/24'): {}, 'PortChannel32.2': {'admin_status': 'up'}, ('PortChannel33.2', '192.168.2.4/24'): {}, 'PortChannel33.2': {'admin_status': 'up'}}")
) )
def test_minigraph_voq_400g_zr_port_config(self):
argument = "-j {} -m {} -p {} -v \"PORT[\'Ethernet4\']\"".format(self.macsec_profile, self.sample_graph_voq, self.voq_port_config)
output = self.run_script(argument)
output_dict = utils.to_dict(output.strip())
self.assertEqual(output_dict['tx_power'], '-10')
self.assertEqual(output_dict['laser_freq'], 195875)
def test_minigraph_packet_chassis_400g_zr_port_config(self):
argument = "-m {} -p {} -n asic1 -v \"PORT[\'Ethernet13\']\"".format(self.packet_chassis_graph, self.packet_chassis_port_ini)
output = self.run_script(argument)
output_dict = utils.to_dict(output.strip())
self.assertEqual(output_dict['tx_power'], '7.5')
self.assertEqual(output_dict['laser_freq'], 131000)