- Notifications
You must be signed in to change notification settings - Fork928
feat(coderd): return agent script timings#14923
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
1b62a39
3daab59
1c6671e
15ca638
ddde7a3
5abc511
bcd8b04
f4c3331
2852164
b70628a
9e09c64
7786166
ed4cbd0
920e41d
65aeeea
c7ae412
aaedd1c
a846eb7
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 |
---|---|---|
@@ -1216,6 +1216,32 @@ func TestWorkspaceBuildTimings(t *testing.T) { | ||
CreatedBy: owner.UserID, | ||
}) | ||
// Create a build to attach timings | ||
makeBuild := func() database.WorkspaceBuild { | ||
ws := dbgen.Workspace(t, db, database.Workspace{ | ||
OwnerID: owner.UserID, | ||
OrganizationID: owner.OrganizationID, | ||
TemplateID: template.ID, | ||
// Generate unique name for the workspace | ||
Name: "test-workspace-" + uuid.New().String(), | ||
}) | ||
jobID := uuid.New() | ||
job := dbgen.ProvisionerJob(t, db, pubsub, database.ProvisionerJob{ | ||
ID: jobID, | ||
OrganizationID: owner.OrganizationID, | ||
Type: database.ProvisionerJobTypeWorkspaceBuild, | ||
Tags: database.StringMap{jobID.String(): "true"}, | ||
}) | ||
return dbgen.WorkspaceBuild(t, db, database.WorkspaceBuild{ | ||
WorkspaceID: ws.ID, | ||
TemplateVersionID: version.ID, | ||
BuildNumber: 1, | ||
Transition: database.WorkspaceTransitionStart, | ||
InitiatorID: owner.UserID, | ||
JobID: job.ID, | ||
}) | ||
} | ||
makeProvisionerTimings := func(build database.WorkspaceBuild, count int) []database.ProvisionerJobTiming { | ||
// Use the database.ProvisionerJobTiming struct to mock timings data instead | ||
// of directly creating database.InsertProvisionerJobTimingsParams. This | ||
@@ -1250,8 +1276,86 @@ func TestWorkspaceBuildTimings(t *testing.T) { | ||
return dbgen.ProvisionerJobTimings(t, db, insertParams) | ||
} | ||
makeAgentScriptTimings := func(script database.WorkspaceAgentScript, count int) []database.WorkspaceAgentScriptTiming { | ||
newTimings := make([]database.InsertWorkspaceAgentScriptTimingsParams, count) | ||
now := time.Now() | ||
for i := range count { | ||
startedAt := now.Add(-time.Hour + time.Duration(i)*time.Minute) | ||
endedAt := startedAt.Add(time.Minute) | ||
newTimings[i] = database.InsertWorkspaceAgentScriptTimingsParams{ | ||
StartedAt: startedAt, | ||
EndedAt: endedAt, | ||
Stage: database.WorkspaceAgentScriptTimingStageStart, | ||
ScriptID: script.ID, | ||
ExitCode: 0, | ||
Status: database.WorkspaceAgentScriptTimingStatusOk, | ||
} | ||
} | ||
timings := make([]database.WorkspaceAgentScriptTiming, 0) | ||
for _, newTiming := range newTimings { | ||
timing := dbgen.WorkspaceAgentScriptTiming(t, db, newTiming) | ||
timings = append(timings, timing) | ||
} | ||
return timings | ||
} | ||
t.Run("NonExistentBuild", func(t *testing.T) { | ||
t.Parallel() | ||
// When: fetching an inexistent build | ||
buildID := uuid.New() | ||
_, err := client.WorkspaceBuildTimings(context.Background(), buildID) | ||
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. Instead of using 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. 👍 | ||
// Then: expect a not found error | ||
require.Error(t, err) | ||
require.Contains(t, err.Error(), "not found") | ||
}) | ||
t.Run("EmptyTimings", func(t *testing.T) { | ||
t.Parallel() | ||
// When: fetching timings for a build with no timings | ||
build := makeBuild() | ||
res, err := client.WorkspaceBuildTimings(context.Background(), build.ID) | ||
// Then: return a response with empty timings | ||
require.NoError(t, err) | ||
require.Empty(t, res.ProvisionerTimings) | ||
require.Empty(t, res.AgentScriptTimings) | ||
}) | ||
t.Run("ProvisionerTimings", func(t *testing.T) { | ||
t.Parallel() | ||
// When: fetching timings for a build with provisioner timings | ||
build := makeBuild() | ||
provisionerTimings := makeProvisionerTimings(build, 5) | ||
// Then: return a response with the expected timings | ||
res, err := client.WorkspaceBuildTimings(context.Background(), build.ID) | ||
require.NoError(t, err) | ||
require.Len(t, res.ProvisionerTimings, 5) | ||
for i := range res.ProvisionerTimings { | ||
timingRes := res.ProvisionerTimings[i] | ||
genTiming := provisionerTimings[i] | ||
require.Equal(t, genTiming.Resource, timingRes.Resource) | ||
require.Equal(t, genTiming.Action, timingRes.Action) | ||
require.Equal(t, string(genTiming.Stage), timingRes.Stage) | ||
require.Equal(t, genTiming.JobID.String(), timingRes.JobID.String()) | ||
require.Equal(t, genTiming.Source, timingRes.Source) | ||
require.Equal(t, genTiming.StartedAt.UnixMilli(), timingRes.StartedAt.UnixMilli()) | ||
require.Equal(t, genTiming.EndedAt.UnixMilli(), timingRes.EndedAt.UnixMilli()) | ||
} | ||
}) | ||
t.Run("AgentScriptTimings", func(t *testing.T) { | ||
t.Parallel() | ||
// When: fetching timings for a build with agent script timings | ||
build := makeBuild() | ||
resource := dbgen.WorkspaceResource(t, db, database.WorkspaceResource{ | ||
JobID: build.JobID, | ||
}) | ||
@@ -1276,101 +1380,55 @@ func TestWorkspaceBuildTimings(t *testing.T) { | ||
uuid.New(), | ||
}, | ||
}) | ||
agentScriptTimings := makeAgentScriptTimings(scripts[0], 5) | ||
// Then: return a response with the expected timings | ||
res, err:=client.WorkspaceBuildTimings(context.Background(), build.ID) | ||
require.NoError(t, err) | ||
require.Len(t, res.AgentScriptTimings, 5) | ||
for i := range res.AgentScriptTimings{ | ||
timingRes := res.AgentScriptTimings[i] | ||
genTiming := agentScriptTimings[i] | ||
require.Equal(t, genTiming.ExitCode, timingRes.ExitCode) | ||
require.Equal(t, string(genTiming.Status), timingRes.Status) | ||
require.Equal(t, string(genTiming.Stage), timingRes.Stage) | ||
require.Equal(t, genTiming.StartedAt.UnixMilli(), timingRes.StartedAt.UnixMilli()) | ||
require.Equal(t, genTiming.EndedAt.UnixMilli(), timingRes.EndedAt.UnixMilli()) | ||
} | ||
}) | ||
t.Run("NoAgentScripts", func(t *testing.T) { | ||
t.Parallel() | ||
// When: fetching timings for a build with no agent scripts | ||
build := makeBuild() | ||
resource := dbgen.WorkspaceResource(t, db, database.WorkspaceResource{ | ||
JobID: build.JobID, | ||
}) | ||
dbgen.WorkspaceAgent(t, db, database.WorkspaceAgent{ | ||
ResourceID: resource.ID, | ||
}) | ||
// Then: return a response with empty agent script timings | ||
res, err := client.WorkspaceBuildTimings(context.Background(), build.ID) | ||
require.NoError(t, err) | ||
require.Empty(t, res.AgentScriptTimings) | ||
}) | ||
// Some workspaces might not have agents. It is improbable, but possible. | ||
t.Run("NoAgents", func(t *testing.T) { | ||
t.Parallel() | ||
// When: fetching timings for a build with no agents | ||
build := makeBuild() | ||
dbgen.WorkspaceResource(t, db, database.WorkspaceResource{ | ||
JobID: build.JobID, | ||
}) | ||
// Then: return a response with empty agent script timings | ||
res, err := client.WorkspaceBuildTimings(context.Background(), build.ID) | ||
require.NoError(t, err) | ||
require.Empty(t, res.AgentScriptTimings) | ||
}) | ||
} |
Uh oh!
There was an error while loading.Please reload this page.