diff --git a/server/resources/META-INF/cloudstack/core/spring-server-core-managers-context.xml b/server/resources/META-INF/cloudstack/core/spring-server-core-managers-context.xml
index 3fe48b30f82..6459ddb373e 100644
--- a/server/resources/META-INF/cloudstack/core/spring-server-core-managers-context.xml
+++ b/server/resources/META-INF/cloudstack/core/spring-server-core-managers-context.xml
@@ -197,6 +197,9 @@
+
+
+
diff --git a/server/src/com/cloud/network/rules/VirtualNetworkApplianceFactory.java b/server/src/com/cloud/network/rules/VirtualNetworkApplianceFactory.java
index fa9e857de83..6cca42b186d 100644
--- a/server/src/com/cloud/network/rules/VirtualNetworkApplianceFactory.java
+++ b/server/src/com/cloud/network/rules/VirtualNetworkApplianceFactory.java
@@ -130,6 +130,8 @@ public class VirtualNetworkApplianceFactory {
initBeans(ipAssociationRules);
+ ipAssociationRules.networkDao = networkDao;
+
return ipAssociationRules;
}
diff --git a/server/src/org/apache/cloudstack/network/topology/AdvancedNetworkVisitor.java b/server/src/org/apache/cloudstack/network/topology/AdvancedNetworkVisitor.java
index 1b0716adada..9f59ccbbaba 100644
--- a/server/src/org/apache/cloudstack/network/topology/AdvancedNetworkVisitor.java
+++ b/server/src/org/apache/cloudstack/network/topology/AdvancedNetworkVisitor.java
@@ -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;
diff --git a/server/src/org/apache/cloudstack/network/topology/BasicNetworkTopology.java b/server/src/org/apache/cloudstack/network/topology/BasicNetworkTopology.java
index 4cd5326047a..41b3a25125b 100644
--- a/server/src/org/apache/cloudstack/network/topology/BasicNetworkTopology.java
+++ b/server/src/org/apache/cloudstack/network/topology/BasicNetworkTopology.java
@@ -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) {
diff --git a/server/src/org/apache/cloudstack/network/topology/BasicNetworkVisitor.java b/server/src/org/apache/cloudstack/network/topology/BasicNetworkVisitor.java
index b70fe71c64d..cc154043e09 100644
--- a/server/src/org/apache/cloudstack/network/topology/BasicNetworkVisitor.java
+++ b/server/src/org/apache/cloudstack/network/topology/BasicNetworkVisitor.java
@@ -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 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 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) 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;
}
}
\ No newline at end of file