From c26b9b1a5df6a31a62e43a2fe9e92e97258a8d60 Mon Sep 17 00:00:00 2001 From: Fernandez Ludovic Date: Sat, 16 Dec 2017 13:24:07 +0100 Subject: [PATCH] feat(docker): add HealthCheck labels. --- provider/docker/config.go | 37 ++++++++++++++++------------- provider/docker/config_container.go | 6 +++++ provider/docker/config_service.go | 16 +++++++++++++ provider/label/label.go | 1 + provider/label/names.go | 2 ++ templates/docker.tmpl | 7 ++++++ 6 files changed, 52 insertions(+), 17 deletions(-) diff --git a/provider/docker/config.go b/provider/docker/config.go index ef3ad3741..780d66bbf 100644 --- a/provider/docker/config.go +++ b/provider/docker/config.go @@ -13,23 +13,26 @@ import ( func (p *Provider) buildConfiguration(containersInspected []dockerData) *types.Configuration { var DockerFuncMap = template.FuncMap{ - "getBackend": getBackend, - "getIPAddress": p.getIPAddress, - "getPort": getPort, - "getWeight": getFuncStringLabel(label.TraefikWeight, label.DefaultWeight), - "getDomain": getFuncStringLabel(label.TraefikDomain, p.Domain), - "getProtocol": getFuncStringLabel(label.TraefikProtocol, label.DefaultProtocol), - "getPassHostHeader": getFuncStringLabel(label.TraefikFrontendPassHostHeader, label.DefaultPassHostHeader), - "getPassTLSCert": getFuncBoolLabel(label.TraefikFrontendPassTLSCert, label.DefaultPassTLSCert), - "getPriority": getFuncStringLabel(label.TraefikFrontendPriority, label.DefaultFrontendPriority), - "getEntryPoints": getFuncSliceStringLabel(label.TraefikFrontendEntryPoints), - "getBasicAuth": getFuncSliceStringLabel(label.TraefikFrontendAuthBasic), - "getFrontendRule": p.getFrontendRule, - "hasRedirect": hasRedirect, - "getRedirectEntryPoint": getFuncStringLabel(label.TraefikFrontendRedirectEntryPoint, label.DefaultFrontendRedirectEntryPoint), - "getRedirectRegex": getFuncStringLabel(label.TraefikFrontendRedirectRegex, ""), - "getRedirectReplacement": getFuncStringLabel(label.TraefikFrontendRedirectReplacement, ""), - + "getBackend": getBackend, + "getIPAddress": p.getIPAddress, + "getPort": getPort, + "getWeight": getFuncStringLabel(label.TraefikWeight, label.DefaultWeight), + "getDomain": getFuncStringLabel(label.TraefikDomain, p.Domain), + "getProtocol": getFuncStringLabel(label.TraefikProtocol, label.DefaultProtocol), + "getPassHostHeader": getFuncStringLabel(label.TraefikFrontendPassHostHeader, label.DefaultPassHostHeader), + "getPassTLSCert": getFuncBoolLabel(label.TraefikFrontendPassTLSCert, label.DefaultPassTLSCert), + "getPriority": getFuncStringLabel(label.TraefikFrontendPriority, label.DefaultFrontendPriority), + "getEntryPoints": getFuncSliceStringLabel(label.TraefikFrontendEntryPoints), + "getBasicAuth": getFuncSliceStringLabel(label.TraefikFrontendAuthBasic), + "getFrontendRule": p.getFrontendRule, + "hasRedirect": hasRedirect, + "getRedirectEntryPoint": getFuncStringLabel(label.TraefikFrontendRedirectEntryPoint, label.DefaultFrontendRedirectEntryPoint), + "getRedirectRegex": getFuncStringLabel(label.TraefikFrontendRedirectRegex, ""), + "getRedirectReplacement": getFuncStringLabel(label.TraefikFrontendRedirectReplacement, ""), + "hasHealthCheckLabels": hasFunc(label.TraefikBackendHealthCheckPath), + "getHealthCheckPath": getFuncStringLabel(label.TraefikBackendHealthCheckPath, ""), + "getHealthCheckPort": getFuncIntLabel(label.TraefikBackendHealthCheckPort, label.DefaultBackendHealthCheckPort), + "getHealthCheckInterval": getFuncStringLabel(label.TraefikBackendHealthCheckInterval, ""), "hasCircuitBreakerLabel": hasFunc(label.TraefikBackendCircuitBreakerExpression), "getCircuitBreakerExpression": getFuncStringLabel(label.TraefikBackendCircuitBreakerExpression, label.DefaultCircuitBreakerExpression), "hasLoadBalancerLabel": hasLoadBalancerLabel, diff --git a/provider/docker/config_container.go b/provider/docker/config_container.go index 896eb2924..b6511ff4d 100644 --- a/provider/docker/config_container.go +++ b/provider/docker/config_container.go @@ -192,6 +192,12 @@ func getFuncStringLabel(labelName string, defaultValue string) func(container do } } +func getFuncIntLabel(labelName string, defaultValue int) func(container dockerData) int { + return func(container dockerData) int { + return label.GetIntValue(container.Labels, labelName, defaultValue) + } +} + func getFuncBoolLabel(labelName string, defaultValue bool) func(container dockerData) bool { return func(container dockerData) bool { return label.GetBoolValue(container.Labels, labelName, defaultValue) diff --git a/provider/docker/config_service.go b/provider/docker/config_service.go index 6f67d166e..a173494d9 100644 --- a/provider/docker/config_service.go +++ b/provider/docker/config_service.go @@ -122,6 +122,12 @@ func getFuncServiceBoolLabel(labelSuffix string, defaultValue bool) func(contain } } +func getFuncServiceIntLabel(labelSuffix string, defaultValue int) func(container dockerData, serviceName string) int { + return func(container dockerData, serviceName string) int { + return getServiceIntLabel(container, serviceName, labelSuffix, defaultValue) + } +} + func hasFuncServiceLabel(labelSuffix string) func(container dockerData, serviceName string) bool { return func(container dockerData, serviceName string) bool { return hasServiceLabel(container, serviceName, labelSuffix) @@ -168,6 +174,16 @@ func getServiceBoolLabel(container dockerData, serviceName string, labelSuffix s return label.GetBoolValue(container.Labels, label.Prefix+labelSuffix, defaultValue) } +func getServiceIntLabel(container dockerData, serviceName string, labelSuffix string, defaultValue int) int { + if rawValue, ok := getServiceLabels(container, serviceName)[labelSuffix]; ok { + value, err := strconv.Atoi(rawValue) + if err == nil { + return value + } + } + return label.GetIntValue(container.Labels, label.Prefix+labelSuffix, defaultValue) +} + func getServiceLabels(container dockerData, serviceName string) label.ServicePropertyValues { return label.ExtractServiceProperties(container.Labels)[serviceName] } diff --git a/provider/label/label.go b/provider/label/label.go index bb608c1ec..94755d839 100644 --- a/provider/label/label.go +++ b/provider/label/label.go @@ -27,6 +27,7 @@ const ( DefaultBackendLoadBalancerMethod = "wrr" DefaultBackendMaxconnExtractorFunc = "request.host" DefaultBackendLoadbalancerStickinessCookieName = "" + DefaultBackendHealthCheckPort = 0 ) // ServicesPropertiesRegexp used to extract the name of the service and the name of the property for this service diff --git a/provider/label/names.go b/provider/label/names.go index c622e16c4..9bacf67be 100644 --- a/provider/label/names.go +++ b/provider/label/names.go @@ -15,6 +15,7 @@ const ( SuffixBackendCircuitBreaker = "backend.circuitbreaker" SuffixBackendCircuitBreakerExpression = "backend.circuitbreaker.expression" SuffixBackendHealthCheckPath = "backend.healthcheck.path" + SuffixBackendHealthCheckPort = "backend.healthcheck.port" SuffixBackendHealthCheckInterval = "backend.healthcheck.interval" SuffixBackendLoadBalancerMethod = "backend.loadbalancer.method" SuffixBackendLoadBalancerSticky = "backend.loadbalancer.sticky" @@ -67,6 +68,7 @@ const ( TraefikBackendCircuitBreaker = Prefix + SuffixBackendCircuitBreaker TraefikBackendCircuitBreakerExpression = Prefix + SuffixBackendCircuitBreakerExpression TraefikBackendHealthCheckPath = Prefix + SuffixBackendHealthCheckPath + TraefikBackendHealthCheckPort = Prefix + SuffixBackendHealthCheckPort TraefikBackendHealthCheckInterval = Prefix + SuffixBackendHealthCheckInterval TraefikBackendLoadBalancerMethod = Prefix + SuffixBackendLoadBalancerMethod TraefikBackendLoadBalancerSticky = Prefix + SuffixBackendLoadBalancerSticky diff --git a/templates/docker.tmpl b/templates/docker.tmpl index cf465bc99..46d5af491 100644 --- a/templates/docker.tmpl +++ b/templates/docker.tmpl @@ -23,6 +23,13 @@ extractorFunc = "{{getMaxConnExtractorFunc $backend}}" {{end}} + {{if hasHealthCheckLabels $backend}} + [backends.backend-{{$backendName}}.healthCheck] + path = "{{getHealthCheckPath $backend}}" + port = {{getHealthCheckPort $backend}} + interval = "{{getHealthCheckInterval $backend}}" + {{end}} + {{$servers := index $backendServers $backendName}} {{range $serverName, $server := $servers}} {{if hasServices $server}}