Skip to content

Commit ed879ce

Browse files
authored
Merge pull request #748 from scydas/forward_request_with_labelselector
apiserver: forward list request with labelselector
2 parents 7af8145 + 29e6967 commit ed879ce

File tree

2 files changed

+40
-4
lines changed

2 files changed

+40
-4
lines changed

pkg/kubeapiserver/resource_handler.go

+38-4
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:]
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

+2
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)