From 8f6ba4a56e06db64c97bc708e0329868eccfac0c Mon Sep 17 00:00:00 2001 From: ben-toogood Date: Wed, 7 Oct 2020 12:25:50 +0100 Subject: [PATCH] Kubernetes Router (#2036) --- router/kubernetes/kubernetes.go | 113 ++++++++++++++++++++++++++++++++ 1 file changed, 113 insertions(+) create mode 100644 router/kubernetes/kubernetes.go diff --git a/router/kubernetes/kubernetes.go b/router/kubernetes/kubernetes.go new file mode 100644 index 00000000..9c4fcf92 --- /dev/null +++ b/router/kubernetes/kubernetes.go @@ -0,0 +1,113 @@ +// Package kubernetes is a kubernetes router which uses the service name and network to route +package kubernetes + +import ( + "fmt" + + "github.com/micro/go-micro/v3/router" +) + +// NewRouter returns an initialized kubernetes router +func NewRouter(opts ...router.Option) router.Router { + options := router.DefaultOptions() + for _, o := range opts { + o(&options) + } + return &kubernetes{options} +} + +type kubernetes struct { + options router.Options +} + +func (k *kubernetes) Init(opts ...router.Option) error { + for _, o := range opts { + o(&k.options) + } + return nil +} + +func (k *kubernetes) Options() router.Options { + return k.options +} + +func (k *kubernetes) Table() router.Table { + return new(table) +} + +func (k *kubernetes) Lookup(service string, opts ...router.LookupOption) ([]router.Route, error) { + options := router.NewLookup(opts...) + if len(options.Network) == 0 { + options.Network = "micro" + } + + address := fmt.Sprintf("%v.%v.svc.cluster.local:8080", service, options.Network) + + return []router.Route{ + router.Route{ + Service: service, + Address: address, + Gateway: options.Gateway, + Network: options.Network, + Router: options.Router, + }, + }, nil +} + +// Watch will return a noop watcher +func (k *kubernetes) Watch(opts ...router.WatchOption) (router.Watcher, error) { + return &watcher{ + events: make(chan *router.Event), + }, nil +} + +func (k *kubernetes) Close() error { + return nil +} + +func (k *kubernetes) String() string { + return "kubernetes" +} + +// watcher is a noop implementation +type watcher struct { + events chan *router.Event +} + +// Next is a blocking call that returns watch result +func (w *watcher) Next() (*router.Event, error) { + e := <-w.events + return e, nil +} + +// Chan returns event channel +func (w *watcher) Chan() (<-chan *router.Event, error) { + return w.events, nil +} + +// Stop stops watcher +func (w *watcher) Stop() { + return +} + +type table struct{} + +// Create new route in the routing table +func (t *table) Create(router.Route) error { + return nil +} + +// Delete existing route from the routing table +func (t *table) Delete(router.Route) error { + return nil +} + +// Update route in the routing table +func (t *table) Update(router.Route) error { + return nil +} + +// Read is for querying the table +func (t *table) Read(...router.ReadOption) ([]router.Route, error) { + return []router.Route{}, nil +}