From 514beef30e749b93d27daffd975f85f7ad226201 Mon Sep 17 00:00:00 2001 From: Wilder Rodrigues Date: Tue, 15 Jul 2014 13:50:37 +0200 Subject: [PATCH] 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 --- .../spring-server-core-managers-context.xml | 3 + .../rules/VirtualNetworkApplianceFactory.java | 2 + .../topology/AdvancedNetworkVisitor.java | 19 +-- .../topology/BasicNetworkTopology.java | 28 ++-- .../network/topology/BasicNetworkVisitor.java | 128 +++++++++++++++--- 5 files changed, 133 insertions(+), 47 deletions(-) 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 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 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 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) 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 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 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