55 "errors"
66 "fmt"
77 "regexp"
8- "sort"
98
109 "github.com/graphql-go/graphql"
1110 "go.opentelemetry.io/otel"
@@ -47,7 +46,6 @@ type CrudProvider interface {
4746
4847type FieldResolverProvider interface {
4948 CommonResolver () graphql.FieldResolveFn
50- UnstructuredFieldResolver (fieldName string ) graphql.FieldResolveFn
5149 SanitizeGroupName (string ) string
5250 GetOriginalGroupName (string ) string
5351}
@@ -71,38 +69,6 @@ func New(log *logger.Logger) *Service {
7169 }
7270}
7371
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-
10672// ListItems returns a GraphQL CommonResolver function that lists Kubernetes resources of the given GroupVersionKind.
10773func (r * Service ) ListItems (gvk schema.GroupVersionKind ) graphql.FieldResolveFn {
10874 return func (p graphql.ResolveParams ) (interface {}, error ) {
@@ -130,20 +96,14 @@ func (r *Service) ListItems(gvk schema.GroupVersionKind) graphql.FieldResolveFn
13096
13197 // Create an unstructured list to hold the results
13298 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 )
138100
139101 var opts []client.ListOption
140102 // Handle label selector argument
141103 if labelSelector , ok := p .Args [labelSelectorArg ].(string ); ok && labelSelector != "" {
142104 selector , err := labels .Parse (labelSelector )
143105 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" )
147107 return nil , err
148108 }
149109 opts = append (opts , client.MatchingLabelsSelector {Selector : selector })
@@ -155,18 +115,14 @@ func (r *Service) ListItems(gvk schema.GroupVersionKind) graphql.FieldResolveFn
155115 }
156116
157117 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" )
161119 return nil , err
162120 }
163121
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+ }
170126
171127 return items , nil
172128 }
@@ -198,39 +154,32 @@ func (r *Service) GetItem(gvk schema.GroupVersionKind) graphql.FieldResolveFn {
198154 }
199155
200156 // 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" )
207160 return nil , err
208161 }
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" )
212166 return nil , err
213167 }
214168
215169 // Create an unstructured object to hold the result
216170 obj := & unstructured.Unstructured {}
217171 obj .SetGroupVersionKind (gvk )
218172
219- key := client.ObjectKey {
173+ // Get the object using the runtime client
174+ if err = runtimeClient .Get (ctx , client.ObjectKey {
220175 Namespace : namespace ,
221176 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" )
230179 return nil , err
231180 }
232181
233- return obj , nil
182+ return obj . Object , nil
234183 }
235184}
236185
@@ -266,7 +215,7 @@ func (r *Service) CreateItem(gvk schema.GroupVersionKind) graphql.FieldResolveFn
266215 return nil , err
267216 }
268217
269- return obj , nil
218+ return obj . Object , nil
270219 }
271220}
272221
@@ -317,7 +266,7 @@ func (r *Service) UpdateItem(gvk schema.GroupVersionKind) graphql.FieldResolveFn
317266 return nil , err
318267 }
319268
320- return existingObj , nil
269+ return existingObj . Object , nil
321270 }
322271}
323272
@@ -355,10 +304,6 @@ func (r *Service) DeleteItem(gvk schema.GroupVersionKind) graphql.FieldResolveFn
355304
356305func (r * Service ) CommonResolver () graphql.FieldResolveFn {
357306 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- }
362307 return p .Source , nil
363308 }
364309}
0 commit comments