Skip to content

Commit 67ea908

Browse files
xrstftnthornton
authored andcommitted
UPSTREAM: <carry>: kcp modifications
Signed-off-by: Dr. Stefan Schimanski <[email protected]>
1 parent b2c1cf6 commit 67ea908

22 files changed

+633
-65
lines changed

.prow.yaml

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
presubmits:
2+
- name: pull-controller-runtime-everything
3+
always_run: true
4+
decorate: true
5+
clone_uri: "ssh://[email protected]/kcp-dev/controller-runtime.git"
6+
labels:
7+
preset-goproxy: "true"
8+
spec:
9+
containers:
10+
- image: ghcr.io/kcp-dev/infra/build:1.22.2-1
11+
command:
12+
- make
13+
- test

DOWNSTREAM_OWNERS

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
approvers:
2+
- sttts
3+
- xrstf
4+
- mjudeikis
5+
- embik

DOWNSTREAM_OWNERS_ALIASES

Whitespace-only changes.

go.mod

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ module sigs.k8s.io/controller-runtime
33
go 1.22.0
44

55
require (
6+
github.com/evanphx/json-patch v5.6.0+incompatible // Using v4 to match upstream
67
github.com/evanphx/json-patch/v5 v5.9.0
78
github.com/fsnotify/fsnotify v1.7.0
89
github.com/go-logr/logr v1.4.2

go.sum

Lines changed: 28 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
1-
github.com/antlr4-go/antlr/v4 v4.13.0 h1:lxCg3LAv+EUK6t1i0y1V6/SLeUi0eKEKdhQAlS8TVTI=
2-
github.com/antlr4-go/antlr/v4 v4.13.0/go.mod h1:pfChB/xh/Unjila75QW7+VU4TSnWnnk9UTnmpPaOR2g=
3-
github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a h1:idn718Q4B6AGu/h5Sxe66HYVdqdGu2l9Iebqhi/AEoA=
4-
github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY=
1+
github.com/antlr/antlr4/runtime/Go/antlr/v4 v4.0.0-20230305170008-8188dc5388df h1:7RFfzj4SSt6nnvCPbCqijJi1nWCd+TqAT3bYCStRC18=
2+
github.com/antlr/antlr4/runtime/Go/antlr/v4 v4.0.0-20230305170008-8188dc5388df/go.mod h1:pSwJ0fSY5KhvocuWSx4fz3BA8OrA1bQn+K1Eli3BRwM=
3+
github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2 h1:DklsrG3dyBCFEj5IhUbnKptjxatkF07cF2ak3yi77so=
4+
github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2/go.mod h1:WaHUgvxTVq04UNunO+XhnAqY/wQc+bxr74GqbsZ/Jqw=
55
github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=
66
github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=
77
github.com/blang/semver/v4 v4.0.0 h1:1PFHFE6yCCTv8C1TeyNNarDzntLi7wMI5i/pzqYIsAM=
@@ -18,8 +18,8 @@ github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1
1818
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
1919
github.com/emicklei/go-restful/v3 v3.11.0 h1:rAQeMHw1c7zTmncogyy8VvRZwtkmkZ4FxERmMY4rD+g=
2020
github.com/emicklei/go-restful/v3 v3.11.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc=
21-
github.com/evanphx/json-patch v0.5.2 h1:xVCHIVMUu1wtM/VkR9jVZ45N3FhZfYMMYGorLCR8P3k=
22-
github.com/evanphx/json-patch v0.5.2/go.mod h1:ZWS5hhDbVDyob71nXKNL0+PWn6ToqBHMikGIFbs31qQ=
21+
github.com/evanphx/json-patch v5.6.0+incompatible h1:jBYDEEiFBPxA0v50tFdvOzQQTCvpL6mnFh5mB2/l16U=
22+
github.com/evanphx/json-patch v5.6.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk=
2323
github.com/evanphx/json-patch/v5 v5.9.0 h1:kcBlZQbplgElYIlo/n1hJbls2z/1awpXxpRi0/FOJfg=
2424
github.com/evanphx/json-patch/v5 v5.9.0/go.mod h1:VNkHZ/282BpEyt/tObQO8s5CMPmYYq14uClGH4abBuQ=
2525
github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg=
@@ -46,8 +46,11 @@ github.com/go-task/slim-sprig/v3 v3.0.0 h1:sUs3vkvUymDpBKi3qH1YSqBQk9+9D/8M2mN1v
4646
github.com/go-task/slim-sprig/v3 v3.0.0/go.mod h1:W848ghGpv3Qj3dhTPRyJypKRiqCdHZiAzKg9hl15HA8=
4747
github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q=
4848
github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=
49+
github.com/golang/glog v1.1.2 h1:DVjP2PbBOzHyzA+dn3WhHIq4NdVu3Q+pvivFICf/7fo=
50+
github.com/golang/glog v1.1.2/go.mod h1:zR+okUeTbrL6EL3xHUDxZuEtGv04p5shwip1+mL/rLQ=
4951
github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE=
5052
github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
53+
github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
5154
github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek=
5255
github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps=
5356
github.com/google/cel-go v0.20.1 h1:nDx9r8S3L4pE61eDdt8igGj8rf5kjYR3ILxWIpWNi84=
@@ -60,20 +63,27 @@ github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeN
6063
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
6164
github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0=
6265
github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
63-
github.com/google/pprof v0.0.0-20240525223248-4bfdf5a9a2af h1:kmjWCqn2qkEml422C2Rrd27c3VGxi6a/6HNq8QmHRKM=
64-
github.com/google/pprof v0.0.0-20240525223248-4bfdf5a9a2af/go.mod h1:K1liHPHnj73Fdn/EKuT8nrFqBihUSKXoLYU0BuatOYo=
65-
github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
66-
github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
67-
github.com/grpc-ecosystem/grpc-gateway/v2 v2.20.0 h1:bkypFPDjIYGfCYD5mRBvpqxfYX1YCS1PXdKYWi8FsN0=
68-
github.com/grpc-ecosystem/grpc-gateway/v2 v2.20.0/go.mod h1:P+Lt/0by1T8bfcF3z737NnSbmxQAppXMRziHUxPOC8k=
69-
github.com/imdario/mergo v0.3.6 h1:xTNEAn+kxVO7dTZGu0CegyqKZmoWFI0rF8UxjlB2d28=
70-
github.com/imdario/mergo v0.3.6/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA=
71-
github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8=
72-
github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw=
66+
github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1 h1:K6RDEckDVWvDI9JAJYCmNdQXq6neHJOYx3V6jnqNEec=
67+
github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
68+
github.com/google/uuid v1.3.1 h1:KjJaJ9iWZ3jOFZIf1Lqf4laDRCasjl0BCmnEGxkdLb4=
69+
github.com/google/uuid v1.3.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
70+
github.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0 h1:YBftPWNWd4WwGqtY2yeZL2ef8rHAxPBD8KFhJpmcqms=
71+
github.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0/go.mod h1:YN5jB8ie0yfIUg6VvR9Kz84aCaG7AsGZnLjhHbUqwPg=
72+
github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=
73+
github.com/imdario/mergo v0.3.13 h1:lFzP57bqS/wsqKssCGmtLAb8A0wKjLGrve2q3PPVcBk=
74+
github.com/imdario/mergo v0.3.13/go.mod h1:4lJ1jqUDcsbIECGy0RUJAXNIhg+6ocWgb1ALK2O4oXg=
7375
github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY=
7476
github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y=
7577
github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=
7678
github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=
79+
github.com/kcp-dev/apimachinery/v2 v2.0.0-alpha.0.0.20230926071920-57d168bcbe34 h1:tom0JX5OmAeOOmkGv8LaYHDtA1xAKDiQL5U0vhYYgdM=
80+
github.com/kcp-dev/apimachinery/v2 v2.0.0-alpha.0.0.20230926071920-57d168bcbe34/go.mod h1:cWoaYGHl1nlzdEM2xvMzIASkEZJZLSf5nhe17M7wDhw=
81+
github.com/kcp-dev/controller-runtime/examples/kcp v0.0.0-20240429114249-607a854c2cfe h1:blMRNjSiWkdZHQeU4B0WraZVVVniDklkUSdom7FWlxU=
82+
github.com/kcp-dev/controller-runtime/examples/kcp v0.0.0-20240429114249-607a854c2cfe/go.mod h1:J5yVL/5SPHDegVbEV9k7K/WpjVFvQUZMt/KB+sPR0V0=
83+
github.com/kcp-dev/kcp/sdk v0.24.0 h1:ZTfStDOQshVU2cnrqjgMo9xb0VNblkmrgMRtl0PCQEY=
84+
github.com/kcp-dev/kcp/sdk v0.24.0/go.mod h1:Pd2xxw/qhgfF2xgHolVwheq9VOJwPtNrBmxgBlYmjfk=
85+
github.com/kcp-dev/logicalcluster/v3 v3.0.5 h1:JbYakokb+5Uinz09oTXomSUJVQsqfxEvU4RyHUYxHOU=
86+
github.com/kcp-dev/logicalcluster/v3 v3.0.5/go.mod h1:EWBUBxdr49fUB1cLMO4nOdBWmYifLbP1LfoL20KkXYY=
7787
github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=
7888
github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
7989
github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=
@@ -122,7 +132,7 @@ github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+
122132
github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
123133
github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=
124134
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
125-
github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=
135+
github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
126136
github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
127137
github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
128138
github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
@@ -216,11 +226,11 @@ gopkg.in/evanphx/json-patch.v4 v4.12.0 h1:n6jtcsulIzXPJaxegRbvFNNrZDjbij7ny3gmSP
216226
gopkg.in/evanphx/json-patch.v4 v4.12.0/go.mod h1:p8EYWUEYMpynmqDbY58zCKCFZw8pRWMG4EsWvDvM72M=
217227
gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc=
218228
gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw=
219-
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
220229
gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
221230
gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=
222231
gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
223232
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
233+
gopkg.in/yaml.v3 v3.0.0/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
224234
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
225235
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
226236
k8s.io/api v0.31.0 h1:b9LiSjR2ym/SzTOlfMHm1tr7/21aD7fSkqgD/CVJBCo=

pkg/cache/cache.go

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import (
2121
"fmt"
2222
"net/http"
2323
"sort"
24+
"strings"
2425
"time"
2526

2627
"golang.org/x/exp/maps"
@@ -169,6 +170,14 @@ type Options struct {
169170
// instead of `reconcile.Result{}`.
170171
SyncPeriod *time.Duration
171172

173+
// NewInformerFunc is a function that is used to create SharedIndexInformers.
174+
// Defaults to cache.NewSharedIndexInformer from client-go
175+
NewInformerFunc client.NewInformerFunc
176+
177+
// Indexers is the indexers that the informers will be configured to use.
178+
// Will always have the standard NamespaceIndex.
179+
Indexers toolscache.Indexers
180+
172181
// ReaderFailOnMissingInformer configures the cache to return a ErrResourceNotCached error when a user
173182
// requests, using Get() and List(), a resource the cache does not already have an informer for.
174183
//
@@ -225,9 +234,6 @@ type Options struct {
225234
// ByObject restricts the cache's ListWatch to the desired fields per GVK at the specified object.
226235
// If unset, this will fall through to the Default* settings.
227236
ByObject map[client.Object]ByObject
228-
229-
// newInformer allows overriding of NewSharedIndexInformer for testing.
230-
newInformer *func(toolscache.ListerWatcher, runtime.Object, time.Duration, toolscache.Indexers) toolscache.SharedIndexInformer
231237
}
232238

233239
// ByObject offers more fine-grained control over the cache's ListWatch by object.
@@ -398,9 +404,10 @@ func newCache(restConfig *rest.Config, opts Options) newCacheFunc {
398404
Transform: config.Transform,
399405
WatchErrorHandler: opts.DefaultWatchErrorHandler,
400406
UnsafeDisableDeepCopy: ptr.Deref(config.UnsafeDisableDeepCopy, false),
401-
NewInformer: opts.newInformer,
407+
NewInformer: opts.NewInformerFunc,
402408
}),
403409
readerFailOnMissingInformer: opts.ReaderFailOnMissingInformer,
410+
clusterIndexes: strings.HasSuffix(restConfig.Host, "/clusters/*"),
404411
}
405412
}
406413
}
@@ -507,6 +514,10 @@ func defaultOpts(config *rest.Config, opts Options) (Options, error) {
507514
if opts.SyncPeriod == nil {
508515
opts.SyncPeriod = &defaultSyncPeriod
509516
}
517+
518+
if opts.NewInformerFunc == nil {
519+
opts.NewInformerFunc = toolscache.NewSharedIndexInformer
520+
}
510521
return opts, nil
511522
}
512523

pkg/cache/cache_test.go

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -544,14 +544,9 @@ func NonBlockingGetTest(createCacheFunc func(config *rest.Config, opts cache.Opt
544544
Expect(err).NotTo(HaveOccurred())
545545

546546
By("creating the informer cache")
547-
v := reflect.ValueOf(&opts).Elem()
548-
newInformerField := v.FieldByName("newInformer")
549-
newFakeInformer := func(_ kcache.ListerWatcher, _ runtime.Object, _ time.Duration, _ kcache.Indexers) kcache.SharedIndexInformer {
547+
opts.NewInformerFunc = func(_ kcache.ListerWatcher, _ runtime.Object, _ time.Duration, _ kcache.Indexers) kcache.SharedIndexInformer {
550548
return &controllertest.FakeInformer{Synced: false}
551549
}
552-
reflect.NewAt(newInformerField.Type(), newInformerField.Addr().UnsafePointer()).
553-
Elem().
554-
Set(reflect.ValueOf(&newFakeInformer))
555550
informerCache, err = createCacheFunc(cfg, opts)
556551
Expect(err).NotTo(HaveOccurred())
557552
By("running the cache and waiting for it to sync")

pkg/cache/defaulting_test.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -401,6 +401,9 @@ func TestDefaultOpts(t *testing.T) {
401401
t.Fatal(err)
402402
}
403403

404+
// We cannot reference kcp.NewInformerWithClusterIndexes due to import cycle.
405+
defaulted.NewInformerFunc = nil
406+
404407
if diff := tc.verification(defaulted); diff != "" {
405408
t.Errorf("expected config differs from actual: %s", diff)
406409
}

pkg/cache/informer_cache.go

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,8 @@ import (
3131
"sigs.k8s.io/controller-runtime/pkg/cache/internal"
3232
"sigs.k8s.io/controller-runtime/pkg/client"
3333
"sigs.k8s.io/controller-runtime/pkg/client/apiutil"
34+
35+
"github.com/kcp-dev/logicalcluster/v3"
3436
)
3537

3638
var (
@@ -68,6 +70,7 @@ type informerCache struct {
6870
scheme *runtime.Scheme
6971
*internal.Informers
7072
readerFailOnMissingInformer bool
73+
clusterIndexes bool
7174
}
7275

7376
// Get implements Reader.
@@ -217,10 +220,10 @@ func (ic *informerCache) IndexField(ctx context.Context, obj client.Object, fiel
217220
if err != nil {
218221
return err
219222
}
220-
return indexByField(informer, field, extractValue)
223+
return indexByField(informer, field, extractValue, ic.clusterIndexes)
221224
}
222225

223-
func indexByField(informer Informer, field string, extractValue client.IndexerFunc) error {
226+
func indexByField(informer Informer, field string, extractValue client.IndexerFunc, clusterIndexes bool) error {
224227
indexFunc := func(objRaw interface{}) ([]string, error) {
225228
// TODO(directxman12): check if this is the correct type?
226229
obj, isObj := objRaw.(client.Object)
@@ -233,6 +236,13 @@ func indexByField(informer Informer, field string, extractValue client.IndexerFu
233236
}
234237
ns := meta.GetNamespace()
235238

239+
keyFunc := internal.KeyToNamespacedKey
240+
if clusterName := logicalcluster.From(obj); clusterIndexes && !clusterName.Empty() {
241+
keyFunc = func(ns, val string) string {
242+
return internal.KeyToClusteredKey(clusterName.String(), ns, val)
243+
}
244+
}
245+
236246
rawVals := extractValue(obj)
237247
var vals []string
238248
if ns == "" {
@@ -242,14 +252,15 @@ func indexByField(informer Informer, field string, extractValue client.IndexerFu
242252
// if we need to add non-namespaced versions too, double the length
243253
vals = make([]string, len(rawVals)*2)
244254
}
255+
245256
for i, rawVal := range rawVals {
246257
// save a namespaced variant, so that we can ask
247258
// "what are all the object matching a given index *in a given namespace*"
248-
vals[i] = internal.KeyToNamespacedKey(ns, rawVal)
259+
vals[i] = keyFunc(ns, rawVal)
249260
if ns != "" {
250261
// if we have a namespace, also inject a special index key for listing
251262
// regardless of the object namespace
252-
vals[i+len(rawVals)] = internal.KeyToNamespacedKey("", rawVal)
263+
vals[i+len(rawVals)] = keyFunc("", rawVal)
253264
}
254265
}
255266

pkg/cache/internal/cache_reader.go

Lines changed: 44 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,9 @@ import (
2121
"fmt"
2222
"reflect"
2323

24+
kcpcache "github.com/kcp-dev/apimachinery/v2/pkg/cache"
25+
"github.com/kcp-dev/logicalcluster/v3"
26+
2427
apierrors "k8s.io/apimachinery/pkg/api/errors"
2528
apimeta "k8s.io/apimachinery/pkg/api/meta"
2629
"k8s.io/apimachinery/pkg/fields"
@@ -31,6 +34,7 @@ import (
3134

3235
"sigs.k8s.io/controller-runtime/pkg/client"
3336
"sigs.k8s.io/controller-runtime/pkg/internal/field/selector"
37+
"sigs.k8s.io/controller-runtime/pkg/kontext"
3438
)
3539

3640
// CacheReader is a client.Reader.
@@ -54,12 +58,22 @@ type CacheReader struct {
5458
}
5559

5660
// Get checks the indexer for the object and writes a copy of it if found.
57-
func (c *CacheReader) Get(_ context.Context, key client.ObjectKey, out client.Object, _ ...client.GetOption) error {
61+
func (c *CacheReader) Get(ctx context.Context, key client.ObjectKey, out client.Object, _ ...client.GetOption) error {
5862
if c.scopeName == apimeta.RESTScopeNameRoot {
5963
key.Namespace = ""
6064
}
6165
storeKey := objectKeyToStoreKey(key)
6266

67+
// create cluster-aware key for KCP
68+
_, isClusterAware := c.indexer.GetIndexers()[kcpcache.ClusterAndNamespaceIndexName]
69+
clusterName, _ := kontext.ClusterFrom(ctx)
70+
if isClusterAware && clusterName.Empty() {
71+
return fmt.Errorf("cluster-aware cache requires a cluster in context")
72+
}
73+
if isClusterAware {
74+
storeKey = clusterName.String() + "|" + storeKey
75+
}
76+
6377
// Lookup the object from the indexer cache
6478
obj, exists, err := c.indexer.GetByKey(storeKey)
6579
if err != nil {
@@ -105,7 +119,7 @@ func (c *CacheReader) Get(_ context.Context, key client.ObjectKey, out client.Ob
105119
}
106120

107121
// List lists items out of the indexer and writes them to out.
108-
func (c *CacheReader) List(_ context.Context, out client.ObjectList, opts ...client.ListOption) error {
122+
func (c *CacheReader) List(ctx context.Context, out client.ObjectList, opts ...client.ListOption) error {
109123
var objs []interface{}
110124
var err error
111125

@@ -116,6 +130,9 @@ func (c *CacheReader) List(_ context.Context, out client.ObjectList, opts ...cli
116130
return fmt.Errorf("continue list option is not supported by the cache")
117131
}
118132

133+
_, isClusterAware := c.indexer.GetIndexers()[kcpcache.ClusterAndNamespaceIndexName]
134+
clusterName, _ := kontext.ClusterFrom(ctx)
135+
119136
switch {
120137
case listOpts.FieldSelector != nil:
121138
requiresExact := selector.RequiresExactMatch(listOpts.FieldSelector)
@@ -125,11 +142,19 @@ func (c *CacheReader) List(_ context.Context, out client.ObjectList, opts ...cli
125142
// list all objects by the field selector. If this is namespaced and we have one, ask for the
126143
// namespaced index key. Otherwise, ask for the non-namespaced variant by using the fake "all namespaces"
127144
// namespace.
128-
objs, err = byIndexes(c.indexer, listOpts.FieldSelector.Requirements(), listOpts.Namespace)
145+
objs, err = byIndexes(c.indexer, listOpts.FieldSelector.Requirements(), clusterName, listOpts.Namespace)
129146
case listOpts.Namespace != "":
130-
objs, err = c.indexer.ByIndex(cache.NamespaceIndex, listOpts.Namespace)
147+
if isClusterAware && !clusterName.Empty() {
148+
objs, err = c.indexer.ByIndex(kcpcache.ClusterAndNamespaceIndexName, kcpcache.ClusterAndNamespaceIndexKey(clusterName, listOpts.Namespace))
149+
} else {
150+
objs, err = c.indexer.ByIndex(cache.NamespaceIndex, listOpts.Namespace)
151+
}
131152
default:
132-
objs = c.indexer.List()
153+
if isClusterAware && !clusterName.Empty() {
154+
objs, err = c.indexer.ByIndex(kcpcache.ClusterIndexName, kcpcache.ClusterIndexKey(clusterName))
155+
} else {
156+
objs = c.indexer.List()
157+
}
133158
}
134159
if err != nil {
135160
return err
@@ -177,16 +202,22 @@ func (c *CacheReader) List(_ context.Context, out client.ObjectList, opts ...cli
177202
return apimeta.SetList(out, runtimeObjs)
178203
}
179204

180-
func byIndexes(indexer cache.Indexer, requires fields.Requirements, namespace string) ([]interface{}, error) {
205+
func byIndexes(indexer cache.Indexer, requires fields.Requirements, clusterName logicalcluster.Name, namespace string) ([]interface{}, error) {
181206
var (
182207
err error
183208
objs []interface{}
184209
vals []string
185210
)
186211
indexers := indexer.GetIndexers()
212+
_, isClusterAware := indexers[kcpcache.ClusterAndNamespaceIndexName]
187213
for idx, req := range requires {
188214
indexName := FieldIndexName(req.Field)
189-
indexedValue := KeyToNamespacedKey(namespace, req.Value)
215+
var indexedValue string
216+
if isClusterAware {
217+
indexedValue = KeyToClusteredKey(clusterName.String(), namespace, req.Value)
218+
} else {
219+
indexedValue = KeyToNamespacedKey(namespace, req.Value)
220+
}
190221
if idx == 0 {
191222
// we use first require to get snapshot data
192223
// TODO(halfcrazy): use complicated index when client-go provides byIndexes
@@ -253,3 +284,9 @@ func KeyToNamespacedKey(ns string, baseKey string) string {
253284
}
254285
return allNamespacesNamespace + "/" + baseKey
255286
}
287+
288+
// KeyToClusteredKey prefixes the given index key with a cluster name
289+
// for use in field selector indexes.
290+
func KeyToClusteredKey(clusterName string, ns string, baseKey string) string {
291+
return clusterName + "|" + KeyToNamespacedKey(ns, baseKey)
292+
}

0 commit comments

Comments
 (0)