Skip to content

Commit

Permalink
Merge pull request #645 from jangie/add-backend-features-to-consul-ca…
Browse files Browse the repository at this point in the history
…talog

enable consul catalog to use maxconn
  • Loading branch information
emilevauge committed Sep 15, 2016
2 parents d06b9c2 + f7f17f0 commit b376da1
Show file tree
Hide file tree
Showing 4 changed files with 31 additions and 6 deletions.
2 changes: 2 additions & 0 deletions docs/toml.md
Expand Up @@ -861,6 +861,8 @@ Additional settings can be defined using Consul Catalog tags:
- `traefik.backend.weight=10`: assign this weight to the container
- `traefik.backend.circuitbreaker=NetworkErrorRatio() > 0.5`
- `traefik.backend.loadbalancer=drr`: override the default load balancing mode
- `traefik.backend.maxconn.amount=10`: set a maximum number of connections to the backend. Must be used in conjunction with the below label to take effect.
- `traefik.backend.maxconn.extractorfunc=client.ip`: set the function to be used against the request to determine what to limit maximum connections to the backend by. Must be used in conjunction with the above label to take effect.
- `traefik.frontend.rule=Host:test.traefik.io`: override the default frontend rule (Default: `Host:{containerName}.{domain}`).
- `traefik.frontend.passHostHeader=true`: forward client `Host` header to the backend.
- `traefik.frontend.priority=10`: override default frontend priority
Expand Down
22 changes: 16 additions & 6 deletions provider/consul_catalog.go
Expand Up @@ -209,12 +209,13 @@ func (provider *ConsulCatalog) getContraintTags(tags []string) []string {

func (provider *ConsulCatalog) buildConfig(catalog []catalogUpdate) *types.Configuration {
var FuncMap = template.FuncMap{
"getBackend": provider.getBackend,
"getFrontendRule": provider.getFrontendRule,
"getBackendName": provider.getBackendName,
"getBackendAddress": provider.getBackendAddress,
"getAttribute": provider.getAttribute,
"getEntryPoints": provider.getEntryPoints,
"getBackend": provider.getBackend,
"getFrontendRule": provider.getFrontendRule,
"getBackendName": provider.getBackendName,
"getBackendAddress": provider.getBackendAddress,
"getAttribute": provider.getAttribute,
"getEntryPoints": provider.getEntryPoints,
"hasMaxconnAttributes": provider.hasMaxconnAttributes,
}

allNodes := []*api.ServiceEntry{}
Expand Down Expand Up @@ -249,6 +250,15 @@ func (provider *ConsulCatalog) buildConfig(catalog []catalogUpdate) *types.Confi
return configuration
}

func (provider *ConsulCatalog) hasMaxconnAttributes(attributes []string) bool {
amount := provider.getAttribute("backend.maxconn.amount", attributes, "")
extractorfunc := provider.getAttribute("backend.maxconn.extractorfunc", attributes, "")
if amount != "" && extractorfunc != "" {
return true
}
return false
}

func (provider *ConsulCatalog) getNodes(index map[string][]string) ([]catalogUpdate, error) {
visited := make(map[string]bool)

Expand Down
6 changes: 6 additions & 0 deletions provider/consul_catalog_test.go
Expand Up @@ -212,6 +212,8 @@ func TestConsulCatalogBuildConfig(t *testing.T) {
"traefik.backend.loadbalancer=drr",
"traefik.backend.circuitbreaker=NetworkErrorRatio() > 0.5",
"random.foo=bar",
"traefik.backend.maxconn.amount=1000",
"traefik.backend.maxconn.extractorfunc=client.ip",
},
},
Nodes: []*api.ServiceEntry{
Expand Down Expand Up @@ -260,6 +262,10 @@ func TestConsulCatalogBuildConfig(t *testing.T) {
LoadBalancer: &types.LoadBalancer{
Method: "drr",
},
MaxConn: &types.MaxConn{
Amount: 1000,
ExtractorFunc: "client.ip",
},
},
},
},
Expand Down
7 changes: 7 additions & 0 deletions templates/consul_catalog.tmpl
Expand Up @@ -23,6 +23,13 @@
[backends."backend-{{$service}}".loadbalancer]
method = "{{$loadBalancer}}"
{{end}}

{{if hasMaxconnAttributes .Attributes}}
[backends."backend-{{$service}}".maxconn]
amount = {{getAttribute "backend.maxconn.amount" .Attributes "" }}
extractorfunc = "{{getAttribute "backend.maxconn.extractorfunc" .Attributes "" }}"
{{end}}

{{end}}

[frontends]
Expand Down

0 comments on commit b376da1

Please sign in to comment.