Provide yes man endpoint for inflexible load balancers

Certain load balancers, such as Amazon's Elastic Load Balancer, have a very
limited notion of health. While a properly configured and operational registry
should always return a 401 when hitting "/v2/", such load balancers cannot be
configured to treat this response code as healthy. This changeset makes "/"
always return a 200 response, unless the health checks have failed.

Signed-off-by: Stephen J Day <stephen.day@docker.com>
This commit is contained in:
Stephen J Day 2015-08-13 15:13:42 -07:00
parent 77c6d9deb9
commit 74080b7225

View file

@ -72,8 +72,9 @@ func main() {
app := handlers.NewApp(ctx, *config) app := handlers.NewApp(ctx, *config)
app.RegisterHealthChecks() app.RegisterHealthChecks()
handler := configureReporting(app) handler := configureReporting(app)
handler = panicHandler(handler) handler = alive("/", handler)
handler = health.Handler(handler) handler = health.Handler(handler)
handler = panicHandler(handler)
handler = gorhandlers.CombinedLoggingHandler(os.Stdout, handler) handler = gorhandlers.CombinedLoggingHandler(os.Stdout, handler)
if config.HTTP.Debug.Addr != "" { if config.HTTP.Debug.Addr != "" {
@ -313,3 +314,20 @@ func panicHandler(handler http.Handler) http.Handler {
handler.ServeHTTP(w, r) handler.ServeHTTP(w, r)
}) })
} }
// alive simply wraps the handler with a route that always returns an http 200
// response when the path is matched. If the path is not matched, the request
// is passed to the provided handler. There is no guarantee of anything but
// that the server is up. Wrap with other handlers (such as health.Handler)
// for greater affect.
func alive(path string, handler http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
if r.URL.Path == path {
w.Header().Set("Cache-Control", "no-cache")
w.WriteHeader(http.StatusOK)
return
}
handler.ServeHTTP(w, r)
})
}