Skip to content

Commit 390cae1

Browse files
authored
[portsorch]: Prevent LAG member configuration when port has active ACL binding (#2165)
* [portsorch]: Prevent LAG member configuration when port has active ACL binding. Signed-off-by: Nazarii Hnydyn <[email protected]>
1 parent c1d47e6 commit 390cae1

File tree

2 files changed

+89
-0
lines changed

2 files changed

+89
-0
lines changed

orchagent/portsorch.cpp

+11
Original file line numberDiff line numberDiff line change
@@ -3851,6 +3851,17 @@ void PortsOrch::doLagMemberTask(Consumer &consumer)
38513851
continue;
38523852
}
38533853

3854+
if (!port.m_ingress_acl_tables_uset.empty() || !port.m_egress_acl_tables_uset.empty())
3855+
{
3856+
SWSS_LOG_ERROR(
3857+
"Failed to add member %s to LAG %s: ingress/egress ACL configuration is present",
3858+
port.m_alias.c_str(),
3859+
lag.m_alias.c_str()
3860+
);
3861+
it = consumer.m_toSync.erase(it);
3862+
continue;
3863+
}
3864+
38543865
if (!addLagMember(lag, port, (status == "enabled")))
38553866
{
38563867
it++;

tests/test_acl_portchannel.py

+78
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,87 @@
11
import time
22
import pytest
3+
import logging
34

45
from swsscommon import swsscommon
56

67

8+
logging.basicConfig(level=logging.INFO)
9+
acllogger = logging.getLogger(__name__)
10+
11+
12+
@pytest.fixture(autouse=True, scope="class")
13+
def dvs_api(request, dvs_acl):
14+
# Fixtures are created when first requested by a test, and are destroyed based on their scope
15+
if request.cls is None:
16+
yield
17+
return
18+
acllogger.info("Initialize DVS API: ACL")
19+
request.cls.dvs_acl = dvs_acl
20+
yield
21+
acllogger.info("Deinitialize DVS API: ACL")
22+
del request.cls.dvs_acl
23+
24+
25+
@pytest.mark.usefixtures("dvs_lag_manager")
26+
class TestAclInterfaceBinding:
27+
@pytest.mark.parametrize("stage", ["ingress", "egress"])
28+
def test_AclTablePortChannelMemberBinding(self, testlog, stage):
29+
"""Verify that LAG member creation is prohibited when ACL binding is configured
30+
31+
The test flow:
32+
1. Create ACL table and bind Ethernet124
33+
2. Verify ACL table has been successfully added
34+
3. Create LAG
35+
4. Verify LAG has been successfully added
36+
5. Create LAG member Ethernet120
37+
6. Verify LAG member has been successfully added
38+
7. Create LAG member Ethernet124
39+
8. Verify LAG member hasn't been added because of active ACL binding
40+
41+
Args:
42+
testlog: test start/end log record injector
43+
stage: ACL table stage (e.g., ingress/egress)
44+
"""
45+
try:
46+
acllogger.info("Create ACL table: acl_table")
47+
self.dvs_acl.create_acl_table(
48+
table_name="acl_table",
49+
table_type="L3",
50+
ports=["Ethernet124"],
51+
stage=stage
52+
)
53+
self.dvs_acl.verify_acl_table_count(1)
54+
55+
acllogger.info("Create LAG: PortChannel0001")
56+
self.dvs_lag.create_port_channel("0001")
57+
self.dvs_lag.get_and_verify_port_channel(1)
58+
59+
acllogger.info("Create LAG member: Ethernet120")
60+
self.dvs_lag.create_port_channel_member("0001", "Ethernet120")
61+
self.dvs_lag.get_and_verify_port_channel_members(1)
62+
63+
acllogger.info("Create LAG member: Ethernet124")
64+
self.dvs_lag.create_port_channel_member("0001", "Ethernet124")
65+
acllogger.info("Verify LAG member hasn't been created: Ethernet124")
66+
self.dvs_lag.get_and_verify_port_channel_members(1)
67+
finally:
68+
acllogger.info("Remove LAG member: Ethernet124")
69+
self.dvs_lag.remove_port_channel_member("0001", "Ethernet124")
70+
self.dvs_lag.get_and_verify_port_channel_members(1)
71+
72+
acllogger.info("Remove LAG member: Ethernet120")
73+
self.dvs_lag.remove_port_channel_member("0001", "Ethernet120")
74+
self.dvs_lag.get_and_verify_port_channel_members(0)
75+
76+
acllogger.info("Remove LAG: PortChannel0001")
77+
self.dvs_lag.remove_port_channel("0001")
78+
self.dvs_lag.get_and_verify_port_channel(0)
79+
80+
acllogger.info("Remove ACL table: acl_table")
81+
self.dvs_acl.remove_acl_table("acl_table")
82+
self.dvs_acl.verify_acl_table_count(0)
83+
84+
785
class TestPortChannelAcl(object):
886
def setup_db(self, dvs):
987
self.pdb = swsscommon.DBConnector(0, dvs.redis_sock, 0)

0 commit comments

Comments
 (0)