From 960e8b79a0f2bb76bb23053a3c5affb0848a6bbd Mon Sep 17 00:00:00 2001 From: Keepers Date: Mon, 12 Jun 2023 17:33:22 -0600 Subject: [PATCH] cetnralize restoreConfig (#3563) centralizes all restore configuration management within a restoreConfig struct. This struct is owned by the control package, which allows it to be utilized by both CLI and SDK consumers. --- #### Does this PR need a docs update or release note? - [x] :no_entry: No #### Type of change - [x] :broom: Tech Debt/Cleanup #### Issue(s) * #3562 #### Test Plan - [x] :zap: Unit test - [x] :green_heart: E2E --- src/cli/restore/exchange.go | 6 +- src/cli/restore/onedrive.go | 6 +- src/cli/restore/sharepoint.go | 6 +- src/cmd/factory/impl/common.go | 16 ++-- src/internal/connector/data_collections.go | 8 +- .../exchange/contacts_restore_test.go | 2 +- .../connector/exchange/events_restore_test.go | 2 +- .../connector/exchange/mail_restore_test.go | 2 +- .../connector/exchange/restore_test.go | 32 ++++---- .../exchange/service_iterators_test.go | 2 +- .../connector/exchange/service_restore.go | 6 +- .../connector/graph_connector_helper_test.go | 2 +- .../graph_connector_onedrive_test_helper.go | 2 +- .../connector/graph_connector_test.go | 36 ++++----- .../connector/graph_connector_test_helper.go | 12 +-- src/internal/connector/mock/connector.go | 2 +- src/internal/connector/onedrive/item_test.go | 2 +- src/internal/connector/onedrive/restore.go | 10 +-- .../connector/onedrive/url_cache_test.go | 2 +- .../connector/sharepoint/api/pages_test.go | 2 +- .../connector/sharepoint/collection_test.go | 2 +- src/internal/connector/sharepoint/restore.go | 12 +-- .../operations/backup_integration_test.go | 10 +-- src/internal/operations/inject/inject.go | 2 +- src/internal/operations/restore.go | 34 ++++---- src/internal/operations/restore_test.go | 46 +++++------ src/internal/tester/restore_destination.go | 10 +-- src/pkg/control/collisionpolicy_string.go | 26 ------ src/pkg/control/options.go | 79 ++++++++++--------- .../loadtest/repository_load_test.go | 4 +- src/pkg/repository/repository.go | 6 +- src/pkg/repository/repository_test.go | 4 +- 32 files changed, 186 insertions(+), 207 deletions(-) delete mode 100644 src/pkg/control/collisionpolicy_string.go diff --git a/src/cli/restore/exchange.go b/src/cli/restore/exchange.go index 3ad22fbb2..f4390ef4c 100644 --- a/src/cli/restore/exchange.go +++ b/src/cli/restore/exchange.go @@ -96,13 +96,13 @@ func restoreExchangeCmd(cmd *cobra.Command, args []string) error { defer utils.CloseRepo(ctx, r) - dest := control.DefaultRestoreDestination(dttm.HumanReadable) - Infof(ctx, "Restoring to folder %s", dest.ContainerName) + restoreCfg := control.DefaultRestoreConfig(dttm.HumanReadable) + Infof(ctx, "Restoring to folder %s", restoreCfg.Location) sel := utils.IncludeExchangeRestoreDataSelectors(opts) utils.FilterExchangeRestoreInfoSelectors(sel, opts) - ro, err := r.NewRestore(ctx, utils.BackupIDFV, sel.Selector, dest) + ro, err := r.NewRestore(ctx, utils.BackupIDFV, sel.Selector, restoreCfg) if err != nil { return Only(ctx, clues.Wrap(err, "Failed to initialize Exchange restore")) } diff --git a/src/cli/restore/onedrive.go b/src/cli/restore/onedrive.go index 90caf57df..008ac18fd 100644 --- a/src/cli/restore/onedrive.go +++ b/src/cli/restore/onedrive.go @@ -97,13 +97,13 @@ func restoreOneDriveCmd(cmd *cobra.Command, args []string) error { defer utils.CloseRepo(ctx, r) - dest := control.DefaultRestoreDestination(dttm.HumanReadableDriveItem) - Infof(ctx, "Restoring to folder %s", dest.ContainerName) + restoreCfg := control.DefaultRestoreConfig(dttm.HumanReadableDriveItem) + Infof(ctx, "Restoring to folder %s", restoreCfg.Location) sel := utils.IncludeOneDriveRestoreDataSelectors(opts) utils.FilterOneDriveRestoreInfoSelectors(sel, opts) - ro, err := r.NewRestore(ctx, utils.BackupIDFV, sel.Selector, dest) + ro, err := r.NewRestore(ctx, utils.BackupIDFV, sel.Selector, restoreCfg) if err != nil { return Only(ctx, clues.Wrap(err, "Failed to initialize OneDrive restore")) } diff --git a/src/cli/restore/sharepoint.go b/src/cli/restore/sharepoint.go index 332805d8d..c9b47b6bc 100644 --- a/src/cli/restore/sharepoint.go +++ b/src/cli/restore/sharepoint.go @@ -102,13 +102,13 @@ func restoreSharePointCmd(cmd *cobra.Command, args []string) error { defer utils.CloseRepo(ctx, r) - dest := control.DefaultRestoreDestination(dttm.HumanReadableDriveItem) - Infof(ctx, "Restoring to folder %s", dest.ContainerName) + restoreCfg := control.DefaultRestoreConfig(dttm.HumanReadableDriveItem) + Infof(ctx, "Restoring to folder %s", restoreCfg.Location) sel := utils.IncludeSharePointRestoreDataSelectors(ctx, opts) utils.FilterSharePointRestoreInfoSelectors(sel, opts) - ro, err := r.NewRestore(ctx, utils.BackupIDFV, sel.Selector, dest) + ro, err := r.NewRestore(ctx, utils.BackupIDFV, sel.Selector, restoreCfg) if err != nil { return Only(ctx, clues.Wrap(err, "Failed to initialize SharePoint restore")) } diff --git a/src/cmd/factory/impl/common.go b/src/cmd/factory/impl/common.go index 15c00f672..d2ccb76f5 100644 --- a/src/cmd/factory/impl/common.go +++ b/src/cmd/factory/impl/common.go @@ -83,9 +83,9 @@ func generateAndRestoreItems( items: items, }} - dest := control.DefaultRestoreDestination(dttm.SafeForTesting) - dest.ContainerName = destFldr - print.Infof(ctx, "Restoring to folder %s", dest.ContainerName) + dest := control.DefaultRestoreConfig(dttm.SafeForTesting) + dest.Location = destFldr + print.Infof(ctx, "Restoring to folder %s", dest.Location) dataColls, err := buildCollections( service, @@ -163,7 +163,7 @@ type collection struct { func buildCollections( service path.ServiceType, tenant, user string, - dest control.RestoreDestination, + dest control.RestoreConfig, colls []collection, ) ([]data.RestoreCollection, error) { collections := make([]data.RestoreCollection, 0, len(colls)) @@ -224,9 +224,9 @@ func generateAndRestoreDriveItems( ctx, flush := tester.NewContext(nil) defer flush() - dest := control.DefaultRestoreDestination(dttm.SafeForTesting) - dest.ContainerName = destFldr - print.Infof(ctx, "Restoring to folder %s", dest.ContainerName) + dest := control.DefaultRestoreConfig(dttm.SafeForTesting) + dest.Location = destFldr + print.Infof(ctx, "Restoring to folder %s", dest.Location) var driveID string @@ -394,7 +394,7 @@ func generateAndRestoreDriveItems( Service: service, Tenant: tenantID, ResourceOwners: []string{resourceOwner}, - Dest: tester.DefaultTestRestoreDestination(""), + RestoreCfg: tester.DefaultTestRestoreConfig(""), } _, _, collections, _, err := connector.GetCollectionsAndExpected( diff --git a/src/internal/connector/data_collections.go b/src/internal/connector/data_collections.go index 6e3c65d95..0d836820e 100644 --- a/src/internal/connector/data_collections.go +++ b/src/internal/connector/data_collections.go @@ -233,7 +233,7 @@ func (gc *GraphConnector) ConsumeRestoreCollections( ctx context.Context, backupVersion int, sels selectors.Selector, - dest control.RestoreDestination, + restoreCfg control.RestoreConfig, opts control.Options, dcs []data.RestoreCollection, errs *fault.Bus, @@ -251,13 +251,13 @@ func (gc *GraphConnector) ConsumeRestoreCollections( switch sels.Service { case selectors.ServiceExchange: - status, err = exchange.RestoreCollections(ctx, gc.AC, dest, dcs, deets, errs) + status, err = exchange.RestoreCollections(ctx, gc.AC, restoreCfg, dcs, deets, errs) case selectors.ServiceOneDrive: status, err = onedrive.RestoreCollections( ctx, onedrive.NewRestoreHandler(gc.AC), backupVersion, - dest, + restoreCfg, opts, dcs, deets, @@ -267,7 +267,7 @@ func (gc *GraphConnector) ConsumeRestoreCollections( ctx, backupVersion, gc.AC, - dest, + restoreCfg, opts, dcs, deets, diff --git a/src/internal/connector/exchange/contacts_restore_test.go b/src/internal/connector/exchange/contacts_restore_test.go index d33e9fb61..2eff0d6a6 100644 --- a/src/internal/connector/exchange/contacts_restore_test.go +++ b/src/internal/connector/exchange/contacts_restore_test.go @@ -51,7 +51,7 @@ func (suite *ContactsRestoreIntgSuite) TestCreateContainerDestination() { path.EmailCategory, suite.creds.AzureTenantID, suite.userID, - tester.DefaultTestRestoreDestination("").ContainerName, + tester.DefaultTestRestoreConfig("").Location, []string{"Hufflepuff"}, []string{"Ravenclaw"}) } diff --git a/src/internal/connector/exchange/events_restore_test.go b/src/internal/connector/exchange/events_restore_test.go index 2060bf21a..dcce8c5f3 100644 --- a/src/internal/connector/exchange/events_restore_test.go +++ b/src/internal/connector/exchange/events_restore_test.go @@ -51,7 +51,7 @@ func (suite *EventsRestoreIntgSuite) TestCreateContainerDestination() { path.EmailCategory, suite.creds.AzureTenantID, suite.userID, - tester.DefaultTestRestoreDestination("").ContainerName, + tester.DefaultTestRestoreConfig("").Location, []string{"Durmstrang"}, []string{"Beauxbatons"}) } diff --git a/src/internal/connector/exchange/mail_restore_test.go b/src/internal/connector/exchange/mail_restore_test.go index 8edcedd4c..74ac9e87a 100644 --- a/src/internal/connector/exchange/mail_restore_test.go +++ b/src/internal/connector/exchange/mail_restore_test.go @@ -51,7 +51,7 @@ func (suite *MailRestoreIntgSuite) TestCreateContainerDestination() { path.EmailCategory, suite.creds.AzureTenantID, suite.userID, - tester.DefaultTestRestoreDestination("").ContainerName, + tester.DefaultTestRestoreConfig("").Location, []string{"Griffindor", "Croix"}, []string{"Griffindor", "Felicius"}) } diff --git a/src/internal/connector/exchange/restore_test.go b/src/internal/connector/exchange/restore_test.go index 5b77733ce..eb308f2dc 100644 --- a/src/internal/connector/exchange/restore_test.go +++ b/src/internal/connector/exchange/restore_test.go @@ -54,7 +54,7 @@ func (suite *RestoreIntgSuite) TestRestoreContact() { var ( userID = tester.M365UserID(t) - folderName = tester.DefaultTestRestoreDestination("contact").ContainerName + folderName = tester.DefaultTestRestoreConfig("contact").Location handler = newContactRestoreHandler(suite.ac) ) @@ -88,7 +88,7 @@ func (suite *RestoreIntgSuite) TestRestoreEvent() { var ( userID = tester.M365UserID(t) - subject = tester.DefaultTestRestoreDestination("event").ContainerName + subject = tester.DefaultTestRestoreConfig("event").Location handler = newEventRestoreHandler(suite.ac) ) @@ -154,7 +154,7 @@ func (suite *RestoreIntgSuite) TestRestoreExchangeObject() { bytes: exchMock.MessageBytes("Restore Exchange Object"), category: path.EmailCategory, destination: func(t *testing.T, ctx context.Context) string { - folderName := tester.DefaultTestRestoreDestination("mailobj").ContainerName + folderName := tester.DefaultTestRestoreConfig("mailobj").Location folder, err := handlers[path.EmailCategory]. CreateContainer(ctx, userID, folderName, "") require.NoError(t, err, clues.ToCore(err)) @@ -167,7 +167,7 @@ func (suite *RestoreIntgSuite) TestRestoreExchangeObject() { bytes: exchMock.MessageWithDirectAttachment("Restore 1 Attachment"), category: path.EmailCategory, destination: func(t *testing.T, ctx context.Context) string { - folderName := tester.DefaultTestRestoreDestination("mailwattch").ContainerName + folderName := tester.DefaultTestRestoreConfig("mailwattch").Location folder, err := handlers[path.EmailCategory]. CreateContainer(ctx, userID, folderName, "") require.NoError(t, err, clues.ToCore(err)) @@ -180,7 +180,7 @@ func (suite *RestoreIntgSuite) TestRestoreExchangeObject() { bytes: exchMock.MessageWithItemAttachmentEvent("Event Item Attachment"), category: path.EmailCategory, destination: func(t *testing.T, ctx context.Context) string { - folderName := tester.DefaultTestRestoreDestination("eventwattch").ContainerName + folderName := tester.DefaultTestRestoreConfig("eventwattch").Location folder, err := handlers[path.EmailCategory]. CreateContainer(ctx, userID, folderName, "") require.NoError(t, err, clues.ToCore(err)) @@ -193,7 +193,7 @@ func (suite *RestoreIntgSuite) TestRestoreExchangeObject() { bytes: exchMock.MessageWithItemAttachmentMail("Mail Item Attachment"), category: path.EmailCategory, destination: func(t *testing.T, ctx context.Context) string { - folderName := tester.DefaultTestRestoreDestination("mailitemattch").ContainerName + folderName := tester.DefaultTestRestoreConfig("mailitemattch").Location folder, err := handlers[path.EmailCategory]. CreateContainer(ctx, userID, folderName, "") require.NoError(t, err, clues.ToCore(err)) @@ -209,7 +209,7 @@ func (suite *RestoreIntgSuite) TestRestoreExchangeObject() { ), category: path.EmailCategory, destination: func(t *testing.T, ctx context.Context) string { - folderName := tester.DefaultTestRestoreDestination("mailbasicattch").ContainerName + folderName := tester.DefaultTestRestoreConfig("mailbasicattch").Location folder, err := handlers[path.EmailCategory]. CreateContainer(ctx, userID, folderName, "") require.NoError(t, err, clues.ToCore(err)) @@ -225,7 +225,7 @@ func (suite *RestoreIntgSuite) TestRestoreExchangeObject() { ), category: path.EmailCategory, destination: func(t *testing.T, ctx context.Context) string { - folderName := tester.DefaultTestRestoreDestination("mailnestattch").ContainerName + folderName := tester.DefaultTestRestoreConfig("mailnestattch").Location folder, err := handlers[path.EmailCategory]. CreateContainer(ctx, userID, folderName, "") require.NoError(t, err, clues.ToCore(err)) @@ -241,7 +241,7 @@ func (suite *RestoreIntgSuite) TestRestoreExchangeObject() { ), category: path.EmailCategory, destination: func(t *testing.T, ctx context.Context) string { - folderName := tester.DefaultTestRestoreDestination("mailcontactattch").ContainerName + folderName := tester.DefaultTestRestoreConfig("mailcontactattch").Location folder, err := handlers[path.EmailCategory]. CreateContainer(ctx, userID, folderName, "") require.NoError(t, err, clues.ToCore(err)) @@ -254,7 +254,7 @@ func (suite *RestoreIntgSuite) TestRestoreExchangeObject() { bytes: exchMock.MessageWithNestedItemAttachmentEvent("Nested Item Attachment"), category: path.EmailCategory, destination: func(t *testing.T, ctx context.Context) string { - folderName := tester.DefaultTestRestoreDestination("nestedattch").ContainerName + folderName := tester.DefaultTestRestoreConfig("nestedattch").Location folder, err := handlers[path.EmailCategory]. CreateContainer(ctx, userID, folderName, "") require.NoError(t, err, clues.ToCore(err)) @@ -267,7 +267,7 @@ func (suite *RestoreIntgSuite) TestRestoreExchangeObject() { bytes: exchMock.MessageWithLargeAttachment("Restore Large Attachment"), category: path.EmailCategory, destination: func(t *testing.T, ctx context.Context) string { - folderName := tester.DefaultTestRestoreDestination("maillargeattch").ContainerName + folderName := tester.DefaultTestRestoreConfig("maillargeattch").Location folder, err := handlers[path.EmailCategory]. CreateContainer(ctx, userID, folderName, "") require.NoError(t, err, clues.ToCore(err)) @@ -280,7 +280,7 @@ func (suite *RestoreIntgSuite) TestRestoreExchangeObject() { bytes: exchMock.MessageWithTwoAttachments("Restore 2 Attachments"), category: path.EmailCategory, destination: func(t *testing.T, ctx context.Context) string { - folderName := tester.DefaultTestRestoreDestination("mailtwoattch").ContainerName + folderName := tester.DefaultTestRestoreConfig("mailtwoattch").Location folder, err := handlers[path.EmailCategory]. CreateContainer(ctx, userID, folderName, "") require.NoError(t, err, clues.ToCore(err)) @@ -293,7 +293,7 @@ func (suite *RestoreIntgSuite) TestRestoreExchangeObject() { bytes: exchMock.MessageWithOneDriveAttachment("Restore Reference(OneDrive) Attachment"), category: path.EmailCategory, destination: func(t *testing.T, ctx context.Context) string { - folderName := tester.DefaultTestRestoreDestination("mailrefattch").ContainerName + folderName := tester.DefaultTestRestoreConfig("mailrefattch").Location folder, err := handlers[path.EmailCategory]. CreateContainer(ctx, userID, folderName, "") require.NoError(t, err, clues.ToCore(err)) @@ -306,7 +306,7 @@ func (suite *RestoreIntgSuite) TestRestoreExchangeObject() { bytes: exchMock.ContactBytes("Test_Omega"), category: path.ContactsCategory, destination: func(t *testing.T, ctx context.Context) string { - folderName := tester.DefaultTestRestoreDestination("contact").ContainerName + folderName := tester.DefaultTestRestoreConfig("contact").Location folder, err := handlers[path.ContactsCategory]. CreateContainer(ctx, userID, folderName, "") require.NoError(t, err, clues.ToCore(err)) @@ -319,7 +319,7 @@ func (suite *RestoreIntgSuite) TestRestoreExchangeObject() { bytes: exchMock.EventBytes("Restored Event Object"), category: path.EventsCategory, destination: func(t *testing.T, ctx context.Context) string { - folderName := tester.DefaultTestRestoreDestination("event").ContainerName + folderName := tester.DefaultTestRestoreConfig("event").Location calendar, err := handlers[path.EventsCategory]. CreateContainer(ctx, userID, folderName, "") require.NoError(t, err, clues.ToCore(err)) @@ -332,7 +332,7 @@ func (suite *RestoreIntgSuite) TestRestoreExchangeObject() { bytes: exchMock.EventWithAttachment("Restored Event Attachment"), category: path.EventsCategory, destination: func(t *testing.T, ctx context.Context) string { - folderName := tester.DefaultTestRestoreDestination("eventobj").ContainerName + folderName := tester.DefaultTestRestoreConfig("eventobj").Location calendar, err := handlers[path.EventsCategory]. CreateContainer(ctx, userID, folderName, "") require.NoError(t, err, clues.ToCore(err)) diff --git a/src/internal/connector/exchange/service_iterators_test.go b/src/internal/connector/exchange/service_iterators_test.go index ce56eb0b8..102031ffe 100644 --- a/src/internal/connector/exchange/service_iterators_test.go +++ b/src/internal/connector/exchange/service_iterators_test.go @@ -190,7 +190,7 @@ func (suite *ServiceIteratorsSuite) TestFilterContainersAndFillCollections() { getter mockGetter resolver graph.ContainerResolver scope selectors.ExchangeScope - failFast control.FailureBehavior + failFast control.FailurePolicy expectErr assert.ErrorAssertionFunc expectNewColls int expectMetadataColls int diff --git a/src/internal/connector/exchange/service_restore.go b/src/internal/connector/exchange/service_restore.go index a44edf26b..b55c2c318 100644 --- a/src/internal/connector/exchange/service_restore.go +++ b/src/internal/connector/exchange/service_restore.go @@ -27,7 +27,7 @@ import ( func RestoreCollections( ctx context.Context, ac api.Client, - dest control.RestoreDestination, + restoreCfg control.RestoreConfig, dcs []data.RestoreCollection, deets *details.Builder, errs *fault.Bus, @@ -76,7 +76,7 @@ func RestoreCollections( containerID, gcr, err := createDestination( ictx, handler, - handler.formatRestoreDestination(dest.ContainerName, dc.FullPath()), + handler.formatRestoreDestination(restoreCfg.Location, dc.FullPath()), userID, directoryCache[category], isNewCache, @@ -116,7 +116,7 @@ func RestoreCollections( support.Restore, len(dcs), metrics, - dest.ContainerName) + restoreCfg.Location) return status, el.Failure() } diff --git a/src/internal/connector/graph_connector_helper_test.go b/src/internal/connector/graph_connector_helper_test.go index b5907497b..5a80c1cda 100644 --- a/src/internal/connector/graph_connector_helper_test.go +++ b/src/internal/connector/graph_connector_helper_test.go @@ -936,7 +936,7 @@ func checkCollections( category = returned.FullPath().Category() expectedColData = expected[returned.FullPath().String()] folders = returned.FullPath().Elements() - rootDir = folders[len(folders)-1] == config.Dest.ContainerName + rootDir = folders[len(folders)-1] == config.RestoreCfg.Location ) // Need to iterate through all items even if we don't expect to find a match diff --git a/src/internal/connector/graph_connector_onedrive_test_helper.go b/src/internal/connector/graph_connector_onedrive_test_helper.go index 38b760b1a..b70543019 100644 --- a/src/internal/connector/graph_connector_onedrive_test_helper.go +++ b/src/internal/connector/graph_connector_onedrive_test_helper.go @@ -339,7 +339,7 @@ func GetCollectionsAndExpected( config.Service, config.Tenant, owner, - config.Dest, + config.RestoreCfg, testCollections, backupVersion, ) diff --git a/src/internal/connector/graph_connector_test.go b/src/internal/connector/graph_connector_test.go index f5f966287..ccc9e25e7 100644 --- a/src/internal/connector/graph_connector_test.go +++ b/src/internal/connector/graph_connector_test.go @@ -293,8 +293,8 @@ func (suite *GraphConnectorIntegrationSuite) TestRestoreFailsBadService() { defer flush() var ( - dest = tester.DefaultTestRestoreDestination("") - sel = selectors.Selector{ + restoreCfg = tester.DefaultTestRestoreConfig("") + sel = selectors.Selector{ Service: selectors.ServiceUnknown, } ) @@ -303,7 +303,7 @@ func (suite *GraphConnectorIntegrationSuite) TestRestoreFailsBadService() { ctx, version.Backup, sel, - dest, + restoreCfg, control.Options{ RestorePermissions: true, ToggleFeatures: control.Toggles{}, @@ -320,7 +320,7 @@ func (suite *GraphConnectorIntegrationSuite) TestRestoreFailsBadService() { } func (suite *GraphConnectorIntegrationSuite) TestEmptyCollections() { - dest := tester.DefaultTestRestoreDestination("") + restoreCfg := tester.DefaultTestRestoreConfig("") table := []struct { name string col []data.RestoreCollection @@ -381,7 +381,7 @@ func (suite *GraphConnectorIntegrationSuite) TestEmptyCollections() { ctx, version.Backup, test.sel, - dest, + restoreCfg, control.Options{ RestorePermissions: true, ToggleFeatures: control.Toggles{}, @@ -413,7 +413,7 @@ func runRestore( ) { t.Logf( "Restoring collections to %s for resourceOwners(s) %v\n", - config.Dest.ContainerName, + config.RestoreCfg.Location, config.ResourceOwners) start := time.Now() @@ -424,7 +424,7 @@ func runRestore( ctx, backupVersion, restoreSel, - config.Dest, + config.RestoreCfg, config.Opts, collections, fault.New(true)) @@ -472,7 +472,7 @@ func runBackupAndCompare( for _, ro := range config.ResourceOwners { expectedDests = append(expectedDests, destAndCats{ resourceOwner: ro, - dest: config.Dest.ContainerName, + dest: config.RestoreCfg.Location, cats: cats, }) @@ -536,7 +536,7 @@ func runRestoreBackupTest( Service: test.service, Tenant: tenant, ResourceOwners: resourceOwners, - Dest: tester.DefaultTestRestoreDestination(""), + RestoreCfg: tester.DefaultTestRestoreConfig(""), } totalItems, totalKopiaItems, collections, expectedData, err := GetCollectionsAndExpected( @@ -581,7 +581,7 @@ func runRestoreTestWithVersion( Service: test.service, Tenant: tenant, ResourceOwners: resourceOwners, - Dest: tester.DefaultTestRestoreDestination(""), + RestoreCfg: tester.DefaultTestRestoreConfig(""), } totalItems, _, collections, _, err := GetCollectionsAndExpected( @@ -618,7 +618,7 @@ func runRestoreBackupTestVersions( Service: test.service, Tenant: tenant, ResourceOwners: resourceOwners, - Dest: tester.DefaultTestRestoreDestination(""), + RestoreCfg: tester.DefaultTestRestoreConfig(""), } totalItems, _, collections, _, err := GetCollectionsAndExpected( @@ -993,11 +993,11 @@ func (suite *GraphConnectorIntegrationSuite) TestMultiFolderBackupDifferentNames allExpectedData := map[string]map[string][]byte{} for i, collection := range test.collections { - // Get a dest per collection so they're independent. - dest := tester.DefaultTestRestoreDestination("") + // Get a restoreCfg per collection so they're independent. + restoreCfg := tester.DefaultTestRestoreConfig("") expectedDests = append(expectedDests, destAndCats{ resourceOwner: suite.user, - dest: dest.ContainerName, + dest: restoreCfg.Location, cats: map[path.CategoryType]struct{}{ collection.Category: {}, }, @@ -1007,7 +1007,7 @@ func (suite *GraphConnectorIntegrationSuite) TestMultiFolderBackupDifferentNames test.service, suite.connector.tenant, suite.user, - dest, + restoreCfg, []ColInfo{collection}, version.Backup, ) @@ -1023,7 +1023,7 @@ func (suite *GraphConnectorIntegrationSuite) TestMultiFolderBackupDifferentNames "Restoring %v/%v collections to %s\n", i+1, len(test.collections), - dest.ContainerName, + restoreCfg.Location, ) restoreGC := loadConnector(ctx, t, test.resource) @@ -1031,7 +1031,7 @@ func (suite *GraphConnectorIntegrationSuite) TestMultiFolderBackupDifferentNames ctx, version.Backup, restoreSel, - dest, + restoreCfg, control.Options{ RestorePermissions: true, ToggleFeatures: control.Toggles{}, @@ -1081,7 +1081,7 @@ func (suite *GraphConnectorIntegrationSuite) TestMultiFolderBackupDifferentNames ci := ConfigInfo{ Opts: control.Options{RestorePermissions: true}, // Alright to be empty, needed for OneDrive. - Dest: control.RestoreDestination{}, + RestoreCfg: control.RestoreConfig{}, } // Pull the data prior to waiting for the status as otherwise it will diff --git a/src/internal/connector/graph_connector_test_helper.go b/src/internal/connector/graph_connector_test_helper.go index ef6c11201..8ea552190 100644 --- a/src/internal/connector/graph_connector_test_helper.go +++ b/src/internal/connector/graph_connector_test_helper.go @@ -43,7 +43,7 @@ type ConfigInfo struct { Service path.ServiceType Tenant string ResourceOwners []string - Dest control.RestoreDestination + RestoreCfg control.RestoreConfig } func mustToDataLayerPath( @@ -66,15 +66,15 @@ func mustToDataLayerPath( // combination of the location the data was recently restored to and where the // data was originally in the hierarchy. func backupOutputPathFromRestore( - restoreDest control.RestoreDestination, + restoreCfg control.RestoreConfig, inputPath path.Path, ) (path.Path, error) { - base := []string{restoreDest.ContainerName} + base := []string{restoreCfg.Location} // OneDrive has leading information like the drive ID. if inputPath.Service() == path.OneDriveService || inputPath.Service() == path.SharePointService { folders := inputPath.Folders() - base = append(append([]string{}, folders[:3]...), restoreDest.ContainerName) + base = append(append([]string{}, folders[:3]...), restoreCfg.Location) if len(folders) > 3 { base = append(base, folders[3:]...) @@ -117,7 +117,7 @@ func (rc mockRestoreCollection) FetchItemByName( func collectionsForInfo( service path.ServiceType, tenant, user string, - dest control.RestoreDestination, + restoreCfg control.RestoreConfig, allInfo []ColInfo, backupVersion int, ) (int, int, []data.RestoreCollection, map[string]map[string][]byte, error) { @@ -142,7 +142,7 @@ func collectionsForInfo( mc := exchMock.NewCollection(pth, pth, len(info.Items)) - baseDestPath, err := backupOutputPathFromRestore(dest, pth) + baseDestPath, err := backupOutputPathFromRestore(restoreCfg, pth) if err != nil { return totalItems, kopiaEntries, collections, expectedData, err } diff --git a/src/internal/connector/mock/connector.go b/src/internal/connector/mock/connector.go index b34296283..2e2faec77 100644 --- a/src/internal/connector/mock/connector.go +++ b/src/internal/connector/mock/connector.go @@ -60,7 +60,7 @@ func (gc GraphConnector) ConsumeRestoreCollections( _ context.Context, _ int, _ selectors.Selector, - _ control.RestoreDestination, + _ control.RestoreConfig, _ control.Options, _ []data.RestoreCollection, _ *fault.Bus, diff --git a/src/internal/connector/onedrive/item_test.go b/src/internal/connector/onedrive/item_test.go index 8c1af9ca7..fd3497fc4 100644 --- a/src/internal/connector/onedrive/item_test.go +++ b/src/internal/connector/onedrive/item_test.go @@ -155,7 +155,7 @@ func (suite *ItemIntegrationSuite) TestItemWriter() { root, err := suite.service.ac.Drives().GetRootFolder(ctx, test.driveID) require.NoError(t, err, clues.ToCore(err)) - newFolderName := tester.DefaultTestRestoreDestination("folder").ContainerName + newFolderName := tester.DefaultTestRestoreConfig("folder").Location t.Logf("creating folder %s", newFolderName) newFolder, err := rh.PostItemInContainer( diff --git a/src/internal/connector/onedrive/restore.go b/src/internal/connector/onedrive/restore.go index c606389b6..67c5f53bf 100644 --- a/src/internal/connector/onedrive/restore.go +++ b/src/internal/connector/onedrive/restore.go @@ -64,7 +64,7 @@ func RestoreCollections( ctx context.Context, rh RestoreHandler, backupVersion int, - dest control.RestoreDestination, + restoreCfg control.RestoreConfig, opts control.Options, dcs []data.RestoreCollection, deets *details.Builder, @@ -79,7 +79,7 @@ func RestoreCollections( ctx = clues.Add( ctx, "backup_version", backupVersion, - "destination", dest.ContainerName) + "restore_location", restoreCfg.Location) // Reorder collections so that the parents directories are created // before the child directories; a requirement for permissions. @@ -97,7 +97,7 @@ func RestoreCollections( ictx = clues.Add( ctx, "category", dc.FullPath().Category(), - "destination", clues.Hide(dest.ContainerName), + "destination", clues.Hide(restoreCfg.Location), "resource_owner", clues.Hide(dc.FullPath().ResourceOwner()), "full_path", dc.FullPath()) ) @@ -108,7 +108,7 @@ func RestoreCollections( backupVersion, dc, caches, - dest.ContainerName, + restoreCfg.Location, deets, opts.RestorePermissions, errs) @@ -128,7 +128,7 @@ func RestoreCollections( support.Restore, len(dcs), restoreMetrics, - dest.ContainerName) + restoreCfg.Location) return status, el.Failure() } diff --git a/src/internal/connector/onedrive/url_cache_test.go b/src/internal/connector/onedrive/url_cache_test.go index 4a4da5c4a..97a7b87b1 100644 --- a/src/internal/connector/onedrive/url_cache_test.go +++ b/src/internal/connector/onedrive/url_cache_test.go @@ -63,7 +63,7 @@ func (suite *URLCacheIntegrationSuite) TestURLCacheBasic() { t = suite.T() ac = suite.ac.Drives() driveID = suite.driveID - newFolderName = tester.DefaultTestRestoreDestination("folder").ContainerName + newFolderName = tester.DefaultTestRestoreConfig("folder").Location driveItemPager = suite.ac.Drives().NewItemPager(driveID, "", api.DriveItemSelectDefault()) ) diff --git a/src/internal/connector/sharepoint/api/pages_test.go b/src/internal/connector/sharepoint/api/pages_test.go index cb10f6022..ae9635ff8 100644 --- a/src/internal/connector/sharepoint/api/pages_test.go +++ b/src/internal/connector/sharepoint/api/pages_test.go @@ -92,7 +92,7 @@ func (suite *SharePointPageSuite) TestRestoreSinglePage() { ctx, flush := tester.NewContext(t) defer flush() - destName := tester.DefaultTestRestoreDestination("").ContainerName + destName := tester.DefaultTestRestoreConfig("").Location testName := "MockPage" // Create Test Page diff --git a/src/internal/connector/sharepoint/collection_test.go b/src/internal/connector/sharepoint/collection_test.go index 74220ae10..4d66a33c0 100644 --- a/src/internal/connector/sharepoint/collection_test.go +++ b/src/internal/connector/sharepoint/collection_test.go @@ -208,7 +208,7 @@ func (suite *SharePointCollectionSuite) TestListCollection_Restore() { info: sharePointListInfo(listing, int64(len(byteArray))), } - destName := tester.DefaultTestRestoreDestination("").ContainerName + destName := tester.DefaultTestRestoreConfig("").Location deets, err := restoreListItem(ctx, service, listData, suite.siteID, destName) assert.NoError(t, err, clues.ToCore(err)) diff --git a/src/internal/connector/sharepoint/restore.go b/src/internal/connector/sharepoint/restore.go index ef040356d..be307fb86 100644 --- a/src/internal/connector/sharepoint/restore.go +++ b/src/internal/connector/sharepoint/restore.go @@ -43,7 +43,7 @@ func RestoreCollections( ctx context.Context, backupVersion int, ac api.Client, - dest control.RestoreDestination, + restoreCfg control.RestoreConfig, opts control.Options, dcs []data.RestoreCollection, deets *details.Builder, @@ -71,7 +71,7 @@ func RestoreCollections( metrics support.CollectionMetrics ictx = clues.Add(ctx, "category", category, - "destination", clues.Hide(dest.ContainerName), + "restore_location", restoreCfg.Location, "resource_owner", clues.Hide(dc.FullPath().ResourceOwner()), "full_path", dc.FullPath()) ) @@ -84,7 +84,7 @@ func RestoreCollections( backupVersion, dc, caches, - dest.ContainerName, + restoreCfg.Location, deets, opts.RestorePermissions, errs) @@ -94,7 +94,7 @@ func RestoreCollections( ictx, ac.Stable, dc, - dest.ContainerName, + restoreCfg.Location, deets, errs) @@ -103,7 +103,7 @@ func RestoreCollections( ictx, ac.Stable, dc, - dest.ContainerName, + restoreCfg.Location, deets, errs) @@ -127,7 +127,7 @@ func RestoreCollections( support.Restore, len(dcs), restoreMetrics, - dest.ContainerName) + restoreCfg.Location) return status, el.Failure() } diff --git a/src/internal/operations/backup_integration_test.go b/src/internal/operations/backup_integration_test.go index 2f24eb23f..8fbd9d2ce 100644 --- a/src/internal/operations/backup_integration_test.go +++ b/src/internal/operations/backup_integration_test.go @@ -381,14 +381,14 @@ func generateContainerOfItems( items: items, }} - dest := control.DefaultRestoreDestination(dttm.SafeForTesting) - dest.ContainerName = destFldr + restoreCfg := control.DefaultRestoreConfig(dttm.SafeForTesting) + restoreCfg.Location = destFldr dataColls := buildCollections( t, service, tenantID, resourceOwner, - dest, + restoreCfg, collections) opts := control.Defaults() @@ -398,7 +398,7 @@ func generateContainerOfItems( ctx, backupVersion, sel, - dest, + restoreCfg, opts, dataColls, fault.New(true)) @@ -443,7 +443,7 @@ func buildCollections( t *testing.T, service path.ServiceType, tenant, user string, - dest control.RestoreDestination, + restoreCfg control.RestoreConfig, colls []incrementalCollection, ) []data.RestoreCollection { t.Helper() diff --git a/src/internal/operations/inject/inject.go b/src/internal/operations/inject/inject.go index 4514ce646..7bcbaf67b 100644 --- a/src/internal/operations/inject/inject.go +++ b/src/internal/operations/inject/inject.go @@ -37,7 +37,7 @@ type ( ctx context.Context, backupVersion int, selector selectors.Selector, - dest control.RestoreDestination, + restoreCfg control.RestoreConfig, opts control.Options, dcs []data.RestoreCollection, errs *fault.Bus, diff --git a/src/internal/operations/restore.go b/src/internal/operations/restore.go index ac67666c3..02f406e0a 100644 --- a/src/internal/operations/restore.go +++ b/src/internal/operations/restore.go @@ -35,11 +35,11 @@ import ( type RestoreOperation struct { operation - BackupID model.StableID `json:"backupID"` - Destination control.RestoreDestination `json:"destination"` - Results RestoreResults `json:"results"` - Selectors selectors.Selector `json:"selectors"` - Version string `json:"version"` + BackupID model.StableID + Results RestoreResults + Selectors selectors.Selector + RestoreCfg control.RestoreConfig + Version string acct account.Account rc inject.RestoreConsumer @@ -61,17 +61,17 @@ func NewRestoreOperation( acct account.Account, backupID model.StableID, sel selectors.Selector, - dest control.RestoreDestination, + restoreCfg control.RestoreConfig, bus events.Eventer, ) (RestoreOperation, error) { op := RestoreOperation{ - operation: newOperation(opts, bus, kw, sw), - acct: acct, - BackupID: backupID, - Destination: dest, - Selectors: sel, - Version: "v0", - rc: rc, + operation: newOperation(opts, bus, kw, sw), + acct: acct, + BackupID: backupID, + RestoreCfg: restoreCfg, + Selectors: sel, + Version: "v0", + rc: rc, } if err := op.validate(); err != nil { return RestoreOperation{}, err @@ -138,7 +138,7 @@ func (op *RestoreOperation) Run(ctx context.Context) (restoreDetails *details.De "tenant_id", clues.Hide(op.acct.ID()), "backup_id", op.BackupID, "service", op.Selectors.Service, - "destination_container", clues.Hide(op.Destination.ContainerName)) + "destination_container", clues.Hide(op.RestoreCfg.Location)) defer func() { op.bus.Event( @@ -257,7 +257,7 @@ func (op *RestoreOperation) do( op.rc, bup.Version, op.Selectors, - op.Destination, + op.RestoreCfg, op.Options, dcs, op.Errors) @@ -314,7 +314,7 @@ func consumeRestoreCollections( rc inject.RestoreConsumer, backupVersion int, sel selectors.Selector, - dest control.RestoreDestination, + restoreCfg control.RestoreConfig, opts control.Options, dcs []data.RestoreCollection, errs *fault.Bus, @@ -329,7 +329,7 @@ func consumeRestoreCollections( ctx, backupVersion, sel, - dest, + restoreCfg, opts, dcs, errs) diff --git a/src/internal/operations/restore_test.go b/src/internal/operations/restore_test.go index d43a6c7b2..63c92c208 100644 --- a/src/internal/operations/restore_test.go +++ b/src/internal/operations/restore_test.go @@ -46,11 +46,11 @@ func TestRestoreOpSuite(t *testing.T) { func (suite *RestoreOpSuite) TestRestoreOperation_PersistResults() { var ( - kw = &kopia.Wrapper{} - sw = &store.Wrapper{} - gc = &mock.GraphConnector{} - now = time.Now() - dest = tester.DefaultTestRestoreDestination("") + kw = &kopia.Wrapper{} + sw = &store.Wrapper{} + gc = &mock.GraphConnector{} + now = time.Now() + restoreCfg = tester.DefaultTestRestoreConfig("") ) table := []struct { @@ -113,7 +113,7 @@ func (suite *RestoreOpSuite) TestRestoreOperation_PersistResults() { account.Account{}, "foo", selectors.Selector{DiscreteOwner: "test"}, - dest, + restoreCfg, evmock.NewBus()) require.NoError(t, err, clues.ToCore(err)) @@ -215,11 +215,11 @@ func (suite *RestoreOpIntegrationSuite) TearDownSuite() { func (suite *RestoreOpIntegrationSuite) TestNewRestoreOperation() { var ( - kw = &kopia.Wrapper{} - sw = &store.Wrapper{} - gc = &mock.GraphConnector{} - dest = tester.DefaultTestRestoreDestination("") - opts = control.Defaults() + kw = &kopia.Wrapper{} + sw = &store.Wrapper{} + gc = &mock.GraphConnector{} + restoreCfg = tester.DefaultTestRestoreConfig("") + opts = control.Defaults() ) table := []struct { @@ -251,7 +251,7 @@ func (suite *RestoreOpIntegrationSuite) TestNewRestoreOperation() { tester.NewM365Account(t), "backup-id", selectors.Selector{DiscreteOwner: "test"}, - dest, + restoreCfg, evmock.NewBus()) test.errCheck(t, err, clues.ToCore(err)) }) @@ -370,14 +370,14 @@ func (suite *RestoreOpIntegrationSuite) TestRestore_Run() { tables := []struct { name string owner string - dest control.RestoreDestination + restoreCfg control.RestoreConfig getSelector func(t *testing.T, owners []string) selectors.Selector setup func(t *testing.T, kw *kopia.Wrapper, sw *store.Wrapper, acct account.Account, owner string) bupResults }{ { - name: "Exchange_Restore", - owner: tester.M365UserID(suite.T()), - dest: tester.DefaultTestRestoreDestination(""), + name: "Exchange_Restore", + owner: tester.M365UserID(suite.T()), + restoreCfg: tester.DefaultTestRestoreConfig(""), getSelector: func(t *testing.T, owners []string) selectors.Selector { rsel := selectors.NewExchangeRestore(owners) rsel.Include(rsel.AllData()) @@ -387,9 +387,9 @@ func (suite *RestoreOpIntegrationSuite) TestRestore_Run() { setup: setupExchangeBackup, }, { - name: "SharePoint_Restore", - owner: tester.M365SiteID(suite.T()), - dest: control.DefaultRestoreDestination(dttm.SafeForTesting), + name: "SharePoint_Restore", + owner: tester.M365SiteID(suite.T()), + restoreCfg: control.DefaultRestoreConfig(dttm.SafeForTesting), getSelector: func(t *testing.T, owners []string) selectors.Selector { rsel := selectors.NewSharePointRestore(owners) rsel.Include(rsel.AllData()) @@ -423,7 +423,7 @@ func (suite *RestoreOpIntegrationSuite) TestRestore_Run() { tester.NewM365Account(t), bup.backupID, test.getSelector(t, bup.selectorResourceOwners), - test.dest, + test.restoreCfg, mb) require.NoError(t, err, clues.ToCore(err)) @@ -453,8 +453,8 @@ func (suite *RestoreOpIntegrationSuite) TestRestore_Run_errorNoBackup() { defer flush() var ( - dest = tester.DefaultTestRestoreDestination("") - mb = evmock.NewBus() + restoreCfg = tester.DefaultTestRestoreConfig("") + mb = evmock.NewBus() ) rsel := selectors.NewExchangeRestore(selectors.None()) @@ -475,7 +475,7 @@ func (suite *RestoreOpIntegrationSuite) TestRestore_Run_errorNoBackup() { tester.NewM365Account(t), "backupID", rsel.Selector, - dest, + restoreCfg, mb) require.NoError(t, err, clues.ToCore(err)) diff --git a/src/internal/tester/restore_destination.go b/src/internal/tester/restore_destination.go index af247258d..5b1c667c3 100644 --- a/src/internal/tester/restore_destination.go +++ b/src/internal/tester/restore_destination.go @@ -9,10 +9,10 @@ import ( const RestoreFolderPrefix = "Corso_Test" -func DefaultTestRestoreDestination(namespace string) control.RestoreDestination { +func DefaultTestRestoreConfig(namespace string) control.RestoreConfig { var ( - dest = control.DefaultRestoreDestination(dttm.SafeForTesting) - sft = dttm.FormatNow(dttm.SafeForTesting) + restoreCfg = control.DefaultRestoreConfig(dttm.SafeForTesting) + sft = dttm.FormatNow(dttm.SafeForTesting) ) parts := []string{RestoreFolderPrefix, namespace, sft} @@ -20,7 +20,7 @@ func DefaultTestRestoreDestination(namespace string) control.RestoreDestination parts = []string{RestoreFolderPrefix, sft} } - dest.ContainerName = strings.Join(parts, "_") + restoreCfg.Location = strings.Join(parts, "_") - return dest + return restoreCfg } diff --git a/src/pkg/control/collisionpolicy_string.go b/src/pkg/control/collisionpolicy_string.go deleted file mode 100644 index da2c0b50b..000000000 --- a/src/pkg/control/collisionpolicy_string.go +++ /dev/null @@ -1,26 +0,0 @@ -// Code generated by "stringer -type=CollisionPolicy"; DO NOT EDIT. - -package control - -import "strconv" - -func _() { - // An "invalid array index" compiler error signifies that the constant values have changed. - // Re-run the stringer command to generate them again. - var x [1]struct{} - _ = x[Unknown-0] - _ = x[Copy-1] - _ = x[Skip-2] - _ = x[Replace-3] -} - -const _CollisionPolicy_name = "UnknownCopySkipReplace" - -var _CollisionPolicy_index = [...]uint8{0, 7, 11, 15, 22} - -func (i CollisionPolicy) String() string { - if i < 0 || i >= CollisionPolicy(len(_CollisionPolicy_index)-1) { - return "CollisionPolicy(" + strconv.FormatInt(int64(i), 10) + ")" - } - return _CollisionPolicy_name[_CollisionPolicy_index[i]:_CollisionPolicy_index[i+1]] -} diff --git a/src/pkg/control/options.go b/src/pkg/control/options.go index 3bda48854..4f592787e 100644 --- a/src/pkg/control/options.go +++ b/src/pkg/control/options.go @@ -7,9 +7,8 @@ import ( // Options holds the optional configurations for a process type Options struct { - Collision CollisionPolicy `json:"-"` DisableMetrics bool `json:"disableMetrics"` - FailureHandling FailureBehavior `json:"failureHandling"` + FailureHandling FailurePolicy `json:"failureHandling"` RestorePermissions bool `json:"restorePermissions"` SkipReduce bool `json:"skipReduce"` ToggleFeatures Toggles `json:"toggleFeatures"` @@ -17,8 +16,6 @@ type Options struct { Repo repository.Options `json:"repo"` } -type FailureBehavior string - type Parallelism struct { // sets the collection buffer size before blocking. CollectionBuffer int @@ -26,13 +23,15 @@ type Parallelism struct { ItemFetch int } +type FailurePolicy string + const ( // fails and exits the run immediately - FailFast FailureBehavior = "fail-fast" + FailFast FailurePolicy = "fail-fast" // recovers whenever possible, reports non-zero recoveries as a failure - FailAfterRecovery FailureBehavior = "fail-after-recovery" + FailAfterRecovery FailurePolicy = "fail-after-recovery" // recovers whenever possible, does not report recovery as failure - BestEffort FailureBehavior = "best-effort" + BestEffort FailurePolicy = "best-effort" ) // Defaults provides an Options with the default values set. @@ -48,44 +47,50 @@ func Defaults() Options { } // --------------------------------------------------------------------------- -// Restore Item Collision Policy -// --------------------------------------------------------------------------- - -// CollisionPolicy describes how the datalayer behaves in case of a collision. -type CollisionPolicy int - -//go:generate stringer -type=CollisionPolicy -const ( - Unknown CollisionPolicy = iota - Copy - Skip - Replace -) - -// --------------------------------------------------------------------------- -// Restore Destination +// Restore Configuration // --------------------------------------------------------------------------- const ( defaultRestoreLocation = "Corso_Restore_" ) -// RestoreDestination is a POD that contains an override of the resource owner -// to restore data under and the name of the root of the restored container -// hierarchy. -type RestoreDestination struct { - // ResourceOwnerOverride overrides the default resource owner to restore to. - // If it is not populated items should be restored under the previous resource - // owner of the item. - ResourceOwnerOverride string - // ContainerName is the name of the root of the restored container hierarchy. - // This field must be populated for a restore. - ContainerName string +// CollisionPolicy describes how the datalayer behaves in case of a collision. +type CollisionPolicy string + +const ( + Unknown CollisionPolicy = "" + Skip CollisionPolicy = "skip" + Copy CollisionPolicy = "copy" + Replace CollisionPolicy = "replace" +) + +// RestoreConfig contains +type RestoreConfig struct { + // Defines the per-item collision handling policy. + // Defaults to Skip. + OnCollision CollisionPolicy + + // ProtectedResource specifies which resource the data will be restored to. + // If empty, restores to the same resource that was backed up. + // Defaults to empty. + ProtectedResource string + + // Location specifies the container into which the data will be restored. + // Only accepts container names, does not accept IDs. + // If empty or "/", data will get restored in place, beginning at the root. + // Defaults to "Corso_Restore_" + Location string + + // Drive specifies the drive into which the data will be restored. + // If empty, data is restored to the same drive that was backed up. + // Defaults to empty. + Drive string } -func DefaultRestoreDestination(timeFormat dttm.TimeFormat) RestoreDestination { - return RestoreDestination{ - ContainerName: defaultRestoreLocation + dttm.FormatNow(timeFormat), +func DefaultRestoreConfig(timeFormat dttm.TimeFormat) RestoreConfig { + return RestoreConfig{ + OnCollision: Skip, + Location: defaultRestoreLocation + dttm.FormatNow(timeFormat), } } diff --git a/src/pkg/repository/loadtest/repository_load_test.go b/src/pkg/repository/loadtest/repository_load_test.go index 22138f6c9..9f586f648 100644 --- a/src/pkg/repository/loadtest/repository_load_test.go +++ b/src/pkg/repository/loadtest/repository_load_test.go @@ -151,9 +151,9 @@ func runRestoreLoadTest( t.Skip("restore load test is toggled off") } - dest := tester.DefaultTestRestoreDestination("") + restoreCfg := tester.DefaultTestRestoreConfig("") - rst, err := r.NewRestore(ctx, backupID, restSel, dest) + rst, err := r.NewRestore(ctx, backupID, restSel, restoreCfg) require.NoError(t, err, clues.ToCore(err)) doRestoreLoadTest(t, ctx, rst, service, bup.Results.ItemsWritten, usersUnderTest) diff --git a/src/pkg/repository/repository.go b/src/pkg/repository/repository.go index fbe374223..13385cbb8 100644 --- a/src/pkg/repository/repository.go +++ b/src/pkg/repository/repository.go @@ -69,7 +69,7 @@ type Repository interface { ctx context.Context, backupID string, sel selectors.Selector, - dest control.RestoreDestination, + restoreCfg control.RestoreConfig, ) (operations.RestoreOperation, error) NewMaintenance( ctx context.Context, @@ -336,7 +336,7 @@ func (r repository) NewRestore( ctx context.Context, backupID string, sel selectors.Selector, - dest control.RestoreDestination, + restoreCfg control.RestoreConfig, ) (operations.RestoreOperation, error) { gc, err := connectToM365(ctx, sel, r.Account) if err != nil { @@ -352,7 +352,7 @@ func (r repository) NewRestore( r.Account, model.StableID(backupID), sel, - dest, + restoreCfg, r.Bus) } diff --git a/src/pkg/repository/repository_test.go b/src/pkg/repository/repository_test.go index 09c4b8f14..f3a06cc9e 100644 --- a/src/pkg/repository/repository_test.go +++ b/src/pkg/repository/repository_test.go @@ -242,7 +242,7 @@ func (suite *RepositoryIntegrationSuite) TestNewRestore() { defer flush() acct := tester.NewM365Account(t) - dest := tester.DefaultTestRestoreDestination("") + restoreCfg := tester.DefaultTestRestoreConfig("") // need to initialize the repository before we can test connecting to it. st := tester.NewPrefixedS3Storage(t) @@ -250,7 +250,7 @@ func (suite *RepositoryIntegrationSuite) TestNewRestore() { r, err := repository.Initialize(ctx, acct, st, control.Defaults()) require.NoError(t, err, clues.ToCore(err)) - ro, err := r.NewRestore(ctx, "backup-id", selectors.Selector{DiscreteOwner: "test"}, dest) + ro, err := r.NewRestore(ctx, "backup-id", selectors.Selector{DiscreteOwner: "test"}, restoreCfg) require.NoError(t, err, clues.ToCore(err)) require.NotNil(t, ro) }