From 9ed2ff0f870c612280eeeedc95672d63d17696aa Mon Sep 17 00:00:00 2001 From: Cosmin Cojocar Date: Tue, 14 Mar 2023 14:41:26 +0100 Subject: [PATCH 1/3] Preserve the inherited scheme object when combining the options The inherited scheme was already configured in the cluster object, by creating a new scheme object for the cache object when combining the schemes will not allow the scheme registered afterwards into the cluster to be visible into the cache. --- pkg/cache/cache.go | 17 ++++------------- 1 file changed, 4 insertions(+), 13 deletions(-) diff --git a/pkg/cache/cache.go b/pkg/cache/cache.go index 9c5e475114..e1e6878f13 100644 --- a/pkg/cache/cache.go +++ b/pkg/cache/cache.go @@ -287,20 +287,11 @@ func (options Options) inheritFrom(inherited Options) (*Options, error) { return &combined, nil } -func combineScheme(schemes ...*runtime.Scheme) *runtime.Scheme { - var out *runtime.Scheme - for _, sch := range schemes { - if sch == nil { - continue - } - for gvk, t := range sch.AllKnownTypes() { - if out == nil { - out = runtime.NewScheme() - } - out.AddKnownTypeWithName(gvk, reflect.New(t).Interface().(runtime.Object)) - } +func combineScheme(inherited *runtime.Scheme, new *runtime.Scheme) *runtime.Scheme { + for gvk, t := range new.AllKnownTypes() { + inherited.AddKnownTypeWithName(gvk, reflect.New(t).Interface().(runtime.Object)) } - return out + return inherited } func selectMapper(def, override meta.RESTMapper) meta.RESTMapper { From 3c8199ed0b3f42840c9de2f3488899d61673a123 Mon Sep 17 00:00:00 2001 From: Cosmin Cojocar Date: Tue, 14 Mar 2023 18:13:50 +0100 Subject: [PATCH 2/3] Add checks to pass unit tests --- pkg/cache/cache.go | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/pkg/cache/cache.go b/pkg/cache/cache.go index e1e6878f13..830556a1c5 100644 --- a/pkg/cache/cache.go +++ b/pkg/cache/cache.go @@ -288,6 +288,12 @@ func (options Options) inheritFrom(inherited Options) (*Options, error) { } func combineScheme(inherited *runtime.Scheme, new *runtime.Scheme) *runtime.Scheme { + if inherited == nil { + return new + } + if new == nil { + return inherited + } for gvk, t := range new.AllKnownTypes() { inherited.AddKnownTypeWithName(gvk, reflect.New(t).Interface().(runtime.Object)) } From 957485308e24652bf7fb6e69ff238f1276551b56 Mon Sep 17 00:00:00 2001 From: Cosmin Cojocar Date: Wed, 15 Mar 2023 16:24:19 +0100 Subject: [PATCH 3/3] Add a test case in manager for custom object selector created with BuilderWithOptions --- pkg/manager/manager_test.go | 41 +++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git a/pkg/manager/manager_test.go b/pkg/manager/manager_test.go index 1368ea83f0..66b46907ff 100644 --- a/pkg/manager/manager_test.go +++ b/pkg/manager/manager_test.go @@ -38,11 +38,13 @@ import ( corev1 "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/api/meta" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/labels" "k8s.io/apimachinery/pkg/runtime" "k8s.io/client-go/rest" "k8s.io/client-go/tools/leaderelection/resourcelock" configv1alpha1 "k8s.io/component-base/config/v1alpha1" + "sigs.k8s.io/controller-runtime/examples/crd/pkg" "sigs.k8s.io/controller-runtime/pkg/cache" "sigs.k8s.io/controller-runtime/pkg/cache/informertest" "sigs.k8s.io/controller-runtime/pkg/client" @@ -1156,6 +1158,45 @@ var _ = Describe("manger.Manager", func() { ) }) + Context("with custom object selector", func() { + It("created with BuilderWithOptions and scheme added to manager", func() { + opts := Options{ + NewCache: cache.BuilderWithOptions(cache.Options{ + ByObject: map[client.Object]cache.ByObject{ + &corev1.Pod{}: { + Label: labels.SelectorFromSet(labels.Set{ + "test-label": "true", + }), + }, + }, + }), + } + m, err := New(cfg, opts) + Expect(err).NotTo(HaveOccurred()) + + var wgRunnableStarted sync.WaitGroup + wgRunnableStarted.Add(1) + Expect(m.Add(RunnableFunc(func(context.Context) error { + defer GinkgoRecover() + wgRunnableStarted.Done() + return nil + }))).To(Succeed()) + + Expect(pkg.AddToScheme(m.GetScheme())).NotTo(HaveOccurred()) + + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + go func() { + defer GinkgoRecover() + Expect(m.Elected()).ShouldNot(BeClosed()) + Expect(m.Start(ctx)).NotTo(HaveOccurred()) + }() + + <-m.Elected() + wgRunnableStarted.Wait() + }) + }) + Context("should start serving metrics", func() { var listener net.Listener var opts Options