Skip to content

Commit

Permalink
Work around controller runtime mistakenly defaulting to wrong mapper
Browse files Browse the repository at this point in the history
Today, controller runtime mistakenly ignores the inherited Manager default
dynamic mapper and uses a discovery mapper instead:
kubernetes-sigs/controller-runtime#2491
This means that if some CRD was not available on the cdi-controller startup,
Even if it got installed after, we would still get IsNoMatch when trying to access it.

Signed-off-by: Alex Kalenyuk <akalenyu@redhat.com>
  • Loading branch information
akalenyu committed Sep 12, 2023
1 parent 5b68719 commit fabb800
Show file tree
Hide file tree
Showing 2 changed files with 20 additions and 3 deletions.
3 changes: 3 additions & 0 deletions cmd/cdi-controller/BUILD.bazel
Original file line number Diff line number Diff line change
Expand Up @@ -27,13 +27,16 @@ go_library(
"//vendor/k8s.io/api/batch/v1:go_default_library",
"//vendor/k8s.io/api/networking/v1:go_default_library",
"//vendor/k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1:go_default_library",
"//vendor/k8s.io/apimachinery/pkg/api/meta:go_default_library",
"//vendor/k8s.io/apimachinery/pkg/fields:go_default_library",
"//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library",
"//vendor/k8s.io/client-go/kubernetes:go_default_library",
"//vendor/k8s.io/client-go/kubernetes/scheme:go_default_library",
"//vendor/k8s.io/client-go/rest:go_default_library",
"//vendor/k8s.io/client-go/tools/clientcmd:go_default_library",
"//vendor/k8s.io/klog/v2:go_default_library",
"//vendor/sigs.k8s.io/controller-runtime/pkg/cache:go_default_library",
"//vendor/sigs.k8s.io/controller-runtime/pkg/client/apiutil:go_default_library",
"//vendor/sigs.k8s.io/controller-runtime/pkg/client/config:go_default_library",
"//vendor/sigs.k8s.io/controller-runtime/pkg/log:go_default_library",
"//vendor/sigs.k8s.io/controller-runtime/pkg/log/zap:go_default_library",
Expand Down
20 changes: 17 additions & 3 deletions cmd/cdi-controller/controller.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,13 +18,16 @@ import (
batchv1 "k8s.io/api/batch/v1"
networkingv1 "k8s.io/api/networking/v1"
extv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1"
"k8s.io/apimachinery/pkg/api/meta"
"k8s.io/apimachinery/pkg/fields"
apiruntime "k8s.io/apimachinery/pkg/runtime"
"k8s.io/client-go/kubernetes"
clientgoscheme "k8s.io/client-go/kubernetes/scheme"
"k8s.io/client-go/rest"
"k8s.io/client-go/tools/clientcmd"
"k8s.io/klog/v2"
"sigs.k8s.io/controller-runtime/pkg/cache"
"sigs.k8s.io/controller-runtime/pkg/client/apiutil"
"sigs.k8s.io/controller-runtime/pkg/client/config"
logf "sigs.k8s.io/controller-runtime/pkg/log"
"sigs.k8s.io/controller-runtime/pkg/log/zap"
Expand Down Expand Up @@ -170,16 +173,26 @@ func start() {
}
}

clientcfg := config.GetConfigOrDie()
mapper, err := apiutil.NewDynamicRESTMapper(clientcfg)
if err != nil {
klog.Errorf("Failed to create rest mapper %v", err)
os.Exit(1)
}
mapperProvider := func(c *rest.Config) (meta.RESTMapper, error) {
return mapper, nil
}
opts := manager.Options{
LeaderElection: true,
LeaderElectionNamespace: namespace,
LeaderElectionID: "cdi-controller-leader-election-helper",
LeaderElectionResourceLock: "leases",
NewCache: getNewManagerCache(namespace),
NewCache: getNewManagerCache(namespace, mapper),
Scheme: scheme,
MapperProvider: mapperProvider,
}

mgr, err := manager.New(config.GetConfigOrDie(), opts)
mgr, err := manager.New(clientcfg, opts)
if err != nil {
klog.Errorf("Unable to setup controller manager: %v", err)
os.Exit(1)
Expand Down Expand Up @@ -377,7 +390,7 @@ func registerMetrics() {
// Note: objects you read once with the controller runtime client are cached.
// TODO: Make our watches way more specific using labels, for example,
// at the point of writing this, we don't care about VolumeSnapshots without the CDI label
func getNewManagerCache(cdiNamespace string) cache.NewCacheFunc {
func getNewManagerCache(cdiNamespace string, mapper meta.RESTMapper) cache.NewCacheFunc {
namespaceSelector := fields.Set{"metadata.namespace": cdiNamespace}.AsSelector()
return cache.BuilderWithOptions(
cache.Options{
Expand All @@ -395,6 +408,7 @@ func getNewManagerCache(cdiNamespace string) cache.NewCacheFunc {
Field: namespaceSelector,
},
},
Mapper: mapper,
},
)
}

0 comments on commit fabb800

Please sign in to comment.