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

Commiteb55f0a

Browse files
authored
fix(coderd)!: only show task status for current build (#19966)
This changes the task get endpoint to omit app statuses for previous'lifetimes' of a workspace.It also introduces a [breakingchange](https://github.com/coder/coder/blob/release/2.26/codersdk/aitasks.go#L83)to bring `TaskStateComplete` in line with`WorkspaceAppStatusStateComplete`. I can alternatively revert thischange and add a conversion function between the two SDK types.
1 parent930bbaf commiteb55f0a

File tree

5 files changed

+72
-28
lines changed

5 files changed

+72
-28
lines changed

‎cli/exp_task_status_test.go‎

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -96,9 +96,9 @@ func Test_TaskStatus(t *testing.T) {
9696
STATE CHANGED STATUS STATE MESSAGE
9797
4s ago running
9898
3s ago running working Reticulating splines...
99-
2s ago runningcompleted Splines reticulated successfully!
100-
2s ago stoppingcompleted Splines reticulated successfully!
101-
2s ago stoppedcompleted Splines reticulated successfully!`,
99+
2s ago runningcomplete Splines reticulated successfully!
100+
2s ago stoppingcomplete Splines reticulated successfully!
101+
2s ago stoppedcomplete Splines reticulated successfully!`,
102102
hf:func(ctx context.Context,now time.Time)func(http.ResponseWriter,*http.Request) {
103103
varcalls atomic.Int64
104104
returnfunc(w http.ResponseWriter,r*http.Request) {
@@ -143,7 +143,7 @@ STATE CHANGED STATUS STATE MESSAGE
143143
CreatedAt:now.Add(-5*time.Second),
144144
UpdatedAt:now.Add(-4*time.Second),
145145
CurrentState:&codersdk.TaskStateEntry{
146-
State:codersdk.TaskStateCompleted,
146+
State:codersdk.TaskStateComplete,
147147
Timestamp:now.Add(-2*time.Second),
148148
Message:"Splines reticulated successfully!",
149149
},
@@ -155,7 +155,7 @@ STATE CHANGED STATUS STATE MESSAGE
155155
CreatedAt:now.Add(-5*time.Second),
156156
UpdatedAt:now.Add(-1*time.Second),
157157
CurrentState:&codersdk.TaskStateEntry{
158-
State:codersdk.TaskStateCompleted,
158+
State:codersdk.TaskStateComplete,
159159
Timestamp:now.Add(-2*time.Second),
160160
Message:"Splines reticulated successfully!",
161161
},
@@ -167,7 +167,7 @@ STATE CHANGED STATUS STATE MESSAGE
167167
CreatedAt:now.Add(-5*time.Second),
168168
UpdatedAt:now,
169169
CurrentState:&codersdk.TaskStateEntry{
170-
State:codersdk.TaskStateCompleted,
170+
State:codersdk.TaskStateComplete,
171171
Timestamp:now.Add(-2*time.Second),
172172
Message:"Splines reticulated successfully!",
173173
},

‎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
@@ -96,10 +96,10 @@ type TaskState string
9696

9797
// TaskState enums.
9898
const (
99-
TaskStateWorkingTaskState="working"
100-
TaskStateIdleTaskState="idle"
101-
TaskStateCompletedTaskState="completed"
102-
TaskStateFailedTaskState="failed"
99+
TaskStateWorkingTaskState="working"
100+
TaskStateIdleTaskState="idle"
101+
TaskStateCompleteTaskState="complete"
102+
TaskStateFailedTaskState="failed"
103103
)
104104

105105
// Task represents a task.

‎site/src/api/typesGenerated.ts‎

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more aboutcustomizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp