@@ -369,3 +369,128 @@ func (c *ServiceConfig) handleDeleteService(obj interface{}) {
369
369
c .eventHandlers [i ].OnServiceDelete (service )
370
370
}
371
371
}
372
+
373
+ // NodeHandler is an abstract interface of objects which receive
374
+ // notifications about node object changes.
375
+ type NodeHandler interface {
376
+ // OnNodeAdd is called whenever creation of new node object
377
+ // is observed.
378
+ OnNodeAdd (node * v1.Node )
379
+ // OnNodeUpdate is called whenever modification of an existing
380
+ // node object is observed.
381
+ OnNodeUpdate (oldNode , node * v1.Node )
382
+ // OnNodeDelete is called whever deletion of an existing node
383
+ // object is observed.
384
+ OnNodeDelete (node * v1.Node )
385
+ // OnNodeSynced is called once all the initial event handlers were
386
+ // called and the state is fully propagated to local cache.
387
+ OnNodeSynced ()
388
+ }
389
+
390
+ // NoopNodeHandler is a noop handler for proxiers that have not yet
391
+ // implemented a full NodeHandler.
392
+ type NoopNodeHandler struct {}
393
+
394
+ // OnNodeAdd is a noop handler for Node creates.
395
+ func (* NoopNodeHandler ) OnNodeAdd (node * v1.Node ) {}
396
+
397
+ // OnNodeUpdate is a noop handler for Node updates.
398
+ func (* NoopNodeHandler ) OnNodeUpdate (oldNode , node * v1.Node ) {}
399
+
400
+ // OnNodeDelete is a noop handler for Node deletes.
401
+ func (* NoopNodeHandler ) OnNodeDelete (node * v1.Node ) {}
402
+
403
+ // OnNodeSynced is a noop handler for Node syncs.
404
+ func (* NoopNodeHandler ) OnNodeSynced () {}
405
+
406
+ // NodeConfig tracks a set of node configurations.
407
+ // It accepts "set", "add" and "remove" operations of node via channels, and invokes registered handlers on change.
408
+ type NodeConfig struct {
409
+ listerSynced cache.InformerSynced
410
+ eventHandlers []NodeHandler
411
+ }
412
+
413
+ // NewNodeConfig creates a new NodeConfig.
414
+ func NewNodeConfig (nodeInformer coreinformers.NodeInformer , resyncPeriod time.Duration ) * NodeConfig {
415
+ result := & NodeConfig {
416
+ listerSynced : nodeInformer .Informer ().HasSynced ,
417
+ }
418
+
419
+ nodeInformer .Informer ().AddEventHandlerWithResyncPeriod (
420
+ cache.ResourceEventHandlerFuncs {
421
+ AddFunc : result .handleAddNode ,
422
+ UpdateFunc : result .handleUpdateNode ,
423
+ DeleteFunc : result .handleDeleteNode ,
424
+ },
425
+ resyncPeriod ,
426
+ )
427
+
428
+ return result
429
+ }
430
+
431
+ // RegisterEventHandler registers a handler which is called on every node change.
432
+ func (c * NodeConfig ) RegisterEventHandler (handler NodeHandler ) {
433
+ c .eventHandlers = append (c .eventHandlers , handler )
434
+ }
435
+
436
+ // Run starts the goroutine responsible for calling registered handlers.
437
+ func (c * NodeConfig ) Run (stopCh <- chan struct {}) {
438
+ klog .Info ("Starting node config controller" )
439
+
440
+ if ! cache .WaitForNamedCacheSync ("node config" , stopCh , c .listerSynced ) {
441
+ return
442
+ }
443
+
444
+ for i := range c .eventHandlers {
445
+ klog .V (3 ).Infof ("Calling handler.OnNodeSynced()" )
446
+ c .eventHandlers [i ].OnNodeSynced ()
447
+ }
448
+ }
449
+
450
+ func (c * NodeConfig ) handleAddNode (obj interface {}) {
451
+ node , ok := obj .(* v1.Node )
452
+ if ! ok {
453
+ utilruntime .HandleError (fmt .Errorf ("unexpected object type: %v" , obj ))
454
+ return
455
+ }
456
+ for i := range c .eventHandlers {
457
+ klog .V (4 ).Infof ("Calling handler.OnNodeAdd" )
458
+ c .eventHandlers [i ].OnNodeAdd (node )
459
+ }
460
+ }
461
+
462
+ func (c * NodeConfig ) handleUpdateNode (oldObj , newObj interface {}) {
463
+ oldNode , ok := oldObj .(* v1.Node )
464
+ if ! ok {
465
+ utilruntime .HandleError (fmt .Errorf ("unexpected object type: %v" , oldObj ))
466
+ return
467
+ }
468
+ node , ok := newObj .(* v1.Node )
469
+ if ! ok {
470
+ utilruntime .HandleError (fmt .Errorf ("unexpected object type: %v" , newObj ))
471
+ return
472
+ }
473
+ for i := range c .eventHandlers {
474
+ klog .V (5 ).Infof ("Calling handler.OnNodeUpdate" )
475
+ c .eventHandlers [i ].OnNodeUpdate (oldNode , node )
476
+ }
477
+ }
478
+
479
+ func (c * NodeConfig ) handleDeleteNode (obj interface {}) {
480
+ node , ok := obj .(* v1.Node )
481
+ if ! ok {
482
+ tombstone , ok := obj .(cache.DeletedFinalStateUnknown )
483
+ if ! ok {
484
+ utilruntime .HandleError (fmt .Errorf ("unexpected object type: %v" , obj ))
485
+ return
486
+ }
487
+ if node , ok = tombstone .Obj .(* v1.Node ); ! ok {
488
+ utilruntime .HandleError (fmt .Errorf ("unexpected object type: %v" , obj ))
489
+ return
490
+ }
491
+ }
492
+ for i := range c .eventHandlers {
493
+ klog .V (4 ).Infof ("Calling handler.OnNodeDelete" )
494
+ c .eventHandlers [i ].OnNodeDelete (node )
495
+ }
496
+ }
0 commit comments