Skip to content

Commit 57a2202

Browse files
committed
feat(controller-sdk-go): add gateway api
1 parent 1e0e0b1 commit 57a2202

28 files changed

Lines changed: 1895 additions & 353 deletions

cmd/canary.go

Lines changed: 128 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,128 @@
1+
package cmd
2+
3+
import (
4+
"github.com/drycc/controller-sdk-go/api"
5+
"github.com/drycc/controller-sdk-go/appsettings"
6+
"strings"
7+
)
8+
9+
// CanaryList tells the informations about app's autoscale status
10+
func (d *DryccCmd) CanaryInfo(appID string) error {
11+
s, appID, err := load(d.ConfigFile, appID)
12+
13+
if err != nil {
14+
return err
15+
}
16+
17+
appSettings, err := appsettings.List(s.Client, appID)
18+
if d.checkAPICompatibility(s.Client, err) != nil {
19+
return err
20+
}
21+
22+
d.Printf("=== %s Canary\n\n", appID)
23+
24+
for _, procType := range appSettings.Canaries {
25+
d.Println(procType)
26+
}
27+
28+
return nil
29+
}
30+
31+
// CanaryCreate sets canary options for the app proc type.
32+
func (d *DryccCmd) CanaryCreate(appID string, processType []string) error {
33+
s, appID, err := load(d.ConfigFile, appID)
34+
35+
if err != nil {
36+
return err
37+
}
38+
39+
d.Printf("Applying canary settings for process type %s on %s... ", strings.Join(processType, ","), appID)
40+
41+
quit := progress(d.WOut)
42+
_, err = appsettings.Set(s.Client, appID, api.AppSettings{Canaries: processType})
43+
44+
quit <- true
45+
<-quit
46+
47+
if err != nil {
48+
return err
49+
}
50+
51+
d.Println("done")
52+
return nil
53+
}
54+
55+
// CanaryRemove remove canary for the app proc type.
56+
func (d *DryccCmd) CanaryRemove(appID string, processType []string) error {
57+
s, appID, err := load(d.ConfigFile, appID)
58+
59+
if err != nil {
60+
return err
61+
}
62+
63+
d.Printf("Removing canary for process type %s on %s... ", strings.Join(processType, ","), appID)
64+
65+
quit := progress(d.WOut)
66+
67+
err = appsettings.CanaryRemove(s.Client, appID, api.AppSettings{Canaries: processType})
68+
69+
quit <- true
70+
<-quit
71+
72+
if err != nil {
73+
return err
74+
}
75+
76+
d.Println("done")
77+
return nil
78+
}
79+
80+
// CanaryRelease release canary for the app.
81+
func (d *DryccCmd) CanaryRelease(appID string) error {
82+
s, appID, err := load(d.ConfigFile, appID)
83+
84+
if err != nil {
85+
return err
86+
}
87+
88+
d.Printf("Release canary for %s... ", appID)
89+
90+
quit := progress(d.WOut)
91+
92+
err = appsettings.CanaryRelease(s.Client, appID)
93+
94+
quit <- true
95+
<-quit
96+
97+
if err != nil {
98+
return err
99+
}
100+
101+
d.Println("done")
102+
return nil
103+
}
104+
105+
// CanaryRollback rollback canary for the app.
106+
func (d *DryccCmd) CanaryRollback(appID string) error {
107+
s, appID, err := load(d.ConfigFile, appID)
108+
109+
if err != nil {
110+
return err
111+
}
112+
113+
d.Printf("Rollback canary for %s... ", appID)
114+
115+
quit := progress(d.WOut)
116+
117+
err = appsettings.CanaryRollback(s.Client, appID)
118+
119+
quit <- true
120+
<-quit
121+
122+
if err != nil {
123+
return err
124+
}
125+
126+
d.Println("done")
127+
return nil
128+
}

cmd/canary_test.go

Lines changed: 139 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,139 @@
1+
package cmd
2+
3+
import (
4+
"bytes"
5+
"fmt"
6+
"net/http"
7+
"testing"
8+
9+
"github.com/drycc/controller-sdk-go/api"
10+
"github.com/drycc/workflow-cli/pkg/testutil"
11+
"github.com/stretchr/testify/assert"
12+
)
13+
14+
func TestCanaryInfo(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 := DryccCmd{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+
"canaries": ["cmd"],
30+
"created": "2014-01-01T00:00:00UTC",
31+
"updated": "2014-01-01T00:00:00UTC",
32+
"uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75"
33+
}`)
34+
})
35+
36+
err = cmdr.CanaryInfo("rivendell")
37+
assert.NoError(t, err)
38+
assert.Equal(t, b.String(), "=== rivendell Canary\n\ncmd\n", "output")
39+
40+
server.Mux.HandleFunc("/v2/apps/mordor/settings/", func(w http.ResponseWriter, r *http.Request) {
41+
testutil.SetHeaders(w)
42+
fmt.Fprintf(w, `{
43+
"owner": "sauron",
44+
"app": "mordor",
45+
"created": "2014-01-01T00:00:00UTC",
46+
"updated": "2014-01-01T00:00:00UTC",
47+
"uuid": "de1bf5b5-4a72-4f94-a10c-d2a3741cdf75"
48+
}`)
49+
})
50+
b.Reset()
51+
52+
err = cmdr.CanaryInfo("mordor")
53+
assert.NoError(t, err)
54+
assert.Equal(t, b.String(), "=== mordor Canary\n\n", "output")
55+
}
56+
57+
func TestCanaryCreate(t *testing.T) {
58+
t.Parallel()
59+
cf, server, err := testutil.NewTestServerAndClient()
60+
if err != nil {
61+
t.Fatal(err)
62+
}
63+
defer server.Close()
64+
var b bytes.Buffer
65+
cmdr := DryccCmd{WOut: &b, ConfigFile: cf}
66+
67+
server.Mux.HandleFunc("/v2/apps/lothlorien/settings/", func(w http.ResponseWriter, r *http.Request) {
68+
testutil.SetHeaders(w)
69+
data := []string{"cmd"}
70+
testutil.AssertBody(t, api.AppSettings{Canaries: data}, r)
71+
fmt.Fprintf(w, `{}`)
72+
})
73+
74+
err = cmdr.CanaryCreate("lothlorien", []string{"cmd"})
75+
assert.NoError(t, err)
76+
assert.Equal(t, testutil.StripProgress(b.String()), "Applying canary settings for process type cmd on lothlorien... done\n", "output")
77+
}
78+
79+
func TestCanaryRemove(t *testing.T) {
80+
t.Parallel()
81+
cf, server, err := testutil.NewTestServerAndClient()
82+
if err != nil {
83+
t.Fatal(err)
84+
}
85+
defer server.Close()
86+
var b bytes.Buffer
87+
cmdr := DryccCmd{WOut: &b, ConfigFile: cf}
88+
89+
server.Mux.HandleFunc("/v2/apps/bree/settings/", func(w http.ResponseWriter, r *http.Request) {
90+
testutil.SetHeaders(w)
91+
data := []string{"cmd"}
92+
testutil.AssertBody(t, api.AppSettings{Canaries: data}, r)
93+
w.WriteHeader(http.StatusNoContent)
94+
})
95+
96+
err = cmdr.CanaryRemove("bree", []string{"cmd"})
97+
assert.NoError(t, err)
98+
assert.Equal(t, testutil.StripProgress(b.String()), "Removing canary for process type cmd on bree... done\n", "output")
99+
}
100+
101+
func TestCanaryRelease(t *testing.T) {
102+
t.Parallel()
103+
cf, server, err := testutil.NewTestServerAndClient()
104+
if err != nil {
105+
t.Fatal(err)
106+
}
107+
defer server.Close()
108+
var b bytes.Buffer
109+
cmdr := DryccCmd{WOut: &b, ConfigFile: cf}
110+
111+
server.Mux.HandleFunc("/v2/apps/bree/canary/release/", func(w http.ResponseWriter, r *http.Request) {
112+
testutil.SetHeaders(w)
113+
w.WriteHeader(http.StatusNoContent)
114+
})
115+
116+
err = cmdr.CanaryRelease("bree")
117+
assert.NoError(t, err)
118+
assert.Equal(t, testutil.StripProgress(b.String()), "Release canary for bree... done\n", "output")
119+
}
120+
121+
func TestCanaryRollback(t *testing.T) {
122+
t.Parallel()
123+
cf, server, err := testutil.NewTestServerAndClient()
124+
if err != nil {
125+
t.Fatal(err)
126+
}
127+
defer server.Close()
128+
var b bytes.Buffer
129+
cmdr := DryccCmd{WOut: &b, ConfigFile: cf}
130+
131+
server.Mux.HandleFunc("/v2/apps/bree/canary/rollback/", func(w http.ResponseWriter, r *http.Request) {
132+
testutil.SetHeaders(w)
133+
w.WriteHeader(http.StatusNoContent)
134+
})
135+
136+
err = cmdr.CanaryRollback("bree")
137+
assert.NoError(t, err)
138+
assert.Equal(t, testutil.StripProgress(b.String()), "Rollback canary for bree... done\n", "output")
139+
}

cmd/cmd.go

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,11 @@ type Commander interface {
2626
Whoami(bool) error
2727
BuildsList(string, int) error
2828
BuildsCreate(string, string, string, string) error
29+
CanaryInfo(string) error
30+
CanaryCreate(string, []string) error
31+
CanaryRemove(string, []string) error
32+
CanaryRelease(string) error
33+
CanaryRollback(string) error
2934
CertsList(int, time.Time) error
3035
CertAdd(string, string, string) error
3136
CertRemove(string) error
@@ -41,8 +46,18 @@ type Commander interface {
4146
DomainsAdd(string, string) error
4247
DomainsRemove(string, string) error
4348
ServicesList(string) error
44-
ServicesAdd(string, string, string) error
45-
ServicesRemove(string, string) error
49+
ServicesAdd(string, string, string, string) error
50+
ServicesRemove(string, string, string, int) error
51+
GatewaysAdd(string, string, int, string) error
52+
GatewaysList(string, int) error
53+
GatewaysRemove(string, string, int, string) error
54+
RoutesCreate(string, string, string, string, int) error
55+
RoutesList(string, int) error
56+
RoutesGet(string, string) error
57+
RoutesSet(string, string, string) error
58+
RoutesAttach(string, string, int, string) error
59+
RoutesDetach(string, string, int, string) error
60+
RoutesRemove(string, string) error
4661
GitRemote(string, string, bool) error
4762
GitRemove(string) error
4863
HealthchecksList(string, string) error
@@ -85,12 +100,10 @@ type Commander interface {
85100
TLSForceDisable(string) error
86101
TLSAutoEnable(string) error
87102
TLSAutoDisable(string) error
103+
TLSAutoIssuer(string, string, string, string, string) error
88104
UsersList(results int) error
89105
UsersEnable(string) error
90106
UsersDisable(string) error
91-
AllowlistAdd(string, string) error
92-
AllowlistList(string) error
93-
AllowlistRemove(string, string) error
94107
Println(...interface{}) (int, error)
95108
Print(...interface{}) (int, error)
96109
Printf(string, ...interface{}) (int, error)

cmd/gateways.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+
"fmt"
5+
6+
"github.com/drycc/controller-sdk-go/gateways"
7+
"github.com/olekukonko/tablewriter"
8+
)
9+
10+
// GatewaysList lists gateways for the app
11+
func (d *DryccCmd) GatewaysList(appID string, results int) error {
12+
s, appID, err := load(d.ConfigFile, appID)
13+
14+
if err != nil {
15+
return err
16+
}
17+
if results == defaultLimit {
18+
results = s.Limit
19+
}
20+
21+
gateways, count, err := gateways.List(s.Client, appID, results)
22+
if d.checkAPICompatibility(s.Client, err) != nil {
23+
return err
24+
}
25+
d.Printf("=== %s Gateways\n", appID)
26+
if count == 0 {
27+
d.Println("Could not find any gateway")
28+
} else {
29+
table := tablewriter.NewWriter(d.WOut)
30+
table.SetHeader([]string{"Name", "Lisenter", "Port", "Protocol"})
31+
for _, gateway := range gateways {
32+
for _, listener := range gateway.Listeners {
33+
table.Append([]string{gateway.Name, listener.Name, fmt.Sprint(listener.Port), listener.Protocol})
34+
}
35+
}
36+
table.SetAutoMergeCellsByColumnIndex([]int{0})
37+
table.SetRowLine(true)
38+
table.Render()
39+
}
40+
return nil
41+
}
42+
43+
// GatewaysAdd adds a gateway to an app.
44+
func (d *DryccCmd) GatewaysAdd(appID, name string, port int, protocol string) error {
45+
s, appID, err := load(d.ConfigFile, appID)
46+
47+
if err != nil {
48+
return err
49+
}
50+
d.Printf("Adding gateway %s to %s... ", name, appID)
51+
52+
quit := progress(d.WOut)
53+
err = gateways.New(s.Client, appID, name, port, protocol)
54+
quit <- true
55+
<-quit
56+
if d.checkAPICompatibility(s.Client, err) != nil {
57+
return err
58+
}
59+
60+
d.Println("done")
61+
return nil
62+
}
63+
64+
// GatewaysRemove removes a gateway registered with an app.
65+
func (d *DryccCmd) GatewaysRemove(appID, name string, port int, protocol string) error {
66+
s, appID, err := load(d.ConfigFile, appID)
67+
68+
if err != nil {
69+
return err
70+
}
71+
d.Printf("Removing gateway %s to %s... ", name, appID)
72+
73+
quit := progress(d.WOut)
74+
err = gateways.Delete(s.Client, appID, name, port, protocol)
75+
quit <- true
76+
<-quit
77+
if d.checkAPICompatibility(s.Client, err) != nil {
78+
return err
79+
}
80+
81+
d.Println("done")
82+
return nil
83+
}

0 commit comments

Comments
 (0)