From 4f46c3b160a51f6c46f51f02e2c4c153f3e804a3 Mon Sep 17 00:00:00 2001 From: Alena Prokharchyk Date: Mon, 16 Jan 2012 09:04:40 -0800 Subject: [PATCH] Mark ip as not elastic when disable static nat is called on it --- .../com/cloud/network/rules/RulesManager.java | 2 +- .../cloud/network/rules/RulesManagerImpl.java | 16 ++++++++++------ server/src/com/cloud/vm/UserVmManagerImpl.java | 2 +- 3 files changed, 12 insertions(+), 8 deletions(-) diff --git a/server/src/com/cloud/network/rules/RulesManager.java b/server/src/com/cloud/network/rules/RulesManager.java index e86a3b2694a..07ae211589f 100644 --- a/server/src/com/cloud/network/rules/RulesManager.java +++ b/server/src/com/cloud/network/rules/RulesManager.java @@ -73,6 +73,6 @@ public interface RulesManager extends RulesService { boolean enableElasticIpAndStaticNatForVm(UserVm vm, boolean stopOnError); - boolean disableStaticNat(long ipAddressId, Account caller, long callerUserId) throws ResourceUnavailableException; + boolean disableStaticNat(long ipAddressId, Account caller, long callerUserId, boolean releaseIpIfElastic) throws ResourceUnavailableException; } diff --git a/server/src/com/cloud/network/rules/RulesManagerImpl.java b/server/src/com/cloud/network/rules/RulesManagerImpl.java index 22440e23f81..3e28d229e18 100755 --- a/server/src/com/cloud/network/rules/RulesManagerImpl.java +++ b/server/src/com/cloud/network/rules/RulesManagerImpl.java @@ -419,7 +419,7 @@ public class RulesManagerImpl implements RulesManager, RulesService, Manager { } //unassign old static nat rule s_logger.debug("Disassociating static nat for ip " + oldIP); - if (!disableStaticNat(oldIP.getId(), caller, callerUserId)) { + if (!disableStaticNat(oldIP.getId(), caller, callerUserId, true)) { throw new CloudRuntimeException("Failed to disable old static nat rule for vm id=" + vmId + " and ip " + oldIP); } } @@ -1025,7 +1025,7 @@ public class RulesManagerImpl implements RulesManager, RulesService, Manager { Long vmId = ipAddress.getAssociatedWithVmId(); - boolean success = disableStaticNat(ipId, caller, ctx.getCallerUserId()); + boolean success = disableStaticNat(ipId, caller, ctx.getCallerUserId(), false); if (success && vmId != null) { s_logger.debug("Allocating ip and enabling static nat for vm id=" + vmId + " as a part of disassociateIp command"); UserVm vm = _vmDao.findById(vmId); @@ -1040,8 +1040,8 @@ public class RulesManagerImpl implements RulesManager, RulesService, Manager { return success; } - @Override - public boolean disableStaticNat(long ipId, Account caller, long callerUserId) throws ResourceUnavailableException { + @Override @DB + public boolean disableStaticNat(long ipId, Account caller, long callerUserId, boolean releaseIpIfElastic) throws ResourceUnavailableException { boolean success = true; IPAddressVO ipAddress = _ipAddressDao.findById(ipId); @@ -1069,12 +1069,16 @@ public class RulesManagerImpl implements RulesManager, RulesService, Manager { } if (success) { + boolean isIpElastic = ipAddress.getElastic(); + ipAddress.setOneToOneNat(false); ipAddress.setAssociatedWithVmId(null); + if (isIpElastic && !releaseIpIfElastic) { + ipAddress.setElastic(false); + } _ipAddressDao.update(ipAddress.getId(), ipAddress); - - if (!_networkMgr.handleElasticIpRelease(ipAddress)) { + if (isIpElastic && releaseIpIfElastic && !_networkMgr.handleElasticIpRelease(ipAddress)) { s_logger.warn("Failed to release elastic ip address " + ipAddress); success = false; } diff --git a/server/src/com/cloud/vm/UserVmManagerImpl.java b/server/src/com/cloud/vm/UserVmManagerImpl.java index 8667f8d74e2..66a834d226c 100755 --- a/server/src/com/cloud/vm/UserVmManagerImpl.java +++ b/server/src/com/cloud/vm/UserVmManagerImpl.java @@ -1264,7 +1264,7 @@ public class UserVmManagerImpl implements UserVmManager, UserVmService, Manager IPAddressVO ip = _ipAddressDao.findByAssociatedVmId(vmId); try { if (ip != null) { - if (_rulesMgr.disableStaticNat(ip.getId(), _accountMgr.getAccount(Account.ACCOUNT_ID_SYSTEM), User.UID_SYSTEM)) { + if (_rulesMgr.disableStaticNat(ip.getId(), _accountMgr.getAccount(Account.ACCOUNT_ID_SYSTEM), User.UID_SYSTEM, true)) { s_logger.debug("Disabled 1-1 nat for ip address " + ip + " as a part of vm id=" + vmId + " expunge"); } else { s_logger.warn("Failed to disable static nat for ip address " + ip + " as a part of vm id=" + vmId + " expunge");