fixing the classes relationship; adding beans properly in the spring context; using the right basic/advance stuff; testing ip and port forwarding rules

Conflicts:
	server/src/org/apache/cloudstack/network/topology/AdvancedNetworkVisitor.java
	server/src/org/apache/cloudstack/network/topology/BasicNetworkTopology.java
	server/src/org/apache/cloudstack/network/topology/BasicNetworkVisitor.java
This commit is contained in:
Wilder Rodrigues 2014-07-15 13:50:37 +02:00
parent 3d16a407c9
commit 514beef30e
5 changed files with 133 additions and 47 deletions

View File

@ -197,6 +197,9 @@
<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="routerControlHelper"
class="com.cloud.network.router.RouterControlHelper" />

View File

@ -130,6 +130,8 @@ public class VirtualNetworkApplianceFactory {
initBeans(ipAssociationRules);
ipAssociationRules.networkDao = networkDao;
return ipAssociationRules;
}

View File

@ -17,16 +17,13 @@
package org.apache.cloudstack.network.topology;
import java.util.List;
import org.apache.log4j.Logger;
import org.springframework.stereotype.Component;
import com.cloud.agent.api.Command;
import com.cloud.agent.manager.Commands;
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.VirtualRouter;
import com.cloud.network.rules.DhcpRules;
@ -48,7 +45,8 @@ import com.cloud.network.rules.UserdataToRouterRules;
import com.cloud.network.rules.VpcIpAssociationRules;
import com.cloud.network.rules.VpnRules;
public class AdvancedNetworkVisitor extends NetworkTopologyVisitor {
@Component
public class AdvancedNetworkVisitor extends BasicNetworkVisitor {
private static final Logger s_logger = Logger.getLogger(AdvancedNetworkVisitor.class);
@ -174,17 +172,6 @@ public class AdvancedNetworkVisitor extends NetworkTopologyVisitor {
return false;
}
@Override
public boolean visit(final VpnRules vpn) throws ResourceUnavailableException {
VirtualRouter router = vpn.getRouter();
List<? extends VpnUser> users = vpn.getUsers();
final Commands cmds = new Commands(Command.OnError.Continue);
vpn.createApplyVpnUsersCommand(users, router, cmds);
return applianceManager.sendCommandsToRouter(router, cmds);
}
@Override
public boolean visit(final DhcpPvlanRules vpn) throws ResourceUnavailableException {
return false;

View File

@ -24,6 +24,8 @@ import java.util.Map;
import javax.inject.Inject;
import org.apache.log4j.Logger;
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;
@ -34,6 +36,7 @@ import com.cloud.exception.AgentUnavailableException;
import com.cloud.exception.ConcurrentOperationException;
import com.cloud.exception.InsufficientCapacityException;
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.PublicIpAddress;
@ -64,6 +67,14 @@ public class BasicNetworkTopology implements NetworkTopology {
@Inject
protected VirtualNetworkApplianceFactory virtualNetworkApplianceFactory;
@Autowired
@Qualifier("basicNetworkVisitor")
protected BasicNetworkVisitor basicVisitor;
@Autowired
@Qualifier("advancedNetworkVisitor")
protected AdvancedNetworkVisitor advancedVisitor;
@Inject
protected DataCenterDao _dcDao;
@ -198,9 +209,6 @@ public class BasicNetworkTopology implements NetworkTopology {
s_logger.debug("APPLYING VPN RULES");
// should become a BasicNetworkVisitor in the end
AdvancedNetworkVisitor visitor = new AdvancedNetworkVisitor();
boolean agentResults = true;
for (final DomainRouterVO router : routers) {
@ -212,14 +220,10 @@ public class BasicNetworkTopology implements NetworkTopology {
VpnRules vpnRules = virtualNetworkApplianceFactory.createVpnRules(network, users);
// [FIXME] REMOVE THIS SHIT AND INJECT USING A FACTORY FOR THE
// VISITORS
visitor.setApplianceManager(vpnRules.getApplianceManager());
// 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(visitor, router);
final boolean agentResult = vpnRules.accept(basicVisitor, router);
agentResults = agentResults && agentResult;
}
@ -244,14 +248,8 @@ public class BasicNetworkTopology implements NetworkTopology {
throw new ResourceUnavailableException("Unable to apply " + typeString, DataCenter.class, network.getDataCenterId());
}
// should become a BasicNetworkVisitor in the end
AdvancedNetworkVisitor visitor = new AdvancedNetworkVisitor();
RuleApplier ruleApplier = ruleApplierWrapper.getRuleType();
// [FIXME] REMOVE THIS SHIT AND INJECT USING A FACTORY FOR THE VISITORS
visitor.setApplianceManager(ruleApplier.getApplianceManager());
final DataCenter dc = _dcDao.findById(network.getDataCenterId());
final boolean isZoneBasic = dc.getNetworkType() == NetworkType.Basic;
@ -276,7 +274,7 @@ public class BasicNetworkTopology implements NetworkTopology {
}
try {
ruleApplier.accept(visitor, router);
ruleApplier.accept(basicVisitor, router);
connectedRouters.add(router);
} catch (final AgentUnavailableException e) {

View File

@ -17,47 +17,127 @@
package org.apache.cloudstack.network.topology;
import java.util.List;
import javax.inject.Inject;
import org.apache.log4j.Logger;
import org.springframework.stereotype.Component;
import com.cloud.agent.api.Command;
import com.cloud.agent.manager.Commands;
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.VirtualRouter;
import com.cloud.network.rules.DhcpRules;
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.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.UserdataPwdRules;
import com.cloud.network.rules.UserdataToRouterRules;
import com.cloud.network.rules.VpcIpAssociationRules;
import com.cloud.network.rules.VpnRules;
import com.cloud.utils.exception.CloudRuntimeException;
@Component
public class BasicNetworkVisitor extends NetworkTopologyVisitor {
private static final Logger s_logger = Logger.getLogger(BasicNetworkVisitor.class);
public BasicNetworkVisitor(final NetworkTopology networkTopology) {
super(networkTopology);
}
@Inject
protected NEWVirtualNetworkApplianceManager applianceManager;
@Override
public boolean visit(final StaticNatRules nat) throws ResourceUnavailableException {
Network network = nat.getNetwork();
VirtualRouter router = nat.getRouter();
List<? extends StaticNat> rules = nat.getRules();
final Commands cmds = new Commands(Command.OnError.Continue);
nat.createApplyStaticNatCommands(rules, router, cmds, network.getId());
return applianceManager.sendCommandsToRouter(router, cmds);
}
@Override
public boolean visit(final LoadBalancingRules loadbalancing) throws ResourceUnavailableException {
Network network = loadbalancing.getNetwork();
VirtualRouter router = loadbalancing.getRouter();
List<LoadBalancingRule> rules = loadbalancing.getRules();
final Commands cmds = new Commands(Command.OnError.Continue);
loadbalancing.createApplyLoadBalancingRulesCommands(rules, router, cmds, network.getId());
return applianceManager.sendCommandsToRouter(router, cmds);
}
@SuppressWarnings("unchecked")
@Override
public boolean visit(final FirewallRules firewall) throws ResourceUnavailableException {
Network network = firewall.getNetwork();
VirtualRouter router = firewall.getRouter();
List<? extends FirewallRule> rules = firewall.getRules();
List<LoadBalancingRule> loadbalancingRules = firewall.getLoadbalancingRules();
Purpose purpose = firewall.getPurpose();
final Commands cmds = new Commands(Command.OnError.Continue);
if (purpose == Purpose.LoadBalancing) {
firewall.createApplyLoadBalancingRulesCommands(loadbalancingRules, router, cmds, network.getId());
return applianceManager.sendCommandsToRouter(router, cmds);
} else if (purpose == Purpose.PortForwarding) {
firewall.createApplyPortForwardingRulesCommands((List<? extends PortForwardingRule>) rules, router, cmds, network.getId());
return applianceManager.sendCommandsToRouter(router, cmds);
} else if (purpose == Purpose.StaticNat) {
firewall.createApplyStaticNatRulesCommands((List<StaticNatRule>) rules, router, cmds, network.getId());
return applianceManager.sendCommandsToRouter(router, cmds);
} else if (purpose == Purpose.Firewall) {
firewall.createApplyFirewallRulesCommands(rules, router, cmds, network.getId());
return applianceManager.sendCommandsToRouter(router, cmds);
}
s_logger.warn("Unable to apply rules of purpose: " + rules.get(0).getPurpose());
return false;
}
@Override
public boolean visit(final LoadBalancingRules nat) throws ResourceUnavailableException {
return false;
}
public boolean visit(final IpAssociationRules ipRules) throws ResourceUnavailableException {
Network network = ipRules.getNetwork();
VirtualRouter router = ipRules.getRouter();
Commands commands = ipRules.getCommands();
List<? extends PublicIpAddress> ips = ipRules.getIpAddresses();
@Override
public boolean visit(final FirewallRules nat) throws ResourceUnavailableException {
return false;
}
@Override
public boolean visit(final IpAssociationRules nat) throws ResourceUnavailableException {
return false;
ipRules.createAssociateIPCommands(router, ips, commands, network.getId());
return applianceManager.sendCommandsToRouter(router, commands);
}
@Override
@ -82,12 +162,12 @@ public class BasicNetworkVisitor extends NetworkTopologyVisitor {
@Override
public boolean visit(final NetworkAclsRules nat) throws ResourceUnavailableException {
return false;
throw new CloudRuntimeException("NetworkAclsRules not implemented in Basic Network Topology.");
}
@Override
public boolean visit(final VpcIpAssociationRules nat) throws ResourceUnavailableException {
return false;
throw new CloudRuntimeException("VpcIpAssociationRules not implemented in Basic Network Topology.");
}
@Override
@ -95,17 +175,33 @@ public class BasicNetworkVisitor extends NetworkTopologyVisitor {
Network network = userdata.getNetwork();
VirtualRouter router = userdata.getRouter();
//return sendCommandsToRouter(router, cmds);
// return sendCommandsToRouter(router, cmds);
return false;
}
@Override
public boolean visit(PrivateGatewayRules userdata) throws ResourceUnavailableException {
public boolean visit(final PrivateGatewayRules userdata) throws ResourceUnavailableException {
throw new CloudRuntimeException("PrivateGatewayRules not implemented in Basic Network Topology.");
}
@Override
public boolean visit(final VpnRules vpn) throws ResourceUnavailableException {
VirtualRouter router = vpn.getRouter();
List<? extends VpnUser> users = vpn.getUsers();
final Commands cmds = new Commands(Command.OnError.Continue);
vpn.createApplyVpnUsersCommand(users, router, cmds);
return applianceManager.sendCommandsToRouter(router, cmds);
}
@Override
public boolean visit(final DhcpPvlanRules vpn) throws ResourceUnavailableException {
return false;
}
@Override
public boolean visit(VpnRules userdata) throws ResourceUnavailableException {
public boolean visit(final VpnRules userdata) throws ResourceUnavailableException {
return false;
}
}