package relatedresource import ( "context" "github.com/rancher/wrangler/pkg/generic" "github.com/rancher/wrangler/pkg/kv" "k8s.io/apimachinery/pkg/runtime" "k8s.io/client-go/tools/cache" ) type Key struct { Namespace string Name string } func NewKey(namespace, name string) Key { return Key{ Namespace: namespace, Name: name, } } type ControllerWrapper interface { Informer() cache.SharedIndexInformer AddGenericHandler(ctx context.Context, name string, handler generic.Handler) } type Enqueuer interface { Enqueue(namespace, name string) } type Resolver func(namespace, name string, obj runtime.Object) ([]Key, error) func Watch(ctx context.Context, name string, resolve Resolver, enq Enqueuer, watching ...ControllerWrapper) { for _, c := range watching { watch(ctx, name, enq, resolve, c) } } func watch(ctx context.Context, name string, enq Enqueuer, resolve Resolver, controller ControllerWrapper) { controller.AddGenericHandler(ctx, name, func(key string, obj runtime.Object) (runtime.Object, error) { ns, name := kv.Split(key, "/") ro, ok := obj.(runtime.Object) if !ok { ro = nil } keys, err := resolve(ns, name, ro) if err != nil { return nil, err } for _, key := range keys { if key.Name != "" { enq.Enqueue(key.Namespace, key.Name) } } return nil, nil }) }