- Notifications
You must be signed in to change notification settings - Fork1k
feat(coderd): add matched provisioner daemons information to more places#15688
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to ourterms of service andprivacy statement. We’ll occasionally send you account related emails.
Already on GitHub?Sign in to your account
Uh oh!
There was an error while loading.Please reload this page.
Changes from1 commit
ba944ab
4e51f20
47036e8
16be03b
4304a06
9ef68dd
38788d5
1c95ffe
98521be
e1423f5
517a505
c4295ef
c5fb83b
3bd62fd
2f625bc
848338e
File filter
Filter by extension
Conversations
Uh oh!
There was an error while loading.Please reload this page.
Jump to
Uh oh!
There was an error while loading.Please reload this page.
Diff view
Diff view
- Loading branch information
Uh oh!
There was an error while loading.Please reload this page.
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1097,6 +1097,12 @@ func TestPostWorkspaceBuild(t *testing.T) { | ||
Transition: codersdk.WorkspaceTransitionStart, | ||
}) | ||
require.NoError(t, err) | ||
if assert.NotNil(t, build.MatchedProvisioners) { | ||
require.Equal(t, 1, build.MatchedProvisioners.Count) | ||
require.Equal(t, 1, build.MatchedProvisioners.Available) | ||
require.NotZero(t, build.MatchedProvisioners.MostRecentlySeen.Time) | ||
} | ||
coderdtest.AwaitWorkspaceBuildJobCompleted(t, client, build.ID) | ||
require.Eventually(t, func() bool { | ||
@@ -1124,6 +1130,12 @@ func TestPostWorkspaceBuild(t *testing.T) { | ||
Transition: codersdk.WorkspaceTransitionStart, | ||
}) | ||
require.NoError(t, err) | ||
if assert.NotNil(t, build.MatchedProvisioners) { | ||
require.Equal(t, 1, build.MatchedProvisioners.Count) | ||
require.Equal(t, 1, build.MatchedProvisioners.Available) | ||
require.NotZero(t, build.MatchedProvisioners.MostRecentlySeen.Time) | ||
} | ||
require.Equal(t, workspace.LatestBuild.BuildNumber+1, build.BuildNumber) | ||
}) | ||
@@ -1150,6 +1162,12 @@ func TestPostWorkspaceBuild(t *testing.T) { | ||
ProvisionerState: wantState, | ||
}) | ||
require.NoError(t, err) | ||
if assert.NotNil(t, build.MatchedProvisioners) { | ||
require.Equal(t, 1, build.MatchedProvisioners.Count) | ||
require.Equal(t, 1, build.MatchedProvisioners.Available) | ||
require.NotZero(t, build.MatchedProvisioners.MostRecentlySeen.Time) | ||
} | ||
gotState, err := client.WorkspaceBuildState(ctx, build.ID) | ||
require.NoError(t, err) | ||
require.Equal(t, wantState, gotState) | ||
@@ -1173,6 +1191,12 @@ func TestPostWorkspaceBuild(t *testing.T) { | ||
}) | ||
require.NoError(t, err) | ||
require.Equal(t, workspace.LatestBuild.BuildNumber+1, build.BuildNumber) | ||
if assert.NotNil(t, build.MatchedProvisioners) { | ||
require.Equal(t, 1, build.MatchedProvisioners.Count) | ||
require.Equal(t, 1, build.MatchedProvisioners.Available) | ||
require.NotZero(t, build.MatchedProvisioners.MostRecentlySeen.Time) | ||
} | ||
coderdtest.AwaitWorkspaceBuildJobCompleted(t, client, build.ID) | ||
res, err := client.Workspaces(ctx, codersdk.WorkspaceFilter{ | ||
@@ -1181,6 +1205,92 @@ func TestPostWorkspaceBuild(t *testing.T) { | ||
require.NoError(t, err) | ||
require.Len(t, res.Workspaces, 0) | ||
}) | ||
t.Run("NoProvisionersAvailable", func(t *testing.T) { | ||
t.Parallel() | ||
// Given: a coderd instance with a provisioner daemon | ||
store, ps, db := dbtestutil.NewDBWithSQLDB(t) | ||
client, closeDaemon := coderdtest.NewWithProvisionerCloser(t, &coderdtest.Options{ | ||
Database: store, | ||
Pubsub: ps, | ||
IncludeProvisionerDaemon: true, | ||
}) | ||
// Given: a user, template, and workspace | ||
user := coderdtest.CreateFirstUser(t, client) | ||
version := coderdtest.CreateTemplateVersion(t, client, user.OrganizationID, nil) | ||
coderdtest.AwaitTemplateVersionJobCompleted(t, client, version.ID) | ||
template := coderdtest.CreateTemplate(t, client, user.OrganizationID, version.ID) | ||
workspace := coderdtest.CreateWorkspace(t, client, template.ID) | ||
coderdtest.AwaitWorkspaceBuildJobCompleted(t, client, workspace.LatestBuild.ID) | ||
// Stop the provisioner daemon. | ||
require.NoError(t, closeDaemon.Close()) | ||
ctx := testutil.Context(t, testutil.WaitLong) | ||
// Given: no provisioner daemons exist. | ||
_, err := db.ExecContext(ctx, `DELETE FROM provisioner_daemons;`) | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others.Learn more. self-review: this is kinda yucky but I don't agree with the idea of creating database queries for things that will only ever get used intests. | ||
require.NoError(t, err) | ||
// When: a new workspace build is created | ||
build, err := client.CreateWorkspaceBuild(ctx, workspace.ID, codersdk.CreateWorkspaceBuildRequest{ | ||
TemplateVersionID: template.ActiveVersionID, | ||
Transition: codersdk.WorkspaceTransitionStart, | ||
}) | ||
// Then: the request should succeed. | ||
require.NoError(t, err) | ||
// Then: the provisioner job should remain pending. | ||
require.Equal(t, codersdk.ProvisionerJobPending, build.Job.Status) | ||
// Then: the response should indicate no provisioners are available. | ||
if assert.NotNil(t, build.MatchedProvisioners) { | ||
require.Zero(t, build.MatchedProvisioners.Count) | ||
require.Zero(t, build.MatchedProvisioners.Available) | ||
require.Zero(t, build.MatchedProvisioners.MostRecentlySeen.Time) | ||
} | ||
}) | ||
t.Run("AllProvisionersStale", func(t *testing.T) { | ||
t.Parallel() | ||
// Given: a coderd instance with a provisioner daemon | ||
store, ps, db := dbtestutil.NewDBWithSQLDB(t) | ||
client, closeDaemon := coderdtest.NewWithProvisionerCloser(t, &coderdtest.Options{ | ||
Database: store, | ||
Pubsub: ps, | ||
IncludeProvisionerDaemon: true, | ||
}) | ||
// Given: a user, template, and workspace | ||
user := coderdtest.CreateFirstUser(t, client) | ||
version := coderdtest.CreateTemplateVersion(t, client, user.OrganizationID, nil) | ||
coderdtest.AwaitTemplateVersionJobCompleted(t, client, version.ID) | ||
template := coderdtest.CreateTemplate(t, client, user.OrganizationID, version.ID) | ||
workspace := coderdtest.CreateWorkspace(t, client, template.ID) | ||
coderdtest.AwaitWorkspaceBuildJobCompleted(t, client, workspace.LatestBuild.ID) | ||
ctx := testutil.Context(t, testutil.WaitLong) | ||
// Given: all provisioner daemons are stale | ||
// First stop the provisioner | ||
require.NoError(t, closeDaemon.Close()) | ||
newLastSeenAt := dbtime.Now().Add(-time.Hour) | ||
// Update the last seen at for all provisioner daemons. We have to use the | ||
// SQL db directly because store.UpdateProvisionerDaemonLastSeenAt has a | ||
// built-in check to prevent updating the last seen at to a time in the past. | ||
_, err := db.ExecContext(ctx, `UPDATE provisioner_daemons SET last_seen_at = $1;`, newLastSeenAt) | ||
require.NoError(t, err) | ||
// When: a new workspace build is created | ||
build, err := client.CreateWorkspaceBuild(ctx, workspace.ID, codersdk.CreateWorkspaceBuildRequest{ | ||
TemplateVersionID: template.ActiveVersionID, | ||
Transition: codersdk.WorkspaceTransitionStart, | ||
}) | ||
// Then: the request should succeed | ||
require.NoError(t, err) | ||
// Then: the provisioner job should remain pending | ||
require.Equal(t, codersdk.ProvisionerJobPending, build.Job.Status) | ||
// Then: the response should indicate no provisioners are available | ||
if assert.NotNil(t, build.MatchedProvisioners) { | ||
require.Zero(t, build.MatchedProvisioners.Available) | ||
require.Equal(t, 1, build.MatchedProvisioners.Count) | ||
require.Equal(t, newLastSeenAt.UTC(), build.MatchedProvisioners.MostRecentlySeen.Time.UTC()) | ||
} | ||
}) | ||
} | ||
func TestWorkspaceBuildTimings(t *testing.T) { | ||
Uh oh!
There was an error while loading.Please reload this page.