From f8993d9ec44a0873df8e6073e95128ae77019d21 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 0dc5b55e40b..f67f85bc7e8 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 5e7c97f8057..fefe743adc2 100755 --- a/server/src/com/cloud/network/NetworkManagerImpl.java +++ b/server/src/com/cloud/network/NetworkManagerImpl.java @@ -1876,6 +1876,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); @@ -1898,6 +1900,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); } @@ -2254,6 +2258,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 96cbde447cf..a8ce2d7cc3c 100644 --- a/server/src/com/cloud/network/rules/RulesManagerImpl.java +++ b/server/src/com/cloud/network/rules/RulesManagerImpl.java @@ -695,7 +695,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())); @@ -761,7 +761,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));