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