Skip to content

Commit f858b23

Browse files
author
Shuotian Cheng
authored
[test]: Add test_MultipleVlan test to test creation/removal (sonic-net#593)
Refactored test_vlan.py so that each test is independent from each other and intermediate state will be cleaned up afterwards. Add test_MultipleVlan test to cover scenarios with VLAN and VLAN members change. This test would fail on earlier kernel version .e.g 3.16.0-4 when the bridge interface cannot remain UP all the time. This would cause new VLAN failed to be created later on. The current Debian stretch doesn't have this issue and the test shall pass with current implementation. Signed-off-by: Shu0T1an ChenG <[email protected]>
1 parent bff03e9 commit f858b23

File tree

1 file changed

+174
-84
lines changed

1 file changed

+174
-84
lines changed

tests/test_vlan.py

+174-84
Original file line numberDiff line numberDiff line change
@@ -3,91 +3,181 @@
33
import re
44
import json
55

6-
def test_VlanMemberCreation(dvs):
7-
8-
db = swsscommon.DBConnector(4, dvs.redis_sock, 0)
9-
adb = swsscommon.DBConnector(1, dvs.redis_sock, 0)
10-
11-
12-
# create vlan in config db
13-
tbl = swsscommon.Table(db, "VLAN")
14-
fvs = swsscommon.FieldValuePairs([("vlanid", "2")])
15-
tbl.set("Vlan2", fvs)
16-
17-
time.sleep(1)
18-
19-
# check vlan in asic db
20-
atbl = swsscommon.Table(adb, "ASIC_STATE:SAI_OBJECT_TYPE_VLAN")
21-
22-
keys = atbl.getKeys()
23-
assert len(keys) == 2
24-
25-
vlan_oid = None
26-
27-
for k in keys:
28-
if k == dvs.asicdb.default_vlan_id:
29-
continue
30-
31-
(status, fvs) = atbl.get(k)
6+
class TestVlan(object):
7+
def setup_db(self, dvs):
8+
self.pdb = swsscommon.DBConnector(0, dvs.redis_sock, 0)
9+
self.adb = swsscommon.DBConnector(1, dvs.redis_sock, 0)
10+
self.cdb = swsscommon.DBConnector(4, dvs.redis_sock, 0)
11+
12+
def create_vlan(self, vlan):
13+
tbl = swsscommon.Table(self.cdb, "VLAN")
14+
fvs = swsscommon.FieldValuePairs([("vlanid", vlan)])
15+
tbl.set("Vlan" + vlan, fvs)
16+
time.sleep(1)
17+
18+
def remove_vlan(self, vlan):
19+
tbl = swsscommon.Table(self.cdb, "VLAN")
20+
tbl._del("Vlan" + vlan)
21+
time.sleep(1)
22+
23+
def create_vlan_member(self, vlan, interface):
24+
tbl = swsscommon.Table(self.cdb, "VLAN_MEMBER")
25+
fvs = swsscommon.FieldValuePairs([("tagging_mode", "untagged")])
26+
tbl.set("Vlan" + vlan + "|" + interface, fvs)
27+
time.sleep(1)
28+
29+
def remove_vlan_member(self, vlan, interface):
30+
tbl = swsscommon.Table(self.cdb, "VLAN_MEMBER")
31+
tbl._del("Vlan" + vlan + "|" + interface)
32+
time.sleep(1)
33+
34+
def test_VlanAddRemove(self, dvs):
35+
self.setup_db(dvs)
36+
37+
# create vlan
38+
self.create_vlan("2")
39+
40+
# check asic database
41+
tbl = swsscommon.Table(self.adb, "ASIC_STATE:SAI_OBJECT_TYPE_VLAN")
42+
vlan_entries = [k for k in tbl.getKeys() if k != dvs.asicdb.default_vlan_id]
43+
assert len(vlan_entries) == 1
44+
vlan_oid = vlan_entries[0]
45+
46+
(status, fvs) = tbl.get(vlan_oid)
3247
assert status == True
33-
34-
if fvs[0][0] == "SAI_VLAN_ATTR_VLAN_ID":
35-
assert fvs[0][1] == '2'
36-
vlan_oid = k
37-
38-
assert vlan_oid != None
39-
40-
# create vlan member in config db
41-
tbl = swsscommon.Table(db, "VLAN_MEMBER")
42-
fvs = swsscommon.FieldValuePairs([("tagging_mode", "untagged")])
43-
tbl.set("Vlan2|Ethernet0", fvs)
44-
45-
time.sleep(1)
46-
47-
# check vlan member in asic db
48-
bridge_port_map = {}
49-
atbl = swsscommon.Table(adb, "ASIC_STATE:SAI_OBJECT_TYPE_BRIDGE_PORT")
50-
keys = atbl.getKeys()
51-
for k in keys:
52-
(status, fvs) = atbl.get(k)
48+
for fv in fvs:
49+
if fv[0] == "SAI_VLAN_ATTR_VLAN_ID":
50+
assert fv[1] == "2"
51+
52+
# create vlan member
53+
self.create_vlan_member("2", "Ethernet0")
54+
55+
# check asic database
56+
bridge_port_map = {}
57+
tbl = swsscommon.Table(self.adb, "ASIC_STATE:SAI_OBJECT_TYPE_BRIDGE_PORT")
58+
bridge_port_entries = tbl.getKeys()
59+
for key in bridge_port_entries:
60+
(status, fvs) = tbl.get(key)
61+
assert status == True
62+
for fv in fvs:
63+
if fv[0] == "SAI_BRIDGE_PORT_ATTR_PORT_ID":
64+
bridge_port_map[key] = fv[1]
65+
66+
tbl = swsscommon.Table(self.adb, "ASIC_STATE:SAI_OBJECT_TYPE_VLAN_MEMBER")
67+
vlan_member_entries = tbl.getKeys()
68+
assert len(vlan_member_entries) == 1
69+
70+
(status, fvs) = tbl.get(vlan_member_entries[0])
5371
assert status == True
72+
assert len(fvs) == 3
73+
for fv in fvs:
74+
if fv[0] == "SAI_VLAN_MEMBER_ATTR_VLAN_TAGGING_MODE":
75+
assert fv[1] == "SAI_VLAN_TAGGING_MODE_UNTAGGED"
76+
elif fv[0] == "SAI_VLAN_MEMBER_ATTR_VLAN_ID":
77+
assert fv[1] == vlan_oid
78+
elif fv[0] == "SAI_VLAN_MEMBER_ATTR_BRIDGE_PORT_ID":
79+
assert dvs.asicdb.portoidmap[bridge_port_map[fv[1]]] == "Ethernet0"
80+
else:
81+
assert False
82+
83+
# check port pvid
84+
tbl = swsscommon.Table(self.adb, "ASIC_STATE:SAI_OBJECT_TYPE_PORT")
85+
(status, fvs) = tbl.get(dvs.asicdb.portnamemap["Ethernet0"])
86+
assert status == True
87+
assert "SAI_PORT_ATTR_PORT_VLAN_ID" in [fv[0] for fv in fvs]
88+
for fv in fvs:
89+
if fv[0] == "SAI_PORT_ATTR_PORT_VLAN_ID":
90+
assert fv[1] == "2"
5491

92+
# check host interface vlan tag
93+
tbl = swsscommon.Table(self.adb, "ASIC_STATE:SAI_OBJECT_TYPE_HOSTIF")
94+
(status, fvs) = tbl.get(dvs.asicdb.hostifnamemap["Ethernet0"])
95+
assert status == True
96+
assert "SAI_HOSTIF_ATTR_VLAN_TAG" in [fv[0] for fv in fvs]
5597
for fv in fvs:
56-
if fv[0] == "SAI_BRIDGE_PORT_ATTR_PORT_ID":
57-
bridge_port_map[k] = fv[1]
58-
59-
atbl = swsscommon.Table(adb, "ASIC_STATE:SAI_OBJECT_TYPE_VLAN_MEMBER")
60-
keys = atbl.getKeys()
61-
assert len(keys) == 1
62-
63-
(status, fvs) = atbl.get(keys[0])
64-
assert status == True
65-
for fv in fvs:
66-
if fv[0] == "SAI_VLAN_MEMBER_ATTR_VLAN_TAGGING_MODE":
67-
assert fv[1] == "SAI_VLAN_TAGGING_MODE_UNTAGGED"
68-
elif fv[0] == "SAI_VLAN_MEMBER_ATTR_VLAN_ID":
69-
assert fv[1] == vlan_oid
70-
elif fv[0] == "SAI_VLAN_MEMBER_ATTR_BRIDGE_PORT_ID":
71-
assert dvs.asicdb.portoidmap[bridge_port_map[fv[1]]] == "Ethernet0"
72-
else:
73-
assert False
74-
75-
# check pvid of the port
76-
atbl = swsscommon.Table(adb, "ASIC_STATE:SAI_OBJECT_TYPE_PORT")
77-
(status, fvs) = atbl.get(dvs.asicdb.portnamemap["Ethernet0"])
78-
assert status == True
79-
80-
assert "SAI_PORT_ATTR_PORT_VLAN_ID" in [fv[0] for fv in fvs]
81-
for fv in fvs:
82-
if fv[0] == "SAI_PORT_ATTR_PORT_VLAN_ID":
83-
assert fv[1] == "2"
84-
85-
# check vlan tag for the host interface
86-
atbl = swsscommon.Table(adb, "ASIC_STATE:SAI_OBJECT_TYPE_HOSTIF")
87-
(status, fvs) = atbl.get(dvs.asicdb.hostifnamemap["Ethernet0"])
88-
assert status == True
89-
90-
assert "SAI_HOSTIF_ATTR_VLAN_TAG" in [fv[0] for fv in fvs]
91-
for fv in fvs:
92-
if fv[0] == "SAI_HOSTIF_ATTR_VLAN_TAG":
93-
assert fv[1] == "SAI_HOSTIF_VLAN_TAG_KEEP"
98+
if fv[0] == "SAI_HOSTIF_ATTR_VLAN_TAG":
99+
assert fv[1] == "SAI_HOSTIF_VLAN_TAG_KEEP"
100+
101+
# remove vlan member
102+
self.remove_vlan_member("2", "Ethernet0")
103+
104+
# remvoe vlan
105+
self.remove_vlan("2")
106+
107+
def test_MultipleVlan(self, dvs):
108+
self.setup_db(dvs)
109+
110+
# create vlan and vlan members
111+
self.create_vlan("18")
112+
self.create_vlan_member("18", "Ethernet0")
113+
self.create_vlan_member("18", "Ethernet4")
114+
self.create_vlan_member("18", "Ethernet8")
115+
116+
# check asic database
117+
tbl = swsscommon.Table(self.adb, "ASIC_STATE:SAI_OBJECT_TYPE_VLAN")
118+
vlan_entries = [k for k in tbl.getKeys() if k != dvs.asicdb.default_vlan_id]
119+
assert len(vlan_entries) == 1
120+
121+
tbl = swsscommon.Table(self.adb, "ASIC_STATE:SAI_OBJECT_TYPE_VLAN_MEMBER")
122+
vlan_member_entries = tbl.getKeys()
123+
assert len(vlan_member_entries) == 3
124+
125+
# remove vlan members
126+
self.remove_vlan_member("18", "Ethernet0")
127+
self.remove_vlan_member("18", "Ethernet4")
128+
self.remove_vlan_member("18", "Ethernet8")
129+
130+
tbl = swsscommon.Table(self.adb, "ASIC_STATE:SAI_OBJECT_TYPE_VLAN_MEMBER")
131+
vlan_member_entries = tbl.getKeys()
132+
assert len(vlan_member_entries) == 0
133+
134+
# create vlan and vlan members
135+
self.create_vlan("188")
136+
self.create_vlan_member("188", "Ethernet20")
137+
self.create_vlan_member("188", "Ethernet24")
138+
self.create_vlan_member("188", "Ethernet28")
139+
140+
# check asic database
141+
tbl = swsscommon.Table(self.adb, "ASIC_STATE:SAI_OBJECT_TYPE_VLAN")
142+
vlan_entries = [k for k in tbl.getKeys() if k != dvs.asicdb.default_vlan_id]
143+
assert len(vlan_entries) == 2
144+
145+
tbl = swsscommon.Table(self.adb, "ASIC_STATE:SAI_OBJECT_TYPE_VLAN_MEMBER")
146+
vlan_member_entries = tbl.getKeys()
147+
assert len(vlan_member_entries) == 3
148+
149+
# create vlan members
150+
self.create_vlan_member("18", "Ethernet40")
151+
self.create_vlan_member("18", "Ethernet44")
152+
self.create_vlan_member("18", "Ethernet48")
153+
154+
tbl = swsscommon.Table(self.adb, "ASIC_STATE:SAI_OBJECT_TYPE_VLAN_MEMBER")
155+
vlan_member_entries = tbl.getKeys()
156+
assert len(vlan_member_entries) == 6
157+
158+
# remove vlan members
159+
self.remove_vlan_member("18", "Ethernet40")
160+
self.remove_vlan_member("18", "Ethernet44")
161+
self.remove_vlan_member("18", "Ethernet48")
162+
163+
tbl = swsscommon.Table(self.adb, "ASIC_STATE:SAI_OBJECT_TYPE_VLAN_MEMBER")
164+
vlan_member_entries = tbl.getKeys()
165+
assert len(vlan_member_entries) == 3
166+
167+
# remove vlan members
168+
self.remove_vlan_member("188", "Ethernet20")
169+
self.remove_vlan_member("188", "Ethernet24")
170+
self.remove_vlan_member("188", "Ethernet28")
171+
172+
tbl = swsscommon.Table(self.adb, "ASIC_STATE:SAI_OBJECT_TYPE_VLAN_MEMBER")
173+
vlan_member_entries = tbl.getKeys()
174+
assert len(vlan_member_entries) == 0
175+
176+
# remove vlans
177+
self.remove_vlan("18")
178+
self.remove_vlan("188")
179+
180+
# check asic database
181+
tbl = swsscommon.Table(self.adb, "ASIC_STATE:SAI_OBJECT_TYPE_VLAN")
182+
vlan_entries = [k for k in tbl.getKeys() if k != dvs.asicdb.default_vlan_id]
183+
assert len(vlan_entries) == 0

0 commit comments

Comments
 (0)