Skip to content

Commit aeceaca

Browse files
Shuotian Chenglguohan
Shuotian Cheng
authored andcommitted
[portmgrd]: portmgrd shall be responsible for all ports update (#668)
When a port is enslaved into the portchannel, portmgrd shall still be able to bring the port admin up/down according to the configuration changes. Signed-off-by: Shu0T1an ChenG <[email protected]>
1 parent 5796e54 commit aeceaca

File tree

2 files changed

+77
-16
lines changed

2 files changed

+77
-16
lines changed

cfgmgr/portmgr.cpp

-16
Original file line numberDiff line numberDiff line change
@@ -82,22 +82,6 @@ void PortMgr::doTask(Consumer &consumer)
8282
string alias = kfvKey(t);
8383
string op = kfvOp(t);
8484

85-
// Skip port which is a member of a port channel
86-
vector<string> keys;
87-
m_cfgLagMemberTable.getKeys(keys);
88-
89-
for (auto key : keys)
90-
{
91-
auto tokens = tokenize(key, '|');
92-
auto member = tokens[1];
93-
94-
if (alias == member)
95-
{
96-
it = consumer.m_toSync.erase(it);
97-
continue;
98-
}
99-
}
100-
10185
if (op == SET_COMMAND)
10286
{
10387
if (!isPortStateOk(alias))

tests/test_admin_status.py

+77
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
from swsscommon import swsscommon
2+
import time
3+
4+
class TestAdminStatus(object):
5+
def setup_db(self, dvs):
6+
self.pdb = swsscommon.DBConnector(0, dvs.redis_sock, 0)
7+
self.adb = swsscommon.DBConnector(1, dvs.redis_sock, 0)
8+
self.cdb = swsscommon.DBConnector(4, dvs.redis_sock, 0)
9+
10+
def set_admin_status(self, port, admin_status):
11+
assert admin_status == "up" or admin_status == "down"
12+
tbl = swsscommon.Table(self.cdb, "PORT")
13+
fvs = swsscommon.FieldValuePairs([("admin_status", admin_status)])
14+
tbl.set(port, fvs)
15+
time.sleep(1)
16+
17+
def create_port_channel(self, dvs, alias):
18+
tbl = swsscommon.Table(self.cdb, "PORTCHANNEL")
19+
fvs = swsscommon.FieldValuePairs([("admin_status", "up"),
20+
("mtu", "9100")])
21+
tbl.set(alias, fvs)
22+
time.sleep(1)
23+
24+
def remove_port_channel(self, dvs, alias):
25+
tbl = swsscommon.Table(self.cdb, "PORTCHANNEL")
26+
tbl._del(alias)
27+
time.sleep(1)
28+
29+
def add_port_channel_members(self, dvs, lag, members):
30+
tbl = swsscommon.Table(self.cdb, "PORTCHANNEL_MEMBER")
31+
fvs = swsscommon.FieldValuePairs([("NULL", "NULL")])
32+
for member in members:
33+
tbl.set(lag + "|" + member, fvs)
34+
time.sleep(1)
35+
36+
def remove_port_channel_members(self, dvs, lag, members):
37+
tbl = swsscommon.Table(self.cdb, "PORTCHANNEL_MEMBER")
38+
for member in members:
39+
tbl._del(lag + "|" + member)
40+
time.sleep(1)
41+
42+
def check_admin_status(self, dvs, port, admin_status):
43+
assert admin_status == "up" or admin_status == "down"
44+
tbl = swsscommon.Table(self.adb, "ASIC_STATE:SAI_OBJECT_TYPE_PORT")
45+
(status, fvs) = tbl.get(dvs.asicdb.portnamemap[port])
46+
assert status == True
47+
assert "SAI_PORT_ATTR_ADMIN_STATE" in [fv[0] for fv in fvs]
48+
for fv in fvs:
49+
if fv[0] == "SAI_PORT_ATTR_ADMIN_STATE":
50+
assert fv[1] == "true" if admin_status == "up" else "false"
51+
52+
def test_PortChannelMemberAdminStatus(self, dvs, testlog):
53+
self.setup_db(dvs)
54+
55+
# create port channel
56+
self.create_port_channel(dvs, "PortChannel6")
57+
58+
# add port channel members
59+
self.add_port_channel_members(dvs, "PortChannel6",
60+
["Ethernet0", "Ethernet4", "Ethernet8"])
61+
62+
# configure admin status to interface
63+
self.set_admin_status("Ethernet0", "up")
64+
self.set_admin_status("Ethernet4", "down")
65+
self.set_admin_status("Ethernet8", "up")
66+
67+
# check ASIC port database
68+
self.check_admin_status(dvs, "Ethernet0", "up")
69+
self.check_admin_status(dvs, "Ethernet4", "down")
70+
self.check_admin_status(dvs, "Ethernet8", "up")
71+
72+
# remove port channel members
73+
self.remove_port_channel_members(dvs, "PortCHannel6",
74+
["Ethernet0", "Ethernet4", "Ethernet8"])
75+
76+
# remove port channel
77+
self.remove_port_channel(dvs, "PortCHannel6")

0 commit comments

Comments
 (0)