Skip to content
This repository was archived by the owner on Aug 28, 2025. It is now read-only.

Commit de3c7a5

Browse files
committed
resolver
On-behalf-of: @SAP [email protected] Signed-off-by: Artem Shcherbatiuk <[email protected]>
1 parent 96a22a2 commit de3c7a5

File tree

2 files changed

+39
-42
lines changed

2 files changed

+39
-42
lines changed

gateway/resolver/relations.go

Lines changed: 36 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -6,50 +6,39 @@ import (
66
"github.com/graphql-go/graphql"
77
"golang.org/x/text/cases"
88
"golang.org/x/text/language"
9+
apierrors "k8s.io/apimachinery/pkg/api/errors"
910
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
1011
"k8s.io/apimachinery/pkg/runtime/schema"
1112
"sigs.k8s.io/controller-runtime/pkg/client"
1213
)
1314

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
2421
}
2522

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 {
2825
return func(p graphql.ResolveParams) (interface{}, error) {
2926
parentObj, ok := p.Source.(map[string]any)
3027
if !ok {
3128
return nil, nil
3229
}
3330

34-
refInfo := rr.extractReferenceInfo(parentObj, fieldName)
31+
refInfo := r.extractReferenceInfo(parentObj, fieldName)
3532
if refInfo.name == "" {
3633
return nil, nil
3734
}
3835

39-
return rr.resolveReference(p.Context, refInfo, targetGVK)
36+
return r.resolveReference(p.Context, refInfo, gvk)
4037
}
4138
}
4239

43-
// referenceInfo holds extracted reference details
44-
type referenceInfo struct {
45-
name string
46-
namespace string
47-
kind string
48-
apiGroup string
49-
}
50-
5140
// 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 {
5342
name, _ := parentObj["name"].(string)
5443
if name == "" {
5544
return referenceInfo{}
@@ -73,7 +62,7 @@ func (rr *RelationResolver) extractReferenceInfo(parentObj map[string]any, field
7362
}
7463

7564
// 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) {
7766
gvk := targetGVK
7867

7968
// Allow overrides from the reference object if specified
@@ -85,7 +74,7 @@ func (rr *RelationResolver) resolveReference(ctx context.Context, ref referenceI
8574
}
8675

8776
// Convert sanitized group to original before calling the client
88-
gvk.Group = rr.service.getOriginalGroupName(gvk.Group)
77+
gvk.Group = r.getOriginalGroupName(gvk.Group)
8978

9079
obj := &unstructured.Unstructured{}
9180
obj.SetGroupVersionKind(gvk)
@@ -95,9 +84,28 @@ func (rr *RelationResolver) resolveReference(ctx context.Context, ref referenceI
9584
key.Namespace = ref.namespace
9685
}
9786

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
100107
}
101108

102-
return nil, nil
109+
// Happy path: resource found successfully
110+
return obj.Object, nil
103111
}

gateway/resolver/resolver.go

Lines changed: 3 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -50,22 +50,16 @@ type CustomQueriesProvider interface {
5050
type Service struct {
5151
log *logger.Logger
5252
// groupNames stores relation between sanitized group names and original group names that are used in the Kubernetes API
53-
groupNames map[string]string // map[sanitizedGroupName]originalGroupName
54-
runtimeClient client.WithWatch
55-
relationResolver *RelationResolver
53+
groupNames map[string]string // map[sanitizedGroupName]originalGroupName
54+
runtimeClient client.WithWatch
5655
}
5756

5857
func New(log *logger.Logger, runtimeClient client.WithWatch) *Service {
59-
s := &Service{
58+
return &Service{
6059
log: log,
6160
groupNames: make(map[string]string),
6261
runtimeClient: runtimeClient,
6362
}
64-
65-
// Initialize the relation resolver
66-
s.relationResolver = NewRelationResolver(s)
67-
68-
return s
6963
}
7064

7165
// ListItems returns a GraphQL CommonResolver function that lists Kubernetes resources of the given GroupVersionKind.
@@ -462,8 +456,3 @@ func compareNumbers[T int64 | float64](a, b T) int {
462456
return 0
463457
}
464458
}
465-
466-
// RelationResolver creates a GraphQL resolver for relation fields
467-
func (r *Service) RelationResolver(fieldName string, gvk schema.GroupVersionKind) graphql.FieldResolveFn {
468-
return r.relationResolver.CreateResolver(fieldName, gvk)
469-
}

0 commit comments

Comments
 (0)