From bb73531fed72cc81012624fd3bae5ec22d23daa2 Mon Sep 17 00:00:00 2001 From: Alena Prokharchyk Date: Fri, 12 Apr 2013 15:13:55 -0700 Subject: [PATCH] Internal Lb: list internal lb vms as a part of listRouters response. Introduced new parameter - role (can be virtual_router or internal_lb_vm) --- .../org/apache/cloudstack/api/BaseCmd.java | 3 + .../command/admin/router/ListRoutersCmd.java | 7 ++ .../api/response/DomainRouterResponse.java | 13 ++- .../element/InternalLoadBalancerElement.java | 13 ++- .../lb/InternalLoadBalancerManager.java | 37 +----- .../lb/InternalLoadBalancerManagerImpl.java | 33 ++++-- .../com/cloud/api/query/QueryManagerImpl.java | 16 +-- .../query/dao/DomainRouterJoinDaoImpl.java | 2 + .../api/query/vo/DomainRouterJoinVO.java | 17 ++- setup/db/db/schema-410to420.sql | 106 ++++++++++++++++++ 10 files changed, 180 insertions(+), 67 deletions(-) diff --git a/api/src/org/apache/cloudstack/api/BaseCmd.java b/api/src/org/apache/cloudstack/api/BaseCmd.java index 9030d227fd6..60fa9ba9a75 100644 --- a/api/src/org/apache/cloudstack/api/BaseCmd.java +++ b/api/src/org/apache/cloudstack/api/BaseCmd.java @@ -28,6 +28,7 @@ import java.util.regex.Pattern; import javax.inject.Inject; import org.apache.cloudstack.affinity.AffinityGroupService; +import org.apache.cloudstack.network.element.InternalLoadBalancerElementService; import org.apache.cloudstack.network.lb.ApplicationLoadBalancerService; import org.apache.cloudstack.query.QueryService; import org.apache.cloudstack.usage.UsageService; @@ -139,6 +140,8 @@ public abstract class BaseCmd { @Inject public NetworkModel _ntwkModel; @Inject public ApplicationLoadBalancerService _appLbService; @Inject public AffinityGroupService _affinityGroupService; + @Inject public InternalLoadBalancerElementService _internalLbSvs; + public abstract void execute() throws ResourceUnavailableException, InsufficientCapacityException, ServerApiException, ConcurrentOperationException, ResourceAllocationException, NetworkRuleConflictException; diff --git a/api/src/org/apache/cloudstack/api/command/admin/router/ListRoutersCmd.java b/api/src/org/apache/cloudstack/api/command/admin/router/ListRoutersCmd.java index d2b26c0ac8f..842061200bb 100644 --- a/api/src/org/apache/cloudstack/api/command/admin/router/ListRoutersCmd.java +++ b/api/src/org/apache/cloudstack/api/command/admin/router/ListRoutersCmd.java @@ -74,6 +74,9 @@ public class ListRoutersCmd extends BaseListProjectAndAccountResourcesCmd { @Parameter(name=ApiConstants.FOR_VPC, type=CommandType.BOOLEAN, description="if true is passed for this parameter, list only VPC routers") private Boolean forVpc; + + @Parameter(name=ApiConstants.ROLE, type=CommandType.STRING, description="list routers by role (Virtual_router or Internal_lb_vm)") + private String role; ///////////////////////////////////////////////////// /////////////////// Accessors /////////////////////// @@ -114,6 +117,10 @@ public class ListRoutersCmd extends BaseListProjectAndAccountResourcesCmd { public Boolean getForVpc() { return forVpc; } + + public String getRole() { + return role; + } ///////////////////////////////////////////////////// /////////////// API Implementation/////////////////// diff --git a/api/src/org/apache/cloudstack/api/response/DomainRouterResponse.java b/api/src/org/apache/cloudstack/api/response/DomainRouterResponse.java index b2bc02e9b83..1d31b58a481 100644 --- a/api/src/org/apache/cloudstack/api/response/DomainRouterResponse.java +++ b/api/src/org/apache/cloudstack/api/response/DomainRouterResponse.java @@ -150,8 +150,11 @@ public class DomainRouterResponse extends BaseResponse implements ControlledView @SerializedName("scriptsversion") @Param(description="the version of scripts") private String scriptsVersion; - @SerializedName(ApiConstants.VPC_ID) @Param(description="VPC the network belongs to") + @SerializedName(ApiConstants.VPC_ID) @Param(description="VPC the router belongs to") private String vpcId; + + @SerializedName(ApiConstants.ROLE) @Param(description="role of the domain router") + private String role; @SerializedName("nic") @Param(description="the list of nics associated with the router", responseObject = NicResponse.class, since="4.0") @@ -161,15 +164,11 @@ public class DomainRouterResponse extends BaseResponse implements ControlledView nics = new LinkedHashSet(); } - - @Override public String getObjectId() { return this.getId(); } - - public String getId() { return id; } @@ -361,4 +360,8 @@ public class DomainRouterResponse extends BaseResponse implements ControlledView public void setIp6Dns2(String ip6Dns2) { this.ip6Dns2 = ip6Dns2; } + + public void setRole(String role) { + this.role = role; + } } 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 1067bd57c58..29a0f09de9a 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 @@ -61,6 +61,7 @@ import com.cloud.network.element.NetworkElement; import com.cloud.network.element.VirtualRouterElement; import com.cloud.network.element.VirtualRouterProviderVO; import com.cloud.network.lb.LoadBalancingRule; +import com.cloud.network.router.VirtualRouter; import com.cloud.network.router.VirtualRouter.Role; import com.cloud.network.rules.FirewallRule; import com.cloud.network.rules.LoadBalancerContainer; @@ -169,12 +170,12 @@ public class InternalLoadBalancerElement extends AdapterBase implements LoadBala @Override public boolean shutdown(Network network, ReservationContext context, boolean cleanup) throws ConcurrentOperationException, ResourceUnavailableException { - List internalLbVms = _routerDao.listByNetworkAndRole(network.getId(), Role.INTERNAL_LB_VM); + List internalLbVms = _routerDao.listByNetworkAndRole(network.getId(), Role.INTERNAL_LB_VM); if (internalLbVms == null || internalLbVms.isEmpty()) { return true; } boolean result = true; - for (DomainRouterVO internalLbVm : internalLbVms) { + for (VirtualRouter internalLbVm : internalLbVms) { result = result && _internalLbMgr.destroyInternalLbVm(internalLbVm.getId(), context.getAccount(), context.getCaller().getId()); if (cleanup) { @@ -193,12 +194,12 @@ public class InternalLoadBalancerElement extends AdapterBase implements LoadBala @Override public boolean destroy(Network network, ReservationContext context) throws ConcurrentOperationException, ResourceUnavailableException { - List internalLbVms = _routerDao.listByNetworkAndRole(network.getId(), Role.INTERNAL_LB_VM); + List internalLbVms = _routerDao.listByNetworkAndRole(network.getId(), Role.INTERNAL_LB_VM); if (internalLbVms == null || internalLbVms.isEmpty()) { return true; } boolean result = true; - for (DomainRouterVO internalLbVm : internalLbVms) { + for (VirtualRouter internalLbVm : internalLbVms) { result = result && (_internalLbMgr.destroyInternalLbVm(internalLbVm.getId(), context.getAccount(), context.getCaller().getId())); } @@ -259,7 +260,7 @@ public class InternalLoadBalancerElement extends AdapterBase implements LoadBala for (Ip sourceIp : rulesToApply.keySet()) { if (vmsToDestroy.contains(sourceIp)) { //2.1 Destroy internal lb vm - List vms = _internalLbMgr.findInternalLbVms(network.getId(), sourceIp); + List 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"); @@ -271,7 +272,7 @@ public class InternalLoadBalancerElement extends AdapterBase implements LoadBala } } else { //2.2 Start Internal LB vm per IP address - List internalLbVms; + List internalLbVms; try { DeployDestination dest = new DeployDestination(_configMgr.getZone(network.getDataCenterId()), null, null, null); internalLbVms = _internalLbMgr.deployInternalLbVm(network, sourceIp, dest, _accountMgr.getAccount(network.getAccountId()), null); 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 b869b2aef23..5219775ca12 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 @@ -23,15 +23,12 @@ import com.cloud.deploy.DeployDestination; import com.cloud.exception.ConcurrentOperationException; import com.cloud.exception.InsufficientCapacityException; import com.cloud.exception.ResourceUnavailableException; -import com.cloud.exception.StorageUnavailableException; import com.cloud.network.Network; import com.cloud.network.lb.LoadBalancingRule; import com.cloud.network.router.VirtualRouter; import com.cloud.user.Account; -import com.cloud.user.User; import com.cloud.utils.component.Manager; import com.cloud.utils.net.Ip; -import com.cloud.vm.DomainRouterVO; import com.cloud.vm.VirtualMachineProfile.Param; public interface InternalLoadBalancerManager extends Manager{ @@ -46,20 +43,6 @@ public interface InternalLoadBalancerManager extends Manager{ */ boolean destroyInternalLbVm(long vmId, Account caller, Long callerUserId) throws ResourceUnavailableException, ConcurrentOperationException; - - - /** - * Stops Internal lb vm - * @param vmId - * @param forced - * @param caller - * @param callerUserId - * @return - * @throws ConcurrentOperationException - * @throws ResourceUnavailableException - */ - VirtualRouter stopInternalLbVm(long vmId, boolean forced, Account caller, Long callerUserId) - throws ConcurrentOperationException, ResourceUnavailableException; /** @@ -74,27 +57,11 @@ public interface InternalLoadBalancerManager extends Manager{ * @throws ConcurrentOperationException * @throws ResourceUnavailableException */ - List deployInternalLbVm(Network guestNetwork, Ip requestedGuestIp, DeployDestination dest, Account owner, + List deployInternalLbVm(Network guestNetwork, Ip requestedGuestIp, DeployDestination dest, Account owner, Map params) throws InsufficientCapacityException, ConcurrentOperationException, ResourceUnavailableException; - /** - * Starts Internal lb vm - * @param internalLbVm - * @param user - * @param caller - * @param params - * @return - * @throws StorageUnavailableException - * @throws InsufficientCapacityException - * @throws ConcurrentOperationException - * @throws ResourceUnavailableException - */ - DomainRouterVO startInternalLbVm(DomainRouterVO internalLbVm, User user, Account caller, Map params) - throws StorageUnavailableException, InsufficientCapacityException, ConcurrentOperationException, - ResourceUnavailableException; - /** * @@ -114,6 +81,6 @@ public interface InternalLoadBalancerManager extends Manager{ * @param requestedGuestIp * @return */ - List findInternalLbVms(long guestNetworkId, Ip requestedGuestIp); + List findInternalLbVms(long guestNetworkId, Ip requestedGuestIp); } 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 c371892765a..88b82326613 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,7 +16,6 @@ // 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; @@ -57,6 +56,7 @@ import com.cloud.exception.ConcurrentOperationException; import com.cloud.exception.InsufficientAddressCapacityException; import com.cloud.exception.InsufficientCapacityException; import com.cloud.exception.InsufficientServerCapacityException; +import com.cloud.exception.InvalidParameterValueException; import com.cloud.exception.OperationTimedoutException; import com.cloud.exception.ResourceUnavailableException; import com.cloud.exception.StorageUnavailableException; @@ -117,7 +117,7 @@ import com.cloud.vm.dao.DomainRouterDao; import com.cloud.vm.dao.NicDao; @Component -@Local(value = { InternalLoadBalancerManager.class }) +@Local(value = { InternalLoadBalancerManager.class}) public class InternalLoadBalancerManagerImpl extends ManagerBase implements InternalLoadBalancerManager, VirtualMachineGuru { private static final Logger s_logger = Logger @@ -539,8 +539,8 @@ InternalLoadBalancerManager, VirtualMachineGuru { return _itMgr.expunge(internalLbVm, _accountMgr.getActiveUser(callerUserId), caller); } - @Override - public VirtualRouter stopInternalLbVm(long vmId, boolean forced, Account caller, Long callerUserId) throws ConcurrentOperationException, ResourceUnavailableException { + + protected VirtualRouter stopInternalLbVm(long vmId, boolean forced, Account caller, long callerUserId) throws ConcurrentOperationException, ResourceUnavailableException { DomainRouterVO internalLbVm = _routerDao.findById(vmId); if (internalLbVm == null) { return null; @@ -579,7 +579,7 @@ InternalLoadBalancerManager, VirtualMachineGuru { for (DomainRouterVO internalLbVm : internalLbVms) { if (internalLbVm.getState() != VirtualMachine.State.Running) { - internalLbVm = startInternalLbVm(internalLbVm, _accountMgr.getSystemUser(), _accountMgr.getSystemAccount(), params); + internalLbVm = startInternalLbVm(internalLbVm, _accountMgr.getSystemUser(), _accountMgr.getSystemAccount(), User.UID_SYSTEM, params); } if (internalLbVm != null) { @@ -686,7 +686,7 @@ InternalLoadBalancerManager, VirtualMachineGuru { s_logger.debug("Adding nic for Internal LB vm in Control network "); List offerings = _ntwkModel.getSystemAccountNetworkOfferings(NetworkOffering.SystemControlNetwork); NetworkOffering controlOffering = offerings.get(0); - NetworkVO controlConfig = _ntwkMgr.setupNetwork(_accountMgr.getAccount(Account.ACCOUNT_ID_SYSTEM), controlOffering, plan, null, null, false).get(0); + NetworkVO controlConfig = _ntwkMgr.setupNetwork(_accountMgr.getSystemAccount(), controlOffering, plan, null, null, false).get(0); networks.add(new Pair(controlConfig, null)); return networks; @@ -769,14 +769,14 @@ InternalLoadBalancerManager, VirtualMachineGuru { if (startVm) { try { - internalLbVm = startInternalLbVm(internalLbVm, _accountMgr.getSystemUser(), _accountMgr.getSystemAccount(), params); + internalLbVm = startInternalLbVm(internalLbVm, _accountMgr.getSystemUser(), _accountMgr.getSystemAccount(), User.UID_SYSTEM, params); break; } catch (InsufficientCapacityException ex) { if (startRetry < 2 && iter.hasNext()) { s_logger.debug("Failed to start the Internal lb vm " + internalLbVm + " with hypervisor type " + hType + ", " + "destroying it and recreating one more time"); // destroy the internal lb vm - destroyInternalLbVm(internalLbVm.getId(), _accountMgr.getAccount(Account.ACCOUNT_ID_SYSTEM), User.UID_SYSTEM); + destroyInternalLbVm(internalLbVm.getId(), _accountMgr.getSystemAccount(), User.UID_SYSTEM); continue; } else { throw ex; @@ -793,10 +793,10 @@ InternalLoadBalancerManager, VirtualMachineGuru { } - @Override - public DomainRouterVO startInternalLbVm(DomainRouterVO internalLbVm, User user, Account caller, Map params) + + protected DomainRouterVO startInternalLbVm(DomainRouterVO internalLbVm, User user, Account caller, long callerUserId, Map params) throws StorageUnavailableException, InsufficientCapacityException, - ConcurrentOperationException, ResourceUnavailableException { + ConcurrentOperationException, ResourceUnavailableException { s_logger.debug("Starting Internal LB VM " + internalLbVm); if (_itMgr.start(internalLbVm, params, user, caller, null) != null) { if (internalLbVm.isStopPending()) { @@ -887,4 +887,15 @@ InternalLoadBalancerManager, VirtualMachineGuru { } return result; } + + + protected VirtualRouter startInternalLbVm(long vmId, Account caller, long callerUserId) throws StorageUnavailableException, InsufficientCapacityException, + ConcurrentOperationException, ResourceUnavailableException { + DomainRouterVO vm = _routerDao.findById(vmId); + if (vm == null || vm.getRole() != VirtualRouter.Role.INTERNAL_LB_VM) { + throw new InvalidParameterValueException("Unable to find internal lb vm by id"); + } + + return startInternalLbVm(vm, _accountMgr.getSystemUser(), _accountMgr.getSystemAccount(), callerUserId, null); + } } diff --git a/server/src/com/cloud/api/query/QueryManagerImpl.java b/server/src/com/cloud/api/query/QueryManagerImpl.java index a498c183af5..2bc06c032b7 100644 --- a/server/src/com/cloud/api/query/QueryManagerImpl.java +++ b/server/src/com/cloud/api/query/QueryManagerImpl.java @@ -25,12 +25,9 @@ import java.util.Set; import javax.ejb.Local; import javax.inject.Inject; -import javax.naming.ConfigurationException; -import org.apache.cloudstack.affinity.AffinityGroup; import org.apache.cloudstack.affinity.AffinityGroupResponse; import org.apache.cloudstack.affinity.AffinityGroupVMMapVO; -import org.apache.cloudstack.affinity.AffinityGroupVO; import org.apache.cloudstack.affinity.dao.AffinityGroupVMMapDao; import org.apache.cloudstack.api.command.admin.host.ListHostsCmd; import org.apache.cloudstack.api.command.admin.router.ListRoutersCmd; @@ -111,7 +108,6 @@ import com.cloud.api.query.vo.UserAccountJoinVO; import com.cloud.api.query.vo.UserVmJoinVO; import com.cloud.api.query.vo.VolumeJoinVO; import com.cloud.configuration.dao.ConfigurationDao; -import com.cloud.dc.DataCenterVO; import com.cloud.domain.Domain; import com.cloud.domain.DomainVO; import com.cloud.domain.dao.DomainDao; @@ -124,9 +120,9 @@ import com.cloud.hypervisor.Hypervisor.HypervisorType; import com.cloud.network.security.SecurityGroupVMMapVO; import com.cloud.network.security.dao.SecurityGroupVMMapDao; import com.cloud.org.Grouping; -import com.cloud.projects.ProjectInvitation; -import com.cloud.projects.Project.ListProjectResourcesCriteria; import com.cloud.projects.Project; +import com.cloud.projects.Project.ListProjectResourcesCriteria; +import com.cloud.projects.ProjectInvitation; import com.cloud.projects.ProjectManager; import com.cloud.projects.dao.ProjectAccountDao; import com.cloud.projects.dao.ProjectDao; @@ -142,10 +138,8 @@ import com.cloud.user.dao.AccountDao; import com.cloud.utils.DateUtil; import com.cloud.utils.Pair; import com.cloud.utils.Ternary; -import com.cloud.utils.component.Manager; import com.cloud.utils.component.ManagerBase; import com.cloud.utils.db.Filter; -import com.cloud.utils.db.JoinBuilder; import com.cloud.utils.db.SearchBuilder; import com.cloud.utils.db.SearchCriteria; import com.cloud.utils.db.SearchCriteria.Func; @@ -989,6 +983,7 @@ public class QueryManagerImpl extends ManagerBase implements QueryService { Long networkId = cmd.getNetworkId(); Long vpcId = cmd.getVpcId(); Boolean forVpc = cmd.getForVpc(); + String role = cmd.getRole(); Account caller = UserContext.current().getCaller(); List permittedAccounts = new ArrayList(); @@ -1018,6 +1013,7 @@ public class QueryManagerImpl extends ManagerBase implements QueryService { sb.and("podId", sb.entity().getPodId(), SearchCriteria.Op.EQ); sb.and("hostId", sb.entity().getHostId(), SearchCriteria.Op.EQ); sb.and("vpcId", sb.entity().getVpcId(), SearchCriteria.Op.EQ); + sb.and("role", sb.entity().getRole(), SearchCriteria.Op.EQ); if (forVpc != null) { if (forVpc) { @@ -1074,6 +1070,10 @@ public class QueryManagerImpl extends ManagerBase implements QueryService { if (vpcId != null) { sc.setParameters("vpcId", vpcId); } + + if (role != null) { + sc.setParameters("role", role); + } // search VR details by ids Pair, Integer> uniqueVrPair = _routerJoinDao.searchAndCount(sc, searchFilter); diff --git a/server/src/com/cloud/api/query/dao/DomainRouterJoinDaoImpl.java b/server/src/com/cloud/api/query/dao/DomainRouterJoinDaoImpl.java index 488c4e494e1..2c021801cde 100644 --- a/server/src/com/cloud/api/query/dao/DomainRouterJoinDaoImpl.java +++ b/server/src/com/cloud/api/query/dao/DomainRouterJoinDaoImpl.java @@ -155,6 +155,8 @@ public class DomainRouterJoinDaoImpl extends GenericDaoBase