Skip to content

Commit c6f4c59

Browse files
committed
manager: use our RESTMapper
Switch to using our caching RESTMapper in the manager. If one of our controllers encounters a Kind that was added to the apiserver after the manager retrieved and cached the API discovery document, it won't be able to work with it because this new Kind is not in the cache. We need to invalidate and flush the cache in this scenario. Signed-off-by: Andy Goldstein <[email protected]>
1 parent 9a50a43 commit c6f4c59

File tree

3 files changed

+16
-9
lines changed

3 files changed

+16
-9
lines changed

cmd/clusterctl/clientcmd/configutil.go

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,8 +56,13 @@ func NewControllerRuntimeClient(kubeconfigPath string, overrides clientcmd.Confi
5656
return nil, err
5757
}
5858

59+
mapper, err := restmapper.NewCached(config)
60+
if err != nil {
61+
return nil, err
62+
}
63+
5964
return client.New(config, client.Options{
60-
Mapper: restmapper.NewCached(config),
65+
Mapper: mapper,
6166
})
6267
}
6368

main.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ import (
2727
"k8s.io/klog/klogr"
2828
clusterv1 "sigs.k8s.io/cluster-api/api/v1alpha2"
2929
"sigs.k8s.io/cluster-api/controllers"
30+
"sigs.k8s.io/cluster-api/util/restmapper"
3031
ctrl "sigs.k8s.io/controller-runtime"
3132
"sigs.k8s.io/controller-runtime/pkg/controller"
3233
// +kubebuilder:scaffold:imports
@@ -99,6 +100,7 @@ func main() {
99100
mgr, err := ctrl.NewManager(ctrl.GetConfigOrDie(), ctrl.Options{
100101
Scheme: scheme,
101102
MetricsBindAddress: metricsAddr,
103+
MapperProvider: restmapper.NewCached,
102104
LeaderElection: enableLeaderElection,
103105
Namespace: watchNamespace,
104106
SyncPeriod: &syncPeriod,

util/restmapper/cached.go

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -27,28 +27,28 @@ import (
2727
"sigs.k8s.io/controller-runtime/pkg/log"
2828
)
2929

30-
func NewCached(config *rest.Config) meta.RESTMapper {
30+
func NewCached(config *rest.Config) (meta.RESTMapper, error) {
3131
c := &cached{
3232
limiter: rate.NewLimiter(rate.Limit(1), 2),
3333
factory: func() (meta.RESTMapper, error) {
3434
return apiutil.NewDiscoveryRESTMapper(config)
3535
},
3636
}
37-
c.flush()
38-
return c
37+
return c, c.flush()
3938
}
4039

4140
type cached struct {
42-
sync.Mutex
43-
4441
limiter *rate.Limiter
4542
factory func() (meta.RESTMapper, error)
46-
mapper meta.RESTMapper
43+
44+
// lock guards mapper
45+
lock sync.Mutex
46+
mapper meta.RESTMapper
4747
}
4848

4949
func (c *cached) flush() error {
50-
c.Lock()
51-
defer c.Unlock()
50+
c.lock.Lock()
51+
defer c.lock.Unlock()
5252

5353
var err error
5454
if c.mapper == nil || c.limiter.Allow() {

0 commit comments

Comments
 (0)