5
5
"fmt"
6
6
"net/http"
7
7
"os"
8
+ "strings"
8
9
"text/tabwriter"
9
10
10
11
"github.com/spf13/pflag"
@@ -14,13 +15,124 @@ import (
14
15
)
15
16
16
17
type urlsCmd struct {}
18
+ type createURLCmd struct {}
19
+ type delURLCmd struct {}
17
20
21
+ // DevURL is the parsed json response record for a devURL from cemanager
18
22
type DevURL struct {
23
+ ID string `json:"id"`
19
24
URL string `json:"url"`
20
25
Port string `json:"port"`
21
26
Access string `json:"access"`
22
27
}
23
28
29
+ var urlAccessLevel = map [string ]string {
30
+ "PRIVATE" : "Only you can access" ,
31
+ "ORG" : "All members of your organization can access" ,
32
+ "AUTHED" : "Authenticated users can access" ,
33
+ "PUBLIC" : "Anyone on the internet can access this link" ,
34
+ }
35
+
36
+ func isAccessLevelValid (level string ) bool {
37
+ _ , ok := urlAccessLevel [level ]
38
+ return ok
39
+ }
40
+
41
+ func (cmd createURLCmd ) Spec () cli.CommandSpec {
42
+ return cli.CommandSpec {
43
+ Name : "create" ,
44
+ Usage : "<env name> <port> [<access>]" ,
45
+ Desc : `create/update a devurl for external access
46
+ <access> is one of [PRIVATE | ORG | AUTHED | PUBLIC]` ,
47
+ }
48
+ }
49
+
50
+ // Run() creates or updates a devURL, specified by env ID and port
51
+ // (fl.Arg(0) and fl.Arg(1)), with access level (fl.Arg(2)) on
52
+ // the cemanager.
53
+ func (cmd createURLCmd ) Run (fl * pflag.FlagSet ) {
54
+ var envName = fl .Arg (0 )
55
+ var port = fl .Arg (1 )
56
+ var access = fl .Arg (2 )
57
+
58
+ if envName == "" {
59
+ exitUsage (fl )
60
+ }
61
+
62
+ if access == "" {
63
+ access = "PRIVATE"
64
+ }
65
+
66
+ access = strings .ToUpper (access )
67
+
68
+ if ! isAccessLevelValid (access ) {
69
+ fmt .Printf ("Invalid access level '%v'\n " , access )
70
+ exitUsage (fl )
71
+ }
72
+
73
+ entClient := requireAuth ()
74
+
75
+ env := findEnv (entClient , envName )
76
+
77
+ _ , found := devURLID (port , urlList (fl ))
78
+ if found {
79
+ fmt .Printf ("Updating devurl for port %v\n " , port )
80
+ } else {
81
+ fmt .Printf ("Adding devurl for port %v\n " , port )
82
+ }
83
+
84
+ err := entClient .UpsertDevURL (env .ID , port , access )
85
+ if err != nil {
86
+ flog .Error ("upsert devurl: %s" , err .Error ())
87
+ }
88
+ }
89
+
90
+ func (cmd delURLCmd ) Spec () cli.CommandSpec {
91
+ return cli.CommandSpec {
92
+ Name : "del" ,
93
+ Usage : "<env name> <port>" ,
94
+ Desc : "delete a devurl" ,
95
+ }
96
+ }
97
+
98
+ // Return the ID of a devURL, given the env name and port.
99
+ // ("", false) is returned if no match is found.
100
+
101
+ func devURLID (port string , urls []DevURL ) (string , bool ) {
102
+ for _ , url := range urls {
103
+ if url .Port == port {
104
+ return url .ID , true
105
+ }
106
+ }
107
+ return "" , false
108
+ }
109
+
110
+ // Run() deletes a devURL, specified by env ID and port, from the cemanager.
111
+ func (cmd delURLCmd ) Run (fl * pflag.FlagSet ) {
112
+ var envName = fl .Arg (0 )
113
+ var port = fl .Arg (1 )
114
+
115
+ if envName == "" {
116
+ exitUsage (fl )
117
+ }
118
+
119
+ entClient := requireAuth ()
120
+
121
+ env := findEnv (entClient , envName )
122
+
123
+ urlID , found := devURLID (port , urlList (fl ))
124
+ if found {
125
+ fmt .Printf ("Deleting devurl for port %v\n " , port )
126
+ } else {
127
+ flog .Fatal ("No devurl found for port %v" , port )
128
+ }
129
+
130
+ err := entClient .DelDevURL (env .ID , urlID )
131
+ if err != nil {
132
+ flog .Error ("delete devurl: %s" , err .Error ())
133
+ }
134
+ }
135
+
24
136
func (cmd urlsCmd ) Spec () cli.CommandSpec {
25
137
return cli.CommandSpec {
26
138
Name : "urls" ,
@@ -29,7 +141,9 @@ func (cmd urlsCmd) Spec() cli.CommandSpec {
29
141
}
30
142
}
31
143
32
- func (cmd urlsCmd ) Run (fl * pflag.FlagSet ) {
144
+ // urlList() returns the list of active devURLs from the cemanager server.
145
+
146
+ func urlList (fl * pflag.FlagSet ) []DevURL {
33
147
var envName = fl .Arg (0 )
34
148
35
149
if envName == "" {
@@ -41,9 +155,9 @@ func (cmd urlsCmd) Run(fl *pflag.FlagSet) {
41
155
env := findEnv (entClient , envName )
42
156
43
157
reqString := "%s/api/environments/%s/devurls?session_token=%s"
44
- reqUrl := fmt .Sprintf (reqString , entClient .BaseURL , env .ID , entClient .Token )
158
+ reqURL := fmt .Sprintf (reqString , entClient .BaseURL , env .ID , entClient .Token )
45
159
46
- resp , err := http .Get (reqUrl )
160
+ resp , err := http .Get (reqURL )
47
161
if err != nil {
48
162
flog .Fatal ("%v" , err )
49
163
}
@@ -65,6 +179,14 @@ func (cmd urlsCmd) Run(fl *pflag.FlagSet) {
65
179
fmt .Printf ("no dev urls were found for environment: %s\n " , envName )
66
180
}
67
181
182
+ return devURLs
183
+ }
184
+
185
+ // Run() gets the list of active devURLs from the cemanager for the
186
+ // specified environment and outputs info to stdout.
187
+ func (cmd urlsCmd ) Run (fl * pflag.FlagSet ) {
188
+ devURLs := urlList (fl )
189
+
68
190
w := tabwriter .NewWriter (os .Stdout , 0 , 0 , 1 , ' ' , tabwriter .TabIndent )
69
191
for _ , devURL := range devURLs {
70
192
fmt .Fprintf (w , "%s\t %s\t %s\n " , devURL .URL , devURL .Port , devURL .Access )
0 commit comments