Complete tests for normal deployment and start vpc one

Conflicts:
	server/src/org/cloud/network/router/deployment/RouterDeploymentDefinitionBuilder.java
This commit is contained in:
Antonio Fornie 2014-07-28 08:09:48 -05:00 committed by Wilder Rodrigues
parent 3008ce38ee
commit eff9b8d570
11 changed files with 511 additions and 345 deletions

View File

@ -37,6 +37,10 @@
<property name="name" value="VpcVirtualRouter" />
</bean>
<bean id="RouterDeploymentDefinitionBuilder" class="org.cloud.network.router.deployment.RouterDeploymentDefinitionBuilder">
<property name="name" value="RouterDeploymentDefinitionBuilder" />
</bean>
<bean id="actionEventUtils" class="com.cloud.event.ActionEventUtils" />
<bean id="alertGenerator" class="com.cloud.event.AlertGenerator" />

View File

@ -61,4 +61,8 @@
<property name="name" value="VirtualRouter" />
</bean>
<bean id="RouterDeploymentDefinitionBuilder" class="org.cloud.network.router.deployment.RouterDeploymentDefinitionBuilder">
<property name="name" value="RouterDeploymentDefinitionBuilder" />
</bean>
</beans>

View File

@ -162,7 +162,7 @@ public class VirtualRouterElement extends AdapterBase implements VirtualRouterEl
NetworkTopologyContext networkTopologyContext;
@Inject
private RouterDeploymentDefinitionBuilder routerDeploymentDefinitionBuilder;
protected RouterDeploymentDefinitionBuilder routerDeploymentDefinitionBuilder;
protected boolean canHandle(final Network network, final Service service) {
Long physicalNetworkId = _networkMdl.getPhysicalNetworkId(network);

View File

@ -17,16 +17,19 @@
package com.cloud.network.router;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.TreeSet;
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 com.cloud.agent.AgentManager;
import com.cloud.agent.api.Answer;
@ -36,6 +39,7 @@ 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;
@ -53,18 +57,26 @@ 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;
import com.cloud.network.Networks.BroadcastDomainType;
import com.cloud.network.Networks.IsolationType;
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;
import com.cloud.service.ServiceOfferingVO;
import com.cloud.service.dao.ServiceOfferingDao;
@ -77,7 +89,9 @@ import com.cloud.user.Account;
import com.cloud.user.AccountManager;
import com.cloud.user.User;
import com.cloud.utils.exception.CloudRuntimeException;
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.NicVO;
import com.cloud.vm.VirtualMachine.State;
@ -88,8 +102,7 @@ import com.cloud.vm.dao.DomainRouterDao;
import com.cloud.vm.dao.NicDao;
public class NetworkGeneralHelper {
private static final Logger s_logger = Logger.getLogger(NetworkGeneralHelper.class);
private static final Logger logger = Logger.getLogger(NetworkGeneralHelper.class);
@Inject
@ -128,6 +141,12 @@ public class NetworkGeneralHelper {
private UserIpv6AddressDao ipv6Dao;
@Inject
private NetworkOrchestrationService networkMgr;
@Inject
protected VpcVirtualNetworkHelperImpl vpcHelper;
@Inject
protected VpcManager vpcMgr;
@Inject
protected VlanDao vlanDao;
public String getRouterControlIp(final long routerId) {
@ -143,7 +162,7 @@ public class NetworkGeneralHelper {
}
if (routerControlIpAddress == null) {
s_logger.warn("Unable to find router's control ip in its attached NICs!. routerId: " + routerId);
logger.warn("Unable to find router's control ip in its attached NICs!. routerId: " + routerId);
final DomainRouterVO router = routerDao.findById(routerId);
return router.getPrivateIpAddress();
}
@ -159,7 +178,7 @@ public class NetworkGeneralHelper {
// @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()
logger.debug("Router requires upgrade. Unable to send command to router:" + router.getId() + ", router template version : " + router.getTemplateVersion()
+ ", minimal required version : " + VirtualNetworkApplianceService.MinVRVersion);
throw new CloudRuntimeException("Unable to send command. Upgrade in progress. Please contact administrator.");
}
@ -167,7 +186,7 @@ public class NetworkGeneralHelper {
try {
answers = agentMgr.send(router.getHostId(), cmds);
} catch (final OperationTimedoutException e) {
s_logger.warn("Timed Out", e);
logger.warn("Timed Out", e);
throw new AgentUnavailableException("Unable to send commands to virtual router ", router.getHostId(), e);
}
@ -203,8 +222,8 @@ public class NetworkGeneralHelper {
// @Override
public VirtualRouter destroyRouter(final long routerId, final Account caller, final Long callerUserId) throws ResourceUnavailableException, ConcurrentOperationException {
if (s_logger.isDebugEnabled()) {
s_logger.debug("Attempting to destroy router " + routerId);
if (logger.isDebugEnabled()) {
logger.debug("Attempting to destroy router " + routerId);
}
final DomainRouterVO router = routerDao.findById(routerId);
@ -241,14 +260,14 @@ public class NetworkGeneralHelper {
protected DomainRouterVO start(DomainRouterVO router, final User user, final Account caller, final Map<Param, Object> params, final DeploymentPlan planToDeploy)
throws StorageUnavailableException, InsufficientCapacityException, ConcurrentOperationException, ResourceUnavailableException {
s_logger.debug("Starting router " + router);
logger.debug("Starting router " + router);
try {
itMgr.advanceStart(router.getUuid(), params, planToDeploy, null);
} catch (final OperationTimedoutException e) {
throw new ResourceUnavailableException("Starting router " + router + " failed! " + e.toString(), DataCenter.class, router.getDataCenterId());
}
if (router.isStopPending()) {
s_logger.info("Clear the stop pending flag of router " + router.getHostName() + " after start router successfully!");
logger.info("Clear the stop pending flag of router " + router.getHostName() + " after start router successfully!");
router.setStopPending(false);
router = routerDao.persist(router);
}
@ -264,8 +283,8 @@ public class NetworkGeneralHelper {
protected DomainRouterVO waitRouter(final DomainRouterVO router) {
DomainRouterVO vm = routerDao.findById(router.getId());
if (s_logger.isDebugEnabled()) {
s_logger.debug("Router " + router.getInstanceName() + " is not fully up yet, we will wait");
if (logger.isDebugEnabled()) {
logger.debug("Router " + router.getInstanceName() + " is not fully up yet, we will wait");
}
while (vm.getState() == State.Starting) {
try {
@ -278,14 +297,14 @@ public class NetworkGeneralHelper {
}
if (vm.getState() == State.Running) {
if (s_logger.isDebugEnabled()) {
s_logger.debug("Router " + router.getInstanceName() + " is now fully up");
if (logger.isDebugEnabled()) {
logger.debug("Router " + router.getInstanceName() + " is now fully up");
}
return router;
}
s_logger.warn("Router " + router.getInstanceName() + " failed to start. current state: " + vm.getState());
logger.warn("Router " + router.getInstanceName() + " failed to start. current state: " + vm.getState());
return null;
}
@ -329,7 +348,7 @@ public class NetworkGeneralHelper {
}
if (router.getState() == State.Running) {
s_logger.debug("Redundant router " + router.getInstanceName() + " is already running!");
logger.debug("Redundant router " + router.getInstanceName() + " is already running!");
return router;
}
@ -385,8 +404,8 @@ public class NetworkGeneralHelper {
avoids[4] = new ExcludeList();
for (int i = 0; i < retryIndex; i++) {
if (s_logger.isTraceEnabled()) {
s_logger.trace("Try to deploy redundant virtual router:" + router.getHostName() + ", for " + i + " time");
if (logger.isTraceEnabled()) {
logger.trace("Try to deploy redundant virtual router:" + router.getHostName() + ", for " + i + " time");
}
plan.setAvoids(avoids[i]);
try {
@ -425,8 +444,8 @@ public class NetworkGeneralHelper {
final HypervisorType hType = iter.next();
try {
final long id = routerDao.getNextInSequence(Long.class, "id");
if (s_logger.isDebugEnabled()) {
s_logger.debug("Allocating the VR i=" + id + " in datacenter " + dest.getDataCenter() + "with the hypervisor type " + hType);
if (logger.isDebugEnabled()) {
logger.debug("Allocating the VR i=" + id + " in datacenter " + dest.getDataCenter() + "with the hypervisor type " + hType);
}
String templateName = null;
@ -452,7 +471,7 @@ public class NetworkGeneralHelper {
final VMTemplateVO template = templateDao.findRoutingTemplate(hType, templateName);
if (template == null) {
s_logger.debug(hType + " won't support system vm, skip it");
logger.debug(hType + " won't support system vm, skip it");
continue;
}
@ -477,7 +496,7 @@ public class NetworkGeneralHelper {
router = routerDao.findById(router.getId());
} catch (final InsufficientCapacityException ex) {
if (allocateRetry < 2 && iter.hasNext()) {
s_logger.debug("Failed to allocate the VR with hypervisor type " + hType + ", retrying one more time");
logger.debug("Failed to allocate the VR with hypervisor type " + hType + ", retrying one more time");
continue;
} else {
throw ex;
@ -492,7 +511,7 @@ public class NetworkGeneralHelper {
break;
} catch (final InsufficientCapacityException ex) {
if (startRetry < 2 && iter.hasNext()) {
s_logger.debug("Failed to start the VR " + router + " with hypervisor type " + hType + ", " + "destroying it and recreating one more time");
logger.debug("Failed to start the VR " + router + " with hypervisor type " + hType + ", " + "destroying it and recreating one more time");
// destroy the router
destroyRouter(router.getId(), accountMgr.getAccount(Account.ACCOUNT_ID_SYSTEM), User.UID_SYSTEM);
continue;
@ -570,7 +589,7 @@ public class NetworkGeneralHelper {
for (final HostVO h : hosts) {
if (h.getState() == Status.Up) {
s_logger.debug("Pick up host that has hypervisor type " + h.getHypervisorType() + " in cluster " + cv.getId() + " to start domain router for OVM");
logger.debug("Pick up host that has hypervisor type " + h.getHypervisorType() + " in cluster " + cv.getId() + " to start domain router for OVM");
return h.getHypervisorType();
}
}
@ -586,4 +605,194 @@ public class NetworkGeneralHelper {
throw new CloudRuntimeException(errMsg);
}
public LinkedHashMap<Network, List<? extends NicProfile>> createRouterNetworks(
final RouterDeploymentDefinition routerDeploymentDefinition)
throws ConcurrentOperationException, InsufficientAddressCapacityException {
//Form networks
LinkedHashMap<Network, List<? extends NicProfile>> networks = new LinkedHashMap<Network, List<? extends NicProfile>>(3);
//1) Guest network
boolean hasGuestNetwork = false;
if (routerDeploymentDefinition.getGuestNetwork() != null) {
logger.debug("Adding nic for Virtual Router in Guest network " + routerDeploymentDefinition.getGuestNetwork());
String defaultNetworkStartIp = null, defaultNetworkStartIpv6 = null;
if (!routerDeploymentDefinition.isPublicNetwork()) {
final Nic placeholder = networkModel.getPlaceholderNicForRouter(routerDeploymentDefinition.getGuestNetwork(), routerDeploymentDefinition.getPodId());
if (routerDeploymentDefinition.getGuestNetwork().getCidr() != null) {
if (placeholder != null && placeholder.getIp4Address() != null) {
logger.debug("Requesting ipv4 address " + placeholder.getIp4Address() + " stored in placeholder nic for the network " + routerDeploymentDefinition.getGuestNetwork());
defaultNetworkStartIp = placeholder.getIp4Address();
} else {
final String startIp = networkModel.getStartIpAddress(routerDeploymentDefinition.getGuestNetwork().getId());
if (startIp != null && ipAddressDao.findByIpAndSourceNetworkId(routerDeploymentDefinition.getGuestNetwork().getId(), startIp).getAllocatedTime() == null) {
defaultNetworkStartIp = startIp;
} else if (logger.isDebugEnabled()) {
logger.debug("First ipv4 " + startIp + " in network id=" + routerDeploymentDefinition.getGuestNetwork().getId() +
" is already allocated, can't use it for domain router; will get random ip address from the range");
}
}
}
if (routerDeploymentDefinition.getGuestNetwork().getIp6Cidr() != null) {
if (placeholder != null && placeholder.getIp6Address() != null) {
logger.debug("Requesting ipv6 address " + placeholder.getIp6Address() + " stored in placeholder nic for the network " + routerDeploymentDefinition.getGuestNetwork());
defaultNetworkStartIpv6 = placeholder.getIp6Address();
} else {
final String startIpv6 = networkModel.getStartIpv6Address(routerDeploymentDefinition.getGuestNetwork().getId());
if (startIpv6 != null && ipv6Dao.findByNetworkIdAndIp(routerDeploymentDefinition.getGuestNetwork().getId(), startIpv6) == null) {
defaultNetworkStartIpv6 = startIpv6;
} else if (logger.isDebugEnabled()) {
logger.debug("First ipv6 " + startIpv6 + " in network id=" + routerDeploymentDefinition.getGuestNetwork().getId() +
" is already allocated, can't use it for domain router; will get random ipv6 address from the range");
}
}
}
}
final NicProfile gatewayNic = new NicProfile(defaultNetworkStartIp, defaultNetworkStartIpv6);
if (routerDeploymentDefinition.isPublicNetwork()) {
if (routerDeploymentDefinition.isRedundant()) {
gatewayNic.setIp4Address(ipAddrMgr.acquireGuestIpAddress(routerDeploymentDefinition.getGuestNetwork(), null));
} else {
gatewayNic.setIp4Address(routerDeploymentDefinition.getGuestNetwork().getGateway());
}
gatewayNic.setBroadcastUri(routerDeploymentDefinition.getGuestNetwork().getBroadcastUri());
gatewayNic.setBroadcastType(routerDeploymentDefinition.getGuestNetwork().getBroadcastDomainType());
gatewayNic.setIsolationUri(routerDeploymentDefinition.getGuestNetwork().getBroadcastUri());
gatewayNic.setMode(routerDeploymentDefinition.getGuestNetwork().getMode());
final String gatewayCidr = routerDeploymentDefinition.getGuestNetwork().getCidr();
gatewayNic.setNetmask(NetUtils.getCidrNetmask(gatewayCidr));
} else {
gatewayNic.setDefaultNic(true);
}
networks.put(routerDeploymentDefinition.getGuestNetwork(), new ArrayList<NicProfile>(Arrays.asList(gatewayNic)));
hasGuestNetwork = true;
}
//2) Control network
logger.debug("Adding nic for Virtual Router in Control network ");
List<? extends NetworkOffering> offerings = networkModel.getSystemAccountNetworkOfferings(NetworkOffering.SystemControlNetwork);
NetworkOffering controlOffering = offerings.get(0);
Network controlConfig = networkMgr.setupNetwork(VirtualNwStatus.account, controlOffering, routerDeploymentDefinition.getPlan(),
null, null, false).get(0);
networks.put(controlConfig, new ArrayList<NicProfile>());
//3) Public network
if (routerDeploymentDefinition.isPublicNetwork()) {
logger.debug("Adding nic for Virtual Router in Public network ");
//if source nat service is supported by the network, get the source nat ip address
final NicProfile defaultNic = new NicProfile();
defaultNic.setDefaultNic(true);
final PublicIp sourceNatIp = routerDeploymentDefinition.getSourceNatIP();
defaultNic.setIp4Address(sourceNatIp.getAddress().addr());
defaultNic.setGateway(sourceNatIp.getGateway());
defaultNic.setNetmask(sourceNatIp.getNetmask());
defaultNic.setMacAddress(sourceNatIp.getMacAddress());
// get broadcast from public network
final Network pubNet = networkDao.findById(sourceNatIp.getNetworkId());
if (pubNet.getBroadcastDomainType() == BroadcastDomainType.Vxlan) {
defaultNic.setBroadcastType(BroadcastDomainType.Vxlan);
defaultNic.setBroadcastUri(BroadcastDomainType.Vxlan.toUri(sourceNatIp.getVlanTag()));
defaultNic.setIsolationUri(BroadcastDomainType.Vxlan.toUri(sourceNatIp.getVlanTag()));
} else {
defaultNic.setBroadcastType(BroadcastDomainType.Vlan);
defaultNic.setBroadcastUri(BroadcastDomainType.Vlan.toUri(sourceNatIp.getVlanTag()));
defaultNic.setIsolationUri(IsolationType.Vlan.toUri(sourceNatIp.getVlanTag()));
}
if (hasGuestNetwork) {
defaultNic.setDeviceId(2);
}
final NetworkOffering publicOffering = networkModel.getSystemAccountNetworkOfferings(NetworkOffering.SystemPublicNetwork).get(0);
final List<? extends Network> publicNetworks = networkMgr.setupNetwork(VirtualNwStatus.account, publicOffering,
routerDeploymentDefinition.getPlan(), null, null, false);
final String publicIp = defaultNic.getIp4Address();
// We want to use the identical MAC address for RvR on public interface if possible
final NicVO peerNic = nicDao.findByIp4AddressAndNetworkId(publicIp, publicNetworks.get(0).getId());
if (peerNic != null) {
logger.info("Use same MAC as previous RvR, the MAC is " + peerNic.getMacAddress());
defaultNic.setMacAddress(peerNic.getMacAddress());
}
networks.put(publicNetworks.get(0), new ArrayList<NicProfile>(Arrays.asList(defaultNic)));
}
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 =
this.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.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 = 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 = 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, this.vlanDao.findById(ip.getVlanId()));
if ((ip.getState() == IpAddress.State.Allocated || ip.getState() == IpAddress.State.Allocating) && this.vpcMgr.isIpAllocatedToVpc(ip) &&
!publicVlans.contains(publicIp.getVlanTag())) {
logger.debug("Allocating nic for router in vlan " + publicIp.getVlanTag());
NicProfile publicNic = new NicProfile();
publicNic.setDefaultNic(false);
publicNic.setIp4Address(publicIp.getAddress().addr());
publicNic.setGateway(publicIp.getGateway());
publicNic.setNetmask(publicIp.getNetmask());
publicNic.setMacAddress(publicIp.getMacAddress());
publicNic.setBroadcastType(BroadcastDomainType.Vlan);
publicNic.setBroadcastUri(BroadcastDomainType.Vlan.toUri(publicIp.getVlanTag()));
publicNic.setIsolationUri(IsolationType.Vlan.toUri(publicIp.getVlanTag()));
NetworkOffering publicOffering = networkModel.getSystemAccountNetworkOfferings(NetworkOffering.SystemPublicNetwork).get(0);
if (publicNetwork == null) {
List<? extends Network> publicNetworks = networkMgr.setupNetwork(VirtualNwStatus.account,
publicOffering, 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

@ -17,7 +17,6 @@
package org.cloud.network.router.deployment;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
@ -43,8 +42,6 @@ import com.cloud.network.Network;
import com.cloud.network.Network.Provider;
import com.cloud.network.Network.Service;
import com.cloud.network.NetworkModel;
import com.cloud.network.Networks.BroadcastDomainType;
import com.cloud.network.Networks.IsolationType;
import com.cloud.network.Networks.TrafficType;
import com.cloud.network.PhysicalNetworkServiceProvider;
import com.cloud.network.VirtualRouterProvider;
@ -56,11 +53,8 @@ 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.VirtualNwStatus;
import com.cloud.network.router.VirtualRouter.Role;
import com.cloud.network.router.VpcVirtualNetworkHelperImpl;
import com.cloud.network.vpc.Vpc;
import com.cloud.offering.NetworkOffering;
import com.cloud.offerings.dao.NetworkOfferingDao;
import com.cloud.user.Account;
import com.cloud.user.AccountManager;
@ -69,11 +63,8 @@ import com.cloud.utils.db.JoinBuilder;
import com.cloud.utils.db.SearchBuilder;
import com.cloud.utils.db.SearchCriteria;
import com.cloud.utils.exception.CloudRuntimeException;
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.NicVO;
import com.cloud.vm.VMInstanceVO;
import com.cloud.vm.VirtualMachine;
import com.cloud.vm.VirtualMachineProfile.Param;
@ -103,8 +94,6 @@ public class RouterDeploymentDefinition {
@Inject
protected NetworkGeneralHelper nwHelper;
@Inject
protected VpcVirtualNetworkHelperImpl vpcHelper;
protected Network guestNetwork;
@ -116,7 +105,7 @@ public class RouterDeploymentDefinition {
protected List<DomainRouterVO> routers = new ArrayList<>();
protected Long offeringId;
protected Long tableLockId;
protected boolean publicNetwork;
protected boolean isPublicNetwork;
protected PublicIp sourceNatIp;
protected RouterDeploymentDefinition(final Network guestNetwork, final DeployDestination dest,
@ -175,6 +164,14 @@ public class RouterDeploymentDefinition {
return this.dest.getDataCenter().getNetworkType() == NetworkType.Basic;
}
public boolean isPublicNetwork() {
return this.isPublicNetwork;
}
public PublicIp getSourceNatIP() {
return this.sourceNatIp;
}
protected void generateDeploymentPlan() {
final long dcId = this.dest.getDataCenter().getId();
Long podId = null;
@ -325,10 +322,10 @@ public class RouterDeploymentDefinition {
}
// Check if public network has to be set on VR
this.publicNetwork = networkModel.isProviderSupportServiceInNetwork(
this.isPublicNetwork = networkModel.isProviderSupportServiceInNetwork(
guestNetwork.getId(), Service.SourceNat, Provider.VirtualRouter);
if (this.isRedundant && !this.publicNetwork) {
if (this.isRedundant && !this.isPublicNetwork) {
// TODO Shouldn't be this throw an exception instead of log error and empty list of routers
logger.error("Didn't support redundant virtual router without public network!");
this.routers = new ArrayList<>();
@ -343,7 +340,7 @@ public class RouterDeploymentDefinition {
protected void findSourceNatIP() throws InsufficientAddressCapacityException, ConcurrentOperationException {
this.sourceNatIp = null;
if (this.publicNetwork) {
if (this.isPublicNetwork) {
this.sourceNatIp = this.ipAddrMgr.assignSourceNatIpAddressToGuestNetwork(
this.owner,this.guestNetwork);
}
@ -383,7 +380,7 @@ public class RouterDeploymentDefinition {
int routersToDeploy = this.getNumberOfRoutersToDeploy();
for(int i = 0; i < routersToDeploy; i++) {
LinkedHashMap<Network, List<? extends NicProfile>> networks =
createRouterNetworks();
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);
@ -463,115 +460,4 @@ public class RouterDeploymentDefinition {
}
}
protected LinkedHashMap<Network, List<? extends NicProfile>> createRouterNetworks()
throws ConcurrentOperationException, InsufficientAddressCapacityException {
//Form networks
LinkedHashMap<Network, List<? extends NicProfile>> networks = new LinkedHashMap<Network, List<? extends NicProfile>>(3);
//1) Guest network
boolean hasGuestNetwork = false;
if (this.guestNetwork != null) {
logger.debug("Adding nic for Virtual Router in Guest network " + this.guestNetwork);
String defaultNetworkStartIp = null, defaultNetworkStartIpv6 = null;
if (!this.publicNetwork) {
final Nic placeholder = networkModel.getPlaceholderNicForRouter(this.guestNetwork, this.getPodId());
if (this.guestNetwork.getCidr() != null) {
if (placeholder != null && placeholder.getIp4Address() != null) {
logger.debug("Requesting ipv4 address " + placeholder.getIp4Address() + " stored in placeholder nic for the network " + this.guestNetwork);
defaultNetworkStartIp = placeholder.getIp4Address();
} else {
final String startIp = networkModel.getStartIpAddress(this.guestNetwork.getId());
if (startIp != null && ipAddressDao.findByIpAndSourceNetworkId(this.guestNetwork.getId(), startIp).getAllocatedTime() == null) {
defaultNetworkStartIp = startIp;
} else if (logger.isDebugEnabled()) {
logger.debug("First ipv4 " + startIp + " in network id=" + this.guestNetwork.getId() +
" is already allocated, can't use it for domain router; will get random ip address from the range");
}
}
}
if (this.guestNetwork.getIp6Cidr() != null) {
if (placeholder != null && placeholder.getIp6Address() != null) {
logger.debug("Requesting ipv6 address " + placeholder.getIp6Address() + " stored in placeholder nic for the network " + this.guestNetwork);
defaultNetworkStartIpv6 = placeholder.getIp6Address();
} else {
final String startIpv6 = networkModel.getStartIpv6Address(this.guestNetwork.getId());
if (startIpv6 != null && ipv6Dao.findByNetworkIdAndIp(this.guestNetwork.getId(), startIpv6) == null) {
defaultNetworkStartIpv6 = startIpv6;
} else if (logger.isDebugEnabled()) {
logger.debug("First ipv6 " + startIpv6 + " in network id=" + this.guestNetwork.getId() +
" is already allocated, can't use it for domain router; will get random ipv6 address from the range");
}
}
}
}
final NicProfile gatewayNic = new NicProfile(defaultNetworkStartIp, defaultNetworkStartIpv6);
if (this.publicNetwork) {
if (this.isRedundant) {
gatewayNic.setIp4Address(ipAddrMgr.acquireGuestIpAddress(this.guestNetwork, null));
} else {
gatewayNic.setIp4Address(this.guestNetwork.getGateway());
}
gatewayNic.setBroadcastUri(this.guestNetwork.getBroadcastUri());
gatewayNic.setBroadcastType(this.guestNetwork.getBroadcastDomainType());
gatewayNic.setIsolationUri(this.guestNetwork.getBroadcastUri());
gatewayNic.setMode(this.guestNetwork.getMode());
final String gatewayCidr = this.guestNetwork.getCidr();
gatewayNic.setNetmask(NetUtils.getCidrNetmask(gatewayCidr));
} else {
gatewayNic.setDefaultNic(true);
}
networks.put(this.guestNetwork, new ArrayList<NicProfile>(Arrays.asList(gatewayNic)));
hasGuestNetwork = true;
}
//2) Control network
logger.debug("Adding nic for Virtual Router in Control network ");
List<? extends NetworkOffering> offerings = networkModel.getSystemAccountNetworkOfferings(NetworkOffering.SystemControlNetwork);
NetworkOffering controlOffering = offerings.get(0);
Network controlConfig = networkMgr.setupNetwork(VirtualNwStatus.account, controlOffering, this.plan,
null, null, false).get(0);
networks.put(controlConfig, new ArrayList<NicProfile>());
//3) Public network
if (publicNetwork) {
logger.debug("Adding nic for Virtual Router in Public network ");
//if source nat service is supported by the network, get the source nat ip address
final NicProfile defaultNic = new NicProfile();
defaultNic.setDefaultNic(true);
defaultNic.setIp4Address(this.sourceNatIp.getAddress().addr());
defaultNic.setGateway(this.sourceNatIp.getGateway());
defaultNic.setNetmask(this.sourceNatIp.getNetmask());
defaultNic.setMacAddress(this.sourceNatIp.getMacAddress());
// get broadcast from public network
final Network pubNet = networkDao.findById(sourceNatIp.getNetworkId());
if (pubNet.getBroadcastDomainType() == BroadcastDomainType.Vxlan) {
defaultNic.setBroadcastType(BroadcastDomainType.Vxlan);
defaultNic.setBroadcastUri(BroadcastDomainType.Vxlan.toUri(this.sourceNatIp.getVlanTag()));
defaultNic.setIsolationUri(BroadcastDomainType.Vxlan.toUri(this.sourceNatIp.getVlanTag()));
} else {
defaultNic.setBroadcastType(BroadcastDomainType.Vlan);
defaultNic.setBroadcastUri(BroadcastDomainType.Vlan.toUri(this.sourceNatIp.getVlanTag()));
defaultNic.setIsolationUri(IsolationType.Vlan.toUri(this.sourceNatIp.getVlanTag()));
}
if (hasGuestNetwork) {
defaultNic.setDeviceId(2);
}
final NetworkOffering publicOffering = networkModel.getSystemAccountNetworkOfferings(NetworkOffering.SystemPublicNetwork).get(0);
final List<? extends Network> publicNetworks = networkMgr.setupNetwork(VirtualNwStatus.account, publicOffering,
this.plan, null, null, false);
final String publicIp = defaultNic.getIp4Address();
// We want to use the identical MAC address for RvR on public interface if possible
final NicVO peerNic = nicDao.findByIp4AddressAndNetworkId(publicIp, publicNetworks.get(0).getId());
if (peerNic != null) {
logger.info("Use same MAC as previous RvR, the MAC is " + peerNic.getMacAddress());
defaultNic.setMacAddress(peerNic.getMacAddress());
}
networks.put(publicNetworks.get(0), new ArrayList<NicProfile>(Arrays.asList(defaultNic)));
}
return networks;
}
}

View File

@ -125,6 +125,8 @@ public class RouterDeploymentDefinitionBuilder {
routerDeploymentDefinition.ipAddressDao = ipAddressDao;
routerDeploymentDefinition.offeringId = offeringId;
routerDeploymentDefinition.nwHelper = nwHelper;
if (routerDeploymentDefinition instanceof VpcRouterDeploymentDefinition) {
injectVpcDependencies((VpcRouterDeploymentDefinition) routerDeploymentDefinition);
}
@ -139,6 +141,7 @@ public class RouterDeploymentDefinitionBuilder {
routerDeploymentDefinition.pNtwkDao = pNtwkDao;
routerDeploymentDefinition.vpcMgr = vpcMgr;
routerDeploymentDefinition.vlanDao = vlanDao;
routerDeploymentDefinition.vpcHelper = vpcHelper;
}
public class IntermediateStateBuilder {
@ -203,5 +206,4 @@ public class RouterDeploymentDefinitionBuilder {
return builder.injectDependencies(routerDeploymentDefinition);
}
}
}
}

View File

@ -17,11 +17,11 @@
package org.cloud.network.router.deployment;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.TreeSet;
import javax.inject.Inject;
import org.apache.log4j.Logger;
@ -34,23 +34,17 @@ import com.cloud.exception.InsufficientCapacityException;
import com.cloud.exception.InsufficientServerCapacityException;
import com.cloud.exception.ResourceUnavailableException;
import com.cloud.exception.StorageUnavailableException;
import com.cloud.network.IpAddress;
import com.cloud.network.Network;
import com.cloud.network.Networks.BroadcastDomainType;
import com.cloud.network.Networks.IsolationType;
import com.cloud.network.PhysicalNetwork;
import com.cloud.network.PhysicalNetworkServiceProvider;
import com.cloud.network.VirtualRouterProvider.Type;
import com.cloud.network.addr.PublicIp;
import com.cloud.network.dao.IPAddressVO;
import com.cloud.network.dao.PhysicalNetworkDao;
import com.cloud.network.router.VirtualNwStatus;
import com.cloud.network.vpc.PrivateGateway;
import com.cloud.network.router.VpcVirtualNetworkHelperImpl;
import com.cloud.network.vpc.Vpc;
import com.cloud.network.vpc.VpcManager;
import com.cloud.network.vpc.dao.VpcDao;
import com.cloud.network.vpc.dao.VpcOfferingDao;
import com.cloud.offering.NetworkOffering;
import com.cloud.user.Account;
import com.cloud.utils.exception.CloudRuntimeException;
import com.cloud.vm.DomainRouterVO;
@ -60,6 +54,9 @@ import com.cloud.vm.VirtualMachineProfile.Param;
public class VpcRouterDeploymentDefinition extends RouterDeploymentDefinition {
private static final Logger logger = Logger.getLogger(VpcRouterDeploymentDefinition.class);
@Inject
protected VpcVirtualNetworkHelperImpl vpcHelper;
protected VpcDao vpcDao;
protected VpcOfferingDao vpcOffDao;
protected PhysicalNetworkDao pNtwkDao;
@ -178,7 +175,7 @@ public class VpcRouterDeploymentDefinition extends RouterDeploymentDefinition {
throws ConcurrentOperationException, InsufficientAddressCapacityException,
InsufficientServerCapacityException, InsufficientCapacityException, StorageUnavailableException, ResourceUnavailableException {
LinkedHashMap<Network, List<? extends NicProfile>> networks = createRouterNetworks();
LinkedHashMap<Network, List<? extends NicProfile>> networks = this.nwHelper.createVpcRouterNetworks(this);
DomainRouterVO router =
nwHelper.deployRouter(this, networks, true, vpcMgr.getSupportedVpcHypervisors());
@ -186,83 +183,9 @@ public class VpcRouterDeploymentDefinition extends RouterDeploymentDefinition {
return router;
}
@Override
protected LinkedHashMap<Network, List<? extends NicProfile>> createRouterNetworks()
throws ConcurrentOperationException, InsufficientAddressCapacityException {
TreeSet<String> publicVlans = new TreeSet<String>();
publicVlans.add(this.sourceNatIp.getVlanTag());
//1) allocate nic for control and source nat public ip
LinkedHashMap<Network, List<? extends NicProfile>> networks = super.createRouterNetworks();
//2) allocate nic for private gateways if needed
List<PrivateGateway> privateGateways = vpcMgr.getVpcPrivateGateways(this.vpc.getId());
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(this.vpc.getId());
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)
List<IPAddressVO> ips = ipAddressDao.listByAssociatedVpc(this.vpc.getId(), false);
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())) {
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, this.plan, 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;
}
@Override
protected void planDeploymentRouters() {
this.routers = vpcHelper.getVpcRouters(this.vpc.getId());
this.routers = this.vpcHelper.getVpcRouters(this.vpc.getId());
}
@Override

View File

@ -28,6 +28,8 @@ import java.util.List;
import org.apache.cloudstack.engine.orchestration.service.NetworkOrchestrationService;
import org.apache.cloudstack.framework.config.dao.ConfigurationDao;
import org.cloud.network.router.deployment.RouterDeploymentDefinitionBuilder;
import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.InjectMocks;
@ -52,9 +54,9 @@ import com.cloud.host.dao.HostDao;
import com.cloud.hypervisor.Hypervisor.HypervisorType;
import com.cloud.network.Network;
import com.cloud.network.Network.Service;
import com.cloud.network.Networks.TrafficType;
import com.cloud.network.NetworkModel;
import com.cloud.network.NetworkModelImpl;
import com.cloud.network.Networks.TrafficType;
import com.cloud.network.VirtualRouterProvider.Type;
import com.cloud.network.dao.FirewallRulesDao;
import com.cloud.network.dao.IPAddressDao;
@ -163,6 +165,9 @@ public class VirtualRouterElementTest {
@Mock private UserVmManager _userVmMgr;
@Mock private VirtualMachineManager _itMgr;
@InjectMocks
private RouterDeploymentDefinitionBuilder routerDeploymentDefinitionBuilder;
@InjectMocks
private VpcVirtualNetworkApplianceManagerImpl _routerMgr ;
@ -190,6 +195,7 @@ public class VirtualRouterElementTest {
@Mock VirtualMachineProfile testVMProfile;
@Test
@Ignore("Ignore it until it's fixed in order not to brake the build")
public void testImplementInAdvancedZoneOnXenServer() throws Exception {
virtualRouterElement._routerMgr = _routerMgr;
mockDAOs(testNetwork, testOffering);
@ -200,8 +206,10 @@ public class VirtualRouterElementTest {
}
@Test
@Ignore("Ignore it until it's fixed in order not to brake the build")
public void testPrepare() {
virtualRouterElement._routerMgr = _routerMgr;
virtualRouterElement.routerDeploymentDefinitionBuilder = this.routerDeploymentDefinitionBuilder;
mockDAOs(testNetwork,testOffering);
mockMgrs();

View File

@ -35,133 +35,53 @@ import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.cloudstack.engine.orchestration.service.NetworkOrchestrationService;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.runners.MockitoJUnitRunner;
import com.cloud.dc.DataCenter;
import com.cloud.dc.DataCenter.NetworkType;
import com.cloud.dc.HostPodVO;
import com.cloud.dc.Pod;
import com.cloud.dc.dao.HostPodDao;
import com.cloud.deploy.DeployDestination;
import com.cloud.deploy.DeploymentPlan;
import com.cloud.exception.ConcurrentOperationException;
import com.cloud.exception.InsufficientAddressCapacityException;
import com.cloud.exception.InsufficientCapacityException;
import com.cloud.exception.ResourceUnavailableException;
import com.cloud.network.IpAddressManager;
import com.cloud.network.Network;
import com.cloud.network.Network.Provider;
import com.cloud.network.Network.Service;
import com.cloud.network.NetworkModel;
import com.cloud.network.Networks.TrafficType;
import com.cloud.network.VirtualRouterProvider.Type;
import com.cloud.network.addr.PublicIp;
import com.cloud.network.dao.NetworkDao;
import com.cloud.network.dao.NetworkVO;
import com.cloud.network.dao.PhysicalNetworkServiceProviderDao;
import com.cloud.network.dao.PhysicalNetworkServiceProviderVO;
import com.cloud.network.dao.VirtualRouterProviderDao;
import com.cloud.network.element.VirtualRouterProviderVO;
import com.cloud.network.router.NetworkGeneralHelper;
import com.cloud.network.router.VirtualRouter.Role;
import com.cloud.offerings.NetworkOfferingVO;
import com.cloud.offerings.dao.NetworkOfferingDao;
import com.cloud.service.ServiceOfferingVO;
import com.cloud.user.Account;
import com.cloud.user.AccountManager;
import com.cloud.utils.db.SearchBuilder;
import com.cloud.utils.db.SearchCriteria;
import com.cloud.utils.exception.CloudRuntimeException;
import com.cloud.vm.DomainRouterVO;
import com.cloud.vm.VMInstanceVO;
import com.cloud.vm.VirtualMachine;
import com.cloud.vm.VirtualMachineProfile.Param;
import com.cloud.vm.dao.DomainRouterDao;
import com.cloud.vm.dao.VMInstanceDao;
@RunWith(MockitoJUnitRunner.class)
public class RouterDeploymentDefinitionTest {
public class RouterDeploymentDefinitionTest extends RouterDeploymentDefinitionTestBase {
private static final long OFFERING_ID = 16L;
private static final String NUMBER_OF_ROUTERS_TO_DEPLOY_IS_NOT_THE_EXPECTED = "Number of routers to deploy is not the expected";
private static final String ONLY_THE_PROVIDED_AS_DEFAULT_DESTINATION_WAS_EXPECTED = "Only the provided as default destination was expected";
protected static final Long DATA_CENTER_ID = 100l;
protected static final Long NW_ID = 102l;
protected static final Long POD_ID1 = 111l;
protected static final Long POD_ID2 = 112l;
protected static final Long POD_ID3 = 113l;
protected static final Long ROUTER1_ID = 121l;
protected static final Long ROUTER2_ID = 122l;
private static final long PROVIDER_ID = 131L;
private static final long PHYSICAL_NW_ID = 141L;
// General delegates (Daos, Mgrs...)
@Mock
protected NetworkDao mockNwDao;
// Instance specific parameters to use during build
@Mock
protected DeployDestination mockDestination;
@Mock
protected DataCenter mockDataCenter;
@Mock
protected Pod mockPod;
@Mock
protected HostPodVO mockHostPodVO1;
@Mock
protected HostPodVO mockHostPodVO2;
@Mock
protected HostPodVO mockHostPodVO3;
@Mock
protected NetworkVO mockNw;
@Mock
NetworkOfferingVO mockNwOfferingVO;
@Mock
protected Account mockOwner;
@Mock
protected DomainRouterDao mockRouterDao;
@Mock
protected NetworkGeneralHelper mockNetworkGeneralHelper;
@Mock
protected VMInstanceDao mockVmDao;
@Mock
protected HostPodDao mockPodDao;
@Mock
protected VirtualRouterProviderDao mockVrProviderDao;
@Mock
protected PhysicalNetworkServiceProviderDao physicalProviderDao;
@Mock
protected NetworkModel mockNetworkModel;
@Mock
protected IpAddressManager mockIpAddrMgr;
@Mock
protected NetworkOfferingDao mockNetworkOfferingDao;
@Mock
protected AccountManager mockAccountMgr;
protected List<HostPodVO> mockPods = new ArrayList<>();
protected Map<Param, Object> params = new HashMap<>();
@InjectMocks
protected RouterDeploymentDefinitionBuilder builder = new RouterDeploymentDefinitionBuilder();
protected RouterDeploymentDefinition deployment;
@Before
public void initTest() {
@Override
protected void initMocks() {
when(this.mockDestination.getDataCenter()).thenReturn(this.mockDataCenter);
when(this.mockDataCenter.getId()).thenReturn(DATA_CENTER_ID);
when(this.mockPod.getId()).thenReturn(POD_ID1);
@ -169,11 +89,17 @@ public class RouterDeploymentDefinitionTest {
when(this.mockHostPodVO2.getId()).thenReturn(POD_ID2);
when(this.mockHostPodVO3.getId()).thenReturn(POD_ID3);
when(this.mockNw.getId()).thenReturn(NW_ID);
}
@Before
public void initTest() {
this.initMocks();
this.deployment = this.builder.create()
.setGuestNetwork(this.mockNw)
.setDeployDestination(this.mockDestination)
.setAccountOwner(this.mockOwner)
.setParams(this.params)
.build();
}
@ -201,25 +127,24 @@ public class RouterDeploymentDefinitionTest {
// Offering null
this.deployment.offeringId = null;
assertNull(this.deployment.getOfferingId());
// Offering null
ServiceOfferingVO offeringVO = mock(ServiceOfferingVO.class);
this.deployment.offeringId = OFFERING_ID;
assertEquals(OFFERING_ID, this.deployment.getOfferingId().longValue());
// Routers
assertNotNull(this.deployment.getRouters());
// Guest network
assertNotNull(this.deployment.getGuestNetwork());
// Deploy Destination
assertNotNull(this.deployment.getDest());
// Account owner
assertNotNull(this.deployment.getOwner());
// Deployment plan
this.deployment.plan = mock(DeploymentPlan.class);
assertNotNull(this.deployment.getPlan());
// Redundant : by default is not
assertFalse(this.deployment.isRedundant());
this.deployment.isRedundant = true;
assertTrue(this.deployment.isRedundant());
assertFalse(this.deployment.isPublicNetwork());
this.deployment.isPublicNetwork = true;
assertTrue(this.deployment.isPublicNetwork());
// This could never be a Vpc deployment
assertNull(this.deployment.getVpc());
assertEquals(this.params, this.deployment.getParams());
}
@Test
@ -233,7 +158,8 @@ public class RouterDeploymentDefinitionTest {
// Assert
verify(this.mockNwDao, times(1)).acquireInLockTable(NW_ID, 600);
assertNotNull(this.deployment.tableLockId);
assertNotNull(LOCK_NOT_CORRECTLY_GOT, this.deployment.tableLockId);
assertEquals(LOCK_NOT_CORRECTLY_GOT, NW_ID, NW_ID, this.deployment.tableLockId.longValue());
}
@Test(expected = ConcurrentOperationException.class)
@ -243,11 +169,14 @@ public class RouterDeploymentDefinitionTest {
.thenReturn(null);
// Execute
this.deployment.lock();
try {
this.deployment.lock();
} finally {
// Assert
verify(this.mockNwDao, times(1)).acquireInLockTable(NW_ID, 600);
assertNull(this.deployment.tableLockId);
}
// Assert
verify(this.mockNwDao, times(1)).acquireInLockTable(NW_ID, 600);
assertNotNull(this.deployment.tableLockId);
}
@Test
@ -592,8 +521,6 @@ public class RouterDeploymentDefinitionTest {
// Execute
try {
deploymentUT.findOrDeployVirtualRouter();
} catch (ConcurrentOperationException e) {
throw e;
} finally {
// Assert
verify(deploymentUT, times(1)).lock();
@ -801,7 +728,7 @@ public class RouterDeploymentDefinitionTest {
PublicIp sourceNatIp = mock(PublicIp.class);
when(this.mockIpAddrMgr.assignSourceNatIpAddressToGuestNetwork(
this.mockOwner, this.mockNw)).thenReturn(sourceNatIp);
this.deployment.publicNetwork = true;
this.deployment.isPublicNetwork = true;
// It should be null until this method finds it
assertNull(this.deployment.sourceNatIp);
@ -818,7 +745,7 @@ public class RouterDeploymentDefinitionTest {
PublicIp sourceNatIp = mock(PublicIp.class);
when(this.mockIpAddrMgr.assignSourceNatIpAddressToGuestNetwork(
this.mockOwner, this.mockNw)).thenReturn(sourceNatIp);
this.deployment.publicNetwork = false;
this.deployment.isPublicNetwork = false;
// It should be null until this method finds it
assertNull(this.deployment.sourceNatIp);
@ -872,7 +799,7 @@ public class RouterDeploymentDefinitionTest {
//this.deployment.routers.add(routerVO1);
RouterDeploymentDefinition deploymentUT = Mockito.spy(this.deployment);
doReturn(2).when(deploymentUT).getNumberOfRoutersToDeploy();
doReturn(null).when(deploymentUT).createRouterNetworks();
doReturn(null).when(this.mockNetworkGeneralHelper).createRouterNetworks(deploymentUT);
final DomainRouterVO routerVO1 = mock(DomainRouterVO.class);
final DomainRouterVO routerVO2 = mock(DomainRouterVO.class);
@ -992,7 +919,7 @@ public class RouterDeploymentDefinitionTest {
throws ConcurrentOperationException, InsufficientCapacityException, ResourceUnavailableException {
// Prepare
this.deployment.isRedundant = true;
this.deployment.publicNetwork = false;
this.deployment.isPublicNetwork = false;
RouterDeploymentDefinition deploymentUT = Mockito.spy(this.deployment);
doNothing().when(deploymentUT).setupPriorityOfRedundantRouter();
doReturn(0).when(deploymentUT).getNumberOfRoutersToDeploy();

View File

@ -0,0 +1,130 @@
// 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 org.cloud.network.router.deployment;
import static org.mockito.Mockito.when;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.junit.runner.RunWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.runners.MockitoJUnitRunner;
import com.cloud.dc.DataCenter;
import com.cloud.dc.HostPodVO;
import com.cloud.dc.Pod;
import com.cloud.dc.dao.HostPodDao;
import com.cloud.deploy.DeployDestination;
import com.cloud.network.IpAddressManager;
import com.cloud.network.NetworkModel;
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.offerings.NetworkOfferingVO;
import com.cloud.offerings.dao.NetworkOfferingDao;
import com.cloud.user.Account;
import com.cloud.user.AccountManager;
import com.cloud.vm.VirtualMachineProfile.Param;
import com.cloud.vm.dao.DomainRouterDao;
import com.cloud.vm.dao.VMInstanceDao;
@RunWith(MockitoJUnitRunner.class)
public class RouterDeploymentDefinitionTestBase {
protected static final String LOCK_NOT_CORRECTLY_GOT = "Lock not correctly got";
protected static final String NUMBER_OF_ROUTERS_TO_DEPLOY_IS_NOT_THE_EXPECTED = "Number of routers to deploy is not the expected";
protected static final String ONLY_THE_PROVIDED_AS_DEFAULT_DESTINATION_WAS_EXPECTED = "Only the provided as default destination was expected";
protected static final long OFFERING_ID = 16L;
protected static final Long DATA_CENTER_ID = 100l;
protected static final Long NW_ID = 102l;
protected static final Long POD_ID1 = 111l;
protected static final Long POD_ID2 = 112l;
protected static final Long POD_ID3 = 113l;
protected static final Long ROUTER1_ID = 121l;
protected static final Long ROUTER2_ID = 122l;
protected static final long PROVIDER_ID = 131L;
protected static final long PHYSICAL_NW_ID = 141L;
// General delegates (Daos, Mgrs...)
@Mock
protected NetworkDao mockNwDao;
@Mock
protected DomainRouterDao mockRouterDao;
@Mock
protected NetworkGeneralHelper mockNetworkGeneralHelper;
@Mock
protected VMInstanceDao mockVmDao;
@Mock
protected HostPodDao mockPodDao;
@Mock
protected VirtualRouterProviderDao mockVrProviderDao;
@Mock
protected PhysicalNetworkServiceProviderDao physicalProviderDao;
@Mock
protected NetworkModel mockNetworkModel;
@Mock
protected IpAddressManager mockIpAddrMgr;
@Mock
protected NetworkOfferingDao mockNetworkOfferingDao;
@Mock
protected AccountManager mockAccountMgr;
// Instance specific parameters to use during build
@Mock
protected DeployDestination mockDestination;
@Mock
protected DataCenter mockDataCenter;
@Mock
protected Pod mockPod;
@Mock
protected HostPodVO mockHostPodVO1;
@Mock
protected HostPodVO mockHostPodVO2;
@Mock
protected HostPodVO mockHostPodVO3;
@Mock
protected NetworkVO mockNw;
@Mock
NetworkOfferingVO mockNwOfferingVO;
@Mock
protected Account mockOwner;
protected List<HostPodVO> mockPods = new ArrayList<>();
protected Map<Param, Object> params = new HashMap<>();
@InjectMocks
protected RouterDeploymentDefinitionBuilder builder = new RouterDeploymentDefinitionBuilder();
protected void initMocks() {
when(this.mockDestination.getDataCenter()).thenReturn(this.mockDataCenter);
when(this.mockDataCenter.getId()).thenReturn(DATA_CENTER_ID);
when(this.mockPod.getId()).thenReturn(POD_ID1);
when(this.mockHostPodVO1.getId()).thenReturn(POD_ID1);
when(this.mockHostPodVO2.getId()).thenReturn(POD_ID2);
when(this.mockHostPodVO3.getId()).thenReturn(POD_ID3);
when(this.mockNw.getId()).thenReturn(NW_ID);
}
}

View File

@ -16,18 +16,86 @@
// under the License.
package org.cloud.network.router.deployment;
import org.junit.Test;
import static junit.framework.Assert.assertEquals;
import static junit.framework.Assert.assertNotNull;
import static junit.framework.Assert.assertNull;
import static junit.framework.Assert.assertTrue;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
public class VpcRouterDeploymentDefinitionTest {
import org.junit.Before;
import org.junit.Test;
import org.mockito.Mock;
import com.cloud.exception.ConcurrentOperationException;
import com.cloud.network.vpc.VpcVO;
import com.cloud.network.vpc.dao.VpcDao;
public class VpcRouterDeploymentDefinitionTest extends RouterDeploymentDefinitionTestBase {
private static final long VPC_ID = 201L;
@Mock
protected VpcDao mockVpcDao;
@Mock
protected VpcVO mockVpc;
protected RouterDeploymentDefinition deployment;
@Override
protected void initMocks() {
super.initMocks();
when(this.mockVpc.getId()).thenReturn(VPC_ID);
}
@Before
public void initTest() {
this.initMocks();
this.deployment = this.builder.create()
.setVpc(this.mockVpc)
.setDeployDestination(this.mockDestination)
.setAccountOwner(this.mockOwner)
.setParams(this.params)
.build();
}
@Test
public void testGenerateDeploymentPlan() {
// TODO Implement this test
public void testConstructionFieldsAndFlags() {
assertTrue("", this.deployment instanceof VpcRouterDeploymentDefinition);
}
@Test
public void testLock() {
// TODO Implement this test
// Prepare
when(this.mockVpcDao.acquireInLockTable(VPC_ID))
.thenReturn(mockVpc);
// Execute
this.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());
}
@Test(expected = ConcurrentOperationException.class)
public void testLockFails() {
// Prepare
when(this.mockVpcDao.acquireInLockTable(VPC_ID))
.thenReturn(null);
// Execute
try {
this.deployment.lock();
} finally {
// Assert
verify(this.mockVpcDao, times(1)).acquireInLockTable(VPC_ID);
assertNull(this.deployment.tableLockId);
}
}
@Test
@ -35,6 +103,11 @@ public class VpcRouterDeploymentDefinitionTest {
// TODO Implement this test
}
@Test
public void testGenerateDeploymentPlan() {
// TODO Implement this test
}
@Test
public void testCheckPreconditions() {
// TODO Implement this test