MCPcopy Index your code
hub / github.com/kubernetes/sample-controller / NewController

Function NewController

controller.go:92–156  ·  view source on GitHub ↗

NewController returns a new sample controller

(
	ctx context.Context,
	kubeclientset kubernetes.Interface,
	sampleclientset clientset.Interface,
	deploymentInformer appsinformers.DeploymentInformer,
	fooInformer informers.FooInformer)

Source from the content-addressed store, hash-verified

90
91// NewController returns a new sample controller
92func 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 }

Callers 2

newControllerMethod · 0.85
mainFunction · 0.85

Calls 4

enqueueFooMethod · 0.95
handleObjectMethod · 0.95
ListerMethod · 0.65
InformerMethod · 0.65

Tested by 1

newControllerMethod · 0.68

Used in the wild real call sites across dependent graphs

searching dependent graphs…