From 2082a0f42851c47620ce31f257dcb5536abae014 Mon Sep 17 00:00:00 2001 From: Jacob Tanenbaum Date: Thu, 10 May 2018 16:21:39 -0400 Subject: [PATCH] Add InstallPathHandler which allows for more then one path to be associated with health checking. Currently it is only possible to have one group of checks which must all pass for the handler to report success. Allowing multiple paths for these checks allows use of the same machinery for other kinds of checks, i.e. readiness. --- .../apiserver/pkg/server/healthz/healthz.go | 13 ++++++-- .../pkg/server/healthz/healthz_test.go | 32 +++++++++++++++++++ 2 files changed, 43 insertions(+), 2 deletions(-) diff --git a/staging/src/k8s.io/apiserver/pkg/server/healthz/healthz.go b/staging/src/k8s.io/apiserver/pkg/server/healthz/healthz.go index bd8bfe7b53d..224f1eda2c4 100644 --- a/staging/src/k8s.io/apiserver/pkg/server/healthz/healthz.go +++ b/staging/src/k8s.io/apiserver/pkg/server/healthz/healthz.go @@ -66,6 +66,15 @@ func NamedCheck(name string, check func(r *http.Request) error) HealthzChecker { // exactly one call to InstallHandler. Calling InstallHandler more // than once for the same mux will result in a panic. func InstallHandler(mux mux, checks ...HealthzChecker) { + InstallPathHandler(mux, "/healthz", checks...) +} + +// InstallPathHandler registers handlers for health checking on +// a specific path to mux. *All handlers* for the path must be +// specified in exactly one call to InstallPathHandler. Calling +// InstallPathHandler more than once for the same path and mux will +// result in a panic. +func InstallPathHandler(mux mux, path string, checks ...HealthzChecker) { if len(checks) == 0 { glog.V(5).Info("No default health checks specified. Installing the ping handler.") checks = []HealthzChecker{PingHealthz} @@ -73,9 +82,9 @@ func InstallHandler(mux mux, checks ...HealthzChecker) { glog.V(5).Info("Installing healthz checkers:", strings.Join(checkerNames(checks...), ", ")) - mux.Handle("/healthz", handleRootHealthz(checks...)) + mux.Handle(path, handleRootHealthz(checks...)) for _, check := range checks { - mux.Handle(fmt.Sprintf("/healthz/%v", check.Name()), adaptCheckToHandler(check.Check)) + mux.Handle(fmt.Sprintf("%s/%v", path, check.Name()), adaptCheckToHandler(check.Check)) } } diff --git a/staging/src/k8s.io/apiserver/pkg/server/healthz/healthz_test.go b/staging/src/k8s.io/apiserver/pkg/server/healthz/healthz_test.go index 99aae5a9eab..a1f761b786b 100644 --- a/staging/src/k8s.io/apiserver/pkg/server/healthz/healthz_test.go +++ b/staging/src/k8s.io/apiserver/pkg/server/healthz/healthz_test.go @@ -42,6 +42,38 @@ func TestInstallHandler(t *testing.T) { } } +func TestInstallPathHandler(t *testing.T) { + mux := http.NewServeMux() + InstallPathHandler(mux, "/healthz/test") + InstallPathHandler(mux, "/healthz/ready") + req, err := http.NewRequest("GET", "http://example.com/healthz/test", nil) + if err != nil { + t.Fatalf("unexpected error: %v", err) + } + w := httptest.NewRecorder() + mux.ServeHTTP(w, req) + if w.Code != http.StatusOK { + t.Errorf("expected %v, got %v", http.StatusOK, w.Code) + } + if w.Body.String() != "ok" { + t.Errorf("expected %v, got %v", "ok", w.Body.String()) + } + + req, err = http.NewRequest("GET", "http://example.com/healthz/ready", nil) + if err != nil { + t.Fatalf("unexpected error: %v", err) + } + w = httptest.NewRecorder() + mux.ServeHTTP(w, req) + if w.Code != http.StatusOK { + t.Errorf("expected %v, got %v", http.StatusOK, w.Code) + } + if w.Body.String() != "ok" { + t.Errorf("expected %v, got %v", "ok", w.Body.String()) + } + +} + func TestMulitipleChecks(t *testing.T) { tests := []struct { path string