Skip to content

Commit 4b48222

Browse files
committed
initial attempt at network.loadbalancer.haproxy.idle.timeout implementation
1 parent a5b6bc3 commit 4b48222

File tree

9 files changed

+40
-7
lines changed

9 files changed

+40
-7
lines changed

core/src/main/java/com/cloud/agent/api/routing/LoadBalancerConfigCommand.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ public class LoadBalancerConfigCommand extends NetworkElementCommand {
3636
public String lbStatsAuth = "admin1:AdMiN123";
3737
public String lbStatsUri = "/admin?stats";
3838
public String maxconn = "";
39+
public Long idleTimeout = -1; /* -1=use default, 0=infinite, >0 = timeout in milliseconds */
3940
public String lbProtocol;
4041
public boolean keepAliveEnabled = false;
4142
NicTO nic;
@@ -50,7 +51,7 @@ public LoadBalancerConfigCommand(LoadBalancerTO[] loadBalancers, Long vpcId) {
5051
}
5152

5253
public LoadBalancerConfigCommand(LoadBalancerTO[] loadBalancers, String publicIp, String guestIp, String privateIp, NicTO nic, Long vpcId, String maxconn,
53-
boolean keepAliveEnabled) {
54+
boolean keepAliveEnabled, Long idleTimeout) {
5455
this.loadBalancers = loadBalancers;
5556
this.lbStatsPublicIP = publicIp;
5657
this.lbStatsPrivateIP = privateIp;
@@ -59,6 +60,7 @@ public LoadBalancerConfigCommand(LoadBalancerTO[] loadBalancers, String publicIp
5960
this.vpcId = vpcId;
6061
this.maxconn = maxconn;
6162
this.keepAliveEnabled = keepAliveEnabled;
63+
this.idleTimeout = idleTimeout;
6264
}
6365

6466
public NicTO getNic() {

core/src/main/java/com/cloud/network/HAProxyConfigurator.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -635,6 +635,13 @@ public String[] generateConfiguration(final LoadBalancerConfigCommand lbCmd) {
635635
if (lbCmd.keepAliveEnabled) {
636636
dSection.set(7, "\tno option httpclose");
637637
}
638+
if (lbCmd.idleTimeout > 0) {
639+
dSection.set(9, "\ttimeout client " + Long.toString(lbCmd.idleTimeout));
640+
dSection.set(10, "\ttimeout server " + Long.toString(lbCmd.idleTimeout));
641+
} else if (lbcmd.IdleTimeout == 0) {
642+
dSection.remove(10);
643+
dSection.remove(9);
644+
}
638645

639646
if (logger.isDebugEnabled()) {
640647
for (final String s : dSection) {

engine/api/src/main/java/org/apache/cloudstack/engine/orchestration/service/NetworkOrchestrationService.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,15 @@ public interface NetworkOrchestrationService {
122122
"Load Balancer(haproxy) maximum number of concurrent connections(global max)",
123123
true,
124124
Scope.Global);
125+
ConfigKey<Long> NETWORK_LB_HAPROXY_IDLE_TIMEOUT = new ConfigKey<>(
126+
"Network",
127+
Long.class,
128+
"network.loadbalancer.haproxy.idle.timeout",
129+
"50000",
130+
"Load Balancer(haproxy) idle timeout in milliseconds. Use 0 for infinite.",
131+
true,
132+
Scope.Global
133+
)
125134

126135
List<? extends Network> setupNetwork(Account owner, NetworkOffering offering, DeploymentPlan plan, String name, String displayText, boolean isDefault)
127136
throws ConcurrentOperationException;

engine/orchestration/src/main/java/org/apache/cloudstack/engine/orchestration/NetworkOrchestrator.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4919,6 +4919,7 @@ public ConfigKey<?>[] getConfigKeys() {
49194919
return new ConfigKey<?>[]{NetworkGcWait, NetworkGcInterval, NetworkLockTimeout, DeniedRoutes,
49204920
GuestDomainSuffix, NetworkThrottlingRate, MinVRVersion,
49214921
PromiscuousMode, MacAddressChanges, ForgedTransmits, MacLearning, RollingRestartEnabled,
4922-
TUNGSTEN_ENABLED, NSX_ENABLED, NETRIS_ENABLED, NETWORK_LB_HAPROXY_MAX_CONN};
4922+
TUNGSTEN_ENABLED, NSX_ENABLED, NETRIS_ENABLED, NETWORK_LB_HAPROXY_MAX_CONN,
4923+
NETWORK_LB_HAPROXY_IDLE_TIMEOUT};
49234924
}
49244925
}

plugins/network-elements/elastic-loadbalancer/src/main/java/com/cloud/network/lb/ElasticLoadBalancerManagerImpl.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -214,7 +214,8 @@ private void createApplyLoadBalancingRulesCommands(List<LoadBalancingRule> rules
214214
maxconn = offering.getConcurrentConnections().toString();
215215
}
216216
LoadBalancerConfigCommand cmd = new LoadBalancerConfigCommand(lbs, elbVm.getPublicIpAddress(), _nicDao.getIpAddress(guestNetworkId, elbVm.getId()),
217-
elbVm.getPrivateIpAddress(), null, null, maxconn, offering.isKeepAliveEnabled());
217+
elbVm.getPrivateIpAddress(), null, null, maxconn, offering.isKeepAliveEnabled(),
218+
NetworkOrchestrationService.NETWORK_LB_HAPROXY_IDLE_TIMEOUT.value());
218219
cmd.setAccessDetail(NetworkElementCommand.ROUTER_IP, elbVm.getPrivateIpAddress());
219220
cmd.setAccessDetail(NetworkElementCommand.ROUTER_NAME, elbVm.getInstanceName());
220221
//FIXME: why are we setting attributes directly? Ick!! There should be accessors and

plugins/network-elements/internal-loadbalancer/src/main/java/org/apache/cloudstack/network/lb/InternalLoadBalancerVMManagerImpl.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -513,7 +513,8 @@ private void createApplyLoadBalancingRulesCommands(final List<LoadBalancingRule>
513513
}
514514
final LoadBalancerConfigCommand cmd =
515515
new LoadBalancerConfigCommand(lbs, guestNic.getIPv4Address(), guestNic.getIPv4Address(), internalLbVm.getPrivateIpAddress(), _itMgr.toNicTO(guestNicProfile,
516-
internalLbVm.getHypervisorType()), internalLbVm.getVpcId(), maxconn, offering.isKeepAliveEnabled());
516+
internalLbVm.getHypervisorType()), internalLbVm.getVpcId(), maxconn, offering.isKeepAliveEnabled(),
517+
NetworkOrchestrationService.NETWORK_LB_HAPROXY_IDLE_TIMEOUT.value());
517518

518519
cmd.lbStatsVisibility = _configDao.getValue(Config.NetworkLBHaproxyStatsVisbility.key());
519520
cmd.lbStatsUri = _configDao.getValue(Config.NetworkLBHaproxyStatsUri.key());

server/src/main/java/com/cloud/network/router/CommandSetupHelper.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -396,7 +396,8 @@ public void createApplyLoadBalancingRulesCommands(final List<LoadBalancingRule>
396396
}
397397

398398
final LoadBalancerConfigCommand cmd = new LoadBalancerConfigCommand(lbs, routerPublicIp, _routerControlHelper.getRouterIpInNetwork(guestNetworkId, router.getId()),
399-
router.getPrivateIpAddress(), _itMgr.toNicTO(nicProfile, router.getHypervisorType()), router.getVpcId(), maxconn, offering.isKeepAliveEnabled());
399+
router.getPrivateIpAddress(), _itMgr.toNicTO(nicProfile, router.getHypervisorType()), router.getVpcId(), maxconn, offering.isKeepAliveEnabled(),
400+
NetworkOrchestrationService.NETWORK_LB_HAPROXY_IDLE_TIMEOUT.value());
400401

401402
cmd.lbStatsVisibility = _configDao.getValue(Config.NetworkLBHaproxyStatsVisbility.key());
402403
cmd.lbStatsUri = _configDao.getValue(Config.NetworkLBHaproxyStatsUri.key());

server/src/main/java/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1688,7 +1688,7 @@ private void updateWithLbRules(final DomainRouterJoinVO routerJoinVO, final Stri
16881688
} else {
16891689
loadBalancingData.append("maxconn=").append(offering.getConcurrentConnections());
16901690
}
1691-
1691+
loadBalancingData.append(",idletimeout=").append(NetworkOrchestrationService.NETWORK_LB_HAPROXY_IDLE_TIMEOUT.value());
16921692
loadBalancingData.append(",sourcePortStart=").append(firewallRuleVO.getSourcePortStart())
16931693
.append(",sourcePortEnd=").append(firewallRuleVO.getSourcePortEnd());
16941694
if (firewallRuleVO instanceof LoadBalancerVO) {

systemvm/debian/root/health_checks/haproxy_check.py

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,16 @@ def checkMaxconn(haproxyData, haCfgSections):
2828

2929
return True
3030

31+
def checkIdletimeout(haproxyData, haCfgSections):
32+
if "idletimeout" in haproxyData:
33+
if "timeout client" not in haCfgSections["defaults"] or "timeout server" not in haCfgSections["defaults"]:
34+
print("defaults timeout client or timeout server missing")
35+
36+
if haproxyData["idletimeout"] != haCfgSections["defaults"]["timeout client"][0].strip() or haproxyData["idletimeout"] != haCfgSections["defaults"]["timeout server"][0].strip():
37+
print("defaults timeout client or timeout server mismatch occurred")
38+
return False
39+
40+
return True
3141

3242
def checkLoadBalance(haproxyData, haCfgSections):
3343
correct = True
@@ -120,9 +130,10 @@ def main():
120130
currSectionDict[lineSec[0]].append(lineSec[1] if len(lineSec) > 1 else '')
121131

122132
checkMaxConn = checkMaxconn(haproxyData[0], haCfgSections)
133+
checkIdleTimeout = checkIdletimeout(haproxyData[0], haCfgSections)
123134
checkLbRules = checkLoadBalance(haproxyData, haCfgSections)
124135

125-
if checkMaxConn and checkLbRules:
136+
if checkMaxConn and checkIdleTimeout and checkLbRules:
126137
print("All checks pass")
127138
exit(0)
128139
else:

0 commit comments

Comments
 (0)