From 17a8c87168006f7337df956e60a4215c75c80a67 Mon Sep 17 00:00:00 2001 From: ashmrtn Date: Wed, 30 Nov 2022 08:46:32 -0800 Subject: [PATCH] Helper to fetch backups by ID (#1635) ## Description Helper function to fetch backup models by ID. Also renames `Backups` to `BackupsByTag` ## Type of change - [x] :sunflower: Feature - [ ] :bug: Bugfix - [ ] :world_map: Documentation - [ ] :robot: Test - [ ] :computer: CI/Deployment - [ ] :hamster: Trivial/Minor ## Issue(s) * #1505 separated from * #1609 ## Test Plan - [ ] :muscle: Manual - [x] :zap: Unit test - [ ] :green_heart: E2E --- src/cli/backup/exchange.go | 2 +- src/cli/backup/onedrive.go | 2 +- src/cli/backup/sharepoint.go | 2 +- src/cli/utils/testdata/opts.go | 9 +++++++- src/pkg/repository/repository.go | 27 ++++++++++++++++++++-- src/pkg/repository/repository_load_test.go | 2 +- 6 files changed, 37 insertions(+), 7 deletions(-) diff --git a/src/cli/backup/exchange.go b/src/cli/backup/exchange.go index 6f4892e4d..aca5a3d4b 100644 --- a/src/cli/backup/exchange.go +++ b/src/cli/backup/exchange.go @@ -373,7 +373,7 @@ func listExchangeCmd(cmd *cobra.Command, args []string) error { return nil } - bs, err := r.Backups(ctx, store.Service(path.ExchangeService)) + bs, err := r.BackupsByTag(ctx, store.Service(path.ExchangeService)) if err != nil { return Only(ctx, errors.Wrap(err, "Failed to list backups in the repository")) } diff --git a/src/cli/backup/onedrive.go b/src/cli/backup/onedrive.go index 2a6b8e1f2..f5af193da 100644 --- a/src/cli/backup/onedrive.go +++ b/src/cli/backup/onedrive.go @@ -272,7 +272,7 @@ func listOneDriveCmd(cmd *cobra.Command, args []string) error { return nil } - bs, err := r.Backups(ctx, store.Service(path.OneDriveService)) + bs, err := r.BackupsByTag(ctx, store.Service(path.OneDriveService)) if err != nil { return Only(ctx, errors.Wrap(err, "Failed to list backups in the repository")) } diff --git a/src/cli/backup/sharepoint.go b/src/cli/backup/sharepoint.go index c8a638968..a379c21c5 100644 --- a/src/cli/backup/sharepoint.go +++ b/src/cli/backup/sharepoint.go @@ -261,7 +261,7 @@ func listSharePointCmd(cmd *cobra.Command, args []string) error { return nil } - bs, err := r.Backups(ctx, store.Service(path.SharePointService)) + bs, err := r.BackupsByTag(ctx, store.Service(path.SharePointService)) if err != nil { return Only(ctx, errors.Wrap(err, "Failed to list backups in the repository")) } diff --git a/src/cli/utils/testdata/opts.go b/src/cli/utils/testdata/opts.go index 2fdab60b6..68e130555 100644 --- a/src/cli/utils/testdata/opts.go +++ b/src/cli/utils/testdata/opts.go @@ -496,7 +496,14 @@ func (MockBackupGetter) Backup( return nil, errors.New("unexpected call to mock") } -func (MockBackupGetter) Backups(context.Context, ...store.FilterOption) ([]*backup.Backup, error) { +func (MockBackupGetter) Backups(context.Context, []model.StableID) ([]*backup.Backup, error) { + return nil, errors.New("unexpected call to mock") +} + +func (MockBackupGetter) BackupsByTag( + context.Context, + ...store.FilterOption, +) ([]*backup.Backup, error) { return nil, errors.New("unexpected call to mock") } diff --git a/src/pkg/repository/repository.go b/src/pkg/repository/repository.go index ce562f363..afad05219 100644 --- a/src/pkg/repository/repository.go +++ b/src/pkg/repository/repository.go @@ -6,6 +6,7 @@ import ( "time" "github.com/google/uuid" + "github.com/hashicorp/go-multierror" "github.com/alcionai/corso/src/internal/events" "github.com/alcionai/corso/src/internal/kopia" @@ -28,7 +29,8 @@ var ErrorRepoAlreadyExists = errors.New("a repository was already initialized wi // repository. type BackupGetter interface { Backup(ctx context.Context, id model.StableID) (*backup.Backup, error) - Backups(ctx context.Context, fs ...store.FilterOption) ([]*backup.Backup, error) + Backups(ctx context.Context, ids []model.StableID) ([]*backup.Backup, error) + BackupsByTag(ctx context.Context, fs ...store.FilterOption) ([]*backup.Backup, error) BackupDetails( ctx context.Context, backupID string, @@ -238,8 +240,29 @@ func (r repository) Backup(ctx context.Context, id model.StableID) (*backup.Back return sw.GetBackup(ctx, id) } +// BackupsByID lists backups by ID. Returns as many backups as possible with +// errors for the backups it was unable to retrieve. +func (r repository) Backups(ctx context.Context, ids []model.StableID) ([]*backup.Backup, error) { + var ( + errs *multierror.Error + bups []*backup.Backup + sw = store.NewKopiaStore(r.modelStore) + ) + + for _, id := range ids { + b, err := sw.GetBackup(ctx, id) + if err != nil { + errs = multierror.Append(errs, err) + } + + bups = append(bups, b) + } + + return bups, errs.ErrorOrNil() +} + // backups lists backups in a repository -func (r repository) Backups(ctx context.Context, fs ...store.FilterOption) ([]*backup.Backup, error) { +func (r repository) BackupsByTag(ctx context.Context, fs ...store.FilterOption) ([]*backup.Backup, error) { sw := store.NewKopiaStore(r.modelStore) return sw.GetBackups(ctx, fs...) } diff --git a/src/pkg/repository/repository_load_test.go b/src/pkg/repository/repository_load_test.go index 0a3c490b7..f2864f2ef 100644 --- a/src/pkg/repository/repository_load_test.go +++ b/src/pkg/repository/repository_load_test.go @@ -181,7 +181,7 @@ func runBackupListLoadTest( ) pprof.Do(ctx, labels, func(ctx context.Context) { - bs, err = r.Backups(ctx) + bs, err = r.BackupsByTag(ctx) }) require.NoError(t, err, "retrieving backups")