func()

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
}