Skip to content

Commit adbf0d5

Browse files
pulchartbrianphaley
authored andcommitted
OVS firewall: only remove security group when truly unused
SG was removed only if both its members and ports were empty. Change to require neither members nor ports remain before cleanup, preventing removal of still‐active IPs in SG. Closes-Bug: #2112648 Change-Id: I57ae71a76c742a7d698d347a72f98e1cff469055 Signed-off-by: Jaroslav Pulchart <[email protected]> Signed-off-by: Brian Haley <[email protected]> (cherry picked from commit 34225a6)
1 parent 9e0c9dd commit adbf0d5

File tree

2 files changed

+44
-1
lines changed

2 files changed

+44
-1
lines changed

neutron/agent/linux/openvswitch_firewall/firewall.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -872,7 +872,7 @@ def _cleanup_stale_sg(self):
872872

873873
for sg_id in sg_to_delete:
874874
sec_group = self.sg_port_map.get_sg(sg_id)
875-
if sec_group.members and sec_group.ports:
875+
if sec_group.members or sec_group.ports:
876876
# sec_group is still in use
877877
continue
878878

neutron/tests/unit/agent/linux/openvswitch_firewall/test_firewall.py

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1090,6 +1090,49 @@ def test__cleanup_stale_sg(self):
10901090
sg_removed_mock.assert_called_once_with(1)
10911091
delete_sg_mock.assert_called_once_with(1)
10921092

1093+
def test__cleanup_stale_sg_members_and_ports(self):
1094+
self._prepare_security_group()
1095+
self.firewall.sg_to_delete = {1}
1096+
new_members = {constants.IPv4: [1]}
1097+
self.firewall.update_security_group_members(1, new_members)
1098+
port_dict = {'device': 'port-id',
1099+
'security_groups': [1]}
1100+
self.firewall.prepare_port_filter(port_dict)
1101+
with mock.patch.object(self.firewall.conj_ip_manager,
1102+
'sg_removed') as sg_removed_mock,\
1103+
mock.patch.object(self.firewall.sg_port_map,
1104+
'delete_sg') as delete_sg_mock:
1105+
self.firewall._cleanup_stale_sg()
1106+
sg_removed_mock.assert_not_called()
1107+
delete_sg_mock.assert_not_called()
1108+
1109+
def test__cleanup_stale_sg_just_members(self):
1110+
self._prepare_security_group()
1111+
self.firewall.sg_to_delete = {1}
1112+
new_members = {constants.IPv4: [1]}
1113+
self.firewall.update_security_group_members(1, new_members)
1114+
with mock.patch.object(self.firewall.conj_ip_manager,
1115+
'sg_removed') as sg_removed_mock,\
1116+
mock.patch.object(self.firewall.sg_port_map,
1117+
'delete_sg') as delete_sg_mock:
1118+
self.firewall._cleanup_stale_sg()
1119+
sg_removed_mock.assert_not_called()
1120+
delete_sg_mock.assert_not_called()
1121+
1122+
def test__cleanup_stale_sg_just_ports(self):
1123+
self._prepare_security_group()
1124+
self.firewall.sg_to_delete = {1}
1125+
port_dict = {'device': 'port-id',
1126+
'security_groups': [1]}
1127+
self.firewall.prepare_port_filter(port_dict)
1128+
with mock.patch.object(self.firewall.conj_ip_manager,
1129+
'sg_removed') as sg_removed_mock,\
1130+
mock.patch.object(self.firewall.sg_port_map,
1131+
'delete_sg') as delete_sg_mock:
1132+
self.firewall._cleanup_stale_sg()
1133+
sg_removed_mock.assert_not_called()
1134+
delete_sg_mock.assert_not_called()
1135+
10931136
def test_get_ovs_port(self):
10941137
ovs_port = self.firewall.get_ovs_port('port_id')
10951138
self.assertEqual(self.fake_ovs_port, ovs_port)

0 commit comments

Comments
 (0)