diff --git a/tfe/resource_tfe_workspace.go b/tfe/resource_tfe_workspace.go index dfd791e20..c70dfa090 100644 --- a/tfe/resource_tfe_workspace.go +++ b/tfe/resource_tfe_workspace.go @@ -688,15 +688,33 @@ func resourceTFEWorkspaceDelete(d *schema.ResourceData, meta interface{}) error forceDelete := d.Get("force_delete").(bool) - if ws.Permissions.CanForceDelete == nil && !forceDelete { - return fmt.Errorf( - "Error deleting workspace %s: This workspace must be force deleted by setting force_delete=true", id) - } - - if forceDelete { - err = tfeClient.Workspaces.DeleteByID(ctx, id) + // presence of Permissions.CanForceDelete will determine if current version of TFE supports safe deletes + if ws.Permissions.CanForceDelete == nil { + if forceDelete { + err = tfeClient.Workspaces.DeleteByID(ctx, id) + } else { + return fmt.Errorf( + "Error deleting workspace %s: This workspace must be force deleted by setting force_delete=true", id) + } + } else if *ws.Permissions.CanForceDelete { + if forceDelete { + err = tfeClient.Workspaces.DeleteByID(ctx, id) + } else { + err = tfeClient.Workspaces.SafeDeleteByID(ctx, id) + if err != nil { + if strings.Contains(err.Error(), "conflict") { + return fmt.Errorf( + "Error deleting workspace %s: %w\nTo delete this workspace without destroying the managed resources, add force_delete=true to the resource config", id, err) + } + } + } } else { - err = tfeClient.Workspaces.SafeDeleteByID(ctx, id) + if forceDelete { + return fmt.Errorf( + "Error deleting workspace %s: missing required permissions to set force_delete=true", id) + } else { + err = tfeClient.Workspaces.SafeDeleteByID(ctx, id) + } } if err != nil { @@ -706,7 +724,6 @@ func resourceTFEWorkspaceDelete(d *schema.ResourceData, meta interface{}) error return fmt.Errorf( "Error deleting workspace %s: %w", id, err) } - return nil } diff --git a/tfe/resource_tfe_workspace_test.go b/tfe/resource_tfe_workspace_test.go index b81ff23eb..aed79bad3 100644 --- a/tfe/resource_tfe_workspace_test.go +++ b/tfe/resource_tfe_workspace_test.go @@ -1907,7 +1907,7 @@ func TestTFEWorkspace_delete_withoutCanForceDeletePermission(t *testing.T) { // workspace resource delete function directly, rather than use the usual resource. rInt := rand.New(rand.NewSource(time.Now().UnixNano())).Int() - orgName := fmt.Sprintf("test-orgnaization-%d", rInt) + orgName := fmt.Sprintf("test-organization-%d", rInt) client := testTfeClient(t, testClientOptions{defaultOrganization: orgName}) workspace, err := client.Workspaces.Create(ctx, orgName, tfe.WorkspaceCreateOptions{ @@ -1926,9 +1926,8 @@ func TestTFEWorkspace_delete_withoutCanForceDeletePermission(t *testing.T) { } err = resourceTFEWorkspaceDelete(rd, client) - if err == nil { - t.Fatalf("Expected an error deleting workspace with CanForceDelete=nil and force_delete=true") + t.Fatalf("Expected an error deleting workspace with CanForceDelete=nil and force_delete=false") } expectedErrSubstring := "workspace must be force deleted by setting force_delete=true" if !strings.Contains(err.Error(), expectedErrSubstring) {