mirror of https://github.com/apache/cloudstack.git
WIP2: make creating an ELB bullet proof
This commit is contained in:
parent
b240c4a645
commit
2162cdf283
|
|
@ -232,5 +232,9 @@ public class CreateLoadBalancerRuleCmd extends BaseAsyncCmd /*implements LoadBa
|
|||
/*FIXME*/
|
||||
return null;
|
||||
}
|
||||
|
||||
public void setSourceIpAddressId(Long ipId) {
|
||||
this.publicIpId = ipId;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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<? extends FirewallRule> rules)
|
||||
throws ResourceUnavailableException;
|
||||
|
||||
public LoadBalancer handleCreateLoadBalancerRule(CreateLoadBalancerRuleCmd lb, Account caller) throws InsufficientAddressCapacityException;
|
||||
public LoadBalancer handleCreateLoadBalancerRule(CreateLoadBalancerRuleCmd lb, Account caller) throws InsufficientAddressCapacityException, NetworkRuleConflictException;
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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");
|
||||
|
|
|
|||
Loading…
Reference in New Issue