mirror of
https://github.com/apache/cloudstack.git
synced 2025-10-26 08:42:29 +01:00
Refactor to include network creation as actual deployment
Conflicts: server/src/org/cloud/network/router/deployment/RouterDeploymentDefinition.java server/src/org/cloud/network/router/deployment/RouterDeploymentDefinitionBuilder.java server/src/org/cloud/network/router/deployment/VpcRouterDeploymentDefinition.java server/test/org/cloud/network/router/deployment/VpcRouterDeploymentDefinitionTest.java
This commit is contained in:
parent
00dc8a7b24
commit
2da3ceda31
87
server/src/com/cloud/network/router/NetworkHelper.java
Normal file
87
server/src/com/cloud/network/router/NetworkHelper.java
Normal file
@ -0,0 +1,87 @@
|
||||
package com.cloud.network.router;
|
||||
|
||||
import java.util.LinkedHashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import org.cloud.network.router.deployment.RouterDeploymentDefinition;
|
||||
|
||||
import com.cloud.agent.api.to.NicTO;
|
||||
import com.cloud.agent.manager.Commands;
|
||||
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.ResourceUnavailableException;
|
||||
import com.cloud.exception.StorageUnavailableException;
|
||||
import com.cloud.hypervisor.Hypervisor.HypervisorType;
|
||||
import com.cloud.network.Network;
|
||||
import com.cloud.user.Account;
|
||||
import com.cloud.user.User;
|
||||
import com.cloud.vm.DomainRouterVO;
|
||||
import com.cloud.vm.NicProfile;
|
||||
import com.cloud.vm.VirtualMachineProfile.Param;
|
||||
|
||||
public interface NetworkHelper {
|
||||
|
||||
public abstract String getRouterControlIp(long routerId);
|
||||
|
||||
public abstract String getRouterIpInNetwork(long networkId, long instanceId);
|
||||
|
||||
// @Override
|
||||
public abstract boolean sendCommandsToRouter(VirtualRouter router,
|
||||
Commands cmds) throws AgentUnavailableException;
|
||||
|
||||
public abstract void handleSingleWorkingRedundantRouter(
|
||||
List<? extends VirtualRouter> connectedRouters,
|
||||
List<? extends VirtualRouter> disconnectedRouters, String reason)
|
||||
throws ResourceUnavailableException;
|
||||
|
||||
public abstract int getRealPriority(DomainRouterVO router);
|
||||
|
||||
// @Override
|
||||
public abstract NicTO getNicTO(VirtualRouter router, Long networkId,
|
||||
String broadcastUri);
|
||||
|
||||
// @Override
|
||||
public abstract VirtualRouter destroyRouter(long routerId, Account caller,
|
||||
Long callerUserId) throws ResourceUnavailableException,
|
||||
ConcurrentOperationException;
|
||||
|
||||
/**
|
||||
* Checks if the router is at the required version. Compares MS version and router version.
|
||||
*
|
||||
* @param router
|
||||
* @return
|
||||
*/
|
||||
// @Override
|
||||
public abstract boolean checkRouterVersion(VirtualRouter router);
|
||||
|
||||
// @Override
|
||||
public abstract List<DomainRouterVO> startRouters(
|
||||
RouterDeploymentDefinition routerDeploymentDefinition)
|
||||
throws StorageUnavailableException, InsufficientCapacityException,
|
||||
ConcurrentOperationException, ResourceUnavailableException;
|
||||
|
||||
// @Override
|
||||
public abstract DomainRouterVO startVirtualRouter(DomainRouterVO router,
|
||||
User user, Account caller, Map<Param, Object> params)
|
||||
throws StorageUnavailableException, InsufficientCapacityException,
|
||||
ConcurrentOperationException, ResourceUnavailableException;
|
||||
|
||||
// @Override
|
||||
public abstract DomainRouterVO deployRouter(
|
||||
RouterDeploymentDefinition routerDeploymentDefinition,
|
||||
LinkedHashMap<Network, List<? extends NicProfile>> networks,
|
||||
boolean startRouter, List<HypervisorType> supportedHypervisors)
|
||||
throws InsufficientAddressCapacityException,
|
||||
InsufficientServerCapacityException, InsufficientCapacityException,
|
||||
StorageUnavailableException, ResourceUnavailableException;
|
||||
|
||||
public abstract LinkedHashMap<Network, List<? extends NicProfile>> createRouterNetworks(
|
||||
RouterDeploymentDefinition routerDeploymentDefinition)
|
||||
throws ConcurrentOperationException,
|
||||
InsufficientAddressCapacityException;
|
||||
|
||||
}
|
||||
@ -22,14 +22,14 @@ import java.util.Iterator;
|
||||
import java.util.LinkedHashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.TreeSet;
|
||||
|
||||
import javax.ejb.Local;
|
||||
import javax.inject.Inject;
|
||||
|
||||
import org.apache.cloudstack.engine.orchestration.service.NetworkOrchestrationService;
|
||||
import org.apache.log4j.Logger;
|
||||
import org.cloud.network.router.deployment.RouterDeploymentDefinition;
|
||||
import org.cloud.network.router.deployment.VpcRouterDeploymentDefinition;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
import com.cloud.agent.AgentManager;
|
||||
import com.cloud.agent.api.Answer;
|
||||
@ -42,7 +42,6 @@ import com.cloud.dc.ClusterVO;
|
||||
import com.cloud.dc.DataCenter;
|
||||
import com.cloud.dc.Pod;
|
||||
import com.cloud.dc.dao.ClusterDao;
|
||||
import com.cloud.dc.dao.VlanDao;
|
||||
import com.cloud.deploy.DataCenterDeployment;
|
||||
import com.cloud.deploy.DeployDestination;
|
||||
import com.cloud.deploy.DeploymentPlan;
|
||||
@ -60,7 +59,6 @@ import com.cloud.host.Status;
|
||||
import com.cloud.host.dao.HostDao;
|
||||
import com.cloud.hypervisor.Hypervisor.HypervisorType;
|
||||
import com.cloud.maint.Version;
|
||||
import com.cloud.network.IpAddress;
|
||||
import com.cloud.network.IpAddressManager;
|
||||
import com.cloud.network.Network;
|
||||
import com.cloud.network.NetworkModel;
|
||||
@ -70,14 +68,11 @@ import com.cloud.network.Networks.TrafficType;
|
||||
import com.cloud.network.VirtualNetworkApplianceService;
|
||||
import com.cloud.network.addr.PublicIp;
|
||||
import com.cloud.network.dao.IPAddressDao;
|
||||
import com.cloud.network.dao.IPAddressVO;
|
||||
import com.cloud.network.dao.NetworkDao;
|
||||
import com.cloud.network.dao.NetworkVO;
|
||||
import com.cloud.network.dao.UserIpv6AddressDao;
|
||||
import com.cloud.network.router.VirtualRouter.RedundantState;
|
||||
import com.cloud.network.router.VirtualRouter.Role;
|
||||
import com.cloud.network.vpc.PrivateGateway;
|
||||
import com.cloud.network.vpc.VpcManager;
|
||||
import com.cloud.network.vpn.Site2SiteVpnManager;
|
||||
import com.cloud.offering.NetworkOffering;
|
||||
import com.cloud.resource.ResourceManager;
|
||||
@ -104,22 +99,25 @@ import com.cloud.vm.VirtualMachineProfile.Param;
|
||||
import com.cloud.vm.dao.DomainRouterDao;
|
||||
import com.cloud.vm.dao.NicDao;
|
||||
|
||||
public class NetworkGeneralHelper {
|
||||
@Component
|
||||
//This will not be a public service anymore, but a helper for the only public service
|
||||
@Local(value = {NetworkHelperImpl.class})
|
||||
public class NetworkHelperImpl implements NetworkHelper {
|
||||
|
||||
private static final Logger s_logger = Logger.getLogger(NetworkGeneralHelper.class);
|
||||
private static final Logger s_logger = Logger.getLogger(NetworkHelperImpl.class);
|
||||
|
||||
@Inject
|
||||
private NicDao _nicDao;
|
||||
protected NicDao _nicDao;
|
||||
@Inject
|
||||
private NetworkDao _networkDao;
|
||||
@Inject
|
||||
private DomainRouterDao _routerDao;
|
||||
protected DomainRouterDao _routerDao;
|
||||
@Inject
|
||||
private AgentManager _agentMgr;
|
||||
@Inject
|
||||
private AlertManager _alertMgr;
|
||||
@Inject
|
||||
private NetworkModel _networkModel;
|
||||
protected NetworkModel _networkModel;
|
||||
@Inject
|
||||
private VirtualMachineManager _itMgr;
|
||||
@Inject
|
||||
@ -139,21 +137,18 @@ public class NetworkGeneralHelper {
|
||||
@Inject
|
||||
private ClusterDao _clusterDao;
|
||||
@Inject
|
||||
private IPAddressDao _ipAddressDao;
|
||||
protected IPAddressDao _ipAddressDao;
|
||||
@Inject
|
||||
private IpAddressManager _ipAddrMgr;
|
||||
@Inject
|
||||
private UserIpv6AddressDao _ipv6Dao;
|
||||
@Inject
|
||||
private NetworkOrchestrationService _networkMgr;
|
||||
@Inject
|
||||
protected VpcVirtualNetworkHelperImpl _vpcHelper;
|
||||
@Inject
|
||||
protected VpcManager _vpcMgr;
|
||||
@Inject
|
||||
protected VlanDao _vlanDao;
|
||||
|
||||
protected NetworkOrchestrationService _networkMgr;
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see com.cloud.network.router.NetworkHelper#getRouterControlIp(long)
|
||||
*/
|
||||
@Override
|
||||
public String getRouterControlIp(final long routerId) {
|
||||
String routerControlIpAddress = null;
|
||||
final List<NicVO> nics = _nicDao.listByVmId(routerId);
|
||||
@ -175,12 +170,20 @@ public class NetworkGeneralHelper {
|
||||
return routerControlIpAddress;
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see com.cloud.network.router.NetworkHelper#getRouterIpInNetwork(long, long)
|
||||
*/
|
||||
@Override
|
||||
public String getRouterIpInNetwork(final long networkId, final long instanceId) {
|
||||
return _nicDao.getIpAddress(networkId, instanceId);
|
||||
}
|
||||
|
||||
|
||||
// @Override
|
||||
/* (non-Javadoc)
|
||||
* @see com.cloud.network.router.NetworkHelper#sendCommandsToRouter(com.cloud.network.router.VirtualRouter, com.cloud.agent.manager.Commands)
|
||||
*/
|
||||
@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()
|
||||
@ -216,6 +219,7 @@ public class NetworkGeneralHelper {
|
||||
return result;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void handleSingleWorkingRedundantRouter(final List<? extends VirtualRouter> connectedRouters, final List<? extends VirtualRouter> disconnectedRouters, final String reason)
|
||||
throws ResourceUnavailableException {
|
||||
if (connectedRouters.isEmpty() || disconnectedRouters.isEmpty()) {
|
||||
@ -268,6 +272,10 @@ public class NetworkGeneralHelper {
|
||||
}
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see com.cloud.network.router.NetworkHelper#getRealPriority(com.cloud.vm.DomainRouterVO)
|
||||
*/
|
||||
@Override
|
||||
public int getRealPriority(final DomainRouterVO router) {
|
||||
int priority = router.getPriority();
|
||||
if (router.getIsPriorityBumpUp()) {
|
||||
@ -277,6 +285,10 @@ public class NetworkGeneralHelper {
|
||||
}
|
||||
|
||||
// @Override
|
||||
/* (non-Javadoc)
|
||||
* @see com.cloud.network.router.NetworkHelper#getNicTO(com.cloud.network.router.VirtualRouter, java.lang.Long, java.lang.String)
|
||||
*/
|
||||
@Override
|
||||
public NicTO getNicTO(final VirtualRouter router, final Long networkId, final String broadcastUri) {
|
||||
NicProfile nicProfile = _networkModel.getNicProfile(router, networkId, broadcastUri);
|
||||
|
||||
@ -284,6 +296,10 @@ public class NetworkGeneralHelper {
|
||||
}
|
||||
|
||||
// @Override
|
||||
/* (non-Javadoc)
|
||||
* @see com.cloud.network.router.NetworkHelper#destroyRouter(long, com.cloud.user.Account, java.lang.Long)
|
||||
*/
|
||||
@Override
|
||||
public VirtualRouter destroyRouter(final long routerId, final Account caller, final Long callerUserId) throws ResourceUnavailableException, ConcurrentOperationException {
|
||||
|
||||
if (s_logger.isDebugEnabled()) {
|
||||
@ -302,13 +318,11 @@ public class NetworkGeneralHelper {
|
||||
return router;
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks if the router is at the required version. Compares MS version and router version.
|
||||
*
|
||||
* @param router
|
||||
* @return
|
||||
/* (non-Javadoc)
|
||||
* @see com.cloud.network.router.NetworkHelper#checkRouterVersion(com.cloud.network.router.VirtualRouter)
|
||||
*/
|
||||
// @Override
|
||||
@Override
|
||||
public boolean checkRouterVersion(final VirtualRouter router) {
|
||||
if(!VirtualNetworkApplianceManagerImpl.routerVersionCheckEnabled.value()){
|
||||
//Router version check is disabled.
|
||||
@ -318,7 +332,7 @@ public class NetworkGeneralHelper {
|
||||
return false;
|
||||
}
|
||||
final String trimmedVersion = Version.trimRouterVersion(router.getTemplateVersion());
|
||||
return (Version.compare(trimmedVersion, VirtualNetworkApplianceService.MinVRVersion) >= 0);
|
||||
return Version.compare(trimmedVersion, VirtualNetworkApplianceService.MinVRVersion) >= 0;
|
||||
}
|
||||
|
||||
|
||||
@ -374,6 +388,10 @@ public class NetworkGeneralHelper {
|
||||
|
||||
|
||||
// @Override
|
||||
/* (non-Javadoc)
|
||||
* @see com.cloud.network.router.NetworkHelper#startRouters(org.cloud.network.router.deployment.RouterDeploymentDefinition)
|
||||
*/
|
||||
@Override
|
||||
public List<DomainRouterVO> startRouters(final RouterDeploymentDefinition routerDeploymentDefinition)
|
||||
throws StorageUnavailableException, InsufficientCapacityException,
|
||||
ConcurrentOperationException, ResourceUnavailableException {
|
||||
@ -403,6 +421,10 @@ public class NetworkGeneralHelper {
|
||||
}
|
||||
|
||||
// @Override
|
||||
/* (non-Javadoc)
|
||||
* @see com.cloud.network.router.NetworkHelper#startVirtualRouter(com.cloud.vm.DomainRouterVO, com.cloud.user.User, com.cloud.user.Account, java.util.Map)
|
||||
*/
|
||||
@Override
|
||||
public DomainRouterVO startVirtualRouter(final DomainRouterVO router, final User user, final Account caller, final Map<Param, Object> params)
|
||||
throws StorageUnavailableException, InsufficientCapacityException,
|
||||
ConcurrentOperationException, ResourceUnavailableException {
|
||||
@ -484,8 +506,17 @@ public class NetworkGeneralHelper {
|
||||
return result;
|
||||
}
|
||||
|
||||
// @Override
|
||||
// public DomainRouterVO deployRouter(final RouterDeploymentDefinition routerDeploymentDefinition) {
|
||||
// routerDeploymentDefinition.createNetwork();
|
||||
// doDeployRouter
|
||||
// }
|
||||
|
||||
// @Override
|
||||
/* (non-Javadoc)
|
||||
* @see com.cloud.network.router.NetworkHelper#deployRouter(org.cloud.network.router.deployment.RouterDeploymentDefinition, java.util.LinkedHashMap, boolean, java.util.List)
|
||||
*/
|
||||
@Override
|
||||
public DomainRouterVO deployRouter(final RouterDeploymentDefinition routerDeploymentDefinition,
|
||||
final LinkedHashMap<Network, List<? extends NicProfile>> networks,
|
||||
final boolean startRouter, final List<HypervisorType> supportedHypervisors)
|
||||
@ -625,7 +656,7 @@ public class NetworkGeneralHelper {
|
||||
}
|
||||
|
||||
if (hypervisors.isEmpty()) {
|
||||
final String errMsg = (hTypesStr.capacity() > 0) ? "supporting hypervisors " + hTypesStr.toString() : "";
|
||||
final String errMsg = hTypesStr.capacity() > 0 ? "supporting hypervisors " + hTypesStr.toString() : "";
|
||||
if (routerDeploymentDefinition.getPodId() != null) {
|
||||
throw new InsufficientServerCapacityException("Unable to create virtual router, " + "there are no clusters in the pod " + errMsg, Pod.class,
|
||||
routerDeploymentDefinition.getPodId());
|
||||
@ -670,6 +701,10 @@ public class NetworkGeneralHelper {
|
||||
}
|
||||
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see com.cloud.network.router.NetworkHelper#createRouterNetworks(org.cloud.network.router.deployment.RouterDeploymentDefinition)
|
||||
*/
|
||||
@Override
|
||||
public LinkedHashMap<Network, List<? extends NicProfile>> createRouterNetworks(
|
||||
final RouterDeploymentDefinition routerDeploymentDefinition)
|
||||
throws ConcurrentOperationException, InsufficientAddressCapacityException {
|
||||
@ -782,81 +817,4 @@ public class NetworkGeneralHelper {
|
||||
|
||||
return networks;
|
||||
}
|
||||
|
||||
public LinkedHashMap<Network, List<? extends NicProfile>> createVpcRouterNetworks(
|
||||
final VpcRouterDeploymentDefinition vpcRouterDeploymentDefinition)
|
||||
throws ConcurrentOperationException, InsufficientAddressCapacityException {
|
||||
|
||||
final TreeSet<String> publicVlans = new TreeSet<String>();
|
||||
publicVlans.add(vpcRouterDeploymentDefinition.getSourceNatIP().getVlanTag());
|
||||
|
||||
//1) allocate nic for control and source nat public ip
|
||||
final LinkedHashMap<Network, List<? extends NicProfile>> networks =
|
||||
createRouterNetworks(vpcRouterDeploymentDefinition);
|
||||
|
||||
|
||||
final Long vpcId = vpcRouterDeploymentDefinition.getVpc().getId();
|
||||
//2) allocate nic for private gateways if needed
|
||||
final List<PrivateGateway> privateGateways = _vpcMgr.getVpcPrivateGateways(vpcId);
|
||||
if (privateGateways != null && !privateGateways.isEmpty()) {
|
||||
for (PrivateGateway privateGateway : privateGateways) {
|
||||
NicProfile privateNic = _vpcHelper.createPrivateNicProfileForGateway(privateGateway);
|
||||
Network privateNetwork = _networkModel.getNetwork(privateGateway.getNetworkId());
|
||||
networks.put(privateNetwork, new ArrayList<NicProfile>(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 = _vpcHelper.createGuestNicProfileForVpcRouter(guestNetwork);
|
||||
networks.put(guestNetwork, new ArrayList<NicProfile>(Arrays.asList(guestNic)));
|
||||
}
|
||||
}
|
||||
|
||||
//4) allocate nic for additional public network(s)
|
||||
final List<IPAddressVO> ips = _ipAddressDao.listByAssociatedVpc(vpcId, false);
|
||||
final List<NicProfile> publicNics = new ArrayList<NicProfile>();
|
||||
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(VirtualNwStatus.account,
|
||||
publicOffering, vpcRouterDeploymentDefinition.getPlan(), null, null, false);
|
||||
publicNetwork = publicNetworks.get(0);
|
||||
}
|
||||
publicNics.add(publicNic);
|
||||
publicVlans.add(publicIp.getVlanTag());
|
||||
}
|
||||
}
|
||||
if (publicNetwork != null) {
|
||||
if (networks.get(publicNetwork) != null) {
|
||||
List<NicProfile> publicNicProfiles = (List<NicProfile>)networks.get(publicNetwork);
|
||||
publicNicProfiles.addAll(publicNics);
|
||||
networks.put(publicNetwork, publicNicProfiles);
|
||||
} else {
|
||||
networks.put(publicNetwork, publicNics);
|
||||
}
|
||||
}
|
||||
|
||||
return networks;
|
||||
}
|
||||
|
||||
}
|
||||
@ -386,7 +386,7 @@ Configurable, StateListener<State, VirtualMachine.Event, VirtualMachine> {
|
||||
@Inject
|
||||
protected NetworkTopologyContext _networkTopologyContext;
|
||||
@Inject
|
||||
protected NetworkGeneralHelper _nwHelper;
|
||||
protected NetworkHelper _nwHelper;
|
||||
@Inject
|
||||
protected RouterDeploymentDefinitionBuilder _routerDeploymentManagerBuilder;
|
||||
|
||||
|
||||
15
server/src/com/cloud/network/router/VpcNetworkHelper.java
Normal file
15
server/src/com/cloud/network/router/VpcNetworkHelper.java
Normal file
@ -0,0 +1,15 @@
|
||||
package com.cloud.network.router;
|
||||
|
||||
import com.cloud.network.Network;
|
||||
import com.cloud.network.vpc.VpcGateway;
|
||||
import com.cloud.vm.NicProfile;
|
||||
|
||||
public interface VpcNetworkHelper extends NetworkHelper {
|
||||
|
||||
public abstract NicProfile createPrivateNicProfileForGateway(
|
||||
VpcGateway privateGateway);
|
||||
|
||||
public abstract NicProfile createGuestNicProfileForVpcRouter(
|
||||
Network guestNetwork);
|
||||
|
||||
}
|
||||
210
server/src/com/cloud/network/router/VpcNetworkHelperImpl.java
Normal file
210
server/src/com/cloud/network/router/VpcNetworkHelperImpl.java
Normal file
@ -0,0 +1,210 @@
|
||||
// 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.net.URI;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.LinkedHashMap;
|
||||
import java.util.List;
|
||||
import java.util.TreeSet;
|
||||
|
||||
import javax.ejb.Local;
|
||||
import javax.inject.Inject;
|
||||
|
||||
import org.apache.log4j.Logger;
|
||||
import org.cloud.network.router.deployment.RouterDeploymentDefinition;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
import com.cloud.dc.dao.VlanDao;
|
||||
import com.cloud.exception.ConcurrentOperationException;
|
||||
import com.cloud.exception.InsufficientAddressCapacityException;
|
||||
import com.cloud.network.IpAddress;
|
||||
import com.cloud.network.Network;
|
||||
import com.cloud.network.Networks.AddressFormat;
|
||||
import com.cloud.network.Networks.BroadcastDomainType;
|
||||
import com.cloud.network.Networks.IsolationType;
|
||||
import com.cloud.network.addr.PublicIp;
|
||||
import com.cloud.network.dao.IPAddressVO;
|
||||
import com.cloud.network.vpc.PrivateGateway;
|
||||
import com.cloud.network.vpc.PrivateIpAddress;
|
||||
import com.cloud.network.vpc.PrivateIpVO;
|
||||
import com.cloud.network.vpc.VpcGateway;
|
||||
import com.cloud.network.vpc.VpcManager;
|
||||
import com.cloud.network.vpc.dao.PrivateIpDao;
|
||||
import com.cloud.offering.NetworkOffering;
|
||||
import com.cloud.utils.db.DB;
|
||||
import com.cloud.utils.net.NetUtils;
|
||||
import com.cloud.vm.Nic;
|
||||
import com.cloud.vm.NicProfile;
|
||||
import com.cloud.vm.VirtualMachine;
|
||||
import com.cloud.vm.dao.VMInstanceDao;
|
||||
|
||||
|
||||
@Component
|
||||
// This will not be a public service anymore, but a helper for the only public service
|
||||
@Local(value = {VpcNetworkHelperImpl.class})
|
||||
public class VpcNetworkHelperImpl extends NetworkHelperImpl implements VpcNetworkHelper {
|
||||
|
||||
private static final Logger s_logger = Logger.getLogger(VpcNetworkHelperImpl.class);
|
||||
|
||||
@Inject
|
||||
private VMInstanceDao _vmDao;
|
||||
@Inject
|
||||
private PrivateIpDao _privateIpDao;
|
||||
@Inject
|
||||
private VlanDao _vlanDao;
|
||||
@Inject
|
||||
protected VpcManager _vpcMgr;
|
||||
|
||||
|
||||
@Override
|
||||
@DB
|
||||
public NicProfile createPrivateNicProfileForGateway(VpcGateway privateGateway) {
|
||||
Network privateNetwork = _networkModel.getNetwork(privateGateway.getNetworkId());
|
||||
PrivateIpVO ipVO = _privateIpDao.allocateIpAddress(privateNetwork.getDataCenterId(), privateNetwork.getId(), privateGateway.getIp4Address());
|
||||
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;
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see com.cloud.network.router.VpcNetworkHelper#createGuestNicProfileForVpcRouter(com.cloud.network.Network)
|
||||
*/
|
||||
@Override
|
||||
public NicProfile createGuestNicProfileForVpcRouter(final 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;
|
||||
}
|
||||
|
||||
/* (non-Javadoc)
|
||||
* @see com.cloud.network.router.VpcNetworkHelper#createVpcRouterNetworks(org.cloud.network.router.deployment.VpcRouterDeploymentDefinition)
|
||||
*/
|
||||
@Override
|
||||
public LinkedHashMap<Network, List<? extends NicProfile>> createRouterNetworks(
|
||||
final RouterDeploymentDefinition vpcRouterDeploymentDefinition)
|
||||
throws ConcurrentOperationException, InsufficientAddressCapacityException {
|
||||
|
||||
final TreeSet<String> publicVlans = new TreeSet<String>();
|
||||
publicVlans.add(vpcRouterDeploymentDefinition.getSourceNatIP().getVlanTag());
|
||||
|
||||
//1) allocate nic for control and source nat public ip
|
||||
final LinkedHashMap<Network, List<? extends NicProfile>> networks =
|
||||
super.createRouterNetworks(vpcRouterDeploymentDefinition);
|
||||
|
||||
|
||||
final Long vpcId = vpcRouterDeploymentDefinition.getVpc().getId();
|
||||
//2) allocate nic for private gateways if needed
|
||||
final List<PrivateGateway> privateGateways = this._vpcMgr.getVpcPrivateGateways(vpcId);
|
||||
if (privateGateways != null && !privateGateways.isEmpty()) {
|
||||
for (PrivateGateway privateGateway : privateGateways) {
|
||||
NicProfile privateNic = this.createPrivateNicProfileForGateway(privateGateway);
|
||||
Network privateNetwork = _networkModel.getNetwork(privateGateway.getNetworkId());
|
||||
networks.put(privateNetwork, new ArrayList<NicProfile>(Arrays.asList(privateNic)));
|
||||
}
|
||||
}
|
||||
|
||||
//3) allocate nic for guest gateway if needed
|
||||
List<? extends Network> guestNetworks = this._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<NicProfile>(Arrays.asList(guestNic)));
|
||||
}
|
||||
}
|
||||
|
||||
//4) allocate nic for additional public network(s)
|
||||
final List<IPAddressVO> ips = _ipAddressDao.listByAssociatedVpc(vpcId, false);
|
||||
final List<NicProfile> publicNics = new ArrayList<NicProfile>();
|
||||
Network publicNetwork = null;
|
||||
for (IPAddressVO ip : ips) {
|
||||
PublicIp publicIp = PublicIp.createFromAddrAndVlan(ip, this._vlanDao.findById(ip.getVlanId()));
|
||||
if ((ip.getState() == IpAddress.State.Allocated || ip.getState() == IpAddress.State.Allocating) && this._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(VirtualNwStatus.account,
|
||||
publicOffering, vpcRouterDeploymentDefinition.getPlan(), null, null, false);
|
||||
publicNetwork = publicNetworks.get(0);
|
||||
}
|
||||
publicNics.add(publicNic);
|
||||
publicVlans.add(publicIp.getVlanTag());
|
||||
}
|
||||
}
|
||||
if (publicNetwork != null) {
|
||||
if (networks.get(publicNetwork) != null) {
|
||||
List<NicProfile> publicNicProfiles = (List<NicProfile>)networks.get(publicNetwork);
|
||||
publicNicProfiles.addAll(publicNics);
|
||||
networks.put(publicNetwork, publicNicProfiles);
|
||||
} else {
|
||||
networks.put(publicNetwork, publicNics);
|
||||
}
|
||||
}
|
||||
|
||||
return networks;
|
||||
}
|
||||
}
|
||||
@ -135,7 +135,7 @@ public class VpcVirtualNetworkApplianceManagerImpl extends VirtualNetworkApplian
|
||||
private EntityManager _entityMgr;
|
||||
|
||||
@Inject
|
||||
private VpcVirtualNetworkHelperImpl vpcHelper;
|
||||
private VpcNetworkHelper vpcHelper;
|
||||
|
||||
@Override
|
||||
public boolean configure(final String name, final Map<String, Object> params) throws ConfigurationException {
|
||||
|
||||
@ -1,121 +0,0 @@
|
||||
// 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.net.URI;
|
||||
import java.util.List;
|
||||
|
||||
import javax.ejb.Local;
|
||||
import javax.inject.Inject;
|
||||
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
import com.cloud.network.Network;
|
||||
import com.cloud.network.NetworkModel;
|
||||
import com.cloud.network.Networks.AddressFormat;
|
||||
import com.cloud.network.Networks.BroadcastDomainType;
|
||||
import com.cloud.network.vpc.PrivateIpAddress;
|
||||
import com.cloud.network.vpc.PrivateIpVO;
|
||||
import com.cloud.network.vpc.VpcGateway;
|
||||
import com.cloud.network.vpc.dao.PrivateIpDao;
|
||||
import com.cloud.utils.db.DB;
|
||||
import com.cloud.utils.net.NetUtils;
|
||||
import com.cloud.vm.DomainRouterVO;
|
||||
import com.cloud.vm.Nic;
|
||||
import com.cloud.vm.NicProfile;
|
||||
import com.cloud.vm.VirtualMachine;
|
||||
import com.cloud.vm.dao.DomainRouterDao;
|
||||
import com.cloud.vm.dao.NicDao;
|
||||
import com.cloud.vm.dao.VMInstanceDao;
|
||||
|
||||
|
||||
@Component
|
||||
// This will not be a public service anymore, but a helper for the only public service
|
||||
@Local(value = {VpcVirtualNetworkHelperImpl.class})
|
||||
public class VpcVirtualNetworkHelperImpl {
|
||||
|
||||
@Inject
|
||||
private VMInstanceDao _vmDao;
|
||||
private PrivateIpDao _privateIpDao;
|
||||
@Inject
|
||||
private DomainRouterDao _routerDao;
|
||||
@Inject
|
||||
private NetworkModel _networkModel;
|
||||
@Inject
|
||||
private NicDao _nicDao;
|
||||
|
||||
protected NetworkGeneralHelper nwHelper = new NetworkGeneralHelper();
|
||||
|
||||
|
||||
//@Override
|
||||
public List<DomainRouterVO> getVpcRouters(long vpcId) {
|
||||
return _routerDao.listByVpcId(vpcId);
|
||||
}
|
||||
|
||||
//@Override
|
||||
@DB
|
||||
public NicProfile createPrivateNicProfileForGateway(VpcGateway privateGateway) {
|
||||
Network privateNetwork = _networkModel.getNetwork(privateGateway.getNetworkId());
|
||||
PrivateIpVO ipVO = _privateIpDao.allocateIpAddress(privateNetwork.getDataCenterId(), privateNetwork.getId(), privateGateway.getIp4Address());
|
||||
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;
|
||||
}
|
||||
|
||||
public NicProfile createGuestNicProfileForVpcRouter(final 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;
|
||||
}
|
||||
|
||||
}
|
||||
@ -37,7 +37,7 @@ import com.cloud.network.dao.IPAddressDao;
|
||||
import com.cloud.network.dao.LoadBalancerDao;
|
||||
import com.cloud.network.dao.NetworkDao;
|
||||
import com.cloud.network.lb.LoadBalancingRulesManager;
|
||||
import com.cloud.network.router.NetworkGeneralHelper;
|
||||
import com.cloud.network.router.NetworkHelper;
|
||||
import com.cloud.network.router.RouterControlHelper;
|
||||
import com.cloud.network.router.VirtualNetworkApplianceManager;
|
||||
import com.cloud.network.router.VirtualRouter;
|
||||
@ -110,7 +110,7 @@ public abstract class RuleApplier {
|
||||
|
||||
protected RouterControlHelper _routerControlHelper;
|
||||
|
||||
protected NetworkGeneralHelper _networkHelper;
|
||||
protected NetworkHelper _networkHelper;
|
||||
|
||||
public RuleApplier(final Network network) {
|
||||
_network = network;
|
||||
|
||||
@ -37,7 +37,7 @@ import com.cloud.network.dao.LoadBalancerDao;
|
||||
import com.cloud.network.dao.NetworkDao;
|
||||
import com.cloud.network.lb.LoadBalancingRule;
|
||||
import com.cloud.network.lb.LoadBalancingRulesManager;
|
||||
import com.cloud.network.router.NetworkGeneralHelper;
|
||||
import com.cloud.network.router.NetworkHelper;
|
||||
import com.cloud.network.router.RouterControlHelper;
|
||||
import com.cloud.network.router.VirtualNetworkApplianceManager;
|
||||
import com.cloud.network.vpc.NetworkACLItem;
|
||||
@ -130,7 +130,7 @@ public class VirtualNetworkApplianceFactory {
|
||||
protected IpAddressManager _ipAddrMgr;
|
||||
|
||||
@Inject
|
||||
protected NetworkGeneralHelper _networkHelper;
|
||||
protected NetworkHelper _networkHelper;
|
||||
|
||||
public LoadBalancingRules createLoadBalancingRules(final Network network, final List<LoadBalancingRule> rules) {
|
||||
LoadBalancingRules lbRules = new LoadBalancingRules(network, rules);
|
||||
|
||||
@ -41,7 +41,7 @@ import com.cloud.network.Networks.TrafficType;
|
||||
import com.cloud.network.PublicIpAddress;
|
||||
import com.cloud.network.VpnUser;
|
||||
import com.cloud.network.lb.LoadBalancingRule;
|
||||
import com.cloud.network.router.NetworkGeneralHelper;
|
||||
import com.cloud.network.router.NetworkHelper;
|
||||
import com.cloud.network.router.VirtualRouter;
|
||||
import com.cloud.network.rules.DhcpEntryRules;
|
||||
import com.cloud.network.rules.FirewallRule;
|
||||
@ -87,7 +87,7 @@ public class BasicNetworkTopology implements NetworkTopology {
|
||||
protected HostDao _hostDao;
|
||||
|
||||
@Inject
|
||||
protected NetworkGeneralHelper _nwHelper;
|
||||
protected NetworkHelper _nwHelper;
|
||||
|
||||
@Inject
|
||||
protected UserVmDao _userVmDao;
|
||||
|
||||
@ -32,7 +32,7 @@ import com.cloud.network.Network;
|
||||
import com.cloud.network.PublicIpAddress;
|
||||
import com.cloud.network.VpnUser;
|
||||
import com.cloud.network.lb.LoadBalancingRule;
|
||||
import com.cloud.network.router.NetworkGeneralHelper;
|
||||
import com.cloud.network.router.NetworkHelper;
|
||||
import com.cloud.network.router.VirtualRouter;
|
||||
import com.cloud.network.rules.DhcpEntryRules;
|
||||
import com.cloud.network.rules.DhcpSubNetRules;
|
||||
@ -70,7 +70,7 @@ public class BasicNetworkVisitor extends NetworkTopologyVisitor {
|
||||
}
|
||||
|
||||
@Inject
|
||||
protected NetworkGeneralHelper _networkGeneralHelper;
|
||||
protected NetworkHelper _networkGeneralHelper;
|
||||
|
||||
@Override
|
||||
public boolean visit(final StaticNatRules nat) throws ResourceUnavailableException {
|
||||
|
||||
@ -52,7 +52,7 @@ import com.cloud.network.dao.NetworkDao;
|
||||
import com.cloud.network.dao.PhysicalNetworkServiceProviderDao;
|
||||
import com.cloud.network.dao.UserIpv6AddressDao;
|
||||
import com.cloud.network.dao.VirtualRouterProviderDao;
|
||||
import com.cloud.network.router.NetworkGeneralHelper;
|
||||
import com.cloud.network.router.NetworkHelper;
|
||||
import com.cloud.network.router.VirtualRouter.Role;
|
||||
import com.cloud.network.vpc.Vpc;
|
||||
import com.cloud.offerings.dao.NetworkOfferingDao;
|
||||
@ -90,10 +90,14 @@ public class RouterDeploymentDefinition {
|
||||
protected UserIpv6AddressDao ipv6Dao;
|
||||
protected IPAddressDao ipAddressDao;
|
||||
protected VirtualRouterProvider vrProvider;
|
||||
<<<<<<< HEAD
|
||||
|
||||
|
||||
@Inject
|
||||
protected NetworkGeneralHelper nwHelper;
|
||||
=======
|
||||
protected NetworkHelper nwHelper;
|
||||
>>>>>>> 40df9d4... Refactor to include network creation as actual deployment
|
||||
|
||||
|
||||
protected Network guestNetwork;
|
||||
@ -397,7 +401,7 @@ public class RouterDeploymentDefinition {
|
||||
LinkedHashMap<Network, List<? extends NicProfile>> networks =
|
||||
this.nwHelper.createRouterNetworks(this);
|
||||
//don't start the router as we are holding the network lock that needs to be released at the end of router allocation
|
||||
DomainRouterVO router = nwHelper.deployRouter(this, networks, false, null);
|
||||
DomainRouterVO router = this.nwHelper.deployRouter(this, networks, false, null);
|
||||
|
||||
if (router != null) {
|
||||
this.routerDao.addRouterToGuestNetwork(router, this.guestNetwork);
|
||||
|
||||
@ -36,8 +36,8 @@ import com.cloud.network.dao.PhysicalNetworkDao;
|
||||
import com.cloud.network.dao.PhysicalNetworkServiceProviderDao;
|
||||
import com.cloud.network.dao.UserIpv6AddressDao;
|
||||
import com.cloud.network.dao.VirtualRouterProviderDao;
|
||||
import com.cloud.network.router.NetworkGeneralHelper;
|
||||
import com.cloud.network.router.VpcVirtualNetworkHelperImpl;
|
||||
import com.cloud.network.router.NetworkHelper;
|
||||
import com.cloud.network.router.VpcNetworkHelper;
|
||||
import com.cloud.network.vpc.Vpc;
|
||||
import com.cloud.network.vpc.VpcManager;
|
||||
import com.cloud.network.vpc.dao.VpcDao;
|
||||
@ -93,9 +93,9 @@ public class RouterDeploymentDefinitionBuilder {
|
||||
private VlanDao vlanDao;
|
||||
|
||||
@Inject
|
||||
protected NetworkGeneralHelper nwHelper;
|
||||
protected NetworkHelper nwHelper;
|
||||
@Inject
|
||||
protected VpcVirtualNetworkHelperImpl vpcHelper;
|
||||
protected VpcNetworkHelper vpcNwHelper;
|
||||
|
||||
protected Long offeringId;
|
||||
|
||||
@ -141,7 +141,7 @@ public class RouterDeploymentDefinitionBuilder {
|
||||
routerDeploymentDefinition.pNtwkDao = pNtwkDao;
|
||||
routerDeploymentDefinition.vpcMgr = vpcMgr;
|
||||
routerDeploymentDefinition.vlanDao = vlanDao;
|
||||
routerDeploymentDefinition.vpcHelper = vpcHelper;
|
||||
routerDeploymentDefinition.vpcHelper = vpcNwHelper;
|
||||
}
|
||||
|
||||
public class IntermediateStateBuilder {
|
||||
|
||||
@ -21,8 +21,6 @@ import java.util.LinkedHashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import javax.inject.Inject;
|
||||
|
||||
import org.apache.log4j.Logger;
|
||||
|
||||
import com.cloud.dc.dao.VlanDao;
|
||||
@ -37,7 +35,7 @@ import com.cloud.network.PhysicalNetwork;
|
||||
import com.cloud.network.PhysicalNetworkServiceProvider;
|
||||
import com.cloud.network.VirtualRouterProvider.Type;
|
||||
import com.cloud.network.dao.PhysicalNetworkDao;
|
||||
import com.cloud.network.router.VpcVirtualNetworkHelperImpl;
|
||||
import com.cloud.network.router.VpcNetworkHelper;
|
||||
import com.cloud.network.vpc.Vpc;
|
||||
import com.cloud.network.vpc.VpcManager;
|
||||
import com.cloud.network.vpc.dao.VpcDao;
|
||||
@ -47,24 +45,22 @@ import com.cloud.utils.exception.CloudRuntimeException;
|
||||
import com.cloud.vm.DomainRouterVO;
|
||||
import com.cloud.vm.NicProfile;
|
||||
import com.cloud.vm.VirtualMachineProfile.Param;
|
||||
import com.cloud.vm.dao.DomainRouterDao;
|
||||
|
||||
public class VpcRouterDeploymentDefinition extends RouterDeploymentDefinition {
|
||||
private static final Logger logger = Logger.getLogger(VpcRouterDeploymentDefinition.class);
|
||||
|
||||
@Inject
|
||||
protected VpcVirtualNetworkHelperImpl vpcHelper;
|
||||
|
||||
protected DomainRouterDao routerDao;
|
||||
protected VpcDao vpcDao;
|
||||
protected VpcOfferingDao vpcOffDao;
|
||||
protected PhysicalNetworkDao pNtwkDao;
|
||||
protected VpcManager vpcMgr;
|
||||
protected VlanDao vlanDao;
|
||||
protected VpcNetworkHelper vpcNetworkHelper;
|
||||
|
||||
protected Vpc vpc;
|
||||
|
||||
|
||||
protected VpcRouterDeploymentDefinition(final Vpc vpc, final DeployDestination dest, final Account owner,
|
||||
final Map<Param, Object> params, final boolean isRedundant) {
|
||||
protected VpcRouterDeploymentDefinition(final Vpc vpc, final DeployDestination dest, final Account owner, final Map<Param, Object> params, final boolean isRedundant) {
|
||||
|
||||
super(null, dest, owner, params, isRedundant);
|
||||
|
||||
@ -73,7 +69,7 @@ public class VpcRouterDeploymentDefinition extends RouterDeploymentDefinition {
|
||||
|
||||
@Override
|
||||
public Vpc getVpc() {
|
||||
return this.vpc;
|
||||
return vpc;
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -87,16 +83,15 @@ public class VpcRouterDeploymentDefinition extends RouterDeploymentDefinition {
|
||||
if (vpcLock == null) {
|
||||
throw new ConcurrentOperationException("Unable to lock vpc " + vpc.getId());
|
||||
}
|
||||
this.tableLockId = vpcLock.getId();
|
||||
tableLockId = vpcLock.getId();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void unlock() {
|
||||
if (this.tableLockId != null) {
|
||||
vpcDao.releaseFromLockTable(this.tableLockId);
|
||||
if (tableLockId != null) {
|
||||
vpcDao.releaseFromLockTable(tableLockId);
|
||||
if (logger.isDebugEnabled()) {
|
||||
logger.debug("Lock is released for vpc id " + this.tableLockId
|
||||
+ " as a part of router startup in " + dest);
|
||||
logger.debug("Lock is released for vpc id " + tableLockId + " as a part of router startup in " + dest);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -109,14 +104,15 @@ public class VpcRouterDeploymentDefinition extends RouterDeploymentDefinition {
|
||||
@Override
|
||||
protected List<DeployDestination> findDestinations() {
|
||||
final List<DeployDestination> destinations = new ArrayList<>();
|
||||
destinations.add(this.dest);
|
||||
destinations.add(dest);
|
||||
return destinations;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected int getNumberOfRoutersToDeploy() {
|
||||
// TODO Should we make our changes here in order to enable Redundant Router for VPC?
|
||||
return this.routers.isEmpty() ? 1 : 0;
|
||||
// TODO Should we make our changes here in order to enable Redundant
|
||||
// Router for VPC?
|
||||
return routers.isEmpty() ? 1 : 0;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -132,12 +128,13 @@ public class VpcRouterDeploymentDefinition extends RouterDeploymentDefinition {
|
||||
@Override
|
||||
protected void setupPriorityOfRedundantRouter() {
|
||||
// Nothing to do for now
|
||||
// TODO Shouldn't we add this behavior once Redundant Router works for Vpc too
|
||||
// TODO Shouldn't we add this behavior once Redundant Router works for
|
||||
// Vpc too
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void findSourceNatIP() throws InsufficientAddressCapacityException, ConcurrentOperationException {
|
||||
this.sourceNatIp = vpcMgr.assignSourceNatIpAddressToVpc(this.owner, vpc);
|
||||
sourceNatIp = vpcMgr.assignSourceNatIpAddressToVpc(owner, vpc);
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -149,8 +146,8 @@ public class VpcRouterDeploymentDefinition extends RouterDeploymentDefinition {
|
||||
if (provider == null) {
|
||||
throw new CloudRuntimeException("Cannot find service provider " + Type.VPCVirtualRouter.toString() + " in physical network " + pNtwk.getId());
|
||||
}
|
||||
this.vrProvider = vrProviderDao.findByNspIdAndType(provider.getId(), Type.VPCVirtualRouter);
|
||||
if (this.vrProvider != null) {
|
||||
vrProvider = vrProviderDao.findByNspIdAndType(provider.getId(), Type.VPCVirtualRouter);
|
||||
if (vrProvider != null) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
@ -160,32 +157,30 @@ public class VpcRouterDeploymentDefinition extends RouterDeploymentDefinition {
|
||||
protected void findOfferingId() {
|
||||
Long vpcOfferingId = vpcOffDao.findById(vpc.getVpcOfferingId()).getServiceOfferingId();
|
||||
if (vpcOfferingId != null) {
|
||||
this.offeringId = vpcOfferingId;
|
||||
offeringId = vpcOfferingId;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void deployAllVirtualRouters()
|
||||
throws ConcurrentOperationException, InsufficientCapacityException, ResourceUnavailableException {
|
||||
protected void deployAllVirtualRouters() throws ConcurrentOperationException, InsufficientCapacityException, ResourceUnavailableException {
|
||||
|
||||
LinkedHashMap<Network, List<? extends NicProfile>> networks = this.nwHelper.createVpcRouterNetworks(this);
|
||||
LinkedHashMap<Network, List<? extends NicProfile>> networks = vpcNetworkHelper.createRouterNetworks(this);
|
||||
|
||||
DomainRouterVO router =
|
||||
nwHelper.deployRouter(this, networks, true, vpcMgr.getSupportedVpcHypervisors());
|
||||
DomainRouterVO router = nwHelper.deployRouter(this, networks, true, vpcMgr.getSupportedVpcHypervisors());
|
||||
|
||||
if (router != null) {
|
||||
this.routers.add(router);
|
||||
routers.add(router);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void planDeploymentRouters() {
|
||||
this.routers = this.vpcHelper.getVpcRouters(this.vpc.getId());
|
||||
routers = routerDao.listByVpcId(vpc.getId());
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void generateDeploymentPlan() {
|
||||
final long dcId = this.dest.getDataCenter().getId();
|
||||
this.plan = new DataCenterDeployment(dcId);
|
||||
final long dcId = dest.getDataCenter().getId();
|
||||
plan = new DataCenterDeployment(dcId);
|
||||
}
|
||||
}
|
||||
|
||||
@ -39,7 +39,7 @@ import com.cloud.network.dao.NetworkDao;
|
||||
import com.cloud.network.dao.NetworkVO;
|
||||
import com.cloud.network.dao.PhysicalNetworkServiceProviderDao;
|
||||
import com.cloud.network.dao.VirtualRouterProviderDao;
|
||||
import com.cloud.network.router.NetworkGeneralHelper;
|
||||
import com.cloud.network.router.NetworkHelper;
|
||||
import com.cloud.offerings.NetworkOfferingVO;
|
||||
import com.cloud.offerings.dao.NetworkOfferingDao;
|
||||
import com.cloud.user.Account;
|
||||
@ -73,7 +73,7 @@ public class RouterDeploymentDefinitionTestBase {
|
||||
@Mock
|
||||
protected DomainRouterDao mockRouterDao;
|
||||
@Mock
|
||||
protected NetworkGeneralHelper mockNetworkGeneralHelper;
|
||||
protected NetworkHelper mockNetworkGeneralHelper;
|
||||
@Mock
|
||||
protected VMInstanceDao mockVmDao;
|
||||
@Mock
|
||||
|
||||
@ -36,8 +36,11 @@ import com.cloud.deploy.DeployDestination;
|
||||
import com.cloud.exception.ConcurrentOperationException;
|
||||
import com.cloud.network.dao.PhysicalNetworkDao;
|
||||
import com.cloud.network.dao.PhysicalNetworkServiceProviderDao;
|
||||
import com.cloud.network.router.VpcNetworkHelper;
|
||||
import com.cloud.network.vpc.VpcManager;
|
||||
import com.cloud.network.vpc.VpcVO;
|
||||
import com.cloud.network.vpc.dao.VpcDao;
|
||||
import com.cloud.network.vpc.dao.VpcOfferingDao;
|
||||
import com.cloud.vm.DomainRouterVO;
|
||||
|
||||
public class VpcRouterDeploymentDefinitionTest extends RouterDeploymentDefinitionTestBase {
|
||||
@ -56,116 +59,108 @@ public class VpcRouterDeploymentDefinitionTest extends RouterDeploymentDefinitio
|
||||
@Mock
|
||||
protected VpcVO mockVpc;
|
||||
|
||||
@Mock
|
||||
protected VpcOfferingDao mockVpcOffDao;
|
||||
@Mock
|
||||
protected VpcManager vpcMgr;
|
||||
@Mock
|
||||
protected VpcNetworkHelper vpcHelper;
|
||||
|
||||
protected RouterDeploymentDefinition deployment;
|
||||
|
||||
@Override
|
||||
protected void initMocks() {
|
||||
super.initMocks();
|
||||
when(this.mockVpc.getId()).thenReturn(VPC_ID);
|
||||
when(this.mockVpc.getZoneId()).thenReturn(VPC_ID);
|
||||
when(mockVpc.getId()).thenReturn(VPC_ID);
|
||||
when(mockVpc.getZoneId()).thenReturn(VPC_ID);
|
||||
}
|
||||
|
||||
@Before
|
||||
public void initTest() {
|
||||
this.initMocks();
|
||||
initMocks();
|
||||
|
||||
this.deployment = this.builder.create()
|
||||
.setVpc(this.mockVpc)
|
||||
.setDeployDestination(this.mockDestination)
|
||||
.setAccountOwner(this.mockOwner)
|
||||
.setParams(this.params)
|
||||
.build();
|
||||
deployment = builder.create().setVpc(mockVpc).setDeployDestination(mockDestination).setAccountOwner(mockOwner).setParams(params).build();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testConstructionFieldsAndFlags() {
|
||||
assertTrue("Not really a VpcRouterDeploymentDefinition what the builder created",
|
||||
this.deployment instanceof VpcRouterDeploymentDefinition);
|
||||
assertTrue("A VpcRouterDeploymentDefinition should declare it is",
|
||||
this.deployment.isVpcRouter());
|
||||
assertEquals("A VpcRouterDeploymentDefinition should have a Vpc",
|
||||
this.mockVpc, this.deployment.getVpc());
|
||||
assertTrue("Not really a VpcRouterDeploymentDefinition what the builder created", deployment instanceof VpcRouterDeploymentDefinition);
|
||||
assertTrue("A VpcRouterDeploymentDefinition should declare it is", deployment.isVpcRouter());
|
||||
assertEquals("A VpcRouterDeploymentDefinition should have a Vpc", mockVpc, deployment.getVpc());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testLock() {
|
||||
// Prepare
|
||||
when(this.mockVpcDao.acquireInLockTable(VPC_ID))
|
||||
.thenReturn(mockVpc);
|
||||
when(mockVpcDao.acquireInLockTable(VPC_ID)).thenReturn(mockVpc);
|
||||
|
||||
// Execute
|
||||
this.deployment.lock();
|
||||
deployment.lock();
|
||||
|
||||
// Assert
|
||||
verify(this.mockVpcDao, times(1)).acquireInLockTable(VPC_ID);
|
||||
assertNotNull(LOCK_NOT_CORRECTLY_GOT, this.deployment.tableLockId);
|
||||
assertEquals(LOCK_NOT_CORRECTLY_GOT, VPC_ID, this.deployment.tableLockId.longValue());
|
||||
verify(mockVpcDao, times(1)).acquireInLockTable(VPC_ID);
|
||||
assertNotNull(LOCK_NOT_CORRECTLY_GOT, deployment.tableLockId);
|
||||
assertEquals(LOCK_NOT_CORRECTLY_GOT, VPC_ID, deployment.tableLockId.longValue());
|
||||
}
|
||||
|
||||
@Test(expected = ConcurrentOperationException.class)
|
||||
public void testLockFails() {
|
||||
// Prepare
|
||||
when(this.mockVpcDao.acquireInLockTable(VPC_ID))
|
||||
.thenReturn(null);
|
||||
when(mockVpcDao.acquireInLockTable(VPC_ID)).thenReturn(null);
|
||||
|
||||
// Execute
|
||||
try {
|
||||
this.deployment.lock();
|
||||
deployment.lock();
|
||||
} finally {
|
||||
// Assert
|
||||
verify(this.mockVpcDao, times(1)).acquireInLockTable(VPC_ID);
|
||||
assertNull(this.deployment.tableLockId);
|
||||
verify(mockVpcDao, times(1)).acquireInLockTable(VPC_ID);
|
||||
assertNull(deployment.tableLockId);
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testUnlock() {
|
||||
// Prepare
|
||||
this.deployment.tableLockId = VPC_ID;
|
||||
deployment.tableLockId = VPC_ID;
|
||||
|
||||
// Execute
|
||||
this.deployment.unlock();
|
||||
deployment.unlock();
|
||||
|
||||
// Assert
|
||||
verify(this.mockVpcDao, times(1)).releaseFromLockTable(VPC_ID);
|
||||
verify(mockVpcDao, times(1)).releaseFromLockTable(VPC_ID);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testUnlockWithoutLock() {
|
||||
// Prepare
|
||||
this.deployment.tableLockId = null;
|
||||
deployment.tableLockId = null;
|
||||
|
||||
// Execute
|
||||
this.deployment.unlock();
|
||||
deployment.unlock();
|
||||
|
||||
// Assert
|
||||
verify(this.mockVpcDao, times(0)).releaseFromLockTable(anyLong());
|
||||
verify(mockVpcDao, times(0)).releaseFromLockTable(anyLong());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testFindDestinations() {
|
||||
// Execute
|
||||
List<DeployDestination> foundDestinations = this.deployment.findDestinations();
|
||||
List<DeployDestination> foundDestinations = deployment.findDestinations();
|
||||
// Assert
|
||||
assertEquals(FOR_VPC_ONLY_THE_GIVEN_DESTINATION_SHOULD_BE_USED,
|
||||
this.deployment.dest, foundDestinations.get(0));
|
||||
assertEquals(FOR_VPC_ONLY_THE_GIVEN_DESTINATION_SHOULD_BE_USED,
|
||||
1, foundDestinations.size());
|
||||
assertEquals(FOR_VPC_ONLY_THE_GIVEN_DESTINATION_SHOULD_BE_USED, deployment.dest, foundDestinations.get(0));
|
||||
assertEquals(FOR_VPC_ONLY_THE_GIVEN_DESTINATION_SHOULD_BE_USED, 1, foundDestinations.size());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testGetNumberOfRoutersToDeploy() {
|
||||
assertEquals("If there are no routers, it should deploy one",
|
||||
1, this.deployment.getNumberOfRoutersToDeploy());
|
||||
this.deployment.routers.add(mock(DomainRouterVO.class));
|
||||
assertEquals("If there is already a router found, there is no need to deploy more",
|
||||
0, this.deployment.getNumberOfRoutersToDeploy());
|
||||
assertEquals("If there are no routers, it should deploy one", 1, deployment.getNumberOfRoutersToDeploy());
|
||||
deployment.routers.add(mock(DomainRouterVO.class));
|
||||
assertEquals("If there is already a router found, there is no need to deploy more", 0, deployment.getNumberOfRoutersToDeploy());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testPrepareDeployment() {
|
||||
assertTrue("There are no preconditions for Vpc Deployment, thus it should always pass",
|
||||
this.deployment.prepareDeployment());
|
||||
assertTrue("There are no preconditions for Vpc Deployment, thus it should always pass", deployment.prepareDeployment());
|
||||
}
|
||||
|
||||
@Test
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user