From 384025f258b454726be2556ed10c7e13a241f088 Mon Sep 17 00:00:00 2001 From: Jayapal Date: Tue, 26 Aug 2014 10:13:32 +0530 Subject: [PATCH] CLOUDSTACK-7218: Remvoing all static nat associated with vm in case of secondary ips In vm secondary ips case static nat configured to vm primary/secondary ips IP1-->vm1Ip1, IP2-->vm1Ip2 While destroying vm deleting all static nats associated with the vm --- .../src/com/cloud/network/dao/IPAddressDao.java | 5 +++++ .../com/cloud/network/dao/IPAddressDaoImpl.java | 11 +++++++++++ server/src/com/cloud/vm/UserVmManagerImpl.java | 17 +++++++++-------- 3 files changed, 25 insertions(+), 8 deletions(-) diff --git a/engine/schema/src/com/cloud/network/dao/IPAddressDao.java b/engine/schema/src/com/cloud/network/dao/IPAddressDao.java index fb92cf9191a..8d60b570414 100755 --- a/engine/schema/src/com/cloud/network/dao/IPAddressDao.java +++ b/engine/schema/src/com/cloud/network/dao/IPAddressDao.java @@ -52,6 +52,10 @@ public interface IPAddressDao extends GenericDao { IPAddressVO findByAssociatedVmId(long vmId); + // for vm secondary ips case mapping is IP1--> vmIp1, IP2-->vmIp2, etc + // This method is used when one vm is mapped to muliple to public ips + List findAllByAssociatedVmId(long vmId); + IPAddressVO findByIpAndSourceNetworkId(long networkId, String ipAddress); public IPAddressVO findByIpAndDcId(long dcId, String ipAddress); @@ -79,4 +83,5 @@ public interface IPAddressDao extends GenericDao { boolean deletePublicIPRange(long vlanDbId); void lockRange(long vlandbId); + } diff --git a/engine/schema/src/com/cloud/network/dao/IPAddressDaoImpl.java b/engine/schema/src/com/cloud/network/dao/IPAddressDaoImpl.java index e1530cacbb6..6f6bfd27d24 100755 --- a/engine/schema/src/com/cloud/network/dao/IPAddressDaoImpl.java +++ b/engine/schema/src/com/cloud/network/dao/IPAddressDaoImpl.java @@ -263,6 +263,17 @@ public class IPAddressDaoImpl extends GenericDaoBase implemen return findOneBy(sc); } + + // for vm secondary ips case mapping is IP1--> vmIp1, IP2-->vmIp2, etc + // Used when vm is mapped to muliple to public ips + @Override + public List findAllByAssociatedVmId(long vmId) { + SearchCriteria sc = AllFieldsSearch.create(); + sc.setParameters("associatedWithVmId", vmId); + + return listBy(sc); + } + @Override public IPAddressVO findByVmIp(String vmIp) { SearchCriteria sc = AllFieldsSearch.create(); diff --git a/server/src/com/cloud/vm/UserVmManagerImpl.java b/server/src/com/cloud/vm/UserVmManagerImpl.java index e5de11fdba1..0fbaca8a01e 100755 --- a/server/src/com/cloud/vm/UserVmManagerImpl.java +++ b/server/src/com/cloud/vm/UserVmManagerImpl.java @@ -1776,19 +1776,20 @@ public class UserVmManagerImpl extends ManagerBase implements UserVmManager, Vir // If vm is assigned to static nat, disable static nat for the ip // address and disassociate ip if elasticIP is enabled - IPAddressVO ip = _ipAddressDao.findByAssociatedVmId(vmId); - try { - if (ip != null) { + List ips = _ipAddressDao.findAllByAssociatedVmId(vmId); + + for (IPAddressVO ip : ips) { + try { 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"); success = false; } + } catch (ResourceUnavailableException e) { + success = false; + s_logger.warn("Failed to disable static nat for ip address " + ip + " as a part of vm id=" + vmId + " expunge because resource is unavailable", e); } - } catch (ResourceUnavailableException e) { - success = false; - s_logger.warn("Failed to disable static nat for ip address " + ip + " as a part of vm id=" + vmId + " expunge because resource is unavailable", e); } return success; @@ -4340,8 +4341,8 @@ public class UserVmManagerImpl extends ManagerBase implements UserVmManager, Vir throw new InvalidParameterValueException("Remove the load balancing rules for this VM before assigning to another user."); } // check for one on one nat - IPAddressVO ip = _ipAddressDao.findByAssociatedVmId(cmd.getVmId()); - if (ip != null) { + List ips = _ipAddressDao.findAllByAssociatedVmId(cmd.getVmId()); + for (IPAddressVO ip : ips) { if (ip.isOneToOneNat()) { throw new InvalidParameterValueException("Remove the one to one nat rule for this VM for ip " + ip.toString()); }