Skip to content

Commit 5f3d567

Browse files
committed
feat: wip
1 parent b304c50 commit 5f3d567

File tree

4 files changed

+85
-6
lines changed

4 files changed

+85
-6
lines changed

api/postgresql/v1alpha1/postgresqlbackup_types.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ import (
2828
// PostgresqlBackupSpec defines the desired state of PostgresqlBackup.
2929
type PostgresqlBackupSpec struct {
3030
// Schedule for cronjob
31+
// +optional
3132
Schedule string `json:"schedule"`
3233
// Postgresql Database
3334
// +required

config/crd/bases/postgresql.easymile.com_postgresqlbackups.yaml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,6 @@ spec:
6969
required:
7070
- backupProvider
7171
- database
72-
- schedule
7372
type: object
7473
status:
7574
description: PostgresqlBackupStatus defines the observed state of PostgresqlBackup.

internal/controller/postgresql/postgresqlbackup_controller.go

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -242,7 +242,10 @@ func (r *PostgresqlBackupReconciler) manageCronJob(
242242

243243
// Clone provider cronjob spec and override schedule from backup instance
244244
cronJobSpec := backupProvider.Spec.CronJobSpec.DeepCopy()
245-
cronJobSpec.Schedule = instance.Spec.Schedule
245+
// Check if schedule is set in order to patch spec
246+
if instance.Spec.Schedule != "" {
247+
cronJobSpec.Schedule = instance.Spec.Schedule
248+
}
246249

247250
// Ensure the pg_dump secret is available in all containers
248251
ensureSecretEnv := func(containers []corev1.Container) []corev1.Container {

internal/controller/postgresql/postgresqlbackupprovider_controller.go

Lines changed: 80 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ package postgresql
1818

1919
import (
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+
167243
func (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

Comments
 (0)