Skip to content

Commit

Permalink
Updates caclmgrd to add MATCH service
Browse files Browse the repository at this point in the history
  • Loading branch information
ashish12pant committed Jun 14, 2024
1 parent 29a04f5 commit 44e2d7b
Show file tree
Hide file tree
Showing 3 changed files with 401 additions and 2 deletions.
17 changes: 15 additions & 2 deletions scripts/caclmgrd
Original file line number Diff line number Diff line change
Expand Up @@ -108,6 +108,11 @@ class ControlPlaneAclManager(daemon_base.DaemonBase):
"ip_protocols": ["tcp"],
"multi_asic_ns_to_host_fwd":True
},
"MATCH": {
"ip_protocols": ["tcp"],
"dst_ports": ["0"],
"multi_asic_ns_to_host_fwd":True
},
"ANY": {
"ip_protocols": ["any"],
"dst_ports": ["0"],
Expand Down Expand Up @@ -743,7 +748,9 @@ class ControlPlaneAclManager(daemon_base.DaemonBase):
rule_cmd = ["ip6tables"] if table_ip_version == 6 else ["iptables"]

rule_cmd += ["-A", "INPUT"]
if ip_protocol != "any":
if acl_service == "MATCH" and "IP_PROTOCOL" in rule_props:
rule_cmd += ["-p", str(rule_props["IP_PROTOCOL"])]
elif ip_protocol != "any":
rule_cmd += ["-p", str(ip_protocol)]

if "SRC_IPV6" in rule_props and rule_props["SRC_IPV6"]:
Expand All @@ -756,7 +763,13 @@ class ControlPlaneAclManager(daemon_base.DaemonBase):
ipv4_src_ip_set.add(rule_props["SRC_IP"])

# Destination port 0 is reserved/unused port, so, using it to apply the rule to all ports.
if dst_port != "0":
if acl_service == "MATCH":
if "L4_DST_PORT" in rule_props:
rule_cmd += ["--dport", str(rule_props["L4_DST_PORT"])]
elif "L4_DST_PORT_RANGE" in rule_props:
dst_port = ":".join(rule_props["L4_DST_PORT_RANGE"].split("-"))
rule_cmd += ["--dport", str(dst_port)]
elif dst_port != "0":
rule_cmd += ["--dport", str(dst_port)]

# If there are TCP flags present and ip protocol is TCP, append them
Expand Down
48 changes: 48 additions & 0 deletions tests/caclmgrd/caclmgrd_match_acl_test.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
import os
import sys

from swsscommon import swsscommon
from parameterized import parameterized
from sonic_py_common.general import load_module_from_source
from unittest import TestCase, mock
from pyfakefs.fake_filesystem_unittest import patchfs

from .test_match_acl_vectors import MATCH_ACL_TEST_VECTOR
from tests.common.mock_configdb import MockConfigDb


DBCONFIG_PATH = '/var/run/redis/sonic-db/database_config.json'


class TestCaclmgrdMatchAcl(TestCase):
"""
Test caclmgrd MATCH
"""
def setUp(self):
swsscommon.ConfigDBConnector = MockConfigDb
test_path = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
modules_path = os.path.dirname(test_path)
scripts_path = os.path.join(modules_path, "scripts")
sys.path.insert(0, modules_path)
caclmgrd_path = os.path.join(scripts_path, 'caclmgrd')
self.caclmgrd = load_module_from_source('caclmgrd', caclmgrd_path)

@parameterized.expand(MATCH_ACL_TEST_VECTOR)
@patchfs
def test_caclmgrd_match_acl(self, test_name, test_data, fs):
if not os.path.exists(DBCONFIG_PATH):
fs.create_file(DBCONFIG_PATH) # fake database_config.json

MockConfigDb.set_config_db(test_data["config_db"])
self.caclmgrd.ControlPlaneAclManager.get_namespace_mgmt_ip = mock.MagicMock()
self.caclmgrd.ControlPlaneAclManager.get_namespace_mgmt_ipv6 = mock.MagicMock()
self.caclmgrd.ControlPlaneAclManager.generate_block_ip2me_traffic_iptables_commands = mock.MagicMock(return_value=[])
self.caclmgrd.ControlPlaneAclManager.get_chain_list = mock.MagicMock(return_value=["INPUT", "FORWARD", "OUTPUT"])
self.caclmgrd.ControlPlaneAclManager.get_chassis_midplane_interface_ip = mock.MagicMock(return_value='')
caclmgrd_daemon = self.caclmgrd.ControlPlaneAclManager("caclmgrd")

iptables_rules_ret, _ = caclmgrd_daemon.get_acl_rules_and_translate_to_iptables_commands('', MockConfigDb())
test_data['return'] = [tuple(i) for i in test_data['return']]
iptables_rules_ret = [tuple(i) for i in iptables_rules_ret]
self.assertEqual(set(test_data["return"]).issubset(set(iptables_rules_ret)), True)

Loading

0 comments on commit 44e2d7b

Please sign in to comment.