CLOUDSTACK-6327: Updated the removeFromLoadBalancerRule and listLoadBalancerRuleInstances API
Updated these APIs to use VM primary/secondary details on LB rule. listLoadBalancerRuleInstances API lists the vm ips which are assigned to lb rule when passed listlbvmips removeFromLoadBalancerRule is updated to remove the spcific vm ip entry assinged to LB rule. Added new param vmidipmap to this API Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/b94a9826 Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/b94a9826 Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/b94a9826 Branch: refs/heads/marvin Commit: b94a982618c67ce02930456af5bc37bd7260ed42 Parents: 60c58c5 Author: Jayapal <[email protected]> Authored: Fri Apr 4 18:41:58 2014 +0530 Committer: Jayapal <[email protected]> Committed: Fri Apr 4 18:42:03 2014 +0530 ---------------------------------------------------------------------- .../network/lb/LoadBalancingRulesService.java | 4 +- .../org/apache/cloudstack/api/ApiConstants.java | 1 + ...ListLoadBalancerRuleInstancesCmdByAdmin.java | 54 +++++++-- .../ListLoadBalancerRuleInstancesCmd.java | 66 +++++++++-- .../RemoveFromLoadBalancerRuleCmd.java | 63 ++++++++-- .../response/LoadBalancerRuleVmMapResponse.java | 54 +++++++++ .../cloud/network/dao/LoadBalancerVMMapDao.java | 6 + .../network/dao/LoadBalancerVMMapDaoImpl.java | 35 ++++++ .../cloud/network/as/AutoScaleManagerImpl.java | 2 +- .../lb/LoadBalancingRulesManagerImpl.java | 114 +++++++++++++++---- 10 files changed, 346 insertions(+), 53 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/cloudstack/blob/b94a9826/api/src/com/cloud/network/lb/LoadBalancingRulesService.java ---------------------------------------------------------------------- diff --git a/api/src/com/cloud/network/lb/LoadBalancingRulesService.java b/api/src/com/cloud/network/lb/LoadBalancingRulesService.java index 6643de6..98d29c5 100644 --- a/api/src/com/cloud/network/lb/LoadBalancingRulesService.java +++ b/api/src/com/cloud/network/lb/LoadBalancingRulesService.java @@ -98,7 +98,7 @@ public interface LoadBalancingRulesService { boolean assignSSLCertToLoadBalancerRule(Long lbRuleId, String certName, String publicCert, String privateKey); - boolean removeFromLoadBalancer(long lbRuleId, List<Long> vmIds); + boolean removeFromLoadBalancer(long lbRuleId, List<Long> vmIds, Map<Long, List<String>> vmIdIpMap); boolean applyLoadBalancerConfig(long lbRuleId) throws ResourceUnavailableException; @@ -153,4 +153,6 @@ public interface LoadBalancingRulesService { Map<Ip, UserVm> getLbInstances(long lbId); boolean isLbRuleMappedToVmGuestIp(String vmSecondaryIp); + + List<String> listLbVmIpAddress(long id, long vmId); } http://git-wip-us.apache.org/repos/asf/cloudstack/blob/b94a9826/api/src/org/apache/cloudstack/api/ApiConstants.java ---------------------------------------------------------------------- diff --git a/api/src/org/apache/cloudstack/api/ApiConstants.java b/api/src/org/apache/cloudstack/api/ApiConstants.java index fdb4558..c7d6da1 100755 --- a/api/src/org/apache/cloudstack/api/ApiConstants.java +++ b/api/src/org/apache/cloudstack/api/ApiConstants.java @@ -26,6 +26,7 @@ public class ApiConstants { public static final String API_KEY = "apikey"; public static final String USER_API_KEY = "userapikey"; public static final String APPLIED = "applied"; + public static final String LIST_LB_VMIPS = "lbvmips"; public static final String AVAILABLE = "available"; public static final String BITS = "bits"; public static final String BOOTABLE = "bootable"; http://git-wip-us.apache.org/repos/asf/cloudstack/blob/b94a9826/api/src/org/apache/cloudstack/api/command/admin/loadbalancer/ListLoadBalancerRuleInstancesCmdByAdmin.java ---------------------------------------------------------------------- diff --git a/api/src/org/apache/cloudstack/api/command/admin/loadbalancer/ListLoadBalancerRuleInstancesCmdByAdmin.java b/api/src/org/apache/cloudstack/api/command/admin/loadbalancer/ListLoadBalancerRuleInstancesCmdByAdmin.java index 26202b9..0e8c377 100644 --- a/api/src/org/apache/cloudstack/api/command/admin/loadbalancer/ListLoadBalancerRuleInstancesCmdByAdmin.java +++ b/api/src/org/apache/cloudstack/api/command/admin/loadbalancer/ListLoadBalancerRuleInstancesCmdByAdmin.java @@ -19,6 +19,7 @@ package org.apache.cloudstack.api.command.admin.loadbalancer; import java.util.ArrayList; import java.util.List; +import org.apache.cloudstack.api.response.LoadBalancerRuleVmMapResponse; import org.apache.log4j.Logger; import org.apache.cloudstack.api.APICommand; @@ -30,7 +31,7 @@ import org.apache.cloudstack.api.response.UserVmResponse; import com.cloud.uservm.UserVm; import com.cloud.utils.Pair; -@APICommand(name = "listLoadBalancerRuleInstances", description = "List all virtual machine instances that are assigned to a load balancer rule.", responseObject = UserVmResponse.class, responseView = ResponseView.Full) +@APICommand(name = "listLoadBalancerRuleInstances", description = "List all virtual machine instances that are assigned to a load balancer rule.", responseObject = LoadBalancerRuleVmMapResponse.class, responseView = ResponseView.Full) public class ListLoadBalancerRuleInstancesCmdByAdmin extends ListLoadBalancerRuleInstancesCmd { public static final Logger s_logger = Logger.getLogger (ListLoadBalancerRuleInstancesCmdByAdmin.class.getName()); @@ -41,17 +42,48 @@ public class ListLoadBalancerRuleInstancesCmdByAdmin extends ListLoadBalancerRul Pair<List<? extends UserVm>, List<String>> vmServiceMap = _lbService.listLoadBalancerInstances(this); List<? extends UserVm> result = vmServiceMap.first(); List<String> serviceStates = vmServiceMap.second(); - ListResponse<UserVmResponse> response = new ListResponse<UserVmResponse>(); - List<UserVmResponse> vmResponses = new ArrayList<UserVmResponse>(); - if (result != null) { - vmResponses = _responseGenerator.createUserVmResponse(ResponseView.Full, "loadbalancerruleinstance", result.toArray(new UserVm[result.size()])); - } - for (int i=0;i<result.size(); i++) { - vmResponses.get(i).setServiceState(serviceStates.get(i)); + + if (!isListLbVmip()) { + // list lb instances + ListResponse<UserVmResponse> response = new ListResponse<UserVmResponse>(); + List<UserVmResponse> vmResponses = new ArrayList<UserVmResponse>(); + if (result != null) { + vmResponses = _responseGenerator.createUserVmResponse(ResponseView.Restricted, "loadbalancerruleinstance", result.toArray(new UserVm[result.size()])); + + + for (int i = 0; i < result.size(); i++) { + vmResponses.get(i).setServiceState(serviceStates.get(i)); + } + } + response.setResponses(vmResponses); + response.setResponseName(getCommandName()); + setResponseObject(response); + + } else { + ListResponse<LoadBalancerRuleVmMapResponse> lbRes = new ListResponse<LoadBalancerRuleVmMapResponse>(); + + List<UserVmResponse> vmResponses = new ArrayList<UserVmResponse>(); + List<LoadBalancerRuleVmMapResponse> listlbVmRes = new ArrayList<LoadBalancerRuleVmMapResponse>(); + + if (result != null) { + vmResponses = _responseGenerator.createUserVmResponse(ResponseView.Full, "loadbalancerruleinstance", result.toArray(new UserVm[result.size()])); + + List<String> ipaddr = null; + + for (int i=0;i<result.size(); i++) { + LoadBalancerRuleVmMapResponse lbRuleVmIpResponse = new LoadBalancerRuleVmMapResponse(); + vmResponses.get(i).setServiceState(serviceStates.get(i)); + lbRuleVmIpResponse.setUserVmResponse(vmResponses.get(i)); + lbRuleVmIpResponse.setIpAddr(_lbService.listLbVmIpAddress(getId(), result.get(i).getId())); + lbRuleVmIpResponse.setObjectName("lbrulevmidip"); + listlbVmRes.add(lbRuleVmIpResponse); + } + } + + lbRes.setResponseName(getCommandName()); + lbRes.setResponses(listlbVmRes); + setResponseObject(lbRes); } - response.setResponses(vmResponses); - response.setResponseName(getCommandName()); - setResponseObject(response); } } http://git-wip-us.apache.org/repos/asf/cloudstack/blob/b94a9826/api/src/org/apache/cloudstack/api/command/user/loadbalancer/ListLoadBalancerRuleInstancesCmd.java ---------------------------------------------------------------------- diff --git a/api/src/org/apache/cloudstack/api/command/user/loadbalancer/ListLoadBalancerRuleInstancesCmd.java b/api/src/org/apache/cloudstack/api/command/user/loadbalancer/ListLoadBalancerRuleInstancesCmd.java index 2d458a7..cc4203c 100644 --- a/api/src/org/apache/cloudstack/api/command/user/loadbalancer/ListLoadBalancerRuleInstancesCmd.java +++ b/api/src/org/apache/cloudstack/api/command/user/loadbalancer/ListLoadBalancerRuleInstancesCmd.java @@ -19,6 +19,7 @@ package org.apache.cloudstack.api.command.user.loadbalancer; import java.util.ArrayList; import java.util.List; +import org.apache.cloudstack.api.response.LoadBalancerRuleVmMapResponse; import org.apache.log4j.Logger; import org.apache.cloudstack.api.APICommand; @@ -33,7 +34,7 @@ import org.apache.cloudstack.api.response.UserVmResponse; import com.cloud.uservm.UserVm; import com.cloud.utils.Pair; -@APICommand(name = "listLoadBalancerRuleInstances", description = "List all virtual machine instances that are assigned to a load balancer rule.", responseObject = UserVmResponse.class, responseView = ResponseView.Restricted, +@APICommand(name = "listLoadBalancerRuleInstances", description = "List all virtual machine instances that are assigned to a load balancer rule.", responseObject = LoadBalancerRuleVmMapResponse.class, responseView = ResponseView.Restricted, requestHasSensitiveInfo = false, responseHasSensitiveInfo = true) public class ListLoadBalancerRuleInstancesCmd extends BaseListCmd { @@ -57,6 +58,13 @@ public class ListLoadBalancerRuleInstancesCmd extends BaseListCmd { description = "the ID of the load balancer rule") private Long id; + + @Parameter(name = ApiConstants.LIST_LB_VMIPS, + type = CommandType.BOOLEAN, + description = "true if lb rule vm ip information to be included; default is false") + private boolean isListLbVmip; + + ///////////////////////////////////////////////////// /////////////////// Accessors /////////////////////// ///////////////////////////////////////////////////// @@ -69,6 +77,10 @@ public class ListLoadBalancerRuleInstancesCmd extends BaseListCmd { return id; } + public boolean isListLbVmip() { + return isListLbVmip; + } + ///////////////////////////////////////////////////// /////////////// API Implementation/////////////////// ///////////////////////////////////////////////////// @@ -83,17 +95,49 @@ public class ListLoadBalancerRuleInstancesCmd extends BaseListCmd { Pair<List<? extends UserVm>, List<String>> vmServiceMap = _lbService.listLoadBalancerInstances(this); List<? extends UserVm> result = vmServiceMap.first(); List<String> serviceStates = vmServiceMap.second(); - ListResponse<UserVmResponse> response = new ListResponse<UserVmResponse>(); - List<UserVmResponse> vmResponses = new ArrayList<UserVmResponse>(); - if (result != null) { - vmResponses = _responseGenerator.createUserVmResponse(ResponseView.Restricted, "loadbalancerruleinstance", result.toArray(new UserVm[result.size()])); - } - for (int i = 0; i < result.size(); i++) { - vmResponses.get(i).setServiceState(serviceStates.get(i)); + if (!isListLbVmip()) { + // list lb instances + ListResponse<UserVmResponse> response = new ListResponse<UserVmResponse>(); + List<UserVmResponse> vmResponses = new ArrayList<UserVmResponse>(); + if (result != null) { + vmResponses = _responseGenerator.createUserVmResponse(ResponseView.Restricted, "loadbalancerruleinstance", result.toArray(new UserVm[result.size()])); + + + for (int i = 0; i < result.size(); i++) { + vmResponses.get(i).setServiceState(serviceStates.get(i)); + } + } + response.setResponses(vmResponses); + response.setResponseName(getCommandName()); + setResponseObject(response); + + + } else { + ListResponse<LoadBalancerRuleVmMapResponse> lbRes = new ListResponse<LoadBalancerRuleVmMapResponse>(); + + List<UserVmResponse> vmResponses = new ArrayList<UserVmResponse>(); + List<LoadBalancerRuleVmMapResponse> listlbVmRes = new ArrayList<LoadBalancerRuleVmMapResponse>(); + + if (result != null) { + vmResponses = _responseGenerator.createUserVmResponse(ResponseView.Full, "loadbalancerruleinstance", result.toArray(new UserVm[result.size()])); + + + List<String> ipaddr = null; + + for (int i=0;i<result.size(); i++) { + LoadBalancerRuleVmMapResponse lbRuleVmIpResponse = new LoadBalancerRuleVmMapResponse(); + vmResponses.get(i).setServiceState(serviceStates.get(i)); + lbRuleVmIpResponse.setUserVmResponse(vmResponses.get(i)); + lbRuleVmIpResponse.setIpAddr(_lbService.listLbVmIpAddress(getId(), result.get(i).getId())); + lbRuleVmIpResponse.setObjectName("lbrulevmidip"); + listlbVmRes.add(lbRuleVmIpResponse); + } + } + + lbRes.setResponseName(getCommandName()); + lbRes.setResponses(listlbVmRes); + setResponseObject(lbRes); } - response.setResponses(vmResponses); - response.setResponseName(getCommandName()); - setResponseObject(response); } } http://git-wip-us.apache.org/repos/asf/cloudstack/blob/b94a9826/api/src/org/apache/cloudstack/api/command/user/loadbalancer/RemoveFromLoadBalancerRuleCmd.java ---------------------------------------------------------------------- diff --git a/api/src/org/apache/cloudstack/api/command/user/loadbalancer/RemoveFromLoadBalancerRuleCmd.java b/api/src/org/apache/cloudstack/api/command/user/loadbalancer/RemoveFromLoadBalancerRuleCmd.java index 8714d34..b3eb159 100644 --- a/api/src/org/apache/cloudstack/api/command/user/loadbalancer/RemoveFromLoadBalancerRuleCmd.java +++ b/api/src/org/apache/cloudstack/api/command/user/loadbalancer/RemoveFromLoadBalancerRuleCmd.java @@ -17,6 +17,11 @@ package org.apache.cloudstack.api.command.user.loadbalancer; import java.util.List; +import java.util.HashMap; +import java.util.Map; +import java.util.Collection; +import java.util.Iterator; +import java.util.ArrayList; import org.apache.log4j.Logger; @@ -60,12 +65,17 @@ public class RemoveFromLoadBalancerRuleCmd extends BaseAsyncCmd { @Parameter(name = ApiConstants.VIRTUAL_MACHINE_IDS, type = CommandType.LIST, - required = true, collectionType = CommandType.UUID, entityType = UserVmResponse.class, 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; + @Parameter(name = ApiConstants.VIRTUAL_MACHINE_ID_IP, + type = CommandType.MAP, + description = "VM ID and IP map, vmidipmap[0].vmid=1 vmidipmap[0].ip=10.1.1.75", + since = "4.4") + private Map vmIdIpMap; + ///////////////////////////////////////////////////// /////////////////// Accessors /////////////////////// ///////////////////////////////////////////////////// @@ -78,6 +88,10 @@ public class RemoveFromLoadBalancerRuleCmd extends BaseAsyncCmd { return virtualMachineIds; } + public Map<Long, String> getVmIdIpMap() { + return vmIdIpMap; + } + ///////////////////////////////////////////////////// /////////////// API Implementation/////////////////// ///////////////////////////////////////////////////// @@ -101,20 +115,53 @@ public class RemoveFromLoadBalancerRuleCmd extends BaseAsyncCmd { return EventTypes.EVENT_REMOVE_FROM_LOAD_BALANCER_RULE; } + + public Map<Long, List<String>> getVmIdIpListMap() { + Map<Long, List<String>> vmIdIpsMap = new HashMap<Long, List<String>>(); + if (vmIdIpMap != null && !vmIdIpMap.isEmpty()) { + Collection idIpsCollection = vmIdIpMap.values(); + Iterator iter = idIpsCollection.iterator(); + while (iter.hasNext()) { + HashMap<String, String> idIpsMap = (HashMap<String, String>)iter.next(); + String vmId = idIpsMap.get("vmid"); + String vmIp = idIpsMap.get("vmip"); + + Long longVmId = new Long(vmId); + + List<String> ipsList = null; + if (vmIdIpsMap.containsKey(longVmId)) { + ipsList = vmIdIpsMap.get(longVmId); + } else { + ipsList = new ArrayList<String>(); + } + ipsList.add(vmIp); + vmIdIpsMap.put(longVmId, ipsList); + + } + } + + return vmIdIpsMap; + } + @Override public String getEventDescription() { return "removing instances from load balancer: " + getId() + " (ids: " + StringUtils.join(getVirtualMachineIds(), ",") + ")"; } @Override - public void execute() { + public void execute() { CallContext.current().setEventDetails("Load balancer Id: " + getId() + " VmIds: " + StringUtils.join(getVirtualMachineIds(), ",")); - boolean result = _lbService.removeFromLoadBalancer(id, virtualMachineIds); - if (result) { - SuccessResponse response = new SuccessResponse(getCommandName()); - this.setResponseObject(response); - } else { - throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Failed to remove instance from load balancer rule"); + Map<Long, List<String>> vmIdIpsMap = getVmIdIpListMap(); + try { + boolean result = _lbService.removeFromLoadBalancer(id, virtualMachineIds, vmIdIpsMap); + if (result) { + SuccessResponse response = new SuccessResponse(getCommandName()); + this.setResponseObject(response); + } else { + throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Failed to remove instance from load balancer rule"); + } + }catch (InvalidParameterValueException ex) { + throw new ServerApiException(ApiErrorCode.PARAM_ERROR, "Failed to remove instance from load balancer rule"); } } http://git-wip-us.apache.org/repos/asf/cloudstack/blob/b94a9826/api/src/org/apache/cloudstack/api/response/LoadBalancerRuleVmMapResponse.java ---------------------------------------------------------------------- diff --git a/api/src/org/apache/cloudstack/api/response/LoadBalancerRuleVmMapResponse.java b/api/src/org/apache/cloudstack/api/response/LoadBalancerRuleVmMapResponse.java new file mode 100644 index 0000000..57c45e6 --- /dev/null +++ b/api/src/org/apache/cloudstack/api/response/LoadBalancerRuleVmMapResponse.java @@ -0,0 +1,54 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. +package org.apache.cloudstack.api.response; + +import com.cloud.network.router.VirtualRouter; +import com.cloud.uservm.UserVm; +import com.cloud.vm.VirtualMachine; +import com.google.gson.annotations.SerializedName; + +import org.apache.cloudstack.api.BaseResponse; +import org.apache.cloudstack.api.EntityReference; + +import com.cloud.serializer.Param; + +import java.util.List; + +@EntityReference(value = {VirtualMachine.class, UserVm.class, VirtualRouter.class}) +@SuppressWarnings("unused") +public class LoadBalancerRuleVmMapResponse extends BaseResponse { + + + @SerializedName("loadbalancerruleinstance") + @Param(description = "the user vm set for lb rule") + private UserVmResponse UserVmResponse; + + @SerializedName("lbvmipaddresses") + @Param(description = "IP addresses of the vm set of lb rule") + private List<String> ipAddr; + + public void setIpAddr(List<String> ipAddr) { + this.ipAddr = ipAddr; + } + + public void setUserVmResponse(UserVmResponse userVmResponse) { + this.UserVmResponse = userVmResponse; + } + + + +} http://git-wip-us.apache.org/repos/asf/cloudstack/blob/b94a9826/engine/schema/src/com/cloud/network/dao/LoadBalancerVMMapDao.java ---------------------------------------------------------------------- diff --git a/engine/schema/src/com/cloud/network/dao/LoadBalancerVMMapDao.java b/engine/schema/src/com/cloud/network/dao/LoadBalancerVMMapDao.java index 51f45c2..a25534b 100644 --- a/engine/schema/src/com/cloud/network/dao/LoadBalancerVMMapDao.java +++ b/engine/schema/src/com/cloud/network/dao/LoadBalancerVMMapDao.java @@ -36,4 +36,10 @@ public interface LoadBalancerVMMapDao extends GenericDao<LoadBalancerVMMapVO, Lo boolean isVmAttachedToLoadBalancer(long loadBalancerId); List<LoadBalancerVMMapVO> listByInstanceIp(String instanceIp); + + List<LoadBalancerVMMapVO> listByLoadBalancerIdAndVmId(long loadBalancerId, long instanceId); + + LoadBalancerVMMapVO findByLoadBalancerIdAndVmIdVmIp(long loadBalancerId, long instanceId, String instanceIp); + + void remove(long id, long instanceId, String instanceIp, Boolean revoke); } http://git-wip-us.apache.org/repos/asf/cloudstack/blob/b94a9826/engine/schema/src/com/cloud/network/dao/LoadBalancerVMMapDaoImpl.java ---------------------------------------------------------------------- diff --git a/engine/schema/src/com/cloud/network/dao/LoadBalancerVMMapDaoImpl.java b/engine/schema/src/com/cloud/network/dao/LoadBalancerVMMapDaoImpl.java index bb24e04..cbfda8f 100644 --- a/engine/schema/src/com/cloud/network/dao/LoadBalancerVMMapDaoImpl.java +++ b/engine/schema/src/com/cloud/network/dao/LoadBalancerVMMapDaoImpl.java @@ -52,6 +52,21 @@ public class LoadBalancerVMMapDaoImpl extends GenericDaoBase<LoadBalancerVMMapVO } @Override + public void remove(long loadBalancerId, long instanceId, String instanceIp, Boolean revoke) { + SearchCriteria<LoadBalancerVMMapVO> sc = createSearchCriteria(); + sc.addAnd("loadBalancerId", SearchCriteria.Op.EQ, loadBalancerId); + sc.addAnd("instanceId", SearchCriteria.Op.IN, instanceId); + sc.addAnd("instanceIp", SearchCriteria.Op.EQ, instanceIp); + + if (revoke != null) { + sc.addAnd("revoke", SearchCriteria.Op.EQ, revoke); + } + + expunge(sc); + } + + + @Override public List<LoadBalancerVMMapVO> listByInstanceId(long instanceId) { SearchCriteria<LoadBalancerVMMapVO> sc = createSearchCriteria(); sc.addAnd("instanceId", SearchCriteria.Op.EQ, instanceId); @@ -92,6 +107,18 @@ public class LoadBalancerVMMapDaoImpl extends GenericDaoBase<LoadBalancerVMMapVO return findOneBy(sc); } + + @Override + public LoadBalancerVMMapVO findByLoadBalancerIdAndVmIdVmIp(long loadBalancerId, long instanceId, String instanceIp) { + SearchCriteria<LoadBalancerVMMapVO> sc = createSearchCriteria(); + sc.addAnd("loadBalancerId", SearchCriteria.Op.EQ, loadBalancerId); + sc.addAnd("instanceId", SearchCriteria.Op.EQ, instanceId); + sc.addAnd("instanceIp", SearchCriteria.Op.EQ, instanceIp); + + return findOneBy(sc); + } + + @Override public boolean isVmAttachedToLoadBalancer(long loadBalancerId) { GenericSearchBuilder<LoadBalancerVMMapVO, Long> CountByAccount = createSearchBuilder(Long.class); @@ -102,4 +129,12 @@ public class LoadBalancerVMMapDaoImpl extends GenericDaoBase<LoadBalancerVMMapVO sc.setParameters("loadBalancerId", loadBalancerId); return customSearch(sc, null).get(0) > 0; } + + @Override + public List<LoadBalancerVMMapVO> listByLoadBalancerIdAndVmId(long loadBalancerId, long instanceId) { + SearchCriteria<LoadBalancerVMMapVO> sc = createSearchCriteria(); + sc.addAnd("loadBalancerId", SearchCriteria.Op.EQ, loadBalancerId); + sc.addAnd("instanceId", SearchCriteria.Op.EQ, instanceId); + return listBy(sc); + } } http://git-wip-us.apache.org/repos/asf/cloudstack/blob/b94a9826/server/src/com/cloud/network/as/AutoScaleManagerImpl.java ---------------------------------------------------------------------- diff --git a/server/src/com/cloud/network/as/AutoScaleManagerImpl.java b/server/src/com/cloud/network/as/AutoScaleManagerImpl.java index e6cbd7c..c75dbba 100644 --- a/server/src/com/cloud/network/as/AutoScaleManagerImpl.java +++ b/server/src/com/cloud/network/as/AutoScaleManagerImpl.java @@ -1431,7 +1431,7 @@ public class AutoScaleManagerImpl<Type> extends ManagerBase implements AutoScale List<Long> lstVmId = new ArrayList<Long>(); if (instanceId != -1) lstVmId.add(instanceId); - if (_loadBalancingRulesService.removeFromLoadBalancer(lbId, lstVmId)) + if (_loadBalancingRulesService.removeFromLoadBalancer(lbId, lstVmId, new HashMap<Long, List<String>>())) return instanceId; else return -1; http://git-wip-us.apache.org/repos/asf/cloudstack/blob/b94a9826/server/src/com/cloud/network/lb/LoadBalancingRulesManagerImpl.java ---------------------------------------------------------------------- diff --git a/server/src/com/cloud/network/lb/LoadBalancingRulesManagerImpl.java b/server/src/com/cloud/network/lb/LoadBalancingRulesManagerImpl.java index f514cbf..e67fdba 100755 --- a/server/src/com/cloud/network/lb/LoadBalancingRulesManagerImpl.java +++ b/server/src/com/cloud/network/lb/LoadBalancingRulesManagerImpl.java @@ -886,7 +886,8 @@ public class LoadBalancingRulesManagerImpl<Type> extends ManagerBase implements for (LoadBalancerVMMapVO lbVmMap : lbVmMaps) { UserVm vm = _vmDao.findById(lbVmMap.getInstanceId()); Nic nic = _nicDao.findByInstanceIdAndNetworkIdIncludingRemoved(ulb.getNetworkId(), vm.getId()); - String dstIp = nic.getIp4Address(); + String dstIp = lbVmMap.getInstanceIp() == null ? nic.getIp4Address(): lbVmMap.getInstanceIp(); + for (int i = 0; i < lbto.getDestinations().length; i++) { LoadBalancerTO.DestinationTO des = lbto.getDestinations()[i]; if (dstIp.equalsIgnoreCase(lbto.getDestinations()[i].getDestIp())) { @@ -1066,8 +1067,8 @@ public class LoadBalancingRulesManagerImpl<Type> extends ManagerBase implements for (Long vmId : vmIds) { final List<String> lbVmIps = newMap.get(vmId); for (String vmIp: lbVmIps) { - LoadBalancerVMMapVO map = new LoadBalancerVMMapVO(loadBalancer.getId(), vmId, vmIp, false); - map = _lb2VmMapDao.persist(map); + LoadBalancerVMMapVO map = new LoadBalancerVMMapVO(loadBalancer.getId(), vmId, vmIp, false); + map = _lb2VmMapDao.persist(map); } } } @@ -1128,8 +1129,8 @@ public class LoadBalancingRulesManagerImpl<Type> extends ManagerBase implements @Override @ActionEvent(eventType = EventTypes.EVENT_REMOVE_FROM_LOAD_BALANCER_RULE, eventDescription = "removing from load balancer", async = true) - public boolean removeFromLoadBalancer(long loadBalancerId, List<Long> instanceIds) { - return removeFromLoadBalancerInternal(loadBalancerId, instanceIds, true); + public boolean removeFromLoadBalancer(long loadBalancerId, List<Long> instanceIds, Map<Long, List<String>> vmIdIpsMap) { + return removeFromLoadBalancerInternal(loadBalancerId, instanceIds, true, vmIdIpsMap); } @Override @@ -1263,7 +1264,7 @@ public class LoadBalancingRulesManagerImpl<Type> extends ManagerBase implements return success; } - private boolean removeFromLoadBalancerInternal(long loadBalancerId, List<Long> instanceIds, boolean rollBack) { + private boolean removeFromLoadBalancerInternal(long loadBalancerId, List<Long> instanceIds, boolean rollBack, Map<Long, List<String>> vmIdIpMap) { CallContext caller = CallContext.current(); LoadBalancerVO loadBalancer = _lbDao.findById(Long.valueOf(loadBalancerId)); @@ -1273,17 +1274,65 @@ public class LoadBalancingRulesManagerImpl<Type> extends ManagerBase implements _accountMgr.checkAccess(caller.getCallingAccount(), null, true, loadBalancer); + if (instanceIds == null && vmIdIpMap.isEmpty()) { + throw new InvalidParameterValueException("Both instanceids and vmidipmap can't be null"); + } + + // instanceIds and vmIdipmap is passed + if (instanceIds != null && !vmIdIpMap.isEmpty()) { + for(long instanceId: instanceIds) { + if (!vmIdIpMap.containsKey(instanceId)) { + vmIdIpMap.put(instanceId, null); + } + } + } + + //only instanceids list passed + if (instanceIds != null && vmIdIpMap.isEmpty()){ + vmIdIpMap = new HashMap<Long, List<String>>(); + for (long instanceId: instanceIds){ + vmIdIpMap.put(instanceId, null); + } + } + + + boolean success = false; FirewallRule.State backupState = loadBalancer.getState(); + Set<Long> vmIds = vmIdIpMap.keySet(); 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); + for (long instanceId : vmIds) { + List<String> lbVmIps = vmIdIpMap.get(instanceId); + + if (lbVmIps == null || lbVmIps.isEmpty()) { + List<LoadBalancerVMMapVO> lbVms = _lb2VmMapDao.listByLoadBalancerIdAndVmId(loadBalancerId, instanceId); + if (lbVms == null) { + throw new InvalidParameterValueException("The instance id: "+ instanceId +" is not configured " + + " for LB rule id " + loadBalancerId); + } + + for (LoadBalancerVMMapVO lbvm: lbVms) { + lbvm.setRevoke(true); + _lb2VmMapDao.persist(lbvm); + } + s_logger.debug("Set load balancer rule for revoke: rule id " + loadBalancerId + ", vmId " + instanceId); + + } else { + for (String vmIp: lbVmIps) { + LoadBalancerVMMapVO map = _lb2VmMapDao.findByLoadBalancerIdAndVmIdVmIp (loadBalancerId, instanceId, vmIp); + if (map == null) { + throw new InvalidParameterValueException("The instance id: "+ instanceId +" is not configured " + + " for LB rule id " + loadBalancerId); + } + map.setRevoke(true); + _lb2VmMapDao.persist(map); + s_logger.debug("Set load balancer rule for revoke: rule id " + loadBalancerId + ", vmId " + + instanceId + ", vmip " + vmIp); + } + } } if (_autoScaleVmGroupDao.isAutoScaleLoadBalancer(loadBalancerId)) { @@ -1305,11 +1354,23 @@ public class LoadBalancingRulesManagerImpl<Type> extends ManagerBase implements } catch (ResourceUnavailableException e) { if (rollBack && isRollBackAllowedForProvider(loadBalancer)) { - for (long instanceId : instanceIds) { - LoadBalancerVMMapVO map = _lb2VmMapDao.findByLoadBalancerIdAndVmId(loadBalancerId, instanceId); - map.setRevoke(false); - _lb2VmMapDao.persist(map); - s_logger.debug("LB Rollback rule id: " + loadBalancerId + ",while removing vmId " + instanceId); + for (long instanceId : vmIds) { + List<String> lbVmIps = vmIdIpMap.get(instanceId); + + if (lbVmIps == null || lbVmIps.isEmpty()) { + LoadBalancerVMMapVO map = _lb2VmMapDao.findByLoadBalancerIdAndVmId(loadBalancerId, instanceId); + map.setRevoke(false); + _lb2VmMapDao.persist(map); + s_logger.debug("LB Rollback rule id: " + loadBalancerId + ",while removing vmId " + instanceId); + }else { + for (String vmIp: lbVmIps) { + LoadBalancerVMMapVO map = _lb2VmMapDao.findByLoadBalancerIdAndVmIdVmIp (loadBalancerId, instanceId, vmIp); + map.setRevoke(true); + _lb2VmMapDao.persist(map); + s_logger.debug("LB Rollback rule id: " + loadBalancerId + ",while removing vmId " + + instanceId + ", vmip " + vmIp); + } + } } loadBalancer.setState(backupState); @@ -1354,7 +1415,7 @@ public class LoadBalancingRulesManagerImpl<Type> extends ManagerBase implements // Reapply all lbs that had the vm assigned if (lbsToReconfigure != null) { for (Map.Entry<Long, List<Long>> lb : lbsToReconfigure.entrySet()) { - if (!removeFromLoadBalancerInternal(lb.getKey(), lb.getValue(), false)) { + if (!removeFromLoadBalancerInternal(lb.getKey(), lb.getValue(), false, new HashMap<Long, List<String>>())) { success = false; } } @@ -1799,12 +1860,11 @@ public class LoadBalancingRulesManagerImpl<Type> extends ManagerBase implements for (LoadBalancerVMMapVO lbVmMap : lbVmMaps) { instanceIds.add(lbVmMap.getInstanceId()); + _lb2VmMapDao.remove(lb.getId(), lbVmMap.getInstanceId(), lbVmMap.getInstanceIp(), null); + s_logger.debug("Load balancer rule id " + lb.getId() + " is removed for vm " + + lbVmMap.getInstanceId() + " instance ip " + lbVmMap.getInstanceIp()); } - if (!instanceIds.isEmpty()) { - _lb2VmMapDao.remove(lb.getId(), instanceIds, null); - s_logger.debug("Load balancer rule id " + lb.getId() + " is removed for vms " + instanceIds); - } if (_lb2VmMapDao.listByLoadBalancerId(lb.getId()).isEmpty()) { lb.setState(FirewallRule.State.Add); @@ -2095,6 +2155,18 @@ public class LoadBalancingRulesManagerImpl<Type> extends ManagerBase implements } @Override + public List<String> listLbVmIpAddress (long id, long vmId) { + + List <LoadBalancerVMMapVO> listLbvmMapVo = _lb2VmMapDao.listByLoadBalancerIdAndVmId(id, vmId); + + List <String> vmIps = new ArrayList<String>(); + for (LoadBalancerVMMapVO lbVmVo : listLbvmMapVo) { + vmIps.add(lbVmVo.getInstanceIp()); + } + return vmIps; + } + + @Override public List<LbStickinessMethod> getStickinessMethods(long networkid) { String capability = getLBCapability(networkid, Capability.SupportedStickinessMethods.getName()); if (capability == null) {
