Skip to content

Commit 961d38f

Browse files
committed
more cleanup
Signed-off-by: Callum Styan <callumstyan@gmail.com>
1 parent 462612c commit 961d38f

File tree

4 files changed

+215
-351
lines changed

4 files changed

+215
-351
lines changed

coderd/autobuild/lifecycle_executor.go

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -158,8 +158,6 @@ func (e *Executor) hasAvailableProvisioners(ctx context.Context, tx database.Sto
158158
)
159159
return true, nil
160160
}
161-
} else {
162-
fmt.Printf("Provisioner %s has invalid LastSeenAt\n", pd.ID)
163161
}
164162
}
165163
e.log.Debug(ctx, "hasAvailableProvisioners: no active provisioners found")

coderd/autobuild/lifecycle_executor_test.go

Lines changed: 51 additions & 108 deletions
Original file line numberDiff line numberDiff line change
@@ -55,11 +55,12 @@ func TestExecutorAutostartOK(t *testing.T) {
5555
)
5656
// Given: workspace is stopped
5757
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)
5960
// When: the autobuild executor ticks after the scheduled time
6061
go func() {
6162
tickTime := sched.Next(workspace.LatestBuild.CreatedAt)
62-
updateProvisionerLastSeenAt(t, db, tickTime)
63+
coderdtest.UpdateProvisionerLastSeenAt(t, db, p.ID, time.Now(), tickTime)
6364
tickCh <- tickTime
6465
close(tickCh)
6566
}()
@@ -116,9 +117,11 @@ func TestMultipleLifecycleExecutors(t *testing.T) {
116117
// Have the workspace stopped so we can perform an autostart
117118
workspace = coderdtest.MustTransitionWorkspace(t, clientA, workspace.ID, codersdk.WorkspaceTransitionStart, codersdk.WorkspaceTransitionStop)
118119

120+
p, err := coderdtest.GetProvisionerForWorkspace(t, db, time.Now(), workspace.OrganizationID, database.ProvisionerJob{})
121+
require.NoError(t, err)
119122
// Get both clients to perform a lifecycle execution tick
120123
next := sched.Next(workspace.LatestBuild.CreatedAt)
121-
updateProvisionerLastSeenAt(t, db, next)
124+
coderdtest.UpdateProvisionerLastSeenAt(t, db, p.ID, time.Now(), next)
122125

123126
startCh := make(chan struct{})
124127
go func() {
@@ -250,11 +253,14 @@ func TestExecutorAutostartTemplateUpdated(t *testing.T) {
250253
},
251254
))
252255

256+
p, err := coderdtest.GetProvisionerForWorkspace(t, db, time.Now(), workspace.OrganizationID, database.ProvisionerJob{})
257+
require.NoError(t, err)
258+
253259
t.Log("sending autobuild tick")
254260
// When: the autobuild executor ticks after the scheduled time
255261
go func() {
256262
tickTime := sched.Next(workspace.LatestBuild.CreatedAt)
257-
updateProvisionerLastSeenAt(t, db, tickTime)
263+
coderdtest.UpdateProvisionerLastSeenAt(t, db, p.ID, time.Now(), tickTime)
258264
tickCh <- tickTime
259265
close(tickCh)
260266
}()
@@ -433,10 +439,13 @@ func TestExecutorAutostopOK(t *testing.T) {
433439
require.Equal(t, codersdk.WorkspaceTransitionStart, workspace.LatestBuild.Transition)
434440
require.NotZero(t, workspace.LatestBuild.Deadline)
435441

442+
p, err := coderdtest.GetProvisionerForWorkspace(t, db, time.Now(), workspace.OrganizationID, database.ProvisionerJob{})
443+
require.NoError(t, err)
444+
436445
// When: the autobuild executor ticks *after* the deadline:
437446
go func() {
438447
tickTime := workspace.LatestBuild.Deadline.Time.Add(time.Minute)
439-
updateProvisionerLastSeenAt(t, db, tickTime)
448+
coderdtest.UpdateProvisionerLastSeenAt(t, db, p.ID, time.Now(), tickTime)
440449
tickCh <- tickTime
441450
close(tickCh)
442451
}()
@@ -479,10 +488,13 @@ func TestExecutorAutostopExtend(t *testing.T) {
479488
})
480489
require.NoError(t, err, "extend workspace deadline")
481490

491+
p, err := coderdtest.GetProvisionerForWorkspace(t, db, time.Now(), workspace.OrganizationID, database.ProvisionerJob{})
492+
require.NoError(t, err)
493+
482494
// When: the autobuild executor ticks *after* the original deadline:
483495
go func() {
484496
tickTime := originalDeadline.Time.Add(time.Minute)
485-
updateProvisionerLastSeenAt(t, db, tickTime)
497+
coderdtest.UpdateProvisionerLastSeenAt(t, db, p.ID, time.Now(), tickTime)
486498
tickCh <- tickTime
487499
}()
488500

@@ -494,7 +506,7 @@ func TestExecutorAutostopExtend(t *testing.T) {
494506
// When: the autobuild executor ticks after the *new* deadline:
495507
go func() {
496508
tickTime := newDeadline.Add(time.Minute)
497-
updateProvisionerLastSeenAt(t, db, tickTime)
509+
coderdtest.UpdateProvisionerLastSeenAt(t, db, p.ID, time.Now(), tickTime)
498510
tickCh <- tickTime
499511
close(tickCh)
500512
}()
@@ -688,7 +700,7 @@ func TestExecuteAutostopSuspendedUser(t *testing.T) {
688700

689701
admin := coderdtest.CreateFirstUser(t, client)
690702
// Wait for provisioner to be available
691-
mustWaitForProvisionersWithClient(t, client)
703+
coderdtest.MustWaitForProvisionersWithClient(t, client)
692704
version := coderdtest.CreateTemplateVersion(t, client, admin.OrganizationID, nil)
693705
coderdtest.AwaitTemplateVersionJobCompleted(t, client, version.ID)
694706
template := coderdtest.CreateTemplate(t, client, admin.OrganizationID, version.ID)
@@ -789,10 +801,13 @@ func TestExecutorAutostartMultipleOK(t *testing.T) {
789801
// Given: workspace is stopped
790802
workspace = coderdtest.MustTransitionWorkspace(t, client, workspace.ID, codersdk.WorkspaceTransitionStart, codersdk.WorkspaceTransitionStop)
791803

804+
p, err := coderdtest.GetProvisionerForWorkspace(t, db, time.Now(), workspace.OrganizationID, database.ProvisionerJob{})
805+
require.NoError(t, err)
806+
792807
// When: the autobuild executor ticks past the scheduled time
793808
go func() {
794809
tickTime := sched.Next(workspace.LatestBuild.CreatedAt)
795-
updateProvisionerLastSeenAt(t, db, tickTime)
810+
coderdtest.UpdateProvisionerLastSeenAt(t, db, p.ID, time.Now(), tickTime)
796811
tickCh <- tickTime
797812
tickCh2 <- tickTime
798813
close(tickCh)
@@ -856,10 +871,13 @@ func TestExecutorAutostartWithParameters(t *testing.T) {
856871
// Given: workspace is stopped
857872
workspace = coderdtest.MustTransitionWorkspace(t, client, workspace.ID, codersdk.WorkspaceTransitionStart, codersdk.WorkspaceTransitionStop)
858873

874+
p, err := coderdtest.GetProvisionerForWorkspace(t, db, time.Now(), workspace.OrganizationID, database.ProvisionerJob{})
875+
require.NoError(t, err)
876+
859877
// When: the autobuild executor ticks after the scheduled time
860878
go func() {
861879
tickTime := sched.Next(workspace.LatestBuild.CreatedAt)
862-
updateProvisionerLastSeenAt(t, db, tickTime)
880+
coderdtest.UpdateProvisionerLastSeenAt(t, db, p.ID, time.Now(), tickTime)
863881
tickCh <- tickTime
864882
close(tickCh)
865883
}()
@@ -952,10 +970,13 @@ func TestExecutorAutostopTemplateDisabled(t *testing.T) {
952970
// Then: the deadline should be set to the template default TTL
953971
assert.WithinDuration(t, workspace.LatestBuild.CreatedAt.Add(time.Hour), workspace.LatestBuild.Deadline.Time, time.Minute)
954972

973+
p, err := coderdtest.GetProvisionerForWorkspace(t, db, time.Now(), workspace.OrganizationID, database.ProvisionerJob{})
974+
require.NoError(t, err)
975+
955976
// When: the autobuild executor ticks after the workspace setting, but before the template setting:
956977
go func() {
957978
tickTime := workspace.LatestBuild.Job.CompletedAt.Add(45 * time.Minute)
958-
updateProvisionerLastSeenAt(t, db, tickTime)
979+
coderdtest.UpdateProvisionerLastSeenAt(t, db, p.ID, time.Now(), tickTime)
959980
tickCh <- tickTime
960981
}()
961982

@@ -967,7 +988,7 @@ func TestExecutorAutostopTemplateDisabled(t *testing.T) {
967988
// When: the autobuild executor ticks after the template setting:
968989
go func() {
969990
tickTime := workspace.LatestBuild.Job.CompletedAt.Add(61 * time.Minute)
970-
updateProvisionerLastSeenAt(t, db, tickTime)
991+
coderdtest.UpdateProvisionerLastSeenAt(t, db, p.ID, time.Now(), tickTime)
971992
tickCh <- tickTime
972993
close(tickCh)
973994
}()
@@ -998,11 +1019,9 @@ func TestExecutorRequireActiveVersion(t *testing.T) {
9981019
})
9991020
)
10001021
// Wait for provisioner to be available
1022+
coderdtest.MustWaitForProvisioners(t, db)
1023+
10011024
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)
10061025
owner := coderdtest.CreateFirstUser(t, ownerClient)
10071026
me, err := ownerClient.User(ctx, codersdk.Me)
10081027
require.NoError(t, err)
@@ -1038,8 +1057,12 @@ func TestExecutorRequireActiveVersion(t *testing.T) {
10381057
req.TemplateVersionID = inactiveVersion.ID
10391058
})
10401059
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+
10411064
tickTime := sched.Next(ws.LatestBuild.CreatedAt)
1042-
updateProvisionerLastSeenAt(t, db, tickTime)
1065+
coderdtest.UpdateProvisionerLastSeenAt(t, db, p.ID, time.Now(), tickTime)
10431066
ticker <- tickTime
10441067
stats := <-statCh
10451068
require.Len(t, stats.Transitions, 1)
@@ -1197,10 +1220,13 @@ func TestNotifications(t *testing.T) {
11971220
workspace = coderdtest.MustTransitionWorkspace(t, client, workspace.ID, codersdk.WorkspaceTransitionStart, codersdk.WorkspaceTransitionStop)
11981221
_ = coderdtest.AwaitWorkspaceBuildJobCompleted(t, userClient, workspace.LatestBuild.ID)
11991222

1223+
p, err := coderdtest.GetProvisionerForWorkspace(t, db, time.Now(), workspace.OrganizationID, database.ProvisionerJob{})
1224+
require.NoError(t, err)
1225+
12001226
// Wait for workspace to become dormant
12011227
notifyEnq.Clear()
12021228
tickTime := workspace.LastUsedAt.Add(timeTilDormant * 3)
1203-
updateProvisionerLastSeenAt(t, db, tickTime)
1229+
coderdtest.UpdateProvisionerLastSeenAt(t, db, p.ID, time.Now(), tickTime)
12041230
ticker <- tickTime
12051231
_ = testutil.TryReceive(testutil.Context(t, testutil.WaitShort), t, statCh)
12061232

@@ -1275,10 +1301,13 @@ func TestExecutorPrebuilds(t *testing.T) {
12751301
require.Equal(t, codersdk.WorkspaceTransitionStart, prebuild.LatestBuild.Transition)
12761302
require.NotZero(t, prebuild.LatestBuild.Deadline)
12771303

1304+
p, err := coderdtest.GetProvisionerForWorkspace(t, db, time.Now(), prebuild.OrganizationID, database.ProvisionerJob{})
1305+
require.NoError(t, err)
1306+
12781307
// When: the autobuild executor ticks *after* the deadline:
12791308
go func() {
12801309
tickTime := prebuild.LatestBuild.Deadline.Time.Add(time.Minute)
1281-
updateProvisionerLastSeenAt(t, db, tickTime)
1310+
coderdtest.UpdateProvisionerLastSeenAt(t, db, p.ID, time.Now(), tickTime)
12821311
tickCh <- tickTime
12831312
}()
12841313

@@ -1297,7 +1326,7 @@ func TestExecutorPrebuilds(t *testing.T) {
12971326
// When: the autobuild executor ticks *after* the deadline:
12981327
go func() {
12991328
tickTime := workspace.LatestBuild.Deadline.Time.Add(time.Minute)
1300-
updateProvisionerLastSeenAt(t, db, tickTime)
1329+
coderdtest.UpdateProvisionerLastSeenAt(t, db, p.ID, time.Now(), tickTime)
13011330
tickCh <- tickTime
13021331
close(tickCh)
13031332
}()
@@ -1566,27 +1595,6 @@ func setupTestDBPrebuiltWorkspace(
15661595
return workspace
15671596
}
15681597

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-
15901598
func mustProvisionWorkspace(t *testing.T, client *codersdk.Client, mut ...func(*codersdk.CreateWorkspaceRequest)) codersdk.Workspace {
15911599
t.Helper()
15921600
user := coderdtest.CreateFirstUser(t, client)
@@ -1654,71 +1662,6 @@ func mustWorkspaceParameters(t *testing.T, client *codersdk.Client, workspaceID
16541662
require.NotEmpty(t, buildParameters)
16551663
}
16561664

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-
17221665
func TestMain(m *testing.M) {
17231666
goleak.VerifyTestMain(m, testutil.GoleakOptions...)
17241667
}
@@ -1756,10 +1699,10 @@ func TestExecutorAutostartSkipsWhenNoProvisionersAvailable(t *testing.T) {
17561699
codersdk.WorkspaceTransitionStart, codersdk.WorkspaceTransitionStop)
17571700

17581701
// Wait for provisioner to be registered
1759-
mustWaitForProvisioners(t, db)
1702+
coderdtest.MustWaitForProvisioners(t, db)
17601703

17611704
// Wait for provisioner to be available for this specific workspace
1762-
mustWaitForProvisionersAvailable(t, db, workspace)
1705+
coderdtest.MustWaitForProvisionersAvailable(t, db, workspace, autobuild.TestingStaleInterval)
17631706

17641707
// Now shut down the provisioner daemon
17651708
ctx := testutil.Context(t, testutil.WaitShort)

0 commit comments

Comments
 (0)