Skip to content

Commit 4dfce8f

Browse files
authored
Merge pull request #1021 from hashicorp/netramali/TF-22972-add-project-varset-permission-to-team-project
Add variable sets permission to team project
2 parents 41f4c7a + a7f69e3 commit 4dfce8f

File tree

4 files changed

+158
-0
lines changed

4 files changed

+158
-0
lines changed

CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
# Unreleased
22

3+
## Enhancements
4+
5+
* Add BETA support for adding custom project permission for variable sets `ProjectVariableSetsPermission` by @netramali [21879](https://github.com/hashicorp/atlas/pull/21879)
6+
37
# v1.73.1
48

59
## Bug fixes

team_project_access.go

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,9 @@ type TeamProjectAccess struct {
7171
type TeamProjectAccessProjectPermissions struct {
7272
ProjectSettingsPermission ProjectSettingsPermissionType `jsonapi:"attr,settings"`
7373
ProjectTeamsPermission ProjectTeamsPermissionType `jsonapi:"attr,teams"`
74+
// ProjectVariableSetsPermission represents read, manage, and no access custom permission for project-level variable sets
75+
// This relation is considered BETA, SUBJECT TO CHANGE, and likely unavailable to most users.
76+
ProjectVariableSetsPermission ProjectVariableSetsPermissionType `jsonapi:"attr,variable-sets"`
7477
}
7578

7679
// WorkspacePermissions represents the team's permission on all workspaces in its project
@@ -104,6 +107,16 @@ const (
104107
ProjectTeamsPermissionManage ProjectTeamsPermissionType = "manage"
105108
)
106109

110+
// ProjectVariableSetsPermissionType represents the permission type to a project's variable sets
111+
// This relation is considered BETA, SUBJECT TO CHANGE, and likely unavailable to most users.
112+
type ProjectVariableSetsPermissionType string
113+
114+
const (
115+
ProjectVariableSetsPermissionNone ProjectVariableSetsPermissionType = "none"
116+
ProjectVariableSetsPermissionRead ProjectVariableSetsPermissionType = "read"
117+
ProjectVariableSetsPermissionWrite ProjectVariableSetsPermissionType = "write"
118+
)
119+
107120
// WorkspaceRunsPermissionType represents the permissiontype to project workspaces' runs
108121
type WorkspaceRunsPermissionType string
109122

@@ -143,6 +156,8 @@ const (
143156
type TeamProjectAccessProjectPermissionsOptions struct {
144157
Settings *ProjectSettingsPermissionType `json:"settings,omitempty"`
145158
Teams *ProjectTeamsPermissionType `json:"teams,omitempty"`
159+
// This relation is considered BETA, SUBJECT TO CHANGE, and likely unavailable to most users.
160+
VariableSets *ProjectVariableSetsPermissionType `json:"variable-sets,omitempty"`
146161
}
147162

148163
type TeamProjectAccessWorkspacePermissionsOptions struct {

team_project_access_integration_test.go

Lines changed: 134 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -165,6 +165,58 @@ func TestTeamProjectAccessesAdd(t *testing.T) {
165165
}
166166
})
167167

168+
t.Run("with no project access options for custom TeamProject permissions", func(t *testing.T) {
169+
skipUnlessBeta(t)
170+
options := TeamProjectAccessAddOptions{
171+
Access: *ProjectAccess(TeamProjectAccessCustom),
172+
Team: tmTest,
173+
Project: pTest,
174+
ProjectAccess: &TeamProjectAccessProjectPermissionsOptions{},
175+
WorkspaceAccess: &TeamProjectAccessWorkspacePermissionsOptions{
176+
Runs: WorkspaceRunsPermission(WorkspaceRunsPermissionApply),
177+
SentinelMocks: WorkspaceSentinelMocksPermission(WorkspaceSentinelMocksPermissionRead),
178+
StateVersions: WorkspaceStateVersionsPermission(WorkspaceStateVersionsPermissionWrite),
179+
Variables: WorkspaceVariablesPermission(WorkspaceVariablesPermissionWrite),
180+
Create: Bool(true),
181+
Locking: Bool(true),
182+
Move: Bool(true),
183+
Delete: Bool(false),
184+
RunTasks: Bool(false),
185+
},
186+
}
187+
188+
tpa, err := client.TeamProjectAccess.Add(ctx, options)
189+
defer func() {
190+
err := client.TeamProjectAccess.Remove(ctx, tpa.ID)
191+
if err != nil {
192+
t.Logf("error removing team access (%s): %s", tpa.ID, err)
193+
}
194+
}()
195+
196+
require.NoError(t, err)
197+
198+
// Get a refreshed view from the API.
199+
refreshed, err := client.TeamProjectAccess.Read(ctx, tpa.ID)
200+
require.NoError(t, err)
201+
202+
for _, item := range []*TeamProjectAccess{
203+
tpa,
204+
refreshed,
205+
} {
206+
assert.NotEmpty(t, item.ID)
207+
assert.Equal(t, options.Access, item.Access)
208+
assert.Equal(t, *options.WorkspaceAccess.Runs, item.WorkspaceAccess.WorkspaceRunsPermission)
209+
assert.Equal(t, *options.WorkspaceAccess.SentinelMocks, item.WorkspaceAccess.WorkspaceSentinelMocksPermission)
210+
assert.Equal(t, *options.WorkspaceAccess.StateVersions, item.WorkspaceAccess.WorkspaceStateVersionsPermission)
211+
assert.Equal(t, *options.WorkspaceAccess.Variables, item.WorkspaceAccess.WorkspaceVariablesPermission)
212+
assert.Equal(t, item.WorkspaceAccess.WorkspaceCreatePermission, true)
213+
assert.Equal(t, item.WorkspaceAccess.WorkspaceLockingPermission, true)
214+
assert.Equal(t, item.WorkspaceAccess.WorkspaceMovePermission, true)
215+
assert.Equal(t, item.WorkspaceAccess.WorkspaceDeletePermission, false)
216+
assert.Equal(t, item.WorkspaceAccess.WorkspaceRunTasksPermission, false)
217+
}
218+
})
219+
168220
t.Run("with valid options for all custom TeamProject permissions", func(t *testing.T) {
169221
options := TeamProjectAccessAddOptions{
170222
Access: *ProjectAccess(TeamProjectAccessCustom),
@@ -221,6 +273,45 @@ func TestTeamProjectAccessesAdd(t *testing.T) {
221273
}
222274
})
223275

276+
t.Run("with valid options for custom variable sets permissions", func(t *testing.T) {
277+
skipUnlessBeta(t)
278+
options := TeamProjectAccessAddOptions{
279+
Access: *ProjectAccess(TeamProjectAccessCustom),
280+
Team: tmTest,
281+
Project: pTest,
282+
ProjectAccess: &TeamProjectAccessProjectPermissionsOptions{
283+
VariableSets: ProjectVariableSetsPermission(ProjectVariableSetsPermissionWrite),
284+
},
285+
WorkspaceAccess: &TeamProjectAccessWorkspacePermissionsOptions{
286+
Runs: WorkspaceRunsPermission(WorkspaceRunsPermissionApply),
287+
},
288+
}
289+
290+
tpa, err := client.TeamProjectAccess.Add(ctx, options)
291+
t.Cleanup(func() {
292+
err := client.TeamProjectAccess.Remove(ctx, tpa.ID)
293+
if err != nil {
294+
t.Logf("error removing team access (%s): %s", tpa.ID, err)
295+
}
296+
})
297+
298+
require.NoError(t, err)
299+
300+
// Get a refreshed view from the API.
301+
refreshed, err := client.TeamProjectAccess.Read(ctx, tpa.ID)
302+
require.NoError(t, err)
303+
304+
for _, item := range []*TeamProjectAccess{
305+
tpa,
306+
refreshed,
307+
} {
308+
assert.NotEmpty(t, item.ID)
309+
assert.Equal(t, options.Access, item.Access)
310+
assert.Equal(t, *options.ProjectAccess.VariableSets, item.ProjectAccess.ProjectVariableSetsPermission)
311+
assert.Equal(t, *options.WorkspaceAccess.Runs, item.WorkspaceAccess.WorkspaceRunsPermission)
312+
}
313+
})
314+
224315
t.Run("with valid options for some custom TeamProject permissions", func(t *testing.T) {
225316
options := TeamProjectAccessAddOptions{
226317
Access: *ProjectAccess(TeamProjectAccessCustom),
@@ -389,6 +480,48 @@ func TestTeamProjectAccessesUpdate(t *testing.T) {
389480
assert.Equal(t, true, tpa.WorkspaceAccess.WorkspaceRunTasksPermission)
390481
})
391482

483+
t.Run("with valid custom permissions attributes for variable sets permissions", func(t *testing.T) {
484+
skipUnlessBeta(t)
485+
// create tpaCustomTest to verify unupdated attributes stay the same for custom permissions
486+
// because going from admin to read to custom changes the values of all custom permissions
487+
tm2Test, tm2TestCleanup := createTeam(t, client, orgTest)
488+
defer tm2TestCleanup()
489+
490+
TpaOptions := TeamProjectAccessAddOptions{
491+
Access: *ProjectAccess(TeamProjectAccessCustom),
492+
Team: tm2Test,
493+
Project: pTest,
494+
}
495+
496+
tpaCustomTest, err := client.TeamProjectAccess.Add(ctx, TpaOptions)
497+
require.NoError(t, err)
498+
499+
options := TeamProjectAccessUpdateOptions{
500+
Access: ProjectAccess(TeamProjectAccessCustom),
501+
ProjectAccess: &TeamProjectAccessProjectPermissionsOptions{
502+
VariableSets: ProjectVariableSetsPermission(ProjectVariableSetsPermissionRead),
503+
},
504+
WorkspaceAccess: &TeamProjectAccessWorkspacePermissionsOptions{
505+
Create: Bool(false),
506+
},
507+
}
508+
509+
tpa, err := client.TeamProjectAccess.Update(ctx, tpaCustomTest.ID, options)
510+
require.NoError(t, err)
511+
require.NotNil(t, options.ProjectAccess)
512+
require.NotNil(t, options.WorkspaceAccess)
513+
assert.Equal(t, *options.ProjectAccess.VariableSets, tpa.ProjectAccess.ProjectVariableSetsPermission)
514+
assert.Equal(t, false, tpa.WorkspaceAccess.WorkspaceCreatePermission)
515+
// assert that other attributes remain the same
516+
assert.Equal(t, tpaCustomTest.ProjectAccess.ProjectSettingsPermission, tpa.ProjectAccess.ProjectSettingsPermission)
517+
assert.Equal(t, tpaCustomTest.WorkspaceAccess.WorkspaceLockingPermission, tpa.WorkspaceAccess.WorkspaceLockingPermission)
518+
assert.Equal(t, tpaCustomTest.WorkspaceAccess.WorkspaceMovePermission, tpa.WorkspaceAccess.WorkspaceMovePermission)
519+
assert.Equal(t, tpaCustomTest.WorkspaceAccess.WorkspaceDeletePermission, tpa.WorkspaceAccess.WorkspaceDeletePermission)
520+
assert.Equal(t, tpaCustomTest.WorkspaceAccess.WorkspaceRunsPermission, tpa.WorkspaceAccess.WorkspaceRunsPermission)
521+
assert.Equal(t, tpaCustomTest.WorkspaceAccess.WorkspaceSentinelMocksPermission, tpa.WorkspaceAccess.WorkspaceSentinelMocksPermission)
522+
assert.Equal(t, tpaCustomTest.WorkspaceAccess.WorkspaceStateVersionsPermission, tpa.WorkspaceAccess.WorkspaceStateVersionsPermission)
523+
})
524+
392525
t.Run("with valid custom permissions attributes for some permissions", func(t *testing.T) {
393526
// create tpaCustomTest to verify unupdated attributes stay the same for custom permissions
394527
// because going from admin to read to custom changes the values of all custom permissions
@@ -429,6 +562,7 @@ func TestTeamProjectAccessesUpdate(t *testing.T) {
429562
assert.Equal(t, tpaCustomTest.WorkspaceAccess.WorkspaceSentinelMocksPermission, tpa.WorkspaceAccess.WorkspaceSentinelMocksPermission)
430563
assert.Equal(t, tpaCustomTest.WorkspaceAccess.WorkspaceStateVersionsPermission, tpa.WorkspaceAccess.WorkspaceStateVersionsPermission)
431564
})
565+
432566
t.Run("with invalid custom permissions attributes", func(t *testing.T) {
433567
options := TeamProjectAccessUpdateOptions{
434568
Access: ProjectAccess(TeamProjectAccessCustom),

type_helpers.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,11 @@ func ProjectTeamsPermission(v ProjectTeamsPermissionType) *ProjectTeamsPermissio
2929
return &v
3030
}
3131

32+
// ProjectVariableSetsPermission returns a pointer to the given team access project type.
33+
func ProjectVariableSetsPermission(v ProjectVariableSetsPermissionType) *ProjectVariableSetsPermissionType {
34+
return &v
35+
}
36+
3237
// WorkspaceRunsPermission returns a pointer to the given team access project type.
3338
func WorkspaceRunsPermission(v WorkspaceRunsPermissionType) *WorkspaceRunsPermissionType {
3439
return &v

0 commit comments

Comments
 (0)