finished firewall rules and load balancing rules; fixed all the injection problems; added VirtualMachineManager to the appliance factory to be injected.

Conflicts:
	server/src/com/cloud/network/element/VirtualRouterElement.java
	server/src/com/cloud/network/router/NEWVirtualNetworkApplianceManagerImpl.java
	server/src/com/cloud/network/topology/BasicNetworkTopology.java
This commit is contained in:
Wilder Rodrigues 2014-07-14 16:20:28 +02:00 committed by wilderrodrigues
parent bbce7d944b
commit 4b1112af28
7 changed files with 406 additions and 92 deletions

View File

@ -177,13 +177,24 @@
<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="newVirtualNetworkApplianceManagerImpl"
class="com.cloud.network.router.NEWVirtualNetworkApplianceManagerImpl" />
<bean id="virtualNetworkApplianceFactory"
class="com.cloud.network.rules.VirtualNetworkApplianceFactory" />
<bean id="topologyContext" class="com.cloud.network.topology.NetworkTopologyContext" init-method="init" />
<bean id="basicNetworkTopology" class="com.cloud.network.topology.BasicNetworkTopology" />
<bean id="advancedNetworkTopology" class="com.cloud.network.topology.AdvancedNetworkTopology" />
<bean id="routerControlHelper"
class="com.cloud.network.router.RouterControlHelper" />
<bean id="networkGeneralHelper"

View File

@ -37,6 +37,7 @@ 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.deploy.DeployDestination;
import com.cloud.exception.ConcurrentOperationException;
import com.cloud.exception.InsufficientCapacityException;
@ -80,7 +81,8 @@ import com.cloud.network.rules.LoadBalancerContainer;
import com.cloud.network.rules.PortForwardingRule;
import com.cloud.network.rules.RulesManager;
import com.cloud.network.rules.StaticNat;
import com.cloud.network.rules.VirtualNetworkApplianceFactory;
import com.cloud.network.topology.NetworkTopology;
import com.cloud.network.topology.NetworkTopologyContext;
import com.cloud.offering.NetworkOffering;
import com.cloud.offerings.NetworkOfferingVO;
import com.cloud.offerings.dao.NetworkOfferingDao;
@ -105,15 +107,11 @@ import com.cloud.vm.dao.DomainRouterDao;
import com.cloud.vm.dao.UserVmDao;
import com.google.gson.Gson;
@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");
@ -154,8 +152,9 @@ NetworkMigrationResponder, AggregatedCommandExecutor {
OvsProviderDao _ovsProviderDao;
@Inject
IPAddressDao _ipAddressDao;
@Inject
protected VirtualNetworkApplianceFactory virtualNetworkApplianceFactory;
NetworkTopologyContext networkTopologyContext;
protected boolean canHandle(final Network network, final Service service) {
Long physicalNetworkId = _networkMdl.getPhysicalNetworkId(network);
@ -187,8 +186,8 @@ NetworkMigrationResponder, AggregatedCommandExecutor {
}
@Override
public boolean implement(final Network network, final NetworkOffering offering, final DeployDestination dest, final 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;
@ -197,9 +196,8 @@ NetworkMigrationResponder, AggregatedCommandExecutor {
Map<VirtualMachineProfile.Param, Object> params = new HashMap<VirtualMachineProfile.Param, Object>(1);
params.put(VirtualMachineProfile.Param.ReProgramGuestNetworks, true);
RouterDeploymentDefinition routerDeploymentDefinition =
new RouterDeploymentDefinition(network, dest,_accountMgr.getAccount(network.getAccountId()),
params, offering.getRedundantRouter());
RouterDeploymentDefinition routerDeploymentDefinition = new RouterDeploymentDefinition(network, dest, _accountMgr.getAccount(network.getAccountId()), params,
offering.getRedundantRouter());
List<DomainRouterVO> routers = _routerMgr.deployVirtualRouter(routerDeploymentDefinition);
int routerCounts = 1;
@ -207,8 +205,7 @@ NetworkMigrationResponder, AggregatedCommandExecutor {
routerCounts = 2;
}
if (routers == null || routers.size() < routerCounts) {
throw new ResourceUnavailableException("Can't find all necessary running routers!",
DataCenter.class, network.getDataCenterId());
throw new ResourceUnavailableException("Can't find all necessary running routers!", DataCenter.class, network.getDataCenterId());
}
return true;
@ -233,11 +230,9 @@ NetworkMigrationResponder, AggregatedCommandExecutor {
return false;
}
RouterDeploymentDefinition routerDeploymentDefinition =
new RouterDeploymentDefinition(network, dest,_accountMgr.getAccount(network.getAccountId()),
vm.getParameters(), offering.getRedundantRouter());
List<DomainRouterVO> routers =
_routerMgr.deployVirtualRouter(routerDeploymentDefinition);
RouterDeploymentDefinition routerDeploymentDefinition = new RouterDeploymentDefinition(network, dest, _accountMgr.getAccount(network.getAccountId()), vm.getParameters(),
offering.getRedundantRouter());
List<DomainRouterVO> routers = _routerMgr.deployVirtualRouter(routerDeploymentDefinition);
if (routers == null || routers.size() == 0) {
throw new ResourceUnavailableException("Can't find at least one running router!", DataCenter.class, network.getDataCenterId());
@ -250,8 +245,7 @@ NetworkMigrationResponder, AggregatedCommandExecutor {
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 " +
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;
}
@ -264,7 +258,7 @@ NetworkMigrationResponder, AggregatedCommandExecutor {
}
DataCenterVO dcVO = _dcDao.findById(network.getDataCenterId());
NetworkTopology networkTopology = NetworkTopologyContext.getInstance().retrieveNetworkTopology(dcVO);
NetworkTopology networkTopology = networkTopologyContext.retrieveNetworkTopology(dcVO);
if (!networkTopology.applyFirewallRules(network, rules, routers)) {
throw new CloudRuntimeException("Failed to apply firewall rules in network " + network.getId());
@ -277,9 +271,9 @@ 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(final String str, final String endChar) {
if (str == null) {
@ -289,8 +283,7 @@ NetworkMigrationResponder, AggregatedCommandExecutor {
String number = str;
if (endChar != null) {
boolean matchedEndChar = false;
if (str.length() < 2)
{
if (str.length() < 2) {
return false; // atleast one numeric and one char. example:
}
// 3h
@ -402,7 +395,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;
@ -422,8 +418,7 @@ 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);
@ -485,8 +480,7 @@ 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;
}
@ -537,10 +531,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);
@ -557,7 +549,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 :"
@ -586,7 +578,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);
@ -641,8 +634,7 @@ NetworkMigrationResponder, AggregatedCommandExecutor {
if (canHandle(config, Service.StaticNat)) {
List<DomainRouterVO> routers = _routerDao.listByNetworkAndRole(config.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 " + config.getId());
return true;
}
@ -681,7 +673,9 @@ NetworkMigrationResponder, AggregatedCommandExecutor {
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) {
@ -704,7 +698,8 @@ NetworkMigrationResponder, AggregatedCommandExecutor {
@SuppressWarnings("unchecked")
VirtualMachineProfile uservm = vm;
// If any router is running then send save password command otherwise save the password in DB
// 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);
@ -784,8 +779,7 @@ NetworkMigrationResponder, AggregatedCommandExecutor {
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;
}
@ -798,8 +792,7 @@ NetworkMigrationResponder, AggregatedCommandExecutor {
@Override
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) {
@ -816,8 +809,7 @@ NetworkMigrationResponder, AggregatedCommandExecutor {
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;
}
@ -842,7 +834,7 @@ NetworkMigrationResponder, AggregatedCommandExecutor {
@Override
public boolean shutdownProviderInstances(final PhysicalNetworkServiceProvider provider, final ReservationContext context) throws ConcurrentOperationException,
ResourceUnavailableException {
ResourceUnavailableException {
VirtualRouterProviderVO element = _vrProviderDao.findByNspIdAndType(provider.getId(), getVirtualRouterProvider());
if (element == null) {
return true;
@ -880,13 +872,13 @@ NetworkMigrationResponder, AggregatedCommandExecutor {
@Override
public boolean release(final Network network, final NicProfile nic, final VirtualMachineProfile vm, final ReservationContext context) throws ConcurrentOperationException,
ResourceUnavailableException {
ResourceUnavailableException {
return true;
}
@Override
public boolean configDhcpSupportForSubnet(final Network network, final NicProfile nic, final VirtualMachineProfile vm, final DeployDestination dest, final 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;
@ -944,8 +936,8 @@ NetworkMigrationResponder, AggregatedCommandExecutor {
}
@Override
public boolean addPasswordAndUserdata(final Network network, final NicProfile nic, final VirtualMachineProfile vm, final DeployDestination dest, final 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;
@ -975,9 +967,8 @@ NetworkMigrationResponder, AggregatedCommandExecutor {
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;
@ -988,15 +979,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);
@ -1022,7 +1016,7 @@ 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();
@ -1091,11 +1085,11 @@ NetworkMigrationResponder, AggregatedCommandExecutor {
}
if (vm.getType() == VirtualMachine.Type.DomainRouter) {
assert vm instanceof DomainRouterVO;
DomainRouterVO router = (DomainRouterVO)vm.getVirtualMachine();
DomainRouterVO router = (DomainRouterVO) vm.getVirtualMachine();
_routerMgr.setupDhcpForPvlan(false, router, router.getHostId(), nic);
} 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;
@ -1108,11 +1102,11 @@ NetworkMigrationResponder, AggregatedCommandExecutor {
}
if (vm.getType() == VirtualMachine.Type.DomainRouter) {
assert vm instanceof DomainRouterVO;
DomainRouterVO router = (DomainRouterVO)vm.getVirtualMachine();
DomainRouterVO router = (DomainRouterVO) vm.getVirtualMachine();
_routerMgr.setupDhcpForPvlan(true, router, router.getHostId(), nic);
} 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);
}
}
@ -1124,11 +1118,11 @@ NetworkMigrationResponder, AggregatedCommandExecutor {
}
if (vm.getType() == VirtualMachine.Type.DomainRouter) {
assert vm instanceof DomainRouterVO;
DomainRouterVO router = (DomainRouterVO)vm.getVirtualMachine();
DomainRouterVO router = (DomainRouterVO) vm.getVirtualMachine();
_routerMgr.setupDhcpForPvlan(true, router, router.getHostId(), nic);
} 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);
}
}
@ -1157,7 +1151,8 @@ NetworkMigrationResponder, AggregatedCommandExecutor {
@Override
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
// The VR code already cleansup in the Finish routine using finally,
// lets not waste another command
return true;
}
}

View File

@ -0,0 +1,301 @@
// 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 javax.ejb.Local;
import javax.inject.Inject;
import javax.naming.ConfigurationException;
import org.apache.cloudstack.api.command.admin.router.UpgradeRouterCmd;
import org.apache.cloudstack.api.command.admin.router.UpgradeRouterTemplateCmd;
import org.apache.cloudstack.framework.config.ConfigKey;
import org.apache.log4j.Logger;
import com.cloud.agent.AgentManager;
import com.cloud.agent.api.Answer;
import com.cloud.agent.manager.Commands;
import com.cloud.deploy.DeployDestination;
import com.cloud.exception.AgentUnavailableException;
import com.cloud.exception.ConcurrentOperationException;
import com.cloud.exception.InsufficientCapacityException;
import com.cloud.exception.OperationTimedoutException;
import com.cloud.exception.ResourceUnavailableException;
import com.cloud.maint.Version;
import com.cloud.network.Network;
import com.cloud.network.RemoteAccessVpn;
import com.cloud.network.VirtualNetworkApplianceService;
import com.cloud.user.Account;
import com.cloud.user.User;
import com.cloud.utils.exception.CloudRuntimeException;
import com.cloud.vm.DomainRouterVO;
import com.cloud.vm.VirtualMachineProfile.Param;
/**
* NetworkManager manages the network for the different end users.
*
*/
@Local(value = { NEWVirtualNetworkApplianceManager.class, VirtualNetworkApplianceService.class })
public class NEWVirtualNetworkApplianceManagerImpl implements NEWVirtualNetworkApplianceManager {
private static final Logger s_logger = Logger.getLogger(NEWVirtualNetworkApplianceManagerImpl.class);
static final ConfigKey<Boolean> routerVersionCheckEnabled = new ConfigKey<Boolean>("Advanced", Boolean.class, "router.version.check", "true",
"If true, router minimum required version is checked before sending command", false);
@Inject
private AgentManager _agentMgr;
@Override
public String getName() {
// TODO Auto-generated method stub
return null;
}
@Override
public void setName(final String name) {
// TODO Auto-generated method stub
}
@Override
public void setConfigParams(final Map<String, Object> params) {
// TODO Auto-generated method stub
}
@Override
public Map<String, Object> getConfigParams() {
// TODO Auto-generated method stub
return null;
}
@Override
public int getRunLevel() {
// TODO Auto-generated method stub
return 0;
}
@Override
public void setRunLevel(final int level) {
// TODO Auto-generated method stub
}
@Override
public boolean configure(final String name, final Map<String, Object> params)
throws ConfigurationException {
// TODO Auto-generated method stub
return false;
}
@Override
public boolean start() {
// TODO Auto-generated method stub
return false;
}
@Override
public boolean stop() {
// TODO Auto-generated method stub
return false;
}
@Override
public VirtualRouter startRouter(final long routerId, final boolean reprogramNetwork)
throws ConcurrentOperationException, ResourceUnavailableException,
InsufficientCapacityException {
// TODO Auto-generated method stub
return null;
}
@Override
public VirtualRouter rebootRouter(final long routerId, final boolean reprogramNetwork)
throws ConcurrentOperationException, ResourceUnavailableException,
InsufficientCapacityException {
// TODO Auto-generated method stub
return null;
}
@Override
public VirtualRouter upgradeRouter(final UpgradeRouterCmd cmd) {
// TODO Auto-generated method stub
return null;
}
@Override
public VirtualRouter stopRouter(final long routerId, final boolean forced)
throws ResourceUnavailableException, ConcurrentOperationException {
// TODO Auto-generated method stub
return null;
}
@Override
public VirtualRouter startRouter(final long id)
throws ResourceUnavailableException, InsufficientCapacityException,
ConcurrentOperationException {
// TODO Auto-generated method stub
return null;
}
@Override
public VirtualRouter destroyRouter(final long routerId, final Account caller,
final Long callerUserId) throws ResourceUnavailableException,
ConcurrentOperationException {
// TODO Auto-generated method stub
return null;
}
@Override
public VirtualRouter findRouter(final long routerId) {
// TODO Auto-generated method stub
return null;
}
@Override
public List<Long> upgradeRouterTemplate(final UpgradeRouterTemplateCmd cmd) {
// TODO Auto-generated method stub
return null;
}
@Override
public List<DomainRouterVO> deployVirtualRouterInGuestNetwork(
final Network guestNetwork, final DeployDestination dest, final Account owner,
final Map<Param, Object> params, final boolean isRedundant)
throws InsufficientCapacityException, ResourceUnavailableException,
ConcurrentOperationException {
// TODO Auto-generated method stub
return null;
}
@Override
public boolean startRemoteAccessVpn(final Network network, final RemoteAccessVpn vpn,
final List<? extends VirtualRouter> routers)
throws ResourceUnavailableException {
// TODO Auto-generated method stub
return false;
}
@Override
public boolean deleteRemoteAccessVpn(final Network network, final RemoteAccessVpn vpn,
final List<? extends VirtualRouter> routers)
throws ResourceUnavailableException {
// TODO Auto-generated method stub
return false;
}
@Override
public List<VirtualRouter> getRoutersForNetwork(final long networkId) {
// TODO Auto-generated method stub
return null;
}
@Override
public VirtualRouter stop(final VirtualRouter router, final boolean forced,
final User callingUser, final Account callingAccount)
throws ConcurrentOperationException, ResourceUnavailableException {
// TODO Auto-generated method stub
return null;
}
@Override
public String getDnsBasicZoneUpdate() {
// TODO Auto-generated method stub
return null;
}
@Override
public boolean removeDhcpSupportForSubnet(final Network network,
final List<DomainRouterVO> routers) throws ResourceUnavailableException {
// TODO Auto-generated method stub
return false;
}
@Override
public boolean prepareAggregatedExecution(final Network network,
final List<DomainRouterVO> routers) throws AgentUnavailableException {
// TODO Auto-generated method stub
return false;
}
@Override
public boolean completeAggregatedExecution(final Network network,
final List<DomainRouterVO> routers) throws AgentUnavailableException {
// TODO Auto-generated method stub
return false;
}
@Override
public boolean cleanupAggregatedExecution(final Network network,
final List<DomainRouterVO> routers) throws AgentUnavailableException {
// TODO Auto-generated method stub
return false;
}
@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 : " + 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) {
return false;
}
if (answers.length != cmds.size()) {
return false;
}
// FIXME: Have to return state for individual command in the future
boolean result = true;
if (answers.length > 0) {
for (final Answer answer : answers) {
if (!answer.getResult()) {
result = false;
break;
}
}
}
return result;
}
// Checks if the router is at the required version
// Compares MS version and router version
protected boolean checkRouterVersion(final VirtualRouter router) {
if(!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, MinVRVersion) >= 0);
}
}

View File

@ -82,10 +82,6 @@ public abstract class RuleApplier {
return router;
}
public void setManager(final NEWVirtualNetworkApplianceManager applianceManager) {
this.applianceManager = applianceManager;
}
public NEWVirtualNetworkApplianceManager getApplianceManager() {
return applianceManager;
}

View File

@ -14,8 +14,10 @@ import com.cloud.network.dao.LoadBalancerDao;
import com.cloud.network.dao.NetworkDao;
import com.cloud.network.lb.LoadBalancingRule;
import com.cloud.network.lb.LoadBalancingRulesManager;
import com.cloud.network.router.NEWVirtualNetworkApplianceManager;
import com.cloud.network.router.RouterControlHelper;
import com.cloud.offerings.dao.NetworkOfferingDao;
import com.cloud.vm.VirtualMachineManager;
import com.cloud.vm.dao.DomainRouterDao;
import com.cloud.vm.dao.NicDao;
@ -36,6 +38,9 @@ public class VirtualNetworkApplianceFactory {
@Inject
protected NicDao nicDao;
@Inject
protected VirtualMachineManager itMgr;
@Inject
protected NetworkOfferingDao networkOfferingDao;
@ -54,6 +59,9 @@ public class VirtualNetworkApplianceFactory {
@Inject
protected RouterControlHelper routerControlHelper;
@Inject
protected NEWVirtualNetworkApplianceManager applianceManager;
public LoadBalancingRules createLoadBalancingRules(final Network network,
final List<LoadBalancingRule> rules) {
@ -83,8 +91,10 @@ public class VirtualNetworkApplianceFactory {
applier.loadBalancerDao = loadBalancerDao;
applier.configDao = configDao;
applier.nicDao = nicDao;
applier.itMgr = itMgr;
applier.networkOfferingDao = networkOfferingDao;
applier.routerDao = routerDao;
applier.routerControlHelper = routerControlHelper;
applier.applianceManager = applianceManager;
}
}

View File

@ -116,7 +116,7 @@ public class BasicNetworkTopology implements NetworkTopology {
RuleApplier ruleApplier = ruleApplierWrapper.getRuleType();
// REMOVE THIS SHIT AND INJECT USING A FACTORY FOR THE VISITORS
// [FIXME] REMOVE THIS SHIT AND INJECT USING A FACTORY FOR THE VISITORS
visitor.setApplianceManager(ruleApplier.getApplianceManager());
final DataCenter dc = _dcDao.findById(network.getDataCenterId());
@ -175,7 +175,7 @@ public class BasicNetworkTopology implements NetworkTopology {
if (!isZoneBasic && !disconnectedRouters.isEmpty() && disconnectedRouters.get(0).getIsRedundantRouter()) {
// These disconnected redundant virtual routers are out of sync
// now, stop them for synchronization
// handleSingleWorkingRedundantRouter(connectedRouters,
// [FIXME] handleSingleWorkingRedundantRouter(connectedRouters,
// disconnectedRouters, msg);
}
} else if (!disconnectedRouters.isEmpty()) {
@ -206,6 +206,8 @@ public class BasicNetworkTopology implements NetworkTopology {
return true;
}
s_logger.debug("APPLYING LOAD BALANCING RULES");
final String typeString = "loadbalancing rules";
final boolean isPodLevelException = false;
final boolean failWhenDisconnect = false;
@ -224,6 +226,8 @@ public class BasicNetworkTopology implements NetworkTopology {
return true;
}
s_logger.debug("APPLYING FIREWALL RULES");
final String typeString = "firewall rules";
final boolean isPodLevelException = false;
final boolean failWhenDisconnect = false;

View File

@ -19,27 +19,24 @@ package com.cloud.network.topology;
import java.util.Hashtable;
import javax.inject.Inject;
import com.cloud.dc.DataCenter;
import com.cloud.dc.DataCenter.NetworkType;
public final class NetworkTopologyContext {
public class NetworkTopologyContext {
private static NetworkTopologyContext instance;
private final Hashtable<NetworkType, NetworkTopology> flyweight = new Hashtable<DataCenter.NetworkType, NetworkTopology>();;
static {
instance = new NetworkTopologyContext();
}
@Inject
private BasicNetworkTopology basicNetworkTopology;
private final Hashtable<NetworkType, NetworkTopology> flyweight;
@Inject
private AdvancedNetworkTopology advancedNetworkTopology;
private NetworkTopologyContext() {
flyweight = new Hashtable<DataCenter.NetworkType, NetworkTopology>();
flyweight.put(NetworkType.Basic, new BasicNetworkTopology());
flyweight.put(NetworkType.Advanced, new AdvancedNetworkTopology());
}
public static NetworkTopologyContext getInstance() {
return instance;
public void init() {
flyweight.put(NetworkType.Basic, basicNetworkTopology);
flyweight.put(NetworkType.Advanced, advancedNetworkTopology);
}
public NetworkTopology retrieveNetworkTopology(final DataCenter dc) {