mirror of
https://github.com/kubernetes/sample-controller.git
synced 2025-05-14 19:22:08 +08:00
Merge pull request #54660 from munnerz/namespaced-informer-factory
Automatic merge from submit-queue (batch tested with PRs 55403, 54660, 55165). If you want to cherry-pick this change to another branch, please follow the instructions <a href="https://github.com/kubernetes/community/blob/master/contributors/devel/cherry-picks.md">here</a>. code-generator: add NewFilteredSharedInformerFactory function **What this PR does / why we need it**: Adds a `namespace` option to the SharedInformerFactory constructor. This is useful when building controllers that may need to scope themselves to a namespace due to RBAC constraints. Workarounds for this involve losing type safety if a user wants to use it for core APIs as well as a SharedInformerFactory type interface, as we have to deal with plain SharedIndexInformers (example here: https://github.com/jetstack-experimental/cert-manager/blob/master/pkg/util/kube/factory.go) **Which issue this PR fixes** *(optional, in `fixes #<issue number>(, fixes #<issue_number>, ...)` format, will close that issue when PR gets merged)*: fixes # Fixes https://github.com/kubernetes/code-generator/issues/9 **Special notes for your reviewer**: This will require updating all uses of SharedInformerFactory throughout the codebase. I'm going to follow up with later commits in this PR with these changes, but wanted to get this here to get some feedback on the way it's implemented. **Release note**: ```release-note NONE ``` /cc @sttts @nikhita @deads2k Kubernetes-commit: bab312dbcf2ea68c19bffa9f26362c86ef1987ec
This commit is contained in:
commit
112f77b55e
1888
Godeps/Godeps.json
generated
1888
Godeps/Godeps.json
generated
File diff suppressed because it is too large
Load Diff
@ -9,6 +9,7 @@ go_library(
|
|||||||
importpath = "k8s.io/sample-controller/pkg/client/informers/externalversions",
|
importpath = "k8s.io/sample-controller/pkg/client/informers/externalversions",
|
||||||
visibility = ["//visibility:public"],
|
visibility = ["//visibility:public"],
|
||||||
deps = [
|
deps = [
|
||||||
|
"//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library",
|
||||||
"//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library",
|
"//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library",
|
||||||
"//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library",
|
"//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library",
|
||||||
"//vendor/k8s.io/client-go/tools/cache:go_default_library",
|
"//vendor/k8s.io/client-go/tools/cache:go_default_library",
|
||||||
|
@ -19,6 +19,7 @@ limitations under the License.
|
|||||||
package externalversions
|
package externalversions
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||||
runtime "k8s.io/apimachinery/pkg/runtime"
|
runtime "k8s.io/apimachinery/pkg/runtime"
|
||||||
schema "k8s.io/apimachinery/pkg/runtime/schema"
|
schema "k8s.io/apimachinery/pkg/runtime/schema"
|
||||||
cache "k8s.io/client-go/tools/cache"
|
cache "k8s.io/client-go/tools/cache"
|
||||||
@ -31,9 +32,11 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
type sharedInformerFactory struct {
|
type sharedInformerFactory struct {
|
||||||
client versioned.Interface
|
client versioned.Interface
|
||||||
lock sync.Mutex
|
namespace string
|
||||||
defaultResync time.Duration
|
tweakListOptions internalinterfaces.TweakListOptionsFunc
|
||||||
|
lock sync.Mutex
|
||||||
|
defaultResync time.Duration
|
||||||
|
|
||||||
informers map[reflect.Type]cache.SharedIndexInformer
|
informers map[reflect.Type]cache.SharedIndexInformer
|
||||||
// startedInformers is used for tracking which informers have been started.
|
// startedInformers is used for tracking which informers have been started.
|
||||||
@ -43,8 +46,17 @@ type sharedInformerFactory struct {
|
|||||||
|
|
||||||
// NewSharedInformerFactory constructs a new instance of sharedInformerFactory
|
// NewSharedInformerFactory constructs a new instance of sharedInformerFactory
|
||||||
func NewSharedInformerFactory(client versioned.Interface, defaultResync time.Duration) SharedInformerFactory {
|
func NewSharedInformerFactory(client versioned.Interface, defaultResync time.Duration) SharedInformerFactory {
|
||||||
|
return NewFilteredSharedInformerFactory(client, defaultResync, v1.NamespaceAll, nil)
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewFilteredSharedInformerFactory constructs a new instance of sharedInformerFactory.
|
||||||
|
// Listers obtained via this SharedInformerFactory will be subject to the same filters
|
||||||
|
// as specified here.
|
||||||
|
func NewFilteredSharedInformerFactory(client versioned.Interface, defaultResync time.Duration, namespace string, tweakListOptions internalinterfaces.TweakListOptionsFunc) SharedInformerFactory {
|
||||||
return &sharedInformerFactory{
|
return &sharedInformerFactory{
|
||||||
client: client,
|
client: client,
|
||||||
|
namespace: namespace,
|
||||||
|
tweakListOptions: tweakListOptions,
|
||||||
defaultResync: defaultResync,
|
defaultResync: defaultResync,
|
||||||
informers: make(map[reflect.Type]cache.SharedIndexInformer),
|
informers: make(map[reflect.Type]cache.SharedIndexInformer),
|
||||||
startedInformers: make(map[reflect.Type]bool),
|
startedInformers: make(map[reflect.Type]bool),
|
||||||
@ -114,5 +126,5 @@ type SharedInformerFactory interface {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (f *sharedInformerFactory) Samplecontroller() samplecontroller.Interface {
|
func (f *sharedInformerFactory) Samplecontroller() samplecontroller.Interface {
|
||||||
return samplecontroller.New(f)
|
return samplecontroller.New(f, f.namespace, f.tweakListOptions)
|
||||||
}
|
}
|
||||||
|
@ -6,6 +6,7 @@ go_library(
|
|||||||
importpath = "k8s.io/sample-controller/pkg/client/informers/externalversions/internalinterfaces",
|
importpath = "k8s.io/sample-controller/pkg/client/informers/externalversions/internalinterfaces",
|
||||||
visibility = ["//visibility:public"],
|
visibility = ["//visibility:public"],
|
||||||
deps = [
|
deps = [
|
||||||
|
"//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library",
|
||||||
"//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library",
|
"//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library",
|
||||||
"//vendor/k8s.io/client-go/tools/cache:go_default_library",
|
"//vendor/k8s.io/client-go/tools/cache:go_default_library",
|
||||||
"//vendor/k8s.io/sample-controller/pkg/client/clientset/versioned:go_default_library",
|
"//vendor/k8s.io/sample-controller/pkg/client/clientset/versioned:go_default_library",
|
||||||
|
@ -19,6 +19,7 @@ limitations under the License.
|
|||||||
package internalinterfaces
|
package internalinterfaces
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||||
runtime "k8s.io/apimachinery/pkg/runtime"
|
runtime "k8s.io/apimachinery/pkg/runtime"
|
||||||
cache "k8s.io/client-go/tools/cache"
|
cache "k8s.io/client-go/tools/cache"
|
||||||
versioned "k8s.io/sample-controller/pkg/client/clientset/versioned"
|
versioned "k8s.io/sample-controller/pkg/client/clientset/versioned"
|
||||||
@ -32,3 +33,5 @@ type SharedInformerFactory interface {
|
|||||||
Start(stopCh <-chan struct{})
|
Start(stopCh <-chan struct{})
|
||||||
InformerFor(obj runtime.Object, newFunc NewInformerFunc) cache.SharedIndexInformer
|
InformerFor(obj runtime.Object, newFunc NewInformerFunc) cache.SharedIndexInformer
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type TweakListOptionsFunc func(*v1.ListOptions)
|
||||||
|
@ -30,15 +30,17 @@ type Interface interface {
|
|||||||
}
|
}
|
||||||
|
|
||||||
type group struct {
|
type group struct {
|
||||||
internalinterfaces.SharedInformerFactory
|
factory internalinterfaces.SharedInformerFactory
|
||||||
|
namespace string
|
||||||
|
tweakListOptions internalinterfaces.TweakListOptionsFunc
|
||||||
}
|
}
|
||||||
|
|
||||||
// New returns a new Interface.
|
// New returns a new Interface.
|
||||||
func New(f internalinterfaces.SharedInformerFactory) Interface {
|
func New(f internalinterfaces.SharedInformerFactory, namespace string, tweakListOptions internalinterfaces.TweakListOptionsFunc) Interface {
|
||||||
return &group{f}
|
return &group{factory: f, namespace: namespace, tweakListOptions: tweakListOptions}
|
||||||
}
|
}
|
||||||
|
|
||||||
// V1alpha1 returns a new v1alpha1.Interface.
|
// V1alpha1 returns a new v1alpha1.Interface.
|
||||||
func (g *group) V1alpha1() v1alpha1.Interface {
|
func (g *group) V1alpha1() v1alpha1.Interface {
|
||||||
return v1alpha1.New(g.SharedInformerFactory)
|
return v1alpha1.New(g.factory, g.namespace, g.tweakListOptions)
|
||||||
}
|
}
|
||||||
|
@ -38,19 +38,34 @@ type FooInformer interface {
|
|||||||
}
|
}
|
||||||
|
|
||||||
type fooInformer struct {
|
type fooInformer struct {
|
||||||
factory internalinterfaces.SharedInformerFactory
|
factory internalinterfaces.SharedInformerFactory
|
||||||
|
tweakListOptions internalinterfaces.TweakListOptionsFunc
|
||||||
|
namespace string
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewFooInformer constructs a new informer for Foo type.
|
// NewFooInformer constructs a new informer for Foo type.
|
||||||
// Always prefer using an informer factory to get a shared informer instead of getting an independent
|
// Always prefer using an informer factory to get a shared informer instead of getting an independent
|
||||||
// one. This reduces memory footprint and number of connections to the server.
|
// one. This reduces memory footprint and number of connections to the server.
|
||||||
func NewFooInformer(client versioned.Interface, namespace string, resyncPeriod time.Duration, indexers cache.Indexers) cache.SharedIndexInformer {
|
func NewFooInformer(client versioned.Interface, namespace string, resyncPeriod time.Duration, indexers cache.Indexers) cache.SharedIndexInformer {
|
||||||
|
return NewFilteredFooInformer(client, namespace, resyncPeriod, indexers, nil)
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewFilteredFooInformer constructs a new informer for Foo type.
|
||||||
|
// Always prefer using an informer factory to get a shared informer instead of getting an independent
|
||||||
|
// one. This reduces memory footprint and number of connections to the server.
|
||||||
|
func NewFilteredFooInformer(client versioned.Interface, namespace string, resyncPeriod time.Duration, indexers cache.Indexers, tweakListOptions internalinterfaces.TweakListOptionsFunc) cache.SharedIndexInformer {
|
||||||
return cache.NewSharedIndexInformer(
|
return cache.NewSharedIndexInformer(
|
||||||
&cache.ListWatch{
|
&cache.ListWatch{
|
||||||
ListFunc: func(options v1.ListOptions) (runtime.Object, error) {
|
ListFunc: func(options v1.ListOptions) (runtime.Object, error) {
|
||||||
|
if tweakListOptions != nil {
|
||||||
|
tweakListOptions(&options)
|
||||||
|
}
|
||||||
return client.SamplecontrollerV1alpha1().Foos(namespace).List(options)
|
return client.SamplecontrollerV1alpha1().Foos(namespace).List(options)
|
||||||
},
|
},
|
||||||
WatchFunc: func(options v1.ListOptions) (watch.Interface, error) {
|
WatchFunc: func(options v1.ListOptions) (watch.Interface, error) {
|
||||||
|
if tweakListOptions != nil {
|
||||||
|
tweakListOptions(&options)
|
||||||
|
}
|
||||||
return client.SamplecontrollerV1alpha1().Foos(namespace).Watch(options)
|
return client.SamplecontrollerV1alpha1().Foos(namespace).Watch(options)
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
@ -60,12 +75,12 @@ func NewFooInformer(client versioned.Interface, namespace string, resyncPeriod t
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
func defaultFooInformer(client versioned.Interface, resyncPeriod time.Duration) cache.SharedIndexInformer {
|
func (f *fooInformer) defaultInformer(client versioned.Interface, resyncPeriod time.Duration) cache.SharedIndexInformer {
|
||||||
return NewFooInformer(client, v1.NamespaceAll, resyncPeriod, cache.Indexers{cache.NamespaceIndex: cache.MetaNamespaceIndexFunc})
|
return NewFilteredFooInformer(client, f.namespace, resyncPeriod, cache.Indexers{cache.NamespaceIndex: cache.MetaNamespaceIndexFunc}, f.tweakListOptions)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (f *fooInformer) Informer() cache.SharedIndexInformer {
|
func (f *fooInformer) Informer() cache.SharedIndexInformer {
|
||||||
return f.factory.InformerFor(&samplecontroller_v1alpha1.Foo{}, defaultFooInformer)
|
return f.factory.InformerFor(&samplecontroller_v1alpha1.Foo{}, f.defaultInformer)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (f *fooInformer) Lister() v1alpha1.FooLister {
|
func (f *fooInformer) Lister() v1alpha1.FooLister {
|
||||||
|
@ -29,15 +29,17 @@ type Interface interface {
|
|||||||
}
|
}
|
||||||
|
|
||||||
type version struct {
|
type version struct {
|
||||||
internalinterfaces.SharedInformerFactory
|
factory internalinterfaces.SharedInformerFactory
|
||||||
|
namespace string
|
||||||
|
tweakListOptions internalinterfaces.TweakListOptionsFunc
|
||||||
}
|
}
|
||||||
|
|
||||||
// New returns a new Interface.
|
// New returns a new Interface.
|
||||||
func New(f internalinterfaces.SharedInformerFactory) Interface {
|
func New(f internalinterfaces.SharedInformerFactory, namespace string, tweakListOptions internalinterfaces.TweakListOptionsFunc) Interface {
|
||||||
return &version{f}
|
return &version{factory: f, namespace: namespace, tweakListOptions: tweakListOptions}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Foos returns a FooInformer.
|
// Foos returns a FooInformer.
|
||||||
func (v *version) Foos() FooInformer {
|
func (v *version) Foos() FooInformer {
|
||||||
return &fooInformer{factory: v.SharedInformerFactory}
|
return &fooInformer{factory: v.factory, namespace: v.namespace, tweakListOptions: v.tweakListOptions}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user