Factorize labels
* refactor(accesslog): factorize file name. * traefik.frontend.rule * traefik.frontend.value * traefik.backend.circuitbreaker.expression * traefik.enable * traefik.backend.loadbalancer.method * traefik.backend.loadbalancer.sticky * traefik.backend.maxconn.amount * traefik.backend.maxconn.extractorfunc * traefik.port * traefik.tags * traefik.backend * traefik.weight * traefik.domain * traefik.protocol * traefik.frontend.passHostHeader * traefik.frontend.whitelistSourceRange * traefik.frontend.priority * traefik.frontend.entryPoints * traefik.frontend.auth.basic * traefik.backend.id * traefik.backend.circuitbreaker * traefik.frontend.rule.type * traefik.portIndex * refactor(docker): specific labels * refactor(rancher): specific labels * traefik.backend.healthcheck.* * refactor(providers): factorize labels.
This commit is contained in:
parent
2e84b1e556
commit
d653a348b1
20 changed files with 390 additions and 330 deletions
|
@ -10,13 +10,12 @@ import (
|
|||
"github.com/containous/traefik/log"
|
||||
"github.com/containous/traefik/safe"
|
||||
"github.com/containous/traefik/types"
|
||||
|
||||
rancher "github.com/rancher/go-rancher/client"
|
||||
)
|
||||
|
||||
var (
|
||||
withoutPagination *rancher.ListOpts
|
||||
)
|
||||
const labelRancheStackServiceName = "io.rancher.stack_service.name"
|
||||
|
||||
var withoutPagination *rancher.ListOpts
|
||||
|
||||
// APIConfiguration contains configuration properties specific to the Rancher
|
||||
// API provider.
|
||||
|
@ -221,7 +220,7 @@ func parseAPISourcedRancherData(environments []*rancher.Project, services []*ran
|
|||
}
|
||||
|
||||
for _, container := range containers {
|
||||
if container.Labels["io.rancher.stack_service.name"] == rancherData.Name &&
|
||||
if container.Labels[labelRancheStackServiceName] == rancherData.Name &&
|
||||
containerFilter(container.Name, container.HealthState, container.State) {
|
||||
rancherData.Containers = append(rancherData.Containers, container.PrimaryIpAddress)
|
||||
}
|
||||
|
|
|
@ -42,35 +42,35 @@ func (r rancherData) String() string {
|
|||
|
||||
// Frontend Labels
|
||||
func (p *Provider) getPassHostHeader(service rancherData) string {
|
||||
if passHostHeader, err := getServiceLabel(service, "traefik.frontend.passHostHeader"); err == nil {
|
||||
if passHostHeader, err := getServiceLabel(service, types.LabelFrontendPassHostHeader); err == nil {
|
||||
return passHostHeader
|
||||
}
|
||||
return "true"
|
||||
}
|
||||
|
||||
func (p *Provider) getPriority(service rancherData) string {
|
||||
if priority, err := getServiceLabel(service, "traefik.frontend.priority"); err == nil {
|
||||
if priority, err := getServiceLabel(service, types.LabelFrontendPriority); err == nil {
|
||||
return priority
|
||||
}
|
||||
return "0"
|
||||
}
|
||||
|
||||
func (p *Provider) getEntryPoints(service rancherData) []string {
|
||||
if entryPoints, err := getServiceLabel(service, "traefik.frontend.entryPoints"); err == nil {
|
||||
if entryPoints, err := getServiceLabel(service, types.LabelFrontendEntryPoints); err == nil {
|
||||
return strings.Split(entryPoints, ",")
|
||||
}
|
||||
return []string{}
|
||||
}
|
||||
|
||||
func (p *Provider) getFrontendRule(service rancherData) string {
|
||||
if label, err := getServiceLabel(service, "traefik.frontend.rule"); err == nil {
|
||||
if label, err := getServiceLabel(service, types.LabelFrontendRule); err == nil {
|
||||
return label
|
||||
}
|
||||
return "Host:" + strings.ToLower(strings.Replace(service.Name, "/", ".", -1)) + "." + p.Domain
|
||||
}
|
||||
|
||||
func (p *Provider) getBasicAuth(service rancherData) []string {
|
||||
if basicAuth, err := getServiceLabel(service, "traefik.frontend.auth.basic"); err == nil {
|
||||
if basicAuth, err := getServiceLabel(service, types.LabelFrontendAuthBasic); err == nil {
|
||||
return strings.Split(basicAuth, ",")
|
||||
}
|
||||
return []string{}
|
||||
|
@ -83,15 +83,15 @@ func (p *Provider) getFrontendName(service rancherData) string {
|
|||
|
||||
// Backend Labels
|
||||
func (p *Provider) getLoadBalancerMethod(service rancherData) string {
|
||||
if label, err := getServiceLabel(service, "traefik.backend.loadbalancer.method"); err == nil {
|
||||
if label, err := getServiceLabel(service, types.LabelBackendLoadbalancerMethod); err == nil {
|
||||
return label
|
||||
}
|
||||
return "wrr"
|
||||
}
|
||||
|
||||
func (p *Provider) hasLoadBalancerLabel(service rancherData) bool {
|
||||
_, errMethod := getServiceLabel(service, "traefik.backend.loadbalancer.method")
|
||||
_, errSticky := getServiceLabel(service, "traefik.backend.loadbalancer.sticky")
|
||||
_, errMethod := getServiceLabel(service, types.LabelBackendLoadbalancerMethod)
|
||||
_, errSticky := getServiceLabel(service, types.LabelBackendLoadbalancerSticky)
|
||||
if errMethod != nil && errSticky != nil {
|
||||
return false
|
||||
}
|
||||
|
@ -99,28 +99,28 @@ func (p *Provider) hasLoadBalancerLabel(service rancherData) bool {
|
|||
}
|
||||
|
||||
func (p *Provider) hasCircuitBreakerLabel(service rancherData) bool {
|
||||
if _, err := getServiceLabel(service, "traefik.backend.circuitbreaker.expression"); err != nil {
|
||||
if _, err := getServiceLabel(service, types.LabelBackendCircuitbreakerExpression); err != nil {
|
||||
return false
|
||||
}
|
||||
return true
|
||||
}
|
||||
|
||||
func (p *Provider) getCircuitBreakerExpression(service rancherData) string {
|
||||
if label, err := getServiceLabel(service, "traefik.backend.circuitbreaker.expression"); err == nil {
|
||||
if label, err := getServiceLabel(service, types.LabelBackendCircuitbreakerExpression); err == nil {
|
||||
return label
|
||||
}
|
||||
return "NetworkErrorRatio() > 1"
|
||||
}
|
||||
|
||||
func (p *Provider) getSticky(service rancherData) string {
|
||||
if _, err := getServiceLabel(service, "traefik.backend.loadbalancer.sticky"); err == nil {
|
||||
if _, err := getServiceLabel(service, types.LabelBackendLoadbalancerSticky); err == nil {
|
||||
return "true"
|
||||
}
|
||||
return "false"
|
||||
}
|
||||
|
||||
func (p *Provider) getBackend(service rancherData) string {
|
||||
if label, err := getServiceLabel(service, "traefik.backend"); err == nil {
|
||||
if label, err := getServiceLabel(service, types.LabelBackend); err == nil {
|
||||
return provider.Normalize(label)
|
||||
}
|
||||
return provider.Normalize(service.Name)
|
||||
|
@ -128,48 +128,48 @@ func (p *Provider) getBackend(service rancherData) string {
|
|||
|
||||
// General Application Stuff
|
||||
func (p *Provider) getPort(service rancherData) string {
|
||||
if label, err := getServiceLabel(service, "traefik.port"); err == nil {
|
||||
if label, err := getServiceLabel(service, types.LabelPort); err == nil {
|
||||
return label
|
||||
}
|
||||
return ""
|
||||
}
|
||||
|
||||
func (p *Provider) getProtocol(service rancherData) string {
|
||||
if label, err := getServiceLabel(service, "traefik.protocol"); err == nil {
|
||||
if label, err := getServiceLabel(service, types.LabelProtocol); err == nil {
|
||||
return label
|
||||
}
|
||||
return "http"
|
||||
}
|
||||
|
||||
func (p *Provider) getWeight(service rancherData) string {
|
||||
if label, err := getServiceLabel(service, "traefik.weight"); err == nil {
|
||||
if label, err := getServiceLabel(service, types.LabelWeight); err == nil {
|
||||
return label
|
||||
}
|
||||
return "0"
|
||||
}
|
||||
|
||||
func (p *Provider) getDomain(service rancherData) string {
|
||||
if label, err := getServiceLabel(service, "traefik.domain"); err == nil {
|
||||
if label, err := getServiceLabel(service, types.LabelDomain); err == nil {
|
||||
return label
|
||||
}
|
||||
return p.Domain
|
||||
}
|
||||
|
||||
func (p *Provider) hasMaxConnLabels(service rancherData) bool {
|
||||
if _, err := getServiceLabel(service, "traefik.backend.maxconn.amount"); err != nil {
|
||||
if _, err := getServiceLabel(service, types.LabelBackendMaxconnAmount); err != nil {
|
||||
return false
|
||||
}
|
||||
if _, err := getServiceLabel(service, "traefik.backend.maxconn.extractorfunc"); err != nil {
|
||||
if _, err := getServiceLabel(service, types.LabelBackendMaxconnExtractorfunc); err != nil {
|
||||
return false
|
||||
}
|
||||
return true
|
||||
}
|
||||
|
||||
func (p *Provider) getMaxConnAmount(service rancherData) int64 {
|
||||
if label, err := getServiceLabel(service, "traefik.backend.maxconn.amount"); err == nil {
|
||||
if label, err := getServiceLabel(service, types.LabelBackendMaxconnAmount); err == nil {
|
||||
i, errConv := strconv.ParseInt(label, 10, 64)
|
||||
if errConv != nil {
|
||||
log.Errorf("Unable to parse traefik.backend.maxconn.amount %s", label)
|
||||
log.Errorf("Unable to parse %s %s", types.LabelBackendMaxconnAmount, label)
|
||||
return math.MaxInt64
|
||||
}
|
||||
return i
|
||||
|
@ -178,7 +178,7 @@ func (p *Provider) getMaxConnAmount(service rancherData) int64 {
|
|||
}
|
||||
|
||||
func (p *Provider) getMaxConnExtractorFunc(service rancherData) string {
|
||||
if label, err := getServiceLabel(service, "traefik.backend.maxconn.extractorfunc"); err == nil {
|
||||
if label, err := getServiceLabel(service, types.LabelBackendMaxconnExtractorfunc); err == nil {
|
||||
return label
|
||||
}
|
||||
return "request.host"
|
||||
|
@ -274,7 +274,7 @@ func containerFilter(name, healthState, state string) bool {
|
|||
|
||||
func (p *Provider) serviceFilter(service rancherData) bool {
|
||||
|
||||
if service.Labels["traefik.port"] == "" {
|
||||
if service.Labels[types.LabelPort] == "" {
|
||||
log.Debugf("Filtering service %s without traefik.port label", service.Name)
|
||||
return false
|
||||
}
|
||||
|
@ -284,7 +284,7 @@ func (p *Provider) serviceFilter(service rancherData) bool {
|
|||
return false
|
||||
}
|
||||
|
||||
constraintTags := strings.Split(service.Labels["traefik.tags"], ",")
|
||||
constraintTags := strings.Split(service.Labels[types.LabelTags], ",")
|
||||
if ok, failingConstraint := p.MatchConstraints(constraintTags); !ok {
|
||||
if failingConstraint != nil {
|
||||
log.Debugf("Filtering service %s with constraint %s", service.Name, failingConstraint.String())
|
||||
|
@ -311,8 +311,8 @@ func (p *Provider) serviceFilter(service rancherData) bool {
|
|||
|
||||
func isServiceEnabled(service rancherData, exposedByDefault bool) bool {
|
||||
|
||||
if service.Labels["traefik.enable"] != "" {
|
||||
var v = service.Labels["traefik.enable"]
|
||||
if service.Labels[types.LabelEnable] != "" {
|
||||
var v = service.Labels[types.LabelEnable]
|
||||
return exposedByDefault && v != "false" || v == "true"
|
||||
}
|
||||
return exposedByDefault
|
||||
|
|
|
@ -24,7 +24,7 @@ func TestRancherServiceFilter(t *testing.T) {
|
|||
{
|
||||
service: rancherData{
|
||||
Labels: map[string]string{
|
||||
"traefik.enable": "true",
|
||||
types.LabelEnable: "true",
|
||||
},
|
||||
Health: "healthy",
|
||||
State: "active",
|
||||
|
@ -34,8 +34,8 @@ func TestRancherServiceFilter(t *testing.T) {
|
|||
{
|
||||
service: rancherData{
|
||||
Labels: map[string]string{
|
||||
"traefik.port": "80",
|
||||
"traefik.enable": "false",
|
||||
types.LabelPort: "80",
|
||||
types.LabelEnable: "false",
|
||||
},
|
||||
Health: "healthy",
|
||||
State: "active",
|
||||
|
@ -45,8 +45,8 @@ func TestRancherServiceFilter(t *testing.T) {
|
|||
{
|
||||
service: rancherData{
|
||||
Labels: map[string]string{
|
||||
"traefik.port": "80",
|
||||
"traefik.enable": "true",
|
||||
types.LabelPort: "80",
|
||||
types.LabelEnable: "true",
|
||||
},
|
||||
Health: "unhealthy",
|
||||
State: "active",
|
||||
|
@ -56,9 +56,9 @@ func TestRancherServiceFilter(t *testing.T) {
|
|||
{
|
||||
service: rancherData{
|
||||
Labels: map[string]string{
|
||||
"traefik.tags": "not-cheesy",
|
||||
"traefik.port": "80",
|
||||
"traefik.enable": "true",
|
||||
types.LabelTags: "not-cheesy",
|
||||
types.LabelPort: "80",
|
||||
types.LabelEnable: "true",
|
||||
},
|
||||
Health: "healthy",
|
||||
State: "inactive",
|
||||
|
@ -68,9 +68,9 @@ func TestRancherServiceFilter(t *testing.T) {
|
|||
{
|
||||
service: rancherData{
|
||||
Labels: map[string]string{
|
||||
"traefik.tags": "cheese",
|
||||
"traefik.port": "80",
|
||||
"traefik.enable": "true",
|
||||
types.LabelTags: "cheese",
|
||||
types.LabelPort: "80",
|
||||
types.LabelEnable: "true",
|
||||
},
|
||||
Health: "healthy",
|
||||
State: "active",
|
||||
|
@ -80,9 +80,9 @@ func TestRancherServiceFilter(t *testing.T) {
|
|||
{
|
||||
service: rancherData{
|
||||
Labels: map[string]string{
|
||||
"traefik.tags": "cheeeeese",
|
||||
"traefik.port": "80",
|
||||
"traefik.enable": "true",
|
||||
types.LabelTags: "cheeeeese",
|
||||
types.LabelPort: "80",
|
||||
types.LabelEnable: "true",
|
||||
},
|
||||
Health: "healthy",
|
||||
State: "upgraded",
|
||||
|
@ -92,9 +92,9 @@ func TestRancherServiceFilter(t *testing.T) {
|
|||
{
|
||||
service: rancherData{
|
||||
Labels: map[string]string{
|
||||
"traefik.tags": "chose",
|
||||
"traefik.port": "80",
|
||||
"traefik.enable": "true",
|
||||
types.LabelTags: "chose",
|
||||
types.LabelPort: "80",
|
||||
types.LabelEnable: "true",
|
||||
},
|
||||
Health: "healthy",
|
||||
State: "active",
|
||||
|
@ -171,7 +171,7 @@ func TestRancherGetFrontendName(t *testing.T) {
|
|||
service: rancherData{
|
||||
Name: "test-service",
|
||||
Labels: map[string]string{
|
||||
"traefik.frontend.rule": "Headers:User-Agent,bat/0.1.0",
|
||||
types.LabelFrontendRule: "Headers:User-Agent,bat/0.1.0",
|
||||
},
|
||||
},
|
||||
|
||||
|
@ -181,7 +181,7 @@ func TestRancherGetFrontendName(t *testing.T) {
|
|||
service: rancherData{
|
||||
Name: "test-service",
|
||||
Labels: map[string]string{
|
||||
"traefik.frontend.rule": "Host:foo.bar",
|
||||
types.LabelFrontendRule: "Host:foo.bar",
|
||||
},
|
||||
},
|
||||
|
||||
|
@ -191,7 +191,7 @@ func TestRancherGetFrontendName(t *testing.T) {
|
|||
service: rancherData{
|
||||
Name: "test-service",
|
||||
Labels: map[string]string{
|
||||
"traefik.frontend.rule": "Path:/test",
|
||||
types.LabelFrontendRule: "Path:/test",
|
||||
},
|
||||
},
|
||||
|
||||
|
@ -201,7 +201,7 @@ func TestRancherGetFrontendName(t *testing.T) {
|
|||
service: rancherData{
|
||||
Name: "test-service",
|
||||
Labels: map[string]string{
|
||||
"traefik.frontend.rule": "PathPrefix:/test2",
|
||||
types.LabelFrontendRule: "PathPrefix:/test2",
|
||||
},
|
||||
},
|
||||
|
||||
|
@ -242,7 +242,7 @@ func TestRancherGetFrontendRule(t *testing.T) {
|
|||
service: rancherData{
|
||||
Name: "test-service",
|
||||
Labels: map[string]string{
|
||||
"traefik.frontend.rule": "Host:foo.bar.com",
|
||||
types.LabelFrontendRule: "Host:foo.bar.com",
|
||||
},
|
||||
},
|
||||
|
||||
|
@ -252,7 +252,7 @@ func TestRancherGetFrontendRule(t *testing.T) {
|
|||
service: rancherData{
|
||||
Name: "test-service",
|
||||
Labels: map[string]string{
|
||||
"traefik.frontend.rule": "Path:/test",
|
||||
types.LabelFrontendRule: "Path:/test",
|
||||
},
|
||||
},
|
||||
|
||||
|
@ -262,7 +262,7 @@ func TestRancherGetFrontendRule(t *testing.T) {
|
|||
service: rancherData{
|
||||
Name: "test-service",
|
||||
Labels: map[string]string{
|
||||
"traefik.frontend.rule": "PathPrefix:/test2",
|
||||
types.LabelFrontendRule: "PathPrefix:/test2",
|
||||
},
|
||||
},
|
||||
|
||||
|
@ -297,7 +297,7 @@ func TestRancherGetBackend(t *testing.T) {
|
|||
service: rancherData{
|
||||
Name: "test-service",
|
||||
Labels: map[string]string{
|
||||
"traefik.backend": "foobar",
|
||||
types.LabelBackend: "foobar",
|
||||
},
|
||||
},
|
||||
|
||||
|
@ -332,7 +332,7 @@ func TestRancherGetWeight(t *testing.T) {
|
|||
service: rancherData{
|
||||
Name: "test-service",
|
||||
Labels: map[string]string{
|
||||
"traefik.weight": "5",
|
||||
types.LabelWeight: "5",
|
||||
},
|
||||
},
|
||||
|
||||
|
@ -367,7 +367,7 @@ func TestRancherGetPort(t *testing.T) {
|
|||
service: rancherData{
|
||||
Name: "test-service",
|
||||
Labels: map[string]string{
|
||||
"traefik.port": "1337",
|
||||
types.LabelPort: "1337",
|
||||
},
|
||||
},
|
||||
|
||||
|
@ -402,7 +402,7 @@ func TestRancherGetDomain(t *testing.T) {
|
|||
service: rancherData{
|
||||
Name: "test-service",
|
||||
Labels: map[string]string{
|
||||
"traefik.domain": "foo.bar",
|
||||
types.LabelDomain: "foo.bar",
|
||||
},
|
||||
},
|
||||
|
||||
|
@ -437,7 +437,7 @@ func TestRancherGetProtocol(t *testing.T) {
|
|||
service: rancherData{
|
||||
Name: "test-service",
|
||||
Labels: map[string]string{
|
||||
"traefik.protocol": "https",
|
||||
types.LabelProtocol: "https",
|
||||
},
|
||||
},
|
||||
|
||||
|
@ -472,7 +472,7 @@ func TestRancherGetPassHostHeader(t *testing.T) {
|
|||
service: rancherData{
|
||||
Name: "test-service",
|
||||
Labels: map[string]string{
|
||||
"traefik.frontend.passHostHeader": "false",
|
||||
types.LabelFrontendPassHostHeader: "false",
|
||||
},
|
||||
},
|
||||
|
||||
|
@ -541,8 +541,8 @@ func TestRancherLoadRancherConfig(t *testing.T) {
|
|||
{
|
||||
Name: "test/service",
|
||||
Labels: map[string]string{
|
||||
"traefik.port": "80",
|
||||
"traefik.frontend.auth.basic": "test:$apr1$H6uskkkW$IgXLP6ewTrSuBkTrqE8wj/,test2:$apr1$d9hr9HBB$4HxwgUir3HP4EsggP/QNo0",
|
||||
types.LabelPort: "80",
|
||||
types.LabelFrontendAuthBasic: "test:$apr1$H6uskkkW$IgXLP6ewTrSuBkTrqE8wj/,test2:$apr1$d9hr9HBB$4HxwgUir3HP4EsggP/QNo0",
|
||||
},
|
||||
Health: "healthy",
|
||||
Containers: []string{"127.0.0.1"},
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue