mirror of
https://github.com/coder/coder.git
synced 2026-09-24 15:04:27 +08:00
Spike/222 workspace build order (#1534)
* chore: refactor before_id/after_id to build_number Signed-off-by: Spike Curtis <spike@coder.com> * pagination of workspace_builds Signed-off-by: Spike Curtis <spike@coder.com> * Disable parallel on postgres tests Signed-off-by: Spike Curtis <spike@coder.com> * Fix lint Signed-off-by: Spike Curtis <spike@coder.com> * Fix workspace build postgres query Signed-off-by: Spike Curtis <spike@coder.com> * Fix JS tests Signed-off-by: Spike Curtis <spike@coder.com> * Fix workspace builds postgres query Signed-off-by: Spike Curtis <spike@coder.com>
This commit is contained in:
@@ -57,7 +57,7 @@ func (e *Executor) runOnce(t time.Time) error {
|
||||
|
||||
for _, ws := range eligibleWorkspaces {
|
||||
// Determine the workspace state based on its latest build.
|
||||
priorHistory, err := db.GetWorkspaceBuildByWorkspaceIDWithoutAfter(e.ctx, ws.ID)
|
||||
priorHistory, err := db.GetLatestWorkspaceBuildByWorkspaceID(e.ctx, ws.ID)
|
||||
if err != nil {
|
||||
e.log.Warn(e.ctx, "get latest workspace build",
|
||||
slog.F("workspace_id", ws.ID),
|
||||
@@ -152,12 +152,8 @@ func build(ctx context.Context, store database.Store, workspace database.Workspa
|
||||
return xerrors.Errorf("get workspace template: %w", err)
|
||||
}
|
||||
|
||||
priorHistoryID := uuid.NullUUID{
|
||||
UUID: priorHistory.ID,
|
||||
Valid: true,
|
||||
}
|
||||
priorBuildNumber := priorHistory.BuildNumber
|
||||
|
||||
var newWorkspaceBuild database.WorkspaceBuild
|
||||
// This must happen in a transaction to ensure history can be inserted, and
|
||||
// the prior history can update it's "after" column to point at the new.
|
||||
workspaceBuildID := uuid.New()
|
||||
@@ -186,13 +182,13 @@ func build(ctx context.Context, store database.Store, workspace database.Workspa
|
||||
if err != nil {
|
||||
return xerrors.Errorf("insert provisioner job: %w", err)
|
||||
}
|
||||
newWorkspaceBuild, err = store.InsertWorkspaceBuild(ctx, database.InsertWorkspaceBuildParams{
|
||||
_, err = store.InsertWorkspaceBuild(ctx, database.InsertWorkspaceBuildParams{
|
||||
ID: workspaceBuildID,
|
||||
CreatedAt: now,
|
||||
UpdatedAt: now,
|
||||
WorkspaceID: workspace.ID,
|
||||
TemplateVersionID: priorHistory.TemplateVersionID,
|
||||
BeforeID: priorHistoryID,
|
||||
BuildNumber: priorBuildNumber + 1,
|
||||
Name: namesgenerator.GetRandomName(1),
|
||||
ProvisionerState: priorHistory.ProvisionerState,
|
||||
InitiatorID: workspace.OwnerID,
|
||||
@@ -202,21 +198,5 @@ func build(ctx context.Context, store database.Store, workspace database.Workspa
|
||||
if err != nil {
|
||||
return xerrors.Errorf("insert workspace build: %w", err)
|
||||
}
|
||||
|
||||
if priorHistoryID.Valid {
|
||||
// Update the prior history entries "after" column.
|
||||
err = store.UpdateWorkspaceBuildByID(ctx, database.UpdateWorkspaceBuildByIDParams{
|
||||
ID: priorHistory.ID,
|
||||
ProvisionerState: priorHistory.ProvisionerState,
|
||||
UpdatedAt: now,
|
||||
AfterID: uuid.NullUUID{
|
||||
UUID: newWorkspaceBuild.ID,
|
||||
Valid: true,
|
||||
},
|
||||
})
|
||||
if err != nil {
|
||||
return xerrors.Errorf("update prior workspace build: %w", err)
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
@@ -419,10 +419,17 @@ func TestExecutorAutostartMultipleOK(t *testing.T) {
|
||||
require.NotEqual(t, workspace.LatestBuild.ID, ws.LatestBuild.ID, "expected a workspace build to occur")
|
||||
require.Equal(t, codersdk.ProvisionerJobSucceeded, ws.LatestBuild.Job.Status, "expected provisioner job to have succeeded")
|
||||
require.Equal(t, database.WorkspaceTransitionStart, ws.LatestBuild.Transition, "expected latest transition to be start")
|
||||
builds, err := client.WorkspaceBuilds(ctx, ws.ID)
|
||||
builds, err := client.WorkspaceBuilds(ctx, codersdk.WorkspaceBuildsRequest{WorkspaceID: ws.ID})
|
||||
require.NoError(t, err, "fetch list of workspace builds from primary")
|
||||
// One build to start, one stop transition, and one autostart. No more.
|
||||
require.Equal(t, database.WorkspaceTransitionStart, builds[0].Transition)
|
||||
require.Equal(t, database.WorkspaceTransitionStop, builds[1].Transition)
|
||||
require.Equal(t, database.WorkspaceTransitionStart, builds[2].Transition)
|
||||
require.Len(t, builds, 3, "unexpected number of builds for workspace from primary")
|
||||
|
||||
// Builds are returned most recent first.
|
||||
require.True(t, builds[0].CreatedAt.After(builds[1].CreatedAt))
|
||||
require.True(t, builds[1].CreatedAt.After(builds[2].CreatedAt))
|
||||
}
|
||||
|
||||
func mustProvisionWorkspace(t *testing.T, client *codersdk.Client) codersdk.Workspace {
|
||||
|
||||
Reference in New Issue
Block a user