Controller Implementation and Design
Controller Implementation
cmd/controller
Pass the new controller implementation to the shared main
import (
// The set of controllers this controller process runs.
"knative.dev/sample-source/pkg/reconciler/sample"
// This defines the shared main for injected controllers.
"knative.dev/pkg/injection/sharedmain"
)
func main() {
sharedmain.Main("sample-source-controller", sample.NewController)
}
Define the NewController implementation, it will be passed a configmap.Watcher
, as well as a context which the injected listers will use for the reconciler struct arguments
func NewController(
ctx context.Context,
cmw configmap.Watcher,
) *controller.Impl {
// ...
deploymentInformer := deploymentinformer.Get(ctx)
sinkBindingInformer := sinkbindinginformer.Get(ctx)
sampleSourceInformer := samplesourceinformer.Get(ctx)
r := &Reconciler{
dr: &reconciler.DeploymentReconciler{KubeClientSet: kubeclient.Get(ctx)},
sbr: &reconciler.SinkBindingReconciler{EventingClientSet: eventingclient.Get(ctx)},
// Config accessor takes care of tracing/config/logging config propagation to the receive adapter
configAccessor: reconcilersource.WatchConfigurations(ctx, "sample-source", cmw),
}
The base reconciler is imported from the knative.dev/pkg dependency:
import (
// ...
reconcilersource "knative.dev/eventing/pkg/reconciler/source"
// ...
)
Ensure the correct informers have EventHandlers filtered to them
sampleSourceInformer.Informer().AddEventHandler(controller.HandleAll(impl.Enqueue))
Controller for the SampleSource
uses Deployment
and SinkBinding
resources to deploy and also bind the event source and the receive adapter. Also ensure the informers are set up correctly for these secondary resources
deploymentInformer.Informer().AddEventHandler(cache.FilteringResourceEventHandler{
FilterFunc: controller.FilterGroupKind(v1alpha1.Kind("SampleSource")),
Handler: controller.HandleAll(impl.EnqueueControllerOf),
})
sinkBindingInformer.Informer().AddEventHandler(cache.FilteringResourceEventHandler{
FilterFunc: controller.FilterGroupKind(v1alpha1.Kind("SampleSource")),
Handler: controller.HandleAll(impl.EnqueueControllerOf),
})