Skip to content

Commit e2ad2e2

Browse files
authored
feat: added better feedback for subscriptions (#180)
* feat: added better feedback for subscriptions On-behalf-of: @SAP [email protected] Signed-off-by: Artem Shcherbatiuk <[email protected]>
1 parent df36add commit e2ad2e2

File tree

3 files changed

+30
-4
lines changed

3 files changed

+30
-4
lines changed

Diff for: gateway/resolver/subscription.go

+15-2
Original file line numberDiff line numberDiff line change
@@ -49,17 +49,17 @@ func (r *Service) runWatch(
4949

5050
gvk.Group = r.getOriginalGroupName(gvk.Group)
5151

52-
var err error
53-
5452
labelSelector, err := getStringArg(p.Args, LabelSelectorArg, false)
5553
if err != nil {
5654
r.log.Error().Err(err).Msg("Failed to get label selector argument")
55+
resultChannel <- errorResult("Failed to get label selector: " + err.Error())
5756
return
5857
}
5958

6059
subscribeToAll, err := getBoolArg(p.Args, SubscribeToAllArg, false)
6160
if err != nil {
6261
r.log.Error().Err(err).Msg("Failed to get subscribeToAll argument")
62+
resultChannel <- errorResult("Failed to get subscribeToAll: " + err.Error())
6363
return
6464
}
6565

@@ -78,6 +78,7 @@ func (r *Service) runWatch(
7878
namespace, err = getStringArg(p.Args, NamespaceArg, isNamespaceRequired)
7979
if err != nil {
8080
r.log.Error().Err(err).Msg("Failed to get namespace argument")
81+
resultChannel <- errorResult("Failed to get namespace: " + err.Error())
8182
return
8283
}
8384
if namespace != "" {
@@ -89,6 +90,7 @@ func (r *Service) runWatch(
8990
selector, err := labels.Parse(labelSelector)
9091
if err != nil {
9192
r.log.Error().Err(err).Str("labelSelector", labelSelector).Msg("Invalid label selector")
93+
resultChannel <- errorResult("Invalid label selector: " + err.Error())
9294
return
9395
}
9496
opts = append(opts, client.MatchingLabelsSelector{Selector: selector})
@@ -99,6 +101,7 @@ func (r *Service) runWatch(
99101
name, err = getStringArg(p.Args, NameArg, true)
100102
if err != nil {
101103
r.log.Error().Err(err).Msg("Failed to get name argument")
104+
resultChannel <- errorResult("Failed to get name: " + err.Error())
102105
return
103106
}
104107
opts = append(opts, client.MatchingFields{"metadata.name": name})
@@ -107,12 +110,14 @@ func (r *Service) runWatch(
107110
sortBy, err := getStringArg(p.Args, SortByArg, false)
108111
if err != nil {
109112
r.log.Error().Err(err).Msg("Failed to get sortBy argument")
113+
resultChannel <- errorResult("Failed to get sortBy: " + err.Error())
110114
return
111115
}
112116

113117
watcher, err := r.runtimeClient.Watch(ctx, list, opts...)
114118
if err != nil {
115119
r.log.Error().Err(err).Str("gvk", gvk.String()).Msg("Failed to start watch")
120+
resultChannel <- errorResult("Failed to start watch: " + err.Error())
116121
return
117122
}
118123
defer watcher.Stop()
@@ -143,6 +148,7 @@ func (r *Service) runWatch(
143148
changed, err := determineFieldChanged(oldObj, obj, fieldsToWatch)
144149
if err != nil {
145150
r.log.Error().Err(err).Msg("Failed to determine field changes")
151+
resultChannel <- errorResult("Failed to determine field changes: " + err.Error())
146152
return
147153
}
148154
sendUpdate = changed
@@ -173,6 +179,7 @@ func (r *Service) runWatch(
173179
err := validateSortBy(items, sortBy)
174180
if err != nil {
175181
r.log.Error().Err(err).Str(SortByArg, sortBy).Msg("Invalid sortBy field path")
182+
resultChannel <- errorResult("Invalid sortBy field path: " + err.Error())
176183
return
177184
}
178185

@@ -296,3 +303,9 @@ func getFieldValue(obj *unstructured.Unstructured, fieldPath string) (interface{
296303

297304
return current, true, nil
298305
}
306+
307+
func errorResult(msg string) map[string]interface{} {
308+
return map[string]interface{}{
309+
"error": msg,
310+
}
311+
}

Diff for: gateway/schema/schema.go

+9-2
Original file line numberDiff line numberDiff line change
@@ -252,7 +252,7 @@ func (g *Gateway) processSingleResource(
252252

253253
subscriptionSingular := strings.ToLower(fmt.Sprintf("%s_%s", gvk.Group, singular))
254254
rootSubscriptionFields[subscriptionSingular] = &graphql.Field{
255-
Type: resourceType,
255+
Type: addErrorFieldToGraphqlObject(resourceType),
256256
Args: itemArgsBuilder.
257257
WithSubscribeToAll().
258258
Complete(),
@@ -263,7 +263,7 @@ func (g *Gateway) processSingleResource(
263263

264264
subscriptionPlural := strings.ToLower(fmt.Sprintf("%s_%s", gvk.Group, plural))
265265
rootSubscriptionFields[subscriptionPlural] = &graphql.Field{
266-
Type: graphql.NewList(resourceType),
266+
Type: graphql.NewList(addErrorFieldToGraphqlObject(resourceType)),
267267
Args: listArgsBuilder.
268268
WithSubscribeToAll().
269269
Complete(),
@@ -574,3 +574,10 @@ func sanitizeFieldName(name string) string {
574574

575575
return name
576576
}
577+
578+
func addErrorFieldToGraphqlObject(obj *graphql.Object) *graphql.Object {
579+
obj.AddFieldConfig("error", &graphql.Field{
580+
Type: graphql.String,
581+
})
582+
return obj
583+
}

Diff for: tests/gateway_test/subscription_test.go

+6
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,12 @@ func (suite *CommonTestSuite) TestSchemaSubscribe() {
8080
},
8181
expectedEvents: 65,
8282
},
83+
{
84+
testName: "incorrect_subscription_query",
85+
subscribeQuery: `subscription: {"non_existent_field": "test"}`,
86+
expectedEvents: 1,
87+
expectError: true,
88+
},
8389
}
8490

8591
for _, tt := range tests {

0 commit comments

Comments
 (0)