talos/pkg/client/resolver.go
Seán C McCord 3e0e01e2c3 fix: refactor client creation API
Create a new `client.New` to make external API systems easier to
construct.
A new type `client.OptionFunc` allows the client to be
extended with specific configuration.

This also makes a first pass at supporting multiple endpoints properly
by creating a custom grpc resolver.
(Proper load balancing support is still a TODO.)

Fixes #2093

Signed-off-by: Seán C McCord <ulexus@gmail.com>
2020-05-11 10:21:07 -07:00

66 lines
1.5 KiB
Go

// This Source Code Form is subject to the terms of the Mozilla Public
// License, v. 2.0. If a copy of the MPL was not distributed with this
// file, You can obtain one at http://mozilla.org/MPL/2.0/.
package client
import (
"fmt"
"strings"
"google.golang.org/grpc/resolver"
"github.com/talos-systems/talos/pkg/constants"
"github.com/talos-systems/talos/pkg/net"
)
func init() {
resolver.Register(&talosListResolverBuilder{})
}
const talosListResolverScheme = "taloslist"
type talosListResolverBuilder struct{}
// Build implements resolver.Builder.
func (b *talosListResolverBuilder) Build(target resolver.Target, cc resolver.ClientConn, opts resolver.BuildOptions) (resolver.Resolver, error) {
r := &talosListResolver{
target: target,
cc: cc,
}
r.start()
return r, nil
}
// Build implements resolver.Builder.
func (b *talosListResolverBuilder) Scheme() string {
return talosListResolverScheme
}
type talosListResolver struct {
target resolver.Target
cc resolver.ClientConn
}
func (r *talosListResolver) start() {
var addrs []resolver.Address // nolint: prealloc
for _, a := range strings.Split(r.target.Endpoint, ",") {
addrs = append(addrs, resolver.Address{
ServerName: a,
Addr: fmt.Sprintf("%s:%d", net.FormatAddress(a), constants.ApidPort),
})
}
r.cc.UpdateState(resolver.State{
Addresses: addrs,
})
}
// ResolveNow implements resolver.Resolver.
func (r *talosListResolver) ResolveNow(o resolver.ResolveNowOptions) {}
// ResolveNow implements resolver.Resolver.
func (r *talosListResolver) Close() {}