NewController returns a new sample controller
( ctx context.Context, kubeclientset kubernetes.Interface, sampleclientset clientset.Interface, deploymentInformer appsinformers.DeploymentInformer, fooInformer informers.FooInformer)
| 90 | |
| 91 | // NewController returns a new sample controller |
| 92 | func NewController( |
| 93 | ctx context.Context, |
| 94 | kubeclientset kubernetes.Interface, |
| 95 | sampleclientset clientset.Interface, |
| 96 | deploymentInformer appsinformers.DeploymentInformer, |
| 97 | fooInformer informers.FooInformer) *Controller { |
| 98 | logger := klog.FromContext(ctx) |
| 99 | |
| 100 | // Create event broadcaster |
| 101 | // Add sample-controller types to the default Kubernetes Scheme so Events can be |
| 102 | // logged for sample-controller types. |
| 103 | utilruntime.Must(samplescheme.AddToScheme(scheme.Scheme)) |
| 104 | logger.V(4).Info("Creating event broadcaster") |
| 105 | |
| 106 | eventBroadcaster := record.NewBroadcaster(record.WithContext(ctx)) |
| 107 | eventBroadcaster.StartStructuredLogging(0) |
| 108 | eventBroadcaster.StartRecordingToSink(&typedcorev1.EventSinkImpl{Interface: kubeclientset.CoreV1().Events("")}) |
| 109 | recorder := eventBroadcaster.NewRecorder(scheme.Scheme, corev1.EventSource{Component: controllerAgentName}) |
| 110 | ratelimiter := workqueue.NewTypedMaxOfRateLimiter( |
| 111 | workqueue.NewTypedItemExponentialFailureRateLimiter[cache.ObjectName](5*time.Millisecond, 1000*time.Second), |
| 112 | &workqueue.TypedBucketRateLimiter[cache.ObjectName]{Limiter: rate.NewLimiter(rate.Limit(50), 300)}, |
| 113 | ) |
| 114 | |
| 115 | controller := &Controller{ |
| 116 | kubeclientset: kubeclientset, |
| 117 | sampleclientset: sampleclientset, |
| 118 | deploymentsLister: deploymentInformer.Lister(), |
| 119 | deploymentsSynced: deploymentInformer.Informer().HasSynced, |
| 120 | foosLister: fooInformer.Lister(), |
| 121 | foosSynced: fooInformer.Informer().HasSynced, |
| 122 | workqueue: workqueue.NewTypedRateLimitingQueue(ratelimiter), |
| 123 | recorder: recorder, |
| 124 | } |
| 125 | |
| 126 | logger.Info("Setting up event handlers") |
| 127 | // Set up an event handler for when Foo resources change |
| 128 | fooInformer.Informer().AddEventHandler(cache.ResourceEventHandlerFuncs{ |
| 129 | AddFunc: controller.enqueueFoo, |
| 130 | UpdateFunc: func(old, new interface{}) { |
| 131 | controller.enqueueFoo(new) |
| 132 | }, |
| 133 | }) |
| 134 | // Set up an event handler for when Deployment resources change. This |
| 135 | // handler will lookup the owner of the given Deployment, and if it is |
| 136 | // owned by a Foo resource then the handler will enqueue that Foo resource for |
| 137 | // processing. This way, we don't need to implement custom logic for |
| 138 | // handling Deployment resources. More info on this pattern: |
| 139 | // https://github.com/kubernetes/community/blob/8cafef897a22026d42f5e5bb3f104febe7e29830/contributors/devel/controllers.md |
| 140 | deploymentInformer.Informer().AddEventHandler(cache.ResourceEventHandlerFuncs{ |
| 141 | AddFunc: controller.handleObject, |
| 142 | UpdateFunc: func(old, new interface{}) { |
| 143 | newDepl := new.(*appsv1.Deployment) |
| 144 | oldDepl := old.(*appsv1.Deployment) |
| 145 | if newDepl.ResourceVersion == oldDepl.ResourceVersion { |
| 146 | // Periodic resync will send update events for all known Deployments. |
| 147 | // Two different versions of the same Deployment will always have different RVs. |
| 148 | return |
| 149 | } |
searching dependent graphs…