Skip to content

Commit 1c9bdc9

Browse files
egeguneseleo007
authored andcommitted
K8SPSMDB-1219: Fix upgrade to v1.20.0 if multiple storages are defined (#1910)
* K8SPSMDB-1219: Fix upgrade to v1.20.0 if multiple storages are defined * fix backups
1 parent db64919 commit 1c9bdc9

File tree

7 files changed

+144
-11
lines changed

7 files changed

+144
-11
lines changed

pkg/apis/psmdb/v1/psmdb_defaults.go

+7
Original file line numberDiff line numberDiff line change
@@ -550,6 +550,13 @@ func (cr *PerconaServerMongoDB) CheckNSetDefaults(ctx context.Context, platform
550550
}
551551
}
552552

553+
if cr.CompareVersion("1.20.0") < 0 && cr.Spec.Backup.PITR.Enabled {
554+
if len(cr.Spec.Backup.Storages) != 1 {
555+
cr.Spec.Backup.PITR.Enabled = false
556+
log.Info("Point-in-time recovery can be enabled only if one bucket is used in spec.backup.storages")
557+
}
558+
}
559+
553560
if cr.CompareVersion("1.20.0") >= 0 && len(cr.Spec.Backup.Storages) > 1 {
554561
main := 0
555562
for _, stg := range cr.Spec.Backup.Storages {

pkg/controller/perconaservermongodb/pbm.go

+71-4
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import (
1212
"github.com/pkg/errors"
1313
"go.mongodb.org/mongo-driver/mongo"
1414
"go.mongodb.org/mongo-driver/x/bsonx/bsoncore"
15+
"k8s.io/apimachinery/pkg/types"
1516
logf "sigs.k8s.io/controller-runtime/pkg/log"
1617

1718
"github.com/percona/percona-backup-mongodb/pbm/config"
@@ -188,6 +189,56 @@ func isResyncNeeded(currentCfg *config.Config, newCfg *config.Config) bool {
188189
return false
189190
}
190191

192+
func (r *ReconcilePerconaServerMongoDB) reconcilePiTRStorageLegacy(
193+
ctx context.Context,
194+
pbm backup.PBM,
195+
cr *psmdbv1.PerconaServerMongoDB,
196+
) error {
197+
log := logf.FromContext(ctx)
198+
199+
if len(cr.Spec.Backup.Storages) != 1 {
200+
log.Info("Expected exactly one storage for PiTR in legacy version", "configured", len(cr.Spec.Backup.Storages))
201+
return nil
202+
}
203+
204+
// if PiTR is enabled user can configure only one storage
205+
var storage psmdbv1.BackupStorageSpec
206+
for name, stg := range cr.Spec.Backup.Storages {
207+
storage = stg
208+
log.Info("Configuring PBM with storage", "storage", name)
209+
break
210+
}
211+
212+
var secretName string
213+
switch storage.Type {
214+
case psmdbv1.BackupStorageS3:
215+
secretName = storage.S3.CredentialsSecret
216+
case psmdbv1.BackupStorageAzure:
217+
secretName = storage.Azure.CredentialsSecret
218+
}
219+
220+
if secretName != "" {
221+
exists, err := secretExists(ctx, r.client, types.NamespacedName{Name: secretName, Namespace: cr.Namespace})
222+
if err != nil {
223+
return errors.Wrap(err, "check storage credentials secret")
224+
}
225+
226+
if !exists {
227+
log.Error(nil, "Storage credentials secret does not exist", "secret", secretName)
228+
return nil
229+
}
230+
}
231+
232+
err := pbm.GetNSetConfigLegacy(ctx, r.client, cr, storage)
233+
if err != nil {
234+
return errors.Wrap(err, "set PBM config")
235+
}
236+
237+
log.Info("Configured PBM storage")
238+
239+
return nil
240+
}
241+
191242
func (r *ReconcilePerconaServerMongoDB) reconcilePiTRConfig(ctx context.Context, cr *psmdbv1.PerconaServerMongoDB) error {
192243
log := logf.FromContext(ctx)
193244

@@ -209,10 +260,17 @@ func (r *ReconcilePerconaServerMongoDB) reconcilePiTRConfig(ctx context.Context,
209260
return nil
210261
}
211262

212-
stgName, _, err := cr.Spec.Backup.MainStorage()
213-
if err != nil {
214-
// no storage found
215-
return nil
263+
var stgName string
264+
for name := range cr.Spec.Backup.Storages {
265+
stgName = name
266+
break
267+
}
268+
if cr.CompareVersion("1.20.0") >= 0 {
269+
stgName, _, err = cr.Spec.Backup.MainStorage()
270+
if err != nil {
271+
// no storage found
272+
return nil
273+
}
216274
}
217275

218276
if cr.Spec.Backup.PITR.Enabled && !cr.Spec.Backup.PITR.OplogOnly {
@@ -236,6 +294,15 @@ func (r *ReconcilePerconaServerMongoDB) reconcilePiTRConfig(ctx context.Context,
236294
defer pbm.Close(ctx)
237295

238296
if err := enablePiTRIfNeeded(ctx, pbm, cr); err != nil {
297+
if backup.IsErrNoDocuments(err) {
298+
if cr.CompareVersion("1.20.0") < 0 {
299+
if err := r.reconcilePiTRStorageLegacy(ctx, pbm, cr); err != nil {
300+
return errors.Wrap(err, "reconcile pitr storage")
301+
}
302+
}
303+
return nil
304+
}
305+
239306
return errors.Wrap(err, "enable pitr if needed")
240307
}
241308

pkg/controller/perconaservermongodbbackup/backup.go

+16-7
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,13 @@ func (b *Backup) Start(ctx context.Context, k8sclient client.Client, cluster *ap
6464
return status, errors.Errorf("unable to get storage '%s'", cr.Spec.StorageName)
6565
}
6666

67+
if cluster.CompareVersion("1.20.0") < 0 {
68+
err := b.pbm.GetNSetConfigLegacy(ctx, k8sclient, cluster, stg)
69+
if err != nil {
70+
return status, errors.Wrapf(err, "set backup config with storage %s", cr.Spec.StorageName)
71+
}
72+
}
73+
6774
name := time.Now().UTC().Format(time.RFC3339)
6875

6976
var compLevel *int
@@ -83,16 +90,18 @@ func (b *Backup) Start(ctx context.Context, k8sclient client.Client, cluster *ap
8390
},
8491
}
8592

86-
mainStgName, _, err := b.spec.MainStorage()
87-
if err != nil {
88-
return status, errors.Wrap(err, "get main storage")
89-
}
93+
if cluster.CompareVersion("1.20.0") >= 0 {
94+
mainStgName, _, err := b.spec.MainStorage()
95+
if err != nil {
96+
return status, errors.Wrap(err, "get main storage")
97+
}
9098

91-
if cr.Spec.StorageName != mainStgName {
92-
cmd.Backup.Profile = cr.Spec.StorageName
99+
if cr.Spec.StorageName != mainStgName {
100+
cmd.Backup.Profile = cr.Spec.StorageName
101+
}
93102
}
94103

95-
log.Info("Sending backup command", "backupCmd", cmd)
104+
log.Info("Sending backup command", "backupCmd", cmd, "profile", cmd.Backup.Profile)
96105

97106
if err := b.pbm.SendCmd(ctx, cmd); err != nil {
98107
return status, err

pkg/controller/perconaservermongodbbackup/perconaservermongodbbackup_controller.go

+17
Original file line numberDiff line numberDiff line change
@@ -460,6 +460,23 @@ func (r *ReconcilePerconaServerMongoDBBackup) deleteBackupFinalizer(ctx context.
460460
return nil
461461
}
462462

463+
if cluster.CompareVersion("1.20.0") < 0 {
464+
err = b.pbm.DeletePITRChunks(ctx, meta.LastWriteTS)
465+
if err != nil {
466+
return errors.Wrap(err, "failed to delete PITR")
467+
}
468+
log.Info("PiTR chunks deleted", "until", meta.LastWriteTS)
469+
470+
err = b.pbm.DeleteBackup(ctx, cr.Status.PBMname)
471+
if err != nil {
472+
return errors.Wrap(err, "failed to delete backup")
473+
}
474+
475+
log.Info("Backup deleted")
476+
477+
return nil
478+
}
479+
463480
mainStgName, _, err := cluster.Spec.Backup.MainStorage()
464481
if err != nil {
465482
return errors.Wrap(err, "get main storage")

pkg/controller/perconaservermongodbrestore/perconaservermongodbrestore_controller.go

+8
Original file line numberDiff line numberDiff line change
@@ -438,6 +438,14 @@ func (r *ReconcilePerconaServerMongoDBRestore) resyncStorage(
438438
return errors.Wrap(err, "get backup")
439439
}
440440

441+
if cluster.CompareVersion("1.20.0") < 0 {
442+
if err := pbmC.ResyncMainStorageAndWait(ctx); err != nil {
443+
return errors.Wrap(err, "start config resync")
444+
}
445+
446+
return nil
447+
}
448+
441449
mainStgName, _, err := cluster.Spec.Backup.MainStorage()
442450
if err != nil {
443451
return errors.Wrap(err, "get main storage")

pkg/psmdb/backup/fake/pbm.go

+4
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,10 @@ func (p *fakePBM) GetNSetConfig(ctx context.Context, k8sclient client.Client, cl
109109
return nil
110110
}
111111

112+
func (p *fakePBM) GetNSetConfigLegacy(ctx context.Context, k8sclient client.Client, cluster *api.PerconaServerMongoDB, stg api.BackupStorageSpec) error {
113+
return nil
114+
}
115+
112116
func (p *fakePBM) SetConfigVar(ctx context.Context, key, val string) error {
113117
return nil
114118
}

pkg/psmdb/backup/pbm.go

+21
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,7 @@ type PBM interface {
8989
GetProfile(ctx context.Context, name string) (*config.Config, error)
9090
RemoveProfile(ctx context.Context, name string) error
9191
GetNSetConfig(ctx context.Context, k8sclient client.Client, cluster *api.PerconaServerMongoDB) error
92+
GetNSetConfigLegacy(ctx context.Context, k8sclient client.Client, cluster *api.PerconaServerMongoDB, stg api.BackupStorageSpec) error
9293
SetConfig(ctx context.Context, cfg *config.Config) error
9394
SetConfigVar(ctx context.Context, key, val string) error
9495

@@ -522,6 +523,26 @@ func (b *pbmC) RemoveProfile(ctx context.Context, name string) error {
522523
return config.RemoveProfile(ctx, b.Client, name)
523524
}
524525

526+
// GetNSetConfigLegacy sets the PBM config with given storage
527+
func (b *pbmC) GetNSetConfigLegacy(ctx context.Context, k8sclient client.Client, cluster *api.PerconaServerMongoDB, stg api.BackupStorageSpec) error {
528+
log := logf.FromContext(ctx)
529+
530+
conf, err := GetPBMConfig(ctx, k8sclient, cluster, stg)
531+
if err != nil {
532+
return errors.Wrap(err, "get PBM config")
533+
}
534+
535+
log.Info("Setting config", "cluster", cluster.Name, "storage", stg)
536+
537+
if err := config.SetConfig(ctx, b.Client, &conf); err != nil {
538+
return errors.Wrap(err, "write config")
539+
}
540+
541+
time.Sleep(11 * time.Second) // give time to init new storage
542+
543+
return nil
544+
}
545+
525546
// GetNSetConfig sets the PBM config with main storage defined in the cluster CR
526547
func (b *pbmC) GetNSetConfig(ctx context.Context, k8sclient client.Client, cluster *api.PerconaServerMongoDB) error {
527548
log := logf.FromContext(ctx)

0 commit comments

Comments
 (0)