in pkg/controller/registration/registration_controller.go [187:300]
func registerDefaultController(r *ReconcileRegistration, config *config.ControllerConfig, crd *apiextensions.CustomResourceDefinition, gvk schema.GroupVersionKind) (k8s.SchemaReferenceUpdater, error) {
if _, ok := k8s.IgnoredKindList[crd.Spec.Names.Kind]; ok {
return nil, nil
}
cds := controller.Deps{
TfProvider: r.provider,
TfLoader: r.smLoader,
DclConfig: r.dclConfig,
DclConverter: r.dclConverter,
JitterGen: r.jitterGenerator,
Defaulters: r.defaulters,
}
var schemaUpdater k8s.SchemaReferenceUpdater
if kccfeatureflags.UseDirectReconciler(gvk.GroupKind()) {
groupKind := gvk.GroupKind()
model, err := registry.GetModel(groupKind)
if err != nil {
return nil, err
}
if err := directbase.AddController(r.mgr, gvk, model, directbase.Deps{JitterGenerator: r.jitterGenerator}); err != nil {
return nil, fmt.Errorf("error adding direct controller for %v to a manager: %w", crd.Spec.Names.Kind, err)
}
return schemaUpdater, nil
}
// Depending on which resource it is, we need to register a different controller.
switch gvk.Kind {
case "IAMPolicy":
if err := policy.Add(r.mgr, &cds); err != nil {
return nil, err
}
case "IAMPartialPolicy":
if err := partialpolicy.Add(r.mgr, &cds); err != nil {
return nil, err
}
case "IAMPolicyMember":
if err := policymember.Add(r.mgr, &cds); err != nil {
return nil, err
}
case "IAMAuditConfig":
if err := auditconfig.Add(r.mgr, &cds); err != nil {
return nil, err
}
default:
// register the controller to automatically create secrets for GSA keys
if isServiceAccountKeyCRD(crd) {
logger.Info("registering the GSA-Key-to-Secret generation controller")
if err := gsakeysecretgenerator.Add(r.mgr, crd, &controller.Deps{JitterGen: r.jitterGenerator}); err != nil {
return nil, fmt.Errorf("error adding the gsa-to-secret generator for %v to a manager: %w", crd.Spec.Names.Kind, err)
}
}
hasDirectController := registry.IsDirectByGK(gvk.GroupKind())
hasTerraformController := crd.Labels[crdgeneration.TF2CRDLabel] == "true"
hasDCLController := crd.Labels[k8s.DCL2CRDLabel] == "true"
var useDirectReconcilerPredicate predicate.Predicate
var useLegacyPredicate predicate.Predicate
// If we have a choice of controllers, construct predicates to choose between them
if hasDirectController && (hasTerraformController || hasDCLController) {
if reconcileGate := registry.GetReconcileGate(gvk.GroupKind()); reconcileGate != nil {
// If reconcile gate is enabled for this gvk, generate a controller-runtime predicate that will
// run the direct reconciler only when the reconcile gate returns true.
useDirectReconcilerPredicate = kccpredicate.NewReconcilePredicate(r.mgr.GetClient(), gvk, reconcileGate)
useLegacyPredicate = kccpredicate.NewInverseReconcilePredicate(r.mgr.GetClient(), gvk, reconcileGate)
} else {
logger.Error(fmt.Errorf("no predicate where we have multiple controllers"), "skipping direct controller registration", "group", gvk.Group, "version", gvk.Version, "kind", gvk.Kind)
hasDirectController = false
}
}
// register controllers for direct CRDs
if hasDirectController {
model, err := registry.GetModel(gvk.GroupKind())
if err != nil {
return nil, err
}
deps := directbase.Deps{
JitterGenerator: r.jitterGenerator,
ReconcilePredicate: useDirectReconcilerPredicate,
}
if err := directbase.AddController(r.mgr, gvk, model, deps); err != nil {
return nil, fmt.Errorf("error adding direct controller for %v to a manager: %w", crd.Spec.Names.Kind, err)
}
}
// register controllers for dcl-based CRDs
if hasDCLController {
su, err := dclcontroller.Add(r.mgr, crd, r.dclConverter, r.dclConfig, r.smLoader, r.defaulters, r.jitterGenerator, useLegacyPredicate)
if err != nil {
return nil, fmt.Errorf("error adding dcl controller for %v to a manager: %w", crd.Spec.Names.Kind, err)
}
return su, nil
}
// register controllers for tf-based CRDs
if hasTerraformController {
su, err := tf.Add(r.mgr, crd, r.provider, r.smLoader, r.defaulters, r.jitterGenerator, useLegacyPredicate)
if err != nil {
return nil, fmt.Errorf("error adding terraform controller for %v to a manager: %w", crd.Spec.Names.Kind, err)
}
return su, nil
}
if !hasDCLController && !hasTerraformController && !hasDirectController {
logger.Error(fmt.Errorf("unrecognized CRD: %v", crd.Spec.Names.Kind), "skipping controller registration", "group", gvk.Group, "version", gvk.Version, "kind", gvk.Kind)
return nil, nil
}
}
return schemaUpdater, nil
}