(ctx context.Context, client *codersdk.Client, log slog.Logger, workspaceID uuid.UUID)
| 442 | } |
| 443 | |
| 444 | func WorkspaceInfo(ctx context.Context, client *codersdk.Client, log slog.Logger, workspaceID uuid.UUID) Workspace { |
| 445 | var ( |
| 446 | w Workspace |
| 447 | eg errgroup.Group |
| 448 | ) |
| 449 | |
| 450 | if workspaceID == uuid.Nil { |
| 451 | log.Error(ctx, "no workspace id specified") |
| 452 | return w |
| 453 | } |
| 454 | |
| 455 | // dependency, cannot fetch concurrently |
| 456 | ws, err := client.Workspace(ctx, workspaceID) |
| 457 | if err != nil { |
| 458 | log.Error(ctx, "fetch workspace", slog.Error(err), slog.F("workspace_id", workspaceID)) |
| 459 | return w |
| 460 | } |
| 461 | for _, res := range ws.LatestBuild.Resources { |
| 462 | for _, agt := range res.Agents { |
| 463 | sanitizeEnv(agt.EnvironmentVariables) |
| 464 | } |
| 465 | } |
| 466 | w.Workspace = ws |
| 467 | |
| 468 | eg.Go(func() error { |
| 469 | buildLogCh, closer, err := client.WorkspaceBuildLogsAfter(ctx, ws.LatestBuild.ID, 0) |
| 470 | if err != nil { |
| 471 | return xerrors.Errorf("fetch provisioner job logs: %w", err) |
| 472 | } |
| 473 | defer closer.Close() |
| 474 | for log := range buildLogCh { |
| 475 | w.BuildLogs = append(w.BuildLogs, log) |
| 476 | } |
| 477 | return nil |
| 478 | }) |
| 479 | |
| 480 | eg.Go(func() error { |
| 481 | if w.Workspace.TemplateActiveVersionID == uuid.Nil { |
| 482 | return xerrors.Errorf("workspace has nil template active version id") |
| 483 | } |
| 484 | tv, err := client.TemplateVersion(ctx, w.Workspace.TemplateActiveVersionID) |
| 485 | if err != nil { |
| 486 | return xerrors.Errorf("fetch template active version id") |
| 487 | } |
| 488 | w.TemplateVersion = tv |
| 489 | |
| 490 | if tv.Job.FileID == uuid.Nil { |
| 491 | return xerrors.Errorf("template file id is nil") |
| 492 | } |
| 493 | raw, ctype, err := client.DownloadWithFormat(ctx, tv.Job.FileID, codersdk.FormatZip) |
| 494 | if err != nil { |
| 495 | return err |
| 496 | } |
| 497 | if ctype != codersdk.ContentTypeZip { |
| 498 | return xerrors.Errorf("expected content-type %s, got %s", codersdk.ContentTypeZip, ctype) |
| 499 | } |
| 500 | |
| 501 | b64encoded := base64.StdEncoding.EncodeToString(raw) |
no test coverage detected