Skip to content

Commit fac2107

Browse files
authored
Support failing root handler on env var (#23)
1 parent 0ea35cb commit fac2107

File tree

5 files changed

+54
-22
lines changed

5 files changed

+54
-22
lines changed

.pre-commit-config.yaml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
1+
repos:
12
- repo: https://github.com/pre-commit/pre-commit-hooks
23
rev: v2.4.0
34
hooks:
45
- id: trailing-whitespace
56
- id: end-of-file-fixer
6-
- repo: git://github.com/dnephin/pre-commit-golang
7+
- repo: https://github.com/golangci/golangci-lint
78
rev: master
89
hooks:
9-
- id: go-fmt
10-
- id: go-lint
10+
- id: golangci-lint

README.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,10 @@ To override the default values:
1818

1919
* _INFRABIN_MAX_DELAY_ to change the maximum value for the `/delay` endpoint. Default to 120.
2020

21+
## Environment variables
22+
23+
* `FAIL_ROOT_HANDLER`: if set, the `/` endpoint will return a 503. This is useful when doing a B/G deployment to test the failure and rollback scenario.
24+
2125
## Service Endpoints
2226

2327
* `GET /`

cmd/go-infrabin/main.go

Lines changed: 24 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -14,26 +14,33 @@ import (
1414

1515
// RootHandler handles the "/" endpoint
1616
func RootHandler(w http.ResponseWriter, r *http.Request) {
17-
hostname, err := os.Hostname()
18-
if err != nil {
19-
log.Fatalf("cannot get hostname: %v", err)
20-
}
2117
w.Header().Set("Content-Type", "application/json")
22-
w.WriteHeader(http.StatusOK)
2318

24-
var resp helpers.Response
25-
resp.Hostname = hostname
26-
resp.KubeResponse = &helpers.KubeResponse{
27-
PodName: helpers.GetEnv("POD_NAME", ""),
28-
Namespace: helpers.GetEnv("POD_NAMESPACE", ""),
29-
PodIP: helpers.GetEnv("POD_IP", ""),
30-
NodeName: helpers.GetEnv("NODE_NAME", ""),
31-
}
19+
fail := helpers.GetEnv("FAIL_ROOT_HANDLER", "")
20+
if fail != "" {
21+
w.WriteHeader(http.StatusServiceUnavailable)
22+
} else {
23+
w.WriteHeader(http.StatusOK)
3224

33-
data := helpers.MarshalResponseToString(resp)
34-
_, err = io.WriteString(w, data)
35-
if err != nil {
36-
log.Fatal("error writing to ResponseWriter: ", err)
25+
hostname, err := os.Hostname()
26+
if err != nil {
27+
log.Fatalf("cannot get hostname: %v", err)
28+
}
29+
30+
var resp helpers.Response
31+
resp.Hostname = hostname
32+
resp.KubeResponse = &helpers.KubeResponse{
33+
PodName: helpers.GetEnv("POD_NAME", ""),
34+
Namespace: helpers.GetEnv("POD_NAMESPACE", ""),
35+
PodIP: helpers.GetEnv("POD_IP", ""),
36+
NodeName: helpers.GetEnv("NODE_NAME", ""),
37+
}
38+
39+
data := helpers.MarshalResponseToString(resp)
40+
_, err = io.WriteString(w, data)
41+
if err != nil {
42+
log.Fatal("error writing to ResponseWriter: ", err)
43+
}
3744
}
3845
}
3946

cmd/go-infrabin/main_test.go

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,28 @@ func TestRootHandler(t *testing.T) {
4444
}
4545
}
4646

47+
func TestFailRootHandler(t *testing.T) {
48+
if err := os.Setenv("FAIL_ROOT_HANDLER", "true"); err != nil {
49+
t.Errorf("cannot set environment variable")
50+
}
51+
req, err := http.NewRequest("GET", "/", nil)
52+
if err != nil {
53+
t.Fatal(err)
54+
}
55+
56+
rr := httptest.NewRecorder()
57+
handler := http.HandlerFunc(RootHandler)
58+
handler.ServeHTTP(rr, req)
59+
60+
if status := rr.Code; status != http.StatusServiceUnavailable {
61+
t.Errorf("handler returned wrong status code: got %v want %v",
62+
status, http.StatusServiceUnavailable)
63+
}
64+
if err = os.Unsetenv("FAIL_ROOT_HANDLER"); err != nil {
65+
t.Fatal(err)
66+
}
67+
}
68+
4769
func TestRootHandlerKubernetes(t *testing.T) {
4870
// Set Kubernetes OS env variables
4971
podName := "go-infrabin-hjv8k"

internal/helpers/struct_test.go

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package helpers
22

33
import (
4-
"fmt"
54
"log"
65
"testing"
76
)
@@ -11,7 +10,7 @@ func TestMarshalResponseToString(t *testing.T) {
1110
resp.Hostname = "hal"
1211

1312
data := MarshalResponseToString(resp)
14-
expected := fmt.Sprint(`{"hostname":"hal"}`)
13+
expected := `{"hostname":"hal"}`
1514
if data != expected {
1615
log.Fatalf("error: expected %v got %v", expected, data)
1716
}

0 commit comments

Comments
 (0)