From 14efe4e371a22cbb267d8354208092ca9d24e5f6 Mon Sep 17 00:00:00 2001 From: Pawel Szczodruch Date: Thu, 5 Mar 2020 13:43:47 -0800 Subject: [PATCH 1/4] feat: shut down all listeners on bad JWKS init --- pkg/server/server.go | 14 ++++++++++++-- pkg/server/server_group.go | 6 +++++- 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/pkg/server/server.go b/pkg/server/server.go index 598c49f3..5f7a4e94 100644 --- a/pkg/server/server.go +++ b/pkg/server/server.go @@ -36,15 +36,25 @@ type Server struct { logger zerolog.Logger } +type ListenerError struct { + name string + message string + shutDown bool +} + +func (e ListenerError) Error() string { + return fmt.Sprintf(e.message, e.name) +} + // NewServer initializes new service. // Configuration is pulled from viper configuration. func NewServer(name, port string, handler http.Handler, conf config.ServerConfig) (Server, error) { if port == "0" { - return Server{}, fmt.Errorf(`"%s" not enabled`, name) + return Server{}, ListenerError{message: `"%s" not enabled`, name: name, shutDown: false} } if handler == nil { - return Server{}, fmt.Errorf(`"%s" handler is not initialized`, name) + return Server{}, ListenerError{message: `"%s" handler is not initialized`, name: name, shutDown: true} } logger := log.With().Str("port", port).Str("name", name).Logger() diff --git a/pkg/server/server_group.go b/pkg/server/server_group.go index 7889cc5f..57ef95e5 100644 --- a/pkg/server/server_group.go +++ b/pkg/server/server_group.go @@ -54,8 +54,12 @@ func NewGroup(ctx context.Context, conf config.ServerConfig) *Group { // go routines to maintain startup order of each listener. func (g *Group) GoListenAndServe(name, port string, handler http.Handler) { server, err := NewServer(name, port, handler, g.conf) - if err != nil { + + if listenerError, ok := err.(ListenerError); ok { log.Info().Err(err).Msg("Not starting server") + if listenerError.shutDown { + g.stop() + } return } From 4a7d4e4c625d1c8e919fe2ae5026383e75c51fa3 Mon Sep 17 00:00:00 2001 From: Pawel Szczodruch Date: Thu, 5 Mar 2020 13:55:20 -0800 Subject: [PATCH 2/4] missed that --- pkg/server/server.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/server/server.go b/pkg/server/server.go index 5f7a4e94..82fe15e3 100644 --- a/pkg/server/server.go +++ b/pkg/server/server.go @@ -68,7 +68,7 @@ func NewServer(name, port string, handler http.Handler, conf config.ServerConfig if conf.KeyFile != "" && conf.CertFile != "" { cfg, err := makeTLSConfig(conf) if err != nil { - return Server{}, err + return Server{}, ListenerError{message: err.Error(), name: name, shutDown: false} } srv.TLSConfig = cfg } From 94d2bb90e9680322ddbae4d2c932b1607ff69b5e Mon Sep 17 00:00:00 2001 From: Pawel Szczodruch Date: Thu, 5 Mar 2020 13:55:55 -0800 Subject: [PATCH 3/4] remove name --- pkg/server/server.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/server/server.go b/pkg/server/server.go index 82fe15e3..017fedeb 100644 --- a/pkg/server/server.go +++ b/pkg/server/server.go @@ -68,7 +68,7 @@ func NewServer(name, port string, handler http.Handler, conf config.ServerConfig if conf.KeyFile != "" && conf.CertFile != "" { cfg, err := makeTLSConfig(conf) if err != nil { - return Server{}, ListenerError{message: err.Error(), name: name, shutDown: false} + return Server{}, ListenerError{message: err.Error(), shutDown: false} } srv.TLSConfig = cfg } From 8eadfc4d8a05ad9dcfc30054bf9da681966c7903 Mon Sep 17 00:00:00 2001 From: Pawel Szczodruch Date: Thu, 5 Mar 2020 14:29:57 -0800 Subject: [PATCH 4/4] final changes --- pkg/server/server.go | 17 ++--------------- pkg/server/server_group.go | 18 ++++++++++++------ 2 files changed, 14 insertions(+), 21 deletions(-) diff --git a/pkg/server/server.go b/pkg/server/server.go index 017fedeb..dea03f26 100644 --- a/pkg/server/server.go +++ b/pkg/server/server.go @@ -36,25 +36,12 @@ type Server struct { logger zerolog.Logger } -type ListenerError struct { - name string - message string - shutDown bool -} - -func (e ListenerError) Error() string { - return fmt.Sprintf(e.message, e.name) -} - // NewServer initializes new service. // Configuration is pulled from viper configuration. func NewServer(name, port string, handler http.Handler, conf config.ServerConfig) (Server, error) { - if port == "0" { - return Server{}, ListenerError{message: `"%s" not enabled`, name: name, shutDown: false} - } if handler == nil { - return Server{}, ListenerError{message: `"%s" handler is not initialized`, name: name, shutDown: true} + return Server{}, fmt.Errorf(`"%s" handler is not initialized`, name) } logger := log.With().Str("port", port).Str("name", name).Logger() @@ -68,7 +55,7 @@ func NewServer(name, port string, handler http.Handler, conf config.ServerConfig if conf.KeyFile != "" && conf.CertFile != "" { cfg, err := makeTLSConfig(conf) if err != nil { - return Server{}, ListenerError{message: err.Error(), shutDown: false} + return Server{}, err } srv.TLSConfig = cfg } diff --git a/pkg/server/server_group.go b/pkg/server/server_group.go index 57ef95e5..198629f1 100644 --- a/pkg/server/server_group.go +++ b/pkg/server/server_group.go @@ -19,10 +19,12 @@ package server import ( "context" - "github.com/optimizely/agent/config" + "fmt" "net/http" "sync" + "github.com/optimizely/agent/config" + "github.com/rs/zerolog/log" "golang.org/x/sync/errgroup" ) @@ -53,13 +55,17 @@ func NewGroup(ctx context.Context, conf config.ServerConfig) *Group { // to initiate a graceful shutdown. This method blocks on adding the // go routines to maintain startup order of each listener. func (g *Group) GoListenAndServe(name, port string, handler http.Handler) { + + if port == "0" { + log.Info().Msg(fmt.Sprintf(`"%s" not enabled`, name)) + return + } + server, err := NewServer(name, port, handler, g.conf) - if listenerError, ok := err.(ListenerError); ok { - log.Info().Err(err).Msg("Not starting server") - if listenerError.shutDown { - g.stop() - } + if err != nil { + log.Error().Err(err).Msg("Failed starting server") + g.stop() return }