Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commite808b0c

Browse files
committed
fix(coderd)!: only show task status for current build
1 parent063e863 commite808b0c

File tree

3 files changed

+64
-20
lines changed

3 files changed

+64
-20
lines changed

‎coderd/aitasks.go‎

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -245,13 +245,18 @@ func taskFromWorkspace(ws codersdk.Workspace, initialPrompt string) codersdk.Tas
245245
}
246246
}
247247

248+
// Ignore 'latest app status' if it is older than the latest build and the latest build is a 'start' transition.
249+
// This ensures that you don't show a stale app status from a previous build.
250+
// For stop transitions, there is still value in showing the latest app status.
248251
varcurrentState*codersdk.TaskStateEntry
249252
ifws.LatestAppStatus!=nil {
250-
currentState=&codersdk.TaskStateEntry{
251-
Timestamp:ws.LatestAppStatus.CreatedAt,
252-
State:codersdk.TaskState(ws.LatestAppStatus.State),
253-
Message:ws.LatestAppStatus.Message,
254-
URI:ws.LatestAppStatus.URI,
253+
ifws.LatestBuild.Transition!=codersdk.WorkspaceTransitionStart||ws.LatestAppStatus.CreatedAt.After(ws.LatestBuild.CreatedAt) {
254+
currentState=&codersdk.TaskStateEntry{
255+
Timestamp:ws.LatestAppStatus.CreatedAt,
256+
State:codersdk.TaskState(ws.LatestAppStatus.State),
257+
Message:ws.LatestAppStatus.Message,
258+
URI:ws.LatestAppStatus.URI,
259+
}
255260
}
256261
}
257262

‎coderd/aitasks_test.go‎

Lines changed: 50 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ import (
1818
"github.com/coder/coder/v2/coderd/database"
1919
"github.com/coder/coder/v2/coderd/database/dbauthz"
2020
"github.com/coder/coder/v2/coderd/database/dbtestutil"
21+
"github.com/coder/coder/v2/coderd/database/dbtime"
2122
"github.com/coder/coder/v2/coderd/util/slice"
2223
"github.com/coder/coder/v2/codersdk"
2324
"github.com/coder/coder/v2/codersdk/agentsdk"
@@ -269,19 +270,39 @@ func TestTasks(t *testing.T) {
269270
t.Run("Get",func(t*testing.T) {
270271
t.Parallel()
271272

272-
client:=coderdtest.New(t,&coderdtest.Options{IncludeProvisionerDaemon:true})
273-
user:=coderdtest.CreateFirstUser(t,client)
274-
ctx:=testutil.Context(t,testutil.WaitLong)
275-
276-
template:=createAITemplate(t,client,user)
273+
var (
274+
client,db=coderdtest.NewWithDatabase(t,&coderdtest.Options{IncludeProvisionerDaemon:true})
275+
ctx=testutil.Context(t,testutil.WaitLong)
276+
user=coderdtest.CreateFirstUser(t,client)
277+
template=createAITemplate(t,client,user)
278+
// Create a workspace (task) with a specific prompt.
279+
wantPrompt="review my code"
280+
workspace=coderdtest.CreateWorkspace(t,client,template.ID,func(req*codersdk.CreateWorkspaceRequest) {
281+
req.RichParameterValues= []codersdk.WorkspaceBuildParameter{
282+
{Name:codersdk.AITaskPromptParameterName,Value:wantPrompt},
283+
}
284+
})
285+
)
277286

278-
// Create a workspace (task) with a specific prompt.
279-
wantPrompt:="review my code"
280-
workspace:=coderdtest.CreateWorkspace(t,client,template.ID,func(req*codersdk.CreateWorkspaceRequest) {
281-
req.RichParameterValues= []codersdk.WorkspaceBuildParameter{
282-
{Name:codersdk.AITaskPromptParameterName,Value:wantPrompt},
283-
}
287+
coderdtest.AwaitWorkspaceBuildJobCompleted(t,client,workspace.LatestBuild.ID)
288+
ws:=coderdtest.MustWorkspace(t,client,workspace.ID)
289+
// Assert invariant: the workspace has exactly one resource with one agent with one app.
290+
require.Len(t,ws.LatestBuild.Resources,1)
291+
require.Len(t,ws.LatestBuild.Resources[0].Agents,1)
292+
agentID:=ws.LatestBuild.Resources[0].Agents[0].ID
293+
taskAppID:=ws.LatestBuild.Resources[0].Agents[0].Apps[0].ID
294+
295+
// Insert an app status for the workspace
296+
_,err:=db.InsertWorkspaceAppStatus(dbauthz.AsSystemRestricted(ctx), database.InsertWorkspaceAppStatusParams{
297+
ID:uuid.New(),
298+
WorkspaceID:workspace.ID,
299+
CreatedAt:dbtime.Now(),
300+
AgentID:agentID,
301+
AppID:taskAppID,
302+
State:database.WorkspaceAppStatusStateComplete,
303+
Message:"all done",
284304
})
305+
require.NoError(t,err)
285306

286307
// Fetch the task by ID via experimental API and verify fields.
287308
exp:=codersdk.NewExperimentalClient(client)
@@ -293,6 +314,24 @@ func TestTasks(t *testing.T) {
293314
assert.Equal(t,wantPrompt,task.InitialPrompt,"task prompt should match the AI Prompt parameter")
294315
assert.Equal(t,workspace.ID,task.WorkspaceID.UUID,"workspace id should match")
295316
assert.NotEmpty(t,task.Status,"task status should not be empty")
317+
318+
// Stop the workspace
319+
coderdtest.MustTransitionWorkspace(t,client,workspace.ID,codersdk.WorkspaceTransitionStart,codersdk.WorkspaceTransitionStop)
320+
321+
// Verify that the previous status still remains
322+
updated,err:=exp.TaskByID(ctx,workspace.ID)
323+
require.NoError(t,err)
324+
assert.NotNil(t,updated.CurrentState,"current state should not be nil")
325+
assert.Equal(t,"all done",updated.CurrentState.Message)
326+
assert.Equal(t,codersdk.TaskStateComplete,updated.CurrentState.State)
327+
328+
// Start the workspace again
329+
coderdtest.MustTransitionWorkspace(t,client,workspace.ID,codersdk.WorkspaceTransitionStop,codersdk.WorkspaceTransitionStart)
330+
331+
// Verify that the status from the previous build is no longer present
332+
updated,err=exp.TaskByID(ctx,workspace.ID)
333+
require.NoError(t,err)
334+
assert.Nil(t,updated.CurrentState,"current state should be nil")
296335
})
297336

298337
t.Run("Delete",func(t*testing.T) {

‎codersdk/aitasks.go‎

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -79,10 +79,10 @@ func (c *ExperimentalClient) CreateTask(ctx context.Context, user string, reques
7979
typeTaskStatestring
8080

8181
const (
82-
TaskStateWorkingTaskState="working"
83-
TaskStateIdleTaskState="idle"
84-
TaskStateCompletedTaskState="completed"
85-
TaskStateFailedTaskState="failed"
82+
TaskStateWorkingTaskState="working"
83+
TaskStateIdleTaskState="idle"
84+
TaskStateCompleteTaskState="complete"
85+
TaskStateFailedTaskState="failed"
8686
)
8787

8888
// Task represents a task.

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp