mirror of https://github.com/rancher/wrangler.git
64 lines
1.3 KiB
Go
64 lines
1.3 KiB
Go
package trigger
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"sync/atomic"
|
|
|
|
"github.com/rancher/wrangler/v3/pkg/generic"
|
|
"github.com/rancher/wrangler/v3/pkg/relatedresource"
|
|
"k8s.io/apimachinery/pkg/runtime"
|
|
"k8s.io/apimachinery/pkg/runtime/schema"
|
|
)
|
|
|
|
var (
|
|
counter int64
|
|
)
|
|
|
|
type AllHandler func() error
|
|
|
|
type Controller interface {
|
|
AddGenericHandler(ctx context.Context, name string, handler generic.Handler)
|
|
GroupVersionKind() schema.GroupVersionKind
|
|
Enqueue(namespace, name string)
|
|
}
|
|
|
|
type Trigger interface {
|
|
Trigger()
|
|
OnTrigger(ctx context.Context, name string, handler AllHandler)
|
|
Key() relatedresource.Key
|
|
}
|
|
|
|
type trigger struct {
|
|
key string
|
|
controller Controller
|
|
}
|
|
|
|
func New(controller Controller) Trigger {
|
|
return &trigger{
|
|
key: fmt.Sprintf("__trigger__%d__", atomic.AddInt64(&counter, 1)),
|
|
controller: controller,
|
|
}
|
|
}
|
|
|
|
func (e *trigger) Key() relatedresource.Key {
|
|
return relatedresource.Key{
|
|
Namespace: "__trigger__",
|
|
Name: e.key,
|
|
}
|
|
}
|
|
|
|
func (e *trigger) Trigger() {
|
|
e.controller.Enqueue("__trigger__", e.key)
|
|
}
|
|
|
|
func (e *trigger) OnTrigger(ctx context.Context, name string, handler AllHandler) {
|
|
e.controller.AddGenericHandler(ctx, name, func(queueKey string, _ runtime.Object) (runtime.Object, error) {
|
|
if queueKey == "__trigger__/"+e.key {
|
|
return nil, handler()
|
|
}
|
|
return nil, nil
|
|
})
|
|
e.Trigger()
|
|
}
|