Skip to content

Commit d98ecfb

Browse files
github-actions[bot]rambohe-ch
andauthored
bugfix: even no endpoints left after filter, an empty object should be returned to clients (#1030)
(cherry picked from commit 16d281c) Co-authored-by: rambohe-ch <[email protected]>
1 parent b899f84 commit d98ecfb

File tree

2 files changed

+1618
-1031
lines changed

2 files changed

+1618
-1031
lines changed

pkg/yurthub/filter/servicetopology/handler.go

Lines changed: 29 additions & 70 deletions
Original file line numberDiff line numberDiff line change
@@ -81,33 +81,24 @@ func (fh *serviceTopologyFilterHandler) ObjectResponseFilter(b []byte) ([]byte,
8181
// filter endpointSlice before k8s 1.21
8282
var items []discoveryV1beta1.EndpointSlice
8383
for i := range v.Items {
84-
isNil, item := fh.serviceTopologyHandler(&v.Items[i])
85-
if !isNil {
86-
eps := item.(*discoveryV1beta1.EndpointSlice)
87-
items = append(items, *eps)
88-
}
84+
eps := fh.serviceTopologyHandler(&v.Items[i]).(*discoveryV1beta1.EndpointSlice)
85+
items = append(items, *eps)
8986
}
9087
v.Items = items
9188
return fh.serializer.Encode(v)
9289
case *discovery.EndpointSliceList:
9390
var items []discovery.EndpointSlice
9491
for i := range v.Items {
95-
isNil, item := fh.serviceTopologyHandler(&v.Items[i])
96-
if !isNil {
97-
eps := item.(*discovery.EndpointSlice)
98-
items = append(items, *eps)
99-
}
92+
eps := fh.serviceTopologyHandler(&v.Items[i]).(*discovery.EndpointSlice)
93+
items = append(items, *eps)
10094
}
10195
v.Items = items
10296
return fh.serializer.Encode(v)
10397
case *v1.EndpointsList:
10498
var items []v1.Endpoints
10599
for i := range v.Items {
106-
isNil, item := fh.serviceTopologyHandler(&v.Items[i])
107-
if !isNil {
108-
ep := item.(*v1.Endpoints)
109-
items = append(items, *ep)
110-
}
100+
ep := fh.serviceTopologyHandler(&v.Items[i]).(*v1.Endpoints)
101+
items = append(items, *ep)
111102
}
112103
v.Items = items
113104
return fh.serializer.Encode(v)
@@ -134,20 +125,17 @@ func (fh *serviceTopologyFilterHandler) StreamResponseFilter(rc io.ReadCloser, c
134125
return err
135126
}
136127

137-
isNil, filteredObj := fh.serviceTopologyHandler(obj)
138-
if !isNil {
139-
ch <- watch.Event{
140-
Type: watchType,
141-
Object: filteredObj,
142-
}
128+
ch <- watch.Event{
129+
Type: watchType,
130+
Object: fh.serviceTopologyHandler(obj),
143131
}
144132
}
145133
}
146134

147-
func (fh *serviceTopologyFilterHandler) serviceTopologyHandler(obj runtime.Object) (bool, runtime.Object) {
135+
func (fh *serviceTopologyFilterHandler) serviceTopologyHandler(obj runtime.Object) runtime.Object {
148136
needHandle, serviceTopologyType := fh.resolveServiceTopologyType(obj)
149137
if !needHandle || len(serviceTopologyType) == 0 {
150-
return false, obj
138+
return obj
151139
}
152140

153141
switch serviceTopologyType {
@@ -158,7 +146,7 @@ func (fh *serviceTopologyFilterHandler) serviceTopologyHandler(obj runtime.Objec
158146
// close traffic on the same node pool
159147
return fh.nodePoolTopologyHandler(obj)
160148
default:
161-
return false, obj
149+
return obj
162150
}
163151
}
164152

@@ -190,36 +178,24 @@ func (fh *serviceTopologyFilterHandler) resolveServiceTopologyType(obj runtime.O
190178
return false, ""
191179
}
192180

193-
func (fh *serviceTopologyFilterHandler) nodeTopologyHandler(obj runtime.Object) (bool, runtime.Object) {
181+
func (fh *serviceTopologyFilterHandler) nodeTopologyHandler(obj runtime.Object) runtime.Object {
194182
switch v := obj.(type) {
195183
case *discoveryV1beta1.EndpointSlice:
196-
newObj := reassembleV1beta1EndpointSlice(v, fh.nodeName, nil)
197-
if newObj == nil {
198-
return true, obj
199-
}
200-
return false, newObj
184+
return reassembleV1beta1EndpointSlice(v, fh.nodeName, nil)
201185
case *discovery.EndpointSlice:
202-
newObj := reassembleEndpointSlice(v, fh.nodeName, nil)
203-
if newObj == nil {
204-
return true, obj
205-
}
206-
return false, newObj
186+
return reassembleEndpointSlice(v, fh.nodeName, nil)
207187
case *v1.Endpoints:
208-
newObj := reassembleEndpoints(v, fh.nodeName, nil)
209-
if newObj == nil {
210-
return true, obj
211-
}
212-
return false, newObj
188+
return reassembleEndpoints(v, fh.nodeName, nil)
213189
default:
214-
return false, obj
190+
return obj
215191
}
216192
}
217193

218-
func (fh *serviceTopologyFilterHandler) nodePoolTopologyHandler(obj runtime.Object) (bool, runtime.Object) {
194+
func (fh *serviceTopologyFilterHandler) nodePoolTopologyHandler(obj runtime.Object) runtime.Object {
219195
currentNode, err := fh.nodeGetter(fh.nodeName)
220196
if err != nil {
221197
klog.Warningf("skip serviceTopologyFilterHandler, failed to get current node %s, err: %v", fh.nodeName, err)
222-
return false, obj
198+
return obj
223199
}
224200

225201
nodePoolName, ok := currentNode.Labels[nodepoolv1alpha1.LabelCurrentNodePool]
@@ -231,30 +207,18 @@ func (fh *serviceTopologyFilterHandler) nodePoolTopologyHandler(obj runtime.Obje
231207
nodePool, err := fh.nodePoolLister.Get(nodePoolName)
232208
if err != nil {
233209
klog.Warningf("serviceTopologyFilterHandler: failed to get nodepool %s, err: %v", nodePoolName, err)
234-
return false, obj
210+
return obj
235211
}
236212

237213
switch v := obj.(type) {
238214
case *discoveryV1beta1.EndpointSlice:
239-
newObj := reassembleV1beta1EndpointSlice(v, "", nodePool)
240-
if newObj == nil {
241-
return true, obj
242-
}
243-
return false, newObj
215+
return reassembleV1beta1EndpointSlice(v, "", nodePool)
244216
case *discovery.EndpointSlice:
245-
newObj := reassembleEndpointSlice(v, "", nodePool)
246-
if newObj == nil {
247-
return true, obj
248-
}
249-
return false, newObj
217+
return reassembleEndpointSlice(v, "", nodePool)
250218
case *v1.Endpoints:
251-
newObj := reassembleEndpoints(v, "", nodePool)
252-
if newObj == nil {
253-
return true, obj
254-
}
255-
return false, newObj
219+
return reassembleEndpoints(v, "", nodePool)
256220
default:
257-
return false, obj
221+
return obj
258222
}
259223
}
260224

@@ -279,9 +243,8 @@ func reassembleV1beta1EndpointSlice(endpointSlice *discoveryV1beta1.EndpointSlic
279243
}
280244
}
281245
}
282-
if len(newEps) == 0 {
283-
return nil
284-
}
246+
247+
// even no endpoints left, empty endpoints slice should be returned
285248
endpointSlice.Endpoints = newEps
286249
return endpointSlice
287250
}
@@ -308,9 +271,7 @@ func reassembleEndpointSlice(endpointSlice *discovery.EndpointSlice, nodeName st
308271
}
309272
}
310273

311-
if len(newEps) == 0 {
312-
return nil
313-
}
274+
// even no endpoints left, empty endpoints slice should be returned
314275
endpointSlice.Endpoints = newEps
315276
return endpointSlice
316277
}
@@ -338,10 +299,8 @@ func reassembleEndpoints(endpoints *v1.Endpoints, nodeName string, nodePool *nod
338299
newEpSubsets = append(newEpSubsets, endpoints.Subsets[i])
339300
}
340301
}
341-
if len(newEpSubsets) == 0 {
342-
// this endpoints has no valid addresses for ingress controller, return nil to ignore it
343-
return nil
344-
}
302+
303+
// even no subsets left, empty subset slice should be returned
345304
endpoints.Subsets = newEpSubsets
346305
return endpoints
347306
}

0 commit comments

Comments
 (0)