forked from TrueCloudLab/frostfs-api-go
v2: Add cross-service client package
Add package with cross-service client utilities for working with transport protocols and basic network types. Signed-off-by: Leonard Lyubich <leonard@nspcc.ru>
This commit is contained in:
parent
28d8acc58a
commit
9253dac753
2 changed files with 131 additions and 0 deletions
108
v2/client/options.go
Normal file
108
v2/client/options.go
Normal file
|
@ -0,0 +1,108 @@
|
||||||
|
package client
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"net"
|
||||||
|
|
||||||
|
"google.golang.org/grpc"
|
||||||
|
)
|
||||||
|
|
||||||
|
type Option func(*cfg)
|
||||||
|
|
||||||
|
type cfg struct {
|
||||||
|
addr string
|
||||||
|
|
||||||
|
conn net.Conn
|
||||||
|
|
||||||
|
gRPC cfgGRPC
|
||||||
|
}
|
||||||
|
|
||||||
|
type cfgGRPC struct {
|
||||||
|
dialCtx context.Context
|
||||||
|
|
||||||
|
dialOpts []grpc.DialOption
|
||||||
|
|
||||||
|
conn *grpc.ClientConn
|
||||||
|
}
|
||||||
|
|
||||||
|
func defaultCfg() *cfg {
|
||||||
|
return &cfg{
|
||||||
|
gRPC: cfgGRPC{
|
||||||
|
dialCtx: context.Background(),
|
||||||
|
dialOpts: []grpc.DialOption{
|
||||||
|
grpc.WithInsecure(),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewGRPCClientConn(opts ...Option) (*grpc.ClientConn, error) {
|
||||||
|
cfg := defaultCfg()
|
||||||
|
|
||||||
|
for i := range opts {
|
||||||
|
opts[i](cfg)
|
||||||
|
}
|
||||||
|
|
||||||
|
var err error
|
||||||
|
|
||||||
|
if cfg.gRPC.conn == nil {
|
||||||
|
if cfg.conn != nil {
|
||||||
|
if cfg.addr == "" {
|
||||||
|
cfg.addr = cfg.conn.RemoteAddr().String()
|
||||||
|
}
|
||||||
|
|
||||||
|
cfg.gRPC.dialOpts = append(cfg.gRPC.dialOpts,
|
||||||
|
grpc.WithContextDialer(func(context.Context, string) (net.Conn, error) {
|
||||||
|
return cfg.conn, nil
|
||||||
|
}),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
cfg.gRPC.conn, err = grpc.DialContext(cfg.gRPC.dialCtx, cfg.addr, cfg.gRPC.dialOpts...)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return cfg.gRPC.conn, err
|
||||||
|
}
|
||||||
|
|
||||||
|
func WithNetworkAddress(v string) Option {
|
||||||
|
return func(c *cfg) {
|
||||||
|
if v != "" {
|
||||||
|
c.addr = v
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func WithNetConn(v net.Conn) Option {
|
||||||
|
return func(c *cfg) {
|
||||||
|
if v != nil {
|
||||||
|
c.conn = v
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func WithGRPCDialContext(v context.Context) Option {
|
||||||
|
return func(c *cfg) {
|
||||||
|
if v != nil {
|
||||||
|
c.gRPC.dialCtx = v
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func WithGRPCDialOpts(v []grpc.DialOption) Option {
|
||||||
|
return func(c *cfg) {
|
||||||
|
if len(v) > 0 {
|
||||||
|
c.gRPC.dialOpts = v
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func WithGRPCConn(v *grpc.ClientConn) Option {
|
||||||
|
return func(c *cfg) {
|
||||||
|
if v != nil {
|
||||||
|
c.gRPC.conn = v
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
23
v2/client/proto.go
Normal file
23
v2/client/proto.go
Normal file
|
@ -0,0 +1,23 @@
|
||||||
|
package client
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/pkg/errors"
|
||||||
|
)
|
||||||
|
|
||||||
|
type Protocol uint32
|
||||||
|
|
||||||
|
const (
|
||||||
|
_ Protocol = iota
|
||||||
|
ProtoGRPC
|
||||||
|
)
|
||||||
|
|
||||||
|
var ErrProtoUnsupported = errors.New("unsupported protocol")
|
||||||
|
|
||||||
|
func (p Protocol) String() string {
|
||||||
|
switch p {
|
||||||
|
case ProtoGRPC:
|
||||||
|
return "GRPC"
|
||||||
|
default:
|
||||||
|
return "UNKNOWN"
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in a new issue