From 3a4cc56708b982d29f7b0ec8363c5890eda6bccb Mon Sep 17 00:00:00 2001 From: Nghia Tran Date: Tue, 15 Mar 2022 17:29:59 -0700 Subject: [PATCH] Add configmap informer factory (#2466) --- .../informers/core/v1/configmap/configmap.go | 104 ++++++++++++++++++ .../informers/core/v1/configmap/fake/fake.go | 38 +++++++ 2 files changed, 142 insertions(+) create mode 100644 injection/clients/namespacedkube/informers/core/v1/configmap/configmap.go create mode 100644 injection/clients/namespacedkube/informers/core/v1/configmap/fake/fake.go diff --git a/injection/clients/namespacedkube/informers/core/v1/configmap/configmap.go b/injection/clients/namespacedkube/informers/core/v1/configmap/configmap.go new file mode 100644 index 000000000..9d9581df2 --- /dev/null +++ b/injection/clients/namespacedkube/informers/core/v1/configmap/configmap.go @@ -0,0 +1,104 @@ +/* +Copyright 2022 The Knative Authors + +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 configmap + +import ( + "context" + + apicorev1 "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/labels" + v1 "k8s.io/client-go/informers/core/v1" + kubernetes "k8s.io/client-go/kubernetes" + corev1 "k8s.io/client-go/listers/core/v1" + "k8s.io/client-go/tools/cache" + "knative.dev/pkg/client/injection/kube/client" + "knative.dev/pkg/controller" + "knative.dev/pkg/injection" + "knative.dev/pkg/injection/clients/namespacedkube/informers/factory" + "knative.dev/pkg/logging" +) + +func init() { + injection.Default.RegisterInformer(withInformer) + injection.Dynamic.RegisterDynamicInformer(withDynamicInformer) +} + +// Key is used for associating the Informer inside the context.Context. +type Key struct{} + +func withInformer(ctx context.Context) (context.Context, controller.Informer) { + f := factory.Get(ctx) + inf := f.Core().V1().ConfigMaps() + return context.WithValue(ctx, Key{}, inf), inf.Informer() +} + +func withDynamicInformer(ctx context.Context) context.Context { + inf := &wrapper{client: client.Get(ctx)} + return context.WithValue(ctx, Key{}, inf) +} + +// Get extracts the typed informer from the context. +func Get(ctx context.Context) v1.ConfigMapInformer { + untyped := ctx.Value(Key{}) + if untyped == nil { + logging.FromContext(ctx).Panic( + "Unable to fetch k8s.io/client-go/informers/core/v1.ConfigMapInformer from context.") + } + return untyped.(v1.ConfigMapInformer) +} + +type wrapper struct { + client kubernetes.Interface + + namespace string +} + +var _ v1.ConfigMapInformer = (*wrapper)(nil) +var _ corev1.ConfigMapLister = (*wrapper)(nil) + +func (w *wrapper) Informer() cache.SharedIndexInformer { + return cache.NewSharedIndexInformer(nil, &apicorev1.ConfigMap{}, 0, nil) +} + +func (w *wrapper) Lister() corev1.ConfigMapLister { + return w +} + +func (w *wrapper) ConfigMaps(namespace string) corev1.ConfigMapNamespaceLister { + return &wrapper{client: w.client, namespace: namespace} +} + +func (w *wrapper) List(selector labels.Selector) (ret []*apicorev1.ConfigMap, err error) { + lo, err := w.client.CoreV1().ConfigMaps(w.namespace).List(context.TODO(), metav1.ListOptions{ + LabelSelector: selector.String(), + // TODO(mattmoor): Incorporate resourceVersion bounds based on staleness criteria. + }) + if err != nil { + return nil, err + } + for idx := range lo.Items { + ret = append(ret, &lo.Items[idx]) + } + return ret, nil +} + +func (w *wrapper) Get(name string) (*apicorev1.ConfigMap, error) { + return w.client.CoreV1().ConfigMaps(w.namespace).Get(context.TODO(), name, metav1.GetOptions{ + // TODO(mattmoor): Incorporate resourceVersion bounds based on staleness criteria. + }) +} diff --git a/injection/clients/namespacedkube/informers/core/v1/configmap/fake/fake.go b/injection/clients/namespacedkube/informers/core/v1/configmap/fake/fake.go new file mode 100644 index 000000000..0433add99 --- /dev/null +++ b/injection/clients/namespacedkube/informers/core/v1/configmap/fake/fake.go @@ -0,0 +1,38 @@ +/* +Copyright 2022 The Knative Authors + +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 fake + +import ( + "context" + + "knative.dev/pkg/controller" + "knative.dev/pkg/injection" + "knative.dev/pkg/injection/clients/namespacedkube/informers/core/v1/configmap" + "knative.dev/pkg/injection/clients/namespacedkube/informers/factory/fake" +) + +var Get = configmap.Get + +func init() { + injection.Fake.RegisterInformer(withInformer) +} + +func withInformer(ctx context.Context) (context.Context, controller.Informer) { + f := fake.Get(ctx) + inf := f.Core().V1().ConfigMaps() + return context.WithValue(ctx, configmap.Key{}, inf), inf.Informer() +}