Parse DHCP table (#8268)

This commit is contained in:
kellyyeh 2021-08-12 14:32:23 -07:00 committed by GitHub
parent 141dcbf594
commit 520c02b09c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 79 additions and 4 deletions

View File

@ -577,6 +577,29 @@ def parse_dpg(dpg, hname):
vlan_attributes['alias'] = vintfname vlan_attributes['alias'] = vintfname
vlans[sonic_vlan_name] = vlan_attributes vlans[sonic_vlan_name] = vlan_attributes
dhcp = child.find(str(QName(ns, "Dhcp")))
dhcp_table = {}
if dhcp is not None:
for vintf in dhcp.findall(str(QName(ns, "VlanInterface"))):
vintfname = vintf.find(str(QName(ns, "Name"))).text
dhcp_attributes = {}
dhcp_node = vintf.find(str(QName(ns, "Dhcpv6Relays")))
if dhcp_node is not None and dhcp_node.text is not None:
dhcpservers = dhcp_node.text
vdhcpserver_list = dhcpservers.split(';')
dhcp_attributes['dhcpv6_servers'] = vdhcpserver_list
option_linklayer_addr = vintf.find(str(QName(ns, "Dhcpv6OptionRfc6939")))
if option_linklayer_addr is not None and option_linklayer_addr.text == "true":
dhcp_attributes['dhcpv6_option|rfc6939_support'] = "true"
elif option_linklayer_addr is not None and option_linklayer_addr.text == "false":
dhcp_attributes['dhcpv6_option|rfc6939_support'] = "false"
dhcp_table[vintfname] = dhcp_attributes
acls = {} acls = {}
for aclintf in aclintfs.findall(str(QName(ns, "AclInterface"))): for aclintf in aclintfs.findall(str(QName(ns, "AclInterface"))):
if aclintf.find(str(QName(ns, "InAcl"))) is not None: if aclintf.find(str(QName(ns, "InAcl"))) is not None:
@ -691,7 +714,7 @@ def parse_dpg(dpg, hname):
if mg_key in mg_tunnel.attrib: if mg_key in mg_tunnel.attrib:
tunnelintfs[tunnel_type][tunnel_name][table_key] = mg_tunnel.attrib[mg_key] tunnelintfs[tunnel_type][tunnel_name][table_key] = mg_tunnel.attrib[mg_key]
return intfs, lo_intfs, mvrf, mgmt_intf, voq_inband_intfs, vlans, vlan_members, pcs, pc_members, acls, vni, tunnelintfs, dpg_ecmp_content return intfs, lo_intfs, mvrf, mgmt_intf, voq_inband_intfs, vlans, vlan_members, dhcp_table, pcs, pc_members, acls, vni, tunnelintfs, dpg_ecmp_content
return None, None, None, None, None, None, None, None, None, None, None, None, None return None, None, None, None, None, None, None, None, None, None, None, None, None
def parse_host_loopback(dpg, hname): def parse_host_loopback(dpg, hname):
@ -1159,6 +1182,7 @@ def parse_xml(filename, platform=None, port_config_file=None, asic_name=None, hw
tunnel_intfs = None tunnel_intfs = None
vlans = None vlans = None
vlan_members = None vlan_members = None
dhcp_table = None
pcs = None pcs = None
mgmt_intf = None mgmt_intf = None
voq_inband_intfs = None voq_inband_intfs = None
@ -1217,7 +1241,7 @@ def parse_xml(filename, platform=None, port_config_file=None, asic_name=None, hw
for child in root: for child in root:
if asic_name is None: if asic_name is None:
if child.tag == str(QName(ns, "DpgDec")): if child.tag == str(QName(ns, "DpgDec")):
(intfs, lo_intfs, mvrf, mgmt_intf, voq_inband_intfs, vlans, vlan_members, pcs, pc_members, acls, vni, tunnel_intfs, dpg_ecmp_content) = parse_dpg(child, hostname) (intfs, lo_intfs, mvrf, mgmt_intf, voq_inband_intfs, vlans, vlan_members, dhcp_table, pcs, pc_members, acls, vni, tunnel_intfs, dpg_ecmp_content) = parse_dpg(child, hostname)
elif child.tag == str(QName(ns, "CpgDec")): elif child.tag == str(QName(ns, "CpgDec")):
(bgp_sessions, bgp_internal_sessions, bgp_voq_chassis_sessions, bgp_asn, bgp_peers_with_range, bgp_monitors) = parse_cpg(child, hostname) (bgp_sessions, bgp_internal_sessions, bgp_voq_chassis_sessions, bgp_asn, bgp_peers_with_range, bgp_monitors) = parse_cpg(child, hostname)
elif child.tag == str(QName(ns, "PngDec")): elif child.tag == str(QName(ns, "PngDec")):
@ -1232,7 +1256,7 @@ def parse_xml(filename, platform=None, port_config_file=None, asic_name=None, hw
(port_speeds_default, port_descriptions, sys_ports) = parse_deviceinfo(child, hwsku) (port_speeds_default, port_descriptions, sys_ports) = parse_deviceinfo(child, hwsku)
else: else:
if child.tag == str(QName(ns, "DpgDec")): if child.tag == str(QName(ns, "DpgDec")):
(intfs, lo_intfs, mvrf, mgmt_intf, voq_inband_intfs, vlans, vlan_members, pcs, pc_members, acls, vni, tunnel_intfs, dpg_ecmp_content) = parse_dpg(child, asic_name) (intfs, lo_intfs, mvrf, mgmt_intf, voq_inband_intfs, vlans, vlan_members, dhcp_table, pcs, pc_members, acls, vni, tunnel_intfs, dpg_ecmp_content) = parse_dpg(child, asic_name)
host_lo_intfs = parse_host_loopback(child, hostname) host_lo_intfs = parse_host_loopback(child, hostname)
elif child.tag == str(QName(ns, "CpgDec")): elif child.tag == str(QName(ns, "CpgDec")):
(bgp_sessions, bgp_internal_sessions, bgp_voq_chassis_sessions, bgp_asn, bgp_peers_with_range, bgp_monitors) = parse_cpg(child, asic_name, local_devices) (bgp_sessions, bgp_internal_sessions, bgp_voq_chassis_sessions, bgp_asn, bgp_peers_with_range, bgp_monitors) = parse_cpg(child, asic_name, local_devices)
@ -1580,7 +1604,7 @@ def parse_xml(filename, platform=None, port_config_file=None, asic_name=None, hw
results['DEVICE_NEIGHBOR_METADATA'] = { key:devices[key] for key in devices if key in {device['name'] for device in neighbors.values()} } results['DEVICE_NEIGHBOR_METADATA'] = { key:devices[key] for key in devices if key in {device['name'] for device in neighbors.values()} }
results['SYSLOG_SERVER'] = dict((item, {}) for item in syslog_servers) results['SYSLOG_SERVER'] = dict((item, {}) for item in syslog_servers)
results['DHCP_SERVER'] = dict((item, {}) for item in dhcp_servers) results['DHCP_SERVER'] = dict((item, {}) for item in dhcp_servers)
results['DHCPv6_SERVER'] = dict((item, {}) for item in dhcpv6_servers) results['DHCP'] = dhcp_table
results['NTP_SERVER'] = dict((item, {}) for item in ntp_servers) results['NTP_SERVER'] = dict((item, {}) for item in ntp_servers)
results['TACPLUS_SERVER'] = dict((item, {'priority': '1', 'tcp_port': '49'}) for item in tacacs_servers) results['TACPLUS_SERVER'] = dict((item, {'priority': '1', 'tcp_port': '49'}) for item in tacacs_servers)
results['ACL_TABLE'] = filter_acl_table_bindings(acls, neighbors, pcs, sub_role) results['ACL_TABLE'] = filter_acl_table_bindings(acls, neighbors, pcs, sub_role)

View File

@ -148,6 +148,18 @@
<MacAddress i:nil="true"/> <MacAddress i:nil="true"/>
</VlanInterface> </VlanInterface>
</VlanInterfaces> </VlanInterfaces>
<Dhcp>
<VlanInterface>
<Name>Vlan1000</Name>
<Dhcpv6Relays>fc02:2000::1;fc02:2000::2</Dhcpv6Relays>
<Dhcpv6OptionRfc6939>true</Dhcpv6OptionRfc6939>
</VlanInterface>
<VlanInterface>
<Name>Vlan2000</Name>
<Dhcpv6Relays>fc02:2000::3;fc02:2000::4</Dhcpv6Relays>
<Dhcpv6OptionRfc6939>false</Dhcpv6OptionRfc6939>
</VlanInterface>
</Dhcp>
<IPInterfaces> <IPInterfaces>
<IPInterface> <IPInterface>
<Name i:nil="true"/> <Name i:nil="true"/>

View File

@ -820,3 +820,16 @@ class TestCfgGen(TestCase):
'admin_status': 'up' 'admin_status': 'up'
} }
) )
def test_minigraph_dhcp(self):
argument = '-m "' + self.sample_graph_simple_case + '" -p "' + self.port_config + '" -v DHCP'
output = self.run_script(argument)
self.assertEqual(
utils.to_dict(output.strip()),
utils.to_dict(
"{'Vlan1000': {'dhcpv6_servers': ['fc02:2000::1', 'fc02:2000::2'], 'dhcpv6_option|rfc6939_support': 'true'}, "
"'Vlan2000': {'dhcpv6_servers': ['fc02:2000::3', 'fc02:2000::4'], 'dhcpv6_option|rfc6939_support': 'false'}}"
)
)

View File

@ -357,3 +357,29 @@ class TestCfgGenCaseInsensitive(TestCase):
utils.to_dict(output.strip()), utils.to_dict(output.strip()),
expected_table expected_table
) )
def test_dhcp_table(self):
argument = '-m "' + self.sample_graph + '" -p "' + self.port_config + '" -v "DHCP"'
expected = {
'Vlan1000': {
'dhcpv6_servers': [
"fc02:2000::1",
"fc02:2000::2"
],
'dhcpv6_option|rfc6939_support': 'true'
},
'Vlan2000': {
'dhcpv6_servers': [
"fc02:2000::3",
"fc02:2000::4"
],
'dhcpv6_option|rfc6939_support': 'false'
}
}
output = self.run_script(argument)
self.assertEqual(
utils.to_dict(output.strip()),
expected
)