in oracle/controllers/instancecontroller/instance_controller_restore.go [379:426]
func (r *InstanceReconciler) findBackupForRestore(ctx context.Context, inst v1alpha1.Instance, namespace string, log logr.Logger) (*v1alpha1.Backup, error) {
var backups v1alpha1.BackupList
var backup v1alpha1.Backup
backupRef := inst.Spec.Restore.BackupRef
if backupRef == nil && inst.Spec.Restore.BackupID == "" && inst.Spec.Restore.PITRRestore == nil {
return nil, fmt.Errorf("preflight check: either BackupID or BackupRef or PITRRestore must be set to perform a restore")
}
if backupRef != nil {
if inst.Spec.Restore.BackupID != "" || inst.Spec.Restore.PITRRestore != nil {
return nil, fmt.Errorf("preflight check: specify only one of BackupID/BackupRef/PITRRestore")
}
// find backup based on BackupRef
if err := r.Get(ctx, types.NamespacedName{Name: backupRef.Name, Namespace: backupRef.Namespace}, &backup); err != nil {
return nil, fmt.Errorf("preflight check: failed to get backup for a restore: %v, backupRef: %v", err, backupRef)
}
} else if inst.Spec.Restore.BackupID != "" {
if inst.Spec.Restore.PITRRestore != nil {
return nil, fmt.Errorf("preflight check: specify only one of BackupID/BackupRef/PITRRestore")
}
if err := r.List(ctx, &backups, client.InNamespace(namespace)); err != nil {
return nil, fmt.Errorf("preflight check: failed to list backups for a restore: %v", err)
}
for _, b := range backups.Items {
if b.Status.BackupID == inst.Spec.Restore.BackupID {
log.Info("requested backup found")
backup = b
}
}
if backup.Spec.Type == "" {
return nil, fmt.Errorf("preflight check: failed to locate the requested backup %q", inst.Spec.Restore.BackupID)
}
} else {
b, err := r.findPITRBackupForRestore(ctx, inst, log)
if err != nil {
return nil, fmt.Errorf("preflight check: failed to locate a backup for PITR restore %v: %v", inst.Spec.Restore.PITRRestore, err)
}
backup = *b
}
if backup.Spec.Type != inst.Spec.Restore.BackupType {
return nil, fmt.Errorf("preflight check: located a backup of type %q, wanted: %q", backup.Spec.Type, inst.Spec.Restore.BackupType)
}
return &backup, nil
}