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