Skip to content

Commit c9fb830

Browse files
authored
Merge pull request #273 from zinuzoid/new-label-cmd
feat(label-cmd): add Label cmd
2 parents 8782839 + 8ab113f commit c9fb830

10 files changed

Lines changed: 452 additions & 2 deletions

File tree

cmd/apps.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -134,6 +134,12 @@ func (d *DeisCmd) AppInfo(appID string) error {
134134
return err
135135
}
136136

137+
d.Println()
138+
// print the app labels
139+
if err = d.LabelsList(app.ID); err != nil {
140+
return err
141+
}
142+
137143
d.Println()
138144

139145
return nil

cmd/apps_test.go

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -165,6 +165,20 @@ func TestAppsInfo(t *testing.T) {
165165
}`)
166166
})
167167

168+
server.Mux.HandleFunc("/v2/apps/lorem-ipsum/settings/", func(w http.ResponseWriter, r *http.Request) {
169+
testutil.SetHeaders(w)
170+
fmt.Fprintf(w, `{
171+
"owner": "elrond",
172+
"app": "lorem-ipsum",
173+
"created": "2014-01-01T00:00:00UTC",
174+
"updated": "2014-01-01T00:00:00UTC",
175+
"uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75",
176+
"label": {
177+
"team": "frontend"
178+
}
179+
}`)
180+
})
181+
168182
s, err := settings.Load(cmdr.ConfigFile)
169183
if err != nil {
170184
t.Fatal(err)
@@ -196,6 +210,9 @@ lorem-ipsum-cmd-1911796442-48b58 up (v2)
196210
=== lorem-ipsum Domains
197211
lorem-ipsum
198212
213+
=== lorem-ipsum Label
214+
team: frontend
215+
199216
`, "output")
200217
}
201218

cmd/cmd.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,9 @@ type Commander interface {
5252
KeysList(int) error
5353
KeyRemove(string) error
5454
KeyAdd(string, string) error
55+
LabelsList(string) error
56+
LabelsSet(string, []string) error
57+
LabelsUnset(string, []string) error
5558
LimitsList(string) error
5659
LimitsSet(string, []string, string) error
5760
LimitsUnset(string, []string, string) error

cmd/labels.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+
"fmt"
5+
"github.com/deis/controller-sdk-go/api"
6+
"github.com/deis/controller-sdk-go/appsettings"
7+
"strings"
8+
)
9+
10+
// LabelsList list app's labels
11+
func (d *DeisCmd) LabelsList(appID string) error {
12+
s, appID, err := load(d.ConfigFile, appID)
13+
14+
if err != nil {
15+
return err
16+
}
17+
18+
appSettings, err := appsettings.List(s.Client, appID)
19+
if d.checkAPICompatibility(s.Client, err) != nil {
20+
return err
21+
}
22+
23+
d.Printf("=== %s Label\n", appID)
24+
25+
if appSettings.Label == nil || len(appSettings.Label) == 0 {
26+
d.Println("No labels found.")
27+
} else {
28+
d.Println(appSettings.Label)
29+
}
30+
31+
return nil
32+
}
33+
34+
// LabelsSet sets labels for app
35+
func (d *DeisCmd) LabelsSet(appID string, labels []string) error {
36+
s, appID, err := load(d.ConfigFile, appID)
37+
38+
if err != nil {
39+
return err
40+
}
41+
42+
labelsMap, err := parseLabels(labels)
43+
if err != nil {
44+
return err
45+
}
46+
47+
d.Printf("Applying labels on %s... ", appID)
48+
49+
quit := progress(d.WOut)
50+
51+
_, err = appsettings.Set(s.Client, appID, api.AppSettings{Label: labelsMap})
52+
53+
quit <- true
54+
<-quit
55+
56+
if err != nil {
57+
return err
58+
}
59+
60+
d.Println("done")
61+
return nil
62+
}
63+
64+
// LabelsUnset removes labels for the app.
65+
func (d *DeisCmd) LabelsUnset(appID string, labels []string) error {
66+
s, appID, err := load(d.ConfigFile, appID)
67+
68+
if err != nil {
69+
return err
70+
}
71+
72+
labelsMap := make(map[string]interface{})
73+
74+
for _, label := range labels {
75+
labelsMap[label] = nil
76+
}
77+
78+
d.Printf("Removing labels on %s... ", appID)
79+
80+
quit := progress(d.WOut)
81+
82+
_, err = appsettings.Set(s.Client, appID, api.AppSettings{Label: labelsMap})
83+
84+
quit <- true
85+
<-quit
86+
87+
if err != nil {
88+
return err
89+
}
90+
91+
d.Println("done")
92+
return nil
93+
}
94+
95+
func parseLabels(labels []string) (map[string]interface{}, error) {
96+
labelsMap := make(map[string]interface{})
97+
98+
for _, label := range labels {
99+
key, value, err := parseLabel(label)
100+
101+
if err != nil {
102+
return nil, err
103+
}
104+
105+
labelsMap[key] = value
106+
}
107+
108+
return labelsMap, nil
109+
}
110+
111+
func parseLabel(label string) (string, string, error) {
112+
parts := strings.Split(label, "=")
113+
114+
if len(parts) != 2 || parts[0] == "" || parts[1] == "" {
115+
return "", "", fmt.Errorf(`%s is invalid, Must be in format key=value
116+
Examples: git_repo=https://github.com/deis/workflow team=frontend`, label)
117+
}
118+
119+
return parts[0], parts[1], nil
120+
}

cmd/labels_test.go

Lines changed: 113 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,113 @@
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+
"strings"
13+
)
14+
15+
func TestLabelsList(t *testing.T) {
16+
t.Parallel()
17+
cf, server, err := testutil.NewTestServerAndClient()
18+
if err != nil {
19+
t.Fatal(err)
20+
}
21+
defer server.Close()
22+
var b bytes.Buffer
23+
cmdr := DeisCmd{WOut: &b, ConfigFile: cf}
24+
25+
server.Mux.HandleFunc("/v2/apps/rivendell/settings/", func(w http.ResponseWriter, r *http.Request) {
26+
testutil.SetHeaders(w)
27+
fmt.Fprintf(w, `{
28+
"owner": "jim",
29+
"app": "rivendell",
30+
"label": {"git_repo": "https://github.com/deis/controller-sdk-go", "team" : "deis"},
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.LabelsList("rivendell")
38+
assert.NoErr(t, err)
39+
assert.Equal(t, strings.TrimSpace(b.String()), `=== rivendell Label
40+
git_repo: https://github.com/deis/controller-sdk-go
41+
team: deis`, "output")
42+
43+
server.Mux.HandleFunc("/v2/apps/mordor/settings/", func(w http.ResponseWriter, r *http.Request) {
44+
testutil.SetHeaders(w)
45+
fmt.Fprintf(w, `{
46+
"owner": "priw",
47+
"app": "mordor",
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.LabelsList("mordor")
56+
assert.NoErr(t, err)
57+
assert.Equal(t, b.String(), "=== mordor Label\nNo labels found.\n", "output")
58+
}
59+
60+
func TestListsSet(t *testing.T) {
61+
t.Parallel()
62+
cf, server, err := testutil.NewTestServerAndClient()
63+
if err != nil {
64+
t.Fatal(err)
65+
}
66+
defer server.Close()
67+
var b bytes.Buffer
68+
cmdr := DeisCmd{WOut: &b, ConfigFile: cf}
69+
70+
server.Mux.HandleFunc("/v2/apps/lothlorien/settings/", func(w http.ResponseWriter, r *http.Request) {
71+
testutil.SetHeaders(w)
72+
data := map[string]interface{}{
73+
"git_repo": "https://github.com/deis/controller-sdk-go",
74+
"team": "deis",
75+
}
76+
testutil.AssertBody(t, api.AppSettings{Label: data}, r)
77+
fmt.Fprintf(w, "{}")
78+
})
79+
80+
err = cmdr.LabelsSet("lothlorien", []string{
81+
"team=deis",
82+
"git_repo=https://github.com/deis/controller-sdk-go",
83+
})
84+
assert.NoErr(t, err)
85+
assert.Equal(t, testutil.StripProgress(b.String()), "Applying labels on lothlorien... done\n", "output")
86+
}
87+
88+
func TestListsUnset(t *testing.T) {
89+
t.Parallel()
90+
cf, server, err := testutil.NewTestServerAndClient()
91+
if err != nil {
92+
t.Fatal(err)
93+
}
94+
defer server.Close()
95+
var b bytes.Buffer
96+
cmdr := DeisCmd{WOut: &b, ConfigFile: cf}
97+
98+
server.Mux.HandleFunc("/v2/apps/bree/settings/", func(w http.ResponseWriter, r *http.Request) {
99+
testutil.SetHeaders(w)
100+
testutil.AssertBody(t, api.AppSettings{Label: map[string]interface{}{
101+
"team": nil,
102+
"git_repo": nil,
103+
}}, r)
104+
fmt.Fprintf(w, "{}")
105+
})
106+
107+
err = cmdr.LabelsUnset("bree", []string{
108+
"team",
109+
"git_repo",
110+
})
111+
assert.NoErr(t, err)
112+
assert.Equal(t, testutil.StripProgress(b.String()), "Removing labels on bree... done\n", "output")
113+
}

deis.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@ Subcommands, use 'deis help [subcommand]' to learn more::
5656
git manage git for applications
5757
healthchecks manage healthchecks for applications
5858
keys manage ssh keys used for 'git push' deployments
59+
labels manage labels of application
5960
limits manage resource limits for your application
6061
perms manage permissions for applications
6162
ps manage processes inside an app container
@@ -128,6 +129,8 @@ Use 'git push deis master' to deploy to an application.
128129
return 0
129130
case "keys":
130131
err = parser.Keys(argv, &cmdr)
132+
case "labels":
133+
err = parser.Labels(argv, &cmdr)
131134
case "limits":
132135
err = parser.Limits(argv, &cmdr)
133136
case "perms":

glide.lock

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

glide.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,4 +16,4 @@ import:
1616
- package: github.com/olekukonko/tablewriter
1717
- package: github.com/arschles/assert
1818
- package: github.com/deis/controller-sdk-go
19-
version: bb310847bd314e0f170e807db61acdc33246e0c0
19+
version: 685c7f75bc1c4b57899a7cde55d945aa16129513

0 commit comments

Comments
 (0)