| 146 | } |
| 147 | |
| 148 | func (a *LifecycleAPI) UpdateStartup(ctx context.Context, req *agentproto.UpdateStartupRequest) (*agentproto.Startup, error) { |
| 149 | apiVersion, ok := ctx.Value(contextKeyAPIVersion{}).(string) |
| 150 | if !ok { |
| 151 | return nil, xerrors.Errorf("internal error; api version unspecified") |
| 152 | } |
| 153 | workspaceAgent, err := a.AgentFn(ctx) |
| 154 | if err != nil { |
| 155 | return nil, err |
| 156 | } |
| 157 | |
| 158 | a.Log.Debug( |
| 159 | ctx, |
| 160 | "post workspace agent version", |
| 161 | slog.F("workspace_id", a.WorkspaceID), |
| 162 | slog.F("agent_version", req.Startup.Version), |
| 163 | ) |
| 164 | |
| 165 | if !semver.IsValid(req.Startup.Version) { |
| 166 | return nil, xerrors.Errorf("invalid agent semver version %q", req.Startup.Version) |
| 167 | } |
| 168 | |
| 169 | // Validate subsystems. |
| 170 | dbSubsystems := make([]database.WorkspaceAgentSubsystem, 0, len(req.Startup.Subsystems)) |
| 171 | seenSubsystems := make(map[database.WorkspaceAgentSubsystem]struct{}, len(req.Startup.Subsystems)) |
| 172 | for _, s := range req.Startup.Subsystems { |
| 173 | var dbSubsystem database.WorkspaceAgentSubsystem |
| 174 | switch s { |
| 175 | case agentproto.Startup_ENVBOX: |
| 176 | dbSubsystem = database.WorkspaceAgentSubsystemEnvbox |
| 177 | case agentproto.Startup_ENVBUILDER: |
| 178 | dbSubsystem = database.WorkspaceAgentSubsystemEnvbuilder |
| 179 | case agentproto.Startup_EXECTRACE: |
| 180 | dbSubsystem = database.WorkspaceAgentSubsystemExectrace |
| 181 | default: |
| 182 | return nil, xerrors.Errorf("invalid agent subsystem %q", s) |
| 183 | } |
| 184 | |
| 185 | if _, ok := seenSubsystems[dbSubsystem]; !ok { |
| 186 | seenSubsystems[dbSubsystem] = struct{}{} |
| 187 | dbSubsystems = append(dbSubsystems, dbSubsystem) |
| 188 | } |
| 189 | } |
| 190 | slices.Sort(dbSubsystems) |
| 191 | |
| 192 | err = a.Database.UpdateWorkspaceAgentStartupByID(ctx, database.UpdateWorkspaceAgentStartupByIDParams{ |
| 193 | ID: workspaceAgent.ID, |
| 194 | Version: req.Startup.Version, |
| 195 | ExpandedDirectory: req.Startup.ExpandedDirectory, |
| 196 | Subsystems: dbSubsystems, |
| 197 | APIVersion: apiVersion, |
| 198 | }) |
| 199 | if err != nil { |
| 200 | return nil, xerrors.Errorf("update workspace agent startup in database: %w", err) |
| 201 | } |
| 202 | |
| 203 | return req.Startup, nil |
| 204 | } |