mirror of https://github.com/knative/pkg.git
Add configmap informer factory (#2466)
This commit is contained in:
parent
13bdd74cbd
commit
3a4cc56708
|
@ -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.
|
||||||
|
})
|
||||||
|
}
|
|
@ -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()
|
||||||
|
}
|
Loading…
Reference in New Issue