Skip to content

Commit abff8d6

Browse files
committed
feat: add redis/postgres commands
1 parent c8c39f3 commit abff8d6

File tree

2 files changed

+316
-4
lines changed

2 files changed

+316
-4
lines changed

README.md

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,3 +58,67 @@ Delete an app
5858
```shell
5959
dds-client apps:delete --name dopsa
6060
```
61+
62+
#### `postgres:list`
63+
64+
List all postgres services
65+
66+
```shell
67+
dds-client postgres:list
68+
```
69+
70+
#### `postgres:exists`
71+
72+
Check if a postgres service exists
73+
74+
```shell
75+
dds-client postgres:exists --name dopsa
76+
```
77+
78+
#### `postgres:create`
79+
80+
Create a postgres service
81+
82+
```shell
83+
dds-client postgres:create --name dopsa
84+
```
85+
86+
#### `postgres:delete`
87+
88+
Delete a postgres service
89+
90+
```shell
91+
dds-client postgres:delete --name dopsa
92+
```
93+
94+
#### `redis:list`
95+
96+
List all redis services
97+
98+
```shell
99+
dds-client redis:list
100+
```
101+
102+
#### `redis:exists`
103+
104+
Check if a redis service exists
105+
106+
```shell
107+
dds-client redis:exists --name dopsa
108+
```
109+
110+
#### `redis:create`
111+
112+
Create a redis service
113+
114+
```shell
115+
dds-client redis:create --name dopsa
116+
```
117+
118+
#### `redis:delete`
119+
120+
Delete a redis service
121+
122+
```shell
123+
dds-client redis:delete --name dopsa
124+
```

main.go

Lines changed: 252 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,34 @@ type DeleteApp struct {
4646
Error string `json:"error"`
4747
}
4848

49+
type ServicesResponse struct {
50+
Services []Service `json:"services"`
51+
}
52+
53+
type Service struct {
54+
Name string `json:"name"`
55+
ServiceType string `json:"serviceType"`
56+
Created string `json:"created"`
57+
}
58+
59+
type AddServiceResponse struct {
60+
AddService AddService `json:"addService"`
61+
}
62+
63+
type DeleteServiceResponse struct {
64+
DeleteService DeleteService `json:"deleteService"`
65+
}
66+
67+
type AddService struct {
68+
Service Service `json:"app"`
69+
Error string `json:"error"`
70+
}
71+
72+
type DeleteService struct {
73+
Ok bool `json:"ok"`
74+
Error string `json:"error"`
75+
}
76+
4977
var ApiKey = os.Getenv("DASH_ENTERPRISE_API_KEY")
5078
var DashEnterpriseURL = os.Getenv("DASH_ENTERPRISE_URL")
5179
var Username = os.Getenv("DASH_ENTERPRISE_USERNAME")
@@ -55,6 +83,182 @@ func basicAuth(username, password string) string {
5583
return base64.StdEncoding.EncodeToString([]byte(auth))
5684
}
5785

86+
func postgresCreate(name string) {
87+
serviceCreate("postgres", name)
88+
}
89+
90+
func postgresDelete(name string) {
91+
serviceDelete("postgres", name)
92+
}
93+
94+
func postgresExists(name string) {
95+
serviceExists("postgres", name)
96+
}
97+
98+
func postgresList() {
99+
serviceList("postgres")
100+
}
101+
102+
func redisCreate(name string) {
103+
serviceCreate("redis", name)
104+
}
105+
106+
func redisDelete(name string) {
107+
serviceDelete("redis", name)
108+
}
109+
110+
func redisExists(name string) {
111+
serviceExists("redis", name)
112+
}
113+
114+
func redisList() {
115+
serviceList("redis")
116+
}
117+
118+
func serviceCreate(serviceType string, name string) {
119+
if name == "" {
120+
log.Fatal(errors.New("No name specified"))
121+
}
122+
123+
mutation := `
124+
mutation AddService($name: String!, $serviceType: ServiceType = %s) {
125+
addService(name: $name, serviceType: $serviceType) {
126+
service {
127+
name
128+
serviceType
129+
created
130+
}
131+
error
132+
}
133+
}
134+
`
135+
req := graphql.NewRequest(fmt.Sprintf(mutation, serviceType))
136+
137+
req.Var("name", name)
138+
139+
req.Header.Set("Cache-Control", "no-cache")
140+
req.Header.Set("Authorization", "Basic "+basicAuth(Username, ApiKey))
141+
142+
ctx := context.Background()
143+
144+
var respData AddServiceResponse
145+
146+
client, err := graphqlClient()
147+
if err != nil {
148+
log.Fatal(err)
149+
}
150+
if err := client.Run(ctx, req, &respData); err != nil {
151+
log.Fatal(err)
152+
}
153+
154+
if respData.AddService.Error != "" {
155+
fmt.Printf(" ! %v\n", respData.AddService.Error)
156+
} else {
157+
fmt.Printf("====> %v created!\n", name)
158+
}
159+
}
160+
161+
func serviceDelete(serviceType string, name string) {
162+
if name == "" {
163+
log.Fatal(errors.New("No name specified"))
164+
}
165+
166+
mutation := `
167+
mutation DeleteService($name: String!, $serviceType: ServiceType = %s) {
168+
deleteService(name: $name, serviceType: $serviceType) {
169+
ok
170+
error
171+
}
172+
}
173+
`
174+
req := graphql.NewRequest(fmt.Sprintf(mutation, serviceType))
175+
176+
req.Var("name", name)
177+
178+
req.Header.Set("Cache-Control", "no-cache")
179+
req.Header.Set("Authorization", "Basic "+basicAuth(Username, ApiKey))
180+
181+
ctx := context.Background()
182+
183+
var respData DeleteServiceResponse
184+
185+
client, err := graphqlClient()
186+
if err != nil {
187+
log.Fatal(err)
188+
}
189+
if err := client.Run(ctx, req, &respData); err != nil {
190+
log.Fatal(err)
191+
}
192+
193+
if respData.DeleteService.Error != "" {
194+
fmt.Printf(" ! %v\n", respData.DeleteService.Error)
195+
} else {
196+
fmt.Printf("====> %v deleted!\n", name)
197+
}
198+
}
199+
200+
func serviceExists(serviceType string, name string) {
201+
if name == "" {
202+
log.Fatal(errors.New("No name specified"))
203+
}
204+
205+
respData, err := fetchServices()
206+
if err != nil {
207+
log.Fatal(err)
208+
}
209+
210+
for _, service := range respData.Services {
211+
if service.Name == name && service.ServiceType == serviceType {
212+
fmt.Printf("%v exists\n", service.Name)
213+
os.Exit(0)
214+
}
215+
}
216+
fmt.Printf("%v not found. Possible causes:\n", name)
217+
fmt.Printf("- You may not have been granted access to this service.")
218+
fmt.Printf("- The service may not exist.")
219+
os.Exit(1)
220+
}
221+
222+
func serviceList(serviceType string) {
223+
respData, err := fetchServices()
224+
if err != nil {
225+
log.Fatal(err)
226+
}
227+
228+
for _, service := range respData.Services {
229+
if service.ServiceType == serviceType {
230+
fmt.Printf("%v\n", service.Name)
231+
}
232+
}
233+
}
234+
235+
func fetchServices() (ServicesResponse, error) {
236+
req := graphql.NewRequest(`
237+
{
238+
services {
239+
name
240+
serviceType
241+
created
242+
}
243+
}
244+
`)
245+
246+
req.Header.Set("Cache-Control", "no-cache")
247+
req.Header.Set("Authorization", "Basic "+basicAuth(Username, ApiKey))
248+
249+
ctx := context.Background()
250+
251+
var respData ServicesResponse
252+
253+
client, err := graphqlClient()
254+
if err != nil {
255+
return respData, err
256+
}
257+
258+
err = client.Run(ctx, req, &respData)
259+
return respData, err
260+
}
261+
58262
func appExists(name string) {
59263
req := graphql.NewRequest(`
60264
query apps($name: String!, $allApps: Boolean!) {
@@ -252,12 +456,40 @@ func graphqlClient() (client *graphql.Client, err error) {
252456

253457
func main() {
254458
parser := argparse.NewParser("dds-client", "A simple dds client")
255-
name := parser.String("", "name", &argparse.Options{Help: "Name of app"})
256459

257460
appsListCmd := parser.NewCommand("apps:list", "List all apps")
461+
258462
appsCreateCmd := parser.NewCommand("apps:create", "Create an app")
463+
appsCreateCmdName := appsCreateCmd.String("", "name", &argparse.Options{Help: "Name of app"})
464+
259465
appsDeleteCmd := parser.NewCommand("apps:delete", "Delete an app")
466+
appsDeleteCmdName := appsDeleteCmd.String("", "name", &argparse.Options{Help: "Name of app"})
467+
260468
appExistsCmd := parser.NewCommand("apps:exists", "Check if an app exists")
469+
appExistsCmdName := appExistsCmd.String("", "name", &argparse.Options{Help: "Name of app"})
470+
471+
postgresCreateCmd := parser.NewCommand("postgres:create", "Create a postgres service")
472+
postgresCreateCmdName := postgresCreateCmd.String("", "name", &argparse.Options{Help: "Name of service"})
473+
474+
postgresDeleteCmd := parser.NewCommand("postgres:delete", "Delete a postgres service")
475+
postgresDeleteCmdName := postgresDeleteCmd.String("", "name", &argparse.Options{Help: "Name of service"})
476+
477+
postgresExistsCmd := parser.NewCommand("postgres:exists", "Check if a postgres service exists")
478+
postgresExistsCmdName := postgresExistsCmd.String("", "name", &argparse.Options{Help: "Name of service"})
479+
480+
postgresListCmd := parser.NewCommand("postgres:list", "List all postgres services")
481+
482+
redisCreateCmd := parser.NewCommand("redis:create", "Create a redis service")
483+
redisCreateCmdName := redisCreateCmd.String("", "name", &argparse.Options{Help: "Name of service"})
484+
485+
redisDeleteCmd := parser.NewCommand("redis:delete", "Delete a redis service")
486+
redisDeleteCmdName := redisDeleteCmd.String("", "name", &argparse.Options{Help: "Name of service"})
487+
488+
redisExistsCmd := parser.NewCommand("redis:exists", "Check if a redis service exists")
489+
redisExistsCmdName := redisExistsCmd.String("", "name", &argparse.Options{Help: "Name of service"})
490+
491+
redisListCmd := parser.NewCommand("redis:list", "List all redis services")
492+
261493
err := parser.Parse(os.Args)
262494
if err != nil {
263495
fmt.Print(parser.Usage(err))
@@ -267,11 +499,27 @@ func main() {
267499
if appsListCmd.Happened() {
268500
appsList()
269501
} else if appsCreateCmd.Happened() {
270-
appsCreate(*name)
502+
appsCreate(*appsCreateCmdName)
271503
} else if appsDeleteCmd.Happened() {
272-
appsDelete(*name)
504+
appsDelete(*appsDeleteCmdName)
273505
} else if appExistsCmd.Happened() {
274-
appExists(*name)
506+
appExists(*appExistsCmdName)
507+
} else if postgresCreateCmd.Happened() {
508+
postgresCreate(*postgresCreateCmdName)
509+
} else if postgresDeleteCmd.Happened() {
510+
postgresDelete(*postgresDeleteCmdName)
511+
} else if postgresExistsCmd.Happened() {
512+
postgresExists(*postgresExistsCmdName)
513+
} else if postgresListCmd.Happened() {
514+
postgresList()
515+
} else if redisCreateCmd.Happened() {
516+
redisCreate(*redisCreateCmdName)
517+
} else if redisDeleteCmd.Happened() {
518+
redisDelete(*redisDeleteCmdName)
519+
} else if redisExistsCmd.Happened() {
520+
redisExists(*redisExistsCmdName)
521+
} else if redisListCmd.Happened() {
522+
redisList()
275523
} else {
276524
err := fmt.Errorf("bad arguments, please check usage")
277525
fmt.Print(parser.Usage(err))

0 commit comments

Comments
 (0)