bug 10557: implemented the TODO - opening the stats port using iptable

This commit is contained in:
Naredula Janardhana Reddy 2011-07-28 17:23:40 +05:30
parent 527a668ca2
commit 2fc7be14de
7 changed files with 59 additions and 9 deletions

View File

@ -27,7 +27,8 @@ public class LoadBalancerConfigCommand extends NetworkElementCommand {
LoadBalancerTO[] loadBalancers; LoadBalancerTO[] loadBalancers;
public String lbStatsVisibility; public String lbStatsVisibility;
public String lbStatsIp; /* load balancer listen on this ip for stats */ public String lbStatsIp; /* load balancer listen on this ip for stats */
public String lbStatsPort = "8081"; /*TODO: need to open the firewall port, load balancer listen on this port for stats */ public String lbStatsPort = "8081"; /*load balancer listen on this port for stats */
public String lbStatsSrcCidrs = "0/0" ; /* TODO : currently there is no filtering based on the source ip */
public String lbStatsAuth = "admin1:AdMiN123"; public String lbStatsAuth = "admin1:AdMiN123";
public String lbStatsUri = "/admin?stats"; public String lbStatsUri = "/admin?stats";

View File

@ -201,6 +201,7 @@ public class VirtualRoutingResource implements Manager {
final String result = setLoadBalancerConfig(cfgFilePath, final String result = setLoadBalancerConfig(cfgFilePath,
rules[LoadBalancerConfigurator.ADD], rules[LoadBalancerConfigurator.ADD],
rules[LoadBalancerConfigurator.REMOVE], rules[LoadBalancerConfigurator.REMOVE],
rules[LoadBalancerConfigurator.STATS],
routerIp); routerIp);
return new Answer(cmd, result == null, result); return new Answer(cmd, result == null, result);
@ -294,7 +295,7 @@ public class VirtualRoutingResource implements Manager {
} }
private String setLoadBalancerConfig(final String cfgFile, private String setLoadBalancerConfig(final String cfgFile,
final String[] addRules, final String[] removeRules, String routerIp) { final String[] addRules, final String[] removeRules, final String[] statsRules,String routerIp) {
if (routerIp == null) { if (routerIp == null) {
routerIp = "none"; routerIp = "none";
@ -321,6 +322,14 @@ public class VirtualRoutingResource implements Manager {
command.add("-d", sb.toString()); command.add("-d", sb.toString());
} }
sb = new StringBuilder();
if (statsRules.length > 0) {
for (int i=0; i< statsRules.length; i++) {
sb.append(statsRules[i]).append(',');
}
command.add("-s", sb.toString());
}
return command.execute(); return command.execute();
} }

View File

@ -1303,6 +1303,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
String[] addRules = rules[LoadBalancerConfigurator.ADD]; String[] addRules = rules[LoadBalancerConfigurator.ADD];
String[] removeRules = rules[LoadBalancerConfigurator.REMOVE]; String[] removeRules = rules[LoadBalancerConfigurator.REMOVE];
String[] statRules = rules[LoadBalancerConfigurator.STATS];
String args = ""; String args = "";
args += "-i " + routerIp; args += "-i " + routerIp;
@ -1326,6 +1327,15 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
args += " -d " + sb.toString(); args += " -d " + sb.toString();
} }
sb = new StringBuilder();
if (statRules.length > 0) {
for (int i = 0; i < statRules.length; i++) {
sb.append(statRules[i]).append(',');
}
args += " -s " + sb.toString();
}
result = callHostPlugin(conn, "vmops", "setLoadBalancerRule", "args", args); result = callHostPlugin(conn, "vmops", "setLoadBalancerRule", "args", args);
if (result == null || result.isEmpty()) { if (result == null || result.isEmpty()) {

View File

@ -244,9 +244,10 @@ public class HAProxyConfigurator implements LoadBalancerConfigurator {
@Override @Override
public String[][] generateFwRules(LoadBalancerConfigCommand lbCmd) { public String[][] generateFwRules(LoadBalancerConfigCommand lbCmd) {
String [][] result = new String [2][]; String [][] result = new String [3][];
Set<String> toAdd = new HashSet<String>(); Set<String> toAdd = new HashSet<String>();
Set<String> toRemove = new HashSet<String>(); Set<String> toRemove = new HashSet<String>();
Set<String> toStats = new HashSet<String>();
for (LoadBalancerTO lbTO: lbCmd.getLoadBalancers()) { for (LoadBalancerTO lbTO: lbCmd.getLoadBalancers()) {
@ -266,9 +267,12 @@ public class HAProxyConfigurator implements LoadBalancerConfigurator {
toRemove.add(lbRuleEntry); toRemove.add(lbRuleEntry);
} }
} }
StringBuilder sb = new StringBuilder(lbCmd.lbStatsIp).append(":").append(lbCmd.lbStatsPort).append(":").append(lbCmd.lbStatsSrcCidrs).append(":,");
toStats.add(sb.toString());
toRemove.removeAll(toAdd); toRemove.removeAll(toAdd);
result[ADD] = toAdd.toArray(new String[toAdd.size()]); result[ADD] = toAdd.toArray(new String[toAdd.size()]);
result[REMOVE] = toRemove.toArray(new String[toRemove.size()]); result[REMOVE] = toRemove.toArray(new String[toRemove.size()]);
result[STATS] = toStats.toArray(new String[toStats.size()]);
return result; return result;
} }

View File

@ -30,6 +30,7 @@ import com.cloud.agent.api.to.PortForwardingRuleTO;
public interface LoadBalancerConfigurator { public interface LoadBalancerConfigurator {
public final static int ADD = 0; public final static int ADD = 0;
public final static int REMOVE = 1; public final static int REMOVE = 1;
public final static int STATS = 2;
public String [] generateConfiguration(List<PortForwardingRuleTO> fwRules); public String [] generateConfiguration(List<PortForwardingRuleTO> fwRules);

View File

@ -27,7 +27,7 @@
# @VERSION@ # @VERSION@
usage() { usage() {
printf "Usage: %s: -i <domR eth1 ip> -a <added public ip address> -d <removed> -f <load balancer config> \n" $(basename $0) >&2 printf "Usage: %s: -i <domR eth1 ip> -a <added public ip address> -d <removed> -f <load balancer config> -s <stats guest ip address> \n" $(basename $0) >&2
} }
# set -x # set -x
@ -48,6 +48,9 @@ fw_remove_backup() {
iptables -D INPUT -i $vif -p tcp -j back_load_balancer_$vif 2> /dev/null iptables -D INPUT -i $vif -p tcp -j back_load_balancer_$vif 2> /dev/null
iptables -X back_load_balancer_$vif 2> /dev/null iptables -X back_load_balancer_$vif 2> /dev/null
done done
iptables -F back_lb_stats 2> /dev/null
iptables -D INPUT -i $STAT_IF -p tcp -j back_lb_stats 2> /dev/null
iptables -X back_lb_stats 2> /dev/null
} }
fw_restore() { fw_restore() {
for vif in $VIF_LIST; do for vif in $VIF_LIST; do
@ -56,11 +59,16 @@ fw_restore() {
iptables -X load_balancer_$vif 2> /dev/null iptables -X load_balancer_$vif 2> /dev/null
iptables -E back_load_balancer_$vif load_balancer_$vif 2> /dev/null iptables -E back_load_balancer_$vif load_balancer_$vif 2> /dev/null
done done
iptables -F lb_stats 2> /dev/null
iptables -D INPUT -i $STAT_IF -p tcp -j lb_stats 2> /dev/null
iptables -X lb_stats 2> /dev/null
iptables -E back_lb_stats lb_stats 2> /dev/null
} }
# firewall entry to ensure that haproxy can receive on specified port # firewall entry to ensure that haproxy can receive on specified port
fw_entry() { fw_entry() {
local added=$1 local added=$1
local removed=$2 local removed=$2
local stats=$3
if [ "$added" == "none" ] if [ "$added" == "none" ]
then then
@ -81,6 +89,9 @@ fw_entry() {
iptables -N load_balancer_$vif 2> /dev/null iptables -N load_balancer_$vif 2> /dev/null
iptables -A INPUT -i $vif -p tcp -j load_balancer_$vif iptables -A INPUT -i $vif -p tcp -j load_balancer_$vif
done done
iptables -E lb_stats back_lb_stats 2> /dev/null
iptables -N lb_stats 2> /dev/null
iptables -A INPUT -i $STAT_IF -p tcp -j lb_stats
for i in $a for i in $a
do do
@ -97,6 +108,10 @@ fw_entry() {
fi fi
done done
done done
local pubIp=$(echo $stats | cut -d: -f1)
local dport=$(echo $stats | cut -d: -f2)
local cidrs=$(echo $stats | cut -d: -f3 | sed 's/-/,/')
iptables -A lb_stats -s $cidrs -p tcp -m state --state NEW -d $pubIp --dport $dport -j ACCEPT
return 0 return 0
} }
@ -137,8 +152,9 @@ iflag=
aflag= aflag=
dflag= dflag=
fflag= fflag=
sflag=
while getopts 'i:a:d:f:' OPTION while getopts 'i:a:d:f:s:' OPTION
do do
case $OPTION in case $OPTION in
i) iflag=1 i) iflag=1
@ -153,6 +169,9 @@ do
f) fflag=1 f) fflag=1
cfgfile="$OPTARG" cfgfile="$OPTARG"
;; ;;
s) sflag=1
statsIp="$OPTARG"
;;
?) usage ?) usage
exit 2 exit 2
;; ;;
@ -160,6 +179,8 @@ do
done done
VIF_LIST=$(get_vif_list) VIF_LIST=$(get_vif_list)
# TODO make the stat interface generic
STAT_IF="eth0"
# hot reconfigure haproxy # hot reconfigure haproxy
reconfig_lb $cfgfile reconfig_lb $cfgfile
@ -181,7 +202,7 @@ then
fi fi
# iptables entry to ensure that haproxy receives traffic # iptables entry to ensure that haproxy receives traffic
fw_entry $addedIps $removedIps fw_entry $addedIps $removedIps $statsIp
if [ $? -gt 0 ] if [ $? -gt 0 ]
then then

View File

@ -26,7 +26,7 @@
# #
usage() { usage() {
printf "Usage: %s: -i <domR eth1 ip> -a <added public ip address> -d <removed> -f <load balancer config> \n" $(basename $0) >&2 printf "Usage: %s: -i <domR eth1 ip> -a <added public ip address> -d <removed> -f <load balancer config> -s <stats guest ip >\n" $(basename $0) >&2
} }
set -x set -x
@ -55,8 +55,9 @@ iflag=
aflag= aflag=
dflag= dflag=
fflag= fflag=
sflag=
while getopts 'i:a:d:f:' OPTION while getopts 'i:a:d:f:s:' OPTION
do do
case $OPTION in case $OPTION in
i) iflag=1 i) iflag=1
@ -71,6 +72,9 @@ do
f) fflag=1 f) fflag=1
cfgfile="$OPTARG" cfgfile="$OPTARG"
;; ;;
s) sflag=1
statsIps="$OPTARG"
;;
?) usage ?) usage
exit 2 exit 2
;; ;;