@@ -55,11 +55,12 @@ func TestExecutorAutostartOK(t *testing.T) {
55
55
)
56
56
// Given: workspace is stopped
57
57
workspace = coderdtest .MustTransitionWorkspace (t , client , workspace .ID , codersdk .WorkspaceTransitionStart , codersdk .WorkspaceTransitionStop )
58
-
58
+ p , err := coderdtest .GetProvisionerForWorkspace (t , db , time .Now (), workspace .OrganizationID , database.ProvisionerJob {})
59
+ require .NoError (t , err )
59
60
// When: the autobuild executor ticks after the scheduled time
60
61
go func () {
61
62
tickTime := sched .Next (workspace .LatestBuild .CreatedAt )
62
- updateProvisionerLastSeenAt (t , db , tickTime )
63
+ coderdtest . UpdateProvisionerLastSeenAt (t , db , p . ID , time . Now () , tickTime )
63
64
tickCh <- tickTime
64
65
close (tickCh )
65
66
}()
@@ -116,9 +117,11 @@ func TestMultipleLifecycleExecutors(t *testing.T) {
116
117
// Have the workspace stopped so we can perform an autostart
117
118
workspace = coderdtest .MustTransitionWorkspace (t , clientA , workspace .ID , codersdk .WorkspaceTransitionStart , codersdk .WorkspaceTransitionStop )
118
119
120
+ p , err := coderdtest .GetProvisionerForWorkspace (t , db , time .Now (), workspace .OrganizationID , database.ProvisionerJob {})
121
+ require .NoError (t , err )
119
122
// Get both clients to perform a lifecycle execution tick
120
123
next := sched .Next (workspace .LatestBuild .CreatedAt )
121
- updateProvisionerLastSeenAt (t , db , next )
124
+ coderdtest . UpdateProvisionerLastSeenAt (t , db , p . ID , time . Now () , next )
122
125
123
126
startCh := make (chan struct {})
124
127
go func () {
@@ -250,11 +253,14 @@ func TestExecutorAutostartTemplateUpdated(t *testing.T) {
250
253
},
251
254
))
252
255
256
+ p , err := coderdtest .GetProvisionerForWorkspace (t , db , time .Now (), workspace .OrganizationID , database.ProvisionerJob {})
257
+ require .NoError (t , err )
258
+
253
259
t .Log ("sending autobuild tick" )
254
260
// When: the autobuild executor ticks after the scheduled time
255
261
go func () {
256
262
tickTime := sched .Next (workspace .LatestBuild .CreatedAt )
257
- updateProvisionerLastSeenAt (t , db , tickTime )
263
+ coderdtest . UpdateProvisionerLastSeenAt (t , db , p . ID , time . Now () , tickTime )
258
264
tickCh <- tickTime
259
265
close (tickCh )
260
266
}()
@@ -433,10 +439,13 @@ func TestExecutorAutostopOK(t *testing.T) {
433
439
require .Equal (t , codersdk .WorkspaceTransitionStart , workspace .LatestBuild .Transition )
434
440
require .NotZero (t , workspace .LatestBuild .Deadline )
435
441
442
+ p , err := coderdtest .GetProvisionerForWorkspace (t , db , time .Now (), workspace .OrganizationID , database.ProvisionerJob {})
443
+ require .NoError (t , err )
444
+
436
445
// When: the autobuild executor ticks *after* the deadline:
437
446
go func () {
438
447
tickTime := workspace .LatestBuild .Deadline .Time .Add (time .Minute )
439
- updateProvisionerLastSeenAt (t , db , tickTime )
448
+ coderdtest . UpdateProvisionerLastSeenAt (t , db , p . ID , time . Now () , tickTime )
440
449
tickCh <- tickTime
441
450
close (tickCh )
442
451
}()
@@ -479,10 +488,13 @@ func TestExecutorAutostopExtend(t *testing.T) {
479
488
})
480
489
require .NoError (t , err , "extend workspace deadline" )
481
490
491
+ p , err := coderdtest .GetProvisionerForWorkspace (t , db , time .Now (), workspace .OrganizationID , database.ProvisionerJob {})
492
+ require .NoError (t , err )
493
+
482
494
// When: the autobuild executor ticks *after* the original deadline:
483
495
go func () {
484
496
tickTime := originalDeadline .Time .Add (time .Minute )
485
- updateProvisionerLastSeenAt (t , db , tickTime )
497
+ coderdtest . UpdateProvisionerLastSeenAt (t , db , p . ID , time . Now () , tickTime )
486
498
tickCh <- tickTime
487
499
}()
488
500
@@ -494,7 +506,7 @@ func TestExecutorAutostopExtend(t *testing.T) {
494
506
// When: the autobuild executor ticks after the *new* deadline:
495
507
go func () {
496
508
tickTime := newDeadline .Add (time .Minute )
497
- updateProvisionerLastSeenAt (t , db , tickTime )
509
+ coderdtest . UpdateProvisionerLastSeenAt (t , db , p . ID , time . Now () , tickTime )
498
510
tickCh <- tickTime
499
511
close (tickCh )
500
512
}()
@@ -688,7 +700,7 @@ func TestExecuteAutostopSuspendedUser(t *testing.T) {
688
700
689
701
admin := coderdtest .CreateFirstUser (t , client )
690
702
// Wait for provisioner to be available
691
- mustWaitForProvisionersWithClient (t , client )
703
+ coderdtest . MustWaitForProvisionersWithClient (t , client )
692
704
version := coderdtest .CreateTemplateVersion (t , client , admin .OrganizationID , nil )
693
705
coderdtest .AwaitTemplateVersionJobCompleted (t , client , version .ID )
694
706
template := coderdtest .CreateTemplate (t , client , admin .OrganizationID , version .ID )
@@ -789,10 +801,13 @@ func TestExecutorAutostartMultipleOK(t *testing.T) {
789
801
// Given: workspace is stopped
790
802
workspace = coderdtest .MustTransitionWorkspace (t , client , workspace .ID , codersdk .WorkspaceTransitionStart , codersdk .WorkspaceTransitionStop )
791
803
804
+ p , err := coderdtest .GetProvisionerForWorkspace (t , db , time .Now (), workspace .OrganizationID , database.ProvisionerJob {})
805
+ require .NoError (t , err )
806
+
792
807
// When: the autobuild executor ticks past the scheduled time
793
808
go func () {
794
809
tickTime := sched .Next (workspace .LatestBuild .CreatedAt )
795
- updateProvisionerLastSeenAt (t , db , tickTime )
810
+ coderdtest . UpdateProvisionerLastSeenAt (t , db , p . ID , time . Now () , tickTime )
796
811
tickCh <- tickTime
797
812
tickCh2 <- tickTime
798
813
close (tickCh )
@@ -856,10 +871,13 @@ func TestExecutorAutostartWithParameters(t *testing.T) {
856
871
// Given: workspace is stopped
857
872
workspace = coderdtest .MustTransitionWorkspace (t , client , workspace .ID , codersdk .WorkspaceTransitionStart , codersdk .WorkspaceTransitionStop )
858
873
874
+ p , err := coderdtest .GetProvisionerForWorkspace (t , db , time .Now (), workspace .OrganizationID , database.ProvisionerJob {})
875
+ require .NoError (t , err )
876
+
859
877
// When: the autobuild executor ticks after the scheduled time
860
878
go func () {
861
879
tickTime := sched .Next (workspace .LatestBuild .CreatedAt )
862
- updateProvisionerLastSeenAt (t , db , tickTime )
880
+ coderdtest . UpdateProvisionerLastSeenAt (t , db , p . ID , time . Now () , tickTime )
863
881
tickCh <- tickTime
864
882
close (tickCh )
865
883
}()
@@ -952,10 +970,13 @@ func TestExecutorAutostopTemplateDisabled(t *testing.T) {
952
970
// Then: the deadline should be set to the template default TTL
953
971
assert .WithinDuration (t , workspace .LatestBuild .CreatedAt .Add (time .Hour ), workspace .LatestBuild .Deadline .Time , time .Minute )
954
972
973
+ p , err := coderdtest .GetProvisionerForWorkspace (t , db , time .Now (), workspace .OrganizationID , database.ProvisionerJob {})
974
+ require .NoError (t , err )
975
+
955
976
// When: the autobuild executor ticks after the workspace setting, but before the template setting:
956
977
go func () {
957
978
tickTime := workspace .LatestBuild .Job .CompletedAt .Add (45 * time .Minute )
958
- updateProvisionerLastSeenAt (t , db , tickTime )
979
+ coderdtest . UpdateProvisionerLastSeenAt (t , db , p . ID , time . Now () , tickTime )
959
980
tickCh <- tickTime
960
981
}()
961
982
@@ -967,7 +988,7 @@ func TestExecutorAutostopTemplateDisabled(t *testing.T) {
967
988
// When: the autobuild executor ticks after the template setting:
968
989
go func () {
969
990
tickTime := workspace .LatestBuild .Job .CompletedAt .Add (61 * time .Minute )
970
- updateProvisionerLastSeenAt (t , db , tickTime )
991
+ coderdtest . UpdateProvisionerLastSeenAt (t , db , p . ID , time . Now () , tickTime )
971
992
tickCh <- tickTime
972
993
close (tickCh )
973
994
}()
@@ -998,11 +1019,9 @@ func TestExecutorRequireActiveVersion(t *testing.T) {
998
1019
})
999
1020
)
1000
1021
// Wait for provisioner to be available
1022
+ coderdtest .MustWaitForProvisioners (t , db )
1023
+
1001
1024
ctx := testutil .Context (t , testutil .WaitShort )
1002
- require .Eventually (t , func () bool {
1003
- daemons , err := db .GetProvisionerDaemons (dbauthz .AsSystemRestricted (ctx ))
1004
- return err == nil && len (daemons ) > 0
1005
- }, testutil .WaitShort , testutil .IntervalFast )
1006
1025
owner := coderdtest .CreateFirstUser (t , ownerClient )
1007
1026
me , err := ownerClient .User (ctx , codersdk .Me )
1008
1027
require .NoError (t , err )
@@ -1038,8 +1057,12 @@ func TestExecutorRequireActiveVersion(t *testing.T) {
1038
1057
req .TemplateVersionID = inactiveVersion .ID
1039
1058
})
1040
1059
require .Equal (t , inactiveVersion .ID , ws .LatestBuild .TemplateVersionID )
1060
+
1061
+ p , err := coderdtest .GetProvisionerForWorkspace (t , db , time .Now (), ws .OrganizationID , database.ProvisionerJob {})
1062
+ require .NoError (t , err )
1063
+
1041
1064
tickTime := sched .Next (ws .LatestBuild .CreatedAt )
1042
- updateProvisionerLastSeenAt (t , db , tickTime )
1065
+ coderdtest . UpdateProvisionerLastSeenAt (t , db , p . ID , time . Now () , tickTime )
1043
1066
ticker <- tickTime
1044
1067
stats := <- statCh
1045
1068
require .Len (t , stats .Transitions , 1 )
@@ -1197,10 +1220,13 @@ func TestNotifications(t *testing.T) {
1197
1220
workspace = coderdtest .MustTransitionWorkspace (t , client , workspace .ID , codersdk .WorkspaceTransitionStart , codersdk .WorkspaceTransitionStop )
1198
1221
_ = coderdtest .AwaitWorkspaceBuildJobCompleted (t , userClient , workspace .LatestBuild .ID )
1199
1222
1223
+ p , err := coderdtest .GetProvisionerForWorkspace (t , db , time .Now (), workspace .OrganizationID , database.ProvisionerJob {})
1224
+ require .NoError (t , err )
1225
+
1200
1226
// Wait for workspace to become dormant
1201
1227
notifyEnq .Clear ()
1202
1228
tickTime := workspace .LastUsedAt .Add (timeTilDormant * 3 )
1203
- updateProvisionerLastSeenAt (t , db , tickTime )
1229
+ coderdtest . UpdateProvisionerLastSeenAt (t , db , p . ID , time . Now () , tickTime )
1204
1230
ticker <- tickTime
1205
1231
_ = testutil .TryReceive (testutil .Context (t , testutil .WaitShort ), t , statCh )
1206
1232
@@ -1275,10 +1301,13 @@ func TestExecutorPrebuilds(t *testing.T) {
1275
1301
require .Equal (t , codersdk .WorkspaceTransitionStart , prebuild .LatestBuild .Transition )
1276
1302
require .NotZero (t , prebuild .LatestBuild .Deadline )
1277
1303
1304
+ p , err := coderdtest .GetProvisionerForWorkspace (t , db , time .Now (), prebuild .OrganizationID , database.ProvisionerJob {})
1305
+ require .NoError (t , err )
1306
+
1278
1307
// When: the autobuild executor ticks *after* the deadline:
1279
1308
go func () {
1280
1309
tickTime := prebuild .LatestBuild .Deadline .Time .Add (time .Minute )
1281
- updateProvisionerLastSeenAt (t , db , tickTime )
1310
+ coderdtest . UpdateProvisionerLastSeenAt (t , db , p . ID , time . Now () , tickTime )
1282
1311
tickCh <- tickTime
1283
1312
}()
1284
1313
@@ -1297,7 +1326,7 @@ func TestExecutorPrebuilds(t *testing.T) {
1297
1326
// When: the autobuild executor ticks *after* the deadline:
1298
1327
go func () {
1299
1328
tickTime := workspace .LatestBuild .Deadline .Time .Add (time .Minute )
1300
- updateProvisionerLastSeenAt (t , db , tickTime )
1329
+ coderdtest . UpdateProvisionerLastSeenAt (t , db , p . ID , time . Now () , tickTime )
1301
1330
tickCh <- tickTime
1302
1331
close (tickCh )
1303
1332
}()
@@ -1566,27 +1595,6 @@ func setupTestDBPrebuiltWorkspace(
1566
1595
return workspace
1567
1596
}
1568
1597
1569
- // updateProvisionerLastSeenAt updates the provisioner daemon's LastSeenAt timestamp
1570
- // to the specified time to prevent it from appearing stale during autobuild operations
1571
- func updateProvisionerLastSeenAt (t * testing.T , db database.Store , tickTime time.Time ) {
1572
- t .Helper ()
1573
- // Use system restricted context which has permissions to update provisioner daemons
1574
- ctx := dbauthz .AsSystemRestricted (context .Background ())
1575
- daemons , err := db .GetProvisionerDaemons (ctx )
1576
- require .NoError (t , err )
1577
- if len (daemons ) > 0 {
1578
- t .Logf ("Updating provisioner %s LastSeenAt from %v to %v" , daemons [0 ].ID , daemons [0 ].LastSeenAt .Time , tickTime )
1579
- err = db .UpdateProvisionerDaemonLastSeenAt (ctx , database.UpdateProvisionerDaemonLastSeenAtParams {
1580
- ID : daemons [0 ].ID ,
1581
- LastSeenAt : sql.NullTime {Time : tickTime , Valid : true },
1582
- })
1583
- require .NoError (t , err )
1584
- t .Logf ("Successfully updated provisioner LastSeenAt" )
1585
- } else {
1586
- t .Logf ("No provisioner daemons found to update" )
1587
- }
1588
- }
1589
-
1590
1598
func mustProvisionWorkspace (t * testing.T , client * codersdk.Client , mut ... func (* codersdk.CreateWorkspaceRequest )) codersdk.Workspace {
1591
1599
t .Helper ()
1592
1600
user := coderdtest .CreateFirstUser (t , client )
@@ -1654,71 +1662,6 @@ func mustWorkspaceParameters(t *testing.T, client *codersdk.Client, workspaceID
1654
1662
require .NotEmpty (t , buildParameters )
1655
1663
}
1656
1664
1657
- func mustWaitForProvisioners (t * testing.T , db database.Store ) {
1658
- t .Helper ()
1659
- ctx := testutil .Context (t , testutil .WaitShort )
1660
- require .Eventually (t , func () bool {
1661
- daemons , err := db .GetProvisionerDaemons (ctx )
1662
- return err == nil && len (daemons ) > 0
1663
- }, testutil .WaitShort , testutil .IntervalFast )
1664
- }
1665
-
1666
- func mustWaitForProvisionersWithClient (t * testing.T , client * codersdk.Client ) {
1667
- t .Helper ()
1668
- ctx := testutil .Context (t , testutil .WaitShort )
1669
- require .Eventually (t , func () bool {
1670
- daemons , err := client .ProvisionerDaemons (ctx )
1671
- return err == nil && len (daemons ) > 0
1672
- }, testutil .WaitShort , testutil .IntervalFast )
1673
- }
1674
-
1675
- // mustWaitForProvisionersAvailable waits for provisioners to be available for a specific workspace
1676
- func mustWaitForProvisionersAvailable (t * testing.T , db database.Store , workspace codersdk.Workspace ) {
1677
- t .Helper ()
1678
- ctx := testutil .Context (t , testutil .WaitShort )
1679
-
1680
- // Get the workspace from the database
1681
- require .Eventually (t , func () bool {
1682
- ws , err := db .GetWorkspaceByID (ctx , workspace .ID )
1683
- if err != nil {
1684
- return false
1685
- }
1686
-
1687
- // Get the latest build
1688
- latestBuild , err := db .GetWorkspaceBuildByID (ctx , workspace .LatestBuild .ID )
1689
- if err != nil {
1690
- return false
1691
- }
1692
-
1693
- // Get the template version job
1694
- templateVersionJob , err := db .GetProvisionerJobByID (ctx , latestBuild .JobID )
1695
- if err != nil {
1696
- return false
1697
- }
1698
-
1699
- // Check if provisioners are available using the same logic as hasAvailableProvisioners
1700
- provisionerDaemons , err := db .GetProvisionerDaemonsByOrganization (ctx , database.GetProvisionerDaemonsByOrganizationParams {
1701
- OrganizationID : ws .OrganizationID ,
1702
- WantTags : templateVersionJob .Tags ,
1703
- })
1704
- if err != nil {
1705
- return false
1706
- }
1707
-
1708
- // Check if any provisioners are active (not stale)
1709
- now := time .Now ()
1710
- for _ , pd := range provisionerDaemons {
1711
- if pd .LastSeenAt .Valid {
1712
- age := now .Sub (pd .LastSeenAt .Time )
1713
- if age <= autobuild .TestingStaleInterval {
1714
- return true // Found an active provisioner
1715
- }
1716
- }
1717
- }
1718
- return false // No active provisioners found
1719
- }, testutil .WaitShort , testutil .IntervalFast )
1720
- }
1721
-
1722
1665
func TestMain (m * testing.M ) {
1723
1666
goleak .VerifyTestMain (m , testutil .GoleakOptions ... )
1724
1667
}
@@ -1756,10 +1699,10 @@ func TestExecutorAutostartSkipsWhenNoProvisionersAvailable(t *testing.T) {
1756
1699
codersdk .WorkspaceTransitionStart , codersdk .WorkspaceTransitionStop )
1757
1700
1758
1701
// Wait for provisioner to be registered
1759
- mustWaitForProvisioners (t , db )
1702
+ coderdtest . MustWaitForProvisioners (t , db )
1760
1703
1761
1704
// Wait for provisioner to be available for this specific workspace
1762
- mustWaitForProvisionersAvailable (t , db , workspace )
1705
+ coderdtest . MustWaitForProvisionersAvailable (t , db , workspace , autobuild . TestingStaleInterval )
1763
1706
1764
1707
// Now shut down the provisioner daemon
1765
1708
ctx := testutil .Context (t , testutil .WaitShort )
0 commit comments