From 51e14c30a4d5352599216e30c714495964f2bae2 Mon Sep 17 00:00:00 2001 From: Espen Albert Date: Thu, 10 Apr 2025 20:36:15 +0100 Subject: [PATCH 1/5] refactor: support empty prefix for projects that shouldn't be deleted but have resources removed --- internal/testutil/clean/org_clean_test.go | 25 ++++++++++++++++++++--- 1 file changed, 22 insertions(+), 3 deletions(-) diff --git a/internal/testutil/clean/org_clean_test.go b/internal/testutil/clean/org_clean_test.go index 5b54f750b3..7066dcba65 100644 --- a/internal/testutil/clean/org_clean_test.go +++ b/internal/testutil/clean/org_clean_test.go @@ -37,6 +37,9 @@ var ( keptPrefixes = []string{ "test-acc-tf-p-keep", } + keepProjectEmptyPrefixes = []string{ + "test-acc-tf-p-empty", + } projectRetryDeleteErrors = []string{ "CANNOT_CLOSE_GROUP_ACTIVE_ATLAS_CLUSTERS", "CANNOT_CLOSE_GROUP_ACTIVE_PEERING_CONNECTIONS", @@ -87,18 +90,19 @@ func TestCleanProjectAndClusters(t *testing.T) { for _, p := range projects { skipReason := projectSkipReason(&p, skipProjectsAfter, onlyZeroClusters) projectName := p.GetName() + projectID := p.GetId() if skipReason != "" { - t.Logf("skip project %s, reason: %s", projectName, skipReason) + t.Logf("skip project %s (%s), reason: %s", projectName, projectID, skipReason) continue } projectInfos = append(projectInfos, fmt.Sprintf("Project created at %s name %s (%s)", p.GetCreated().Format(time.RFC3339), projectName, p.GetId())) - projectID := p.GetId() projectsToDelete[projectName] = projectID } t.Logf("will try to delete %d projects:", len(projectsToDelete)) slices.Sort(projectInfos) t.Log(strings.Join(projectInfos, "\n")) var deleteErrors int + var emptyProjectCount int for name, projectID := range projectsToDelete { t.Run(name, func(t *testing.T) { t.Parallel() @@ -106,6 +110,12 @@ func TestCleanProjectAndClusters(t *testing.T) { if changes != "" { t.Logf("project %s %s", name, changes) } + skipReason := projectNoDeleteReason(name) + if skipReason != "" { + t.Logf("keep project empty, but no delete %s (%s), reason: %s", name, projectID, skipReason) + emptyProjectCount++ + return + } var err error for i := range runRetries { attempt := i + 1 @@ -133,7 +143,7 @@ func TestCleanProjectAndClusters(t *testing.T) { t.Cleanup(func() { //nolint:usetesting // reason: using context.Background() here intentionally because t.Context() is canceled at cleanup projectsAfter := readAllProjects(context.Background(), t, client) - t.Logf("SUMMARY\nProjects changed from %d to %d\ndelete_errors=%d\nDRY_RUN=%t", projectsBefore, len(projectsAfter), deleteErrors, dryRun) + t.Logf("SUMMARY\nProjects changed from %d to %d\ndelete_errors=%d\nempty_project_count=%d\nDRY_RUN=%t", projectsBefore, len(projectsAfter), deleteErrors, emptyProjectCount, dryRun) }) } @@ -228,6 +238,15 @@ func projectSkipReason(p *admin.Group, skipProjectsAfter time.Time, onlyEmpty bo return "" } +func projectNoDeleteReason(name string) string { + for _, keepPrefix := range keepProjectEmptyPrefixes { + if strings.HasPrefix(name, keepPrefix) { + return "keep project but not resources" + } + } + return "" +} + func removeClusters(ctx context.Context, t *testing.T, dryRun bool, client *admin.APIClient, projectID string) int { t.Helper() clusters, _, err := client.ClustersApi.ListClusters(ctx, projectID).ItemsPerPage(itemsPerPage).Execute() From 819a31dcd2ed0c25dd689b3fecec86cf43ca27d5 Mon Sep 17 00:00:00 2001 From: Espen Albert Date: Tue, 22 Apr 2025 16:43:21 +0100 Subject: [PATCH 2/5] refactor: Remove resources from projects with `test-acc-tf-p-keep` (only found a few stream-instances for now) --- internal/testutil/clean/org_clean_test.go | 18 +++++------------- 1 file changed, 5 insertions(+), 13 deletions(-) diff --git a/internal/testutil/clean/org_clean_test.go b/internal/testutil/clean/org_clean_test.go index 7066dcba65..5e25453053 100644 --- a/internal/testutil/clean/org_clean_test.go +++ b/internal/testutil/clean/org_clean_test.go @@ -34,12 +34,11 @@ var ( "cfn-test-bot-", "test-acc-tf-p-", } + // These are projects gets their resources removed but the project itself is kept + // Useful when a feature flag or cloud provider is configured outside of the test keptPrefixes = []string{ "test-acc-tf-p-keep", } - keepProjectEmptyPrefixes = []string{ - "test-acc-tf-p-empty", - } projectRetryDeleteErrors = []string{ "CANNOT_CLOSE_GROUP_ACTIVE_ATLAS_CLUSTERS", "CANNOT_CLOSE_GROUP_ACTIVE_PEERING_CONNECTIONS", @@ -110,8 +109,7 @@ func TestCleanProjectAndClusters(t *testing.T) { if changes != "" { t.Logf("project %s %s", name, changes) } - skipReason := projectNoDeleteReason(name) - if skipReason != "" { + if skipReason := projectNoDeleteReason(name); skipReason != "" { t.Logf("keep project empty, but no delete %s (%s), reason: %s", name, projectID, skipReason) emptyProjectCount++ return @@ -141,8 +139,7 @@ func TestCleanProjectAndClusters(t *testing.T) { }) } t.Cleanup(func() { - //nolint:usetesting // reason: using context.Background() here intentionally because t.Context() is canceled at cleanup - projectsAfter := readAllProjects(context.Background(), t, client) + projectsAfter := readAllProjects(context.Background(), t, client) //nolint:usetesting // reason: using context.Background() here intentionally because t.Context() is canceled at cleanup t.Logf("SUMMARY\nProjects changed from %d to %d\ndelete_errors=%d\nempty_project_count=%d\nDRY_RUN=%t", projectsBefore, len(projectsAfter), deleteErrors, emptyProjectCount, dryRun) }) } @@ -214,11 +211,6 @@ func removeProjectResources(ctx context.Context, t *testing.T, dryRun bool, clie } func projectSkipReason(p *admin.Group, skipProjectsAfter time.Time, onlyEmpty bool) string { - for _, blessedPrefix := range keptPrefixes { - if strings.HasPrefix(p.GetName(), blessedPrefix) { - return "blessed prefix: " + blessedPrefix - } - } usesBotPrefix := false for _, botPrefix := range botProjectPrefixes { if strings.HasPrefix(p.GetName(), botPrefix) { @@ -239,7 +231,7 @@ func projectSkipReason(p *admin.Group, skipProjectsAfter time.Time, onlyEmpty bo } func projectNoDeleteReason(name string) string { - for _, keepPrefix := range keepProjectEmptyPrefixes { + for _, keepPrefix := range keptPrefixes { if strings.HasPrefix(name, keepPrefix) { return "keep project but not resources" } From 6fb0e44409c8e44ac6f3fcec5b0e53ab835648c2 Mon Sep 17 00:00:00 2001 From: Espen Albert Date: Wed, 23 Apr 2025 08:41:14 +0100 Subject: [PATCH 3/5] Update internal/testutil/clean/org_clean_test.go Co-authored-by: Leo Antoli <430982+lantoli@users.noreply.github.com> --- internal/testutil/clean/org_clean_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/internal/testutil/clean/org_clean_test.go b/internal/testutil/clean/org_clean_test.go index 5e25453053..c7d9e232e4 100644 --- a/internal/testutil/clean/org_clean_test.go +++ b/internal/testutil/clean/org_clean_test.go @@ -34,7 +34,7 @@ var ( "cfn-test-bot-", "test-acc-tf-p-", } - // These are projects gets their resources removed but the project itself is kept + // keptPrefixes has the prefix of the projects that we want to delete their resources but keep the projects themselves. // Useful when a feature flag or cloud provider is configured outside of the test keptPrefixes = []string{ "test-acc-tf-p-keep", From 47ad1b7e09e308fab9404b4872f1df889c79bef3 Mon Sep 17 00:00:00 2001 From: Espen Albert Date: Wed, 23 Apr 2025 08:43:42 +0100 Subject: [PATCH 4/5] refactor: Use a bool for skipProjectDelete --- internal/testutil/clean/org_clean_test.go | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/internal/testutil/clean/org_clean_test.go b/internal/testutil/clean/org_clean_test.go index c7d9e232e4..9e2de7a2e9 100644 --- a/internal/testutil/clean/org_clean_test.go +++ b/internal/testutil/clean/org_clean_test.go @@ -109,8 +109,8 @@ func TestCleanProjectAndClusters(t *testing.T) { if changes != "" { t.Logf("project %s %s", name, changes) } - if skipReason := projectNoDeleteReason(name); skipReason != "" { - t.Logf("keep project empty, but no delete %s (%s), reason: %s", name, projectID, skipReason) + if skipProjectDelete(name) { + t.Logf("keep project empty, but no delete %s (%s)", name, projectID) emptyProjectCount++ return } @@ -230,13 +230,13 @@ func projectSkipReason(p *admin.Group, skipProjectsAfter time.Time, onlyEmpty bo return "" } -func projectNoDeleteReason(name string) string { +func skipProjectDelete(name string) bool { for _, keepPrefix := range keptPrefixes { if strings.HasPrefix(name, keepPrefix) { - return "keep project but not resources" + return true } } - return "" + return false } func removeClusters(ctx context.Context, t *testing.T, dryRun bool, client *admin.APIClient, projectID string) int { From 975741bbb77058e5bd348f94274290131cc81edd Mon Sep 17 00:00:00 2001 From: Espen Albert Date: Thu, 24 Apr 2025 08:46:30 +0100 Subject: [PATCH 5/5] refactor: Rename projectsToDelete to projectsToClean for clarity in project resource management --- internal/testutil/clean/org_clean_test.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/internal/testutil/clean/org_clean_test.go b/internal/testutil/clean/org_clean_test.go index 9e2de7a2e9..09c376da14 100644 --- a/internal/testutil/clean/org_clean_test.go +++ b/internal/testutil/clean/org_clean_test.go @@ -84,7 +84,7 @@ func TestCleanProjectAndClusters(t *testing.T) { projects := readAllProjects(t.Context(), t, client) projectsBefore := len(projects) t.Logf("found %d projects (DRY_RUN=%t)", projectsBefore, dryRun) - projectsToDelete := map[string]string{} + projectsToClean := map[string]string{} projectInfos := []string{} for _, p := range projects { skipReason := projectSkipReason(&p, skipProjectsAfter, onlyZeroClusters) @@ -95,14 +95,14 @@ func TestCleanProjectAndClusters(t *testing.T) { continue } projectInfos = append(projectInfos, fmt.Sprintf("Project created at %s name %s (%s)", p.GetCreated().Format(time.RFC3339), projectName, p.GetId())) - projectsToDelete[projectName] = projectID + projectsToClean[projectName] = projectID } - t.Logf("will try to delete %d projects:", len(projectsToDelete)) + t.Logf("deleting project resources and optionally delete projects for %d projects", len(projectsToClean)) slices.Sort(projectInfos) t.Log(strings.Join(projectInfos, "\n")) var deleteErrors int var emptyProjectCount int - for name, projectID := range projectsToDelete { + for name, projectID := range projectsToClean { t.Run(name, func(t *testing.T) { t.Parallel() changes := removeProjectResources(t.Context(), t, dryRun, client, projectID)