2024-05-28 01:53:09 +02:00
|
|
|
package kubeprobes
|
|
|
|
|
|
|
|
import (
|
|
|
|
"net/http"
|
|
|
|
"net/http/httptest"
|
|
|
|
"testing"
|
|
|
|
)
|
|
|
|
|
|
|
|
func getStatusFromEndpoint(t *testing.T, client *http.Client, endpoint string) int {
|
|
|
|
t.Helper()
|
|
|
|
resp, err := client.Get(endpoint)
|
|
|
|
if err != nil {
|
|
|
|
t.Errorf("error getting status from endpoint: %s", err)
|
|
|
|
}
|
|
|
|
return resp.StatusCode
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestValidation(t *testing.T) {
|
|
|
|
var (
|
|
|
|
live, _ = NewManualProbe("live")
|
|
|
|
ready, _ = NewManualProbe("ready")
|
|
|
|
)
|
|
|
|
|
|
|
|
tests := map[string]struct {
|
|
|
|
opts []Option
|
|
|
|
expectedError bool
|
|
|
|
}{
|
|
|
|
"no modifications and no error": {
|
|
|
|
opts: []Option{
|
|
|
|
WithLivenessProbes(live),
|
|
|
|
WithReadinessProbes(ready),
|
|
|
|
},
|
|
|
|
},
|
|
|
|
"modifications and no error": {
|
|
|
|
opts: []Option{
|
|
|
|
WithLivenessProbes(live),
|
|
|
|
WithReadinessProbes(ready),
|
|
|
|
WithLivenessPath("/livez"),
|
|
|
|
WithReadinessPath("/readyz"),
|
|
|
|
},
|
|
|
|
},
|
|
|
|
"missing liveness probes": {
|
|
|
|
opts: []Option{
|
|
|
|
WithReadinessProbes(ready),
|
|
|
|
},
|
|
|
|
expectedError: true,
|
|
|
|
},
|
|
|
|
"missing readiness probes": {
|
|
|
|
opts: []Option{
|
|
|
|
WithLivenessProbes(live),
|
|
|
|
},
|
|
|
|
expectedError: true,
|
|
|
|
},
|
|
|
|
"liveness probe path empty": {
|
|
|
|
opts: []Option{
|
|
|
|
WithLivenessProbes(live),
|
|
|
|
WithReadinessProbes(ready),
|
|
|
|
WithLivenessPath(""),
|
|
|
|
},
|
|
|
|
expectedError: true,
|
|
|
|
},
|
|
|
|
"readiness probe path empty": {
|
|
|
|
opts: []Option{
|
|
|
|
WithLivenessProbes(live),
|
|
|
|
WithReadinessProbes(ready),
|
|
|
|
WithReadinessPath(""),
|
|
|
|
},
|
|
|
|
expectedError: true,
|
|
|
|
},
|
|
|
|
"liveness probe path does not start with slash": {
|
|
|
|
opts: []Option{
|
|
|
|
WithLivenessProbes(live),
|
|
|
|
WithReadinessProbes(ready),
|
|
|
|
WithLivenessPath("livez"),
|
|
|
|
},
|
|
|
|
expectedError: true,
|
|
|
|
},
|
|
|
|
"readiness probe path does not start with slash": {
|
|
|
|
opts: []Option{
|
|
|
|
WithLivenessProbes(live),
|
|
|
|
WithReadinessProbes(ready),
|
|
|
|
WithReadinessPath("readyz"),
|
|
|
|
},
|
|
|
|
expectedError: true,
|
|
|
|
},
|
|
|
|
"liveness and readiness probe paths are equal": {
|
|
|
|
opts: []Option{
|
|
|
|
WithLivenessProbes(live),
|
|
|
|
WithReadinessProbes(ready),
|
|
|
|
WithLivenessPath("/check"),
|
|
|
|
WithReadinessPath("/check"),
|
|
|
|
},
|
|
|
|
expectedError: true,
|
|
|
|
},
|
|
|
|
}
|
|
|
|
|
|
|
|
for name, tc := range tests {
|
|
|
|
name, tc := name, tc
|
|
|
|
t.Run(name, func(t *testing.T) {
|
|
|
|
_, err := New(tc.opts...)
|
|
|
|
switch {
|
|
|
|
case err == nil && tc.expectedError:
|
|
|
|
t.Error("expected error, but no error was returned")
|
|
|
|
case err != nil && !tc.expectedError:
|
|
|
|
t.Errorf("expected no error but got %v", err)
|
|
|
|
}
|
|
|
|
})
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestHandler(t *testing.T) {
|
|
|
|
var (
|
|
|
|
live, _ = NewManualProbe("live")
|
|
|
|
ready, _ = NewManualProbe("ready")
|
|
|
|
)
|
|
|
|
|
|
|
|
tests := map[string]struct {
|
|
|
|
livenessProbeTransformation func(*testing.T, ManualProbe)
|
|
|
|
readinessProbeTransformation func(*testing.T, ManualProbe)
|
|
|
|
expectedLiveStatus int
|
|
|
|
expectedReadyStatus int
|
|
|
|
}{
|
|
|
|
"not live": {
|
|
|
|
livenessProbeTransformation: markAsDown,
|
|
|
|
readinessProbeTransformation: markAsDown,
|
|
|
|
expectedLiveStatus: http.StatusServiceUnavailable,
|
|
|
|
expectedReadyStatus: http.StatusServiceUnavailable,
|
|
|
|
},
|
|
|
|
"live but not ready": {
|
|
|
|
livenessProbeTransformation: markAsUp,
|
|
|
|
readinessProbeTransformation: markAsDown,
|
|
|
|
expectedLiveStatus: http.StatusOK,
|
|
|
|
expectedReadyStatus: http.StatusServiceUnavailable,
|
|
|
|
},
|
|
|
|
"live and ready": {
|
|
|
|
livenessProbeTransformation: markAsUp,
|
|
|
|
readinessProbeTransformation: markAsUp,
|
|
|
|
expectedLiveStatus: http.StatusOK,
|
|
|
|
expectedReadyStatus: http.StatusOK,
|
|
|
|
},
|
|
|
|
"ready but not live - should never happen": {
|
|
|
|
livenessProbeTransformation: markAsDown,
|
|
|
|
readinessProbeTransformation: markAsUp,
|
|
|
|
expectedLiveStatus: http.StatusServiceUnavailable,
|
|
|
|
expectedReadyStatus: http.StatusServiceUnavailable,
|
|
|
|
},
|
|
|
|
}
|
|
|
|
|
|
|
|
kp, err := New(
|
|
|
|
WithLivenessProbes(live),
|
|
|
|
WithReadinessProbes(ready),
|
|
|
|
)
|
|
|
|
if err != nil {
|
|
|
|
t.Errorf("expected no error, got %v", err)
|
|
|
|
}
|
|
|
|
|
|
|
|
srv := httptest.NewServer(kp)
|
|
|
|
defer srv.Close()
|
|
|
|
client := srv.Client()
|
|
|
|
|
|
|
|
for name, test := range tests {
|
|
|
|
name, test := name, test
|
|
|
|
t.Run(name, func(t *testing.T) {
|
|
|
|
test.livenessProbeTransformation(t, live)
|
|
|
|
test.readinessProbeTransformation(t, ready)
|
|
|
|
|
|
|
|
liveStatus := getStatusFromEndpoint(t, client, srv.URL+defaultLivenessPath)
|
|
|
|
readyStatus := getStatusFromEndpoint(t, client, srv.URL+defaultReadinessPath)
|
|
|
|
otherStatus := getStatusFromEndpoint(t, client, srv.URL+"/something")
|
|
|
|
|
|
|
|
if liveStatus != test.expectedLiveStatus {
|
|
|
|
t.Errorf("expected live status %d, got %d", test.expectedLiveStatus, liveStatus)
|
|
|
|
}
|
|
|
|
if readyStatus != test.expectedReadyStatus {
|
|
|
|
t.Errorf("expected ready status %d, got %d", test.expectedReadyStatus, readyStatus)
|
|
|
|
}
|
|
|
|
if otherStatus != http.StatusNotFound {
|
|
|
|
t.Errorf("expected 404 status, got %d", otherStatus)
|
|
|
|
}
|
|
|
|
})
|
|
|
|
}
|
|
|
|
}
|