From 7c64f5d31eb07f9be3b8a48a7889cf42c65491d4 Mon Sep 17 00:00:00 2001 From: Fernandez Ludovic Date: Sat, 16 Dec 2017 19:57:40 +0100 Subject: [PATCH] feat(ecs): add MaxConn label. --- provider/ecs/config.go | 32 ++++++++++++++++++++++++++++++++ templates/ecs.tmpl | 6 ++++++ 2 files changed, 38 insertions(+) diff --git a/provider/ecs/config.go b/provider/ecs/config.go index 272c53970..c5447847d 100644 --- a/provider/ecs/config.go +++ b/provider/ecs/config.go @@ -1,6 +1,7 @@ package ecs import ( + "math" "strconv" "strings" "text/template" @@ -35,6 +36,9 @@ func (p *Provider) buildConfiguration(services map[string][]ecsInstance) (*types "getHealthCheckInterval": getFuncFirstStringValue(label.TraefikBackendHealthCheckInterval, ""), "hasCircuitBreakerLabel": hasFuncFirst(label.TraefikBackendCircuitBreakerExpression), "getCircuitBreakerExpression": getFuncFirstStringValue(label.TraefikBackendCircuitBreakerExpression, label.DefaultCircuitBreakerExpression), + "hasMaxConnLabels": hasMaxConnLabels, + "getMaxConnAmount": getFuncFirstInt64Value(label.TraefikBackendMaxConnAmount, math.MaxInt64), + "getMaxConnExtractorFunc": getFuncFirstStringValue(label.TraefikBackendMaxConnExtractorFunc, label.DefaultBackendMaxconnExtractorFunc), } return p.GetConfiguration("templates/ecs.tmpl", ecsFuncMap, struct { Services map[string][]ecsInstance @@ -89,6 +93,12 @@ func hasLoadBalancerLabel(instances []ecsInstance) bool { return method || sticky || stickiness || cookieName } +func hasMaxConnLabels(instances []ecsInstance) bool { + mca := hasFirst(instances, label.TraefikBackendMaxConnAmount) + mcef := hasFirst(instances, label.TraefikBackendMaxConnExtractorFunc) + return mca && mcef +} + // Label functions func getFuncStringValue(labelName string, defaultValue string) func(i ecsInstance) string { @@ -124,6 +134,15 @@ func getFuncFirstIntValue(labelName string, defaultValue int) func(instances []e } } +func getFuncFirstInt64Value(labelName string, defaultValue int64) func(instances []ecsInstance) int64 { + return func(instances []ecsInstance) int64 { + if len(instances) < 0 { + return defaultValue + } + return getInt64Value(instances[0], labelName, defaultValue) + } +} + func getFuncFirstBoolValue(labelName string, defaultValue bool) func(instances []ecsInstance) bool { return func(instances []ecsInstance) bool { if len(instances) < 0 { @@ -172,6 +191,19 @@ func getIntValue(i ecsInstance, labelName string, defaultValue int) int { return defaultValue } +func getInt64Value(i ecsInstance, labelName string, defaultValue int64) int64 { + rawValue, ok := i.containerDefinition.DockerLabels[labelName] + if ok { + if rawValue != nil { + v, err := strconv.ParseInt(*rawValue, 10, 64) + if err == nil { + return v + } + } + } + return defaultValue +} + func getSliceString(i ecsInstance, labelName string) []string { if value, ok := i.containerDefinition.DockerLabels[labelName]; ok { if value == nil { diff --git a/templates/ecs.tmpl b/templates/ecs.tmpl index d5c842700..25571dca5 100644 --- a/templates/ecs.tmpl +++ b/templates/ecs.tmpl @@ -16,6 +16,12 @@ {{end}} {{end}} + {{if hasMaxConnLabels $instances}} + [backends.backend-{{ $serviceName }}.maxConn] + amount = {{getMaxConnAmount $instances}} + extractorFunc = "{{getMaxConnExtractorFunc $instances}}" + {{end}} + {{ if hasHealthCheckLabels $instances }} [backends.backend-{{ $serviceName }}.healthCheck] path = "{{getHealthCheckPath $instances }}"