Merge pull request #92 from vdemeester/linting-some-packages

Linting some packages
This commit is contained in:
Emile Vauge 2015-11-02 22:47:45 +01:00
commit 5ee6981410
14 changed files with 106 additions and 71 deletions

View file

@ -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}

View file

@ -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()
} }

View file

@ -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}
} }

View file

@ -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,

View file

@ -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)

View file

@ -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)

View file

@ -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

View file

@ -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)

View file

@ -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)

View file

@ -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

View file

@ -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

View file

@ -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
} }

View file

@ -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)

View file

@ -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