From 34bcb2d026e1951f7b115d71830c69e1ad5ed89a Mon Sep 17 00:00:00 2001 From: Alena Prokharchyk Date: Mon, 8 Apr 2013 12:11:11 -0700 Subject: [PATCH] InternalLB: implemented list/delete/create web services API commands that will be used for Internal LB creation --- .../cloudstack/api/ResponseGenerator.java | 3 +- .../CreateApplicationLoadBalancerCmd.java | 16 +- .../DeleteApplicationLoadBalancerCmd.java | 6 +- .../ListApplicationLoadBalancersCmd.java | 54 ++++- .../lb}/ApplicationLoadBalancerContainer.java | 7 +- .../lb}/ApplicationLoadBalancerRule.java | 4 +- .../lb/ApplicationLoadBalancerService.java | 7 +- client/tomcatconf/applicationContext.xml.in | 2 + .../lb/ElasticLoadBalancerManagerImpl.java | 4 +- server/src/com/cloud/api/ApiDBUtils.java | 2 + .../src/com/cloud/api/ApiResponseHelper.java | 11 +- .../dao/ApplicationLoadBalancerRuleVO.java | 78 ------- .../com/cloud/network/dao/LoadBalancerVO.java | 14 +- .../network/lb/LoadBalancingRulesManager.java | 6 +- .../lb/LoadBalancingRulesManagerImpl.java | 84 ++++--- .../cloud/network/rules/FirewallRuleVO.java | 2 - .../ApplicationLoadBalancerManagerImpl.java | 218 +++++++++++++++++- .../lb/ApplicationLoadBalancerRuleVO.java | 133 +++++++++++ .../dao/ApplicationLoadBalancerRuleDao.java | 26 +++ .../ApplicationLoadBalancerRuleDaoImpl.java | 31 +++ setup/db/db/schema-410to420.sql | 2 +- 21 files changed, 547 insertions(+), 163 deletions(-) rename api/src/{com/cloud/network/rules => org/apache/cloudstack/network/lb}/ApplicationLoadBalancerContainer.java (84%) rename api/src/{com/cloud/network/rules => org/apache/cloudstack/network/lb}/ApplicationLoadBalancerRule.java (91%) delete mode 100644 server/src/com/cloud/network/dao/ApplicationLoadBalancerRuleVO.java create mode 100644 server/src/org/apache/cloudstack/network/lb/ApplicationLoadBalancerRuleVO.java create mode 100644 server/src/org/apache/cloudstack/network/lb/dao/ApplicationLoadBalancerRuleDao.java create mode 100644 server/src/org/apache/cloudstack/network/lb/dao/ApplicationLoadBalancerRuleDaoImpl.java diff --git a/api/src/org/apache/cloudstack/api/ResponseGenerator.java b/api/src/org/apache/cloudstack/api/ResponseGenerator.java index e280a15f207..a17b079aebb 100644 --- a/api/src/org/apache/cloudstack/api/ResponseGenerator.java +++ b/api/src/org/apache/cloudstack/api/ResponseGenerator.java @@ -101,6 +101,7 @@ import org.apache.cloudstack.api.response.VpcOfferingResponse; import org.apache.cloudstack.api.response.VpcResponse; import org.apache.cloudstack.api.response.VpnUsersResponse; import org.apache.cloudstack.api.response.ZoneResponse; +import org.apache.cloudstack.network.lb.ApplicationLoadBalancerRule; import org.apache.cloudstack.region.Region; import org.apache.cloudstack.usage.Usage; @@ -396,5 +397,5 @@ public interface ResponseGenerator { Long nicId, Long networkId); public NicResponse createNicResponse(Nic result); - ApplicationLoadBalancerResponse createLoadBalancerContainerReponse(LoadBalancer lb, Map lbInstances); + ApplicationLoadBalancerResponse createLoadBalancerContainerReponse(ApplicationLoadBalancerRule lb, Map lbInstances); } diff --git a/api/src/org/apache/cloudstack/api/command/user/loadbalancer/CreateApplicationLoadBalancerCmd.java b/api/src/org/apache/cloudstack/api/command/user/loadbalancer/CreateApplicationLoadBalancerCmd.java index f9e8d6480b6..b4c73f39f43 100644 --- a/api/src/org/apache/cloudstack/api/command/user/loadbalancer/CreateApplicationLoadBalancerCmd.java +++ b/api/src/org/apache/cloudstack/api/command/user/loadbalancer/CreateApplicationLoadBalancerCmd.java @@ -25,6 +25,7 @@ import org.apache.cloudstack.api.ServerApiException; import org.apache.cloudstack.api.response.ApplicationLoadBalancerResponse; import org.apache.cloudstack.api.response.DomainResponse; import org.apache.cloudstack.api.response.NetworkResponse; +import org.apache.cloudstack.network.lb.ApplicationLoadBalancerRule; import org.apache.log4j.Logger; import com.cloud.async.AsyncJob; @@ -36,7 +37,6 @@ import com.cloud.exception.ResourceAllocationException; import com.cloud.exception.ResourceUnavailableException; import com.cloud.network.Network; import com.cloud.network.Networks.TrafficType; -import com.cloud.network.rules.LoadBalancer; import com.cloud.network.rules.LoadBalancerContainer.Scheme; import com.cloud.user.Account; import com.cloud.user.UserContext; @@ -73,7 +73,8 @@ public class CreateApplicationLoadBalancerCmd extends BaseAsyncCreateCmd { @Parameter(name=ApiConstants.SOURCE_IP, type=CommandType.STRING, description="the source ip address the network traffic will be load balanced from") private String sourceIp; - @Parameter(name=ApiConstants.SOURCE_IP_NETWORK_ID, type=CommandType.LONG, required=true, description="the network id of the source ip address") + @Parameter(name=ApiConstants.SOURCE_IP_NETWORK_ID, type=CommandType.UUID, entityType = NetworkResponse.class, required=true, + description="the network id of the source ip address") private Long sourceIpNetworkId; @Parameter(name=ApiConstants.ACCOUNT, type=CommandType.STRING, description="the account associated with the load balancer." + @@ -109,7 +110,6 @@ public class CreateApplicationLoadBalancerCmd extends BaseAsyncCreateCmd { return instancePort; } - public long getNetworkId() { return networkId; } @@ -184,7 +184,7 @@ public class CreateApplicationLoadBalancerCmd extends BaseAsyncCreateCmd { if (scheme.equalsIgnoreCase(Scheme.Internal.toString())) { return Scheme.Internal; } else { - throw new InvalidParameterValueException("Invalid value for sheme. Supported value is Internal"); + throw new InvalidParameterValueException("Invalid value for scheme. Supported value is Internal"); } } @@ -203,11 +203,11 @@ public class CreateApplicationLoadBalancerCmd extends BaseAsyncCreateCmd { @Override public void execute() throws ResourceAllocationException, ResourceUnavailableException { - LoadBalancer rule = null; + ApplicationLoadBalancerRule rule = null; try { UserContext.current().setEventDetails("Load Balancer Id: " + getEntityId()); // State might be different after the rule is applied, so get new object here - rule = _entityMgr.findById(LoadBalancer.class, getEntityId()); + rule = _entityMgr.findById(ApplicationLoadBalancerRule.class, getEntityId()); ApplicationLoadBalancerResponse lbResponse = _responseGenerator.createLoadBalancerContainerReponse(rule, _lbService.getLbInstances(getEntityId())); setResponseObject(lbResponse); lbResponse.setResponseName(getCommandName()); @@ -224,8 +224,8 @@ public class CreateApplicationLoadBalancerCmd extends BaseAsyncCreateCmd { public void create() { try { - LoadBalancer result = _appLbService.createApplicationLoadBalancer(getName(), getDescription(), getScheme(), getSourceIpNetworkId(), getSourceIp(), getSourcePort(), - getInstancePort(), getAlgorithm(), getNetworkId(), getEntityOwnerId()); + ApplicationLoadBalancerRule result = _appLbService.createApplicationLoadBalancer(getName(), getDescription(), getScheme(), + getSourceIpNetworkId(), getSourceIp(), getSourcePort(), getInstancePort(), getAlgorithm(), getNetworkId(), getEntityOwnerId()); this.setEntityId(result.getId()); this.setEntityUuid(result.getUuid()); }catch (NetworkRuleConflictException e) { diff --git a/api/src/org/apache/cloudstack/api/command/user/loadbalancer/DeleteApplicationLoadBalancerCmd.java b/api/src/org/apache/cloudstack/api/command/user/loadbalancer/DeleteApplicationLoadBalancerCmd.java index 78b06ad1524..1ce5897062e 100644 --- a/api/src/org/apache/cloudstack/api/command/user/loadbalancer/DeleteApplicationLoadBalancerCmd.java +++ b/api/src/org/apache/cloudstack/api/command/user/loadbalancer/DeleteApplicationLoadBalancerCmd.java @@ -24,12 +24,12 @@ import org.apache.cloudstack.api.Parameter; import org.apache.cloudstack.api.ServerApiException; import org.apache.cloudstack.api.response.FirewallRuleResponse; import org.apache.cloudstack.api.response.SuccessResponse; +import org.apache.cloudstack.network.lb.ApplicationLoadBalancerRule; import org.apache.log4j.Logger; import com.cloud.async.AsyncJob; import com.cloud.event.EventTypes; import com.cloud.exception.InvalidParameterValueException; -import com.cloud.network.rules.LoadBalancer; import com.cloud.user.UserContext; @APICommand(name = "deleteLoadBalancer", description="Deletes a load balancer", responseObject=SuccessResponse.class) @@ -64,7 +64,7 @@ public class DeleteApplicationLoadBalancerCmd extends BaseAsyncCmd { @Override public long getEntityOwnerId() { - LoadBalancer lb = _entityMgr.findById(LoadBalancer.class, getId()); + ApplicationLoadBalancerRule lb = _entityMgr.findById(ApplicationLoadBalancerRule.class, getId()); if (lb != null) { return lb.getAccountId(); } else { @@ -102,7 +102,7 @@ public class DeleteApplicationLoadBalancerCmd extends BaseAsyncCmd { @Override public Long getSyncObjId() { - LoadBalancer lb = _lbService.findById(id); + ApplicationLoadBalancerRule lb = _appLbService.findById(id); if(lb == null){ throw new InvalidParameterValueException("Unable to find load balancer by id "); } diff --git a/api/src/org/apache/cloudstack/api/command/user/loadbalancer/ListApplicationLoadBalancersCmd.java b/api/src/org/apache/cloudstack/api/command/user/loadbalancer/ListApplicationLoadBalancersCmd.java index 844e29462a7..46a4de6e24f 100644 --- a/api/src/org/apache/cloudstack/api/command/user/loadbalancer/ListApplicationLoadBalancersCmd.java +++ b/api/src/org/apache/cloudstack/api/command/user/loadbalancer/ListApplicationLoadBalancersCmd.java @@ -26,14 +26,17 @@ import org.apache.cloudstack.api.Parameter; import org.apache.cloudstack.api.response.ApplicationLoadBalancerResponse; import org.apache.cloudstack.api.response.FirewallRuleResponse; import org.apache.cloudstack.api.response.ListResponse; +import org.apache.cloudstack.api.response.NetworkResponse; +import org.apache.cloudstack.network.lb.ApplicationLoadBalancerRule; import org.apache.log4j.Logger; -import com.cloud.network.rules.ApplicationLoadBalancerRule; +import com.cloud.exception.InvalidParameterValueException; +import com.cloud.network.rules.LoadBalancerContainer.Scheme; import com.cloud.utils.Pair; @APICommand(name = "listLoadBalancers", description = "Lists Load Balancers", responseObject = ApplicationLoadBalancerResponse.class) public class ListApplicationLoadBalancersCmd extends BaseListTaggedResourcesCmd { - public static final Logger s_logger = Logger.getLogger(ListLoadBalancerRulesCmd.class.getName()); + public static final Logger s_logger = Logger.getLogger(ListApplicationLoadBalancersCmd.class.getName()); private static final String s_name = "listloadbalancerssresponse"; @@ -47,6 +50,20 @@ public class ListApplicationLoadBalancersCmd extends BaseListTaggedResourcesCmd @Parameter(name = ApiConstants.NAME, type = CommandType.STRING, description = "the name of the Load Balancer") private String loadBalancerName; + + @Parameter(name = ApiConstants.SOURCE_IP, type = CommandType.STRING, description = "the source ip address of the Load Balancer") + private String sourceIp; + + @Parameter(name=ApiConstants.SOURCE_IP_NETWORK_ID, type=CommandType.UUID, entityType = NetworkResponse.class, + description="the network id of the source ip address") + private Long sourceIpNetworkId; + + @Parameter(name = ApiConstants.SCHEME, type = CommandType.STRING, description = "the scheme of the Load Balancer. Supported value is Internal in the current release") + private String scheme; + + @Parameter(name=ApiConstants.NETWORK_ID, type=CommandType.UUID, entityType = NetworkResponse.class, + description="the network id of the Load Balancer") + private Long networkId; // /////////////////////////////////////////////////// @@ -61,19 +78,44 @@ public class ListApplicationLoadBalancersCmd extends BaseListTaggedResourcesCmd return loadBalancerName; } + public String getLoadBalancerName() { + return loadBalancerName; + } - // /////////////////////////////////////////////////// - // ///////////// API Implementation/////////////////// - // /////////////////////////////////////////////////// + public String getSourceIp() { + return sourceIp; + } + + public Long getSourceIpNetworkId() { + return sourceIpNetworkId; + } @Override public String getCommandName() { return s_name; } + + public Scheme getScheme() { + if (scheme != null) { + if (scheme.equalsIgnoreCase(Scheme.Internal.toString())) { + return Scheme.Internal; + } else { + throw new InvalidParameterValueException("Invalid value for scheme. Supported value is Internal"); + } + } + return null; + } + + public Long getNetworkId() { + return networkId; + } + // /////////////////////////////////////////////////// + // ///////////// API Implementation/////////////////// + // /////////////////////////////////////////////////// @Override public void execute() { - Pair, Integer> loadBalancers = _appLbService.listApplicationLoadBalancers(); + Pair, Integer> loadBalancers = _appLbService.listApplicationLoadBalancers(this); ListResponse response = new ListResponse(); List lbResponses = new ArrayList(); for (ApplicationLoadBalancerRule loadBalancer : loadBalancers.first()) { diff --git a/api/src/com/cloud/network/rules/ApplicationLoadBalancerContainer.java b/api/src/org/apache/cloudstack/network/lb/ApplicationLoadBalancerContainer.java similarity index 84% rename from api/src/com/cloud/network/rules/ApplicationLoadBalancerContainer.java rename to api/src/org/apache/cloudstack/network/lb/ApplicationLoadBalancerContainer.java index 90f1e61eb8c..df94d3d4338 100644 --- a/api/src/com/cloud/network/rules/ApplicationLoadBalancerContainer.java +++ b/api/src/org/apache/cloudstack/network/lb/ApplicationLoadBalancerContainer.java @@ -14,14 +14,15 @@ // KIND, either express or implied. See the License for the // specific language governing permissions and limitations // under the License. -package com.cloud.network.rules; +package org.apache.cloudstack.network.lb; +import com.cloud.network.rules.LoadBalancerContainer; import com.cloud.utils.net.Ip; public interface ApplicationLoadBalancerContainer extends LoadBalancerContainer{ - public String getSourceIpNetworkUuid(); + public Long getSourceIpNetworkId(); - public Ip getSourceIpAddress(); + public Ip getSourceIp(); } diff --git a/api/src/com/cloud/network/rules/ApplicationLoadBalancerRule.java b/api/src/org/apache/cloudstack/network/lb/ApplicationLoadBalancerRule.java similarity index 91% rename from api/src/com/cloud/network/rules/ApplicationLoadBalancerRule.java rename to api/src/org/apache/cloudstack/network/lb/ApplicationLoadBalancerRule.java index 76c07d53a16..f4acb734c8b 100644 --- a/api/src/com/cloud/network/rules/ApplicationLoadBalancerRule.java +++ b/api/src/org/apache/cloudstack/network/lb/ApplicationLoadBalancerRule.java @@ -15,7 +15,9 @@ // specific language governing permissions and limitations // under the License. -package com.cloud.network.rules; +package org.apache.cloudstack.network.lb; + +import com.cloud.network.rules.LoadBalancer; public interface ApplicationLoadBalancerRule extends ApplicationLoadBalancerContainer, LoadBalancer{ int getInstancePort(); diff --git a/api/src/org/apache/cloudstack/network/lb/ApplicationLoadBalancerService.java b/api/src/org/apache/cloudstack/network/lb/ApplicationLoadBalancerService.java index d9971f9e15d..0d9620b88e8 100644 --- a/api/src/org/apache/cloudstack/network/lb/ApplicationLoadBalancerService.java +++ b/api/src/org/apache/cloudstack/network/lb/ApplicationLoadBalancerService.java @@ -19,9 +19,10 @@ package org.apache.cloudstack.network.lb; import java.util.List; +import org.apache.cloudstack.api.command.user.loadbalancer.ListApplicationLoadBalancersCmd; + import com.cloud.exception.InsufficientAddressCapacityException; import com.cloud.exception.NetworkRuleConflictException; -import com.cloud.network.rules.ApplicationLoadBalancerRule; import com.cloud.network.rules.LoadBalancerContainer.Scheme; import com.cloud.utils.Pair; @@ -33,6 +34,8 @@ public interface ApplicationLoadBalancerService { boolean deleteApplicationLoadBalancer(long id); - Pair, Integer> listApplicationLoadBalancers(); + Pair, Integer> listApplicationLoadBalancers(ListApplicationLoadBalancersCmd cmd); + + ApplicationLoadBalancerRule findById(long ruleId); } diff --git a/client/tomcatconf/applicationContext.xml.in b/client/tomcatconf/applicationContext.xml.in index 6d49145c4d7..0bb497bea7e 100644 --- a/client/tomcatconf/applicationContext.xml.in +++ b/client/tomcatconf/applicationContext.xml.in @@ -364,6 +364,8 @@ + +