@@ -35,6 +35,7 @@ const databaseFinalizer = "finalizer.database.anbraten.github.io"
35
35
// - https://pkg.go.dev/sigs.k8s.io/[email protected] /pkg/reconcile
36
36
func (r * DatabaseReconciler ) Reconcile (ctx context.Context , req ctrl.Request ) (ctrl.Result , error ) {
37
37
log := r .Log .WithValues ("database" , req .NamespacedName )
38
+ log .Info ("Reconciling database" )
38
39
39
40
// Fetch the Database instance
40
41
database := & anbratengithubiov1alpha1.Database {}
@@ -54,58 +55,22 @@ func (r *DatabaseReconciler) Reconcile(ctx context.Context, req ctrl.Request) (c
54
55
55
56
db , err := r .getDatabaseConnection (ctx , database .Spec .Type )
56
57
if err != nil {
57
- log .Error (err , "Failed to detect and open database connection" )
58
+ log .Error (err , "Failed to detect or open database connection" )
58
59
return ctrl.Result {}, err
59
60
}
60
61
61
62
defer db .Close (ctx )
62
63
63
- log .Info ("Connected to database server" )
64
-
65
- hasDatabase , err := db .HasDatabase (ctx , database .Spec .Database )
66
- if err != nil {
67
- log .Error (err , "Couldn't check if database exists" )
68
- return ctrl.Result {}, err
69
- }
70
-
71
- if ! hasDatabase {
72
- log .Info ("Create new database: '" + database .Spec .Database + "'" )
73
-
74
- err = db .CreateDatabase (ctx , database .Spec .Database )
75
- if err != nil {
76
- log .Error (err , "Can't create database" )
77
- return ctrl.Result {}, err
78
- }
79
- }
80
-
81
- hasDatabaseUserWithAccess , err := db .HasDatabaseUserWithAccess (ctx , database .Spec .Database , database .Spec .Username )
82
- if err != nil {
83
- log .Error (err , "Can't check if user has access to database" )
84
- return ctrl.Result {}, err
85
- }
86
-
87
- if ! hasDatabaseUserWithAccess {
88
- log .Info ("Create new user '" + database .Spec .Username + "' with access to the database '" + database .Spec .Database + "'" )
89
-
90
- err = db .CreateDatabaseUser (ctx , database .Spec .Database , database .Spec .Username , database .Spec .Password )
91
- if err != nil {
92
- log .Error (err , "Can't create database user with access to database" )
93
- return ctrl.Result {}, err
94
- }
95
- }
96
-
97
- log .Info ("Created database and user with full access to it" )
98
-
99
64
// Check if the Database instance is marked to be deleted, which is
100
65
// indicated by the deletion timestamp being set.
101
66
isDatabaseMarkedToBeDeleted := database .GetDeletionTimestamp () != nil
102
67
if isDatabaseMarkedToBeDeleted {
103
- if contains ( database . GetFinalizers () , databaseFinalizer ) {
68
+ if controllerutil . ContainsFinalizer ( database , databaseFinalizer ) {
104
69
// Run finalization logic for databaseFinalizer. If the
105
70
// finalization logic fails, don't remove the finalizer so
106
71
// that we can retry during the next reconciliation.
107
- if err := r .finalizeDatabase (ctx , log , database ); err != nil {
108
- log .Error (err , "Can't create finalizer for database " )
72
+ if err := r .finalizeDatabase (ctx , log , db , database ); err != nil {
73
+ log .Error (err , "Can't remove database and user " )
109
74
return ctrl.Result {}, err
110
75
}
111
76
@@ -114,19 +79,52 @@ func (r *DatabaseReconciler) Reconcile(ctx context.Context, req ctrl.Request) (c
114
79
controllerutil .RemoveFinalizer (database , databaseFinalizer )
115
80
err := r .Update (ctx , database )
116
81
if err != nil {
117
- log .Error (err , "Can't remove finalizers of database" )
118
82
return ctrl.Result {}, err
119
83
}
120
84
}
121
85
return ctrl.Result {}, nil
122
86
}
123
87
124
- // Add finalizer for this CR
125
- if ! contains (database .GetFinalizers (), databaseFinalizer ) {
126
- if err := r .addFinalizer (ctx , log , database ); err != nil {
127
- log .Error (err , "Can't add finalizer to this custom-resource (database)" )
88
+ // Add finalizer for this CR if necessary
89
+ if ! controllerutil .ContainsFinalizer (database , databaseFinalizer ) {
90
+ controllerutil .AddFinalizer (database , databaseFinalizer )
91
+ err = r .Update (ctx , database )
92
+ if err != nil {
93
+ return ctrl.Result {}, err
94
+ }
95
+ }
96
+
97
+ // Create database if necessary
98
+ hasDatabase , err := db .HasDatabase (ctx , database .Spec .Database )
99
+ if err != nil {
100
+ log .Error (err , "Couldn't check if database '" , database .Spec .Database , "' exists" )
101
+ return ctrl.Result {}, err
102
+ } else if ! hasDatabase {
103
+ log .Info ("Creating new database '" , database .Spec .Database , "'" )
104
+
105
+ err = db .CreateDatabase (ctx , database .Spec .Database )
106
+ if err != nil {
107
+ log .Error (err , "Can't create database" )
108
+ return ctrl.Result {}, err
109
+ }
110
+
111
+ log .Info ("Created database '" , database .Spec .Database , "'" )
112
+ }
113
+
114
+ // Create database user with full access if necessary
115
+ hasDatabaseUserWithAccess , err := db .HasDatabaseUserWithAccess (ctx , database .Spec .Database , database .Spec .Username )
116
+ if err != nil {
117
+ log .Error (err , "Can't check if user has access to database" )
118
+ return ctrl.Result {}, err
119
+ } else if ! hasDatabaseUserWithAccess {
120
+ log .Info ("Creating new user '" + database .Spec .Username + "' and granting access to database '" + database .Spec .Database + "'" )
121
+
122
+ err = db .CreateDatabaseUser (ctx , database .Spec .Database , database .Spec .Username , database .Spec .Password )
123
+ if err != nil {
124
+ log .Error (err , "Can't create database user with access to database" )
128
125
return ctrl.Result {}, err
129
126
}
127
+ log .Info ("Created user '" + database .Spec .Username + "' and granted access to database '" + database .Spec .Database + "'" )
130
128
}
131
129
132
130
return ctrl.Result {}, nil
@@ -168,73 +166,38 @@ func (r *DatabaseReconciler) getDatabaseConnection(ctx context.Context, database
168
166
return nil , errors .NewBadRequest ("Database type not supported" )
169
167
}
170
168
171
- func (r * DatabaseReconciler ) finalizeDatabase (ctx context.Context , log logr.Logger , database * anbratengithubiov1alpha1.Database ) error {
172
- db , err := r .getDatabaseConnection (ctx , database .Spec .Type )
173
- if err != nil {
174
- return err
175
- }
176
-
177
- defer db .Close (ctx )
178
-
169
+ func (r * DatabaseReconciler ) finalizeDatabase (ctx context.Context , log logr.Logger , db adapters.DatabaseAdapter , database * anbratengithubiov1alpha1.Database ) error {
170
+ // remove database user and database access if it exists
179
171
hasDatabaseUserWithAccess , err := db .HasDatabaseUserWithAccess (ctx , database .Spec .Database , database .Spec .Username )
180
172
if err != nil {
181
173
return err
182
- }
183
-
184
- if hasDatabaseUserWithAccess {
185
- log .Info ("Remove user '" + database .Spec .Username + "' and its access to the database '" + database .Spec .Database + "'" )
174
+ } else if hasDatabaseUserWithAccess {
175
+ log .Info ("Removing user '" + database .Spec .Username + "' and revoking access to the database '" + database .Spec .Database + "'" )
186
176
187
177
err = db .DeleteDatabaseUser (ctx , database .Spec .Database , database .Spec .Username )
188
178
if err != nil {
189
179
return err
190
180
}
181
+ log .Info ("Removed database user '" + database .Spec .Username + "' and revoked access to the database '" + database .Spec .Database + "'" )
191
182
}
192
183
184
+ // remove database if it exists
193
185
hasDatabase , err := db .HasDatabase (ctx , database .Spec .Database )
194
186
if err != nil {
195
187
return err
196
- }
197
-
198
- if hasDatabase {
199
- log .Info ("Remove database: '" + database .Spec .Database + "'" )
188
+ } else if hasDatabase {
189
+ log .Info ("Removing database '" + database .Spec .Database + "'" )
200
190
201
191
err = db .DeleteDatabase (ctx , database .Spec .Database )
202
192
if err != nil {
203
193
return err
204
194
}
195
+ log .Info ("Removed database '" + database .Spec .Database + "'" )
205
196
}
206
197
207
- err = db .DeleteDatabase (ctx , database .Spec .Database )
208
- if err != nil {
209
- return err
210
- }
211
-
212
- log .Info ("Database: '" + database .Spec .Database + "' and user: '" + database .Spec .Username + "' removed" )
213
- return nil
214
- }
215
-
216
- func (r * DatabaseReconciler ) addFinalizer (ctx context.Context , log logr.Logger , m * anbratengithubiov1alpha1.Database ) error {
217
- log .Info ("Adding Finalizer for the database" )
218
- controllerutil .AddFinalizer (m , databaseFinalizer )
219
-
220
- // Update CR
221
- err := r .Update (ctx , m )
222
- if err != nil {
223
- log .Error (err , "Failed to update database with finalizer" )
224
- return err
225
- }
226
198
return nil
227
199
}
228
200
229
- func contains (list []string , s string ) bool {
230
- for _ , v := range list {
231
- if v == s {
232
- return true
233
- }
234
- }
235
- return false
236
- }
237
-
238
201
// SetupWithManager sets up the controller with the Manager.
239
202
func (r * DatabaseReconciler ) SetupWithManager (mgr ctrl.Manager ) error {
240
203
return ctrl .NewControllerManagedBy (mgr ).
0 commit comments