@@ -21,6 +21,7 @@ import (
2121"github.com/coder/coder/v2/coderd/database/dbgen"
2222"github.com/coder/coder/v2/coderd/database/dbtestutil"
2323"github.com/coder/coder/v2/coderd/database/dbtime"
24+ "github.com/coder/coder/v2/coderd/rbac"
2425"github.com/coder/coder/v2/codersdk"
2526)
2627
@@ -69,7 +70,8 @@ func TestProvisioners_Golden(t *testing.T) {
6970Pubsub :ps ,
7071})
7172owner := coderdtest .CreateFirstUser (t ,client )
72- member ,memberUser := coderdtest .CreateAnotherUser (t ,client ,owner .OrganizationID )
73+ templateAdminClient ,_ := coderdtest .CreateAnotherUser (t ,client ,owner .OrganizationID ,rbac .ScopedRoleOrgTemplateAdmin (owner .OrganizationID ))
74+ memberClient ,member := coderdtest .CreateAnotherUser (t ,client ,owner .OrganizationID )
7375
7476// Create initial resources with a running provisioner.
7577firstProvisioner := coderdtest .NewProvisionerDaemon (t ,coderdAPI )
@@ -78,7 +80,6 @@ func TestProvisioners_Golden(t *testing.T) {
7880coderdtest .AwaitTemplateVersionJobCompleted (t ,client ,version .ID )
7981template := coderdtest .CreateTemplate (t ,client ,owner .OrganizationID ,version .ID )
8082
81- time .Sleep (1500 * time .Millisecond )// Ensure the workspace build job has a different timestamp for sorting.
8283workspace := coderdtest .CreateWorkspace (t ,client ,template .ID )
8384coderdtest .AwaitWorkspaceBuildJobCompleted (t ,client ,workspace .LatestBuild .ID )
8485
@@ -94,9 +95,10 @@ func TestProvisioners_Golden(t *testing.T) {
9495Name :"provisioner-1" ,
9596CreatedAt :dbtime .Now ().Add (1 * time .Second ),
9697KeyID :uuid .MustParse (codersdk .ProvisionerKeyIDBuiltIn ),
98+ Tags : database.StringMap {"owner" :"" ,"scope" :"organization" ,"foo" :"bar" },
9799})
98100w1 := dbgen .Workspace (t ,coderdAPI .Database , database.WorkspaceTable {
99- OwnerID :memberUser .ID ,
101+ OwnerID :member .ID ,
100102TemplateID :template .ID ,
101103})
102104wb1ID := uuid .MustParse ("00000000-0000-0000-dddd-000000000001" )
@@ -105,7 +107,7 @@ func TestProvisioners_Golden(t *testing.T) {
105107Input :json .RawMessage (`{"workspace_build_id":"` + wb1ID .String ()+ `"}` ),
106108CreatedAt :dbtime .Now ().Add (2 * time .Second ),
107109StartedAt : sql.NullTime {Time :coderdAPI .Clock .Now (),Valid :true },
108- Tags : database.StringMap {"owner" :"" ,"scope" :"organization" },
110+ Tags : database.StringMap {"owner" :"" ,"scope" :"organization" , "foo" : "bar" },
109111})
110112dbgen .WorkspaceBuild (t ,coderdAPI .Database , database.WorkspaceBuild {
111113ID :wb1ID ,
@@ -120,9 +122,10 @@ func TestProvisioners_Golden(t *testing.T) {
120122CreatedAt :dbtime .Now ().Add (2 * time .Second ),
121123LastSeenAt : sql.NullTime {Time :coderdAPI .Clock .Now ().Add (- time .Hour ),Valid :true },
122124KeyID :uuid .MustParse (codersdk .ProvisionerKeyIDBuiltIn ),
125+ Tags : database.StringMap {"owner" :"" ,"scope" :"organization" },
123126})
124127w2 := dbgen .Workspace (t ,coderdAPI .Database , database.WorkspaceTable {
125- OwnerID :memberUser .ID ,
128+ OwnerID :member .ID ,
126129TemplateID :template .ID ,
127130})
128131wb2ID := uuid .MustParse ("00000000-0000-0000-dddd-000000000002" )
@@ -143,7 +146,7 @@ func TestProvisioners_Golden(t *testing.T) {
143146
144147// Create a pending job.
145148w3 := dbgen .Workspace (t ,coderdAPI .Database , database.WorkspaceTable {
146- OwnerID :memberUser .ID ,
149+ OwnerID :member .ID ,
147150TemplateID :template .ID ,
148151})
149152wb3ID := uuid .MustParse ("00000000-0000-0000-dddd-000000000003" )
@@ -164,6 +167,7 @@ func TestProvisioners_Golden(t *testing.T) {
164167Name :"provisioner-3" ,
165168CreatedAt :dbtime .Now ().Add (3 * time .Second ),
166169KeyID :uuid .MustParse (codersdk .ProvisionerKeyIDBuiltIn ),
170+ Tags : database.StringMap {"owner" :"" ,"scope" :"organization" },
167171})
168172
169173updateReplaceUUIDs (coderdAPI )
@@ -172,23 +176,28 @@ func TestProvisioners_Golden(t *testing.T) {
172176t .Logf ("replace[%q] = %q" ,id ,replaceID )
173177}
174178
179+ // Test provisioners list with member as members can access
180+ // provisioner daemons.
175181t .Run ("list" ,func (t * testing.T ) {
176182t .Parallel ()
177183
178184var got bytes.Buffer
179185inv ,root := clitest .New (t ,
180186"provisioners" ,
181187"list" ,
182- "--column" ,"id,created at,last seen at,name,version,api version, tags,status,current job id,previous job id,previous job status,organization" ,
188+ "--column" ,"id,created at,last seen at,name,version,tags,key name, status,current job id,current job status ,previous job id,previous job status,organization" ,
183189)
184190inv .Stdout = & got
185- clitest .SetupConfig (t ,member ,root )
191+ clitest .SetupConfig (t ,memberClient ,root )
186192err := inv .Run ()
187193require .NoError (t ,err )
188194
189195clitest .TestGoldenFile (t ,t .Name (),got .Bytes (),replace )
190196})
191197
198+ // Test jobs list with template admin as members are currently
199+ // unable to access provisioner jobs. In the future (with RBAC
200+ // changes), we may allow them to view _their_ jobs.
192201t .Run ("jobs list" ,func (t * testing.T ) {
193202t .Parallel ()
194203
@@ -200,7 +209,7 @@ func TestProvisioners_Golden(t *testing.T) {
200209"--column" ,"id,created at,status,worker id,tags,template version id,workspace build id,type,available workers,organization,queue" ,
201210)
202211inv .Stdout = & got
203- clitest .SetupConfig (t ,member ,root )
212+ clitest .SetupConfig (t ,templateAdminClient ,root )
204213err := inv .Run ()
205214require .NoError (t ,err )
206215