@@ -2375,3 +2375,79 @@ func TestWorkspaceWithOptionalRichParameters(t *testing.T) {
2375
2375
}
2376
2376
require .ElementsMatch (t , expectedBuildParameters , workspaceBuildParameters )
2377
2377
}
2378
+
2379
+ func TestWorkspaceLock (t * testing.T ) {
2380
+ t .Parallel ()
2381
+
2382
+ t .Run ("OK" , func (t * testing.T ) {
2383
+ t .Parallel ()
2384
+ var (
2385
+ client = coderdtest .New (t , & coderdtest.Options {IncludeProvisionerDaemon : true })
2386
+ user = coderdtest .CreateFirstUser (t , client )
2387
+ version = coderdtest .CreateTemplateVersion (t , client , user .OrganizationID , nil )
2388
+ _ = coderdtest .AwaitTemplateVersionJob (t , client , version .ID )
2389
+ template = coderdtest .CreateTemplate (t , client , user .OrganizationID , version .ID )
2390
+ workspace = coderdtest .CreateWorkspace (t , client , user .OrganizationID , template .ID )
2391
+ _ = coderdtest .AwaitWorkspaceBuildJob (t , client , workspace .LatestBuild .ID )
2392
+ )
2393
+
2394
+ ctx , cancel := context .WithTimeout (context .Background (), testutil .WaitLong )
2395
+ defer cancel ()
2396
+
2397
+ err := client .UpdateWorkspaceLock (ctx , workspace .ID , codersdk.UpdateWorkspaceLock {
2398
+ Lock : true ,
2399
+ })
2400
+ require .NoError (t , err )
2401
+
2402
+ workspace , err = client .Workspace (ctx , workspace .ID )
2403
+ require .NoError (t , err , "fetch provisioned workspace" )
2404
+ require .NotNil (t , workspace .LockedAt )
2405
+ require .WithinRange (t , * workspace .LockedAt , time .Now ().Add (- time .Second * 10 ), time .Now ())
2406
+
2407
+ err = client .UpdateWorkspaceLock (ctx , workspace .ID , codersdk.UpdateWorkspaceLock {
2408
+ Lock : false ,
2409
+ })
2410
+ require .NoError (t , err )
2411
+
2412
+ workspace , err = client .Workspace (ctx , workspace .ID )
2413
+ require .NoError (t , err , "fetch provisioned workspace" )
2414
+ require .Nil (t , workspace .LockedAt )
2415
+ })
2416
+
2417
+ t .Run ("CannotStart" , func (t * testing.T ) {
2418
+ t .Parallel ()
2419
+ var (
2420
+ client = coderdtest .New (t , & coderdtest.Options {IncludeProvisionerDaemon : true })
2421
+ user = coderdtest .CreateFirstUser (t , client )
2422
+ version = coderdtest .CreateTemplateVersion (t , client , user .OrganizationID , nil )
2423
+ _ = coderdtest .AwaitTemplateVersionJob (t , client , version .ID )
2424
+ template = coderdtest .CreateTemplate (t , client , user .OrganizationID , version .ID )
2425
+ workspace = coderdtest .CreateWorkspace (t , client , user .OrganizationID , template .ID )
2426
+ _ = coderdtest .AwaitWorkspaceBuildJob (t , client , workspace .LatestBuild .ID )
2427
+ )
2428
+
2429
+ ctx , cancel := context .WithTimeout (context .Background (), testutil .WaitLong )
2430
+ defer cancel ()
2431
+
2432
+ err := client .UpdateWorkspaceLock (ctx , workspace .ID , codersdk.UpdateWorkspaceLock {
2433
+ Lock : true ,
2434
+ })
2435
+ require .NoError (t , err )
2436
+
2437
+ // Should be able to stop a workspace while it is locked.
2438
+ coderdtest .MustTransitionWorkspace (t , client , workspace .ID , database .WorkspaceTransitionStart , database .WorkspaceTransitionStop )
2439
+
2440
+ // Should not be able to start a workspace while it is locked.
2441
+ _ , err = client .CreateWorkspaceBuild (ctx , workspace .ID , codersdk.CreateWorkspaceBuildRequest {
2442
+ TemplateVersionID : template .ActiveVersionID ,
2443
+ Transition : codersdk .WorkspaceTransition (database .WorkspaceTransitionStart ),
2444
+ })
2445
+ require .Error (t , err )
2446
+
2447
+ err = client .UpdateWorkspaceLock (ctx , workspace .ID , codersdk.UpdateWorkspaceLock {
2448
+ Lock : false ,
2449
+ })
2450
+ require .NoError (t , err )
2451
+ coderdtest .MustTransitionWorkspace (t , client , workspace .ID , database .WorkspaceTransitionStop , database .WorkspaceTransitionStart )
2452
+ })
2453
+ }
0 commit comments