Changed DHCP table name to DHCP_RELAY (#8476)

* Changed DHCP table name to DHCP_RELAY
This commit is contained in:
kellyyeh 2021-08-20 09:18:48 -07:00 committed by GitHub
parent f0e640f7e6
commit dab9c6983c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 21 additions and 49 deletions

View File

@ -526,6 +526,7 @@ def parse_dpg(dpg, hname):
vlanintfs = child.find(str(QName(ns, "VlanInterfaces"))) vlanintfs = child.find(str(QName(ns, "VlanInterfaces")))
vlans = {} vlans = {}
vlan_members = {} vlan_members = {}
dhcp_relay_table = {}
vlantype_name = "" vlantype_name = ""
intf_vlan_mbr = defaultdict(list) intf_vlan_mbr = defaultdict(list)
for vintf in vlanintfs.findall(str(QName(ns, "VlanInterface"))): for vintf in vlanintfs.findall(str(QName(ns, "VlanInterface"))):
@ -553,6 +554,7 @@ def parse_dpg(dpg, hname):
vlan_members[(sonic_vlan_member_name, vmbr_list[i])] = {'tagging_mode': 'untagged'} vlan_members[(sonic_vlan_member_name, vmbr_list[i])] = {'tagging_mode': 'untagged'}
vlan_attributes = {'vlanid': vlanid, 'members': vmbr_list } vlan_attributes = {'vlanid': vlanid, 'members': vmbr_list }
dhcp_attributes = {}
# If this VLAN requires a DHCP relay agent, it will contain a <DhcpRelays> element # If this VLAN requires a DHCP relay agent, it will contain a <DhcpRelays> element
# containing a list of DHCP server IPs # containing a list of DHCP server IPs
@ -567,6 +569,9 @@ def parse_dpg(dpg, hname):
vintfdhcpservers = vintf_node.text vintfdhcpservers = vintf_node.text
vdhcpserver_list = vintfdhcpservers.split(';') vdhcpserver_list = vintfdhcpservers.split(';')
vlan_attributes['dhcpv6_servers'] = vdhcpserver_list vlan_attributes['dhcpv6_servers'] = vdhcpserver_list
dhcp_attributes['dhcpv6_servers'] = vdhcpserver_list
sonic_vlan_member_name = "Vlan%s" % (vlanid)
dhcp_relay_table[sonic_vlan_member_name] = dhcp_attributes
vlanmac = vintf.find(str(QName(ns, "MacAddress"))) vlanmac = vintf.find(str(QName(ns, "MacAddress")))
if vlanmac is not None and vlanmac.text is not None: if vlanmac is not None and vlanmac.text is not None:
@ -577,29 +582,6 @@ 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:
@ -714,7 +696,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, dhcp_table, pcs, pc_members, acls, vni, tunnelintfs, dpg_ecmp_content return intfs, lo_intfs, mvrf, mgmt_intf, voq_inband_intfs, vlans, vlan_members, dhcp_relay_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):
@ -1182,7 +1164,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 dhcp_relay_table = None
pcs = None pcs = None
mgmt_intf = None mgmt_intf = None
voq_inband_intfs = None voq_inband_intfs = None
@ -1241,7 +1223,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, dhcp_table, 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_relay_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")):
@ -1256,7 +1238,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, dhcp_table, 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_relay_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)
@ -1604,7 +1586,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['DHCP'] = dhcp_table results['DHCP_RELAY'] = dhcp_relay_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

@ -134,6 +134,7 @@
<Name>ab1</Name> <Name>ab1</Name>
<AttachTo>fortyGigE0/8</AttachTo> <AttachTo>fortyGigE0/8</AttachTo>
<DhcpRelays>192.0.0.1;192.0.0.2</DhcpRelays> <DhcpRelays>192.0.0.1;192.0.0.2</DhcpRelays>
<Dhcpv6Relays>fc02:2000::1;fc02:2000::2</Dhcpv6Relays>
<VlanID>1000</VlanID> <VlanID>1000</VlanID>
<Tag>1000</Tag> <Tag>1000</Tag>
<Subnets>192.168.0.0/27</Subnets> <Subnets>192.168.0.0/27</Subnets>
@ -143,23 +144,12 @@
<Name>ab2</Name> <Name>ab2</Name>
<AttachTo>fortyGigE0/4</AttachTo> <AttachTo>fortyGigE0/4</AttachTo>
<DhcpRelays>192.0.0.1</DhcpRelays> <DhcpRelays>192.0.0.1</DhcpRelays>
<Dhcpv6Relays>fc02:2000::3;fc02:2000::4</Dhcpv6Relays>
<VlanID>2000</VlanID> <VlanID>2000</VlanID>
<Tag>2000</Tag> <Tag>2000</Tag>
<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

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

View File

@ -102,6 +102,7 @@ class TestCfgGenCaseInsensitive(TestCase):
'Vlan1000': { 'Vlan1000': {
'alias': 'ab1', 'alias': 'ab1',
'dhcp_servers': ['192.0.0.1', '192.0.0.2'], 'dhcp_servers': ['192.0.0.1', '192.0.0.2'],
'dhcpv6_servers': ['fc02:2000::1', 'fc02:2000::2'],
'vlanid': '1000', 'vlanid': '1000',
'mac': '00:aa:bb:cc:dd:ee', 'mac': '00:aa:bb:cc:dd:ee',
'members': ['Ethernet8'] 'members': ['Ethernet8']
@ -109,6 +110,7 @@ class TestCfgGenCaseInsensitive(TestCase):
'Vlan2000': { 'Vlan2000': {
'alias': 'ab2', 'alias': 'ab2',
'dhcp_servers': ['192.0.0.1'], 'dhcp_servers': ['192.0.0.1'],
'dhcpv6_servers': ['fc02:2000::3', 'fc02:2000::4'],
'members': ['Ethernet4'], 'members': ['Ethernet4'],
'vlanid': '2000' 'vlanid': '2000'
} }
@ -359,21 +361,19 @@ class TestCfgGenCaseInsensitive(TestCase):
) )
def test_dhcp_table(self): def test_dhcp_table(self):
argument = '-m "' + self.sample_graph + '" -p "' + self.port_config + '" -v "DHCP"' argument = '-m "' + self.sample_graph + '" -p "' + self.port_config + '" -v "DHCP_RELAY"'
expected = { expected = {
'Vlan1000': { 'Vlan1000': {
'dhcpv6_servers': [ 'dhcpv6_servers': [
"fc02:2000::1", "fc02:2000::1",
"fc02:2000::2" "fc02:2000::2"
], ]
'dhcpv6_option|rfc6939_support': 'true'
}, },
'Vlan2000': { 'Vlan2000': {
'dhcpv6_servers': [ 'dhcpv6_servers': [
"fc02:2000::3", "fc02:2000::3",
"fc02:2000::4" "fc02:2000::4"
], ]
'dhcpv6_option|rfc6939_support': 'false'
} }
} }
output = self.run_script(argument) output = self.run_script(argument)