Merge branch 'vpc-refactor-clean-for-PR' of https://github.com/schubergphilis/cloudstack

This commit is contained in:
Daan Hoogland 2014-10-14 20:14:50 +02:00
commit 771d052381
55 changed files with 9022 additions and 3898 deletions

View File

@ -16,8 +16,6 @@
// under the License.
package com.cloud.network.element;
import com.cloud.host.dao.HostDao;
import com.cloud.vm.dao.UserVmDao;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
@ -28,13 +26,15 @@ import javax.ejb.Local;
import javax.inject.Inject;
import javax.naming.ConfigurationException;
import org.apache.cloudstack.network.topology.NetworkTopology;
import org.apache.cloudstack.network.topology.NetworkTopologyContext;
import org.apache.log4j.Logger;
import com.google.gson.Gson;
import com.cloud.agent.api.StartupCommand;
import com.cloud.agent.api.StartupOvsCommand;
import com.cloud.agent.api.to.LoadBalancerTO;
import com.cloud.dc.DataCenterVO;
import com.cloud.dc.dao.DataCenterDao;
import com.cloud.deploy.DeployDestination;
import com.cloud.exception.ConcurrentOperationException;
import com.cloud.exception.InsufficientCapacityException;
@ -42,10 +42,12 @@ import com.cloud.exception.InvalidParameterValueException;
import com.cloud.exception.ResourceUnavailableException;
import com.cloud.host.Host;
import com.cloud.host.HostVO;
import com.cloud.host.dao.HostDao;
import com.cloud.network.Network;
import com.cloud.network.Network.Capability;
import com.cloud.network.Network.Provider;
import com.cloud.network.Network.Service;
import com.cloud.network.NetworkMigrationResponder;
import com.cloud.network.NetworkModel;
import com.cloud.network.Networks;
import com.cloud.network.Networks.BroadcastDomainType;
@ -54,10 +56,8 @@ import com.cloud.network.PublicIpAddress;
import com.cloud.network.dao.NetworkServiceMapDao;
import com.cloud.network.lb.LoadBalancingRule;
import com.cloud.network.lb.LoadBalancingRule.LbStickinessPolicy;
import com.cloud.network.NetworkMigrationResponder;
import com.cloud.network.ovs.OvsTunnelManager;
import com.cloud.network.router.VirtualRouter.Role;
import com.cloud.network.router.VpcVirtualNetworkApplianceManager;
import com.cloud.network.rules.LbStickinessMethod;
import com.cloud.network.rules.LbStickinessMethod.StickinessMethodType;
import com.cloud.network.rules.LoadBalancerContainer;
@ -74,9 +74,11 @@ import com.cloud.utils.exception.CloudRuntimeException;
import com.cloud.vm.DomainRouterVO;
import com.cloud.vm.NicProfile;
import com.cloud.vm.ReservationContext;
import com.cloud.vm.VirtualMachine;
import com.cloud.vm.VirtualMachineProfile;
import com.cloud.vm.dao.DomainRouterDao;
import com.cloud.vm.VirtualMachine;
import com.cloud.vm.dao.UserVmDao;
import com.google.gson.Gson;
@Local(value = {NetworkElement.class, ConnectivityProvider.class,
SourceNatServiceProvider.class, StaticNatServiceProvider.class,
@ -96,11 +98,14 @@ StaticNatServiceProvider, IpDeployer {
@Inject
DomainRouterDao _routerDao;
@Inject
VpcVirtualNetworkApplianceManager _routerMgr;
@Inject
UserVmDao _userVmDao;
@Inject
HostDao _hostDao;
@Inject
DataCenterDao _dcDao;
@Inject
NetworkTopologyContext _networkTopologyContext;
private static final Logger s_logger = Logger.getLogger(OvsElement.class);
private static final Map<Service, Map<Capability, String>> capabilities = setCapabilities();
@ -115,7 +120,7 @@ StaticNatServiceProvider, IpDeployer {
return Provider.Ovs;
}
protected boolean canHandle(Network network, Service service) {
protected boolean canHandle(final Network network, final Service service) {
s_logger.debug("Checking if OvsElement can handle service "
+ service.getName() + " on network " + network.getDisplayText());
if (network.getBroadcastDomainType() != BroadcastDomainType.Vswitch) {
@ -139,7 +144,7 @@ StaticNatServiceProvider, IpDeployer {
}
@Override
public boolean configure(String name, Map<String, Object> params)
public boolean configure(final String name, final Map<String, Object> params)
throws ConfigurationException {
super.configure(name, params);
_resourceMgr.registerResourceStateAdapter(name, this);
@ -147,8 +152,8 @@ StaticNatServiceProvider, IpDeployer {
}
@Override
public boolean implement(Network network, NetworkOffering offering,
DeployDestination dest, ReservationContext context)
public boolean implement(final Network network, final NetworkOffering offering,
final DeployDestination dest, final ReservationContext context)
throws ConcurrentOperationException, ResourceUnavailableException,
InsufficientCapacityException {
s_logger.debug("entering OvsElement implement function for network "
@ -162,9 +167,9 @@ StaticNatServiceProvider, IpDeployer {
}
@Override
public boolean prepare(Network network, NicProfile nic,
VirtualMachineProfile vm,
DeployDestination dest, ReservationContext context)
public boolean prepare(final Network network, final NicProfile nic,
final VirtualMachineProfile vm,
final DeployDestination dest, final ReservationContext context)
throws ConcurrentOperationException, ResourceUnavailableException,
InsufficientCapacityException {
if (!canHandle(network, Service.Connectivity)) {
@ -190,9 +195,9 @@ StaticNatServiceProvider, IpDeployer {
}
@Override
public boolean release(Network network, NicProfile nic,
VirtualMachineProfile vm,
ReservationContext context) throws ConcurrentOperationException,
public boolean release(final Network network, final NicProfile nic,
final VirtualMachineProfile vm,
final ReservationContext context) throws ConcurrentOperationException,
ResourceUnavailableException {
if (!canHandle(network, Service.Connectivity)) {
return false;
@ -211,8 +216,8 @@ StaticNatServiceProvider, IpDeployer {
}
@Override
public boolean shutdown(Network network, ReservationContext context,
boolean cleanup) throws ConcurrentOperationException,
public boolean shutdown(final Network network, final ReservationContext context,
final boolean cleanup) throws ConcurrentOperationException,
ResourceUnavailableException {
if (!canHandle(network, Service.Connectivity)) {
return false;
@ -221,7 +226,7 @@ StaticNatServiceProvider, IpDeployer {
}
@Override
public boolean destroy(Network network, ReservationContext context)
public boolean destroy(final Network network, final ReservationContext context)
throws ConcurrentOperationException, ResourceUnavailableException {
if (!canHandle(network, Service.Connectivity)) {
return false;
@ -230,13 +235,13 @@ StaticNatServiceProvider, IpDeployer {
}
@Override
public boolean isReady(PhysicalNetworkServiceProvider provider) {
public boolean isReady(final PhysicalNetworkServiceProvider provider) {
return true;
}
@Override
public boolean shutdownProviderInstances(
PhysicalNetworkServiceProvider provider, ReservationContext context)
final PhysicalNetworkServiceProvider provider, final ReservationContext context)
throws ConcurrentOperationException, ResourceUnavailableException {
return true;
}
@ -247,7 +252,7 @@ StaticNatServiceProvider, IpDeployer {
}
@Override
public boolean verifyServicesCombination(Set<Service> services) {
public boolean verifyServicesCombination(final Set<Service> services) {
if (!services.contains(Service.Connectivity)) {
s_logger.warn("Unable to provide services without Connectivity service enabled for this element");
return false;
@ -392,15 +397,15 @@ StaticNatServiceProvider, IpDeployer {
}
@Override
public HostVO createHostVOForConnectedAgent(HostVO host,
StartupCommand[] cmd) {
public HostVO createHostVOForConnectedAgent(final HostVO host,
final StartupCommand[] cmd) {
return null;
}
@Override
public HostVO createHostVOForDirectConnectAgent(HostVO host,
StartupCommand[] startup, ServerResource resource,
Map<String, String> details, List<String> hostTags) {
public HostVO createHostVOForDirectConnectAgent(final HostVO host,
final StartupCommand[] startup, final ServerResource resource,
final Map<String, String> details, final List<String> hostTags) {
if (!(startup[0] instanceof StartupOvsCommand)) {
return null;
}
@ -409,8 +414,8 @@ StaticNatServiceProvider, IpDeployer {
}
@Override
public DeleteHostAnswer deleteHost(HostVO host, boolean isForced,
boolean isForceDeleteStorage) throws UnableDeleteHostException {
public DeleteHostAnswer deleteHost(final HostVO host, final boolean isForced,
final boolean isForceDeleteStorage) throws UnableDeleteHostException {
if (!(host.getType() == Host.Type.L2Networking)) {
return null;
}
@ -418,13 +423,13 @@ StaticNatServiceProvider, IpDeployer {
}
@Override
public IpDeployer getIpDeployer(Network network) {
public IpDeployer getIpDeployer(final Network network) {
return this;
}
@Override
public boolean applyIps(Network network,
List<? extends PublicIpAddress> ipAddress, Set<Service> services)
public boolean applyIps(final Network network,
final List<? extends PublicIpAddress> ipAddress, final Set<Service> services)
throws ResourceUnavailableException {
boolean canHandle = true;
for (Service service : services) {
@ -444,14 +449,17 @@ StaticNatServiceProvider, IpDeployer {
return true;
}
return _routerMgr.associatePublicIP(network, ipAddress, routers);
DataCenterVO dcVO = _dcDao.findById(network.getDataCenterId());
NetworkTopology networkTopology = _networkTopologyContext.retrieveNetworkTopology(dcVO);
return networkTopology.associatePublicIP(network, ipAddress, routers);
} else {
return false;
}
}
@Override
public boolean applyStaticNats(Network network, List<? extends StaticNat> rules)
public boolean applyStaticNats(final Network network, final List<? extends StaticNat> rules)
throws ResourceUnavailableException {
if (!canHandle(network, Service.StaticNat)) {
return false;
@ -464,11 +472,14 @@ StaticNatServiceProvider, IpDeployer {
return true;
}
return _routerMgr.applyStaticNats(network, rules, routers);
DataCenterVO dcVO = _dcDao.findById(network.getDataCenterId());
NetworkTopology networkTopology = _networkTopologyContext.retrieveNetworkTopology(dcVO);
return networkTopology.applyStaticNats(network, rules, routers);
}
@Override
public boolean applyPFRules(Network network, List<PortForwardingRule> rules)
public boolean applyPFRules(final Network network, final List<PortForwardingRule> rules)
throws ResourceUnavailableException {
if (!canHandle(network, Service.PortForwarding)) {
return false;
@ -481,11 +492,14 @@ StaticNatServiceProvider, IpDeployer {
return true;
}
return _routerMgr.applyFirewallRules(network, rules, routers);
DataCenterVO dcVO = _dcDao.findById(network.getDataCenterId());
NetworkTopology networkTopology = _networkTopologyContext.retrieveNetworkTopology(dcVO);
return networkTopology.applyFirewallRules(network, rules, routers);
}
@Override
public boolean applyLBRules(Network network, List<LoadBalancingRule> rules)
public boolean applyLBRules(final Network network, final List<LoadBalancingRule> rules)
throws ResourceUnavailableException {
if (canHandle(network, Service.Lb)) {
if (!canHandleLbRules(rules)) {
@ -501,7 +515,10 @@ StaticNatServiceProvider, IpDeployer {
return true;
}
if (!_routerMgr.applyLoadBalancingRules(network, rules, routers)) {
DataCenterVO dcVO = _dcDao.findById(network.getDataCenterId());
NetworkTopology networkTopology = _networkTopologyContext.retrieveNetworkTopology(dcVO);
if (!networkTopology.applyLoadBalancingRules(network, rules, routers)) {
throw new CloudRuntimeException(
"Failed to apply load balancing rules in network "
+ network.getId());
@ -514,7 +531,7 @@ StaticNatServiceProvider, IpDeployer {
}
@Override
public boolean validateLBRule(Network network, LoadBalancingRule rule) {
public boolean validateLBRule(final Network network, final LoadBalancingRule rule) {
List<LoadBalancingRule> rules = new ArrayList<LoadBalancingRule>();
rules.add(rule);
if (canHandle(network, Service.Lb) && canHandleLbRules(rules)) {
@ -529,13 +546,13 @@ StaticNatServiceProvider, IpDeployer {
}
@Override
public List<LoadBalancerTO> updateHealthChecks(Network network,
List<LoadBalancingRule> lbrules) {
public List<LoadBalancerTO> updateHealthChecks(final Network network,
final List<LoadBalancingRule> lbrules) {
// TODO Auto-generated method stub
return null;
}
private boolean canHandleLbRules(List<LoadBalancingRule> rules) {
private boolean canHandleLbRules(final List<LoadBalancingRule> rules) {
Map<Capability, String> lbCaps = getCapabilities().get(Service.Lb);
if (!lbCaps.isEmpty()) {
String schemeCaps = lbCaps.get(Capability.LbSchemes);
@ -553,7 +570,7 @@ StaticNatServiceProvider, IpDeployer {
return true;
}
public static boolean validateHAProxyLBRule(LoadBalancingRule rule) {
public static boolean validateHAProxyLBRule(final LoadBalancingRule rule) {
String timeEndChar = "dhms";
for (LbStickinessPolicy stickinessPolicy : rule.getStickinessPolicies()) {
@ -572,10 +589,12 @@ StaticNatServiceProvider, IpDeployer {
for (Pair<String, String> paramKV : paramsList) {
String key = paramKV.first();
String value = paramKV.second();
if ("tablesize".equalsIgnoreCase(key))
if ("tablesize".equalsIgnoreCase(key)) {
tablesize = value;
if ("expire".equalsIgnoreCase(key))
}
if ("expire".equalsIgnoreCase(key)) {
expire = value;
}
}
if ((expire != null)
&& !containsOnlyNumbers(expire, timeEndChar)) {
@ -601,10 +620,12 @@ StaticNatServiceProvider, IpDeployer {
for (Pair<String, String> paramKV : paramsList) {
String key = paramKV.first();
String value = paramKV.second();
if ("length".equalsIgnoreCase(key))
if ("length".equalsIgnoreCase(key)) {
length = value;
if ("holdtime".equalsIgnoreCase(key))
}
if ("holdtime".equalsIgnoreCase(key)) {
holdTime = value;
}
}
if ((length != null) && (!containsOnlyNumbers(length, null))) {
@ -631,15 +652,18 @@ StaticNatServiceProvider, IpDeployer {
* like 12 2) time or tablesize like 12h, 34m, 45k, 54m , here last
* character is non-digit but from known characters .
*/
private static boolean containsOnlyNumbers(String str, String endChar) {
if (str == null)
private static boolean containsOnlyNumbers(final String str, final String endChar) {
if (str == null) {
return false;
}
String number = str;
if (endChar != null) {
boolean matchedEndChar = false;
if (str.length() < 2)
{
return false; // atleast one numeric and one char. example:
}
// 3h
char strEnd = str.toCharArray()[str.length() - 1];
for (char c : endChar.toCharArray()) {
@ -649,8 +673,9 @@ StaticNatServiceProvider, IpDeployer {
break;
}
}
if (!matchedEndChar)
if (!matchedEndChar) {
return false;
}
}
try {
Integer.parseInt(number);
@ -661,7 +686,7 @@ StaticNatServiceProvider, IpDeployer {
}
@Override
public boolean prepareMigration(NicProfile nic, Network network, VirtualMachineProfile vm, DeployDestination dest, ReservationContext context) {
public boolean prepareMigration(final NicProfile nic, final Network network, final VirtualMachineProfile vm, final DeployDestination dest, final ReservationContext context) {
if (!canHandle(network, Service.Connectivity)) {
return false;
}
@ -685,12 +710,12 @@ StaticNatServiceProvider, IpDeployer {
}
@Override
public void rollbackMigration(NicProfile nic, Network network, VirtualMachineProfile vm, ReservationContext src, ReservationContext dst) {
public void rollbackMigration(final NicProfile nic, final Network network, final VirtualMachineProfile vm, final ReservationContext src, final ReservationContext dst) {
return;
}
@Override
public void commitMigration(NicProfile nic, Network network, VirtualMachineProfile vm, ReservationContext src, ReservationContext dst) {
public void commitMigration(final NicProfile nic, final Network network, final VirtualMachineProfile vm, final ReservationContext src, final ReservationContext dst) {
return;
}
}

View File

@ -175,14 +175,45 @@
<bean id="uploadMonitorImpl" class="com.cloud.storage.upload.UploadMonitorImpl" />
<bean id="usageServiceImpl" class="com.cloud.usage.UsageServiceImpl" />
<bean id="virtualNetworkApplianceManagerImpl"
class="com.cloud.network.router.VirtualNetworkApplianceManagerImpl" />
<bean id="vpcManagerImpl" class="com.cloud.network.vpc.VpcManagerImpl" >
<property name="vpcElements" value="#{vpcProvidersRegistry.registered}"></property>
</bean>
<bean id="vpcVirtualNetworkApplianceManagerImpl"
class="com.cloud.network.router.VpcVirtualNetworkApplianceManagerImpl" />
<bean id="virtualNetworkApplianceFactory"
class="com.cloud.network.rules.VirtualNetworkApplianceFactory" />
<bean id="topologyContext" class="org.apache.cloudstack.network.topology.NetworkTopologyContext" init-method="init" />
<bean id="basicNetworkTopology" class="org.apache.cloudstack.network.topology.BasicNetworkTopology" />
<bean id="advancedNetworkTopology" class="org.apache.cloudstack.network.topology.AdvancedNetworkTopology" />
<bean id="basicNetworkVisitor" class="org.apache.cloudstack.network.topology.BasicNetworkVisitor" />
<bean id="advancedNetworkVisitor" class="org.apache.cloudstack.network.topology.AdvancedNetworkVisitor" />
<bean id="commandSetupHelper"
class="com.cloud.network.router.CommandSetupHelper" />
<bean id="routerControlHelper"
class="com.cloud.network.router.RouterControlHelper" />
<bean id="networkHelper"
class="com.cloud.network.router.NetworkHelperImpl" />
<bean id="vpcNetworkHelper"
class="com.cloud.network.router.VpcNetworkHelperImpl" />
<bean id="nicProfileHelper"
class="com.cloud.network.router.NicProfileHelperImpl" />
<bean id="routerDeploymentDefinitionBuilder"
class="org.cloud.network.router.deployment.RouterDeploymentDefinitionBuilder" />
<bean id="ApiAsyncJobDispatcher" class="com.cloud.api.ApiAsyncJobDispatcher">
<property name="name" value="ApiAsyncJobDispatcher" />

View File

@ -16,10 +16,33 @@
// under the License.
package com.cloud.network.element;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import javax.ejb.Local;
import javax.inject.Inject;
import org.apache.cloudstack.api.command.admin.router.ConfigureOvsElementCmd;
import org.apache.cloudstack.api.command.admin.router.ConfigureVirtualRouterElementCmd;
import org.apache.cloudstack.api.command.admin.router.CreateVirtualRouterElementCmd;
import org.apache.cloudstack.api.command.admin.router.ListOvsElementsCmd;
import org.apache.cloudstack.api.command.admin.router.ListVirtualRouterElementsCmd;
import org.apache.cloudstack.framework.config.dao.ConfigurationDao;
import org.apache.cloudstack.network.topology.NetworkTopology;
import org.apache.cloudstack.network.topology.NetworkTopologyContext;
import org.apache.log4j.Logger;
import org.cloud.network.router.deployment.RouterDeploymentDefinition;
import org.cloud.network.router.deployment.RouterDeploymentDefinitionBuilder;
import com.cloud.agent.api.to.LoadBalancerTO;
import com.cloud.configuration.ConfigurationManager;
import com.cloud.dc.DataCenter;
import com.cloud.dc.DataCenter.NetworkType;
import com.cloud.dc.DataCenterVO;
import com.cloud.dc.dao.DataCenterDao;
import com.cloud.deploy.DeployDestination;
import com.cloud.exception.ConcurrentOperationException;
import com.cloud.exception.InsufficientCapacityException;
@ -85,31 +108,12 @@ import com.cloud.vm.VirtualMachineProfile;
import com.cloud.vm.dao.DomainRouterDao;
import com.cloud.vm.dao.UserVmDao;
import com.google.gson.Gson;
import org.apache.cloudstack.api.command.admin.router.ConfigureOvsElementCmd;
import org.apache.cloudstack.api.command.admin.router.ConfigureVirtualRouterElementCmd;
import org.apache.cloudstack.api.command.admin.router.CreateVirtualRouterElementCmd;
import org.apache.cloudstack.api.command.admin.router.ListOvsElementsCmd;
import org.apache.cloudstack.api.command.admin.router.ListVirtualRouterElementsCmd;
import org.apache.cloudstack.framework.config.dao.ConfigurationDao;
import org.apache.log4j.Logger;
import javax.ejb.Local;
import javax.inject.Inject;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
@Local(value = {NetworkElement.class, FirewallServiceProvider.class,
DhcpServiceProvider.class, UserDataServiceProvider.class,
StaticNatServiceProvider.class, LoadBalancingServiceProvider.class,
PortForwardingServiceProvider.class, IpDeployer.class,
RemoteAccessVPNServiceProvider.class, NetworkMigrationResponder.class})
public class VirtualRouterElement extends AdapterBase implements VirtualRouterElementService, DhcpServiceProvider,
UserDataServiceProvider, SourceNatServiceProvider, StaticNatServiceProvider, FirewallServiceProvider,
LoadBalancingServiceProvider, PortForwardingServiceProvider, RemoteAccessVPNServiceProvider, IpDeployer,
NetworkMigrationResponder, AggregatedCommandExecutor {
@Local(value = { NetworkElement.class, FirewallServiceProvider.class, DhcpServiceProvider.class, UserDataServiceProvider.class, StaticNatServiceProvider.class,
LoadBalancingServiceProvider.class, PortForwardingServiceProvider.class, IpDeployer.class, RemoteAccessVPNServiceProvider.class, NetworkMigrationResponder.class })
public class VirtualRouterElement extends AdapterBase implements VirtualRouterElementService, DhcpServiceProvider, UserDataServiceProvider, SourceNatServiceProvider,
StaticNatServiceProvider, FirewallServiceProvider, LoadBalancingServiceProvider, PortForwardingServiceProvider, RemoteAccessVPNServiceProvider, IpDeployer,
NetworkMigrationResponder, AggregatedCommandExecutor {
private static final Logger s_logger = Logger.getLogger(VirtualRouterElement.class);
public static final AutoScaleCounterType AutoScaleCounterCpu = new AutoScaleCounterType("cpu");
public static final AutoScaleCounterType AutoScaleCounterMemory = new AutoScaleCounterType("memory");
@ -123,6 +127,7 @@ NetworkMigrationResponder, AggregatedCommandExecutor {
LoadBalancingRulesManager _lbMgr;
@Inject
NetworkOfferingDao _networkOfferingDao;
@Inject
VpcVirtualNetworkApplianceManager _routerMgr;
@Inject
@ -150,8 +155,16 @@ NetworkMigrationResponder, AggregatedCommandExecutor {
OvsProviderDao _ovsProviderDao;
@Inject
IPAddressDao _ipAddressDao;
@Inject
DataCenterDao _dcDao;
protected boolean canHandle(Network network, Service service) {
@Inject
NetworkTopologyContext networkTopologyContext;
@Inject
protected RouterDeploymentDefinitionBuilder routerDeploymentDefinitionBuilder;
protected boolean canHandle(final Network network, final Service service) {
Long physicalNetworkId = _networkMdl.getPhysicalNetworkId(network);
if (physicalNetworkId == null) {
return false;
@ -181,8 +194,8 @@ NetworkMigrationResponder, AggregatedCommandExecutor {
}
@Override
public boolean implement(Network network, NetworkOffering offering, DeployDestination dest, ReservationContext context) throws ResourceUnavailableException,
ConcurrentOperationException, InsufficientCapacityException {
public boolean implement(final Network network, final NetworkOffering offering, final DeployDestination dest, final ReservationContext context)
throws ResourceUnavailableException, ConcurrentOperationException, InsufficientCapacityException {
if (offering.isSystemOnly()) {
return false;
@ -191,23 +204,24 @@ NetworkMigrationResponder, AggregatedCommandExecutor {
Map<VirtualMachineProfile.Param, Object> params = new HashMap<VirtualMachineProfile.Param, Object>(1);
params.put(VirtualMachineProfile.Param.ReProgramGuestNetworks, true);
List<DomainRouterVO> routers = _routerMgr.deployVirtualRouterInGuestNetwork(network, dest,
_accountMgr.getAccount(network.getAccountId()), params,
offering.getRedundantRouter());
RouterDeploymentDefinition routerDeploymentDefinition = routerDeploymentDefinitionBuilder.create().setGuestNetwork(network).setDeployDestination(dest)
.setAccountOwner(_accountMgr.getAccount(network.getAccountId())).setParams(params).setRedundant(offering.getRedundantRouter()).build();
List<DomainRouterVO> routers = routerDeploymentDefinition.deployVirtualRouter();
int routerCounts = 1;
if (offering.getRedundantRouter()) {
routerCounts = 2;
}
if ((routers == null) || (routers.size() < routerCounts)) {
throw new ResourceUnavailableException("Can't find all necessary running routers!",
DataCenter.class, network.getDataCenterId());
if (routers == null || routers.size() < routerCounts) {
throw new ResourceUnavailableException("Can't find all necessary running routers!", DataCenter.class, network.getDataCenterId());
}
return true;
}
@Override
public boolean prepare(Network network, NicProfile nic, VirtualMachineProfile vm, DeployDestination dest, ReservationContext context)
public boolean prepare(final Network network, final NicProfile nic, final VirtualMachineProfile vm, final DeployDestination dest, final ReservationContext context)
throws ConcurrentOperationException, InsufficientCapacityException, ResourceUnavailableException {
if (vm.getType() != VirtualMachine.Type.User || vm.getHypervisorType() == HypervisorType.BareMetal) {
return false;
@ -225,36 +239,39 @@ NetworkMigrationResponder, AggregatedCommandExecutor {
return false;
}
@SuppressWarnings("unchecked")
VirtualMachineProfile uservm = vm;
List<DomainRouterVO> routers =
_routerMgr.deployVirtualRouterInGuestNetwork(network, dest, _accountMgr.getAccount(network.getAccountId()), uservm.getParameters(),
offering.getRedundantRouter());
if ((routers == null) || (routers.size() == 0)) {
RouterDeploymentDefinition routerDeploymentDefinition = routerDeploymentDefinitionBuilder.create().setGuestNetwork(network).setDeployDestination(dest)
.setAccountOwner(_accountMgr.getAccount(network.getAccountId())).setParams(vm.getParameters()).setRedundant(offering.getRedundantRouter()).build();
List<DomainRouterVO> routers = routerDeploymentDefinition.deployVirtualRouter();
if (routers == null || routers.size() == 0) {
throw new ResourceUnavailableException("Can't find at least one running router!", DataCenter.class, network.getDataCenterId());
}
return true;
}
@Override
public boolean applyFWRules(Network config, List<? extends FirewallRule> rules) throws ResourceUnavailableException {
if (canHandle(config, Service.Firewall)) {
List<DomainRouterVO> routers = _routerDao.listByNetworkAndRole(config.getId(), Role.VIRTUAL_ROUTER);
public boolean applyFWRules(final Network network, final List<? extends FirewallRule> rules) throws ResourceUnavailableException {
if (canHandle(network, Service.Firewall)) {
List<DomainRouterVO> routers = _routerDao.listByNetworkAndRole(network.getId(), Role.VIRTUAL_ROUTER);
if (routers == null || routers.isEmpty()) {
s_logger.debug("Virtual router elemnt doesn't need to apply firewall rules on the backend; virtual " + "router doesn't exist in the network " +
config.getId());
s_logger.debug("Virtual router elemnt doesn't need to apply firewall rules on the backend; virtual " + "router doesn't exist in the network " + network.getId());
return true;
}
if (rules != null && rules.size() == 1) {
// for VR no need to add default egress rule to DENY traffic
if (rules.get(0).getTrafficType() == FirewallRule.TrafficType.Egress && rules.get(0).getType() == FirewallRule.FirewallRuleType.System &&
!_networkMdl.getNetworkEgressDefaultPolicy(config.getId()))
if (rules.get(0).getTrafficType() == FirewallRule.TrafficType.Egress && rules.get(0).getType() == FirewallRule.FirewallRuleType.System
&& !_networkMdl.getNetworkEgressDefaultPolicy(network.getId())) {
return true;
}
}
if (!_routerMgr.applyFirewallRules(config, rules, routers)) {
throw new CloudRuntimeException("Failed to apply firewall rules in network " + config.getId());
DataCenterVO dcVO = _dcDao.findById(network.getDataCenterId());
NetworkTopology networkTopology = networkTopologyContext.retrieveNetworkTopology(dcVO);
if (!networkTopology.applyFirewallRules(network, rules, routers)) {
throw new CloudRuntimeException("Failed to apply firewall rules in network " + network.getId());
} else {
return true;
}
@ -264,19 +281,21 @@ NetworkMigrationResponder, AggregatedCommandExecutor {
}
/*
* This function detects numbers like 12 ,32h ,42m .. etc,. 1) plain
* number like 12 2) time or tablesize like 12h, 34m, 45k, 54m , here
* last character is non-digit but from known characters .
* This function detects numbers like 12 ,32h ,42m .. etc,. 1) plain number
* like 12 2) time or tablesize like 12h, 34m, 45k, 54m , here last
* character is non-digit but from known characters .
*/
private static boolean containsOnlyNumbers(String str, String endChar) {
if (str == null)
private static boolean containsOnlyNumbers(final String str, final String endChar) {
if (str == null) {
return false;
}
String number = str;
if (endChar != null) {
boolean matchedEndChar = false;
if (str.length() < 2)
return false; // atleast one numeric and one char. example:
if (str.length() < 2) {
return false; // at least one numeric and one char. example:
}
// 3h
char strEnd = str.toCharArray()[str.length() - 1];
for (char c : endChar.toCharArray()) {
@ -286,8 +305,9 @@ NetworkMigrationResponder, AggregatedCommandExecutor {
break;
}
}
if (!matchedEndChar)
if (!matchedEndChar) {
return false;
}
}
try {
Integer.parseInt(number);
@ -297,7 +317,7 @@ NetworkMigrationResponder, AggregatedCommandExecutor {
return true;
}
public static boolean validateHAProxyLBRule(LoadBalancingRule rule) {
public static boolean validateHAProxyLBRule(final LoadBalancingRule rule) {
String timeEndChar = "dhms";
if (rule.getSourcePortStart() == NetUtils.HAPROXY_STATS_PORT) {
@ -318,15 +338,17 @@ NetworkMigrationResponder, AggregatedCommandExecutor {
for (Pair<String, String> paramKV : paramsList) {
String key = paramKV.first();
String value = paramKV.second();
if ("tablesize".equalsIgnoreCase(key))
if ("tablesize".equalsIgnoreCase(key)) {
tablesize = value;
if ("expire".equalsIgnoreCase(key))
}
if ("expire".equalsIgnoreCase(key)) {
expire = value;
}
}
if ((expire != null) && !containsOnlyNumbers(expire, timeEndChar)) {
if (expire != null && !containsOnlyNumbers(expire, timeEndChar)) {
throw new InvalidParameterValueException("Failed LB in validation rule id: " + rule.getId() + " Cause: expire is not in timeformat: " + expire);
}
if ((tablesize != null) && !containsOnlyNumbers(tablesize, "kmg")) {
if (tablesize != null && !containsOnlyNumbers(tablesize, "kmg")) {
throw new InvalidParameterValueException("Failed LB in validation rule id: " + rule.getId() + " Cause: tablesize is not in size format: " + tablesize);
}
@ -337,16 +359,18 @@ NetworkMigrationResponder, AggregatedCommandExecutor {
for (Pair<String, String> paramKV : paramsList) {
String key = paramKV.first();
String value = paramKV.second();
if ("length".equalsIgnoreCase(key))
if ("length".equalsIgnoreCase(key)) {
length = value;
if ("holdtime".equalsIgnoreCase(key))
}
if ("holdtime".equalsIgnoreCase(key)) {
holdTime = value;
}
}
if ((length != null) && (!containsOnlyNumbers(length, null))) {
if (length != null && !containsOnlyNumbers(length, null)) {
throw new InvalidParameterValueException("Failed LB in validation rule id: " + rule.getId() + " Cause: length is not a number: " + length);
}
if ((holdTime != null) && (!containsOnlyNumbers(holdTime, timeEndChar) && !containsOnlyNumbers(holdTime, null))) {
if (holdTime != null && !containsOnlyNumbers(holdTime, timeEndChar) && !containsOnlyNumbers(holdTime, null)) {
throw new InvalidParameterValueException("Failed LB in validation rule id: " + rule.getId() + " Cause: holdtime is not in timeformat: " + holdTime);
}
}
@ -355,7 +379,7 @@ NetworkMigrationResponder, AggregatedCommandExecutor {
}
@Override
public boolean validateLBRule(Network network, LoadBalancingRule rule) {
public boolean validateLBRule(final Network network, final LoadBalancingRule rule) {
List<LoadBalancingRule> rules = new ArrayList<LoadBalancingRule>();
rules.add(rule);
if (canHandle(network, Service.Lb) && canHandleLbRules(rules)) {
@ -369,7 +393,7 @@ NetworkMigrationResponder, AggregatedCommandExecutor {
}
@Override
public boolean applyLBRules(Network network, List<LoadBalancingRule> rules) throws ResourceUnavailableException {
public boolean applyLBRules(final Network network, final List<LoadBalancingRule> rules) throws ResourceUnavailableException {
if (canHandle(network, Service.Lb)) {
if (!canHandleLbRules(rules)) {
return false;
@ -381,7 +405,10 @@ NetworkMigrationResponder, AggregatedCommandExecutor {
return true;
}
if (!_routerMgr.applyLoadBalancingRules(network, rules, routers)) {
DataCenterVO dcVO = _dcDao.findById(network.getDataCenterId());
NetworkTopology networkTopology = networkTopologyContext.retrieveNetworkTopology(dcVO);
if (!networkTopology.applyLoadBalancingRules(network, rules, routers)) {
throw new CloudRuntimeException("Failed to apply load balancing rules in network " + network.getId());
} else {
return true;
@ -392,7 +419,7 @@ NetworkMigrationResponder, AggregatedCommandExecutor {
}
@Override
public String[] applyVpnUsers(RemoteAccessVpn vpn, List<? extends VpnUser> users) throws ResourceUnavailableException {
public String[] applyVpnUsers(final RemoteAccessVpn vpn, final List<? extends VpnUser> users) throws ResourceUnavailableException {
if (vpn.getNetworkId() == null) {
return null;
}
@ -401,11 +428,14 @@ NetworkMigrationResponder, AggregatedCommandExecutor {
if (canHandle(network, Service.Vpn)) {
List<DomainRouterVO> routers = _routerDao.listByNetworkAndRole(network.getId(), Role.VIRTUAL_ROUTER);
if (routers == null || routers.isEmpty()) {
s_logger.debug("Virtual router elemnt doesn't need to apply vpn users on the backend; virtual router" + " doesn't exist in the network " +
network.getId());
s_logger.debug("Virtual router elemnt doesn't need to apply vpn users on the backend; virtual router" + " doesn't exist in the network " + network.getId());
return null;
}
return _routerMgr.applyVpnUsers(network, users, routers);
DataCenterVO dcVO = _dcDao.findById(network.getDataCenterId());
NetworkTopology networkTopology = networkTopologyContext.retrieveNetworkTopology(dcVO);
return networkTopology.applyVpnUsers(network, users, routers);
} else {
s_logger.debug("Element " + getName() + " doesn't handle applyVpnUsers command");
return null;
@ -413,7 +443,7 @@ NetworkMigrationResponder, AggregatedCommandExecutor {
}
@Override
public boolean startVpn(RemoteAccessVpn vpn) throws ResourceUnavailableException {
public boolean startVpn(final RemoteAccessVpn vpn) throws ResourceUnavailableException {
if (vpn.getNetworkId() == null) {
return false;
}
@ -433,7 +463,7 @@ NetworkMigrationResponder, AggregatedCommandExecutor {
}
@Override
public boolean stopVpn(RemoteAccessVpn vpn) throws ResourceUnavailableException {
public boolean stopVpn(final RemoteAccessVpn vpn) throws ResourceUnavailableException {
if (vpn.getNetworkId() == null) {
return false;
}
@ -453,7 +483,7 @@ NetworkMigrationResponder, AggregatedCommandExecutor {
}
@Override
public boolean applyIps(Network network, List<? extends PublicIpAddress> ipAddress, Set<Service> services) throws ResourceUnavailableException {
public boolean applyIps(final Network network, final List<? extends PublicIpAddress> ipAddress, final Set<Service> services) throws ResourceUnavailableException {
boolean canHandle = true;
for (Service service : services) {
if (!canHandle(network, service)) {
@ -464,12 +494,14 @@ NetworkMigrationResponder, AggregatedCommandExecutor {
if (canHandle) {
List<DomainRouterVO> routers = _routerDao.listByNetworkAndRole(network.getId(), Role.VIRTUAL_ROUTER);
if (routers == null || routers.isEmpty()) {
s_logger.debug("Virtual router elemnt doesn't need to associate ip addresses on the backend; virtual " + "router doesn't exist in the network " +
network.getId());
s_logger.debug("Virtual router elemnt doesn't need to associate ip addresses on the backend; virtual " + "router doesn't exist in the network " + network.getId());
return true;
}
return _routerMgr.associatePublicIP(network, ipAddress, routers);
DataCenterVO dcVO = _dcDao.findById(network.getDataCenterId());
NetworkTopology networkTopology = networkTopologyContext.retrieveNetworkTopology(dcVO);
return networkTopology.associatePublicIP(network, ipAddress, routers);
} else {
return false;
}
@ -516,10 +548,8 @@ NetworkMigrationResponder, AggregatedCommandExecutor {
+ "For the record, sending 10 domains to MSIE 6 or Firefox 2 works as expected.", false);
methodList.add(method);
method =
new LbStickinessMethod(StickinessMethodType.AppCookieBased,
"This is App session based sticky method. Define session stickiness on an existing application cookie. "
+ "It can be used only for a specific http traffic");
method = new LbStickinessMethod(StickinessMethodType.AppCookieBased,
"This is App session based sticky method. Define session stickiness on an existing application cookie. " + "It can be used only for a specific http traffic");
method.addParam("cookie-name", false, "This is the name of the cookie used by the application and which LB will "
+ "have to learn for each new session. Default value: Auto geneared based on ip", false);
method.addParam("length", false, "This is the max number of characters that will be memorized and checked in " + "each cookie value. Default value:52", false);
@ -536,7 +566,7 @@ NetworkMigrationResponder, AggregatedCommandExecutor {
false,
"When this option is specified, haproxy will match on the cookie prefix (or URL parameter prefix). "
+ "The appsession value is the data following this prefix. Example : appsession ASPSESSIONID len 64 timeout 3h prefix This will match the cookie ASPSESSIONIDXXXX=XXXXX, the appsession value will be XXXX=XXXXX.",
true);
true);
method.addParam("mode", false, "This option allows to change the URL parser mode. 2 modes are currently supported : - path-parameters "
+ ": The parser looks for the appsession in the path parameters part (each parameter is separated by a semi-colon), "
+ "which is convenient for JSESSIONID for example.This is the default mode if the option is not set. - query-string :"
@ -565,7 +595,8 @@ NetworkMigrationResponder, AggregatedCommandExecutor {
lbCapabilities.put(Capability.SupportedStickinessMethods, getHAProxyStickinessCapability());
lbCapabilities.put(Capability.LbSchemes, LoadBalancerContainer.Scheme.Public.toString());
//specifies that LB rules can support autoscaling and the list of counters it supports
// specifies that LB rules can support autoscaling and the list of
// counters it supports
AutoScaleCounter counter;
List<AutoScaleCounter> counterList = new ArrayList<AutoScaleCounter>();
counter = new AutoScaleCounter(AutoScaleCounterCpu);
@ -616,23 +647,25 @@ NetworkMigrationResponder, AggregatedCommandExecutor {
}
@Override
public boolean applyStaticNats(Network config, List<? extends StaticNat> rules) throws ResourceUnavailableException {
if (canHandle(config, Service.StaticNat)) {
List<DomainRouterVO> routers = _routerDao.listByNetworkAndRole(config.getId(), Role.VIRTUAL_ROUTER);
public boolean applyStaticNats(final Network network, final List<? extends StaticNat> rules) throws ResourceUnavailableException {
if (canHandle(network, Service.StaticNat)) {
List<DomainRouterVO> routers = _routerDao.listByNetworkAndRole(network.getId(), Role.VIRTUAL_ROUTER);
if (routers == null || routers.isEmpty()) {
s_logger.debug("Virtual router elemnt doesn't need to apply static nat on the backend; virtual " + "router doesn't exist in the network " +
config.getId());
s_logger.debug("Virtual router elemnt doesn't need to apply static nat on the backend; virtual " + "router doesn't exist in the network " + network.getId());
return true;
}
return _routerMgr.applyStaticNats(config, rules, routers);
DataCenterVO dcVO = _dcDao.findById(network.getDataCenterId());
NetworkTopology networkTopology = networkTopologyContext.retrieveNetworkTopology(dcVO);
return networkTopology.applyStaticNats(network, rules, routers);
} else {
return true;
}
}
@Override
public boolean shutdown(Network network, ReservationContext context, boolean cleanup) throws ConcurrentOperationException, ResourceUnavailableException {
public boolean shutdown(final Network network, final ReservationContext context, final boolean cleanup) throws ConcurrentOperationException, ResourceUnavailableException {
List<DomainRouterVO> routers = _routerDao.listByNetworkAndRole(network.getId(), Role.VIRTUAL_ROUTER);
if (routers == null || routers.isEmpty()) {
return true;
@ -644,7 +677,7 @@ NetworkMigrationResponder, AggregatedCommandExecutor {
if (!result) {
s_logger.warn("Failed to stop virtual router element " + router + ", but would try to process clean up anyway.");
}
result = (_routerMgr.destroyRouter(router.getId(), context.getAccount(), context.getCaller().getId()) != null);
result = _routerMgr.destroyRouter(router.getId(), context.getAccount(), context.getCaller().getId()) != null;
if (!result) {
s_logger.warn("Failed to clean up virtual router element " + router);
}
@ -654,23 +687,25 @@ NetworkMigrationResponder, AggregatedCommandExecutor {
}
@Override
public boolean destroy(Network config, ReservationContext context) throws ConcurrentOperationException, ResourceUnavailableException {
public boolean destroy(final Network config, final ReservationContext context) throws ConcurrentOperationException, ResourceUnavailableException {
List<DomainRouterVO> routers = _routerDao.listByNetworkAndRole(config.getId(), Role.VIRTUAL_ROUTER);
if (routers == null || routers.isEmpty()) {
return true;
}
boolean result = true;
// NOTE that we need to pass caller account to destroyRouter, otherwise it will fail permission check there. Context passed in from deleteNetwork is the network account,
// NOTE that we need to pass caller account to destroyRouter, otherwise
// it will fail permission check there. Context passed in from
// deleteNetwork is the network account,
// not caller account
Account callerAccount = _accountMgr.getAccount(context.getCaller().getAccountId());
for (DomainRouterVO router : routers) {
result = result && (_routerMgr.destroyRouter(router.getId(), callerAccount, context.getCaller().getId()) != null);
result = result && _routerMgr.destroyRouter(router.getId(), callerAccount, context.getCaller().getId()) != null;
}
return result;
}
@Override
public boolean savePassword(Network network, NicProfile nic, VirtualMachineProfile vm) throws ResourceUnavailableException {
public boolean savePassword(final Network network, final NicProfile nic, final VirtualMachineProfile vm) throws ResourceUnavailableException {
if (!canHandle(network, null)) {
return false;
}
@ -680,13 +715,16 @@ NetworkMigrationResponder, AggregatedCommandExecutor {
return true;
}
@SuppressWarnings("unchecked")
VirtualMachineProfile uservm = vm;
// If any router is running then send save password command otherwise save the password in DB
DataCenterVO dcVO = _dcDao.findById(network.getDataCenterId());
NetworkTopology networkTopology = networkTopologyContext.retrieveNetworkTopology(dcVO);
// If any router is running then send save password command otherwise
// save the password in DB
for (VirtualRouter router : routers) {
if (router.getState() == State.Running) {
return _routerMgr.savePasswordToRouter(network, nic, uservm, routers);
return networkTopology.savePasswordToRouter(network, nic, uservm, routers);
}
}
String password = (String) uservm.getParameter(VirtualMachineProfile.Param.VmPassword);
@ -699,11 +737,12 @@ NetworkMigrationResponder, AggregatedCommandExecutor {
userVmVO.setUpdateParameters(true);
_userVmDao.update(userVmVO.getId(), userVmVO);
return true;
}
@Override
public boolean saveSSHKey(Network network, NicProfile nic, VirtualMachineProfile vm, String sshPublicKey) throws ResourceUnavailableException {
public boolean saveSSHKey(final Network network, final NicProfile nic, final VirtualMachineProfile vm, final String sshPublicKey) throws ResourceUnavailableException {
if (!canHandle(network, null)) {
return false;
}
@ -713,14 +752,16 @@ NetworkMigrationResponder, AggregatedCommandExecutor {
return true;
}
@SuppressWarnings("unchecked")
VirtualMachineProfile uservm = vm;
return _routerMgr.saveSSHPublicKeyToRouter(network, nic, uservm, routers, sshPublicKey);
DataCenterVO dcVO = _dcDao.findById(network.getDataCenterId());
NetworkTopology networkTopology = networkTopologyContext.retrieveNetworkTopology(dcVO);
return networkTopology.saveSSHPublicKeyToRouter(network, nic, uservm, routers, sshPublicKey);
}
@Override
public boolean saveUserData(Network network, NicProfile nic, VirtualMachineProfile vm) throws ResourceUnavailableException {
public boolean saveUserData(final Network network, final NicProfile nic, final VirtualMachineProfile vm) throws ResourceUnavailableException {
if (!canHandle(network, null)) {
return false;
}
@ -730,10 +771,12 @@ NetworkMigrationResponder, AggregatedCommandExecutor {
return true;
}
@SuppressWarnings("unchecked")
VirtualMachineProfile uservm = vm;
return _routerMgr.saveUserDataToRouter(network, nic, uservm, routers);
DataCenterVO dcVO = _dcDao.findById(network.getDataCenterId());
NetworkTopology networkTopology = networkTopologyContext.retrieveNetworkTopology(dcVO);
return networkTopology.saveUserDataToRouter(network, nic, uservm, routers);
}
@Override
@ -746,7 +789,7 @@ NetworkMigrationResponder, AggregatedCommandExecutor {
}
@Override
public VirtualRouterProvider configure(ConfigureVirtualRouterElementCmd cmd) {
public VirtualRouterProvider configure(final ConfigureVirtualRouterElementCmd cmd) {
VirtualRouterProviderVO element = _vrProviderDao.findById(cmd.getId());
if (element == null || !(element.getType() == Type.VirtualRouter || element.getType() == Type.VPCVirtualRouter)) {
s_logger.debug("Can't find Virtual Router element with network service provider id " + cmd.getId());
@ -760,11 +803,10 @@ NetworkMigrationResponder, AggregatedCommandExecutor {
}
@Override
public OvsProvider configure(ConfigureOvsElementCmd cmd) {
public OvsProvider configure(final ConfigureOvsElementCmd cmd) {
OvsProviderVO element = _ovsProviderDao.findById(cmd.getId());
if (element == null) {
s_logger.debug("Can't find Ovs element with network service provider id "
+ cmd.getId());
s_logger.debug("Can't find Ovs element with network service provider id " + cmd.getId());
return null;
}
@ -775,10 +817,9 @@ NetworkMigrationResponder, AggregatedCommandExecutor {
}
@Override
public VirtualRouterProvider addElement(Long nspId, Type providerType) {
public VirtualRouterProvider addElement(final Long nspId, final Type providerType) {
if (!(providerType == Type.VirtualRouter || providerType == Type.VPCVirtualRouter)) {
throw new InvalidParameterValueException("Element " + getName() + " supports only providerTypes: " + Type.VirtualRouter.toString() + " and " +
Type.VPCVirtualRouter);
throw new InvalidParameterValueException("Element " + getName() + " supports only providerTypes: " + Type.VirtualRouter.toString() + " and " + Type.VPCVirtualRouter);
}
VirtualRouterProviderVO element = _vrProviderDao.findByNspIdAndType(nspId, providerType);
if (element != null) {
@ -791,16 +832,18 @@ NetworkMigrationResponder, AggregatedCommandExecutor {
}
@Override
public boolean applyPFRules(Network network, List<PortForwardingRule> rules) throws ResourceUnavailableException {
public boolean applyPFRules(final Network network, final List<PortForwardingRule> rules) throws ResourceUnavailableException {
if (canHandle(network, Service.PortForwarding)) {
List<DomainRouterVO> routers = _routerDao.listByNetworkAndRole(network.getId(), Role.VIRTUAL_ROUTER);
if (routers == null || routers.isEmpty()) {
s_logger.debug("Virtual router elemnt doesn't need to apply firewall rules on the backend; virtual " + "router doesn't exist in the network " +
network.getId());
s_logger.debug("Virtual router elemnt doesn't need to apply firewall rules on the backend; virtual " + "router doesn't exist in the network " + network.getId());
return true;
}
if (!_routerMgr.applyFirewallRules(network, rules, routers)) {
DataCenterVO dcVO = _dcDao.findById(network.getDataCenterId());
NetworkTopology networkTopology = networkTopologyContext.retrieveNetworkTopology(dcVO);
if (!networkTopology.applyFirewallRules(network, rules, routers)) {
throw new CloudRuntimeException("Failed to apply firewall rules in network " + network.getId());
} else {
return true;
@ -811,7 +854,7 @@ NetworkMigrationResponder, AggregatedCommandExecutor {
}
@Override
public boolean isReady(PhysicalNetworkServiceProvider provider) {
public boolean isReady(final PhysicalNetworkServiceProvider provider) {
VirtualRouterProviderVO element = _vrProviderDao.findByNspIdAndType(provider.getId(), getVirtualRouterProvider());
if (element == null) {
return false;
@ -820,8 +863,8 @@ NetworkMigrationResponder, AggregatedCommandExecutor {
}
@Override
public boolean shutdownProviderInstances(PhysicalNetworkServiceProvider provider, ReservationContext context) throws ConcurrentOperationException,
ResourceUnavailableException {
public boolean shutdownProviderInstances(final PhysicalNetworkServiceProvider provider, final ReservationContext context) throws ConcurrentOperationException,
ResourceUnavailableException {
VirtualRouterProviderVO element = _vrProviderDao.findByNspIdAndType(provider.getId(), getVirtualRouterProvider());
if (element == null) {
return true;
@ -831,7 +874,7 @@ NetworkMigrationResponder, AggregatedCommandExecutor {
List<DomainRouterVO> routers = _routerDao.listByElementId(elementId);
boolean result = true;
for (DomainRouterVO router : routers) {
result = result && (_routerMgr.destroyRouter(router.getId(), context.getAccount(), context.getCaller().getId()) != null);
result = result && _routerMgr.destroyRouter(router.getId(), context.getAccount(), context.getCaller().getId()) != null;
}
_vrProviderDao.remove(elementId);
@ -843,13 +886,13 @@ NetworkMigrationResponder, AggregatedCommandExecutor {
return true;
}
public Long getIdByNspId(Long nspId) {
public Long getIdByNspId(final Long nspId) {
VirtualRouterProviderVO vr = _vrProviderDao.findByNspIdAndType(nspId, Type.VirtualRouter);
return vr.getId();
}
@Override
public VirtualRouterProvider getCreatedElement(long id) {
public VirtualRouterProvider getCreatedElement(final long id) {
VirtualRouterProvider provider = _vrProviderDao.findById(id);
if (!(provider.getType() == Type.VirtualRouter || provider.getType() == Type.VPCVirtualRouter)) {
throw new InvalidParameterValueException("Unable to find provider by id");
@ -858,37 +901,40 @@ NetworkMigrationResponder, AggregatedCommandExecutor {
}
@Override
public boolean release(Network network, NicProfile nic, VirtualMachineProfile vm, ReservationContext context) throws ConcurrentOperationException,
ResourceUnavailableException {
public boolean release(final Network network, final NicProfile nic, final VirtualMachineProfile vm, final ReservationContext context) throws ConcurrentOperationException,
ResourceUnavailableException {
return true;
}
@Override
public boolean configDhcpSupportForSubnet(Network network, NicProfile nic, VirtualMachineProfile vm, DeployDestination dest, ReservationContext context)
throws ConcurrentOperationException, InsufficientCapacityException, ResourceUnavailableException {
public boolean configDhcpSupportForSubnet(final Network network, final NicProfile nic, final VirtualMachineProfile vm, final DeployDestination dest,
final ReservationContext context) throws ConcurrentOperationException, InsufficientCapacityException, ResourceUnavailableException {
if (canHandle(network, Service.Dhcp)) {
if (vm.getType() != VirtualMachine.Type.User) {
return false;
}
@SuppressWarnings("unchecked")
VirtualMachineProfile uservm = vm;
List<DomainRouterVO> routers = getRouters(network, dest);
if ((routers == null) || (routers.size() == 0)) {
if (routers == null || routers.size() == 0) {
throw new ResourceUnavailableException("Can't find at least one router!", DataCenter.class, network.getDataCenterId());
}
return _routerMgr.configDhcpForSubnet(network, nic, uservm, dest, routers);
DataCenterVO dcVO = _dcDao.findById(network.getDataCenterId());
NetworkTopology networkTopology = networkTopologyContext.retrieveNetworkTopology(dcVO);
return networkTopology.configDhcpForSubnet(network, nic, uservm, dest, routers);
}
return false;
}
@Override
public boolean removeDhcpSupportForSubnet(Network network) throws ResourceUnavailableException {
public boolean removeDhcpSupportForSubnet(final Network network) throws ResourceUnavailableException {
if (canHandle(network, Service.Dhcp)) {
List<DomainRouterVO> routers = _routerDao.listByNetworkAndRole(network.getId(), Role.VIRTUAL_ROUTER);
if ((routers == null) || (routers.size() == 0)) {
if (routers == null || routers.size() == 0) {
throw new ResourceUnavailableException("Can't find at least one router!", DataCenter.class, network.getDataCenterId());
}
try {
@ -901,30 +947,32 @@ NetworkMigrationResponder, AggregatedCommandExecutor {
}
@Override
public boolean addDhcpEntry(Network network, NicProfile nic, VirtualMachineProfile vm, DeployDestination dest, ReservationContext context)
public boolean addDhcpEntry(final Network network, final NicProfile nic, final VirtualMachineProfile vm, final DeployDestination dest, final ReservationContext context)
throws ConcurrentOperationException, InsufficientCapacityException, ResourceUnavailableException {
if (canHandle(network, Service.Dhcp)) {
if (vm.getType() != VirtualMachine.Type.User) {
return false;
}
@SuppressWarnings("unchecked")
VirtualMachineProfile uservm = vm;
List<DomainRouterVO> routers = getRouters(network, dest);
if ((routers == null) || (routers.size() == 0)) {
if (routers == null || routers.size() == 0) {
throw new ResourceUnavailableException("Can't find at least one router!", DataCenter.class, network.getDataCenterId());
}
return _routerMgr.applyDhcpEntry(network, nic, uservm, dest, routers);
DataCenterVO dcVO = _dcDao.findById(network.getDataCenterId());
NetworkTopology networkTopology = networkTopologyContext.retrieveNetworkTopology(dcVO);
return networkTopology.applyDhcpEntry(network, nic, uservm, dest, routers);
}
return false;
}
@Override
public boolean addPasswordAndUserdata(Network network, NicProfile nic, VirtualMachineProfile vm, DeployDestination dest, ReservationContext context)
throws ConcurrentOperationException, InsufficientCapacityException, ResourceUnavailableException {
public boolean addPasswordAndUserdata(final Network network, final NicProfile nic, final VirtualMachineProfile vm, final DeployDestination dest,
final ReservationContext context) throws ConcurrentOperationException, InsufficientCapacityException, ResourceUnavailableException {
if (canHandle(network, Service.UserData)) {
if (vm.getType() != VirtualMachine.Type.User) {
return false;
@ -935,28 +983,29 @@ NetworkMigrationResponder, AggregatedCommandExecutor {
return true;
}
@SuppressWarnings("unchecked")
VirtualMachineProfile uservm = vm;
List<DomainRouterVO> routers = getRouters(network, dest);
if ((routers == null) || (routers.size() == 0)) {
if (routers == null || routers.size() == 0) {
throw new ResourceUnavailableException("Can't find at least one router!", DataCenter.class, network.getDataCenterId());
}
return _routerMgr.applyUserData(network, nic, uservm, dest, routers);
DataCenterVO dcVO = _dcDao.findById(network.getDataCenterId());
NetworkTopology networkTopology = networkTopologyContext.retrieveNetworkTopology(dcVO);
return networkTopology.applyUserData(network, nic, uservm, dest, routers);
}
return false;
}
protected List<DomainRouterVO> getRouters(Network network, DeployDestination dest) {
protected List<DomainRouterVO> getRouters(final Network network, final DeployDestination dest) {
boolean publicNetwork = false;
if (_networkMdl.isProviderSupportServiceInNetwork(network.getId(), Service.SourceNat, getProvider())) {
publicNetwork = true;
}
boolean isPodBased =
(dest.getDataCenter().getNetworkType() == NetworkType.Basic || _networkMdl.isSecurityGroupSupportedInNetwork(network)) &&
network.getTrafficType() == TrafficType.Guest;
boolean isPodBased = (dest.getDataCenter().getNetworkType() == NetworkType.Basic || _networkMdl.isSecurityGroupSupportedInNetwork(network))
&& network.getTrafficType() == TrafficType.Guest;
List<DomainRouterVO> routers;
@ -967,15 +1016,18 @@ NetworkMigrationResponder, AggregatedCommandExecutor {
Long podId = dest.getPod().getId();
routers = _routerDao.listByNetworkAndPodAndRole(network.getId(), podId, Role.VIRTUAL_ROUTER);
} else {
// With pod == null, it's network restart case, we would add all router to it
// With pod == null, it's network restart case, we would add all
// router to it
// Ignore DnsBasicZoneUpdate() parameter here
routers = _routerDao.listByNetworkAndRole(network.getId(), Role.VIRTUAL_ROUTER);
}
}
// for Basic zone, add all Running routers - we have to send Dhcp/vmData/password info to them when
// for Basic zone, add all Running routers - we have to send
// Dhcp/vmData/password info to them when
// network.dns.basiczone.updates is set to "all"
// With pod == null, it's network restart case, we already add all routers to it
// With pod == null, it's network restart case, we already add all
// routers to it
if (isPodBased && dest.getPod() != null && _routerMgr.getDnsBasicZoneUpdate().equalsIgnoreCase("all")) {
Long podId = dest.getPod().getId();
List<DomainRouterVO> allRunningRoutersOutsideThePod = _routerDao.findByNetworkOutsideThePod(network.getId(), podId, State.Running, Role.VIRTUAL_ROUTER);
@ -985,7 +1037,7 @@ NetworkMigrationResponder, AggregatedCommandExecutor {
}
@Override
public List<? extends VirtualRouterProvider> searchForVirtualRouterElement(ListVirtualRouterElementsCmd cmd) {
public List<? extends VirtualRouterProvider> searchForVirtualRouterElement(final ListVirtualRouterElementsCmd cmd) {
Long id = cmd.getId();
Long nspId = cmd.getNspId();
Boolean enabled = cmd.getEnabled();
@ -1001,14 +1053,14 @@ NetworkMigrationResponder, AggregatedCommandExecutor {
sc.and(sc.entity().isEnabled(), Op.EQ, enabled);
}
//return only VR and VPC VR
// return only VR and VPC VR
sc.and(sc.entity().getType(), Op.IN, VirtualRouterProvider.Type.VPCVirtualRouter, VirtualRouterProvider.Type.VirtualRouter);
return sc.list();
}
@Override
public List<? extends OvsProvider> searchForOvsElement(ListOvsElementsCmd cmd) {
public List<? extends OvsProvider> searchForOvsElement(final ListOvsElementsCmd cmd) {
Long id = cmd.getId();
Long nspId = cmd.getNspId();
Boolean enabled = cmd.getEnabled();
@ -1028,12 +1080,12 @@ NetworkMigrationResponder, AggregatedCommandExecutor {
}
@Override
public boolean verifyServicesCombination(Set<Service> services) {
public boolean verifyServicesCombination(final Set<Service> services) {
return true;
}
@Override
public IpDeployer getIpDeployer(Network network) {
public IpDeployer getIpDeployer(final Network network) {
return this;
}
@ -1042,12 +1094,12 @@ NetworkMigrationResponder, AggregatedCommandExecutor {
}
@Override
public List<LoadBalancerTO> updateHealthChecks(Network network, List<LoadBalancingRule> lbrules) {
public List<LoadBalancerTO> updateHealthChecks(final Network network, final List<LoadBalancingRule> lbrules) {
// TODO Auto-generated method stub
return null;
}
private boolean canHandleLbRules(List<LoadBalancingRule> rules) {
private boolean canHandleLbRules(final List<LoadBalancingRule> rules) {
Map<Capability, String> lbCaps = getCapabilities().get(Service.Lb);
if (!lbCaps.isEmpty()) {
String schemeCaps = lbCaps.get(Capability.LbSchemes);
@ -1064,59 +1116,83 @@ NetworkMigrationResponder, AggregatedCommandExecutor {
}
@Override
public boolean prepareMigration(NicProfile nic, Network network, VirtualMachineProfile vm, DeployDestination dest, ReservationContext context) {
public boolean prepareMigration(final NicProfile nic, final Network network, final VirtualMachineProfile vm, final DeployDestination dest, final ReservationContext context) {
if (nic.getBroadcastType() != Networks.BroadcastDomainType.Pvlan) {
return true;
}
if (vm.getType() == VirtualMachine.Type.DomainRouter) {
assert vm instanceof DomainRouterVO;
DomainRouterVO router = (DomainRouterVO)vm.getVirtualMachine();
_routerMgr.setupDhcpForPvlan(false, router, router.getHostId(), nic);
DomainRouterVO router = (DomainRouterVO) vm.getVirtualMachine();
DataCenterVO dcVO = _dcDao.findById(network.getDataCenterId());
NetworkTopology networkTopology = networkTopologyContext.retrieveNetworkTopology(dcVO);
try {
networkTopology.setupDhcpForPvlan(false, router, router.getHostId(), nic);
} catch (ResourceUnavailableException e) {
s_logger.warn("Timed Out", e);
}
} else if (vm.getType() == VirtualMachine.Type.User) {
assert vm instanceof UserVmVO;
UserVmVO userVm = (UserVmVO)vm.getVirtualMachine();
UserVmVO userVm = (UserVmVO) vm.getVirtualMachine();
_userVmMgr.setupVmForPvlan(false, userVm.getHostId(), nic);
}
return true;
}
@Override
public void rollbackMigration(NicProfile nic, Network network, VirtualMachineProfile vm, ReservationContext src, ReservationContext dst) {
public void rollbackMigration(final NicProfile nic, final Network network, final VirtualMachineProfile vm, final ReservationContext src, final ReservationContext dst) {
if (nic.getBroadcastType() != Networks.BroadcastDomainType.Pvlan) {
return;
}
if (vm.getType() == VirtualMachine.Type.DomainRouter) {
assert vm instanceof DomainRouterVO;
DomainRouterVO router = (DomainRouterVO)vm.getVirtualMachine();
_routerMgr.setupDhcpForPvlan(true, router, router.getHostId(), nic);
DomainRouterVO router = (DomainRouterVO) vm.getVirtualMachine();
DataCenterVO dcVO = _dcDao.findById(network.getDataCenterId());
NetworkTopology networkTopology = networkTopologyContext.retrieveNetworkTopology(dcVO);
try {
networkTopology.setupDhcpForPvlan(true, router, router.getHostId(), nic);
} catch (ResourceUnavailableException e) {
s_logger.warn("Timed Out", e);
}
} else if (vm.getType() == VirtualMachine.Type.User) {
assert vm instanceof UserVmVO;
UserVmVO userVm = (UserVmVO)vm.getVirtualMachine();
UserVmVO userVm = (UserVmVO) vm.getVirtualMachine();
_userVmMgr.setupVmForPvlan(true, userVm.getHostId(), nic);
}
}
@Override
public void commitMigration(NicProfile nic, Network network, VirtualMachineProfile vm, ReservationContext src, ReservationContext dst) {
public void commitMigration(final NicProfile nic, final Network network, final VirtualMachineProfile vm, final ReservationContext src, final ReservationContext dst) {
if (nic.getBroadcastType() != Networks.BroadcastDomainType.Pvlan) {
return;
}
if (vm.getType() == VirtualMachine.Type.DomainRouter) {
assert vm instanceof DomainRouterVO;
DomainRouterVO router = (DomainRouterVO)vm.getVirtualMachine();
_routerMgr.setupDhcpForPvlan(true, router, router.getHostId(), nic);
DomainRouterVO router = (DomainRouterVO) vm.getVirtualMachine();
DataCenterVO dcVO = _dcDao.findById(network.getDataCenterId());
NetworkTopology networkTopology = networkTopologyContext.retrieveNetworkTopology(dcVO);
try {
networkTopology.setupDhcpForPvlan(true, router, router.getHostId(), nic);
} catch (ResourceUnavailableException e) {
s_logger.warn("Timed Out", e);
}
} else if (vm.getType() == VirtualMachine.Type.User) {
assert vm instanceof UserVmVO;
UserVmVO userVm = (UserVmVO)vm.getVirtualMachine();
UserVmVO userVm = (UserVmVO) vm.getVirtualMachine();
_userVmMgr.setupVmForPvlan(true, userVm.getHostId(), nic);
}
}
@Override
public boolean prepareAggregatedExecution(Network network, DeployDestination dest) throws ResourceUnavailableException {
public boolean prepareAggregatedExecution(final Network network, final DeployDestination dest) throws ResourceUnavailableException {
List<DomainRouterVO> routers = getRouters(network, dest);
if ((routers == null) || (routers.size() == 0)) {
if (routers == null || routers.size() == 0) {
throw new ResourceUnavailableException("Can't find at least one router!", DataCenter.class, network.getDataCenterId());
}
@ -1124,10 +1200,10 @@ NetworkMigrationResponder, AggregatedCommandExecutor {
}
@Override
public boolean completeAggregatedExecution(Network network, DeployDestination dest) throws ResourceUnavailableException {
public boolean completeAggregatedExecution(final Network network, final DeployDestination dest) throws ResourceUnavailableException {
List<DomainRouterVO> routers = getRouters(network, dest);
if ((routers == null) || (routers.size() == 0)) {
if (routers == null || routers.size() == 0) {
throw new ResourceUnavailableException("Can't find at least one router!", DataCenter.class, network.getDataCenterId());
}
@ -1135,8 +1211,9 @@ NetworkMigrationResponder, AggregatedCommandExecutor {
}
@Override
public boolean cleanupAggregatedExecution(Network network, DeployDestination dest) throws ResourceUnavailableException {
// The VR code already cleansup in the Finish routine using finally, lets not waste another command
public boolean cleanupAggregatedExecution(final Network network, final DeployDestination dest) throws ResourceUnavailableException {
// The VR code already cleansup in the Finish routine using finally,
// lets not waste another command
return true;
}
}

View File

@ -24,9 +24,13 @@ import java.util.Set;
import javax.ejb.Local;
import javax.inject.Inject;
import org.apache.cloudstack.network.topology.NetworkTopology;
import org.apache.log4j.Logger;
import org.cloud.network.router.deployment.RouterDeploymentDefinition;
import org.cloud.network.router.deployment.RouterDeploymentDefinitionBuilder;
import com.cloud.dc.DataCenter;
import com.cloud.dc.DataCenterVO;
import com.cloud.deploy.DeployDestination;
import com.cloud.exception.ConcurrentOperationException;
import com.cloud.exception.InsufficientCapacityException;
@ -68,9 +72,9 @@ import com.cloud.vm.ReservationContext;
import com.cloud.vm.VirtualMachine;
import com.cloud.vm.VirtualMachineProfile;
@Local(value = {NetworkElement.class, FirewallServiceProvider.class, DhcpServiceProvider.class, UserDataServiceProvider.class, StaticNatServiceProvider.class,
LoadBalancingServiceProvider.class, PortForwardingServiceProvider.class, IpDeployer.class, VpcProvider.class, Site2SiteVpnServiceProvider.class,
NetworkACLServiceProvider.class})
@Local(value = { NetworkElement.class, FirewallServiceProvider.class, DhcpServiceProvider.class, UserDataServiceProvider.class, StaticNatServiceProvider.class,
LoadBalancingServiceProvider.class, PortForwardingServiceProvider.class, IpDeployer.class, VpcProvider.class, Site2SiteVpnServiceProvider.class,
NetworkACLServiceProvider.class })
public class VpcVirtualRouterElement extends VirtualRouterElement implements VpcProvider, Site2SiteVpnServiceProvider, NetworkACLServiceProvider {
private static final Logger s_logger = Logger.getLogger(VpcVirtualRouterElement.class);
@Inject
@ -92,10 +96,13 @@ public class VpcVirtualRouterElement extends VirtualRouterElement implements Vpc
@Inject
EntityManager _entityMgr;
@Inject
private RouterDeploymentDefinitionBuilder routerDeploymentDefinitionBuilder;
private static final Map<Service, Map<Capability, String>> capabilities = setCapabilities();
@Override
protected boolean canHandle(Network network, Service service) {
protected boolean canHandle(final Network network, final Service service) {
Long physicalNetworkId = _networkMdl.getPhysicalNetworkId(network);
if (physicalNetworkId == null) {
return false;
@ -125,33 +132,36 @@ public class VpcVirtualRouterElement extends VirtualRouterElement implements Vpc
}
@Override
public boolean implementVpc(Vpc vpc, DeployDestination dest, ReservationContext context) throws ConcurrentOperationException, ResourceUnavailableException,
InsufficientCapacityException {
public boolean implementVpc(final Vpc vpc, final DeployDestination dest, final ReservationContext context) throws ConcurrentOperationException, ResourceUnavailableException,
InsufficientCapacityException {
Map<VirtualMachineProfile.Param, Object> params = new HashMap<VirtualMachineProfile.Param, Object>(1);
params.put(VirtualMachineProfile.Param.ReProgramGuestNetworks, true);
_vpcRouterMgr.deployVirtualRouterInVpc(vpc, dest, _accountMgr.getAccount(vpc.getAccountId()), params);
RouterDeploymentDefinition routerDeploymentDefinition = routerDeploymentDefinitionBuilder.create().setVpc(vpc).setDeployDestination(dest)
.setAccountOwner(_accountMgr.getAccount(vpc.getAccountId())).setParams(params).build();
routerDeploymentDefinition.deployVirtualRouter();
return true;
}
@Override
public boolean shutdownVpc(Vpc vpc, ReservationContext context) throws ConcurrentOperationException, ResourceUnavailableException {
public boolean shutdownVpc(final Vpc vpc, final ReservationContext context) throws ConcurrentOperationException, ResourceUnavailableException {
List<DomainRouterVO> routers = _routerDao.listByVpcId(vpc.getId());
if (routers == null || routers.isEmpty()) {
return true;
}
boolean result = true;
for (DomainRouterVO router : routers) {
result = result && (_routerMgr.destroyRouter(router.getId(), context.getAccount(), context.getCaller().getId()) != null);
result = result && _routerMgr.destroyRouter(router.getId(), context.getAccount(), context.getCaller().getId()) != null;
}
return result;
}
@Override
public boolean implement(Network network, NetworkOffering offering, DeployDestination dest, ReservationContext context) throws ResourceUnavailableException,
ConcurrentOperationException, InsufficientCapacityException {
public boolean implement(final Network network, final NetworkOffering offering, final DeployDestination dest, final ReservationContext context)
throws ResourceUnavailableException, ConcurrentOperationException, InsufficientCapacityException {
Long vpcId = network.getVpcId();
if (vpcId == null) {
@ -168,8 +178,12 @@ public class VpcVirtualRouterElement extends VirtualRouterElement implements Vpc
Map<VirtualMachineProfile.Param, Object> params = new HashMap<VirtualMachineProfile.Param, Object>(1);
params.put(VirtualMachineProfile.Param.ReProgramGuestNetworks, true);
List<DomainRouterVO> routers = _vpcRouterMgr.deployVirtualRouterInVpc(vpc, dest, _accountMgr.getAccount(vpc.getAccountId()), params);
if ((routers == null) || (routers.size() == 0)) {
RouterDeploymentDefinition routerDeploymentDefinition = routerDeploymentDefinitionBuilder.create().setVpc(vpc).setDeployDestination(dest)
.setAccountOwner(_accountMgr.getAccount(vpc.getAccountId())).setParams(params).build();
List<DomainRouterVO> routers = routerDeploymentDefinition.deployVirtualRouter();
if (routers == null || routers.size() == 0) {
throw new ResourceUnavailableException("Can't find at least one running router!", DataCenter.class, network.getDataCenterId());
}
@ -178,7 +192,7 @@ public class VpcVirtualRouterElement extends VirtualRouterElement implements Vpc
}
DomainRouterVO router = routers.get(0);
//Add router to guest network if needed
// Add router to guest network if needed
if (!_networkMdl.isVmPartOfNetwork(router.getId(), network.getId())) {
Map<VirtualMachineProfile.Param, Object> paramsForRouter = new HashMap<VirtualMachineProfile.Param, Object>(1);
if (network.getState() == State.Setup) {
@ -195,8 +209,8 @@ public class VpcVirtualRouterElement extends VirtualRouterElement implements Vpc
}
@Override
public boolean prepare(Network network, NicProfile nic, VirtualMachineProfile vm, DeployDestination dest, ReservationContext context)
throws ConcurrentOperationException, InsufficientCapacityException, ResourceUnavailableException {
public boolean prepare(final Network network, final NicProfile nic, final VirtualMachineProfile vm, final DeployDestination dest, final ReservationContext context)
throws ConcurrentOperationException, InsufficientCapacityException, ResourceUnavailableException {
Long vpcId = network.getVpcId();
if (vpcId == null) {
@ -213,8 +227,12 @@ public class VpcVirtualRouterElement extends VirtualRouterElement implements Vpc
if (vm.getType() == VirtualMachine.Type.User) {
Map<VirtualMachineProfile.Param, Object> params = new HashMap<VirtualMachineProfile.Param, Object>(1);
params.put(VirtualMachineProfile.Param.ReProgramGuestNetworks, true);
List<DomainRouterVO> routers = _vpcRouterMgr.deployVirtualRouterInVpc(vpc, dest, _accountMgr.getAccount(vpc.getAccountId()), params);
if ((routers == null) || (routers.size() == 0)) {
RouterDeploymentDefinition routerDeploymentDefinition = routerDeploymentDefinitionBuilder.create().setVpc(vpc).setDeployDestination(dest)
.setAccountOwner(_accountMgr.getAccount(vpc.getAccountId())).setParams(params).build();
List<DomainRouterVO> routers = routerDeploymentDefinition.deployVirtualRouter();
if (routers == null || routers.size() == 0) {
throw new ResourceUnavailableException("Can't find at least one running router!", DataCenter.class, network.getDataCenterId());
}
@ -223,7 +241,7 @@ public class VpcVirtualRouterElement extends VirtualRouterElement implements Vpc
}
DomainRouterVO router = routers.get(0);
//Add router to guest network if needed
// Add router to guest network if needed
if (!_networkMdl.isVmPartOfNetwork(router.getId(), network.getId())) {
Map<VirtualMachineProfile.Param, Object> paramsForRouter = new HashMap<VirtualMachineProfile.Param, Object>(1);
// need to reprogram guest network if it comes in a setup state
@ -242,7 +260,7 @@ public class VpcVirtualRouterElement extends VirtualRouterElement implements Vpc
}
@Override
public boolean shutdown(Network network, ReservationContext context, boolean cleanup) throws ConcurrentOperationException, ResourceUnavailableException {
public boolean shutdown(final Network network, final ReservationContext context, final boolean cleanup) throws ConcurrentOperationException, ResourceUnavailableException {
boolean success = true;
Long vpcId = network.getVpcId();
if (vpcId == null) {
@ -252,12 +270,12 @@ public class VpcVirtualRouterElement extends VirtualRouterElement implements Vpc
List<? extends VirtualRouter> routers = _routerDao.listByVpcId(vpcId);
for (VirtualRouter router : routers) {
//1) Check if router is already a part of the network
// 1) Check if router is already a part of the network
if (!_networkMdl.isVmPartOfNetwork(router.getId(), network.getId())) {
s_logger.debug("Router " + router + " is not a part the network " + network);
continue;
}
//2) Call unplugNics in the network service
// 2) Call unplugNics in the network service
success = success && _vpcRouterMgr.removeVpcRouterFromGuestNetwork(router, network, false);
if (!success) {
s_logger.warn("Failed to unplug nic in network " + network + " for virtual router " + router);
@ -270,7 +288,7 @@ public class VpcVirtualRouterElement extends VirtualRouterElement implements Vpc
}
@Override
public boolean destroy(Network config, ReservationContext context) throws ConcurrentOperationException, ResourceUnavailableException {
public boolean destroy(final Network config, final ReservationContext context) throws ConcurrentOperationException, ResourceUnavailableException {
boolean success = true;
Long vpcId = config.getVpcId();
if (vpcId == null) {
@ -280,12 +298,12 @@ public class VpcVirtualRouterElement extends VirtualRouterElement implements Vpc
List<? extends VirtualRouter> routers = _routerDao.listByVpcId(vpcId);
for (VirtualRouter router : routers) {
//1) Check if router is already a part of the network
// 1) Check if router is already a part of the network
if (!_networkMdl.isVmPartOfNetwork(router.getId(), config.getId())) {
s_logger.debug("Router " + router + " is not a part the network " + config);
continue;
}
//2) Call unplugNics in the network service
// 2) Call unplugNics in the network service
success = success && _vpcRouterMgr.removeVpcRouterFromGuestNetwork(router, config, false);
if (!success) {
s_logger.warn("Failed to unplug nic in network " + config + " for virtual router " + router);
@ -316,10 +334,10 @@ public class VpcVirtualRouterElement extends VirtualRouterElement implements Vpc
vpnCapabilities.put(Capability.VpnTypes, "s2svpn");
capabilities.put(Service.Vpn, vpnCapabilities);
//remove firewall capability
// remove firewall capability
capabilities.remove(Service.Firewall);
//add network ACL capability
// add network ACL capability
Map<Capability, String> networkACLCapabilities = new HashMap<Capability, String>();
networkACLCapabilities.put(Capability.SupportedProtocols, "tcp,udp,icmp");
capabilities.put(Service.NetworkACL, networkACLCapabilities);
@ -333,7 +351,7 @@ public class VpcVirtualRouterElement extends VirtualRouterElement implements Vpc
}
@Override
public boolean createPrivateGateway(PrivateGateway gateway) throws ConcurrentOperationException, ResourceUnavailableException {
public boolean createPrivateGateway(final PrivateGateway gateway) throws ConcurrentOperationException, ResourceUnavailableException {
if (gateway.getType() != VpcGateway.Type.Private) {
s_logger.warn("Type of vpc gateway is not " + VpcGateway.Type.Private);
return false;
@ -341,8 +359,7 @@ public class VpcVirtualRouterElement extends VirtualRouterElement implements Vpc
List<DomainRouterVO> routers = _vpcRouterMgr.getVpcRouters(gateway.getVpcId());
if (routers == null || routers.isEmpty()) {
s_logger.debug(getName() + " element doesn't need to create Private gateway on the backend; VPC virtual " + "router doesn't exist in the vpc id=" +
gateway.getVpcId());
s_logger.debug(getName() + " element doesn't need to create Private gateway on the backend; VPC virtual " + "router doesn't exist in the vpc id=" + gateway.getVpcId());
return true;
}
@ -352,7 +369,10 @@ public class VpcVirtualRouterElement extends VirtualRouterElement implements Vpc
VirtualRouter router = routers.get(0);
if (_vpcRouterMgr.setupPrivateGateway(gateway, router)) {
DataCenterVO dcVO = _dcDao.findById(gateway.getZoneId());
NetworkTopology networkTopology = networkTopologyContext.retrieveNetworkTopology(dcVO);
if (networkTopology.setupPrivateGateway(gateway, router)) {
try {
List<NetworkACLItemVO> rules = _networkACLItemDao.listByACL(gateway.getNetworkACLId());
if (!applyACLItemsToPrivateGw(gateway, rules)) {
@ -364,14 +384,14 @@ public class VpcVirtualRouterElement extends VirtualRouterElement implements Vpc
return false;
}
} else {
s_logger.debug ("Failed to setup private gateway "+ gateway);
s_logger.debug("Failed to setup private gateway " + gateway);
return false;
}
return true;
}
@Override
public boolean deletePrivateGateway(PrivateGateway gateway) throws ConcurrentOperationException, ResourceUnavailableException {
public boolean deletePrivateGateway(final PrivateGateway gateway) throws ConcurrentOperationException, ResourceUnavailableException {
if (gateway.getType() != VpcGateway.Type.Private) {
s_logger.warn("Type of vpc gateway is not " + VpcGateway.Type.Private);
return false;
@ -379,8 +399,7 @@ public class VpcVirtualRouterElement extends VirtualRouterElement implements Vpc
List<DomainRouterVO> routers = _vpcRouterMgr.getVpcRouters(gateway.getVpcId());
if (routers == null || routers.isEmpty()) {
s_logger.debug(getName() + " element doesn't need to delete Private gateway on the backend; VPC virtual " + "router doesn't exist in the vpc id=" +
gateway.getVpcId());
s_logger.debug(getName() + " element doesn't need to delete Private gateway on the backend; VPC virtual " + "router doesn't exist in the vpc id=" + gateway.getVpcId());
return true;
}
@ -394,7 +413,7 @@ public class VpcVirtualRouterElement extends VirtualRouterElement implements Vpc
}
@Override
public boolean applyIps(Network network, List<? extends PublicIpAddress> ipAddress, Set<Service> services) throws ResourceUnavailableException {
public boolean applyIps(final Network network, final List<? extends PublicIpAddress> ipAddress, final Set<Service> services) throws ResourceUnavailableException {
boolean canHandle = true;
for (Service service : services) {
if (!canHandle(network, service)) {
@ -405,35 +424,40 @@ public class VpcVirtualRouterElement extends VirtualRouterElement implements Vpc
if (canHandle) {
List<DomainRouterVO> routers = _routerDao.listByNetworkAndRole(network.getId(), Role.VIRTUAL_ROUTER);
if (routers == null || routers.isEmpty()) {
s_logger.debug(getName() + " element doesn't need to associate ip addresses on the backend; VPC virtual " + "router doesn't exist in the network " +
network.getId());
s_logger.debug(getName() + " element doesn't need to associate ip addresses on the backend; VPC virtual " + "router doesn't exist in the network "
+ network.getId());
return true;
}
return _vpcRouterMgr.associatePublicIP(network, ipAddress, routers);
DataCenterVO dcVO = _dcDao.findById(network.getDataCenterId());
NetworkTopology networkTopology = networkTopologyContext.retrieveNetworkTopology(dcVO);
return networkTopology.associatePublicIP(network, ipAddress, routers);
} else {
return false;
}
}
@Override
public boolean applyNetworkACLs(Network config, List<? extends NetworkACLItem> rules) throws ResourceUnavailableException {
if (canHandle(config, Service.NetworkACL)) {
List<DomainRouterVO> routers = _routerDao.listByNetworkAndRole(config.getId(), Role.VIRTUAL_ROUTER);
public boolean applyNetworkACLs(final Network network, final List<? extends NetworkACLItem> rules) throws ResourceUnavailableException {
if (canHandle(network, Service.NetworkACL)) {
List<DomainRouterVO> routers = _routerDao.listByNetworkAndRole(network.getId(), Role.VIRTUAL_ROUTER);
if (routers == null || routers.isEmpty()) {
s_logger.debug("Virtual router elemnt doesn't need to apply firewall rules on the backend; virtual " + "router doesn't exist in the network " +
config.getId());
s_logger.debug("Virtual router elemnt doesn't need to apply firewall rules on the backend; virtual " + "router doesn't exist in the network " + network.getId());
return true;
}
DataCenterVO dcVO = _dcDao.findById(network.getDataCenterId());
NetworkTopology networkTopology = networkTopologyContext.retrieveNetworkTopology(dcVO);
try {
if (!_vpcRouterMgr.applyNetworkACLs(config, rules, routers, false)) {
if (!networkTopology.applyNetworkACLs(network, rules, routers, false)) {
return false;
} else {
return true;
}
} catch (Exception ex) {
s_logger.debug("Failed to apply network acl in network " + config.getId());
s_logger.debug("Failed to apply network acl in network " + network.getId());
return false;
}
} else {
@ -447,14 +471,17 @@ public class VpcVirtualRouterElement extends VirtualRouterElement implements Vpc
}
@Override
public boolean applyStaticRoutes(Vpc vpc, List<StaticRouteProfile> routes) throws ResourceUnavailableException {
public boolean applyStaticRoutes(final Vpc vpc, final List<StaticRouteProfile> routes) throws ResourceUnavailableException {
List<DomainRouterVO> routers = _routerDao.listByVpcId(vpc.getId());
if (routers == null || routers.isEmpty()) {
s_logger.debug("Virtual router elemnt doesn't need to static routes on the backend; virtual " + "router doesn't exist in the vpc " + vpc);
return true;
}
if (!_vpcRouterMgr.applyStaticRoutes(routes, routers)) {
DataCenterVO dcVO = _dcDao.findById(vpc.getZoneId());
NetworkTopology networkTopology = networkTopologyContext.retrieveNetworkTopology(dcVO);
if (!networkTopology.applyStaticRoutes(routes, routers)) {
throw new CloudRuntimeException("Failed to apply static routes in vpc " + vpc);
} else {
s_logger.debug("Applied static routes on vpc " + vpc);
@ -463,26 +490,28 @@ public class VpcVirtualRouterElement extends VirtualRouterElement implements Vpc
}
@Override
public boolean applyACLItemsToPrivateGw(PrivateGateway gateway, List<? extends NetworkACLItem> rules) throws ResourceUnavailableException {
Network config = _networkDao.findById(gateway.getNetworkId());
public boolean applyACLItemsToPrivateGw(final PrivateGateway gateway, final List<? extends NetworkACLItem> rules) throws ResourceUnavailableException {
Network network = _networkDao.findById(gateway.getNetworkId());
boolean isPrivateGateway = true;
List<DomainRouterVO> routers = _vpcRouterMgr.getVpcRouters(gateway.getVpcId());
if (routers == null || routers.isEmpty()) {
s_logger.debug("Virtual router element doesn't need to apply network acl rules on the backend; virtual " + "router doesn't exist in the network " +
config.getId());
s_logger.debug("Virtual router element doesn't need to apply network acl rules on the backend; virtual " + "router doesn't exist in the network " + network.getId());
return true;
}
if (!_vpcRouterMgr.applyNetworkACLs(config, rules, routers, isPrivateGateway)) {
throw new CloudRuntimeException("Failed to apply network acl in network " + config.getId());
DataCenterVO dcVO = _dcDao.findById(network.getDataCenterId());
NetworkTopology networkTopology = networkTopologyContext.retrieveNetworkTopology(dcVO);
if (!networkTopology.applyNetworkACLs(network, rules, routers, isPrivateGateway)) {
throw new CloudRuntimeException("Failed to apply network acl in network " + network.getId());
} else {
return true;
}
}
@Override
public boolean startSite2SiteVpn(Site2SiteVpnConnection conn) throws ResourceUnavailableException {
public boolean startSite2SiteVpn(final Site2SiteVpnConnection conn) throws ResourceUnavailableException {
Site2SiteVpnGateway vpnGw = _vpnGatewayDao.findById(conn.getVpnGatewayId());
IpAddress ip = _ipAddressDao.findById(vpnGw.getAddrId());
@ -501,15 +530,15 @@ public class VpcVirtualRouterElement extends VirtualRouterElement implements Vpc
List<DomainRouterVO> routers = _vpcRouterMgr.getVpcRouters(ip.getVpcId());
if (routers == null || routers.size() != 1) {
throw new ResourceUnavailableException("Cannot enable site-to-site VPN on the backend; virtual router doesn't exist in the vpc " + ip.getVpcId(),
DataCenter.class, vpc.getZoneId());
throw new ResourceUnavailableException("Cannot enable site-to-site VPN on the backend; virtual router doesn't exist in the vpc " + ip.getVpcId(), DataCenter.class,
vpc.getZoneId());
}
return _vpcRouterMgr.startSite2SiteVpn(conn, routers.get(0));
}
@Override
public boolean stopSite2SiteVpn(Site2SiteVpnConnection conn) throws ResourceUnavailableException {
public boolean stopSite2SiteVpn(final Site2SiteVpnConnection conn) throws ResourceUnavailableException {
Site2SiteVpnGateway vpnGw = _vpnGatewayDao.findById(conn.getVpnGatewayId());
IpAddress ip = _ipAddressDao.findById(vpnGw.getAddrId());
@ -528,15 +557,15 @@ public class VpcVirtualRouterElement extends VirtualRouterElement implements Vpc
List<DomainRouterVO> routers = _vpcRouterMgr.getVpcRouters(ip.getVpcId());
if (routers == null || routers.size() != 1) {
throw new ResourceUnavailableException("Cannot enable site-to-site VPN on the backend; virtual router doesn't exist in the vpc " + ip.getVpcId(),
DataCenter.class, vpc.getZoneId());
throw new ResourceUnavailableException("Cannot enable site-to-site VPN on the backend; virtual router doesn't exist in the vpc " + ip.getVpcId(), DataCenter.class,
vpc.getZoneId());
}
return _vpcRouterMgr.stopSite2SiteVpn(conn, routers.get(0));
}
@Override
public String[] applyVpnUsers(RemoteAccessVpn vpn, List<? extends VpnUser> users) throws ResourceUnavailableException {
public String[] applyVpnUsers(final RemoteAccessVpn vpn, final List<? extends VpnUser> users) throws ResourceUnavailableException {
if (vpn.getVpcId() == null) {
return null;
}
@ -546,11 +575,16 @@ public class VpcVirtualRouterElement extends VirtualRouterElement implements Vpc
s_logger.debug("Cannot apply vpn users on the backend; virtual router doesn't exist in the network " + vpn.getVpcId());
return null;
}
return _vpcRouterMgr.applyVpnUsers(vpn, users, routers.get(0));
Vpc vpc = _entityMgr.findById(Vpc.class, vpn.getVpcId());
DataCenterVO dcVO = _dcDao.findById(vpc.getZoneId());
NetworkTopology networkTopology = networkTopologyContext.retrieveNetworkTopology(dcVO);
return networkTopology.applyVpnUsers(vpn, users, routers.get(0));
}
@Override
public boolean startVpn(RemoteAccessVpn vpn) throws ResourceUnavailableException {
public boolean startVpn(final RemoteAccessVpn vpn) throws ResourceUnavailableException {
if (vpn.getVpcId() == null) {
return false;
}
@ -564,7 +598,7 @@ public class VpcVirtualRouterElement extends VirtualRouterElement implements Vpc
}
@Override
public boolean stopVpn(RemoteAccessVpn vpn) throws ResourceUnavailableException {
public boolean stopVpn(final RemoteAccessVpn vpn) throws ResourceUnavailableException {
if (vpn.getVpcId() == null) {
return false;
}

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,81 @@
// Licensed to the Apache Software Foundation (ASF) under one
// or more contributor license agreements. See the NOTICE file
// distributed with this work for additional information
// regarding copyright ownership. The ASF licenses this file
// to you under the Apache License, Version 2.0 (the
// "License"); you may not use this file except in compliance
// with the License. You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing,
// software distributed under the License is distributed on an
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
// KIND, either express or implied. See the License for the
// specific language governing permissions and limitations
// under the License.
package com.cloud.network.router;
import java.util.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.user.Account;
import com.cloud.user.User;
import com.cloud.vm.DomainRouterVO;
import com.cloud.vm.VirtualMachineProfile.Param;
public interface NetworkHelper {
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);
public abstract NicTO getNicTO(VirtualRouter router, Long networkId,
String broadcastUri);
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
*/
public abstract boolean checkRouterVersion(VirtualRouter router);
public abstract List<DomainRouterVO> startRouters(
RouterDeploymentDefinition routerDeploymentDefinition)
throws StorageUnavailableException, InsufficientCapacityException,
ConcurrentOperationException, ResourceUnavailableException;
public abstract DomainRouterVO startVirtualRouter(DomainRouterVO router,
User user, Account caller, Map<Param, Object> params)
throws StorageUnavailableException, InsufficientCapacityException,
ConcurrentOperationException, ResourceUnavailableException;
public abstract DomainRouterVO deployRouter(
RouterDeploymentDefinition routerDeploymentDefinition,
boolean startRouter)
throws InsufficientAddressCapacityException,
InsufficientServerCapacityException, InsufficientCapacityException,
StorageUnavailableException, ResourceUnavailableException;
}

View File

@ -0,0 +1,757 @@
// Licensed to the Apache Software Foundation (ASF) under one
// or more contributor license agreements. See the NOTICE file
// distributed with this work for additional information
// regarding copyright ownership. The ASF licenses this file
// to you under the Apache License, Version 2.0 (the
// "License"); you may not use this file except in compliance
// with the License. You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing,
// software distributed under the License is distributed on an
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
// KIND, either express or implied. See the License for the
// specific language governing permissions and limitations
// under the License.
package com.cloud.network.router;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import javax.annotation.PostConstruct;
import javax.ejb.Local;
import javax.inject.Inject;
import org.apache.cloudstack.engine.orchestration.service.NetworkOrchestrationService;
import org.apache.cloudstack.framework.config.ConfigKey;
import org.apache.log4j.Logger;
import org.cloud.network.router.deployment.RouterDeploymentDefinition;
import com.cloud.agent.AgentManager;
import com.cloud.agent.api.Answer;
import com.cloud.agent.api.BumpUpPriorityCommand;
import com.cloud.agent.api.routing.NetworkElementCommand;
import com.cloud.agent.api.to.NicTO;
import com.cloud.agent.manager.Commands;
import com.cloud.alert.AlertManager;
import com.cloud.dc.ClusterVO;
import com.cloud.dc.DataCenter;
import com.cloud.dc.Pod;
import com.cloud.dc.dao.ClusterDao;
import com.cloud.deploy.DataCenterDeployment;
import com.cloud.deploy.DeployDestination;
import com.cloud.deploy.DeploymentPlan;
import com.cloud.deploy.DeploymentPlanner.ExcludeList;
import com.cloud.exception.AgentUnavailableException;
import com.cloud.exception.ConcurrentOperationException;
import com.cloud.exception.InsufficientAddressCapacityException;
import com.cloud.exception.InsufficientCapacityException;
import com.cloud.exception.InsufficientServerCapacityException;
import com.cloud.exception.OperationTimedoutException;
import com.cloud.exception.ResourceUnavailableException;
import com.cloud.exception.StorageUnavailableException;
import com.cloud.host.HostVO;
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.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.VirtualNetworkApplianceService;
import com.cloud.network.addr.PublicIp;
import com.cloud.network.dao.IPAddressDao;
import com.cloud.network.dao.NetworkDao;
import com.cloud.network.dao.UserIpv6AddressDao;
import com.cloud.network.router.VirtualRouter.RedundantState;
import com.cloud.network.router.VirtualRouter.Role;
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;
import com.cloud.storage.VMTemplateVO;
import com.cloud.storage.Volume;
import com.cloud.storage.VolumeVO;
import com.cloud.storage.dao.VMTemplateDao;
import com.cloud.storage.dao.VolumeDao;
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;
import com.cloud.vm.VirtualMachineManager;
import com.cloud.vm.VirtualMachineName;
import com.cloud.vm.VirtualMachineProfile.Param;
import com.cloud.vm.dao.DomainRouterDao;
import com.cloud.vm.dao.NicDao;
@Local(value = { NetworkHelper.class })
public class NetworkHelperImpl implements NetworkHelper {
private static final Logger s_logger = Logger.getLogger(NetworkHelperImpl.class);
protected static Account s_systemAccount;
protected static String s_vmInstanceName;
@Inject
protected NicDao _nicDao;
@Inject
private NetworkDao _networkDao;
@Inject
protected DomainRouterDao _routerDao;
@Inject
private AgentManager _agentMgr;
@Inject
private AlertManager _alertMgr;
@Inject
protected NetworkModel _networkModel;
@Inject
private VirtualMachineManager _itMgr;
@Inject
private AccountManager _accountMgr;
@Inject
private Site2SiteVpnManager _s2sVpnMgr;
@Inject
private HostDao _hostDao;
@Inject
private VolumeDao _volumeDao;
@Inject
private ServiceOfferingDao _serviceOfferingDao;
@Inject
private VMTemplateDao _templateDao;
@Inject
private ResourceManager _resourceMgr;
@Inject
private ClusterDao _clusterDao;
@Inject
protected IPAddressDao _ipAddressDao;
@Inject
private IpAddressManager _ipAddrMgr;
@Inject
private UserIpv6AddressDao _ipv6Dao;
@Inject
private RouterControlHelper _routerControlHelper;
@Inject
protected NetworkOrchestrationService _networkMgr;
protected final Map<HypervisorType, ConfigKey<String>> hypervisorsMap = new HashMap<>();
@PostConstruct
protected void setupHypervisorsMap() {
hypervisorsMap.put(HypervisorType.XenServer, VirtualNetworkApplianceManager.RouterTemplateXen);
hypervisorsMap.put(HypervisorType.KVM, VirtualNetworkApplianceManager.RouterTemplateKvm);
hypervisorsMap.put(HypervisorType.VMware, VirtualNetworkApplianceManager.RouterTemplateVmware);
hypervisorsMap.put(HypervisorType.Hyperv, VirtualNetworkApplianceManager.RouterTemplateHyperV);
hypervisorsMap.put(HypervisorType.LXC, VirtualNetworkApplianceManager.RouterTemplateLxc);
}
@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()
+ ", minimal required version : " + VirtualNetworkApplianceService.MinVRVersion);
throw new CloudRuntimeException("Unable to send command. Upgrade in progress. Please contact administrator.");
}
Answer[] answers = null;
try {
answers = _agentMgr.send(router.getHostId(), cmds);
} catch (final OperationTimedoutException e) {
s_logger.warn("Timed Out", e);
throw new AgentUnavailableException("Unable to send commands to virtual router ", router.getHostId(), e);
}
if ((answers == null) || (answers.length != cmds.size())) {
return false;
}
// FIXME: Have to return state for individual command in the future
boolean result = true;
for (final Answer answer : answers) {
if (!answer.getResult()) {
result = false;
break;
}
}
return result;
}
@Override
public void handleSingleWorkingRedundantRouter(final List<? extends VirtualRouter> connectedRouters, final List<? extends VirtualRouter> disconnectedRouters,
final String reason) throws ResourceUnavailableException {
if (connectedRouters.isEmpty() || disconnectedRouters.isEmpty()) {
return;
}
if ((connectedRouters.size() != 1) || (disconnectedRouters.size() != 1)) {
s_logger.warn("How many redundant routers do we have?? ");
return;
}
if (!connectedRouters.get(0).getIsRedundantRouter()) {
throw new ResourceUnavailableException("Who is calling this with non-redundant router or non-domain router?", DataCenter.class, connectedRouters.get(0)
.getDataCenterId());
}
if (!disconnectedRouters.get(0).getIsRedundantRouter()) {
throw new ResourceUnavailableException("Who is calling this with non-redundant router or non-domain router?", DataCenter.class, disconnectedRouters.get(0)
.getDataCenterId());
}
final DomainRouterVO connectedRouter = (DomainRouterVO) connectedRouters.get(0);
DomainRouterVO disconnectedRouter = (DomainRouterVO) disconnectedRouters.get(0);
if (s_logger.isDebugEnabled()) {
s_logger.debug("About to stop the router " + disconnectedRouter.getInstanceName() + " due to: " + reason);
}
final String title = "Virtual router " + disconnectedRouter.getInstanceName() + " would be stopped after connecting back, due to " + reason;
final String context = "Virtual router (name: " + disconnectedRouter.getInstanceName() + ", id: " + disconnectedRouter.getId()
+ ") would be stopped after connecting back, due to: " + reason;
_alertMgr.sendAlert(AlertManager.AlertType.ALERT_TYPE_DOMAIN_ROUTER, disconnectedRouter.getDataCenterId(), disconnectedRouter.getPodIdToDeployIn(), title, context);
disconnectedRouter.setStopPending(true);
disconnectedRouter = _routerDao.persist(disconnectedRouter);
final int connRouterPR = getRealPriority(connectedRouter);
final int disconnRouterPR = getRealPriority(disconnectedRouter);
if (connRouterPR < disconnRouterPR) {
// connRouterPR < disconnRouterPR, they won't equal at any time
if (!connectedRouter.getIsPriorityBumpUp()) {
final BumpUpPriorityCommand command = new BumpUpPriorityCommand();
command.setAccessDetail(NetworkElementCommand.ROUTER_IP, _routerControlHelper.getRouterControlIp(connectedRouter.getId()));
command.setAccessDetail(NetworkElementCommand.ROUTER_NAME, connectedRouter.getInstanceName());
final Answer answer = _agentMgr.easySend(connectedRouter.getHostId(), command);
if (!answer.getResult()) {
s_logger.error("Failed to bump up " + connectedRouter.getInstanceName() + "'s priority! " + answer.getDetails());
}
} else {
final String t = "Can't bump up virtual router " + connectedRouter.getInstanceName() + "'s priority due to it's already bumped up!";
_alertMgr.sendAlert(AlertManager.AlertType.ALERT_TYPE_DOMAIN_ROUTER, connectedRouter.getDataCenterId(), connectedRouter.getPodIdToDeployIn(), t, t);
}
}
}
@Override
public int getRealPriority(final DomainRouterVO router) {
int priority = router.getPriority();
if (router.getIsPriorityBumpUp()) {
priority += VirtualNetworkApplianceManager.DEFAULT_DELTA;
}
return priority;
}
@Override
public NicTO getNicTO(final VirtualRouter router, final Long networkId, final String broadcastUri) {
NicProfile nicProfile = _networkModel.getNicProfile(router, networkId, broadcastUri);
return _itMgr.toNicTO(nicProfile, router.getHypervisorType());
}
@Override
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);
}
final DomainRouterVO router = _routerDao.findById(routerId);
if (router == null) {
return null;
}
_accountMgr.checkAccess(caller, null, true, router);
_itMgr.expunge(router.getUuid());
_routerDao.remove(router.getId());
return router;
}
@Override
public boolean checkRouterVersion(final VirtualRouter router) {
if (!VirtualNetworkApplianceManagerImpl.routerVersionCheckEnabled.value()) {
// Router version check is disabled.
return true;
}
if (router.getTemplateVersion() == null) {
return false;
}
final String trimmedVersion = Version.trimRouterVersion(router.getTemplateVersion());
return Version.compare(trimmedVersion, VirtualNetworkApplianceService.MinVRVersion) >= 0;
}
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);
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!");
router.setStopPending(false);
router = _routerDao.persist(router);
}
// We don't want the failure of VPN Connection affect the status of
// router, so we try to make connection
// only after router start successfully
final Long vpcId = router.getVpcId();
if (vpcId != null) {
_s2sVpnMgr.reconnectDisconnectedVpnByVpc(vpcId);
}
return _routerDao.findById(router.getId());
}
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");
}
while (vm.getState() == State.Starting) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
}
// reload to get the latest state info
vm = _routerDao.findById(router.getId());
}
if (vm.getState() == State.Running) {
if (s_logger.isDebugEnabled()) {
s_logger.debug("Router " + router.getInstanceName() + " is now fully up");
}
return router;
}
s_logger.warn("Router " + router.getInstanceName() + " failed to start. current state: " + vm.getState());
return null;
}
@Override
public List<DomainRouterVO> startRouters(final RouterDeploymentDefinition routerDeploymentDefinition) throws StorageUnavailableException, InsufficientCapacityException,
ConcurrentOperationException, ResourceUnavailableException {
List<DomainRouterVO> runningRouters = new ArrayList<DomainRouterVO>();
for (DomainRouterVO router : routerDeploymentDefinition.getRouters()) {
boolean skip = false;
final State state = router.getState();
if ((router.getHostId() != null) && (state != State.Running)) {
final HostVO host = _hostDao.findById(router.getHostId());
if ((host == null) || (host.getState() != Status.Up)) {
skip = true;
}
}
if (!skip) {
if (state != State.Running) {
router = startVirtualRouter(router, _accountMgr.getSystemUser(), _accountMgr.getSystemAccount(), routerDeploymentDefinition.getParams());
}
if (router != null) {
runningRouters.add(router);
}
}
}
return runningRouters;
}
@Override
public DomainRouterVO startVirtualRouter(final DomainRouterVO router, final User user, final Account caller, final Map<Param, Object> params)
throws StorageUnavailableException, InsufficientCapacityException, ConcurrentOperationException, ResourceUnavailableException {
if ((router.getRole() != Role.VIRTUAL_ROUTER) || !router.getIsRedundantRouter()) {
return start(router, user, caller, params, null);
}
if (router.getState() == State.Running) {
s_logger.debug("Redundant router " + router.getInstanceName() + " is already running!");
return router;
}
//
// If another thread has already requested a VR start, there is a
// transition period for VR to transit from
// Starting to Running, there exist a race conditioning window here
// We will wait until VR is up or fail
if (router.getState() == State.Starting) {
return waitRouter(router);
}
DataCenterDeployment plan = new DataCenterDeployment(0, null, null, null, null, null);
DomainRouterVO result = null;
assert router.getIsRedundantRouter();
final List<Long> networkIds = _routerDao.getRouterNetworks(router.getId());
// Not support VPC now
if (networkIds.size() > 1) {
throw new ResourceUnavailableException("Unable to support more than one guest network for redundant router now!", DataCenter.class, router.getDataCenterId());
}
DomainRouterVO routerToBeAvoid = null;
if (networkIds.size() != 0) {
final List<DomainRouterVO> routerList = _routerDao.findByNetwork(networkIds.get(0));
for (final DomainRouterVO rrouter : routerList) {
if ((rrouter.getHostId() != null) && rrouter.getIsRedundantRouter() && (rrouter.getState() == State.Running)) {
if (routerToBeAvoid != null) {
throw new ResourceUnavailableException("Try to start router " + router.getInstanceName() + "(" + router.getId() + ")"
+ ", but there are already two redundant routers with IP " + router.getPublicIpAddress() + ", they are " + rrouter.getInstanceName() + "("
+ rrouter.getId() + ") and " + routerToBeAvoid.getInstanceName() + "(" + routerToBeAvoid.getId() + ")", DataCenter.class,
rrouter.getDataCenterId());
}
routerToBeAvoid = rrouter;
}
}
}
if (routerToBeAvoid == null) {
return start(router, user, caller, params, null);
}
// We would try best to deploy the router to another place
final int retryIndex = 5;
final ExcludeList[] avoids = new ExcludeList[5];
avoids[0] = new ExcludeList();
avoids[0].addPod(routerToBeAvoid.getPodIdToDeployIn());
avoids[1] = new ExcludeList();
avoids[1].addCluster(_hostDao.findById(routerToBeAvoid.getHostId()).getClusterId());
avoids[2] = new ExcludeList();
final List<VolumeVO> volumes = _volumeDao.findByInstanceAndType(routerToBeAvoid.getId(), Volume.Type.ROOT);
if ((volumes != null) && (volumes.size() != 0)) {
avoids[2].addPool(volumes.get(0).getPoolId());
}
avoids[2].addHost(routerToBeAvoid.getHostId());
avoids[3] = new ExcludeList();
avoids[3].addHost(routerToBeAvoid.getHostId());
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");
}
plan.setAvoids(avoids[i]);
try {
result = start(router, user, caller, params, plan);
} catch (final InsufficientServerCapacityException ex) {
result = null;
}
if (result != null) {
break;
}
}
return result;
}
protected String retrieveTemplateName(final HypervisorType hType, final long datacenterId) {
String templateName = null;
if (hType == HypervisorType.BareMetal) {
ConfigKey<String> hypervisorConfigKey = hypervisorsMap.get(HypervisorType.VMware);
templateName = hypervisorConfigKey.valueIn(datacenterId);
} else {
// Returning NULL is fine because the simulator will need it when
// being used instead of a real hypervisor.
// The hypervisorsMap contains only real hypervisors.
ConfigKey<String> hypervisorConfigKey = hypervisorsMap.get(hType);
if (hypervisorConfigKey != null) {
templateName = hypervisorConfigKey.valueIn(datacenterId);
}
}
return templateName;
}
@Override
public DomainRouterVO deployRouter(final RouterDeploymentDefinition routerDeploymentDefinition, final boolean startRouter) throws InsufficientAddressCapacityException,
InsufficientServerCapacityException, InsufficientCapacityException, StorageUnavailableException, ResourceUnavailableException {
final ServiceOfferingVO routerOffering = _serviceOfferingDao.findById(routerDeploymentDefinition.getOfferingId());
final Account owner = routerDeploymentDefinition.getOwner();
// Router is the network element, we don't know the hypervisor type yet.
// Try to allocate the domR twice using diff hypervisors, and when
// failed both times, throw the exception up
final List<HypervisorType> hypervisors = getHypervisors(routerDeploymentDefinition);
int allocateRetry = 0;
int startRetry = 0;
DomainRouterVO router = null;
for (final Iterator<HypervisorType> iter = hypervisors.iterator(); iter.hasNext();) {
final HypervisorType hType = iter.next();
try {
final long id = _routerDao.getNextInSequence(Long.class, "id");
if (s_logger.isDebugEnabled()) {
s_logger.debug(String.format("Allocating the VR with id=%s in datacenter %s with the hypervisor type %s", id, routerDeploymentDefinition.getDest()
.getDataCenter(), hType));
}
String templateName = retrieveTemplateName(hType, routerDeploymentDefinition.getDest().getDataCenter().getId());
final VMTemplateVO template = _templateDao.findRoutingTemplate(hType, templateName);
if (template == null) {
s_logger.debug(hType + " won't support system vm, skip it");
continue;
}
boolean offerHA = routerOffering.getOfferHA();
/*
* We don't provide HA to redundant router VMs, admin should own
* it all, and redundant router themselves are HA
*/
if (routerDeploymentDefinition.isRedundant()) {
offerHA = false;
}
// routerDeploymentDefinition.getVpc().getId() ==> do not use
// VPC because it is not a VPC offering.
Long vpcId = routerDeploymentDefinition.getVpc() != null ? routerDeploymentDefinition.getVpc().getId() : null;
router = new DomainRouterVO(id, routerOffering.getId(), routerDeploymentDefinition.getVirtualProvider().getId(), VirtualMachineName.getRouterName(id,
s_vmInstanceName), template.getId(), template.getHypervisorType(), template.getGuestOSId(), owner.getDomainId(), owner.getId(),
routerDeploymentDefinition.isRedundant(), 0, false, RedundantState.UNKNOWN, offerHA, false, vpcId);
router.setDynamicallyScalable(template.isDynamicallyScalable());
router.setRole(Role.VIRTUAL_ROUTER);
router = _routerDao.persist(router);
LinkedHashMap<Network, List<? extends NicProfile>> networks = createRouterNetworks(routerDeploymentDefinition);
_itMgr.allocate(router.getInstanceName(), template, routerOffering, networks, routerDeploymentDefinition.getPlan(), null);
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");
continue;
} else {
throw ex;
}
} finally {
allocateRetry++;
}
if (startRouter) {
try {
router = startVirtualRouter(router, _accountMgr.getSystemUser(), _accountMgr.getSystemAccount(), routerDeploymentDefinition.getParams());
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");
// destroy the router
destroyRouter(router.getId(), _accountMgr.getAccount(Account.ACCOUNT_ID_SYSTEM), User.UID_SYSTEM);
continue;
} else {
throw ex;
}
} finally {
startRetry++;
}
} else {
// return stopped router
return router;
}
}
return router;
}
protected void filterSupportedHypervisors(final List<HypervisorType> hypervisors) {
// For non vpc we keep them all assuming all types in the list are
// supported
}
protected String getNoHypervisorsErrMsgDetails() {
return "";
}
protected List<HypervisorType> getHypervisors(final RouterDeploymentDefinition routerDeploymentDefinition) throws InsufficientServerCapacityException {
final DeployDestination dest = routerDeploymentDefinition.getDest();
List<HypervisorType> hypervisors = new ArrayList<HypervisorType>();
if (dest.getCluster() != null) {
if (dest.getCluster().getHypervisorType() == HypervisorType.Ovm) {
hypervisors.add(getClusterToStartDomainRouterForOvm(dest.getCluster().getPodId()));
} else {
hypervisors.add(dest.getCluster().getHypervisorType());
}
} else {
final HypervisorType defaults = _resourceMgr.getDefaultHypervisor(dest.getDataCenter().getId());
if (defaults != HypervisorType.None) {
hypervisors.add(defaults);
} else {
// if there is no default hypervisor, get it from the cluster
hypervisors = _resourceMgr.getSupportedHypervisorTypes(dest.getDataCenter().getId(), true, routerDeploymentDefinition.getPlan().getPodId());
}
}
filterSupportedHypervisors(hypervisors);
if (hypervisors.isEmpty()) {
if (routerDeploymentDefinition.getPodId() != null) {
throw new InsufficientServerCapacityException("Unable to create virtual router, there are no clusters in the pod." + getNoHypervisorsErrMsgDetails(), Pod.class,
routerDeploymentDefinition.getPodId());
}
throw new InsufficientServerCapacityException("Unable to create virtual router, there are no clusters in the zone." + getNoHypervisorsErrMsgDetails(),
DataCenter.class, dest.getDataCenter().getId());
}
return hypervisors;
}
/*
* Ovm won't support any system. So we have to choose a partner cluster in
* the same pod to start domain router for us
*/
protected HypervisorType getClusterToStartDomainRouterForOvm(final long podId) {
final List<ClusterVO> clusters = _clusterDao.listByPodId(podId);
for (final ClusterVO cv : clusters) {
if ((cv.getHypervisorType() == HypervisorType.Ovm) || (cv.getHypervisorType() == HypervisorType.BareMetal)) {
continue;
}
final List<HostVO> hosts = _resourceMgr.listAllHostsInCluster(cv.getId());
if ((hosts == null) || hosts.isEmpty()) {
continue;
}
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");
return h.getHypervisorType();
}
}
}
final String errMsg = new StringBuilder("Cannot find an available cluster in Pod ").append(podId)
.append(" to start domain router for Ovm. \n Ovm won't support any system vm including domain router, ")
.append("please make sure you have a cluster with hypervisor type of any of xenserver/KVM/Vmware in the same pod")
.append(" with Ovm cluster. And there is at least one host in UP status in that cluster.").toString();
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) {
s_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)) {
s_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 (s_logger.isDebugEnabled()) {
s_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)) {
s_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 (s_logger.isDebugEnabled()) {
s_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
s_logger.debug("Adding nic for Virtual Router in Control network ");
List<? extends NetworkOffering> offerings = _networkModel.getSystemAccountNetworkOfferings(NetworkOffering.SystemControlNetwork);
NetworkOffering controlOffering = offerings.get(0);
Network controlConfig = _networkMgr.setupNetwork(s_systemAccount, controlOffering, routerDeploymentDefinition.getPlan(), null, null, false).get(0);
networks.put(controlConfig, new ArrayList<NicProfile>());
// 3) Public network
if (routerDeploymentDefinition.isPublicNetwork()) {
s_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(s_systemAccount, 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) {
s_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 static void setSystemAccount(final Account systemAccount) {
s_systemAccount = systemAccount;
}
public static void setVMInstanceName(final String vmInstanceName) {
s_vmInstanceName = vmInstanceName;
}
}

View File

@ -0,0 +1,31 @@
// 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 com.cloud.network.Network;
import com.cloud.network.vpc.VpcGateway;
import com.cloud.vm.NicProfile;
public interface NicProfileHelper {
public abstract NicProfile createPrivateNicProfileForGateway(
VpcGateway privateGateway);
public abstract NicProfile createGuestNicProfileForVpcRouter(
Network guestNetwork);
}

View File

@ -0,0 +1,110 @@
// 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 javax.ejb.Local;
import javax.inject.Inject;
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.VpcManager;
import com.cloud.network.vpc.dao.PrivateIpDao;
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.NicDao;
import com.cloud.vm.dao.VMInstanceDao;
@Local(value = {NicProfileHelper.class})
public class NicProfileHelperImpl implements NicProfileHelper {
@Inject
private VMInstanceDao _vmDao;
@Inject
private PrivateIpDao _privateIpDao;
@Inject
protected NetworkModel _networkModel;
@Inject
protected VpcManager _vpcMgr;
@Inject
protected NicDao _nicDao;
@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;
}
@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;
}
}

View File

@ -0,0 +1,70 @@
// Licensed to the Apache Software Foundation (ASF) under one
// or more contributor license agreements. See the NOTICE file
// distributed with this work for additional information
// regarding copyright ownership. The ASF licenses this file
// to you under the Apache License, Version 2.0 (the
// "License"); you may not use this file except in compliance
// with the License. You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing,
// software distributed under the License is distributed on an
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
// KIND, either express or implied. See the License for the
// specific language governing permissions and limitations
// under the License.
package com.cloud.network.router;
import java.util.List;
import javax.inject.Inject;
import org.apache.log4j.Logger;
import com.cloud.network.Networks.TrafficType;
import com.cloud.network.dao.NetworkDao;
import com.cloud.network.dao.NetworkVO;
import com.cloud.vm.DomainRouterVO;
import com.cloud.vm.NicVO;
import com.cloud.vm.dao.DomainRouterDao;
import com.cloud.vm.dao.NicDao;
public class RouterControlHelper {
private static final Logger logger = Logger.getLogger(RouterControlHelper.class);
@Inject
private DomainRouterDao routerDao;
@Inject
private NetworkDao networkDao;
@Inject
private NicDao nicDao;
public String getRouterControlIp(final long routerId) {
String routerControlIpAddress = null;
final List<NicVO> nics = nicDao.listByVmId(routerId);
for (final NicVO n : nics) {
final NetworkVO nc = networkDao.findById(n.getNetworkId());
if (nc != null && nc.getTrafficType() == TrafficType.Control) {
routerControlIpAddress = n.getIp4Address();
// router will have only one control ip
break;
}
}
if (routerControlIpAddress == null) {
logger.warn("Unable to find router's control ip in its attached NICs!. routerId: " + routerId);
final DomainRouterVO router = routerDao.findById(routerId);
return router.getPrivateIpAddress();
}
return routerControlIpAddress;
}
public String getRouterIpInNetwork(final long networkId, final long instanceId) {
return nicDao.getIpAddress(networkId, instanceId);
}
}

View File

@ -17,35 +17,25 @@
package com.cloud.network.router;
import java.util.List;
import java.util.Map;
import org.apache.cloudstack.framework.config.ConfigKey;
import com.cloud.deploy.DeployDestination;
import com.cloud.exception.AgentUnavailableException;
import com.cloud.exception.ConcurrentOperationException;
import com.cloud.exception.InsufficientCapacityException;
import com.cloud.exception.ResourceUnavailableException;
import com.cloud.network.Network;
import com.cloud.network.PublicIpAddress;
import com.cloud.network.RemoteAccessVpn;
import com.cloud.network.VirtualNetworkApplianceService;
import com.cloud.network.VpnUser;
import com.cloud.network.lb.LoadBalancingRule;
import com.cloud.network.rules.FirewallRule;
import com.cloud.network.rules.StaticNat;
import com.cloud.user.Account;
import com.cloud.user.User;
import com.cloud.utils.component.Manager;
import com.cloud.vm.DomainRouterVO;
import com.cloud.vm.NicProfile;
import com.cloud.vm.VirtualMachineProfile;
/**
* NetworkManager manages the network for the different end users.
*
*/
public interface VirtualNetworkApplianceManager extends Manager, VirtualNetworkApplianceService {
static final String RouterTemplateXenCK = "router.template.xenserver";
static final String RouterTemplateKvmCK = "router.template.kvm";
static final String RouterTemplateVmwareCK = "router.template.vmware";
@ -55,15 +45,15 @@ public interface VirtualNetworkApplianceManager extends Manager, VirtualNetworkA
static final String RouterAlertsCheckIntervalCK = "router.alerts.check.interval";
static final ConfigKey<String> RouterTemplateXen = new ConfigKey<String>(String.class, RouterTemplateXenCK, "Advanced", "SystemVM Template (XenServer)",
"Name of the default router template on Xenserver.", true, ConfigKey.Scope.Zone, null);
"Name of the default router template on Xenserver.", true, ConfigKey.Scope.Zone, null);
static final ConfigKey<String> RouterTemplateKvm = new ConfigKey<String>(String.class, RouterTemplateKvmCK, "Advanced", "SystemVM Template (KVM)",
"Name of the default router template on KVM.", true, ConfigKey.Scope.Zone, null);
"Name of the default router template on KVM.", true, ConfigKey.Scope.Zone, null);
static final ConfigKey<String> RouterTemplateVmware = new ConfigKey<String>(String.class, RouterTemplateVmwareCK, "Advanced", "SystemVM Template (vSphere)",
"Name of the default router template on Vmware.", true, ConfigKey.Scope.Zone, null);
"Name of the default router template on Vmware.", true, ConfigKey.Scope.Zone, null);
static final ConfigKey<String> RouterTemplateHyperV = new ConfigKey<String>(String.class, RouterTemplateHyperVCK, "Advanced", "SystemVM Template (HyperV)",
"Name of the default router template on Hyperv.", true, ConfigKey.Scope.Zone, null);
"Name of the default router template on Hyperv.", true, ConfigKey.Scope.Zone, null);
static final ConfigKey<String> RouterTemplateLxc = new ConfigKey<String>(String.class, RouterTemplateLxcCK, "Advanced", "SystemVM Template (LXC)",
"Name of the default router template on LXC.", true, ConfigKey.Scope.Zone, null);
"Name of the default router template on LXC.", true, ConfigKey.Scope.Zone, null);
static final ConfigKey<String> SetServiceMonitor = new ConfigKey<String>(String.class, SetServiceMonitorCK, "Advanced", "true",
"service monitoring in router enable/disable option, default true", true, ConfigKey.Scope.Zone, null);
@ -74,6 +64,8 @@ public interface VirtualNetworkApplianceManager extends Manager, VirtualNetworkA
public static final int DEFAULT_ROUTER_VM_RAMSIZE = 128; // 128M
public static final int DEFAULT_ROUTER_CPU_MHZ = 500; // 500 MHz
public static final boolean USE_POD_VLAN = false;
public static final int DEFAULT_PRIORITY = 100;
public static final int DEFAULT_DELTA = 2;
/**
/*
@ -81,60 +73,24 @@ public interface VirtualNetworkApplianceManager extends Manager, VirtualNetworkA
* @param hostId
* @param pubKey
* @param prvKey
*/
boolean sendSshKeysToHost(Long hostId, String pubKey, String prvKey);
/**
* save a vm password on the router.
* @param routers TODO
*
* NOT USED IN THE VIRTUAL NET APPLIANCE
*
*/
boolean savePasswordToRouter(Network network, NicProfile nic, VirtualMachineProfile profile, List<? extends VirtualRouter> routers)
throws ResourceUnavailableException;
boolean saveSSHPublicKeyToRouter(Network network, NicProfile nic, VirtualMachineProfile profile, List<? extends VirtualRouter> routers, String sshPublicKey)
throws ResourceUnavailableException;
boolean saveUserDataToRouter(Network network, NicProfile nic, VirtualMachineProfile profile, List<? extends VirtualRouter> routers)
throws ResourceUnavailableException;
List<DomainRouterVO> deployVirtualRouterInGuestNetwork(Network guestNetwork, DeployDestination dest, Account owner, Map<VirtualMachineProfile.Param, Object> params,
boolean isRedundant) throws InsufficientCapacityException, ResourceUnavailableException, ConcurrentOperationException;
//boolean sendSshKeysToHost(Long hostId, String pubKey, String prvKey):
boolean startRemoteAccessVpn(Network network, RemoteAccessVpn vpn, List<? extends VirtualRouter> routers) throws ResourceUnavailableException;
boolean deleteRemoteAccessVpn(Network network, RemoteAccessVpn vpn, List<? extends VirtualRouter> routers) throws ResourceUnavailableException;
boolean associatePublicIP(Network network, final List<? extends PublicIpAddress> ipAddress, List<? extends VirtualRouter> routers)
throws ResourceUnavailableException;
boolean applyFirewallRules(Network network, final List<? extends FirewallRule> rules, List<? extends VirtualRouter> routers) throws ResourceUnavailableException;
List<VirtualRouter> getRoutersForNetwork(long networkId);
String[] applyVpnUsers(Network network, List<? extends VpnUser> users, List<DomainRouterVO> routers) throws ResourceUnavailableException;
VirtualRouter stop(VirtualRouter router, boolean forced, User callingUser, Account callingAccount) throws ConcurrentOperationException, ResourceUnavailableException;
String getDnsBasicZoneUpdate();
boolean applyStaticNats(Network network, final List<? extends StaticNat> rules, List<? extends VirtualRouter> routers) throws ResourceUnavailableException;
boolean applyDhcpEntry(Network config, NicProfile nic, VirtualMachineProfile vm, DeployDestination dest, List<DomainRouterVO> routers)
throws ResourceUnavailableException;
boolean applyUserData(Network config, NicProfile nic, VirtualMachineProfile vm, DeployDestination dest, List<DomainRouterVO> routers)
throws ResourceUnavailableException;
boolean applyLoadBalancingRules(Network network, List<? extends LoadBalancingRule> rules, List<? extends VirtualRouter> routers) throws ResourceUnavailableException;
boolean configDhcpForSubnet(Network network, NicProfile nic, VirtualMachineProfile uservm, DeployDestination dest, List<DomainRouterVO> routers)
throws ResourceUnavailableException;
boolean removeDhcpSupportForSubnet(Network network, List<DomainRouterVO> routers) throws ResourceUnavailableException;
boolean setupDhcpForPvlan(boolean add, DomainRouterVO router, Long hostId, NicProfile nic);
public boolean prepareAggregatedExecution(Network network, List<DomainRouterVO> routers) throws AgentUnavailableException;
public boolean completeAggregatedExecution(Network network, List<DomainRouterVO> routers) throws AgentUnavailableException;

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,154 @@
// Licensed to the Apache Software Foundation (ASF) under one
// or more contributor license agreements. See the NOTICE file
// distributed with this work for additional information
// regarding copyright ownership. The ASF licenses this file
// to you under the Apache License, Version 2.0 (the
// "License"); you may not use this file except in compliance
// with the License. You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing,
// software distributed under the License is distributed on an
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
// KIND, either express or implied. See the License for the
// specific language governing permissions and limitations
// under the License.
package com.cloud.network.router;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.TreeSet;
import javax.annotation.PostConstruct;
import javax.inject.Inject;
import org.apache.commons.lang.StringUtils;
import org.apache.log4j.Logger;
import org.cloud.network.router.deployment.RouterDeploymentDefinition;
import com.cloud.dc.dao.VlanDao;
import com.cloud.exception.ConcurrentOperationException;
import com.cloud.exception.InsufficientAddressCapacityException;
import com.cloud.hypervisor.Hypervisor.HypervisorType;
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.addr.PublicIp;
import com.cloud.network.dao.IPAddressVO;
import com.cloud.network.vpc.PrivateGateway;
import com.cloud.network.vpc.VpcManager;
import com.cloud.offering.NetworkOffering;
import com.cloud.vm.NicProfile;
public class VpcNetworkHelperImpl extends NetworkHelperImpl {
private static final Logger s_logger = Logger.getLogger(VpcNetworkHelperImpl.class);
@Inject
private VlanDao _vlanDao;
@Inject
protected VpcManager vpcMgr;
@Inject
protected NicProfileHelper nicProfileHelper;
protected String noHypervisorsErrMsgDetails;
@PostConstruct
protected void setupNoHypervisorsErrMsgDetails() {
noHypervisorsErrMsgDetails = StringUtils.join(vpcMgr.getSupportedVpcHypervisors(), ',');
noHypervisorsErrMsgDetails += " are the only supported Hypervisors";
}
@Override
protected String getNoHypervisorsErrMsgDetails() {
return noHypervisorsErrMsgDetails;
}
@Override
protected void filterSupportedHypervisors(final List<HypervisorType> hypervisors) {
hypervisors.retainAll(vpcMgr.getSupportedVpcHypervisors());
}
@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 = vpcMgr.getVpcPrivateGateways(vpcId);
if (privateGateways != null && !privateGateways.isEmpty()) {
for (PrivateGateway privateGateway : privateGateways) {
NicProfile privateNic = nicProfileHelper.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 = nicProfileHelper.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(s_systemAccount, 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) {
@SuppressWarnings("unchecked")
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,61 +17,17 @@
package com.cloud.network.router;
import java.util.List;
import java.util.Map;
import com.cloud.deploy.DeployDestination;
import com.cloud.exception.ConcurrentOperationException;
import com.cloud.exception.InsufficientCapacityException;
import com.cloud.exception.ResourceUnavailableException;
import com.cloud.network.Network;
import com.cloud.network.RemoteAccessVpn;
import com.cloud.network.Site2SiteVpnConnection;
import com.cloud.network.VpcVirtualNetworkApplianceService;
import com.cloud.network.VpnUser;
import com.cloud.network.vpc.NetworkACLItem;
import com.cloud.network.vpc.PrivateGateway;
import com.cloud.network.vpc.StaticRouteProfile;
import com.cloud.network.vpc.Vpc;
import com.cloud.user.Account;
import com.cloud.vm.DomainRouterVO;
import com.cloud.vm.VirtualMachineProfile.Param;
public interface VpcVirtualNetworkApplianceManager extends VirtualNetworkApplianceManager, VpcVirtualNetworkApplianceService {
/**
* @param vpc
* @param dest
* @param owner
* @param params
* @return
* @throws InsufficientCapacityException
* @throws ConcurrentOperationException
* @throws ResourceUnavailableException
*/
List<DomainRouterVO> deployVirtualRouterInVpc(Vpc vpc, DeployDestination dest, Account owner, Map<Param, Object> params) throws InsufficientCapacityException,
ConcurrentOperationException, ResourceUnavailableException;
/**
*
* @param network
* @param rules
* @param routers
* @param privateGateway
* @return
* @throws ResourceUnavailableException
*/
boolean applyNetworkACLs(Network network, List<? extends NetworkACLItem> rules, List<? extends VirtualRouter> routers, boolean privateGateway)
throws ResourceUnavailableException;
/**
* @param gateway
* @param router TODO
* @return
* @throws ResourceUnavailableException
* @throws ConcurrentOperationException
*/
boolean setupPrivateGateway(PrivateGateway gateway, VirtualRouter router) throws ConcurrentOperationException, ResourceUnavailableException;
/**
* @param gateway
* @param router
@ -81,14 +37,6 @@ public interface VpcVirtualNetworkApplianceManager extends VirtualNetworkApplian
*/
boolean destroyPrivateGateway(PrivateGateway gateway, VirtualRouter router) throws ConcurrentOperationException, ResourceUnavailableException;
/**
* @param routes
* @param routers
* @return
* @throws ResourceUnavailableException
*/
boolean applyStaticRoutes(List<StaticRouteProfile> routes, List<DomainRouterVO> routers) throws ResourceUnavailableException;
/**
* @param conn
* @param routers
@ -126,13 +74,4 @@ public interface VpcVirtualNetworkApplianceManager extends VirtualNetworkApplian
* @throws ResourceUnavailableException
*/
boolean stopRemoteAccessVpn(RemoteAccessVpn vpn, VirtualRouter router) throws ResourceUnavailableException;
/**
* @param vpn
* @param users
* @param routers
* @return
* @throws ResourceUnavailableException
*/
String[] applyVpnUsers(RemoteAccessVpn vpn, List<? extends VpnUser> users, VirtualRouter router) throws ResourceUnavailableException;
}
}

View File

@ -0,0 +1,60 @@
// 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.rules;
import java.util.List;
import org.apache.cloudstack.network.topology.NetworkTopologyVisitor;
import org.apache.log4j.Logger;
import com.cloud.dc.DataCenter;
import com.cloud.exception.ResourceUnavailableException;
import com.cloud.network.RemoteAccessVpn;
import com.cloud.network.VpnUser;
import com.cloud.network.router.VirtualRouter;
import com.cloud.network.vpc.Vpc;
import com.cloud.network.vpc.dao.VpcDao;
import com.cloud.vm.VirtualMachine.State;
public class AdvancedVpnRules extends BasicVpnRules {
private static final Logger s_logger = Logger.getLogger(AdvancedVpnRules.class);
private final RemoteAccessVpn _remoteAccessVpn;
public AdvancedVpnRules(final RemoteAccessVpn remoteAccessVpn, final List<? extends VpnUser> users) {
super(null, users);
_remoteAccessVpn = remoteAccessVpn;
}
@Override
public boolean accept(final NetworkTopologyVisitor visitor, final VirtualRouter router) throws ResourceUnavailableException {
_router = router;
VpcDao vpcDao = visitor.getVirtualNetworkApplianceFactory().getVpcDao();
Vpc vpc = vpcDao.findById(_remoteAccessVpn.getVpcId());
if (_router.getState() != State.Running) {
s_logger.warn("Failed to add/remove Remote Access VPN users: router not in running state");
throw new ResourceUnavailableException("Failed to add/remove Remote Access VPN users: router not in running state: " + router.getState(), DataCenter.class,
vpc.getZoneId());
}
return visitor.visit(this);
}
}

View File

@ -0,0 +1,48 @@
// 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.rules;
import java.util.List;
import org.apache.cloudstack.network.topology.NetworkTopologyVisitor;
import com.cloud.exception.ResourceUnavailableException;
import com.cloud.network.Network;
import com.cloud.network.VpnUser;
import com.cloud.network.router.VirtualRouter;
public class BasicVpnRules extends RuleApplier {
private final List<? extends VpnUser> _users;
public BasicVpnRules(final Network network, final List<? extends VpnUser> users) {
super(network);
_users = users;
}
@Override
public boolean accept(final NetworkTopologyVisitor visitor, final VirtualRouter router) throws ResourceUnavailableException {
_router = router;
return visitor.visit(this);
}
public List<? extends VpnUser> getUsers() {
return _users;
}
}

View File

@ -0,0 +1,80 @@
// 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.rules;
import org.apache.cloudstack.network.topology.NetworkTopologyVisitor;
import com.cloud.deploy.DeployDestination;
import com.cloud.exception.ResourceUnavailableException;
import com.cloud.network.Network;
import com.cloud.network.router.VirtualRouter;
import com.cloud.vm.NicProfile;
import com.cloud.vm.NicVO;
import com.cloud.vm.UserVmVO;
import com.cloud.vm.VirtualMachineProfile;
import com.cloud.vm.dao.NicDao;
import com.cloud.vm.dao.UserVmDao;
public class DhcpEntryRules extends RuleApplier {
private final NicProfile _nic;
private final VirtualMachineProfile _profile;
private final DeployDestination _destination;
private NicVO _nicVo;
private UserVmVO _userVM;
public DhcpEntryRules(final Network network, final NicProfile nic, final VirtualMachineProfile profile, final DeployDestination destination) {
super(network);
_nic = nic;
_profile = profile;
_destination = destination;
}
@Override
public boolean accept(final NetworkTopologyVisitor visitor, final VirtualRouter router) throws ResourceUnavailableException {
_router = router;
UserVmDao userVmDao = visitor.getVirtualNetworkApplianceFactory().getUserVmDao();
_userVM = userVmDao.findById(_profile.getId());
userVmDao.loadDetails(_userVM);
NicDao nicDao = visitor.getVirtualNetworkApplianceFactory().getNicDao();
_nicVo = nicDao.findById(_nic.getId());
return visitor.visit(this);
}
public VirtualMachineProfile getProfile() {
return _profile;
}
public DeployDestination getDestination() {
return _destination;
}
public NicVO getNicVo() {
return _nicVo;
}
public UserVmVO getUserVM() {
return _userVM;
}
}

View File

@ -0,0 +1,67 @@
// 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.rules;
import org.apache.cloudstack.network.topology.NetworkTopologyVisitor;
import com.cloud.agent.api.PvlanSetupCommand;
import com.cloud.exception.ResourceUnavailableException;
import com.cloud.network.Network;
import com.cloud.network.NetworkModel;
import com.cloud.network.dao.NetworkDao;
import com.cloud.network.router.VirtualRouter;
import com.cloud.vm.NicProfile;
public class DhcpPvlanRules extends RuleApplier {
private final boolean _isAddPvlan;
private final NicProfile _nic;
private PvlanSetupCommand _setupCommand;
public DhcpPvlanRules(final boolean isAddPvlan, final NicProfile nic) {
super(null);
_isAddPvlan = isAddPvlan;
_nic = nic;
}
@Override
public boolean accept(final NetworkTopologyVisitor visitor, final VirtualRouter router) throws ResourceUnavailableException {
_router = router;
String op = "add";
if (!_isAddPvlan) {
op = "delete";
}
NetworkDao networkDao = visitor.getVirtualNetworkApplianceFactory().getNetworkDao();
final Network network = networkDao.findById(_nic.getNetworkId());
NetworkModel networkModel = visitor.getVirtualNetworkApplianceFactory().getNetworkModel();
final String networkTag = networkModel.getNetworkTag(_router.getHypervisorType(), network);
_setupCommand = PvlanSetupCommand.createDhcpSetup(op, _nic.getBroadCastUri(), networkTag, _router.getInstanceName(), _nic.getMacAddress(), _nic.getIp4Address());
return visitor.visit(this);
}
public PvlanSetupCommand getSetupCommand() {
return _setupCommand;
}
}

View File

@ -0,0 +1,174 @@
// 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.rules;
import java.util.ArrayList;
import java.util.List;
import org.apache.cloudstack.context.CallContext;
import org.apache.cloudstack.network.topology.NetworkTopologyVisitor;
import org.apache.log4j.Logger;
import com.cloud.dc.DataCenter;
import com.cloud.dc.DataCenter.NetworkType;
import com.cloud.dc.Vlan;
import com.cloud.dc.VlanVO;
import com.cloud.dc.dao.DataCenterDao;
import com.cloud.dc.dao.HostPodDao;
import com.cloud.dc.dao.VlanDao;
import com.cloud.exception.InsufficientAddressCapacityException;
import com.cloud.exception.ResourceUnavailableException;
import com.cloud.network.IpAddressManager;
import com.cloud.network.Network;
import com.cloud.network.Network.GuestType;
import com.cloud.network.Networks.TrafficType;
import com.cloud.network.addr.PublicIp;
import com.cloud.network.dao.IPAddressDao;
import com.cloud.network.router.VirtualRouter;
import com.cloud.user.Account;
import com.cloud.utils.db.Transaction;
import com.cloud.utils.db.TransactionCallbackNoReturn;
import com.cloud.utils.db.TransactionStatus;
import com.cloud.utils.exception.CloudRuntimeException;
import com.cloud.utils.net.NetUtils;
import com.cloud.vm.NicIpAlias;
import com.cloud.vm.NicProfile;
import com.cloud.vm.NicVO;
import com.cloud.vm.UserVmVO;
import com.cloud.vm.VirtualMachine;
import com.cloud.vm.VirtualMachineProfile;
import com.cloud.vm.dao.NicDao;
import com.cloud.vm.dao.NicIpAliasDao;
import com.cloud.vm.dao.NicIpAliasVO;
import com.cloud.vm.dao.UserVmDao;
public class DhcpSubNetRules extends RuleApplier {
private static final Logger s_logger = Logger.getLogger(DhcpSubNetRules.class);
private final NicProfile _nic;
private final VirtualMachineProfile _profile;
private NicIpAliasVO _nicAlias;
private String _routerAliasIp;
public DhcpSubNetRules(final Network network, final NicProfile nic, final VirtualMachineProfile profile) {
super(network);
_nic = nic;
_profile = profile;
}
@Override
public boolean accept(final NetworkTopologyVisitor visitor, final VirtualRouter router) throws ResourceUnavailableException {
_router = router;
UserVmDao userVmDao = visitor.getVirtualNetworkApplianceFactory().getUserVmDao();
final UserVmVO vm = userVmDao.findById(_profile.getId());
userVmDao.loadDetails(vm);
NicDao nicDao = visitor.getVirtualNetworkApplianceFactory().getNicDao();
// check if this is not the primary subnet.
final NicVO domrGuestNic = nicDao.findByInstanceIdAndIpAddressAndVmtype(_router.getId(), nicDao.getIpAddress(_nic.getNetworkId(), _router.getId()),
VirtualMachine.Type.DomainRouter);
// check if the router ip address and the vm ip address belong to same
// subnet.
// if they do not belong to same netwoek check for the alias ips. if not
// create one.
// This should happen only in case of Basic and Advanced SG enabled
// networks.
if (!NetUtils.sameSubnet(domrGuestNic.getIp4Address(), _nic.getIp4Address(), _nic.getNetmask())) {
final NicIpAliasDao nicIpAliasDao = visitor.getVirtualNetworkApplianceFactory().getNicIpAliasDao();
final List<NicIpAliasVO> aliasIps = nicIpAliasDao.listByNetworkIdAndState(domrGuestNic.getNetworkId(), NicIpAlias.state.active);
boolean ipInVmsubnet = false;
for (final NicIpAliasVO alias : aliasIps) {
// check if any of the alias ips belongs to the Vm's subnet.
if (NetUtils.sameSubnet(alias.getIp4Address(), _nic.getIp4Address(), _nic.getNetmask())) {
ipInVmsubnet = true;
break;
}
}
PublicIp routerPublicIP = null;
DataCenterDao dcDao = visitor.getVirtualNetworkApplianceFactory().getDcDao();
final DataCenter dc = dcDao.findById(_router.getDataCenterId());
if (ipInVmsubnet == false) {
try {
if (_network.getTrafficType() == TrafficType.Guest && _network.getGuestType() == GuestType.Shared) {
HostPodDao podDao = visitor.getVirtualNetworkApplianceFactory().getPodDao();
podDao.findById(vm.getPodIdToDeployIn());
final Account caller = CallContext.current().getCallingAccount();
VlanDao vlanDao = visitor.getVirtualNetworkApplianceFactory().getVlanDao();
final List<VlanVO> vlanList = vlanDao.listVlansByNetworkIdAndGateway(_network.getId(), _nic.getGateway());
final List<Long> vlanDbIdList = new ArrayList<Long>();
for (final VlanVO vlan : vlanList) {
vlanDbIdList.add(vlan.getId());
}
IpAddressManager ipAddrMgr = visitor.getVirtualNetworkApplianceFactory().getIpAddrMgr();
if (dc.getNetworkType() == NetworkType.Basic) {
routerPublicIP = ipAddrMgr.assignPublicIpAddressFromVlans(_router.getDataCenterId(), vm.getPodIdToDeployIn(), caller, Vlan.VlanType.DirectAttached,
vlanDbIdList, _nic.getNetworkId(), null, false);
} else {
routerPublicIP = ipAddrMgr.assignPublicIpAddressFromVlans(_router.getDataCenterId(), null, caller, Vlan.VlanType.DirectAttached, vlanDbIdList,
_nic.getNetworkId(), null, false);
}
_routerAliasIp = routerPublicIP.getAddress().addr();
}
} catch (final InsufficientAddressCapacityException e) {
s_logger.info(e.getMessage());
s_logger.info("unable to configure dhcp for this VM.");
return false;
}
// this means we did not create an IP alias on the router.
_nicAlias = new NicIpAliasVO(domrGuestNic.getId(), _routerAliasIp, _router.getId(), CallContext.current().getCallingAccountId(), _network.getDomainId(),
_nic.getNetworkId(), _nic.getGateway(), _nic.getNetmask());
_nicAlias.setAliasCount(routerPublicIP.getIpMacAddress());
nicIpAliasDao.persist(_nicAlias);
final boolean result = visitor.visit(this);
if (result == false) {
final NicIpAliasVO ipAliasVO = nicIpAliasDao.findByInstanceIdAndNetworkId(_network.getId(), _router.getId());
final PublicIp routerPublicIPFinal = routerPublicIP;
Transaction.execute(new TransactionCallbackNoReturn() {
@Override
public void doInTransactionWithoutResult(final TransactionStatus status) {
nicIpAliasDao.expunge(ipAliasVO.getId());
IPAddressDao ipAddressDao = visitor.getVirtualNetworkApplianceFactory().getIpAddressDao();
ipAddressDao.unassignIpAddress(routerPublicIPFinal.getId());
}
});
throw new CloudRuntimeException("failed to configure ip alias on the router as a part of dhcp config");
}
}
return true;
}
return true;
}
public NicIpAliasVO getNicAlias() {
return _nicAlias;
}
public String getRouterAliasIp() {
return _routerAliasIp;
}
}

View File

@ -0,0 +1,94 @@
// 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.rules;
import java.util.ArrayList;
import java.util.List;
import org.apache.cloudstack.network.topology.NetworkTopologyVisitor;
import com.cloud.exception.ResourceUnavailableException;
import com.cloud.network.Network;
import com.cloud.network.NetworkModel;
import com.cloud.network.dao.LoadBalancerDao;
import com.cloud.network.dao.LoadBalancerVO;
import com.cloud.network.lb.LoadBalancingRule;
import com.cloud.network.lb.LoadBalancingRule.LbDestination;
import com.cloud.network.lb.LoadBalancingRule.LbHealthCheckPolicy;
import com.cloud.network.lb.LoadBalancingRule.LbSslCert;
import com.cloud.network.lb.LoadBalancingRule.LbStickinessPolicy;
import com.cloud.network.lb.LoadBalancingRulesManager;
import com.cloud.network.router.VirtualRouter;
import com.cloud.network.rules.FirewallRule.Purpose;
import com.cloud.network.rules.LoadBalancerContainer.Scheme;
import com.cloud.utils.net.Ip;
public class FirewallRules extends RuleApplier {
private final List<? extends FirewallRule> _rules;
private List<LoadBalancingRule> _loadbalancingRules;
private Purpose _purpose;
public FirewallRules(final Network network, final List<? extends FirewallRule> rules) {
super(network);
_rules = rules;
}
@Override
public boolean accept(final NetworkTopologyVisitor visitor, final VirtualRouter router) throws ResourceUnavailableException {
_router = router;
_purpose = _rules.get(0).getPurpose();
if (_purpose == Purpose.LoadBalancing) {
LoadBalancerDao loadBalancerDao = visitor.getVirtualNetworkApplianceFactory().getLoadBalancerDao();
// for load balancer we have to resend all lb rules for the network
final List<LoadBalancerVO> lbs = loadBalancerDao.listByNetworkIdAndScheme(_network.getId(), Scheme.Public);
_loadbalancingRules = new ArrayList<LoadBalancingRule>();
LoadBalancingRulesManager lbMgr = visitor.getVirtualNetworkApplianceFactory().getLbMgr();
NetworkModel networkModel = visitor.getVirtualNetworkApplianceFactory().getNetworkModel();
for (final LoadBalancerVO lb : lbs) {
final List<LbDestination> dstList = lbMgr.getExistingDestinations(lb.getId());
final List<LbStickinessPolicy> policyList = lbMgr.getStickinessPolicies(lb.getId());
final List<LbHealthCheckPolicy> hcPolicyList = lbMgr.getHealthCheckPolicies(lb.getId());
final LbSslCert sslCert = lbMgr.getLbSslCert(lb.getId());
final Ip sourceIp = networkModel.getPublicIpAddress(lb.getSourceIpAddressId()).getAddress();
final LoadBalancingRule loadBalancing = new LoadBalancingRule(lb, dstList, policyList, hcPolicyList, sourceIp, sslCert, lb.getLbProtocol());
_loadbalancingRules.add(loadBalancing);
}
}
return visitor.visit(this);
}
public List<? extends FirewallRule> getRules() {
return _rules;
}
public List<LoadBalancingRule> getLoadbalancingRules() {
return _loadbalancingRules;
}
public Purpose getPurpose() {
return _purpose;
}
}

View File

@ -0,0 +1,48 @@
// 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.rules;
import java.util.List;
import org.apache.cloudstack.network.topology.NetworkTopologyVisitor;
import com.cloud.exception.ResourceUnavailableException;
import com.cloud.network.Network;
import com.cloud.network.PublicIpAddress;
import com.cloud.network.router.VirtualRouter;
public class IpAssociationRules extends RuleApplier {
private final List<? extends PublicIpAddress> _ipAddresses;
public IpAssociationRules(final Network network, final List<? extends PublicIpAddress> ipAddresses) {
super(network);
_ipAddresses = ipAddresses;
}
@Override
public boolean accept(final NetworkTopologyVisitor visitor, final VirtualRouter router) throws ResourceUnavailableException {
_router = router;
return visitor.visit(this);
}
public List<? extends PublicIpAddress> getIpAddresses() {
return _ipAddresses;
}
}

View File

@ -0,0 +1,79 @@
// 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.rules;
import java.util.List;
import org.apache.cloudstack.network.topology.NetworkTopologyVisitor;
import com.cloud.exception.ResourceUnavailableException;
import com.cloud.network.Network;
import com.cloud.network.NetworkModel;
import com.cloud.network.dao.LoadBalancerDao;
import com.cloud.network.dao.LoadBalancerVO;
import com.cloud.network.lb.LoadBalancingRule;
import com.cloud.network.lb.LoadBalancingRule.LbDestination;
import com.cloud.network.lb.LoadBalancingRule.LbHealthCheckPolicy;
import com.cloud.network.lb.LoadBalancingRule.LbSslCert;
import com.cloud.network.lb.LoadBalancingRule.LbStickinessPolicy;
import com.cloud.network.lb.LoadBalancingRulesManager;
import com.cloud.network.router.VirtualRouter;
import com.cloud.network.rules.LoadBalancerContainer.Scheme;
import com.cloud.utils.net.Ip;
public class LoadBalancingRules extends RuleApplier {
private final List<LoadBalancingRule> _rules;
public LoadBalancingRules(final Network network, final List<LoadBalancingRule> rules) {
super(network);
_rules = rules;
}
@Override
public boolean accept(final NetworkTopologyVisitor visitor, final VirtualRouter router) throws ResourceUnavailableException {
_router = router;
LoadBalancerDao loadBalancerDao = visitor.getVirtualNetworkApplianceFactory().getLoadBalancerDao();
// For load balancer we have to resend all lb rules for the network
final List<LoadBalancerVO> lbs = loadBalancerDao.listByNetworkIdAndScheme(_network.getId(), Scheme.Public);
// We are cleaning it before because all the rules have to be sent to the router.
_rules.clear();
LoadBalancingRulesManager lbMgr = visitor.getVirtualNetworkApplianceFactory().getLbMgr();
NetworkModel networkModel = visitor.getVirtualNetworkApplianceFactory().getNetworkModel();
for (final LoadBalancerVO lb : lbs) {
final List<LbDestination> dstList = lbMgr.getExistingDestinations(lb.getId());
final List<LbStickinessPolicy> policyList = lbMgr.getStickinessPolicies(lb.getId());
final List<LbHealthCheckPolicy> hcPolicyList = lbMgr.getHealthCheckPolicies(lb.getId());
final LbSslCert sslCert = lbMgr.getLbSslCert(lb.getId());
final Ip sourceIp = networkModel.getPublicIpAddress(lb.getSourceIpAddressId()).getAddress();
final LoadBalancingRule loadBalancing = new LoadBalancingRule(lb, dstList, policyList, hcPolicyList, sourceIp, sslCert, lb.getLbProtocol());
_rules.add(loadBalancing);
}
return visitor.visit(this);
}
public List<LoadBalancingRule> getRules() {
return _rules;
}
}

View File

@ -0,0 +1,54 @@
// 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.rules;
import java.util.List;
import org.apache.cloudstack.network.topology.NetworkTopologyVisitor;
import com.cloud.exception.ResourceUnavailableException;
import com.cloud.network.Network;
import com.cloud.network.router.VirtualRouter;
import com.cloud.network.vpc.NetworkACLItem;
public class NetworkAclsRules extends RuleApplier {
private final List<? extends NetworkACLItem> _rules;
private final boolean _isPrivateGateway;
public NetworkAclsRules(final Network network, final List<? extends NetworkACLItem> rules, final boolean isPrivateGateway) {
super(network);
_rules = rules;
_isPrivateGateway = isPrivateGateway;
}
@Override
public boolean accept(final NetworkTopologyVisitor visitor, final VirtualRouter router) throws ResourceUnavailableException {
_router = router;
return visitor.visit(this);
}
public List<? extends NetworkACLItem> getRules() {
return _rules;
}
public boolean isPrivateGateway() {
return _isPrivateGateway;
}
}

View File

@ -0,0 +1,218 @@
// 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.rules;
import java.net.URI;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import org.apache.cloudstack.network.topology.NetworkTopologyVisitor;
import org.apache.log4j.Logger;
import com.cloud.agent.api.Command;
import com.cloud.agent.api.NetworkUsageCommand;
import com.cloud.agent.manager.Commands;
import com.cloud.exception.ConcurrentOperationException;
import com.cloud.exception.InsufficientCapacityException;
import com.cloud.exception.ResourceUnavailableException;
import com.cloud.network.IpAddress;
import com.cloud.network.Network;
import com.cloud.network.NetworkModel;
import com.cloud.network.Networks.BroadcastDomainType;
import com.cloud.network.Networks.IsolationType;
import com.cloud.network.PublicIpAddress;
import com.cloud.network.router.VirtualRouter;
import com.cloud.network.vpc.VpcManager;
import com.cloud.network.vpc.VpcVO;
import com.cloud.network.vpc.dao.VpcDao;
import com.cloud.user.UserStatisticsVO;
import com.cloud.user.dao.UserStatisticsDao;
import com.cloud.utils.Pair;
import com.cloud.vm.Nic;
import com.cloud.vm.NicProfile;
import com.cloud.vm.NicVO;
import com.cloud.vm.VirtualMachineManager;
import com.cloud.vm.dao.NicDao;
public class NicPlugInOutRules extends RuleApplier {
private static final Logger s_logger = Logger.getLogger(NicPlugInOutRules.class);
private final List<? extends PublicIpAddress> _ipAddresses;
private Commands _netUsageCommands;
public NicPlugInOutRules(final Network network, final List<? extends PublicIpAddress> ipAddresses) {
super(network);
_ipAddresses = ipAddresses;
}
@Override
public boolean accept(final NetworkTopologyVisitor visitor, final VirtualRouter router) throws ResourceUnavailableException {
_router = router;
Pair<Map<String, PublicIpAddress>, Map<String, PublicIpAddress>> nicsToChange = getNicsToChangeOnRouter(visitor);
Map<String, PublicIpAddress> nicsToPlug = nicsToChange.first();
Map<String, PublicIpAddress> nicsToUnplug = nicsToChange.second();
NetworkModel networkModel = visitor.getVirtualNetworkApplianceFactory().getNetworkModel();
VirtualMachineManager itMgr = visitor.getVirtualNetworkApplianceFactory().getItMgr();
// 1) Unplug the nics
for (Entry<String, PublicIpAddress> entry : nicsToUnplug.entrySet()) {
Network publicNtwk = null;
try {
publicNtwk = networkModel.getNetwork(entry.getValue().getNetworkId());
URI broadcastUri = BroadcastDomainType.Vlan.toUri(entry.getKey());
itMgr.removeVmFromNetwork(_router, publicNtwk, broadcastUri);
} catch (ConcurrentOperationException e) {
s_logger.warn("Failed to remove router " + _router + " from vlan " + entry.getKey() + " in public network " + publicNtwk + " due to ", e);
return false;
}
}
_netUsageCommands = new Commands(Command.OnError.Continue);
VpcDao vpcDao = visitor.getVirtualNetworkApplianceFactory().getVpcDao();
VpcVO vpc = vpcDao.findById(_router.getVpcId());
// 2) Plug the nics
for (String vlanTag : nicsToPlug.keySet()) {
PublicIpAddress ip = nicsToPlug.get(vlanTag);
// have to plug the nic(s)
NicProfile defaultNic = new NicProfile();
if (ip.isSourceNat()) {
defaultNic.setDefaultNic(true);
}
defaultNic.setIp4Address(ip.getAddress().addr());
defaultNic.setGateway(ip.getGateway());
defaultNic.setNetmask(ip.getNetmask());
defaultNic.setMacAddress(ip.getMacAddress());
defaultNic.setBroadcastType(BroadcastDomainType.Vlan);
defaultNic.setBroadcastUri(BroadcastDomainType.Vlan.toUri(ip.getVlanTag()));
defaultNic.setIsolationUri(IsolationType.Vlan.toUri(ip.getVlanTag()));
NicProfile publicNic = null;
Network publicNtwk = null;
try {
publicNtwk = networkModel.getNetwork(ip.getNetworkId());
publicNic = itMgr.addVmToNetwork(_router, publicNtwk, defaultNic);
} catch (ConcurrentOperationException e) {
s_logger.warn("Failed to add router " + _router + " to vlan " + vlanTag + " in public network " + publicNtwk + " due to ", e);
} catch (InsufficientCapacityException e) {
s_logger.warn("Failed to add router " + _router + " to vlan " + vlanTag + " in public network " + publicNtwk + " due to ", e);
} finally {
if (publicNic == null) {
s_logger.warn("Failed to add router " + _router + " to vlan " + vlanTag + " in public network " + publicNtwk);
return false;
}
}
// Create network usage commands. Send commands to router after
// IPAssoc
NetworkUsageCommand netUsageCmd = new NetworkUsageCommand(_router.getPrivateIpAddress(), _router.getInstanceName(), true, defaultNic.getIp4Address(), vpc.getCidr());
_netUsageCommands.addCommand(netUsageCmd);
UserStatisticsDao userStatsDao = visitor.getVirtualNetworkApplianceFactory().getUserStatsDao();
UserStatisticsVO stats = userStatsDao.findBy(_router.getAccountId(), _router.getDataCenterId(), publicNtwk.getId(), publicNic.getIp4Address(), _router.getId(),
_router.getType().toString());
if (stats == null) {
stats = new UserStatisticsVO(_router.getAccountId(), _router.getDataCenterId(), publicNic.getIp4Address(), _router.getId(), _router.getType().toString(),
publicNtwk.getId());
userStatsDao.persist(stats);
}
}
// The visit will be done from the AdvancedNetworkTopology, after the
// VpcIpAssociation is done.
return true;
}
public List<? extends PublicIpAddress> getIpAddresses() {
return _ipAddresses;
}
public Commands getNetUsageCommands() {
return _netUsageCommands;
}
private Pair<Map<String, PublicIpAddress>, Map<String, PublicIpAddress>> getNicsToChangeOnRouter(final NetworkTopologyVisitor visitor) {
// 1) check which nics need to be plugged/unplugged and plug/unplug them
final Map<String, PublicIpAddress> nicsToPlug = new HashMap<String, PublicIpAddress>();
final Map<String, PublicIpAddress> nicsToUnplug = new HashMap<String, PublicIpAddress>();
VpcManager vpcMgr = visitor.getVirtualNetworkApplianceFactory().getVpcMgr();
NicDao nicDao = visitor.getVirtualNetworkApplianceFactory().getNicDao();
// find out nics to unplug
for (PublicIpAddress ip : _ipAddresses) {
long publicNtwkId = ip.getNetworkId();
// if ip is not associated to any network, and there are no firewall
// rules, release it on the backend
if (!vpcMgr.isIpAllocatedToVpc(ip)) {
ip.setState(IpAddress.State.Releasing);
}
if (ip.getState() == IpAddress.State.Releasing) {
Nic nic = nicDao.findByIp4AddressAndNetworkIdAndInstanceId(publicNtwkId, _router.getId(), ip.getAddress().addr());
if (nic != null) {
nicsToUnplug.put(ip.getVlanTag(), ip);
s_logger.debug("Need to unplug the nic for ip=" + ip + "; vlan=" + ip.getVlanTag() + " in public network id =" + publicNtwkId);
}
}
}
// find out nics to plug
for (PublicIpAddress ip : _ipAddresses) {
URI broadcastUri = BroadcastDomainType.Vlan.toUri(ip.getVlanTag());
long publicNtwkId = ip.getNetworkId();
// if ip is not associated to any network, and there are no firewall
// rules, release it on the backend
if (!vpcMgr.isIpAllocatedToVpc(ip)) {
ip.setState(IpAddress.State.Releasing);
}
if (ip.getState() == IpAddress.State.Allocated || ip.getState() == IpAddress.State.Allocating) {
// nic has to be plugged only when there are no nics for this
// vlan tag exist on VR
Nic nic = nicDao.findByNetworkIdInstanceIdAndBroadcastUri(publicNtwkId, _router.getId(), broadcastUri.toString());
if (nic == null && nicsToPlug.get(ip.getVlanTag()) == null) {
nicsToPlug.put(ip.getVlanTag(), ip);
s_logger.debug("Need to plug the nic for ip=" + ip + "; vlan=" + ip.getVlanTag() + " in public network id =" + publicNtwkId);
} else {
final PublicIpAddress nicToUnplug = nicsToUnplug.get(ip.getVlanTag());
if (nicToUnplug != null) {
NicVO nicVO = nicDao.findByIp4AddressAndNetworkIdAndInstanceId(publicNtwkId, _router.getId(), nicToUnplug.getAddress().addr());
nicVO.setIp4Address(ip.getAddress().addr());
nicDao.update(nicVO.getId(), nicVO);
s_logger.debug("Updated the nic " + nicVO + " with the new ip address " + ip.getAddress().addr());
nicsToUnplug.remove(ip.getVlanTag());
}
}
}
}
Pair<Map<String, PublicIpAddress>, Map<String, PublicIpAddress>> nicsToChange = new Pair<Map<String, PublicIpAddress>, Map<String, PublicIpAddress>>(nicsToPlug,
nicsToUnplug);
return nicsToChange;
}
}

View File

@ -0,0 +1,66 @@
// 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.rules;
import org.apache.cloudstack.network.topology.NetworkTopologyVisitor;
import com.cloud.exception.ResourceUnavailableException;
import com.cloud.network.Network;
import com.cloud.network.router.VirtualRouter;
import com.cloud.vm.NicProfile;
import com.cloud.vm.NicVO;
import com.cloud.vm.UserVmVO;
import com.cloud.vm.VirtualMachineProfile;
import com.cloud.vm.dao.NicDao;
import com.cloud.vm.dao.UserVmDao;
public class PasswordToRouterRules extends RuleApplier {
private final NicProfile nic;
private final VirtualMachineProfile profile;
private NicVO nicVo;
public PasswordToRouterRules(final Network network, final NicProfile nic, final VirtualMachineProfile profile) {
super(network);
this.nic = nic;
this.profile = profile;
}
@Override
public boolean accept(final NetworkTopologyVisitor visitor, final VirtualRouter router) throws ResourceUnavailableException {
_router = router;
UserVmDao userVmDao = visitor.getVirtualNetworkApplianceFactory().getUserVmDao();
userVmDao.loadDetails((UserVmVO) profile.getVirtualMachine());
// for basic zone, send vm data/password information only to the router in the same pod
NicDao nicDao = visitor.getVirtualNetworkApplianceFactory().getNicDao();
nicVo = nicDao.findById(nic.getId());
return visitor.visit(this);
}
public VirtualMachineProfile getProfile() {
return profile;
}
public NicVO getNicVo() {
return nicVo;
}
}

View File

@ -0,0 +1,150 @@
// 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.rules;
import org.apache.cloudstack.network.topology.NetworkTopologyVisitor;
import org.apache.log4j.Logger;
import com.cloud.exception.ConcurrentOperationException;
import com.cloud.exception.ResourceUnavailableException;
import com.cloud.network.Network;
import com.cloud.network.NetworkModel;
import com.cloud.network.dao.NetworkDao;
import com.cloud.network.router.NetworkHelper;
import com.cloud.network.router.NicProfileHelper;
import com.cloud.network.router.VirtualRouter;
import com.cloud.network.vpc.NetworkACLManager;
import com.cloud.network.vpc.PrivateGateway;
import com.cloud.network.vpc.PrivateIpVO;
import com.cloud.vm.NicProfile;
import com.cloud.vm.VirtualMachineManager;
public class PrivateGatewayRules extends RuleApplier {
private static final Logger s_logger = Logger.getLogger(PrivateGatewayRules.class);
private final PrivateGateway _privateGateway;
private boolean _isAddOperation;
private NicProfile _nicProfile;
public PrivateGatewayRules(final PrivateGateway privateGateway) {
super(null);
_privateGateway = privateGateway;
}
@Override
public boolean accept(final NetworkTopologyVisitor visitor, final VirtualRouter router) throws ResourceUnavailableException {
_router = router;
boolean result = false;
try {
NetworkModel networkModel = visitor.getVirtualNetworkApplianceFactory().getNetworkModel();
_network = networkModel.getNetwork(_privateGateway.getNetworkId());
NicProfileHelper nicProfileHelper = visitor.getVirtualNetworkApplianceFactory().getNicProfileHelper();
NicProfile requested = nicProfileHelper.createPrivateNicProfileForGateway(_privateGateway);
NetworkHelper networkHelper = visitor.getVirtualNetworkApplianceFactory().getNetworkHelper();
if (!networkHelper.checkRouterVersion(_router)) {
s_logger.warn("Router requires upgrade. Unable to send command to router: " + _router.getId());
return false;
}
VirtualMachineManager itMgr = visitor.getVirtualNetworkApplianceFactory().getItMgr();
_nicProfile = itMgr.addVmToNetwork(_router, _network, requested);
// setup source nat
if (_nicProfile != null) {
_isAddOperation = true;
// result = setupVpcPrivateNetwork(router, true, guestNic);
result = visitor.visit(this);
}
} catch (Exception ex) {
s_logger.warn("Failed to create private gateway " + _privateGateway + " on router " + _router + " due to ", ex);
} finally {
if (!result) {
s_logger.debug("Failed to setup gateway " + _privateGateway + " on router " + _router + " with the source nat. Will now remove the gateway.");
_isAddOperation = false;
boolean isRemoved = destroyPrivateGateway(visitor);
if (isRemoved) {
s_logger.debug("Removed the gateway " + _privateGateway + " from router " + _router + " as a part of cleanup");
} else {
s_logger.warn("Failed to remove the gateway " + _privateGateway + " from router " + _router + " as a part of cleanup");
}
}
}
return result;
}
public boolean isAddOperation() {
return _isAddOperation;
}
public NicProfile getNicProfile() {
return _nicProfile;
}
public PrivateIpVO retrivePrivateIP(final NetworkTopologyVisitor visitor) {
PrivateIpVO ipVO = visitor.getVirtualNetworkApplianceFactory().getPrivateIpDao().findByIpAndSourceNetworkId(_nicProfile.getNetworkId(), _nicProfile.getIp4Address());
return ipVO;
}
public Network retrievePrivateNetwork(final NetworkTopologyVisitor visitor) {
// This network might be the same we have already as an instance in the
// RuleApplier super class.
// Just doing this here, but will double check is remove if it's not
// needed.
NetworkDao networkDao = visitor.getVirtualNetworkApplianceFactory().getNetworkDao();
Network network = networkDao.findById(_nicProfile.getNetworkId());
return network;
}
protected boolean destroyPrivateGateway(final NetworkTopologyVisitor visitor) throws ConcurrentOperationException, ResourceUnavailableException {
NetworkModel networkModel = visitor.getVirtualNetworkApplianceFactory().getNetworkModel();
if (!networkModel.isVmPartOfNetwork(_router.getId(), _privateGateway.getNetworkId())) {
s_logger.debug("Router doesn't have nic for gateway " + _privateGateway + " so no need to removed it");
return true;
}
Network privateNetwork = networkModel.getNetwork(_privateGateway.getNetworkId());
s_logger.debug("Releasing private ip for gateway " + _privateGateway + " from " + _router);
_nicProfile = networkModel.getNicProfile(_router, privateNetwork.getId(), null);
boolean result = visitor.visit(this);
if (!result) {
s_logger.warn("Failed to release private ip for gateway " + _privateGateway + " on router " + _router);
return false;
}
// revoke network acl on the private gateway.
NetworkACLManager networkACLMgr = visitor.getVirtualNetworkApplianceFactory().getNetworkACLMgr();
if (!networkACLMgr.revokeACLItemsForPrivateGw(_privateGateway)) {
s_logger.debug("Failed to delete network acl items on " + _privateGateway + " from router " + _router);
return false;
}
s_logger.debug("Removing router " + _router + " from private network " + privateNetwork + " as a part of delete private gateway");
VirtualMachineManager itMgr = visitor.getVirtualNetworkApplianceFactory().getItMgr();
result = result && itMgr.removeVmFromNetwork(_router, privateNetwork, null);
s_logger.debug("Private gateawy " + _privateGateway + " is removed from router " + _router);
return result;
}
}

View File

@ -0,0 +1,45 @@
// 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.rules;
import org.apache.cloudstack.network.topology.NetworkTopologyVisitor;
import com.cloud.exception.ResourceUnavailableException;
import com.cloud.network.Network;
import com.cloud.network.router.VirtualRouter;
public abstract class RuleApplier {
protected Network _network;
protected VirtualRouter _router;
public RuleApplier(final Network network) {
_network = network;
}
public Network getNetwork() {
return _network;
}
public VirtualRouter getRouter() {
return _router;
}
public abstract boolean accept(NetworkTopologyVisitor visitor, VirtualRouter router) throws ResourceUnavailableException;
}

View File

@ -0,0 +1,32 @@
// 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.rules;
public class RuleApplierWrapper<T> {
private final T _ruleType;
public RuleApplierWrapper(final T ruleApplier) {
this._ruleType = ruleApplier;
}
public T getRuleType() {
return _ruleType;
}
}

View File

@ -0,0 +1,89 @@
// 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.rules;
import org.apache.cloudstack.network.topology.NetworkTopologyVisitor;
import com.cloud.exception.ResourceUnavailableException;
import com.cloud.network.Network;
import com.cloud.network.router.VirtualRouter;
import com.cloud.storage.VMTemplateVO;
import com.cloud.storage.dao.VMTemplateDao;
import com.cloud.vm.NicProfile;
import com.cloud.vm.NicVO;
import com.cloud.vm.UserVmVO;
import com.cloud.vm.VirtualMachineProfile;
import com.cloud.vm.dao.NicDao;
import com.cloud.vm.dao.UserVmDao;
public class SshKeyToRouterRules extends RuleApplier {
private final NicProfile _nic;
private final VirtualMachineProfile _profile;
private final String _sshPublicKey;
private NicVO _nicVo;
private VMTemplateVO _template;
private UserVmVO _userVM;
public SshKeyToRouterRules(final Network network, final NicProfile nic, final VirtualMachineProfile profile, final String sshPublicKey) {
super(network);
_nic = nic;
_profile = profile;
_sshPublicKey = sshPublicKey;
}
@Override
public boolean accept(final NetworkTopologyVisitor visitor, final VirtualRouter router) throws ResourceUnavailableException {
_router = router;
UserVmDao userVmDao = visitor.getVirtualNetworkApplianceFactory().getUserVmDao();
_userVM = userVmDao.findById(_profile.getVirtualMachine().getId());
userVmDao.loadDetails(_userVM);
NicDao nicDao = visitor.getVirtualNetworkApplianceFactory().getNicDao();
_nicVo = nicDao.findById(_nic.getId());
// for basic zone, send vm data/password information only to the router in the same pod
VMTemplateDao templateDao = visitor.getVirtualNetworkApplianceFactory().getTemplateDao();
_template = templateDao.findByIdIncludingRemoved(_profile.getTemplateId());
return visitor.visit(this);
}
public VirtualMachineProfile getProfile() {
return _profile;
}
public String getSshPublicKey() {
return _sshPublicKey;
}
public UserVmVO getUserVM() {
return _userVM;
}
public NicVO getNicVo() {
return _nicVo;
}
public VMTemplateVO getTemplate() {
return _template;
}
}

View File

@ -0,0 +1,46 @@
// 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.rules;
import java.util.List;
import org.apache.cloudstack.network.topology.NetworkTopologyVisitor;
import com.cloud.exception.ResourceUnavailableException;
import com.cloud.network.Network;
import com.cloud.network.router.VirtualRouter;
public class StaticNatRules extends RuleApplier {
private final List<? extends StaticNat> _rules;
public StaticNatRules(final Network network, final List<? extends StaticNat> rules) {
super(network);
_rules = rules;
}
public List<? extends StaticNat> getRules() {
return _rules;
}
@Override
public boolean accept(final NetworkTopologyVisitor visitor, final VirtualRouter router) throws ResourceUnavailableException {
_router = router;
return visitor.visit(this);
}
}

View File

@ -0,0 +1,47 @@
// 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.rules;
import java.util.List;
import org.apache.cloudstack.network.topology.NetworkTopologyVisitor;
import com.cloud.exception.ResourceUnavailableException;
import com.cloud.network.router.VirtualRouter;
import com.cloud.network.vpc.StaticRouteProfile;
public class StaticRoutesRules extends RuleApplier {
private final List<StaticRouteProfile> staticRoutes;
public StaticRoutesRules(final List<StaticRouteProfile> staticRoutes) {
super(null);
this.staticRoutes = staticRoutes;
}
public List<StaticRouteProfile> getStaticRoutes() {
return staticRoutes;
}
@Override
public boolean accept(final NetworkTopologyVisitor visitor, final VirtualRouter router) throws ResourceUnavailableException {
_router = router;
return visitor.visit(this);
}
}

View File

@ -0,0 +1,80 @@
// 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.rules;
import org.apache.cloudstack.network.topology.NetworkTopologyVisitor;
import com.cloud.deploy.DeployDestination;
import com.cloud.exception.ResourceUnavailableException;
import com.cloud.network.Network;
import com.cloud.network.router.VirtualRouter;
import com.cloud.vm.NicProfile;
import com.cloud.vm.NicVO;
import com.cloud.vm.UserVmVO;
import com.cloud.vm.VirtualMachineProfile;
import com.cloud.vm.dao.NicDao;
import com.cloud.vm.dao.UserVmDao;
public class UserdataPwdRules extends RuleApplier {
private final NicProfile _nic;
private final VirtualMachineProfile _profile;
private final DeployDestination _destination;
private NicVO _nicVo;
private UserVmVO _userVM;
public UserdataPwdRules(final Network network, final NicProfile nic, final VirtualMachineProfile profile, final DeployDestination destination) {
super(network);
_nic = nic;
_profile = profile;
_destination = destination;
}
@Override
public boolean accept(final NetworkTopologyVisitor visitor, final VirtualRouter router) throws ResourceUnavailableException {
_router = router;
UserVmDao userVmDao = visitor.getVirtualNetworkApplianceFactory().getUserVmDao();
_userVM = userVmDao.findById(_profile.getId());
userVmDao.loadDetails(_userVM);
//for basic zone, send vm data/password information only to the router in the same pod
NicDao nicDao = visitor.getVirtualNetworkApplianceFactory().getNicDao();
_nicVo = nicDao.findById(_nic.getId());
return visitor.visit(this);
}
public VirtualMachineProfile getProfile() {
return _profile;
}
public DeployDestination getDestination() {
return _destination;
}
public NicVO getNicVo() {
return _nicVo;
}
public UserVmVO getUserVM() {
return _userVM;
}
}

View File

@ -0,0 +1,69 @@
// 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.rules;
import org.apache.cloudstack.network.topology.NetworkTopologyVisitor;
import com.cloud.exception.ResourceUnavailableException;
import com.cloud.network.Network;
import com.cloud.network.router.VirtualRouter;
import com.cloud.vm.NicProfile;
import com.cloud.vm.NicVO;
import com.cloud.vm.UserVmVO;
import com.cloud.vm.VirtualMachineProfile;
import com.cloud.vm.dao.NicDao;
import com.cloud.vm.dao.UserVmDao;
public class UserdataToRouterRules extends RuleApplier {
private final NicProfile _nic;
private final VirtualMachineProfile _profile;
private NicVO _nicVo;
private UserVmVO _userVM;
public UserdataToRouterRules(final Network network, final NicProfile nic, final VirtualMachineProfile profile) {
super(network);
_nic = nic;
_profile = profile;
}
@Override
public boolean accept(final NetworkTopologyVisitor visitor, final VirtualRouter router) throws ResourceUnavailableException {
_router = router;
UserVmDao userVmDao = visitor.getVirtualNetworkApplianceFactory().getUserVmDao();
_userVM = userVmDao.findById(_profile.getVirtualMachine().getId());
userVmDao.loadDetails(_userVM);
// for basic zone, send vm data/password information only to the router in the same pod
NicDao nicDao = visitor.getVirtualNetworkApplianceFactory().getNicDao();
_nicVo = nicDao.findById(_nic.getId());
return visitor.visit(this);
}
public NicVO getNicVo() {
return _nicVo;
}
public UserVmVO getUserVM() {
return _userVM;
}
}

View File

@ -0,0 +1,177 @@
// 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.rules;
import javax.inject.Inject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import com.cloud.dc.dao.DataCenterDao;
import com.cloud.dc.dao.HostPodDao;
import com.cloud.dc.dao.VlanDao;
import com.cloud.network.IpAddressManager;
import com.cloud.network.NetworkModel;
import com.cloud.network.dao.IPAddressDao;
import com.cloud.network.dao.LoadBalancerDao;
import com.cloud.network.dao.NetworkDao;
import com.cloud.network.lb.LoadBalancingRulesManager;
import com.cloud.network.router.NetworkHelper;
import com.cloud.network.router.NicProfileHelper;
import com.cloud.network.vpc.NetworkACLManager;
import com.cloud.network.vpc.VpcManager;
import com.cloud.network.vpc.dao.PrivateIpDao;
import com.cloud.network.vpc.dao.VpcDao;
import com.cloud.storage.dao.VMTemplateDao;
import com.cloud.user.dao.UserStatisticsDao;
import com.cloud.vm.VirtualMachineManager;
import com.cloud.vm.dao.NicDao;
import com.cloud.vm.dao.NicIpAliasDao;
import com.cloud.vm.dao.UserVmDao;
public class VirtualNetworkApplianceFactory {
@Inject
private NetworkModel _networkModel;
@Inject
private LoadBalancingRulesManager _lbMgr;
@Inject
private LoadBalancerDao _loadBalancerDao;
@Inject
private NicDao _nicDao;
@Inject
private VirtualMachineManager _itMgr;
@Inject
private DataCenterDao _dcDao;
@Inject
private UserVmDao _userVmDao;
@Inject
private UserStatisticsDao _userStatsDao;
@Inject
private VpcDao _vpcDao;
@Inject
private VpcManager _vpcMgr;
@Inject
private VMTemplateDao _templateDao;
@Inject
private NetworkDao _networkDao;
@Inject
private NicIpAliasDao _nicIpAliasDao;
@Inject
private HostPodDao _podDao;
@Inject
private VlanDao _vlanDao;
@Inject
private IPAddressDao _ipAddressDao;
@Inject
private PrivateIpDao _privateIpDao;
@Inject
private IpAddressManager _ipAddrMgr;
@Inject
private NetworkACLManager _networkACLMgr;
@Autowired
@Qualifier("networkHelper")
private NetworkHelper _networkHelper;
@Inject
private NicProfileHelper _nicProfileHelper;
public NetworkModel getNetworkModel() {
return _networkModel;
}
public LoadBalancingRulesManager getLbMgr() {
return _lbMgr;
}
public LoadBalancerDao getLoadBalancerDao() {
return _loadBalancerDao;
}
public NicDao getNicDao() {
return _nicDao;
}
public VirtualMachineManager getItMgr() {
return _itMgr;
}
public DataCenterDao getDcDao() {
return _dcDao;
}
public UserVmDao getUserVmDao() {
return _userVmDao;
}
public UserStatisticsDao getUserStatsDao() {
return _userStatsDao;
}
public VpcDao getVpcDao() {
return _vpcDao;
}
public VpcManager getVpcMgr() {
return _vpcMgr;
}
public VMTemplateDao getTemplateDao() {
return _templateDao;
}
public NetworkDao getNetworkDao() {
return _networkDao;
}
public NicIpAliasDao getNicIpAliasDao() {
return _nicIpAliasDao;
}
public HostPodDao getPodDao() {
return _podDao;
}
public VlanDao getVlanDao() {
return _vlanDao;
}
public IPAddressDao getIpAddressDao() {
return _ipAddressDao;
}
public PrivateIpDao getPrivateIpDao() {
return _privateIpDao;
}
public IpAddressManager getIpAddrMgr() {
return _ipAddrMgr;
}
public NetworkACLManager getNetworkACLMgr() {
return _networkACLMgr;
}
public NetworkHelper getNetworkHelper() {
return _networkHelper;
}
public NicProfileHelper getNicProfileHelper() {
return _nicProfileHelper;
}
}

View File

@ -0,0 +1,92 @@
// 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.rules;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.cloudstack.network.topology.NetworkTopologyVisitor;
import org.apache.log4j.Logger;
import com.cloud.exception.ResourceUnavailableException;
import com.cloud.network.IpAddress;
import com.cloud.network.Network;
import com.cloud.network.Networks.BroadcastDomainType;
import com.cloud.network.PublicIpAddress;
import com.cloud.network.router.VirtualRouter;
import com.cloud.utils.exception.CloudRuntimeException;
import com.cloud.vm.Nic;
import com.cloud.vm.dao.NicDao;
public class VpcIpAssociationRules extends RuleApplier {
private static final Logger s_logger = Logger.getLogger(VpcIpAssociationRules.class);
private final List<? extends PublicIpAddress> _ipAddresses;
private Map<String, String> _vlanMacAddress;
private List<PublicIpAddress> _ipsToSend;
public VpcIpAssociationRules(final Network network, final List<? extends PublicIpAddress> ipAddresses) {
super(network);
_ipAddresses = ipAddresses;
}
@Override
public boolean accept(final NetworkTopologyVisitor visitor, final VirtualRouter router) throws ResourceUnavailableException {
_router = router;
_vlanMacAddress = new HashMap<String, String>();
_ipsToSend = new ArrayList<PublicIpAddress>();
NicDao nicDao = visitor.getVirtualNetworkApplianceFactory().getNicDao();
for (PublicIpAddress ipAddr : _ipAddresses) {
String broadcastURI = BroadcastDomainType.Vlan.toUri(ipAddr.getVlanTag()).toString();
Nic nic = nicDao.findByNetworkIdInstanceIdAndBroadcastUri(ipAddr.getNetworkId(), _router.getId(), broadcastURI);
String macAddress = null;
if (nic == null) {
if (ipAddr.getState() != IpAddress.State.Releasing) {
throw new CloudRuntimeException("Unable to find the nic in network " + ipAddr.getNetworkId() + " to apply the ip address " + ipAddr + " for");
}
s_logger.debug("Not sending release for ip address " + ipAddr + " as its nic is already gone from VPC router " + _router);
} else {
macAddress = nic.getMacAddress();
_vlanMacAddress.put(BroadcastDomainType.getValue(BroadcastDomainType.fromString(ipAddr.getVlanTag())), macAddress);
_ipsToSend.add(ipAddr);
}
}
return visitor.visit(this);
}
public List<? extends PublicIpAddress> getIpAddresses() {
return _ipAddresses;
}
public Map<String, String> getVlanMacAddress() {
return _vlanMacAddress;
}
public List<PublicIpAddress> getIpsToSend() {
return _ipsToSend;
}
}

View File

@ -20,6 +20,7 @@ package com.cloud.network.vpc;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
@ -31,6 +32,7 @@ import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
import javax.annotation.PostConstruct;
import javax.ejb.Local;
import javax.inject.Inject;
import javax.naming.ConfigurationException;
@ -214,6 +216,18 @@ public class VpcManagerImpl extends ManagerBase implements VpcManager, VpcProvis
int _maxNetworks;
SearchBuilder<IPAddressVO> IpAddressSearch;
protected final List<HypervisorType> hTypes = new ArrayList<HypervisorType>();
@PostConstruct
protected void setupSupportedVpcHypervisorsList() {
this.hTypes.add(HypervisorType.XenServer);
this.hTypes.add(HypervisorType.VMware);
this.hTypes.add(HypervisorType.KVM);
this.hTypes.add(HypervisorType.Simulator);
this.hTypes.add(HypervisorType.LXC);
this.hTypes.add(HypervisorType.Hyperv);
}
@Override
@DB
public boolean configure(String name, Map<String, Object> params) throws ConfigurationException {
@ -2396,14 +2410,7 @@ public class VpcManagerImpl extends ManagerBase implements VpcManager, VpcProvis
@Override
public List<HypervisorType> getSupportedVpcHypervisors() {
List<HypervisorType> hTypes = new ArrayList<HypervisorType>();
hTypes.add(HypervisorType.XenServer);
hTypes.add(HypervisorType.VMware);
hTypes.add(HypervisorType.KVM);
hTypes.add(HypervisorType.Simulator);
hTypes.add(HypervisorType.LXC);
hTypes.add(HypervisorType.Hyperv);
return hTypes;
return Collections.unmodifiableList(this.hTypes);
}
private List<Provider> getVpcProviders(long vpcId) {

View File

@ -0,0 +1,231 @@
// 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.apache.cloudstack.network.topology;
import java.util.List;
import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Component;
import com.cloud.dc.DataCenter;
import com.cloud.deploy.DeployDestination;
import com.cloud.exception.ConcurrentOperationException;
import com.cloud.exception.ResourceUnavailableException;
import com.cloud.network.Network;
import com.cloud.network.PublicIpAddress;
import com.cloud.network.RemoteAccessVpn;
import com.cloud.network.VpnUser;
import com.cloud.network.router.VirtualRouter;
import com.cloud.network.rules.AdvancedVpnRules;
import com.cloud.network.rules.DhcpEntryRules;
import com.cloud.network.rules.DhcpPvlanRules;
import com.cloud.network.rules.NetworkAclsRules;
import com.cloud.network.rules.NicPlugInOutRules;
import com.cloud.network.rules.PrivateGatewayRules;
import com.cloud.network.rules.RuleApplier;
import com.cloud.network.rules.RuleApplierWrapper;
import com.cloud.network.rules.StaticRoutesRules;
import com.cloud.network.rules.UserdataPwdRules;
import com.cloud.network.rules.VpcIpAssociationRules;
import com.cloud.network.vpc.NetworkACLItem;
import com.cloud.network.vpc.PrivateGateway;
import com.cloud.network.vpc.StaticRouteProfile;
import com.cloud.vm.DomainRouterVO;
import com.cloud.vm.NicProfile;
import com.cloud.vm.VirtualMachine.State;
import com.cloud.vm.VirtualMachineProfile;
@Component
public class AdvancedNetworkTopology extends BasicNetworkTopology {
private static final Logger s_logger = Logger.getLogger(AdvancedNetworkTopology.class);
@Autowired
@Qualifier("advancedNetworkVisitor")
protected AdvancedNetworkVisitor _advancedVisitor;
@Override
public BasicNetworkVisitor getVisitor() {
return _advancedVisitor;
}
@Override
public String[] applyVpnUsers(final RemoteAccessVpn remoteAccessVpn, final List<? extends VpnUser> users, final VirtualRouter router) throws ResourceUnavailableException {
s_logger.debug("APPLYING ADVANCED VPN USERS RULES");
AdvancedVpnRules routesRules = new AdvancedVpnRules(remoteAccessVpn, users);
boolean agentResult = routesRules.accept(_advancedVisitor, router);
String[] result = new String[users.size()];
for (int i = 0; i < result.length; i++) {
if (agentResult) {
result[i] = null;
} else {
result[i] = String.valueOf(agentResult);
}
}
return result;
}
@Override
public boolean applyStaticRoutes(final List<StaticRouteProfile> staticRoutes, final List<DomainRouterVO> routers) throws ResourceUnavailableException {
s_logger.debug("APPLYING STATIC ROUTES RULES");
if (staticRoutes == null || staticRoutes.isEmpty()) {
s_logger.debug("No static routes to apply");
return true;
}
StaticRoutesRules routesRules = new StaticRoutesRules(staticRoutes);
boolean result = true;
for (VirtualRouter router : routers) {
if (router.getState() == State.Running) {
result = result && routesRules.accept(_advancedVisitor, router);
} else if (router.getState() == State.Stopped || router.getState() == State.Stopping) {
s_logger.debug("Router " + router.getInstanceName() + " is in " + router.getState() + ", so not sending StaticRoute command to the backend");
} else {
s_logger.warn("Unable to apply StaticRoute, virtual router is not in the right state " + router.getState());
throw new ResourceUnavailableException("Unable to apply StaticRoute on the backend," + " virtual router is not in the right state", DataCenter.class,
router.getDataCenterId());
}
}
return result;
}
@Override
public boolean setupDhcpForPvlan(final boolean isAddPvlan, final DomainRouterVO router, final Long hostId, final NicProfile nic) throws ResourceUnavailableException {
s_logger.debug("SETUP DHCP PVLAN RULES");
if (!nic.getBroadCastUri().getScheme().equals("pvlan")) {
return false;
}
DhcpPvlanRules pvlanRules = new DhcpPvlanRules(isAddPvlan, nic);
return pvlanRules.accept(_advancedVisitor, router);
}
@Override
public boolean setupPrivateGateway(final PrivateGateway gateway, final VirtualRouter router) throws ConcurrentOperationException, ResourceUnavailableException {
s_logger.debug("SETUP PRIVATE GATEWAY RULES");
PrivateGatewayRules routesRules = new PrivateGatewayRules(gateway);
return routesRules.accept(_advancedVisitor, router);
}
@Override
public boolean applyUserData(final Network network, final NicProfile nic, final VirtualMachineProfile profile, final DeployDestination dest, final List<DomainRouterVO> routers)
throws ResourceUnavailableException {
s_logger.debug("APPLYING VPC USERDATA RULES");
final String typeString = "userdata and password entry";
final boolean isPodLevelException = false;
final boolean failWhenDisconnect = false;
final Long podId = null;
UserdataPwdRules pwdRules = new UserdataPwdRules(network, nic, profile, dest);
return applyRules(network, routers, typeString, isPodLevelException, podId, failWhenDisconnect, new RuleApplierWrapper<RuleApplier>(pwdRules));
}
@Override
public boolean applyDhcpEntry(final Network network, final NicProfile nic, final VirtualMachineProfile profile, final DeployDestination dest,
final List<DomainRouterVO> routers) throws ResourceUnavailableException {
s_logger.debug("APPLYING VPC DHCP ENTRY RULES");
final String typeString = "dhcp entry";
final Long podId = null;
final boolean isPodLevelException = false;
final boolean failWhenDisconnect = false;
DhcpEntryRules dhcpRules = new DhcpEntryRules(network, nic, profile, dest);
return applyRules(network, routers, typeString, isPodLevelException, podId, failWhenDisconnect, new RuleApplierWrapper<RuleApplier>(dhcpRules));
}
@Override
public boolean associatePublicIP(final Network network, final List<? extends PublicIpAddress> ipAddresses, final List<? extends VirtualRouter> routers)
throws ResourceUnavailableException {
if (ipAddresses == null || ipAddresses.isEmpty()) {
s_logger.debug("No ip association rules to be applied for network " + network.getId());
return true;
}
// only one router is supported in VPC for now
VirtualRouter router = routers.get(0);
if (router.getVpcId() == null) {
return super.associatePublicIP(network, ipAddresses, routers);
}
s_logger.debug("APPLYING VPC IP RULES");
final String typeString = "vpc ip association";
final boolean isPodLevelException = false;
final boolean failWhenDisconnect = false;
final Long podId = null;
NicPlugInOutRules nicPlugInOutRules = new NicPlugInOutRules(network, ipAddresses);
nicPlugInOutRules.accept(_advancedVisitor, router);
VpcIpAssociationRules ipAssociationRules = new VpcIpAssociationRules(network, ipAddresses);
boolean result = applyRules(network, routers, typeString, isPodLevelException, podId, failWhenDisconnect, new RuleApplierWrapper<RuleApplier>(ipAssociationRules));
if (result) {
_advancedVisitor.visit(nicPlugInOutRules);
}
return result;
}
@Override
public boolean applyNetworkACLs(final Network network, final List<? extends NetworkACLItem> rules, final List<? extends VirtualRouter> routers, final boolean isPrivateGateway)
throws ResourceUnavailableException {
if (rules == null || rules.isEmpty()) {
s_logger.debug("No network ACLs to be applied for network " + network.getId());
return true;
}
s_logger.debug("APPLYING NETWORK ACLs RULES");
final String typeString = "network acls";
final boolean isPodLevelException = false;
final boolean failWhenDisconnect = false;
final Long podId = null;
NetworkAclsRules aclsRules = new NetworkAclsRules(network, rules, isPrivateGateway);
return applyRules(network, routers, typeString, isPodLevelException, podId, failWhenDisconnect, new RuleApplierWrapper<RuleApplier>(aclsRules));
}
}

View File

@ -0,0 +1,215 @@
// 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.apache.cloudstack.network.topology;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import org.apache.log4j.Logger;
import org.springframework.stereotype.Component;
import com.cloud.agent.api.Command;
import com.cloud.agent.api.PvlanSetupCommand;
import com.cloud.agent.manager.Commands;
import com.cloud.dc.DataCenter;
import com.cloud.exception.ResourceUnavailableException;
import com.cloud.network.Network;
import com.cloud.network.PublicIpAddress;
import com.cloud.network.VpnUser;
import com.cloud.network.router.VirtualRouter;
import com.cloud.network.rules.AdvancedVpnRules;
import com.cloud.network.rules.DhcpEntryRules;
import com.cloud.network.rules.DhcpPvlanRules;
import com.cloud.network.rules.NetworkAclsRules;
import com.cloud.network.rules.NicPlugInOutRules;
import com.cloud.network.rules.PrivateGatewayRules;
import com.cloud.network.rules.StaticRoutesRules;
import com.cloud.network.rules.UserdataPwdRules;
import com.cloud.network.rules.VpcIpAssociationRules;
import com.cloud.network.vpc.NetworkACLItem;
import com.cloud.network.vpc.PrivateIpAddress;
import com.cloud.network.vpc.PrivateIpVO;
import com.cloud.network.vpc.StaticRouteProfile;
import com.cloud.utils.net.NetUtils;
import com.cloud.vm.NicProfile;
import com.cloud.vm.NicVO;
import com.cloud.vm.UserVmVO;
import com.cloud.vm.VirtualMachine.State;
import com.cloud.vm.VirtualMachineProfile;
@Component
public class AdvancedNetworkVisitor extends BasicNetworkVisitor {
private static final Logger s_logger = Logger.getLogger(AdvancedNetworkVisitor.class);
@Override
public boolean visit(final UserdataPwdRules userdata) throws ResourceUnavailableException {
final VirtualRouter router = userdata.getRouter();
final Commands commands = new Commands(Command.OnError.Stop);
final VirtualMachineProfile profile = userdata.getProfile();
final NicVO nicVo = userdata.getNicVo();
final UserVmVO userVM = userdata.getUserVM();
_commandSetupHelper.createPasswordCommand(router, profile, nicVo, commands);
_commandSetupHelper.createVmDataCommand(router, userVM, nicVo, userVM.getDetail("SSH.PublicKey"), commands);
return _networkGeneralHelper.sendCommandsToRouter(router, commands);
}
@Override
public boolean visit(final DhcpEntryRules dhcp) throws ResourceUnavailableException {
final VirtualRouter router = dhcp.getRouter();
final Commands commands = new Commands(Command.OnError.Stop);
final NicVO nicVo = dhcp.getNicVo();
final UserVmVO userVM = dhcp.getUserVM();
_commandSetupHelper.createDhcpEntryCommand(router, userVM, nicVo, commands);
return _networkGeneralHelper.sendCommandsToRouter(router, commands);
}
@Override
public boolean visit(final NicPlugInOutRules nicPlugInOutRules) throws ResourceUnavailableException {
final VirtualRouter router = nicPlugInOutRules.getRouter();
final Commands commands = nicPlugInOutRules.getNetUsageCommands();
if (commands.size() > 0) {
return _networkGeneralHelper.sendCommandsToRouter(router, commands);
}
return true;
}
@Override
public boolean visit(final NetworkAclsRules acls) throws ResourceUnavailableException {
final VirtualRouter router = acls.getRouter();
final Network network = acls.getNetwork();
Commands commands = new Commands(Command.OnError.Continue);
List<? extends NetworkACLItem> rules = acls.getRules();
_commandSetupHelper.createNetworkACLsCommands(rules, router, commands, network.getId(), acls.isPrivateGateway());
return _networkGeneralHelper.sendCommandsToRouter(router, commands);
}
@Override
public boolean visit(final VpcIpAssociationRules vpcip) throws ResourceUnavailableException {
final VirtualRouter router = vpcip.getRouter();
Commands cmds = new Commands(Command.OnError.Continue);
Map<String, String> vlanMacAddress = vpcip.getVlanMacAddress();
List<PublicIpAddress> ipsToSend = vpcip.getIpsToSend();
if (!ipsToSend.isEmpty()) {
_commandSetupHelper.createVpcAssociatePublicIPCommands(router, ipsToSend, cmds, vlanMacAddress);
return _networkGeneralHelper.sendCommandsToRouter(router, cmds);
} else {
return true;
}
}
@Override
public boolean visit(final PrivateGatewayRules privateGW) throws ResourceUnavailableException {
final VirtualRouter router = privateGW.getRouter();
final NicProfile nicProfile = privateGW.getNicProfile();
final boolean isAddOperation = privateGW.isAddOperation();
if (router.getState() == State.Running) {
PrivateIpVO ipVO = privateGW.retrivePrivateIP(this);
Network network = privateGW.retrievePrivateNetwork(this);
String netmask = NetUtils.getCidrNetmask(network.getCidr());
PrivateIpAddress ip = new PrivateIpAddress(ipVO, network.getBroadcastUri().toString(), network.getGateway(), netmask, nicProfile.getMacAddress());
List<PrivateIpAddress> privateIps = new ArrayList<PrivateIpAddress>(1);
privateIps.add(ip);
Commands cmds = new Commands(Command.OnError.Stop);
_commandSetupHelper.createVpcAssociatePrivateIPCommands(router, privateIps, cmds, isAddOperation);
try {
if (_networkGeneralHelper.sendCommandsToRouter(router, cmds)) {
s_logger.debug("Successfully applied ip association for ip " + ip + " in vpc network " + network);
return true;
} else {
s_logger.warn("Failed to associate ip address " + ip + " in vpc network " + network);
return false;
}
} catch (Exception ex) {
s_logger.warn("Failed to send " + (isAddOperation ? "add " : "delete ") + " private network " + network + " commands to rotuer ");
return false;
}
} else if (router.getState() == State.Stopped || router.getState() == State.Stopping) {
s_logger.debug("Router " + router.getInstanceName() + " is in " + router.getState() + ", so not sending setup private network command to the backend");
} else {
s_logger.warn("Unable to setup private gateway, virtual router " + router + " is not in the right state " + router.getState());
throw new ResourceUnavailableException("Unable to setup Private gateway on the backend," + " virtual router " + router + " is not in the right state",
DataCenter.class, router.getDataCenterId());
}
return true;
}
@Override
public boolean visit(final DhcpPvlanRules dhcp) throws ResourceUnavailableException {
final VirtualRouter router = dhcp.getRouter();
final PvlanSetupCommand setupCommand = dhcp.getSetupCommand();
// In fact we send command to the host of router, we're not programming
// router but the host
Commands cmds = new Commands(Command.OnError.Stop);
cmds.addCommand(setupCommand);
try {
return _networkGeneralHelper.sendCommandsToRouter(router, cmds);
} catch (final ResourceUnavailableException e) {
s_logger.warn("Timed Out", e);
return false;
}
}
@Override
public boolean visit(final StaticRoutesRules staticRoutesRules) throws ResourceUnavailableException {
final VirtualRouter router = staticRoutesRules.getRouter();
List<StaticRouteProfile> staticRoutes = staticRoutesRules.getStaticRoutes();
Commands cmds = new Commands(Command.OnError.Continue);
_commandSetupHelper.createStaticRouteCommands(staticRoutes, router, cmds);
return _networkGeneralHelper.sendCommandsToRouter(router, cmds);
}
@Override
public boolean visit(final AdvancedVpnRules vpnRules) throws ResourceUnavailableException {
final VirtualRouter router = vpnRules.getRouter();
List<? extends VpnUser> users = vpnRules.getUsers();
Commands cmds = new Commands(Command.OnError.Continue);
_commandSetupHelper.createApplyVpnUsersCommand(users, router, cmds);
// Currently we receive just one answer from the agent. In the future we
// have to parse individual answers and set
// results accordingly
return _networkGeneralHelper.sendCommandsToRouter(router, cmds);
}
}

View File

@ -0,0 +1,440 @@
// 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.apache.cloudstack.network.topology;
import java.util.ArrayList;
import java.util.List;
import javax.inject.Inject;
import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Component;
import com.cloud.dc.DataCenter;
import com.cloud.dc.DataCenter.NetworkType;
import com.cloud.dc.Pod;
import com.cloud.dc.dao.DataCenterDao;
import com.cloud.deploy.DeployDestination;
import com.cloud.exception.AgentUnavailableException;
import com.cloud.exception.ConcurrentOperationException;
import com.cloud.exception.ResourceUnavailableException;
import com.cloud.host.Status;
import com.cloud.host.dao.HostDao;
import com.cloud.network.Network;
import com.cloud.network.Networks.TrafficType;
import com.cloud.network.PublicIpAddress;
import com.cloud.network.RemoteAccessVpn;
import com.cloud.network.VpnUser;
import com.cloud.network.lb.LoadBalancingRule;
import com.cloud.network.router.NetworkHelper;
import com.cloud.network.router.VirtualRouter;
import com.cloud.network.rules.BasicVpnRules;
import com.cloud.network.rules.DhcpEntryRules;
import com.cloud.network.rules.DhcpSubNetRules;
import com.cloud.network.rules.FirewallRule;
import com.cloud.network.rules.FirewallRules;
import com.cloud.network.rules.IpAssociationRules;
import com.cloud.network.rules.LoadBalancingRules;
import com.cloud.network.rules.PasswordToRouterRules;
import com.cloud.network.rules.RuleApplier;
import com.cloud.network.rules.RuleApplierWrapper;
import com.cloud.network.rules.SshKeyToRouterRules;
import com.cloud.network.rules.StaticNat;
import com.cloud.network.rules.StaticNatRules;
import com.cloud.network.rules.UserdataPwdRules;
import com.cloud.network.rules.UserdataToRouterRules;
import com.cloud.network.vpc.NetworkACLItem;
import com.cloud.network.vpc.PrivateGateway;
import com.cloud.network.vpc.StaticRouteProfile;
import com.cloud.utils.exception.CloudRuntimeException;
import com.cloud.vm.DomainRouterVO;
import com.cloud.vm.NicProfile;
import com.cloud.vm.VirtualMachine;
import com.cloud.vm.VirtualMachine.State;
import com.cloud.vm.VirtualMachineProfile;
@Component
public class BasicNetworkTopology implements NetworkTopology {
private static final Logger s_logger = Logger.getLogger(BasicNetworkTopology.class);
@Autowired
@Qualifier("basicNetworkVisitor")
protected BasicNetworkVisitor _basicVisitor;
@Inject
protected DataCenterDao _dcDao;
@Inject
protected HostDao _hostDao;
@Autowired
@Qualifier("networkHelper")
protected NetworkHelper _networkHelper;
@Override
public NetworkTopologyVisitor getVisitor() {
return _basicVisitor;
}
@Override
public boolean setupPrivateGateway(final PrivateGateway gateway, final VirtualRouter router) throws ConcurrentOperationException, ResourceUnavailableException {
throw new CloudRuntimeException("setupPrivateGateway not implemented in Basic Network Topology.");
}
@Override
public String[] applyVpnUsers(final RemoteAccessVpn vpn, final List<? extends VpnUser> users, final VirtualRouter router) throws ResourceUnavailableException {
throw new CloudRuntimeException("applyVpnUsers not implemented in Basic Network Topology.");
}
@Override
public boolean applyStaticRoutes(final List<StaticRouteProfile> staticRoutes, final List<DomainRouterVO> routers) throws ResourceUnavailableException {
throw new CloudRuntimeException("applyStaticRoutes not implemented in Basic Network Topology.");
}
@Override
public boolean applyNetworkACLs(final Network network, final List<? extends NetworkACLItem> rules, final List<? extends VirtualRouter> routers, final boolean isPrivateGateway)
throws ResourceUnavailableException {
throw new CloudRuntimeException("applyNetworkACLs not implemented in Basic Network Topology.");
}
@Override
public boolean setupDhcpForPvlan(final boolean add, final DomainRouterVO router, final Long hostId, final NicProfile nic) throws ResourceUnavailableException {
throw new CloudRuntimeException("setupDhcpForPvlan not implemented in Basic Network Topology.");
}
@Override
public boolean configDhcpForSubnet(final Network network, final NicProfile nic, final VirtualMachineProfile profile, final DeployDestination dest,
final List<DomainRouterVO> routers) throws ResourceUnavailableException {
s_logger.debug("CONFIG DHCP FOR SUBNETS RULES");
// Assuming we have only one router per network For Now.
final DomainRouterVO router = routers.get(0);
if (router.getState() != State.Running) {
s_logger.warn("Failed to configure dhcp: router not in running state");
throw new ResourceUnavailableException("Unable to assign ip addresses, domR is not in right state " + router.getState(), DataCenter.class, network.getDataCenterId());
}
DhcpSubNetRules subNetRules = new DhcpSubNetRules(network, nic, profile);
return subNetRules.accept(_basicVisitor, router);
}
@Override
public boolean applyDhcpEntry(final Network network, final NicProfile nic, final VirtualMachineProfile profile, final DeployDestination dest,
final List<DomainRouterVO> routers) throws ResourceUnavailableException {
s_logger.debug("APPLYING DHCP ENTRY RULES");
final String typeString = "dhcp entry";
final Long podId = dest.getPod().getId();
boolean isPodLevelException = false;
// for user vm in Basic zone we should try to re-deploy vm in a diff pod
// if it fails to deploy in original pod; so throwing exception with Pod
// scope
if (podId != null && profile.getVirtualMachine().getType() == VirtualMachine.Type.User && network.getTrafficType() == TrafficType.Guest
&& network.getGuestType() == Network.GuestType.Shared) {
isPodLevelException = true;
}
final boolean failWhenDisconnect = false;
DhcpEntryRules dhcpRules = new DhcpEntryRules(network, nic, profile, dest);
return applyRules(network, routers, typeString, isPodLevelException, podId, failWhenDisconnect, new RuleApplierWrapper<RuleApplier>(dhcpRules));
}
@Override
public boolean applyUserData(final Network network, final NicProfile nic, final VirtualMachineProfile profile, final DeployDestination dest, final List<DomainRouterVO> routers)
throws ResourceUnavailableException {
s_logger.debug("APPLYING USERDATA RULES");
final String typeString = "userdata and password entry";
final Long podId = dest.getPod().getId();
boolean isPodLevelException = false;
if (podId != null && profile.getVirtualMachine().getType() == VirtualMachine.Type.User && network.getTrafficType() == TrafficType.Guest
&& network.getGuestType() == Network.GuestType.Shared) {
isPodLevelException = true;
}
final boolean failWhenDisconnect = false;
UserdataPwdRules pwdRules = new UserdataPwdRules(network, nic, profile, dest);
return applyRules(network, routers, typeString, isPodLevelException, podId, failWhenDisconnect, new RuleApplierWrapper<RuleApplier>(pwdRules));
}
@Override
public boolean applyLoadBalancingRules(final Network network, final List<LoadBalancingRule> rules, final List<? extends VirtualRouter> routers)
throws ResourceUnavailableException {
if (rules == null || rules.isEmpty()) {
s_logger.debug("No lb rules to be applied for network " + network.getId());
return true;
}
s_logger.debug("APPLYING LOAD BALANCING RULES");
final String typeString = "loadbalancing rules";
final boolean isPodLevelException = false;
final boolean failWhenDisconnect = false;
final Long podId = null;
LoadBalancingRules loadBalancingRules = new LoadBalancingRules(network, rules);
return applyRules(network, routers, typeString, isPodLevelException, podId, failWhenDisconnect, new RuleApplierWrapper<RuleApplier>(loadBalancingRules));
}
@Override
public boolean applyFirewallRules(final Network network, final List<? extends FirewallRule> rules, final List<? extends VirtualRouter> routers)
throws ResourceUnavailableException {
if (rules == null || rules.isEmpty()) {
s_logger.debug("No firewall rules to be applied for network " + network.getId());
return true;
}
s_logger.debug("APPLYING FIREWALL RULES");
final String typeString = "firewall rules";
final boolean isPodLevelException = false;
final boolean failWhenDisconnect = false;
final Long podId = null;
FirewallRules firewallRules = new FirewallRules(network, rules);
return applyRules(network, routers, typeString, isPodLevelException, podId, failWhenDisconnect, new RuleApplierWrapper<RuleApplier>(firewallRules));
}
@Override
public boolean applyStaticNats(final Network network, final List<? extends StaticNat> rules, final List<? extends VirtualRouter> routers) throws ResourceUnavailableException {
if (rules == null || rules.isEmpty()) {
s_logger.debug("No static nat rules to be applied for network " + network.getId());
return true;
}
s_logger.debug("APPLYING STATIC NAT RULES");
final String typeString = "static nat rules";
final boolean isPodLevelException = false;
final boolean failWhenDisconnect = false;
final Long podId = null;
StaticNatRules natRules = new StaticNatRules(network, rules);
return applyRules(network, routers, typeString, isPodLevelException, podId, failWhenDisconnect, new RuleApplierWrapper<RuleApplier>(natRules));
}
@Override
public boolean associatePublicIP(final Network network, final List<? extends PublicIpAddress> ipAddress, final List<? extends VirtualRouter> routers)
throws ResourceUnavailableException {
if (ipAddress == null || ipAddress.isEmpty()) {
s_logger.debug("No ip association rules to be applied for network " + network.getId());
return true;
}
s_logger.debug("APPLYING IP RULES");
final String typeString = "ip association";
final boolean isPodLevelException = false;
final boolean failWhenDisconnect = false;
final Long podId = null;
IpAssociationRules ipAddresses = new IpAssociationRules(network, ipAddress);
return applyRules(network, routers, typeString, isPodLevelException, podId, failWhenDisconnect, new RuleApplierWrapper<RuleApplier>(ipAddresses));
}
@Override
public String[] applyVpnUsers(final Network network, final List<? extends VpnUser> users, final List<DomainRouterVO> routers) throws ResourceUnavailableException {
if (routers == null || routers.isEmpty()) {
s_logger.warn("Failed to add/remove VPN users: no router found for account and zone");
throw new ResourceUnavailableException("Unable to assign ip addresses, domR doesn't exist for network " + network.getId(), DataCenter.class, network.getDataCenterId());
}
s_logger.debug("APPLYING BASIC VPN RULES");
BasicVpnRules vpnRules = new BasicVpnRules(network, users);
boolean agentResults = true;
for (final DomainRouterVO router : routers) {
if (router.getState() != State.Running) {
s_logger.warn("Failed to add/remove VPN users: router not in running state");
throw new ResourceUnavailableException("Unable to assign ip addresses, domR is not in right state " + router.getState(), DataCenter.class,
network.getDataCenterId());
}
// Currently we receive just one answer from the agent. In the
// future we have to parse individual answers and set
// results accordingly
final boolean agentResult = vpnRules.accept(_basicVisitor, router);
agentResults = agentResults && agentResult;
}
final String[] result = new String[users.size()];
for (int i = 0; i < result.length; i++) {
if (agentResults) {
result[i] = null;
} else {
result[i] = String.valueOf(agentResults);
}
}
return result;
}
@Override
public boolean savePasswordToRouter(final Network network, final NicProfile nic, final VirtualMachineProfile profile, final List<? extends VirtualRouter> routers)
throws ResourceUnavailableException {
s_logger.debug("SAVE PASSWORD TO ROUTE RULES");
final String typeString = "save password entry";
final boolean isPodLevelException = false;
final boolean failWhenDisconnect = false;
final Long podId = null;
PasswordToRouterRules routerRules = new PasswordToRouterRules(network, nic, profile);
return applyRules(network, routers, typeString, isPodLevelException, podId, failWhenDisconnect, new RuleApplierWrapper<RuleApplier>(routerRules));
}
@Override
public boolean saveSSHPublicKeyToRouter(final Network network, final NicProfile nic, final VirtualMachineProfile profile, final List<? extends VirtualRouter> routers,
final String sshPublicKey) throws ResourceUnavailableException {
s_logger.debug("SAVE SSH PUB KEY TO ROUTE RULES");
final String typeString = "save SSHkey entry";
final boolean isPodLevelException = false;
final boolean failWhenDisconnect = false;
final Long podId = null;
SshKeyToRouterRules keyToRouterRules = new SshKeyToRouterRules(network, nic, profile, sshPublicKey);
return applyRules(network, routers, typeString, isPodLevelException, podId, failWhenDisconnect, new RuleApplierWrapper<RuleApplier>(keyToRouterRules));
}
@Override
public boolean saveUserDataToRouter(final Network network, final NicProfile nic, final VirtualMachineProfile profile, final List<? extends VirtualRouter> routers)
throws ResourceUnavailableException {
s_logger.debug("SAVE USERDATA TO ROUTE RULES");
final String typeString = "save userdata entry";
final boolean isPodLevelException = false;
final boolean failWhenDisconnect = false;
final Long podId = null;
UserdataToRouterRules userdataToRouterRules = new UserdataToRouterRules(network, nic, profile);
return applyRules(network, routers, typeString, isPodLevelException, podId, failWhenDisconnect, new RuleApplierWrapper<RuleApplier>(userdataToRouterRules));
}
@Override
public boolean applyRules(final Network network, final List<? extends VirtualRouter> routers, final String typeString, final boolean isPodLevelException, final Long podId,
final boolean failWhenDisconnect, final RuleApplierWrapper<RuleApplier> ruleApplierWrapper) throws ResourceUnavailableException {
if (routers == null || routers.isEmpty()) {
s_logger.warn("Unable to apply " + typeString + ", virtual router doesn't exist in the network " + network.getId());
throw new ResourceUnavailableException("Unable to apply " + typeString, DataCenter.class, network.getDataCenterId());
}
RuleApplier ruleApplier = ruleApplierWrapper.getRuleType();
final DataCenter dc = _dcDao.findById(network.getDataCenterId());
final boolean isZoneBasic = dc.getNetworkType() == NetworkType.Basic;
// isPodLevelException and podId is only used for basic zone
assert !(!isZoneBasic && isPodLevelException || isZoneBasic && isPodLevelException && podId == null);
final List<VirtualRouter> connectedRouters = new ArrayList<VirtualRouter>();
final List<VirtualRouter> disconnectedRouters = new ArrayList<VirtualRouter>();
boolean result = true;
final String msg = "Unable to apply " + typeString + " on disconnected router ";
for (final VirtualRouter router : routers) {
if (router.getState() == State.Running) {
s_logger.debug("Applying " + typeString + " in network " + network);
if (router.isStopPending()) {
if (_hostDao.findById(router.getHostId()).getState() == Status.Up) {
throw new ResourceUnavailableException("Unable to process due to the stop pending router " + router.getInstanceName()
+ " haven't been stopped after it's host coming back!", DataCenter.class, router.getDataCenterId());
}
s_logger.debug("Router " + router.getInstanceName() + " is stop pending, so not sending apply " + typeString + " commands to the backend");
continue;
}
try {
ruleApplier.accept(getVisitor(), router);
connectedRouters.add(router);
} catch (final AgentUnavailableException e) {
s_logger.warn(msg + router.getInstanceName(), e);
disconnectedRouters.add(router);
}
// If rules fail to apply on one domR and not due to
// disconnection, no need to proceed with the rest
if (!result) {
if (isZoneBasic && isPodLevelException) {
throw new ResourceUnavailableException("Unable to apply " + typeString + " on router ", Pod.class, podId);
}
throw new ResourceUnavailableException("Unable to apply " + typeString + " on router ", DataCenter.class, router.getDataCenterId());
}
} else if (router.getState() == State.Stopped || router.getState() == State.Stopping) {
s_logger.debug("Router " + router.getInstanceName() + " is in " + router.getState() + ", so not sending apply " + typeString + " commands to the backend");
} else {
s_logger.warn("Unable to apply " + typeString + ", virtual router is not in the right state " + router.getState());
if (isZoneBasic && isPodLevelException) {
throw new ResourceUnavailableException("Unable to apply " + typeString + ", virtual router is not in the right state", Pod.class, podId);
}
throw new ResourceUnavailableException("Unable to apply " + typeString + ", virtual router is not in the right state", DataCenter.class, router.getDataCenterId());
}
}
if (!connectedRouters.isEmpty()) {
// Shouldn't we include this check inside the method?
if (!isZoneBasic && !disconnectedRouters.isEmpty() && disconnectedRouters.get(0).getIsRedundantRouter()) {
// These disconnected redundant virtual routers are out of sync
// now, stop them for synchronization
_networkHelper.handleSingleWorkingRedundantRouter(connectedRouters, disconnectedRouters, msg);
}
} else if (!disconnectedRouters.isEmpty()) {
for (final VirtualRouter router : disconnectedRouters) {
if (s_logger.isDebugEnabled()) {
s_logger.debug(msg + router.getInstanceName() + "(" + router.getId() + ")");
}
}
if (isZoneBasic && isPodLevelException) {
throw new ResourceUnavailableException(msg, Pod.class, podId);
}
throw new ResourceUnavailableException(msg, DataCenter.class, disconnectedRouters.get(0).getDataCenterId());
}
result = true;
if (failWhenDisconnect) {
result = !connectedRouters.isEmpty();
}
return result;
}
}

View File

@ -0,0 +1,319 @@
// 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.apache.cloudstack.network.topology;
import java.util.ArrayList;
import java.util.List;
import javax.inject.Inject;
import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Component;
import com.cloud.agent.api.Command;
import com.cloud.agent.api.routing.IpAliasTO;
import com.cloud.agent.manager.Commands;
import com.cloud.deploy.DeployDestination;
import com.cloud.exception.ResourceUnavailableException;
import com.cloud.network.Network;
import com.cloud.network.PublicIpAddress;
import com.cloud.network.VpnUser;
import com.cloud.network.lb.LoadBalancingRule;
import com.cloud.network.router.CommandSetupHelper;
import com.cloud.network.router.NetworkHelper;
import com.cloud.network.router.VirtualRouter;
import com.cloud.network.rules.AdvancedVpnRules;
import com.cloud.network.rules.BasicVpnRules;
import com.cloud.network.rules.DhcpEntryRules;
import com.cloud.network.rules.DhcpPvlanRules;
import com.cloud.network.rules.DhcpSubNetRules;
import com.cloud.network.rules.FirewallRule;
import com.cloud.network.rules.FirewallRule.Purpose;
import com.cloud.network.rules.FirewallRules;
import com.cloud.network.rules.IpAssociationRules;
import com.cloud.network.rules.LoadBalancingRules;
import com.cloud.network.rules.NetworkAclsRules;
import com.cloud.network.rules.NicPlugInOutRules;
import com.cloud.network.rules.PasswordToRouterRules;
import com.cloud.network.rules.PortForwardingRule;
import com.cloud.network.rules.PrivateGatewayRules;
import com.cloud.network.rules.SshKeyToRouterRules;
import com.cloud.network.rules.StaticNat;
import com.cloud.network.rules.StaticNatRule;
import com.cloud.network.rules.StaticNatRules;
import com.cloud.network.rules.StaticRoutesRules;
import com.cloud.network.rules.UserdataPwdRules;
import com.cloud.network.rules.UserdataToRouterRules;
import com.cloud.network.rules.VirtualNetworkApplianceFactory;
import com.cloud.network.rules.VpcIpAssociationRules;
import com.cloud.storage.VMTemplateVO;
import com.cloud.utils.exception.CloudRuntimeException;
import com.cloud.vm.DomainRouterVO;
import com.cloud.vm.NicVO;
import com.cloud.vm.UserVmVO;
import com.cloud.vm.VirtualMachineProfile;
import com.cloud.vm.dao.NicIpAliasVO;
@Component
public class BasicNetworkVisitor extends NetworkTopologyVisitor {
private static final Logger s_logger = Logger.getLogger(BasicNetworkVisitor.class);
@Autowired
@Qualifier("networkHelper")
protected NetworkHelper _networkGeneralHelper;
@Inject
protected VirtualNetworkApplianceFactory _virtualNetworkApplianceFactory;
@Inject
protected CommandSetupHelper _commandSetupHelper;
@Override
public VirtualNetworkApplianceFactory getVirtualNetworkApplianceFactory() {
return _virtualNetworkApplianceFactory;
}
@Override
public boolean visit(final StaticNatRules nat) throws ResourceUnavailableException {
final Network network = nat.getNetwork();
final VirtualRouter router = nat.getRouter();
final List<? extends StaticNat> rules = nat.getRules();
final Commands cmds = new Commands(Command.OnError.Continue);
_commandSetupHelper.createApplyStaticNatCommands(rules, router, cmds, network.getId());
return _networkGeneralHelper.sendCommandsToRouter(router, cmds);
}
@Override
public boolean visit(final LoadBalancingRules loadbalancing) throws ResourceUnavailableException {
final Network network = loadbalancing.getNetwork();
final DomainRouterVO router = (DomainRouterVO) loadbalancing.getRouter();
final List<LoadBalancingRule> rules = loadbalancing.getRules();
final Commands cmds = new Commands(Command.OnError.Continue);
_commandSetupHelper.createApplyLoadBalancingRulesCommands(rules, router, cmds, network.getId());
return _networkGeneralHelper.sendCommandsToRouter(router, cmds);
}
@SuppressWarnings("unchecked")
@Override
public boolean visit(final FirewallRules firewall) throws ResourceUnavailableException {
final Network network = firewall.getNetwork();
final VirtualRouter router = firewall.getRouter();
final List<? extends FirewallRule> rules = firewall.getRules();
final List<LoadBalancingRule> loadbalancingRules = firewall.getLoadbalancingRules();
final Purpose purpose = firewall.getPurpose();
final Commands cmds = new Commands(Command.OnError.Continue);
if (purpose == Purpose.LoadBalancing) {
_commandSetupHelper.createApplyLoadBalancingRulesCommands(loadbalancingRules, router, cmds, network.getId());
return _networkGeneralHelper.sendCommandsToRouter(router, cmds);
} else if (purpose == Purpose.PortForwarding) {
_commandSetupHelper.createApplyPortForwardingRulesCommands((List<? extends PortForwardingRule>) rules, router, cmds, network.getId());
return _networkGeneralHelper.sendCommandsToRouter(router, cmds);
} else if (purpose == Purpose.StaticNat) {
_commandSetupHelper.createApplyStaticNatRulesCommands((List<StaticNatRule>) rules, router, cmds, network.getId());
return _networkGeneralHelper.sendCommandsToRouter(router, cmds);
} else if (purpose == Purpose.Firewall) {
_commandSetupHelper.createApplyFirewallRulesCommands(rules, router, cmds, network.getId());
return _networkGeneralHelper.sendCommandsToRouter(router, cmds);
}
s_logger.warn("Unable to apply rules of purpose: " + rules.get(0).getPurpose());
return false;
}
@Override
public boolean visit(final IpAssociationRules ipRules) throws ResourceUnavailableException {
final Network network = ipRules.getNetwork();
final VirtualRouter router = ipRules.getRouter();
final Commands commands = new Commands(Command.OnError.Continue);
final List<? extends PublicIpAddress> ips = ipRules.getIpAddresses();
_commandSetupHelper.createAssociateIPCommands(router, ips, commands, network.getId());
return _networkGeneralHelper.sendCommandsToRouter(router, commands);
}
@Override
public boolean visit(final UserdataPwdRules userdata) throws ResourceUnavailableException {
final VirtualRouter router = userdata.getRouter();
final Commands commands = new Commands(Command.OnError.Stop);
final VirtualMachineProfile profile = userdata.getProfile();
final NicVO nicVo = userdata.getNicVo();
final UserVmVO userVM = userdata.getUserVM();
final DeployDestination destination = userdata.getDestination();
if (router.getPodIdToDeployIn().longValue() == destination.getPod().getId()) {
_commandSetupHelper.createPasswordCommand(router, profile, nicVo, commands);
_commandSetupHelper.createVmDataCommand(router, userVM, nicVo, userVM.getDetail("SSH.PublicKey"), commands);
return _networkGeneralHelper.sendCommandsToRouter(router, commands);
}
return true;
}
@Override
public boolean visit(final DhcpEntryRules dhcp) throws ResourceUnavailableException {
final VirtualRouter router = dhcp.getRouter();
final Commands commands = new Commands(Command.OnError.Stop);
final NicVO nicVo = dhcp.getNicVo();
final UserVmVO userVM = dhcp.getUserVM();
final DeployDestination destination = dhcp.getDestination();
if (router.getPodIdToDeployIn().longValue() == destination.getPod().getId()) {
_commandSetupHelper.createDhcpEntryCommand(router, userVM, nicVo, commands);
return _networkGeneralHelper.sendCommandsToRouter(router, commands);
}
return true;
}
@Override
public boolean visit(final SshKeyToRouterRules sshkey) throws ResourceUnavailableException {
final VirtualRouter router = sshkey.getRouter();
final VirtualMachineProfile profile = sshkey.getProfile();
final String sshKeystr = sshkey.getSshPublicKey();
final UserVmVO userVM = sshkey.getUserVM();
final Commands commands = new Commands(Command.OnError.Stop);
final NicVO nicVo = sshkey.getNicVo();
final VMTemplateVO template = sshkey.getTemplate();
if (template != null && template.getEnablePassword()) {
_commandSetupHelper.createPasswordCommand(router, profile, nicVo, commands);
}
_commandSetupHelper.createVmDataCommand(router, userVM, nicVo, sshKeystr, commands);
return _networkGeneralHelper.sendCommandsToRouter(router, commands);
}
@Override
public boolean visit(final PasswordToRouterRules passwd) throws ResourceUnavailableException {
final VirtualRouter router = passwd.getRouter();
final NicVO nicVo = passwd.getNicVo();
final VirtualMachineProfile profile = passwd.getProfile();
final Commands cmds = new Commands(Command.OnError.Stop);
_commandSetupHelper.createPasswordCommand(router, profile, nicVo, cmds);
return _networkGeneralHelper.sendCommandsToRouter(router, cmds);
}
@Override
public boolean visit(final UserdataToRouterRules userdata) throws ResourceUnavailableException {
final VirtualRouter router = userdata.getRouter();
final UserVmVO userVM = userdata.getUserVM();
final NicVO nicVo = userdata.getNicVo();
final Commands commands = new Commands(Command.OnError.Stop);
_commandSetupHelper.createVmDataCommand(router, userVM, nicVo, null, commands);
return _networkGeneralHelper.sendCommandsToRouter(router, commands);
}
@Override
public boolean visit(final BasicVpnRules vpnRules) throws ResourceUnavailableException {
final VirtualRouter router = vpnRules.getRouter();
final List<? extends VpnUser> users = vpnRules.getUsers();
final Commands cmds = new Commands(Command.OnError.Continue);
_commandSetupHelper.createApplyVpnUsersCommand(users, router, cmds);
return _networkGeneralHelper.sendCommandsToRouter(router, cmds);
}
@Override
public boolean visit(final DhcpSubNetRules subnet) throws ResourceUnavailableException {
final VirtualRouter router = subnet.getRouter();
final Network network = subnet.getNetwork();
final NicIpAliasVO nicAlias = subnet.getNicAlias();
final String routerAliasIp = subnet.getRouterAliasIp();
final Commands cmds = new Commands(Command.OnError.Stop);
final List<IpAliasTO> ipaliasTo = new ArrayList<IpAliasTO>();
ipaliasTo.add(new IpAliasTO(routerAliasIp, nicAlias.getNetmask(), nicAlias.getAliasCount().toString()));
_commandSetupHelper.createIpAlias(router, ipaliasTo, nicAlias.getNetworkId(), cmds);
// also add the required configuration to the dnsmasq for supporting
// dhcp and dns on the new ip.
_commandSetupHelper.configDnsMasq(router, network, cmds);
return _networkGeneralHelper.sendCommandsToRouter(router, cmds);
}
@Override
public boolean visit(final DhcpPvlanRules dhcpRules) throws ResourceUnavailableException {
throw new CloudRuntimeException("DhcpPvlanRules not implemented in Basic Network Topology.");
}
@Override
public boolean visit(final NicPlugInOutRules nicPlugInOutRules) throws ResourceUnavailableException {
throw new CloudRuntimeException("NicPlugInOutRules not implemented in Basic Network Topology.");
}
@Override
public boolean visit(final NetworkAclsRules aclsRules) throws ResourceUnavailableException {
throw new CloudRuntimeException("NetworkAclsRules not implemented in Basic Network Topology.");
}
@Override
public boolean visit(final VpcIpAssociationRules ipRules) throws ResourceUnavailableException {
throw new CloudRuntimeException("VpcIpAssociationRules not implemented in Basic Network Topology.");
}
@Override
public boolean visit(final PrivateGatewayRules pvtGatewayRules) throws ResourceUnavailableException {
throw new CloudRuntimeException("PrivateGatewayRules not implemented in Basic Network Topology.");
}
@Override
public boolean visit(final StaticRoutesRules staticRoutesRules) throws ResourceUnavailableException {
throw new CloudRuntimeException("StaticRoutesRules not implemented in Basic Network Topology.");
}
@Override
public boolean visit(final AdvancedVpnRules vpnRules) throws ResourceUnavailableException {
throw new CloudRuntimeException("AdvancedVpnRules not implemented in Basic Network Topology.");
}
}

View File

@ -0,0 +1,90 @@
// 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.apache.cloudstack.network.topology;
import java.util.List;
import com.cloud.deploy.DeployDestination;
import com.cloud.exception.ConcurrentOperationException;
import com.cloud.exception.ResourceUnavailableException;
import com.cloud.network.Network;
import com.cloud.network.PublicIpAddress;
import com.cloud.network.RemoteAccessVpn;
import com.cloud.network.VpnUser;
import com.cloud.network.lb.LoadBalancingRule;
import com.cloud.network.router.VirtualRouter;
import com.cloud.network.rules.FirewallRule;
import com.cloud.network.rules.RuleApplier;
import com.cloud.network.rules.RuleApplierWrapper;
import com.cloud.network.rules.StaticNat;
import com.cloud.network.vpc.NetworkACLItem;
import com.cloud.network.vpc.PrivateGateway;
import com.cloud.network.vpc.StaticRouteProfile;
import com.cloud.vm.DomainRouterVO;
import com.cloud.vm.NicProfile;
import com.cloud.vm.VirtualMachineProfile;
public interface NetworkTopology {
NetworkTopologyVisitor getVisitor();
// ====== USED FOR VPC ONLY ====== //
boolean setupDhcpForPvlan(final boolean add, final DomainRouterVO router, final Long hostId, final NicProfile nic) throws ResourceUnavailableException;
boolean configDhcpForSubnet(final Network network, final NicProfile nic, final VirtualMachineProfile profile, final DeployDestination dest, final List<DomainRouterVO> routers)
throws ResourceUnavailableException;
boolean applyNetworkACLs(final Network network, final List<? extends NetworkACLItem> rules, final List<? extends VirtualRouter> routers, final boolean isPrivateGateway)
throws ResourceUnavailableException;
boolean applyStaticRoutes(final List<StaticRouteProfile> staticRoutes, final List<DomainRouterVO> routers) throws ResourceUnavailableException;
boolean setupPrivateGateway(final PrivateGateway gateway, final VirtualRouter router) throws ConcurrentOperationException, ResourceUnavailableException;
String[] applyVpnUsers(final RemoteAccessVpn vpn, final List<? extends VpnUser> users, final VirtualRouter router) throws ResourceUnavailableException;
// ====== USED FOR GUEST NETWORK AND VCP ====== //
boolean applyDhcpEntry(final Network network, final NicProfile nic, final VirtualMachineProfile profile, final DeployDestination dest, final List<DomainRouterVO> routers)
throws ResourceUnavailableException;
boolean applyUserData(final Network network, final NicProfile nic, final VirtualMachineProfile profile, final DeployDestination dest, final List<DomainRouterVO> routers)
throws ResourceUnavailableException;
boolean applyLoadBalancingRules(Network network, List<LoadBalancingRule> rules, List<? extends VirtualRouter> routers) throws ResourceUnavailableException;
boolean applyFirewallRules(final Network network, final List<? extends FirewallRule> rules, final List<? extends VirtualRouter> routers) throws ResourceUnavailableException;
boolean applyStaticNats(final Network network, final List<? extends StaticNat> rules, final List<? extends VirtualRouter> routers) throws ResourceUnavailableException;
boolean associatePublicIP(final Network network, final List<? extends PublicIpAddress> ipAddress, final List<? extends VirtualRouter> routers) throws ResourceUnavailableException;
String[] applyVpnUsers(final Network network, final List<? extends VpnUser> users, final List<DomainRouterVO> routers) throws ResourceUnavailableException;
boolean savePasswordToRouter(final Network network, final NicProfile nic, final VirtualMachineProfile profile, final List<? extends VirtualRouter> routers) throws ResourceUnavailableException;
boolean saveSSHPublicKeyToRouter(final Network network, final NicProfile nic, final VirtualMachineProfile profile, final List<? extends VirtualRouter> routers,
final String sshPublicKey) throws ResourceUnavailableException;
boolean saveUserDataToRouter(final Network network, final NicProfile nic, final VirtualMachineProfile profile, final List<? extends VirtualRouter> routers)
throws ResourceUnavailableException;
boolean applyRules(final Network network, final List<? extends VirtualRouter> routers, final String typeString, final boolean isPodLevelException, final Long podId,
final boolean failWhenDisconnect, RuleApplierWrapper<RuleApplier> ruleApplier) throws ResourceUnavailableException;
}

View File

@ -0,0 +1,52 @@
// 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.apache.cloudstack.network.topology;
import java.util.Hashtable;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import com.cloud.dc.DataCenter;
import com.cloud.dc.DataCenter.NetworkType;
public class NetworkTopologyContext {
private final Hashtable<NetworkType, NetworkTopology> _flyweight = new Hashtable<DataCenter.NetworkType, NetworkTopology>();;
@Autowired
@Qualifier("basicNetworkTopology")
private BasicNetworkTopology _basicNetworkTopology;
@Autowired
@Qualifier("advancedNetworkTopology")
private AdvancedNetworkTopology _advancedNetworkTopology;
public void init() {
_flyweight.put(NetworkType.Basic, _basicNetworkTopology);
_flyweight.put(NetworkType.Advanced, _advancedNetworkTopology);
}
public NetworkTopology retrieveNetworkTopology(final DataCenter dc) {
if (!_flyweight.containsKey(dc.getNetworkType())) {
throw new IllegalArgumentException("The given type cannot be related to a NetworkTopology implementation. "
+ "Please, give a correct type.");
}
return _flyweight.get(dc.getNetworkType());
}
}

View File

@ -0,0 +1,63 @@
// 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.apache.cloudstack.network.topology;
import com.cloud.exception.ResourceUnavailableException;
import com.cloud.network.rules.AdvancedVpnRules;
import com.cloud.network.rules.BasicVpnRules;
import com.cloud.network.rules.DhcpEntryRules;
import com.cloud.network.rules.DhcpPvlanRules;
import com.cloud.network.rules.DhcpSubNetRules;
import com.cloud.network.rules.FirewallRules;
import com.cloud.network.rules.IpAssociationRules;
import com.cloud.network.rules.LoadBalancingRules;
import com.cloud.network.rules.NetworkAclsRules;
import com.cloud.network.rules.NicPlugInOutRules;
import com.cloud.network.rules.PasswordToRouterRules;
import com.cloud.network.rules.PrivateGatewayRules;
import com.cloud.network.rules.SshKeyToRouterRules;
import com.cloud.network.rules.StaticNatRules;
import com.cloud.network.rules.StaticRoutesRules;
import com.cloud.network.rules.UserdataPwdRules;
import com.cloud.network.rules.UserdataToRouterRules;
import com.cloud.network.rules.VirtualNetworkApplianceFactory;
import com.cloud.network.rules.VpcIpAssociationRules;
public abstract class NetworkTopologyVisitor {
public abstract VirtualNetworkApplianceFactory getVirtualNetworkApplianceFactory();
public abstract boolean visit(StaticNatRules nat) throws ResourceUnavailableException;
public abstract boolean visit(LoadBalancingRules loadbalancing) throws ResourceUnavailableException;
public abstract boolean visit(FirewallRules firewall) throws ResourceUnavailableException;
public abstract boolean visit(IpAssociationRules ipAddresses) throws ResourceUnavailableException;
public abstract boolean visit(UserdataPwdRules userdata) throws ResourceUnavailableException;
public abstract boolean visit(DhcpEntryRules dhcp) throws ResourceUnavailableException;
public abstract boolean visit(SshKeyToRouterRules ssh) throws ResourceUnavailableException;
public abstract boolean visit(PasswordToRouterRules pwd) throws ResourceUnavailableException;
public abstract boolean visit(NetworkAclsRules acl) throws ResourceUnavailableException;
public abstract boolean visit(VpcIpAssociationRules vpcIp) throws ResourceUnavailableException;
public abstract boolean visit(UserdataToRouterRules userdata) throws ResourceUnavailableException;
public abstract boolean visit(BasicVpnRules vpnRules) throws ResourceUnavailableException;
public abstract boolean visit(AdvancedVpnRules vpnRules) throws ResourceUnavailableException;
public abstract boolean visit(PrivateGatewayRules pvtGatewayRules) throws ResourceUnavailableException;
public abstract boolean visit(DhcpPvlanRules dhcpRules) throws ResourceUnavailableException;
public abstract boolean visit(DhcpSubNetRules dhcpRules) throws ResourceUnavailableException;
public abstract boolean visit(NicPlugInOutRules nicPlugInOutRules) throws ResourceUnavailableException;
public abstract boolean visit(StaticRoutesRules staticRoutesRules) throws ResourceUnavailableException;
}

View File

@ -0,0 +1,457 @@
// 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 java.util.ArrayList;
import java.util.List;
import java.util.Map;
import org.apache.cloudstack.engine.orchestration.service.NetworkOrchestrationService;
import org.apache.log4j.Logger;
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.DataCenterDeployment;
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.PhysicalNetworkServiceProvider;
import com.cloud.network.VirtualRouterProvider;
import com.cloud.network.VirtualRouterProvider.Type;
import com.cloud.network.addr.PublicIp;
import com.cloud.network.dao.IPAddressDao;
import com.cloud.network.dao.NetworkDao;
import com.cloud.network.dao.PhysicalNetworkServiceProviderDao;
import com.cloud.network.dao.UserIpv6AddressDao;
import com.cloud.network.dao.VirtualRouterProviderDao;
import com.cloud.network.router.NetworkHelper;
import com.cloud.network.router.VirtualRouter.Role;
import com.cloud.network.vpc.Vpc;
import com.cloud.offerings.dao.NetworkOfferingDao;
import com.cloud.user.Account;
import com.cloud.user.AccountManager;
import com.cloud.utils.db.DB;
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.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.NicDao;
import com.cloud.vm.dao.VMInstanceDao;
public class RouterDeploymentDefinition {
private static final Logger logger = Logger.getLogger(RouterDeploymentDefinition.class);
protected NetworkDao networkDao;
protected DomainRouterDao routerDao;
protected PhysicalNetworkServiceProviderDao physicalProviderDao;
protected NetworkModel networkModel;
protected VirtualRouterProviderDao vrProviderDao;
protected NetworkOfferingDao networkOfferingDao;
protected IpAddressManager ipAddrMgr;
protected VMInstanceDao vmDao;
protected HostPodDao podDao;
protected AccountManager accountMgr;
protected NetworkOrchestrationService networkMgr;
protected NicDao nicDao;
protected UserIpv6AddressDao ipv6Dao;
protected IPAddressDao ipAddressDao;
protected VirtualRouterProvider vrProvider;
protected NetworkHelper nwHelper;
protected Network guestNetwork;
protected DeployDestination dest;
protected Account owner;
protected Map<Param, Object> params;
protected boolean isRedundant;
protected DeploymentPlan plan;
protected List<DomainRouterVO> routers = new ArrayList<>();
protected Long offeringId;
protected Long tableLockId;
protected boolean isPublicNetwork;
protected PublicIp sourceNatIp;
protected RouterDeploymentDefinition(final Network guestNetwork, final DeployDestination dest, final Account owner, final Map<Param, Object> params, final boolean isRedundant) {
this.guestNetwork = guestNetwork;
this.dest = dest;
this.owner = owner;
this.params = params;
this.isRedundant = isRedundant;
}
public Long getOfferingId() {
return offeringId;
}
public Vpc getVpc() {
return null;
}
public Network getGuestNetwork() {
return guestNetwork;
}
public DeployDestination getDest() {
return dest;
}
public Account getOwner() {
return owner;
}
public Map<Param, Object> getParams() {
return params;
}
public boolean isRedundant() {
return isRedundant;
}
public DeploymentPlan getPlan() {
return plan;
}
public boolean isVpcRouter() {
return false;
}
public Pod getPod() {
return dest.getPod();
}
public Long getPodId() {
return dest.getPod() == null ? null : dest.getPod().getId();
}
public List<DomainRouterVO> getRouters() {
return routers;
}
public VirtualRouterProvider getVirtualProvider() {
return vrProvider;
}
public boolean isBasic() {
return dest.getDataCenter().getNetworkType() == NetworkType.Basic;
}
public boolean isPublicNetwork() {
return isPublicNetwork;
}
public PublicIp getSourceNatIP() {
return sourceNatIp;
}
protected void generateDeploymentPlan() {
final long dcId = dest.getDataCenter().getId();
Long podId = null;
if (isBasic()) {
if (dest.getPod() == null) {
throw new CloudRuntimeException("Pod id is expected in deployment destination");
}
podId = dest.getPod().getId();
}
plan = new DataCenterDeployment(dcId, podId, null, null, null, null);
}
public List<DomainRouterVO> deployVirtualRouter() throws InsufficientCapacityException, ConcurrentOperationException, ResourceUnavailableException {
findOrDeployVirtualRouter();
return nwHelper.startRouters(this);
}
@DB
protected void findOrDeployVirtualRouter() throws ConcurrentOperationException, InsufficientCapacityException, ResourceUnavailableException {
try {
lock();
checkPreconditions();
// dest has pod=null, for Basic Zone findOrDeployVRs for all Pods
final List<DeployDestination> destinations = findDestinations();
for (final DeployDestination destination : destinations) {
dest = destination;
generateDeploymentPlan();
executeDeployment();
}
} finally {
unlock();
}
}
protected void lock() {
final Network lock = networkDao.acquireInLockTable(guestNetwork.getId(), NetworkOrchestrationService.NetworkLockTimeout.value());
if (lock == null) {
throw new ConcurrentOperationException("Unable to lock network " + guestNetwork.getId());
}
tableLockId = lock.getId();
}
protected void unlock() {
if (tableLockId != null) {
networkDao.releaseFromLockTable(tableLockId);
if (logger.isDebugEnabled()) {
logger.debug("Lock is released for network id " + tableLockId + " as a part of router startup in " + dest);
}
}
}
protected void checkPreconditions() throws ResourceUnavailableException {
if (guestNetwork.getState() != Network.State.Implemented && guestNetwork.getState() != Network.State.Setup && guestNetwork.getState() != Network.State.Implementing) {
throw new ResourceUnavailableException("Network is not yet fully implemented: " + guestNetwork, Network.class, guestNetwork.getId());
}
if (guestNetwork.getTrafficType() != TrafficType.Guest) {
throw new ResourceUnavailableException("Network is not type Guest as expected: " + guestNetwork, Network.class, guestNetwork.getId());
}
}
protected List<DeployDestination> findDestinations() {
// dest has pod=null, for Basic Zone findOrDeployVRs for all Pods
final List<DeployDestination> destinations = new ArrayList<DeployDestination>();
// for basic zone, if 'dest' has pod set to null then this is network
// restart scenario otherwise it is a vm deployment scenario
if (isBasic() && dest.getPod() == null) {
// Find all pods in the data center with running or starting user vms
final long dcId = dest.getDataCenter().getId();
final List<HostPodVO> pods = listByDataCenterIdVMTypeAndStates(dcId, VirtualMachine.Type.User, VirtualMachine.State.Starting, VirtualMachine.State.Running);
// Loop through all the pods skip those with running or starting VRs
for (final HostPodVO pod : pods) {
// Get list of VRs in starting or running state
final long podId = pod.getId();
final List<DomainRouterVO> virtualRouters = routerDao.listByPodIdAndStates(podId, VirtualMachine.State.Starting, VirtualMachine.State.Running);
if (virtualRouters.size() > 1) {
// FIXME Find or create a better and more specific exception for this
throw new CloudRuntimeException("Pod can have utmost one VR in Basic Zone, please check!");
}
// Add virtualRouters to the routers, this avoids the situation when
// all routers are skipped and VirtualRouterElement throws exception
routers.addAll(virtualRouters);
// If List size is one, we already have a starting or running VR, skip deployment
if (virtualRouters.size() == 1) {
logger.debug("Skipping VR deployment: Found a running or starting VR in Pod " + pod.getName() + " id=" + podId);
continue;
}
// Add new DeployDestination for this pod
destinations.add(new DeployDestination(dest.getDataCenter(), pod, null, null));
}
} else {
// Else, just add the supplied dest
destinations.add(dest);
}
return destinations;
}
protected int getNumberOfRoutersToDeploy() {
// TODO Are we sure this makes sense? Somebody said 5 was too many?
if (routers.size() >= 5) {
logger.error("Too many redundant routers!");
}
// If old network is redundant but new is single router, then
// routers.size() = 2 but routerCount = 1
int routersExpected = 1;
if (isRedundant) {
routersExpected = 2;
}
return routersExpected < routers.size() ? 0 : routersExpected - routers.size();
}
protected void setupAccountOwner() {
if (networkModel.isNetworkSystem(guestNetwork) || guestNetwork.getGuestType() == Network.GuestType.Shared) {
owner = accountMgr.getAccount(Account.ACCOUNT_ID_SYSTEM);
}
}
/**
* It executes last pending tasks to prepare the deployment and checks the
* deployment can proceed. If it can't it return false
*
* @return if the deployment can proceed
*/
protected boolean prepareDeployment() {
setupAccountOwner();
// Check if public network has to be set on VR
isPublicNetwork = networkModel.isProviderSupportServiceInNetwork(guestNetwork.getId(), Service.SourceNat, Provider.VirtualRouter);
boolean canProceed = true;
if (isRedundant && !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!");
routers = new ArrayList<DomainRouterVO>();
canProceed = false;
}
return canProceed;
}
/**
* Executes preparation and deployment of the routers. After this method
* ends, {@link this#routers} should have all of the deployed routers ready
* for start, and no more.
*
* @throws ConcurrentOperationException
* @throws InsufficientCapacityException
* @throws ResourceUnavailableException
*/
protected void executeDeployment() throws ConcurrentOperationException, InsufficientCapacityException, ResourceUnavailableException {
// Check current redundant routers, if possible(all routers are
// stopped), reset the priority
planDeploymentRouters();
setupPriorityOfRedundantRouter();
if (getNumberOfRoutersToDeploy() > 0 && prepareDeployment()) {
findVirtualProvider();
findOfferingId();
findSourceNatIP();
deployAllVirtualRouters();
}
}
protected void findSourceNatIP() throws InsufficientAddressCapacityException, ConcurrentOperationException {
sourceNatIp = null;
if (isPublicNetwork) {
sourceNatIp = ipAddrMgr.assignSourceNatIpAddressToGuestNetwork(owner, guestNetwork);
}
}
protected void findOfferingId() {
Long networkOfferingId = networkOfferingDao.findById(guestNetwork.getNetworkOfferingId()).getServiceOfferingId();
if (networkOfferingId != null) {
offeringId = networkOfferingId;
}
}
protected void findVirtualProvider() {
// Check if providers are supported in the physical networks
final Type type = Type.VirtualRouter;
final Long physicalNetworkId = networkModel.getPhysicalNetworkId(guestNetwork);
final PhysicalNetworkServiceProvider provider = physicalProviderDao.findByServiceProvider(physicalNetworkId, type.toString());
if (provider == null) {
throw new CloudRuntimeException(String.format("Cannot find service provider %s in physical network %s", type.toString(), physicalNetworkId));
}
vrProvider = vrProviderDao.findByNspIdAndType(provider.getId(), type);
if (vrProvider == null) {
throw new CloudRuntimeException(String.format("Cannot find virtual router provider %s as service provider %s", type.toString(), provider.getId()));
}
}
protected void deployAllVirtualRouters() throws ConcurrentOperationException, InsufficientCapacityException, ResourceUnavailableException {
int routersToDeploy = getNumberOfRoutersToDeploy();
for (int i = 0; i < routersToDeploy; i++) {
// 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, false);
if (router != null) {
routerDao.addRouterToGuestNetwork(router, guestNetwork);
//Fix according to changes by Sheng Yang in commit ID cb4513379996b262ae378daf00c6388c6b7313cf
routers.add(router);
}
}
}
/**
* Lists all pods given a Data Center Id, a {@link VirtualMachine.Type} and
* a list of {@link VirtualMachine.State}
* @param id
* @param type
* @param states
* @return
*/
protected List<HostPodVO> listByDataCenterIdVMTypeAndStates(final long id, final VirtualMachine.Type type, final VirtualMachine.State... states) {
final SearchBuilder<VMInstanceVO> vmInstanceSearch = vmDao.createSearchBuilder();
vmInstanceSearch.and("type", vmInstanceSearch.entity().getType(), SearchCriteria.Op.EQ);
vmInstanceSearch.and("states", vmInstanceSearch.entity().getState(), SearchCriteria.Op.IN);
final SearchBuilder<HostPodVO> podIdSearch = podDao.createSearchBuilder();
podIdSearch.and("dc", podIdSearch.entity().getDataCenterId(), SearchCriteria.Op.EQ);
podIdSearch.select(null, SearchCriteria.Func.DISTINCT, podIdSearch.entity().getId());
podIdSearch.join("vmInstanceSearch", vmInstanceSearch, podIdSearch.entity().getId(), vmInstanceSearch.entity().getPodIdToDeployIn(), JoinBuilder.JoinType.INNER);
podIdSearch.done();
final SearchCriteria<HostPodVO> sc = podIdSearch.create();
sc.setParameters("dc", id);
sc.setJoinParameters("vmInstanceSearch", "type", type);
sc.setJoinParameters("vmInstanceSearch", "states", (Object[]) states);
return podDao.search(sc, null);
}
protected void planDeploymentRouters() {
if (isBasic()) {
routers.addAll(routerDao.listByNetworkAndPodAndRole(guestNetwork.getId(), getPodId(), Role.VIRTUAL_ROUTER));
} else {
routers.addAll(routerDao.listByNetworkAndRole(guestNetwork.getId(), Role.VIRTUAL_ROUTER));
}
}
/**
* Routers need reset if at least one of the routers is not redundant or
* stopped.
*/
protected boolean routersNeedReset() {
boolean needReset = true;
for (final DomainRouterVO router : routers) {
if (!router.getIsRedundantRouter() || router.getState() != VirtualMachine.State.Stopped) {
needReset = false;
break;
}
}
return needReset;
}
/**
* Only for redundant deployment and if any routers needed reset, we shall
* reset all routers priorities
*/
protected void setupPriorityOfRedundantRouter() {
if (isRedundant && routersNeedReset()) {
for (final DomainRouterVO router : routers) {
// getUpdatedPriority() would update the value later
router.setPriority(0);
router.setIsPriorityBumpUp(false);
routerDao.update(router.getId(), router);
}
}
}
}

View File

@ -0,0 +1,217 @@
// 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 java.util.ArrayList;
import java.util.List;
import java.util.Map;
import javax.inject.Inject;
import org.apache.cloudstack.engine.orchestration.service.NetworkOrchestrationService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import com.cloud.dc.dao.HostPodDao;
import com.cloud.dc.dao.VlanDao;
import com.cloud.deploy.DeployDestination;
import com.cloud.network.IpAddressManager;
import com.cloud.network.Network;
import com.cloud.network.NetworkModel;
import com.cloud.network.dao.IPAddressDao;
import com.cloud.network.dao.NetworkDao;
import com.cloud.network.dao.PhysicalNetworkDao;
import com.cloud.network.dao.PhysicalNetworkServiceProviderDao;
import com.cloud.network.dao.UserIpv6AddressDao;
import com.cloud.network.dao.VirtualRouterProviderDao;
import com.cloud.network.router.NetworkHelper;
import com.cloud.network.router.VpcNetworkHelperImpl;
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.offerings.dao.NetworkOfferingDao;
import com.cloud.user.Account;
import com.cloud.user.AccountManager;
import com.cloud.vm.DomainRouterVO;
import com.cloud.vm.VirtualMachineProfile.Param;
import com.cloud.vm.dao.DomainRouterDao;
import com.cloud.vm.dao.NicDao;
import com.cloud.vm.dao.VMInstanceDao;
public class RouterDeploymentDefinitionBuilder {
@Inject
protected NetworkDao networkDao;
@Inject
private DomainRouterDao routerDao;
@Inject
private PhysicalNetworkServiceProviderDao physicalProviderDao;
@Inject
private NetworkModel networkModel;
@Inject
private VirtualRouterProviderDao vrProviderDao;
@Inject
private NetworkOfferingDao networkOfferingDao;
@Inject
private IpAddressManager ipAddrMgr;
@Inject
private VMInstanceDao vmDao;
@Inject
private HostPodDao podDao;
@Inject
private AccountManager accountMgr;
@Inject
private NetworkOrchestrationService networkMgr;
@Inject
private NicDao nicDao;
@Inject
private UserIpv6AddressDao ipv6Dao;
@Inject
private IPAddressDao ipAddressDao;
@Inject
private VpcDao vpcDao;
@Inject
private VpcOfferingDao vpcOffDao;
@Inject
private PhysicalNetworkDao pNtwkDao;
@Inject
private VpcManager vpcMgr;
@Inject
private VlanDao vlanDao;
@Autowired
@Qualifier("networkHelper")
protected NetworkHelper nwHelper;
@Autowired
@Qualifier("vpcNetworkHelper")
protected VpcNetworkHelperImpl vpcNwHelper;
protected Long offeringId;
public void setOfferingId(final Long offeringId) {
this.offeringId = offeringId;
}
public IntermediateStateBuilder create() {
return new IntermediateStateBuilder(this);
}
protected RouterDeploymentDefinition injectDependencies(
final RouterDeploymentDefinition routerDeploymentDefinition) {
routerDeploymentDefinition.networkDao = networkDao;
routerDeploymentDefinition.routerDao = routerDao;
routerDeploymentDefinition.physicalProviderDao = physicalProviderDao;
routerDeploymentDefinition.networkModel = networkModel;
routerDeploymentDefinition.vrProviderDao = vrProviderDao;
routerDeploymentDefinition.networkOfferingDao = networkOfferingDao;
routerDeploymentDefinition.ipAddrMgr = ipAddrMgr;
routerDeploymentDefinition.vmDao = vmDao;
routerDeploymentDefinition.podDao = podDao;
routerDeploymentDefinition.accountMgr = accountMgr;
routerDeploymentDefinition.networkMgr = networkMgr;
routerDeploymentDefinition.nicDao = nicDao;
routerDeploymentDefinition.ipv6Dao = ipv6Dao;
routerDeploymentDefinition.ipAddressDao = ipAddressDao;
routerDeploymentDefinition.offeringId = offeringId;
routerDeploymentDefinition.nwHelper = nwHelper;
if (routerDeploymentDefinition instanceof VpcRouterDeploymentDefinition) {
injectVpcDependencies((VpcRouterDeploymentDefinition) routerDeploymentDefinition);
}
return routerDeploymentDefinition;
}
protected void injectVpcDependencies(
final VpcRouterDeploymentDefinition routerDeploymentDefinition) {
routerDeploymentDefinition.vpcDao = vpcDao;
routerDeploymentDefinition.vpcOffDao = vpcOffDao;
routerDeploymentDefinition.pNtwkDao = pNtwkDao;
routerDeploymentDefinition.vpcMgr = vpcMgr;
routerDeploymentDefinition.vlanDao = vlanDao;
routerDeploymentDefinition.nwHelper = vpcNwHelper;
routerDeploymentDefinition.routerDao = routerDao;
}
public class IntermediateStateBuilder {
RouterDeploymentDefinitionBuilder builder;
protected Vpc vpc;
protected Network guestNetwork;
protected DeployDestination dest;
protected Account owner;
protected Map<Param, Object> params;
protected boolean isRedundant;
protected List<DomainRouterVO> routers = new ArrayList<>();
protected IntermediateStateBuilder(final RouterDeploymentDefinitionBuilder builder) {
this.builder = builder;
}
public IntermediateStateBuilder makeRedundant() {
isRedundant = true;
return this;
}
public IntermediateStateBuilder setRedundant(final boolean isRedundant) {
this.isRedundant = isRedundant;
return this;
}
public IntermediateStateBuilder setVpc(final Vpc vpc) {
this.vpc = vpc;
return this;
}
public IntermediateStateBuilder setGuestNetwork(final Network nw) {
guestNetwork = nw;
return this;
}
public IntermediateStateBuilder setAccountOwner(final Account owner) {
this.owner = owner;
return this;
}
public IntermediateStateBuilder setDeployDestination(final DeployDestination dest) {
this.dest = dest;
return this;
}
public IntermediateStateBuilder setParams(final Map<Param, Object> params) {
this.params = params;
return this;
}
public RouterDeploymentDefinition build() {
RouterDeploymentDefinition routerDeploymentDefinition = null;
if (vpc != null) {
routerDeploymentDefinition = new VpcRouterDeploymentDefinition(vpc, dest, owner, params, isRedundant);
} else {
routerDeploymentDefinition = new RouterDeploymentDefinition(guestNetwork, dest, owner, params, isRedundant);
}
return builder.injectDependencies(routerDeploymentDefinition);
}
}
}

View File

@ -0,0 +1,182 @@
// 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 java.util.ArrayList;
import java.util.List;
import java.util.Map;
import org.apache.log4j.Logger;
import com.cloud.dc.dao.VlanDao;
import com.cloud.deploy.DataCenterDeployment;
import com.cloud.deploy.DeployDestination;
import com.cloud.exception.ConcurrentOperationException;
import com.cloud.exception.InsufficientAddressCapacityException;
import com.cloud.exception.InsufficientCapacityException;
import com.cloud.exception.ResourceUnavailableException;
import com.cloud.network.PhysicalNetwork;
import com.cloud.network.PhysicalNetworkServiceProvider;
import com.cloud.network.VirtualRouterProvider.Type;
import com.cloud.network.dao.PhysicalNetworkDao;
import com.cloud.network.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.user.Account;
import com.cloud.utils.exception.CloudRuntimeException;
import com.cloud.vm.DomainRouterVO;
import com.cloud.vm.VirtualMachineProfile.Param;
public class VpcRouterDeploymentDefinition extends RouterDeploymentDefinition {
private static final Logger logger = Logger.getLogger(VpcRouterDeploymentDefinition.class);
protected VpcDao vpcDao;
protected VpcOfferingDao vpcOffDao;
protected PhysicalNetworkDao pNtwkDao;
protected VpcManager vpcMgr;
protected VlanDao vlanDao;
protected Vpc vpc;
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);
this.vpc = vpc;
}
@Override
public Vpc getVpc() {
return vpc;
}
@Override
public boolean isVpcRouter() {
return true;
}
@Override
public boolean isPublicNetwork() {
return true;
}
@Override
protected void lock() {
Vpc vpcLock = vpcDao.acquireInLockTable(vpc.getId());
if (vpcLock == null) {
throw new ConcurrentOperationException("Unable to lock vpc " + vpc.getId());
}
tableLockId = vpcLock.getId();
}
@Override
protected void unlock() {
if (tableLockId != null) {
vpcDao.releaseFromLockTable(tableLockId);
if (logger.isDebugEnabled()) {
logger.debug("Lock is released for vpc id " + tableLockId + " as a part of router startup in " + dest);
}
}
}
@Override
protected void checkPreconditions() {
// No preconditions for Vpc
}
@Override
protected List<DeployDestination> findDestinations() {
final List<DeployDestination> destinations = new ArrayList<>();
destinations.add(dest);
return destinations;
}
@Override
protected int getNumberOfRoutersToDeploy() {
// TODO Should we make our changes here in order to enable Redundant
// Router for VPC?
return routers.isEmpty() ? 1 : 0;
}
/**
* @see RouterDeploymentDefinition#prepareDeployment()
*
* @return if the deployment can proceed
*/
@Override
protected boolean prepareDeployment() {
return true;
}
@Override
protected void setupPriorityOfRedundantRouter() {
// Nothing to do for now
// TODO Shouldn't we add this behavior once Redundant Router works for
// Vpc too
}
@Override
protected void findSourceNatIP() throws InsufficientAddressCapacityException, ConcurrentOperationException {
sourceNatIp = vpcMgr.assignSourceNatIpAddressToVpc(owner, vpc);
}
@Override
protected void findVirtualProvider() {
List<? extends PhysicalNetwork> pNtwks = pNtwkDao.listByZone(vpc.getZoneId());
for (PhysicalNetwork pNtwk : pNtwks) {
PhysicalNetworkServiceProvider provider = physicalProviderDao.findByServiceProvider(pNtwk.getId(), Type.VPCVirtualRouter.toString());
if (provider == null) {
throw new CloudRuntimeException("Cannot find service provider " + Type.VPCVirtualRouter.toString() + " in physical network " + pNtwk.getId());
}
vrProvider = vrProviderDao.findByNspIdAndType(provider.getId(), Type.VPCVirtualRouter);
if (vrProvider != null) {
break;
}
}
}
@Override
protected void findOfferingId() {
Long vpcOfferingId = vpcOffDao.findById(vpc.getVpcOfferingId()).getServiceOfferingId();
if (vpcOfferingId != null) {
offeringId = vpcOfferingId;
}
}
@Override
protected void deployAllVirtualRouters() throws ConcurrentOperationException, InsufficientCapacityException,
ResourceUnavailableException {
DomainRouterVO router = nwHelper.deployRouter(this, true);
if (router != null) {
routers.add(router);
}
}
@Override
protected void planDeploymentRouters() {
routers = routerDao.listByVpcId(vpc.getId());
}
@Override
protected void generateDeploymentPlan() {
plan = new DataCenterDeployment(dest.getDataCenter().getId());
}
}

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

@ -0,0 +1,156 @@
package com.cloud.network.router;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.InjectMocks;
import org.mockito.Matchers;
import org.mockito.Mock;
import org.mockito.runners.MockitoJUnitRunner;
import com.cloud.agent.AgentManager;
import com.cloud.agent.api.Answer;
import com.cloud.agent.api.Command;
import com.cloud.agent.manager.Commands;
import com.cloud.exception.AgentUnavailableException;
import com.cloud.exception.OperationTimedoutException;
import com.cloud.utils.exception.CloudRuntimeException;
@RunWith(MockitoJUnitRunner.class)
public class NetworkHelperImplTest {
private static final long HOST_ID = 10L;
@Mock
protected AgentManager agentManager;
@InjectMocks
protected NetworkHelperImpl nwHelper = new NetworkHelperImpl();
@Test(expected=CloudRuntimeException.class)
public void testSendCommandsToRouterWrongRouterVersion()
throws AgentUnavailableException, OperationTimedoutException {
// Prepare
NetworkHelperImpl nwHelperUT = spy(this.nwHelper);
VirtualRouter vr = mock(VirtualRouter.class);
doReturn(false).when(nwHelperUT).checkRouterVersion(vr);
// Execute
nwHelperUT.sendCommandsToRouter(vr, null);
// Assert
verify(this.agentManager, times(0)).send((Long) Matchers.anyObject(), (Command) Matchers.anyObject());
}
@Test
public void testSendCommandsToRouter()
throws AgentUnavailableException, OperationTimedoutException {
// Prepare
NetworkHelperImpl nwHelperUT = spy(this.nwHelper);
VirtualRouter vr = mock(VirtualRouter.class);
when(vr.getHostId()).thenReturn(HOST_ID);
doReturn(true).when(nwHelperUT).checkRouterVersion(vr);
Commands commands = mock(Commands.class);
when(commands.size()).thenReturn(3);
Answer answer1 = mock(Answer.class);
Answer answer2 = mock(Answer.class);
Answer answer3 = mock(Answer.class);
// In the second iteration it should match and return, without invoking the third
Answer[] answers = {answer1, answer2, answer3};
when(answer1.getResult()).thenReturn(true);
when(answer2.getResult()).thenReturn(false);
when(answer3.getResult()).thenReturn(false);
when(this.agentManager.send(HOST_ID, commands)).thenReturn(answers);
// Execute
final boolean result = nwHelperUT.sendCommandsToRouter(vr, commands);
// Assert
verify(this.agentManager, times(1)).send(HOST_ID, commands);
verify(answer1, times(1)).getResult();
verify(answer2, times(1)).getResult();
verify(answer3, times(0)).getResult();
assertFalse(result);
}
/**
* The only way result can be true is if each and every command receive a true result
*
* @throws AgentUnavailableException
* @throws OperationTimedoutException
*/
@Test
public void testSendCommandsToRouterWithTrueResult()
throws AgentUnavailableException, OperationTimedoutException {
// Prepare
NetworkHelperImpl nwHelperUT = spy(this.nwHelper);
VirtualRouter vr = mock(VirtualRouter.class);
when(vr.getHostId()).thenReturn(HOST_ID);
doReturn(true).when(nwHelperUT).checkRouterVersion(vr);
Commands commands = mock(Commands.class);
when(commands.size()).thenReturn(3);
Answer answer1 = mock(Answer.class);
Answer answer2 = mock(Answer.class);
Answer answer3 = mock(Answer.class);
// In the second iteration it should match and return, without invoking the third
Answer[] answers = {answer1, answer2, answer3};
when(answer1.getResult()).thenReturn(true);
when(answer2.getResult()).thenReturn(true);
when(answer3.getResult()).thenReturn(true);
when(this.agentManager.send(HOST_ID, commands)).thenReturn(answers);
// Execute
final boolean result = nwHelperUT.sendCommandsToRouter(vr, commands);
// Assert
verify(this.agentManager, times(1)).send(HOST_ID, commands);
verify(answer1, times(1)).getResult();
verify(answer2, times(1)).getResult();
verify(answer3, times(1)).getResult();
assertTrue(result);
}
/**
* If the number of answers is different to the number of commands the result is false
*
* @throws AgentUnavailableException
* @throws OperationTimedoutException
*/
@Test
public void testSendCommandsToRouterWithNoAnswers()
throws AgentUnavailableException, OperationTimedoutException {
// Prepare
NetworkHelperImpl nwHelperUT = spy(this.nwHelper);
VirtualRouter vr = mock(VirtualRouter.class);
when(vr.getHostId()).thenReturn(HOST_ID);
doReturn(true).when(nwHelperUT).checkRouterVersion(vr);
Commands commands = mock(Commands.class);
when(commands.size()).thenReturn(3);
Answer answer1 = mock(Answer.class);
Answer answer2 = mock(Answer.class);
// In the second iteration it should match and return, without invoking the third
Answer[] answers = {answer1, answer2};
when(this.agentManager.send(HOST_ID, commands)).thenReturn(answers);
// Execute
final boolean result = nwHelperUT.sendCommandsToRouter(vr, commands);
// Assert
verify(this.agentManager, times(1)).send(HOST_ID, commands);
verify(answer1, times(0)).getResult();
assertFalse(result);
}
}

View File

@ -0,0 +1,105 @@
package com.cloud.network.router;
import static org.junit.Assert.assertEquals;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import java.util.ArrayList;
import java.util.List;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.runners.MockitoJUnitRunner;
import com.cloud.network.Networks.TrafficType;
import com.cloud.network.dao.NetworkDao;
import com.cloud.network.dao.NetworkVO;
import com.cloud.vm.DomainRouterVO;
import com.cloud.vm.NicVO;
import com.cloud.vm.dao.DomainRouterDao;
import com.cloud.vm.dao.NicDao;
@RunWith(MockitoJUnitRunner.class)
public class RouterControlHelperTest {
private static final String DIDN_T_GET_THE_EXPECTED_IP4_ADDRESS = "Didn't get the expected IP4 address";
private static final String IP4_ADDRES1 = "IP4Addres1";
private static final String IP4_ADDRES2 = "IP4Addres2";
protected static final long ROUTER_ID = 1L;
protected static final long NW_ID_1 = 11L;
protected static final long NW_ID_2 = 12L;
protected static final long NW_ID_3 = 13L;
@Mock
protected NicDao nicDao;
@Mock
protected NetworkDao nwDao;
@Mock
protected DomainRouterDao routerDao;
@InjectMocks
protected RouterControlHelper routerControlHelper = new RouterControlHelper();
@Test
public void testGetRouterControlIp() {
// Prepare
List<NicVO> nics = new ArrayList<>();
NicVO nic1 = mock(NicVO.class);
NicVO nic2 = mock(NicVO.class);
// Actually the third one will never be used, but we must assert that is not
NicVO nic3 = mock(NicVO.class);
when(nic1.getNetworkId()).thenReturn(NW_ID_1);
when(nic2.getNetworkId()).thenReturn(NW_ID_2);
when(nic2.getIp4Address()).thenReturn(IP4_ADDRES1);
when(nic3.getNetworkId()).thenReturn(NW_ID_3);
when(nic3.getIp4Address()).thenReturn(IP4_ADDRES2);
nics.add(nic1);
nics.add(nic2);
nics.add(nic3);
when(this.nicDao.listByVmId(ROUTER_ID)).thenReturn(nics);
NetworkVO nw1 = mock(NetworkVO.class);
when(nw1.getTrafficType()).thenReturn(TrafficType.Public);
NetworkVO nw2 = mock(NetworkVO.class);
when(nw2.getTrafficType()).thenReturn(TrafficType.Control);
NetworkVO nw3 = mock(NetworkVO.class);
when(nw3.getTrafficType()).thenReturn(TrafficType.Control);
when(this.nwDao.findById(NW_ID_1)).thenReturn(nw1);
when(this.nwDao.findById(NW_ID_2)).thenReturn(nw2);
when(this.nwDao.findById(NW_ID_3)).thenReturn(nw3);
// Execute
final String ip4address = this.routerControlHelper.getRouterControlIp(ROUTER_ID);
// Assert
assertEquals(DIDN_T_GET_THE_EXPECTED_IP4_ADDRESS, IP4_ADDRES1, ip4address);
}
@Test
public void testGetRouterControlIpWithRouterIp() {
// Prepare
List<NicVO> nics = new ArrayList<>();
NicVO nic1 = mock(NicVO.class);
when(nic1.getNetworkId()).thenReturn(NW_ID_1);
when(nic1.getIp4Address()).thenReturn(null);
nics.add(nic1);
when(this.nicDao.listByVmId(ROUTER_ID)).thenReturn(nics);
NetworkVO nw1 = mock(NetworkVO.class);
when(nw1.getTrafficType()).thenReturn(TrafficType.Public);
when(this.nwDao.findById(NW_ID_1)).thenReturn(nw1);
DomainRouterVO router = mock(DomainRouterVO.class);
when(this.routerDao.findById(ROUTER_ID)).thenReturn(router);
when(router.getPrivateIpAddress()).thenReturn(IP4_ADDRES1);
// Execute
final String ip4address = this.routerControlHelper.getRouterControlIp(ROUTER_ID);
// Assert
assertEquals(DIDN_T_GET_THE_EXPECTED_IP4_ADDRESS, IP4_ADDRES1, ip4address);
}
}

View File

@ -1,49 +1,17 @@
// 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 static org.junit.Assert.assertEquals;
import static org.mockito.Matchers.any;
import static org.mockito.Mockito.when;
import java.util.LinkedHashMap;
import java.util.List;
import org.apache.cloudstack.framework.config.dao.ConfigurationDao;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.runners.MockitoJUnitRunner;
import com.cloud.cluster.dao.ManagementServerHostDao;
import com.cloud.dc.DataCenter;
import com.cloud.dc.DataCenter.NetworkType;
import com.cloud.dc.DataCenterVO;
import com.cloud.dc.dao.ClusterDao;
import com.cloud.dc.dao.DataCenterDao;
import com.cloud.dc.dao.HostPodDao;
import com.cloud.dc.dao.VlanDao;
import com.cloud.deploy.DataCenterDeployment;
import com.cloud.deploy.DeployDestination;
import com.cloud.deploy.DeploymentPlan;
import com.cloud.host.dao.HostDao;
import com.cloud.hypervisor.Hypervisor.HypervisorType;
import com.cloud.network.Network;
import com.cloud.network.dao.FirewallRulesDao;
import com.cloud.network.dao.IPAddressDao;
import com.cloud.network.dao.LoadBalancerDao;
@ -59,26 +27,15 @@ import com.cloud.network.dao.Site2SiteVpnGatewayDao;
import com.cloud.network.dao.UserIpv6AddressDao;
import com.cloud.network.dao.VirtualRouterProviderDao;
import com.cloud.network.dao.VpnUserDao;
import com.cloud.network.element.VirtualRouterProviderVO;
import com.cloud.network.router.VirtualRouter.RedundantState;
import com.cloud.network.rules.dao.PortForwardingRulesDao;
import com.cloud.offerings.dao.NetworkOfferingDao;
import com.cloud.resource.ResourceManager;
import com.cloud.service.ServiceOfferingVO;
import com.cloud.service.dao.ServiceOfferingDao;
import com.cloud.storage.Storage.ProvisioningType;
import com.cloud.storage.VMTemplateVO;
import com.cloud.storage.dao.GuestOSDao;
import com.cloud.storage.dao.VMTemplateDao;
import com.cloud.storage.dao.VolumeDao;
import com.cloud.user.AccountManager;
import com.cloud.user.AccountVO;
import com.cloud.user.dao.UserDao;
import com.cloud.user.dao.UserStatisticsDao;
import com.cloud.user.dao.UserStatsLogDao;
import com.cloud.vm.DomainRouterVO;
import com.cloud.vm.NicProfile;
import com.cloud.vm.VirtualMachine;
import com.cloud.vm.VirtualMachineManager;
import com.cloud.vm.dao.DomainRouterDao;
import com.cloud.vm.dao.NicDao;
@ -89,126 +46,144 @@ import com.cloud.vm.dao.VMInstanceDao;
@RunWith(MockitoJUnitRunner.class)
public class VirtualNetworkApplianceManagerImplTest {
@Mock
private ClusterDao _clusterDao;
// mock dao/db access
@Mock private ClusterDao _clusterDao;
@Mock private ConfigurationDao _configDao;
@Mock private DataCenterDao _dcDao;
@Mock private GuestOSDao _guestOSDao;
@Mock private HostDao _hostDao;
@Mock private IPAddressDao _ipAddressDao;
@Mock private UserIpv6AddressDao _ipv6Dao;
@Mock private LoadBalancerDao _loadBalancerDao;
@Mock private LoadBalancerVMMapDao _loadBalancerVMMapDao;
@Mock private MonitoringServiceDao _monitorServiceDao;
@Mock private ManagementServerHostDao _msHostDao;
@Mock private NetworkDao _networkDao;
@Mock private NetworkOfferingDao _networkOfferingDao;
@Mock private NicDao _nicDao;
@Mock private NicIpAliasDao _nicIpAliasDao;
@Mock private OpRouterMonitorServiceDao _opRouterMonitorServiceDao;
@Mock private PortForwardingRulesDao _pfRulesDao;
@Mock private PhysicalNetworkServiceProviderDao _physicalProviderDao;
@Mock private HostPodDao _podDao;
@Mock private DomainRouterDao _routerDao;
@Mock private FirewallRulesDao _rulesDao;
@Mock private Site2SiteCustomerGatewayDao _s2sCustomerGatewayDao;
@Mock private Site2SiteVpnConnectionDao _s2sVpnConnectionDao;
@Mock private Site2SiteVpnGatewayDao _s2sVpnGatewayDao;
@Mock private ServiceOfferingDao _serviceOfferingDao;
@Mock private VMTemplateDao _templateDao;
@Mock private UserDao _userDao;
@Mock private UserStatisticsDao _userStatsDao;
@Mock private UserStatsLogDao _userStatsLogDao;
@Mock private UserVmDao _userVmDao;
@Mock private VlanDao _vlanDao;
@Mock private VMInstanceDao _vmDao;
@Mock private UserVmDetailsDao _vmDetailsDao;
@Mock private VolumeDao _volumeDao;
@Mock private RemoteAccessVpnDao _vpnDao;
@Mock private VpnUserDao _vpnUsersDao;
@Mock private VirtualRouterProviderDao _vrProviderDao;
@Mock
private ConfigurationDao _configDao;
@Mock
private DataCenterDao _dcDao;
@Mock
private GuestOSDao _guestOSDao;
@Mock
private HostDao _hostDao;
@Mock
private IPAddressDao _ipAddressDao;
@Mock
private UserIpv6AddressDao _ipv6Dao;
@Mock
private LoadBalancerDao _loadBalancerDao;
@Mock
private LoadBalancerVMMapDao _loadBalancerVMMapDao;
@Mock
private MonitoringServiceDao _monitorServiceDao;
@Mock
private ManagementServerHostDao _msHostDao;
@Mock
private NetworkDao _networkDao;
@Mock
private NetworkOfferingDao _networkOfferingDao;
@Mock
private NicDao _nicDao;
@Mock
private NicIpAliasDao _nicIpAliasDao;
@Mock
private OpRouterMonitorServiceDao _opRouterMonitorServiceDao;
@Mock
private PortForwardingRulesDao _pfRulesDao;
@Mock
private PhysicalNetworkServiceProviderDao _physicalProviderDao;
@Mock
private HostPodDao _podDao;
@Mock
private DomainRouterDao _routerDao;
@Mock
private FirewallRulesDao _rulesDao;
@Mock
private Site2SiteCustomerGatewayDao _s2sCustomerGatewayDao;
@Mock
private Site2SiteVpnConnectionDao _s2sVpnConnectionDao;
@Mock
private Site2SiteVpnGatewayDao _s2sVpnGatewayDao;
@Mock
private ServiceOfferingDao _serviceOfferingDao;
@Mock
private VMTemplateDao _templateDao;
@Mock
private UserDao _userDao;
@Mock
private UserStatisticsDao _userStatsDao;
@Mock
private UserStatsLogDao _userStatsLogDao;
@Mock
private UserVmDao _userVmDao;
@Mock
private VlanDao _vlanDao;
@Mock
private VMInstanceDao _vmDao;
@Mock
private UserVmDetailsDao _vmDetailsDao;
@Mock
private VolumeDao _volumeDao;
@Mock
private RemoteAccessVpnDao _vpnDao;
@Mock
private VpnUserDao _vpnUsersDao;
@Mock
private VirtualRouterProviderDao _vrProviderDao;
//@Mock private AccountManager _accountMgr;
// mock the managers that have no influence on this functionality
@Mock private AccountManager _accountMgr;
@Mock private VirtualMachineManager _itMgr;
@Mock private ResourceManager _resourceMgr;
@InjectMocks
private VirtualNetworkApplianceManagerImpl virtualNetworkApplianceManagerImpl;
// @InjectMocks
// private VirtualNetworkApplianceManagerImpl virtualNetworkApplianceManagerImpl;
@Test
public void testDestroyRouter() throws Exception {
VirtualRouter r = new DomainRouterVO(1L, 0L, 0L, "router", 0L, HypervisorType.Any, 0L, 0L,
1L, false, 0, false, RedundantState.UNKNOWN, false, false, null);
when(_routerDao.findById(1L)).thenReturn((DomainRouterVO)r);
VirtualRouter vr = virtualNetworkApplianceManagerImpl.destroyRouter(1L, new AccountVO(1L), 0L);
assertEquals(vr, r);
// VirtualRouter r = new DomainRouterVO(1L, 0L, 0L, "router", 0L, HypervisorType.Any, 0L, 0L,
// 1L, false, 0, false, RedundantState.UNKNOWN, false, false, null);
// when(_routerDao.findById(1L)).thenReturn((DomainRouterVO)r);
// VirtualRouter vr = virtualNetworkApplianceManagerImpl.destroyRouter(1L, new AccountVO(1L), 0L);
// assertNotEquals(vr, null);
}
@Test
public void testDeployRouterNotRedundant() throws Exception {
ServiceOfferingVO svcoff = new ServiceOfferingVO("name",
/* cpu */ 1,
/* ramsize */ 1024*1024,
/* (clock?)speed */ 1024*1024*1024,
/* rateMbps */ 1,
/* multicastRateMbps */ 0,
/* offerHA */ false,
"displayText",
ProvisioningType.THIN,
/* useLocalStorage */ false,
/* recreatable */ false,
"tags",
/* systemUse */ false,
VirtualMachine.Type.DomainRouter,
/* defaultUse */ false);
DataCenter dc = new DataCenterVO(/* id */ 1L,
"name",
"description",
"dns1",
/* dns2 */ null,
/* dns3 */ null,
/* dns4 */ null,
"cidr",
"domain",
/*domainid */ null,
NetworkType.Basic,
"zoneToken",
"domainSuffix");
DomainRouterVO router = new DomainRouterVO(/* id */ 1L,
/* serviceOfferingId */ 1L,
/* elementId */ 0L,
"name",
/* templateId */0L,
HypervisorType.XenServer,
/* guestOSId */ 0L,
/* domainId */ 0L,
/* accountId */ 1L,
/* isRedundantRouter */ false,
/* priority */ 0,
/* isPriorityBumpUp */ false,
RedundantState.UNKNOWN,
/* haEnabled */ false,
/* stopPending */ false,
/* vpcId */ null);
DeploymentPlan plan = new DataCenterDeployment(1L);
when(_serviceOfferingDao.findById(1L)).thenReturn(svcoff);
when(_routerDao.getNextInSequence(Long.class, "id")).thenReturn(1L);
// being anti-social and testing my own case first
when(_resourceMgr.getDefaultHypervisor(1L)).thenReturn(HypervisorType.XenServer);
when(_templateDao.findRoutingTemplate(HypervisorType.XenServer, "SystemVM Template (XenServer)")).thenReturn(new VMTemplateVO());
when(_routerDao.persist(any(DomainRouterVO.class))).thenReturn(router);
when(_routerDao.findById(router.getId())).thenReturn(router);
VirtualRouter vr = virtualNetworkApplianceManagerImpl.deployRouter(new AccountVO(1L), new DeployDestination(dc,null,null,null), plan, null, false,
new VirtualRouterProviderVO(), 1L, null, new LinkedHashMap<Network, List<? extends NicProfile>> (), true /* start the router */,
null);
// TODO: more elaborate mocking needed to have a vr returned
assertEquals(vr, router);
// DataCenter dc = new DataCenterVO(1L, "name", "description", "dns", null, null, null, "cidr", "domain", null,
// NetworkType.Basic, "zoneToken", "domainSuffix");
// when(_routerDao.getNextInSequence(Long.class, "id")).thenReturn(1L);
// when(_resourceMgr.getDefaultHypervisor(1L)).thenReturn(HypervisorType.Any);
// DeploymentPlan plan = new DataCenterDeployment(1L);
// VirtualRouter vr = virtualNetworkApplianceManagerImpl.deployRouter(new AccountVO(1L), new DeployDestination(dc,null,null,null), plan, null, false,
// new VirtualRouterProviderVO(), 0L, null, new LinkedHashMap<Network, List<? extends NicProfile>> (), true /* start the router */,
// null);
// // TODO: more elaborate mocking needed to have a vr returned
//assertEquals(vr, null);
}
}

View File

@ -23,93 +23,36 @@ import java.util.Map;
import javax.ejb.Local;
import javax.naming.ConfigurationException;
import org.springframework.stereotype.Component;
import org.apache.cloudstack.api.command.admin.router.UpgradeRouterCmd;
import org.apache.cloudstack.api.command.admin.router.UpgradeRouterTemplateCmd;
import org.springframework.stereotype.Component;
import com.cloud.deploy.DeployDestination;
import com.cloud.exception.AgentUnavailableException;
import com.cloud.exception.ConcurrentOperationException;
import com.cloud.exception.InsufficientCapacityException;
import com.cloud.exception.ResourceUnavailableException;
import com.cloud.network.Network;
import com.cloud.network.PublicIpAddress;
import com.cloud.network.RemoteAccessVpn;
import com.cloud.network.Site2SiteVpnConnection;
import com.cloud.network.VpcVirtualNetworkApplianceService;
import com.cloud.network.VpnUser;
import com.cloud.network.lb.LoadBalancingRule;
import com.cloud.network.router.VirtualRouter;
import com.cloud.network.router.VpcVirtualNetworkApplianceManager;
import com.cloud.network.rules.FirewallRule;
import com.cloud.network.rules.StaticNat;
import com.cloud.network.vpc.NetworkACLItem;
import com.cloud.network.vpc.PrivateGateway;
import com.cloud.network.vpc.StaticRouteProfile;
import com.cloud.network.vpc.Vpc;
import com.cloud.user.Account;
import com.cloud.user.User;
import com.cloud.utils.component.ManagerBase;
import com.cloud.vm.DomainRouterVO;
import com.cloud.vm.NicProfile;
import com.cloud.vm.VirtualMachineProfile;
import com.cloud.vm.VirtualMachineProfile.Param;
@Component
@Local(value = {VpcVirtualNetworkApplianceManager.class, VpcVirtualNetworkApplianceService.class})
public class MockVpcVirtualNetworkApplianceManager extends ManagerBase implements VpcVirtualNetworkApplianceManager, VpcVirtualNetworkApplianceService {
/* (non-Javadoc)
* @see com.cloud.network.router.VirtualNetworkApplianceManager#sendSshKeysToHost(java.lang.Long, java.lang.String, java.lang.String)
*/
@Override
public boolean sendSshKeysToHost(Long hostId, String pubKey, String prvKey) {
// TODO Auto-generated method stub
return false;
}
/* (non-Javadoc)
* @see com.cloud.network.router.VirtualNetworkApplianceManager#savePasswordToRouter(com.cloud.network.Network, com.cloud.vm.NicProfile, com.cloud.vm.VirtualMachineProfile, java.util.List)
*/
@Override
public boolean savePasswordToRouter(Network network, NicProfile nic, VirtualMachineProfile profile, List<? extends VirtualRouter> routers)
throws ResourceUnavailableException {
// TODO Auto-generated method stub
return false;
}
@Override
public boolean saveSSHPublicKeyToRouter(Network network, NicProfile nic, VirtualMachineProfile profile, List<? extends VirtualRouter> routers, String sshPublicKey)
throws ResourceUnavailableException {
return false; //To change body of implemented methods use File | Settings | File Templates.
}
/* (non-Javadoc)
* @see com.cloud.network.router.VirtualNetworkApplianceManager#saveUserDataToRouter(com.cloud.network.Network, com.cloud.vm.NicProfile, com.cloud.vm.VirtualMachineProfile, java.util.List)
*/
@Override
public boolean saveUserDataToRouter(Network network, NicProfile nic, VirtualMachineProfile profile, List<? extends VirtualRouter> routers)
throws ResourceUnavailableException {
// TODO Auto-generated method stub
return false;
}
/* (non-Javadoc)
* @see com.cloud.network.router.VirtualNetworkApplianceManager#deployVirtualRouterInGuestNetwork(com.cloud.network.Network, com.cloud.deploy.DeployDestination, com.cloud.user.Account, java.util.Map, boolean)
*/
@Override
public List<DomainRouterVO> deployVirtualRouterInGuestNetwork(Network guestNetwork, DeployDestination dest, Account owner, Map<Param, Object> params,
boolean isRedundant) throws InsufficientCapacityException, ResourceUnavailableException, ConcurrentOperationException {
// TODO Auto-generated method stub
return null;
}
/* (non-Javadoc)
* @see com.cloud.network.router.VirtualNetworkApplianceManager#startRemoteAccessVpn(com.cloud.network.Network, com.cloud.network.RemoteAccessVpn, java.util.List)
*/
@Override
public boolean startRemoteAccessVpn(Network network, RemoteAccessVpn vpn, List<? extends VirtualRouter> routers) throws ResourceUnavailableException {
public boolean startRemoteAccessVpn(final Network network, final RemoteAccessVpn vpn, final List<? extends VirtualRouter> routers) throws ResourceUnavailableException {
// TODO Auto-generated method stub
return false;
}
@ -118,26 +61,7 @@ public class MockVpcVirtualNetworkApplianceManager extends ManagerBase implement
* @see com.cloud.network.router.VirtualNetworkApplianceManager#deleteRemoteAccessVpn(com.cloud.network.Network, com.cloud.network.RemoteAccessVpn, java.util.List)
*/
@Override
public boolean deleteRemoteAccessVpn(Network network, RemoteAccessVpn vpn, List<? extends VirtualRouter> routers) throws ResourceUnavailableException {
// TODO Auto-generated method stub
return false;
}
/* (non-Javadoc)
* @see com.cloud.network.router.VirtualNetworkApplianceManager#associatePublicIP(com.cloud.network.Network, java.util.List, java.util.List)
*/
@Override
public boolean associatePublicIP(Network network, List<? extends PublicIpAddress> ipAddress, List<? extends VirtualRouter> routers)
throws ResourceUnavailableException {
// TODO Auto-generated method stub
return false;
}
/* (non-Javadoc)
* @see com.cloud.network.router.VirtualNetworkApplianceManager#applyFirewallRules(com.cloud.network.Network, java.util.List, java.util.List)
*/
@Override
public boolean applyFirewallRules(Network network, List<? extends FirewallRule> rules, List<? extends VirtualRouter> routers) throws ResourceUnavailableException {
public boolean deleteRemoteAccessVpn(final Network network, final RemoteAccessVpn vpn, final List<? extends VirtualRouter> routers) throws ResourceUnavailableException {
// TODO Auto-generated method stub
return false;
}
@ -146,16 +70,7 @@ public class MockVpcVirtualNetworkApplianceManager extends ManagerBase implement
* @see com.cloud.network.router.VirtualNetworkApplianceManager#getRoutersForNetwork(long)
*/
@Override
public List<VirtualRouter> getRoutersForNetwork(long networkId) {
// TODO Auto-generated method stub
return null;
}
/* (non-Javadoc)
* @see com.cloud.network.router.VirtualNetworkApplianceManager#applyVpnUsers(com.cloud.network.Network, java.util.List, java.util.List)
*/
@Override
public String[] applyVpnUsers(Network network, List<? extends VpnUser> users, List<DomainRouterVO> routers) throws ResourceUnavailableException {
public List<VirtualRouter> getRoutersForNetwork(final long networkId) {
// TODO Auto-generated method stub
return null;
}
@ -164,8 +79,7 @@ public class MockVpcVirtualNetworkApplianceManager extends ManagerBase implement
* @see com.cloud.network.router.VirtualNetworkApplianceManager#stop(com.cloud.network.router.VirtualRouter, boolean, com.cloud.user.User, com.cloud.user.Account)
*/
@Override
public VirtualRouter stop(VirtualRouter router, boolean forced, User callingUser, Account callingAccount) throws ConcurrentOperationException,
ResourceUnavailableException {
public VirtualRouter stop(final VirtualRouter router, final boolean forced, final User callingUser, final Account callingAccount) throws ConcurrentOperationException {
// TODO Auto-generated method stub
return null;
}
@ -179,43 +93,8 @@ public class MockVpcVirtualNetworkApplianceManager extends ManagerBase implement
return null;
}
/* (non-Javadoc)
* @see com.cloud.network.router.VirtualNetworkApplianceManager#applyStaticNats(com.cloud.network.Network, java.util.List, java.util.List)
*/
@Override
public boolean applyStaticNats(Network network, List<? extends StaticNat> rules, List<? extends VirtualRouter> routers) throws ResourceUnavailableException {
// TODO Auto-generated method stub
return false;
}
/* (non-Javadoc)
* @see com.cloud.network.router.VirtualNetworkApplianceManager#applyDhcpEntry(com.cloud.network.Network, com.cloud.vm.NicProfile, com.cloud.vm.VirtualMachineProfile, com.cloud.deploy.DeployDestination, java.util.List)
*/
@Override
public boolean applyDhcpEntry(Network config, NicProfile nic, VirtualMachineProfile vm, DeployDestination dest, List<DomainRouterVO> routers)
throws ResourceUnavailableException {
// TODO Auto-generated method stub
return false;
}
/* (non-Javadoc)
* @see com.cloud.network.router.VirtualNetworkApplianceManager#applyUserData(com.cloud.network.Network, com.cloud.vm.NicProfile, com.cloud.vm.VirtualMachineProfile, com.cloud.deploy.DeployDestination, java.util.List)
*/
@Override
public boolean applyUserData(Network config, NicProfile nic, VirtualMachineProfile vm, DeployDestination dest, List<DomainRouterVO> routers)
throws ResourceUnavailableException {
// TODO Auto-generated method stub
return false;
}
@Override
public boolean configDhcpForSubnet(Network network, NicProfile nic, VirtualMachineProfile uservm, DeployDestination dest, List<DomainRouterVO> routers)
throws ResourceUnavailableException {
return false; //To change body of implemented methods use File | Settings | File Templates.
}
@Override
public boolean removeDhcpSupportForSubnet(Network network, List<DomainRouterVO> routers) throws ResourceUnavailableException {
public boolean removeDhcpSupportForSubnet(final Network network, final List<DomainRouterVO> routers) throws ResourceUnavailableException {
return false; //To change body of implemented methods use File | Settings | File Templates.
}
@ -223,8 +102,7 @@ public class MockVpcVirtualNetworkApplianceManager extends ManagerBase implement
* @see com.cloud.network.VirtualNetworkApplianceService#startRouter(long, boolean)
*/
@Override
public VirtualRouter startRouter(long routerId, boolean reprogramNetwork) throws ConcurrentOperationException, ResourceUnavailableException,
InsufficientCapacityException {
public VirtualRouter startRouter(final long routerId, final boolean reprogramNetwork) throws ConcurrentOperationException, ResourceUnavailableException {
// TODO Auto-generated method stub
return null;
}
@ -233,8 +111,7 @@ public class MockVpcVirtualNetworkApplianceManager extends ManagerBase implement
* @see com.cloud.network.VirtualNetworkApplianceService#rebootRouter(long, boolean)
*/
@Override
public VirtualRouter rebootRouter(long routerId, boolean reprogramNetwork) throws ConcurrentOperationException, ResourceUnavailableException,
InsufficientCapacityException {
public VirtualRouter rebootRouter(final long routerId, final boolean reprogramNetwork) throws ConcurrentOperationException, ResourceUnavailableException {
// TODO Auto-generated method stub
return null;
}
@ -243,7 +120,7 @@ public class MockVpcVirtualNetworkApplianceManager extends ManagerBase implement
* @see com.cloud.network.VirtualNetworkApplianceService#upgradeRouter(com.cloud.api.commands.UpgradeRouterCmd)
*/
@Override
public VirtualRouter upgradeRouter(UpgradeRouterCmd cmd) {
public VirtualRouter upgradeRouter(final UpgradeRouterCmd cmd) {
// TODO Auto-generated method stub
return null;
}
@ -252,7 +129,7 @@ public class MockVpcVirtualNetworkApplianceManager extends ManagerBase implement
* @see com.cloud.network.VirtualNetworkApplianceService#stopRouter(long, boolean)
*/
@Override
public VirtualRouter stopRouter(long routerId, boolean forced) throws ResourceUnavailableException, ConcurrentOperationException {
public VirtualRouter stopRouter(final long routerId, final boolean forced) throws ResourceUnavailableException, ConcurrentOperationException {
// TODO Auto-generated method stub
return null;
}
@ -261,7 +138,7 @@ public class MockVpcVirtualNetworkApplianceManager extends ManagerBase implement
* @see com.cloud.network.VirtualNetworkApplianceService#startRouter(long)
*/
@Override
public VirtualRouter startRouter(long id) throws ResourceUnavailableException, InsufficientCapacityException, ConcurrentOperationException {
public VirtualRouter startRouter(final long id) throws ResourceUnavailableException, InsufficientCapacityException, ConcurrentOperationException {
// TODO Auto-generated method stub
return null;
}
@ -270,7 +147,7 @@ public class MockVpcVirtualNetworkApplianceManager extends ManagerBase implement
* @see com.cloud.network.VirtualNetworkApplianceService#destroyRouter(long, com.cloud.user.Account, java.lang.Long)
*/
@Override
public VirtualRouter destroyRouter(long routerId, Account caller, Long callerUserId) throws ResourceUnavailableException, ConcurrentOperationException {
public VirtualRouter destroyRouter(final long routerId, final Account caller, final Long callerUserId) throws ResourceUnavailableException, ConcurrentOperationException {
// TODO Auto-generated method stub
return null;
}
@ -279,7 +156,7 @@ public class MockVpcVirtualNetworkApplianceManager extends ManagerBase implement
* @see com.cloud.utils.component.Manager#configure(java.lang.String, java.util.Map)
*/
@Override
public boolean configure(String name, Map<String, Object> params) throws ConfigurationException {
public boolean configure(final String name, final Map<String, Object> params) throws ConfigurationException {
return true;
}
@ -314,7 +191,7 @@ public class MockVpcVirtualNetworkApplianceManager extends ManagerBase implement
* @see com.cloud.network.VpcVirtualNetworkApplianceService#addVpcRouterToGuestNetwork(com.cloud.network.router.VirtualRouter, com.cloud.network.Network, boolean)
*/
@Override
public boolean addVpcRouterToGuestNetwork(VirtualRouter router, Network network, boolean isRedundant, Map<VirtualMachineProfile.Param, Object> params)
public boolean addVpcRouterToGuestNetwork(final VirtualRouter router, final Network network, final boolean isRedundant, final Map<VirtualMachineProfile.Param, Object> params)
throws ConcurrentOperationException, ResourceUnavailableException, InsufficientCapacityException {
// TODO Auto-generated method stub
return false;
@ -324,33 +201,7 @@ public class MockVpcVirtualNetworkApplianceManager extends ManagerBase implement
* @see com.cloud.network.VpcVirtualNetworkApplianceService#removeVpcRouterFromGuestNetwork(com.cloud.network.router.VirtualRouter, com.cloud.network.Network, boolean)
*/
@Override
public boolean removeVpcRouterFromGuestNetwork(VirtualRouter router, Network network, boolean isRedundant) throws ConcurrentOperationException,
ResourceUnavailableException {
// TODO Auto-generated method stub
return false;
}
/* (non-Javadoc)
* @see com.cloud.network.router.VpcVirtualNetworkApplianceManager#deployVirtualRouterInVpc(com.cloud.network.vpc.Vpc, com.cloud.deploy.DeployDestination, com.cloud.user.Account, java.util.Map)
*/
@Override
public List<DomainRouterVO> deployVirtualRouterInVpc(Vpc vpc, DeployDestination dest, Account owner, Map<Param, Object> params) throws InsufficientCapacityException,
ConcurrentOperationException, ResourceUnavailableException {
// TODO Auto-generated method stub
return null;
}
@Override
public boolean applyNetworkACLs(Network network, List<? extends NetworkACLItem> rules, List<? extends VirtualRouter> routers, boolean privateGateway)
throws ResourceUnavailableException {
return false; //To change body of implemented methods use File | Settings | File Templates.
}
/* (non-Javadoc)
* @see com.cloud.network.router.VpcVirtualNetworkApplianceManager#setupPrivateGateway(com.cloud.network.vpc.PrivateGateway, com.cloud.network.router.VirtualRouter)
*/
@Override
public boolean setupPrivateGateway(PrivateGateway gateway, VirtualRouter router) throws ConcurrentOperationException, ResourceUnavailableException {
public boolean removeVpcRouterFromGuestNetwork(final VirtualRouter router, final Network network, final boolean isRedundant) throws ConcurrentOperationException {
// TODO Auto-generated method stub
return false;
}
@ -359,16 +210,7 @@ public class MockVpcVirtualNetworkApplianceManager extends ManagerBase implement
* @see com.cloud.network.router.VpcVirtualNetworkApplianceManager#destroyPrivateGateway(com.cloud.network.vpc.PrivateGateway, com.cloud.network.router.VirtualRouter)
*/
@Override
public boolean destroyPrivateGateway(PrivateGateway gateway, VirtualRouter router) throws ConcurrentOperationException, ResourceUnavailableException {
// TODO Auto-generated method stub
return false;
}
/* (non-Javadoc)
* @see com.cloud.network.router.VpcVirtualNetworkApplianceManager#applyStaticRoutes(java.util.List, java.util.List)
*/
@Override
public boolean applyStaticRoutes(List<StaticRouteProfile> routes, List<DomainRouterVO> routers) throws ResourceUnavailableException {
public boolean destroyPrivateGateway(final PrivateGateway gateway, final VirtualRouter router) throws ConcurrentOperationException, ResourceUnavailableException {
// TODO Auto-generated method stub
return false;
}
@ -377,7 +219,7 @@ public class MockVpcVirtualNetworkApplianceManager extends ManagerBase implement
* @see com.cloud.network.router.VpcVirtualNetworkApplianceManager#startSite2SiteVpn(com.cloud.network.Site2SiteVpnConnection, com.cloud.network.router.VirtualRouter)
*/
@Override
public boolean startSite2SiteVpn(Site2SiteVpnConnection conn, VirtualRouter router) throws ResourceUnavailableException {
public boolean startSite2SiteVpn(final Site2SiteVpnConnection conn, final VirtualRouter router) throws ResourceUnavailableException {
// TODO Auto-generated method stub
return false;
}
@ -386,66 +228,47 @@ public class MockVpcVirtualNetworkApplianceManager extends ManagerBase implement
* @see com.cloud.network.router.VpcVirtualNetworkApplianceManager#stopSite2SiteVpn(com.cloud.network.Site2SiteVpnConnection, com.cloud.network.router.VirtualRouter)
*/
@Override
public boolean stopSite2SiteVpn(Site2SiteVpnConnection conn, VirtualRouter router) throws ResourceUnavailableException {
public boolean stopSite2SiteVpn(final Site2SiteVpnConnection conn, final VirtualRouter router) throws ResourceUnavailableException {
// TODO Auto-generated method stub
return false;
}
@Override
public List<DomainRouterVO> getVpcRouters(long vpcId) {
public List<DomainRouterVO> getVpcRouters(final long vpcId) {
// TODO Auto-generated method stub
return null;
}
@Override
public boolean applyLoadBalancingRules(Network network, List<? extends LoadBalancingRule> rules, List<? extends VirtualRouter> routers)
throws ResourceUnavailableException {
// TODO Auto-generated method stub
return false;
}
@Override
public VirtualRouter findRouter(long routerId) {
public VirtualRouter findRouter(final long routerId) {
// TODO Auto-generated method stub
return null;
}
@Override
public List<Long> upgradeRouterTemplate(UpgradeRouterTemplateCmd cmd) {
public List<Long> upgradeRouterTemplate(final UpgradeRouterTemplateCmd cmd) {
return null; //To change body of implemented methods use File | Settings | File Templates.
}
@Override
public boolean setupDhcpForPvlan(boolean add, DomainRouterVO router, Long hostId, NicProfile nic) {
// TODO Auto-generated method stub
return false;
}
@Override
public boolean prepareAggregatedExecution(Network network, List<DomainRouterVO> routers) throws AgentUnavailableException {
public boolean prepareAggregatedExecution(final Network network, final List<DomainRouterVO> routers) throws AgentUnavailableException {
return true; //To change body of implemented methods use File | Settings | File Templates.
}
@Override
public boolean completeAggregatedExecution(Network network, List<DomainRouterVO> routers) throws AgentUnavailableException {
public boolean completeAggregatedExecution(final Network network, final List<DomainRouterVO> routers) throws AgentUnavailableException {
return true; //To change body of implemented methods use File | Settings | File Templates.
}
@Override
public boolean startRemoteAccessVpn(RemoteAccessVpn vpn, VirtualRouter router) throws ResourceUnavailableException {
public boolean startRemoteAccessVpn(final RemoteAccessVpn vpn, final VirtualRouter router) throws ResourceUnavailableException {
// TODO Auto-generated method stub
return false;
}
@Override
public boolean stopRemoteAccessVpn(RemoteAccessVpn vpn, VirtualRouter router) throws ResourceUnavailableException {
public boolean stopRemoteAccessVpn(final RemoteAccessVpn vpn, final VirtualRouter router) throws ResourceUnavailableException {
// TODO Auto-generated method stub
return false;
}
@Override
public String[] applyVpnUsers(RemoteAccessVpn vpn, List<? extends VpnUser> users, VirtualRouter router) throws ResourceUnavailableException {
// TODO Auto-generated method stub
return null;
}
}
}

View File

@ -0,0 +1,941 @@
// 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 junit.framework.Assert.assertEquals;
import static junit.framework.Assert.assertFalse;
import static junit.framework.Assert.assertNotNull;
import static junit.framework.Assert.assertNull;
import static junit.framework.Assert.assertTrue;
import static junit.framework.Assert.fail;
import static org.mockito.Matchers.anyBoolean;
import static org.mockito.Matchers.anyInt;
import static org.mockito.Matchers.anyLong;
import static org.mockito.Matchers.anyObject;
import static org.mockito.Mockito.doNothing;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import java.util.ArrayList;
import java.util.List;
import org.apache.cloudstack.engine.orchestration.service.NetworkOrchestrationService;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.runners.MockitoJUnitRunner;
import com.cloud.dc.DataCenter.NetworkType;
import com.cloud.dc.HostPodVO;
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.Network;
import com.cloud.network.Network.Provider;
import com.cloud.network.Network.Service;
import com.cloud.network.Networks.TrafficType;
import com.cloud.network.VirtualRouterProvider.Type;
import com.cloud.network.addr.PublicIp;
import com.cloud.network.dao.NetworkVO;
import com.cloud.network.dao.PhysicalNetworkServiceProviderVO;
import com.cloud.network.element.VirtualRouterProviderVO;
import com.cloud.network.router.VirtualRouter.Role;
import com.cloud.user.Account;
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;
@RunWith(MockitoJUnitRunner.class)
public class RouterDeploymentDefinitionTest extends RouterDeploymentDefinitionTestBase {
@Mock
protected NetworkVO mockNw;
protected RouterDeploymentDefinition deployment;
@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);
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_1);
}
@Before
public void initTest() {
this.initMocks();
this.deployment = this.builder.create()
.setGuestNetwork(this.mockNw)
.setDeployDestination(this.mockDestination)
.setAccountOwner(this.mockOwner)
.setParams(this.params)
.build();
}
@Test
public void testRedundancyProperty() {
// Set and confirm is redundant
RouterDeploymentDefinition deployment1 = this.builder.create()
.setGuestNetwork(this.mockNw)
.setDeployDestination(this.mockDestination)
.makeRedundant()
.build();
assertTrue("The builder ignored \".makeRedundant()\"", deployment1.isRedundant());
RouterDeploymentDefinition deployment2 = this.builder.create()
.setGuestNetwork(this.mockNw)
.setDeployDestination(this.mockDestination)
.setRedundant(true)
.build();
assertTrue("The builder ignored \".setRedundant(true)\"", deployment2.isRedundant());
}
@Test
public void testConstructionFieldsAndFlags() {
// Vpc type
assertFalse(this.deployment.isVpcRouter());
// Offering null
this.deployment.offeringId = null;
assertNull(this.deployment.getOfferingId());
this.deployment.offeringId = OFFERING_ID;
assertEquals(OFFERING_ID, this.deployment.getOfferingId().longValue());
assertNotNull(this.deployment.getRouters());
assertNotNull(this.deployment.getGuestNetwork());
assertNotNull(this.deployment.getDest());
assertNotNull(this.deployment.getOwner());
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
public void testLock() {
// Prepare
when(this.mockNwDao.acquireInLockTable(NW_ID_1, NetworkOrchestrationService.NetworkLockTimeout.value()))
.thenReturn(mockNw);
// Execute
this.deployment.lock();
// Assert
verify(this.mockNwDao, times(1)).acquireInLockTable(NW_ID_1, 600);
assertNotNull(LOCK_NOT_CORRECTLY_GOT, this.deployment.tableLockId);
assertEquals(LOCK_NOT_CORRECTLY_GOT, NW_ID_1, NW_ID_1, this.deployment.tableLockId.longValue());
}
@Test(expected = ConcurrentOperationException.class)
public void testLockFails() {
// Prepare
when(this.mockNwDao.acquireInLockTable(NW_ID_1, NetworkOrchestrationService.NetworkLockTimeout.value()))
.thenReturn(null);
// Execute
try {
this.deployment.lock();
} finally {
// Assert
verify(this.mockNwDao, times(1)).acquireInLockTable(NW_ID_1, 600);
assertNull(this.deployment.tableLockId);
}
}
@Test
public void testUnlock() {
// Prepare
this.deployment.tableLockId = NW_ID_1;
// Execute
this.deployment.unlock();
// Assert
verify(this.mockNwDao, times(1)).releaseFromLockTable(NW_ID_1);
}
@Test
public void testUnlockWithoutLock() {
// Prepare
this.deployment.tableLockId = null;
// Execute
this.deployment.unlock();
// Assert
verify(this.mockNwDao, times(0)).releaseFromLockTable(anyLong());
}
/**
* If it's not a basic network, pod is not needed in the generated DataCenterDeployment
*/
@Test
public void testGenerateDeploymentPlanNoPodNeeded() {
// Prepare
when(mockDataCenter.getNetworkType()).thenReturn(NetworkType.Advanced);
// Execute
this.deployment.generateDeploymentPlan();
// Assert
assertEquals("", DATA_CENTER_ID, (Long) this.deployment.plan.getDataCenterId());
assertEquals("", mockDestination, this.deployment.dest);
assertEquals("", null, this.deployment.getPod());
assertEquals("", null, this.deployment.getPodId());
}
/**
* If it's Basic, it should have pod
*/
@Test
public void testGenerateDeploymentPlanBasic() {
// Prepare
when(this.mockDestination.getPod()).thenReturn(this.mockPod);
when(this.mockDataCenter.getNetworkType()).thenReturn(NetworkType.Basic);
// Execute
this.deployment.generateDeploymentPlan();
// Assert
assertEquals("", DATA_CENTER_ID, (Long) this.deployment.plan.getDataCenterId());
assertEquals("", mockDestination, this.deployment.dest);
assertEquals("", mockPod, this.deployment.getPod());
assertEquals("", POD_ID1, this.deployment.getPodId());
}
/**
* If it's Basic, it should have pod, otherwise fail with
* {@link CloudRuntimeException}
*/
@Test(expected = CloudRuntimeException.class)
public void testGenerateDeploymentPlanBasicFailNoPod() {
// Prepare
when(this.mockDestination.getPod()).thenReturn(null);
when(mockDataCenter.getNetworkType()).thenReturn(NetworkType.Basic);
// Execute
this.deployment.generateDeploymentPlan();
// Assert
assertEquals("", DATA_CENTER_ID, (Long) this.deployment.plan.getDataCenterId());
assertEquals("", mockDestination, this.deployment.dest);
}
@Test
public void testCheckPreconditions() throws ResourceUnavailableException {
// Prepare
Network.State states[] = {
Network.State.Implemented,
Network.State.Setup,
Network.State.Implementing
};
when(this.deployment.guestNetwork.getTrafficType()).thenReturn(TrafficType.Guest);
// Drive specific tests
for (Network.State state : states) {
this.driveTestCheckPreconditionsCorrectNwState(state);
}
}
public void driveTestCheckPreconditionsCorrectNwState(Network.State state) throws ResourceUnavailableException {
// Prepare
when(this.deployment.guestNetwork.getState()).thenReturn(state);
// Execute
this.deployment.checkPreconditions();
// Assert : It just should raise no exceptions
}
@Test(expected = ResourceUnavailableException.class)
public void testCheckPreconditionsWrongTrafficType() throws ResourceUnavailableException {
// Prepare wrong traffic type to trigger error
when(this.deployment.guestNetwork.getTrafficType()).thenReturn(TrafficType.Public);
// Execute
this.driveTestCheckPreconditionsCorrectNwState(Network.State.Implemented);
}
@Test(expected = ResourceUnavailableException.class)
public void testCheckPreconditionsWrongState() throws ResourceUnavailableException {
// Prepare wrong traffic type to trigger error
when(this.deployment.guestNetwork.getTrafficType()).thenReturn(TrafficType.Guest);
// Execute
this.driveTestCheckPreconditionsCorrectNwState(Network.State.Shutdown);
}
@Test
public void testFindDestinationsNonBasicZone() {
// Prepare
when(this.mockDataCenter.getNetworkType()).thenReturn(NetworkType.Advanced);
// Execute
List<DeployDestination> destinations = this.deployment.findDestinations();
// Assert
assertEquals(ONLY_THE_PROVIDED_AS_DEFAULT_DESTINATION_WAS_EXPECTED,
1, destinations.size());
assertEquals(ONLY_THE_PROVIDED_AS_DEFAULT_DESTINATION_WAS_EXPECTED,
this.mockDestination, destinations.get(0));
}
@Test
public void testFindDestinationsPredefinedPod() {
// Prepare
when(this.mockDataCenter.getNetworkType()).thenReturn(NetworkType.Basic);
when(this.mockDestination.getPod()).thenReturn(this.mockPod);
// Execute
List<DeployDestination> destinations = this.deployment.findDestinations();
// Assert
assertEquals(ONLY_THE_PROVIDED_AS_DEFAULT_DESTINATION_WAS_EXPECTED,
1, destinations.size());
assertEquals(ONLY_THE_PROVIDED_AS_DEFAULT_DESTINATION_WAS_EXPECTED,
this.mockDestination, destinations.get(0));
}
@Test
public void testFindDestinations() {
// Prepare
when(this.mockDataCenter.getNetworkType()).thenReturn(NetworkType.Basic);
when(this.mockDestination.getPod()).thenReturn(null);
// Stub local method listByDataCenterIdVMTypeAndStates
this.mockPods.add(this.mockHostPodVO1);
this.mockPods.add(this.mockHostPodVO2);
this.mockPods.add(this.mockHostPodVO3);
RouterDeploymentDefinition deployment = spy(this.deployment);
doReturn(mockPods).when(deployment).listByDataCenterIdVMTypeAndStates(
DATA_CENTER_ID, VirtualMachine.Type.User,
VirtualMachine.State.Starting, VirtualMachine.State.Running);
// Leave this one empty to force adding add destination for this pod
List<DomainRouterVO> virtualRouters1 = new ArrayList<>();
when(this.mockRouterDao.listByPodIdAndStates(POD_ID1,
VirtualMachine.State.Starting, VirtualMachine.State.Running)).thenReturn(virtualRouters1);
// This list is not empty, so it will not add any for this pod, and continue with next pod
List<DomainRouterVO> virtualRouters2 = new ArrayList<>();
DomainRouterVO domainRouterVO1 = mock(DomainRouterVO.class);
virtualRouters2.add(domainRouterVO1);
when(this.mockRouterDao.listByPodIdAndStates(POD_ID2,
VirtualMachine.State.Starting, VirtualMachine.State.Running)).thenReturn(virtualRouters2);
// Leave this last one empty to check we finally added more than one afterwards
List<DomainRouterVO> virtualRouters3 = new ArrayList<>();
when(this.mockRouterDao.listByPodIdAndStates(POD_ID3,
VirtualMachine.State.Starting, VirtualMachine.State.Running)).thenReturn(virtualRouters3);
// Execute
List<DeployDestination> destinations = deployment.findDestinations();
// Assert that 2 were added (for the 1st and 3rd
assertEquals("",
2, destinations.size());
assertEquals("",
this.mockDataCenter, destinations.get(0).getDataCenter());
assertEquals("",
this.mockHostPodVO1, destinations.get(0).getPod());
assertEquals("",
this.mockDataCenter, destinations.get(1).getDataCenter());
assertEquals("",
this.mockHostPodVO3, destinations.get(1).getPod());
}
@Test(expected = CloudRuntimeException.class)
public void testFindDestinationsMoreThan1PodPerBasicZone() {
// Prepare
when(this.mockDataCenter.getNetworkType()).thenReturn(NetworkType.Basic);
when(this.mockDestination.getPod()).thenReturn(null);
// Stub local method listByDataCenterIdVMTypeAndStates
this.mockPods.add(this.mockHostPodVO1);
this.mockPods.add(this.mockHostPodVO2);
// Deployment under test is a Mockito spy
RouterDeploymentDefinition deploymentUT = spy(this.deployment);
doReturn(mockPods).when(deploymentUT).listByDataCenterIdVMTypeAndStates(
DATA_CENTER_ID, VirtualMachine.Type.User,
VirtualMachine.State.Starting, VirtualMachine.State.Running);
// Leave this one empty to force adding add destination for this pod
List<DomainRouterVO> virtualRouters1 = new ArrayList<>();
when(this.mockRouterDao.listByPodIdAndStates(POD_ID1,
VirtualMachine.State.Starting, VirtualMachine.State.Running)).thenReturn(virtualRouters1);
// This list is not empty, so it will not add any for this pod, and continue with next pod
List<DomainRouterVO> virtualRouters2 = new ArrayList<>();
DomainRouterVO domainRouterVO1 = mock(DomainRouterVO.class);
DomainRouterVO domainRouterVO2 = mock(DomainRouterVO.class);
virtualRouters2.add(domainRouterVO1);
virtualRouters2.add(domainRouterVO2);
when(this.mockRouterDao.listByPodIdAndStates(POD_ID2,
VirtualMachine.State.Starting, VirtualMachine.State.Running)).thenReturn(virtualRouters2);
// Execute
deploymentUT.findDestinations();
// Assert by expected exception
}
@Test
public void testPlanDeploymentRoutersBasic() {
// Prepare
when(this.mockDataCenter.getNetworkType()).thenReturn(NetworkType.Basic);
when(this.mockDestination.getPod()).thenReturn(this.mockPod);
// Execute
this.deployment.planDeploymentRouters();
// Assert
verify(this.mockRouterDao, times(1)).listByNetworkAndPodAndRole(this.mockNw.getId(),
POD_ID1, Role.VIRTUAL_ROUTER);
}
@Test
public void testPlanDeploymentRoutersNonBasic() {
// Prepare
when(mockDataCenter.getNetworkType()).thenReturn(NetworkType.Advanced);
when(this.mockDestination.getPod()).thenReturn(this.mockPod);
// Execute
this.deployment.planDeploymentRouters();
// Assert
verify(this.mockRouterDao, times(1)).listByNetworkAndRole(
this.mockNw.getId(), Role.VIRTUAL_ROUTER);
}
@Test
public void testListByDataCenterIdVMTypeAndStates() {
// Prepare
VMInstanceVO vmInstanceVO = mock(VMInstanceVO.class);
final SearchBuilder<VMInstanceVO> vmInstanceSearch = mock(SearchBuilder.class);
when(this.mockVmDao.createSearchBuilder()).thenReturn(vmInstanceSearch);
when(vmInstanceSearch.entity()).thenReturn(vmInstanceVO);
when(vmInstanceVO.getType()).thenReturn(VirtualMachine.Type.Instance);
when(vmInstanceVO.getState()).thenReturn(VirtualMachine.State.Stopped);
when(vmInstanceVO.getPodIdToDeployIn()).thenReturn(POD_ID1);
final SearchBuilder<HostPodVO> podIdSearch = mock(SearchBuilder.class);
when(this.mockPodDao.createSearchBuilder()).thenReturn(podIdSearch);
final SearchCriteria<HostPodVO> sc = mock(SearchCriteria.class);
HostPodVO hostPodVO = mock(HostPodVO.class);
when(podIdSearch.entity()).thenReturn(hostPodVO);
when(hostPodVO.getId()).thenReturn(POD_ID1);
when(hostPodVO.getDataCenterId()).thenReturn(DATA_CENTER_ID);
when(podIdSearch.create()).thenReturn(sc);
final List<HostPodVO> expectedPods = mock(List.class);
when(this.mockPodDao.search(sc, null)).thenReturn(expectedPods);
// Execute
final List<HostPodVO> pods = this.deployment.listByDataCenterIdVMTypeAndStates(DATA_CENTER_ID,
VirtualMachine.Type.User,
VirtualMachine.State.Starting,
VirtualMachine.State.Running);
// Assert
assertNotNull(pods);
assertEquals(expectedPods, pods);
verify(sc, times(1)).setParameters("dc", DATA_CENTER_ID);
verify(sc, times(1)).setJoinParameters("vmInstanceSearch", "type", VirtualMachine.Type.User);
verify(sc, times(1)).setJoinParameters("vmInstanceSearch", "states",
VirtualMachine.State.Starting, VirtualMachine.State.Running);
verify(this.mockPodDao, times(1)).search(sc, null);
}
@Test
public void testFindOrDeployVirtualRouter() throws ConcurrentOperationException,
InsufficientCapacityException, ResourceUnavailableException {
// Prepare
RouterDeploymentDefinition deploymentUT = spy(this.deployment);
doNothing().when(deploymentUT).findOrDeployVirtualRouter();
// Execute
deploymentUT.deployVirtualRouter();
// Assert
verify(this.mockNetworkHelper, times(1)).startRouters(deploymentUT);
}
@Test(expected = ConcurrentOperationException.class)
public void testDeployVirtualRouter() throws ConcurrentOperationException,
InsufficientCapacityException, ResourceUnavailableException {
// Prepare
List<DeployDestination> mockDestinations = new ArrayList<>();
mockDestinations.add(mock(DeployDestination.class));
mockDestinations.add(mock(DeployDestination.class));
RouterDeploymentDefinition deploymentUT = spy(this.deployment);
doNothing().when(deploymentUT).lock();
doNothing().when(deploymentUT).checkPreconditions();
doReturn(mockDestinations).when(deploymentUT).findDestinations();
doNothing().when(deploymentUT).planDeploymentRouters();
doNothing().when(deploymentUT).generateDeploymentPlan();
// Let's test that if the last step fails in the last iteration it unlocks the table
ConcurrentOperationException exception =
new ConcurrentOperationException(null);
doNothing().doThrow(exception).when(deploymentUT).executeDeployment();
doNothing().when(deploymentUT).unlock();
// Execute
try {
deploymentUT.findOrDeployVirtualRouter();
} finally {
// Assert
verify(deploymentUT, times(1)).lock();
verify(deploymentUT, times(1)).checkPreconditions();
verify(deploymentUT, times(1)).findDestinations();
verify(deploymentUT, times(2)).generateDeploymentPlan();
verify(deploymentUT, times(2)).executeDeployment();
//verify(deploymentUT, times(2)).planDeploymentRouters();
verify(deploymentUT, times(1)).unlock();
}
fail();
}
/**
* If any router is NOT redundant, then it shouldn't update routers
*/
@Test
public void testSetupPriorityOfRedundantRouterWithNonRedundantRouters() {
// Prepare
this.deployment.routers = new ArrayList<>();
final DomainRouterVO routerVO1 = mock(DomainRouterVO.class);
this.deployment.routers.add(routerVO1);
when(routerVO1.getIsRedundantRouter()).thenReturn(true);
when(routerVO1.getState()).thenReturn(VirtualMachine.State.Stopped);
final DomainRouterVO routerVO2 = mock(DomainRouterVO.class);
this.deployment.routers.add(routerVO2);
when(routerVO2.getIsRedundantRouter()).thenReturn(false);
when(routerVO2.getState()).thenReturn(VirtualMachine.State.Stopped);
// If this deployment is not redundant nothing will be executed
this.deployment.isRedundant = true;
// Execute
this.deployment.setupPriorityOfRedundantRouter();
// Assert
verify(routerVO1, times(0)).setPriority(anyInt());
verify(routerVO1, times(0)).setIsPriorityBumpUp(anyBoolean());
verify(this.mockRouterDao, times(0)).update(anyLong(), (DomainRouterVO) anyObject());
}
/**
* If any router is NOT Stopped, then it shouldn't update routers
*/
@Test
public void testSetupPriorityOfRedundantRouterWithRunningRouters() {
// Prepare
this.deployment.routers = new ArrayList<>();
final DomainRouterVO routerVO1 = mock(DomainRouterVO.class);
this.deployment.routers.add(routerVO1);
when(routerVO1.getIsRedundantRouter()).thenReturn(true);
when(routerVO1.getState()).thenReturn(VirtualMachine.State.Stopped);
final DomainRouterVO routerVO2 = mock(DomainRouterVO.class);
this.deployment.routers.add(routerVO2);
when(routerVO2.getIsRedundantRouter()).thenReturn(true);
when(routerVO2.getState()).thenReturn(VirtualMachine.State.Running);
// If this deployment is not redundant nothing will be executed
this.deployment.isRedundant = true;
// Execute
this.deployment.setupPriorityOfRedundantRouter();
// Assert
verify(routerVO1, times(0)).setPriority(anyInt());
verify(routerVO1, times(0)).setIsPriorityBumpUp(anyBoolean());
verify(this.mockRouterDao, times(0)).update(anyLong(), (DomainRouterVO) anyObject());
}
/**
* Given all routers are redundant and Stopped, then it should update ALL routers
*/
@Test
public void testSetupPriorityOfRedundantRouter() {
// Prepare
this.deployment.routers = new ArrayList<>();
final DomainRouterVO routerVO1 = mock(DomainRouterVO.class);
this.deployment.routers.add(routerVO1);
when(routerVO1.getId()).thenReturn(ROUTER1_ID);
when(routerVO1.getIsRedundantRouter()).thenReturn(true);
when(routerVO1.getState()).thenReturn(VirtualMachine.State.Stopped);
final DomainRouterVO routerVO2 = mock(DomainRouterVO.class);
this.deployment.routers.add(routerVO2);
when(routerVO2.getId()).thenReturn(ROUTER2_ID);
when(routerVO2.getIsRedundantRouter()).thenReturn(true);
when(routerVO2.getState()).thenReturn(VirtualMachine.State.Stopped);
// If this deployment is not redundant nothing will be executed
this.deployment.isRedundant = true;
// Execute
this.deployment.setupPriorityOfRedundantRouter();
// Assert
verify(routerVO1, times(1)).setPriority(0);
verify(routerVO1, times(1)).setIsPriorityBumpUp(false);
verify(this.mockRouterDao, times(1)).update(ROUTER1_ID, routerVO1);
verify(routerVO2, times(1)).setPriority(0);
verify(routerVO2, times(1)).setIsPriorityBumpUp(false);
verify(this.mockRouterDao, times(1)).update(ROUTER2_ID, routerVO2);
}
/**
* If this is not a redundant deployment, then we shouldn't reset priorities
*/
@Test
public void testSetupPriorityOfRedundantRouterWithNonRedundantDeployment() {
// Prepare
this.deployment.routers = new ArrayList<>();
final DomainRouterVO routerVO1 = mock(DomainRouterVO.class);
this.deployment.routers.add(routerVO1);
when(routerVO1.getIsRedundantRouter()).thenReturn(true);
when(routerVO1.getState()).thenReturn(VirtualMachine.State.Stopped);
final DomainRouterVO routerVO2 = mock(DomainRouterVO.class);
this.deployment.routers.add(routerVO2);
when(routerVO2.getIsRedundantRouter()).thenReturn(true);
when(routerVO2.getState()).thenReturn(VirtualMachine.State.Stopped);
// Execute
this.deployment.setupPriorityOfRedundantRouter();
// Assert
verify(routerVO1, times(0)).setPriority(anyInt());
verify(routerVO1, times(0)).setIsPriorityBumpUp(anyBoolean());
verify(this.mockRouterDao, times(0)).update(anyLong(), (DomainRouterVO) anyObject());
}
@Test
public void testGetNumberOfRoutersToDeploy() {
// Prepare
this.deployment.routers = new ArrayList<>(); // Empty list
// Execute and assert
assertEquals(NUMBER_OF_ROUTERS_TO_DEPLOY_IS_NOT_THE_EXPECTED,
1, this.deployment.getNumberOfRoutersToDeploy());
// Execute and assert, just the same but for redundant deployment
this.deployment.isRedundant = true;
assertEquals(NUMBER_OF_ROUTERS_TO_DEPLOY_IS_NOT_THE_EXPECTED,
2, this.deployment.getNumberOfRoutersToDeploy());
// Just the same, instead of an empty list, a 1 items list
this.deployment.routers.add(mock(DomainRouterVO.class));
this.deployment.isRedundant = false;
assertEquals(NUMBER_OF_ROUTERS_TO_DEPLOY_IS_NOT_THE_EXPECTED,
0, this.deployment.getNumberOfRoutersToDeploy());
this.deployment.isRedundant = true;
assertEquals(NUMBER_OF_ROUTERS_TO_DEPLOY_IS_NOT_THE_EXPECTED,
1, this.deployment.getNumberOfRoutersToDeploy());
}
@Test
public void testFindVirtualProvider() {
// Prepare
when(this.mockNetworkModel.getPhysicalNetworkId(this.deployment.guestNetwork)).thenReturn(PHYSICAL_NW_ID);
Type type = Type.VirtualRouter;
PhysicalNetworkServiceProviderVO physicalNwSrvProvider = mock(PhysicalNetworkServiceProviderVO.class);
when(this.physicalProviderDao.findByServiceProvider(PHYSICAL_NW_ID, type.toString()))
.thenReturn(physicalNwSrvProvider);
when(physicalNwSrvProvider.getId()).thenReturn(PROVIDER_ID);
VirtualRouterProviderVO vrProvider = mock(VirtualRouterProviderVO.class);
when(this.mockVrProviderDao.findByNspIdAndType(PROVIDER_ID, type))
.thenReturn(vrProvider);
// Execute
this.deployment.findVirtualProvider();
// Assert
assertEquals("Didn't find and set the VirtualRouterProvider as expected",
vrProvider, this.deployment.getVirtualProvider());
}
@Test(expected = CloudRuntimeException.class)
public void testFindVirtualProviderWithNullPhyNwSrvProvider() {
// Prepare
when(this.mockNetworkModel.getPhysicalNetworkId(this.deployment.guestNetwork)).thenReturn(PHYSICAL_NW_ID);
Type type = Type.VirtualRouter;
when(this.physicalProviderDao.findByServiceProvider(PHYSICAL_NW_ID, type.toString()))
.thenReturn(null);
// Execute
this.deployment.findVirtualProvider();
}
@Test(expected = CloudRuntimeException.class)
public void testFindVirtualProviderWithNullVrProvider() {
// Prepare
when(this.mockNetworkModel.getPhysicalNetworkId(this.deployment.guestNetwork)).thenReturn(PHYSICAL_NW_ID);
Type type = Type.VirtualRouter;
PhysicalNetworkServiceProviderVO physicalNwSrvProvider = mock(PhysicalNetworkServiceProviderVO.class);
when(this.physicalProviderDao.findByServiceProvider(PHYSICAL_NW_ID, type.toString()))
.thenReturn(physicalNwSrvProvider);
when(physicalNwSrvProvider.getId()).thenReturn(PROVIDER_ID);
when(this.mockVrProviderDao.findByNspIdAndType(PROVIDER_ID, type))
.thenReturn(null);
// Execute
this.deployment.findVirtualProvider();
}
@Test
public void testFindSourceNatIPPublicNw() throws InsufficientAddressCapacityException, ConcurrentOperationException {
// Prepare
PublicIp sourceNatIp = mock(PublicIp.class);
when(this.mockIpAddrMgr.assignSourceNatIpAddressToGuestNetwork(
this.mockOwner, this.mockNw)).thenReturn(sourceNatIp);
this.deployment.isPublicNetwork = true;
// It should be null until this method finds it
assertNull(this.deployment.sourceNatIp);
// Execute
this.deployment.findSourceNatIP();
// Assert
assertEquals("SourceNatIP was not correctly found and set", sourceNatIp, this.deployment.sourceNatIp);
}
@Test
public void testFindSourceNatIPNonPublicNw() throws InsufficientAddressCapacityException, ConcurrentOperationException {
// Prepare
PublicIp sourceNatIp = mock(PublicIp.class);
when(this.mockIpAddrMgr.assignSourceNatIpAddressToGuestNetwork(
this.mockOwner, this.mockNw)).thenReturn(sourceNatIp);
this.deployment.isPublicNetwork = false;
// It should be null until this method finds it
assertNull(this.deployment.sourceNatIp);
// Execute
this.deployment.findSourceNatIP();
// Assert
assertEquals("SourceNatIP should remain null given a non public network",
null, this.deployment.sourceNatIp);
}
@Test
public void testFindOfferingIdReceivingNewOne() {
// Prepare
this.deployment.offeringId = 1L;
when(this.mockNw.getNetworkOfferingId()).thenReturn(OFFERING_ID);
when(this.mockNetworkOfferingDao.findById(OFFERING_ID)).thenReturn(this.mockNwOfferingVO);
when(this.mockNwOfferingVO.getServiceOfferingId()).thenReturn(OFFERING_ID);
// Execute
this.deployment.findOfferingId();
// Assert
assertEquals("Given that no Offering was found, the previous Offering Id should be kept",
OFFERING_ID, this.deployment.offeringId.longValue());
}
@Test
public void testFindOfferingIdReceivingKeepingPrevious() {
// Prepare
this.deployment.offeringId = 1L;
when(this.mockNw.getNetworkOfferingId()).thenReturn(OFFERING_ID);
when(this.mockNetworkOfferingDao.findById(OFFERING_ID)).thenReturn(this.mockNwOfferingVO);
when(this.mockNwOfferingVO.getServiceOfferingId()).thenReturn(null);
// Execute
this.deployment.findOfferingId();
// Assert
assertEquals("Found Offering Id didn't replace previous one",
1L, this.deployment.offeringId.longValue());
}
@Test
public void testDeployAllVirtualRouters()
throws ConcurrentOperationException, InsufficientCapacityException, ResourceUnavailableException {
// Prepare
this.deployment.routers = new ArrayList<>();
this.deployment.isRedundant = true;
//this.deployment.routers.add(routerVO1);
RouterDeploymentDefinition deploymentUT = spy(this.deployment);
doReturn(2).when(deploymentUT).getNumberOfRoutersToDeploy();
final DomainRouterVO routerVO1 = mock(DomainRouterVO.class);
final DomainRouterVO routerVO2 = mock(DomainRouterVO.class);
when(this.mockNetworkHelper.deployRouter(deploymentUT, false))
.thenReturn(routerVO1).thenReturn(routerVO2);
// Execute
deploymentUT.deployAllVirtualRouters();
// Assert
verify(this.mockRouterDao, times(1)).addRouterToGuestNetwork(routerVO1, this.mockNw);
verify(this.mockRouterDao, times(1)).addRouterToGuestNetwork(routerVO2, this.mockNw);
assertEquals("First router to deploy was not added to list of available routers",
routerVO1, this.deployment.routers.get(0));
assertEquals("Second router to deploy was not added to list of available routers",
routerVO2, this.deployment.routers.get(1));
}
@Test
public void testSetupAccountOwner() {
// Prepare
when(this.mockNetworkModel.isNetworkSystem(this.mockNw)).thenReturn(true);
Account newAccountOwner = mock(Account.class);
when(this.mockAccountMgr.getAccount(Account.ACCOUNT_ID_SYSTEM)).thenReturn(newAccountOwner);
//Execute
this.deployment.setupAccountOwner();
// Assert
assertEquals("New account owner not properly set", newAccountOwner, this.deployment.owner);
}
@Test
public void testSetupAccountOwnerNotNetworkSystem() {
// Prepare
when(this.mockNetworkModel.isNetworkSystem(this.mockNw)).thenReturn(false);
when(this.mockNw.getGuestType()).thenReturn(Network.GuestType.Shared);
Account newAccountOwner = mock(Account.class);
when(this.mockAccountMgr.getAccount(Account.ACCOUNT_ID_SYSTEM)).thenReturn(newAccountOwner);
//Execute
this.deployment.setupAccountOwner();
// Assert
assertEquals("New account owner not properly set", newAccountOwner, this.deployment.owner);
}
@Test
public void testSetupAccountOwnerNotSharedNeitherNetworkSystem() {
// Prepare
when(this.mockNetworkModel.isNetworkSystem(this.mockNw)).thenReturn(false);
when(this.mockNw.getGuestType()).thenReturn(Network.GuestType.Isolated);
when(this.mockAccountMgr.getAccount(Account.ACCOUNT_ID_SYSTEM)).thenReturn(null);
//Execute
this.deployment.setupAccountOwner();
// Assert
assertEquals("New account shouldn't have been updated", this.mockOwner, this.deployment.owner);
}
protected void driveTestPrepareDeployment(final boolean isRedundant, final boolean isPublicNw) {
// Prepare
this.deployment.isRedundant = isRedundant;
when(this.mockNetworkModel.isProviderSupportServiceInNetwork(
NW_ID_1, Service.SourceNat, Provider.VirtualRouter)).thenReturn(isPublicNw);
// Execute
final boolean canProceedDeployment = this.deployment.prepareDeployment();
// Assert
boolean shouldProceedDeployment = true;
if (isRedundant && !isPublicNw) {
shouldProceedDeployment = false;
}
assertEquals(shouldProceedDeployment, canProceedDeployment);
if (!shouldProceedDeployment) {
assertEquals("Since deployment cannot proceed we should empty the list of routers",
0, this.deployment.routers.size());
}
}
@Test
public void testPrepareDeploymentPublicNw() {
this.driveTestPrepareDeployment(true, true);
}
@Test
public void testPrepareDeploymentNonRedundant() {
this.driveTestPrepareDeployment(false, true);
}
@Test
public void testPrepareDeploymentRedundantNonPublicNw() {
this.driveTestPrepareDeployment(true, false);
}
protected void driveTestExecuteDeployment(final int noOfRoutersToDeploy, boolean passPreparation)
throws ConcurrentOperationException, InsufficientCapacityException, ResourceUnavailableException {
// Prepare
RouterDeploymentDefinition deploymentUT = spy(this.deployment);
doNothing().when(deploymentUT).setupPriorityOfRedundantRouter();
doReturn(noOfRoutersToDeploy).when(deploymentUT).getNumberOfRoutersToDeploy();
doReturn(passPreparation).when(deploymentUT).prepareDeployment();
doNothing().when(deploymentUT).findVirtualProvider();
doNothing().when(deploymentUT).findOfferingId();
doNothing().when(deploymentUT).findSourceNatIP();
doNothing().when(deploymentUT).deployAllVirtualRouters();
// Execute
deploymentUT.executeDeployment();
// Assert
verify(deploymentUT, times(1)).setupPriorityOfRedundantRouter();
verify(deploymentUT, times(1)).getNumberOfRoutersToDeploy();
int proceedToDeployment = 0;
if (noOfRoutersToDeploy > 0) {
verify(deploymentUT, times(1)).prepareDeployment();
if (passPreparation) {
proceedToDeployment = 1;
}
}
verify(deploymentUT, times(proceedToDeployment)).findVirtualProvider();
verify(deploymentUT, times(proceedToDeployment)).findOfferingId();
verify(deploymentUT, times(proceedToDeployment)).findSourceNatIP();
verify(deploymentUT, times(proceedToDeployment)).deployAllVirtualRouters();
}
@Test
public void testExecuteDeploymentNoRoutersToDeploy()
throws ConcurrentOperationException, InsufficientCapacityException, ResourceUnavailableException {
this.driveTestExecuteDeployment(0, true);
}
@Test
public void testExecuteDeploymentFailPreparation()
throws ConcurrentOperationException, InsufficientCapacityException, ResourceUnavailableException {
this.driveTestExecuteDeployment(2, false);
}
@Test
public void testExecuteDeployment()
throws ConcurrentOperationException, InsufficientCapacityException, ResourceUnavailableException {
this.driveTestExecuteDeployment(2, true);
}
}

View File

@ -0,0 +1,134 @@
// 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.NetworkHelper;
import com.cloud.network.router.VpcNetworkHelperImpl;
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_1 = 101l;
protected static final Long NW_ID_2= 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 NetworkHelper mockNetworkHelper;
@Mock
protected VpcNetworkHelperImpl vpcNwHelper;
@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_1);
}
}

View File

@ -0,0 +1,230 @@
// 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 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.Matchers.anyLong;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import java.util.List;
import org.junit.Before;
import org.junit.Test;
import org.mockito.Mock;
import com.cloud.deploy.DeployDestination;
import com.cloud.exception.ConcurrentOperationException;
import com.cloud.exception.InsufficientAddressCapacityException;
import com.cloud.exception.InsufficientCapacityException;
import com.cloud.exception.InsufficientServerCapacityException;
import com.cloud.exception.ResourceUnavailableException;
import com.cloud.exception.StorageUnavailableException;
import com.cloud.network.addr.PublicIp;
import com.cloud.network.dao.PhysicalNetworkDao;
import com.cloud.network.dao.PhysicalNetworkServiceProviderDao;
import com.cloud.network.router.NicProfileHelper;
import com.cloud.network.vpc.VpcManager;
import com.cloud.network.vpc.VpcVO;
import com.cloud.network.vpc.dao.VpcDao;
import com.cloud.network.vpc.dao.VpcOfferingDao;
import com.cloud.vm.DomainRouterVO;
public class VpcRouterDeploymentDefinitionTest extends RouterDeploymentDefinitionTestBase {
private static final String FOR_VPC_ONLY_THE_GIVEN_DESTINATION_SHOULD_BE_USED = "For Vpc only the given destination should be used";
private static final long VPC_ID = 201L;
private static final long ZONE_ID = 211L;
@Mock
protected VpcDao mockVpcDao;
@Mock
protected PhysicalNetworkDao mockPhNwDao;
protected PhysicalNetworkServiceProviderDao mockPhProviderDao;
@Mock
protected VpcVO mockVpc;
@Mock
protected VpcOfferingDao mockVpcOffDao;
@Mock
protected VpcManager vpcMgr;
@Mock
protected NicProfileHelper vpcHelper;
protected RouterDeploymentDefinition deployment;
@Override
protected void initMocks() {
super.initMocks();
when(mockVpc.getId()).thenReturn(VPC_ID);
when(mockVpc.getZoneId()).thenReturn(VPC_ID);
}
@Before
public void initTest() {
initMocks();
deployment = builder.create().setVpc(mockVpc).setDeployDestination(mockDestination).setAccountOwner(mockOwner).setParams(params).build();
}
@Test
public void testConstructionFieldsAndFlags() {
assertTrue("Not really a VpcRouterDeploymentDefinition what the builder created", deployment instanceof VpcRouterDeploymentDefinition);
assertTrue("A VpcRouterDeploymentDefinition should declare it is", deployment.isVpcRouter());
assertEquals("A VpcRouterDeploymentDefinition should have a Vpc", mockVpc, deployment.getVpc());
}
@Test
public void testLock() {
// Prepare
when(mockVpcDao.acquireInLockTable(VPC_ID)).thenReturn(mockVpc);
// Execute
deployment.lock();
// Assert
verify(mockVpcDao, times(1)).acquireInLockTable(VPC_ID);
assertNotNull(LOCK_NOT_CORRECTLY_GOT, deployment.tableLockId);
assertEquals(LOCK_NOT_CORRECTLY_GOT, VPC_ID, deployment.tableLockId.longValue());
}
@Test(expected = ConcurrentOperationException.class)
public void testLockFails() {
// Prepare
when(mockVpcDao.acquireInLockTable(VPC_ID)).thenReturn(null);
// Execute
try {
deployment.lock();
} finally {
// Assert
verify(mockVpcDao, times(1)).acquireInLockTable(VPC_ID);
assertNull(deployment.tableLockId);
}
}
@Test
public void testUnlock() {
// Prepare
deployment.tableLockId = VPC_ID;
// Execute
deployment.unlock();
// Assert
verify(mockVpcDao, times(1)).releaseFromLockTable(VPC_ID);
}
@Test
public void testUnlockWithoutLock() {
// Prepare
deployment.tableLockId = null;
// Execute
deployment.unlock();
// Assert
verify(mockVpcDao, times(0)).releaseFromLockTable(anyLong());
}
@Test
public void testFindDestinations() {
// Execute
List<DeployDestination> foundDestinations = deployment.findDestinations();
// Assert
assertEquals(FOR_VPC_ONLY_THE_GIVEN_DESTINATION_SHOULD_BE_USED, deployment.dest, foundDestinations.get(0));
assertEquals(FOR_VPC_ONLY_THE_GIVEN_DESTINATION_SHOULD_BE_USED, 1, foundDestinations.size());
}
@Test
public void testGetNumberOfRoutersToDeploy() {
assertEquals("If there are no routers, it should deploy one", 1, deployment.getNumberOfRoutersToDeploy());
deployment.routers.add(mock(DomainRouterVO.class));
assertEquals("If there is already a router found, there is no need to deploy more", 0, deployment.getNumberOfRoutersToDeploy());
}
@Test
public void testPrepareDeployment() {
assertTrue("There are no preconditions for Vpc Deployment, thus it should always pass", deployment.prepareDeployment());
}
@Test
public void testGenerateDeploymentPlan() {
// TODO Implement this test
}
@Test
public void testCheckPreconditions() {
// TODO Implement this test
}
@Test
public void testExecuteDeployment() {
// TODO Implement this test
}
@Test
public void testPlanDeploymentRouters() {
// TODO Implement this test
}
@Test
public void testDeployAllVirtualRoutersWithNoDeployedRouter() throws InsufficientAddressCapacityException, InsufficientServerCapacityException, StorageUnavailableException,
InsufficientCapacityException, ResourceUnavailableException {
driveTestDeployAllVirtualRouters(null);
// Assert
assertTrue("No router should have been set as deployed", deployment.routers.isEmpty());
}
public void driveTestDeployAllVirtualRouters(final DomainRouterVO router) throws InsufficientAddressCapacityException, InsufficientServerCapacityException,
StorageUnavailableException, InsufficientCapacityException, ResourceUnavailableException {
// Prepare
VpcRouterDeploymentDefinition vpcDeployment = (VpcRouterDeploymentDefinition) deployment;
when(vpcDeployment.nwHelper.deployRouter(vpcDeployment, true)).thenReturn(router);
// Execute
vpcDeployment.deployAllVirtualRouters();
}
@Test
public void testCreateVpcRouterNetworks() {
// TODO Implement this test
}
@Test
public void testFindSourceNatIP() throws InsufficientAddressCapacityException, ConcurrentOperationException {
// Prepare
PublicIp publicIp = mock(PublicIp.class);
when(vpcMgr.assignSourceNatIpAddressToVpc(mockOwner, mockVpc)).thenReturn(publicIp);
// Execute
deployment.findSourceNatIP();
// Assert
assertEquals("SourceNatIp returned by the VpcManager was not correctly set", publicIp, deployment.sourceNatIp);
}
}