Skip to content

Commit 8215d19

Browse files
committed
Merge pull request #329 from kmala/probe
ref(probes): move k8s probe from liveness into readiness
2 parents b855397 + d8f8f35 commit 8215d19

4 files changed

Lines changed: 59 additions & 27 deletions

File tree

pkg/healthsrv/healthz_handler.go

Lines changed: 4 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,13 @@ import (
66
"time"
77

88
"github.com/deis/builder/pkg/sshd"
9-
"k8s.io/kubernetes/pkg/api"
109
)
1110

1211
const (
1312
waitTimeout = 2 * time.Second
1413
)
1514

16-
func healthZHandler(nsLister NamespaceLister, bLister BucketLister, serverCircuit *sshd.Circuit) http.Handler {
15+
func healthZHandler(bLister BucketLister, serverCircuit *sshd.Circuit) http.Handler {
1716
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
1817
stopCh := make(chan struct{})
1918

@@ -28,11 +27,6 @@ func healthZHandler(nsLister NamespaceLister, bLister BucketLister, serverCircui
2827
go listBuckets(bLister, listBucketsCh, listBucketsErrCh, stopCh)
2928
numChecks++
3029

31-
namespaceListerCh := make(chan *api.NamespaceList)
32-
namespaceListerErrCh := make(chan error)
33-
go listNamespaces(nsLister, namespaceListerCh, namespaceListerErrCh, stopCh)
34-
numChecks++
35-
3630
timeoutCh := time.After(waitTimeout)
3731
defer close(stopCh)
3832
for i := 0; i < numChecks; i++ {
@@ -43,18 +37,14 @@ func healthZHandler(nsLister NamespaceLister, bLister BucketLister, serverCircui
4337
log.Printf("Healthcheck error getting server state (%s)", err)
4438
w.WriteHeader(http.StatusServiceUnavailable)
4539
return
46-
// listing S3 buckets
40+
41+
// listing buckets
4742
case <-listBucketsCh:
4843
case err := <-listBucketsErrCh:
4944
log.Printf("Healthcheck error listing buckets (%s)", err)
5045
w.WriteHeader(http.StatusServiceUnavailable)
5146
return
52-
// listing k8s namespaces
53-
case <-namespaceListerCh:
54-
case err := <-namespaceListerErrCh:
55-
log.Printf("Healthcheck error listing namespaces (%s)", err)
56-
w.WriteHeader(http.StatusServiceUnavailable)
57-
return
47+
5848
// timeout for everything all of the above
5949
case <-timeoutCh:
6050
log.Printf("Healthcheck endpoint timed out after %s", waitTimeout)

pkg/healthsrv/healthz_handler_test.go

Lines changed: 19 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,10 @@ var (
1616
)
1717

1818
func TestHealthZCircuitOpen(t *testing.T) {
19-
nsLister := emptyNamespaceLister{}
2019
bLister := emptyBucketLister{}
2120
c := sshd.NewCircuit()
2221

23-
h := healthZHandler(nsLister, bLister, c)
22+
h := healthZHandler(bLister, c)
2423
w := httptest.NewRecorder()
2524
r, err := http.NewRequest("GET", "/healthz", bytes.NewBuffer(nil))
2625
assert.NoErr(t, err)
@@ -30,11 +29,11 @@ func TestHealthZCircuitOpen(t *testing.T) {
3029
}
3130

3231
func TestHealthZBucketListErr(t *testing.T) {
33-
nsLister := emptyNamespaceLister{}
3432
bLister := errBucketLister{err: errTest}
3533
c := sshd.NewCircuit()
3634
c.Close()
37-
h := healthZHandler(nsLister, bLister, c)
35+
36+
h := healthZHandler(bLister, c)
3837

3938
w := httptest.NewRecorder()
4039
r, err := http.NewRequest("GET", "/healthz", bytes.NewBuffer(nil))
@@ -44,32 +43,40 @@ func TestHealthZBucketListErr(t *testing.T) {
4443
assert.Equal(t, w.Body.Len(), 0, "response body length")
4544
}
4645

47-
func TestHealthZNamespaceListErr(t *testing.T) {
46+
func TestReadinessNamespaceListErr(t *testing.T) {
4847
nsLister := errNamespaceLister{err: errTest}
49-
bLister := emptyBucketLister{}
50-
c := sshd.NewCircuit()
51-
c.Close()
5248

53-
h := healthZHandler(nsLister, bLister, c)
49+
h := readinessHandler(nsLister)
5450
w := httptest.NewRecorder()
55-
r, err := http.NewRequest("GET", "/healthz", bytes.NewBuffer(nil))
51+
r, err := http.NewRequest("GET", "/readiness", bytes.NewBuffer(nil))
5652
assert.NoErr(t, err)
5753
h.ServeHTTP(w, r)
5854
assert.Equal(t, w.Code, http.StatusServiceUnavailable, "response code")
5955
assert.Equal(t, w.Body.Len(), 0, "response body length")
6056
}
6157

6258
func TestHealthZSuccess(t *testing.T) {
63-
nsLister := emptyNamespaceLister{}
6459
bLister := emptyBucketLister{}
6560
c := sshd.NewCircuit()
6661
c.Close()
6762

68-
h := healthZHandler(nsLister, bLister, c)
63+
h := healthZHandler(bLister, c)
6964
w := httptest.NewRecorder()
7065
r, err := http.NewRequest("GET", "/healthz", bytes.NewBuffer(nil))
7166
assert.NoErr(t, err)
7267
h.ServeHTTP(w, r)
7368
assert.Equal(t, w.Code, http.StatusOK, "response code")
7469
assert.Equal(t, w.Body.Len(), 0, "response body length")
7570
}
71+
72+
func TestReadinessSuccess(t *testing.T) {
73+
nsLister := emptyNamespaceLister{}
74+
75+
h := readinessHandler(nsLister)
76+
w := httptest.NewRecorder()
77+
r, err := http.NewRequest("GET", "/readiness", bytes.NewBuffer(nil))
78+
assert.NoErr(t, err)
79+
h.ServeHTTP(w, r)
80+
assert.Equal(t, w.Code, http.StatusOK, "response code")
81+
assert.Equal(t, w.Body.Len(), 0, "response body length")
82+
}

pkg/healthsrv/readiness_handler.go

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
package healthsrv
2+
3+
import (
4+
"log"
5+
"net/http"
6+
"time"
7+
8+
"k8s.io/kubernetes/pkg/api"
9+
)
10+
11+
func readinessHandler(nsLister NamespaceLister) http.Handler {
12+
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
13+
stopCh := make(chan struct{})
14+
15+
namespaceListerCh := make(chan *api.NamespaceList)
16+
namespaceListerErrCh := make(chan error)
17+
go listNamespaces(nsLister, namespaceListerCh, namespaceListerErrCh, stopCh)
18+
19+
timeoutCh := time.After(waitTimeout)
20+
defer close(stopCh)
21+
select {
22+
// listing k8s namespaces
23+
case <-namespaceListerCh:
24+
case err := <-namespaceListerErrCh:
25+
log.Printf("Healthcheck error listing namespaces (%s)", err)
26+
w.WriteHeader(http.StatusServiceUnavailable)
27+
// timeout for everything all of the above
28+
case <-timeoutCh:
29+
log.Printf("Healthcheck endpoint timed out after %s", waitTimeout)
30+
w.WriteHeader(http.StatusServiceUnavailable)
31+
}
32+
w.WriteHeader(http.StatusOK)
33+
})
34+
}

pkg/healthsrv/server.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,8 @@ import (
1111
// with the indicative error.
1212
func Start(port int, nsLister NamespaceLister, bLister BucketLister, sshServerCircuit *sshd.Circuit) error {
1313
mux := http.NewServeMux()
14-
mux.Handle("/healthz", healthZHandler(nsLister, bLister, sshServerCircuit))
14+
mux.Handle("/healthz", healthZHandler(bLister, sshServerCircuit))
15+
mux.Handle("/readiness", readinessHandler(nsLister))
1516

1617
hostStr := fmt.Sprintf(":%d", port)
1718
return http.ListenAndServe(hostStr, mux)

0 commit comments

Comments
 (0)