You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cloudstack.apache.org by al...@apache.org on 2013/04/12 21:21:56 UTC
[1/2] git commit: updated refs/heads/internallb to c113ea1
Updated Branches:
refs/heads/internallb af6201257 -> c113ea184
InternalLbVm: destroy the internal lb vm when the last rule for the ip is being revoked
Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/78c9db79
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/78c9db79
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/78c9db79
Branch: refs/heads/internallb
Commit: 78c9db79dae3bc38699050b05baae32fd02204f6
Parents: af62012
Author: Alena Prokharchyk <al...@citrix.com>
Authored: Fri Apr 12 10:05:28 2013 -0700
Committer: Alena Prokharchyk <al...@citrix.com>
Committed: Fri Apr 12 11:07:00 2013 -0700
----------------------------------------------------------------------
.../element/InternalLoadBalancerElement.java | 105 +++++++++++----
.../network/lb/InternalLoadBalancerManager.java | 5 +-
.../lb/InternalLoadBalancerManagerImpl.java | 28 +++--
.../network/lb/LoadBalancingRulesManagerImpl.java | 2 +-
4 files changed, 97 insertions(+), 43 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/78c9db79/plugins/network-elements/internal-loadbalancer/src/org/apache/cloudstack/network/element/InternalLoadBalancerElement.java
----------------------------------------------------------------------
diff --git a/plugins/network-elements/internal-loadbalancer/src/org/apache/cloudstack/network/element/InternalLoadBalancerElement.java b/plugins/network-elements/internal-loadbalancer/src/org/apache/cloudstack/network/element/InternalLoadBalancerElement.java
index f3fb00f..0c662a8 100644
--- a/plugins/network-elements/internal-loadbalancer/src/org/apache/cloudstack/network/element/InternalLoadBalancerElement.java
+++ b/plugins/network-elements/internal-loadbalancer/src/org/apache/cloudstack/network/element/InternalLoadBalancerElement.java
@@ -19,6 +19,7 @@ package org.apache.cloudstack.network.element;
import java.util.ArrayList;
import java.util.HashMap;
+import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
@@ -64,7 +65,9 @@ import com.cloud.network.router.VirtualRouter.Role;
import com.cloud.network.rules.FirewallRule;
import com.cloud.network.rules.LoadBalancerContainer;
import com.cloud.offering.NetworkOffering;
+import com.cloud.user.Account;
import com.cloud.user.AccountManager;
+import com.cloud.user.User;
import com.cloud.utils.component.AdapterBase;
import com.cloud.utils.db.SearchCriteria.Op;
import com.cloud.utils.db.SearchCriteria2;
@@ -162,13 +165,13 @@ public class InternalLoadBalancerElement extends AdapterBase implements LoadBala
boolean result = true;
for (DomainRouterVO internalLbVm : internalLbVms) {
result = result && _internalLbMgr.destroyInternalLbVm(internalLbVm.getId(),
- context.getAccount(), context.getCaller().getId()) != null;
+ context.getAccount(), context.getCaller().getId());
if (cleanup) {
if (!result) {
s_logger.warn("Failed to stop internal lb element " + internalLbVm + ", but would try to process clean up anyway.");
}
result = (_internalLbMgr.destroyInternalLbVm(internalLbVm.getId(),
- context.getAccount(), context.getCaller().getId()) != null);
+ context.getAccount(), context.getCaller().getId()));
if (!result) {
s_logger.warn("Failed to clean up internal lb element " + internalLbVm);
}
@@ -186,7 +189,7 @@ public class InternalLoadBalancerElement extends AdapterBase implements LoadBala
boolean result = true;
for (DomainRouterVO internalLbVm : internalLbVms) {
result = result && (_internalLbMgr.destroyInternalLbVm(internalLbVm.getId(),
- context.getAccount(), context.getCaller().getId()) != null);
+ context.getAccount(), context.getCaller().getId()));
}
return result;
}
@@ -214,7 +217,7 @@ public class InternalLoadBalancerElement extends AdapterBase implements LoadBala
boolean result = true;
for (DomainRouterVO internalLbVm : internalLbVms) {
result = result && (_internalLbMgr.destroyInternalLbVm(internalLbVm.getId(),
- context.getAccount(), context.getCaller().getId()) != null);
+ context.getAccount(), context.getCaller().getId()));
}
_vrProviderDao.remove(elementId);
@@ -240,31 +243,47 @@ public class InternalLoadBalancerElement extends AdapterBase implements LoadBala
public boolean applyLBRules(Network network, List<LoadBalancingRule> rules) throws ResourceUnavailableException {
Map<Ip, List<LoadBalancingRule>> rulesToApply = getLbRulesToApply(rules);
+ Set<Ip> vmsToDestroy = getVmsToDestroy(rules);
for (Ip sourceIp : rulesToApply.keySet()) {
- //2.1 Start Internal LB vm per IP address
- List<DomainRouterVO> internalLbVms;
- try {
- DeployDestination dest = new DeployDestination(_configMgr.getZone(network.getDataCenterId()), null, null, null);
- internalLbVms = _internalLbMgr.deployInternalLbVm(network, sourceIp, dest, _accountMgr.getAccount(network.getAccountId()), null);
- } catch (InsufficientCapacityException e) {
- s_logger.warn("Failed to apply lb rule(s) on the element " + this.getName() + " due to:", e);
- return false;
- } catch (ConcurrentOperationException e) {
- s_logger.warn("Failed to apply lb rule(s) on the element " + this.getName() + " due to:", e);
- return false;
- }
-
- if ((internalLbVms == null) || (internalLbVms.size() == 0)) {
- throw new ResourceUnavailableException("Can't find/deploy internal lb vm to handle LB rules",
- DataCenter.class, network.getDataCenterId());
- }
-
- //2.2 Apply Internal LB rules on the VM
- if (!_internalLbMgr.applyLoadBalancingRules(network, rules, internalLbVms)) {
- throw new CloudRuntimeException("Failed to apply load balancing rules in network " + network.getId() + " on element " + this.getName());
+ if (vmsToDestroy.contains(sourceIp)) {
+ //2.1 Destroy internal lb vm
+ List<DomainRouterVO> vms = _internalLbMgr.findInternalLbVms(network.getId(), sourceIp);
+ //only one internal lb per IP exists
+ try {
+ s_logger.debug("Destroying internal lb vm for ip " + sourceIp.addr() + " as all the rules for this vm are in Revoke state");
+ return _internalLbMgr.destroyInternalLbVm(vms.get(0).getId(), _accountMgr.getAccount(Account.ACCOUNT_ID_SYSTEM),
+ _accountMgr.getUserIncludingRemoved(User.UID_SYSTEM).getId());
+ } catch (ConcurrentOperationException e) {
+ s_logger.warn("Failed to apply lb rule(s) for ip " + sourceIp.addr() + " on the element " + this.getName() + " due to:", e);
+ return false;
+ }
} else {
- return true;
+ //2.2 Start Internal LB vm per IP address
+ List<DomainRouterVO> internalLbVms;
+ try {
+ DeployDestination dest = new DeployDestination(_configMgr.getZone(network.getDataCenterId()), null, null, null);
+ internalLbVms = _internalLbMgr.deployInternalLbVm(network, sourceIp, dest, _accountMgr.getAccount(network.getAccountId()), null);
+ } catch (InsufficientCapacityException e) {
+ s_logger.warn("Failed to apply lb rule(s) for ip " + sourceIp.addr() + "on the element " + this.getName() + " due to:", e);
+ return false;
+ } catch (ConcurrentOperationException e) {
+ s_logger.warn("Failed to apply lb rule(s) for ip " + sourceIp.addr() + "on the element " + this.getName() + " due to:", e);
+ return false;
+ }
+
+ if ((internalLbVms == null) || (internalLbVms.size() == 0)) {
+ throw new ResourceUnavailableException("Can't find/deploy internal lb vm to handle LB rules",
+ DataCenter.class, network.getDataCenterId());
+ }
+
+ //2.3 Apply Internal LB rules on the VM
+ if (!_internalLbMgr.applyLoadBalancingRules(network, rulesToApply.get(sourceIp), internalLbVms)) {
+ throw new CloudRuntimeException("Failed to apply load balancing rules for ip " + sourceIp.addr() +
+ " in network " + network.getId() + " on element " + this.getName());
+ } else {
+ return true;
+ }
}
}
@@ -275,7 +294,7 @@ public class InternalLoadBalancerElement extends AdapterBase implements LoadBala
//1) Group rules by the source ip address as NetworkManager always passes the entire network lb config to the element
Map<Ip, List<LoadBalancingRule>> groupedRules = groupBySourceIp(rules);
- //2) Apply only set containing LB rules in transition state (Add/Revoke)
+ //2) Apply only sets containing LB rules in transition state (Add/Revoke).
Map<Ip, List<LoadBalancingRule>> rulesToApply = new HashMap<Ip, List<LoadBalancingRule>>();
for (Ip sourceIp : groupedRules.keySet()) {
@@ -287,14 +306,42 @@ public class InternalLoadBalancerElement extends AdapterBase implements LoadBala
break;
}
}
+
if (apply) {
rulesToApply.put(sourceIp, rulesToCheck);
} else {
- s_logger.debug("Not applying the lb rules for soure ip " + sourceIp + " on element " + this.getName() + " as there are no rules in transition state");
+ s_logger.debug("Not applying the lb rules for soure ip " + sourceIp + " on element " + this.getName()
+ + " as there are no rules in transition state");
}
- }
+ }
return rulesToApply;
}
+
+
+
+ protected Set<Ip> getVmsToDestroy(List<LoadBalancingRule> rules) {
+ //1) Group rules by the source ip address as NetworkManager always passes the entire network lb config to the element
+ Map<Ip, List<LoadBalancingRule>> groupedRules = groupBySourceIp(rules);
+
+ //2) Count rules in revoke state
+ Set<Ip> vmsToDestroy = new HashSet<Ip>();
+
+ for (Ip sourceIp : groupedRules.keySet()) {
+ List<LoadBalancingRule> rulesToCheck = groupedRules.get(sourceIp);
+ int revoke = 0;
+ for (LoadBalancingRule ruleToCheck : rulesToCheck) {
+ if (ruleToCheck.getState() == FirewallRule.State.Revoke){
+ revoke++;
+ }
+ }
+
+ if (revoke == rulesToCheck.size()) {
+ s_logger.debug("Have to destroy internal lb vm for source ip " + sourceIp);
+ vmsToDestroy.add(sourceIp);
+ }
+ }
+ return vmsToDestroy;
+ }
protected Map<Ip, List<LoadBalancingRule>> groupBySourceIp(List<LoadBalancingRule> rules) {
Map<Ip, List<LoadBalancingRule>> groupedRules = new HashMap<Ip, List<LoadBalancingRule>>();
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/78c9db79/plugins/network-elements/internal-loadbalancer/src/org/apache/cloudstack/network/lb/InternalLoadBalancerManager.java
----------------------------------------------------------------------
diff --git a/plugins/network-elements/internal-loadbalancer/src/org/apache/cloudstack/network/lb/InternalLoadBalancerManager.java b/plugins/network-elements/internal-loadbalancer/src/org/apache/cloudstack/network/lb/InternalLoadBalancerManager.java
index fd22285..0d817de 100644
--- a/plugins/network-elements/internal-loadbalancer/src/org/apache/cloudstack/network/lb/InternalLoadBalancerManager.java
+++ b/plugins/network-elements/internal-loadbalancer/src/org/apache/cloudstack/network/lb/InternalLoadBalancerManager.java
@@ -44,7 +44,7 @@ public interface InternalLoadBalancerManager extends Manager{
* @throws ResourceUnavailableException
* @throws ConcurrentOperationException
*/
- VirtualRouter destroyInternalLbVm(long vmId, Account caller, Long callerUserId)
+ boolean destroyInternalLbVm(long vmId, Account caller, Long callerUserId)
throws ResourceUnavailableException, ConcurrentOperationException;
@@ -107,4 +107,7 @@ public interface InternalLoadBalancerManager extends Manager{
boolean applyLoadBalancingRules(Network network, List<LoadBalancingRule> rules, List<? extends VirtualRouter> internalLbVms)
throws ResourceUnavailableException;
+
+ List<DomainRouterVO> findInternalLbVms(long guestNetworkId, Ip requestedGuestIp);
+
}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/78c9db79/plugins/network-elements/internal-loadbalancer/src/org/apache/cloudstack/network/lb/InternalLoadBalancerManagerImpl.java
----------------------------------------------------------------------
diff --git a/plugins/network-elements/internal-loadbalancer/src/org/apache/cloudstack/network/lb/InternalLoadBalancerManagerImpl.java b/plugins/network-elements/internal-loadbalancer/src/org/apache/cloudstack/network/lb/InternalLoadBalancerManagerImpl.java
index d45784e..c371892 100644
--- a/plugins/network-elements/internal-loadbalancer/src/org/apache/cloudstack/network/lb/InternalLoadBalancerManagerImpl.java
+++ b/plugins/network-elements/internal-loadbalancer/src/org/apache/cloudstack/network/lb/InternalLoadBalancerManagerImpl.java
@@ -16,6 +16,7 @@
// under the License.
package org.apache.cloudstack.network.lb;
+import java.lang.Thread.State;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
@@ -522,7 +523,7 @@ InternalLoadBalancerManager, VirtualMachineGuru<DomainRouterVO> {
}
@Override
- public VirtualRouter destroyInternalLbVm(long vmId, Account caller, Long callerUserId)
+ public boolean destroyInternalLbVm(long vmId, Account caller, Long callerUserId)
throws ResourceUnavailableException, ConcurrentOperationException {
if (s_logger.isDebugEnabled()) {
s_logger.debug("Attempting to destroy Internal LB vm " + vmId);
@@ -530,17 +531,12 @@ InternalLoadBalancerManager, VirtualMachineGuru<DomainRouterVO> {
DomainRouterVO internalLbVm = _routerDao.findById(vmId);
if (internalLbVm == null) {
- return null;
+ return true;
}
_accountMgr.checkAccess(caller, null, true, internalLbVm);
- boolean result = _itMgr.expunge(internalLbVm, _accountMgr.getActiveUser(callerUserId), caller);
-
- if (result) {
- return internalLbVm;
- }
- return null;
+ return _itMgr.expunge(internalLbVm, _accountMgr.getActiveUser(callerUserId), caller);
}
@Override
@@ -582,12 +578,13 @@ InternalLoadBalancerManager, VirtualMachineGuru<DomainRouterVO> {
}
for (DomainRouterVO internalLbVm : internalLbVms) {
- internalLbVm = startInternalLbVm(internalLbVm, _accountMgr.getSystemUser(), _accountMgr.getSystemAccount(), params);
+ if (internalLbVm.getState() != VirtualMachine.State.Running) {
+ internalLbVm = startInternalLbVm(internalLbVm, _accountMgr.getSystemUser(), _accountMgr.getSystemAccount(), params);
+ }
if (internalLbVm != null) {
runningInternalLbVms.add(internalLbVm);
}
-
}
return runningInternalLbVms;
}
@@ -699,6 +696,14 @@ InternalLoadBalancerManager, VirtualMachineGuru<DomainRouterVO> {
protected Pair<DeploymentPlan, List<DomainRouterVO>> getDeploymentPlanAndInternalLbVms(DeployDestination dest, long guestNetworkId, Ip requestedGuestIp) {
long dcId = dest.getDataCenter().getId();
DeploymentPlan plan = new DataCenterDeployment(dcId);
+ List<DomainRouterVO> internalLbVms = findInternalLbVms(guestNetworkId, requestedGuestIp);
+
+ return new Pair<DeploymentPlan, List<DomainRouterVO>>(plan, internalLbVms);
+
+ }
+
+ @Override
+ public List<DomainRouterVO> findInternalLbVms(long guestNetworkId, Ip requestedGuestIp) {
List<DomainRouterVO> internalLbVms = _routerDao.listByNetworkAndRole(guestNetworkId, Role.INTERNAL_LB_VM);
if (requestedGuestIp != null) {
Iterator<DomainRouterVO> it = internalLbVms.iterator();
@@ -710,8 +715,7 @@ InternalLoadBalancerManager, VirtualMachineGuru<DomainRouterVO> {
}
}
}
-
- return new Pair<DeploymentPlan, List<DomainRouterVO>>(plan, internalLbVms);
+ return internalLbVms;
}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/78c9db79/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 0a9c5b6..59ff435 100755
--- a/server/src/com/cloud/network/lb/LoadBalancingRulesManagerImpl.java
+++ b/server/src/com/cloud/network/lb/LoadBalancingRulesManagerImpl.java
@@ -1602,7 +1602,7 @@ public class LoadBalancingRulesManagerImpl<Type> extends ManagerBase implements
}
txn.commit();
- if (checkForReleaseElasticIp) {
+ if (checkForReleaseElasticIp && lb.getSourceIpAddressId() != null) {
boolean success = true;
long count = _firewallDao.countRulesByIpId(lb.getSourceIpAddressId());
if (count == 0) {
[2/2] git commit: updated refs/heads/internallb to c113ea1
Posted by al...@apache.org.
Add Internal Lb Provider/Element as a part of adding a physical network
Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/c113ea18
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/c113ea18
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/c113ea18
Branch: refs/heads/internallb
Commit: c113ea184b575ccae5d2be411c5bbc345473e35e
Parents: 78c9db7
Author: Alena Prokharchyk <al...@citrix.com>
Authored: Fri Apr 12 12:00:09 2013 -0700
Committer: Alena Prokharchyk <al...@citrix.com>
Committed: Fri Apr 12 12:21:24 2013 -0700
----------------------------------------------------------------------
.../ConfigureInternalLoadBalancerElementCmd.java | 26 +--------
.../CreateInternalLoadBalancerElementCmd.java | 4 +-
.../ListInternalLoadBalancerElementsCmd.java | 18 +------
.../InternalLoadBalancerElementService.java | 36 +++++++++++--
.../element/InternalLoadBalancerElement.java | 40 +++++++++------
.../network/lb/InternalLoadBalancerManager.java | 6 ++
.../src/com/cloud/network/NetworkManagerImpl.java | 1 -
.../src/com/cloud/network/NetworkServiceImpl.java | 22 ++++++++
8 files changed, 90 insertions(+), 63 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/c113ea18/api/src/org/apache/cloudstack/api/command/admin/internallb/ConfigureInternalLoadBalancerElementCmd.java
----------------------------------------------------------------------
diff --git a/api/src/org/apache/cloudstack/api/command/admin/internallb/ConfigureInternalLoadBalancerElementCmd.java b/api/src/org/apache/cloudstack/api/command/admin/internallb/ConfigureInternalLoadBalancerElementCmd.java
index 89b0f39..1bd6bda 100644
--- a/api/src/org/apache/cloudstack/api/command/admin/internallb/ConfigureInternalLoadBalancerElementCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/admin/internallb/ConfigureInternalLoadBalancerElementCmd.java
@@ -31,7 +31,6 @@ import org.apache.cloudstack.api.response.VirtualRouterProviderResponse;
import org.apache.cloudstack.network.element.InternalLoadBalancerElementService;
import org.apache.log4j.Logger;
-import com.cloud.async.AsyncJob;
import com.cloud.event.EventTypes;
import com.cloud.exception.ConcurrentOperationException;
import com.cloud.exception.InsufficientCapacityException;
@@ -41,7 +40,7 @@ import com.cloud.user.Account;
import com.cloud.user.UserContext;
@APICommand(name = "configureInternalLoadBalancerElement", responseObject=VirtualRouterProviderResponse.class,
- description="Configures an internal load balancer element.", since="4.2.0")
+ description="Configures an Internal Load Balancer element.", since="4.2.0")
public class ConfigureInternalLoadBalancerElementCmd extends BaseAsyncCmd {
public static final Logger s_logger = Logger.getLogger(ConfigureInternalLoadBalancerElementCmd.class.getName());
private static final String s_name = "configureinternalloadbalancerelementresponse";
@@ -57,25 +56,18 @@ public class ConfigureInternalLoadBalancerElementCmd extends BaseAsyncCmd {
required=true, description="the ID of the internal lb provider")
private Long id;
- @Parameter(name=ApiConstants.ENABLED, type=CommandType.BOOLEAN, required=true, description="Enables/Disables the Internal load balancer element")
+ @Parameter(name=ApiConstants.ENABLED, type=CommandType.BOOLEAN, required=true, description="Enables/Disables the Internal Load Balancer element")
private Boolean enabled;
/////////////////////////////////////////////////////
/////////////////// Accessors ///////////////////////
/////////////////////////////////////////////////////
- public void setId(Long id) {
- this.id = id;
- }
public Long getId() {
return id;
}
- public void setEnabled(Boolean enabled) {
- this.enabled = enabled;
- }
-
public Boolean getEnabled() {
return enabled;
}
@@ -89,10 +81,6 @@ public class ConfigureInternalLoadBalancerElementCmd extends BaseAsyncCmd {
return s_name;
}
- public static String getResultObjectName() {
- return "boolean";
- }
-
@Override
public long getEntityOwnerId() {
return Account.ACCOUNT_ID_SYSTEM;
@@ -108,20 +96,12 @@ public class ConfigureInternalLoadBalancerElementCmd extends BaseAsyncCmd {
return "configuring internal load balancer element: " + id;
}
- public AsyncJob.Type getInstanceType() {
- return AsyncJob.Type.None;
- }
-
- public Long getInstanceId() {
- return id;
- }
-
@Override
public void execute() throws ConcurrentOperationException, ResourceUnavailableException, InsufficientCapacityException{
s_logger.debug("hello alena");
UserContext.current().setEventDetails("Internal load balancer element: " + id);
s_logger.debug("hello alena");
- VirtualRouterProvider result = _service.get(0).configure(this);
+ VirtualRouterProvider result = _service.get(0).configureInternalLoadBalancerElement(getId(), getEnabled());
s_logger.debug("hello alena");
if (result != null){
VirtualRouterProviderResponse routerResponse = _responseGenerator.createVirtualRouterProviderResponse(result);
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/c113ea18/api/src/org/apache/cloudstack/api/command/admin/internallb/CreateInternalLoadBalancerElementCmd.java
----------------------------------------------------------------------
diff --git a/api/src/org/apache/cloudstack/api/command/admin/internallb/CreateInternalLoadBalancerElementCmd.java b/api/src/org/apache/cloudstack/api/command/admin/internallb/CreateInternalLoadBalancerElementCmd.java
index ec6305e..32c47bc 100644
--- a/api/src/org/apache/cloudstack/api/command/admin/internallb/CreateInternalLoadBalancerElementCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/admin/internallb/CreateInternalLoadBalancerElementCmd.java
@@ -83,7 +83,7 @@ public class CreateInternalLoadBalancerElementCmd extends BaseAsyncCreateCmd {
@Override
public void execute(){
UserContext.current().setEventDetails("Virtual router element Id: "+getEntityId());
- VirtualRouterProvider result = _service.get(0).getCreatedElement(getEntityId());
+ VirtualRouterProvider result = _service.get(0).getInternalLoadBalancerElement(getEntityId());
if (result != null) {
VirtualRouterProviderResponse response = _responseGenerator.createVirtualRouterProviderResponse(result);
response.setResponseName(getCommandName());
@@ -95,7 +95,7 @@ public class CreateInternalLoadBalancerElementCmd extends BaseAsyncCreateCmd {
@Override
public void create() throws ResourceAllocationException {
- VirtualRouterProvider result = _service.get(0).addElement(getNspId());
+ VirtualRouterProvider result = _service.get(0).addInternalLoadBalancerElement(getNspId());
if (result != null) {
setEntityId(result.getId());
setEntityUuid(result.getUuid());
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/c113ea18/api/src/org/apache/cloudstack/api/command/admin/internallb/ListInternalLoadBalancerElementsCmd.java
----------------------------------------------------------------------
diff --git a/api/src/org/apache/cloudstack/api/command/admin/internallb/ListInternalLoadBalancerElementsCmd.java b/api/src/org/apache/cloudstack/api/command/admin/internallb/ListInternalLoadBalancerElementsCmd.java
index 56e99fb..122c233 100644
--- a/api/src/org/apache/cloudstack/api/command/admin/internallb/ListInternalLoadBalancerElementsCmd.java
+++ b/api/src/org/apache/cloudstack/api/command/admin/internallb/ListInternalLoadBalancerElementsCmd.java
@@ -39,14 +39,14 @@ import com.cloud.exception.ResourceAllocationException;
import com.cloud.exception.ResourceUnavailableException;
import com.cloud.network.VirtualRouterProvider;
-@APICommand(name = "listInternalLoadBalancerElements", description="Lists all available internal load balancer elements.",
+@APICommand(name = "listInternalLoadBalancerElements", description="Lists all available Internal Load Balancer elements.",
responseObject=VirtualRouterProviderResponse.class, since="4.2.0")
public class ListInternalLoadBalancerElementsCmd extends BaseListCmd {
public static final Logger s_logger = Logger.getLogger(ListNetworkOfferingsCmd.class.getName());
private static final String _name = "listinternalloadbalancerelementsresponse";
@Inject
- private List<InternalLoadBalancerElementService> _service;
+ private InternalLoadBalancerElementService _service;
/////////////////////////////////////////////////////
//////////////// API parameters /////////////////////
@@ -66,26 +66,14 @@ public class ListInternalLoadBalancerElementsCmd extends BaseListCmd {
/////////////////// Accessors ///////////////////////
/////////////////////////////////////////////////////
- public void setId(Long id) {
- this.id = id;
- }
-
public Long getId() {
return id;
}
- public void setNspId(Long nspId) {
- this.nspId = nspId;
- }
-
public Long getNspId() {
return nspId;
}
- public void setEnabled(Boolean enabled) {
- this.enabled = enabled;
- }
-
public Boolean getEnabled() {
return enabled;
}
@@ -97,7 +85,7 @@ public class ListInternalLoadBalancerElementsCmd extends BaseListCmd {
@Override
public void execute() throws ResourceUnavailableException, InsufficientCapacityException, ServerApiException, ConcurrentOperationException, ResourceAllocationException {
- List<? extends VirtualRouterProvider> providers = _service.get(0).searchForInternalLoadBalancerElements(this);
+ List<? extends VirtualRouterProvider> providers = _service.searchForInternalLoadBalancerElements(getId(), getNspId(), getEnabled());
ListResponse<VirtualRouterProviderResponse> response = new ListResponse<VirtualRouterProviderResponse>();
List<VirtualRouterProviderResponse> providerResponses = new ArrayList<VirtualRouterProviderResponse>();
for (VirtualRouterProvider provider : providers) {
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/c113ea18/api/src/org/apache/cloudstack/network/element/InternalLoadBalancerElementService.java
----------------------------------------------------------------------
diff --git a/api/src/org/apache/cloudstack/network/element/InternalLoadBalancerElementService.java b/api/src/org/apache/cloudstack/network/element/InternalLoadBalancerElementService.java
index b05e759..33a0c64 100644
--- a/api/src/org/apache/cloudstack/network/element/InternalLoadBalancerElementService.java
+++ b/api/src/org/apache/cloudstack/network/element/InternalLoadBalancerElementService.java
@@ -18,15 +18,39 @@ package org.apache.cloudstack.network.element;
import java.util.List;
-import org.apache.cloudstack.api.command.admin.internallb.ConfigureInternalLoadBalancerElementCmd;
-import org.apache.cloudstack.api.command.admin.internallb.ListInternalLoadBalancerElementsCmd;
import com.cloud.network.VirtualRouterProvider;
import com.cloud.utils.component.PluggableService;
public interface InternalLoadBalancerElementService extends PluggableService{
- VirtualRouterProvider configure(ConfigureInternalLoadBalancerElementCmd cmd);
- VirtualRouterProvider addElement(Long nspId);
- VirtualRouterProvider getCreatedElement(long id);
- List<? extends VirtualRouterProvider> searchForInternalLoadBalancerElements(ListInternalLoadBalancerElementsCmd cmd);
+ /**
+ * Configures existing Internal Load Balancer Element (enables or disables it)
+ * @param id
+ * @param enable
+ * @return
+ */
+ VirtualRouterProvider configureInternalLoadBalancerElement(long id, boolean enable);
+
+ /**
+ * Adds Internal Load Balancer element to the Network Service Provider
+ * @param ntwkSvcProviderId
+ * @return
+ */
+ VirtualRouterProvider addInternalLoadBalancerElement(long ntwkSvcProviderId);
+
+ /**
+ * Retrieves existing Internal Load Balancer element
+ * @param id
+ * @return
+ */
+ VirtualRouterProvider getInternalLoadBalancerElement(long id);
+
+ /**
+ * Searches for existing Internal Load Balancer elements based on parameters passed to the call
+ * @param id
+ * @param ntwkSvsProviderId
+ * @param enabled
+ * @return
+ */
+ List<? extends VirtualRouterProvider> searchForInternalLoadBalancerElements(Long id, Long ntwkSvsProviderId, Boolean enabled);
}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/c113ea18/plugins/network-elements/internal-loadbalancer/src/org/apache/cloudstack/network/element/InternalLoadBalancerElement.java
----------------------------------------------------------------------
diff --git a/plugins/network-elements/internal-loadbalancer/src/org/apache/cloudstack/network/element/InternalLoadBalancerElement.java b/plugins/network-elements/internal-loadbalancer/src/org/apache/cloudstack/network/element/InternalLoadBalancerElement.java
index 0c662a8..1067bd5 100644
--- a/plugins/network-elements/internal-loadbalancer/src/org/apache/cloudstack/network/element/InternalLoadBalancerElement.java
+++ b/plugins/network-elements/internal-loadbalancer/src/org/apache/cloudstack/network/element/InternalLoadBalancerElement.java
@@ -85,6 +85,7 @@ import com.cloud.vm.dao.DomainRouterDao;
public class InternalLoadBalancerElement extends AdapterBase implements LoadBalancingServiceProvider, InternalLoadBalancerElementService, IpDeployer{
private static final Logger s_logger = Logger.getLogger(InternalLoadBalancerElement.class);
protected static final Map<Service, Map<Capability, String>> capabilities = setCapabilities();
+ private static InternalLoadBalancerElement internalLbElement = null;
@Inject NetworkModel _ntwkModel;
@Inject NetworkServiceMapDao _ntwkSrvcDao;
@@ -95,6 +96,16 @@ public class InternalLoadBalancerElement extends AdapterBase implements LoadBala
@Inject ConfigurationManager _configMgr;
@Inject AccountManager _accountMgr;
+ protected InternalLoadBalancerElement() {
+ }
+
+ public static InternalLoadBalancerElement getInstance() {
+ if ( internalLbElement == null) {
+ internalLbElement = new InternalLoadBalancerElement();
+ }
+ return internalLbElement;
+ }
+
private boolean canHandle(Network config, List<LoadBalancingRule> rules) {
//works in Advance zone only
DataCenter dc = _configMgr.getZone(config.getDataCenterId());
@@ -405,40 +416,40 @@ public class InternalLoadBalancerElement extends AdapterBase implements LoadBala
}
@Override
- public VirtualRouterProvider configure(ConfigureInternalLoadBalancerElementCmd cmd) {
- VirtualRouterProviderVO element = _vrProviderDao.findById(cmd.getId());
+ public VirtualRouterProvider configureInternalLoadBalancerElement(long id, boolean enable) {
+ VirtualRouterProviderVO element = _vrProviderDao.findById(id);
if (element == null || element.getType() != VirtualRouterProviderType.InternalLbVm) {
- s_logger.debug("Can't find " + this.getName() + " element with network service provider id " + cmd.getId() +
+ s_logger.debug("Can't find " + this.getName() + " element with network service provider id " + id +
" to be used as a provider for " + this.getName());
return null;
}
- element.setEnabled(cmd.getEnabled());
+ element.setEnabled(enable);
_vrProviderDao.persist(element);
return element;
}
@Override
- public VirtualRouterProvider addElement(Long nspId) {
- VirtualRouterProviderVO element = _vrProviderDao.findByNspIdAndType(nspId, VirtualRouterProviderType.InternalLbVm);
+ public VirtualRouterProvider addInternalLoadBalancerElement(long ntwkSvcProviderId) {
+ VirtualRouterProviderVO element = _vrProviderDao.findByNspIdAndType(ntwkSvcProviderId, VirtualRouterProviderType.InternalLbVm);
if (element != null) {
- s_logger.debug("There is already an " + this.getName() + " with service provider id " + nspId);
+ s_logger.debug("There is already an " + this.getName() + " with service provider id " + ntwkSvcProviderId);
return null;
}
- PhysicalNetworkServiceProvider provider = _pNtwkSvcProviderDao.findById(nspId);
+ PhysicalNetworkServiceProvider provider = _pNtwkSvcProviderDao.findById(ntwkSvcProviderId);
if (provider == null || !provider.getProviderName().equalsIgnoreCase(this.getName())) {
throw new InvalidParameterValueException("Invalid network service provider is specified");
}
- element = new VirtualRouterProviderVO(nspId, VirtualRouterProviderType.InternalLbVm);
+ element = new VirtualRouterProviderVO(ntwkSvcProviderId, VirtualRouterProviderType.InternalLbVm);
_vrProviderDao.persist(element);
return element;
}
@Override
- public VirtualRouterProvider getCreatedElement(long id) {
+ public VirtualRouterProvider getInternalLoadBalancerElement(long id) {
VirtualRouterProvider provider = _vrProviderDao.findById(id);
if (provider.getType() != VirtualRouterProviderType.InternalLbVm) {
throw new InvalidParameterValueException("Unable to find " + this.getName() + " by id");
@@ -447,17 +458,14 @@ public class InternalLoadBalancerElement extends AdapterBase implements LoadBala
}
@Override
- public List<? extends VirtualRouterProvider> searchForInternalLoadBalancerElements(ListInternalLoadBalancerElementsCmd cmd) {
- Long id = cmd.getId();
- Long nspId = cmd.getNspId();
- Boolean enabled = cmd.getEnabled();
+ public List<? extends VirtualRouterProvider> searchForInternalLoadBalancerElements(Long id, Long ntwkSvsProviderId, Boolean enabled) {
SearchCriteriaService<VirtualRouterProviderVO, VirtualRouterProviderVO> sc = SearchCriteria2.create(VirtualRouterProviderVO.class);
if (id != null) {
sc.addAnd(sc.getEntity().getId(), Op.EQ, id);
}
- if (nspId != null) {
- sc.addAnd(sc.getEntity().getNspId(), Op.EQ, nspId);
+ if (ntwkSvsProviderId != null) {
+ sc.addAnd(sc.getEntity().getNspId(), Op.EQ, ntwkSvsProviderId);
}
if (enabled != null) {
sc.addAnd(sc.getEntity().isEnabled(), Op.EQ, enabled);
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/c113ea18/plugins/network-elements/internal-loadbalancer/src/org/apache/cloudstack/network/lb/InternalLoadBalancerManager.java
----------------------------------------------------------------------
diff --git a/plugins/network-elements/internal-loadbalancer/src/org/apache/cloudstack/network/lb/InternalLoadBalancerManager.java b/plugins/network-elements/internal-loadbalancer/src/org/apache/cloudstack/network/lb/InternalLoadBalancerManager.java
index 0d817de..b869b2a 100644
--- a/plugins/network-elements/internal-loadbalancer/src/org/apache/cloudstack/network/lb/InternalLoadBalancerManager.java
+++ b/plugins/network-elements/internal-loadbalancer/src/org/apache/cloudstack/network/lb/InternalLoadBalancerManager.java
@@ -108,6 +108,12 @@ public interface InternalLoadBalancerManager extends Manager{
throws ResourceUnavailableException;
+ /**
+ * Returns existing Internal Load Balancer elements based on guestNetworkId (requried) and requestedIp (optional)
+ * @param guestNetworkId
+ * @param requestedGuestIp
+ * @return
+ */
List<DomainRouterVO> findInternalLbVms(long guestNetworkId, Ip requestedGuestIp);
}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/c113ea18/server/src/com/cloud/network/NetworkManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/network/NetworkManagerImpl.java b/server/src/com/cloud/network/NetworkManagerImpl.java
index 85d0d9e..86bcedd 100755
--- a/server/src/com/cloud/network/NetworkManagerImpl.java
+++ b/server/src/com/cloud/network/NetworkManagerImpl.java
@@ -165,7 +165,6 @@ import com.cloud.utils.Journal;
import com.cloud.utils.NumbersUtil;
import com.cloud.utils.Pair;
import com.cloud.utils.component.AdapterBase;
-import com.cloud.utils.component.ComponentContext;
import com.cloud.utils.component.ManagerBase;
import com.cloud.utils.concurrency.NamedThreadFactory;
import com.cloud.utils.db.DB;
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/c113ea18/server/src/com/cloud/network/NetworkServiceImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/network/NetworkServiceImpl.java b/server/src/com/cloud/network/NetworkServiceImpl.java
index 60b700f..c8fa66e 100755
--- a/server/src/com/cloud/network/NetworkServiceImpl.java
+++ b/server/src/com/cloud/network/NetworkServiceImpl.java
@@ -43,6 +43,7 @@ import org.apache.cloudstack.api.command.user.network.CreateNetworkCmd;
import org.apache.cloudstack.api.command.user.network.ListNetworksCmd;
import org.apache.cloudstack.api.command.user.network.RestartNetworkCmd;
import org.apache.cloudstack.api.command.user.vm.ListNicsCmd;
+import org.apache.cloudstack.network.element.InternalLoadBalancerElementService;
import org.apache.log4j.Logger;
import org.springframework.stereotype.Component;
@@ -258,6 +259,8 @@ public class NetworkServiceImpl extends ManagerBase implements NetworkService {
HostDao _hostDao;
@Inject
HostPodDao _hostPodDao;
+ @Inject
+ InternalLoadBalancerElementService _internalLbElementSvc;
int _cidrLimit;
boolean _allowSubdomainNetworkAccess;
@@ -2256,6 +2259,9 @@ public class NetworkServiceImpl extends ManagerBase implements NetworkService {
// add baremetal as the defualt network service provider
/* addDefaultBaremetalProvidersToPhysicalNetwork(pNetwork.getId()); */
+ //Add Internal Load Balancer element as a default network service provider
+ addDefaultInternalLbProviderToPhysicalNetwork(pNetwork.getId());
+
txn.commit();
return pNetwork;
} catch (Exception ex) {
@@ -3081,6 +3087,22 @@ public class NetworkServiceImpl extends ManagerBase implements NetworkService {
return nsp;
}
+
+
+ protected PhysicalNetworkServiceProvider addDefaultInternalLbProviderToPhysicalNetwork(long physicalNetworkId) {
+
+ PhysicalNetworkServiceProvider nsp = addProviderToPhysicalNetwork(physicalNetworkId,
+ Network.Provider.InternalLbVm.getName(), null, null);
+
+ NetworkElement networkElement = _networkModel.getElementImplementingProvider(Network.Provider.InternalLbVm.getName());
+ if (networkElement == null) {
+ throw new CloudRuntimeException("Unable to find the Network Element implementing the " + Network.Provider.InternalLbVm.getName() + " Provider");
+ }
+
+ _internalLbElementSvc.addInternalLoadBalancerElement(nsp.getId());
+
+ return nsp;
+ }
protected PhysicalNetworkServiceProvider addDefaultSecurityGroupProviderToPhysicalNetwork(long physicalNetworkId) {