@@ -18,6 +18,7 @@ package postgresql
1818
1919import (
2020 "context"
21+ "fmt"
2122 "reflect"
2223 "strings"
2324 "time"
@@ -48,7 +49,7 @@ type PostgresqlBackupProviderReconciler struct {
4849 ReconcileTimeout time.Duration
4950}
5051
51- const MaxGeneratedSecretNamePrefixLength = 20
52+ const maxGeneratedNamePrefixLength = 20
5253
5354// +kubebuilder:rbac:groups=postgresql.easymile.com,resources=postgresqlbackupproviders,verbs=get;list;watch;create;update;patch;delete
5455// +kubebuilder:rbac:groups=postgresql.easymile.com,resources=postgresqlbackupproviders/status,verbs=get;update;patch
@@ -132,7 +133,26 @@ func (r *PostgresqlBackupProviderReconciler) mainReconcile(
132133 // Deletion case
133134 if ! instance .GetDeletionTimestamp ().IsZero () {
134135 // Deletion in progress detected
135- // TODO wait for children
136+
137+ // Check if wait linked resources deletion flag is enabled
138+ if instance .Spec .WaitLinkedResourcesDeletion {
139+ // Check if there are linked resource linked to this
140+ found , err := r .getAnyBackupLinked (ctx , instance )
141+ if err != nil {
142+ return r .manageError (ctx , reqLogger , instance , originalPatch , err )
143+ }
144+
145+ if found != nil {
146+ // Wait for children removal
147+ err = fmt .Errorf (
148+ "cannot remove resource because found backup %s in namespace %s linked to this resource and wait for deletion flag is enabled" ,
149+ found .Name ,
150+ found .Namespace ,
151+ )
152+
153+ return r .manageError (ctx , reqLogger , instance , originalPatch , err )
154+ }
155+ }
136156
137157 // Remove finalizer
138158 controllerutil .RemoveFinalizer (instance , config .Finalizer )
@@ -158,12 +178,68 @@ func (r *PostgresqlBackupProviderReconciler) mainReconcile(
158178 return ctrl.Result {}, nil
159179 }
160180
161- // TODO Validate instance
181+ // Validate instance
182+ err = r .validateInstance (instance )
183+ // Check error
184+ if err != nil {
185+ return r .manageError (ctx , reqLogger , instance , originalPatch , err )
186+ }
162187
163188 // Success
164189 return r .manageSuccess (ctx , reqLogger , instance , originalPatch )
165190}
166191
192+ func (r * PostgresqlBackupProviderReconciler ) getAnyBackupLinked (
193+ ctx context.Context ,
194+ instance * postgresqlv1alpha1.PostgresqlBackupProvider ,
195+ ) (* postgresqlv1alpha1.PostgresqlBackup , error ) {
196+ // Initialize postgres backup list
197+ bL := postgresqlv1alpha1.PostgresqlBackupList {}
198+ // Requests for list of backups
199+ err := r .List (ctx , & bL )
200+ if err != nil {
201+ return nil , err
202+ }
203+ // Loop over the list
204+ for _ , item := range bL .Items {
205+ // Check backup is linked to provider
206+ if item .Spec .BackupProvider .Name == instance .Name &&
207+ (item .Spec .BackupProvider .Namespace == instance .Namespace || item .Namespace == instance .Namespace ) {
208+ return & item , nil
209+ }
210+ }
211+
212+ return nil , nil
213+ }
214+
215+ func (r * PostgresqlBackupProviderReconciler ) validateInstance (
216+ instance * postgresqlv1alpha1.PostgresqlBackupProvider ,
217+ ) error {
218+ // Cronjob spec
219+ if instance .Spec .CronJobSpec == nil {
220+ return errors .NewBadRequest ("cronjob spec mustn't be empty" )
221+ }
222+
223+ // Cronjob name
224+ if instance .Spec .CronJobName == "" {
225+ return errors .NewBadRequest ("cronjob name mustn't be empty" )
226+ }
227+ if len (instance .Spec .CronJobName ) > maxNameLength {
228+ return errors .NewBadRequest ("cronjob name is greater than supported" )
229+ }
230+
231+ // Check generated name prefix
232+ if instance .Spec .GeneratedNamePrefix == "" {
233+ return errors .NewBadRequest ("GeneratedNamePrefix mustn't be empty" )
234+ }
235+ if len (instance .Spec .GeneratedNamePrefix ) > maxGeneratedNamePrefixLength {
236+ return errors .NewBadRequest ("GeneratedNamePrefix is greater than supported" )
237+ }
238+
239+ // Default
240+ return nil
241+ }
242+
167243func (r * PostgresqlBackupProviderReconciler ) updateInstance (
168244 ctx context.Context ,
169245 instance * postgresqlv1alpha1.PostgresqlBackupProvider ,
@@ -177,7 +253,7 @@ func (r *PostgresqlBackupProviderReconciler) updateInstance(
177253 // Check if generated secret name is set
178254 if instance .Spec .GeneratedNamePrefix == "" {
179255 instance .Spec .GeneratedNamePrefix = strings .ToLower (
180- utils .GetRandomString (MaxGeneratedSecretNamePrefixLength ),
256+ utils .GetRandomString (maxGeneratedNamePrefixLength ),
181257 )
182258 }
183259
0 commit comments