Skip to content

Commit f73d542

Browse files
committed
Change Reconciler implementations to ObjectReconciler
Each implementation was doing the first fetch of its main object a bit differently. The controller-runtime module can do this since v0.17.0 and Go generics.
1 parent f2252fb commit f73d542

File tree

7 files changed

+60
-121
lines changed

7 files changed

+60
-121
lines changed

internal/bridge/crunchybridgecluster/crunchybridgecluster_controller.go

Lines changed: 21 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import (
2121
"sigs.k8s.io/controller-runtime/pkg/controller/controllerutil"
2222
"sigs.k8s.io/controller-runtime/pkg/event"
2323
"sigs.k8s.io/controller-runtime/pkg/handler"
24+
"sigs.k8s.io/controller-runtime/pkg/reconcile"
2425

2526
"github.com/crunchydata/postgres-operator/internal/bridge"
2627
"github.com/crunchydata/postgres-operator/internal/controller/runtime"
@@ -50,8 +51,8 @@ type CrunchyBridgeClusterReconciler struct {
5051
}
5152
}
5253

53-
//+kubebuilder:rbac:groups="postgres-operator.crunchydata.com",resources="crunchybridgeclusters",verbs={list,watch}
54-
//+kubebuilder:rbac:groups="",resources="secrets",verbs={list,watch}
54+
//+kubebuilder:rbac:groups="postgres-operator.crunchydata.com",resources="crunchybridgeclusters",verbs={get,list,watch}
55+
//+kubebuilder:rbac:groups="",resources="secrets",verbs={get,list,watch}
5556

5657
// ManagedReconciler creates a [CrunchyBridgeClusterReconciler] and adds it to m.
5758
func ManagedReconciler(m ctrl.Manager, newClient func() bridge.ClientInterface) error {
@@ -72,7 +73,7 @@ func ManagedReconciler(m ctrl.Manager, newClient func() bridge.ClientInterface)
7273
// Smarter: retry after a certain time for each cluster
7374
WatchesRawSource(
7475
runtime.NewTickerImmediate(5*time.Minute, event.GenericEvent{},
75-
handler.EnqueueRequestsFromMapFunc(func(ctx context.Context, _ client.Object) []ctrl.Request {
76+
handler.EnqueueRequestsFromMapFunc(func(ctx context.Context, _ client.Object) []reconcile.Request {
7677
var list v1beta1.CrunchyBridgeClusterList
7778
_ = reconciler.Reader.List(ctx, &list)
7879
return runtime.Requests(initialize.Pointers(list.Items...)...)
@@ -82,11 +83,11 @@ func ManagedReconciler(m ctrl.Manager, newClient func() bridge.ClientInterface)
8283
// Watch secrets and filter for secrets mentioned by CrunchyBridgeClusters
8384
Watches(
8485
&corev1.Secret{},
85-
handler.EnqueueRequestsFromMapFunc(func(ctx context.Context, secret client.Object) []ctrl.Request {
86+
handler.EnqueueRequestsFromMapFunc(func(ctx context.Context, secret client.Object) []reconcile.Request {
8687
return runtime.Requests(reconciler.findCrunchyBridgeClustersForSecret(ctx, client.ObjectKeyFromObject(secret))...)
8788
}),
8889
).
89-
Complete(reconciler)
90+
Complete(reconcile.AsReconciler(kubernetes, reconciler))
9091
}
9192

9293
// The owner reference created by controllerutil.SetControllerReference blocks
@@ -105,47 +106,32 @@ func (r *CrunchyBridgeClusterReconciler) setControllerReference(
105106
return controllerutil.SetControllerReference(owner, controlled, runtime.Scheme)
106107
}
107108

108-
//+kubebuilder:rbac:groups="postgres-operator.crunchydata.com",resources="crunchybridgeclusters",verbs={get,patch,update}
109+
//+kubebuilder:rbac:groups="postgres-operator.crunchydata.com",resources="crunchybridgeclusters",verbs={patch,update}
109110
//+kubebuilder:rbac:groups="postgres-operator.crunchydata.com",resources="crunchybridgeclusters/status",verbs={patch,update}
110111
//+kubebuilder:rbac:groups="postgres-operator.crunchydata.com",resources="crunchybridgeclusters/finalizers",verbs={patch,update}
111112
//+kubebuilder:rbac:groups="",resources="secrets",verbs={get}
112113

113114
// Reconcile does the work to move the current state of the world toward the
114-
// desired state described in a [v1beta1.CrunchyBridgeCluster] identified by req.
115-
func (r *CrunchyBridgeClusterReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error) {
115+
// desired state described in crunchybridgecluster.
116+
func (r *CrunchyBridgeClusterReconciler) Reconcile(ctx context.Context, crunchybridgecluster *v1beta1.CrunchyBridgeCluster) (ctrl.Result, error) {
117+
var err error
116118
ctx, span := tracing.Start(ctx, "reconcile-crunchybridgecluster")
117119
log := logging.FromContext(ctx)
118120
defer span.End()
119121

120-
// Retrieve the crunchybridgecluster from the client cache, if it exists. A deferred
121-
// function below will send any changes to its Status field.
122-
//
123-
// NOTE: No DeepCopy is necessary here because controller-runtime makes a
124-
// copy before returning from its cache.
125-
// - https://github.com/kubernetes-sigs/controller-runtime/issues/1235
126-
crunchybridgecluster := &v1beta1.CrunchyBridgeCluster{}
127-
err := r.Reader.Get(ctx, req.NamespacedName, crunchybridgecluster)
122+
// Write any changes to the crunchybridgecluster status on the way out.
123+
before := crunchybridgecluster.DeepCopy()
124+
defer func() {
125+
if !equality.Semantic.DeepEqual(before.Status, crunchybridgecluster.Status) {
126+
status := r.StatusWriter.Patch(ctx, crunchybridgecluster, client.MergeFrom(before))
128127

129-
if err == nil {
130-
// Write any changes to the crunchybridgecluster status on the way out.
131-
before := crunchybridgecluster.DeepCopy()
132-
defer func() {
133-
if !equality.Semantic.DeepEqual(before.Status, crunchybridgecluster.Status) {
134-
status := r.StatusWriter.Patch(ctx, crunchybridgecluster, client.MergeFrom(before))
135-
136-
if err == nil && status != nil {
137-
err = status
138-
} else if status != nil {
139-
log.Error(status, "Patching CrunchyBridgeCluster status")
140-
}
128+
if err == nil && status != nil {
129+
err = status
130+
} else if status != nil {
131+
log.Error(status, "Patching CrunchyBridgeCluster status")
141132
}
142-
}()
143-
} else {
144-
// NotFound cannot be fixed by requeuing so ignore it. During background
145-
// deletion, we receive delete events from crunchybridgecluster's dependents after
146-
// crunchybridgecluster is deleted.
147-
return ctrl.Result{}, tracing.Escape(span, client.IgnoreNotFound(err))
148-
}
133+
}
134+
}()
149135

150136
// Get and validate connection secret for requests
151137
key, team, err := r.reconcileBridgeConnectionSecret(ctx, crunchybridgecluster)

internal/controller/pgupgrade/pgupgrade_controller.go

Lines changed: 20 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import (
1717
ctrl "sigs.k8s.io/controller-runtime"
1818
"sigs.k8s.io/controller-runtime/pkg/client"
1919
"sigs.k8s.io/controller-runtime/pkg/handler"
20+
"sigs.k8s.io/controller-runtime/pkg/reconcile"
2021

2122
"github.com/crunchydata/postgres-operator/internal/config"
2223
"github.com/crunchydata/postgres-operator/internal/controller/runtime"
@@ -49,9 +50,9 @@ type PGUpgradeReconciler struct {
4950
}
5051
}
5152

52-
//+kubebuilder:rbac:groups="batch",resources="jobs",verbs={list,watch}
53-
//+kubebuilder:rbac:groups="postgres-operator.crunchydata.com",resources="pgupgrades",verbs={list,watch}
54-
//+kubebuilder:rbac:groups="postgres-operator.crunchydata.com",resources="postgresclusters",verbs={list,watch}
53+
//+kubebuilder:rbac:groups="batch",resources="jobs",verbs={get,list,watch}
54+
//+kubebuilder:rbac:groups="postgres-operator.crunchydata.com",resources="pgupgrades",verbs={get,list,watch}
55+
//+kubebuilder:rbac:groups="postgres-operator.crunchydata.com",resources="postgresclusters",verbs={get,list,watch}
5556

5657
// ManagedReconciler creates a [PGUpgradeReconciler] and adds it to m.
5758
func ManagedReconciler(m ctrl.Manager, r registration.Registration) error {
@@ -71,11 +72,11 @@ func ManagedReconciler(m ctrl.Manager, r registration.Registration) error {
7172
Owns(&batchv1.Job{}).
7273
Watches(
7374
v1beta1.NewPostgresCluster(),
74-
handler.EnqueueRequestsFromMapFunc(func(ctx context.Context, cluster client.Object) []ctrl.Request {
75+
handler.EnqueueRequestsFromMapFunc(func(ctx context.Context, cluster client.Object) []reconcile.Request {
7576
return runtime.Requests(reconciler.findUpgradesForPostgresCluster(ctx, client.ObjectKeyFromObject(cluster))...)
7677
}),
7778
).
78-
Complete(reconciler)
79+
Complete(reconcile.AsReconciler(kubernetes, reconciler))
7980
}
8081

8182
//+kubebuilder:rbac:groups="postgres-operator.crunchydata.com",resources="pgupgrades",verbs={list}
@@ -103,7 +104,6 @@ func (r *PGUpgradeReconciler) findUpgradesForPostgresCluster(
103104
return matching
104105
}
105106

106-
//+kubebuilder:rbac:groups="postgres-operator.crunchydata.com",resources="pgupgrades",verbs={get}
107107
//+kubebuilder:rbac:groups="postgres-operator.crunchydata.com",resources="pgupgrades/status",verbs={patch}
108108
//+kubebuilder:rbac:groups="batch",resources="jobs",verbs={delete}
109109
//+kubebuilder:rbac:groups="postgres-operator.crunchydata.com",resources="postgresclusters",verbs={get}
@@ -114,42 +114,26 @@ func (r *PGUpgradeReconciler) findUpgradesForPostgresCluster(
114114
//+kubebuilder:rbac:groups="",resources="endpoints",verbs={delete}
115115

116116
// Reconcile does the work to move the current state of the world toward the
117-
// desired state described in a [v1beta1.PGUpgrade] identified by req.
118-
func (r *PGUpgradeReconciler) Reconcile(ctx context.Context, req ctrl.Request) (result ctrl.Result, err error) {
117+
// desired state described in upgrade.
118+
func (r *PGUpgradeReconciler) Reconcile(ctx context.Context, upgrade *v1beta1.PGUpgrade) (result ctrl.Result, err error) {
119119
ctx, span := tracing.Start(ctx, "reconcile-pgupgrade")
120120
log := logging.FromContext(ctx)
121121
defer span.End()
122122
defer func(s tracing.Span) { _ = tracing.Escape(s, err) }(span)
123123

124-
// Retrieve the upgrade from the client cache, if it exists. A deferred
125-
// function below will send any changes to its Status field.
126-
//
127-
// NOTE: No DeepCopy is necessary here because controller-runtime makes a
128-
// copy before returning from its cache.
129-
// - https://github.com/kubernetes-sigs/controller-runtime/issues/1235
130-
upgrade := &v1beta1.PGUpgrade{}
131-
err = r.Reader.Get(ctx, req.NamespacedName, upgrade)
132-
133-
if err == nil {
134-
// Write any changes to the upgrade status on the way out.
135-
before := upgrade.DeepCopy()
136-
defer func() {
137-
if !equality.Semantic.DeepEqual(before.Status, upgrade.Status) {
138-
status := r.StatusWriter.Patch(ctx, upgrade, client.MergeFrom(before))
139-
140-
if err == nil && status != nil {
141-
err = status
142-
} else if status != nil {
143-
log.Error(status, "Patching PGUpgrade status")
144-
}
124+
// Write any changes to the upgrade status on the way out.
125+
before := upgrade.DeepCopy()
126+
defer func() {
127+
if !equality.Semantic.DeepEqual(before.Status, upgrade.Status) {
128+
status := r.StatusWriter.Patch(ctx, upgrade, client.MergeFrom(before))
129+
130+
if err == nil && status != nil {
131+
err = status
132+
} else if status != nil {
133+
log.Error(status, "Patching PGUpgrade status")
145134
}
146-
}()
147-
} else {
148-
// NotFound cannot be fixed by requeuing so ignore it. During background
149-
// deletion, we receive delete events from upgrade's dependents after
150-
// upgrade is deleted.
151-
return ctrl.Result{}, client.IgnoreNotFound(err)
152-
}
135+
}
136+
}()
153137

154138
// Validate the remainder of the upgrade specification. These can likely
155139
// move to CEL rules or a webhook when supported.

internal/controller/postgrescluster/cluster_test.go

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@ import (
1818
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
1919
"k8s.io/client-go/tools/record"
2020
"sigs.k8s.io/controller-runtime/pkg/client"
21-
"sigs.k8s.io/controller-runtime/pkg/reconcile"
2221

2322
"github.com/crunchydata/postgres-operator/internal/controller/runtime"
2423
"github.com/crunchydata/postgres-operator/internal/feature"
@@ -100,9 +99,7 @@ func TestCustomLabels(t *testing.T) {
10099
})
101100

102101
// Reconcile the cluster
103-
result, err := reconciler.Reconcile(ctx, reconcile.Request{
104-
NamespacedName: client.ObjectKeyFromObject(cluster),
105-
})
102+
result, err := reconciler.Reconcile(ctx, cluster)
106103
assert.NilError(t, err)
107104
assert.Assert(t, result.Requeue == false)
108105
}
@@ -339,9 +336,7 @@ func TestCustomAnnotations(t *testing.T) {
339336
})
340337

341338
// Reconcile the cluster
342-
result, err := reconciler.Reconcile(ctx, reconcile.Request{
343-
NamespacedName: client.ObjectKeyFromObject(cluster),
344-
})
339+
result, err := reconciler.Reconcile(ctx, cluster)
345340
assert.NilError(t, err)
346341
assert.Assert(t, result.Requeue == false)
347342
}

internal/controller/postgrescluster/controller.go

Lines changed: 3 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -69,29 +69,15 @@ type Reconciler struct {
6969
}
7070

7171
// +kubebuilder:rbac:groups="",resources="events",verbs={create,patch}
72-
// +kubebuilder:rbac:groups="postgres-operator.crunchydata.com",resources="postgresclusters",verbs={get,list,watch}
7372
// +kubebuilder:rbac:groups="postgres-operator.crunchydata.com",resources="postgresclusters/status",verbs={patch}
7473

75-
// Reconcile reconciles a ConfigMap in a namespace managed by the PostgreSQL Operator
7674
func (r *Reconciler) Reconcile(
77-
ctx context.Context, request reconcile.Request) (reconcile.Result, error,
75+
ctx context.Context, cluster *v1beta1.PostgresCluster) (reconcile.Result, error,
7876
) {
7977
ctx, span := tracing.Start(ctx, "reconcile-postgrescluster")
8078
log := logging.FromContext(ctx)
8179
defer span.End()
8280

83-
// get the postgrescluster from the cache
84-
cluster := &v1beta1.PostgresCluster{}
85-
if err := r.Reader.Get(ctx, request.NamespacedName, cluster); err != nil {
86-
// NotFound cannot be fixed by requeuing so ignore it. During background
87-
// deletion, we receive delete events from cluster's dependents after
88-
// cluster is deleted.
89-
if err = client.IgnoreNotFound(err); err != nil {
90-
log.Error(err, "unable to fetch PostgresCluster")
91-
}
92-
return runtime.ErrorWithBackoff(tracing.Escape(span, err))
93-
}
94-
9581
// Set any defaults that may not have been stored in the API. No DeepCopy
9682
// is necessary because controller-runtime makes a copy before returning
9783
// from its cache.
@@ -455,6 +441,7 @@ func (r *Reconciler) setOwnerReference(
455441
// +kubebuilder:rbac:groups="rbac.authorization.k8s.io",resources="rolebindings",verbs={get,list,watch}
456442
// +kubebuilder:rbac:groups="batch",resources="cronjobs",verbs={get,list,watch}
457443
// +kubebuilder:rbac:groups="policy",resources="poddisruptionbudgets",verbs={get,list,watch}
444+
// +kubebuilder:rbac:groups="postgres-operator.crunchydata.com",resources="postgresclusters",verbs={get,list,watch}
458445

459446
// ManagedReconciler creates a [Reconciler] and adds it to m.
460447
func ManagedReconciler(m manager.Manager, r registration.Registration) error {
@@ -489,5 +476,5 @@ func ManagedReconciler(m manager.Manager, r registration.Registration) error {
489476
Watches(&corev1.Pod{}, reconciler.watchPods()).
490477
Watches(&appsv1.StatefulSet{},
491478
reconciler.controllerRefHandlerFuncs()). // watch all StatefulSets
492-
Complete(reconciler))
479+
Complete(reconcile.AsReconciler(kubernetes, reconciler)))
493480
}

internal/controller/postgrescluster/controller_test.go

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -166,9 +166,7 @@ var _ = Describe("PostgresCluster Reconciler", func() {
166166
reconcile := func(cluster *v1beta1.PostgresCluster) reconcile.Result {
167167
ctx := context.Background()
168168

169-
result, err := test.Reconciler.Reconcile(ctx,
170-
reconcile.Request{NamespacedName: client.ObjectKeyFromObject(cluster)},
171-
)
169+
result, err := test.Reconciler.Reconcile(ctx, cluster)
172170
Expect(err).ToNot(HaveOccurred(), func() string {
173171
var t interface{ StackTrace() errors.StackTrace }
174172
if errors.As(err, &t) {

internal/controller/postgrescluster/instance_test.go

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,6 @@ import (
2929
"k8s.io/apimachinery/pkg/util/wait"
3030
"k8s.io/client-go/tools/record"
3131
"sigs.k8s.io/controller-runtime/pkg/client"
32-
"sigs.k8s.io/controller-runtime/pkg/reconcile"
3332

3433
"github.com/crunchydata/postgres-operator/internal/collector"
3534
"github.com/crunchydata/postgres-operator/internal/controller/runtime"
@@ -1233,9 +1232,7 @@ func TestDeleteInstance(t *testing.T) {
12331232

12341233
// Reconcile the entire cluster so that we don't have to create all the
12351234
// resources needed to reconcile a single instance (cm,secrets,svc, etc.)
1236-
result, err := reconciler.Reconcile(ctx, reconcile.Request{
1237-
NamespacedName: client.ObjectKeyFromObject(cluster),
1238-
})
1235+
result, err := reconciler.Reconcile(ctx, cluster)
12391236
assert.NilError(t, err)
12401237
assert.Assert(t, result.Requeue == false)
12411238

0 commit comments

Comments
 (0)