Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 64a2e07

Browse files
committed
Separate PGUpgradeReconciler client concerns
We want to be mindful of our interactions with the Kubernetes API, and these interfaces will help keep functions focused. These interfaces are also narrower than client.Reader and client.Writer and may help us keep RBAC markers accurate. A new constructor populates these fields with a single client.Client. The client.WithFieldOwner constructor allows us to drop our Owner field and patch method.
1 parent b3ac5d3 commit 64a2e07

File tree

5 files changed

+45
-46
lines changed

5 files changed

+45
-46
lines changed

‎cmd/postgres-operator/main.go

Lines changed: 1 addition & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -257,6 +257,7 @@ func main() {
257257

258258
// add all PostgreSQL Operator controllers to the runtime manager
259259
addControllersToManager(manager, log, registrar)
260+
must(pgupgrade.ManagedReconciler(manager, registrar))
260261
must(standalone_pgadmin.ManagedReconciler(manager))
261262
must(crunchybridgecluster.ManagedReconciler(manager, func() bridge.ClientInterface {
262263
return bridgeClient()
@@ -320,16 +321,4 @@ func addControllersToManager(mgr runtime.Manager, log logging.Logger, reg regist
320321
log.Error(err, "unable to create PostgresCluster controller")
321322
os.Exit(1)
322323
}
323-
324-
upgradeReconciler := &pgupgrade.PGUpgradeReconciler{
325-
Client: mgr.GetClient(),
326-
Owner: naming.ControllerPGUpgrade,
327-
Recorder: mgr.GetEventRecorderFor(naming.ControllerPGUpgrade),
328-
Registration: reg,
329-
}
330-
331-
if err := upgradeReconciler.SetupWithManager(mgr); err != nil {
332-
log.Error(err, "unable to create PGUpgrade controller")
333-
os.Exit(1)
334-
}
335324
}

‎internal/controller/pgupgrade/apply.go

Lines changed: 3 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -11,21 +11,9 @@ import (
1111
"sigs.k8s.io/controller-runtime/pkg/client"
1212
)
1313

14-
// patch sends patch to object's endpoint in the Kubernetes API and updates
15-
// object with any returned content. The fieldManager is set to r.Owner, but
16-
// can be overridden in options.
17-
// - https://docs.k8s.io/reference/using-api/server-side-apply/#managers
18-
func (r *PGUpgradeReconciler) patch(
19-
ctx context.Context, object client.Object,
20-
patch client.Patch, options ...client.PatchOption,
21-
) error {
22-
options = append([]client.PatchOption{r.Owner}, options...)
23-
return r.Client.Patch(ctx, object, patch, options...)
24-
}
25-
2614
// apply sends an apply patch to object's endpoint in the Kubernetes API and
27-
// updates object with any returned content. The fieldManager is set to
28-
// r.Owner and the force parameter is true.
15+
// updates object with any returned content. The fieldManager is set by
16+
// r.Writer and the force parameter is true.
2917
// - https://docs.k8s.io/reference/using-api/server-side-apply/#managers
3018
// - https://docs.k8s.io/reference/using-api/server-side-apply/#conflicts
3119
func (r *PGUpgradeReconciler) apply(ctx context.Context, object client.Object) error {
@@ -36,7 +24,7 @@ func (r *PGUpgradeReconciler) apply(ctx context.Context, object client.Object) e
3624

3725
// Send the apply-patch with force=true.
3826
if err == nil {
39-
err = r.patch(ctx, object, apply, client.ForceOwnership)
27+
err = r.Writer.Patch(ctx, object, apply, client.ForceOwnership)
4028
}
4129

4230
return err

‎internal/controller/pgupgrade/pgupgrade_controller.go

Lines changed: 35 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import (
2121
"github.com/crunchydata/postgres-operator/internal/config"
2222
"github.com/crunchydata/postgres-operator/internal/controller/runtime"
2323
"github.com/crunchydata/postgres-operator/internal/logging"
24+
"github.com/crunchydata/postgres-operator/internal/naming"
2425
"github.com/crunchydata/postgres-operator/internal/registration"
2526
"github.com/crunchydata/postgres-operator/internal/tracing"
2627
"github.com/crunchydata/postgres-operator/pkg/apis/postgres-operator.crunchydata.com/v1beta1"
@@ -32,29 +33,49 @@ const (
3233

3334
// PGUpgradeReconciler reconciles a PGUpgrade object
3435
type PGUpgradeReconciler struct {
35-
Client client.Client
36-
Owner client.FieldOwner
37-
3836
Recorder record.EventRecorder
3937
Registration registration.Registration
38+
39+
Reader interface {
40+
Get(context.Context, client.ObjectKey, client.Object, ...client.GetOption) error
41+
List(context.Context, client.ObjectList, ...client.ListOption) error
42+
}
43+
Writer interface {
44+
Delete(context.Context, client.Object, ...client.DeleteOption) error
45+
Patch(context.Context, client.Object, client.Patch, ...client.PatchOption) error
46+
}
47+
StatusWriter interface {
48+
Patch(context.Context, client.Object, client.Patch, ...client.SubResourcePatchOption) error
49+
}
4050
}
4151

4252
//+kubebuilder:rbac:groups="batch",resources="jobs",verbs={list,watch}
4353
//+kubebuilder:rbac:groups="postgres-operator.crunchydata.com",resources="pgupgrades",verbs={list,watch}
4454
//+kubebuilder:rbac:groups="postgres-operator.crunchydata.com",resources="postgresclusters",verbs={list,watch}
4555

46-
// SetupWithManager sets up the controller with the Manager.
47-
func (r *PGUpgradeReconciler) SetupWithManager(mgr ctrl.Manager) error {
48-
return ctrl.NewControllerManagedBy(mgr).
56+
// ManagedReconciler creates a [PGUpgradeReconciler] and adds it to m.
57+
func ManagedReconciler(m ctrl.Manager, r registration.Registration) error {
58+
kubernetes := client.WithFieldOwner(m.GetClient(), naming.ControllerPGUpgrade)
59+
recorder := m.GetEventRecorderFor(naming.ControllerPGUpgrade)
60+
61+
reconciler := &PGUpgradeReconciler{
62+
Reader: kubernetes,
63+
Recorder: recorder,
64+
Registration: r,
65+
StatusWriter: kubernetes.Status(),
66+
Writer: kubernetes,
67+
}
68+
69+
return ctrl.NewControllerManagedBy(m).
4970
For(&v1beta1.PGUpgrade{}).
5071
Owns(&batchv1.Job{}).
5172
Watches(
5273
v1beta1.NewPostgresCluster(),
5374
handler.EnqueueRequestsFromMapFunc(func(ctx context.Context, cluster client.Object) []ctrl.Request {
54-
return runtime.Requests(r.findUpgradesForPostgresCluster(ctx, client.ObjectKeyFromObject(cluster))...)
75+
return runtime.Requests(reconciler.findUpgradesForPostgresCluster(ctx, client.ObjectKeyFromObject(cluster))...)
5576
}),
5677
).
57-
Complete(r)
78+
Complete(reconciler)
5879
}
5980

6081
//+kubebuilder:rbac:groups="postgres-operator.crunchydata.com",resources="pgupgrades",verbs={list}
@@ -70,7 +91,7 @@ func (r *PGUpgradeReconciler) findUpgradesForPostgresCluster(
7091
// namespace, we can configure the [ctrl.Manager] field indexer and pass a
7192
// [fields.Selector] here.
7293
// - https://book.kubebuilder.io/reference/watching-resources/externally-managed.html
73-
if r.Client.List(ctx, &upgrades, &client.ListOptions{
94+
if r.Reader.List(ctx, &upgrades, &client.ListOptions{
7495
Namespace: cluster.Namespace,
7596
}) == nil {
7697
for i := range upgrades.Items {
@@ -107,14 +128,14 @@ func (r *PGUpgradeReconciler) Reconcile(ctx context.Context, req ctrl.Request) (
107128
// copy before returning from its cache.
108129
// - https://github.com/kubernetes-sigs/controller-runtime/issues/1235
109130
upgrade := &v1beta1.PGUpgrade{}
110-
err = r.Client.Get(ctx, req.NamespacedName, upgrade)
131+
err = r.Reader.Get(ctx, req.NamespacedName, upgrade)
111132

112133
if err == nil {
113134
// Write any changes to the upgrade status on the way out.
114135
before := upgrade.DeepCopy()
115136
defer func() {
116137
if !equality.Semantic.DeepEqual(before.Status, upgrade.Status) {
117-
status := r.Client.Status().Patch(ctx, upgrade, client.MergeFrom(before), r.Owner)
138+
status := r.StatusWriter.Patch(ctx, upgrade, client.MergeFrom(before))
118139

119140
if err == nil && status != nil {
120141
err = status
@@ -409,7 +430,7 @@ func (r *PGUpgradeReconciler) Reconcile(ctx context.Context, req ctrl.Request) (
409430
// - https://kubernetes.io/docs/concepts/workloads/controllers/job/
410431
// - https://github.com/kubernetes/kubernetes/blob/master/pkg/registry/batch/job/strategy.go#L58
411432
propagate := client.PropagationPolicy(metav1.DeletePropagationBackground)
412-
err = client.IgnoreNotFound(r.Client.Delete(ctx, object, exactly, propagate))
433+
err = client.IgnoreNotFound(r.Writer.Delete(ctx, object, exactly, propagate))
413434
}
414435
}
415436

@@ -424,7 +445,7 @@ func (r *PGUpgradeReconciler) Reconcile(ctx context.Context, req ctrl.Request) (
424445
// Set the pgBackRest status for bootstrapping
425446
patch.Status.PGBackRest.Repos = []v1beta1.RepoStatus{}
426447

427-
err = r.Client.Status().Patch(ctx, patch, client.MergeFrom(world.Cluster), r.Owner)
448+
err = r.StatusWriter.Patch(ctx, patch, client.MergeFrom(world.Cluster))
428449
}
429450

430451
return ctrl.Result{}, err
@@ -461,7 +482,7 @@ func (r *PGUpgradeReconciler) Reconcile(ctx context.Context, req ctrl.Request) (
461482
uid := object.GetUID()
462483
version := object.GetResourceVersion()
463484
exactly := client.Preconditions{UID: &uid, ResourceVersion: &version}
464-
err = client.IgnoreNotFound(r.Client.Delete(ctx, object, exactly))
485+
err = client.IgnoreNotFound(r.Writer.Delete(ctx, object, exactly))
465486
}
466487

467488
// Requeue to verify that Patroni endpoints are deleted

‎internal/controller/pgupgrade/utils.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import (
1212
"sigs.k8s.io/controller-runtime/pkg/client"
1313
"sigs.k8s.io/controller-runtime/pkg/controller/controllerutil"
1414

15+
"github.com/crunchydata/postgres-operator/internal/controller/runtime"
1516
"github.com/crunchydata/postgres-operator/internal/initialize"
1617
"github.com/crunchydata/postgres-operator/pkg/apis/postgres-operator.crunchydata.com/v1beta1"
1718
)
@@ -29,7 +30,7 @@ func (r *PGUpgradeReconciler) setControllerReference(
2930
owner *v1beta1.PGUpgrade, controlled client.Object,
3031
) {
3132
if metav1.GetControllerOf(controlled) != nil {
32-
panic(controllerutil.SetControllerReference(owner, controlled, r.Client.Scheme()))
33+
panic(controllerutil.SetControllerReference(owner, controlled, runtime.Scheme))
3334
}
3435

3536
controlled.SetOwnerReferences(append(

‎internal/controller/pgupgrade/world.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ func (r *PGUpgradeReconciler) observeWorld(
3939

4040
cluster := v1beta1.NewPostgresCluster()
4141
err := errors.WithStack(
42-
r.Client.Get(ctx, client.ObjectKey{
42+
r.Reader.Get(ctx, client.ObjectKey{
4343
Namespace: upgrade.Namespace,
4444
Name: upgrade.Spec.PostgresClusterName,
4545
}, cluster))
@@ -48,7 +48,7 @@ func (r *PGUpgradeReconciler) observeWorld(
4848
if err == nil {
4949
var endpoints corev1.EndpointsList
5050
err = errors.WithStack(
51-
r.Client.List(ctx, &endpoints,
51+
r.Reader.List(ctx, &endpoints,
5252
client.InNamespace(upgrade.Namespace),
5353
client.MatchingLabelsSelector{Selector: selectCluster},
5454
))
@@ -58,7 +58,7 @@ func (r *PGUpgradeReconciler) observeWorld(
5858
if err == nil {
5959
var jobs batchv1.JobList
6060
err = errors.WithStack(
61-
r.Client.List(ctx, &jobs,
61+
r.Reader.List(ctx, &jobs,
6262
client.InNamespace(upgrade.Namespace),
6363
client.MatchingLabelsSelector{Selector: selectCluster},
6464
))
@@ -70,7 +70,7 @@ func (r *PGUpgradeReconciler) observeWorld(
7070
if err == nil {
7171
var statefulsets appsv1.StatefulSetList
7272
err = errors.WithStack(
73-
r.Client.List(ctx, &statefulsets,
73+
r.Reader.List(ctx, &statefulsets,
7474
client.InNamespace(upgrade.Namespace),
7575
client.MatchingLabelsSelector{Selector: selectCluster},
7676
))

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /