WIP2: make creating an ELB bullet proof

This commit is contained in:
Chiradeep Vittal 2011-07-27 21:08:58 -07:00
parent b240c4a645
commit 2162cdf283
3 changed files with 14 additions and 6 deletions

View File

@ -232,5 +232,9 @@ public class CreateLoadBalancerRuleCmd extends BaseAsyncCmd /*implements LoadBa
/*FIXME*/
return null;
}
public void setSourceIpAddressId(Long ipId) {
this.publicIpId = ipId;
}
}

View File

@ -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;
}

View File

@ -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");