mirror of
https://github.com/opentffoundation/opentf.git
synced 2025-12-25 01:00:16 -05:00
Use safe or force workspace delete for cloud backend
This commit is contained in:
@@ -40,11 +40,11 @@ func TestCloud_backendWithName(t *testing.T) {
|
||||
t.Fatalf("expected fetching a state which is NOT the single configured workspace to have an ErrWorkspacesNotSupported error, but got: %v", err)
|
||||
}
|
||||
|
||||
if err := b.DeleteWorkspace(testBackendSingleWorkspaceName); err != backend.ErrWorkspacesNotSupported {
|
||||
if err := b.DeleteWorkspace(testBackendSingleWorkspaceName, true); err != backend.ErrWorkspacesNotSupported {
|
||||
t.Fatalf("expected deleting the single configured workspace name to result in an error, but got: %v", err)
|
||||
}
|
||||
|
||||
if err := b.DeleteWorkspace("foo"); err != backend.ErrWorkspacesNotSupported {
|
||||
if err := b.DeleteWorkspace("foo", true); err != backend.ErrWorkspacesNotSupported {
|
||||
t.Fatalf("expected deleting a workspace which is NOT the configured workspace name to result in an error, but got: %v", err)
|
||||
}
|
||||
}
|
||||
@@ -856,7 +856,7 @@ func TestCloud_addAndRemoveWorkspacesDefault(t *testing.T) {
|
||||
t.Fatalf("expected no error, got %v", err)
|
||||
}
|
||||
|
||||
if err := b.DeleteWorkspace(testBackendSingleWorkspaceName); err != backend.ErrWorkspacesNotSupported {
|
||||
if err := b.DeleteWorkspace(testBackendSingleWorkspaceName, true); err != backend.ErrWorkspacesNotSupported {
|
||||
t.Fatalf("expected error %v, got %v", backend.ErrWorkspacesNotSupported, err)
|
||||
}
|
||||
}
|
||||
@@ -1139,3 +1139,82 @@ func TestCloud_VerifyWorkspaceTerraformVersion_ignoreFlagSet(t *testing.T) {
|
||||
t.Errorf("wrong summary: got %s, want %s", got, wantDetail)
|
||||
}
|
||||
}
|
||||
|
||||
func TestClodBackend_DeleteWorkspace_SafeAndForce(t *testing.T) {
|
||||
b, bCleanup := testBackendWithTags(t)
|
||||
defer bCleanup()
|
||||
safeDeleteWorkspaceName := "safe-delete-workspace"
|
||||
forceDeleteWorkspaceName := "force-delete-workspace"
|
||||
|
||||
_, err := b.StateMgr(safeDeleteWorkspaceName)
|
||||
if err != nil {
|
||||
t.Fatalf("error: %s", err)
|
||||
}
|
||||
|
||||
_, err = b.StateMgr(forceDeleteWorkspaceName)
|
||||
if err != nil {
|
||||
t.Fatalf("error: %s", err)
|
||||
}
|
||||
|
||||
// sanity check that the mock now contains two workspaces
|
||||
wl, err := b.Workspaces()
|
||||
if err != nil {
|
||||
t.Fatalf("error fetching workspace names: %v", err)
|
||||
}
|
||||
if len(wl) != 2 {
|
||||
t.Fatalf("expected 2 workspaced but got %d", len(wl))
|
||||
}
|
||||
|
||||
c := context.Background()
|
||||
safeDeleteWorkspace, err := b.client.Workspaces.Read(c, b.organization, safeDeleteWorkspaceName)
|
||||
if err != nil {
|
||||
t.Fatalf("error fetching workspace: %v", err)
|
||||
}
|
||||
|
||||
// Lock a workspace so that it should fail to be safe deleted
|
||||
_, err = b.client.Workspaces.Lock(context.Background(), safeDeleteWorkspace.ID, tfe.WorkspaceLockOptions{Reason: tfe.String("test")})
|
||||
if err != nil {
|
||||
t.Fatalf("error locking workspace: %v", err)
|
||||
}
|
||||
err = b.DeleteWorkspace(safeDeleteWorkspaceName, false)
|
||||
if err == nil {
|
||||
t.Fatalf("workspace should have failed to safe delete")
|
||||
}
|
||||
|
||||
// unlock the workspace and confirm that safe-delete now works
|
||||
_, err = b.client.Workspaces.Unlock(context.Background(), safeDeleteWorkspace.ID)
|
||||
if err != nil {
|
||||
t.Fatalf("error unlocking workspace: %v", err)
|
||||
}
|
||||
err = b.DeleteWorkspace(safeDeleteWorkspaceName, false)
|
||||
if err != nil {
|
||||
t.Fatalf("error safe deleting workspace: %v", err)
|
||||
}
|
||||
|
||||
// lock a workspace and then confirm that force deleting it works
|
||||
forceDeleteWorkspace, err := b.client.Workspaces.Read(c, b.organization, forceDeleteWorkspaceName)
|
||||
if err != nil {
|
||||
t.Fatalf("error fetching workspace: %v", err)
|
||||
}
|
||||
_, err = b.client.Workspaces.Lock(context.Background(), forceDeleteWorkspace.ID, tfe.WorkspaceLockOptions{Reason: tfe.String("test")})
|
||||
if err != nil {
|
||||
t.Fatalf("error locking workspace: %v", err)
|
||||
}
|
||||
err = b.DeleteWorkspace(forceDeleteWorkspaceName, true)
|
||||
if err != nil {
|
||||
t.Fatalf("error force deleting workspace: %v", err)
|
||||
}
|
||||
}
|
||||
|
||||
func TestClodBackend_DeleteWorkspace_DoesNotExist(t *testing.T) {
|
||||
b, bCleanup := testBackendWithTags(t)
|
||||
defer bCleanup()
|
||||
|
||||
err := b.DeleteWorkspace("non-existent-workspace", false)
|
||||
if err == nil {
|
||||
t.Fatalf("expected deleting a workspace which does not exist to fail")
|
||||
}
|
||||
if !strings.Contains(err.Error(), "failed to retrieve workspace non-existent-workspace") {
|
||||
t.Fatalf("expected deletion to fail with cannot find workspace error, but got %s", err.Error())
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user