From e3c85d3e7ef2a759afe1c7556b2681496f967b5c Mon Sep 17 00:00:00 2001 From: C Cirello Date: Thu, 29 Dec 2016 20:19:42 +0100 Subject: [PATCH] server: shutdown endpoint (#466) fixes #390 --- api/server/server.go | 6 +++++- api/server/server_options.go | 11 +++++++++++ api/server/shutdown.go | 15 +++++++++++++++ api/server/special_handler_test.go | 3 ++- main.go | 10 +++++++++- 5 files changed, 42 insertions(+), 3 deletions(-) create mode 100644 api/server/server_options.go create mode 100644 api/server/shutdown.go diff --git a/api/server/server.go b/api/server/server.go index 251187fdc..e261fbdf9 100644 --- a/api/server/server.go +++ b/api/server/server.go @@ -33,7 +33,7 @@ type Server struct { singleflight singleflight // singleflight assists Datastore } -func New(ctx context.Context, ds models.Datastore, mq models.MessageQueue, r *runner.Runner, tasks chan task.Request, enqueue models.Enqueue) *Server { +func New(ctx context.Context, ds models.Datastore, mq models.MessageQueue, r *runner.Runner, tasks chan task.Request, enqueue models.Enqueue, opts ...ServerOption) *Server { s := &Server{ Runner: r, Router: gin.New(), @@ -45,6 +45,10 @@ func New(ctx context.Context, ds models.Datastore, mq models.MessageQueue, r *ru s.Router.Use(prepareMiddleware(ctx)) + for _, opt := range opts { + opt(s) + } + return s } diff --git a/api/server/server_options.go b/api/server/server_options.go new file mode 100644 index 000000000..b3ed708a2 --- /dev/null +++ b/api/server/server_options.go @@ -0,0 +1,11 @@ +package server + +import "context" + +type ServerOption func(*Server) + +func EnableShutdownEndpoint(halt context.CancelFunc) ServerOption { + return func(s *Server) { + s.Router.GET("/shutdown", s.handleShutdown(halt)) + } +} diff --git a/api/server/shutdown.go b/api/server/shutdown.go new file mode 100644 index 000000000..3d6858697 --- /dev/null +++ b/api/server/shutdown.go @@ -0,0 +1,15 @@ +package server + +import ( + "context" + "net/http" + + "github.com/gin-gonic/gin" +) + +func (s *Server) handleShutdown(halt context.CancelFunc) func(*gin.Context) { + return func(c *gin.Context) { + halt() + c.JSON(http.StatusOK, "shutting down") + } +} diff --git a/api/server/special_handler_test.go b/api/server/special_handler_test.go index d3e0c6b6f..a7b7420b7 100644 --- a/api/server/special_handler_test.go +++ b/api/server/special_handler_test.go @@ -2,12 +2,13 @@ package server import ( "context" + "testing" + "github.com/iron-io/functions/api/datastore" "github.com/iron-io/functions/api/models" "github.com/iron-io/functions/api/mqs" "github.com/iron-io/functions/api/runner" "github.com/iron-io/functions/api/runner/task" - "testing" ) type testSpecialHandler struct{} diff --git a/main.go b/main.go index adec495e5..6dc8f8712 100644 --- a/main.go +++ b/main.go @@ -92,7 +92,15 @@ func main() { }) svr.AddFunc(func(ctx context.Context) { - srv := server.New(ctx, ds, mq, rnr, tasks, server.DefaultEnqueue) + srv := server.New( + ctx, + ds, + mq, + rnr, + tasks, + server.DefaultEnqueue, + server.EnableShutdownEndpoint(halt), + ) srv.Run() <-ctx.Done() })