diff --git a/pkg/exposer/csi_snapshot.go b/pkg/exposer/csi_snapshot.go index 9c984de53..4d452a39e 100644 --- a/pkg/exposer/csi_snapshot.go +++ b/pkg/exposer/csi_snapshot.go @@ -202,7 +202,7 @@ func (e *csiSnapshotExposer) GetExposed(ctx context.Context, ownerObject corev1. }, pod) if err != nil { if apierrors.IsNotFound(err) { - curLog.WithField("backup pod", backupPodName).Errorf("Backup pod is not running in the current node %s", exposeWaitParam.NodeName) + curLog.WithField("backup pod", backupPodName).Debugf("Backup pod is not running in the current node %s", exposeWaitParam.NodeName) return nil, nil } else { return nil, errors.Wrapf(err, "error to get backup pod %s", backupPodName) diff --git a/pkg/exposer/generic_restore.go b/pkg/exposer/generic_restore.go index c5c693a2f..3617c53a8 100644 --- a/pkg/exposer/generic_restore.go +++ b/pkg/exposer/generic_restore.go @@ -123,7 +123,7 @@ func (e *genericRestoreExposer) GetExposed(ctx context.Context, ownerObject core }, pod) if err != nil { if apierrors.IsNotFound(err) { - curLog.WithField("backup pod", restorePodName).Error("Backup pod is not running in the current node") + curLog.WithField("backup pod", restorePodName).Debug("Backup pod is not running in the current node") return nil, nil } else { return nil, errors.Wrapf(err, "error to get backup pod %s", restorePodName) diff --git a/pkg/repository/ensurer.go b/pkg/repository/ensurer.go index 4bdd05fba..885363328 100644 --- a/pkg/repository/ensurer.go +++ b/pkg/repository/ensurer.go @@ -80,20 +80,18 @@ func (r *Ensurer) EnsureRepo(ctx context.Context, namespace, volumeNamespace, ba log.Debug("Released lock") }() - repo, err := GetBackupRepository(ctx, r.repoClient, namespace, backupRepoKey, true) + _, err := GetBackupRepository(ctx, r.repoClient, namespace, backupRepoKey, false) if err == nil { - log.Debug("Ready repository found") - return repo, nil - } + log.Info("Founding existing repo") + return r.waitBackupRepository(ctx, namespace, backupRepoKey) + } else if isBackupRepositoryNotFoundError(err) { + log.Info("No repository found, creating one") - if !isBackupRepositoryNotFoundError(err) { + // no repo found: create one and wait for it to be ready + return r.createBackupRepositoryAndWait(ctx, namespace, backupRepoKey) + } else { return nil, errors.WithStack(err) } - - log.Debug("No repository found, creating one") - - // no repo found: create one and wait for it to be ready - return r.createBackupRepositoryAndWait(ctx, namespace, backupRepoKey) } func (r *Ensurer) repoLock(key BackupRepositoryKey) *sync.Mutex { @@ -113,6 +111,10 @@ func (r *Ensurer) createBackupRepositoryAndWait(ctx context.Context, namespace s return nil, errors.Wrap(err, "unable to create backup repository resource") } + return r.waitBackupRepository(ctx, namespace, backupRepoKey) +} + +func (r *Ensurer) waitBackupRepository(ctx context.Context, namespace string, backupRepoKey BackupRepositoryKey) (*velerov1api.BackupRepository, error) { var repo *velerov1api.BackupRepository checkFunc := func(ctx context.Context) (bool, error) { found, err := GetBackupRepository(ctx, r.repoClient, namespace, backupRepoKey, true) diff --git a/pkg/repository/ensurer_test.go b/pkg/repository/ensurer_test.go index 72dff8a3a..e0d6a0593 100644 --- a/pkg/repository/ensurer_test.go +++ b/pkg/repository/ensurer_test.go @@ -30,13 +30,19 @@ import ( ) func TestEnsureRepo(t *testing.T) { - bkRepoObj := NewBackupRepository(velerov1.DefaultNamespace, BackupRepositoryKey{ + bkRepoObjReady := NewBackupRepository(velerov1.DefaultNamespace, BackupRepositoryKey{ VolumeNamespace: "fake-ns", BackupLocation: "fake-bsl", RepositoryType: "fake-repo-type", }) - bkRepoObj.Status.Phase = velerov1.BackupRepositoryPhaseReady + bkRepoObjReady.Status.Phase = velerov1.BackupRepositoryPhaseReady + + bkRepoObjNotReady := NewBackupRepository(velerov1.DefaultNamespace, BackupRepositoryKey{ + VolumeNamespace: "fake-ns", + BackupLocation: "fake-bsl", + RepositoryType: "fake-repo-type", + }) scheme := runtime.NewScheme() velerov1.AddToScheme(scheme) @@ -82,10 +88,21 @@ func TestEnsureRepo(t *testing.T) { bsl: "fake-bsl", repositoryType: "fake-repo-type", kubeClientObj: []runtime.Object{ - bkRepoObj, + bkRepoObjReady, }, runtimeScheme: scheme, - expectedRepo: bkRepoObj, + expectedRepo: bkRepoObjReady, + }, + { + name: "wait existing repo fail", + namespace: "fake-ns", + bsl: "fake-bsl", + repositoryType: "fake-repo-type", + kubeClientObj: []runtime.Object{ + bkRepoObjNotReady, + }, + runtimeScheme: scheme, + err: "failed to wait BackupRepository: timed out waiting for the condition", }, { name: "create fail",