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 6dd3526718b..55420c03b97 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
@@ -190,6 +190,8 @@
class="com.cloud.network.router.NetworkGeneralHelper" />
+
diff --git a/server/src/com/cloud/network/element/VirtualRouterElement.java b/server/src/com/cloud/network/element/VirtualRouterElement.java
index 552d4211250..8ac3d230ed1 100755
--- a/server/src/com/cloud/network/element/VirtualRouterElement.java
+++ b/server/src/com/cloud/network/element/VirtualRouterElement.java
@@ -69,6 +69,7 @@ import com.cloud.network.dao.VirtualRouterProviderDao;
import com.cloud.network.lb.LoadBalancingRule;
import com.cloud.network.lb.LoadBalancingRule.LbStickinessPolicy;
import com.cloud.network.lb.LoadBalancingRulesManager;
+import com.cloud.network.router.RouterDeploymentDefinition;
import com.cloud.network.router.VirtualRouter;
import com.cloud.network.router.VirtualRouter.Role;
import com.cloud.network.router.VpcVirtualNetworkApplianceManager;
@@ -196,9 +197,11 @@ NetworkMigrationResponder, AggregatedCommandExecutor {
Map params = new HashMap(1);
params.put(VirtualMachineProfile.Param.ReProgramGuestNetworks, true);
- List routers = _routerMgr.deployVirtualRouterInGuestNetwork(network, dest,
- _accountMgr.getAccount(network.getAccountId()), params,
- offering.getRedundantRouter());
+ RouterDeploymentDefinition routerDeploymentDefinition =
+ new RouterDeploymentDefinition(network, dest,_accountMgr.getAccount(network.getAccountId()),
+ params, offering.getRedundantRouter());
+ List routers = _routerMgr.deployVirtualRouter(routerDeploymentDefinition);
+
int routerCounts = 1;
if (offering.getRedundantRouter()) {
routerCounts = 2;
@@ -230,11 +233,12 @@ NetworkMigrationResponder, AggregatedCommandExecutor {
return false;
}
- @SuppressWarnings("unchecked")
- VirtualMachineProfile uservm = vm;
+ RouterDeploymentDefinition routerDeploymentDefinition =
+ new RouterDeploymentDefinition(network, dest,_accountMgr.getAccount(network.getAccountId()),
+ vm.getParameters(), offering.getRedundantRouter());
List routers =
- _routerMgr.deployVirtualRouterInGuestNetwork(network, dest, _accountMgr.getAccount(network.getAccountId()), uservm.getParameters(),
- offering.getRedundantRouter());
+ _routerMgr.deployVirtualRouter(routerDeploymentDefinition);
+
if (routers == null || routers.size() == 0) {
throw new ResourceUnavailableException("Can't find at least one running router!", DataCenter.class, network.getDataCenterId());
}
diff --git a/server/src/com/cloud/network/element/VpcVirtualRouterElement.java b/server/src/com/cloud/network/element/VpcVirtualRouterElement.java
index d583383add9..0cc083ba0d2 100644
--- a/server/src/com/cloud/network/element/VpcVirtualRouterElement.java
+++ b/server/src/com/cloud/network/element/VpcVirtualRouterElement.java
@@ -47,6 +47,7 @@ import com.cloud.network.VpnUser;
import com.cloud.network.dao.IPAddressDao;
import com.cloud.network.dao.NetworkDao;
import com.cloud.network.dao.Site2SiteVpnGatewayDao;
+import com.cloud.network.router.RouterDeploymentDefinition;
import com.cloud.network.router.VirtualRouter;
import com.cloud.network.router.VirtualRouter.Role;
import com.cloud.network.router.VpcVirtualNetworkApplianceManager;
@@ -131,7 +132,9 @@ public class VpcVirtualRouterElement extends VirtualRouterElement implements Vpc
Map params = new HashMap(1);
params.put(VirtualMachineProfile.Param.ReProgramGuestNetworks, true);
- _vpcRouterMgr.deployVirtualRouterInVpc(vpc, dest, _accountMgr.getAccount(vpc.getAccountId()), params);
+ RouterDeploymentDefinition routerDeploymentDefinition =
+ new RouterDeploymentDefinition(vpc, dest, _accountMgr.getAccount(vpc.getAccountId()), params, false);
+ _vpcRouterMgr.deployVirtualRouter(routerDeploymentDefinition);
return true;
}
@@ -168,7 +171,9 @@ public class VpcVirtualRouterElement extends VirtualRouterElement implements Vpc
Map params = new HashMap(1);
params.put(VirtualMachineProfile.Param.ReProgramGuestNetworks, true);
- List routers = _vpcRouterMgr.deployVirtualRouterInVpc(vpc, dest, _accountMgr.getAccount(vpc.getAccountId()), params);
+ RouterDeploymentDefinition routerDeploymentDefinition =
+ new RouterDeploymentDefinition(vpc, dest, _accountMgr.getAccount(vpc.getAccountId()), params, false);
+ List routers = _vpcRouterMgr.deployVirtualRouter(routerDeploymentDefinition);
if ((routers == null) || (routers.size() == 0)) {
throw new ResourceUnavailableException("Can't find at least one running router!", DataCenter.class, network.getDataCenterId());
}
@@ -213,7 +218,9 @@ public class VpcVirtualRouterElement extends VirtualRouterElement implements Vpc
if (vm.getType() == VirtualMachine.Type.User) {
Map params = new HashMap(1);
params.put(VirtualMachineProfile.Param.ReProgramGuestNetworks, true);
- List routers = _vpcRouterMgr.deployVirtualRouterInVpc(vpc, dest, _accountMgr.getAccount(vpc.getAccountId()), params);
+ RouterDeploymentDefinition routerDeploymentDefinition =
+ new RouterDeploymentDefinition(vpc, dest, _accountMgr.getAccount(vpc.getAccountId()), params, false);
+ List routers = _vpcRouterMgr.deployVirtualRouter(routerDeploymentDefinition);
if ((routers == null) || (routers.size() == 0)) {
throw new ResourceUnavailableException("Can't find at least one running router!", DataCenter.class, network.getDataCenterId());
}
diff --git a/server/src/com/cloud/network/router/NetworkGeneralHelper.java b/server/src/com/cloud/network/router/NetworkGeneralHelper.java
index 7311adb7bde..db6f4bc0f35 100644
--- a/server/src/com/cloud/network/router/NetworkGeneralHelper.java
+++ b/server/src/com/cloud/network/router/NetworkGeneralHelper.java
@@ -393,10 +393,8 @@ public class NetworkGeneralHelper {
// @Override
- public DomainRouterVO deployRouter(Account owner,
- DeployDestination dest, DeploymentPlan plan,
- Map params, boolean isRedundant,
- VirtualRouterProvider vrProvider, long svcOffId, Long vpcId,
+ public DomainRouterVO deployRouter(final RouterDeploymentDefinition routerDeploymentDefinition,
+ VirtualRouterProvider vrProvider, long svcOffId,
LinkedHashMap> networks,
boolean startRouter, List supportedHypervisors)
throws InsufficientAddressCapacityException,
@@ -404,10 +402,12 @@ public class NetworkGeneralHelper {
StorageUnavailableException, ResourceUnavailableException {
final ServiceOfferingVO routerOffering = _serviceOfferingDao.findById(svcOffId);
+ final DeployDestination dest = routerDeploymentDefinition.getDest();
+ final Account owner = routerDeploymentDefinition.getOwner();
// Router is the network element, we don't know the hypervisor type yet.
// Try to allocate the domR twice using diff hypervisors, and when failed both times, throw the exception up
- final List hypervisors = getHypervisors(dest, plan, supportedHypervisors);
+ final List hypervisors = getHypervisors(routerDeploymentDefinition, supportedHypervisors);
int allocateRetry = 0;
int startRetry = 0;
@@ -449,19 +449,18 @@ public class NetworkGeneralHelper {
boolean offerHA = routerOffering.getOfferHA();
/* We don't provide HA to redundant router VMs, admin should own it all, and redundant router themselves are HA */
- if (isRedundant) {
+ if (routerDeploymentDefinition.isRedundant()) {
offerHA = false;
}
- router =
- new DomainRouterVO(id, routerOffering.getId(), vrProvider.getId(),
- VirtualMachineName.getRouterName(id, VirtualNwStatus.instance), template.getId(), template.getHypervisorType(),
- template.getGuestOSId(), owner.getDomainId(), owner.getId(), isRedundant, 0, false, RedundantState.UNKNOWN,
- offerHA, false, vpcId);
+ 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());
router.setDynamicallyScalable(template.isDynamicallyScalable());
router.setRole(Role.VIRTUAL_ROUTER);
router = _routerDao.persist(router);
- _itMgr.allocate(router.getInstanceName(), template, routerOffering, networks, plan, null);
+ _itMgr.allocate(router.getInstanceName(), template, routerOffering, networks, routerDeploymentDefinition.getPlan(), null);
router = _routerDao.findById(router.getId());
} catch (final InsufficientCapacityException ex) {
if (allocateRetry < 2 && iter.hasNext()) {
@@ -476,7 +475,7 @@ public class NetworkGeneralHelper {
if (startRouter) {
try {
- router = startVirtualRouter(router, _accountMgr.getSystemUser(), _accountMgr.getSystemAccount(), params);
+ router = startVirtualRouter(router, _accountMgr.getSystemUser(), _accountMgr.getSystemAccount(), routerDeploymentDefinition.getParams());
break;
} catch (final InsufficientCapacityException ex) {
if (startRetry < 2 && iter.hasNext()) {
@@ -499,8 +498,9 @@ public class NetworkGeneralHelper {
return router;
}
- protected List getHypervisors(final DeployDestination dest, final DeploymentPlan plan, final List supportedHypervisors)
+ protected List getHypervisors(final RouterDeploymentDefinition routerDeploymentDefinition, final List supportedHypervisors)
throws InsufficientServerCapacityException {
+ final DeployDestination dest = routerDeploymentDefinition.getDest();
List hypervisors = new ArrayList();
if (dest.getCluster() != null) {
@@ -515,7 +515,7 @@ public class NetworkGeneralHelper {
hypervisors.add(defaults);
} else {
//if there is no default hypervisor, get it from the cluster
- hypervisors = _resourceMgr.getSupportedHypervisorTypes(dest.getDataCenter().getId(), true, plan.getPodId());
+ hypervisors = _resourceMgr.getSupportedHypervisorTypes(dest.getDataCenter().getId(), true, routerDeploymentDefinition.getPodId());
}
}
@@ -530,9 +530,9 @@ public class NetworkGeneralHelper {
if (hypervisors.isEmpty()) {
final String errMsg = (hTypesStr.capacity() > 0) ? "supporting hypervisors " + hTypesStr.toString() : "";
- if (plan.getPodId() != null) {
+ if (routerDeploymentDefinition.getPodId() != null) {
throw new InsufficientServerCapacityException("Unable to create virtual router, " + "there are no clusters in the pod " + errMsg, Pod.class,
- plan.getPodId());
+ routerDeploymentDefinition.getPodId());
}
throw new InsufficientServerCapacityException("Unable to create virtual router, " + "there are no clusters in the zone " + errMsg, DataCenter.class,
dest.getDataCenter().getId());
@@ -564,16 +564,19 @@ public class NetworkGeneralHelper {
}
final String errMsg =
- "Cannot find an available cluster in Pod " + podId + " to start domain router for Ovm. \n Ovm won't support any system vm including domain router, " +
- "please make sure you have a cluster with hypervisor type of any of xenserver/KVM/Vmware in the same pod" +
- " with Ovm cluster. And there is at least one host in UP status in that cluster.";
+ 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();
throw new CloudRuntimeException(errMsg);
}
// @Override
public LinkedHashMap> createRouterNetworks(
- Account owner, boolean isRedundant, DeploymentPlan plan,
+ final RouterDeploymentDefinition routerDeploymentDefinition,
Network guestNetwork, Pair publicNetwork)
throws ConcurrentOperationException,
InsufficientAddressCapacityException {
@@ -595,7 +598,7 @@ public class NetworkGeneralHelper {
if (!setupPublicNetwork) {
final Nic placeholder = _networkModel
.getPlaceholderNicForRouter(guestNetwork,
- plan.getPodId());
+ routerDeploymentDefinition.getPodId());
if (guestNetwork.getCidr() != null) {
if (placeholder != null
&& placeholder.getIp4Address() != null) {
@@ -651,7 +654,7 @@ public class NetworkGeneralHelper {
final NicProfile gatewayNic = new NicProfile(defaultNetworkStartIp,
defaultNetworkStartIpv6);
if (setupPublicNetwork) {
- if (isRedundant) {
+ if (routerDeploymentDefinition.isRedundant()) {
gatewayNic.setIp4Address(_ipAddrMgr.acquireGuestIpAddress(
guestNetwork, null));
} else {
@@ -679,7 +682,7 @@ public class NetworkGeneralHelper {
.getSystemAccountNetworkOfferings(NetworkOffering.SystemControlNetwork);
NetworkOffering controlOffering = offerings.get(0);
Network controlConfig = _networkMgr.setupNetwork(VirtualNwStatus.account,
- controlOffering, plan, null, null, false).get(0);
+ controlOffering, routerDeploymentDefinition.getPlan(), null, null, false).get(0);
networks.put(controlConfig, new ArrayList());
// 3) Public network
if (setupPublicNetwork) {
@@ -716,8 +719,8 @@ public class NetworkGeneralHelper {
.getSystemAccountNetworkOfferings(
NetworkOffering.SystemPublicNetwork).get(0);
final List extends Network> publicNetworks = _networkMgr
- .setupNetwork(VirtualNwStatus.account, publicOffering, plan, null,
- null, false);
+ .setupNetwork(VirtualNwStatus.account, publicOffering, routerDeploymentDefinition.getPlan(),
+ null, null, false);
final String publicIp = defaultNic.getIp4Address();
// We want to use the identical MAC address for RvR on public
// interface if possible
diff --git a/server/src/com/cloud/network/router/RouterDeploymentDefinition.java b/server/src/com/cloud/network/router/RouterDeploymentDefinition.java
new file mode 100644
index 00000000000..6a147e0929e
--- /dev/null
+++ b/server/src/com/cloud/network/router/RouterDeploymentDefinition.java
@@ -0,0 +1,93 @@
+package com.cloud.network.router;
+
+import java.util.Map;
+
+import com.cloud.deploy.DeployDestination;
+import com.cloud.deploy.DeploymentPlan;
+import com.cloud.network.Network;
+import com.cloud.network.vpc.Vpc;
+import com.cloud.user.Account;
+import com.cloud.vm.VirtualMachineProfile.Param;
+
+public class RouterDeploymentDefinition {
+
+ protected Vpc vpc;
+ protected Network guestNetwork;
+ protected DeployDestination dest;
+ protected Account owner;
+ protected Map params;
+ protected boolean isRedundant;
+ protected DeploymentPlan plan;
+
+ public RouterDeploymentDefinition(Vpc vpc, DeployDestination dest,
+ Account owner, Map params,
+ boolean isRedundant) {
+
+ this.vpc = vpc;
+ this.dest = dest;
+ this.owner = owner;
+ this.params = params;
+ this.isRedundant = isRedundant;
+ }
+
+ public RouterDeploymentDefinition(Network guestNetwork, DeployDestination dest,
+ Account owner, Map params, boolean isRedundant) {
+
+ this.guestNetwork = guestNetwork;
+ this.dest = dest;
+ this.owner = owner;
+ this.params = params;
+ this.isRedundant = isRedundant;
+ }
+
+ public Vpc getVpc() {
+ return vpc;
+ }
+ public void setVpc(Vpc vpc) {
+ this.vpc = vpc;
+ }
+ public Network getGuestNetwork() {
+ return guestNetwork;
+ }
+ public void setGuestNetwork(Network guestNetwork) {
+ this.guestNetwork = guestNetwork;
+ }
+ public DeployDestination getDest() {
+ return dest;
+ }
+ public void setDest(DeployDestination dest) {
+ this.dest = dest;
+ }
+ public Account getOwner() {
+ return owner;
+ }
+ public void setOwner(Account owner) {
+ this.owner = owner;
+ }
+ public Map getParams() {
+ return params;
+ }
+ public void setParams(Map params) {
+ this.params = params;
+ }
+ public boolean isRedundant() {
+ return isRedundant;
+ }
+ public void setRedundant(boolean isRedundant) {
+ this.isRedundant = isRedundant;
+ }
+ public DeploymentPlan getPlan() {
+ return plan;
+ }
+ public void setPlan(DeploymentPlan plan) {
+ this.plan = plan;
+ }
+
+ public boolean isVpcRouter() {
+ return this.vpc != null;
+ }
+ public Long getPodId() {
+ return this.plan.getPodId();
+ }
+
+}
diff --git a/server/src/com/cloud/network/router/RouterDeploymentManager.java b/server/src/com/cloud/network/router/RouterDeploymentManager.java
new file mode 100644
index 00000000000..b000e11c918
--- /dev/null
+++ b/server/src/com/cloud/network/router/RouterDeploymentManager.java
@@ -0,0 +1,271 @@
+package com.cloud.network.router;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.TreeSet;
+
+import javax.inject.Inject;
+
+import org.apache.cloudstack.engine.orchestration.service.NetworkOrchestrationService;
+import org.apache.log4j.Logger;
+
+import com.cloud.dc.dao.VlanDao;
+import com.cloud.deploy.DataCenterDeployment;
+import com.cloud.deploy.DeploymentPlan;
+import com.cloud.exception.ConcurrentOperationException;
+import com.cloud.exception.InsufficientAddressCapacityException;
+import com.cloud.exception.InsufficientCapacityException;
+import com.cloud.exception.InsufficientServerCapacityException;
+import com.cloud.exception.ResourceUnavailableException;
+import com.cloud.exception.StorageUnavailableException;
+import com.cloud.network.IpAddress;
+import com.cloud.network.Network;
+import com.cloud.network.NetworkModel;
+import com.cloud.network.Networks.BroadcastDomainType;
+import com.cloud.network.Networks.IsolationType;
+import com.cloud.network.PhysicalNetwork;
+import com.cloud.network.PhysicalNetworkServiceProvider;
+import com.cloud.network.VirtualRouterProvider;
+import com.cloud.network.VirtualRouterProvider.Type;
+import com.cloud.network.addr.PublicIp;
+import com.cloud.network.dao.IPAddressDao;
+import com.cloud.network.dao.IPAddressVO;
+import com.cloud.network.dao.PhysicalNetworkDao;
+import com.cloud.network.dao.PhysicalNetworkServiceProviderDao;
+import com.cloud.network.dao.VirtualRouterProviderDao;
+import com.cloud.network.vpc.PrivateGateway;
+import com.cloud.network.vpc.Vpc;
+import com.cloud.network.vpc.VpcManager;
+import com.cloud.network.vpc.dao.VpcDao;
+import com.cloud.network.vpc.dao.VpcOfferingDao;
+import com.cloud.offering.NetworkOffering;
+import com.cloud.service.ServiceOfferingVO;
+import com.cloud.utils.Pair;
+import com.cloud.utils.db.DB;
+import com.cloud.utils.exception.CloudRuntimeException;
+import com.cloud.utils.net.NetUtils;
+import com.cloud.vm.DomainRouterVO;
+import com.cloud.vm.NicProfile;
+
+public class RouterDeploymentManager {
+
+ private static final Logger logger = Logger.getLogger(RouterDeploymentManager.class);
+
+ @Inject
+ VpcDao vpcDao;
+ @Inject
+ VpcOfferingDao vpcOffDao;
+ @Inject
+ PhysicalNetworkDao pNtwkDao;
+ @Inject
+ VpcManager vpcMgr;
+ @Inject
+ PhysicalNetworkServiceProviderDao physicalProviderDao;
+ @Inject
+ VlanDao vlanDao;
+ @Inject
+ IPAddressDao ipAddressDao;
+ @Inject
+ NetworkOrchestrationService networkMgr;
+ @Inject
+ NetworkModel networkModel;
+ @Inject
+ VirtualRouterProviderDao vrProviderDao;
+
+ @Inject
+ protected NetworkGeneralHelper nwHelper;
+ @Inject
+ protected VpcVirtualNetworkHelperImpl vpcHelper;
+
+
+ protected ServiceOfferingVO _offering;
+
+
+ ///////////////////////////////////////////////////////////////////////
+ // Non-VPC behavior
+ ///////////////////////////////////////////////////////////////////////
+
+
+ ///////////////////////////////////////////////////////////////////////
+ // VPC Specific behavior
+ ///////////////////////////////////////////////////////////////////////
+
+ public List deployVirtualRouterInVpc(final RouterDeploymentDefinition routerDeploymentDefinition)
+ throws InsufficientCapacityException,
+ ConcurrentOperationException, ResourceUnavailableException {
+
+ List routers = this.findOrDeployVirtualRouterInVpc(routerDeploymentDefinition);
+
+ return this.nwHelper.startRouters(routerDeploymentDefinition.getParams(), routers);
+ }
+
+ @DB
+ protected List findOrDeployVirtualRouterInVpc(final RouterDeploymentDefinition routerDeploymentDefinition)
+ throws ConcurrentOperationException, InsufficientCapacityException, ResourceUnavailableException {
+
+ final Vpc vpc = routerDeploymentDefinition.getVpc();
+ logger.debug("Deploying Virtual Router in VPC " + vpc);
+ Vpc vpcLock = vpcDao.acquireInLockTable(vpc.getId());
+ if (vpcLock == null) {
+ throw new ConcurrentOperationException("Unable to lock vpc " + vpc.getId());
+ }
+
+ //1) Get deployment plan and find out the list of routers
+ Pair> planAndRouters = getDeploymentPlanAndRouters(routerDeploymentDefinition);
+ DeploymentPlan plan = planAndRouters.first();
+ List routers = planAndRouters.second();
+ try {
+ //2) Return routers if exist
+ if (routers.size() >= 1) {
+ return routers;
+ }
+
+ Long offeringId = vpcOffDao.findById(vpc.getVpcOfferingId()).getServiceOfferingId();
+ if (offeringId == null) {
+ offeringId = _offering.getId();
+ }
+ //3) Deploy Virtual Router
+ List extends PhysicalNetwork> pNtwks = pNtwkDao.listByZone(vpc.getZoneId());
+
+ VirtualRouterProvider vpcVrProvider = null;
+
+ for (PhysicalNetwork pNtwk : pNtwks) {
+ PhysicalNetworkServiceProvider provider = physicalProviderDao.findByServiceProvider(pNtwk.getId(), Type.VPCVirtualRouter.toString());
+ if (provider == null) {
+ throw new CloudRuntimeException("Cannot find service provider " + Type.VPCVirtualRouter.toString() + " in physical network " + pNtwk.getId());
+ }
+ vpcVrProvider = vrProviderDao.findByNspIdAndType(provider.getId(), Type.VPCVirtualRouter);
+ if (vpcVrProvider != null) {
+ break;
+ }
+ }
+
+ PublicIp sourceNatIp = vpcMgr.assignSourceNatIpAddressToVpc(routerDeploymentDefinition.getOwner(), vpc);
+
+ DomainRouterVO router = deployVpcRouter(routerDeploymentDefinition, vpcVrProvider, offeringId, sourceNatIp);
+ routers.add(router);
+
+ } finally {
+ // TODO Should we do this after the pre or after the whole??
+ if (vpcLock != null) {
+ vpcDao.releaseFromLockTable(vpc.getId());
+ }
+ }
+ return routers;
+ }
+
+ protected Pair> getDeploymentPlanAndRouters(final RouterDeploymentDefinition routerDeploymentDefinition) {
+ long dcId = routerDeploymentDefinition.getDest().getDataCenter().getId();
+
+ DeploymentPlan plan = new DataCenterDeployment(dcId);
+ List routers = this.vpcHelper.getVpcRouters(routerDeploymentDefinition.getVpc().getId());
+
+ return new Pair>(plan, routers);
+ }
+
+
+ protected DomainRouterVO deployVpcRouter(final RouterDeploymentDefinition routerDeploymentDefinition, VirtualRouterProvider vrProvider,
+ long svcOffId, PublicIp sourceNatIp) throws ConcurrentOperationException, InsufficientAddressCapacityException,
+ InsufficientServerCapacityException, InsufficientCapacityException, StorageUnavailableException, ResourceUnavailableException {
+
+ LinkedHashMap> networks = createVpcRouterNetworks(routerDeploymentDefinition,
+ new Pair(true, sourceNatIp), routerDeploymentDefinition.getVpc().getId());
+
+ DomainRouterVO router =
+ this.nwHelper.deployRouter(routerDeploymentDefinition, vrProvider, svcOffId, networks, true, vpcMgr.getSupportedVpcHypervisors());
+
+ return router;
+ }
+
+ protected LinkedHashMap> createVpcRouterNetworks(final RouterDeploymentDefinition routerDeploymentDefinition,
+ Pair sourceNatIp, long vpcId)
+ throws ConcurrentOperationException, InsufficientAddressCapacityException {
+
+ LinkedHashMap> networks = new LinkedHashMap>(4);
+
+ TreeSet publicVlans = new TreeSet();
+ publicVlans.add(sourceNatIp.second().getVlanTag());
+
+ //1) allocate nic for control and source nat public ip
+ networks = this.nwHelper.createRouterNetworks(routerDeploymentDefinition, null, sourceNatIp);
+
+
+ //2) allocate nic for private gateways if needed
+ List privateGateways = vpcMgr.getVpcPrivateGateways(vpcId);
+ if (privateGateways != null && !privateGateways.isEmpty()) {
+ for (PrivateGateway privateGateway : privateGateways) {
+ NicProfile privateNic = this.vpcHelper.createPrivateNicProfileForGateway(privateGateway);
+ Network privateNetwork = networkModel.getNetwork(privateGateway.getNetworkId());
+ networks.put(privateNetwork, new ArrayList(Arrays.asList(privateNic)));
+ }
+ }
+
+ //3) allocate nic for guest gateway if needed
+ List extends Network> guestNetworks = vpcMgr.getVpcNetworks(vpcId);
+ for (Network guestNetwork : guestNetworks) {
+ if (networkModel.isPrivateGateway(guestNetwork.getId())) {
+ continue;
+ }
+ if (guestNetwork.getState() == Network.State.Implemented || guestNetwork.getState() == Network.State.Setup) {
+ NicProfile guestNic = createGuestNicProfileForVpcRouter(guestNetwork);
+ networks.put(guestNetwork, new ArrayList(Arrays.asList(guestNic)));
+ }
+ }
+
+ //4) allocate nic for additional public network(s)
+ List ips = ipAddressDao.listByAssociatedVpc(vpcId, false);
+ List publicNics = new ArrayList();
+ Network publicNetwork = null;
+ for (IPAddressVO ip : ips) {
+ PublicIp publicIp = PublicIp.createFromAddrAndVlan(ip, vlanDao.findById(ip.getVlanId()));
+ if ((ip.getState() == IpAddress.State.Allocated || ip.getState() == IpAddress.State.Allocating) && vpcMgr.isIpAllocatedToVpc(ip) &&
+ !publicVlans.contains(publicIp.getVlanTag())) {
+ logger.debug("Allocating nic for router in vlan " + publicIp.getVlanTag());
+ NicProfile publicNic = new NicProfile();
+ publicNic.setDefaultNic(false);
+ publicNic.setIp4Address(publicIp.getAddress().addr());
+ publicNic.setGateway(publicIp.getGateway());
+ publicNic.setNetmask(publicIp.getNetmask());
+ publicNic.setMacAddress(publicIp.getMacAddress());
+ publicNic.setBroadcastType(BroadcastDomainType.Vlan);
+ publicNic.setBroadcastUri(BroadcastDomainType.Vlan.toUri(publicIp.getVlanTag()));
+ publicNic.setIsolationUri(IsolationType.Vlan.toUri(publicIp.getVlanTag()));
+ NetworkOffering publicOffering = networkModel.getSystemAccountNetworkOfferings(NetworkOffering.SystemPublicNetwork).get(0);
+ if (publicNetwork == null) {
+ List extends Network> publicNetworks = networkMgr.setupNetwork(VirtualNwStatus.account,
+ publicOffering, routerDeploymentDefinition.getPlan(), null, null, false);
+ publicNetwork = publicNetworks.get(0);
+ }
+ publicNics.add(publicNic);
+ publicVlans.add(publicIp.getVlanTag());
+ }
+ }
+ if (publicNetwork != null) {
+ if (networks.get(publicNetwork) != null) {
+ List publicNicProfiles = (List)networks.get(publicNetwork);
+ publicNicProfiles.addAll(publicNics);
+ networks.put(publicNetwork, publicNicProfiles);
+ } else {
+ networks.put(publicNetwork, publicNics);
+ }
+ }
+
+ return networks;
+ }
+
+ protected NicProfile createGuestNicProfileForVpcRouter(Network guestNetwork) {
+ NicProfile guestNic = new NicProfile();
+ guestNic.setIp4Address(guestNetwork.getGateway());
+ guestNic.setBroadcastUri(guestNetwork.getBroadcastUri());
+ guestNic.setBroadcastType(guestNetwork.getBroadcastDomainType());
+ guestNic.setIsolationUri(guestNetwork.getBroadcastUri());
+ guestNic.setMode(guestNetwork.getMode());
+ String gatewayCidr = guestNetwork.getCidr();
+ guestNic.setNetmask(NetUtils.getCidrNetmask(gatewayCidr));
+
+ return guestNic;
+ }
+
+}
diff --git a/server/src/com/cloud/network/router/VirtualNetworkApplianceManager.java b/server/src/com/cloud/network/router/VirtualNetworkApplianceManager.java
index 85ce8b9dcc8..f277e1aa8bb 100644
--- a/server/src/com/cloud/network/router/VirtualNetworkApplianceManager.java
+++ b/server/src/com/cloud/network/router/VirtualNetworkApplianceManager.java
@@ -17,7 +17,6 @@
package com.cloud.network.router;
import java.util.List;
-import java.util.Map;
import org.apache.cloudstack.framework.config.ConfigKey;
@@ -98,8 +97,8 @@ public interface VirtualNetworkApplianceManager extends Manager, VirtualNetworkA
boolean saveUserDataToRouter(Network network, NicProfile nic, VirtualMachineProfile profile, List extends VirtualRouter> routers)
throws ResourceUnavailableException;
- List deployVirtualRouterInGuestNetwork(Network guestNetwork, DeployDestination dest, Account owner, Map params,
- boolean isRedundant) throws InsufficientCapacityException, ResourceUnavailableException, ConcurrentOperationException;
+ List deployVirtualRouter(RouterDeploymentDefinition routerDeploymentDefinition)
+ throws InsufficientCapacityException, ResourceUnavailableException, ConcurrentOperationException;
boolean startRemoteAccessVpn(Network network, RemoteAccessVpn vpn, List extends VirtualRouter> routers) throws ResourceUnavailableException;
diff --git a/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java b/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java
index ef620e7adca..136e49d3721 100755
--- a/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java
+++ b/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java
@@ -403,6 +403,8 @@ public class VirtualNetworkApplianceManagerImpl extends ManagerBase implements V
@Inject
protected NetworkGeneralHelper nwHelper;
+ @Inject
+ protected RouterDeploymentManager routerDeploymentManager;
int _routerRamSize;
int _routerCpuMHz;
@@ -1538,8 +1540,11 @@ public class VirtualNetworkApplianceManagerImpl extends ManagerBase implements V
}
@DB
- protected List findOrDeployVirtualRouterInGuestNetwork(final Network guestNetwork, final DeployDestination dest, Account owner, final boolean isRedundant,
- final Map params) throws ConcurrentOperationException, InsufficientCapacityException, ResourceUnavailableException {
+ protected List findOrDeployVirtualRouterInGuestNetwork(final RouterDeploymentDefinition routerDeploymentDefinition) throws ConcurrentOperationException,
+ InsufficientCapacityException, ResourceUnavailableException {
+
+ final Network guestNetwork = routerDeploymentDefinition.getGuestNetwork();
+ final DeployDestination dest = routerDeploymentDefinition.getDest();
List routers = new ArrayList();
final Network lock = _networkDao.acquireInLockTable(guestNetwork.getId(), NetworkOrchestrationService.NetworkLockTimeout.value());
@@ -1607,7 +1612,7 @@ public class VirtualNetworkApplianceManagerImpl extends ManagerBase implements V
// 2) Figure out required routers count
int routerCount = 1;
- if (isRedundant) {
+ if (routerDeploymentDefinition.isRedundant()) {
routerCount = 2;
// Check current redundant routers, if possible(all routers
// are stopped), reset the priority
@@ -1639,7 +1644,7 @@ public class VirtualNetworkApplianceManagerImpl extends ManagerBase implements V
}
if (_networkModel.isNetworkSystem(guestNetwork) || guestNetwork.getGuestType() == Network.GuestType.Shared) {
- owner = _accountMgr.getAccount(Account.ACCOUNT_ID_SYSTEM);
+ routerDeploymentDefinition.setOwner(_accountMgr.getAccount(Account.ACCOUNT_ID_SYSTEM));
}
// Check if public network has to be set on VR
@@ -1647,7 +1652,7 @@ public class VirtualNetworkApplianceManagerImpl extends ManagerBase implements V
if (_networkModel.isProviderSupportServiceInNetwork(guestNetwork.getId(), Service.SourceNat, Provider.VirtualRouter)) {
publicNetwork = true;
}
- if (isRedundant && !publicNetwork) {
+ if (routerDeploymentDefinition.isRedundant() && !publicNetwork) {
s_logger.error("Didn't support redundant virtual router without public network!");
return null;
}
@@ -1659,18 +1664,19 @@ public class VirtualNetworkApplianceManagerImpl extends ManagerBase implements V
PublicIp sourceNatIp = null;
if (publicNetwork) {
- sourceNatIp = _ipAddrMgr.assignSourceNatIpAddressToGuestNetwork(owner, guestNetwork);
+ sourceNatIp = _ipAddrMgr.assignSourceNatIpAddressToGuestNetwork(routerDeploymentDefinition.getOwner(), guestNetwork);
}
// 3) deploy virtual router(s)
final int count = routerCount - destRouters.size();
final DeploymentPlan plan = planAndRouters.first();
+ routerDeploymentDefinition.setPlan(plan);
for (int i = 0; i < count; i++) {
- LinkedHashMap> networks = createRouterNetworks(owner, isRedundant, plan, guestNetwork, new Pair(
+ final LinkedHashMap> networks = createRouterNetworks(routerDeploymentDefinition, new Pair(
publicNetwork, sourceNatIp));
// don't start the router as we are holding the network lock
// that needs to be released at the end of router allocation
- final DomainRouterVO router = nwHelper.deployRouter(owner, destination, plan, params, isRedundant, vrProvider, offeringId, null, networks, false, null);
+ final DomainRouterVO router = nwHelper.deployRouter(routerDeploymentDefinition, vrProvider, offeringId, networks, false, null);
if (router != null) {
_routerDao.addRouterToGuestNetwork(router, guestNetwork);
@@ -1707,9 +1713,10 @@ public class VirtualNetworkApplianceManagerImpl extends ManagerBase implements V
return _podDao.search(sc, null);
}
- protected LinkedHashMap> createRouterNetworks(final Account owner, final boolean isRedundant, final DeploymentPlan plan,
- final Network guestNetwork, final Pair publicNetwork) throws ConcurrentOperationException, InsufficientAddressCapacityException {
+ protected LinkedHashMap> createRouterNetworks(final RouterDeploymentDefinition routerDeploymentDefinition,
+ final Pair publicNetwork) throws ConcurrentOperationException, InsufficientAddressCapacityException {
+ final Network guestNetwork = routerDeploymentDefinition.getGuestNetwork();
boolean setupPublicNetwork = false;
if (publicNetwork != null) {
setupPublicNetwork = publicNetwork.first();
@@ -1723,7 +1730,7 @@ public class VirtualNetworkApplianceManagerImpl extends ManagerBase implements V
s_logger.debug("Adding nic for Virtual Router in Guest network " + guestNetwork);
String defaultNetworkStartIp = null, defaultNetworkStartIpv6 = null;
if (!setupPublicNetwork) {
- final Nic placeholder = _networkModel.getPlaceholderNicForRouter(guestNetwork, plan.getPodId());
+ final Nic placeholder = _networkModel.getPlaceholderNicForRouter(guestNetwork, routerDeploymentDefinition.getPodId());
if (guestNetwork.getCidr() != null) {
if (placeholder != null && placeholder.getIp4Address() != null) {
s_logger.debug("Requesting ipv4 address " + placeholder.getIp4Address() + " stored in placeholder nic for the network " + guestNetwork);
@@ -1757,7 +1764,7 @@ public class VirtualNetworkApplianceManagerImpl extends ManagerBase implements V
final NicProfile gatewayNic = new NicProfile(defaultNetworkStartIp, defaultNetworkStartIpv6);
if (setupPublicNetwork) {
- if (isRedundant) {
+ if (routerDeploymentDefinition.isRedundant()) {
gatewayNic.setIp4Address(_ipAddrMgr.acquireGuestIpAddress(guestNetwork, null));
} else {
gatewayNic.setIp4Address(guestNetwork.getGateway());
@@ -1778,9 +1785,9 @@ public class VirtualNetworkApplianceManagerImpl extends ManagerBase implements V
// 2) Control network
s_logger.debug("Adding nic for Virtual Router in Control network ");
- List extends NetworkOffering> offerings = _networkModel.getSystemAccountNetworkOfferings(NetworkOffering.SystemControlNetwork);
- NetworkOffering controlOffering = offerings.get(0);
- Network controlConfig = _networkMgr.setupNetwork(_systemAcct, controlOffering, plan, null, null, false).get(0);
+ final List extends NetworkOffering> offerings = _networkModel.getSystemAccountNetworkOfferings(NetworkOffering.SystemControlNetwork);
+ final NetworkOffering controlOffering = offerings.get(0);
+ final Network controlConfig = _networkMgr.setupNetwork(_systemAcct, controlOffering, routerDeploymentDefinition.getPlan(), null, null, false).get(0);
networks.put(controlConfig, new ArrayList());
// 3) Public network
if (setupPublicNetwork) {
@@ -1809,7 +1816,7 @@ public class VirtualNetworkApplianceManagerImpl extends ManagerBase implements V
defaultNic.setDeviceId(2);
}
final NetworkOffering publicOffering = _networkModel.getSystemAccountNetworkOfferings(NetworkOffering.SystemPublicNetwork).get(0);
- final List extends Network> publicNetworks = _networkMgr.setupNetwork(_systemAcct, publicOffering, plan, null, null, false);
+ final List extends Network> publicNetworks = _networkMgr.setupNetwork(_systemAcct, publicOffering, routerDeploymentDefinition.getPlan(), null, null, false);
final String publicIp = defaultNic.getIp4Address();
// We want to use the identical MAC address for RvR on public
// interface if possible
@@ -1846,12 +1853,12 @@ public class VirtualNetworkApplianceManagerImpl extends ManagerBase implements V
}
@Override
- public List deployVirtualRouterInGuestNetwork(final Network guestNetwork, final DeployDestination dest, final Account owner, final Map params,
- final boolean isRedundant) throws InsufficientCapacityException, ConcurrentOperationException, ResourceUnavailableException {
+ public List deployVirtualRouter(final RouterDeploymentDefinition routerDeploymentDefinition) throws InsufficientCapacityException,
+ ConcurrentOperationException, ResourceUnavailableException {
- final List routers = findOrDeployVirtualRouterInGuestNetwork(guestNetwork, dest, owner, isRedundant, params);
+ final List routers = findOrDeployVirtualRouterInGuestNetwork(routerDeploymentDefinition);
- return nwHelper.startRouters(params, routers);
+ return nwHelper.startRouters(routerDeploymentDefinition.getParams(), routers);
}
@Override
diff --git a/server/src/com/cloud/network/router/VpcVirtualNetworkApplianceManager.java b/server/src/com/cloud/network/router/VpcVirtualNetworkApplianceManager.java
index 7f9ff8d8ea1..ab94d02f8c0 100644
--- a/server/src/com/cloud/network/router/VpcVirtualNetworkApplianceManager.java
+++ b/server/src/com/cloud/network/router/VpcVirtualNetworkApplianceManager.java
@@ -17,11 +17,8 @@
package com.cloud.network.router;
import java.util.List;
-import java.util.Map;
-import com.cloud.deploy.DeployDestination;
import com.cloud.exception.ConcurrentOperationException;
-import com.cloud.exception.InsufficientCapacityException;
import com.cloud.exception.ResourceUnavailableException;
import com.cloud.network.Network;
import com.cloud.network.RemoteAccessVpn;
@@ -31,42 +28,10 @@ import com.cloud.network.VpnUser;
import com.cloud.network.vpc.NetworkACLItem;
import com.cloud.network.vpc.PrivateGateway;
import com.cloud.network.vpc.StaticRouteProfile;
-import com.cloud.network.vpc.Vpc;
-import com.cloud.user.Account;
import com.cloud.vm.DomainRouterVO;
-import com.cloud.vm.VirtualMachineProfile.Param;
public interface VpcVirtualNetworkApplianceManager extends VirtualNetworkApplianceManager, VpcVirtualNetworkApplianceService {
- /**
- *
- * @param vpc
- * @param dest
- * @param owner
- * @param params
- * @param isRedundant
- * @return
- * @throws InsufficientCapacityException
- * @throws ConcurrentOperationException
- * @throws ResourceUnavailableException
- */
- List deployVirtualRouterInVpc(Vpc vpc, DeployDestination dest, Account owner, Map params, boolean isRedundant) throws InsufficientCapacityException,
- ConcurrentOperationException, ResourceUnavailableException;
-
- /**
- *
- * @param vpc
- * @param dest
- * @param owner
- * @param params
- * @return
- * @throws InsufficientCapacityException
- * @throws ConcurrentOperationException
- * @throws ResourceUnavailableException
- */
- List deployVirtualRouterInVpc(Vpc vpc, DeployDestination dest, Account owner, Map params) throws InsufficientCapacityException,
- ConcurrentOperationException, ResourceUnavailableException;
-
/**
*
* @param network
diff --git a/server/src/com/cloud/network/router/VpcVirtualNetworkApplianceManagerImpl.java b/server/src/com/cloud/network/router/VpcVirtualNetworkApplianceManagerImpl.java
index 5276554c627..f2162ea34fc 100644
--- a/server/src/com/cloud/network/router/VpcVirtualNetworkApplianceManagerImpl.java
+++ b/server/src/com/cloud/network/router/VpcVirtualNetworkApplianceManagerImpl.java
@@ -19,14 +19,11 @@ package com.cloud.network.router;
import java.net.URI;
import java.util.ArrayList;
-import java.util.Arrays;
import java.util.HashMap;
import java.util.Iterator;
-import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
-import java.util.TreeSet;
import javax.ejb.Local;
import javax.inject.Inject;
@@ -54,33 +51,24 @@ import com.cloud.agent.api.to.NetworkACLTO;
import com.cloud.agent.manager.Commands;
import com.cloud.dc.DataCenter;
import com.cloud.dc.DataCenterVO;
-import com.cloud.deploy.DataCenterDeployment;
import com.cloud.deploy.DeployDestination;
-import com.cloud.deploy.DeploymentPlan;
import com.cloud.exception.AgentUnavailableException;
import com.cloud.exception.ConcurrentOperationException;
-import com.cloud.exception.InsufficientAddressCapacityException;
import com.cloud.exception.InsufficientCapacityException;
-import com.cloud.exception.InsufficientServerCapacityException;
import com.cloud.exception.OperationTimedoutException;
import com.cloud.exception.ResourceUnavailableException;
-import com.cloud.exception.StorageUnavailableException;
import com.cloud.network.IpAddress;
import com.cloud.network.Network;
import com.cloud.network.Network.Provider;
import com.cloud.network.Network.Service;
import com.cloud.network.NetworkService;
-import com.cloud.network.Networks.AddressFormat;
import com.cloud.network.Networks.BroadcastDomainType;
import com.cloud.network.Networks.IsolationType;
import com.cloud.network.Networks.TrafficType;
-import com.cloud.network.PhysicalNetwork;
-import com.cloud.network.PhysicalNetworkServiceProvider;
import com.cloud.network.PublicIpAddress;
import com.cloud.network.RemoteAccessVpn;
import com.cloud.network.Site2SiteVpnConnection;
import com.cloud.network.VirtualRouterProvider;
-import com.cloud.network.VirtualRouterProvider.Type;
import com.cloud.network.VpcVirtualNetworkApplianceService;
import com.cloud.network.VpnUser;
import com.cloud.network.addr.PublicIp;
@@ -112,11 +100,9 @@ import com.cloud.network.vpc.dao.VpcDao;
import com.cloud.network.vpc.dao.VpcGatewayDao;
import com.cloud.network.vpc.dao.VpcOfferingDao;
import com.cloud.network.vpn.Site2SiteVpnManager;
-import com.cloud.offering.NetworkOffering;
import com.cloud.user.Account;
import com.cloud.user.UserStatisticsVO;
import com.cloud.utils.Pair;
-import com.cloud.utils.db.DB;
import com.cloud.utils.db.EntityManager;
import com.cloud.utils.exception.CloudRuntimeException;
import com.cloud.utils.net.NetUtils;
@@ -174,7 +160,9 @@ public class VpcVirtualNetworkApplianceManagerImpl extends VirtualNetworkApplian
@Inject
protected NetworkGeneralHelper nwHelper;
@Inject
- protected VpcVirtualNetworkHelper vpcHelper;
+ protected VpcVirtualNetworkHelperImpl vpcHelper;
+ @Inject
+ protected RouterDeploymentManager routerDeploymentManager;
@Override
public boolean configure(final String name, final Map params) throws ConfigurationException {
@@ -183,79 +171,10 @@ public class VpcVirtualNetworkApplianceManagerImpl extends VirtualNetworkApplian
}
@Override
- public List deployVirtualRouterInVpc(Vpc vpc, DeployDestination dest, Account owner,
- Map params) throws InsufficientCapacityException,
+ public List deployVirtualRouter(final RouterDeploymentDefinition routerDeploymentDefinition)
+ throws InsufficientCapacityException,
ConcurrentOperationException, ResourceUnavailableException {
- return this.deployVirtualRouterInVpc(vpc, dest, owner, params, false);
- }
-
- @Override
- public List deployVirtualRouterInVpc(Vpc vpc, DeployDestination dest, Account owner,
- Map params, final boolean isRedundant) throws InsufficientCapacityException,
- ConcurrentOperationException, ResourceUnavailableException {
- return this.vpcHelper.deployVirtualRouterInVpc(vpc, dest, owner, params, isRedundant);
- }
-
- @DB
- protected List findOrDeployVirtualRouterInVpc(Vpc vpc, DeployDestination dest, Account owner, Map params)
- throws ConcurrentOperationException, InsufficientCapacityException, ResourceUnavailableException {
-
- s_logger.debug("Deploying Virtual Router in VPC " + vpc);
- Vpc vpcLock = _vpcDao.acquireInLockTable(vpc.getId());
- if (vpcLock == null) {
- throw new ConcurrentOperationException("Unable to lock vpc " + vpc.getId());
- }
-
- //1) Get deployment plan and find out the list of routers
- Pair> planAndRouters = getDeploymentPlanAndRouters(vpc.getId(), dest);
- DeploymentPlan plan = planAndRouters.first();
- List routers = planAndRouters.second();
- try {
- //2) Return routers if exist
- if (routers.size() >= 1) {
- return routers;
- }
-
- Long offeringId = _vpcOffDao.findById(vpc.getVpcOfferingId()).getServiceOfferingId();
- if (offeringId == null) {
- offeringId = _offering.getId();
- }
- //3) Deploy Virtual Router
- List extends PhysicalNetwork> pNtwks = _pNtwkDao.listByZone(vpc.getZoneId());
-
- VirtualRouterProvider vpcVrProvider = null;
-
- for (PhysicalNetwork pNtwk : pNtwks) {
- PhysicalNetworkServiceProvider provider = _physicalProviderDao.findByServiceProvider(pNtwk.getId(), Type.VPCVirtualRouter.toString());
- if (provider == null) {
- throw new CloudRuntimeException("Cannot find service provider " + Type.VPCVirtualRouter.toString() + " in physical network " + pNtwk.getId());
- }
- vpcVrProvider = _vrProviderDao.findByNspIdAndType(provider.getId(), Type.VPCVirtualRouter);
- if (vpcVrProvider != null) {
- break;
- }
- }
-
- PublicIp sourceNatIp = _vpcMgr.assignSourceNatIpAddressToVpc(owner, vpc);
-
- DomainRouterVO router = deployVpcRouter(owner, dest, plan, params, false, vpcVrProvider, offeringId, vpc.getId(), sourceNatIp);
- routers.add(router);
-
- } finally {
- if (vpcLock != null) {
- _vpcDao.releaseFromLockTable(vpc.getId());
- }
- }
- return routers;
- }
-
- protected Pair> getDeploymentPlanAndRouters(long vpcId, DeployDestination dest) {
- long dcId = dest.getDataCenter().getId();
-
- DeploymentPlan plan = new DataCenterDeployment(dcId);
- List routers = getVpcRouters(vpcId);
-
- return new Pair>(plan, routers);
+ return this.routerDeploymentManager.deployVirtualRouterInVpc(routerDeploymentDefinition);
}
@Override
@@ -337,17 +256,6 @@ public class VpcVirtualNetworkApplianceManagerImpl extends VirtualNetworkApplian
return result;
}
- protected DomainRouterVO deployVpcRouter(Account owner, DeployDestination dest, DeploymentPlan plan, Map params, boolean isRedundant,
- VirtualRouterProvider vrProvider, long svcOffId, Long vpcId, PublicIp sourceNatIp) throws ConcurrentOperationException, InsufficientAddressCapacityException,
- InsufficientServerCapacityException, InsufficientCapacityException, StorageUnavailableException, ResourceUnavailableException {
-
- LinkedHashMap> networks = createVpcRouterNetworks(owner, isRedundant, plan, new Pair(true, sourceNatIp),vpcId);
- DomainRouterVO router =
- nwHelper.deployRouter(owner, dest, plan, params, isRedundant, vrProvider, svcOffId, vpcId, networks, true, _vpcMgr.getSupportedVpcHypervisors());
-
- return router;
- }
-
protected boolean setupVpcGuestNetwork(Network network, VirtualRouter router, boolean add, NicProfile guestNic) throws ConcurrentOperationException,
ResourceUnavailableException {
@@ -921,7 +829,7 @@ public class VpcVirtualNetworkApplianceManagerImpl extends VirtualNetworkApplian
boolean result = true;
try {
Network network = _networkModel.getNetwork(gateway.getNetworkId());
- NicProfile requested = createPrivateNicProfileForGateway(gateway);
+ NicProfile requested = this.vpcHelper.createPrivateNicProfileForGateway(gateway);
if (!nwHelper.checkRouterVersion(router)) {
s_logger.warn("Router requires upgrade. Unable to send command to router: " + router.getId());
@@ -1182,130 +1090,6 @@ public class VpcVirtualNetworkApplianceManagerImpl extends VirtualNetworkApplian
}
}
- protected LinkedHashMap> createVpcRouterNetworks(Account owner, boolean isRedundant, DeploymentPlan plan, Pair sourceNatIp,
- long vpcId) throws ConcurrentOperationException, InsufficientAddressCapacityException {
-
- TreeSet publicVlans = new TreeSet();
- publicVlans.add(sourceNatIp.second().getVlanTag());
-
- //1) allocate nic for control and source nat public ip
- LinkedHashMap> networks = super.createRouterNetworks(owner, isRedundant, plan, null, sourceNatIp);
-
- //2) allocate nic for private gateways if needed
- List privateGateways = _vpcMgr.getVpcPrivateGateways(vpcId);
- if (privateGateways != null && !privateGateways.isEmpty()) {
- for (PrivateGateway privateGateway : privateGateways) {
- NicProfile privateNic = createPrivateNicProfileForGateway(privateGateway);
- Network privateNetwork = _networkModel.getNetwork(privateGateway.getNetworkId());
- networks.put(privateNetwork, new ArrayList(Arrays.asList(privateNic)));
- }
- }
-
- //3) allocate nic for guest gateway if needed
- List extends Network> guestNetworks = _vpcMgr.getVpcNetworks(vpcId);
- for (Network guestNetwork : guestNetworks) {
- if (_networkModel.isPrivateGateway(guestNetwork.getId())) {
- continue;
- }
- if (guestNetwork.getState() == Network.State.Implemented || guestNetwork.getState() == Network.State.Setup) {
- NicProfile guestNic = createGuestNicProfileForVpcRouter(guestNetwork);
- networks.put(guestNetwork, new ArrayList(Arrays.asList(guestNic)));
- }
- }
-
- //4) allocate nic for additional public network(s)
- List ips = _ipAddressDao.listByAssociatedVpc(vpcId, false);
- List publicNics = new ArrayList();
- Network publicNetwork = null;
- for (IPAddressVO ip : ips) {
- PublicIp publicIp = PublicIp.createFromAddrAndVlan(ip, _vlanDao.findById(ip.getVlanId()));
- if ((ip.getState() == IpAddress.State.Allocated || ip.getState() == IpAddress.State.Allocating) && _vpcMgr.isIpAllocatedToVpc(ip) &&
- !publicVlans.contains(publicIp.getVlanTag())) {
- s_logger.debug("Allocating nic for router in vlan " + publicIp.getVlanTag());
- NicProfile publicNic = new NicProfile();
- publicNic.setDefaultNic(false);
- publicNic.setIp4Address(publicIp.getAddress().addr());
- publicNic.setGateway(publicIp.getGateway());
- publicNic.setNetmask(publicIp.getNetmask());
- publicNic.setMacAddress(publicIp.getMacAddress());
- publicNic.setBroadcastType(BroadcastDomainType.Vlan);
- publicNic.setBroadcastUri(BroadcastDomainType.Vlan.toUri(publicIp.getVlanTag()));
- publicNic.setIsolationUri(IsolationType.Vlan.toUri(publicIp.getVlanTag()));
- NetworkOffering publicOffering = _networkModel.getSystemAccountNetworkOfferings(NetworkOffering.SystemPublicNetwork).get(0);
- if (publicNetwork == null) {
- List extends Network> publicNetworks = _networkMgr.setupNetwork(_systemAcct, publicOffering, plan, null, null, false);
- publicNetwork = publicNetworks.get(0);
- }
- publicNics.add(publicNic);
- publicVlans.add(publicIp.getVlanTag());
- }
- }
- if (publicNetwork != null) {
- if (networks.get(publicNetwork) != null) {
- List publicNicProfiles = (List)networks.get(publicNetwork);
- publicNicProfiles.addAll(publicNics);
- networks.put(publicNetwork, publicNicProfiles);
- } else {
- networks.put(publicNetwork, publicNics);
- }
- }
-
- return networks;
- }
-
- @DB
- protected NicProfile createPrivateNicProfileForGateway(VpcGateway privateGateway) {
- Network privateNetwork = _networkModel.getNetwork(privateGateway.getNetworkId());
- PrivateIpVO ipVO = _privateIpDao.allocateIpAddress(privateNetwork.getDataCenterId(), privateNetwork.getId(), privateGateway.getIp4Address());
- if (ipVO == null) {
- throw new CloudRuntimeException("Unable to assign a private IP for private gateway " + privateGateway.getUuid());
- }
- Nic privateNic = _nicDao.findByIp4AddressAndNetworkId(ipVO.getIpAddress(), privateNetwork.getId());
-
- NicProfile privateNicProfile = new NicProfile();
-
- if (privateNic != null) {
- VirtualMachine vm = _vmDao.findById(privateNic.getInstanceId());
- privateNicProfile =
- new NicProfile(privateNic, privateNetwork, privateNic.getBroadcastUri(), privateNic.getIsolationUri(), _networkModel.getNetworkRate(
- privateNetwork.getId(), vm.getId()), _networkModel.isSecurityGroupSupportedInNetwork(privateNetwork), _networkModel.getNetworkTag(
- vm.getHypervisorType(), privateNetwork));
- } else {
- String netmask = NetUtils.getCidrNetmask(privateNetwork.getCidr());
- PrivateIpAddress ip =
- new PrivateIpAddress(ipVO, privateNetwork.getBroadcastUri().toString(), privateNetwork.getGateway(), netmask,
- NetUtils.long2Mac(NetUtils.createSequenceBasedMacAddress(ipVO.getMacAddress())));
-
- URI netUri = BroadcastDomainType.fromString(ip.getBroadcastUri());
- privateNicProfile.setIp4Address(ip.getIpAddress());
- privateNicProfile.setGateway(ip.getGateway());
- privateNicProfile.setNetmask(ip.getNetmask());
- privateNicProfile.setIsolationUri(netUri);
- privateNicProfile.setBroadcastUri(netUri);
- // can we solve this in setBroadcastUri()???
- // or more plugable construct is desirable
- privateNicProfile.setBroadcastType(BroadcastDomainType.getSchemeValue(netUri));
- privateNicProfile.setFormat(AddressFormat.Ip4);
- privateNicProfile.setReservationId(String.valueOf(ip.getBroadcastUri()));
- privateNicProfile.setMacAddress(ip.getMacAddress());
- }
-
- return privateNicProfile;
- }
-
- protected NicProfile createGuestNicProfileForVpcRouter(Network guestNetwork) {
- NicProfile guestNic = new NicProfile();
- guestNic.setIp4Address(guestNetwork.getGateway());
- guestNic.setBroadcastUri(guestNetwork.getBroadcastUri());
- guestNic.setBroadcastType(guestNetwork.getBroadcastDomainType());
- guestNic.setIsolationUri(guestNetwork.getBroadcastUri());
- guestNic.setMode(guestNetwork.getMode());
- String gatewayCidr = guestNetwork.getCidr();
- guestNic.setNetmask(NetUtils.getCidrNetmask(gatewayCidr));
-
- return guestNic;
- }
-
protected Pair