mirror of
https://github.com/siderolabs/talos.git
synced 2025-09-04 05:21:12 +02:00
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>
66 lines
1.5 KiB
Go
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() {}
|