Skip to content

Commit 1c656d9

Browse files
author
Vasant
committed
Refactor DPB-VLAN test cases based on DVSlib
1 parent c929524 commit 1c656d9

File tree

6 files changed

+289
-276
lines changed

6 files changed

+289
-276
lines changed

orchagent/portsorch.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1585,7 +1585,7 @@ sai_status_t PortsOrch::removePort(sai_object_id_t port_id)
15851585
sai_status_t status = sai_port_api->remove_port(port_id);
15861586
if (status != SAI_STATUS_SUCCESS)
15871587
{
1588-
return status;
1588+
return status;
15891589
}
15901590

15911591
m_portCount--;
@@ -2274,13 +2274,13 @@ void PortsOrch::doPortTask(Consumer &consumer)
22742274
if (bridge_port_oid != SAI_NULL_OBJECT_ID)
22752275
{
22762276
// Bridge port OID is set on a port as long as
2277-
// port is part of at-least one VLAN.
2278-
// Ideally this should be tracked by SAI redis.
2277+
// port is part of at-least one VLAN.
2278+
// Ideally this should be tracked by SAI redis.
22792279
// Until then, let this snippet be here.
22802280
SWSS_LOG_WARN("Cannot remove port as bridge port OID is present %lx", bridge_port_oid);
22812281
it++;
22822282
continue;
2283-
}
2283+
}
22842284

22852285
if (m_portList[alias].m_init)
22862286
{

tests/conftest.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
from swsscommon import swsscommon
1616
from dvslib import dvs_database as dvs_db
1717
from dvslib import dvs_acl
18+
from dvslib import dvs_vlan
1819

1920
def ensure_system(cmd):
2021
(rc, output) = commands.getstatusoutput(cmd)
@@ -1009,6 +1010,14 @@ def testlog(request, dvs):
10091010
yield testlog
10101011
dvs.runcmd("logger === finish test %s ===" % request.node.name)
10111012

1013+
@pytest.yield_fixture(scope="class")
1014+
def dvs_vlan_manager(request, dvs):
1015+
request.cls.dvs_vlan = dvs_vlan.DVSVlan(dvs.get_asic_db(),
1016+
dvs.get_config_db(),
1017+
dvs.get_state_db(),
1018+
dvs.get_counters_db(),
1019+
dvs.get_app_db())
1020+
10121021
@pytest.yield_fixture(scope="class")
10131022
def dvs_acl_manager(request, dvs):
10141023
request.cls.dvs_acl = dvs_acl.DVSAcl(dvs.get_asic_db(),

tests/dvslib/dvs_vlan.py

Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,94 @@
1+
from dvs_database import DVSDatabase
2+
3+
class DVSVlan(object):
4+
def __init__(self, adb, cdb, sdb, cntrdb, appdb):
5+
self.asic_db = adb
6+
self.config_db = cdb
7+
self.state_db = sdb
8+
self.counters_db = cntrdb
9+
self.app_db = appdb
10+
11+
def create_vlan(self, vlan):
12+
vlan = "Vlan{}".format(vlan)
13+
vlan_entry = {"vlanid": vlan}
14+
self.config_db.create_entry("VLAN", vlan, vlan_entry)
15+
16+
def remove_vlan(self, vlan):
17+
vlan = "Vlan{}".format(vlan)
18+
self.config_db.delete_entry("VLAN", vlan)
19+
20+
def create_vlan_member(self, vlan, interface, tagging_mode="untagged"):
21+
member = "Vlan{}|{}".format(vlan, interface)
22+
if tagging_mode:
23+
member_entry = {"tagging_mode": tagging_mode}
24+
else:
25+
member_entry = {"no_tag_mode": ""}
26+
27+
self.config_db.create_entry("VLAN_MEMBER", member, member_entry)
28+
29+
def remove_vlan_member(self, vlan, interface):
30+
member = "Vlan{}|{}".format(vlan, interface)
31+
self.config_db.delete_entry("VLAN_MEMBER", member)
32+
33+
def create_port_channel(self, lag_id, admin_status="up", mtu="1500"):
34+
lag = "PortChannel{}".format(lag_id)
35+
lag_entry = {"admin_status": admin_status, "mtu": mtu}
36+
self.config_db.create_entry("PORTCHANNEL", lag, lag_entry)
37+
38+
def remove_port_channel(self, lag_id):
39+
lag = "PortChannel{}".format(lag_id)
40+
self.config_db.delete_entry("PORTCHANNEL", lag)
41+
42+
def create_port_channel_member(self, lag_id, interface):
43+
member = "PortChannel{}|{}".format(lag_id, interface)
44+
member_entry = {"NULL": "NULL"}
45+
self.config_db.create_entry("PORTCHANNEL_MEMBER", member, member_entry)
46+
47+
def remove_port_channel_member(self, lag_id, interface):
48+
member = "PortChannel{}|{}".format(lag_id, interface)
49+
self.config_db.delete_entry("PORTCHANNEL_MEMBER", member)
50+
51+
def check_app_db_vlan_fields(self, fvs, admin_status="up", mtu="9100"):
52+
assert fvs.get("admin_status") == admin_status
53+
assert fvs.get("mtu") == mtu
54+
55+
def check_app_db_vlan_member_fields(self, fvs, tagging_mode="untagged"):
56+
assert fvs.get("tagging_mode") == tagging_mode
57+
58+
def check_state_db_vlan_fields(self, fvs, state="ok"):
59+
assert fvs.get("state") == state
60+
61+
def check_state_db_vlan_member_fields(self, fvs, state="ok"):
62+
assert fvs.get("state") == state
63+
64+
def verify_vlan(self, vlan_oid, vlan_id):
65+
vlan = self.asic_db.wait_for_entry("ASIC_STATE:SAI_OBJECT_TYPE_VLAN", vlan_oid)
66+
assert vlan.get("SAI_VLAN_ATTR_VLAN_ID") == vlan_id
67+
68+
def get_and_verify_vlan_ids(self,
69+
expected_num,
70+
polling_config=DVSDatabase.DEFAULT_POLLING_CONFIG):
71+
vlan_entries = self.asic_db.wait_for_n_keys("ASIC_STATE:SAI_OBJECT_TYPE_VLAN",
72+
expected_num + 1,
73+
polling_config)
74+
return [v for v in vlan_entries if v != self.asic_db.default_vlan_id]
75+
76+
def verify_vlan_member(self, vlan_oid, iface, tagging_mode="SAI_VLAN_TAGGING_MODE_UNTAGGED"):
77+
member_ids = self.asic_db.wait_for_n_keys("ASIC_STATE:SAI_OBJECT_TYPE_VLAN_MEMBER", 1)
78+
member = self.asic_db.wait_for_entry("ASIC_STATE:SAI_OBJECT_TYPE_VLAN_MEMBER", member_ids[0])
79+
assert member == {"SAI_VLAN_MEMBER_ATTR_VLAN_TAGGING_MODE": tagging_mode,
80+
"SAI_VLAN_MEMBER_ATTR_VLAN_ID": vlan_oid,
81+
"SAI_VLAN_MEMBER_ATTR_BRIDGE_PORT_ID": self.get_bridge_port_id(iface)}
82+
83+
def get_and_verify_vlan_member_ids(self, expected_num):
84+
return self.asic_db.wait_for_n_keys("ASIC_STATE:SAI_OBJECT_TYPE_VLAN_MEMBER", expected_num)
85+
86+
def get_bridge_port_id(self, expected_iface):
87+
bridge_port_id = self.asic_db.wait_for_n_keys("ASIC_STATE:SAI_OBJECT_TYPE_BRIDGE_PORT", 1)[0]
88+
bridge_port = self.asic_db.wait_for_entry("ASIC_STATE:SAI_OBJECT_TYPE_BRIDGE_PORT", bridge_port_id)
89+
#TBD: port_to_id_map may NOT be updated one in case port is deleted and re-created.
90+
# Hence the map needs refreshed. Need to think trough and decide when and where
91+
# to do it.
92+
assert self.asic_db.port_to_id_map[bridge_port["SAI_BRIDGE_PORT_ATTR_PORT_ID"]] == expected_iface
93+
return bridge_port_id
94+

tests/test_fdb_update.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -265,7 +265,7 @@ def test_FDBLearnedAndUpdated(self, dvs, testlog):
265265
# clear fdb
266266
dvs.runcmd("sonic-clear fdb all")
267267

268-
def test_FDBLearnedAndFlushed(dvs, testlog):
268+
def test_FDBLearnedAndFlushed(self, dvs, testlog):
269269
dvs.setup_db()
270270

271271
dvs.runcmd("sonic-clear fdb all")

tests/test_port_dpb_vlan.py

Lines changed: 46 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,10 @@
1-
from swsscommon import swsscommon
2-
import redis
31
import time
4-
import os
52
import pytest
6-
from pytest import *
7-
import json
8-
import re
93
from port_dpb import Port
104
from port_dpb import DPB
115

126
@pytest.mark.usefixtures('dpb_setup_fixture')
7+
@pytest.mark.usefixtures('dvs_vlan_manager')
138
class TestPortDPBVlan(object):
149
def check_syslog(self, dvs, marker, log, expected_cnt):
1510
(exitcode, num) = dvs.runcmd(['sh', '-c', "awk \'/%s/,ENDFILE {print;}\' /var/log/syslog | grep \"%s\" | wc -l" % (marker, log)])
@@ -19,13 +14,13 @@ def check_syslog(self, dvs, marker, log, expected_cnt):
1914
@pytest.mark.skip()
2015
'''
2116
def test_dependency(self, dvs):
22-
dpb = DPB()
23-
dvs.setup_db()
17+
18+
vlan = "100"
2419
p = Port(dvs, "Ethernet0")
2520
p.sync_from_config_db()
26-
dvs.create_vlan("100")
21+
self.dvs_vlan.create_vlan(vlan)
2722
#print "Created VLAN100"
28-
dvs.create_vlan_member("100", p.get_name())
23+
self.dvs_vlan.create_vlan_member(vlan, p.get_name())
2924
#print "Added Ethernet0 to VLAN100"
3025
marker = dvs.add_log_marker()
3126
p.delete_from_config_db()
@@ -34,7 +29,7 @@ def test_dependency(self, dvs):
3429
self.check_syslog(dvs, marker, "Cannot remove port as bridge port OID is present", 1)
3530
assert(p.exists_in_asic_db() == True)
3631

37-
dvs.remove_vlan_member("100", p.get_name())
32+
self.dvs_vlan.remove_vlan_member(vlan, p.get_name())
3833
time.sleep(1)
3934
# Verify that port is deleted
4035
assert(p.exists_in_asic_db() == False)
@@ -49,19 +44,20 @@ def test_dependency(self, dvs):
4944
p.verify_asic_db()
5045
#print "ASIC DB verification passed!"
5146

52-
dvs.remove_vlan("100")
47+
self.dvs_vlan.remove_vlan(vlan)
5348

5449
'''
5550
@pytest.mark.skip()
5651
'''
5752
def test_one_port_one_vlan(self, dvs):
5853
dpb = DPB()
59-
dvs.setup_db()
54+
vlan = "100"
6055

6156
# Breakout testing with VLAN dependency
62-
dvs.create_vlan("100")
57+
self.dvs_vlan.create_vlan(vlan)
6358
#print "Created VLAN100"
64-
dvs.create_vlan_member("100", "Ethernet0")
59+
self.dvs_vlan.create_vlan_member(vlan, "Ethernet0")
60+
self.dvs_vlan.get_and_verify_vlan_member_ids(1)
6561
#print "Added Ethernet0 to VLAN100"
6662

6763
p = Port(dvs, "Ethernet0")
@@ -72,17 +68,20 @@ def test_one_port_one_vlan(self, dvs):
7268
assert(p.exists_in_asic_db() == True)
7369
#print "Ethernet0 deleted from config DB and APP DB, waiting to be removed from VLAN"
7470

75-
dvs.remove_vlan_member("100", "Ethernet0")
76-
time.sleep(1)
71+
self.dvs_vlan.remove_vlan_member(vlan, "Ethernet0")
72+
self.dvs_vlan.get_and_verify_vlan_member_ids(0)
7773
assert(p.exists_in_asic_db() == False)
7874
#print "Ethernet0 removed from VLAN and also from ASIC DB"
7975

8076
dpb.create_child_ports(dvs, p, 4)
8177

8278
# Breakin testing with VLAN dependency
8379
port_names = ["Ethernet0", "Ethernet1", "Ethernet2", "Ethernet3"]
80+
vlan_member_count = 0
8481
for pname in port_names:
85-
dvs.create_vlan_member("100", pname)
82+
self.dvs_vlan.create_vlan_member(vlan, pname)
83+
vlan_member_count = vlan_member_count + 1
84+
self.dvs_vlan.get_and_verify_vlan_member_ids(vlan_member_count)
8685
#print "Add %s to VLAN"%port_names
8786

8887
child_ports = []
@@ -97,8 +96,9 @@ def test_one_port_one_vlan(self, dvs):
9796
#print "Deleted %s from config DB and APP DB"%port_names
9897

9998
for cp in child_ports:
100-
dvs.remove_vlan_member("100", cp.get_name())
101-
time.sleep(1)
99+
self.dvs_vlan.remove_vlan_member(vlan, cp.get_name())
100+
vlan_member_count = vlan_member_count - 1
101+
self.dvs_vlan.get_and_verify_vlan_member_ids(vlan_member_count)
102102
assert(cp.exists_in_asic_db() == False)
103103
#print "Deleted %s from VLAN"%port_names
104104

@@ -111,22 +111,22 @@ def test_one_port_one_vlan(self, dvs):
111111
p.verify_asic_db()
112112
#print "ASIC DB verification passed!"
113113

114-
dvs.remove_vlan("100")
114+
self.dvs_vlan.remove_vlan(vlan)
115115

116116
'''
117117
@pytest.mark.skip()
118118
'''
119119
def test_one_port_multiple_vlan(self, dvs):
120-
dpb = DPB()
121-
dvs.setup_db()
122120

123-
dvs.create_vlan("100")
124-
dvs.create_vlan("101")
125-
dvs.create_vlan("102")
121+
dpb = DPB()
122+
vlans = ["100", "101", "102"]
123+
for vlan in vlans:
124+
self.dvs_vlan.create_vlan(vlan)
126125
#print "Created VLAN100, VLAN101, and VLAN102"
127-
dvs.create_vlan_member("100", "Ethernet0")
128-
dvs.create_vlan_member("101", "Ethernet0")
129-
dvs.create_vlan_member("102", "Ethernet0")
126+
127+
for vlan in vlans:
128+
self.dvs_vlan.create_vlan_member(vlan, "Ethernet0")
129+
self.dvs_vlan.get_and_verify_vlan_member_ids(len(vlans))
130130
#print "Added Ethernet0 to all three VLANs"
131131

132132
p = Port(dvs, "Ethernet0")
@@ -137,20 +137,20 @@ def test_one_port_multiple_vlan(self, dvs):
137137
assert(p.exists_in_asic_db() == True)
138138
#print "Ethernet0 deleted from config DB and APP DB, waiting to be removed from VLANs"
139139

140-
dvs.remove_vlan_member("100", "Ethernet0")
141-
time.sleep(1)
140+
self.dvs_vlan.remove_vlan_member(vlans[0], "Ethernet0")
141+
self.dvs_vlan.get_and_verify_vlan_member_ids(len(vlans)-1)
142142
assert(p.exists_in_asic_db() == True)
143143
#print "Ethernet0 removed from VLAN100 and its still present in ASIC DB"
144144

145-
dvs.remove_vlan_member("101", "Ethernet0")
146-
time.sleep(1)
145+
self.dvs_vlan.remove_vlan_member(vlans[1], "Ethernet0")
146+
self.dvs_vlan.get_and_verify_vlan_member_ids(len(vlans)-2)
147147
assert(p.exists_in_asic_db() == True)
148148
#print "Ethernet0 removed from VLAN101 and its still present in ASIC DB"
149149

150-
dvs.remove_vlan_member("102", "Ethernet0")
151-
time.sleep(1)
150+
self.dvs_vlan.remove_vlan_member(vlans[2], "Ethernet0")
151+
self.dvs_vlan.get_and_verify_vlan_member_ids(0)
152152
assert(p.exists_in_asic_db() == False)
153-
#print "Ethernet0 removed from VLAN101 and also from ASIC DB"
153+
#print "Ethernet0 removed from VLAN102 and also from ASIC DB"
154154

155155
dpb.create_child_ports(dvs, p, 4)
156156
#print "1X40G ---> 4x10G verified"
@@ -174,9 +174,9 @@ def test_one_port_multiple_vlan(self, dvs):
174174
#print "Added port:%s and verified all DBs"%p.get_name()
175175

176176
# Remove all three VLANs
177-
dvs.remove_vlan("100")
178-
dvs.remove_vlan("101")
179-
dvs.remove_vlan("102")
177+
self.dvs_vlan.remove_vlan("100")
178+
self.dvs_vlan.remove_vlan("101")
179+
self.dvs_vlan.remove_vlan("102")
180180
#print "All three VLANs removed"
181181

182182
'''
@@ -197,13 +197,14 @@ def test_all_port_10_vlans(self, dvs):
197197
vlan_names.append(str(start_vlan + i))
198198

199199
for vlan_name in vlan_names:
200-
dvs.create_vlan(vlan_name)
200+
self.dvs_vlan.create_vlan(vlan_name)
201201
#print "%d VLANs created"%num_vlans
202202

203203
for port_name in port_names:
204204
for vlan_name in vlan_names:
205-
dvs.create_vlan_member_tagged(vlan_name, port_name)
205+
self.dvs_vlan.create_vlan_member(vlan_name, port_name, tagging_mode = "tagged")
206206
#print "All %d ports are added to all %d VLANs"%(num_ports,num_vlans)
207+
self.dvs_vlan.get_and_verify_vlan_member_ids(num_ports*num_vlans)
207208

208209
ports = []
209210
for port_name in port_names:
@@ -216,8 +217,9 @@ def test_all_port_10_vlans(self, dvs):
216217
assert(p.exists_in_app_db() == False)
217218
assert(p.exists_in_asic_db() == True)
218219
for vlan_name in vlan_names:
219-
dvs.remove_vlan_member(vlan_name, port_name)
220-
time.sleep(1)
220+
self.dvs_vlan.remove_vlan_member(vlan_name, port_name)
221+
222+
self.dvs_vlan.get_and_verify_vlan_member_ids((num_ports*num_vlans)-(len(ports)*num_vlans))
221223
assert(p.exists_in_asic_db() == False)
222224
#print "All %d ports are removed from all %d VLANs and deleted"%(num_ports,num_vlans)
223225

@@ -229,5 +231,5 @@ def test_all_port_10_vlans(self, dvs):
229231
#print "Re-created all %d ports"%num_ports
230232

231233
for vlan_name in vlan_names:
232-
dvs.remove_vlan(vlan_name)
234+
self.dvs_vlan.remove_vlan(vlan_name)
233235
#print "All %d VLANs removed"%num_vlans

0 commit comments

Comments
 (0)