Skip to content

Commit

Permalink
support grpc and http services with same name
Browse files Browse the repository at this point in the history
  • Loading branch information
gmgigi96 committed Jun 28, 2023
1 parent 4c54f09 commit 3f2f8b2
Show file tree
Hide file tree
Showing 3 changed files with 17 additions and 18 deletions.
31 changes: 15 additions & 16 deletions cmd/revad/pkg/config/common.go
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,6 @@ import (
"fmt"

"github.com/mitchellh/mapstructure"
"github.com/pkg/errors"
)

type iterable interface {
Expand All @@ -46,46 +45,46 @@ type DriverConfig struct {
Label string `key:"-"`
}

func (s *ServicesConfig) Add(svc string, c *DriverConfig) {
func (s *ServicesConfig) Add(domain, svc string, c *DriverConfig) {
l := len(*s)
if l == 0 {
// the label is simply the service name
c.Label = svc
c.Label = domain + "_" + svc
} else {
c.Label = label(svc, l)
c.Label = label(domain, svc, l)
if l == 1 {
(*s)[0].Label = label(svc, 0)
(*s)[0].Label = label(domain, svc, 0)
}
}
*s = append(*s, c)
}

func newSvcConfigFromList(name string, l []map[string]any) (ServicesConfig, error) {
func newSvcConfigFromList(domain, name string, l []map[string]any) (ServicesConfig, error) {
cfg := make(ServicesConfig, 0, len(l))
for _, c := range l {
cfg.Add(name, &DriverConfig{Config: c})
cfg.Add(domain, name, &DriverConfig{Config: c})
}
return cfg, nil
}

func newSvcConfigFromMap(name string, m map[string]any) ServicesConfig {
s, _ := newSvcConfigFromList(name, []map[string]any{m})
func newSvcConfigFromMap(domain, name string, m map[string]any) ServicesConfig {
s, _ := newSvcConfigFromList(domain, name, []map[string]any{m})
return s
}

func parseServices(cfg map[string]any) (map[string]ServicesConfig, error) {
func parseServices(domain string, cfg map[string]any) (map[string]ServicesConfig, error) {
// parse services
svcCfg, ok := cfg["services"].(map[string]any)
if !ok {
return nil, errors.New("grpc.services must be a map")
return nil, fmt.Errorf("%s.services must be a map", domain)
}

services := make(map[string]ServicesConfig)
for name, cfg := range svcCfg {
// cfg can be a list or a map
cfgLst, ok := cfg.([]map[string]any)
if ok {
s, err := newSvcConfigFromList(name, cfgLst)
s, err := newSvcConfigFromList(domain, name, cfgLst)
if err != nil {
return nil, err
}
Expand All @@ -94,9 +93,9 @@ func parseServices(cfg map[string]any) (map[string]ServicesConfig, error) {
}
cfgMap, ok := cfg.(map[string]any)
if !ok {
return nil, fmt.Errorf("grpc.services.%s must be a list or a map. got %T", name, cfg)
return nil, fmt.Errorf("%s.services.%s must be a list or a map. got %T", domain, name, cfg)
}
services[name] = newSvcConfigFromMap(name, cfgMap)
services[name] = newSvcConfigFromMap(domain, name, cfgMap)
}

return services, nil
Expand Down Expand Up @@ -166,8 +165,8 @@ func (i iterableImpl) ForEachService(f ServiceFunc) {
}
}

func label(name string, i int) string {
return fmt.Sprintf("%s_%d", name, i)
func label(domain, name string, i int) string {
return fmt.Sprintf("%s_%s_%d", domain, name, i)
}

// ForEachInterceptor iterates to each middleware calling the function f.
Expand Down
2 changes: 1 addition & 1 deletion cmd/revad/pkg/config/grpc.go
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@ func (c *Config) parseGRPC(raw map[string]any) error {
return errors.New("grpc must be a map")
}

services, err := parseServices(cfgGRPC)
services, err := parseServices("grpc", cfgGRPC)
if err != nil {
return err
}
Expand Down
2 changes: 1 addition & 1 deletion cmd/revad/pkg/config/http.go
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@ func (c *Config) parseHTTP(raw map[string]any) error {
return errors.New("http must be a map")
}

services, err := parseServices(cfgHTTP)
services, err := parseServices("http", cfgHTTP)
if err != nil {
return err
}
Expand Down

0 comments on commit 3f2f8b2

Please sign in to comment.