5
5
"errors"
6
6
"fmt"
7
7
"regexp"
8
- "sort"
9
8
10
9
"github.com/graphql-go/graphql"
11
10
"go.opentelemetry.io/otel"
@@ -47,7 +46,6 @@ type CrudProvider interface {
47
46
48
47
type FieldResolverProvider interface {
49
48
CommonResolver () graphql.FieldResolveFn
50
- UnstructuredFieldResolver (fieldName string ) graphql.FieldResolveFn
51
49
SanitizeGroupName (string ) string
52
50
GetOriginalGroupName (string ) string
53
51
}
@@ -71,38 +69,6 @@ func New(log *logger.Logger) *Service {
71
69
}
72
70
}
73
71
74
- // UnstructuredFieldResolver returns a GraphQL FieldResolveFn to resolve a field from an unstructured object.
75
- func (r * Service ) UnstructuredFieldResolver (fieldName string ) graphql.FieldResolveFn {
76
- return func (p graphql.ResolveParams ) (interface {}, error ) {
77
- var objMap map [string ]interface {}
78
-
79
- switch source := p .Source .(type ) {
80
- case * unstructured.Unstructured :
81
- objMap = source .Object
82
- case unstructured.Unstructured :
83
- objMap = source .Object
84
- case map [string ]interface {}:
85
- objMap = source
86
- default :
87
- r .log .Error ().
88
- Str ("type" , fmt .Sprintf ("%T" , p .Source )).
89
- Msg ("Source is of unexpected type" )
90
- return nil , errors .New ("source is of unexpected type" )
91
- }
92
-
93
- value , found , err := unstructured .NestedFieldNoCopy (objMap , fieldName )
94
- if err != nil {
95
- r .log .Error ().Err (err ).Str ("field" , fieldName ).Msg ("Error retrieving field" )
96
- return nil , err
97
- }
98
- if ! found {
99
- return nil , nil
100
- }
101
-
102
- return value , nil
103
- }
104
- }
105
-
106
72
// ListItems returns a GraphQL CommonResolver function that lists Kubernetes resources of the given GroupVersionKind.
107
73
func (r * Service ) ListItems (gvk schema.GroupVersionKind ) graphql.FieldResolveFn {
108
74
return func (p graphql.ResolveParams ) (interface {}, error ) {
@@ -130,20 +96,14 @@ func (r *Service) ListItems(gvk schema.GroupVersionKind) graphql.FieldResolveFn
130
96
131
97
// Create an unstructured list to hold the results
132
98
list := & unstructured.UnstructuredList {}
133
- list .SetGroupVersionKind (schema.GroupVersionKind {
134
- Group : gvk .Group ,
135
- Version : gvk .Version ,
136
- Kind : gvk .Kind + "List" ,
137
- })
99
+ list .SetGroupVersionKind (gvk )
138
100
139
101
var opts []client.ListOption
140
102
// Handle label selector argument
141
103
if labelSelector , ok := p .Args [labelSelectorArg ].(string ); ok && labelSelector != "" {
142
104
selector , err := labels .Parse (labelSelector )
143
105
if err != nil {
144
- log .Error ().Err (err ).
145
- Str (labelSelectorArg , labelSelector ).
146
- Msg ("Unable to parse given label selector" )
106
+ log .Error ().Err (err ).Str (labelSelectorArg , labelSelector ).Msg ("Unable to parse given label selector" )
147
107
return nil , err
148
108
}
149
109
opts = append (opts , client.MatchingLabelsSelector {Selector : selector })
@@ -155,18 +115,14 @@ func (r *Service) ListItems(gvk schema.GroupVersionKind) graphql.FieldResolveFn
155
115
}
156
116
157
117
if err = runtimeClient .List (ctx , list , opts ... ); err != nil {
158
- log .Error ().
159
- Err (err ).
160
- Msg ("Unable to list objects" )
118
+ log .Error ().Err (err ).Msg ("Unable to list objects" )
161
119
return nil , err
162
120
}
163
121
164
- items := list .Items
165
-
166
- // Sort the items by name for consistent ordering
167
- sort .Slice (items , func (i , j int ) bool {
168
- return items [i ].GetName () < items [j ].GetName ()
169
- })
122
+ items := make ([]map [string ]any , len (list .Items ))
123
+ for i , item := range list .Items {
124
+ items [i ] = item .Object
125
+ }
170
126
171
127
return items , nil
172
128
}
@@ -198,39 +154,32 @@ func (r *Service) GetItem(gvk schema.GroupVersionKind) graphql.FieldResolveFn {
198
154
}
199
155
200
156
// Retrieve required arguments
201
- name , nameOK := p .Args ["name" ].(string )
202
- namespace , nsOK := p .Args ["namespace" ].(string )
203
-
204
- if ! nameOK || name == "" {
205
- err := errors .New ("missing required argument: name" )
206
- log .Error ().Err (err ).Msg ("Name argument is required" )
157
+ name , ok := p .Args ["name" ].(string )
158
+ if ! ok || name == "" {
159
+ log .Error ().Err (errors .New ("missing required argument: name" )).Msg ("Name argument is required" )
207
160
return nil , err
208
161
}
209
- if ! nsOK || namespace == "" {
210
- err := errors .New ("missing required argument: namespace" )
211
- log .Error ().Err (err ).Msg ("Namespace argument is required" )
162
+
163
+ namespace , ok := p .Args ["namespace" ].(string )
164
+ if ! ok || namespace == "" {
165
+ log .Error ().Err (errors .New ("missing required argument: namespace" )).Msg ("Namespace argument is required" )
212
166
return nil , err
213
167
}
214
168
215
169
// Create an unstructured object to hold the result
216
170
obj := & unstructured.Unstructured {}
217
171
obj .SetGroupVersionKind (gvk )
218
172
219
- key := client.ObjectKey {
173
+ // Get the object using the runtime client
174
+ if err = runtimeClient .Get (ctx , client.ObjectKey {
220
175
Namespace : namespace ,
221
176
Name : name ,
222
- }
223
-
224
- // Get the object using the runtime client
225
- if err = runtimeClient .Get (ctx , key , obj ); err != nil {
226
- log .Error ().Err (err ).
227
- Str ("name" , name ).
228
- Str ("namespace" , namespace ).
229
- Msg ("Unable to get object" )
177
+ }, obj ); err != nil {
178
+ log .Error ().Err (err ).Str ("name" , name ).Str ("namespace" , namespace ).Msg ("Unable to get object" )
230
179
return nil , err
231
180
}
232
181
233
- return obj , nil
182
+ return obj . Object , nil
234
183
}
235
184
}
236
185
@@ -266,7 +215,7 @@ func (r *Service) CreateItem(gvk schema.GroupVersionKind) graphql.FieldResolveFn
266
215
return nil , err
267
216
}
268
217
269
- return obj , nil
218
+ return obj . Object , nil
270
219
}
271
220
}
272
221
@@ -317,7 +266,7 @@ func (r *Service) UpdateItem(gvk schema.GroupVersionKind) graphql.FieldResolveFn
317
266
return nil , err
318
267
}
319
268
320
- return existingObj , nil
269
+ return existingObj . Object , nil
321
270
}
322
271
}
323
272
@@ -355,10 +304,6 @@ func (r *Service) DeleteItem(gvk schema.GroupVersionKind) graphql.FieldResolveFn
355
304
356
305
func (r * Service ) CommonResolver () graphql.FieldResolveFn {
357
306
return func (p graphql.ResolveParams ) (interface {}, error ) {
358
- if p .Source == nil {
359
- // At the example level, return a non-nil value (e.g., an empty map)
360
- return map [string ]interface {}{}, nil
361
- }
362
307
return p .Source , nil
363
308
}
364
309
}
0 commit comments