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:
Antonio Fornie 2014-08-19 04:57:46 -05:00 committed by wilderrodrigues
parent 00dc8a7b24
commit 2da3ceda31
16 changed files with 466 additions and 323 deletions

View 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;
}

View File

@ -22,14 +22,14 @@ import java.util.Iterator;
import java.util.LinkedHashMap; import java.util.LinkedHashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.TreeSet;
import javax.ejb.Local;
import javax.inject.Inject; import javax.inject.Inject;
import org.apache.cloudstack.engine.orchestration.service.NetworkOrchestrationService; import org.apache.cloudstack.engine.orchestration.service.NetworkOrchestrationService;
import org.apache.log4j.Logger; import org.apache.log4j.Logger;
import org.cloud.network.router.deployment.RouterDeploymentDefinition; 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.AgentManager;
import com.cloud.agent.api.Answer; import com.cloud.agent.api.Answer;
@ -42,7 +42,6 @@ import com.cloud.dc.ClusterVO;
import com.cloud.dc.DataCenter; import com.cloud.dc.DataCenter;
import com.cloud.dc.Pod; import com.cloud.dc.Pod;
import com.cloud.dc.dao.ClusterDao; import com.cloud.dc.dao.ClusterDao;
import com.cloud.dc.dao.VlanDao;
import com.cloud.deploy.DataCenterDeployment; import com.cloud.deploy.DataCenterDeployment;
import com.cloud.deploy.DeployDestination; import com.cloud.deploy.DeployDestination;
import com.cloud.deploy.DeploymentPlan; import com.cloud.deploy.DeploymentPlan;
@ -60,7 +59,6 @@ import com.cloud.host.Status;
import com.cloud.host.dao.HostDao; import com.cloud.host.dao.HostDao;
import com.cloud.hypervisor.Hypervisor.HypervisorType; import com.cloud.hypervisor.Hypervisor.HypervisorType;
import com.cloud.maint.Version; import com.cloud.maint.Version;
import com.cloud.network.IpAddress;
import com.cloud.network.IpAddressManager; import com.cloud.network.IpAddressManager;
import com.cloud.network.Network; import com.cloud.network.Network;
import com.cloud.network.NetworkModel; import com.cloud.network.NetworkModel;
@ -70,14 +68,11 @@ import com.cloud.network.Networks.TrafficType;
import com.cloud.network.VirtualNetworkApplianceService; import com.cloud.network.VirtualNetworkApplianceService;
import com.cloud.network.addr.PublicIp; import com.cloud.network.addr.PublicIp;
import com.cloud.network.dao.IPAddressDao; import com.cloud.network.dao.IPAddressDao;
import com.cloud.network.dao.IPAddressVO;
import com.cloud.network.dao.NetworkDao; import com.cloud.network.dao.NetworkDao;
import com.cloud.network.dao.NetworkVO; import com.cloud.network.dao.NetworkVO;
import com.cloud.network.dao.UserIpv6AddressDao; import com.cloud.network.dao.UserIpv6AddressDao;
import com.cloud.network.router.VirtualRouter.RedundantState; import com.cloud.network.router.VirtualRouter.RedundantState;
import com.cloud.network.router.VirtualRouter.Role; 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.network.vpn.Site2SiteVpnManager;
import com.cloud.offering.NetworkOffering; import com.cloud.offering.NetworkOffering;
import com.cloud.resource.ResourceManager; 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.DomainRouterDao;
import com.cloud.vm.dao.NicDao; 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 @Inject
private NicDao _nicDao; protected NicDao _nicDao;
@Inject @Inject
private NetworkDao _networkDao; private NetworkDao _networkDao;
@Inject @Inject
private DomainRouterDao _routerDao; protected DomainRouterDao _routerDao;
@Inject @Inject
private AgentManager _agentMgr; private AgentManager _agentMgr;
@Inject @Inject
private AlertManager _alertMgr; private AlertManager _alertMgr;
@Inject @Inject
private NetworkModel _networkModel; protected NetworkModel _networkModel;
@Inject @Inject
private VirtualMachineManager _itMgr; private VirtualMachineManager _itMgr;
@Inject @Inject
@ -139,21 +137,18 @@ public class NetworkGeneralHelper {
@Inject @Inject
private ClusterDao _clusterDao; private ClusterDao _clusterDao;
@Inject @Inject
private IPAddressDao _ipAddressDao; protected IPAddressDao _ipAddressDao;
@Inject @Inject
private IpAddressManager _ipAddrMgr; private IpAddressManager _ipAddrMgr;
@Inject @Inject
private UserIpv6AddressDao _ipv6Dao; private UserIpv6AddressDao _ipv6Dao;
@Inject @Inject
private NetworkOrchestrationService _networkMgr; protected NetworkOrchestrationService _networkMgr;
@Inject
protected VpcVirtualNetworkHelperImpl _vpcHelper;
@Inject
protected VpcManager _vpcMgr;
@Inject
protected VlanDao _vlanDao;
/* (non-Javadoc)
* @see com.cloud.network.router.NetworkHelper#getRouterControlIp(long)
*/
@Override
public String getRouterControlIp(final long routerId) { public String getRouterControlIp(final long routerId) {
String routerControlIpAddress = null; String routerControlIpAddress = null;
final List<NicVO> nics = _nicDao.listByVmId(routerId); final List<NicVO> nics = _nicDao.listByVmId(routerId);
@ -175,12 +170,20 @@ public class NetworkGeneralHelper {
return routerControlIpAddress; return routerControlIpAddress;
} }
/* (non-Javadoc)
* @see com.cloud.network.router.NetworkHelper#getRouterIpInNetwork(long, long)
*/
@Override
public String getRouterIpInNetwork(final long networkId, final long instanceId) { public String getRouterIpInNetwork(final long networkId, final long instanceId) {
return _nicDao.getIpAddress(networkId, instanceId); return _nicDao.getIpAddress(networkId, instanceId);
} }
// @Override // @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 { public boolean sendCommandsToRouter(final VirtualRouter router, final Commands cmds) throws AgentUnavailableException {
if(!checkRouterVersion(router)){ if(!checkRouterVersion(router)){
s_logger.debug("Router requires upgrade. Unable to send command to router:" + router.getId() + ", router template version : " + router.getTemplateVersion() 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; return result;
} }
@Override
public void handleSingleWorkingRedundantRouter(final List<? extends VirtualRouter> connectedRouters, final List<? extends VirtualRouter> disconnectedRouters, final String reason) public void handleSingleWorkingRedundantRouter(final List<? extends VirtualRouter> connectedRouters, final List<? extends VirtualRouter> disconnectedRouters, final String reason)
throws ResourceUnavailableException { throws ResourceUnavailableException {
if (connectedRouters.isEmpty() || disconnectedRouters.isEmpty()) { 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) { public int getRealPriority(final DomainRouterVO router) {
int priority = router.getPriority(); int priority = router.getPriority();
if (router.getIsPriorityBumpUp()) { if (router.getIsPriorityBumpUp()) {
@ -277,6 +285,10 @@ public class NetworkGeneralHelper {
} }
// @Override // @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) { public NicTO getNicTO(final VirtualRouter router, final Long networkId, final String broadcastUri) {
NicProfile nicProfile = _networkModel.getNicProfile(router, networkId, broadcastUri); NicProfile nicProfile = _networkModel.getNicProfile(router, networkId, broadcastUri);
@ -284,6 +296,10 @@ public class NetworkGeneralHelper {
} }
// @Override // @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 { public VirtualRouter destroyRouter(final long routerId, final Account caller, final Long callerUserId) throws ResourceUnavailableException, ConcurrentOperationException {
if (s_logger.isDebugEnabled()) { if (s_logger.isDebugEnabled()) {
@ -302,13 +318,11 @@ public class NetworkGeneralHelper {
return router; return router;
} }
/** /* (non-Javadoc)
* Checks if the router is at the required version. Compares MS version and router version. * @see com.cloud.network.router.NetworkHelper#checkRouterVersion(com.cloud.network.router.VirtualRouter)
*
* @param router
* @return
*/ */
// @Override // @Override
@Override
public boolean checkRouterVersion(final VirtualRouter router) { public boolean checkRouterVersion(final VirtualRouter router) {
if(!VirtualNetworkApplianceManagerImpl.routerVersionCheckEnabled.value()){ if(!VirtualNetworkApplianceManagerImpl.routerVersionCheckEnabled.value()){
//Router version check is disabled. //Router version check is disabled.
@ -318,7 +332,7 @@ public class NetworkGeneralHelper {
return false; return false;
} }
final String trimmedVersion = Version.trimRouterVersion(router.getTemplateVersion()); 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 // @Override
/* (non-Javadoc)
* @see com.cloud.network.router.NetworkHelper#startRouters(org.cloud.network.router.deployment.RouterDeploymentDefinition)
*/
@Override
public List<DomainRouterVO> startRouters(final RouterDeploymentDefinition routerDeploymentDefinition) public List<DomainRouterVO> startRouters(final RouterDeploymentDefinition routerDeploymentDefinition)
throws StorageUnavailableException, InsufficientCapacityException, throws StorageUnavailableException, InsufficientCapacityException,
ConcurrentOperationException, ResourceUnavailableException { ConcurrentOperationException, ResourceUnavailableException {
@ -403,6 +421,10 @@ public class NetworkGeneralHelper {
} }
// @Override // @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) public DomainRouterVO startVirtualRouter(final DomainRouterVO router, final User user, final Account caller, final Map<Param, Object> params)
throws StorageUnavailableException, InsufficientCapacityException, throws StorageUnavailableException, InsufficientCapacityException,
ConcurrentOperationException, ResourceUnavailableException { ConcurrentOperationException, ResourceUnavailableException {
@ -484,8 +506,17 @@ public class NetworkGeneralHelper {
return result; return result;
} }
// @Override
// public DomainRouterVO deployRouter(final RouterDeploymentDefinition routerDeploymentDefinition) {
// routerDeploymentDefinition.createNetwork();
// doDeployRouter
// }
// @Override // @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, public DomainRouterVO deployRouter(final RouterDeploymentDefinition routerDeploymentDefinition,
final LinkedHashMap<Network, List<? extends NicProfile>> networks, final LinkedHashMap<Network, List<? extends NicProfile>> networks,
final boolean startRouter, final List<HypervisorType> supportedHypervisors) final boolean startRouter, final List<HypervisorType> supportedHypervisors)
@ -625,7 +656,7 @@ public class NetworkGeneralHelper {
} }
if (hypervisors.isEmpty()) { 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) { if (routerDeploymentDefinition.getPodId() != null) {
throw new InsufficientServerCapacityException("Unable to create virtual router, " + "there are no clusters in the pod " + errMsg, Pod.class, throw new InsufficientServerCapacityException("Unable to create virtual router, " + "there are no clusters in the pod " + errMsg, Pod.class,
routerDeploymentDefinition.getPodId()); 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( public LinkedHashMap<Network, List<? extends NicProfile>> createRouterNetworks(
final RouterDeploymentDefinition routerDeploymentDefinition) final RouterDeploymentDefinition routerDeploymentDefinition)
throws ConcurrentOperationException, InsufficientAddressCapacityException { throws ConcurrentOperationException, InsufficientAddressCapacityException {
@ -782,81 +817,4 @@ public class NetworkGeneralHelper {
return networks; 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;
}
} }

View File

@ -386,7 +386,7 @@ Configurable, StateListener<State, VirtualMachine.Event, VirtualMachine> {
@Inject @Inject
protected NetworkTopologyContext _networkTopologyContext; protected NetworkTopologyContext _networkTopologyContext;
@Inject @Inject
protected NetworkGeneralHelper _nwHelper; protected NetworkHelper _nwHelper;
@Inject @Inject
protected RouterDeploymentDefinitionBuilder _routerDeploymentManagerBuilder; protected RouterDeploymentDefinitionBuilder _routerDeploymentManagerBuilder;

View 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);
}

View 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;
}
}

View File

@ -135,7 +135,7 @@ public class VpcVirtualNetworkApplianceManagerImpl extends VirtualNetworkApplian
private EntityManager _entityMgr; private EntityManager _entityMgr;
@Inject @Inject
private VpcVirtualNetworkHelperImpl vpcHelper; private VpcNetworkHelper vpcHelper;
@Override @Override
public boolean configure(final String name, final Map<String, Object> params) throws ConfigurationException { public boolean configure(final String name, final Map<String, Object> params) throws ConfigurationException {

View File

@ -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;
}
}

View File

@ -37,7 +37,7 @@ import com.cloud.network.dao.IPAddressDao;
import com.cloud.network.dao.LoadBalancerDao; import com.cloud.network.dao.LoadBalancerDao;
import com.cloud.network.dao.NetworkDao; import com.cloud.network.dao.NetworkDao;
import com.cloud.network.lb.LoadBalancingRulesManager; 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.RouterControlHelper;
import com.cloud.network.router.VirtualNetworkApplianceManager; import com.cloud.network.router.VirtualNetworkApplianceManager;
import com.cloud.network.router.VirtualRouter; import com.cloud.network.router.VirtualRouter;
@ -110,7 +110,7 @@ public abstract class RuleApplier {
protected RouterControlHelper _routerControlHelper; protected RouterControlHelper _routerControlHelper;
protected NetworkGeneralHelper _networkHelper; protected NetworkHelper _networkHelper;
public RuleApplier(final Network network) { public RuleApplier(final Network network) {
_network = network; _network = network;

View File

@ -37,7 +37,7 @@ import com.cloud.network.dao.LoadBalancerDao;
import com.cloud.network.dao.NetworkDao; import com.cloud.network.dao.NetworkDao;
import com.cloud.network.lb.LoadBalancingRule; import com.cloud.network.lb.LoadBalancingRule;
import com.cloud.network.lb.LoadBalancingRulesManager; 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.RouterControlHelper;
import com.cloud.network.router.VirtualNetworkApplianceManager; import com.cloud.network.router.VirtualNetworkApplianceManager;
import com.cloud.network.vpc.NetworkACLItem; import com.cloud.network.vpc.NetworkACLItem;
@ -130,7 +130,7 @@ public class VirtualNetworkApplianceFactory {
protected IpAddressManager _ipAddrMgr; protected IpAddressManager _ipAddrMgr;
@Inject @Inject
protected NetworkGeneralHelper _networkHelper; protected NetworkHelper _networkHelper;
public LoadBalancingRules createLoadBalancingRules(final Network network, final List<LoadBalancingRule> rules) { public LoadBalancingRules createLoadBalancingRules(final Network network, final List<LoadBalancingRule> rules) {
LoadBalancingRules lbRules = new LoadBalancingRules(network, rules); LoadBalancingRules lbRules = new LoadBalancingRules(network, rules);

View File

@ -41,7 +41,7 @@ import com.cloud.network.Networks.TrafficType;
import com.cloud.network.PublicIpAddress; import com.cloud.network.PublicIpAddress;
import com.cloud.network.VpnUser; import com.cloud.network.VpnUser;
import com.cloud.network.lb.LoadBalancingRule; 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.router.VirtualRouter;
import com.cloud.network.rules.DhcpEntryRules; import com.cloud.network.rules.DhcpEntryRules;
import com.cloud.network.rules.FirewallRule; import com.cloud.network.rules.FirewallRule;
@ -87,7 +87,7 @@ public class BasicNetworkTopology implements NetworkTopology {
protected HostDao _hostDao; protected HostDao _hostDao;
@Inject @Inject
protected NetworkGeneralHelper _nwHelper; protected NetworkHelper _nwHelper;
@Inject @Inject
protected UserVmDao _userVmDao; protected UserVmDao _userVmDao;

View File

@ -32,7 +32,7 @@ import com.cloud.network.Network;
import com.cloud.network.PublicIpAddress; import com.cloud.network.PublicIpAddress;
import com.cloud.network.VpnUser; import com.cloud.network.VpnUser;
import com.cloud.network.lb.LoadBalancingRule; 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.router.VirtualRouter;
import com.cloud.network.rules.DhcpEntryRules; import com.cloud.network.rules.DhcpEntryRules;
import com.cloud.network.rules.DhcpSubNetRules; import com.cloud.network.rules.DhcpSubNetRules;
@ -70,7 +70,7 @@ public class BasicNetworkVisitor extends NetworkTopologyVisitor {
} }
@Inject @Inject
protected NetworkGeneralHelper _networkGeneralHelper; protected NetworkHelper _networkGeneralHelper;
@Override @Override
public boolean visit(final StaticNatRules nat) throws ResourceUnavailableException { public boolean visit(final StaticNatRules nat) throws ResourceUnavailableException {

View File

@ -52,7 +52,7 @@ import com.cloud.network.dao.NetworkDao;
import com.cloud.network.dao.PhysicalNetworkServiceProviderDao; import com.cloud.network.dao.PhysicalNetworkServiceProviderDao;
import com.cloud.network.dao.UserIpv6AddressDao; import com.cloud.network.dao.UserIpv6AddressDao;
import com.cloud.network.dao.VirtualRouterProviderDao; 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.router.VirtualRouter.Role;
import com.cloud.network.vpc.Vpc; import com.cloud.network.vpc.Vpc;
import com.cloud.offerings.dao.NetworkOfferingDao; import com.cloud.offerings.dao.NetworkOfferingDao;
@ -90,10 +90,14 @@ public class RouterDeploymentDefinition {
protected UserIpv6AddressDao ipv6Dao; protected UserIpv6AddressDao ipv6Dao;
protected IPAddressDao ipAddressDao; protected IPAddressDao ipAddressDao;
protected VirtualRouterProvider vrProvider; protected VirtualRouterProvider vrProvider;
<<<<<<< HEAD
@Inject @Inject
protected NetworkGeneralHelper nwHelper; protected NetworkGeneralHelper nwHelper;
=======
protected NetworkHelper nwHelper;
>>>>>>> 40df9d4... Refactor to include network creation as actual deployment
protected Network guestNetwork; protected Network guestNetwork;
@ -397,7 +401,7 @@ public class RouterDeploymentDefinition {
LinkedHashMap<Network, List<? extends NicProfile>> networks = LinkedHashMap<Network, List<? extends NicProfile>> networks =
this.nwHelper.createRouterNetworks(this); 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 //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) { if (router != null) {
this.routerDao.addRouterToGuestNetwork(router, this.guestNetwork); this.routerDao.addRouterToGuestNetwork(router, this.guestNetwork);

View File

@ -36,8 +36,8 @@ import com.cloud.network.dao.PhysicalNetworkDao;
import com.cloud.network.dao.PhysicalNetworkServiceProviderDao; import com.cloud.network.dao.PhysicalNetworkServiceProviderDao;
import com.cloud.network.dao.UserIpv6AddressDao; import com.cloud.network.dao.UserIpv6AddressDao;
import com.cloud.network.dao.VirtualRouterProviderDao; import com.cloud.network.dao.VirtualRouterProviderDao;
import com.cloud.network.router.NetworkGeneralHelper; import com.cloud.network.router.NetworkHelper;
import com.cloud.network.router.VpcVirtualNetworkHelperImpl; import com.cloud.network.router.VpcNetworkHelper;
import com.cloud.network.vpc.Vpc; import com.cloud.network.vpc.Vpc;
import com.cloud.network.vpc.VpcManager; import com.cloud.network.vpc.VpcManager;
import com.cloud.network.vpc.dao.VpcDao; import com.cloud.network.vpc.dao.VpcDao;
@ -93,9 +93,9 @@ public class RouterDeploymentDefinitionBuilder {
private VlanDao vlanDao; private VlanDao vlanDao;
@Inject @Inject
protected NetworkGeneralHelper nwHelper; protected NetworkHelper nwHelper;
@Inject @Inject
protected VpcVirtualNetworkHelperImpl vpcHelper; protected VpcNetworkHelper vpcNwHelper;
protected Long offeringId; protected Long offeringId;
@ -141,7 +141,7 @@ public class RouterDeploymentDefinitionBuilder {
routerDeploymentDefinition.pNtwkDao = pNtwkDao; routerDeploymentDefinition.pNtwkDao = pNtwkDao;
routerDeploymentDefinition.vpcMgr = vpcMgr; routerDeploymentDefinition.vpcMgr = vpcMgr;
routerDeploymentDefinition.vlanDao = vlanDao; routerDeploymentDefinition.vlanDao = vlanDao;
routerDeploymentDefinition.vpcHelper = vpcHelper; routerDeploymentDefinition.vpcHelper = vpcNwHelper;
} }
public class IntermediateStateBuilder { public class IntermediateStateBuilder {
@ -206,4 +206,4 @@ public class RouterDeploymentDefinitionBuilder {
return builder.injectDependencies(routerDeploymentDefinition); return builder.injectDependencies(routerDeploymentDefinition);
} }
} }
} }

View File

@ -21,8 +21,6 @@ import java.util.LinkedHashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import javax.inject.Inject;
import org.apache.log4j.Logger; import org.apache.log4j.Logger;
import com.cloud.dc.dao.VlanDao; import com.cloud.dc.dao.VlanDao;
@ -37,7 +35,7 @@ import com.cloud.network.PhysicalNetwork;
import com.cloud.network.PhysicalNetworkServiceProvider; import com.cloud.network.PhysicalNetworkServiceProvider;
import com.cloud.network.VirtualRouterProvider.Type; import com.cloud.network.VirtualRouterProvider.Type;
import com.cloud.network.dao.PhysicalNetworkDao; 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.Vpc;
import com.cloud.network.vpc.VpcManager; import com.cloud.network.vpc.VpcManager;
import com.cloud.network.vpc.dao.VpcDao; 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.DomainRouterVO;
import com.cloud.vm.NicProfile; import com.cloud.vm.NicProfile;
import com.cloud.vm.VirtualMachineProfile.Param; import com.cloud.vm.VirtualMachineProfile.Param;
import com.cloud.vm.dao.DomainRouterDao;
public class VpcRouterDeploymentDefinition extends RouterDeploymentDefinition { public class VpcRouterDeploymentDefinition extends RouterDeploymentDefinition {
private static final Logger logger = Logger.getLogger(VpcRouterDeploymentDefinition.class); private static final Logger logger = Logger.getLogger(VpcRouterDeploymentDefinition.class);
@Inject protected DomainRouterDao routerDao;
protected VpcVirtualNetworkHelperImpl vpcHelper;
protected VpcDao vpcDao; protected VpcDao vpcDao;
protected VpcOfferingDao vpcOffDao; protected VpcOfferingDao vpcOffDao;
protected PhysicalNetworkDao pNtwkDao; protected PhysicalNetworkDao pNtwkDao;
protected VpcManager vpcMgr; protected VpcManager vpcMgr;
protected VlanDao vlanDao; protected VlanDao vlanDao;
protected VpcNetworkHelper vpcNetworkHelper;
protected Vpc vpc; 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); super(null, dest, owner, params, isRedundant);
@ -73,7 +69,7 @@ public class VpcRouterDeploymentDefinition extends RouterDeploymentDefinition {
@Override @Override
public Vpc getVpc() { public Vpc getVpc() {
return this.vpc; return vpc;
} }
@Override @Override
@ -87,16 +83,15 @@ public class VpcRouterDeploymentDefinition extends RouterDeploymentDefinition {
if (vpcLock == null) { if (vpcLock == null) {
throw new ConcurrentOperationException("Unable to lock vpc " + vpc.getId()); throw new ConcurrentOperationException("Unable to lock vpc " + vpc.getId());
} }
this.tableLockId = vpcLock.getId(); tableLockId = vpcLock.getId();
} }
@Override @Override
protected void unlock() { protected void unlock() {
if (this.tableLockId != null) { if (tableLockId != null) {
vpcDao.releaseFromLockTable(this.tableLockId); vpcDao.releaseFromLockTable(tableLockId);
if (logger.isDebugEnabled()) { if (logger.isDebugEnabled()) {
logger.debug("Lock is released for vpc id " + this.tableLockId logger.debug("Lock is released for vpc id " + tableLockId + " as a part of router startup in " + dest);
+ " as a part of router startup in " + dest);
} }
} }
} }
@ -109,19 +104,20 @@ public class VpcRouterDeploymentDefinition extends RouterDeploymentDefinition {
@Override @Override
protected List<DeployDestination> findDestinations() { protected List<DeployDestination> findDestinations() {
final List<DeployDestination> destinations = new ArrayList<>(); final List<DeployDestination> destinations = new ArrayList<>();
destinations.add(this.dest); destinations.add(dest);
return destinations; return destinations;
} }
@Override @Override
protected int getNumberOfRoutersToDeploy() { protected int getNumberOfRoutersToDeploy() {
// TODO Should we make our changes here in order to enable Redundant Router for VPC? // TODO Should we make our changes here in order to enable Redundant
return this.routers.isEmpty() ? 1 : 0; // Router for VPC?
return routers.isEmpty() ? 1 : 0;
} }
/** /**
* @see RouterDeploymentDefinition#prepareDeployment() * @see RouterDeploymentDefinition#prepareDeployment()
* *
* @return if the deployment can proceed * @return if the deployment can proceed
*/ */
@Override @Override
@ -132,12 +128,13 @@ public class VpcRouterDeploymentDefinition extends RouterDeploymentDefinition {
@Override @Override
protected void setupPriorityOfRedundantRouter() { protected void setupPriorityOfRedundantRouter() {
// Nothing to do for now // 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 @Override
protected void findSourceNatIP() throws InsufficientAddressCapacityException, ConcurrentOperationException { protected void findSourceNatIP() throws InsufficientAddressCapacityException, ConcurrentOperationException {
this.sourceNatIp = vpcMgr.assignSourceNatIpAddressToVpc(this.owner, vpc); sourceNatIp = vpcMgr.assignSourceNatIpAddressToVpc(owner, vpc);
} }
@Override @Override
@ -149,8 +146,8 @@ public class VpcRouterDeploymentDefinition extends RouterDeploymentDefinition {
if (provider == null) { if (provider == null) {
throw new CloudRuntimeException("Cannot find service provider " + Type.VPCVirtualRouter.toString() + " in physical network " + pNtwk.getId()); throw new CloudRuntimeException("Cannot find service provider " + Type.VPCVirtualRouter.toString() + " in physical network " + pNtwk.getId());
} }
this.vrProvider = vrProviderDao.findByNspIdAndType(provider.getId(), Type.VPCVirtualRouter); vrProvider = vrProviderDao.findByNspIdAndType(provider.getId(), Type.VPCVirtualRouter);
if (this.vrProvider != null) { if (vrProvider != null) {
break; break;
} }
} }
@ -160,32 +157,30 @@ public class VpcRouterDeploymentDefinition extends RouterDeploymentDefinition {
protected void findOfferingId() { protected void findOfferingId() {
Long vpcOfferingId = vpcOffDao.findById(vpc.getVpcOfferingId()).getServiceOfferingId(); Long vpcOfferingId = vpcOffDao.findById(vpc.getVpcOfferingId()).getServiceOfferingId();
if (vpcOfferingId != null) { if (vpcOfferingId != null) {
this.offeringId = vpcOfferingId; offeringId = vpcOfferingId;
} }
} }
@Override @Override
protected void deployAllVirtualRouters() protected void deployAllVirtualRouters() throws ConcurrentOperationException, InsufficientCapacityException, ResourceUnavailableException {
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 = DomainRouterVO router = nwHelper.deployRouter(this, networks, true, vpcMgr.getSupportedVpcHypervisors());
nwHelper.deployRouter(this, networks, true, vpcMgr.getSupportedVpcHypervisors());
if (router != null) { if (router != null) {
this.routers.add(router); routers.add(router);
} }
} }
@Override @Override
protected void planDeploymentRouters() { protected void planDeploymentRouters() {
this.routers = this.vpcHelper.getVpcRouters(this.vpc.getId()); routers = routerDao.listByVpcId(vpc.getId());
} }
@Override @Override
protected void generateDeploymentPlan() { protected void generateDeploymentPlan() {
final long dcId = this.dest.getDataCenter().getId(); final long dcId = dest.getDataCenter().getId();
this.plan = new DataCenterDeployment(dcId); plan = new DataCenterDeployment(dcId);
} }
} }

View File

@ -39,7 +39,7 @@ import com.cloud.network.dao.NetworkDao;
import com.cloud.network.dao.NetworkVO; import com.cloud.network.dao.NetworkVO;
import com.cloud.network.dao.PhysicalNetworkServiceProviderDao; import com.cloud.network.dao.PhysicalNetworkServiceProviderDao;
import com.cloud.network.dao.VirtualRouterProviderDao; 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.NetworkOfferingVO;
import com.cloud.offerings.dao.NetworkOfferingDao; import com.cloud.offerings.dao.NetworkOfferingDao;
import com.cloud.user.Account; import com.cloud.user.Account;
@ -73,7 +73,7 @@ public class RouterDeploymentDefinitionTestBase {
@Mock @Mock
protected DomainRouterDao mockRouterDao; protected DomainRouterDao mockRouterDao;
@Mock @Mock
protected NetworkGeneralHelper mockNetworkGeneralHelper; protected NetworkHelper mockNetworkGeneralHelper;
@Mock @Mock
protected VMInstanceDao mockVmDao; protected VMInstanceDao mockVmDao;
@Mock @Mock

View File

@ -36,8 +36,11 @@ import com.cloud.deploy.DeployDestination;
import com.cloud.exception.ConcurrentOperationException; import com.cloud.exception.ConcurrentOperationException;
import com.cloud.network.dao.PhysicalNetworkDao; import com.cloud.network.dao.PhysicalNetworkDao;
import com.cloud.network.dao.PhysicalNetworkServiceProviderDao; 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.VpcVO;
import com.cloud.network.vpc.dao.VpcDao; import com.cloud.network.vpc.dao.VpcDao;
import com.cloud.network.vpc.dao.VpcOfferingDao;
import com.cloud.vm.DomainRouterVO; import com.cloud.vm.DomainRouterVO;
public class VpcRouterDeploymentDefinitionTest extends RouterDeploymentDefinitionTestBase { public class VpcRouterDeploymentDefinitionTest extends RouterDeploymentDefinitionTestBase {
@ -56,116 +59,108 @@ public class VpcRouterDeploymentDefinitionTest extends RouterDeploymentDefinitio
@Mock @Mock
protected VpcVO mockVpc; protected VpcVO mockVpc;
@Mock
protected VpcOfferingDao mockVpcOffDao;
@Mock
protected VpcManager vpcMgr;
@Mock
protected VpcNetworkHelper vpcHelper;
protected RouterDeploymentDefinition deployment; protected RouterDeploymentDefinition deployment;
@Override @Override
protected void initMocks() { protected void initMocks() {
super.initMocks(); super.initMocks();
when(this.mockVpc.getId()).thenReturn(VPC_ID); when(mockVpc.getId()).thenReturn(VPC_ID);
when(this.mockVpc.getZoneId()).thenReturn(VPC_ID); when(mockVpc.getZoneId()).thenReturn(VPC_ID);
} }
@Before @Before
public void initTest() { public void initTest() {
this.initMocks(); initMocks();
this.deployment = this.builder.create() deployment = builder.create().setVpc(mockVpc).setDeployDestination(mockDestination).setAccountOwner(mockOwner).setParams(params).build();
.setVpc(this.mockVpc)
.setDeployDestination(this.mockDestination)
.setAccountOwner(this.mockOwner)
.setParams(this.params)
.build();
} }
@Test @Test
public void testConstructionFieldsAndFlags() { public void testConstructionFieldsAndFlags() {
assertTrue("Not really a VpcRouterDeploymentDefinition what the builder created", assertTrue("Not really a VpcRouterDeploymentDefinition what the builder created", deployment instanceof VpcRouterDeploymentDefinition);
this.deployment instanceof VpcRouterDeploymentDefinition); assertTrue("A VpcRouterDeploymentDefinition should declare it is", deployment.isVpcRouter());
assertTrue("A VpcRouterDeploymentDefinition should declare it is", assertEquals("A VpcRouterDeploymentDefinition should have a Vpc", mockVpc, deployment.getVpc());
this.deployment.isVpcRouter());
assertEquals("A VpcRouterDeploymentDefinition should have a Vpc",
this.mockVpc, this.deployment.getVpc());
} }
@Test @Test
public void testLock() { public void testLock() {
// Prepare // Prepare
when(this.mockVpcDao.acquireInLockTable(VPC_ID)) when(mockVpcDao.acquireInLockTable(VPC_ID)).thenReturn(mockVpc);
.thenReturn(mockVpc);
// Execute // Execute
this.deployment.lock(); deployment.lock();
// Assert // Assert
verify(this.mockVpcDao, times(1)).acquireInLockTable(VPC_ID); verify(mockVpcDao, times(1)).acquireInLockTable(VPC_ID);
assertNotNull(LOCK_NOT_CORRECTLY_GOT, this.deployment.tableLockId); assertNotNull(LOCK_NOT_CORRECTLY_GOT, deployment.tableLockId);
assertEquals(LOCK_NOT_CORRECTLY_GOT, VPC_ID, this.deployment.tableLockId.longValue()); assertEquals(LOCK_NOT_CORRECTLY_GOT, VPC_ID, deployment.tableLockId.longValue());
} }
@Test(expected = ConcurrentOperationException.class) @Test(expected = ConcurrentOperationException.class)
public void testLockFails() { public void testLockFails() {
// Prepare // Prepare
when(this.mockVpcDao.acquireInLockTable(VPC_ID)) when(mockVpcDao.acquireInLockTable(VPC_ID)).thenReturn(null);
.thenReturn(null);
// Execute // Execute
try { try {
this.deployment.lock(); deployment.lock();
} finally { } finally {
// Assert // Assert
verify(this.mockVpcDao, times(1)).acquireInLockTable(VPC_ID); verify(mockVpcDao, times(1)).acquireInLockTable(VPC_ID);
assertNull(this.deployment.tableLockId); assertNull(deployment.tableLockId);
} }
} }
@Test @Test
public void testUnlock() { public void testUnlock() {
// Prepare // Prepare
this.deployment.tableLockId = VPC_ID; deployment.tableLockId = VPC_ID;
// Execute // Execute
this.deployment.unlock(); deployment.unlock();
// Assert // Assert
verify(this.mockVpcDao, times(1)).releaseFromLockTable(VPC_ID); verify(mockVpcDao, times(1)).releaseFromLockTable(VPC_ID);
} }
@Test @Test
public void testUnlockWithoutLock() { public void testUnlockWithoutLock() {
// Prepare // Prepare
this.deployment.tableLockId = null; deployment.tableLockId = null;
// Execute // Execute
this.deployment.unlock(); deployment.unlock();
// Assert // Assert
verify(this.mockVpcDao, times(0)).releaseFromLockTable(anyLong()); verify(mockVpcDao, times(0)).releaseFromLockTable(anyLong());
} }
@Test @Test
public void testFindDestinations() { public void testFindDestinations() {
// Execute // Execute
List<DeployDestination> foundDestinations = this.deployment.findDestinations(); List<DeployDestination> foundDestinations = deployment.findDestinations();
// Assert // Assert
assertEquals(FOR_VPC_ONLY_THE_GIVEN_DESTINATION_SHOULD_BE_USED, assertEquals(FOR_VPC_ONLY_THE_GIVEN_DESTINATION_SHOULD_BE_USED, deployment.dest, foundDestinations.get(0));
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,
1, foundDestinations.size());
} }
@Test @Test
public void testGetNumberOfRoutersToDeploy() { public void testGetNumberOfRoutersToDeploy() {
assertEquals("If there are no routers, it should deploy one", assertEquals("If there are no routers, it should deploy one", 1, deployment.getNumberOfRoutersToDeploy());
1, this.deployment.getNumberOfRoutersToDeploy()); deployment.routers.add(mock(DomainRouterVO.class));
this.deployment.routers.add(mock(DomainRouterVO.class)); assertEquals("If there is already a router found, there is no need to deploy more", 0, deployment.getNumberOfRoutersToDeploy());
assertEquals("If there is already a router found, there is no need to deploy more",
0, this.deployment.getNumberOfRoutersToDeploy());
} }
@Test @Test
public void testPrepareDeployment() { public void testPrepareDeployment() {
assertTrue("There are no preconditions for Vpc Deployment, thus it should always pass", assertTrue("There are no preconditions for Vpc Deployment, thus it should always pass", deployment.prepareDeployment());
this.deployment.prepareDeployment());
} }
@Test @Test