From d3d558f2fb296efd0d054776dcfecc00ab5cf429 Mon Sep 17 00:00:00 2001 From: alena Date: Thu, 24 Feb 2011 18:19:19 -0800 Subject: [PATCH] Fixed NPE in vm expunge process - when cleanup static nat rules after corresponding vm is expunged, make search for guest Nic including removed. --- server/src/com/cloud/network/NetworkManager.java | 2 ++ server/src/com/cloud/network/NetworkManagerImpl.java | 10 ++++++++++ .../src/com/cloud/network/rules/RulesManagerImpl.java | 4 ++-- 3 files changed, 14 insertions(+), 2 deletions(-) diff --git a/server/src/com/cloud/network/NetworkManager.java b/server/src/com/cloud/network/NetworkManager.java index a11c9865479..5a21cc7d222 100644 --- a/server/src/com/cloud/network/NetworkManager.java +++ b/server/src/com/cloud/network/NetworkManager.java @@ -159,6 +159,8 @@ public interface NetworkManager extends NetworkService { Nic getNicInNetwork(long vmId, long networkId); + Nic getNicInNetworkIncludingRemoved(long vmId, long networkId); + Nic getNicForTraffic(long vmId, TrafficType type); Network getDefaultNetworkForVm(long vmId); diff --git a/server/src/com/cloud/network/NetworkManagerImpl.java b/server/src/com/cloud/network/NetworkManagerImpl.java index 63b37115622..4f97d630894 100755 --- a/server/src/com/cloud/network/NetworkManagerImpl.java +++ b/server/src/com/cloud/network/NetworkManagerImpl.java @@ -1823,6 +1823,8 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag @DB @Override public boolean destroyNetwork(long networkId, ReservationContext context) { + Account callerAccount = _accountMgr.getAccount(context.getCaller().getAccountId()); + NetworkVO network = _networksDao.findById(networkId); if (network == null) { s_logger.debug("Unable to find network with id: " + networkId); @@ -1845,6 +1847,8 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag List ipsToRelease = _ipAddressDao.listByAssociatedNetwork(networkId); if (ipsToRelease != null && !ipsToRelease.isEmpty()) { for (IPAddressVO ip : ipsToRelease) { + //delete load balancer rules associated with the ip address before unassigning it + _lbMgr.removeAllLoadBalanacers(ip.getId(), callerAccount, context.getCaller().getId()); unassignPublicIpAddress(ip); } @@ -2181,6 +2185,12 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag public Nic getNicInNetwork(long vmId, long networkId) { return _nicDao.findByInstanceIdAndNetworkId(networkId, vmId); } + + + @Override + public Nic getNicInNetworkIncludingRemoved(long vmId, long networkId) { + return _nicDao.findByInstanceIdAndNetworkIdIncludingRemoved(networkId, vmId); + } @Override @DB public boolean associateIpAddressListToAccount(long userId, long accountId, long zoneId, Long vlanId, Network network) throws InsufficientCapacityException, ConcurrentOperationException, ResourceUnavailableException { diff --git a/server/src/com/cloud/network/rules/RulesManagerImpl.java b/server/src/com/cloud/network/rules/RulesManagerImpl.java index 69472620ddc..0871db3bb64 100644 --- a/server/src/com/cloud/network/rules/RulesManagerImpl.java +++ b/server/src/com/cloud/network/rules/RulesManagerImpl.java @@ -689,7 +689,7 @@ public class RulesManagerImpl implements RulesManager, RulesService, Manager { throw new CloudRuntimeException("Unable to find ip address to map to in vm id=" + vm.getId()); } - Nic guestNic = _networkMgr.getNicInNetwork(vm.getId(), networkId); + Nic guestNic = _networkMgr.getNicInNetworkIncludingRemoved(vm.getId(), networkId); FirewallRuleVO ruleVO = _firewallDao.findById(rule.getId()); staticNatRules.add(new StaticNatRuleImpl(ruleVO, guestNic.getIp4Address())); @@ -755,7 +755,7 @@ public class RulesManagerImpl implements RulesManager, RulesService, Manager { UserVmVO vm = _vmDao.findById(sourceIp.getAssociatedWithVmId()); - Nic guestNic = _networkMgr.getNicInNetwork(vm.getId(), networkId); + Nic guestNic = _networkMgr.getNicInNetworkIncludingRemoved(vm.getId(), networkId); String dstIp = guestNic.getIp4Address(); staticNatRules.add(new StaticNatRuleImpl(rule, dstIp));