bug 7467: release IP address works now.

status 7467: resolved fixed

Fixed all load balancer commands to work with the latest networking code
This commit is contained in:
alena 2010-12-10 11:53:15 -08:00
parent 9c8d8d1dc4
commit 88d6ff2136
18 changed files with 329 additions and 112 deletions

View File

@ -19,8 +19,7 @@ package com.cloud.agent.api.routing;
import java.util.List;
import com.cloud.network.rules.LoadBalancer;
import com.cloud.network.rules.LoadBalancer.Destination;
import com.cloud.network.lb.LoadBalancingRule.LbDestination;
/**
* LoadBalancerConfigCommand sends the load balancer configuration
@ -35,7 +34,7 @@ public class LoadBalancerConfigCommand extends RoutingCommand {
boolean alreadyAdded;
DestinationTO[] destinations;
public LoadBalancerConfigCommand(String srcIp, int srcPort, String protocol, String algorithm, boolean revoked, boolean alreadyAdded, List<? extends Destination> destinations) {
public LoadBalancerConfigCommand(String srcIp, int srcPort, String protocol, String algorithm, boolean revoked, boolean alreadyAdded, List<LbDestination> destinations) {
this.srcIp = srcIp;
this.srcPort = srcPort;
this.protocol = protocol;
@ -44,8 +43,8 @@ public class LoadBalancerConfigCommand extends RoutingCommand {
this.alreadyAdded = alreadyAdded;
this.destinations = new DestinationTO[destinations.size()];
int i = 0;
for (Destination destination : destinations) {
this.destinations[i++] = new DestinationTO(destination.getIpAddress(), destination.getDestinationPortStart(), destination.getRevoked(), destination.getAlreadyAdded());
for (LbDestination destination : destinations) {
this.destinations[i++] = new DestinationTO(destination.getIpAddress(), destination.getDestinationPortStart(), destination.isRevoked(), false);
}
}

View File

@ -17,7 +17,6 @@
*/
package com.cloud.api.commands;
import java.util.ArrayList;
import java.util.List;
import org.apache.log4j.Logger;
@ -30,9 +29,9 @@ import com.cloud.api.Parameter;
import com.cloud.api.ServerApiException;
import com.cloud.api.response.SuccessResponse;
import com.cloud.event.EventTypes;
import com.cloud.exception.InvalidParameterValueException;
import com.cloud.network.rules.LoadBalancer;
import com.cloud.user.Account;
import com.cloud.utils.StringUtils;
@Implementation(description="Assigns virtual machine or a list of virtual machines to a load balancer rule.", responseObject=SuccessResponse.class)
public class AssignToLoadBalancerRuleCmd extends BaseAsyncCmd {
@ -46,9 +45,6 @@ public class AssignToLoadBalancerRuleCmd extends BaseAsyncCmd {
@Parameter(name=ApiConstants.ID, type=CommandType.LONG, required=true, description="the ID of the load balancer rule")
private Long id;
@Parameter(name=ApiConstants.VIRTUAL_MACHINE_ID, type=CommandType.LONG, required=false, description="the ID of the virtual machine that is being assigned to the load balancer rule")
private Long virtualMachineId;
@Parameter(name=ApiConstants.VIRTUAL_MACHINE_IDS, type=CommandType.LIST, collectionType=CommandType.LONG, required=false, description="the list of IDs of the virtual machine that are being assigned to the load balancer rule(i.e. virtualMachineIds=1,2,3)")
private List<Long> virtualMachineIds;
@ -61,10 +57,6 @@ public class AssignToLoadBalancerRuleCmd extends BaseAsyncCmd {
return id;
}
public Long getVirtualMachineId() {
return virtualMachineId;
}
public List<Long> getVirtualMachineIds() {
return virtualMachineIds;
}
@ -94,21 +86,11 @@ public class AssignToLoadBalancerRuleCmd extends BaseAsyncCmd {
@Override
public String getEventDescription() {
return "applying port forwarding service for vm with id: " + getVirtualMachineId();
return "applying instances for load balancer: " + getLoadBalancerId() + " (ids: " + StringUtils.join(getVirtualMachineIds(), ",") + ")";
}
@Override
public void execute(){
if (virtualMachineIds == null && virtualMachineId == null) {
throw new InvalidParameterValueException("Must specify virtual machine id");
}
if (virtualMachineIds == null) {
virtualMachineIds = new ArrayList<Long>();
}
if (virtualMachineId != null) {
virtualMachineIds.add(virtualMachineId);
}
boolean result = _lbService.assignToLoadBalancer(getLoadBalancerId(), virtualMachineIds);
if (result) {
SuccessResponse response = new SuccessResponse(getCommandName());

View File

@ -18,8 +18,6 @@
package com.cloud.api.commands;
import java.util.List;
import org.apache.log4j.Logger;
import com.cloud.api.ApiConstants;
@ -185,10 +183,5 @@ public class CreateLoadBalancerRuleCmd extends BaseCmd implements LoadBalancer
public int getDefaultPortEnd() {
return Integer.parseInt(privatePort);
}
@Override
public List<? extends Destination> getDestinations() {
throw new UnsupportedOperationException("not supported");
}
}

View File

@ -17,7 +17,6 @@
*/
package com.cloud.api.commands;
import java.util.ArrayList;
import java.util.List;
import org.apache.log4j.Logger;
@ -30,7 +29,6 @@ import com.cloud.api.Parameter;
import com.cloud.api.ServerApiException;
import com.cloud.api.response.SuccessResponse;
import com.cloud.event.EventTypes;
import com.cloud.exception.InvalidParameterValueException;
import com.cloud.network.rules.LoadBalancer;
import com.cloud.user.Account;
import com.cloud.utils.StringUtils;
@ -48,10 +46,7 @@ public class RemoveFromLoadBalancerRuleCmd extends BaseAsyncCmd {
@Parameter(name=ApiConstants.ID, type=CommandType.LONG, required=true, description="The ID of the load balancer rule")
private Long id;
@Parameter(name=ApiConstants.VIRTUAL_MACHINE_ID, type=CommandType.LONG, description="the ID of the virtual machine that is being removed from the load balancer rule")
private Long virtualMachineId;
@Parameter(name=ApiConstants.VIRTUAL_MACHINE_IDS, type=CommandType.LIST, collectionType=CommandType.LONG, description="the list of IDs of the virtual machines that are being removed from the load balancer rule (i.e. virtualMachineIds=1,2,3)")
@Parameter(name=ApiConstants.VIRTUAL_MACHINE_IDS, type=CommandType.LIST, required = true, collectionType=CommandType.LONG, description="the list of IDs of the virtual machines that are being removed from the load balancer rule (i.e. virtualMachineIds=1,2,3)")
private List<Long> virtualMachineIds;
/////////////////////////////////////////////////////
@ -62,10 +57,6 @@ public class RemoveFromLoadBalancerRuleCmd extends BaseAsyncCmd {
return id;
}
public Long getVirtualMachineId() {
return virtualMachineId;
}
public List<Long> getVirtualMachineIds() {
return virtualMachineIds;
}
@ -95,28 +86,11 @@ public class RemoveFromLoadBalancerRuleCmd extends BaseAsyncCmd {
@Override
public String getEventDescription() {
List<Long> vmIds = getVirtualMachineIds();
if ((vmIds == null) || vmIds.isEmpty()) {
vmIds = new ArrayList<Long>();
vmIds.add(getVirtualMachineId());
}
return "removing instances from load balancer: " + getId() + " (ids: " + StringUtils.join(vmIds, ",") + ")";
return "removing instances from load balancer: " + getId() + " (ids: " + StringUtils.join(getVirtualMachineIds(), ",") + ")";
}
@Override
public void execute(){
if (virtualMachineIds == null && virtualMachineId == null) {
throw new InvalidParameterValueException("Must specify virtual machine id");
}
if (virtualMachineIds == null) {
virtualMachineIds = new ArrayList<Long>();
}
if (virtualMachineId != null) {
virtualMachineIds.add(virtualMachineId);
}
public void execute(){
boolean result = _lbService.removeFromLoadBalancer(id, virtualMachineIds);
if (result) {
SuccessResponse response = new SuccessResponse(getCommandName());

View File

@ -51,8 +51,8 @@ public class UpdateLoadBalancerRuleCmd extends BaseAsyncCmd {
@Parameter(name=ApiConstants.NAME, type=CommandType.STRING, description="the name of the load balancer rule")
private String loadBalancerName;
@Parameter(name=ApiConstants.PRIVATE_PORT, type=CommandType.STRING, description="the private port of the private ip address/virtual machine where the network traffic will be load balanced to")
private String privatePort;
// @Parameter(name=ApiConstants.PRIVATE_PORT, type=CommandType.STRING, description="the private port of the private ip address/virtual machine where the network traffic will be load balanced to")
// private String privatePort;
/////////////////////////////////////////////////////
/////////////////// Accessors ///////////////////////
@ -74,9 +74,9 @@ public class UpdateLoadBalancerRuleCmd extends BaseAsyncCmd {
return loadBalancerName;
}
public String getPrivatePort() {
return privatePort;
}
// public String getPrivatePort() {
// return privatePort;
// }
/////////////////////////////////////////////////////
/////////////// API Implementation///////////////////

View File

@ -0,0 +1,139 @@
package com.cloud.network.lb;
import java.util.List;
import com.cloud.network.rules.FirewallRule;
import com.cloud.network.rules.LoadBalancer;
import com.cloud.utils.net.Ip;
public class LoadBalancingRule implements FirewallRule, LoadBalancer{
private LoadBalancer lb;
private List<LbDestination> destinations;
public LoadBalancingRule(LoadBalancer lb, List<LbDestination> destinations) {
this.lb = lb;
this.destinations = destinations;
}
@Override
public long getId() {
return lb.getId();
}
@Override
public long getAccountId() {
return lb.getAccountId();
}
@Override
public long getDomainId() {
return lb.getDomainId();
}
@Override
public String getName() {
return lb.getName();
}
@Override
public String getDescription() {
return lb.getDescription();
}
public int getDefaultPortStart() {
return lb.getDefaultPortStart();
}
@Override
public int getDefaultPortEnd() {
return lb.getDefaultPortEnd();
}
@Override
public String getAlgorithm() {
return lb.getAlgorithm();
}
@Override
public String getXid() {
return lb.getXid();
}
@Override
public Ip getSourceIpAddress() {
return lb.getSourceIpAddress();
}
@Override
public int getSourcePortStart() {
return lb.getSourcePortStart();
}
@Override
public int getSourcePortEnd() {
return lb.getSourcePortEnd();
}
@Override
public String getProtocol() {
return null;
}
@Override
public Purpose getPurpose() {
return Purpose.LoadBalancing;
}
@Override
public State getState() {
return lb.getState();
}
@Override
public long getNetworkId() {
return lb.getNetworkId();
}
public LoadBalancer getLb() {
return lb;
}
public List<LbDestination> getDestinations() {
return destinations;
}
public interface Destination {
String getIpAddress();
int getDestinationPortStart();
int getDestinationPortEnd();
boolean isRevoked();
}
public static class LbDestination implements Destination {
private int portStart;
private int portEnd;
private String ip;
boolean revoked;
public LbDestination(int portStart, int portEnd, String ip, boolean revoked) {
this.portStart = portStart;
this.portEnd = portEnd;
this.ip = ip;
this.revoked = revoked;
}
public String getIpAddress() {
return ip;
}
public int getDestinationPortStart() {
return portStart;
}
public int getDestinationPortEnd() {
return portEnd;
}
public boolean isRevoked() {
return revoked;
}
}
}

View File

@ -46,7 +46,7 @@ public interface LoadBalancingRulesService {
boolean removeFromLoadBalancer(long lbRuleId, List<Long> vmIds);
boolean applyLoadBalancerConfig(long id) throws ResourceUnavailableException;
boolean applyLoadBalancerConfig(long lbRuleId) throws ResourceUnavailableException;
/**
* List instances that have either been applied to a load balancer or are eligible to be assigned to a load balancer.
* @param cmd

View File

@ -17,13 +17,13 @@
*/
package com.cloud.network.rules;
import java.util.List;
/**
* Definition for a LoadBalancer
*/
public interface LoadBalancer extends FirewallRule {
String getName();
String getDescription();
@ -34,13 +34,4 @@ public interface LoadBalancer extends FirewallRule {
String getAlgorithm();
List<? extends Destination> getDestinations();
public interface Destination {
String getIpAddress();
int getDestinationPortStart();
int getDestinationPortEnd();
boolean getRevoked();
boolean getAlreadyAdded();
}
}

View File

@ -115,11 +115,11 @@ listIpForwardingRules=com.cloud.api.commands.ListIpForwardingRulesCmd;15
#### load balancer commands
createLoadBalancerRule=com.cloud.api.commands.CreateLoadBalancerRuleCmd;15
deleteLoadBalancerRule=com.cloud.api.commands.DeleteLoadBalancerRuleCmd;15
updateLoadBalancerRule=com.cloud.api.commands.UpdateLoadBalancerRuleCmd;15
removeFromLoadBalancerRule=com.cloud.api.commands.RemoveFromLoadBalancerRuleCmd;15
assignToLoadBalancerRule=com.cloud.api.commands.AssignToLoadBalancerRuleCmd;15
listLoadBalancerRules=com.cloud.api.commands.ListLoadBalancerRulesCmd;15
listLoadBalancerRuleInstances=com.cloud.api.commands.ListLoadBalancerRuleInstancesCmd;15
updateLoadBalancerRule=com.cloud.api.commands.UpdateLoadBalancerRuleCmd;15
#### router commands
startRouter=com.cloud.api.commands.StartRouterCmd;3

View File

@ -39,8 +39,8 @@ public class LoadBalancerVMMapVO {
@Column(name="instance_id")
private long instanceId;
@Column(name="pending")
private boolean pending = false;
@Column(name="revoke")
private boolean revoke = false;
public LoadBalancerVMMapVO() { }
@ -49,10 +49,10 @@ public class LoadBalancerVMMapVO {
this.instanceId = instanceId;
}
public LoadBalancerVMMapVO(long loadBalancerId, long instanceId, boolean pending) {
public LoadBalancerVMMapVO(long loadBalancerId, long instanceId, boolean revoke) {
this.loadBalancerId = loadBalancerId;
this.instanceId = instanceId;
this.pending = pending;
this.revoke = revoke;
}
public long getId() {
@ -67,11 +67,11 @@ public class LoadBalancerVMMapVO {
return instanceId;
}
public boolean isPending() {
return pending;
public boolean isRevoke() {
return revoke;
}
public void setPending(boolean pending) {
this.pending = pending;
public void setRevoke(boolean revoke) {
this.revoke = revoke;
}
}

View File

@ -18,8 +18,6 @@
package com.cloud.network;
import java.util.List;
import javax.persistence.Column;
import javax.persistence.DiscriminatorValue;
import javax.persistence.Entity;
@ -89,9 +87,15 @@ public class LoadBalancerVO extends FirewallRuleVO implements LoadBalancer {
return defaultPortEnd;
}
@Override
public List<? extends Destination> getDestinations() {
// TODO Auto-generated method stub
return null;
}
public void setName(String name) {
this.name = name;
}
public void setAlgorithm(String algorithm) {
this.algorithm = algorithm;
}
public void setDescription(String description) {
this.description = description;
}
}

View File

@ -27,6 +27,7 @@ import javax.ejb.Local;
import org.apache.log4j.Logger;
import com.cloud.domain.DomainVO;
import com.cloud.network.LoadBalancerVO;
import com.cloud.utils.db.GenericDaoBase;
import com.cloud.utils.db.SearchBuilder;

View File

@ -28,5 +28,7 @@ public interface LoadBalancerVMMapDao extends GenericDao<LoadBalancerVMMapVO, Lo
void remove(long loadBalancerId, List<Long> instanceIds, Boolean pending);
List<LoadBalancerVMMapVO> listByInstanceId(long instanceId);
List<LoadBalancerVMMapVO> listByLoadBalancerId(long loadBalancerId);
List<LoadBalancerVMMapVO> listByLoadBalancerId(long loadBalancerId, boolean pending);
List<LoadBalancerVMMapVO> listByLoadBalancerId(long loadBalancerId, boolean revoke);
LoadBalancerVMMapVO findByLoadBalancerIdAndVmId(long loadBalancerId, long instanceId);
}

View File

@ -38,12 +38,12 @@ public class LoadBalancerVMMapDaoImpl extends GenericDaoBase<LoadBalancerVMMapVO
}
@Override
public void remove(long loadBalancerId, List<Long> instanceIds, Boolean pending) {
public void remove(long loadBalancerId, List<Long> instanceIds, Boolean revoke) {
SearchCriteria<LoadBalancerVMMapVO> sc = createSearchCriteria();
sc.addAnd("loadBalancerId", SearchCriteria.Op.EQ, loadBalancerId);
sc.addAnd("instanceId", SearchCriteria.Op.IN, instanceIds.toArray());
if (pending != null) {
sc.addAnd("pending", SearchCriteria.Op.EQ, pending);
if (revoke != null) {
sc.addAnd("revoke", SearchCriteria.Op.EQ, revoke);
}
expunge(sc);
@ -69,8 +69,18 @@ public class LoadBalancerVMMapDaoImpl extends GenericDaoBase<LoadBalancerVMMapVO
public List<LoadBalancerVMMapVO> listByLoadBalancerId(long loadBalancerId, boolean pending) {
SearchCriteria<LoadBalancerVMMapVO> sc = createSearchCriteria();
sc.addAnd("loadBalancerId", SearchCriteria.Op.EQ, loadBalancerId);
sc.addAnd("pending", SearchCriteria.Op.EQ, pending);
sc.addAnd("revoke", SearchCriteria.Op.EQ, pending);
return listBy(sc);
}
@Override
public LoadBalancerVMMapVO findByLoadBalancerIdAndVmId(long loadBalancerId, long instanceId) {
SearchCriteria<LoadBalancerVMMapVO> sc = createSearchCriteria();
sc.addAnd("loadBalancerId", SearchCriteria.Op.EQ, loadBalancerId);
sc.addAnd("instanceId", SearchCriteria.Op.EQ, instanceId);
return findOneBy(sc);
}
}

View File

@ -33,7 +33,6 @@ import com.cloud.api.commands.ListLoadBalancerRuleInstancesCmd;
import com.cloud.api.commands.ListLoadBalancerRulesCmd;
import com.cloud.api.commands.UpdateLoadBalancerRuleCmd;
import com.cloud.dc.dao.VlanDao;
import com.cloud.domain.DomainVO;
import com.cloud.domain.dao.DomainDao;
import com.cloud.event.EventTypes;
import com.cloud.event.EventVO;
@ -50,7 +49,9 @@ import com.cloud.network.dao.FirewallRulesDao;
import com.cloud.network.dao.IPAddressDao;
import com.cloud.network.dao.LoadBalancerDao;
import com.cloud.network.dao.LoadBalancerVMMapDao;
import com.cloud.network.lb.LoadBalancingRule.LbDestination;
import com.cloud.network.rules.FirewallRule;
import com.cloud.network.rules.FirewallRule.Purpose;
import com.cloud.network.rules.FirewallRuleVO;
import com.cloud.network.rules.LoadBalancer;
import com.cloud.network.rules.RulesManager;
@ -73,6 +74,7 @@ import com.cloud.utils.net.NetUtils;
import com.cloud.vm.Nic;
import com.cloud.vm.State;
import com.cloud.vm.UserVmVO;
import com.cloud.vm.dao.NicDao;
import com.cloud.vm.dao.UserVmDao;
@Local(value = { LoadBalancingRulesManager.class, LoadBalancingRulesService.class })
@ -102,6 +104,7 @@ public class LoadBalancingRulesManagerImpl implements LoadBalancingRulesManager,
@Inject UserVmDao _vmDao;
@Inject AccountDao _accountDao;
@Inject DomainDao _domainDao;
@Inject NicDao _nicDao;
@Override @DB
public boolean assignToLoadBalancer(long loadBalancerId, List<Long> instanceIds) {
@ -161,12 +164,22 @@ public class LoadBalancingRulesManagerImpl implements LoadBalancingRulesManager,
Transaction txn = Transaction.currentTxn();
txn.start();
for (UserVm vm : vmsToAdd) {
LoadBalancerVMMapVO map = new LoadBalancerVMMapVO(loadBalancer.getId(), vm.getId(), true);
LoadBalancerVMMapVO map = new LoadBalancerVMMapVO(loadBalancer.getId(), vm.getId(), false);
map = _lb2VmMapDao.persist(map);
}
txn.commit();
try {
loadBalancer.setState(FirewallRule.State.Add);
_lbDao.persist(loadBalancer);
applyLoadBalancerConfig(loadBalancerId);
} catch (ResourceUnavailableException e) {
s_logger.warn("Unable to apply the load balancer config because resource is unavaliable.", e);
return false;
}
return true;
}
@ -181,8 +194,26 @@ public class LoadBalancingRulesManagerImpl implements LoadBalancingRulesManager,
}
_accountMgr.checkAccess(caller.getAccount(), loadBalancer);
_lb2VmMapDao.remove(loadBalancerId, instanceIds, null);
try {
loadBalancer.setState(FirewallRule.State.Add);
_lbDao.persist(loadBalancer);
for (long instanceId : instanceIds) {
LoadBalancerVMMapVO map = _lb2VmMapDao.findByLoadBalancerIdAndVmId(loadBalancerId, instanceId);
map.setRevoke(true);
_lb2VmMapDao.persist(map);
s_logger.debug("Set load balancer rule for revoke: rule id " + loadBalancerId + ", vmId " + instanceId);
}
applyLoadBalancerConfig(loadBalancerId);
_lb2VmMapDao.remove(loadBalancerId, instanceIds, null);
s_logger.debug("Load balancer rule id " + loadBalancerId + " is removed for vms " + instanceIds);
} catch (ResourceUnavailableException e) {
s_logger.warn("Unable to apply the load balancer config because resource is unavaliable.", e);
return false;
}
return true;
}
@ -198,6 +229,7 @@ public class LoadBalancingRulesManagerImpl implements LoadBalancingRulesManager,
_accountMgr.checkAccess(caller.getAccount(), lb);
lb.setState(FirewallRule.State.Revoke);
_lbDao.persist(lb);
if (apply) {
try {
@ -207,6 +239,9 @@ public class LoadBalancingRulesManagerImpl implements LoadBalancingRulesManager,
return false;
}
}
_rulesDao.remove(lb.getId());
s_logger.debug("Load balancer with id " + lb.getId() + " is removed successfully");
return true;
}
@ -265,7 +300,7 @@ public class LoadBalancingRulesManagerImpl implements LoadBalancingRulesManager,
if (!_rulesDao.setStateToAdd(newRule)) {
throw new CloudRuntimeException("Unable to update the state to add for " + newRule);
}
s_logger.debug("Load balancer " + newRule.getId() + " for Ip address " + srcIp + ", public port " + srcPortStart + ", private port " + defPortStart+ " is added successfully.");
success = true;
return newRule;
} catch (Exception e) {
@ -273,7 +308,6 @@ public class LoadBalancingRulesManagerImpl implements LoadBalancingRulesManager,
if (e instanceof NetworkRuleConflictException) {
throw (NetworkRuleConflictException) e;
}
throw new CloudRuntimeException("Unable to add rule for " + newRule.getSourceIpAddress(), e);
} finally {
long userId = caller.getUserId();
@ -300,13 +334,61 @@ public class LoadBalancingRulesManagerImpl implements LoadBalancingRulesManager,
@Override
public boolean applyLoadBalancerConfig(long lbRuleId) throws ResourceUnavailableException {
return false;
List<LoadBalancingRule> rules = new ArrayList<LoadBalancingRule>();
LoadBalancerVO lb = _lbDao.findById(lbRuleId);
List<LbDestination> dstList = getExistingDestinations(lb.getId());
if (dstList != null && !dstList.isEmpty()) {
LoadBalancingRule loadBalancing = new LoadBalancingRule(lb, dstList);
rules.add(loadBalancing);
if (!_networkMgr.applyRules(lb.getSourceIpAddress(), rules, false)) {
s_logger.debug("LB rules are not completely applied");
return false;
}
if (lb.getState() == FirewallRule.State.Revoke) {
_lbDao.remove(lb.getId());
s_logger.debug("LB " + lb.getId() + " is successfully removed");
} else if (lb.getState() == FirewallRule.State.Add) {
lb.setState(FirewallRule.State.Active);
s_logger.debug("LB rule " + lbRuleId + " state is set to Active");
_lbDao.persist(lb);
}
}
return true;
}
@Override
public boolean removeAllLoadBalanacers(Ip ip) {
// TODO Auto-generated method stub
return false;
public boolean removeAllLoadBalanacers(Ip ip) {
List<FirewallRuleVO> rules = _rulesDao.listByIpAndNotRevoked(ip);
for (FirewallRule rule : rules) {
if (rule.getPurpose() == Purpose.LoadBalancing) {
boolean result = deleteLoadBalancerRule(rule.getId(), true);
if (result == false) {
s_logger.warn("Unable to remove load balancer rule " + rule.getId());
return false;
}
}
}
return true;
}
private List<LbDestination> getExistingDestinations(long lbId) {
List<LbDestination> dstList = new ArrayList<LbDestination>();
List<LoadBalancerVMMapVO> lbVmMaps = _lb2VmMapDao.listByLoadBalancerId(lbId);
LoadBalancerVO lb = _lbDao.findById(lbId);
String dstIp = null;
for (LoadBalancerVMMapVO lbVmMap : lbVmMaps) {
UserVm vm = _vmDao.findById(lbVmMap.getInstanceId());
Nic nic = _nicDao.findByInstanceIdAndNetworkId(lb.getNetworkId(), vm.getId());
dstIp = nic.getIp4Address();
LbDestination lbDst = new LbDestination(lb.getDefaultPortStart(), lb.getDefaultPortEnd(), dstIp, lbVmMap.isRevoke());
dstList.add(lbDst);
}
return dstList;
}
@Override
@ -332,8 +414,39 @@ public class LoadBalancingRulesManagerImpl implements LoadBalancingRulesManager,
@Override
public LoadBalancer updateLoadBalancerRule(UpdateLoadBalancerRuleCmd cmd) {
// TODO Auto-generated method stub
return null;
Long lbRuleId = cmd.getId();
String name = cmd.getLoadBalancerName();
String description = cmd.getDescription();
String algorithm = cmd.getAlgorithm();
LoadBalancerVO lb = _lbDao.findById(lbRuleId);
if (name != null) {
lb.setName(name);
}
if (description != null) {
lb.setDescription(description);
}
if (algorithm != null) {
lb.setAlgorithm(algorithm);
}
_lbDao.update(lbRuleId, lb);
//If algorithm is changed, have to reapply the lb config
if (algorithm != null) {
try {
lb.setState(FirewallRule.State.Add);
_lbDao.persist(lb);
applyLoadBalancerConfig(lbRuleId);
} catch (ResourceUnavailableException e) {
s_logger.warn("Unable to apply the load balancer config because resource is unavaliable.", e);
}
}
return lb;
}
// @Override @DB

View File

@ -16,4 +16,5 @@ public interface NicDao extends GenericDao<NicVO, Long> {
List<NicVO> listByNetworkId(long networkId);
List<Long> listNetworksWithNoActiveNics();
NicVO findByInstanceIdAndNetworkId(long networkId, long instanceId);
}

View File

@ -7,6 +7,7 @@ import java.util.List;
import javax.ejb.Local;
import com.cloud.domain.DomainVO;
import com.cloud.utils.db.GenericDaoBase;
import com.cloud.utils.db.GenericSearchBuilder;
import com.cloud.utils.db.SearchBuilder;
@ -73,4 +74,11 @@ public class NicDaoImpl extends GenericDaoBase<NicVO, Long> implements NicDao {
return customSearch(sc, null);
}
public NicVO findByInstanceIdAndNetworkId(long networkId, long instanceId) {
SearchCriteria<NicVO> sc = createSearchCriteria();
sc.addAnd("networkId", SearchCriteria.Op.EQ, networkId);
sc.addAnd("instanceId", SearchCriteria.Op.EQ, instanceId);
return findOneBy(sc);
}
}

View File

@ -482,7 +482,7 @@ CREATE TABLE `cloud`.`load_balancer_vm_map` (
`id` bigint unsigned NOT NULL auto_increment,
`load_balancer_id` bigint unsigned NOT NULL,
`instance_id` bigint unsigned NOT NULL,
`pending` tinyint(1) unsigned NOT NULL DEFAULT 0 COMMENT 'whether the vm is being applied to the load balancer (pending=1) or has already been applied (pending=0)',
`revoke` tinyint(1) unsigned NOT NULL DEFAULT 0 COMMENT '1 when vm is set for revoke from load balancer',
PRIMARY KEY (`id`),
UNIQUE KEY (`load_balancer_id`, `instance_id`),
CONSTRAINT `fk_load_balancer_vm_map__load_balancer_id` FOREIGN KEY(`load_balancer_id`) REFERENCES `load_balancing_rules`(`id`) ON DELETE CASCADE,