From 5c9a11523b7f4558fdac190eb82099c1ffbf9531 Mon Sep 17 00:00:00 2001 From: Chiradeep Vittal Date: Mon, 20 Dec 2010 17:18:04 -0800 Subject: [PATCH] WIP 2 --- .../VirtualRoutingResource.java | 118 ++++++++++++++---- .../xen/resource/CitrixResourceBase.java | 4 +- 2 files changed, 99 insertions(+), 23 deletions(-) diff --git a/core/src/com/cloud/agent/resource/virtualnetwork/VirtualRoutingResource.java b/core/src/com/cloud/agent/resource/virtualnetwork/VirtualRoutingResource.java index 284e56acd12..c9aef0fe787 100755 --- a/core/src/com/cloud/agent/resource/virtualnetwork/VirtualRoutingResource.java +++ b/core/src/com/cloud/agent/resource/virtualnetwork/VirtualRoutingResource.java @@ -49,11 +49,18 @@ import com.cloud.agent.api.routing.IPAssocCommand; import com.cloud.agent.api.routing.IpAssocAnswer; import com.cloud.agent.api.routing.LoadBalancerCfgCommand; import com.cloud.agent.api.routing.RoutingCommand; +import com.cloud.agent.api.routing.LoadBalancerConfigCommand; import com.cloud.agent.api.routing.SavePasswordCommand; +import com.cloud.agent.api.routing.SetPortForwardingRulesAnswer; +import com.cloud.agent.api.routing.SetPortForwardingRulesCommand; import com.cloud.agent.api.routing.VmDataCommand; import com.cloud.agent.api.to.IpAddressTO; +import com.cloud.agent.api.to.PortForwardingRuleTO; +import com.cloud.network.HAProxyConfigurator; +import com.cloud.network.LoadBalancerConfigurator; import com.cloud.utils.NumbersUtil; import com.cloud.utils.component.Manager; +import com.cloud.utils.net.NetUtils; import com.cloud.utils.script.OutputInterpreter; import com.cloud.utils.script.Script; @@ -89,11 +96,12 @@ public class VirtualRoutingResource implements Manager { public Answer executeRequest(final Command cmd) { try { -// if (cmd instanceof SetFirewallRuleCommand) { -// return execute((SetFirewallRuleCommand)cmd); -// }else - if (cmd instanceof LoadBalancerCfgCommand) { + if (cmd instanceof SetPortForwardingRulesCommand ) { + return execute((SetPortForwardingRulesCommand)cmd); + }else if (cmd instanceof LoadBalancerCfgCommand) { return execute((LoadBalancerCfgCommand)cmd); + } else if (cmd instanceof LoadBalancerConfigCommand) { + return execute((LoadBalancerConfigCommand)cmd); } else if (cmd instanceof IPAssocCommand) { return execute((IPAssocCommand)cmd); } else if (cmd instanceof CheckConsoleProxyLoadCommand) { @@ -114,7 +122,67 @@ public class VirtualRoutingResource implements Manager { } } - protected Answer execute(VmDataCommand cmd) { + private Answer execute(SetPortForwardingRulesCommand cmd) { + String routerIp = cmd.getAccessDetail("router.ip"); + String routerName = cmd.getAccessDetail("router.name"); + + String[] results = new String[cmd.getRules().length]; + int i = 0; + for (PortForwardingRuleTO rule : cmd.getRules()) { + String result = null; + if (rule.getProtocol().equalsIgnoreCase(NetUtils.NAT_PROTO)){ + setStaticNat(!rule.revoked(), routerName, routerIp, rule.getSrcIp(), rule.getDstIp()); + } else { + + result = setPortForwardRule(!rule.revoked(), routerName, routerIp, + rule.getProtocol(), rule.getSrcIp(), + Integer.toString(rule.getSrcPortRange()[0]), rule.getDstIp(), + Integer.toString(rule.getDstPortRange()[0])); + + } + results[i++] = (result == null || result.isEmpty()) ? "Failed" : null; + } + + return new SetPortForwardingRulesAnswer(cmd, results); + } + + private Answer execute(LoadBalancerConfigCommand cmd) { + + File tmpCfgFile = null; + try { + String cfgFilePath = ""; + String routerIP = null; + LoadBalancerConfigurator cfgtr = new HAProxyConfigurator(); + String[] config = cfgtr.generateConfiguration(cmd); + String[][] rules = cfgtr.generateFwRules(cmd); + if (cmd.getRouterIp() != null) { + tmpCfgFile = File.createTempFile(cmd.getRouterIp().replace('.', '_'), "cfg"); + final PrintWriter out + = new PrintWriter(new BufferedWriter(new FileWriter(tmpCfgFile))); + for (int i=0; i < config.length; i++) { + out.println(config[i]); + } + out.close(); + cfgFilePath = tmpCfgFile.getAbsolutePath(); + routerIP = cmd.getRouterIp(); + } + + final String result = setLoadBalancerConfig(cfgFilePath, + rules[LoadBalancerConfigurator.ADD], + rules[LoadBalancerConfigurator.REMOVE], + routerIP); + + return new Answer(cmd, result == null, result); + } catch (final IOException e) { + return new Answer(cmd, false, e.getMessage()); + } finally { + if (tmpCfgFile != null) { + tmpCfgFile.delete(); + } + } + } + + protected Answer execute(VmDataCommand cmd) { List vmData = cmd.getVmData(); for (String[] vmDataEntry : vmData) { @@ -381,39 +449,47 @@ public class VirtualRoutingResource implements Manager { return command.execute(); } - public String setFirewallRules(final boolean enable, final String routerName, final String routerIpAddress, final String protocol, - final String publicIpAddress, final String publicPort, final String privateIpAddress, final String privatePort, - String oldPrivateIP, String oldPrivatePort, String vlanNetmask) { + public String setPortForwardRule(final boolean enable, final String routerName, final String routerIpAddress, final String protocol, + final String publicIpAddress, final String publicPortRange, final String privateIpAddress, final String privatePortRange) { if (routerIpAddress == null) { - s_logger.warn("SetFirewallRuleCommand did nothing because Router IP address was null when creating rule for public IP: " + publicIpAddress); + s_logger.warn("setPortForwardRule did nothing because Router IP address was null when creating rule for public IP: " + publicIpAddress); return null; } - if (oldPrivateIP == null) { - oldPrivateIP = ""; - } - if (oldPrivatePort == null) { - oldPrivatePort = ""; - } - + final Script command = new Script(_firewallPath, _timeout, s_logger); command.add(enable ? "-A" : "-D"); command.add("-P", protocol); command.add("-l", publicIpAddress); - command.add("-p", publicPort); + command.add("-p", publicPortRange); command.add("-n", routerName); command.add("-i", routerIpAddress); command.add("-r", privateIpAddress); - command.add("-d", privatePort); - command.add("-N", vlanNetmask); - command.add("-w", oldPrivateIP); - command.add("-x", oldPrivatePort); + command.add("-d", privatePortRange); return command.execute(); } + public String setStaticNat(final boolean enable, final String routerName, final String routerIpAddress, + final String publicIpAddress, final String privateIpAddress) { + + if (routerIpAddress == null) { + s_logger.warn("setStaticNat did nothing because Router IP address was null when creating rule for public IP: " + publicIpAddress); + return null; + } + + final Script command = new Script(_firewallPath, _timeout, s_logger); + + command.add(enable ? "-A" : "-D"); + command.add("-l", publicIpAddress); + command.add("-n", routerName); + command.add("-i", routerIpAddress); + command.add("-G", privateIpAddress); + return command.execute(); + } + private boolean isBridgeExists(String bridgeName) { Script command = new Script("/bin/sh", _timeout); command.add("-c"); diff --git a/core/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java b/core/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java index cd09d803eb0..a458dd3555e 100644 --- a/core/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java +++ b/core/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java @@ -1040,12 +1040,12 @@ public abstract class CitrixResourceBase implements ServerResource { protected Answer execute(final LoadBalancerConfigCommand cmd) { Connection conn = getConnection(); - String routerIp = cmd.getRouterIp(); + String routerIp = cmd.getAccessDetail("router.ip"); if (routerIp == null) { return new Answer(cmd); } - + LoadBalancerConfigurator cfgtr = new HAProxyConfigurator(); String[] config = cfgtr.generateConfiguration(cmd); String[][] rules = cfgtr.generateFwRules(cmd);