Skip to content

Commit 3cb4ad3

Browse files
committed
feat(whitelist): Add support for ip whitlising for app
1 parent aded419 commit 3cb4ad3

5 files changed

Lines changed: 280 additions & 0 deletions

File tree

cmd/cmd.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,9 @@ type Commander interface {
7474
TagsSet(string, []string) error
7575
TagsUnset(string, []string) error
7676
UsersList(results int) error
77+
WhitelistAdd(string, string) error
78+
WhitelistList(string) error
79+
WhitelistRemove(string, string) error
7780
Println(...interface{}) (int, error)
7881
Print(...interface{}) (int, error)
7982
Printf(string, ...interface{}) (int, error)

cmd/whitelist.go

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
package cmd
2+
3+
import (
4+
"strings"
5+
6+
"github.com/deis/controller-sdk-go/whitelist"
7+
)
8+
9+
// WhitelistList lists the addresses whitelisted for app
10+
func (d DeisCmd) WhitelistList(appID string) error {
11+
s, appID, err := load(d.ConfigFile, appID)
12+
13+
if err != nil {
14+
return err
15+
}
16+
17+
whitelist, err := whitelist.List(s.Client, appID)
18+
if checkAPICompatibility(s.Client, err, d.WErr) != nil {
19+
return err
20+
}
21+
22+
d.Printf("=== %s Whitelisted Addresses", appID)
23+
24+
for _, ip := range whitelist.Addresses {
25+
d.Println(ip)
26+
}
27+
return nil
28+
}
29+
30+
// WhitelistAdd adds the addresses to the app's Whitelist.
31+
func (d DeisCmd) WhitelistAdd(appID, IPs string) error {
32+
s, appID, err := load(d.ConfigFile, appID)
33+
34+
if err != nil {
35+
return err
36+
}
37+
38+
d.Printf("Adding %s to %s whitelist...\n", IPs, appID)
39+
40+
quit := progress(d.WOut)
41+
_, err = whitelist.Add(s.Client, appID, strings.Split(IPs, ","))
42+
quit <- true
43+
<-quit
44+
if checkAPICompatibility(s.Client, err, d.WErr) != nil {
45+
return err
46+
}
47+
48+
d.Println("done")
49+
return nil
50+
}
51+
52+
// WhitelistRemove deletes the addresses from the app's Whitelist.
53+
func (d DeisCmd) WhitelistRemove(appID, IPs string) error {
54+
s, appID, err := load(d.ConfigFile, appID)
55+
56+
if err != nil {
57+
return err
58+
}
59+
60+
d.Printf("Removing %s from %s whitelist...\n", IPs, appID)
61+
62+
quit := progress(d.WOut)
63+
err = whitelist.Delete(s.Client, appID, strings.Split(IPs, ","))
64+
quit <- true
65+
<-quit
66+
if checkAPICompatibility(s.Client, err, d.WErr) != nil {
67+
return err
68+
}
69+
70+
d.Println("done")
71+
return nil
72+
}

cmd/whitelist_test.go

Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
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 TestWhitelistList(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/foo/whitelist/", func(w http.ResponseWriter, r *http.Request) {
25+
testutil.SetHeaders(w)
26+
fmt.Fprintf(w, `{
27+
"addresses": ["1.2.3.4", "0.0.0.0/0"]
28+
}`)
29+
})
30+
31+
err = cmdr.WhitelistList("foo")
32+
assert.NoErr(t, err)
33+
34+
assert.Equal(t, b.String(), "=== foo Whitelisted Addresses1.2.3.4\n0.0.0.0/0\n", "output")
35+
}
36+
37+
func TestWhitelistAdd(t *testing.T) {
38+
t.Parallel()
39+
cf, server, err := testutil.NewTestServerAndClient()
40+
if err != nil {
41+
t.Fatal(err)
42+
}
43+
defer server.Close()
44+
var b bytes.Buffer
45+
cmdr := DeisCmd{WOut: &b, ConfigFile: cf}
46+
47+
server.Mux.HandleFunc("/v2/apps/foo/whitelist/", func(w http.ResponseWriter, r *http.Request) {
48+
testutil.AssertBody(t, api.Whitelist{Addresses: []string{"1.2.3.4", "0.0.0.0/0"}}, r)
49+
testutil.SetHeaders(w)
50+
w.WriteHeader(http.StatusCreated)
51+
// Body isn't used by CLI, so it isn't set.
52+
w.Write([]byte("{}"))
53+
})
54+
55+
err = cmdr.WhitelistAdd("foo", "1.2.3.4,0.0.0.0/0")
56+
assert.NoErr(t, err)
57+
58+
assert.Equal(t, testutil.StripProgress(b.String()), "Adding 1.2.3.4,0.0.0.0/0 to foo whitelist...\ndone\n", "output")
59+
}
60+
61+
func TestWhitelistRemove(t *testing.T) {
62+
t.Parallel()
63+
cf, server, err := testutil.NewTestServerAndClient()
64+
if err != nil {
65+
t.Fatal(err)
66+
}
67+
defer server.Close()
68+
var b bytes.Buffer
69+
cmdr := DeisCmd{WOut: &b, ConfigFile: cf}
70+
71+
server.Mux.HandleFunc("/v2/apps/foo/whitelist/", func(w http.ResponseWriter, r *http.Request) {
72+
testutil.AssertBody(t, api.Whitelist{Addresses: []string{"1.2.3.4"}}, r)
73+
testutil.SetHeaders(w)
74+
w.WriteHeader(http.StatusCreated)
75+
// Body isn't used by CLI, so it isn't set.
76+
w.Write([]byte("{}"))
77+
})
78+
79+
err = cmdr.WhitelistRemove("foo", "1.2.3.4")
80+
assert.NoErr(t, err)
81+
82+
assert.Equal(t, testutil.StripProgress(b.String()), "Removing 1.2.3.4 from foo whitelist...\ndone\n", "output")
83+
}

deis.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@ Subcommands, use 'deis help [subcommand]' to learn more::
6363
tags manage tags for application containers
6464
users manage users
6565
version display client version
66+
whitelist manage whitelisted addresses of an application
6667
6768
Shortcut commands, use 'deis shortcuts' to see all::
6869
@@ -143,6 +144,8 @@ Use 'git push deis master' to deploy to an application.
143144
err = parser.Users(argv, &cmdr)
144145
case "version":
145146
err = parser.Version(argv)
147+
case "whitelist":
148+
err = parser.Whitelist(argv, &cmdr)
146149
default:
147150
env := os.Environ()
148151
extCmd := "deis-" + command

parser/whitelist.go

Lines changed: 119 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,119 @@
1+
package parser
2+
3+
import (
4+
"github.com/deis/workflow-cli/cmd"
5+
docopt "github.com/docopt/docopt-go"
6+
)
7+
8+
// Whitelist displays all relevant commands for `deis whitelist`.
9+
func Whitelist(argv []string, cmdr cmd.Commander) error {
10+
usage := `
11+
Valid commands for whitelist:
12+
13+
whitelist:add adds addresses to the application's whitelist
14+
whitelist:list list addresses in the application's whitelist
15+
whitelist:remove remove addresses from the application's whitelist
16+
17+
Use 'deis help [command]' to learn more.
18+
`
19+
20+
switch argv[0] {
21+
case "whitelist:add":
22+
return whitelistAdd(argv, cmdr)
23+
case "whitelist:list":
24+
return whitelistList(argv, cmdr)
25+
case "whitelist:remove":
26+
return whitelistRemove(argv, cmdr)
27+
default:
28+
if printHelp(argv, usage) {
29+
return nil
30+
}
31+
32+
if argv[0] == "whitelist" {
33+
argv[0] = "whitelist:list"
34+
return whitelistList(argv, cmdr)
35+
}
36+
37+
PrintUsage(cmdr)
38+
return nil
39+
}
40+
}
41+
42+
func whitelistAdd(argv []string, cmdr cmd.Commander) error {
43+
usage := `
44+
Adds addresses to an application whitelist.
45+
46+
Usage: deis whitelist:add <addresses> [options]
47+
48+
Arguments:
49+
<addresses>
50+
comma-delimited list of addresses(using IP or CIDR notation) to be whitelisted for the application, such as '1.2.3.4' or '1.2.3.4,0.0.0.0/0'.
51+
52+
Options:
53+
-a --app=<app>
54+
the uniquely identifiable name for the application.
55+
`
56+
57+
args, err := docopt.Parse(usage, argv, true, "", false, true)
58+
59+
if err != nil {
60+
return err
61+
}
62+
63+
app := safeGetValue(args, "--app")
64+
addresses := safeGetValue(args, "<addresses>")
65+
66+
return cmdr.WhitelistAdd(app, addresses)
67+
}
68+
69+
func whitelistList(argv []string, cmdr cmd.Commander) error {
70+
usage := `
71+
Lists whitelisted addresses for an application.
72+
73+
Usage: deis whitelist:list [options]
74+
75+
Options:
76+
-a --app=<app>
77+
the uniquely identifiable name for the application.
78+
`
79+
80+
args, err := docopt.Parse(usage, argv, true, "", false, true)
81+
82+
if err != nil {
83+
return err
84+
}
85+
86+
if err != nil {
87+
return err
88+
}
89+
app := safeGetValue(args, "--app")
90+
91+
return cmdr.WhitelistList(app)
92+
}
93+
94+
func whitelistRemove(argv []string, cmdr cmd.Commander) error {
95+
usage := `
96+
Removes addresses from an application whitelist.
97+
98+
Usage: deis whitelist:remove <addresses> [options]
99+
100+
Arguments:
101+
<addresses>
102+
comma-delimited list of addresses(using IP or CIDR notation) to be whitelisted for the application, such as '1.2.3.4' or "1.2.3.4,0.0.0.0/0".
103+
104+
Options:
105+
-a --app=<app>
106+
the uniquely identifiable name for the application.
107+
`
108+
109+
args, err := docopt.Parse(usage, argv, true, "", false, true)
110+
111+
if err != nil {
112+
return err
113+
}
114+
115+
app := safeGetValue(args, "--app")
116+
addresses := safeGetValue(args, "<addresses>")
117+
118+
return cmdr.WhitelistRemove(app, addresses)
119+
}

0 commit comments

Comments
 (0)