Linting provider package
Signed-off-by: Vincent Demeester <vincent@sbr.pm>
This commit is contained in:
parent
9387235a04
commit
89bb1ae835
9 changed files with 84 additions and 48 deletions
|
@ -2,6 +2,7 @@ package provider
|
|||
|
||||
import "github.com/emilevauge/traefik/types"
|
||||
|
||||
// BoltDb holds configurations of the BoltDb provider.
|
||||
type BoltDb struct {
|
||||
Watch bool
|
||||
Endpoint string
|
||||
|
@ -10,6 +11,8 @@ type BoltDb struct {
|
|||
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 {
|
||||
provider.KvProvider = NewBoltDbProvider(provider)
|
||||
return provider.KvProvider.provide(configurationChan)
|
||||
|
|
|
@ -2,6 +2,7 @@ package provider
|
|||
|
||||
import "github.com/emilevauge/traefik/types"
|
||||
|
||||
// Consul holds configurations of the Consul provider.
|
||||
type Consul struct {
|
||||
Watch bool
|
||||
Endpoint string
|
||||
|
@ -10,6 +11,8 @@ type Consul struct {
|
|||
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 {
|
||||
provider.KvProvider = NewConsulProvider(provider)
|
||||
return provider.KvProvider.provide(configurationChan)
|
||||
|
|
|
@ -18,6 +18,7 @@ import (
|
|||
"github.com/fsouza/go-dockerclient"
|
||||
)
|
||||
|
||||
// Docker holds configurations of the Docker provider.
|
||||
type Docker struct {
|
||||
Watch bool
|
||||
Endpoint string
|
||||
|
@ -25,51 +26,54 @@ type Docker struct {
|
|||
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 {
|
||||
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)
|
||||
return err
|
||||
} else {
|
||||
err := dockerClient.Ping()
|
||||
if err != nil {
|
||||
log.Errorf("Docker connection error %+v", err)
|
||||
return err
|
||||
}
|
||||
log.Debug("Docker connection established")
|
||||
if provider.Watch {
|
||||
dockerEvents := make(chan *docker.APIEvents)
|
||||
dockerClient.AddEventListener(dockerEvents)
|
||||
log.Debug("Docker listening")
|
||||
go func() {
|
||||
operation := func() error {
|
||||
for {
|
||||
event := <-dockerEvents
|
||||
if event == nil {
|
||||
return errors.New("Docker event nil")
|
||||
// log.Fatalf("Docker connection error")
|
||||
}
|
||||
if event.Status == "start" || event.Status == "die" {
|
||||
log.Debugf("Docker event receveived %+v", event)
|
||||
configuration := provider.loadDockerConfig(dockerClient)
|
||||
if configuration != nil {
|
||||
configurationChan <- types.ConfigMessage{"docker", configuration}
|
||||
}
|
||||
}
|
||||
err = dockerClient.Ping()
|
||||
if err != nil {
|
||||
log.Errorf("Docker connection error %+v", err)
|
||||
return err
|
||||
}
|
||||
log.Debug("Docker connection established")
|
||||
if provider.Watch {
|
||||
dockerEvents := make(chan *docker.APIEvents)
|
||||
dockerClient.AddEventListener(dockerEvents)
|
||||
log.Debug("Docker listening")
|
||||
go func() {
|
||||
operation := func() error {
|
||||
for {
|
||||
event := <-dockerEvents
|
||||
if event == nil {
|
||||
return errors.New("Docker event nil")
|
||||
// log.Fatalf("Docker connection error")
|
||||
}
|
||||
if event.Status == "start" || event.Status == "die" {
|
||||
log.Debugf("Docker event receveived %+v", event)
|
||||
configuration := provider.loadDockerConfig(dockerClient)
|
||||
if configuration != nil {
|
||||
configurationChan <- types.ConfigMessage{"docker", configuration}
|
||||
}
|
||||
}
|
||||
}
|
||||
notify := func(err error, time time.Duration) {
|
||||
log.Errorf("Docker connection error %+v, retrying in %s", err, time)
|
||||
}
|
||||
err := backoff.RetryNotify(operation, backoff.NewExponentialBackOff(), notify)
|
||||
if err != nil {
|
||||
log.Fatalf("Cannot connect to docker server %+v", err)
|
||||
}
|
||||
}()
|
||||
}
|
||||
|
||||
configuration := provider.loadDockerConfig(dockerClient)
|
||||
configurationChan <- types.ConfigMessage{"docker", configuration}
|
||||
}
|
||||
notify := func(err error, time time.Duration) {
|
||||
log.Errorf("Docker connection error %+v, retrying in %s", err, time)
|
||||
}
|
||||
err := backoff.RetryNotify(operation, backoff.NewExponentialBackOff(), notify)
|
||||
if err != nil {
|
||||
log.Fatalf("Cannot connect to docker server %+v", err)
|
||||
}
|
||||
}()
|
||||
}
|
||||
|
||||
configuration := provider.loadDockerConfig(dockerClient)
|
||||
configurationChan <- types.ConfigMessage{"docker", configuration}
|
||||
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) {
|
||||
foundLabels := map[string]string{}
|
||||
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)
|
||||
} else {
|
||||
foundLabels[label] = foundLabel
|
||||
}
|
||||
foundLabels[label] = foundLabel
|
||||
}
|
||||
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 {
|
||||
if label, err := provider.getLabel(container, "traefik.frontend.value"); err == nil {
|
||||
return label
|
||||
|
@ -239,6 +245,8 @@ func (provider *Docker) GetFrontendValue(container docker.Container) string {
|
|||
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 {
|
||||
if label, err := provider.getLabel(container, "traefik.frontend.rule"); err == nil {
|
||||
return label
|
||||
|
|
|
@ -2,6 +2,7 @@ package provider
|
|||
|
||||
import "github.com/emilevauge/traefik/types"
|
||||
|
||||
// Etcd holds configurations of the Etcd provider.
|
||||
type Etcd struct {
|
||||
Watch bool
|
||||
Endpoint string
|
||||
|
@ -10,6 +11,8 @@ type Etcd struct {
|
|||
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 {
|
||||
provider.KvProvider = NewEtcdProvider(provider)
|
||||
return provider.KvProvider.provide(configurationChan)
|
||||
|
|
|
@ -11,11 +11,14 @@ import (
|
|||
"gopkg.in/fsnotify.v1"
|
||||
)
|
||||
|
||||
// File holds configurations of the File provider.
|
||||
type File struct {
|
||||
Watch bool
|
||||
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 {
|
||||
watcher, err := fsnotify.NewWatcher()
|
||||
if err != nil {
|
||||
|
@ -39,7 +42,7 @@ func (provider *File) Provide(configurationChan chan<- types.ConfigMessage) erro
|
|||
case event := <-watcher.Events:
|
||||
if strings.Contains(event.Name, file.Name()) {
|
||||
log.Debug("File event:", event)
|
||||
configuration := provider.LoadFileConfig(file.Name())
|
||||
configuration := provider.loadFileConfig(file.Name())
|
||||
if configuration != nil {
|
||||
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}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (provider *File) LoadFileConfig(filename string) *types.Configuration {
|
||||
func (provider *File) loadFileConfig(filename string) *types.Configuration {
|
||||
configuration := new(types.Configuration)
|
||||
if _, err := toml.DecodeFile(filename, configuration); err != nil {
|
||||
log.Error("Error reading file:", err)
|
||||
|
|
|
@ -1,6 +1,4 @@
|
|||
/*
|
||||
Copyright
|
||||
*/
|
||||
// Package provider holds the different provider implementation.
|
||||
package provider
|
||||
|
||||
import (
|
||||
|
@ -23,6 +21,7 @@ import (
|
|||
"github.com/emilevauge/traefik/types"
|
||||
)
|
||||
|
||||
// Kv holds common configurations of key-value providers.
|
||||
type Kv struct {
|
||||
Watch bool
|
||||
Endpoint string
|
||||
|
@ -32,6 +31,7 @@ type Kv struct {
|
|||
kvclient store.Store
|
||||
}
|
||||
|
||||
// NewConsulProvider returns a Consul provider.
|
||||
func NewConsulProvider(provider *Consul) *Kv {
|
||||
kvProvider := new(Kv)
|
||||
kvProvider.Watch = provider.Watch
|
||||
|
@ -42,6 +42,7 @@ func NewConsulProvider(provider *Consul) *Kv {
|
|||
return kvProvider
|
||||
}
|
||||
|
||||
// NewEtcdProvider returns a Etcd provider.
|
||||
func NewEtcdProvider(provider *Etcd) *Kv {
|
||||
kvProvider := new(Kv)
|
||||
kvProvider.Watch = provider.Watch
|
||||
|
@ -52,6 +53,7 @@ func NewEtcdProvider(provider *Etcd) *Kv {
|
|||
return kvProvider
|
||||
}
|
||||
|
||||
// NewZkProvider returns a Zookepper provider.
|
||||
func NewZkProvider(provider *Zookepper) *Kv {
|
||||
kvProvider := new(Kv)
|
||||
kvProvider.Watch = provider.Watch
|
||||
|
@ -62,6 +64,7 @@ func NewZkProvider(provider *Zookepper) *Kv {
|
|||
return kvProvider
|
||||
}
|
||||
|
||||
// NewBoltDbProvider returns a BoldDb provider.
|
||||
func NewBoltDbProvider(provider *BoltDb) *Kv {
|
||||
kvProvider := new(Kv)
|
||||
kvProvider.Watch = provider.Watch
|
||||
|
|
|
@ -15,15 +15,18 @@ import (
|
|||
"github.com/gambol99/go-marathon"
|
||||
)
|
||||
|
||||
// Marathon holds configuration of the Marathon provider.
|
||||
type Marathon struct {
|
||||
Watch bool
|
||||
Endpoint string
|
||||
marathonClient marathon.Marathon
|
||||
Domain string
|
||||
Filename 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 {
|
||||
config := marathon.NewDefaultConfig()
|
||||
config.URL = provider.Endpoint
|
||||
|
@ -238,6 +241,8 @@ func (provider *Marathon) getEscapedName(name string) string {
|
|||
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 {
|
||||
if label, err := provider.getLabel(application, "traefik.frontend.value"); err == nil {
|
||||
return label
|
||||
|
@ -245,6 +250,8 @@ func (provider *Marathon) GetFrontendValue(application marathon.Application) str
|
|||
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 {
|
||||
if label, err := provider.getLabel(application, "traefik.frontend.rule"); err == nil {
|
||||
return label
|
||||
|
|
|
@ -2,6 +2,9 @@ package provider
|
|||
|
||||
import "github.com/emilevauge/traefik/types"
|
||||
|
||||
// Provider defines methods of a provider.
|
||||
type Provider interface {
|
||||
// Provide allows the provider to provide configurations to traefik
|
||||
// using the given configuration channel.
|
||||
Provide(configurationChan chan<- types.ConfigMessage) error
|
||||
}
|
||||
|
|
|
@ -2,6 +2,7 @@ package provider
|
|||
|
||||
import "github.com/emilevauge/traefik/types"
|
||||
|
||||
// Zookepper holds configurations of the Zookepper provider.
|
||||
type Zookepper struct {
|
||||
Watch bool
|
||||
Endpoint string
|
||||
|
@ -10,6 +11,8 @@ type Zookepper struct {
|
|||
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 {
|
||||
provider.KvProvider = NewZkProvider(provider)
|
||||
return provider.KvProvider.provide(configurationChan)
|
||||
|
|
Loading…
Reference in a new issue