Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
36 changes: 19 additions & 17 deletions api/v1/perconaservermysql_types.go
Original file line number Diff line number Diff line change
Expand Up @@ -754,24 +754,26 @@ func (cr *PerconaServerMySQL) CheckNSetDefaults(_ context.Context, serverVersion
cr.Spec.Backup = new(BackupSpec)
}

if len(cr.Spec.Backup.Image) == 0 {
return errors.New("backup.image can't be empty")
}

scheduleNames := make(map[string]struct{}, len(cr.Spec.Backup.Schedule))
for _, sch := range cr.Spec.Backup.Schedule {
if _, ok := scheduleNames[sch.Name]; ok {
return errors.Errorf("scheduled backups should have different names: %s name is used by multiple schedules", sch.Name)
if cr.Spec.Backup.Enabled {
if len(cr.Spec.Backup.Image) == 0 {
return errors.New("backup.image can't be empty")
}
scheduleNames[sch.Name] = struct{}{}
_, ok := cr.Spec.Backup.Storages[sch.StorageName]
if !ok {
return errors.Errorf("storage %s doesn't exist", sch.StorageName)
}
if sch.Schedule != "" {
_, err := cron.ParseStandard(sch.Schedule)
if err != nil {
return errors.Wrap(err, "invalid schedule format")

scheduleNames := make(map[string]struct{}, len(cr.Spec.Backup.Schedule))
for _, sch := range cr.Spec.Backup.Schedule {
if _, ok := scheduleNames[sch.Name]; ok {
return errors.Errorf("scheduled backups should have different names: %s name is used by multiple schedules", sch.Name)
}
scheduleNames[sch.Name] = struct{}{}
_, ok := cr.Spec.Backup.Storages[sch.StorageName]
if !ok {
return errors.Errorf("storage %s doesn't exist", sch.StorageName)
}
if sch.Schedule != "" {
_, err := cron.ParseStandard(sch.Schedule)
if err != nil {
return errors.Wrap(err, "invalid schedule format")
}
}
}
}
Expand Down
61 changes: 58 additions & 3 deletions api/v1/perconaservermysql_types_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,25 +10,62 @@ import (
)

func TestCheckNSetDefaults(t *testing.T) {
t.Run("empty cr", func(t *testing.T) {
t.Run("with invalid cluster type", func(t *testing.T) {
cr := new(PerconaServerMySQL)
cr.Spec.MySQL.ClusterType = "invalid"

err := cr.CheckNSetDefaults(t.Context(), nil)
assert.EqualError(t, err, "invalid is not a valid clusterType, valid options are group-replication and async")
})
t.Run("empty cr with backups enabled", func(t *testing.T) {
cr := new(PerconaServerMySQL)
cr.Spec.Backup = &BackupSpec{
Enabled: true,
}

err := cr.CheckNSetDefaults(t.Context(), nil)
assert.EqualError(t, err, "backup.image can't be empty")
})
t.Run("with backup image", func(t *testing.T) {
cr := new(PerconaServerMySQL)
cr.Spec.Backup = &BackupSpec{
Image: "backup-image",
Enabled: true,
Image: "backup-image",
}

err := cr.CheckNSetDefaults(t.Context(), nil)
assert.EqualError(t, err, "reconcile mysql volumeSpec: volumeSpec provided is nil")
})
t.Run("scheduled backups should have different names", func(t *testing.T) {
cr := new(PerconaServerMySQL)
cr.Spec.Backup = &BackupSpec{
Enabled: true,
Image: "backup-image",
Schedule: []BackupSchedule{
{
Name: "backup-schedule-1",
StorageName: "name",
Schedule: "* * * * *",
},
{
Name: "backup-schedule-1",
StorageName: "name",
Schedule: "* * * * *",
},
},
}
cr.Spec.Backup.Storages = map[string]*BackupStorageSpec{
"name": {},
}

err := cr.CheckNSetDefaults(t.Context(), nil)
assert.EqualError(t, err, "scheduled backups should have different names: backup-schedule-1 name is used by multiple schedules")
})
t.Run("with backup image and volume spec", func(t *testing.T) {
cr := new(PerconaServerMySQL)
cr.Spec.Backup = &BackupSpec{
Image: "backup-image",
Enabled: true,
Image: "backup-image",
}
cr.Spec.MySQL.VolumeSpec = &VolumeSpec{
PersistentVolumeClaim: &corev1.PersistentVolumeClaimSpec{
Expand All @@ -43,6 +80,24 @@ func TestCheckNSetDefaults(t *testing.T) {
},
}

err := cr.CheckNSetDefaults(t.Context(), nil)
assert.NoError(t, err)
})
t.Run("without backup image, with volume spec", func(t *testing.T) {
cr := new(PerconaServerMySQL)
cr.Spec.MySQL.VolumeSpec = &VolumeSpec{
PersistentVolumeClaim: &corev1.PersistentVolumeClaimSpec{
Resources: corev1.VolumeResourceRequirements{
Limits: corev1.ResourceList{
corev1.ResourceStorage: resource.MustParse("1G"),
},
Requests: corev1.ResourceList{
corev1.ResourceStorage: resource.MustParse("1G"),
},
},
},
}

err := cr.CheckNSetDefaults(t.Context(), nil)
assert.NoError(t, err)
})
Expand Down
Loading