Skip to content

Commit

Permalink
Allow managing StateVersion backing data
Browse files Browse the repository at this point in the history
  • Loading branch information
mwudka committed Nov 4, 2023
1 parent 04571b5 commit e29f127
Show file tree
Hide file tree
Showing 3 changed files with 126 additions and 0 deletions.
42 changes: 42 additions & 0 deletions mocks/state_version_mocks.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

38 changes: 38 additions & 0 deletions state_version.go
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,18 @@ type StateVersions interface {
// process outputs asynchronously. When consuming outputs or other async StateVersion fields, be sure to
// wait for ResourcesProcessed to become `true` before assuming they are empty.
ListOutputs(ctx context.Context, svID string, options *StateVersionOutputsListOptions) (*StateVersionOutputsList, error)

// SoftDeleteBackingData soft deletes the state version's backing data
// **Note: This functionality is only available in Terraform Enterprise.**
SoftDeleteBackingData(ctx context.Context, svID string) error

// RestoreBackingData restores a soft deleted state version's backing data
// **Note: This functionality is only available in Terraform Enterprise.**
RestoreBackingData(ctx context.Context, svID string) error

// PermanentlyDeleteBackingData permanently deletes a soft deleted state version's backing data
// **Note: This functionality is only available in Terraform Enterprise.**
PermanentlyDeleteBackingData(ctx context.Context, svID string) error
}

// stateVersions implements StateVersions.
Expand Down Expand Up @@ -398,6 +410,32 @@ func (s *stateVersions) ListOutputs(ctx context.Context, svID string, options *S
return sv, nil
}

func (s *stateVersions) SoftDeleteBackingData(ctx context.Context, svID string) error {
return s.manageBackingData(ctx, svID, "soft_delete_backing_data")
}

func (s *stateVersions) RestoreBackingData(ctx context.Context, svID string) error {
return s.manageBackingData(ctx, svID, "restore_backing_data")
}

func (s *stateVersions) PermanentlyDeleteBackingData(ctx context.Context, svID string) error {
return s.manageBackingData(ctx, svID, "permanently_delete_backing_data")
}

func (s *stateVersions) manageBackingData(ctx context.Context, svID, action string) error {
if !validStringID(&svID) {
return ErrInvalidStateVerID
}

u := fmt.Sprintf("state-versions/%s/actions/%s", svID, action)
req, err := s.client.NewRequest("POST", u, nil)
if err != nil {
return err
}

return req.Do(ctx, nil)
}

// check that StateVersionListOptions fields had valid values
func (o *StateVersionListOptions) valid() error {
if o == nil {
Expand Down
46 changes: 46 additions & 0 deletions state_version_integration_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -634,3 +634,49 @@ func TestStateVersionOutputs(t *testing.T) {
assert.Error(t, err)
})
}

func TestStateVersions_ManageBackingData(t *testing.T) {
skipUnlessEnterprise(t)

client := testClient(t)
ctx := context.Background()

workspace, workspaceCleanup := createWorkspace(t, client, nil)
t.Cleanup(workspaceCleanup)

nonCurrentStateVersion, svTestCleanup := createStateVersion(t, client, 0, workspace)
t.Cleanup(svTestCleanup)

_, svTestCleanup = createStateVersion(t, client, 0, workspace)
t.Cleanup(svTestCleanup)

t.Run("soft delete backing data", func(t *testing.T) {
err := client.StateVersions.SoftDeleteBackingData(ctx, nonCurrentStateVersion.ID)
require.NoError(t, err)

_, err = client.StateVersions.Download(ctx, nonCurrentStateVersion.DownloadURL)
assert.Equal(t, ErrResourceNotFound, err)
})

t.Run("restore backing data", func(t *testing.T) {
err := client.StateVersions.RestoreBackingData(ctx, nonCurrentStateVersion.ID)
require.NoError(t, err)

_, err = client.StateVersions.Download(ctx, nonCurrentStateVersion.DownloadURL)
require.NoError(t, err)
})

t.Run("permanently delete backing data", func(t *testing.T) {
err := client.StateVersions.SoftDeleteBackingData(ctx, nonCurrentStateVersion.ID)
require.NoError(t, err)

err = client.StateVersions.PermanentlyDeleteBackingData(ctx, nonCurrentStateVersion.ID)
require.NoError(t, err)

err = client.StateVersions.RestoreBackingData(ctx, nonCurrentStateVersion.ID)
require.ErrorContainsf(t, err, "transition not allowed", "Restore backing data should fail")

_, err = client.StateVersions.Download(ctx, nonCurrentStateVersion.DownloadURL)
assert.Equal(t, ErrResourceNotFound, err)
})
}

0 comments on commit e29f127

Please sign in to comment.