fix route provider name

This commit is contained in:
yusing 2025-01-12 13:49:47 +08:00
parent e5a32d4982
commit 8aa831804b
7 changed files with 45 additions and 31 deletions

View file

@ -59,6 +59,8 @@ func List(cfg config.ConfigInstance, w http.ResponseWriter, r *http.Request) {
} }
} }
// if which is "all" or empty, return map[string]Route of all routes
// otherwise, return a single Route with alias which or nil if not found.
func listRoute(which string) any { func listRoute(which string) any {
if which == "" || which == "all" { if which == "" || which == "all" {
return routes.RoutesByAlias() return routes.RoutesByAlias()

View file

@ -269,9 +269,9 @@ func (cfg *Config) loadRouteProviders(providers *types.Providers) E.Error {
errs.Add(E.PrependSubject(filename, err)) errs.Add(E.PrependSubject(filename, err))
continue continue
} }
cfg.providers.Store(p.GetName(), p) cfg.providers.Store(p.String(), p)
if len(p.GetName()) > lenLongestName { if len(p.String()) > lenLongestName {
lenLongestName = len(p.GetName()) lenLongestName = len(p.String())
} }
} }
for name, dockerHost := range providers.Docker { for name, dockerHost := range providers.Docker {
@ -280,16 +280,16 @@ func (cfg *Config) loadRouteProviders(providers *types.Providers) E.Error {
errs.Add(E.PrependSubject(name, err)) errs.Add(E.PrependSubject(name, err))
continue continue
} }
cfg.providers.Store(p.GetName(), p) cfg.providers.Store(p.String(), p)
if len(p.GetName()) > lenLongestName { if len(p.String()) > lenLongestName {
lenLongestName = len(p.GetName()) lenLongestName = len(p.String())
} }
} }
cfg.providers.RangeAllParallel(func(_ string, p *proxy.Provider) { cfg.providers.RangeAllParallel(func(_ string, p *proxy.Provider) {
if err := p.LoadRoutes(); err != nil { if err := p.LoadRoutes(); err != nil {
errs.Add(err.Subject(p.String())) errs.Add(err.Subject(p.String()))
} }
results.Addf("%-"+strconv.Itoa(lenLongestName)+"s %d routes", p.GetName(), p.NumRoutes()) results.Addf("%-"+strconv.Itoa(lenLongestName)+"s %d routes", p.String(), p.NumRoutes())
}) })
logger.Info().Msg(results.String()) logger.Info().Msg(results.String())
return errs.Error() return errs.Error()

View file

@ -18,8 +18,8 @@ func (cfg *Config) DumpEntries() map[string]*types.RawEntry {
func (cfg *Config) DumpProviders() map[string]*provider.Provider { func (cfg *Config) DumpProviders() map[string]*provider.Provider {
entries := make(map[string]*provider.Provider) entries := make(map[string]*provider.Provider)
cfg.providers.RangeAll(func(name string, p *provider.Provider) { cfg.providers.RangeAll(func(_ string, p *provider.Provider) {
entries[name] = p entries[p.ShortName()] = p
}) })
return entries return entries
} }
@ -29,9 +29,9 @@ func (cfg *Config) Statistics() map[string]any {
nTotalRPs := 0 nTotalRPs := 0
providerStats := make(map[string]provider.ProviderStats) providerStats := make(map[string]provider.ProviderStats)
cfg.providers.RangeAll(func(name string, p *provider.Provider) { cfg.providers.RangeAll(func(_ string, p *provider.Provider) {
stats := p.Statistics() stats := p.Statistics()
providerStats[name] = stats providerStats[p.ShortName()] = stats
nTotalRPs += stats.NumRPs nTotalRPs += stats.NumRPs
nTotalStreams += stats.NumStreams nTotalStreams += stats.NumStreams

View file

@ -19,7 +19,6 @@ import (
type DockerProvider struct { type DockerProvider struct {
name, dockerHost string name, dockerHost string
ExplicitOnly bool
l zerolog.Logger l zerolog.Logger
} }
@ -30,14 +29,13 @@ const (
var ErrAliasRefIndexOutOfRange = E.New("index out of range") var ErrAliasRefIndexOutOfRange = E.New("index out of range")
func DockerProviderImpl(name, dockerHost string, explicitOnly bool) (ProviderImpl, error) { func DockerProviderImpl(name, dockerHost string) (ProviderImpl, error) {
if dockerHost == common.DockerHostFromEnv { if dockerHost == common.DockerHostFromEnv {
dockerHost = common.GetEnvString("DOCKER_HOST", client.DefaultDockerHost) dockerHost = common.GetEnvString("DOCKER_HOST", client.DefaultDockerHost)
} }
return &DockerProvider{ return &DockerProvider{
name, name,
dockerHost, dockerHost,
explicitOnly,
logger.With().Str("type", "docker").Str("name", name).Logger(), logger.With().Str("type", "docker").Str("name", name).Logger(),
}, nil }, nil
} }
@ -46,6 +44,14 @@ func (p *DockerProvider) String() string {
return "docker@" + p.name return "docker@" + p.name
} }
func (p *DockerProvider) ShortName() string {
return p.name
}
func (p *DockerProvider) IsExplicitOnly() bool {
return p.name[len(p.name)-1] == '!'
}
func (p *DockerProvider) Logger() *zerolog.Logger { func (p *DockerProvider) Logger() *zerolog.Logger {
return &p.l return &p.l
} }
@ -92,7 +98,7 @@ func (p *DockerProvider) loadRoutesImpl() (route.Routes, E.Error) {
func (p *DockerProvider) shouldIgnore(container *docker.Container) bool { func (p *DockerProvider) shouldIgnore(container *docker.Container) bool {
return container.IsExcluded || return container.IsExcluded ||
!container.IsExplicit && p.ExplicitOnly || !container.IsExplicit && p.IsExplicitOnly() ||
!container.IsExplicit && container.IsDatabase || !container.IsExplicit && container.IsDatabase ||
strings.HasSuffix(container.ContainerName, "-old") strings.HasSuffix(container.ContainerName, "-old")
} }

View file

@ -39,6 +39,12 @@ func makeEntries(cont *types.Container, dockerHostIP ...string) route.RawEntries
return entries return entries
} }
func TestExplicitOnly(t *testing.T) {
p, err := NewDockerProvider("a!", "")
ExpectNoError(t, err)
ExpectTrue(t, p.IsExplicitOnly())
}
func TestApplyLabel(t *testing.T) { func TestApplyLabel(t *testing.T) {
pathPatterns := ` pathPatterns := `
- / - /

View file

@ -3,6 +3,7 @@ package provider
import ( import (
"os" "os"
"path" "path"
"strings"
"github.com/rs/zerolog" "github.com/rs/zerolog"
"github.com/yusing/go-proxy/internal/common" "github.com/yusing/go-proxy/internal/common"
@ -48,6 +49,14 @@ func (p *FileProvider) String() string {
return p.fileName return p.fileName
} }
func (p *FileProvider) ShortName() string {
return strings.Split(p.fileName, ".")[0]
}
func (p *FileProvider) IsExplicitOnly() bool {
return false
}
func (p *FileProvider) Logger() *zerolog.Logger { func (p *FileProvider) Logger() *zerolog.Logger {
return &p.l return &p.l
} }

View file

@ -4,7 +4,6 @@ import (
"errors" "errors"
"fmt" "fmt"
"path" "path"
"strings"
"time" "time"
"github.com/rs/zerolog" "github.com/rs/zerolog"
@ -21,7 +20,6 @@ type (
Provider struct { Provider struct {
ProviderImpl `json:"-"` ProviderImpl `json:"-"`
name string
t types.ProviderType t types.ProviderType
routes R.Routes routes R.Routes
@ -29,6 +27,8 @@ type (
} }
ProviderImpl interface { ProviderImpl interface {
fmt.Stringer fmt.Stringer
ShortName() string
IsExplicitOnly() bool
loadRoutesImpl() (R.Routes, E.Error) loadRoutesImpl() (R.Routes, E.Error)
NewWatcher() W.Watcher NewWatcher() W.Watcher
Logger() *zerolog.Logger Logger() *zerolog.Logger
@ -46,9 +46,8 @@ const (
var ErrEmptyProviderName = errors.New("empty provider name") var ErrEmptyProviderName = errors.New("empty provider name")
func newProvider(name string, t types.ProviderType) *Provider { func newProvider(t types.ProviderType) *Provider {
return &Provider{ return &Provider{
name: name,
t: t, t: t,
routes: R.NewRoutes(), routes: R.NewRoutes(),
} }
@ -59,7 +58,7 @@ func NewFileProvider(filename string) (p *Provider, err error) {
if name == "" { if name == "" {
return nil, ErrEmptyProviderName return nil, ErrEmptyProviderName
} }
p = newProvider(strings.ReplaceAll(name, ".", "_"), types.ProviderTypeFile) p = newProvider(types.ProviderTypeFile)
p.ProviderImpl, err = FileProviderImpl(filename) p.ProviderImpl, err = FileProviderImpl(filename)
if err != nil { if err != nil {
return nil, err return nil, err
@ -73,8 +72,8 @@ func NewDockerProvider(name string, dockerHost string) (p *Provider, err error)
return nil, ErrEmptyProviderName return nil, ErrEmptyProviderName
} }
p = newProvider(name, types.ProviderTypeDocker) p = newProvider(types.ProviderTypeDocker)
p.ProviderImpl, err = DockerProviderImpl(name, dockerHost, p.IsExplicitOnly()) p.ProviderImpl, err = DockerProviderImpl(name, dockerHost)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@ -82,14 +81,6 @@ func NewDockerProvider(name string, dockerHost string) (p *Provider, err error)
return return
} }
func (p *Provider) IsExplicitOnly() bool {
return p.name[len(p.name)-1] == '!'
}
func (p *Provider) GetName() string {
return p.name
}
func (p *Provider) GetType() types.ProviderType { func (p *Provider) GetType() types.ProviderType {
return p.t return p.t
} }
@ -111,7 +102,7 @@ func (p *Provider) startRoute(parent task.Parent, r *R.Route) E.Error {
// Start implements task.TaskStarter. // Start implements task.TaskStarter.
func (p *Provider) Start(parent task.Parent) E.Error { func (p *Provider) Start(parent task.Parent) E.Error {
t := parent.Subtask("provider."+p.name, false) t := parent.Subtask("provider."+p.String(), false)
// routes and event queue will stop on config reload // routes and event queue will stop on config reload
errs := p.routes.CollectErrorsParallel( errs := p.routes.CollectErrorsParallel(