mirror of
https://github.com/yusing/godoxy.git
synced 2026-04-21 08:21:51 +02:00
fixes, meaningful error messages and new features
This commit is contained in:
@@ -1,15 +1,14 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"sync"
|
||||
|
||||
"github.com/sirupsen/logrus"
|
||||
)
|
||||
|
||||
type Provider struct {
|
||||
Kind string // docker, file
|
||||
Value string
|
||||
Kind string `json:"kind"` // docker, file
|
||||
Value string `json:"value"`
|
||||
|
||||
watcher Watcher
|
||||
routes map[string]Route // id -> Route
|
||||
@@ -20,12 +19,12 @@ type Provider struct {
|
||||
// Init is called after LoadProxyConfig
|
||||
func (p *Provider) Init(name string) error {
|
||||
p.l = prlog.WithFields(logrus.Fields{"kind": p.Kind, "name": name})
|
||||
defer p.initWatcher()
|
||||
|
||||
if err := p.loadProxyConfig(); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
p.initWatcher()
|
||||
return nil
|
||||
}
|
||||
|
||||
@@ -37,7 +36,7 @@ func (p *Provider) StartAllRoutes() {
|
||||
func (p *Provider) StopAllRoutes() {
|
||||
p.watcher.Stop()
|
||||
ParallelForEachValue(p.routes, Route.Stop)
|
||||
p.routes = make(map[string]Route)
|
||||
p.routes = nil
|
||||
}
|
||||
|
||||
func (p *Provider) ReloadRoutes() {
|
||||
@@ -54,17 +53,17 @@ func (p *Provider) ReloadRoutes() {
|
||||
}
|
||||
|
||||
func (p *Provider) loadProxyConfig() error {
|
||||
var cfgs []*ProxyConfig
|
||||
var cfgs ProxyConfigSlice
|
||||
var err error
|
||||
|
||||
switch p.Kind {
|
||||
case ProviderKind_Docker:
|
||||
cfgs, err = p.getDockerProxyConfigs()
|
||||
case ProviderKind_File:
|
||||
cfgs, err = p.getFileProxyConfigs()
|
||||
cfgs, err = p.ValidateFile()
|
||||
default:
|
||||
// this line should never be reached
|
||||
return fmt.Errorf("unknown provider kind")
|
||||
return NewNestedError("unknown provider kind")
|
||||
}
|
||||
|
||||
if err != nil {
|
||||
@@ -73,29 +72,34 @@ func (p *Provider) loadProxyConfig() error {
|
||||
p.l.Infof("loaded %d proxy configurations", len(cfgs))
|
||||
|
||||
p.routes = make(map[string]Route, len(cfgs))
|
||||
pErrs := NewNestedError("failed to create these routes")
|
||||
|
||||
for _, cfg := range cfgs {
|
||||
r, err := NewRoute(cfg)
|
||||
r, err := NewRoute(&cfg)
|
||||
if err != nil {
|
||||
p.l.Errorf("error creating route %s: %v", cfg.Alias, err)
|
||||
pErrs.ExtraError(NewNestedErrorFrom(err).Subject(cfg.Alias))
|
||||
continue
|
||||
}
|
||||
p.routes[cfg.GetID()] = r
|
||||
}
|
||||
|
||||
if pErrs.HasExtras() {
|
||||
p.routes = nil
|
||||
return pErrs
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (p *Provider) initWatcher() error {
|
||||
switch p.Kind {
|
||||
case ProviderKind_Docker:
|
||||
var err error
|
||||
dockerClient, err := p.getDockerClient()
|
||||
if err != nil {
|
||||
return fmt.Errorf("unable to create docker client: %v", err)
|
||||
return NewNestedError("unable to create docker client").With(err)
|
||||
}
|
||||
p.watcher = NewDockerWatcher(dockerClient, p.ReloadRoutes)
|
||||
case ProviderKind_File:
|
||||
p.watcher = NewFileWatcher(p.Value, p.ReloadRoutes, p.StopAllRoutes)
|
||||
p.watcher = NewFileWatcher(p.GetFilePath(), p.ReloadRoutes, p.StopAllRoutes)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user