@@ -25,6 +25,7 @@ import (
25
25
"github.com/coder/coder/v2/coderd/coderdtest/oidctest"
26
26
"github.com/coder/coder/v2/coderd/database"
27
27
"github.com/coder/coder/v2/coderd/database/dbauthz"
28
+ "github.com/coder/coder/v2/coderd/database/dbfake"
28
29
"github.com/coder/coder/v2/coderd/database/dbgen"
29
30
"github.com/coder/coder/v2/coderd/database/dbtestutil"
30
31
"github.com/coder/coder/v2/coderd/database/dbtime"
@@ -371,42 +372,140 @@ func TestWorkspaceBuildsProvisionerState(t *testing.T) {
371
372
372
373
t .Run ("Orphan" , func (t * testing.T ) {
373
374
t .Parallel ()
374
- client := coderdtest .New (t , & coderdtest.Options {IncludeProvisionerDaemon : true })
375
- first := coderdtest .CreateFirstUser (t , client )
376
-
377
- ctx , cancel := context .WithTimeout (context .Background (), testutil .WaitLong )
378
- defer cancel ()
379
375
380
- version := coderdtest .CreateTemplateVersion (t , client , first .OrganizationID , nil )
381
- template := coderdtest .CreateTemplate (t , client , first .OrganizationID , version .ID )
382
- coderdtest .AwaitTemplateVersionJobCompleted (t , client , version .ID )
376
+ t .Run ("WithoutDelete" , func (t * testing.T ) {
377
+ t .Parallel ()
378
+ client , store := coderdtest .NewWithDatabase (t , nil )
379
+ first := coderdtest .CreateFirstUser (t , client )
380
+ templateAdmin , templateAdminUser := coderdtest .CreateAnotherUser (t , client , first .OrganizationID , rbac .RoleTemplateAdmin ())
381
+
382
+ r := dbfake .WorkspaceBuild (t , store , database.WorkspaceTable {
383
+ OwnerID : templateAdminUser .ID ,
384
+ OrganizationID : first .OrganizationID ,
385
+ }).Do ()
386
+
387
+ ctx , cancel := context .WithTimeout (context .Background (), testutil .WaitLong )
388
+ defer cancel ()
389
+
390
+ // Trying to orphan without delete transition fails.
391
+ _ , err := templateAdmin .CreateWorkspaceBuild (ctx , r .Workspace .ID , codersdk.CreateWorkspaceBuildRequest {
392
+ TemplateVersionID : r .TemplateVersion .ID ,
393
+ Transition : codersdk .WorkspaceTransitionStart ,
394
+ Orphan : true ,
395
+ })
396
+ require .Error (t , err , "Orphan is only permitted when deleting a workspace." )
397
+ cerr := coderdtest .SDKError (t , err )
398
+ require .Equal (t , http .StatusBadRequest , cerr .StatusCode ())
399
+ })
383
400
384
- workspace := coderdtest .CreateWorkspace (t , client , template .ID )
385
- coderdtest .AwaitWorkspaceBuildJobCompleted (t , client , workspace .LatestBuild .ID )
401
+ t .Run ("WithState" , func (t * testing.T ) {
402
+ t .Parallel ()
403
+ client , store := coderdtest .NewWithDatabase (t , nil )
404
+ first := coderdtest .CreateFirstUser (t , client )
405
+ templateAdmin , templateAdminUser := coderdtest .CreateAnotherUser (t , client , first .OrganizationID , rbac .RoleTemplateAdmin ())
406
+
407
+ r := dbfake .WorkspaceBuild (t , store , database.WorkspaceTable {
408
+ OwnerID : templateAdminUser .ID ,
409
+ OrganizationID : first .OrganizationID ,
410
+ }).Do ()
411
+
412
+ ctx , cancel := context .WithTimeout (context .Background (), testutil .WaitLong )
413
+ defer cancel ()
414
+
415
+ // Providing both state and orphan fails.
416
+ _ , err := templateAdmin .CreateWorkspaceBuild (ctx , r .Workspace .ID , codersdk.CreateWorkspaceBuildRequest {
417
+ TemplateVersionID : r .TemplateVersion .ID ,
418
+ Transition : codersdk .WorkspaceTransitionDelete ,
419
+ ProvisionerState : []byte (" " ),
420
+ Orphan : true ,
421
+ })
422
+ require .Error (t , err )
423
+ cerr := coderdtest .SDKError (t , err )
424
+ require .Equal (t , http .StatusBadRequest , cerr .StatusCode ())
425
+ })
386
426
387
- // Providing both state and orphan fails.
388
- _ , err := client .CreateWorkspaceBuild (ctx , workspace .ID , codersdk.CreateWorkspaceBuildRequest {
389
- TemplateVersionID : workspace .LatestBuild .TemplateVersionID ,
390
- Transition : codersdk .WorkspaceTransitionDelete ,
391
- ProvisionerState : []byte (" " ),
392
- Orphan : true ,
427
+ t .Run ("NoPermission" , func (t * testing.T ) {
428
+ t .Parallel ()
429
+ client , store := coderdtest .NewWithDatabase (t , nil )
430
+ first := coderdtest .CreateFirstUser (t , client )
431
+ member , memberUser := coderdtest .CreateAnotherUser (t , client , first .OrganizationID )
432
+
433
+ r := dbfake .WorkspaceBuild (t , store , database.WorkspaceTable {
434
+ OwnerID : memberUser .ID ,
435
+ OrganizationID : first .OrganizationID ,
436
+ }).Do ()
437
+
438
+ ctx , cancel := context .WithTimeout (context .Background (), testutil .WaitLong )
439
+ defer cancel ()
440
+
441
+ // Trying to orphan without being a template admin fails.
442
+ _ , err := member .CreateWorkspaceBuild (ctx , r .Workspace .ID , codersdk.CreateWorkspaceBuildRequest {
443
+ TemplateVersionID : r .TemplateVersion .ID ,
444
+ Transition : codersdk .WorkspaceTransitionDelete ,
445
+ Orphan : true ,
446
+ })
447
+ require .Error (t , err )
448
+ cerr := coderdtest .SDKError (t , err )
449
+ require .Equal (t , http .StatusForbidden , cerr .StatusCode ())
393
450
})
394
- require .Error (t , err )
395
- cerr := coderdtest .SDKError (t , err )
396
- require .Equal (t , http .StatusBadRequest , cerr .StatusCode ())
397
451
398
- // Regular orphan operation succeeds.
399
- build , err := client .CreateWorkspaceBuild (ctx , workspace .ID , codersdk.CreateWorkspaceBuildRequest {
400
- TemplateVersionID : workspace .LatestBuild .TemplateVersionID ,
401
- Transition : codersdk .WorkspaceTransitionDelete ,
402
- Orphan : true ,
452
+ t .Run ("OK" , func (t * testing.T ) {
453
+ // Include a provisioner so that we can test that provisionerdserver
454
+ // performs deletion.
455
+ client , store := coderdtest .NewWithDatabase (t , & coderdtest.Options {IncludeProvisionerDaemon : true })
456
+ first := coderdtest .CreateFirstUser (t , client )
457
+ templateAdmin , templateAdminUser := coderdtest .CreateAnotherUser (t , client , first .OrganizationID , rbac .RoleTemplateAdmin ())
458
+
459
+ r := dbfake .WorkspaceBuild (t , store , database.WorkspaceTable {
460
+ OwnerID : templateAdminUser .ID ,
461
+ OrganizationID : first .OrganizationID ,
462
+ }).Do ()
463
+
464
+ ctx , cancel := context .WithTimeout (context .Background (), testutil .WaitLong )
465
+ defer cancel ()
466
+
467
+ // Regular orphan operation succeeds.
468
+ build , err := templateAdmin .CreateWorkspaceBuild (ctx , r .Workspace .ID , codersdk.CreateWorkspaceBuildRequest {
469
+ TemplateVersionID : r .TemplateVersion .ID ,
470
+ Transition : codersdk .WorkspaceTransitionDelete ,
471
+ Orphan : true ,
472
+ })
473
+ require .NoError (t , err )
474
+ require .Equal (t , codersdk .WorkspaceTransitionDelete , build .Transition )
475
+ require .Equal (t , codersdk .ProvisionerJobPending , build .Job .Status )
403
476
})
404
- require .NoError (t , err )
405
- coderdtest .AwaitWorkspaceBuildJobCompleted (t , client , build .ID )
406
477
407
- _ , err = client .Workspace (ctx , workspace .ID )
408
- require .Error (t , err )
409
- require .Equal (t , http .StatusGone , coderdtest .SDKError (t , err ).StatusCode ())
478
+ t .Run ("NoProvisioners" , func (t * testing.T ) {
479
+ t .Parallel ()
480
+ client , store := coderdtest .NewWithDatabase (t , nil )
481
+ first := coderdtest .CreateFirstUser (t , client )
482
+ templateAdmin , templateAdminUser := coderdtest .CreateAnotherUser (t , client , first .OrganizationID , rbac .RoleTemplateAdmin ())
483
+
484
+ ctx , cancel := context .WithTimeout (context .Background (), testutil .WaitLong )
485
+ defer cancel ()
486
+ r := dbfake .WorkspaceBuild (t , store , database.WorkspaceTable {
487
+ OwnerID : templateAdminUser .ID ,
488
+ OrganizationID : first .OrganizationID ,
489
+ }).Do ()
490
+
491
+ // nolint:gocritic // For testing
492
+ daemons , err := store .GetProvisionerDaemons (dbauthz .AsSystemReadProvisionerDaemons (ctx ))
493
+ require .NoError (t , err )
494
+ require .Empty (t , daemons , "Provisioner daemons should be empty for this test" )
495
+
496
+ // Orphan deletion still succeeds despite no provisioners being available.
497
+ build , err := templateAdmin .CreateWorkspaceBuild (ctx , r .Workspace .ID , codersdk.CreateWorkspaceBuildRequest {
498
+ TemplateVersionID : r .TemplateVersion .ID ,
499
+ Transition : codersdk .WorkspaceTransitionDelete ,
500
+ Orphan : true ,
501
+ })
502
+ require .NoError (t , err )
503
+ coderdtest .AwaitWorkspaceBuildJobCompleted (t , templateAdmin , build .ID )
504
+
505
+ ws , err := client .Workspace (ctx , r .Workspace .ID )
506
+ require .Empty (t , ws )
507
+ require .Equal (t , http .StatusGone , coderdtest .SDKError (t , err ).StatusCode ())
508
+ })
410
509
})
411
510
}
412
511
0 commit comments