Skip to content

Commit 272b1cd

Browse files
fix(routing, maintenance): check for existence of pointer before reading it. (#195)
Also add tests for the behavior
1 parent aded419 commit 272b1cd

4 files changed

Lines changed: 247 additions & 8 deletions

File tree

cmd/maintenance.go

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -18,10 +18,10 @@ func (d DeisCmd) MaintenanceInfo(appID string) error {
1818
return err
1919
}
2020

21-
if *appSettings.Maintenance {
22-
d.Println("Maintenance mode is on.")
23-
} else {
21+
if appSettings.Maintenance == nil || !*appSettings.Maintenance {
2422
d.Println("Maintenance mode is off.")
23+
} else {
24+
d.Println("Maintenance mode is on.")
2525
}
2626
return nil
2727
}
@@ -47,7 +47,7 @@ func (d DeisCmd) MaintenanceEnable(appID string) error {
4747
return err
4848
}
4949

50-
d.Print("done\n\n")
50+
d.Println("done")
5151
return nil
5252
}
5353

@@ -72,6 +72,6 @@ func (d DeisCmd) MaintenanceDisable(appID string) error {
7272
return err
7373
}
7474

75-
d.Print("done\n\n")
75+
d.Println("done")
7676
return nil
7777
}

cmd/maintenance_test.go

Lines changed: 120 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,120 @@
1+
package cmd
2+
3+
import (
4+
"bytes"
5+
"fmt"
6+
"net/http"
7+
"testing"
8+
9+
"github.com/arschles/assert"
10+
"github.com/deis/controller-sdk-go/api"
11+
"github.com/deis/workflow-cli/pkg/testutil"
12+
)
13+
14+
func TestMaintenanceInfo(t *testing.T) {
15+
t.Parallel()
16+
cf, server, err := testutil.NewTestServerAndClient()
17+
if err != nil {
18+
t.Fatal(err)
19+
}
20+
defer server.Close()
21+
var b bytes.Buffer
22+
cmdr := DeisCmd{WOut: &b, ConfigFile: cf}
23+
24+
server.Mux.HandleFunc("/v2/apps/rivendell/settings/", func(w http.ResponseWriter, r *http.Request) {
25+
testutil.SetHeaders(w)
26+
fmt.Fprintf(w, `{
27+
"owner": "elrond",
28+
"app": "rivendell",
29+
"maintenance": true,
30+
"routable": true,
31+
"created": "2014-01-01T00:00:00UTC",
32+
"updated": "2014-01-01T00:00:00UTC",
33+
"uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75"
34+
}`)
35+
})
36+
37+
err = cmdr.MaintenanceInfo("rivendell")
38+
assert.NoErr(t, err)
39+
assert.Equal(t, b.String(), "Maintenance mode is on.\n", "output")
40+
41+
server.Mux.HandleFunc("/v2/apps/mordor/settings/", func(w http.ResponseWriter, r *http.Request) {
42+
testutil.SetHeaders(w)
43+
fmt.Fprintf(w, `{
44+
"owner": "sauron",
45+
"app": "mordor",
46+
"maintenance": false,
47+
"routable": true,
48+
"created": "2014-01-01T00:00:00UTC",
49+
"updated": "2014-01-01T00:00:00UTC",
50+
"uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75"
51+
}`)
52+
})
53+
b.Reset()
54+
55+
err = cmdr.MaintenanceInfo("mordor")
56+
assert.NoErr(t, err)
57+
assert.Equal(t, b.String(), "Maintenance mode is off.\n", "output")
58+
59+
// test that no routable field doesn't trigger a panic
60+
server.Mux.HandleFunc("/v2/apps/gondor/settings/", func(w http.ResponseWriter, r *http.Request) {
61+
testutil.SetHeaders(w)
62+
fmt.Fprintf(w, `{
63+
"owner": "aragorn",
64+
"app": "gondor",
65+
"routable": true,
66+
"created": "2014-01-01T00:00:00UTC",
67+
"updated": "2014-01-01T00:00:00UTC",
68+
"uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75"
69+
}`)
70+
})
71+
b.Reset()
72+
73+
err = cmdr.MaintenanceInfo("gondor")
74+
assert.NoErr(t, err)
75+
assert.Equal(t, b.String(), "Maintenance mode is off.\n", "output")
76+
}
77+
78+
func TestMaintenanceEnable(t *testing.T) {
79+
t.Parallel()
80+
cf, server, err := testutil.NewTestServerAndClient()
81+
if err != nil {
82+
t.Fatal(err)
83+
}
84+
defer server.Close()
85+
var b bytes.Buffer
86+
cmdr := DeisCmd{WOut: &b, ConfigFile: cf}
87+
88+
server.Mux.HandleFunc("/v2/apps/lothlorien/settings/", func(w http.ResponseWriter, r *http.Request) {
89+
testutil.SetHeaders(w)
90+
maintenance := true
91+
testutil.AssertBody(t, api.AppSettings{Maintenance: &maintenance}, r)
92+
fmt.Fprintf(w, `{}`)
93+
})
94+
95+
err = cmdr.MaintenanceEnable("lothlorien")
96+
assert.NoErr(t, err)
97+
assert.Equal(t, testutil.StripProgress(b.String()), "Enabling maintenance mode for lothlorien... done\n", "output")
98+
}
99+
100+
func TestMaintenanceDisable(t *testing.T) {
101+
t.Parallel()
102+
cf, server, err := testutil.NewTestServerAndClient()
103+
if err != nil {
104+
t.Fatal(err)
105+
}
106+
defer server.Close()
107+
var b bytes.Buffer
108+
cmdr := DeisCmd{WOut: &b, ConfigFile: cf}
109+
110+
server.Mux.HandleFunc("/v2/apps/bree/settings/", func(w http.ResponseWriter, r *http.Request) {
111+
testutil.SetHeaders(w)
112+
maintenance := false
113+
testutil.AssertBody(t, api.AppSettings{Maintenance: &maintenance}, r)
114+
fmt.Fprintf(w, `{}`)
115+
})
116+
117+
err = cmdr.MaintenanceDisable("bree")
118+
assert.NoErr(t, err)
119+
assert.Equal(t, testutil.StripProgress(b.String()), "Disabling maintenance mode for bree... done\n", "output")
120+
}

cmd/routing.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ func (d DeisCmd) RoutingInfo(appID string) error {
1818
return err
1919
}
2020

21-
if *appSettings.Routable {
21+
if appSettings.Routable == nil || *appSettings.Routable {
2222
d.Println("Routing is enabled.")
2323
} else {
2424
d.Println("Routing is disabled.")
@@ -47,7 +47,7 @@ func (d DeisCmd) RoutingEnable(appID string) error {
4747
return err
4848
}
4949

50-
d.Print("done\n\n")
50+
d.Println("done")
5151
return nil
5252
}
5353

@@ -73,6 +73,6 @@ func (d DeisCmd) RoutingDisable(appID string) error {
7373
return err
7474
}
7575

76-
d.Print("done\n\n")
76+
d.Println("done")
7777
return nil
7878
}

cmd/routing_test.go

Lines changed: 119 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,119 @@
1+
package cmd
2+
3+
import (
4+
"bytes"
5+
"fmt"
6+
"net/http"
7+
"testing"
8+
9+
"github.com/arschles/assert"
10+
"github.com/deis/controller-sdk-go/api"
11+
"github.com/deis/workflow-cli/pkg/testutil"
12+
)
13+
14+
func TestRoutingInfo(t *testing.T) {
15+
t.Parallel()
16+
cf, server, err := testutil.NewTestServerAndClient()
17+
if err != nil {
18+
t.Fatal(err)
19+
}
20+
defer server.Close()
21+
var b bytes.Buffer
22+
cmdr := DeisCmd{WOut: &b, ConfigFile: cf}
23+
24+
server.Mux.HandleFunc("/v2/apps/rivendell/settings/", func(w http.ResponseWriter, r *http.Request) {
25+
testutil.SetHeaders(w)
26+
fmt.Fprintf(w, `{
27+
"owner": "elrond",
28+
"app": "rivendell",
29+
"maintenance": true,
30+
"routable": true,
31+
"created": "2014-01-01T00:00:00UTC",
32+
"updated": "2014-01-01T00:00:00UTC",
33+
"uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75"
34+
}`)
35+
})
36+
37+
err = cmdr.RoutingInfo("rivendell")
38+
assert.NoErr(t, err)
39+
assert.Equal(t, b.String(), "Routing is enabled.\n", "output")
40+
41+
server.Mux.HandleFunc("/v2/apps/mordor/settings/", func(w http.ResponseWriter, r *http.Request) {
42+
testutil.SetHeaders(w)
43+
fmt.Fprintf(w, `{
44+
"owner": "sauron",
45+
"app": "mordor",
46+
"maintenance": true,
47+
"routable": false,
48+
"created": "2014-01-01T00:00:00UTC",
49+
"updated": "2014-01-01T00:00:00UTC",
50+
"uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75"
51+
}`)
52+
})
53+
b.Reset()
54+
55+
err = cmdr.RoutingInfo("mordor")
56+
assert.NoErr(t, err)
57+
assert.Equal(t, b.String(), "Routing is disabled.\n", "output")
58+
59+
// test that no routable field doesn't trigger a panic
60+
server.Mux.HandleFunc("/v2/apps/gondor/settings/", func(w http.ResponseWriter, r *http.Request) {
61+
testutil.SetHeaders(w)
62+
fmt.Fprintf(w, `{
63+
"owner": "aragorn",
64+
"app": "gondor",
65+
"maintenance": true,
66+
"created": "2014-01-01T00:00:00UTC",
67+
"updated": "2014-01-01T00:00:00UTC",
68+
"uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75"
69+
}`)
70+
})
71+
b.Reset()
72+
73+
err = cmdr.RoutingInfo("gondor")
74+
assert.NoErr(t, err)
75+
assert.Equal(t, b.String(), "Routing is enabled.\n", "output")
76+
}
77+
78+
func TestRoutingEnable(t *testing.T) {
79+
t.Parallel()
80+
cf, server, err := testutil.NewTestServerAndClient()
81+
if err != nil {
82+
t.Fatal(err)
83+
}
84+
defer server.Close()
85+
var b bytes.Buffer
86+
cmdr := DeisCmd{WOut: &b, ConfigFile: cf}
87+
88+
server.Mux.HandleFunc("/v2/apps/lothlorien/settings/", func(w http.ResponseWriter, r *http.Request) {
89+
testutil.SetHeaders(w)
90+
testutil.AssertBody(t, api.AppSettings{Routable: api.NewRoutable()}, r)
91+
fmt.Fprintf(w, `{}`)
92+
})
93+
94+
err = cmdr.RoutingEnable("lothlorien")
95+
assert.NoErr(t, err)
96+
assert.Equal(t, testutil.StripProgress(b.String()), "Enabling routing for lothlorien... done\n", "output")
97+
}
98+
99+
func TestRoutingDisable(t *testing.T) {
100+
t.Parallel()
101+
cf, server, err := testutil.NewTestServerAndClient()
102+
if err != nil {
103+
t.Fatal(err)
104+
}
105+
defer server.Close()
106+
var b bytes.Buffer
107+
cmdr := DeisCmd{WOut: &b, ConfigFile: cf}
108+
109+
server.Mux.HandleFunc("/v2/apps/bree/settings/", func(w http.ResponseWriter, r *http.Request) {
110+
testutil.SetHeaders(w)
111+
routable := false
112+
testutil.AssertBody(t, api.AppSettings{Routable: &routable}, r)
113+
fmt.Fprintf(w, `{}`)
114+
})
115+
116+
err = cmdr.RoutingDisable("bree")
117+
assert.NoErr(t, err)
118+
assert.Equal(t, testutil.StripProgress(b.String()), "Disabling routing for bree... done\n", "output")
119+
}

0 commit comments

Comments
 (0)