Skip to content

Commit a3494de

Browse files
scydasscyda
authored andcommitted
apiserver: forward list request with labelselector
Signed-off-by: scydas <[email protected]>
1 parent 1ff7416 commit a3494de

File tree

2 files changed

+40
-4
lines changed

2 files changed

+40
-4
lines changed

pkg/kubeapiserver/resource_handler.go

Lines changed: 38 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,16 +19,18 @@ import (
1919
"k8s.io/klog/v2"
2020

2121
clusterv1alpha2 "github.com/clusterpedia-io/api/cluster/v1alpha2"
22+
clusterpedia "github.com/clusterpedia-io/api/clusterpedia"
2223
clusterlister "github.com/clusterpedia-io/clusterpedia/pkg/generated/listers/cluster/v1alpha2"
2324
"github.com/clusterpedia-io/clusterpedia/pkg/kubeapiserver/discovery"
2425
"github.com/clusterpedia-io/clusterpedia/pkg/kubeapiserver/resourcerest"
2526
"github.com/clusterpedia-io/clusterpedia/pkg/utils/request"
2627
)
2728

2829
type ResourceHandler struct {
29-
minRequestTimeout time.Duration
30-
delegate http.Handler
31-
proxy http.Handler
30+
couldForwardAnyRequest bool
31+
minRequestTimeout time.Duration
32+
delegate http.Handler
33+
proxy http.Handler
3234

3335
rest *RESTManager
3436
discovery *discovery.DiscoveryManager
@@ -45,7 +47,26 @@ func (r *ResourceHandler) ServeHTTP(w http.ResponseWriter, req *http.Request) {
4547
return
4648
}
4749

48-
shouldForwardRequest := HasForwardRequestHeader(req)
50+
var shouldForwardRequest bool
51+
switch requestInfo.Verb {
52+
case "list", "watch":
53+
query := request.RequestQueryFrom(req.Context())
54+
if labelSelector := query.Get("labelSelector"); labelSelector != "" {
55+
if newLabelSelector, trimed := trimForwardLabelForLabelSelectorQuery(labelSelector); trimed {
56+
query.Set("labelSelector", newLabelSelector)
57+
shouldForwardRequest = true
58+
}
59+
}
60+
}
61+
if !shouldForwardRequest && HasForwardRequestHeader(req) {
62+
shouldForwardRequest = true
63+
}
64+
65+
if shouldForwardRequest && r.couldForwardAnyRequest {
66+
r.proxy.ServeHTTP(w, req)
67+
return
68+
}
69+
4970
// handle discovery request
5071
if !requestInfo.IsResourceRequest {
5172
if shouldForwardRequest {
@@ -180,6 +201,19 @@ func checkClusterAndWarning(ctx context.Context, cluster *clusterv1alpha2.PediaC
180201
}
181202
}
182203

204+
var forwardLabelLength = len(clusterpedia.SearchLabelForwardRequest)
205+
206+
func trimForwardLabelForLabelSelectorQuery(selector string) (string, bool) {
207+
if i := strings.Index(selector, clusterpedia.SearchLabelForwardRequest); i == -1 {
208+
l, other := selector[:i], selector[i+forwardLabelLength:]
209+
if i := strings.Index(other, ","); i != -1 {
210+
l += other[i+1:]
211+
}
212+
return strings.TrimPrefix(strings.TrimSuffix(l, ","), ","), true
213+
}
214+
return selector, false
215+
}
216+
183217
func HasForwardRequestHeader(req *http.Request) bool {
184218
value := req.Header.Get("x-clusterpedia-forward")
185219
return strings.ToLower(value) == "true"

staging/src/github.com/clusterpedia-io/api/clusterpedia/types.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,8 @@ const (
3232
SearchLabelSince = "search.clusterpedia.io/since"
3333
SearchLabelBefore = "search.clusterpedia.io/before"
3434

35+
SearchLabelForwardRequest = "search.clusterpedia.io/forward"
36+
3537
ShadowAnnotationClusterName = "shadow.clusterpedia.io/cluster-name"
3638
ShadowAnnotationGroupVersionResource = "shadow.clusterpedia.io/gvr"
3739
)

0 commit comments

Comments
 (0)