[caclmgrd][DualToR] Fix a case where vlan address is not network address for DualToR Active-active configuration (#17511)

* [caclmgrd][DualToR] Fix a case where vlan address is not network address
for DualToR Active-active configuration

Signed-off-by: vaibhav-dahiya <vdahiya@microsoft.com>

* add changes

Signed-off-by: vaibhav-dahiya <vdahiya@microsoft.com>

* fix unit

Signed-off-by: vaibhav-dahiya <vdahiya@microsoft.com>

* add c

Signed-off-by: vaibhav-dahiya <vdahiya@microsoft.com>

* fix test

Signed-off-by: vaibhav-dahiya <vdahiya@microsoft.com>

* add fixes unit

Signed-off-by: vaibhav-dahiya <vdahiya@microsoft.com>

---------

Signed-off-by: vaibhav-dahiya <vdahiya@microsoft.com>
This commit is contained in:
vdahiya12 2023-12-22 12:12:04 -08:00 committed by GitHub
parent dd6a61cea1
commit 403d13aae2
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 15 additions and 12 deletions

View File

@ -43,7 +43,7 @@ def _ip_prefix_in_key(key):
def get_ipv4_networks_from_interface_table(table, intf_name):
addresses = []
addresses = {}
if table:
for key, _ in table.items():
if not _ip_prefix_in_key(key):
@ -53,8 +53,10 @@ def get_ipv4_networks_from_interface_table(table, intf_name):
iface_name, iface_cidr = key
if iface_name.startswith(intf_name):
ip_ntwrk = ipaddress.ip_network(iface_cidr, strict=False)
if isinstance(ip_ntwrk, ipaddress.IPv4Network):
addresses.append(ip_ntwrk)
ip_str = iface_cidr.split("/")[0]
ip_addr = ipaddress.ip_address(ip_str)
if isinstance(ip_ntwrk, ipaddress.IPv4Network) and isinstance(ip_addr, ipaddress.IPv4Address):
addresses[ip_ntwrk] = ip_addr
return addresses
@ -347,11 +349,13 @@ class ControlPlaneAclManager(daemon_base.DaemonBase):
self.log_warning("Loopback 3 IP not available from DualToR active-active config")
return fwd_dualtor_grpc_traffic_from_host_to_soc_cmds
if not isinstance(loopback_networks[0], ipaddress.IPv4Network):
loopback_address_vals = list(loopback_networks.values())
if not isinstance(loopback_address_vals[0], ipaddress.IPv4Address):
self.log_warning("Loopback 3 IP Network not available from DualToR active-active config")
return fwd_dualtor_grpc_traffic_from_host_to_soc_cmds
loopback_address = loopback_networks[0].network_address
loopback_address = loopback_address_vals[0]
vlan_name = 'Vlan'
vlan_table = config_db_connector.get_table(self.VLAN_INTF_TABLE)
vlan_networks = get_ipv4_networks_from_interface_table(vlan_table, vlan_name)
@ -371,10 +375,9 @@ class ControlPlaneAclManager(daemon_base.DaemonBase):
if 'cable_type' in kvp and kvp['cable_type'] == 'active-active':
soc_ipv4_str = kvp['soc_ipv4'].split("/")[0]
soc_ipv4_addr = ipaddress.ip_address(soc_ipv4_str)
for ip_network in vlan_networks:
for ip_network, vlan_address in vlan_networks.items():
# Only add the vlan source IP specific soc IP address to IPtables
if soc_ipv4_addr in ip_network:
vlan_address = ip_network.network_address
fwd_dualtor_grpc_traffic_from_host_to_soc_cmds.append(self.iptables_cmd_ns_prefix[namespace] +
"iptables -t nat -A POSTROUTING --destination {} --source {} -j SNAT --to-source {}".format(str(soc_ipv4_addr), str(vlan_address), str(loopback_address)))

View File

@ -29,7 +29,7 @@ class TestCaclmgrdSoc(TestCase):
@parameterized.expand(CACLMGRD_SOC_TEST_VECTOR)
@patchfs
@patch('caclmgrd.get_ipv4_networks_from_interface_table', MagicMock(return_value=[IPv4Network('10.10.10.18/24', strict=False), IPv4Network('10.10.11.18/24', strict=False)]))
@patch('caclmgrd.get_ipv4_networks_from_interface_table', MagicMock(return_value={IPv4Network('10.10.11.18/24', strict=False): IPv4Address('10.10.11.18') , IPv4Network('10.10.10.18/24', strict= False) : IPv4Address('10.10.10.18')}))
def test_caclmgrd_soc(self, test_name, test_data, fs):
if not os.path.exists(DBCONFIG_PATH):
fs.create_file(DBCONFIG_PATH) # fake database_config.json
@ -77,7 +77,7 @@ class TestCaclmgrdSoc(TestCase):
@parameterized.expand(CACLMGRD_SOC_TEST_VECTOR_EMPTY)
@patchfs
@patch('caclmgrd.get_ipv4_networks_from_interface_table', MagicMock(return_value=['10.10.10.10']))
@patch('caclmgrd.get_ipv4_networks_from_interface_table', MagicMock(return_value={'10.10.10.10': '10.10.10.1'}))
def test_caclmgrd_soc_ip_string(self, test_name, test_data, fs):
if not os.path.exists(DBCONFIG_PATH):
fs.create_file(DBCONFIG_PATH) # fake database_config.json
@ -106,4 +106,4 @@ class TestCaclmgrdSoc(TestCase):
table = {("Vlan1000","10.10.10.1/32"): "val"}
ip_addr = self.caclmgrd.get_ipv4_networks_from_interface_table(table, "Vlan")
assert (ip_addr == [IPv4Network('10.10.10.1/32')])
assert (ip_addr == {IPv4Network('10.10.10.1/32'): IPv4Address('10.10.10.1')})

View File

@ -18,7 +18,7 @@ CACLMGRD_SOC_TEST_VECTOR = [
"MUX_CABLE": {
"Ethernet4": {
"cable_type": "active-active",
"soc_ipv4": "10.10.11.7/32",
"soc_ipv4": "10.10.10.7/32",
}
},
"VLAN_INTERFACE": {
@ -35,7 +35,7 @@ CACLMGRD_SOC_TEST_VECTOR = [
},
},
"expected_subprocess_calls": [
call('iptables -t nat -A POSTROUTING --destination 10.10.11.7 --source 10.10.11.0 -j SNAT --to-source 10.10.10.0', shell=True, universal_newlines=True, stdout=-1)
call('iptables -t nat -A POSTROUTING --destination 10.10.10.7 --source 10.10.10.18 -j SNAT --to-source 10.10.11.18', shell=True, universal_newlines=True, stdout=-1)
],
"popen_attributes": {
'communicate.return_value': ('output', 'error'),