From 3ecde5c1886e60aad4ba6de333564f13f22a1372 Mon Sep 17 00:00:00 2001 From: Emma Lanctot Date: Sun, 20 Nov 2022 20:30:39 -0800 Subject: [PATCH] feat: proactively check for RUM before safe delete --- CHANGELOG.md | 4 ++++ tfe/resource_tfe_workspace.go | 16 ++++++++++++++++ tfe/resource_tfe_workspace_test.go | 8 ++++++++ 3 files changed, 28 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index e2f1acaa7..ea724bd21 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,7 @@ +## Unreleased +FEATURES: +* r/tfe_workspace: Add preemptive check for resources under management when `force_delete` attribute is false ([#699](https://github.com/hashicorp/terraform-provider-tfe/pull/699)) + ## v0.39.0 (November 18, 2022) FEATURES: diff --git a/tfe/resource_tfe_workspace.go b/tfe/resource_tfe_workspace.go index 8309359ff..74f6db783 100644 --- a/tfe/resource_tfe_workspace.go +++ b/tfe/resource_tfe_workspace.go @@ -700,6 +700,10 @@ func resourceTFEWorkspaceDelete(d *schema.ResourceData, meta interface{}) error if forceDelete { err = tfeClient.Workspaces.DeleteByID(ctx, id) } else { + err = errWorkspaceResourceCountCheck(id, ws.ResourceCount) + if err != nil { + return err + } err = tfeClient.Workspaces.SafeDeleteByID(ctx, id) return errWorkspaceSafeDeleteWithPermission(id, err) } @@ -708,6 +712,10 @@ func resourceTFEWorkspaceDelete(d *schema.ResourceData, meta interface{}) error return fmt.Errorf( "Error deleting workspace %s: missing required permissions to set force delete workspaces in the organization.", id) } + err = errWorkspaceResourceCountCheck(id, ws.ResourceCount) + if err != nil { + return err + } err = tfeClient.Workspaces.SafeDeleteByID(ctx, id) } @@ -814,3 +822,11 @@ func errWorkspaceSafeDeleteWithPermission(workspaceID string, err error) error { } return nil } + +func errWorkspaceResourceCountCheck(workspaceID string, resourceCount int) error { + if resourceCount > 0 { + return fmt.Errorf( + "Error deleting workspace %s: This workspace has %v resources under management and must be force deleted by setting force_delete = true", workspaceID, resourceCount) + } + return nil +} diff --git a/tfe/resource_tfe_workspace_test.go b/tfe/resource_tfe_workspace_test.go index aed79bad3..f96498dcc 100644 --- a/tfe/resource_tfe_workspace_test.go +++ b/tfe/resource_tfe_workspace_test.go @@ -1917,6 +1917,7 @@ func TestTFEWorkspace_delete_withoutCanForceDeletePermission(t *testing.T) { t.Fatalf("unexpected err creating mock workspace %v", err) } workspace.Permissions.CanForceDelete = nil + workspace.ResourceCount = 2 rd := resourceTFEWorkspace().TestResourceData() rd.SetId(workspace.ID) @@ -1925,6 +1926,13 @@ func TestTFEWorkspace_delete_withoutCanForceDeletePermission(t *testing.T) { t.Fatalf("unexpected err creating configuration state %v", err) } + err = resourceTFEWorkspaceDelete(rd, client) + if err == nil { + t.Fatalf("Expected an error deleting workspace with CanForceDelete=nil, force_delete=true, and %v resources", workspace.ResourceCount) + } + + workspace.ResourceCount = 0 + err = resourceTFEWorkspaceDelete(rd, client) if err == nil { t.Fatalf("Expected an error deleting workspace with CanForceDelete=nil and force_delete=false")