make discovery easier
This commit is contained in:
parent
9f42c8f5bc
commit
0bbc792882
|
@ -0,0 +1,47 @@
|
||||||
|
package discovery
|
||||||
|
|
||||||
|
import (
|
||||||
|
"net/url"
|
||||||
|
"os"
|
||||||
|
)
|
||||||
|
|
||||||
|
var Default = NewService()
|
||||||
|
|
||||||
|
type Provider interface {
|
||||||
|
Discover(serviceUrn string) (*url.URL, error)
|
||||||
|
}
|
||||||
|
|
||||||
|
type Service struct {
|
||||||
|
token string
|
||||||
|
providers []Provider
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *Service) Discover(serviceUrn string) (*url.URL, error) {
|
||||||
|
for idx := range s.providers {
|
||||||
|
provider := s.providers[idx]
|
||||||
|
u, err := provider.Discover(serviceUrn)
|
||||||
|
if err == nil {
|
||||||
|
return u, nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil, os.ErrNotExist
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *Service) WithToken(token string) *Service {
|
||||||
|
s.token = token
|
||||||
|
return s
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *Service) WithProvider(provider Provider) *Service {
|
||||||
|
s.providers = append(s.providers, provider)
|
||||||
|
return s
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewService() *Service {
|
||||||
|
return &Service{
|
||||||
|
providers: []Provider{
|
||||||
|
NewLocalDiscovery(),
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,3 @@
|
||||||
|
{
|
||||||
|
"test.service": "http://user:password@localhost:8888/test/path"
|
||||||
|
}
|
|
@ -0,0 +1,23 @@
|
||||||
|
package discovery
|
||||||
|
|
||||||
|
import (
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"github.com/stretchr/testify/assert"
|
||||||
|
"github.com/stretchr/testify/require"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestDiscovery(t *testing.T) {
|
||||||
|
discovery := NewService()
|
||||||
|
|
||||||
|
url, err := discovery.Discover("unknown.service")
|
||||||
|
assert.Error(t, err)
|
||||||
|
assert.Nil(t, url)
|
||||||
|
|
||||||
|
url, err = discovery.Discover("test.service")
|
||||||
|
assert.NoError(t, err)
|
||||||
|
require.NotNil(t, url)
|
||||||
|
assert.Equal(t, "localhost", url.Hostname())
|
||||||
|
assert.Equal(t, "8888", url.Port())
|
||||||
|
assert.Equal(t, "/test/path", url.Path)
|
||||||
|
}
|
|
@ -0,0 +1,58 @@
|
||||||
|
package discovery
|
||||||
|
|
||||||
|
import (
|
||||||
|
"net/url"
|
||||||
|
"os"
|
||||||
|
"path"
|
||||||
|
|
||||||
|
"git.twelvetwelve.org/library/core/json"
|
||||||
|
)
|
||||||
|
|
||||||
|
type LocalDiscovery struct {
|
||||||
|
}
|
||||||
|
|
||||||
|
func lookup(kv map[string]string, serviceUrn string) *url.URL {
|
||||||
|
rawURL, ok := kv[serviceUrn]
|
||||||
|
if !ok {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
u, err := url.Parse(rawURL)
|
||||||
|
if err != nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
return u
|
||||||
|
}
|
||||||
|
|
||||||
|
func lookupFrom(path string, serviceUrn string) *url.URL {
|
||||||
|
services := make(map[string]string)
|
||||||
|
err := json.ReadFromFile(path, &services)
|
||||||
|
if err != nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
return lookup(services, serviceUrn)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (ld *LocalDiscovery) Discover(serviceUrn string) (*url.URL, error) {
|
||||||
|
if url := lookupFrom("discovery.json", serviceUrn); url != nil {
|
||||||
|
return url, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
home, err := os.UserHomeDir()
|
||||||
|
if err != nil {
|
||||||
|
homeConf := path.Join(home, ".config", "discovery.json")
|
||||||
|
if url := lookupFrom(homeConf, serviceUrn); url != nil {
|
||||||
|
return url, nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if url := lookupFrom("/etc/discovery/discovery.json", serviceUrn); url != nil {
|
||||||
|
return url, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil, os.ErrNotExist
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewLocalDiscovery() *LocalDiscovery {
|
||||||
|
return &LocalDiscovery{}
|
||||||
|
}
|
Loading…
Reference in New Issue