signaling: use BackendConfig passing more options to backend factory

Signed-off-by: Steffen Vogel <post@steffenvogel.de>
This commit is contained in:
Steffen Vogel
2022-02-03 16:50:45 +01:00
parent f59b60b5a9
commit 897fbe5e1f
10 changed files with 52 additions and 46 deletions

View File

@@ -45,9 +45,11 @@ func NewDaemon(cfg *config.Config) (*Daemon, error) {
// Create backend // Create backend
var backend signaling.Backend var backend signaling.Backend
if len(cfg.Backends) == 1 { if len(cfg.Backends) == 1 {
backend, err = signaling.NewBackend(cfg.Backends[0], events) backend, err = signaling.NewBackend(&signaling.BackendConfig{
URI: cfg.Backends[0],
}, events)
} else { } else {
backend, err = signaling.NewMultiBackend(cfg.Backends, events) backend, err = signaling.NewMultiBackend(cfg.Backends, &signaling.BackendConfig{}, events)
} }
if err != nil { if err != nil {
return nil, fmt.Errorf("failed to initialize signaling backend: %w", err) return nil, fmt.Errorf("failed to initialize signaling backend: %w", err)

View File

@@ -16,13 +16,18 @@ var (
type BackendType string // URL schemes type BackendType string // URL schemes
type BackendFactory func(*url.URL, chan *pb.Event) (Backend, error) type BackendFactory func(*BackendConfig, chan *pb.Event) (Backend, error)
type BackendPlugin struct { type BackendPlugin struct {
New BackendFactory New BackendFactory
Description string Description string
} }
type BackendConfig struct {
URI *url.URL
Community *crypto.Key
}
type Backend interface { type Backend interface {
io.Closer io.Closer
@@ -30,8 +35,8 @@ type Backend interface {
Subscribe(kp *crypto.KeyPair) (chan *pb.SignalingMessage, error) Subscribe(kp *crypto.KeyPair) (chan *pb.SignalingMessage, error)
} }
func NewBackend(uri *url.URL, events chan *pb.Event) (Backend, error) { func NewBackend(cfg *BackendConfig, events chan *pb.Event) (Backend, error) {
typs := strings.SplitN(uri.Scheme, "+", 2) typs := strings.SplitN(cfg.URI.Scheme, "+", 2)
typ := BackendType(typs[0]) typ := BackendType(typs[0])
p, ok := Backends[typ] p, ok := Backends[typ]
@@ -40,10 +45,10 @@ func NewBackend(uri *url.URL, events chan *pb.Event) (Backend, error) {
} }
if len(typs) > 1 { if len(typs) > 1 {
uri.Scheme = typs[1] cfg.URI.Scheme = typs[1]
} }
be, err := p.New(uri, events) be, err := p.New(cfg, events)
if err != nil { if err != nil {
return nil, err return nil, err
} }

View File

@@ -17,7 +17,11 @@ func TestNewBackend(t *testing.T) {
events := make(chan *pb.Event, 100) events := make(chan *pb.Event, 100)
b, err := signaling.NewBackend(uri, events) cfg := &signaling.BackendConfig{
URI: uri,
}
b, err := signaling.NewBackend(cfg, events)
if err != nil { if err != nil {
t.Fatalf("Failed to create new backend: %s", err) t.Fatalf("Failed to create new backend: %s", err)
} }

View File

@@ -3,7 +3,6 @@ package grpc
import ( import (
"context" "context"
"fmt" "fmt"
"net/url"
"go.uber.org/zap" "go.uber.org/zap"
"google.golang.org/grpc" "google.golang.org/grpc"
@@ -28,14 +27,14 @@ type Backend struct {
logger *zap.Logger logger *zap.Logger
} }
func NewBackend(uri *url.URL, events chan *pb.Event) (signaling.Backend, error) { func NewBackend(cfg *signaling.BackendConfig, events chan *pb.Event) (signaling.Backend, error) {
var err error var err error
b := &Backend{ b := &Backend{
logger: zap.L().Named("grpc"), logger: zap.L().Named("grpc"),
} }
if err := b.config.Parse(uri); err != nil { if err := b.config.Parse(cfg); err != nil {
return nil, fmt.Errorf("failed to parse backend configuration: %w", err) return nil, fmt.Errorf("failed to parse backend configuration: %w", err)
} }

View File

@@ -2,24 +2,25 @@ package grpc
import ( import (
"errors" "errors"
"net/url"
"strconv" "strconv"
"google.golang.org/grpc" "google.golang.org/grpc"
"google.golang.org/grpc/credentials/insecure" "google.golang.org/grpc/credentials/insecure"
"riasc.eu/wice/pkg/signaling"
) )
type BackendConfig struct { type BackendConfig struct {
URI *url.URL signaling.BackendConfig
Target string Target string
Options []grpc.DialOption Options []grpc.DialOption
} }
func (c *BackendConfig) Parse(uri *url.URL) error { func (c *BackendConfig) Parse(cfg *signaling.BackendConfig) error {
options := uri.Query() c.BackendConfig = *cfg
options := c.URI.Query()
if str := options.Get("insecure"); str != "" { if str := options.Get("insecure"); str != "" {
if b, err := strconv.ParseBool(str); err == nil && b { if b, err := strconv.ParseBool(str); err == nil && b {
c.Options = append(c.Options, grpc.WithTransportCredentials( c.Options = append(c.Options, grpc.WithTransportCredentials(
@@ -28,13 +29,11 @@ func (c *BackendConfig) Parse(uri *url.URL) error {
} }
} }
c.URI = uri if c.URI.Host == "" {
if uri.Host == "" {
return errors.New("missing gRPC server url") return errors.New("missing gRPC server url")
} }
c.Target = uri.Host c.Target = c.URI.Host
return nil return nil
} }

View File

@@ -2,9 +2,7 @@ package k8s
import ( import (
"context" "context"
"encoding/json"
"fmt" "fmt"
"net/url"
"go.uber.org/zap" "go.uber.org/zap"
corev1 "k8s.io/api/core/v1" corev1 "k8s.io/api/core/v1"
@@ -50,7 +48,7 @@ func init() {
} }
} }
func NewBackend(uri *url.URL, events chan *pb.Event) (signaling.Backend, error) { func NewBackend(cfg *signaling.BackendConfig, events chan *pb.Event) (signaling.Backend, error) {
var config *rest.Config var config *rest.Config
var err error var err error
@@ -63,12 +61,11 @@ func NewBackend(uri *url.URL, events chan *pb.Event) (signaling.Backend, error)
events: events, events: events,
} }
if err := b.config.Parse(uri); err != nil { if err := b.config.Parse(cfg); err != nil {
return nil, fmt.Errorf("failed to parse configuration: %w", err) return nil, fmt.Errorf("failed to parse configuration: %w", err)
} }
kubeconfig := uri.Path if b.config.Kubeconfig == "" {
if kubeconfig == "" {
loadingRules := clientcmd.NewDefaultClientConfigLoadingRules() loadingRules := clientcmd.NewDefaultClientConfigLoadingRules()
// if you want to change the loading rules (which files in which order), you can do so here // if you want to change the loading rules (which files in which order), you can do so here
@@ -80,14 +77,12 @@ func NewBackend(uri *url.URL, events chan *pb.Event) (signaling.Backend, error)
if config, err = kubeConfig.ClientConfig(); err != nil { if config, err = kubeConfig.ClientConfig(); err != nil {
return nil, fmt.Errorf("failed to load config: %w", err) return nil, fmt.Errorf("failed to load config: %w", err)
} }
} else if kubeconfig == "incluster" { } else if b.config.Kubeconfig == "incluster" {
if config, err = rest.InClusterConfig(); err != nil { if config, err = rest.InClusterConfig(); err != nil {
return nil, fmt.Errorf("failed to get incluster configuration: %w", err) return nil, fmt.Errorf("failed to get incluster configuration: %w", err)
} }
} else { } else {
config, err = clientcmd.BuildConfigFromFlags("", kubeconfig) if config, err = clientcmd.BuildConfigFromFlags("", b.config.Kubeconfig); err != nil {
if err != nil {
return nil, fmt.Errorf("failed to get configuration from flags: %w", err) return nil, fmt.Errorf("failed to get configuration from flags: %w", err)
} }
} }

View File

@@ -6,8 +6,9 @@ import (
) )
type BackendConfig struct { type BackendConfig struct {
URI *url.URL signaling.BackendConfig
Kubeconfig string
NodeName string NodeName string
AnnotationOffers string AnnotationOffers string
AnnotationPublicKey string AnnotationPublicKey string
@@ -18,7 +19,9 @@ var defaultConfig = BackendConfig{
AnnotationPublicKey: defaultAnnotationPublicKey, AnnotationPublicKey: defaultAnnotationPublicKey,
} }
func (c *BackendConfig) Parse(uri *url.URL) error { func (c *BackendConfig) Parse(cfg *signaling.BackendConfig) error {
c.BackendConfig = *cfg
options := uri.Query() options := uri.Query()
if str := options.Get("node"); str == "" { if str := options.Get("node"); str == "" {
@@ -33,8 +36,7 @@ func (c *BackendConfig) Parse(uri *url.URL) error {
c.AnnotationPublicKey = str c.AnnotationPublicKey = str
} }
uri.RawQuery = "" c.Kubeconfig = c.URI.Path
c.URI = uri
return nil return nil
} }

View File

@@ -11,18 +11,19 @@ type MultiBackend struct {
backends []Backend backends []Backend
} }
func NewMultiBackend(uris []*url.URL, events chan *pb.Event) (Backend, error) { func NewMultiBackend(uris []*url.URL, cfg *BackendConfig, events chan *pb.Event) (Backend, error) {
mb := &MultiBackend{ mb := &MultiBackend{
backends: []Backend{}, backends: []Backend{},
} }
for _, u := range uris { for _, u := range uris {
b, err := NewBackend(u, events) cfg.URI = u
if err != nil {
if b, err := NewBackend(cfg, events); err == nil {
mb.backends = append(mb.backends, b)
} else {
return nil, err return nil, err
} }
mb.backends = append(mb.backends, b)
} }
return mb, nil return mb, nil

View File

@@ -3,7 +3,6 @@ package p2p
import ( import (
"context" "context"
"fmt" "fmt"
"net/url"
"sync" "sync"
p2p "github.com/libp2p/go-libp2p" p2p "github.com/libp2p/go-libp2p"
@@ -54,7 +53,7 @@ type Backend struct {
events chan *pb.Event events chan *pb.Event
} }
func NewBackend(uri *url.URL, events chan *pb.Event) (signaling.Backend, error) { func NewBackend(cfg *signaling.BackendConfig, events chan *pb.Event) (signaling.Backend, error) {
var err error var err error
b := &Backend{ b := &Backend{
@@ -64,7 +63,7 @@ func NewBackend(uri *url.URL, events chan *pb.Event) (signaling.Backend, error)
events: events, events: events,
} }
if err := b.config.Parse(uri); err != nil { if err := b.config.Parse(cfg); err != nil {
return nil, fmt.Errorf("failed to parse backend options: %w", err) return nil, fmt.Errorf("failed to parse backend options: %w", err)
} }

View File

@@ -2,7 +2,6 @@ package p2p
import ( import (
"fmt" "fmt"
"net/url"
"strconv" "strconv"
"github.com/libp2p/go-libp2p-core/crypto" "github.com/libp2p/go-libp2p-core/crypto"
@@ -11,6 +10,7 @@ import (
dht "github.com/libp2p/go-libp2p-kad-dht" dht "github.com/libp2p/go-libp2p-kad-dht"
"github.com/libp2p/go-libp2p/p2p/host/autorelay" "github.com/libp2p/go-libp2p/p2p/host/autorelay"
maddr "github.com/multiformats/go-multiaddr" maddr "github.com/multiformats/go-multiaddr"
"riasc.eu/wice/pkg/signaling"
) )
const ( const (
@@ -31,7 +31,7 @@ type peerAddressList []peer.AddrInfo
type multiAddressList []maddr.Multiaddr type multiAddressList []maddr.Multiaddr
type BackendConfig struct { type BackendConfig struct {
URI *url.URL signaling.BackendConfig
// Load some options // Load some options
ListenAddresses multiAddressList ListenAddresses multiAddressList
@@ -98,12 +98,12 @@ func (al *peerAddressList) Set(as []string) error {
return nil return nil
} }
func (c *BackendConfig) Parse(uri *url.URL) error { func (c *BackendConfig) Parse(cfg *signaling.BackendConfig) error {
var err error var err error
c.RendezvousString = uri.Opaque options := cfg.URI.Query()
options := uri.Query() c.BackendConfig = *cfg
if pkStr := options.Get("private-key"); pkStr != "" { if pkStr := options.Get("private-key"); pkStr != "" {
pk, err := crypto.ConfigDecodeKey(pkStr) pk, err := crypto.ConfigDecodeKey(pkStr)