1
0
mirror of https://github.com/rancher/norman.git synced 2025-08-10 11:42:05 +00:00

Add name to handlers

This commit is contained in:
Darren Shepherd 2018-01-15 22:08:36 -07:00
parent 9ce12b1644
commit af105c2bc7
2 changed files with 47 additions and 17 deletions

View File

@ -23,17 +23,22 @@ type HandlerFunc func(key string) error
type GenericController interface { type GenericController interface {
Informer() cache.SharedIndexInformer Informer() cache.SharedIndexInformer
AddHandler(handler HandlerFunc) AddHandler(name string, handler HandlerFunc)
HandlerCount() int HandlerCount() int
Enqueue(namespace, name string) Enqueue(namespace, name string)
Sync(ctx context.Context) error Sync(ctx context.Context) error
Start(ctx context.Context, threadiness int) error Start(ctx context.Context, threadiness int) error
} }
type handlerDef struct {
name string
handler HandlerFunc
}
type genericController struct { type genericController struct {
sync.Mutex sync.Mutex
informer cache.SharedIndexInformer informer cache.SharedIndexInformer
handlers []HandlerFunc handlers []handlerDef
queue workqueue.RateLimitingInterface queue workqueue.RateLimitingInterface
name string name string
running bool running bool
@ -72,8 +77,11 @@ func (g *genericController) Enqueue(namespace, name string) {
} }
} }
func (g *genericController) AddHandler(handler HandlerFunc) { func (g *genericController) AddHandler(name string, handler HandlerFunc) {
g.handlers = append(g.handlers, handler) g.handlers = append(g.handlers, handlerDef{
name: name,
handler: handler,
})
} }
func (g *genericController) Sync(ctx context.Context) error { func (g *genericController) Sync(ctx context.Context) error {
@ -162,23 +170,45 @@ func (g *genericController) processNextWorkItem() bool {
// do your work on the key. This method will contains your "do stuff" logic // do your work on the key. This method will contains your "do stuff" logic
err := g.syncHandler(key.(string)) err := g.syncHandler(key.(string))
if _, ok := err.(*ForgetError); err == nil || ok { checkErr := err
if handlerErr, ok := checkErr.(*handlerError); ok {
checkErr = handlerErr.err
}
if _, ok := checkErr.(*ForgetError); err == nil || ok {
if ok {
logrus.Infof("%v %v completed with dropped err: %v", g.name, key, err)
}
g.queue.Forget(key) g.queue.Forget(key)
return true return true
} }
utilruntime.HandleError(fmt.Errorf("%v %v failed with : %v", g.name, key, err)) utilruntime.HandleError(fmt.Errorf("%v %v %v", g.name, key, err))
g.queue.AddRateLimited(key) g.queue.AddRateLimited(key)
return true return true
} }
func (g *genericController) syncHandler(s string) error { func (g *genericController) syncHandler(s string) (err error) {
defer utilruntime.RecoverFromPanic(&err)
var errs []error var errs []error
for _, handler := range g.handlers { for _, handler := range g.handlers {
if err := handler(s); err != nil { if err := handler.handler(s); err != nil {
errs = append(errs, err) errs = append(errs, &handlerError{
name: handler.name,
err: err,
})
} }
} }
return types.NewErrors(errs) err = types.NewErrors(errs)
return
}
type handlerError struct {
name string
err error
}
func (h *handlerError) Error() string {
return fmt.Sprintf("[%s] failed with : %v", h.name, h.err)
} }

View File

@ -51,7 +51,7 @@ type {{.schema.CodeName}}Lister interface {
type {{.schema.CodeName}}Controller interface { type {{.schema.CodeName}}Controller interface {
Informer() cache.SharedIndexInformer Informer() cache.SharedIndexInformer
Lister() {{.schema.CodeName}}Lister Lister() {{.schema.CodeName}}Lister
AddHandler(handler {{.schema.CodeName}}HandlerFunc) AddHandler(name string, handler {{.schema.CodeName}}HandlerFunc)
Enqueue(namespace, name string) Enqueue(namespace, name string)
Sync(ctx context.Context) error Sync(ctx context.Context) error
Start(ctx context.Context, threadiness int) error Start(ctx context.Context, threadiness int) error
@ -69,7 +69,7 @@ type {{.schema.CodeName}}Interface interface {
Watch(opts metav1.ListOptions) (watch.Interface, error) Watch(opts metav1.ListOptions) (watch.Interface, error)
DeleteCollection(deleteOpts *metav1.DeleteOptions, listOpts metav1.ListOptions) error DeleteCollection(deleteOpts *metav1.DeleteOptions, listOpts metav1.ListOptions) error
Controller() {{.schema.CodeName}}Controller Controller() {{.schema.CodeName}}Controller
AddSyncHandler(sync {{.schema.CodeName}}HandlerFunc) AddHandler(name string, sync {{.schema.CodeName}}HandlerFunc)
AddLifecycle(name string, lifecycle {{.schema.CodeName}}Lifecycle) AddLifecycle(name string, lifecycle {{.schema.CodeName}}Lifecycle)
} }
@ -115,8 +115,8 @@ func (c *{{.schema.ID}}Controller) Lister() {{.schema.CodeName}}Lister {
} }
func (c *{{.schema.ID}}Controller) AddHandler(handler {{.schema.CodeName}}HandlerFunc) { func (c *{{.schema.ID}}Controller) AddHandler(name string, handler {{.schema.CodeName}}HandlerFunc) {
c.GenericController.AddHandler(func(key string) error { c.GenericController.AddHandler(name, func(key string) error {
obj, exists, err := c.Informer().GetStore().GetByKey(key) obj, exists, err := c.Informer().GetStore().GetByKey(key)
if err != nil { if err != nil {
return err return err
@ -219,12 +219,12 @@ func (s *{{.schema.ID}}Client) DeleteCollection(deleteOpts *metav1.DeleteOptions
return s.objectClient.DeleteCollection(deleteOpts, listOpts) return s.objectClient.DeleteCollection(deleteOpts, listOpts)
} }
func (s *{{.schema.ID}}Client) AddSyncHandler(sync {{.schema.CodeName}}HandlerFunc) { func (s *{{.schema.ID}}Client) AddHandler(name string, sync {{.schema.CodeName}}HandlerFunc) {
s.Controller().AddHandler(sync) s.Controller().AddHandler(name, sync)
} }
func (s *{{.schema.ID}}Client) AddLifecycle(name string, lifecycle {{.schema.CodeName}}Lifecycle) { func (s *{{.schema.ID}}Client) AddLifecycle(name string, lifecycle {{.schema.CodeName}}Lifecycle) {
sync := New{{.schema.CodeName}}LifecycleAdapter(name, s, lifecycle) sync := New{{.schema.CodeName}}LifecycleAdapter(name, s, lifecycle)
s.AddSyncHandler(sync) s.AddHandler(name, sync)
} }
` `