diff --git a/pkg/reconciler/featureflag/controller.go b/pkg/reconciler/featureflag/controller.go index ce0cc4f66..c619351e4 100644 --- a/pkg/reconciler/featureflag/controller.go +++ b/pkg/reconciler/featureflag/controller.go @@ -29,7 +29,7 @@ import ( ) func NewController(ctx context.Context, cmw configmap.Watcher) *controller.Impl { - logger := reconciler.NewControllerLogger(ctx, "namespace") + logger := reconciler.NewControllerLogger(ctx, "featureflag") namespaceInformer := namespaceinformer.Get(ctx) @@ -58,7 +58,9 @@ func NewController(ctx context.Context, cmw configmap.Watcher) *controller.Impl &config.DefaultsConfig{}, } resync := configmap.TypeFilter(configsToResync...)(func(string, interface{}) { - impl.GlobalResync(namespaceInformer.Informer()) + impl.FilteredGlobalResync( + controller.FilterWithName(v1alpha1.KfNamespace), + namespaceInformer.Informer()) }) configStore := config.NewStore(logger.Named("kf-config-store"), resync) configStore.WatchConfigs(cmw) diff --git a/pkg/reconciler/featureflag/reconciler.go b/pkg/reconciler/featureflag/reconciler.go index f4016aa7e..71ce628f8 100644 --- a/pkg/reconciler/featureflag/reconciler.go +++ b/pkg/reconciler/featureflag/reconciler.go @@ -17,6 +17,7 @@ package featureflag import ( "context" "encoding/json" + "fmt" "github.com/google/kf/v2/pkg/apis/kf/config" "github.com/google/kf/v2/pkg/apis/kf/v1alpha1" @@ -24,6 +25,7 @@ import ( v1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" v1listers "k8s.io/client-go/listers/core/v1" + "k8s.io/client-go/tools/cache" "knative.dev/pkg/controller" ) @@ -40,6 +42,11 @@ var _ controller.Reconciler = (*Reconciler)(nil) func (r *Reconciler) Reconcile(ctx context.Context, key string) error { ctx = r.configStore.ToContext(ctx) + // Make sure we only reconcile the Kf namespace. + if err := validateKfNamespaceName(key); err != nil { + return err + } + ns, nsErr := r.namespaceLister.Get(v1alpha1.KfNamespace) if nsErr != nil { return nsErr @@ -51,6 +58,19 @@ func (r *Reconciler) Reconcile(ctx context.Context, key string) error { return nil } +func validateKfNamespaceName(key string) error { + namespace, _, err := cache.SplitMetaNamespaceKey(key) + + switch { + case err != nil: + return err + case namespace != v1alpha1.KfNamespace: + return fmt.Errorf("invalid namespace %q queued, expect only %q", namespace, v1alpha1.KfNamespace) + } + + return nil +} + func (r *Reconciler) reconcileFeatureFlags(ctx context.Context, namespace *v1.Namespace) (*v1.Namespace, error) { // Don't modify the informers copy. existing := namespace.DeepCopy() diff --git a/pkg/reconciler/featureflag/reconciler_test.go b/pkg/reconciler/featureflag/reconciler_test.go new file mode 100644 index 000000000..6eb28cd09 --- /dev/null +++ b/pkg/reconciler/featureflag/reconciler_test.go @@ -0,0 +1,43 @@ +// Copyright 2023 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package featureflag + +import ( + "errors" + "testing" + + "github.com/google/kf/v2/pkg/kf/testutil" +) + +func TestValidateKfNamespaceName(t *testing.T) { + t.Parallel() + + cases := map[string]struct { + key string + want error + }{ + "nominal": {key: "kf/", want: nil}, + "invalid namespace": {key: "kf-system/", want: errors.New(`invalid namespace "kf-system" queued, expect only "kf"`)}, + "invalid key": {key: "foo/bar/bazz", want: errors.New(`unexpected key format: "foo/bar/bazz"`)}, + } + + for tn, tc := range cases { + t.Run(tn, func(t *testing.T) { + got := validateKfNamespaceName(tc.key) + + testutil.AssertErrorsEqual(t, tc.want, got) + }) + } +}