@@ -30,6 +30,7 @@ import (
3030 util "github.com/openstack-k8s-operators/lib-common/modules/common/util"
3131 databasev1beta1 "github.com/openstack-k8s-operators/mariadb-operator/api/v1beta1"
3232 mariadb "github.com/openstack-k8s-operators/mariadb-operator/pkg/mariadb"
33+ batchv1 "k8s.io/api/batch/v1"
3334 k8s_errors "k8s.io/apimachinery/pkg/api/errors"
3435 metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
3536 "k8s.io/apimachinery/pkg/runtime"
@@ -113,12 +114,18 @@ func (r *MariaDBAccountReconciler) Reconcile(ctx context.Context, req ctrl.Reque
113114 }()
114115
115116 // initialize conditions used later as Status=Unknown
116- cl := condition .CreateList (
117- condition .UnknownCondition (condition .ReadyCondition , condition .InitReason , condition .ReadyInitMessage ),
118- condition .UnknownCondition (databasev1beta1 .MariaDBServerReadyCondition , condition .InitReason , databasev1beta1 .MariaDBServerReadyInitMessage ),
119- condition .UnknownCondition (databasev1beta1 .MariaDBDatabaseReadyCondition , condition .InitReason , databasev1beta1 .MariaDBDatabaseReadyInitMessage ),
120- condition .UnknownCondition (databasev1beta1 .MariaDBAccountReadyCondition , condition .InitReason , databasev1beta1 .MariaDBAccountReadyInitMessage ),
121- )
117+ cl := condition.Conditions {
118+ * condition .UnknownCondition (condition .ReadyCondition , condition .InitReason , condition .ReadyInitMessage ),
119+ * condition .UnknownCondition (databasev1beta1 .MariaDBServerReadyCondition , condition .InitReason , databasev1beta1 .MariaDBServerReadyInitMessage ),
120+ }
121+ if instance .IsUserAccount () {
122+ // user accounts also need the database ready condition
123+ // the element is being inserted into the list in a specific location
124+ // to preseve expectations of tests suites that are hardcoded to
125+ // expect a specific ordering of Conditions in YAML displays
126+ cl = append (cl , * condition .UnknownCondition (databasev1beta1 .MariaDBDatabaseReadyCondition , condition .InitReason , databasev1beta1 .MariaDBDatabaseReadyInitMessage ))
127+ }
128+ cl = append (cl , * condition .UnknownCondition (databasev1beta1 .MariaDBAccountReadyCondition , condition .InitReason , databasev1beta1 .MariaDBAccountReadyInitMessage ))
122129 instance .Status .Conditions .Init (& cl )
123130
124131 if instance .DeletionTimestamp .IsZero () || isNewInstance { //revive:disable:indent-error-flow
@@ -134,23 +141,30 @@ func (r *MariaDBAccountReconciler) reconcileCreate(
134141 ctx context.Context , log logr.Logger ,
135142 helper * helper.Helper , instance * databasev1beta1.MariaDBAccount ) (result ctrl.Result , _err error ) {
136143
137- // get a handle to the current, active MariaDBDatabase.
138- // if not ready yet, requeue.
139- mariadbDatabase , result , err := r .getMariaDBDatabaseForCreate (ctx , log , instance )
140- if mariadbDatabase == nil {
141- return result , err
144+ var mariadbDatabase * databasev1beta1.MariaDBDatabase
145+ var err error
146+
147+ if instance .IsUserAccount () {
148+ // for User account, get a handle to the current, active MariaDBDatabase.
149+ // if not ready yet, requeue.
150+ mariadbDatabase , result , err = r .getMariaDBDatabaseForCreate (ctx , log , instance )
151+ if mariadbDatabase == nil {
152+ return result , err
153+ }
142154 }
143155
144156 if controllerutil .AddFinalizer (instance , helper .GetFinalizer ()) {
145157 // we need to persist this right away
146158 return ctrl.Result {}, nil
147159 }
148160
149- // MariaDBdatabase exists and we are a create case. ensure finalizers set up
150- if controllerutil .AddFinalizer (mariadbDatabase , fmt .Sprintf ("%s-%s" , helper .GetFinalizer (), instance .Name )) {
151- err = r .Update (ctx , mariadbDatabase )
152- if err != nil {
153- return ctrl.Result {}, err
161+ if instance .IsUserAccount () {
162+ // MariaDBdatabase exists and we are a create case. ensure finalizers set up
163+ if controllerutil .AddFinalizer (mariadbDatabase , fmt .Sprintf ("%s-%s" , helper .GetFinalizer (), instance .Name )) {
164+ err = r .Update (ctx , mariadbDatabase )
165+ if err != nil {
166+ return ctrl.Result {}, err
167+ }
154168 }
155169 }
156170
@@ -174,13 +188,25 @@ func (r *MariaDBAccountReconciler) reconcileCreate(
174188 return result , err
175189 }
176190
177- log .Info (fmt .Sprintf ("Running account create '%s' MariaDBDatabase '%s'" ,
178- instance .Name , mariadbDatabase .Spec .Name ))
179- jobDef , err := mariadb .CreateDbAccountJob (
180- dbGalera , instance , mariadbDatabase .Spec .Name , dbHostname ,
181- dbContainerImage , serviceAccountName , dbGalera .Spec .NodeSelector )
182- if err != nil {
183- return ctrl.Result {}, err
191+ var jobDef * batchv1.Job
192+
193+ if instance .IsUserAccount () {
194+ log .Info (fmt .Sprintf ("Running account create '%s' MariaDBDatabase '%s'" ,
195+ instance .Name , mariadbDatabase .Spec .Name ))
196+ jobDef , err = mariadb .CreateDbAccountJob (
197+ dbGalera , instance , mariadbDatabase .Spec .Name , dbHostname ,
198+ dbContainerImage , serviceAccountName , dbGalera .Spec .NodeSelector )
199+ if err != nil {
200+ return ctrl.Result {}, err
201+ }
202+ } else {
203+ log .Info (fmt .Sprintf ("Running system account create '%s'" , instance .Name ))
204+ jobDef , err = mariadb .CreateDbAccountJob (
205+ dbGalera , instance , "" , dbHostname ,
206+ dbContainerImage , serviceAccountName , dbGalera .Spec .NodeSelector )
207+ if err != nil {
208+ return ctrl.Result {}, err
209+ }
184210 }
185211
186212 accountCreateHash := instance .Status .Hash [databasev1beta1 .AccountCreateHash ]
@@ -228,9 +254,14 @@ func (r *MariaDBAccountReconciler) reconcileDelete(
228254 ctx context.Context , log logr.Logger ,
229255 helper * helper.Helper , instance * databasev1beta1.MariaDBAccount ) (result ctrl.Result , _err error ) {
230256
231- mariadbDatabase , result , err := r .getMariaDBDatabaseForDelete (ctx , log , helper , instance )
232- if mariadbDatabase == nil {
233- return result , err
257+ var mariadbDatabase * databasev1beta1.MariaDBDatabase
258+ var err error
259+
260+ if instance .IsUserAccount () {
261+ mariadbDatabase , result , err = r .getMariaDBDatabaseForDelete (ctx , log , helper , instance )
262+ if mariadbDatabase == nil {
263+ return result , err
264+ }
234265 }
235266
236267 // dont do actual DROP USER until finalizers from downstream controllers
@@ -259,10 +290,12 @@ func (r *MariaDBAccountReconciler) reconcileDelete(
259290 databasev1beta1 .MariaDBAccountReadyForDeleteMessage ,
260291 )
261292
262- instance .Status .Conditions .MarkTrue (
263- databasev1beta1 .MariaDBDatabaseReadyCondition ,
264- databasev1beta1 .MariaDBDatabaseReadyMessage ,
265- )
293+ if instance .IsUserAccount () {
294+ instance .Status .Conditions .MarkTrue (
295+ databasev1beta1 .MariaDBDatabaseReadyCondition ,
296+ databasev1beta1 .MariaDBDatabaseReadyMessage ,
297+ )
298+ }
266299
267300 // now proceed to do actual work. acquire the Galera instance
268301 // which will lead us to the hostname and container image to target
@@ -278,20 +311,21 @@ func (r *MariaDBAccountReconciler) reconcileDelete(
278311 // scheme allows multiple MariaDBAccounts to claim the same MariaDBDatabase
279312 // as a dependency) and allows a delete of the MariaDBDatabase to proceed
280313 // assuming no other finalizers
281- if controllerutil .RemoveFinalizer (mariadbDatabase , fmt .Sprintf ("%s-%s" , helper .GetFinalizer (), instance .Name )) {
282- err = r .Update (ctx , mariadbDatabase )
314+ if instance .IsUserAccount () {
315+ if controllerutil .RemoveFinalizer (mariadbDatabase , fmt .Sprintf ("%s-%s" , helper .GetFinalizer (), instance .Name )) {
316+ err = r .Update (ctx , mariadbDatabase )
283317
284- if err != nil && ! k8s_errors .IsNotFound (err ) {
285- return ctrl.Result {}, err
318+ if err != nil && ! k8s_errors .IsNotFound (err ) {
319+ return ctrl.Result {}, err
320+ }
286321 }
287-
288322 }
289323
290324 // remove finalizer "openstack.org/mariadbaccount" from both the
291325 // MariaDBAccount as well as the Secret which is referenced from the
292326 // MariaDBAccount, allowing both to be deleted assuming no other
293327 // finalizers
294- err = r .removeAccountAndSecretFinalizer (ctx , helper , instance )
328+ err : = r .removeAccountAndSecretFinalizer (ctx , helper , instance )
295329 return ctrl.Result {}, err
296330 } else if dbGalera == nil {
297331 return result , err
@@ -300,13 +334,24 @@ func (r *MariaDBAccountReconciler) reconcileDelete(
300334 dbContainerImage := dbGalera .Spec .ContainerImage
301335 serviceAccountName := dbGalera .RbacResourceName ()
302336
303- log . Info ( fmt . Sprintf ( "Running account delete '%s' MariaDBDatabase '%s'" , instance . Name , mariadbDatabase . Spec . Name ))
337+ var jobDef * batchv1. Job
304338
305- jobDef , err := mariadb .DeleteDbAccountJob (dbGalera , instance , mariadbDatabase .Spec .Name , dbHostname , dbContainerImage , serviceAccountName , dbGalera .Spec .NodeSelector )
306- if err != nil {
307- return ctrl.Result {}, err
308- }
339+ if instance .IsUserAccount () {
340+
341+ log .Info (fmt .Sprintf ("Running account delete '%s' MariaDBDatabase '%s'" , instance .Name , mariadbDatabase .Spec .Name ))
342+
343+ jobDef , err = mariadb .DeleteDbAccountJob (dbGalera , instance , mariadbDatabase .Spec .Name , dbHostname , dbContainerImage , serviceAccountName , dbGalera .Spec .NodeSelector )
344+ if err != nil {
345+ return ctrl.Result {}, err
346+ }
347+ } else {
348+ log .Info (fmt .Sprintf ("Running system account delete '%s'" , instance .Name ))
309349
350+ jobDef , err = mariadb .DeleteDbAccountJob (dbGalera , instance , "" , dbHostname , dbContainerImage , serviceAccountName , dbGalera .Spec .NodeSelector )
351+ if err != nil {
352+ return ctrl.Result {}, err
353+ }
354+ }
310355 accountDeleteHash := instance .Status .Hash [databasev1beta1 .AccountDeleteHash ]
311356 accountDeleteJob := job .NewJob (
312357 jobDef ,
@@ -335,18 +380,19 @@ func (r *MariaDBAccountReconciler) reconcileDelete(
335380 // scheme allows multiple MariaDBAccounts to claim the same MariaDBDatabase
336381 // as a dependency) and allows a delete of the MariaDBDatabase to proceed
337382 // assuming no other finalizers
338- if controllerutil .RemoveFinalizer (mariadbDatabase , fmt .Sprintf ("%s-%s" , helper .GetFinalizer (), instance .Name )) {
339- err = r .Update (ctx , mariadbDatabase )
340- if err != nil {
341- return ctrl.Result {}, err
383+ if instance .IsUserAccount () {
384+ if controllerutil .RemoveFinalizer (mariadbDatabase , fmt .Sprintf ("%s-%s" , helper .GetFinalizer (), instance .Name )) {
385+ err = r .Update (ctx , mariadbDatabase )
386+ if err != nil {
387+ return ctrl.Result {}, err
388+ }
342389 }
343390 }
344391
345392 // remove finalizer "openstack.org/mariadbaccount" from
346393 // both the MariaDBAccount as well as the Secret which is referenced
347394 // from the MariaDBAccount, allowing both to be deleted
348395 err = r .removeAccountAndSecretFinalizer (ctx , helper , instance )
349-
350396 return ctrl.Result {}, err
351397}
352398
@@ -526,9 +572,17 @@ func (r *MariaDBAccountReconciler) getGaleraForCreateOrDelete(
526572 helper * helper.Helper , instance * databasev1beta1.MariaDBAccount ,
527573 mariadbDatabase * databasev1beta1.MariaDBDatabase ) (* databasev1beta1.Galera , string , ctrl.Result , error ) {
528574
529- dbName := mariadbDatabase .Labels ["dbName" ]
575+ var dbGalera * databasev1beta1.Galera
576+ var err error
577+ var dbName string
530578
531- dbGalera , err := GetDatabaseObject (ctx , r .Client , dbName , instance .Namespace )
579+ if instance .IsUserAccount () {
580+ dbName = mariadbDatabase .Labels ["dbName" ]
581+ } else {
582+ // note mariadbDatabase is passed as nil in this case
583+ dbName = instance .Labels ["dbName" ]
584+ }
585+ dbGalera , err = GetDatabaseObject (ctx , r .Client , dbName , instance .Namespace )
532586
533587 if err != nil {
534588 log .Error (err , "Error retrieving Galera instance" )
0 commit comments