From 8aa831804bc838c512023a3a0664874928d917b3 Mon Sep 17 00:00:00 2001 From: yusing Date: Sun, 12 Jan 2025 13:49:47 +0800 Subject: [PATCH] fix route provider name --- internal/api/v1/list.go | 2 ++ internal/config/config.go | 14 +++++++------- internal/config/query.go | 8 ++++---- internal/route/provider/docker.go | 14 ++++++++++---- internal/route/provider/docker_test.go | 6 ++++++ internal/route/provider/file.go | 9 +++++++++ internal/route/provider/provider.go | 23 +++++++---------------- 7 files changed, 45 insertions(+), 31 deletions(-) diff --git a/internal/api/v1/list.go b/internal/api/v1/list.go index 52617b4..08fb8bd 100644 --- a/internal/api/v1/list.go +++ b/internal/api/v1/list.go @@ -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 { if which == "" || which == "all" { return routes.RoutesByAlias() diff --git a/internal/config/config.go b/internal/config/config.go index da9b89e..6a18c23 100644 --- a/internal/config/config.go +++ b/internal/config/config.go @@ -269,9 +269,9 @@ func (cfg *Config) loadRouteProviders(providers *types.Providers) E.Error { errs.Add(E.PrependSubject(filename, err)) continue } - cfg.providers.Store(p.GetName(), p) - if len(p.GetName()) > lenLongestName { - lenLongestName = len(p.GetName()) + cfg.providers.Store(p.String(), p) + if len(p.String()) > lenLongestName { + lenLongestName = len(p.String()) } } 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)) continue } - cfg.providers.Store(p.GetName(), p) - if len(p.GetName()) > lenLongestName { - lenLongestName = len(p.GetName()) + cfg.providers.Store(p.String(), p) + if len(p.String()) > lenLongestName { + lenLongestName = len(p.String()) } } cfg.providers.RangeAllParallel(func(_ string, p *proxy.Provider) { if err := p.LoadRoutes(); err != nil { 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()) return errs.Error() diff --git a/internal/config/query.go b/internal/config/query.go index a3533f3..fe2755c 100644 --- a/internal/config/query.go +++ b/internal/config/query.go @@ -18,8 +18,8 @@ func (cfg *Config) DumpEntries() map[string]*types.RawEntry { func (cfg *Config) DumpProviders() map[string]*provider.Provider { entries := make(map[string]*provider.Provider) - cfg.providers.RangeAll(func(name string, p *provider.Provider) { - entries[name] = p + cfg.providers.RangeAll(func(_ string, p *provider.Provider) { + entries[p.ShortName()] = p }) return entries } @@ -29,9 +29,9 @@ func (cfg *Config) Statistics() map[string]any { nTotalRPs := 0 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() - providerStats[name] = stats + providerStats[p.ShortName()] = stats nTotalRPs += stats.NumRPs nTotalStreams += stats.NumStreams diff --git a/internal/route/provider/docker.go b/internal/route/provider/docker.go index 4a42dbd..1269c00 100755 --- a/internal/route/provider/docker.go +++ b/internal/route/provider/docker.go @@ -19,7 +19,6 @@ import ( type DockerProvider struct { name, dockerHost string - ExplicitOnly bool l zerolog.Logger } @@ -30,14 +29,13 @@ const ( 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 { dockerHost = common.GetEnvString("DOCKER_HOST", client.DefaultDockerHost) } return &DockerProvider{ name, dockerHost, - explicitOnly, logger.With().Str("type", "docker").Str("name", name).Logger(), }, nil } @@ -46,6 +44,14 @@ func (p *DockerProvider) String() string { 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 { return &p.l } @@ -92,7 +98,7 @@ func (p *DockerProvider) loadRoutesImpl() (route.Routes, E.Error) { func (p *DockerProvider) shouldIgnore(container *docker.Container) bool { return container.IsExcluded || - !container.IsExplicit && p.ExplicitOnly || + !container.IsExplicit && p.IsExplicitOnly() || !container.IsExplicit && container.IsDatabase || strings.HasSuffix(container.ContainerName, "-old") } diff --git a/internal/route/provider/docker_test.go b/internal/route/provider/docker_test.go index dfec243..0ffdfe7 100644 --- a/internal/route/provider/docker_test.go +++ b/internal/route/provider/docker_test.go @@ -39,6 +39,12 @@ func makeEntries(cont *types.Container, dockerHostIP ...string) route.RawEntries return entries } +func TestExplicitOnly(t *testing.T) { + p, err := NewDockerProvider("a!", "") + ExpectNoError(t, err) + ExpectTrue(t, p.IsExplicitOnly()) +} + func TestApplyLabel(t *testing.T) { pathPatterns := ` - / diff --git a/internal/route/provider/file.go b/internal/route/provider/file.go index a06a7f7..3098d53 100644 --- a/internal/route/provider/file.go +++ b/internal/route/provider/file.go @@ -3,6 +3,7 @@ package provider import ( "os" "path" + "strings" "github.com/rs/zerolog" "github.com/yusing/go-proxy/internal/common" @@ -48,6 +49,14 @@ func (p *FileProvider) String() string { 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 { return &p.l } diff --git a/internal/route/provider/provider.go b/internal/route/provider/provider.go index 89327da..d7702a4 100644 --- a/internal/route/provider/provider.go +++ b/internal/route/provider/provider.go @@ -4,7 +4,6 @@ import ( "errors" "fmt" "path" - "strings" "time" "github.com/rs/zerolog" @@ -21,7 +20,6 @@ type ( Provider struct { ProviderImpl `json:"-"` - name string t types.ProviderType routes R.Routes @@ -29,6 +27,8 @@ type ( } ProviderImpl interface { fmt.Stringer + ShortName() string + IsExplicitOnly() bool loadRoutesImpl() (R.Routes, E.Error) NewWatcher() W.Watcher Logger() *zerolog.Logger @@ -46,9 +46,8 @@ const ( var ErrEmptyProviderName = errors.New("empty provider name") -func newProvider(name string, t types.ProviderType) *Provider { +func newProvider(t types.ProviderType) *Provider { return &Provider{ - name: name, t: t, routes: R.NewRoutes(), } @@ -59,7 +58,7 @@ func NewFileProvider(filename string) (p *Provider, err error) { if name == "" { return nil, ErrEmptyProviderName } - p = newProvider(strings.ReplaceAll(name, ".", "_"), types.ProviderTypeFile) + p = newProvider(types.ProviderTypeFile) p.ProviderImpl, err = FileProviderImpl(filename) if err != nil { return nil, err @@ -73,8 +72,8 @@ func NewDockerProvider(name string, dockerHost string) (p *Provider, err error) return nil, ErrEmptyProviderName } - p = newProvider(name, types.ProviderTypeDocker) - p.ProviderImpl, err = DockerProviderImpl(name, dockerHost, p.IsExplicitOnly()) + p = newProvider(types.ProviderTypeDocker) + p.ProviderImpl, err = DockerProviderImpl(name, dockerHost) if err != nil { return nil, err } @@ -82,14 +81,6 @@ func NewDockerProvider(name string, dockerHost string) (p *Provider, err error) 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 { return p.t } @@ -111,7 +102,7 @@ func (p *Provider) startRoute(parent task.Parent, r *R.Route) E.Error { // Start implements task.TaskStarter. 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 errs := p.routes.CollectErrorsParallel(