refactor: wire shared Instance dependencies at startup

This commit is contained in:
2026-09-11 16:10:36 +00:00
parent 305e778203
commit 61985acb32
13 changed files with 221 additions and 337 deletions
@@ -18,6 +18,7 @@ package controller
import (
"context"
"fmt"
"reflect"
"time"
@@ -33,15 +34,16 @@ import (
// PostgreSQLInstanceReconciler reconciles a PostgreSQLInstance object
type PostgreSQLInstanceReconciler struct {
client.Client
Scheme *runtime.Scheme
Initializer PostgreSQLInstanceInitializer
Timeout time.Duration
Scheme *runtime.Scheme
Instances PostgreSQLInstances
Timeout time.Duration
}
// PostgreSQLInstanceInitializer is the external dependency boundary used by the Instance state machine.
type PostgreSQLInstanceInitializer interface {
// PostgreSQLInstances is the external dependency boundary used by the Instance state machine.
type PostgreSQLInstances interface {
Validate(context.Context, *databasev1alpha1.PostgreSQLInstance) (string, error)
InitializeRegistry(context.Context, *databasev1alpha1.PostgreSQLInstance) (string, error)
Forget(string)
}
// +kubebuilder:rbac:groups=database.ddupan.top,resources=postgresqlinstances,verbs=get;list;watch;create;update;patch;delete
@@ -61,16 +63,20 @@ func (r *PostgreSQLInstanceReconciler) Reconcile(ctx context.Context, req ctrl.R
logger := logf.FromContext(ctx)
instance := &databasev1alpha1.PostgreSQLInstance{}
if err := r.Get(ctx, req.NamespacedName, instance); err != nil {
if apierrors.IsNotFound(err) {
r.Instances.Forget(req.Name)
}
return ctrl.Result{}, client.IgnoreNotFound(err)
}
before := instance.DeepCopy()
operationCtx := ctx
if r.Timeout > 0 {
var cancel context.CancelFunc
ctx, cancel = context.WithTimeout(ctx, r.Timeout)
operationCtx, cancel = context.WithTimeout(ctx, r.Timeout)
defer cancel()
}
result, reconcileErr := newInstanceStateMachine(r.Initializer).reconcile(ctx, instance)
result, reconcileErr := newInstanceStateMachine(r.Instances).reconcile(operationCtx, instance)
if !reflect.DeepEqual(before.Status, instance.Status) {
if err := r.Status().Patch(ctx, instance, client.MergeFrom(before)); err != nil {
@@ -86,6 +92,9 @@ func (r *PostgreSQLInstanceReconciler) Reconcile(ctx context.Context, req ctrl.R
// SetupWithManager sets up the controller with the Manager.
func (r *PostgreSQLInstanceReconciler) SetupWithManager(mgr ctrl.Manager) error {
if r.Instances == nil {
return fmt.Errorf("instance service must be injected before controller setup")
}
return ctrl.NewControllerManagedBy(mgr).
For(&databasev1alpha1.PostgreSQLInstance{}).
Named("postgresqlinstance").