Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Factorize labels #1843

Merged
merged 30 commits into from
Jul 10, 2017
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
30 commits
Select commit Hold shift + click to select a range
b5a9f03
refactor(providers): factorize labels.
ldez Jul 9, 2017
7ad85ee
refactor(accesslog): factorize file name.
ldez Jul 9, 2017
d5acbf1
traefik.frontend.rule
ldez Jul 9, 2017
a0fef6b
traefik.frontend.value
ldez Jul 9, 2017
b4c9cd8
traefik.backend.circuitbreaker.expression
ldez Jul 9, 2017
b8e2d5a
traefik.enable
ldez Jul 9, 2017
fd43d9b
traefik.backend.loadbalancer.method
ldez Jul 9, 2017
d07d484
traefik.backend.loadbalancer.sticky
ldez Jul 9, 2017
40d82bb
traefik.backend.maxconn.amount
ldez Jul 9, 2017
36bb5ae
traefik.backend.maxconn.extractorfunc
ldez Jul 9, 2017
41f726d
traefik.port
ldez Jul 9, 2017
cbe915d
traefik.tags
ldez Jul 9, 2017
2814cef
traefik.backend
ldez Jul 9, 2017
8565ccf
traefik.weight
ldez Jul 9, 2017
11f0a68
traefik.domain
ldez Jul 9, 2017
f1ad10f
traefik.protocol
ldez Jul 9, 2017
28db07c
traefik.frontend.passHostHeader
ldez Jul 9, 2017
7a834ab
traefik.frontend.whitelistSourceRange
ldez Jul 9, 2017
a28513c
traefik.frontend.priority
ldez Jul 9, 2017
131d886
traefik.frontend.entryPoints
ldez Jul 9, 2017
8a14604
traefik.frontend.auth.basic
ldez Jul 9, 2017
abee7b5
traefik.backend.id
ldez Jul 9, 2017
a615fa5
traefik.backend.circuitbreaker
ldez Jul 9, 2017
83d2bb2
traefik.frontend.rule.type
ldez Jul 9, 2017
ad8e5ea
traefik.portIndex
ldez Jul 9, 2017
dd77e4f
refactor(docker): specific labels
ldez Jul 9, 2017
4867290
refactor(rancher): specific labels
ldez Jul 9, 2017
6bfa0c4
refactor(k8s): format.
ldez Jul 9, 2017
d9c7e83
traefik.backend.healthcheck.*
ldez Jul 9, 2017
e7da1e9
refactor: go lint
ldez Jul 9, 2017
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
21 changes: 13 additions & 8 deletions integration/access_log_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,33 +16,38 @@ import (
checker "github.com/vdemeester/shakers"
)

const (
traefikTestLogFile = "traefik.log"
traefikTestAccessLogFile = "access.log"
)

// AccessLogSuite
type AccessLogSuite struct{ BaseSuite }

func (s *AccessLogSuite) TestAccessLog(c *check.C) {
// Ensure working directory is clean
os.Remove("access.log")
os.Remove("traefik.log")
os.Remove(traefikTestAccessLogFile)
os.Remove(traefikTestLogFile)

// Start Traefik
cmd, _ := s.cmdTraefik(withConfigFile("fixtures/access_log_config.toml"))
err := cmd.Start()
c.Assert(err, checker.IsNil)
defer cmd.Process.Kill()

defer os.Remove("access.log")
defer os.Remove("traefik.log")
defer os.Remove(traefikTestAccessLogFile)
defer os.Remove(traefikTestLogFile)

err = try.Do(1*time.Second, func() error {
if _, err := os.Stat("traefik.log"); err != nil {
if _, err := os.Stat(traefikTestLogFile); err != nil {
return fmt.Errorf("could not get stats for log file: %s", err)
}
return nil
})
c.Assert(err, checker.IsNil)

// Verify Traefik started OK
traefikLog, err := ioutil.ReadFile("traefik.log")
traefikLog, err := ioutil.ReadFile(traefikTestLogFile)
c.Assert(err, checker.IsNil)
if len(traefikLog) > 0 {
fmt.Printf("%s\n", string(traefikLog))
Expand All @@ -66,7 +71,7 @@ func (s *AccessLogSuite) TestAccessLog(c *check.C) {
c.Assert(err, checker.IsNil)

// Verify access.log output as expected
accessLog, err := ioutil.ReadFile("access.log")
accessLog, err := ioutil.ReadFile(traefikTestAccessLogFile)
c.Assert(err, checker.IsNil)
lines := strings.Split(string(accessLog), "\n")
count := 0
Expand All @@ -86,7 +91,7 @@ func (s *AccessLogSuite) TestAccessLog(c *check.C) {
c.Assert(count, checker.GreaterOrEqualThan, 3)

// Verify no other Traefik problems
traefikLog, err = ioutil.ReadFile("traefik.log")
traefikLog, err = ioutil.ReadFile(traefikTestLogFile)
c.Assert(err, checker.IsNil)
if len(traefikLog) > 0 {
fmt.Printf("%s\n", string(traefikLog))
Expand Down
6 changes: 3 additions & 3 deletions integration/docker_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,9 +10,9 @@ import (
"time"

"github.com/containous/traefik/integration/try"
"github.com/containous/traefik/types"
"github.com/docker/docker/pkg/namesgenerator"
"github.com/go-check/check"

d "github.com/libkermit/docker"
docker "github.com/libkermit/docker-check"
checker "github.com/vdemeester/shakers"
Expand Down Expand Up @@ -123,7 +123,7 @@ func (s *DockerSuite) TestDockerContainersWithLabels(c *check.C) {
defer os.Remove(file)
// Start a container with some labels
labels := map[string]string{
"traefik.frontend.rule": "Host:my.super.host",
types.LabelFrontendRule: "Host:my.super.host",
}
s.startContainerWithLabels(c, "swarm:1.0.0", labels, "manage", "token://blabla")

Expand Down Expand Up @@ -155,7 +155,7 @@ func (s *DockerSuite) TestDockerContainersWithOneMissingLabels(c *check.C) {
defer os.Remove(file)
// Start a container with some labels
labels := map[string]string{
"traefik.frontend.value": "my.super.host",
types.LabelTraefikFrontendValue: "my.super.host",
}
s.startContainerWithLabels(c, "swarm:1.0.0", labels, "manage", "token://blabla")

Expand Down
65 changes: 35 additions & 30 deletions provider/docker/docker.go
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,11 @@ const (
SwarmAPIVersion string = "1.24"
// SwarmDefaultWatchTime is the duration of the interval when polling docker
SwarmDefaultWatchTime = 15 * time.Second

labelDockerNetwork = "traefik.docker.network"
labelBackendLoadbalancerSwarm = "traefik.backend.loadbalancer.swarm"
labelDockerComposeProject = "com.docker.compose.project"
labelDockerComposeService = "com.docker.compose.service"
)

var _ provider.Provider = (*Provider)(nil)
Expand Down Expand Up @@ -319,7 +324,7 @@ func (p *Provider) loadDockerConfig(containersInspected []dockerData) *types.Con
}

func (p *Provider) hasCircuitBreakerLabel(container dockerData) bool {
if _, err := getLabel(container, "traefik.backend.circuitbreaker.expression"); err != nil {
if _, err := getLabel(container, types.LabelBackendCircuitbreakerExpression); err != nil {
return false
}
return true
Expand Down Expand Up @@ -455,40 +460,40 @@ func (p *Provider) getServiceProtocol(container dockerData, serviceName string)
}

func (p *Provider) hasLoadBalancerLabel(container dockerData) bool {
_, errMethod := getLabel(container, "traefik.backend.loadbalancer.method")
_, errSticky := getLabel(container, "traefik.backend.loadbalancer.sticky")
_, errMethod := getLabel(container, types.LabelBackendLoadbalancerMethod)
_, errSticky := getLabel(container, types.LabelBackendLoadbalancerSticky)
if errMethod != nil && errSticky != nil {
return false
}
return true
}

func (p *Provider) hasMaxConnLabels(container dockerData) bool {
if _, err := getLabel(container, "traefik.backend.maxconn.amount"); err != nil {
if _, err := getLabel(container, types.LabelBackendMaxconnAmount); err != nil {
return false
}
if _, err := getLabel(container, "traefik.backend.maxconn.extractorfunc"); err != nil {
if _, err := getLabel(container, types.LabelBackendMaxconnExtractorfunc); err != nil {
return false
}
return true
}

func (p *Provider) getCircuitBreakerExpression(container dockerData) string {
if label, err := getLabel(container, "traefik.backend.circuitbreaker.expression"); err == nil {
if label, err := getLabel(container, types.LabelBackendCircuitbreakerExpression); err == nil {
return label
}
return "NetworkErrorRatio() > 1"
}

func (p *Provider) getLoadBalancerMethod(container dockerData) string {
if label, err := getLabel(container, "traefik.backend.loadbalancer.method"); err == nil {
if label, err := getLabel(container, types.LabelBackendLoadbalancerMethod); err == nil {
return label
}
return "wrr"
}

func (p *Provider) getMaxConnAmount(container dockerData) int64 {
if label, err := getLabel(container, "traefik.backend.maxconn.amount"); err == nil {
if label, err := getLabel(container, 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)
Expand All @@ -500,14 +505,14 @@ func (p *Provider) getMaxConnAmount(container dockerData) int64 {
}

func (p *Provider) getMaxConnExtractorFunc(container dockerData) string {
if label, err := getLabel(container, "traefik.backend.maxconn.extractorfunc"); err == nil {
if label, err := getLabel(container, types.LabelBackendMaxconnExtractorfunc); err == nil {
return label
}
return "request.host"
}

func (p *Provider) containerFilter(container dockerData) bool {
_, err := strconv.Atoi(container.Labels["traefik.port"])
_, err := strconv.Atoi(container.Labels[types.LabelPort])
if len(container.NetworkSettings.Ports) == 0 && err != nil {
log.Debugf("Filtering container without port and no traefik.port label %s", container.Name)
return false
Expand All @@ -518,7 +523,7 @@ func (p *Provider) containerFilter(container dockerData) bool {
return false
}

constraintTags := strings.Split(container.Labels["traefik.tags"], ",")
constraintTags := strings.Split(container.Labels[types.LabelTags], ",")
if ok, failingConstraint := p.MatchConstraints(constraintTags); !ok {
if failingConstraint != nil {
log.Debugf("Container %v pruned by '%v' constraint", container.Name, failingConstraint.String())
Expand Down Expand Up @@ -547,11 +552,11 @@ func (p *Provider) getFrontendName(container dockerData) string {
// GetFrontendRule returns the frontend rule for the specified container, using
// it's label. It returns a default one (Host) if the label is not present.
func (p *Provider) getFrontendRule(container dockerData) string {
if label, err := getLabel(container, "traefik.frontend.rule"); err == nil {
if label, err := getLabel(container, types.LabelFrontendRule); err == nil {
return label
}
if labels, err := getLabels(container, []string{"com.docker.compose.project", "com.docker.compose.service"}); err == nil {
return "Host:" + p.getSubDomain(labels["com.docker.compose.service"]+"."+labels["com.docker.compose.project"]) + "." + p.Domain
if labels, err := getLabels(container, []string{labelDockerComposeProject, labelDockerComposeService}); err == nil {
return "Host:" + p.getSubDomain(labels[labelDockerComposeService]+"."+labels[labelDockerComposeProject]) + "." + p.Domain
}
if len(p.Domain) > 0 {
return "Host:" + p.getSubDomain(container.ServiceName) + "." + p.Domain
Expand All @@ -560,17 +565,17 @@ func (p *Provider) getFrontendRule(container dockerData) string {
}

func (p *Provider) getBackend(container dockerData) string {
if label, err := getLabel(container, "traefik.backend"); err == nil {
if label, err := getLabel(container, types.LabelBackend); err == nil {
return provider.Normalize(label)
}
if labels, err := getLabels(container, []string{"com.docker.compose.project", "com.docker.compose.service"}); err == nil {
return provider.Normalize(labels["com.docker.compose.service"] + "_" + labels["com.docker.compose.project"])
if labels, err := getLabels(container, []string{labelDockerComposeProject, labelDockerComposeService}); err == nil {
return provider.Normalize(labels[labelDockerComposeService] + "_" + labels[labelDockerComposeProject])
}
return provider.Normalize(container.ServiceName)
}

func (p *Provider) getIPAddress(container dockerData) string {
if label, err := getLabel(container, "traefik.docker.network"); err == nil && label != "" {
if label, err := getLabel(container, labelDockerNetwork); err == nil && label != "" {
networkSettings := container.NetworkSettings
if networkSettings.Networks != nil {
network := networkSettings.Networks[label]
Expand Down Expand Up @@ -606,7 +611,7 @@ func (p *Provider) getIPAddress(container dockerData) string {
}

func (p *Provider) getPort(container dockerData) string {
if label, err := getLabel(container, "traefik.port"); err == nil {
if label, err := getLabel(container, types.LabelPort); err == nil {
return label
}

Expand All @@ -630,42 +635,42 @@ func (p *Provider) getPort(container dockerData) string {
}

func (p *Provider) getWeight(container dockerData) string {
if label, err := getLabel(container, "traefik.weight"); err == nil {
if label, err := getLabel(container, types.LabelWeight); err == nil {
return label
}
return "0"
}

func (p *Provider) getSticky(container dockerData) string {
if label, err := getLabel(container, "traefik.backend.loadbalancer.sticky"); err == nil {
if label, err := getLabel(container, types.LabelBackendLoadbalancerSticky); err == nil {
return label
}
return "false"
}

func (p *Provider) getIsBackendLBSwarm(container dockerData) string {
if label, err := getLabel(container, "traefik.backend.loadbalancer.swarm"); err == nil {
if label, err := getLabel(container, labelBackendLoadbalancerSwarm); err == nil {
return label
}
return "false"
}

func (p *Provider) getDomain(container dockerData) string {
if label, err := getLabel(container, "traefik.domain"); err == nil {
if label, err := getLabel(container, types.LabelDomain); err == nil {
return label
}
return p.Domain
}

func (p *Provider) getProtocol(container dockerData) string {
if label, err := getLabel(container, "traefik.protocol"); err == nil {
if label, err := getLabel(container, types.LabelProtocol); err == nil {
return label
}
return "http"
}

func (p *Provider) getPassHostHeader(container dockerData) string {
if passHostHeader, err := getLabel(container, "traefik.frontend.passHostHeader"); err == nil {
if passHostHeader, err := getLabel(container, types.LabelFrontendPassHostHeader); err == nil {
return passHostHeader
}
return "true"
Expand All @@ -674,36 +679,36 @@ func (p *Provider) getPassHostHeader(container dockerData) string {
func (p *Provider) getWhitelistSourceRange(container dockerData) []string {
var whitelistSourceRange []string

if whitelistSourceRangeLabel, err := getLabel(container, "traefik.frontend.whitelistSourceRange"); err == nil {
if whitelistSourceRangeLabel, err := getLabel(container, types.LabelTraefikFrontendWhitelistSourceRange); err == nil {
whitelistSourceRange = provider.SplitAndTrimString(whitelistSourceRangeLabel)
}
return whitelistSourceRange
}

func (p *Provider) getPriority(container dockerData) string {
if priority, err := getLabel(container, "traefik.frontend.priority"); err == nil {
if priority, err := getLabel(container, types.LabelFrontendPriority); err == nil {
return priority
}
return "0"
}

func (p *Provider) getEntryPoints(container dockerData) []string {
if entryPoints, err := getLabel(container, "traefik.frontend.entryPoints"); err == nil {
if entryPoints, err := getLabel(container, types.LabelFrontendEntryPoints); err == nil {
return strings.Split(entryPoints, ",")
}
return []string{}
}

func (p *Provider) getBasicAuth(container dockerData) []string {
if basicAuth, err := getLabel(container, "traefik.frontend.auth.basic"); err == nil {
if basicAuth, err := getLabel(container, types.LabelFrontendAuthBasic); err == nil {
return strings.Split(basicAuth, ",")
}

return []string{}
}

func isContainerEnabled(container dockerData, exposedByDefault bool) bool {
return exposedByDefault && container.Labels["traefik.enable"] != "false" || container.Labels["traefik.enable"] == "true"
return exposedByDefault && container.Labels[types.LabelEnable] != "false" || container.Labels[types.LabelEnable] == "true"
}

func getLabel(container dockerData, label string) (string, error) {
Expand Down