1
1
package coderd_test
2
2
3
3
import (
4
+ "bytes"
4
5
"testing"
5
6
6
7
"github.com/stretchr/testify/require"
@@ -10,14 +11,26 @@ import (
10
11
"github.com/coder/coder/v2/codersdk"
11
12
"github.com/coder/coder/v2/enterprise/coderd/coderdenttest"
12
13
"github.com/coder/coder/v2/enterprise/coderd/license"
14
+ "github.com/coder/coder/v2/provisioner/echo"
13
15
"github.com/coder/coder/v2/testutil"
14
16
)
15
17
16
18
func TestCustomRole (t * testing.T ) {
17
19
t .Parallel ()
20
+ templateAdminCustom := codersdk.Role {
21
+ Name : "test-role" ,
22
+ DisplayName : "Testing Purposes" ,
23
+ // Basically creating a template admin manually
24
+ SitePermissions : codersdk .CreatePermissions (map [codersdk.RBACResource ][]codersdk.RBACAction {
25
+ codersdk .ResourceTemplate : {codersdk .ActionCreate , codersdk .ActionRead , codersdk .ActionUpdate , codersdk .ActionViewInsights },
26
+ codersdk .ResourceFile : {codersdk .ActionCreate , codersdk .ActionRead },
27
+ codersdk .ResourceWorkspace : {codersdk .ActionRead },
28
+ }),
29
+ OrganizationPermissions : nil ,
30
+ UserPermissions : nil ,
31
+ }
18
32
19
33
// Create, assign, and use a custom role
20
- //nolint:gocritic
21
34
t .Run ("Success" , func (t * testing.T ) {
22
35
t .Parallel ()
23
36
dv := coderdtest .DeploymentValues (t )
@@ -36,18 +49,7 @@ func TestCustomRole(t *testing.T) {
36
49
ctx := testutil .Context (t , testutil .WaitMedium )
37
50
38
51
//nolint:gocritic // owner is required for this
39
- role , err := owner .PatchRole (ctx , codersdk.Role {
40
- Name : "test-role" ,
41
- DisplayName : "Testing Purposes" ,
42
- // Basically creating a template admin manually
43
- SitePermissions : codersdk .CreatePermissions (map [codersdk.RBACResource ][]codersdk.RBACAction {
44
- codersdk .ResourceTemplate : {codersdk .ActionCreate , codersdk .ActionRead , codersdk .ActionUpdate , codersdk .ActionViewInsights },
45
- codersdk .ResourceFile : {codersdk .ActionCreate , codersdk .ActionRead },
46
- codersdk .ResourceWorkspace : {codersdk .ActionRead },
47
- }),
48
- OrganizationPermissions : nil ,
49
- UserPermissions : nil ,
50
- })
52
+ role , err := owner .PatchRole (ctx , templateAdminCustom )
51
53
require .NoError (t , err , "upsert role" )
52
54
53
55
// Assign the custom template admin role
@@ -69,4 +71,100 @@ func TestCustomRole(t *testing.T) {
69
71
// return selected.Name == role.Name
70
72
//}), "role missing from site role list")
71
73
})
74
+
75
+ // Revoked licenses cannot modify/create custom roles, but they can
76
+ // use the existing roles.
77
+ t .Run ("Revoked License" , func (t * testing.T ) {
78
+ t .Parallel ()
79
+ dv := coderdtest .DeploymentValues (t )
80
+ dv .Experiments = []string {string (codersdk .ExperimentCustomRoles )}
81
+ owner , first := coderdenttest .New (t , & coderdenttest.Options {
82
+ Options : & coderdtest.Options {
83
+ DeploymentValues : dv ,
84
+ },
85
+ LicenseOptions : & coderdenttest.LicenseOptions {
86
+ Features : license.Features {
87
+ codersdk .FeatureCustomRoles : 1 ,
88
+ },
89
+ },
90
+ })
91
+
92
+ ctx := testutil .Context (t , testutil .WaitMedium )
93
+
94
+ //nolint:gocritic // owner is required for this
95
+ role , err := owner .PatchRole (ctx , templateAdminCustom )
96
+ require .NoError (t , err , "upsert role" )
97
+
98
+ // Remove the license to block enterprise functionality
99
+ licenses , err := owner .Licenses (ctx )
100
+ require .NoError (t , err , "get licenses" )
101
+ for _ , license := range licenses {
102
+ // Should be only 1...
103
+ err := owner .DeleteLicense (ctx , license .ID )
104
+ require .NoError (t , err , "delete license" )
105
+ }
106
+
107
+ // Verify functionality is lost
108
+ _ , err = owner .PatchRole (ctx , templateAdminCustom )
109
+ require .ErrorContains (t , err , "Custom roles is an Enterprise feature" , "upsert role" )
110
+
111
+ // Assign the custom template admin role
112
+ tmplAdmin , _ := coderdtest .CreateAnotherUser (t , owner , first .OrganizationID , role .Name )
113
+
114
+ // Try to create a template version, eg using the custom role
115
+ coderdtest .CreateTemplateVersion (t , tmplAdmin , first .OrganizationID , nil )
116
+ })
117
+
118
+ // Role patches are complete, as in the request overrides the existing role.
119
+ t .Run ("RoleOverrides" , func (t * testing.T ) {
120
+ t .Parallel ()
121
+ dv := coderdtest .DeploymentValues (t )
122
+ dv .Experiments = []string {string (codersdk .ExperimentCustomRoles )}
123
+ owner , first := coderdenttest .New (t , & coderdenttest.Options {
124
+ Options : & coderdtest.Options {
125
+ DeploymentValues : dv ,
126
+ },
127
+ LicenseOptions : & coderdenttest.LicenseOptions {
128
+ Features : license.Features {
129
+ codersdk .FeatureCustomRoles : 1 ,
130
+ },
131
+ },
132
+ })
133
+
134
+ ctx := testutil .Context (t , testutil .WaitMedium )
135
+ //nolint:gocritic // owner is required for this
136
+ role , err := owner .PatchRole (ctx , templateAdminCustom )
137
+ require .NoError (t , err , "upsert role" )
138
+
139
+ // Assign the custom template admin role
140
+ tmplAdmin , _ := coderdtest .CreateAnotherUser (t , owner , first .OrganizationID , role .Name )
141
+
142
+ // Try to create a template version, eg using the custom role
143
+ coderdtest .CreateTemplateVersion (t , tmplAdmin , first .OrganizationID , nil )
144
+
145
+ //nolint:gocritic // owner is required for this
146
+ role , err = owner .PatchRole (ctx , codersdk.Role {
147
+ Name : templateAdminCustom .Name ,
148
+ DisplayName : templateAdminCustom .DisplayName ,
149
+ // These are all left nil, which sets the custom role to have 0
150
+ // permissions. Omitting this does not "inherit" what already
151
+ // exists.
152
+ SitePermissions : nil ,
153
+ OrganizationPermissions : nil ,
154
+ UserPermissions : nil ,
155
+ })
156
+ require .NoError (t , err , "upsert role with override" )
157
+
158
+ // The role should no longer have template perms
159
+ data , err := echo .TarWithOptions (ctx , tmplAdmin .Logger (), nil )
160
+ require .NoError (t , err )
161
+ file , err := tmplAdmin .Upload (ctx , codersdk .ContentTypeTar , bytes .NewReader (data ))
162
+ require .NoError (t , err )
163
+ _ , err = tmplAdmin .CreateTemplateVersion (ctx , first .OrganizationID , codersdk.CreateTemplateVersionRequest {
164
+ FileID : file .ID ,
165
+ StorageMethod : codersdk .ProvisionerStorageMethodFile ,
166
+ Provisioner : codersdk .ProvisionerTypeEcho ,
167
+ })
168
+ require .ErrorContains (t , err , "forbidden" )
169
+ })
72
170
}
0 commit comments