From dfaf7c4c5d040fc197d6762f76f43d42ce46b8ac Mon Sep 17 00:00:00 2001 From: alena Date: Thu, 23 Dec 2010 16:22:55 -0800 Subject: [PATCH] Remove vm from Load Balancers when vm is Expunged. Added more logging to vm expunge process --- .../network/lb/LoadBalancingRulesManager.java | 7 ++++ .../lb/LoadBalancingRulesManagerImpl.java | 39 +++++++++++++++++++ .../src/com/cloud/vm/UserVmManagerImpl.java | 17 +++++++- 3 files changed, 62 insertions(+), 1 deletion(-) diff --git a/server/src/com/cloud/network/lb/LoadBalancingRulesManager.java b/server/src/com/cloud/network/lb/LoadBalancingRulesManager.java index 9f28f1d10a8..1922386c440 100644 --- a/server/src/com/cloud/network/lb/LoadBalancingRulesManager.java +++ b/server/src/com/cloud/network/lb/LoadBalancingRulesManager.java @@ -25,4 +25,11 @@ import com.cloud.utils.net.Ip; public interface LoadBalancingRulesManager extends LoadBalancingRulesService { boolean removeAllLoadBalanacers(Ip ip); List getExistingDestinations(long lbId); + + /** + * Remove vm from all load balancers + * @param vmId + * @return true if removal is successful + */ + boolean removeVmFromLoadBalancers(long vmId); } diff --git a/server/src/com/cloud/network/lb/LoadBalancingRulesManagerImpl.java b/server/src/com/cloud/network/lb/LoadBalancingRulesManagerImpl.java index 4e9ad525c24..cfbfc581bb9 100644 --- a/server/src/com/cloud/network/lb/LoadBalancingRulesManagerImpl.java +++ b/server/src/com/cloud/network/lb/LoadBalancingRulesManagerImpl.java @@ -19,6 +19,7 @@ package com.cloud.network.lb; import java.security.InvalidParameterException; import java.util.ArrayList; +import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; @@ -219,6 +220,44 @@ public class LoadBalancingRulesManagerImpl implements LoadBalancingRulesManager, return true; } + + + @Override + public boolean removeVmFromLoadBalancers(long instanceId) { + boolean success = true; + List maps = _lb2VmMapDao.listByInstanceId(instanceId); + if (maps == null || maps.isEmpty()) { + return true; + } + + Map> lbsToReconfigure = new HashMap>(); + + //first set all existing lb mappings with Revoke state + for (LoadBalancerVMMapVO map: maps) { + long lbId = map.getLoadBalancerId(); + List instances = lbsToReconfigure.get(lbId); + if (instances == null) { + instances = new ArrayList(); + } + instances.add(map.getInstanceId()); + lbsToReconfigure.put(lbId, instances); + + map.setRevoke(true); + _lb2VmMapDao.persist(map); + s_logger.debug("Set load balancer rule for revoke: rule id " + map.getLoadBalancerId() + ", vmId " + instanceId); + } + + //Reapply all lbs that had the vm assigned + if (lbsToReconfigure != null) { + for (Map.Entry> lb : lbsToReconfigure.entrySet()) { + if (!removeFromLoadBalancer(lb.getKey(), lb.getValue())) { + success = false; + } + } + } + return success; + } + @Override public boolean deleteLoadBalancerRule(long loadBalancerId, boolean apply) { diff --git a/server/src/com/cloud/vm/UserVmManagerImpl.java b/server/src/com/cloud/vm/UserVmManagerImpl.java index c520f4dd438..d3f68ea9743 100755 --- a/server/src/com/cloud/vm/UserVmManagerImpl.java +++ b/server/src/com/cloud/vm/UserVmManagerImpl.java @@ -132,6 +132,7 @@ import com.cloud.network.dao.IPAddressDao; import com.cloud.network.dao.LoadBalancerDao; import com.cloud.network.dao.LoadBalancerVMMapDao; import com.cloud.network.dao.NetworkDao; +import com.cloud.network.lb.LoadBalancingRulesManager; import com.cloud.network.router.VirtualNetworkApplianceManager; import com.cloud.network.rules.RulesManager; import com.cloud.network.security.SecurityGroupManager; @@ -254,6 +255,7 @@ public class UserVmManagerImpl implements UserVmManager, UserVmService, Manager @Inject VirtualNetworkApplianceManager _routerMgr; @Inject NicDao _nicDao; @Inject RulesManager _rulesMgr; + @Inject LoadBalancingRulesManager _lbMgr; @Inject UsageEventDao _usageEventDao; private IpAddrAllocator _IpAllocator; @@ -1603,8 +1605,21 @@ public class UserVmManagerImpl implements UserVmManager, UserVmService, Manager try { vols = _volsDao.findByInstanceIdDestroyed(vmId); _storageMgr.destroy(vm, vols); + + //cleanup port forwarding rules + if (_rulesMgr.revokePortForwardingRule(vmId)) { + s_logger.debug("Port forwarding rules are removed successfully as a part of vm id=" + vmId + " expunge"); + } else { + s_logger.warn("Fail to remove port forwarding rules as a part of vm id=" + vmId + " expunge"); + } + + //cleanup load balancer rules + if (_lbMgr.removeVmFromLoadBalancers(vmId)) { + s_logger.debug("LB rules are removed successfully as a part of vm id=" + vmId + " expunge"); + } else { + s_logger.warn("Fail to remove lb rules as a part of vm id=" + vmId + " expunge"); + } - _rulesMgr.revokePortForwardingRule(vmId); _vmDao.remove(vm.getId()); _networkGroupMgr.removeInstanceFromGroups(vm.getId()); removeInstanceFromGroup(vm.getId());