@@ -14,13 +14,118 @@ 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
+ if envName == "" {
58
+ exitUsage (fl )
59
+ }
60
+
61
+ if ! isAccessLevelValid (access ) {
62
+ fmt .Printf ("Invalid access level '%v'\n " , access )
63
+ exitUsage (fl )
64
+ }
65
+
66
+ entClient := requireAuth ()
67
+
68
+ env := findEnv (entClient , envName )
69
+
70
+ urlID , found := devURLID (port , urlList (fl ))
71
+ if found {
72
+ fmt .Printf ("Updating devurl %v\n " , urlID )
73
+ } else {
74
+ fmt .Printf ("Adding devurl for port %v\n " , port )
75
+ }
76
+
77
+ err := entClient .UpsertDevURL (env .ID , port , access )
78
+ if err != nil {
79
+ flog .Error ("upsert devurl: %s" , err .Error ())
80
+ }
81
+ }
82
+
83
+ func (cmd delURLCmd ) Spec () cli.CommandSpec {
84
+ return cli.CommandSpec {
85
+ Name : "del" ,
86
+ Usage : "<env name> <port>" ,
87
+ Desc : "delete a devurl" ,
88
+ }
89
+ }
90
+
91
+ // Return the ID of a devURL, given the env name and port.
92
+ // ("", false) is returned if no match is found.
93
+
94
+ func devURLID (port string , urls []DevURL ) (string , bool ) {
95
+ for _ , url := range urls {
96
+ if url .Port == port {
97
+ return url .ID , true
98
+ }
99
+ }
100
+ return "" , false
101
+ }
102
+
103
+ // Run() deletes a devURL, specified by env ID and port, from the cemanager.
104
+ func (cmd delURLCmd ) Run (fl * pflag.FlagSet ) {
105
+ var envName = fl .Arg (0 )
106
+ var port = fl .Arg (1 )
107
+
108
+ if envName == "" {
109
+ exitUsage (fl )
110
+ }
111
+
112
+ entClient := requireAuth ()
113
+
114
+ env := findEnv (entClient , envName )
115
+
116
+ urlID , found := devURLID (port , urlList (fl ))
117
+ if found {
118
+ fmt .Printf ("Found devurl id:%v\n " , urlID )
119
+ } else {
120
+ flog .Fatal ("Not found: %v" , port )
121
+ }
122
+
123
+ err := entClient .DelDevURL (env .ID , urlID )
124
+ if err != nil {
125
+ flog .Error ("delete devurl: %s" , err .Error ())
126
+ }
127
+ }
128
+
24
129
func (cmd urlsCmd ) Spec () cli.CommandSpec {
25
130
return cli.CommandSpec {
26
131
Name : "urls" ,
@@ -29,7 +134,9 @@ func (cmd urlsCmd) Spec() cli.CommandSpec {
29
134
}
30
135
}
31
136
32
- func (cmd urlsCmd ) Run (fl * pflag.FlagSet ) {
137
+ // urlList() returns the list of active devURLs from the cemanager server.
138
+
139
+ func urlList (fl * pflag.FlagSet ) []DevURL {
33
140
var envName = fl .Arg (0 )
34
141
35
142
if envName == "" {
@@ -41,9 +148,9 @@ func (cmd urlsCmd) Run(fl *pflag.FlagSet) {
41
148
env := findEnv (entClient , envName )
42
149
43
150
reqString := "%s/api/environments/%s/devurls?session_token=%s"
44
- reqUrl := fmt .Sprintf (reqString , entClient .BaseURL , env .ID , entClient .Token )
151
+ reqURL := fmt .Sprintf (reqString , entClient .BaseURL , env .ID , entClient .Token )
45
152
46
- resp , err := http .Get (reqUrl )
153
+ resp , err := http .Get (reqURL )
47
154
if err != nil {
48
155
flog .Fatal ("%v" , err )
49
156
}
@@ -65,6 +172,14 @@ func (cmd urlsCmd) Run(fl *pflag.FlagSet) {
65
172
fmt .Printf ("no dev urls were found for environment: %s\n " , envName )
66
173
}
67
174
175
+ return devURLs
176
+ }
177
+
178
+ // Run() gets the list of active devURLs from the cemanager for the
179
+ // specified environment and outputs info to stdout.
180
+ func (cmd urlsCmd ) Run (fl * pflag.FlagSet ) {
181
+ devURLs := urlList (fl )
182
+
68
183
w := tabwriter .NewWriter (os .Stdout , 0 , 0 , 1 , ' ' , tabwriter .TabIndent )
69
184
for _ , devURL := range devURLs {
70
185
fmt .Fprintf (w , "%s\t %s\t %s\n " , devURL .URL , devURL .Port , devURL .Access )
0 commit comments