From b409615a328c059ab8daf841529fcbf8abcb8863 Mon Sep 17 00:00:00 2001 From: Sheng Yang Date: Fri, 23 Mar 2012 19:06:25 -0700 Subject: [PATCH] bug 14484: Apply existed firewall rules when associating IP It's not a elegant fix. The status for firewall rules should remain unchanged before/after ip association/disassociation. But the related change is tricky than this fix, may not get enough test for 3.0.1. So we would apply existed firewall rules again, which would work, just result in some unnecessary commands. status 14484: resolved fixed Reviewed-by: Edison Su --- .../src/com/cloud/network/NetworkManagerImpl.java | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/server/src/com/cloud/network/NetworkManagerImpl.java b/server/src/com/cloud/network/NetworkManagerImpl.java index 60a49b95567..71b7ebcae6a 100755 --- a/server/src/com/cloud/network/NetworkManagerImpl.java +++ b/server/src/com/cloud/network/NetworkManagerImpl.java @@ -254,6 +254,8 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag @Inject NicDao _nicDao = null; @Inject + FirewallRulesDao _fwRulesDao = null; + @Inject RulesManager _rulesMgr; @Inject LoadBalancingRulesManager _lbMgr; @@ -906,14 +908,27 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag } else { throw new CloudRuntimeException("Fail to get ip deployer for element: " + element); } + //We would apply all the existed firewall rules for this IP, since the rule maybe discard by revoke PF/LB rules + List firewallRules = new ArrayList(); + boolean applyFirewallRules = false; + if (element instanceof FirewallServiceProvider && + isProviderSupportServiceInNetwork(network.getId(), Service.Firewall, provider)) { + applyFirewallRules = true; + } Set services = new HashSet(); for (PublicIp ip : ips) { if (!ipToServices.containsKey(ip)) { continue; } services.addAll(ipToServices.get(ip)); + if (applyFirewallRules) { + firewallRules.addAll(_fwRulesDao.listByIpAndPurpose(ip.getId(), Purpose.Firewall)); + } } deployer.applyIps(network, ips, services); + if (applyFirewallRules && !firewallRules.isEmpty()) { + ((FirewallServiceProvider) element).applyFWRules(network, firewallRules); + } } catch (ResourceUnavailableException e) { success = false; if (!continueOnError) {