@@ -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+
4977var ApiKey = os .Getenv ("DASH_ENTERPRISE_API_KEY" )
5078var DashEnterpriseURL = os .Getenv ("DASH_ENTERPRISE_URL" )
5179var 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+
58262func appExists (name string ) {
59263 req := graphql .NewRequest (`
60264query apps($name: String!, $allApps: Boolean!) {
@@ -252,12 +456,40 @@ func graphqlClient() (client *graphql.Client, err error) {
252456
253457func 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