From d8d9201eb86ef90abc784c7f2d97854276128a5e Mon Sep 17 00:00:00 2001 From: neha-Gupta1 Date: Tue, 16 May 2023 18:04:53 +0530 Subject: [PATCH 1/3] don't throw error on backup with service disabled --- src/cli/backup/backup.go | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/cli/backup/backup.go b/src/cli/backup/backup.go index 0a8b45dc3..c043fcd93 100644 --- a/src/cli/backup/backup.go +++ b/src/cli/backup/backup.go @@ -12,6 +12,7 @@ import ( . "github.com/alcionai/corso/src/cli/print" "github.com/alcionai/corso/src/cli/utils" "github.com/alcionai/corso/src/internal/common/idname" + "github.com/alcionai/corso/src/internal/connector/graph" "github.com/alcionai/corso/src/internal/data" "github.com/alcionai/corso/src/pkg/backup" "github.com/alcionai/corso/src/pkg/logger" @@ -253,6 +254,11 @@ func runBackups( sb := fmt.Sprintf("%d of %d backups failed:\n", len(errs), len(selectorSet)) for i, e := range errs { + if strings.Contains(e.Error(), graph.ErrServiceNotEnabled.Error()) { + logger.Ctx(ctx).Debugf("Service not enabled for creating backup %d of %d", i+1, len(selectorSet)) + continue + } + logger.CtxErr(ctx, e).Errorf("Backup %d of %d failed", i+1, len(selectorSet)) sb += "∙ " + e.Error() + "\n" } From c6b91654d666373638892cc3437db0720410c04a Mon Sep 17 00:00:00 2001 From: neha-Gupta1 Date: Tue, 16 May 2023 19:40:45 +0530 Subject: [PATCH 2/3] test case for service not enabled --- src/cli/backup/backup.go | 12 ++++++----- src/cli/backup/exchange_e2e_test.go | 33 +++++++++++++++++++++++++++++ 2 files changed, 40 insertions(+), 5 deletions(-) diff --git a/src/cli/backup/backup.go b/src/cli/backup/backup.go index c043fcd93..c7a6f8410 100644 --- a/src/cli/backup/backup.go +++ b/src/cli/backup/backup.go @@ -226,6 +226,13 @@ func runBackups( err = bo.Run(ictx) if err != nil { + if strings.Contains(err.Error(), graph.ErrServiceNotEnabled.Error()) { + logger.Ctx(ctx).Debugf("Service not enabled for creating backup for %s", bo.ResourceOwner.Name()) + Infof(ictx, "%v\n", err) + + continue + } + errs = append(errs, clues.Wrap(err, owner).WithClues(ictx)) Errf(ictx, "%v\n", err) @@ -254,11 +261,6 @@ func runBackups( sb := fmt.Sprintf("%d of %d backups failed:\n", len(errs), len(selectorSet)) for i, e := range errs { - if strings.Contains(e.Error(), graph.ErrServiceNotEnabled.Error()) { - logger.Ctx(ctx).Debugf("Service not enabled for creating backup %d of %d", i+1, len(selectorSet)) - continue - } - logger.CtxErr(ctx, e).Errorf("Backup %d of %d failed", i+1, len(selectorSet)) sb += "∙ " + e.Error() + "\n" } diff --git a/src/cli/backup/exchange_e2e_test.go b/src/cli/backup/exchange_e2e_test.go index e5c60df2b..14737eaec 100644 --- a/src/cli/backup/exchange_e2e_test.go +++ b/src/cli/backup/exchange_e2e_test.go @@ -173,6 +173,39 @@ func runExchangeBackupCategoryTest(suite *BackupExchangeE2ESuite, category strin assert.Contains(t, result, suite.m365UserID) } +func (suite *BackupExchangeE2ESuite) TestExchangeBackupCmd_ServiceNotEnables_email() { + runExchangeBackupServiceNotEnabledTest(suite, "email") +} + +func runExchangeBackupServiceNotEnabledTest(suite *BackupExchangeE2ESuite, category string) { + recorder := strings.Builder{} + recorder.Reset() + + t := suite.T() + + ctx, flush := tester.NewContext() + ctx = config.SetViper(ctx, suite.vpr) + + defer flush() + + // run the command + + cmd, ctx := buildExchangeBackupCmd( + ctx, + suite.cfgFP, + fmt.Sprintf("testevents@10rqc2.onmicrosoft.com,%s", suite.m365UserID), + category, + &recorder) + err := cmd.ExecuteContext(ctx) + require.NoError(t, err, clues.ToCore(err)) + + result := recorder.String() + t.Log("backup results", result) + + // as an offhand check: the result should contain the m365 user id + assert.Contains(t, result, suite.m365UserID) +} + func (suite *BackupExchangeE2ESuite) TestExchangeBackupCmd_userNotFound_email() { runExchangeBackupUserNotFoundTest(suite, "email") } From 586149a197fe57f6e327f486b9ac34345caac6f8 Mon Sep 17 00:00:00 2001 From: neha-Gupta1 Date: Wed, 17 May 2023 11:10:48 +0530 Subject: [PATCH 3/3] get CORSO_M365_TEST_UNLICENSED_USER from env --- src/cli/backup/backup.go | 2 +- src/cli/backup/exchange_e2e_test.go | 4 ++-- src/internal/tester/config.go | 24 ++++++++++++++++-------- src/internal/tester/resource_owners.go | 12 ++++++++++++ 4 files changed, 31 insertions(+), 11 deletions(-) diff --git a/src/cli/backup/backup.go b/src/cli/backup/backup.go index c7a6f8410..31b1b7451 100644 --- a/src/cli/backup/backup.go +++ b/src/cli/backup/backup.go @@ -226,7 +226,7 @@ func runBackups( err = bo.Run(ictx) if err != nil { - if strings.Contains(err.Error(), graph.ErrServiceNotEnabled.Error()) { + if errors.Is(err, graph.ErrServiceNotEnabled) { logger.Ctx(ctx).Debugf("Service not enabled for creating backup for %s", bo.ResourceOwner.Name()) Infof(ictx, "%v\n", err) diff --git a/src/cli/backup/exchange_e2e_test.go b/src/cli/backup/exchange_e2e_test.go index 14737eaec..80b10d5a5 100644 --- a/src/cli/backup/exchange_e2e_test.go +++ b/src/cli/backup/exchange_e2e_test.go @@ -173,7 +173,7 @@ func runExchangeBackupCategoryTest(suite *BackupExchangeE2ESuite, category strin assert.Contains(t, result, suite.m365UserID) } -func (suite *BackupExchangeE2ESuite) TestExchangeBackupCmd_ServiceNotEnables_email() { +func (suite *BackupExchangeE2ESuite) TestExchangeBackupCmd_ServiceNotEnabled_email() { runExchangeBackupServiceNotEnabledTest(suite, "email") } @@ -193,7 +193,7 @@ func runExchangeBackupServiceNotEnabledTest(suite *BackupExchangeE2ESuite, categ cmd, ctx := buildExchangeBackupCmd( ctx, suite.cfgFP, - fmt.Sprintf("testevents@10rqc2.onmicrosoft.com,%s", suite.m365UserID), + fmt.Sprintf("%s,%s", tester.UnlicensedM365UserID(suite.T()), suite.m365UserID), category, &recorder) err := cmd.ExecuteContext(ctx) diff --git a/src/internal/tester/config.go b/src/internal/tester/config.go index 14a4f54d9..657631960 100644 --- a/src/internal/tester/config.go +++ b/src/internal/tester/config.go @@ -31,18 +31,20 @@ const ( TestCfgLoadTestUserID = "loadtestm365userid" TestCfgLoadTestOrgUsers = "loadtestm365orgusers" TestCfgAccountProvider = "account_provider" + TestCfgUnlicensedUserID = "unlicensedm365userid" ) // test specific env vars const ( - EnvCorsoM365TestSiteID = "CORSO_M365_TEST_SITE_ID" - EnvCorsoM365TestSiteURL = "CORSO_M365_TEST_SITE_URL" - EnvCorsoM365TestUserID = "CORSO_M365_TEST_USER_ID" - EnvCorsoSecondaryM365TestUserID = "CORSO_SECONDARY_M365_TEST_USER_ID" - EnvCorsoTertiaryM365TestUserID = "CORSO_TERTIARY_M365_TEST_USER_ID" - EnvCorsoM365LoadTestUserID = "CORSO_M365_LOAD_TEST_USER_ID" - EnvCorsoM365LoadTestOrgUsers = "CORSO_M365_LOAD_TEST_ORG_USERS" - EnvCorsoTestConfigFilePath = "CORSO_TEST_CONFIG_FILE" + EnvCorsoM365TestSiteID = "CORSO_M365_TEST_SITE_ID" + EnvCorsoM365TestSiteURL = "CORSO_M365_TEST_SITE_URL" + EnvCorsoM365TestUserID = "CORSO_M365_TEST_USER_ID" + EnvCorsoSecondaryM365TestUserID = "CORSO_SECONDARY_M365_TEST_USER_ID" + EnvCorsoTertiaryM365TestUserID = "CORSO_TERTIARY_M365_TEST_USER_ID" + EnvCorsoM365LoadTestUserID = "CORSO_M365_LOAD_TEST_USER_ID" + EnvCorsoM365LoadTestOrgUsers = "CORSO_M365_LOAD_TEST_ORG_USERS" + EnvCorsoTestConfigFilePath = "CORSO_TEST_CONFIG_FILE" + EnvCorsoUnlicensedM365TestUserID = "CORSO_M365_TEST_UNLICENSED_USER" ) // global to hold the test config results. @@ -152,6 +154,12 @@ func readTestConfig() (map[string]string, error) { os.Getenv(EnvCorsoM365TestSiteURL), vpr.GetString(TestCfgSiteURL), "https://10rqc2.sharepoint.com/sites/CorsoCI") + fallbackTo( + testEnv, + TestCfgUnlicensedUserID, + os.Getenv(EnvCorsoUnlicensedM365TestUserID), + vpr.GetString(TestCfgUnlicensedUserID), + "testevents@10rqc2.onmicrosoft.com") testEnv[EnvCorsoTestConfigFilePath] = os.Getenv(EnvCorsoTestConfigFilePath) testConfig = testEnv diff --git a/src/internal/tester/resource_owners.go b/src/internal/tester/resource_owners.go index fb8a75837..63f929b50 100644 --- a/src/internal/tester/resource_owners.go +++ b/src/internal/tester/resource_owners.go @@ -197,3 +197,15 @@ func GetM365SiteID(ctx context.Context) string { return strings.ToLower(cfg[TestCfgSiteID]) } + +// UnlicensedM365UserID returns an userID string representing the m365UserID +// described by either the env var CORSO_M365_TEST_UNLICENSED_USER, the +// corso_test.toml config file or the default value (in that order of priority). +// The default is a last-attempt fallback that will only work on alcion's +// testing org. +func UnlicensedM365UserID(t *testing.T) string { + cfg, err := readTestConfig() + require.NoError(t, err, "retrieving unlicensed m365 user id from test configuration", clues.ToCore(err)) + + return strings.ToLower(cfg[TestCfgSecondaryUserID]) +}