Skip to content

Commit

Permalink
Merge pull request #2019 from dexidp/refactor-run-groups
Browse files Browse the repository at this point in the history
Refactor run groups
  • Loading branch information
sagikazarmark authored Feb 25, 2021
2 parents 3c5a631 + 24a1103 commit f7d1405
Showing 1 changed file with 79 additions and 40 deletions.
119 changes: 79 additions & 40 deletions cmd/dex/serve.go
Original file line number Diff line number Diff line change
Expand Up @@ -73,27 +73,6 @@ func commandServe() *cobra.Command {
return cmd
}

func listenAndShutdownGracefully(logger log.Logger, gr *run.Group, srv *http.Server, name string) error {
l, err := net.Listen("tcp", srv.Addr)
if err != nil {
return fmt.Errorf("listening (%s) on %s: %v", name, srv.Addr, err)
}

gr.Add(func() error {
logger.Infof("listening (%s) on %s", name, srv.Addr)
return srv.Serve(l)
}, func(err error) {
ctx, cancel := context.WithTimeout(context.Background(), time.Minute)
defer cancel()

logger.Debugf("starting graceful shutdown (%s)", name)
if err := srv.Shutdown(ctx); err != nil {
logger.Errorf("graceful shutdown (%s): %v", name, err)
}
})
return nil
}

func runServe(options serveOptions) error {
configFile := options.config
configData, err := ioutil.ReadFile(configFile)
Expand Down Expand Up @@ -354,43 +333,104 @@ func runServe(options serveOptions) error {
InitiallyPassing: true,
})

var gr run.Group
var group run.Group

// Set up telemetry server
if c.Telemetry.HTTP != "" {
telemetrySrv := &http.Server{Addr: c.Telemetry.HTTP, Handler: telemetryRouter}
const name = "telemetry"

defer telemetrySrv.Close()
if err := listenAndShutdownGracefully(logger, &gr, telemetrySrv, "http/telemetry"); err != nil {
return err
logger.Infof("listening (%s) on %s", name, c.Telemetry.HTTP)

l, err := net.Listen("tcp", c.Telemetry.HTTP)
if err != nil {
return fmt.Errorf("listening (%s) on %s: %v", name, c.Telemetry.HTTP, err)
}

server := &http.Server{
Handler: telemetryRouter,
}
defer server.Close()

group.Add(func() error {
return server.Serve(l)
}, func(err error) {
ctx, cancel := context.WithTimeout(context.Background(), time.Minute)
defer cancel()

logger.Debugf("starting graceful shutdown (%s)", name)
if err := server.Shutdown(ctx); err != nil {
logger.Errorf("graceful shutdown (%s): %v", name, err)
}
})
}

// Set up http server
if c.Web.HTTP != "" {
httpSrv := &http.Server{Addr: c.Web.HTTP, Handler: serv}
const name = "http"

logger.Infof("listening (%s) on %s", name, c.Web.HTTP)

defer httpSrv.Close()
if err := listenAndShutdownGracefully(logger, &gr, httpSrv, "http"); err != nil {
return err
l, err := net.Listen("tcp", c.Web.HTTP)
if err != nil {
return fmt.Errorf("listening (%s) on %s: %v", name, c.Web.HTTP, err)
}

server := &http.Server{
Handler: serv,
}
defer server.Close()

group.Add(func() error {
return server.Serve(l)
}, func(err error) {
ctx, cancel := context.WithTimeout(context.Background(), time.Minute)
defer cancel()

logger.Debugf("starting graceful shutdown (%s)", name)
if err := server.Shutdown(ctx); err != nil {
logger.Errorf("graceful shutdown (%s): %v", name, err)
}
})
}

// Set up https server
if c.Web.HTTPS != "" {
httpsSrv := &http.Server{
Addr: c.Web.HTTPS,
const name = "https"

logger.Infof("listening (%s) on %s", name, c.Web.HTTPS)

l, err := net.Listen("tcp", c.Web.HTTPS)
if err != nil {
return fmt.Errorf("listening (%s) on %s: %v", name, c.Web.HTTPS, err)
}

server := &http.Server{
Handler: serv,
TLSConfig: &tls.Config{
CipherSuites: allowedTLSCiphers,
PreferServerCipherSuites: true,
MinVersion: tls.VersionTLS12,
},
}
defer server.Close()

defer httpsSrv.Close()
if err := listenAndShutdownGracefully(logger, &gr, httpsSrv, "https"); err != nil {
return err
}
group.Add(func() error {
return server.ServeTLS(l, c.Web.TLSCert, c.Web.TLSKey)
}, func(err error) {
ctx, cancel := context.WithTimeout(context.Background(), time.Minute)
defer cancel()

logger.Debugf("starting graceful shutdown (%s)", name)
if err := server.Shutdown(ctx); err != nil {
logger.Errorf("graceful shutdown (%s): %v", name, err)
}
})
}

// Set up grpc server
if c.GRPC.Addr != "" {
logger.Infof("listening (grpc) on %s", c.GRPC.Addr)

grpcListener, err := net.Listen("tcp", c.GRPC.Addr)
if err != nil {
return fmt.Errorf("listening (grcp) on %s: %w", c.GRPC.Addr, err)
Expand All @@ -405,17 +445,16 @@ func runServe(options serveOptions) error {
reflection.Register(grpcSrv)
}

gr.Add(func() error {
logger.Infof("listening (grpc) on %s", c.GRPC.Addr)
group.Add(func() error {
return grpcSrv.Serve(grpcListener)
}, func(err error) {
logger.Debugf("starting graceful shutdown (grpc)")
grpcSrv.GracefulStop()
})
}

gr.Add(run.SignalHandler(context.Background(), os.Interrupt, syscall.SIGTERM))
if err := gr.Run(); err != nil {
group.Add(run.SignalHandler(context.Background(), os.Interrupt, syscall.SIGTERM))
if err := group.Run(); err != nil {
if _, ok := err.(run.SignalError); !ok {
return fmt.Errorf("run groups: %w", err)
}
Expand Down

0 comments on commit f7d1405

Please sign in to comment.