Skip to content

Commit b3e47a4

Browse files
committed
Allow managing workspace data retention policy
1 parent ca41a0e commit b3e47a4

File tree

3 files changed

+168
-0
lines changed

3 files changed

+168
-0
lines changed

mocks/workspace_mocks.go

Lines changed: 44 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

workspace.go

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,18 @@ type Workspaces interface {
101101

102102
// RemoveTags removes tags from a workspace
103103
RemoveTags(ctx context.Context, workspaceID string, options WorkspaceRemoveTagsOptions) error
104+
105+
// ReadDataRetentionPolicy reads a workspace's data retention policy
106+
// **Note: This functionality is only available in Terraform Enterprise.**
107+
ReadDataRetentionPolicy(ctx context.Context, workspaceID string) (*DataRetentionPolicy, error)
108+
109+
// SetDataRetentionPolicy sets a workspace's data retention policy
110+
// **Note: This functionality is only available in Terraform Enterprise.**
111+
SetDataRetentionPolicy(ctx context.Context, workspaceID string, options DataRetentionPolicySetOptions) (*DataRetentionPolicy, error)
112+
113+
// DeleteDataRetentionPolicy deletes a workspace's data retention policy
114+
// **Note: This functionality is only available in Terraform Enterprise.**
115+
DeleteDataRetentionPolicy(ctx context.Context, workspaceID string) error
104116
}
105117

106118
// workspaces implements Workspaces.
@@ -165,6 +177,9 @@ type Workspace struct {
165177
Tags []*Tag `jsonapi:"relation,tags"`
166178
CurrentConfigurationVersion *ConfigurationVersion `jsonapi:"relation,current-configuration-version,omitempty"`
167179

180+
// **Note: This functionality is only available in Terraform Enterprise.**
181+
DataRetentionPolicy *DataRetentionPolicy `jsonapi:"relation,data-retention-policy"`
182+
168183
// Links
169184
Links map[string]interface{} `jsonapi:"links,omitempty"`
170185
}
@@ -1182,6 +1197,62 @@ func (s *workspaces) RemoveTags(ctx context.Context, workspaceID string, options
11821197
return req.Do(ctx, nil)
11831198
}
11841199

1200+
func (s *workspaces) ReadDataRetentionPolicy(ctx context.Context, workspaceID string) (*DataRetentionPolicy, error) {
1201+
if !validStringID(&workspaceID) {
1202+
return nil, ErrInvalidWorkspaceID
1203+
}
1204+
1205+
u := fmt.Sprintf("workspaces/%s/relationships/data-retention-policy", url.QueryEscape(workspaceID))
1206+
req, err := s.client.NewRequest("GET", u, nil)
1207+
if err != nil {
1208+
return nil, err
1209+
}
1210+
1211+
dataRetentionPolicy := &DataRetentionPolicy{}
1212+
err = req.Do(ctx, dataRetentionPolicy)
1213+
1214+
if err != nil {
1215+
return nil, err
1216+
}
1217+
1218+
return dataRetentionPolicy, nil
1219+
}
1220+
1221+
func (s *workspaces) SetDataRetentionPolicy(ctx context.Context, workspaceID string, options DataRetentionPolicySetOptions) (*DataRetentionPolicy, error) {
1222+
if !validStringID(&workspaceID) {
1223+
return nil, ErrInvalidWorkspaceID
1224+
}
1225+
1226+
u := fmt.Sprintf("workspaces/%s/relationships/data-retention-policy", url.QueryEscape(workspaceID))
1227+
req, err := s.client.NewRequest("PATCH", u, &options)
1228+
if err != nil {
1229+
return nil, err
1230+
}
1231+
1232+
dataRetentionPolicy := &DataRetentionPolicy{}
1233+
err = req.Do(ctx, dataRetentionPolicy)
1234+
1235+
if err != nil {
1236+
return nil, err
1237+
}
1238+
1239+
return dataRetentionPolicy, nil
1240+
}
1241+
1242+
func (s *workspaces) DeleteDataRetentionPolicy(ctx context.Context, workspaceID string) error {
1243+
if !validStringID(&workspaceID) {
1244+
return ErrInvalidWorkspaceID
1245+
}
1246+
1247+
u := fmt.Sprintf("workspaces/%s/relationships/data-retention-policy", url.QueryEscape(workspaceID))
1248+
req, err := s.client.NewRequest("DELETE", u, nil)
1249+
if err != nil {
1250+
return err
1251+
}
1252+
1253+
return req.Do(ctx, nil)
1254+
}
1255+
11851256
func (o WorkspaceCreateOptions) valid() error {
11861257
if !validString(o.Name) {
11871258
return ErrRequiredName

workspace_integration_test.go

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2585,3 +2585,56 @@ func TestWorkspacesProjects(t *testing.T) {
25852585
}
25862586
})
25872587
}
2588+
2589+
func TestWorkspace_DataRetentionPolicy(t *testing.T) {
2590+
skipUnlessEnterprise(t)
2591+
2592+
client := testClient(t)
2593+
ctx := context.Background()
2594+
2595+
wTest, wTestCleanup := createWorkspace(t, client, nil)
2596+
defer wTestCleanup()
2597+
2598+
dataRetentionPolicy, err := client.Workspaces.ReadDataRetentionPolicy(ctx, wTest.ID)
2599+
assert.Equal(t, ErrResourceNotFound, err)
2600+
require.Nil(t, dataRetentionPolicy)
2601+
2602+
workspace, err := client.Workspaces.ReadByID(ctx, wTest.ID)
2603+
require.NoError(t, err)
2604+
require.Nil(t, workspace.DataRetentionPolicy)
2605+
2606+
t.Run("set data retention policy", func(t *testing.T) {
2607+
createdDataRetentionPolicy, err := client.Workspaces.SetDataRetentionPolicy(ctx, wTest.ID, DataRetentionPolicySetOptions{DeleteOlderThanNDays: 33})
2608+
require.NoError(t, err)
2609+
require.Equal(t, 33, createdDataRetentionPolicy.DeleteOlderThanNDays)
2610+
require.Contains(t, createdDataRetentionPolicy.ID, "drp-")
2611+
2612+
dataRetentionPolicy, err = client.Workspaces.ReadDataRetentionPolicy(ctx, wTest.ID)
2613+
require.NoError(t, err)
2614+
require.Equal(t, 33, dataRetentionPolicy.DeleteOlderThanNDays)
2615+
require.Equal(t, createdDataRetentionPolicy.ID, dataRetentionPolicy.ID)
2616+
require.Contains(t, dataRetentionPolicy.ID, "drp-")
2617+
2618+
workspace, err := client.Workspaces.ReadByID(ctx, wTest.ID)
2619+
require.NoError(t, err)
2620+
require.Equal(t, dataRetentionPolicy.ID, workspace.DataRetentionPolicy.ID)
2621+
})
2622+
2623+
t.Run("update data retention policy", func(t *testing.T) {
2624+
_, err = client.Workspaces.SetDataRetentionPolicy(ctx, wTest.ID, DataRetentionPolicySetOptions{DeleteOlderThanNDays: 45})
2625+
require.NoError(t, err)
2626+
2627+
dataRetentionPolicy, err = client.Workspaces.ReadDataRetentionPolicy(ctx, wTest.ID)
2628+
require.NoError(t, err)
2629+
require.Equal(t, 45, dataRetentionPolicy.DeleteOlderThanNDays)
2630+
})
2631+
2632+
t.Run("delete data retention policy", func(t *testing.T) {
2633+
err = client.Workspaces.DeleteDataRetentionPolicy(ctx, wTest.ID)
2634+
require.NoError(t, err)
2635+
2636+
dataRetentionPolicy, err = client.Workspaces.ReadDataRetentionPolicy(ctx, wTest.ID)
2637+
assert.Equal(t, ErrResourceNotFound, err)
2638+
require.Nil(t, dataRetentionPolicy)
2639+
})
2640+
}

0 commit comments

Comments
 (0)