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

fix: set codersdk.Task current_state during task initialization#20692

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

Draft
ssncferreira wants to merge5 commits intomain
base:main
Choose a base branch
Loading
fromssncferreira/fix-task-initializing-state-message
Draft
Show file tree
Hide file tree
Changes fromall commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
29 changes: 29 additions & 0 deletionscoderd/aitasks.go
View file
Open in desktop
Original file line numberDiff line numberDiff line change
Expand Up@@ -302,6 +302,35 @@ func taskFromDBTaskAndWorkspace(dbTask database.Task, ws codersdk.Workspace) cod
}
}

// If no valid agent state was found for the current build and the task is initializing,
// provide a descriptive initialization message.
if currentState == nil && codersdk.TaskStatus(dbTask.Status) == codersdk.TaskStatusInitializing {
message := "Initializing workspace"

switch {
case ws.LatestBuild.Status == codersdk.WorkspaceStatusPending:
message = "Workspace build is pending"
case ws.LatestBuild.Status == codersdk.WorkspaceStatusStarting:
message = "Starting workspace"
case taskAgentLifecycle != nil:
switch *taskAgentLifecycle {
case codersdk.WorkspaceAgentLifecycleCreated:
message = "Agent is connecting"
case codersdk.WorkspaceAgentLifecycleStarting:
message = "Agent is starting"
default:
message = "Initializing workspace agent"
}
}

currentState = &codersdk.TaskStateEntry{
Timestamp: ws.LatestBuild.CreatedAt,
State: codersdk.TaskStateWorking,
Message: message,
URI: "",
}
}

return codersdk.Task{
ID: dbTask.ID,
OrganizationID: dbTask.OrganizationID,
Expand Down
132 changes: 130 additions & 2 deletionscoderd/aitasks_test.go
View file
Open in desktop
Original file line numberDiff line numberDiff line change
Expand Up@@ -240,14 +240,142 @@ func TestTasks(t *testing.T) {
assert.NotNil(t, updated.CurrentState, "current state should not be nil")
assert.Equal(t, "all done", updated.CurrentState.Message)
assert.Equal(t, codersdk.TaskStateComplete, updated.CurrentState.State)
previousCurrentState := updated.CurrentState

// Start the workspace again
coderdtest.MustTransitionWorkspace(t, client, task.WorkspaceID.UUID, codersdk.WorkspaceTransitionStop, codersdk.WorkspaceTransitionStart)

// Verify that the status from the previous build is no longer present
// Verify that the status from the previous build has been cleared
// and replaced by the agent initialization status.
updated, err = exp.TaskByID(ctx, task.ID)
require.NoError(t, err)
assert.Nil(t, updated.CurrentState, "current state should be nil")
assert.NotEqual(t, previousCurrentState, updated.CurrentState)
assert.Equal(t, codersdk.TaskStateWorking, updated.CurrentState.State)
assert.Equal(t, "Agent is connecting", updated.CurrentState.Message)
})

t.Run("InitializingAgentState", func(t *testing.T) {
t.Parallel()

testCases := []struct {
name string
setupBuild func(t *testing.T, ctx context.Context, db database.Store, user codersdk.CreateFirstUserResponse) dbfake.WorkspaceResponse
expectedMessage string
}{
{
name: "WorkspaceBuildPending",
setupBuild: func(t *testing.T, ctx context.Context, db database.Store, user codersdk.CreateFirstUserResponse) dbfake.WorkspaceResponse {
return dbfake.WorkspaceBuild(t, db, database.WorkspaceTable{
OrganizationID: user.OrganizationID,
OwnerID: user.UserID,
}).WithTask(database.TaskTable{
Prompt: "test workspace pending",
}, &proto.App{
Id: uuid.NewString(),
Slug: "ccw",
}).Pending().Do()
},
expectedMessage: "Workspace build is pending",
},
{
name: "WorkspaceStarting",
setupBuild: func(t *testing.T, ctx context.Context, db database.Store, user codersdk.CreateFirstUserResponse) dbfake.WorkspaceResponse {
return dbfake.WorkspaceBuild(t, db, database.WorkspaceTable{
OrganizationID: user.OrganizationID,
OwnerID: user.UserID,
}).WithTask(database.TaskTable{
Prompt: "test workspace starting",
}, &proto.App{
Id: uuid.NewString(),
Slug: "ccw",
}).Starting().Do()
},
expectedMessage: "Starting workspace",
},
{
name: "AgentConnecting",
setupBuild: func(t *testing.T, ctx context.Context, db database.Store, user codersdk.CreateFirstUserResponse) dbfake.WorkspaceResponse {
wb := dbfake.WorkspaceBuild(t, db, database.WorkspaceTable{
OrganizationID: user.OrganizationID,
OwnerID: user.UserID,
}).WithTask(database.TaskTable{
Prompt: "test agent connecting",
}, &proto.App{
Id: uuid.NewString(),
Slug: "ccw",
}).Do()

require.True(t, wb.Task.WorkspaceAgentID.Valid)
require.NotEqual(t, uuid.Nil, wb.Task.WorkspaceAgentID.UUID)

// nolint:gocritic // System restricted operation to update agent lifecycle to "created"
err := db.UpdateWorkspaceAgentLifecycleStateByID(dbauthz.AsSystemRestricted(ctx), database.UpdateWorkspaceAgentLifecycleStateByIDParams{
ID: wb.Task.WorkspaceAgentID.UUID,
LifecycleState: database.WorkspaceAgentLifecycleStateCreated,
})
require.NoError(t, err)

return wb
},
expectedMessage: "Agent is connecting",
},
{
name: "AgentStarting",
setupBuild: func(t *testing.T, ctx context.Context, db database.Store, user codersdk.CreateFirstUserResponse) dbfake.WorkspaceResponse {
wb := dbfake.WorkspaceBuild(t, db, database.WorkspaceTable{
OrganizationID: user.OrganizationID,
OwnerID: user.UserID,
}).WithTask(database.TaskTable{
Prompt: "test agent starting",
}, &proto.App{
Id: uuid.NewString(),
Slug: "ccw",
}).Do()

require.True(t, wb.Task.WorkspaceAgentID.Valid)
require.NotEqual(t, uuid.Nil, wb.Task.WorkspaceAgentID.UUID)

// nolint:gocritic // System restricted operation to update agent lifecycle to "created"
err := db.UpdateWorkspaceAgentLifecycleStateByID(dbauthz.AsSystemRestricted(ctx), database.UpdateWorkspaceAgentLifecycleStateByIDParams{
ID: wb.Task.WorkspaceAgentID.UUID,
LifecycleState: database.WorkspaceAgentLifecycleStateStarting,
})
require.NoError(t, err)

return wb
},
expectedMessage: "Agent is starting",
},
}

for _, tc := range testCases {
t.Run(tc.name, func(t *testing.T) {
t.Parallel()

var (
client, db = coderdtest.NewWithDatabase(t, &coderdtest.Options{
IncludeProvisionerDaemon: true,
})
ctx = testutil.Context(t, testutil.WaitShort)
user = coderdtest.CreateFirstUser(t, client)
exp = codersdk.NewExperimentalClient(client)
)

workspaceBuild := tc.setupBuild(t, ctx, db, user)

// Get the task
task, err := exp.TaskByID(ctx, workspaceBuild.Task.ID)
require.NoError(t, err)

// Verify the task is initializing with appropriate current_state
assert.Equal(t, codersdk.TaskStatusInitializing, task.Status)
require.NotNil(t, task.CurrentState)
assert.Equal(t, codersdk.TaskStateWorking, task.CurrentState.State)
assert.Equal(t, tc.expectedMessage, task.CurrentState.Message)
assert.NotZero(t, task.CurrentState.Timestamp)
assert.Empty(t, task.CurrentState.URI)
})
}
})

t.Run("Delete", func(t *testing.T) {
Expand Down
14 changes: 11 additions & 3 deletionscoderd/database/dbfake/dbfake.go
View file
Open in desktop
Original file line numberDiff line numberDiff line change
Expand Up@@ -361,12 +361,20 @@ func (b WorkspaceBuildBuilder) doInTX() WorkspaceResponse {
require.Fail(b.t, "task app not configured but workspace is a task workspace")
}

app := mustWorkspaceAppByWorkspaceAndBuildAndAppID(ownerCtx, b.t, b.db, resp.Workspace.ID, resp.Build.BuildNumber, b.taskAppID)
workspaceAgentID := uuid.NullUUID{}
workspaceAppID := uuid.NullUUID{}
// Workspace agent and app are only properly set upon job completion
if b.jobStatus != database.ProvisionerJobStatusPending && b.jobStatus != database.ProvisionerJobStatusRunning {
app := mustWorkspaceAppByWorkspaceAndBuildAndAppID(ownerCtx, b.t, b.db, resp.Workspace.ID, resp.Build.BuildNumber, b.taskAppID)
workspaceAgentID = uuid.NullUUID{UUID: app.AgentID, Valid: true}
workspaceAppID = uuid.NullUUID{UUID: app.ID, Valid: true}
}

_, err = b.db.UpsertTaskWorkspaceApp(ownerCtx, database.UpsertTaskWorkspaceAppParams{
TaskID: task.ID,
WorkspaceBuildNumber: resp.Build.BuildNumber,
WorkspaceAgentID:uuid.NullUUID{UUID: app.AgentID, Valid: true},
WorkspaceAppID:uuid.NullUUID{UUID: app.ID, Valid: true},
WorkspaceAgentID:workspaceAgentID,
WorkspaceAppID:workspaceAppID,
})
require.NoError(b.t, err, "upsert task workspace app")
b.logger.Debug(context.Background(), "linked task to workspace build",
Expand Down
Loading

[8]ページ先頭

©2009-2025 Movatter.jp