7
7
"strings"
8
8
9
9
"github.com/openmfp/golang-commons/sentry"
10
+ "github.com/pkg/errors"
10
11
11
12
v1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1"
12
13
@@ -58,14 +59,14 @@ func (r *Service) runWatch(
58
59
labelSelector , err := getStringArg (p .Args , LabelSelectorArg , false )
59
60
if err != nil {
60
61
r .log .Error ().Err (err ).Msg ("Failed to get label selector argument" )
61
- resultChannel <- errorResult ( "Failed to get label selector: " + err . Error () )
62
+ resultChannel <- errors . Wrap ( err , "failed to get label selector argument" )
62
63
return
63
64
}
64
65
65
66
subscribeToAll , err := getBoolArg (p .Args , SubscribeToAllArg , false )
66
67
if err != nil {
67
68
r .log .Error ().Err (err ).Msg ("Failed to get subscribeToAll argument" )
68
- resultChannel <- errorResult ( "Failed to get subscribeToAll: " + err . Error () )
69
+ resultChannel <- errors . Wrap ( err , "failed to get subscribeToAll argument" )
69
70
return
70
71
}
71
72
@@ -84,7 +85,7 @@ func (r *Service) runWatch(
84
85
namespace , err = getStringArg (p .Args , NamespaceArg , isNamespaceRequired )
85
86
if err != nil {
86
87
r .log .Error ().Err (err ).Msg ("Failed to get namespace argument" )
87
- resultChannel <- errorResult ( "Failed to get namespace: " + err . Error () )
88
+ resultChannel <- errors . Wrap ( err , "failed to get namespace argument" )
88
89
return
89
90
}
90
91
if namespace != "" {
@@ -96,7 +97,7 @@ func (r *Service) runWatch(
96
97
selector , err := labels .Parse (labelSelector )
97
98
if err != nil {
98
99
r .log .Error ().Err (err ).Str ("labelSelector" , labelSelector ).Msg ("Invalid label selector" )
99
- resultChannel <- errorResult ( "Invalid label selector: " + err . Error () )
100
+ resultChannel <- errors . Wrap ( err , "invalid label selector" )
100
101
return
101
102
}
102
103
opts = append (opts , client.MatchingLabelsSelector {Selector : selector })
@@ -107,7 +108,7 @@ func (r *Service) runWatch(
107
108
name , err = getStringArg (p .Args , NameArg , true )
108
109
if err != nil {
109
110
r .log .Error ().Err (err ).Msg ("Failed to get name argument" )
110
- resultChannel <- errorResult ( "Failed to get name: " + err . Error () )
111
+ resultChannel <- errors . Wrap ( err , "failed to get name argument" )
111
112
return
112
113
}
113
114
opts = append (opts , client.MatchingFields {"metadata.name" : name })
@@ -116,7 +117,7 @@ func (r *Service) runWatch(
116
117
sortBy , err := getStringArg (p .Args , SortByArg , false )
117
118
if err != nil {
118
119
r .log .Error ().Err (err ).Msg ("Failed to get sortBy argument" )
119
- resultChannel <- errorResult ( "Failed to get sortBy: " + err . Error () )
120
+ resultChannel <- errors . Wrap ( err , "failed to get sortBy argument" )
120
121
return
121
122
}
122
123
@@ -134,8 +135,7 @@ func (r *Service) runWatch(
134
135
135
136
sentry .CaptureError (err , sentry.Tags {"namespace" : namespace }, sentry.Extras {"gvk" : gvk .String ()})
136
137
137
- resultChannel <- errorResult ("Failed to start watch: " + err .Error ())
138
-
138
+ resultChannel <- errors .Wrap (err , "failed to start watch" )
139
139
return
140
140
}
141
141
defer watcher .Stop ()
@@ -154,7 +154,8 @@ func (r *Service) runWatch(
154
154
155
155
sentry .CaptureError (err , sentry.Tags {"namespace" : namespace })
156
156
157
- continue
157
+ resultChannel <- errors .Wrap (err , "failed to cast event object to unstructured" )
158
+ return
158
159
}
159
160
key := obj .GetNamespace () + "/" + obj .GetName ()
160
161
@@ -175,7 +176,7 @@ func (r *Service) runWatch(
175
176
176
177
sentry .CaptureError (err , sentry.Tags {"namespace" : namespace })
177
178
178
- resultChannel <- errorResult ( "Failed to determine field changes: " + err . Error () )
179
+ resultChannel <- errors . Wrap ( err , "failed to determine field changed" )
179
180
return
180
181
}
181
182
sendUpdate = changed
@@ -192,15 +193,16 @@ func (r *Service) runWatch(
192
193
if name != "" {
193
194
singleObj = previousObjects [namespace + "/" + name ]
194
195
}
196
+
197
+ var data interface {}
198
+ if singleObj != nil { // object can be nil in case it is deleted
199
+ data = singleObj .Object
200
+ }
201
+
195
202
select {
196
203
case <- ctx .Done ():
197
204
return
198
- case resultChannel <- func () interface {} {
199
- if singleObj == nil { // object will be nil in case it is deleted
200
- return nil
201
- }
202
- return singleObj .Object
203
- }():
205
+ case resultChannel <- data :
204
206
}
205
207
} else {
206
208
items := make ([]unstructured.Unstructured , 0 , len (previousObjects ))
@@ -211,7 +213,7 @@ func (r *Service) runWatch(
211
213
err = validateSortBy (items , sortBy )
212
214
if err != nil {
213
215
r .log .Error ().Err (err ).Str (SortByArg , sortBy ).Msg ("Invalid sortBy field path" )
214
- resultChannel <- errorResult ( "Invalid sortBy field path: " + err . Error () )
216
+ resultChannel <- errors . Wrap ( err , "invalid sortBy field path" )
215
217
return
216
218
}
217
219
@@ -336,8 +338,14 @@ func getFieldValue(obj *unstructured.Unstructured, fieldPath string) (interface{
336
338
return current , true , nil
337
339
}
338
340
339
- func errorResult (msg string ) map [string ]interface {} {
340
- return map [string ]interface {}{
341
- "error" : msg ,
341
+ func CreateSubscriptionResolver (isSingle bool ) graphql.FieldResolveFn {
342
+ return func (p graphql.ResolveParams ) (interface {}, error ) {
343
+ source := p .Source
344
+
345
+ if err , ok := source .(error ); ok {
346
+ return nil , err
347
+ }
348
+
349
+ return source , nil
342
350
}
343
351
}
0 commit comments