From a82ff7b0d111b8d3608429df3f98919b45419707 Mon Sep 17 00:00:00 2001 From: Alena Prokharchyk Date: Mon, 13 Aug 2012 11:41:55 -0700 Subject: [PATCH] VPC: CS-15968 - don't send ips in Releasing state to the router when the nic is already unplugged for this Vlan --- .../network/firewall/FirewallManagerImpl.java | 6 ------ .../network/lb/LoadBalancingRulesManagerImpl.java | 8 +++----- .../VpcVirtualNetworkApplianceManagerImpl.java | 14 ++++++++------ .../com/cloud/network/rules/RulesManagerImpl.java | 4 ---- 4 files changed, 11 insertions(+), 21 deletions(-) diff --git a/server/src/com/cloud/network/firewall/FirewallManagerImpl.java b/server/src/com/cloud/network/firewall/FirewallManagerImpl.java index 3c104ab8ac5..7263854e92f 100644 --- a/server/src/com/cloud/network/firewall/FirewallManagerImpl.java +++ b/server/src/com/cloud/network/firewall/FirewallManagerImpl.java @@ -464,12 +464,6 @@ public class FirewallManagerImpl implements FirewallService, FirewallManager, Ma //remove the rule _firewallDao.remove(rule.getId()); - - if (rule.getSourceIpAddressId() != null) { - //if the rule is the last one for the ip address assigned to VPC, unassign it from the network - IpAddress ip = _ipAddressDao.findById(rule.getSourceIpAddressId()); - _vpcMgr.unassignIPFromVpcNetwork(ip.getId(), rule.getNetworkId()); - } } @Override diff --git a/server/src/com/cloud/network/lb/LoadBalancingRulesManagerImpl.java b/server/src/com/cloud/network/lb/LoadBalancingRulesManagerImpl.java index ee7fdd4d178..d1e03203cfe 100755 --- a/server/src/com/cloud/network/lb/LoadBalancingRulesManagerImpl.java +++ b/server/src/com/cloud/network/lb/LoadBalancingRulesManagerImpl.java @@ -981,7 +981,6 @@ public class LoadBalancingRulesManagerImpl implements LoadBalancingRulesMa if (performedIpAssoc) { ipVO = _ipAddressDao.findById(ipVO.getId()); _vpcMgr.unassignIPFromVpcNetwork(ipVO.getId(), lb.getNetworkId()); - } } } @@ -1178,6 +1177,9 @@ public class LoadBalancingRulesManagerImpl implements LoadBalancingRulesMa } } } + // if the rule is the last one for the ip address assigned to VPC, unassign it from the network + IpAddress ip = _ipAddressDao.findById(lb.getSourceIpAddressId()); + _vpcMgr.unassignIPFromVpcNetwork(ip.getId(), lb.getNetworkId()); } } @@ -1560,9 +1562,5 @@ public class LoadBalancingRulesManagerImpl implements LoadBalancingRulesMa // remove the rule _lbDao.remove(rule.getId()); - // if the rule is the last one for the ip address assigned to VPC, unassign it from the network - IpAddress ip = _ipAddressDao.findById(rule.getSourceIpAddressId()); - _vpcMgr.unassignIPFromVpcNetwork(ip.getId(), rule.getNetworkId()); - } } diff --git a/server/src/com/cloud/network/router/VpcVirtualNetworkApplianceManagerImpl.java b/server/src/com/cloud/network/router/VpcVirtualNetworkApplianceManagerImpl.java index db118c54d5e..e91868f4c2d 100644 --- a/server/src/com/cloud/network/router/VpcVirtualNetworkApplianceManagerImpl.java +++ b/server/src/com/cloud/network/router/VpcVirtualNetworkApplianceManagerImpl.java @@ -628,12 +628,13 @@ public class VpcVirtualNetworkApplianceManagerImpl extends VirtualNetworkApplian } } - //3) apply the rules + //3) apply the ips boolean result = applyRules(network, routers, "vpc ip association", false, null, false, new RuleApplier() { @Override public boolean execute(Network network, VirtualRouter router) throws ResourceUnavailableException { Commands cmds = new Commands(OnError.Continue); Map vlanMacAddress = new HashMap(); + List ipsToSend = new ArrayList(); for (PublicIpAddress ipAddr : ipAddress) { String broadcastURI = BroadcastDomainType.Vlan.toUri(ipAddr.getVlanTag()).toString(); @@ -646,14 +647,15 @@ public class VpcVirtualNetworkApplianceManagerImpl extends VirtualNetworkApplian throw new CloudRuntimeException("Unable to find the nic in network " + ipAddr.getNetworkId() + " to apply the ip address " + ipAddr + " for"); } - macAddress = ipAddr.getMacAddress(); + s_logger.debug("Not sending release for ip address " + ipAddr + + " as its nic is already gone from VPC router " + router); } else { macAddress = nic.getMacAddress(); - } - - vlanMacAddress.put(ipAddr.getVlanTag(), macAddress); + vlanMacAddress.put(ipAddr.getVlanTag(), macAddress); + ipsToSend.add(ipAddr); + } } - createVpcAssociatePublicIPCommands(router, ipAddress, cmds, vlanMacAddress); + createVpcAssociatePublicIPCommands(router, ipsToSend, cmds, vlanMacAddress); return sendCommandsToRouter(router, cmds); } }); diff --git a/server/src/com/cloud/network/rules/RulesManagerImpl.java b/server/src/com/cloud/network/rules/RulesManagerImpl.java index e19581789f6..f5b9c687f9c 100755 --- a/server/src/com/cloud/network/rules/RulesManagerImpl.java +++ b/server/src/com/cloud/network/rules/RulesManagerImpl.java @@ -1438,9 +1438,5 @@ public class RulesManagerImpl implements RulesManager, RulesService, Manager { protected void removePFRule(PortForwardingRuleVO rule) { _portForwardingDao.remove(rule.getId()); - - //if the rule is the last one for the ip address assigned to VPC, unassign it from the network - IpAddress ip = _ipAddressDao.findById(rule.getSourceIpAddressId()); - _vpcMgr.unassignIPFromVpcNetwork(ip.getId(), rule.getNetworkId()); } }