4
4
"encoding/json"
5
5
"errors"
6
6
"fmt"
7
+ "github.com/rs/zerolog/log"
7
8
"regexp"
8
9
9
10
"github.com/graphql-go/graphql"
@@ -19,17 +20,9 @@ import (
19
20
"github.com/openmfp/golang-commons/logger"
20
21
)
21
22
22
- const (
23
- labelSelectorArg = "labelselector"
24
- nameArg = "name"
25
- namespaceArg = "namespace"
26
- subscribeToAllArg = "subscribeToAll"
27
- )
28
-
29
23
type Provider interface {
30
24
CrudProvider
31
25
FieldResolverProvider
32
- ArgumentsProvider
33
26
}
34
27
35
28
type CrudProvider interface {
@@ -48,13 +41,6 @@ type FieldResolverProvider interface {
48
41
GetOriginalGroupName (string ) string
49
42
}
50
43
51
- type ArgumentsProvider interface {
52
- GetListItemsArguments () graphql.FieldConfigArgument
53
- GetMutationArguments (resourceInputType * graphql.InputObject ) graphql.FieldConfigArgument
54
- GetNameAndNamespaceArguments () graphql.FieldConfigArgument
55
- GetSubscriptionArguments (includeNameArg bool ) graphql.FieldConfigArgument
56
- }
57
-
58
44
type Service struct {
59
45
log * logger.Logger
60
46
groupNames map [string ]string
@@ -95,17 +81,17 @@ func (r *Service) ListItems(gvk schema.GroupVersionKind) graphql.FieldResolveFn
95
81
96
82
var opts []client.ListOption
97
83
// Handle label selector argument
98
- if labelSelector , ok := p .Args [labelSelectorArg ].(string ); ok && labelSelector != "" {
84
+ if labelSelector , ok := p .Args [LabelSelectorArg ].(string ); ok && labelSelector != "" {
99
85
selector , err := labels .Parse (labelSelector )
100
86
if err != nil {
101
- log .Error ().Err (err ).Str (labelSelectorArg , labelSelector ).Msg ("Unable to parse given label selector" )
87
+ log .Error ().Err (err ).Str (LabelSelectorArg , labelSelector ).Msg ("Unable to parse given label selector" )
102
88
return nil , err
103
89
}
104
90
opts = append (opts , client.MatchingLabelsSelector {Selector : selector })
105
91
}
106
92
107
93
// Handle namespace argument
108
- if namespace , ok := p .Args [namespaceArg ].(string ); ok && namespace != "" {
94
+ if namespace , ok := p .Args [NamespaceArg ].(string ); ok && namespace != "" {
109
95
opts = append (opts , client .InNamespace (namespace ))
110
96
}
111
97
@@ -144,15 +130,8 @@ func (r *Service) GetItem(gvk schema.GroupVersionKind) graphql.FieldResolveFn {
144
130
}
145
131
146
132
// Retrieve required arguments
147
- name , ok := p .Args ["name" ].(string )
148
- if ! ok || name == "" {
149
- log .Error ().Err (errors .New ("missing required argument: name" )).Msg ("Name argument is required" )
150
- return nil , err
151
- }
152
-
153
- namespace , ok := p .Args ["namespace" ].(string )
154
- if ! ok || namespace == "" {
155
- log .Error ().Err (errors .New ("missing required argument: namespace" )).Msg ("Namespace argument is required" )
133
+ name , namespace , err := getNameAndNamespace (p .Args )
134
+ if err != nil {
156
135
return nil , err
157
136
}
158
137
@@ -182,7 +161,7 @@ func (r *Service) CreateItem(gvk schema.GroupVersionKind) graphql.FieldResolveFn
182
161
183
162
log := r .log .With ().Str ("operation" , "create" ).Str ("kind" , gvk .Kind ).Logger ()
184
163
185
- namespace := p .Args [namespaceArg ].(string )
164
+ namespace := p .Args [NamespaceArg ].(string )
186
165
objectInput := p .Args ["object" ].(map [string ]interface {})
187
166
188
167
obj := & unstructured.Unstructured {
@@ -213,15 +192,12 @@ func (r *Service) UpdateItem(gvk schema.GroupVersionKind) graphql.FieldResolveFn
213
192
214
193
log := r .log .With ().Str ("operation" , "update" ).Str ("kind" , gvk .Kind ).Logger ()
215
194
216
- namespace := p .Args [namespaceArg ].(string )
217
- objectInput := p .Args ["object" ].(map [string ]interface {})
218
-
219
- // Ensure metadata.name is set
220
- name , found , err := unstructured .NestedString (objectInput , "metadata" , "name" )
221
- if err != nil || ! found || name == "" {
222
- return nil , errors .New ("object metadata.name is required" )
195
+ name , namespace , err := getNameAndNamespace (p .Args )
196
+ if err != nil {
197
+ return nil , err
223
198
}
224
199
200
+ objectInput := p .Args ["object" ].(map [string ]interface {})
225
201
// Marshal the input object to JSON to create the patch data
226
202
patchData , err := json .Marshal (objectInput )
227
203
if err != nil {
@@ -260,8 +236,10 @@ func (r *Service) DeleteItem(gvk schema.GroupVersionKind) graphql.FieldResolveFn
260
236
261
237
log := r .log .With ().Str ("operation" , "delete" ).Str ("kind" , gvk .Kind ).Logger ()
262
238
263
- name := p .Args [nameArg ].(string )
264
- namespace := p .Args [namespaceArg ].(string )
239
+ name , namespace , err := getNameAndNamespace (p .Args )
240
+ if err != nil {
241
+ return nil , err
242
+ }
265
243
266
244
obj := & unstructured.Unstructured {}
267
245
obj .SetGroupVersionKind (gvk )
@@ -283,48 +261,6 @@ func (r *Service) CommonResolver() graphql.FieldResolveFn {
283
261
}
284
262
}
285
263
286
- // GetListItemsArguments returns the GraphQL arguments for listing resources.
287
- func (r * Service ) GetListItemsArguments () graphql.FieldConfigArgument {
288
- return graphql.FieldConfigArgument {
289
- labelSelectorArg : & graphql.ArgumentConfig {
290
- Type : graphql .String ,
291
- Description : "A label selector to filter the objects by" ,
292
- },
293
- namespaceArg : & graphql.ArgumentConfig {
294
- Type : graphql .String ,
295
- Description : "The namespace in which to search for the objects" ,
296
- },
297
- }
298
- }
299
-
300
- // GetMutationArguments returns the GraphQL arguments for create and update mutations.
301
- func (r * Service ) GetMutationArguments (resourceInputType * graphql.InputObject ) graphql.FieldConfigArgument {
302
- return graphql.FieldConfigArgument {
303
- namespaceArg : & graphql.ArgumentConfig {
304
- Type : graphql .NewNonNull (graphql .String ),
305
- Description : "The namespace of the object" ,
306
- },
307
- "object" : & graphql.ArgumentConfig {
308
- Type : graphql .NewNonNull (resourceInputType ),
309
- Description : "The object to create or update" ,
310
- },
311
- }
312
- }
313
-
314
- // GetNameAndNamespaceArguments returns the GraphQL arguments for delete mutations.
315
- func (r * Service ) GetNameAndNamespaceArguments () graphql.FieldConfigArgument {
316
- return graphql.FieldConfigArgument {
317
- nameArg : & graphql.ArgumentConfig {
318
- Type : graphql .NewNonNull (graphql .String ),
319
- Description : "The name of the object" ,
320
- },
321
- namespaceArg : & graphql.ArgumentConfig {
322
- Type : graphql .NewNonNull (graphql .String ),
323
- Description : "The namespace of the object" ,
324
- },
325
- }
326
- }
327
-
328
264
func (r * Service ) SanitizeGroupName (groupName string ) string {
329
265
oldGroupName := groupName
330
266
@@ -350,3 +286,41 @@ func (r *Service) GetOriginalGroupName(groupName string) string {
350
286
351
287
return groupName
352
288
}
289
+
290
+ func getNameAndNamespace (args map [string ]interface {}) (string , string , error ) {
291
+ name , err := getStringArg (args , NameArg )
292
+ if err != nil {
293
+ return "" , "" , err
294
+ }
295
+
296
+ namespace , err := getStringArg (args , NamespaceArg )
297
+ if err != nil {
298
+ return "" , "" , err
299
+ }
300
+
301
+ return name , namespace , nil
302
+ }
303
+
304
+ func getStringArg (args map [string ]interface {}, key string ) (string , error ) {
305
+ val , exists := args [key ]
306
+ if ! exists {
307
+ err := errors .New ("missing required argument: " + key )
308
+ log .Error ().Err (err ).Msg (key + " argument is required" )
309
+ return "" , err
310
+ }
311
+
312
+ str , ok := val .(string )
313
+ if ! ok {
314
+ err := errors .New ("invalid type for argument: " + key )
315
+ log .Error ().Err (err ).Msg (key + " argument must be a string" )
316
+ return "" , err
317
+ }
318
+
319
+ if str == "" {
320
+ err := errors .New ("empty value for argument: " + key )
321
+ log .Error ().Err (err ).Msg (key + " argument cannot be empty" )
322
+ return "" , err
323
+ }
324
+
325
+ return str , nil
326
+ }
0 commit comments