Skip to content

Commit 6af154a

Browse files
authored
Allow registry to set predicates per reconciler (#2125)
1 parent e478e09 commit 6af154a

File tree

2 files changed

+54
-14
lines changed

2 files changed

+54
-14
lines changed

internal/controller/registry.go

Lines changed: 26 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ import (
2222
"github.com/mongodb/mongodb-atlas-kubernetes/v2/internal/controller/atlasproject"
2323
"github.com/mongodb/mongodb-atlas-kubernetes/v2/internal/controller/atlassearchindexconfig"
2424
"github.com/mongodb/mongodb-atlas-kubernetes/v2/internal/controller/atlasstream"
25+
"github.com/mongodb/mongodb-atlas-kubernetes/v2/internal/controller/watch"
2526
"github.com/mongodb/mongodb-atlas-kubernetes/v2/internal/featureflags"
2627
)
2728

@@ -35,7 +36,7 @@ type AkoReconciler interface {
3536
}
3637

3738
type Registry struct {
38-
predicates []predicate.Predicate
39+
sharedPredicates []predicate.Predicate
3940
deletionProtection bool
4041
independentSyncPeriod time.Duration
4142
featureFlags *featureflags.FeatureFlags
@@ -46,7 +47,7 @@ type Registry struct {
4647

4748
func NewRegistry(predicates []predicate.Predicate, deletionProtection bool, logger *zap.Logger, independentSyncPeriod time.Duration, featureFlags *featureflags.FeatureFlags) *Registry {
4849
return &Registry{
49-
predicates: predicates,
50+
sharedPredicates: predicates,
5051
deletionProtection: deletionProtection,
5152
logger: logger,
5253
independentSyncPeriod: independentSyncPeriod,
@@ -67,17 +68,28 @@ func (r *Registry) RegisterWithManager(mgr ctrl.Manager, skipNameValidation bool
6768

6869
func (r *Registry) registerControllers(c cluster.Cluster, ap atlas.Provider) {
6970
var reconcilers []AkoReconciler
70-
reconcilers = append(reconcilers, atlasproject.NewAtlasProjectReconciler(c, r.predicates, ap, r.deletionProtection, r.logger))
71-
reconcilers = append(reconcilers, atlasdeployment.NewAtlasDeploymentReconciler(c, r.predicates, ap, r.deletionProtection, r.independentSyncPeriod, r.logger))
72-
reconcilers = append(reconcilers, atlasdatabaseuser.NewAtlasDatabaseUserReconciler(c, r.predicates, ap, r.deletionProtection, r.independentSyncPeriod, r.featureFlags, r.logger))
73-
reconcilers = append(reconcilers, atlasdatafederation.NewAtlasDataFederationReconciler(c, r.predicates, ap, r.deletionProtection, r.logger))
74-
reconcilers = append(reconcilers, atlasfederatedauth.NewAtlasFederatedAuthReconciler(c, r.predicates, ap, r.deletionProtection, r.logger))
75-
reconcilers = append(reconcilers, atlasstream.NewAtlasStreamsInstanceReconciler(c, r.predicates, ap, r.deletionProtection, r.logger))
76-
reconcilers = append(reconcilers, atlasstream.NewAtlasStreamsConnectionReconciler(c, r.predicates, ap, r.deletionProtection, r.logger))
77-
reconcilers = append(reconcilers, atlassearchindexconfig.NewAtlasSearchIndexConfigReconciler(c, r.predicates, ap, r.deletionProtection, r.logger))
78-
reconcilers = append(reconcilers, atlasbackupcompliancepolicy.NewAtlasBackupCompliancePolicyReconciler(c, r.predicates, ap, r.deletionProtection, r.logger))
79-
reconcilers = append(reconcilers, atlascustomrole.NewAtlasCustomRoleReconciler(c, r.predicates, ap, r.deletionProtection, r.independentSyncPeriod, r.logger))
80-
reconcilers = append(reconcilers, atlasprivateendpoint.NewAtlasPrivateEndpointReconciler(c, r.predicates, ap, r.deletionProtection, r.independentSyncPeriod, r.logger))
81-
reconcilers = append(reconcilers, atlasipaccesslist.NewAtlasIPAccessListReconciler(c, r.predicates, ap, r.deletionProtection, r.independentSyncPeriod, r.logger))
71+
reconcilers = append(reconcilers, atlasproject.NewAtlasProjectReconciler(c, r.legacyPredicates(), ap, r.deletionProtection, r.logger))
72+
reconcilers = append(reconcilers, atlasdeployment.NewAtlasDeploymentReconciler(c, r.legacyPredicates(), ap, r.deletionProtection, r.independentSyncPeriod, r.logger))
73+
reconcilers = append(reconcilers, atlasdatabaseuser.NewAtlasDatabaseUserReconciler(c, r.legacyPredicates(), ap, r.deletionProtection, r.independentSyncPeriod, r.featureFlags, r.logger))
74+
reconcilers = append(reconcilers, atlasdatafederation.NewAtlasDataFederationReconciler(c, r.legacyPredicates(), ap, r.deletionProtection, r.logger))
75+
reconcilers = append(reconcilers, atlasfederatedauth.NewAtlasFederatedAuthReconciler(c, r.legacyPredicates(), ap, r.deletionProtection, r.logger))
76+
reconcilers = append(reconcilers, atlasstream.NewAtlasStreamsInstanceReconciler(c, r.legacyPredicates(), ap, r.deletionProtection, r.logger))
77+
reconcilers = append(reconcilers, atlasstream.NewAtlasStreamsConnectionReconciler(c, r.legacyPredicates(), ap, r.deletionProtection, r.logger))
78+
reconcilers = append(reconcilers, atlassearchindexconfig.NewAtlasSearchIndexConfigReconciler(c, r.legacyPredicates(), ap, r.deletionProtection, r.logger))
79+
reconcilers = append(reconcilers, atlasbackupcompliancepolicy.NewAtlasBackupCompliancePolicyReconciler(c, r.legacyPredicates(), ap, r.deletionProtection, r.logger))
80+
reconcilers = append(reconcilers, atlascustomrole.NewAtlasCustomRoleReconciler(c, r.legacyPredicates(), ap, r.deletionProtection, r.independentSyncPeriod, r.logger))
81+
reconcilers = append(reconcilers, atlasprivateendpoint.NewAtlasPrivateEndpointReconciler(c, r.defaultPredicates(), ap, r.deletionProtection, r.independentSyncPeriod, r.logger))
82+
reconcilers = append(reconcilers, atlasipaccesslist.NewAtlasIPAccessListReconciler(c, r.defaultPredicates(), ap, r.deletionProtection, r.independentSyncPeriod, r.logger))
8283
r.reconcilers = reconcilers
8384
}
85+
86+
// legacyPredicates are to be phased out in favor of defaultPredicates
87+
func (r *Registry) legacyPredicates() []predicate.Predicate {
88+
return append(r.sharedPredicates, watch.CommonPredicates())
89+
}
90+
91+
// defaultPredicates minimize the reconciliations controllers actually do, avoiding
92+
// spurious after delete handling and acting on finalizers setting or unsetting
93+
func (r *Registry) defaultPredicates() []predicate.Predicate {
94+
return append(r.sharedPredicates, watch.DefaultPredicates())
95+
}

internal/controller/watch/predicates.go

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import (
1010

1111
// CommonPredicates returns the predicate which filter out the changes done to any field except for spec (e.g. status)
1212
// Also we should reconcile if finalizers have changed (see https://blog.openshift.com/kubernetes-operators-best-practices/)
13+
// This will be phased out gradually to be replaced by DefaultPredicates
1314
func CommonPredicates() predicate.Funcs {
1415
return predicate.Funcs{
1516
UpdateFunc: func(e event.UpdateEvent) bool {
@@ -41,3 +42,30 @@ func SelectNamespacesPredicate(namespaces []string) predicate.Funcs {
4142
return false
4243
})
4344
}
45+
46+
// GlobalResyncAwareGenerationChangePredicate reconcile on unfrequent global
47+
// resyncs or on spec generation changes, but ignore finalizer changes
48+
func GlobalResyncAwareGenerationChangePredicate() predicate.Predicate {
49+
return predicate.Or[client.Object](
50+
predicate.Not[client.Object](predicate.ResourceVersionChangedPredicate{}), // for the global resync
51+
predicate.GenerationChangedPredicate{},
52+
)
53+
}
54+
55+
// IgnoreDeletedPredicate ignore after deletion handling, use unless some after
56+
// deletion cleanup is needed
57+
func IgnoreDeletedPredicate() predicate.Predicate {
58+
return predicate.Funcs{
59+
DeleteFunc: func(e event.DeleteEvent) bool {
60+
return false
61+
},
62+
}
63+
}
64+
65+
// DefaultPredicates avoid spurious after deletion or finalizer changes handling
66+
func DefaultPredicates() predicate.Predicate {
67+
return predicate.And(
68+
GlobalResyncAwareGenerationChangePredicate(),
69+
IgnoreDeletedPredicate(),
70+
)
71+
}

0 commit comments

Comments
 (0)