216 lines
6.4 KiB
Go
216 lines
6.4 KiB
Go
package docker
|
|
|
|
import (
|
|
"fmt"
|
|
"net/http"
|
|
"strconv"
|
|
"strings"
|
|
|
|
"github.com/containous/traefik/log"
|
|
"github.com/containous/traefik/provider"
|
|
"github.com/containous/traefik/provider/label"
|
|
"github.com/docker/go-connections/nat"
|
|
)
|
|
|
|
// Specific functions
|
|
|
|
// Deprecated
|
|
func (p Provider) getFrontendNameV1(container dockerData, idx int) string {
|
|
return provider.Normalize(p.getFrontendRuleV1(container) + "-" + strconv.Itoa(idx))
|
|
}
|
|
|
|
// 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.
|
|
// Deprecated
|
|
func (p Provider) getFrontendRuleV1(container dockerData) string {
|
|
if value := label.GetStringValue(container.Labels, label.TraefikFrontendRule, ""); len(value) != 0 {
|
|
return value
|
|
}
|
|
|
|
domain := label.GetStringValue(container.Labels, label.TraefikDomain, p.Domain)
|
|
|
|
if values, err := label.GetStringMultipleStrict(container.Labels, labelDockerComposeProject, labelDockerComposeService); err == nil {
|
|
return "Host:" + getSubDomain(values[labelDockerComposeService]+"."+values[labelDockerComposeProject]) + "." + domain
|
|
}
|
|
|
|
if len(domain) > 0 {
|
|
return "Host:" + getSubDomain(container.ServiceName) + "." + domain
|
|
}
|
|
|
|
return ""
|
|
}
|
|
|
|
// Deprecated
|
|
func getBackendNameV1(container dockerData) string {
|
|
if value := label.GetStringValue(container.Labels, label.TraefikBackend, ""); len(value) != 0 {
|
|
return provider.Normalize(value)
|
|
}
|
|
|
|
if values, err := label.GetStringMultipleStrict(container.Labels, labelDockerComposeProject, labelDockerComposeService); err == nil {
|
|
return provider.Normalize(values[labelDockerComposeService] + "_" + values[labelDockerComposeProject])
|
|
}
|
|
|
|
return provider.Normalize(container.ServiceName)
|
|
}
|
|
|
|
// Deprecated
|
|
func getPortV1(container dockerData) string {
|
|
if value := label.GetStringValue(container.Labels, label.TraefikPort, ""); len(value) != 0 {
|
|
return value
|
|
}
|
|
|
|
// See iteration order in https://blog.golang.org/go-maps-in-action
|
|
var ports []nat.Port
|
|
for port := range container.NetworkSettings.Ports {
|
|
ports = append(ports, port)
|
|
}
|
|
|
|
less := func(i, j nat.Port) bool {
|
|
return i.Int() < j.Int()
|
|
}
|
|
nat.Sort(ports, less)
|
|
|
|
if len(ports) > 0 {
|
|
min := ports[0]
|
|
return min.Port()
|
|
}
|
|
|
|
return ""
|
|
}
|
|
|
|
// replaced by Stickiness
|
|
// Deprecated
|
|
func getStickyV1(container dockerData) bool {
|
|
if label.Has(container.Labels, label.TraefikBackendLoadBalancerSticky) {
|
|
log.Warnf("Deprecated configuration found: %s. Please use %s.", label.TraefikBackendLoadBalancerSticky, label.TraefikBackendLoadBalancerStickiness)
|
|
}
|
|
|
|
return label.GetBoolValue(container.Labels, label.TraefikBackendLoadBalancerSticky, false)
|
|
}
|
|
|
|
// Deprecated
|
|
func hasLoadBalancerLabelV1(container dockerData) bool {
|
|
method := label.Has(container.Labels, label.TraefikBackendLoadBalancerMethod)
|
|
sticky := label.Has(container.Labels, label.TraefikBackendLoadBalancerSticky)
|
|
stickiness := label.Has(container.Labels, label.TraefikBackendLoadBalancerStickiness)
|
|
cookieName := label.Has(container.Labels, label.TraefikBackendLoadBalancerStickinessCookieName)
|
|
return method || sticky || stickiness || cookieName
|
|
}
|
|
|
|
// Deprecated
|
|
func hasMaxConnLabelsV1(container dockerData) bool {
|
|
mca := label.Has(container.Labels, label.TraefikBackendMaxConnAmount)
|
|
mcef := label.Has(container.Labels, label.TraefikBackendMaxConnExtractorFunc)
|
|
return mca && mcef
|
|
}
|
|
|
|
// Deprecated
|
|
func hasRedirectV1(container dockerData) bool {
|
|
return hasLabelV1(label.TraefikFrontendRedirectEntryPoint)(container) ||
|
|
hasLabelV1(label.TraefikFrontendRedirectReplacement)(container) && hasLabelV1(label.TraefikFrontendRedirectRegex)(container)
|
|
}
|
|
|
|
// Deprecated
|
|
func hasHeadersV1(container dockerData) bool {
|
|
for key := range container.Labels {
|
|
if strings.HasPrefix(key, label.Prefix+"frontend.headers.") {
|
|
return true
|
|
}
|
|
}
|
|
return false
|
|
}
|
|
|
|
// Label functions
|
|
|
|
// Deprecated
|
|
func getFuncStringLabelV1(labelName string, defaultValue string) func(container dockerData) string {
|
|
return func(container dockerData) string {
|
|
return label.GetStringValue(container.Labels, labelName, defaultValue)
|
|
}
|
|
}
|
|
|
|
// Deprecated
|
|
func getFuncBoolLabelV1(labelName string, defaultValue bool) func(container dockerData) bool {
|
|
return func(container dockerData) bool {
|
|
return label.GetBoolValue(container.Labels, labelName, defaultValue)
|
|
}
|
|
}
|
|
|
|
// Deprecated
|
|
func getFuncSliceStringLabelV1(labelName string) func(container dockerData) []string {
|
|
return func(container dockerData) []string {
|
|
return label.GetSliceStringValue(container.Labels, labelName)
|
|
}
|
|
}
|
|
|
|
// Deprecated
|
|
func getFuncIntLabelV1(labelName string, defaultValue int) func(container dockerData) int {
|
|
return func(container dockerData) int {
|
|
return label.GetIntValue(container.Labels, labelName, defaultValue)
|
|
}
|
|
}
|
|
|
|
// Deprecated
|
|
func getFuncInt64LabelV1(labelName string, defaultValue int64) func(container dockerData) int64 {
|
|
return func(container dockerData) int64 {
|
|
return label.GetInt64Value(container.Labels, labelName, defaultValue)
|
|
}
|
|
}
|
|
|
|
// Deprecated
|
|
func hasFuncV1(labelName string) func(container dockerData) bool {
|
|
return func(container dockerData) bool {
|
|
return label.Has(container.Labels, labelName)
|
|
}
|
|
}
|
|
|
|
// Deprecated
|
|
func hasLabelV1(label string) func(container dockerData) bool {
|
|
return func(container dockerData) bool {
|
|
lbl, err := getLabelV1(container, label)
|
|
return err == nil && len(lbl) > 0
|
|
}
|
|
}
|
|
|
|
// Deprecated
|
|
func getLabelV1(container dockerData, label string) (string, error) {
|
|
if value, ok := container.Labels[label]; ok {
|
|
return value, nil
|
|
}
|
|
return "", fmt.Errorf("label not found: %s", label)
|
|
}
|
|
|
|
// Deprecated
|
|
func getFuncMapLabelV1(labelName string) func(container dockerData) map[string]string {
|
|
return func(container dockerData) map[string]string {
|
|
return parseMapLabelV1(container, labelName)
|
|
}
|
|
}
|
|
|
|
// Deprecated
|
|
func parseMapLabelV1(container dockerData, labelName string) map[string]string {
|
|
if parts, err := getLabelV1(container, labelName); err == nil {
|
|
if len(parts) == 0 {
|
|
log.Errorf("Could not load %q", labelName)
|
|
return nil
|
|
}
|
|
|
|
values := make(map[string]string)
|
|
for _, headers := range strings.Split(parts, "||") {
|
|
pair := strings.SplitN(headers, ":", 2)
|
|
if len(pair) != 2 {
|
|
log.Warnf("Could not load %q: %v, skipping...", labelName, pair)
|
|
} else {
|
|
values[http.CanonicalHeaderKey(strings.TrimSpace(pair[0]))] = strings.TrimSpace(pair[1])
|
|
}
|
|
}
|
|
|
|
if len(values) == 0 {
|
|
log.Errorf("Could not load %q", labelName)
|
|
return nil
|
|
}
|
|
return values
|
|
}
|
|
|
|
return nil
|
|
}
|