@@ -12,6 +12,7 @@ import (
12
12
"github.com/pkg/errors"
13
13
"go.mongodb.org/mongo-driver/mongo"
14
14
"go.mongodb.org/mongo-driver/x/bsonx/bsoncore"
15
+ "k8s.io/apimachinery/pkg/types"
15
16
logf "sigs.k8s.io/controller-runtime/pkg/log"
16
17
17
18
"github.com/percona/percona-backup-mongodb/pbm/config"
@@ -188,6 +189,56 @@ func isResyncNeeded(currentCfg *config.Config, newCfg *config.Config) bool {
188
189
return false
189
190
}
190
191
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
+
191
242
func (r * ReconcilePerconaServerMongoDB ) reconcilePiTRConfig (ctx context.Context , cr * psmdbv1.PerconaServerMongoDB ) error {
192
243
log := logf .FromContext (ctx )
193
244
@@ -209,10 +260,17 @@ func (r *ReconcilePerconaServerMongoDB) reconcilePiTRConfig(ctx context.Context,
209
260
return nil
210
261
}
211
262
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
+ }
216
274
}
217
275
218
276
if cr .Spec .Backup .PITR .Enabled && ! cr .Spec .Backup .PITR .OplogOnly {
@@ -236,6 +294,15 @@ func (r *ReconcilePerconaServerMongoDB) reconcilePiTRConfig(ctx context.Context,
236
294
defer pbm .Close (ctx )
237
295
238
296
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
+
239
306
return errors .Wrap (err , "enable pitr if needed" )
240
307
}
241
308
0 commit comments