diff --git a/src/cli/backup/exchange.go b/src/cli/backup/exchange.go index a1427accd..01fc816a7 100644 --- a/src/cli/backup/exchange.go +++ b/src/cli/backup/exchange.go @@ -27,7 +27,6 @@ import ( // exchange bucket info from flags var ( backupID string - exchangeAll bool exchangeData []string user []string @@ -59,9 +58,9 @@ const ( const ( exchangeServiceCommand = "exchange" - exchangeServiceCommandCreateUseSuffix = " --user | '" + utils.Wildcard + "'" - exchangeServiceCommandDeleteUseSuffix = " --backup " - exchangeServiceCommandDetailsUseSuffix = " --backup " + exchangeServiceCommandCreateUseSuffix = "--user | '" + utils.Wildcard + "'" + exchangeServiceCommandDeleteUseSuffix = "--backup " + exchangeServiceCommandDetailsUseSuffix = "--backup " ) const ( @@ -104,14 +103,11 @@ func addExchangeCommands(parent *cobra.Command) *cobra.Command { case createCommand: c, fs = utils.AddCommand(parent, exchangeCreateCmd()) - c.Use = c.Use + exchangeServiceCommandCreateUseSuffix + c.Use = c.Use + " " + exchangeServiceCommandCreateUseSuffix c.Example = exchangeServiceCommandCreateExamples // Flags addition ordering should follow the order we want them to appear in help and docs: - // More generic (ex: --all) and more frequently used flags take precedence. - fs.BoolVar(&exchangeAll, - "all", false, - "Backup all Exchange data for all users") + // More generic (ex: --user) and more frequently used flags take precedence. fs.StringSliceVar( &user, "user", nil, @@ -128,11 +124,11 @@ func addExchangeCommands(parent *cobra.Command) *cobra.Command { case detailsCommand: c, fs = utils.AddCommand(parent, exchangeDetailsCmd()) - c.Use = c.Use + exchangeServiceCommandDetailsUseSuffix + c.Use = c.Use + " " + exchangeServiceCommandDetailsUseSuffix c.Example = exchangeServiceCommandDetailsExamples // Flags addition ordering should follow the order we want them to appear in help and docs: - // More generic (ex: --all) and more frequently used flags take precedence. + // More generic (ex: --user) and more frequently used flags take precedence. fs.StringVar(&backupID, "backup", "", "ID of the backup to explore. (required)") @@ -216,7 +212,7 @@ func addExchangeCommands(parent *cobra.Command) *cobra.Command { case deleteCommand: c, fs = utils.AddCommand(parent, exchangeDeleteCmd()) - c.Use = c.Use + exchangeServiceCommandDeleteUseSuffix + c.Use = c.Use + " " + exchangeServiceCommandDeleteUseSuffix c.Example = exchangeServiceCommandDeleteExamples fs.StringVar(&backupID, "backup", "", "ID of the backup to delete. (required)") @@ -248,7 +244,7 @@ func createExchangeCmd(cmd *cobra.Command, args []string) error { return nil } - if err := validateExchangeBackupCreateFlags(exchangeAll, user, exchangeData); err != nil { + if err := validateExchangeBackupCreateFlags(user, exchangeData); err != nil { return err } @@ -264,7 +260,7 @@ func createExchangeCmd(cmd *cobra.Command, args []string) error { defer utils.CloseRepo(ctx, r) - sel := exchangeBackupCreateSelectors(exchangeAll, user, exchangeData) + sel := exchangeBackupCreateSelectors(user, exchangeData) bo, err := r.NewBackup(ctx, sel) if err != nil { @@ -286,40 +282,32 @@ func createExchangeCmd(cmd *cobra.Command, args []string) error { return nil } -func exchangeBackupCreateSelectors(all bool, users, data []string) selectors.Selector { +func exchangeBackupCreateSelectors(userIDs, data []string) selectors.Selector { sel := selectors.NewExchangeBackup() - if all { - sel.Include(sel.Users(selectors.Any())) - return sel.Selector - } if len(data) == 0 { - sel.Include(sel.ContactFolders(user, selectors.Any())) - sel.Include(sel.MailFolders(user, selectors.Any())) - sel.Include(sel.EventCalendars(user, selectors.Any())) + sel.Include(sel.ContactFolders(userIDs, selectors.Any())) + sel.Include(sel.MailFolders(userIDs, selectors.Any())) + sel.Include(sel.EventCalendars(userIDs, selectors.Any())) } for _, d := range data { switch d { case dataContacts: - sel.Include(sel.ContactFolders(users, selectors.Any())) + sel.Include(sel.ContactFolders(userIDs, selectors.Any())) case dataEmail: - sel.Include(sel.MailFolders(users, selectors.Any())) + sel.Include(sel.MailFolders(userIDs, selectors.Any())) case dataEvents: - sel.Include(sel.EventCalendars(users, selectors.Any())) + sel.Include(sel.EventCalendars(userIDs, selectors.Any())) } } return sel.Selector } -func validateExchangeBackupCreateFlags(all bool, users, data []string) error { - if len(users) == 0 && !all { - return errors.New("requires one or more --user ids, the wildcard --user *, or the --all flag") - } - - if len(data) > 0 && all { - return errors.New("--all does a backup on all data, and cannot be reduced with --data") +func validateExchangeBackupCreateFlags(userIDs, data []string) error { + if len(userIDs) == 0 { + return errors.New("--user requires one or more ids or the wildcard *") } for _, d := range data { diff --git a/src/cli/backup/exchange_test.go b/src/cli/backup/exchange_test.go index da3164812..92ee37b84 100644 --- a/src/cli/backup/exchange_test.go +++ b/src/cli/backup/exchange_test.go @@ -33,7 +33,7 @@ func (suite *ExchangeSuite) TestAddExchangeCommands() { expectRunE func(*cobra.Command, []string) error }{ { - "create exchange", createCommand, expectUse + exchangeServiceCommandCreateUseSuffix, + "create exchange", createCommand, expectUse + " " + exchangeServiceCommandCreateUseSuffix, exchangeCreateCmd().Short, createExchangeCmd, }, { @@ -41,11 +41,11 @@ func (suite *ExchangeSuite) TestAddExchangeCommands() { exchangeListCmd().Short, listExchangeCmd, }, { - "details exchange", detailsCommand, expectUse + exchangeServiceCommandDetailsUseSuffix, + "details exchange", detailsCommand, expectUse + " " + exchangeServiceCommandDetailsUseSuffix, exchangeDetailsCmd().Short, detailsExchangeCmd, }, { - "delete exchange", deleteCommand, expectUse + exchangeServiceCommandDeleteUseSuffix, + "delete exchange", deleteCommand, expectUse + " " + exchangeServiceCommandDeleteUseSuffix, exchangeDeleteCmd().Short, deleteExchangeCmd, }, } @@ -70,46 +70,33 @@ func (suite *ExchangeSuite) TestAddExchangeCommands() { func (suite *ExchangeSuite) TestValidateBackupCreateFlags() { table := []struct { name string - a bool user, data []string expect assert.ErrorAssertionFunc }{ { - name: "no users, not any", + name: "no users or data", expect: assert.Error, }, { - name: "any and data", - a: true, + name: "no users only data", data: []string{dataEmail}, expect: assert.Error, }, { - name: "unrecognized data", + name: "unrecognized data category", user: []string{"fnord"}, data: []string{"smurfs"}, expect: assert.Error, }, { - name: "users, not any", - user: []string{"fnord"}, - expect: assert.NoError, - }, - { - name: "no users, any", - a: true, - expect: assert.NoError, - }, - { - name: "users, any", - a: true, + name: "only users no data", user: []string{"fnord"}, expect: assert.NoError, }, } for _, test := range table { suite.T().Run(test.name, func(t *testing.T) { - test.expect(t, validateExchangeBackupCreateFlags(test.a, test.user, test.data)) + test.expect(t, validateExchangeBackupCreateFlags(test.user, test.data)) }) } } @@ -117,13 +104,11 @@ func (suite *ExchangeSuite) TestValidateBackupCreateFlags() { func (suite *ExchangeSuite) TestExchangeBackupCreateSelectors() { table := []struct { name string - a bool user, data []string expectIncludeLen int }{ { - name: "any", - a: true, + name: "default: one of each category, all None() matchers", expectIncludeLen: 3, }, { @@ -223,7 +208,7 @@ func (suite *ExchangeSuite) TestExchangeBackupCreateSelectors() { } for _, test := range table { suite.T().Run(test.name, func(t *testing.T) { - sel := exchangeBackupCreateSelectors(test.a, test.user, test.data) + sel := exchangeBackupCreateSelectors(test.user, test.data) assert.Equal(t, test.expectIncludeLen, len(sel.Includes)) }) } diff --git a/src/cli/backup/onedrive.go b/src/cli/backup/onedrive.go index 9305aa70e..b55284a02 100644 --- a/src/cli/backup/onedrive.go +++ b/src/cli/backup/onedrive.go @@ -25,9 +25,9 @@ import ( const ( oneDriveServiceCommand = "onedrive" - oneDriveServiceCommandCreateUseSuffix = " --user | '" + utils.Wildcard + "'" - oneDriveServiceCommandDeleteUseSuffix = " --backup " - oneDriveServiceCommandDetailsUseSuffix = " --backup " + oneDriveServiceCommandCreateUseSuffix = "--user | '" + utils.Wildcard + "'" + oneDriveServiceCommandDeleteUseSuffix = "--backup " + oneDriveServiceCommandDetailsUseSuffix = "--backup " ) const ( @@ -76,7 +76,7 @@ func addOneDriveCommands(parent *cobra.Command) *cobra.Command { case createCommand: c, fs = utils.AddCommand(parent, oneDriveCreateCmd()) - c.Use = c.Use + oneDriveServiceCommandCreateUseSuffix + c.Use = c.Use + " " + oneDriveServiceCommandCreateUseSuffix c.Example = oneDriveServiceCommandCreateExamples fs.StringArrayVar(&user, "user", nil, @@ -89,7 +89,7 @@ func addOneDriveCommands(parent *cobra.Command) *cobra.Command { case detailsCommand: c, fs = utils.AddCommand(parent, oneDriveDetailsCmd()) - c.Use = c.Use + oneDriveServiceCommandDetailsUseSuffix + c.Use = c.Use + " " + oneDriveServiceCommandDetailsUseSuffix c.Example = oneDriveServiceCommandDetailsExamples fs.StringVar(&backupID, "backup", "", "ID of the backup to explore. (required)") @@ -130,7 +130,7 @@ func addOneDriveCommands(parent *cobra.Command) *cobra.Command { case deleteCommand: c, fs = utils.AddCommand(parent, oneDriveDeleteCmd()) - c.Use = c.Use + oneDriveServiceCommandDeleteUseSuffix + c.Use = c.Use + " " + oneDriveServiceCommandDeleteUseSuffix c.Example = oneDriveServiceCommandDeleteExamples fs.StringVar(&backupID, "backup", "", "ID of the backup to delete. (required)") diff --git a/src/cli/backup/onedrive_test.go b/src/cli/backup/onedrive_test.go index 9eb71a8dd..f9b1d686d 100644 --- a/src/cli/backup/onedrive_test.go +++ b/src/cli/backup/onedrive_test.go @@ -30,7 +30,7 @@ func (suite *OneDriveSuite) TestAddOneDriveCommands() { expectRunE func(*cobra.Command, []string) error }{ { - "create onedrive", createCommand, expectUse + oneDriveServiceCommandCreateUseSuffix, + "create onedrive", createCommand, expectUse + " " + oneDriveServiceCommandCreateUseSuffix, oneDriveCreateCmd().Short, createOneDriveCmd, }, { @@ -38,11 +38,11 @@ func (suite *OneDriveSuite) TestAddOneDriveCommands() { oneDriveListCmd().Short, listOneDriveCmd, }, { - "details onedrive", detailsCommand, expectUse + oneDriveServiceCommandDetailsUseSuffix, + "details onedrive", detailsCommand, expectUse + " " + oneDriveServiceCommandDetailsUseSuffix, oneDriveDetailsCmd().Short, detailsOneDriveCmd, }, { - "delete onedrive", deleteCommand, expectUse + oneDriveServiceCommandDeleteUseSuffix, + "delete onedrive", deleteCommand, expectUse + " " + oneDriveServiceCommandDeleteUseSuffix, oneDriveDeleteCmd().Short, deleteOneDriveCmd, }, } diff --git a/src/cli/repo/s3.go b/src/cli/repo/s3.go index ce50352e0..92bb8d46a 100644 --- a/src/cli/repo/s3.go +++ b/src/cli/repo/s3.go @@ -37,18 +37,19 @@ func addS3Commands(parent *cobra.Command) *cobra.Command { c, fs = utils.AddCommand(parent, s3ConnectCmd()) } - c.Use = c.Use + s3ProviderCommandUseSuffix + c.Use = c.Use + " " + s3ProviderCommandUseSuffix c.SetUsageTemplate(parent.UsageTemplate()) // Flags addition ordering should follow the order we want them to appear in help and docs: - // More generic (ex: --all) and more frequently used flags take precedence. + // More generic and more frequently used flags take precedence. fs.StringVar(&bucket, "bucket", "", "Name of S3 bucket for repo. (required)") cobra.CheckErr(c.MarkFlagRequired("bucket")) fs.StringVar(&prefix, "prefix", "", "Repo prefix within bucket.") fs.StringVar(&endpoint, "endpoint", "s3.amazonaws.com", "S3 service endpoint.") - fs.BoolVar(&succeedIfExists, "succeed-if-exists", false, "Exit with success if the repo has already been initialized.") + // In general, we don't want to expose this flag to users and have them mistake it // for a broad-scale idempotency solution. We can un-hide it later the need arises. + fs.BoolVar(&succeedIfExists, "succeed-if-exists", false, "Exit with success if the repo has already been initialized.") cobra.CheckErr(fs.MarkHidden("succeed-if-exists")) return c @@ -56,7 +57,7 @@ func addS3Commands(parent *cobra.Command) *cobra.Command { const ( s3ProviderCommand = "s3" - s3ProviderCommandUseSuffix = " --bucket " + s3ProviderCommandUseSuffix = "--bucket " ) const ( diff --git a/src/cli/repo/s3_test.go b/src/cli/repo/s3_test.go index ad8edcb98..737cbc405 100644 --- a/src/cli/repo/s3_test.go +++ b/src/cli/repo/s3_test.go @@ -20,7 +20,7 @@ func TestS3Suite(t *testing.T) { } func (suite *S3Suite) TestAddS3Commands() { - expectUse := s3ProviderCommand + s3ProviderCommandUseSuffix + expectUse := s3ProviderCommand + " " + s3ProviderCommandUseSuffix table := []struct { name string diff --git a/src/cli/restore/exchange.go b/src/cli/restore/exchange.go index 0bf3024e3..01f4ce3f7 100644 --- a/src/cli/restore/exchange.go +++ b/src/cli/restore/exchange.go @@ -51,10 +51,10 @@ func addExchangeCommands(parent *cobra.Command) *cobra.Command { case restoreCommand: c, fs = utils.AddCommand(parent, exchangeRestoreCmd()) - c.Use = c.Use + exchangeServiceCommandUseSuffix + c.Use = c.Use + " " + exchangeServiceCommandUseSuffix // Flags addition ordering should follow the order we want them to appear in help and docs: - // More generic (ex: --all) and more frequently used flags take precedence. + // More generic (ex: --user) and more frequently used flags take precedence. // general flags fs.StringVar(&backupID, "backup", "", "ID of the backup to restore. (required)") cobra.CheckErr(c.MarkFlagRequired("backup")) @@ -140,7 +140,7 @@ func addExchangeCommands(parent *cobra.Command) *cobra.Command { const ( exchangeServiceCommand = "exchange" - exchangeServiceCommandUseSuffix = " --backup " + exchangeServiceCommandUseSuffix = "--backup " exchangeServiceCommandRestoreExamples = `# Restore emails with ID 98765abcdef and 12345abcdef from a specific backup corso restore exchange --backup 1234abcd-12ab-cd34-56de-1234abcd --email 98765abcdef,12345abcdef diff --git a/src/cli/restore/exchange_test.go b/src/cli/restore/exchange_test.go index e53cb8062..0e062759d 100644 --- a/src/cli/restore/exchange_test.go +++ b/src/cli/restore/exchange_test.go @@ -20,7 +20,7 @@ func TestExchangeSuite(t *testing.T) { } func (suite *ExchangeSuite) TestAddExchangeCommands() { - expectUse := exchangeServiceCommand + exchangeServiceCommandUseSuffix + expectUse := exchangeServiceCommand + " " + exchangeServiceCommandUseSuffix table := []struct { name string diff --git a/src/cli/restore/onedrive.go b/src/cli/restore/onedrive.go index 2a26c0abb..85394e0cb 100644 --- a/src/cli/restore/onedrive.go +++ b/src/cli/restore/onedrive.go @@ -36,10 +36,10 @@ func addOneDriveCommands(parent *cobra.Command) *cobra.Command { case restoreCommand: c, fs = utils.AddCommand(parent, oneDriveRestoreCmd()) - c.Use = c.Use + oneDriveServiceCommandUseSuffix + c.Use = c.Use + " " + oneDriveServiceCommandUseSuffix // Flags addition ordering should follow the order we want them to appear in help and docs: - // More generic (ex: --all) and more frequently used flags take precedence. + // More generic (ex: --user) and more frequently used flags take precedence. fs.SortFlags = false fs.StringVar(&backupID, "backup", "", "ID of the backup to restore. (required)") @@ -90,7 +90,7 @@ func addOneDriveCommands(parent *cobra.Command) *cobra.Command { const ( oneDriveServiceCommand = "onedrive" - oneDriveServiceCommandUseSuffix = " --backup " + oneDriveServiceCommandUseSuffix = "--backup " oneDriveServiceCommandRestoreExamples = `# Restore file with ID 98765abcdef corso restore onedrive --backup 1234abcd-12ab-cd34-56de-1234abcd --file 98765abcdef diff --git a/src/cli/restore/onedrive_test.go b/src/cli/restore/onedrive_test.go index 70a1d9c6d..45e549081 100644 --- a/src/cli/restore/onedrive_test.go +++ b/src/cli/restore/onedrive_test.go @@ -20,7 +20,7 @@ func TestOneDriveSuite(t *testing.T) { } func (suite *OneDriveSuite) TestAddOneDriveCommands() { - expectUse := oneDriveServiceCommand + oneDriveServiceCommandUseSuffix + expectUse := oneDriveServiceCommand + " " + oneDriveServiceCommandUseSuffix table := []struct { name string diff --git a/src/internal/connector/graph_connector_test.go b/src/internal/connector/graph_connector_test.go index 786e1fddc..77c8589c2 100644 --- a/src/internal/connector/graph_connector_test.go +++ b/src/internal/connector/graph_connector_test.go @@ -279,7 +279,7 @@ func (suite *GraphConnectorIntegrationSuite) TestEventsSerializationRegression() } // TestAccessOfInboxAllUsers verifies that GraphConnector can -// support `--all-users` for backup operations. Selector.DiscreteScopes +// support `--users *` for backup operations. Selector.DiscreteScopes // returns all of the users within one scope. Only users who have // messages in their inbox will have a collection returned. // The final test insures that more than a 75% of the user collections are