@@ -27,12 +27,12 @@ import (
2727 helper "github.com/openstack-k8s-operators/lib-common/modules/common/helper"
2828 job "github.com/openstack-k8s-operators/lib-common/modules/common/job"
2929 "github.com/openstack-k8s-operators/lib-common/modules/common/secret"
30+ util "github.com/openstack-k8s-operators/lib-common/modules/common/util"
3031 databasev1beta1 "github.com/openstack-k8s-operators/mariadb-operator/api/v1beta1"
3132 mariadb "github.com/openstack-k8s-operators/mariadb-operator/pkg/mariadb"
3233 k8s_errors "k8s.io/apimachinery/pkg/api/errors"
3334 metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
3435 "k8s.io/apimachinery/pkg/runtime"
35- "k8s.io/apimachinery/pkg/types"
3636 "k8s.io/client-go/kubernetes"
3737 ctrl "sigs.k8s.io/controller-runtime"
3838 "sigs.k8s.io/controller-runtime/pkg/client"
@@ -168,27 +168,10 @@ func (r *MariaDBAccountReconciler) reconcileCreate(
168168
169169 // account create
170170
171- // ensure secret is present before running a job
172- _ , secretResult , err := secret .VerifySecret (
173- ctx ,
174- types.NamespacedName {Name : instance .Spec .Secret , Namespace : instance .Namespace },
175- []string {databasev1beta1 .DatabasePasswordSelector },
176- r .Client ,
177- time .Duration (30 )* time .Second ,
178- )
179- if (err != nil || secretResult != ctrl.Result {}) {
180-
181- instance .Status .Conditions .Set (condition .FalseCondition (
182- databasev1beta1 .MariaDBAccountReadyCondition ,
183- secret .ReasonSecretMissing ,
184- condition .SeverityInfo ,
185- databasev1beta1 .MariaDBAccountSecretNotReadyMessage , err ))
186-
187- log .Info (fmt .Sprintf (
188- "MariaDBAccount '%s' didn't find Secret '%s'; requeueing" ,
189- instance .Name , instance .Spec .Secret ))
190-
191- return secretResult , client .IgnoreNotFound (err )
171+ // ensure secret is present, add a finalizer for mariadbaccount
172+ result , err = r .ensureAccountSecret (ctx , log , helper , instance )
173+ if (result != ctrl.Result {} || err != nil ) {
174+ return result , err
192175 }
193176
194177 log .Info (fmt .Sprintf ("Running account create '%s' MariaDBDatabase '%s'" ,
@@ -301,9 +284,8 @@ func (r *MariaDBAccountReconciler) reconcileDelete(
301284 }
302285
303286 // remove local finalizer
304- controllerutil .RemoveFinalizer (instance , helper .GetFinalizer ())
305-
306- return ctrl.Result {}, nil
287+ err = r .removeAccountAndSecretFinalizer (ctx , helper , instance )
288+ return ctrl.Result {}, err
307289 } else if dbGalera == nil {
308290 return result , err
309291 }
@@ -350,9 +332,9 @@ func (r *MariaDBAccountReconciler) reconcileDelete(
350332 }
351333
352334 // then remove finalizer from our own instance
353- controllerutil . RemoveFinalizer ( instance , helper . GetFinalizer () )
335+ err = r . removeAccountAndSecretFinalizer ( ctx , helper , instance )
354336
355- return ctrl.Result {}, nil
337+ return ctrl.Result {}, err
356338}
357339
358340// getMariaDBDatabaseForCreate - waits for a MariaDBDatabase to be available in preparation
@@ -445,8 +427,9 @@ func (r *MariaDBAccountReconciler) getMariaDBDatabaseForDelete(ctx context.Conte
445427 instance .Name ,
446428 ))
447429
448- controllerutil .RemoveFinalizer (instance , helper .GetFinalizer ())
449- return nil , ctrl.Result {}, nil
430+ // remove local finalizer
431+ err := r .removeAccountAndSecretFinalizer (ctx , helper , instance )
432+ return nil , ctrl.Result {}, err
450433 }
451434
452435 // locate the MariaDBDatabase object itself
@@ -460,8 +443,9 @@ func (r *MariaDBAccountReconciler) getMariaDBDatabaseForDelete(ctx context.Conte
460443 "MariaDBAccount '%s' Didn't find MariaDBDatabase '%s'; no account delete needed" ,
461444 instance .Name , mariadbDatabaseName ))
462445
463- controllerutil .RemoveFinalizer (instance , helper .GetFinalizer ())
464- return nil , ctrl.Result {}, nil
446+ // remove local finalizer
447+ err = r .removeAccountAndSecretFinalizer (ctx , helper , instance )
448+ return nil , ctrl.Result {}, err
465449 } else {
466450 // unhandled error; exit without change
467451 log .Error (err , "unhandled error retrieving MariaDBDatabase instance" )
@@ -491,8 +475,9 @@ func (r *MariaDBAccountReconciler) getMariaDBDatabaseForDelete(ctx context.Conte
491475 }
492476 }
493477
494- controllerutil .RemoveFinalizer (instance , helper .GetFinalizer ())
495- return nil , ctrl.Result {}, nil
478+ // remove local finalizer
479+ err = r .removeAccountAndSecretFinalizer (ctx , helper , instance )
480+ return nil , ctrl.Result {}, err
496481 }
497482
498483 // return MariaDBDatabase where account delete flow will then continue
@@ -571,3 +556,79 @@ func (r *MariaDBAccountReconciler) getMariaDBDatabaseObject(ctx context.Context,
571556 return mariaDBDatabase , nil
572557
573558}
559+
560+ // ensureAccountSecret - ensures the Secret exists, is valid, adds a finalizer.
561+ // includes requeue for secret does not exist
562+ func (r * MariaDBAccountReconciler ) ensureAccountSecret (
563+ ctx context.Context ,
564+ log logr.Logger ,
565+ h * helper.Helper ,
566+ instance * databasev1beta1.MariaDBAccount ,
567+ ) (ctrl.Result , error ) {
568+
569+ secretName := instance .Spec .Secret
570+ secretNamespace := instance .Namespace
571+ secretObj , _ , err := secret .GetSecret (ctx , h , secretName , secretNamespace )
572+ if err != nil {
573+ if k8s_errors .IsNotFound (err ) {
574+ instance .Status .Conditions .Set (condition .FalseCondition (
575+ databasev1beta1 .MariaDBAccountReadyCondition ,
576+ secret .ReasonSecretMissing ,
577+ condition .SeverityInfo ,
578+ databasev1beta1 .MariaDBAccountSecretNotReadyMessage , err ))
579+
580+ log .Info (fmt .Sprintf (
581+ "MariaDBAccount '%s' didn't find Secret '%s'; requeueing" ,
582+ instance .Name , instance .Spec .Secret ))
583+
584+ return ctrl.Result {RequeueAfter : time .Duration (30 ) * time .Second }, nil
585+
586+ } else {
587+ return ctrl.Result {}, err
588+ }
589+ }
590+
591+ var expectedFields = []string {databasev1beta1 .DatabasePasswordSelector }
592+
593+ // collect the secret values the caller expects to exist
594+ for _ , field := range expectedFields {
595+ _ , ok := secretObj .Data [field ]
596+ if ! ok {
597+ err := fmt .Errorf ("%w: field %s not found in Secret %s" , util .ErrFieldNotFound , field , secretName )
598+ return ctrl.Result {}, err
599+ }
600+ }
601+ if controllerutil .AddFinalizer (secretObj , h .GetFinalizer ()) {
602+ err = r .Update (ctx , secretObj )
603+ if err != nil {
604+ return ctrl.Result {}, err
605+ }
606+ }
607+
608+ return ctrl.Result {}, err
609+ }
610+
611+ // removeAccountAndSecretFinalizer - removes finalizer from mariadbaccount as well
612+ // as current primary secret
613+ func (r * MariaDBAccountReconciler ) removeAccountAndSecretFinalizer (ctx context.Context ,
614+ helper * helper.Helper , instance * databasev1beta1.MariaDBAccount ) error {
615+
616+ accountSecret , _ , err := secret .GetSecret (ctx , helper , instance .Spec .Secret , instance .Namespace )
617+
618+ if err == nil {
619+ if controllerutil .RemoveFinalizer (accountSecret , helper .GetFinalizer ()) {
620+ err = r .Update (ctx , accountSecret )
621+ if err != nil {
622+ return err
623+ }
624+ }
625+ } else if ! k8s_errors .IsNotFound (err ) {
626+ return err
627+ }
628+
629+ // will take effect when reconcile ends
630+ controllerutil .RemoveFinalizer (instance , helper .GetFinalizer ())
631+
632+ return nil
633+
634+ }
0 commit comments