Merge pull request #92 from vdemeester/linting-some-packages
Linting some packages
This commit is contained in:
commit
5ee6981410
14 changed files with 106 additions and 71 deletions
|
@ -1,6 +1,3 @@
|
||||||
/*
|
|
||||||
Copyright
|
|
||||||
*/
|
|
||||||
package middlewares
|
package middlewares
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
@ -9,10 +6,12 @@ import (
|
||||||
"github.com/mailgun/oxy/cbreaker"
|
"github.com/mailgun/oxy/cbreaker"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
// CircuitBreaker holds the oxy circuit breaker.
|
||||||
type CircuitBreaker struct {
|
type CircuitBreaker struct {
|
||||||
circuitBreaker *cbreaker.CircuitBreaker
|
circuitBreaker *cbreaker.CircuitBreaker
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// NewCircuitBreaker returns a new CircuitBreaker.
|
||||||
func NewCircuitBreaker(next http.Handler, expression string, options ...cbreaker.CircuitBreakerOption) *CircuitBreaker {
|
func NewCircuitBreaker(next http.Handler, expression string, options ...cbreaker.CircuitBreakerOption) *CircuitBreaker {
|
||||||
circuitBreaker, _ := cbreaker.New(next, expression, options...)
|
circuitBreaker, _ := cbreaker.New(next, expression, options...)
|
||||||
return &CircuitBreaker{circuitBreaker}
|
return &CircuitBreaker{circuitBreaker}
|
||||||
|
|
|
@ -1,6 +1,3 @@
|
||||||
/*
|
|
||||||
Copyright
|
|
||||||
*/
|
|
||||||
package middlewares
|
package middlewares
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
@ -16,7 +13,7 @@ type Logger struct {
|
||||||
file *os.File
|
file *os.File
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewLogger returns a new Logger instance
|
// NewLogger returns a new Logger instance.
|
||||||
func NewLogger(file string) *Logger {
|
func NewLogger(file string) *Logger {
|
||||||
if len(file) > 0 {
|
if len(file) > 0 {
|
||||||
fi, err := os.OpenFile(file, os.O_RDWR|os.O_CREATE|os.O_APPEND, 0666)
|
fi, err := os.OpenFile(file, os.O_RDWR|os.O_CREATE|os.O_APPEND, 0666)
|
||||||
|
@ -36,6 +33,7 @@ func (l *Logger) ServeHTTP(rw http.ResponseWriter, r *http.Request, next http.Ha
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Close closes the logger (i.e. the file).
|
||||||
func (l *Logger) Close() {
|
func (l *Logger) Close() {
|
||||||
l.file.Close()
|
l.file.Close()
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,6 +1,3 @@
|
||||||
/*
|
|
||||||
Copyright
|
|
||||||
*/
|
|
||||||
package middlewares
|
package middlewares
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
@ -11,10 +8,12 @@ import (
|
||||||
"github.com/gorilla/mux"
|
"github.com/gorilla/mux"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
// Routes holds the gorilla mux routes (for the API & co).
|
||||||
type Routes struct {
|
type Routes struct {
|
||||||
router *mux.Router
|
router *mux.Router
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// NewRoutes return a Routes based on the given router.
|
||||||
func NewRoutes(router *mux.Router) *Routes {
|
func NewRoutes(router *mux.Router) *Routes {
|
||||||
return &Routes{router}
|
return &Routes{router}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,20 +1,20 @@
|
||||||
/*
|
|
||||||
Copyright
|
|
||||||
*/
|
|
||||||
package middlewares
|
package middlewares
|
||||||
|
|
||||||
import (
|
import (
|
||||||
log "github.com/Sirupsen/logrus"
|
|
||||||
"github.com/mailgun/oxy/roundrobin"
|
|
||||||
"net/http"
|
"net/http"
|
||||||
"strings"
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
log "github.com/Sirupsen/logrus"
|
||||||
|
"github.com/mailgun/oxy/roundrobin"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
// WebsocketUpgrader holds Websocket configuration.
|
||||||
type WebsocketUpgrader struct {
|
type WebsocketUpgrader struct {
|
||||||
rr *roundrobin.RoundRobin
|
rr *roundrobin.RoundRobin
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// NewWebsocketUpgrader returns a new WebsocketUpgrader.
|
||||||
func NewWebsocketUpgrader(rr *roundrobin.RoundRobin) *WebsocketUpgrader {
|
func NewWebsocketUpgrader(rr *roundrobin.RoundRobin) *WebsocketUpgrader {
|
||||||
wu := WebsocketUpgrader{
|
wu := WebsocketUpgrader{
|
||||||
rr: rr,
|
rr: rr,
|
||||||
|
|
|
@ -2,6 +2,7 @@ package provider
|
||||||
|
|
||||||
import "github.com/emilevauge/traefik/types"
|
import "github.com/emilevauge/traefik/types"
|
||||||
|
|
||||||
|
// BoltDb holds configurations of the BoltDb provider.
|
||||||
type BoltDb struct {
|
type BoltDb struct {
|
||||||
Watch bool
|
Watch bool
|
||||||
Endpoint string
|
Endpoint string
|
||||||
|
@ -10,6 +11,8 @@ type BoltDb struct {
|
||||||
KvProvider *Kv
|
KvProvider *Kv
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Provide allows the provider to provide configurations to traefik
|
||||||
|
// using the given configuration channel.
|
||||||
func (provider *BoltDb) Provide(configurationChan chan<- types.ConfigMessage) error {
|
func (provider *BoltDb) Provide(configurationChan chan<- types.ConfigMessage) error {
|
||||||
provider.KvProvider = NewBoltDbProvider(provider)
|
provider.KvProvider = NewBoltDbProvider(provider)
|
||||||
return provider.KvProvider.provide(configurationChan)
|
return provider.KvProvider.provide(configurationChan)
|
||||||
|
|
|
@ -2,6 +2,7 @@ package provider
|
||||||
|
|
||||||
import "github.com/emilevauge/traefik/types"
|
import "github.com/emilevauge/traefik/types"
|
||||||
|
|
||||||
|
// Consul holds configurations of the Consul provider.
|
||||||
type Consul struct {
|
type Consul struct {
|
||||||
Watch bool
|
Watch bool
|
||||||
Endpoint string
|
Endpoint string
|
||||||
|
@ -10,6 +11,8 @@ type Consul struct {
|
||||||
KvProvider *Kv
|
KvProvider *Kv
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Provide allows the provider to provide configurations to traefik
|
||||||
|
// using the given configuration channel.
|
||||||
func (provider *Consul) Provide(configurationChan chan<- types.ConfigMessage) error {
|
func (provider *Consul) Provide(configurationChan chan<- types.ConfigMessage) error {
|
||||||
provider.KvProvider = NewConsulProvider(provider)
|
provider.KvProvider = NewConsulProvider(provider)
|
||||||
return provider.KvProvider.provide(configurationChan)
|
return provider.KvProvider.provide(configurationChan)
|
||||||
|
|
|
@ -18,6 +18,7 @@ import (
|
||||||
"github.com/fsouza/go-dockerclient"
|
"github.com/fsouza/go-dockerclient"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
// Docker holds configurations of the Docker provider.
|
||||||
type Docker struct {
|
type Docker struct {
|
||||||
Watch bool
|
Watch bool
|
||||||
Endpoint string
|
Endpoint string
|
||||||
|
@ -25,12 +26,16 @@ type Docker struct {
|
||||||
Domain string
|
Domain string
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Provide allows the provider to provide configurations to traefik
|
||||||
|
// using the given configuration channel.
|
||||||
func (provider *Docker) Provide(configurationChan chan<- types.ConfigMessage) error {
|
func (provider *Docker) Provide(configurationChan chan<- types.ConfigMessage) error {
|
||||||
if dockerClient, err := docker.NewClient(provider.Endpoint); err != nil {
|
|
||||||
|
dockerClient, err := docker.NewClient(provider.Endpoint)
|
||||||
|
if err != nil {
|
||||||
log.Errorf("Failed to create a client for docker, error: %s", err)
|
log.Errorf("Failed to create a client for docker, error: %s", err)
|
||||||
return err
|
return err
|
||||||
} else {
|
}
|
||||||
err := dockerClient.Ping()
|
err = dockerClient.Ping()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Errorf("Docker connection error %+v", err)
|
log.Errorf("Docker connection error %+v", err)
|
||||||
return err
|
return err
|
||||||
|
@ -69,7 +74,6 @@ func (provider *Docker) Provide(configurationChan chan<- types.ConfigMessage) er
|
||||||
|
|
||||||
configuration := provider.loadDockerConfig(dockerClient)
|
configuration := provider.loadDockerConfig(dockerClient)
|
||||||
configurationChan <- types.ConfigMessage{"docker", configuration}
|
configurationChan <- types.ConfigMessage{"docker", configuration}
|
||||||
}
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -223,15 +227,17 @@ func (provider *Docker) getLabel(container docker.Container, label string) (stri
|
||||||
func (provider *Docker) getLabels(container docker.Container, labels []string) (map[string]string, error) {
|
func (provider *Docker) getLabels(container docker.Container, labels []string) (map[string]string, error) {
|
||||||
foundLabels := map[string]string{}
|
foundLabels := map[string]string{}
|
||||||
for _, label := range labels {
|
for _, label := range labels {
|
||||||
if foundLabel, err := provider.getLabel(container, label); err != nil {
|
foundLabel, err := provider.getLabel(container, label)
|
||||||
|
if err != nil {
|
||||||
return nil, errors.New("Label not found: " + label)
|
return nil, errors.New("Label not found: " + label)
|
||||||
} else {
|
|
||||||
foundLabels[label] = foundLabel
|
|
||||||
}
|
}
|
||||||
|
foundLabels[label] = foundLabel
|
||||||
}
|
}
|
||||||
return foundLabels, nil
|
return foundLabels, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// GetFrontendValue returns the frontend value for the specified container, using
|
||||||
|
// it's label. It returns a default one if the label is not present.
|
||||||
func (provider *Docker) GetFrontendValue(container docker.Container) string {
|
func (provider *Docker) GetFrontendValue(container docker.Container) string {
|
||||||
if label, err := provider.getLabel(container, "traefik.frontend.value"); err == nil {
|
if label, err := provider.getLabel(container, "traefik.frontend.value"); err == nil {
|
||||||
return label
|
return label
|
||||||
|
@ -239,6 +245,8 @@ func (provider *Docker) GetFrontendValue(container docker.Container) string {
|
||||||
return provider.getEscapedName(container.Name) + "." + provider.Domain
|
return provider.getEscapedName(container.Name) + "." + provider.Domain
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 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 (provider *Docker) GetFrontendRule(container docker.Container) string {
|
func (provider *Docker) GetFrontendRule(container docker.Container) string {
|
||||||
if label, err := provider.getLabel(container, "traefik.frontend.rule"); err == nil {
|
if label, err := provider.getLabel(container, "traefik.frontend.rule"); err == nil {
|
||||||
return label
|
return label
|
||||||
|
|
|
@ -2,6 +2,7 @@ package provider
|
||||||
|
|
||||||
import "github.com/emilevauge/traefik/types"
|
import "github.com/emilevauge/traefik/types"
|
||||||
|
|
||||||
|
// Etcd holds configurations of the Etcd provider.
|
||||||
type Etcd struct {
|
type Etcd struct {
|
||||||
Watch bool
|
Watch bool
|
||||||
Endpoint string
|
Endpoint string
|
||||||
|
@ -10,6 +11,8 @@ type Etcd struct {
|
||||||
KvProvider *Kv
|
KvProvider *Kv
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Provide allows the provider to provide configurations to traefik
|
||||||
|
// using the given configuration channel.
|
||||||
func (provider *Etcd) Provide(configurationChan chan<- types.ConfigMessage) error {
|
func (provider *Etcd) Provide(configurationChan chan<- types.ConfigMessage) error {
|
||||||
provider.KvProvider = NewEtcdProvider(provider)
|
provider.KvProvider = NewEtcdProvider(provider)
|
||||||
return provider.KvProvider.provide(configurationChan)
|
return provider.KvProvider.provide(configurationChan)
|
||||||
|
|
|
@ -11,11 +11,14 @@ import (
|
||||||
"gopkg.in/fsnotify.v1"
|
"gopkg.in/fsnotify.v1"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
// File holds configurations of the File provider.
|
||||||
type File struct {
|
type File struct {
|
||||||
Watch bool
|
Watch bool
|
||||||
Filename string
|
Filename string
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Provide allows the provider to provide configurations to traefik
|
||||||
|
// using the given configuration channel.
|
||||||
func (provider *File) Provide(configurationChan chan<- types.ConfigMessage) error {
|
func (provider *File) Provide(configurationChan chan<- types.ConfigMessage) error {
|
||||||
watcher, err := fsnotify.NewWatcher()
|
watcher, err := fsnotify.NewWatcher()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -39,7 +42,7 @@ func (provider *File) Provide(configurationChan chan<- types.ConfigMessage) erro
|
||||||
case event := <-watcher.Events:
|
case event := <-watcher.Events:
|
||||||
if strings.Contains(event.Name, file.Name()) {
|
if strings.Contains(event.Name, file.Name()) {
|
||||||
log.Debug("File event:", event)
|
log.Debug("File event:", event)
|
||||||
configuration := provider.LoadFileConfig(file.Name())
|
configuration := provider.loadFileConfig(file.Name())
|
||||||
if configuration != nil {
|
if configuration != nil {
|
||||||
configurationChan <- types.ConfigMessage{"file", configuration}
|
configurationChan <- types.ConfigMessage{"file", configuration}
|
||||||
}
|
}
|
||||||
|
@ -56,12 +59,12 @@ func (provider *File) Provide(configurationChan chan<- types.ConfigMessage) erro
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
configuration := provider.LoadFileConfig(file.Name())
|
configuration := provider.loadFileConfig(file.Name())
|
||||||
configurationChan <- types.ConfigMessage{"file", configuration}
|
configurationChan <- types.ConfigMessage{"file", configuration}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (provider *File) LoadFileConfig(filename string) *types.Configuration {
|
func (provider *File) loadFileConfig(filename string) *types.Configuration {
|
||||||
configuration := new(types.Configuration)
|
configuration := new(types.Configuration)
|
||||||
if _, err := toml.DecodeFile(filename, configuration); err != nil {
|
if _, err := toml.DecodeFile(filename, configuration); err != nil {
|
||||||
log.Error("Error reading file:", err)
|
log.Error("Error reading file:", err)
|
||||||
|
|
|
@ -1,6 +1,4 @@
|
||||||
/*
|
// Package provider holds the different provider implementation.
|
||||||
Copyright
|
|
||||||
*/
|
|
||||||
package provider
|
package provider
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
@ -23,6 +21,7 @@ import (
|
||||||
"github.com/emilevauge/traefik/types"
|
"github.com/emilevauge/traefik/types"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
// Kv holds common configurations of key-value providers.
|
||||||
type Kv struct {
|
type Kv struct {
|
||||||
Watch bool
|
Watch bool
|
||||||
Endpoint string
|
Endpoint string
|
||||||
|
@ -32,6 +31,7 @@ type Kv struct {
|
||||||
kvclient store.Store
|
kvclient store.Store
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// NewConsulProvider returns a Consul provider.
|
||||||
func NewConsulProvider(provider *Consul) *Kv {
|
func NewConsulProvider(provider *Consul) *Kv {
|
||||||
kvProvider := new(Kv)
|
kvProvider := new(Kv)
|
||||||
kvProvider.Watch = provider.Watch
|
kvProvider.Watch = provider.Watch
|
||||||
|
@ -42,6 +42,7 @@ func NewConsulProvider(provider *Consul) *Kv {
|
||||||
return kvProvider
|
return kvProvider
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// NewEtcdProvider returns a Etcd provider.
|
||||||
func NewEtcdProvider(provider *Etcd) *Kv {
|
func NewEtcdProvider(provider *Etcd) *Kv {
|
||||||
kvProvider := new(Kv)
|
kvProvider := new(Kv)
|
||||||
kvProvider.Watch = provider.Watch
|
kvProvider.Watch = provider.Watch
|
||||||
|
@ -52,6 +53,7 @@ func NewEtcdProvider(provider *Etcd) *Kv {
|
||||||
return kvProvider
|
return kvProvider
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// NewZkProvider returns a Zookepper provider.
|
||||||
func NewZkProvider(provider *Zookepper) *Kv {
|
func NewZkProvider(provider *Zookepper) *Kv {
|
||||||
kvProvider := new(Kv)
|
kvProvider := new(Kv)
|
||||||
kvProvider.Watch = provider.Watch
|
kvProvider.Watch = provider.Watch
|
||||||
|
@ -62,6 +64,7 @@ func NewZkProvider(provider *Zookepper) *Kv {
|
||||||
return kvProvider
|
return kvProvider
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// NewBoltDbProvider returns a BoldDb provider.
|
||||||
func NewBoltDbProvider(provider *BoltDb) *Kv {
|
func NewBoltDbProvider(provider *BoltDb) *Kv {
|
||||||
kvProvider := new(Kv)
|
kvProvider := new(Kv)
|
||||||
kvProvider.Watch = provider.Watch
|
kvProvider.Watch = provider.Watch
|
||||||
|
|
|
@ -15,15 +15,18 @@ import (
|
||||||
"github.com/gambol99/go-marathon"
|
"github.com/gambol99/go-marathon"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
// Marathon holds configuration of the Marathon provider.
|
||||||
type Marathon struct {
|
type Marathon struct {
|
||||||
Watch bool
|
Watch bool
|
||||||
Endpoint string
|
Endpoint string
|
||||||
marathonClient marathon.Marathon
|
|
||||||
Domain string
|
Domain string
|
||||||
Filename string
|
Filename string
|
||||||
NetworkInterface string
|
NetworkInterface string
|
||||||
|
marathonClient marathon.Marathon
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Provide allows the provider to provide configurations to traefik
|
||||||
|
// using the given configuration channel.
|
||||||
func (provider *Marathon) Provide(configurationChan chan<- types.ConfigMessage) error {
|
func (provider *Marathon) Provide(configurationChan chan<- types.ConfigMessage) error {
|
||||||
config := marathon.NewDefaultConfig()
|
config := marathon.NewDefaultConfig()
|
||||||
config.URL = provider.Endpoint
|
config.URL = provider.Endpoint
|
||||||
|
@ -238,6 +241,8 @@ func (provider *Marathon) getEscapedName(name string) string {
|
||||||
return strings.Replace(name, "/", "", -1)
|
return strings.Replace(name, "/", "", -1)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// GetFrontendValue returns the frontend value for the specified application, using
|
||||||
|
// it's label. It returns a default one if the label is not present.
|
||||||
func (provider *Marathon) GetFrontendValue(application marathon.Application) string {
|
func (provider *Marathon) GetFrontendValue(application marathon.Application) string {
|
||||||
if label, err := provider.getLabel(application, "traefik.frontend.value"); err == nil {
|
if label, err := provider.getLabel(application, "traefik.frontend.value"); err == nil {
|
||||||
return label
|
return label
|
||||||
|
@ -245,6 +250,8 @@ func (provider *Marathon) GetFrontendValue(application marathon.Application) str
|
||||||
return provider.getEscapedName(application.ID) + "." + provider.Domain
|
return provider.getEscapedName(application.ID) + "." + provider.Domain
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// GetFrontendRule returns the frontend rule for the specified application, using
|
||||||
|
// it's label. It returns a default one (Host) if the label is not present.
|
||||||
func (provider *Marathon) GetFrontendRule(application marathon.Application) string {
|
func (provider *Marathon) GetFrontendRule(application marathon.Application) string {
|
||||||
if label, err := provider.getLabel(application, "traefik.frontend.rule"); err == nil {
|
if label, err := provider.getLabel(application, "traefik.frontend.rule"); err == nil {
|
||||||
return label
|
return label
|
||||||
|
|
|
@ -2,6 +2,9 @@ package provider
|
||||||
|
|
||||||
import "github.com/emilevauge/traefik/types"
|
import "github.com/emilevauge/traefik/types"
|
||||||
|
|
||||||
|
// Provider defines methods of a provider.
|
||||||
type Provider interface {
|
type Provider interface {
|
||||||
|
// Provide allows the provider to provide configurations to traefik
|
||||||
|
// using the given configuration channel.
|
||||||
Provide(configurationChan chan<- types.ConfigMessage) error
|
Provide(configurationChan chan<- types.ConfigMessage) error
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,6 +2,7 @@ package provider
|
||||||
|
|
||||||
import "github.com/emilevauge/traefik/types"
|
import "github.com/emilevauge/traefik/types"
|
||||||
|
|
||||||
|
// Zookepper holds configurations of the Zookepper provider.
|
||||||
type Zookepper struct {
|
type Zookepper struct {
|
||||||
Watch bool
|
Watch bool
|
||||||
Endpoint string
|
Endpoint string
|
||||||
|
@ -10,6 +11,8 @@ type Zookepper struct {
|
||||||
KvProvider *Kv
|
KvProvider *Kv
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Provide allows the provider to provide configurations to traefik
|
||||||
|
// using the given configuration channel.
|
||||||
func (provider *Zookepper) Provide(configurationChan chan<- types.ConfigMessage) error {
|
func (provider *Zookepper) Provide(configurationChan chan<- types.ConfigMessage) error {
|
||||||
provider.KvProvider = NewZkProvider(provider)
|
provider.KvProvider = NewZkProvider(provider)
|
||||||
return provider.KvProvider.provide(configurationChan)
|
return provider.KvProvider.provide(configurationChan)
|
||||||
|
|
|
@ -5,43 +5,43 @@ import (
|
||||||
"strings"
|
"strings"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Backend configuration
|
// Backend holds backend configuration.
|
||||||
type Backend struct {
|
type Backend struct {
|
||||||
Servers map[string]Server `json:"servers,omitempty"`
|
Servers map[string]Server `json:"servers,omitempty"`
|
||||||
CircuitBreaker *CircuitBreaker `json:"circuitBreaker,omitempty"`
|
CircuitBreaker *CircuitBreaker `json:"circuitBreaker,omitempty"`
|
||||||
LoadBalancer *LoadBalancer `json:"loadBalancer,omitempty"`
|
LoadBalancer *LoadBalancer `json:"loadBalancer,omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// LoadBalancer configuration
|
// LoadBalancer holds load balancing configuration.
|
||||||
type LoadBalancer struct {
|
type LoadBalancer struct {
|
||||||
Method string `json:"method,omitempty"`
|
Method string `json:"method,omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// CircuitBreaker configuration
|
// CircuitBreaker holds circuit breaker configuration.
|
||||||
type CircuitBreaker struct {
|
type CircuitBreaker struct {
|
||||||
Expression string `json:"expression,omitempty"`
|
Expression string `json:"expression,omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// Server configuration
|
// Server holds server configuration.
|
||||||
type Server struct {
|
type Server struct {
|
||||||
URL string `json:"url,omitempty"`
|
URL string `json:"url,omitempty"`
|
||||||
Weight int `json:"weight,omitempty"`
|
Weight int `json:"weight,omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// Route configuration
|
// Route holds route configuration.
|
||||||
type Route struct {
|
type Route struct {
|
||||||
Rule string `json:"rule,omitempty"`
|
Rule string `json:"rule,omitempty"`
|
||||||
Value string `json:"value,omitempty"`
|
Value string `json:"value,omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// Frontend configuration
|
// Frontend holds frontend configuration.
|
||||||
type Frontend struct {
|
type Frontend struct {
|
||||||
Backend string `json:"backend,omitempty"`
|
Backend string `json:"backend,omitempty"`
|
||||||
Routes map[string]Route `json:"routes,omitempty"`
|
Routes map[string]Route `json:"routes,omitempty"`
|
||||||
PassHostHeader bool `json:"passHostHeader,omitempty"`
|
PassHostHeader bool `json:"passHostHeader,omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// Load Balancer Method
|
// LoadBalancerMethod holds the method of load balancing to use.
|
||||||
type LoadBalancerMethod uint8
|
type LoadBalancerMethod uint8
|
||||||
|
|
||||||
const (
|
const (
|
||||||
|
@ -56,6 +56,7 @@ var loadBalancerMethodNames = []string{
|
||||||
"Drr",
|
"Drr",
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// NewLoadBalancerMethod create a new LoadBalancerMethod from a given LoadBalancer.
|
||||||
func NewLoadBalancerMethod(loadBalancer *LoadBalancer) (LoadBalancerMethod, error) {
|
func NewLoadBalancerMethod(loadBalancer *LoadBalancer) (LoadBalancerMethod, error) {
|
||||||
if loadBalancer != nil {
|
if loadBalancer != nil {
|
||||||
for i, name := range loadBalancerMethodNames {
|
for i, name := range loadBalancerMethodNames {
|
||||||
|
@ -67,14 +68,16 @@ func NewLoadBalancerMethod(loadBalancer *LoadBalancer) (LoadBalancerMethod, erro
|
||||||
return Wrr, ErrInvalidLoadBalancerMethod
|
return Wrr, ErrInvalidLoadBalancerMethod
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ErrInvalidLoadBalancerMethod is thrown when the specified load balancing method is invalid.
|
||||||
var ErrInvalidLoadBalancerMethod = errors.New("Invalid method, using default")
|
var ErrInvalidLoadBalancerMethod = errors.New("Invalid method, using default")
|
||||||
|
|
||||||
// Configuration of a provider
|
// Configuration of a provider.
|
||||||
type Configuration struct {
|
type Configuration struct {
|
||||||
Backends map[string]*Backend `json:"backends,omitempty"`
|
Backends map[string]*Backend `json:"backends,omitempty"`
|
||||||
Frontends map[string]*Frontend `json:"frontends,omitempty"`
|
Frontends map[string]*Frontend `json:"frontends,omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ConfigMessage hold configuration information exchanged between parts of traefik.
|
||||||
type ConfigMessage struct {
|
type ConfigMessage struct {
|
||||||
ProviderName string
|
ProviderName string
|
||||||
Configuration *Configuration
|
Configuration *Configuration
|
||||||
|
|
Loading…
Reference in a new issue