From feb5fa901e09c6a1638e6398e2543d77ee5aa21b Mon Sep 17 00:00:00 2001 From: Nitesh Sarda Date: Mon, 27 Feb 2017 23:24:20 +0530 Subject: [PATCH] CLOUDSTACK-9779 : Releasing secondary guest IP fails with error VM nic Ip x.x.x.x is mapped to load balancing rule --- .../cloud/network/dao/LoadBalancerDao.java | 2 + .../network/dao/LoadBalancerDaoImpl.java | 40 +++++++++++++++++++ .../com/cloud/network/NetworkServiceImpl.java | 6 ++- .../CreateNetworkOfferingTest.java | 4 ++ .../test/resources/createNetworkOffering.xml | 39 +++++++++--------- 5 files changed, 71 insertions(+), 20 deletions(-) diff --git a/engine/schema/src/com/cloud/network/dao/LoadBalancerDao.java b/engine/schema/src/com/cloud/network/dao/LoadBalancerDao.java index 331f7555d81..c639ef78632 100644 --- a/engine/schema/src/com/cloud/network/dao/LoadBalancerDao.java +++ b/engine/schema/src/com/cloud/network/dao/LoadBalancerDao.java @@ -29,4 +29,6 @@ public interface LoadBalancerDao extends GenericDao { List listInTransitionStateByNetworkIdAndScheme(long networkId, Scheme scheme); + boolean isLoadBalancerRulesMappedToVmGuestIp(long instanceId, String instanceIp, long networkId); + } diff --git a/engine/schema/src/com/cloud/network/dao/LoadBalancerDaoImpl.java b/engine/schema/src/com/cloud/network/dao/LoadBalancerDaoImpl.java index 0ad768db3b9..932c5c68a2d 100644 --- a/engine/schema/src/com/cloud/network/dao/LoadBalancerDaoImpl.java +++ b/engine/schema/src/com/cloud/network/dao/LoadBalancerDaoImpl.java @@ -20,6 +20,8 @@ import java.util.List; import javax.inject.Inject; +import com.cloud.network.rules.FirewallRule; +import com.cloud.utils.db.JoinBuilder; import org.springframework.stereotype.Component; import com.cloud.network.rules.FirewallRule.State; @@ -36,6 +38,8 @@ public class LoadBalancerDaoImpl extends GenericDaoBase im @Inject protected FirewallRulesCidrsDao _portForwardingRulesCidrsDao; + @Inject + LoadBalancerVMMapDao _loadBalancerVMMapDao; protected LoadBalancerDaoImpl() { ListByIp = createSearchBuilder(); @@ -75,4 +79,40 @@ public class LoadBalancerDaoImpl extends GenericDaoBase im return listBy(sc); } + @Override + public boolean isLoadBalancerRulesMappedToVmGuestIp(long instanceId, String instanceIp, long networkId) + { + SearchBuilder lbVmMapSearch = _loadBalancerVMMapDao.createSearchBuilder(); + lbVmMapSearch.and("instanceIp", lbVmMapSearch.entity().getInstanceIp(),SearchCriteria.Op.EQ); + lbVmMapSearch.and("instanceId", lbVmMapSearch.entity().getInstanceId(), SearchCriteria.Op.EQ); + + SearchBuilder firewallRuleIdSearch = createSearchBuilder(); + firewallRuleIdSearch.selectFields(firewallRuleIdSearch.entity().getId()); + firewallRuleIdSearch.and("networkId",firewallRuleIdSearch.entity().getNetworkId(),Op.EQ); + firewallRuleIdSearch.and("purpose",firewallRuleIdSearch.entity().getPurpose(),Op.EQ); + firewallRuleIdSearch.and("state",firewallRuleIdSearch.entity().getState(),Op.NEQ); + firewallRuleIdSearch.join("LoadBalancerRuleList", lbVmMapSearch, lbVmMapSearch.entity().getLoadBalancerId(), firewallRuleIdSearch.entity().getId(), JoinBuilder.JoinType.INNER); + + firewallRuleIdSearch.done(); + lbVmMapSearch.done(); + + SearchCriteria sc = firewallRuleIdSearch.create(); + sc.setParameters("state", State.Revoke); + sc.setParameters("networkId", networkId); + sc.setParameters("purpose", FirewallRule.Purpose.LoadBalancing); + + sc.setJoinParameters("LoadBalancerRuleList", "instanceIp", instanceIp); + sc.setJoinParameters("LoadBalancerRuleList", "instanceId", instanceId); + + List lbRuleList = customSearch(sc, null); + + if(lbRuleList == null || lbRuleList.size() > 0) { + return true; + } + + return false; + } + + + } diff --git a/server/src/com/cloud/network/NetworkServiceImpl.java b/server/src/com/cloud/network/NetworkServiceImpl.java index 73a35058812..dc144ce1227 100644 --- a/server/src/com/cloud/network/NetworkServiceImpl.java +++ b/server/src/com/cloud/network/NetworkServiceImpl.java @@ -197,6 +197,7 @@ import com.cloud.vm.dao.NicSecondaryIpDao; import com.cloud.vm.dao.NicSecondaryIpVO; import com.cloud.vm.dao.UserVmDao; import com.cloud.vm.dao.VMInstanceDao; +import com.cloud.network.dao.LoadBalancerDao; /** * NetworkServiceImpl implements NetworkService. @@ -335,6 +336,9 @@ public class NetworkServiceImpl extends ManagerBase implements NetworkService { @Inject NetworkDetailsDao _networkDetailsDao; + @Inject + LoadBalancerDao _loadBalancerDao; + int _cidrLimit; boolean _allowSubdomainNetworkAccess; @@ -852,7 +856,7 @@ public class NetworkServiceImpl extends ManagerBase implements NetworkService { throw new InvalidParameterValueException("Can' remove the ip " + secondaryIp + "is associate with static NAT rule public IP address id " + publicIpVO.getId()); } - if (_lbService.isLbRuleMappedToVmGuestIp(secondaryIp)) { + if (_loadBalancerDao.isLoadBalancerRulesMappedToVmGuestIp(vm.getId(), secondaryIp, network.getId())) { s_logger.debug("VM nic IP " + secondaryIp + " is mapped to load balancing rule"); throw new InvalidParameterValueException("Can't remove the secondary ip " + secondaryIp + " is mapped to load balancing rule"); } diff --git a/server/test/org/apache/cloudstack/networkoffering/CreateNetworkOfferingTest.java b/server/test/org/apache/cloudstack/networkoffering/CreateNetworkOfferingTest.java index 5d2eb4c4970..1fe58b37184 100644 --- a/server/test/org/apache/cloudstack/networkoffering/CreateNetworkOfferingTest.java +++ b/server/test/org/apache/cloudstack/networkoffering/CreateNetworkOfferingTest.java @@ -24,6 +24,7 @@ import java.util.Set; import javax.inject.Inject; +import com.cloud.network.dao.LoadBalancerVMMapDao; import junit.framework.TestCase; import org.apache.cloudstack.context.CallContext; @@ -93,6 +94,9 @@ public class CreateNetworkOfferingTest extends TestCase { @Inject UserIpAddressDetailsDao userIpAddressDetailsDao; + @Inject + LoadBalancerVMMapDao _loadBalancerVMMapDao; + @Override @Before public void setUp() { diff --git a/server/test/resources/createNetworkOffering.xml b/server/test/resources/createNetworkOffering.xml index 5202bc79186..e035b62393f 100644 --- a/server/test/resources/createNetworkOffering.xml +++ b/server/test/resources/createNetworkOffering.xml @@ -12,13 +12,13 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation="http://www.springframework.org/schema/beans - http://www.springframework.org/schema/beans/spring-beans.xsd + http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/tx - http://www.springframework.org/schema/tx/spring-tx.xsd + http://www.springframework.org/schema/tx/spring-tx.xsd http://www.springframework.org/schema/aop - http://www.springframework.org/schema/aop/spring-aop.xsd + http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/context - http://www.springframework.org/schema/context/spring-context.xsd"> + http://www.springframework.org/schema/context/spring-context.xsd"> @@ -34,23 +34,24 @@ - - - - - - - - - + + + + + + + + + - - - + + + - + - - + + +