(ctx context.Context, failJob *proto.FailedJob)
| 1182 | } |
| 1183 | |
| 1184 | func (s *server) FailJob(ctx context.Context, failJob *proto.FailedJob) (*proto.Empty, error) { |
| 1185 | ctx, span := s.startTrace(ctx, tracing.FuncName()) |
| 1186 | defer span.End() |
| 1187 | |
| 1188 | //nolint:gocritic // Provisionerd has specific authz rules. |
| 1189 | ctx = dbauthz.AsProvisionerd(ctx) |
| 1190 | jobID, err := uuid.Parse(failJob.JobId) |
| 1191 | if err != nil { |
| 1192 | return nil, xerrors.Errorf("parse job id: %w", err) |
| 1193 | } |
| 1194 | s.Logger.Debug(ctx, "stage FailJob starting", slog.F("job_id", jobID)) |
| 1195 | job, err := s.Database.GetProvisionerJobByID(ctx, jobID) |
| 1196 | if err != nil { |
| 1197 | return nil, xerrors.Errorf("get provisioner job: %w", err) |
| 1198 | } |
| 1199 | if job.WorkerID.UUID.String() != s.ID.String() { |
| 1200 | return nil, xerrors.New("you don't own this job") |
| 1201 | } |
| 1202 | if job.CompletedAt.Valid { |
| 1203 | return nil, xerrors.Errorf("job already completed") |
| 1204 | } |
| 1205 | job.CompletedAt = sql.NullTime{ |
| 1206 | Time: s.timeNow(), |
| 1207 | Valid: true, |
| 1208 | } |
| 1209 | job.Error = sql.NullString{ |
| 1210 | String: failJob.Error, |
| 1211 | Valid: failJob.Error != "", |
| 1212 | } |
| 1213 | job.ErrorCode = sql.NullString{ |
| 1214 | String: failJob.ErrorCode, |
| 1215 | Valid: failJob.ErrorCode != "", |
| 1216 | } |
| 1217 | |
| 1218 | err = s.Database.UpdateProvisionerJobWithCompleteByID(ctx, database.UpdateProvisionerJobWithCompleteByIDParams{ |
| 1219 | ID: jobID, |
| 1220 | CompletedAt: job.CompletedAt, |
| 1221 | UpdatedAt: s.timeNow(), |
| 1222 | Error: job.Error, |
| 1223 | ErrorCode: job.ErrorCode, |
| 1224 | }) |
| 1225 | if err != nil { |
| 1226 | return nil, xerrors.Errorf("update provisioner job: %w", err) |
| 1227 | } |
| 1228 | s.Telemetry.Report(&telemetry.Snapshot{ |
| 1229 | ProvisionerJobs: []telemetry.ProvisionerJob{telemetry.ConvertProvisionerJob(job)}, |
| 1230 | }) |
| 1231 | |
| 1232 | switch jobType := failJob.Type.(type) { |
| 1233 | case *proto.FailedJob_WorkspaceBuild_: |
| 1234 | var input WorkspaceProvisionJob |
| 1235 | err = json.Unmarshal(job.Input, &input) |
| 1236 | if err != nil { |
| 1237 | return nil, xerrors.Errorf("unmarshal workspace provision input: %w", err) |
| 1238 | } |
| 1239 | |
| 1240 | var build database.WorkspaceBuild |
| 1241 | var workspace database.Workspace |
nothing calls this directly
no test coverage detected