diff --git a/api/src/com/cloud/api/commands/CreateLoadBalancerRuleCmd.java b/api/src/com/cloud/api/commands/CreateLoadBalancerRuleCmd.java index f0aeff3aaa6..c34224144f8 100644 --- a/api/src/com/cloud/api/commands/CreateLoadBalancerRuleCmd.java +++ b/api/src/com/cloud/api/commands/CreateLoadBalancerRuleCmd.java @@ -232,5 +232,9 @@ public class CreateLoadBalancerRuleCmd extends BaseAsyncCmd /*implements LoadBa /*FIXME*/ return null; } + + public void setSourceIpAddressId(Long ipId) { + this.publicIpId = ipId; + } } diff --git a/server/src/com/cloud/network/lb/ElasticLoadBalancerManager.java b/server/src/com/cloud/network/lb/ElasticLoadBalancerManager.java index 06ccd5448f2..3a7165e96d2 100644 --- a/server/src/com/cloud/network/lb/ElasticLoadBalancerManager.java +++ b/server/src/com/cloud/network/lb/ElasticLoadBalancerManager.java @@ -20,13 +20,10 @@ package com.cloud.network.lb; import java.util.List; import com.cloud.api.commands.CreateLoadBalancerRuleCmd; -import com.cloud.exception.ConcurrentOperationException; import com.cloud.exception.InsufficientAddressCapacityException; -import com.cloud.exception.InsufficientCapacityException; +import com.cloud.exception.NetworkRuleConflictException; import com.cloud.exception.ResourceUnavailableException; import com.cloud.network.Network; -import com.cloud.network.NetworkVO; -import com.cloud.network.lb.LoadBalancingRule.LbDestination; import com.cloud.network.rules.FirewallRule; import com.cloud.network.rules.LoadBalancer; import com.cloud.user.Account; @@ -39,6 +36,6 @@ public interface ElasticLoadBalancerManager { List rules) throws ResourceUnavailableException; - public LoadBalancer handleCreateLoadBalancerRule(CreateLoadBalancerRuleCmd lb, Account caller) throws InsufficientAddressCapacityException; + public LoadBalancer handleCreateLoadBalancerRule(CreateLoadBalancerRuleCmd lb, Account caller) throws InsufficientAddressCapacityException, NetworkRuleConflictException; } diff --git a/server/src/com/cloud/network/lb/ElasticLoadBalancerManagerImpl.java b/server/src/com/cloud/network/lb/ElasticLoadBalancerManagerImpl.java index 4beb8345f2b..7ab5fc76fdf 100644 --- a/server/src/com/cloud/network/lb/ElasticLoadBalancerManagerImpl.java +++ b/server/src/com/cloud/network/lb/ElasticLoadBalancerManagerImpl.java @@ -517,6 +517,7 @@ public class ElasticLoadBalancerManagerImpl implements } Network frontEndNetwork = networks.get(0); Transaction txn = Transaction.currentTxn(); + txn.start(); PublicIp ip = _networkMgr.assignPublicIpAddress(lb.getZoneId(), null, account, VlanType.DirectAttached, frontEndNetwork.getId(), null); IPAddressVO ipvo = _ipAddressDao.findById(ip.getId()); ipvo.setAssociatedWithNetworkId(frontEndNetwork.getId()); @@ -534,7 +535,7 @@ public class ElasticLoadBalancerManagerImpl implements @Override @DB - public LoadBalancer handleCreateLoadBalancerRule( CreateLoadBalancerRuleCmd lb, Account account) throws InsufficientAddressCapacityException { + public LoadBalancer handleCreateLoadBalancerRule( CreateLoadBalancerRuleCmd lb, Account account) throws InsufficientAddressCapacityException, NetworkRuleConflictException { Long ipId = lb.getSourceIpAddressId(); boolean newIp = false; account = _accountDao.acquireInLockTable(account.getId()); @@ -556,7 +557,12 @@ public class ElasticLoadBalancerManagerImpl implements ipId = ip.getId(); newIp = true; } + } else { + ipId = existingLbs.get(0).getSourceIpAddressId(); } + } else { + s_logger.warn("Found existing load balancers matching requested new LB"); + throw new NetworkRuleConflictException("Found existing load balancers matching requested new LB"); } IPAddressVO ipAddr = _ipAddressDao.findById(ipId); @@ -570,6 +576,7 @@ public class ElasticLoadBalancerManagerImpl implements } LoadBalancer result = null; try { + lb.setSourceIpAddressId(ipId); result = _lbMgr.createLoadBalancer(lb); } catch (NetworkRuleConflictException e) { s_logger.warn("Failed to create LB rule, not continuing with ELB deployment");