Skip to content

Commit 7a8024a

Browse files
authored
Prevent user from adding more then a single untagged VLAN to an interface (sonic-net#1382)
Fix for sonic-net#6421 **- What I did** User was able to add an interface to multiple VLANs as untagged. Added a validation to a single untagged member. **- How I did it** Added a validation when adding a port as untagged to check in DB if is already member as untagged in a different vlan. **- How to verify it** Add vlan, add interface as untagged member in this vlan, add another vlan, try to add the same interface as untagged member in the new vlan. **- Previous command output (if the output of a command-line utility has changed)** Command was successful. **- New command output (if the output of a command-line utility has changed)** Fail in VLAN membership. Error: Ethernet8 is already untagged member!
1 parent 41e62c6 commit 7a8024a

File tree

3 files changed

+42
-0
lines changed

3 files changed

+42
-0
lines changed

config/vlan.py

+3
Original file line numberDiff line numberDiff line change
@@ -136,6 +136,9 @@ def add_vlan_member(db, vid, port, untagged):
136136
if (is_port and clicommon.is_port_router_interface(db.cfgdb, port)) or \
137137
(not is_port and clicommon.is_pc_router_interface(db.cfgdb, port)):
138138
ctx.fail("{} is a router interface!".format(port))
139+
140+
if (clicommon.interface_is_untagged_member(db.cfgdb, port) and untagged):
141+
ctx.fail("{} is already untagged member!".format(port))
139142

140143
db.cfgdb.set_entry('VLAN_MEMBER', (vlan, port), {'tagging_mode': "untagged" if untagged else "tagged" })
141144

tests/vlan_test.py

+29
Original file line numberDiff line numberDiff line change
@@ -597,6 +597,35 @@ def test_config_vlan_proxy_arp_disable(self):
597597

598598
assert result.exit_code == 0
599599
assert db.cfgdb.get_entry("VLAN_INTERFACE", "Vlan2000") == {"proxy_arp": "disabled"}
600+
601+
def test_config_2_untagged_vlan_on_same_interface(self):
602+
runner = CliRunner()
603+
db = Db()
604+
605+
# add Ethernet4 to vlan 2000 as untagged - should fail as ethrnet4 is already untagged member in 1000
606+
result = runner.invoke(config.config.commands["vlan"].commands["member"].commands["add"],
607+
["2000", "Ethernet4", "--untagged"], obj=db)
608+
print(result.exit_code)
609+
assert result.exit_code != 0
610+
611+
# add Ethernet4 to vlan 2000 as tagged - should succeed
612+
result = runner.invoke(config.config.commands["vlan"].commands["member"].commands["add"],
613+
["2000", "Ethernet4" ], obj=db)
614+
print(result.exit_code)
615+
assert result.exit_code == 0
616+
617+
def test_config_set_router_port_on_member_interface(self):
618+
db = Db()
619+
runner = CliRunner()
620+
obj = {'config_db':db.cfgdb}
621+
622+
# intf enable
623+
result = runner.invoke(config.config.commands["interface"].commands["ip"].commands["add"],
624+
["Ethernet4", "10.10.10.1/24"], obj=obj)
625+
print(result.exit_code, result.output)
626+
assert result.exit_code == 0
627+
assert 'Interface Ethernet4 is a member of vlan' in result.output
628+
600629

601630
@classmethod
602631
def teardown_class(cls):

utilities_common/cli.py

+10
Original file line numberDiff line numberDiff line change
@@ -544,3 +544,13 @@ def json_dump(data):
544544
return json.dumps(
545545
data, sort_keys=True, indent=2, ensure_ascii=False
546546
)
547+
548+
def interface_is_untagged_member(db, interface_name):
549+
""" Check if interface is already untagged member"""
550+
vlan_member_table = db.get_table('VLAN_MEMBER')
551+
552+
for key,val in vlan_member_table.items():
553+
if(key[1] == interface_name):
554+
if (val['tagging_mode'] == 'untagged'):
555+
return True
556+
return False

0 commit comments

Comments
 (0)