45
vendor/sigs.k8s.io/controller-runtime/pkg/source/source.go
generated
vendored
45
vendor/sigs.k8s.io/controller-runtime/pkg/source/source.go
generated
vendored
@@ -17,6 +17,8 @@ limitations under the License.
|
||||
package source
|
||||
|
||||
import (
|
||||
"context"
|
||||
"errors"
|
||||
"fmt"
|
||||
"sync"
|
||||
|
||||
@@ -55,6 +57,33 @@ type Source interface {
|
||||
Start(handler.EventHandler, workqueue.RateLimitingInterface, ...predicate.Predicate) error
|
||||
}
|
||||
|
||||
// SyncingSource is a source that needs syncing prior to being usable. The controller
|
||||
// will call its WaitForSync prior to starting workers.
|
||||
type SyncingSource interface {
|
||||
Source
|
||||
WaitForSync(stop <-chan struct{}) error
|
||||
}
|
||||
|
||||
// NewKindWithCache creates a Source without InjectCache, so that it is assured that the given cache is used
|
||||
// and not overwritten. It can be used to watch objects in a different cluster by passing the cache
|
||||
// from that other cluster
|
||||
func NewKindWithCache(object runtime.Object, cache cache.Cache) SyncingSource {
|
||||
return &kindWithCache{kind: Kind{Type: object, cache: cache}}
|
||||
}
|
||||
|
||||
type kindWithCache struct {
|
||||
kind Kind
|
||||
}
|
||||
|
||||
func (ks *kindWithCache) Start(handler handler.EventHandler, queue workqueue.RateLimitingInterface,
|
||||
prct ...predicate.Predicate) error {
|
||||
return ks.kind.Start(handler, queue, prct...)
|
||||
}
|
||||
|
||||
func (ks *kindWithCache) WaitForSync(stop <-chan struct{}) error {
|
||||
return ks.kind.WaitForSync(stop)
|
||||
}
|
||||
|
||||
// Kind is used to provide a source of events originating inside the cluster from Watches (e.g. Pod Create)
|
||||
type Kind struct {
|
||||
// Type is the type of object to watch. e.g. &v1.Pod{}
|
||||
@@ -64,7 +93,7 @@ type Kind struct {
|
||||
cache cache.Cache
|
||||
}
|
||||
|
||||
var _ Source = &Kind{}
|
||||
var _ SyncingSource = &Kind{}
|
||||
|
||||
// Start is internal and should be called only by the Controller to register an EventHandler with the Informer
|
||||
// to enqueue reconcile.Requests.
|
||||
@@ -82,7 +111,7 @@ func (ks *Kind) Start(handler handler.EventHandler, queue workqueue.RateLimiting
|
||||
}
|
||||
|
||||
// Lookup the Informer from the Cache and add an EventHandler which populates the Queue
|
||||
i, err := ks.cache.GetInformer(ks.Type)
|
||||
i, err := ks.cache.GetInformer(context.TODO(), ks.Type)
|
||||
if err != nil {
|
||||
if kindMatchErr, ok := err.(*meta.NoKindMatchError); ok {
|
||||
log.Error(err, "if kind is a CRD, it should be installed before calling Start",
|
||||
@@ -101,6 +130,16 @@ func (ks *Kind) String() string {
|
||||
return fmt.Sprintf("kind source: unknown GVK")
|
||||
}
|
||||
|
||||
// WaitForSync implements SyncingSource to allow controllers to wait with starting
|
||||
// workers until the cache is synced.
|
||||
func (ks *Kind) WaitForSync(stop <-chan struct{}) error {
|
||||
if !ks.cache.WaitForCacheSync(stop) {
|
||||
// Would be great to return something more informative here
|
||||
return errors.New("cache did not sync")
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
var _ inject.Cache = &Kind{}
|
||||
|
||||
// InjectCache is internal should be called only by the Controller. InjectCache is used to inject
|
||||
@@ -266,6 +305,8 @@ func (is *Informer) String() string {
|
||||
return fmt.Sprintf("informer source: %p", is.Informer)
|
||||
}
|
||||
|
||||
var _ Source = Func(nil)
|
||||
|
||||
// Func is a function that implements Source
|
||||
type Func func(handler.EventHandler, workqueue.RateLimitingInterface, ...predicate.Predicate) error
|
||||
|
||||
|
||||
Reference in New Issue
Block a user