[minigraph]: Adding new secondary field to VLAN_INTERFACE table (#16827)

This is change taken as part of the HLD: sonic-net/SONiC#1470.
In this PR we add the logic to parse the SecondarySubnets field in the minigraph and add a flag in "secondary" in the vlan_interface table of the config db.

Microsoft ADO (number only): 16784946

How I did it
Made changes in the minigraph.py to parse the xml entry and add the parsed value to the config db

How to verify it
Added python tests in the sonic-config-engine folder to test the config db entries.
This commit is contained in:
Shashanka Balakuntala 2023-11-23 04:36:20 +05:30 committed by GitHub
parent 8b192a1151
commit 418ed10ae1
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 35 additions and 1 deletions

View File

@ -686,6 +686,17 @@ def parse_dpg(dpg, hname):
if vlanmac is not None and vlanmac.text is not None: if vlanmac is not None and vlanmac.text is not None:
vlan_attributes['mac'] = vlanmac.text vlan_attributes['mac'] = vlanmac.text
vintf_node = vintf.find(str(QName(ns, "SecondarySubnets")))
if vintf_node is not None and vintf_node.text is not None:
subnets = vintf_node.text.split(';')
for subnet in subnets:
if sys.version_info >= (3, 0):
network_def = ipaddress.ip_network(subnet, strict=False)
else:
network_def = ipaddress.ip_network(unicode(subnet), strict=False)
prefix = str(network_def[1]) + "/" + str(network_def.prefixlen)
intfs[(vintfname, prefix)]["secondary"] = "true"
sonic_vlan_name = "Vlan%s" % vlanid sonic_vlan_name = "Vlan%s" % vlanid
if sonic_vlan_name != vintfname: if sonic_vlan_name != vintfname:
vlan_attributes['alias'] = vintfname vlan_attributes['alias'] = vintfname
@ -1729,6 +1740,9 @@ def parse_xml(filename, platform=None, port_config_file=None, asic_name=None, hw
if intf[0][0:4] == 'Vlan': if intf[0][0:4] == 'Vlan':
vlan_intfs[intf] = {} vlan_intfs[intf] = {}
if "secondary" in intfs[intf]:
vlan_intfs[intf]["secondary"] = "true"
if bool(results['PEER_SWITCH']): if bool(results['PEER_SWITCH']):
vlan_intfs[intf[0]] = { vlan_intfs[intf[0]] = {
'proxy_arp': 'enabled', 'proxy_arp': 'enabled',
@ -1739,6 +1753,9 @@ def parse_xml(filename, platform=None, port_config_file=None, asic_name=None, hw
elif intf[0] in vlan_invert_mapping: elif intf[0] in vlan_invert_mapping:
vlan_intfs[(vlan_invert_mapping[intf[0]], intf[1])] = {} vlan_intfs[(vlan_invert_mapping[intf[0]], intf[1])] = {}
if "secondary" in intfs[intf]:
vlan_intfs[(vlan_invert_mapping[intf[0]], intf[1])]["secondary"] = "true"
if bool(results['PEER_SWITCH']): if bool(results['PEER_SWITCH']):
vlan_intfs[vlan_invert_mapping[intf[0]]] = { vlan_intfs[vlan_invert_mapping[intf[0]]] = {
'proxy_arp': 'enabled', 'proxy_arp': 'enabled',

View File

@ -138,6 +138,7 @@
<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>
<SecondarySubnets>192.168.1.0/27</SecondarySubnets>
<MacAddress>00:aa:bb:cc:dd:ee</MacAddress> <MacAddress>00:aa:bb:cc:dd:ee</MacAddress>
</VlanInterface> </VlanInterface>
<VlanInterface> <VlanInterface>
@ -176,6 +177,11 @@
<AttachTo>ab1</AttachTo> <AttachTo>ab1</AttachTo>
<Prefix>192.168.0.1/27</Prefix> <Prefix>192.168.0.1/27</Prefix>
</IPInterface> </IPInterface>
<IPInterface>
<Name i:nil="true"/>
<AttachTo>ab1</AttachTo>
<Prefix>192.168.1.1/27</Prefix>
</IPInterface>
</IPInterfaces> </IPInterfaces>
<DataAcls/> <DataAcls/>
<AclInterfaces> <AclInterfaces>

View File

@ -139,7 +139,10 @@ class TestCfgGenCaseInsensitive(TestCase):
def test_minigraph_vlan_interfaces_keys(self): def test_minigraph_vlan_interfaces_keys(self):
argument = ['-m', self.sample_graph, '-p', self.port_config, '-v', "VLAN_INTERFACE.keys()|list"] argument = ['-m', self.sample_graph, '-p', self.port_config, '-v', "VLAN_INTERFACE.keys()|list"]
output = self.run_script(argument) output = self.run_script(argument)
self.assertEqual(output.strip(), "[('Vlan1000', '192.168.0.1/27'), 'Vlan1000']") expected_list_dict = {
'list': ['Vlan1000', 'Vlan1000|192.168.0.1/27', 'Vlan1000|192.168.1.1/27']
}
self.assertEqual(utils.liststr_to_dict(output.strip()), expected_list_dict)
def test_minigraph_vlan_interfaces(self): def test_minigraph_vlan_interfaces(self):
argument = ['-m', self.sample_graph, '-p', self.port_config, '-v', "VLAN_INTERFACE"] argument = ['-m', self.sample_graph, '-p', self.port_config, '-v', "VLAN_INTERFACE"]
@ -149,6 +152,9 @@ class TestCfgGenCaseInsensitive(TestCase):
'Vlan1000': { 'Vlan1000': {
'proxy_arp': 'enabled', 'proxy_arp': 'enabled',
'grat_arp': 'enabled' 'grat_arp': 'enabled'
},
'Vlan1000|192.168.1.1/27': {
'secondary': 'true'
} }
} }
self.assertEqual(utils.to_dict(output.strip()), expected_table) self.assertEqual(utils.to_dict(output.strip()), expected_table)

View File

@ -158,6 +158,11 @@ module sonic-vlan {
(contains(../ip-prefix, '.') and current()='IPv4')"; (contains(../ip-prefix, '.') and current()='IPv4')";
type stypes:ip-family; type stypes:ip-family;
} }
leaf secondary {
description "Optional field to specify if the prefix is secondary subnet";
type boolean;
}
} }
/* end of VLAN_INTERFACE_LIST */ /* end of VLAN_INTERFACE_LIST */
} }