From 2fd61531d2007363f02fe1b30dfed9efe1def787 Mon Sep 17 00:00:00 2001 From: David Colburn Date: Mon, 30 Aug 2021 18:22:11 -0500 Subject: [PATCH] small refactor (#104) --- cmd/server/main.go | 36 +---------------- pkg/config/config.go | 4 +- pkg/service/utils.go | 80 +++++++++++++++++++++++++------------ pkg/service/wire.go | 4 +- pkg/service/wire_gen.go | 11 +++-- test/integration_helpers.go | 20 ++-------- test/turn_test.go | 3 +- test/webhook_test.go | 5 ++- 8 files changed, 74 insertions(+), 89 deletions(-) diff --git a/cmd/server/main.go b/cmd/server/main.go index 58b10ace2..e1e3929e4 100644 --- a/cmd/server/main.go +++ b/cmd/server/main.go @@ -11,8 +11,6 @@ import ( "syscall" "time" - "github.com/livekit/protocol/auth" - "github.com/pkg/errors" "github.com/urfave/cli/v2" "github.com/livekit/livekit-server/pkg/config" @@ -187,19 +185,12 @@ func startServer(c *cli.Context) error { } } - // require a key provider - keyProvider, err := createKeyProvider(conf) - if err != nil { - return err - } - logger.Infow("configured key provider", "numKeys", keyProvider.NumKeys()) - currentNode, err := routing.NewLocalNode(conf) if err != nil { return err } - server, err := service.InitializeServer(conf, keyProvider, currentNode) + server, err := service.InitializeServer(conf, currentNode) if err != nil { return err } @@ -216,31 +207,6 @@ func startServer(c *cli.Context) error { return server.Start() } -func createKeyProvider(conf *config.Config) (auth.KeyProvider, error) { - // prefer keyfile if set - if conf.KeyFile != "" { - if st, err := os.Stat(conf.KeyFile); err != nil { - return nil, err - } else if st.Mode().Perm() != 0600 { - return nil, fmt.Errorf("key file must have permission set to 600") - } - f, err := os.Open(conf.KeyFile) - if err != nil { - return nil, err - } - defer func() { - _ = f.Close() - }() - return auth.NewFileBasedKeyProviderFromReader(f) - } - - if len(conf.Keys) == 0 { - return nil, errors.New("one of key-file or keys must be provided in order to support a secure installation") - } - - return auth.NewFileBasedKeyProviderFromMap(conf.Keys), nil -} - func getConfigString(c *cli.Context) (string, error) { configFile := c.String("config") configBody := c.String("config-body") diff --git a/pkg/config/config.go b/pkg/config/config.go index 7f1d38c57..9d242beb3 100644 --- a/pkg/config/config.go +++ b/pkg/config/config.go @@ -143,8 +143,8 @@ func NewConfig(confString string, c *cli.Context) (*Config, error) { EnabledCodecs: []CodecSpec{ {Mime: webrtc.MimeTypeOpus}, {Mime: webrtc.MimeTypeVP8}, - //{Mime: webrtc.MimeTypeH264}, - //{Mime: webrtc.MimeTypeVP9}, + // {Mime: webrtc.MimeTypeH264}, + // {Mime: webrtc.MimeTypeVP9}, }, EmptyTimeout: 5 * 60, }, diff --git a/pkg/service/utils.go b/pkg/service/utils.go index aff1b9d5c..792f87f4d 100644 --- a/pkg/service/utils.go +++ b/pkg/service/utils.go @@ -2,7 +2,9 @@ package service import ( "context" + "fmt" "net/http" + "os" "regexp" "github.com/go-redis/redis/v8" @@ -21,8 +23,9 @@ var ServiceSet = wire.NewSet( createRedisClient, createRouter, createStore, - createWebhookNotifier, - nodeSelectorFromConfig, + CreateKeyProvider, + CreateWebhookNotifier, + CreateNodeSelector, NewRecordingService, NewRoomService, NewRTCService, @@ -35,6 +38,55 @@ var ServiceSet = wire.NewSet( wire.Bind(new(livekit.RoomService), new(*RoomService)), ) +func CreateKeyProvider(conf *config.Config) (auth.KeyProvider, error) { + // prefer keyfile if set + if conf.KeyFile != "" { + if st, err := os.Stat(conf.KeyFile); err != nil { + return nil, err + } else if st.Mode().Perm() != 0600 { + return nil, fmt.Errorf("key file must have permission set to 600") + } + f, err := os.Open(conf.KeyFile) + if err != nil { + return nil, err + } + defer func() { + _ = f.Close() + }() + return auth.NewFileBasedKeyProviderFromReader(f) + } + + if len(conf.Keys) == 0 { + return nil, errors.New("one of key-file or keys must be provided in order to support a secure installation") + } + + return auth.NewFileBasedKeyProviderFromMap(conf.Keys), nil +} + +func CreateWebhookNotifier(conf *config.Config, provider auth.KeyProvider) (*webhook.Notifier, error) { + wc := conf.WebHook + if len(wc.URLs) == 0 { + return nil, nil + } + secret := provider.GetSecret(wc.APIKey) + if secret == "" { + return nil, ErrWebHookMissingAPIKey + } + + return webhook.NewNotifier(wc.APIKey, secret, wc.URLs), nil +} + +func CreateNodeSelector(conf *config.Config) routing.NodeSelector { + switch conf.NodeSelector.Kind { + case "sysload": + return &routing.SystemLoadSelector{ + SysloadLimit: conf.NodeSelector.SysloadLimit, + } + default: + return &routing.RandomSelector{} + } +} + func createRedisClient(conf *config.Config) (*redis.Client, error) { if !conf.HasRedis() { return nil, nil @@ -72,30 +124,6 @@ func createStore(rc *redis.Client) RoomStore { return NewLocalRoomStore() } -func createWebhookNotifier(conf *config.Config, provider auth.KeyProvider) (*webhook.Notifier, error) { - wc := conf.WebHook - if len(wc.URLs) == 0 { - return nil, nil - } - secret := provider.GetSecret(wc.APIKey) - if secret == "" { - return nil, ErrWebHookMissingAPIKey - } - - return webhook.NewNotifier(wc.APIKey, secret, wc.URLs), nil -} - -func nodeSelectorFromConfig(conf *config.Config) routing.NodeSelector { - switch conf.NodeSelector.Kind { - case "sysload": - return &routing.SystemLoadSelector{ - SysloadLimit: conf.NodeSelector.SysloadLimit, - } - default: - return &routing.RandomSelector{} - } -} - func handleError(w http.ResponseWriter, status int, msg string) { // GetLogger already with extra depth 1 logger.GetLogger().V(1).Info("error handling request", "error", msg, "status", status) diff --git a/pkg/service/wire.go b/pkg/service/wire.go index 8bcf71ae7..48313d4a5 100644 --- a/pkg/service/wire.go +++ b/pkg/service/wire.go @@ -5,13 +5,11 @@ package service import ( "github.com/google/wire" - "github.com/livekit/protocol/auth" - "github.com/livekit/livekit-server/pkg/config" "github.com/livekit/livekit-server/pkg/routing" ) -func InitializeServer(conf *config.Config, keyProvider auth.KeyProvider, currentNode routing.LocalNode) (*LivekitServer, error) { +func InitializeServer(conf *config.Config, currentNode routing.LocalNode) (*LivekitServer, error) { wire.Build( ServiceSet, ) diff --git a/pkg/service/wire_gen.go b/pkg/service/wire_gen.go index f4f166b86..0512f1f67 100644 --- a/pkg/service/wire_gen.go +++ b/pkg/service/wire_gen.go @@ -8,20 +8,23 @@ package service import ( "github.com/livekit/livekit-server/pkg/config" "github.com/livekit/livekit-server/pkg/routing" - "github.com/livekit/protocol/auth" ) // Injectors from wire.go: -func InitializeServer(conf *config.Config, keyProvider auth.KeyProvider, currentNode routing.LocalNode) (*LivekitServer, error) { +func InitializeServer(conf *config.Config, currentNode routing.LocalNode) (*LivekitServer, error) { client, err := createRedisClient(conf) if err != nil { return nil, err } roomStore := createStore(client) router := createRouter(client, currentNode) - nodeSelector := nodeSelectorFromConfig(conf) - notifier, err := createWebhookNotifier(conf, keyProvider) + nodeSelector := CreateNodeSelector(conf) + keyProvider, err := CreateKeyProvider(conf) + if err != nil { + return nil, err + } + notifier, err := CreateWebhookNotifier(conf, keyProvider) if err != nil { return nil, err } diff --git a/test/integration_helpers.go b/test/integration_helpers.go index 1bc2ca923..ee6dbc51d 100644 --- a/test/integration_helpers.go +++ b/test/integration_helpers.go @@ -138,6 +138,7 @@ func createSingleNodeServer() *service.LivekitServer { panic(fmt.Sprintf("could not create config: %v", err)) } conf.Development = true + conf.Keys = map[string]string{testApiKey: testApiSecret} currentNode, err := routing.NewLocalNode(conf) if err != nil { @@ -145,7 +146,7 @@ func createSingleNodeServer() *service.LivekitServer { } currentNode.Id = utils.NewGuid(nodeId1) - s, err := service.InitializeServer(conf, &StaticKeyProvider{}, currentNode) + s, err := service.InitializeServer(conf, currentNode) if err != nil { panic(fmt.Sprintf("could not create server: %v", err)) } @@ -165,6 +166,7 @@ func createMultiNodeServer(nodeId string, port uint32) *service.LivekitServer { conf.RTC.TCPPort = port + 2 conf.Redis.Address = "localhost:6379" conf.Development = true + conf.Keys = map[string]string{testApiKey: testApiSecret} currentNode, err := routing.NewLocalNode(conf) if err != nil { @@ -173,7 +175,7 @@ func createMultiNodeServer(nodeId string, port uint32) *service.LivekitServer { currentNode.Id = nodeId // redis routing and store - s, err := service.InitializeServer(conf, &StaticKeyProvider{}, currentNode) + s, err := service.InitializeServer(conf, currentNode) if err != nil { panic(fmt.Sprintf("could not create server: %v", err)) } @@ -239,17 +241,3 @@ func stopClients(clients ...*testclient.RTCClient) { c.Stop() } } - -type StaticKeyProvider struct { -} - -func (p *StaticKeyProvider) NumKeys() int { - return 1 -} - -func (p *StaticKeyProvider) GetSecret(key string) string { - if key == testApiKey { - return testApiSecret - } - return "" -} diff --git a/test/turn_test.go b/test/turn_test.go index f6ab1ae30..f299ac56a 100644 --- a/test/turn_test.go +++ b/test/turn_test.go @@ -21,13 +21,14 @@ func testTurnServer(t *testing.T) { require.NoError(t, err) conf.TURN.Enabled = true + conf.Keys = map[string]string{testApiKey: testApiSecret} currentNode, err := routing.NewLocalNode(conf) require.NoError(t, err) currentNode.Id = utils.NewGuid(nodeId1) // local routing and store - s, err := service.InitializeServer(conf, &StaticKeyProvider{}, currentNode) + s, err := service.InitializeServer(conf, currentNode) require.NoError(t, err) go s.Start() waitForServerToStart(s) diff --git a/test/webhook_test.go b/test/webhook_test.go index 53e7a694c..e7617367f 100644 --- a/test/webhook_test.go +++ b/test/webhook_test.go @@ -92,6 +92,7 @@ func setupServerWithWebhook() (server *service.LivekitServer, testServer *webook conf.WebHook.URLs = []string{"http://localhost:7890"} conf.WebHook.APIKey = testApiKey conf.Development = true + conf.Keys = map[string]string{testApiKey: testApiSecret} testServer = newTestServer(":7890") if err = testServer.Start(); err != nil { @@ -104,7 +105,7 @@ func setupServerWithWebhook() (server *service.LivekitServer, testServer *webook } currentNode.Id = utils.NewGuid(nodeId1) - server, err = service.InitializeServer(conf, &StaticKeyProvider{}, currentNode) + server, err = service.InitializeServer(conf, currentNode) if err != nil { return } @@ -134,7 +135,7 @@ type webookTestServer struct { func newTestServer(addr string) *webookTestServer { s := &webookTestServer{ events: make(map[string]*livekit.WebhookEvent), - provider: &StaticKeyProvider{}, + provider: auth.NewFileBasedKeyProviderFromMap(map[string]string{testApiKey: testApiSecret}), } s.server = &http.Server{ Addr: addr,