diff --git a/server/resources/META-INF/cloudstack/core/spring-server-core-managers-context.xml b/server/resources/META-INF/cloudstack/core/spring-server-core-managers-context.xml index 902026a63bf..ffd5eec15d5 100644 --- a/server/resources/META-INF/cloudstack/core/spring-server-core-managers-context.xml +++ b/server/resources/META-INF/cloudstack/core/spring-server-core-managers-context.xml @@ -182,6 +182,7 @@ + diff --git a/server/src/com/cloud/network/element/VirtualRouterElement.java b/server/src/com/cloud/network/element/VirtualRouterElement.java index eee4892b66e..efc044bb3c8 100755 --- a/server/src/com/cloud/network/element/VirtualRouterElement.java +++ b/server/src/com/cloud/network/element/VirtualRouterElement.java @@ -125,6 +125,7 @@ public class VirtualRouterElement extends AdapterBase implements VirtualRouterEl LoadBalancingRulesManager _lbMgr; @Inject NetworkOfferingDao _networkOfferingDao; + @Inject VpcVirtualNetworkApplianceManager _routerMgr; @Inject diff --git a/server/src/com/cloud/network/router/NetworkGeneralHelper.java b/server/src/com/cloud/network/router/NetworkGeneralHelper.java index db6f4bc0f35..dab3c66e369 100644 --- a/server/src/com/cloud/network/router/NetworkGeneralHelper.java +++ b/server/src/com/cloud/network/router/NetworkGeneralHelper.java @@ -147,7 +147,7 @@ public class NetworkGeneralHelper { } -// @Override + // @Override public boolean sendCommandsToRouter(final VirtualRouter router, final Commands cmds) throws AgentUnavailableException { if(!checkRouterVersion(router)){ s_logger.debug("Router requires upgrade. Unable to send command to router:" + router.getId() + ", router template version : " + router.getTemplateVersion() @@ -184,14 +184,14 @@ public class NetworkGeneralHelper { } -// @Override - public NicTO getNicTO(final VirtualRouter router, Long networkId, String broadcastUri) { + // @Override + public NicTO getNicTO(final VirtualRouter router, final Long networkId, final String broadcastUri) { NicProfile nicProfile = _networkModel.getNicProfile(router, networkId, broadcastUri); return _itMgr.toNicTO(nicProfile, router.getHypervisorType()); } -// @Override + // @Override public VirtualRouter destroyRouter(final long routerId, final Account caller, final Long callerUserId) throws ResourceUnavailableException, ConcurrentOperationException { if (s_logger.isDebugEnabled()) { @@ -216,7 +216,7 @@ public class NetworkGeneralHelper { * @param router * @return */ -// @Override + // @Override public boolean checkRouterVersion(final VirtualRouter router) { if(!VirtualNetworkApplianceManagerImpl.routerVersionCheckEnabled.value()){ //Router version check is disabled. @@ -252,11 +252,12 @@ public class NetworkGeneralHelper { return _routerDao.findById(router.getId()); } - protected DomainRouterVO waitRouter(DomainRouterVO router) { + protected DomainRouterVO waitRouter(final DomainRouterVO router) { DomainRouterVO vm = _routerDao.findById(router.getId()); - if (s_logger.isDebugEnabled()) + if (s_logger.isDebugEnabled()) { s_logger.debug("Router " + router.getInstanceName() + " is not fully up yet, we will wait"); + } while (vm.getState() == State.Starting) { try { Thread.sleep(1000); @@ -268,8 +269,9 @@ public class NetworkGeneralHelper { } if (vm.getState() == State.Running) { - if (s_logger.isDebugEnabled()) + if (s_logger.isDebugEnabled()) { s_logger.debug("Router " + router.getInstanceName() + " is now fully up"); + } return router; } @@ -279,7 +281,7 @@ public class NetworkGeneralHelper { } -// @Override + // @Override public List startRouters(final Map params, final List routers) throws StorageUnavailableException, InsufficientCapacityException, ConcurrentOperationException, ResourceUnavailableException { List runningRouters = null; @@ -309,13 +311,13 @@ public class NetworkGeneralHelper { return runningRouters; } -// @Override - public DomainRouterVO startVirtualRouter(DomainRouterVO router, User user, Account caller, Map params) + // @Override + public DomainRouterVO startVirtualRouter(final DomainRouterVO router, final User user, final Account caller, final Map params) throws StorageUnavailableException, InsufficientCapacityException, - ConcurrentOperationException, ResourceUnavailableException { + ConcurrentOperationException, ResourceUnavailableException { if (router.getRole() != Role.VIRTUAL_ROUTER || !router.getIsRedundantRouter()) { - return this.start(router, user, caller, params, null); + return start(router, user, caller, params, null); } if (router.getState() == State.Running) { @@ -355,7 +357,7 @@ public class NetworkGeneralHelper { } } if (routerToBeAvoid == null) { - return this.start(router, user, caller, params, null); + return start(router, user, caller, params, null); } // We would try best to deploy the router to another place final int retryIndex = 5; @@ -380,7 +382,7 @@ public class NetworkGeneralHelper { } plan.setAvoids(avoids[i]); try { - result = this.start(router, user, caller, params, plan); + result = start(router, user, caller, params, plan); } catch (final InsufficientServerCapacityException ex) { result = null; } @@ -392,14 +394,14 @@ public class NetworkGeneralHelper { } -// @Override + // @Override public DomainRouterVO deployRouter(final RouterDeploymentDefinition routerDeploymentDefinition, - VirtualRouterProvider vrProvider, long svcOffId, - LinkedHashMap> networks, - boolean startRouter, List supportedHypervisors) - throws InsufficientAddressCapacityException, - InsufficientServerCapacityException, InsufficientCapacityException, - StorageUnavailableException, ResourceUnavailableException { + final VirtualRouterProvider vrProvider, final long svcOffId, + final LinkedHashMap> networks, + final boolean startRouter, final List supportedHypervisors) + throws InsufficientAddressCapacityException, + InsufficientServerCapacityException, InsufficientCapacityException, + StorageUnavailableException, ResourceUnavailableException { final ServiceOfferingVO routerOffering = _serviceOfferingDao.findById(svcOffId); final DeployDestination dest = routerDeploymentDefinition.getDest(); @@ -422,23 +424,23 @@ public class NetworkGeneralHelper { String templateName = null; switch (hType) { - case XenServer: - templateName = VirtualNetworkApplianceManager.RouterTemplateXen.valueIn(dest.getDataCenter().getId()); - break; - case KVM: - templateName = VirtualNetworkApplianceManager.RouterTemplateKvm.valueIn(dest.getDataCenter().getId()); - break; - case VMware: - templateName = VirtualNetworkApplianceManager.RouterTemplateVmware.valueIn(dest.getDataCenter().getId()); - break; - case Hyperv: - templateName = VirtualNetworkApplianceManager.RouterTemplateHyperV.valueIn(dest.getDataCenter().getId()); - break; - case LXC: - templateName = VirtualNetworkApplianceManager.RouterTemplateLxc.valueIn(dest.getDataCenter().getId()); - break; - default: - break; + case XenServer: + templateName = VirtualNetworkApplianceManager.RouterTemplateXen.valueIn(dest.getDataCenter().getId()); + break; + case KVM: + templateName = VirtualNetworkApplianceManager.RouterTemplateKvm.valueIn(dest.getDataCenter().getId()); + break; + case VMware: + templateName = VirtualNetworkApplianceManager.RouterTemplateVmware.valueIn(dest.getDataCenter().getId()); + break; + case Hyperv: + templateName = VirtualNetworkApplianceManager.RouterTemplateHyperV.valueIn(dest.getDataCenter().getId()); + break; + case LXC: + templateName = VirtualNetworkApplianceManager.RouterTemplateLxc.valueIn(dest.getDataCenter().getId()); + break; + default: + break; } final VMTemplateVO template = _templateDao.findRoutingTemplate(hType, templateName); @@ -453,10 +455,14 @@ public class NetworkGeneralHelper { offerHA = false; } + // routerDeploymentDefinition.getVpc().getId() ==> do not use VPC because it is not a VPC offering. + Long vpcId = routerDeploymentDefinition.getVpc() != null ? routerDeploymentDefinition.getVpc().getId() : null; + router = new DomainRouterVO(id, routerOffering.getId(), vrProvider.getId(), VirtualMachineName.getRouterName(id, VirtualNwStatus.instance), template.getId(), template.getHypervisorType(), template.getGuestOSId(), owner.getDomainId(), owner.getId(), routerDeploymentDefinition.isRedundant(), 0, - false, RedundantState.UNKNOWN, offerHA, false, routerDeploymentDefinition.getVpc().getId()); + false, RedundantState.UNKNOWN, offerHA, false, vpcId); + router.setDynamicallyScalable(template.isDynamicallyScalable()); router.setRole(Role.VIRTUAL_ROUTER); router = _routerDao.persist(router); @@ -565,21 +571,21 @@ public class NetworkGeneralHelper { final String errMsg = new StringBuilder("Cannot find an available cluster in Pod ") - .append(podId) - .append(" to start domain router for Ovm. \n Ovm won't support any system vm including domain router, ") - .append("please make sure you have a cluster with hypervisor type of any of xenserver/KVM/Vmware in the same pod") - .append(" with Ovm cluster. And there is at least one host in UP status in that cluster.") - .toString(); + .append(podId) + .append(" to start domain router for Ovm. \n Ovm won't support any system vm including domain router, ") + .append("please make sure you have a cluster with hypervisor type of any of xenserver/KVM/Vmware in the same pod") + .append(" with Ovm cluster. And there is at least one host in UP status in that cluster.") + .toString(); throw new CloudRuntimeException(errMsg); } -// @Override + // @Override public LinkedHashMap> createRouterNetworks( final RouterDeploymentDefinition routerDeploymentDefinition, - Network guestNetwork, Pair publicNetwork) - throws ConcurrentOperationException, - InsufficientAddressCapacityException { + final Network guestNetwork, final Pair publicNetwork) + throws ConcurrentOperationException, + InsufficientAddressCapacityException { boolean setupPublicNetwork = false; if (publicNetwork != null) { diff --git a/server/src/com/cloud/network/router/RouterDeploymentDefinition.java b/server/src/com/cloud/network/router/RouterDeploymentDefinition.java index 6a147e0929e..ed7310d1523 100644 --- a/server/src/com/cloud/network/router/RouterDeploymentDefinition.java +++ b/server/src/com/cloud/network/router/RouterDeploymentDefinition.java @@ -1,3 +1,19 @@ +// 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 com.cloud.network.router; import java.util.Map; @@ -19,9 +35,9 @@ public class RouterDeploymentDefinition { protected boolean isRedundant; protected DeploymentPlan plan; - public RouterDeploymentDefinition(Vpc vpc, DeployDestination dest, - Account owner, Map params, - boolean isRedundant) { + public RouterDeploymentDefinition(final Vpc vpc, final DeployDestination dest, + final Account owner, final Map params, + final boolean isRedundant) { this.vpc = vpc; this.dest = dest; @@ -30,8 +46,8 @@ public class RouterDeploymentDefinition { this.isRedundant = isRedundant; } - public RouterDeploymentDefinition(Network guestNetwork, DeployDestination dest, - Account owner, Map params, boolean isRedundant) { + public RouterDeploymentDefinition(final Network guestNetwork, final DeployDestination dest, + final Account owner, final Map params, final boolean isRedundant) { this.guestNetwork = guestNetwork; this.dest = dest; @@ -43,51 +59,50 @@ public class RouterDeploymentDefinition { public Vpc getVpc() { return vpc; } - public void setVpc(Vpc vpc) { + public void setVpc(final Vpc vpc) { this.vpc = vpc; } public Network getGuestNetwork() { return guestNetwork; } - public void setGuestNetwork(Network guestNetwork) { + public void setGuestNetwork(final Network guestNetwork) { this.guestNetwork = guestNetwork; } public DeployDestination getDest() { return dest; } - public void setDest(DeployDestination dest) { + public void setDest(final DeployDestination dest) { this.dest = dest; } public Account getOwner() { return owner; } - public void setOwner(Account owner) { + public void setOwner(final Account owner) { this.owner = owner; } public Map getParams() { return params; } - public void setParams(Map params) { + public void setParams(final Map params) { this.params = params; } public boolean isRedundant() { return isRedundant; } - public void setRedundant(boolean isRedundant) { + public void setRedundant(final boolean isRedundant) { this.isRedundant = isRedundant; } public DeploymentPlan getPlan() { return plan; } - public void setPlan(DeploymentPlan plan) { + public void setPlan(final DeploymentPlan plan) { this.plan = plan; } public boolean isVpcRouter() { - return this.vpc != null; + return vpc != null; } public Long getPodId() { - return this.plan.getPodId(); + return plan.getPodId(); } - -} +} \ No newline at end of file diff --git a/server/src/com/cloud/network/router/VpcVirtualNetworkApplianceManagerImpl.java b/server/src/com/cloud/network/router/VpcVirtualNetworkApplianceManagerImpl.java index afa64c7e5f3..df8dfc908f3 100644 --- a/server/src/com/cloud/network/router/VpcVirtualNetworkApplianceManagerImpl.java +++ b/server/src/com/cloud/network/router/VpcVirtualNetworkApplianceManagerImpl.java @@ -176,7 +176,13 @@ public class VpcVirtualNetworkApplianceManagerImpl extends VirtualNetworkApplian public List deployVirtualRouter(final RouterDeploymentDefinition routerDeploymentDefinition) throws InsufficientCapacityException, ConcurrentOperationException, ResourceUnavailableException { - return routerDeploymentManager.deployVirtualRouterInVpc(routerDeploymentDefinition); + + Vpc vpc = routerDeploymentDefinition.getVpc(); + if (vpc != null) { + return routerDeploymentManager.deployVirtualRouterInVpc(routerDeploymentDefinition); + } else { + return super.deployVirtualRouter(routerDeploymentDefinition); + } } @Override