[202012] Fix tagged VlanInterface if attached to multiple vlan as untagged member (#10589)
Backport https://github.com/Azure/sonic-buildimage/pull/8927 to 202012 branch
This commit is contained in:
parent
502ddbb249
commit
be5eb80b14
@ -518,28 +518,36 @@ def parse_dpg(dpg, hname):
|
||||
vlans = {}
|
||||
vlan_members = {}
|
||||
dhcp_relay_table = {}
|
||||
vlantype_name = ""
|
||||
intf_vlan_mbr = defaultdict(list)
|
||||
# Dict: vlan member (port/PortChannel) -> set of VlanID, in which the member if an untagged vlan member
|
||||
untagged_vlan_mbr = defaultdict(set)
|
||||
for vintf in vlanintfs.findall(str(QName(ns, "VlanInterface"))):
|
||||
vlanid = vintf.find(str(QName(ns, "VlanID"))).text
|
||||
vlantype = vintf.find(str(QName(ns, "Type")))
|
||||
if vlantype is None:
|
||||
vlantype_name = ""
|
||||
else:
|
||||
vlantype_name = vlantype.text
|
||||
vintfmbr = vintf.find(str(QName(ns, "AttachTo"))).text
|
||||
vmbr_list = vintfmbr.split(';')
|
||||
for i, member in enumerate(vmbr_list):
|
||||
intf_vlan_mbr[member].append(vlanid)
|
||||
if vlantype_name != "Tagged":
|
||||
for member in vmbr_list:
|
||||
untagged_vlan_mbr[member].add(vlanid)
|
||||
for vintf in vlanintfs.findall(str(QName(ns, "VlanInterface"))):
|
||||
vintfname = vintf.find(str(QName(ns, "Name"))).text
|
||||
vlanid = vintf.find(str(QName(ns, "VlanID"))).text
|
||||
vintfmbr = vintf.find(str(QName(ns, "AttachTo"))).text
|
||||
vlantype = vintf.find(str(QName(ns, "Type")))
|
||||
if vlantype != None:
|
||||
vlantype_name = vintf.find(str(QName(ns, "Type"))).text
|
||||
if vlantype is None:
|
||||
vlantype_name = ""
|
||||
else:
|
||||
vlantype_name = vlantype.text
|
||||
vmbr_list = vintfmbr.split(';')
|
||||
for i, member in enumerate(vmbr_list):
|
||||
vmbr_list[i] = port_alias_map.get(member, member)
|
||||
sonic_vlan_member_name = "Vlan%s" % (vlanid)
|
||||
if vlantype_name == "Tagged":
|
||||
vlan_members[(sonic_vlan_member_name, vmbr_list[i])] = {'tagging_mode': 'tagged'}
|
||||
elif len(intf_vlan_mbr[member]) > 1:
|
||||
elif len(untagged_vlan_mbr[member]) > 1:
|
||||
vlan_members[(sonic_vlan_member_name, vmbr_list[i])] = {'tagging_mode': 'tagged'}
|
||||
else:
|
||||
vlan_members[(sonic_vlan_member_name, vmbr_list[i])] = {'tagging_mode': 'untagged'}
|
||||
|
@ -164,6 +164,14 @@
|
||||
<Tag>1000</Tag>
|
||||
<Subnets>192.168.0.0/27</Subnets>
|
||||
</VlanInterface>
|
||||
<VlanInterface>
|
||||
<Name>ab4</Name>
|
||||
<AttachTo>fortyGigE0/8</AttachTo>
|
||||
<DhcpRelays>192.0.0.1;192.0.0.2</DhcpRelays>
|
||||
<VlanID>1001</VlanID>
|
||||
<Tag>1001</Tag>
|
||||
<Subnets>192.168.0.32/27</Subnets>
|
||||
</VlanInterface>
|
||||
<VlanInterface>
|
||||
<Name>kk1</Name>
|
||||
<AttachTo>fortyGigE0/12</AttachTo>
|
||||
@ -179,6 +187,7 @@
|
||||
<DhcpRelays>192.0.0.1;192.0.0.2</DhcpRelays>
|
||||
<VlanID>2000</VlanID>
|
||||
<Tag>2000</Tag>
|
||||
<Type>Tagged</Type>
|
||||
<Subnets>192.168.0.240/27</Subnets>
|
||||
</VlanInterface>
|
||||
<VlanInterface>
|
||||
|
@ -164,6 +164,14 @@
|
||||
<Tag>1000</Tag>
|
||||
<Subnets>192.168.0.0/27</Subnets>
|
||||
</VlanInterface>
|
||||
<VlanInterface>
|
||||
<Name>ab4</Name>
|
||||
<AttachTo>fortyGigE0/8</AttachTo>
|
||||
<DhcpRelays>192.0.0.1;192.0.0.2</DhcpRelays>
|
||||
<VlanID>1001</VlanID>
|
||||
<Tag>1001</Tag>
|
||||
<Subnets>192.168.0.32/27</Subnets>
|
||||
</VlanInterface>
|
||||
<VlanInterface>
|
||||
<Name>kk1</Name>
|
||||
<AttachTo>fortyGigE0/12</AttachTo>
|
||||
|
@ -164,6 +164,14 @@
|
||||
<Tag>1000</Tag>
|
||||
<Subnets>192.168.0.0/27</Subnets>
|
||||
</VlanInterface>
|
||||
<VlanInterface>
|
||||
<Name>ab4</Name>
|
||||
<AttachTo>fortyGigE0/8</AttachTo>
|
||||
<DhcpRelays>192.0.0.1;192.0.0.2</DhcpRelays>
|
||||
<VlanID>1001</VlanID>
|
||||
<Tag>1001</Tag>
|
||||
<Subnets>192.168.0.32/27</Subnets>
|
||||
</VlanInterface>
|
||||
<VlanInterface>
|
||||
<Name>kk1</Name>
|
||||
<AttachTo>fortyGigE0/12</AttachTo>
|
||||
@ -179,6 +187,7 @@
|
||||
<DhcpRelays>192.0.0.1;192.0.0.2</DhcpRelays>
|
||||
<VlanID>2000</VlanID>
|
||||
<Tag>2000</Tag>
|
||||
<Type>Tagged</Type>
|
||||
<Subnets>192.168.0.240/27</Subnets>
|
||||
</VlanInterface>
|
||||
<VlanInterface>
|
||||
|
@ -134,6 +134,7 @@ class TestCfgGen(TestCase):
|
||||
utils.to_dict(output.strip()),
|
||||
utils.to_dict(
|
||||
'{\n "Vlan1000|Ethernet8": {\n "tagging_mode": "tagged"\n },'
|
||||
' \n "Vlan1001|Ethernet8": {\n "tagging_mode": "tagged"\n },'
|
||||
' \n "Vlan2000|Ethernet12": {\n "tagging_mode": "tagged"\n },'
|
||||
' \n "Vlan2001|Ethernet12": {\n "tagging_mode": "tagged"\n },'
|
||||
' \n "Vlan2020|Ethernet12": {\n "tagging_mode": "tagged"\n }\n}'
|
||||
@ -143,9 +144,10 @@ class TestCfgGen(TestCase):
|
||||
self.assertEqual(
|
||||
utils.to_dict(output.strip()),
|
||||
utils.to_dict(
|
||||
'{\n "Vlan1000|Ethernet8": {\n "tagging_mode": "untagged"\n },'
|
||||
'{\n "Vlan1000|Ethernet8": {\n "tagging_mode": "tagged"\n },'
|
||||
' \n "Vlan1001|Ethernet8": {\n "tagging_mode": "tagged"\n },'
|
||||
' \n "Vlan2000|Ethernet12": {\n "tagging_mode": "tagged"\n },'
|
||||
' \n "Vlan2001|Ethernet12": {\n "tagging_mode": "tagged"\n },'
|
||||
' \n "Vlan2001|Ethernet12": {\n "tagging_mode": "untagged"\n },'
|
||||
' \n "Vlan2020|Ethernet12": {\n "tagging_mode": "tagged"\n }\n}'
|
||||
)
|
||||
)
|
||||
@ -232,6 +234,7 @@ class TestCfgGen(TestCase):
|
||||
utils.to_dict(output.strip()),
|
||||
utils.to_dict(
|
||||
"{'Vlan1000': {'alias': 'ab1', 'dhcp_servers': ['192.0.0.1', '192.0.0.2'], 'vlanid': '1000', 'members': ['Ethernet8']}, "
|
||||
"'Vlan1001': {'alias': 'ab4', 'dhcp_servers': ['192.0.0.1', '192.0.0.2'], 'vlanid': '1001', 'members': ['Ethernet8']},"
|
||||
"'Vlan2001': {'alias': 'ab3', 'dhcp_servers': ['192.0.0.1', '192.0.0.2'], 'vlanid': '2001', 'members': ['Ethernet12']},"
|
||||
"'Vlan2000': {'alias': 'ab2', 'dhcp_servers': ['192.0.0.1', '192.0.0.2'], 'vlanid': '2000', 'members': ['Ethernet12']},"
|
||||
"'Vlan2020': {'alias': 'kk1', 'dhcp_servers': ['192.0.0.1', '192.0.0.2'], 'vlanid': '2020', 'members': ['Ethernet12']}}"
|
||||
@ -248,6 +251,7 @@ class TestCfgGen(TestCase):
|
||||
utils.to_dict(output.strip()),
|
||||
utils.to_dict(
|
||||
"{('Vlan2000', 'Ethernet12'): {'tagging_mode': 'tagged'}, "
|
||||
"('Vlan1001', 'Ethernet8'): {'tagging_mode': 'tagged'}, "
|
||||
"('Vlan1000', 'Ethernet8'): {'tagging_mode': 'tagged'}, "
|
||||
"('Vlan2020', 'Ethernet12'): {'tagging_mode': 'tagged'}, "
|
||||
"('Vlan2001', 'Ethernet12'): {'tagging_mode': 'tagged'}}"
|
||||
@ -258,9 +262,10 @@ class TestCfgGen(TestCase):
|
||||
utils.to_dict(output.strip()),
|
||||
utils.to_dict(
|
||||
"{('Vlan2000', 'Ethernet12'): {'tagging_mode': 'tagged'}, "
|
||||
"('Vlan1000', 'Ethernet8'): {'tagging_mode': 'untagged'}, "
|
||||
"('Vlan1000', 'Ethernet8'): {'tagging_mode': 'tagged'}, "
|
||||
"('Vlan1001', 'Ethernet8'): {'tagging_mode': 'tagged'}, "
|
||||
"('Vlan2020', 'Ethernet12'): {'tagging_mode': 'tagged'}, "
|
||||
"('Vlan2001', 'Ethernet12'): {'tagging_mode': 'tagged'}}"
|
||||
"('Vlan2001', 'Ethernet12'): {'tagging_mode': 'untagged'}}"
|
||||
)
|
||||
)
|
||||
|
||||
@ -626,6 +631,9 @@ class TestCfgGen(TestCase):
|
||||
def test_minigraph_sub_port_interfaces(self, check_stderr=True):
|
||||
self.verify_sub_intf(check_stderr=check_stderr)
|
||||
|
||||
def test_minigraph_sub_port_intf_resource_type_non_backend_tor(self, check_stderr=True):
|
||||
self.verify_sub_intf_non_backend_tor(graph_file=self.sample_resource_graph, check_stderr=check_stderr)
|
||||
|
||||
def test_minigraph_sub_port_intf_resource_type(self, check_stderr=True):
|
||||
self.verify_sub_intf(graph_file=self.sample_resource_graph, check_stderr=check_stderr)
|
||||
|
||||
@ -659,6 +667,14 @@ class TestCfgGen(TestCase):
|
||||
output = self.run_script(argument)
|
||||
self.assertEqual(output.strip(), "{}")
|
||||
|
||||
def verify_sub_intf_non_backend_tor(self, **kwargs):
|
||||
graph_file = kwargs.get('graph_file', self.sample_graph_simple)
|
||||
|
||||
# All the other tables stay unchanged
|
||||
self.test_var_json_data(graph_file=graph_file)
|
||||
self.test_minigraph_vlans(graph_file=graph_file)
|
||||
self.test_minigraph_vlan_members(graph_file=graph_file)
|
||||
|
||||
def verify_sub_intf(self, **kwargs):
|
||||
graph_file = kwargs.get('graph_file', self.sample_graph_simple)
|
||||
check_stderr = kwargs.get('check_stderr', True)
|
||||
|
Reference in New Issue
Block a user