@@ -6,50 +6,39 @@ import (
6
6
"github.com/graphql-go/graphql"
7
7
"golang.org/x/text/cases"
8
8
"golang.org/x/text/language"
9
+ apierrors "k8s.io/apimachinery/pkg/api/errors"
9
10
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
10
11
"k8s.io/apimachinery/pkg/runtime/schema"
11
12
"sigs.k8s.io/controller-runtime/pkg/client"
12
13
)
13
14
14
- // RelationResolver handles runtime resolution of relation fields
15
- type RelationResolver struct {
16
- service * Service
17
- }
18
-
19
- // NewRelationResolver creates a new relation resolver
20
- func NewRelationResolver (service * Service ) * RelationResolver {
21
- return & RelationResolver {
22
- service : service ,
23
- }
15
+ // referenceInfo holds extracted reference details
16
+ type referenceInfo struct {
17
+ name string
18
+ namespace string
19
+ kind string
20
+ apiGroup string
24
21
}
25
22
26
- // CreateResolver creates a GraphQL resolver for relation fields
27
- func (rr * RelationResolver ) CreateResolver (fieldName string , targetGVK schema.GroupVersionKind ) graphql.FieldResolveFn {
23
+ // RelationResolver creates a GraphQL resolver for relation fields
24
+ func (r * Service ) RelationResolver (fieldName string , gvk schema.GroupVersionKind ) graphql.FieldResolveFn {
28
25
return func (p graphql.ResolveParams ) (interface {}, error ) {
29
26
parentObj , ok := p .Source .(map [string ]any )
30
27
if ! ok {
31
28
return nil , nil
32
29
}
33
30
34
- refInfo := rr .extractReferenceInfo (parentObj , fieldName )
31
+ refInfo := r .extractReferenceInfo (parentObj , fieldName )
35
32
if refInfo .name == "" {
36
33
return nil , nil
37
34
}
38
35
39
- return rr .resolveReference (p .Context , refInfo , targetGVK )
36
+ return r .resolveReference (p .Context , refInfo , gvk )
40
37
}
41
38
}
42
39
43
- // referenceInfo holds extracted reference details
44
- type referenceInfo struct {
45
- name string
46
- namespace string
47
- kind string
48
- apiGroup string
49
- }
50
-
51
40
// extractReferenceInfo extracts reference details from a *Ref object
52
- func (rr * RelationResolver ) extractReferenceInfo (parentObj map [string ]any , fieldName string ) referenceInfo {
41
+ func (r * Service ) extractReferenceInfo (parentObj map [string ]any , fieldName string ) referenceInfo {
53
42
name , _ := parentObj ["name" ].(string )
54
43
if name == "" {
55
44
return referenceInfo {}
@@ -73,7 +62,7 @@ func (rr *RelationResolver) extractReferenceInfo(parentObj map[string]any, field
73
62
}
74
63
75
64
// resolveReference fetches a referenced Kubernetes resource using provided target GVK
76
- func (rr * RelationResolver ) resolveReference (ctx context.Context , ref referenceInfo , targetGVK schema.GroupVersionKind ) (interface {}, error ) {
65
+ func (r * Service ) resolveReference (ctx context.Context , ref referenceInfo , targetGVK schema.GroupVersionKind ) (interface {}, error ) {
77
66
gvk := targetGVK
78
67
79
68
// Allow overrides from the reference object if specified
@@ -85,7 +74,7 @@ func (rr *RelationResolver) resolveReference(ctx context.Context, ref referenceI
85
74
}
86
75
87
76
// Convert sanitized group to original before calling the client
88
- gvk .Group = rr . service .getOriginalGroupName (gvk .Group )
77
+ gvk .Group = r .getOriginalGroupName (gvk .Group )
89
78
90
79
obj := & unstructured.Unstructured {}
91
80
obj .SetGroupVersionKind (gvk )
@@ -95,9 +84,28 @@ func (rr *RelationResolver) resolveReference(ctx context.Context, ref referenceI
95
84
key .Namespace = ref .namespace
96
85
}
97
86
98
- if err := rr .service .runtimeClient .Get (ctx , key , obj ); err == nil {
99
- return obj .Object , nil
87
+ err := r .runtimeClient .Get (ctx , key , obj )
88
+ if err != nil {
89
+ // For "not found" errors, return nil to allow graceful degradation
90
+ // This handles cases where referenced resources are deleted or don't exist
91
+ if apierrors .IsNotFound (err ) {
92
+ return nil , nil
93
+ }
94
+
95
+ // For other errors (network, permission, etc.), log and return the actual error
96
+ // This ensures proper error propagation for debugging and monitoring
97
+ r .log .Error ().
98
+ Err (err ).
99
+ Str ("operation" , "resolve_relation" ).
100
+ Str ("group" , gvk .Group ).
101
+ Str ("version" , gvk .Version ).
102
+ Str ("kind" , gvk .Kind ).
103
+ Str ("name" , ref .name ).
104
+ Str ("namespace" , ref .namespace ).
105
+ Msg ("Unable to resolve referenced object" )
106
+ return nil , err
100
107
}
101
108
102
- return nil , nil
109
+ // Happy path: resource found successfully
110
+ return obj .Object , nil
103
111
}
0 commit comments