(ctx context.Context, id string, logs io.Writer)
| 44 | } |
| 45 | |
| 46 | func (r *Runner) RunReturningResult(ctx context.Context, id string, logs io.Writer) (RunResult, error) { |
| 47 | ctx, span := tracing.StartSpan(ctx) |
| 48 | defer span.End() |
| 49 | |
| 50 | result := RunResult{} |
| 51 | |
| 52 | reachedBarrier := false |
| 53 | defer func() { |
| 54 | if !reachedBarrier { |
| 55 | r.cfg.SetupBarrier.Done() |
| 56 | } |
| 57 | }() |
| 58 | |
| 59 | logs = loadtestutil.NewSyncWriter(logs) |
| 60 | logger := slog.Make(sloghuman.Sink(logs)).Leveled(slog.LevelDebug) |
| 61 | r.client.SetLogger(logger) |
| 62 | r.client.SetLogBodies(true) |
| 63 | |
| 64 | r.createUserRunner = createusers.NewRunner(r.client, r.cfg.User) |
| 65 | newUserAndToken, err := r.createUserRunner.RunReturningUser(ctx, id, logs) |
| 66 | if err != nil { |
| 67 | return result, xerrors.Errorf("create user: %w", err) |
| 68 | } |
| 69 | newUser := newUserAndToken.User |
| 70 | |
| 71 | newUserClient := codersdk.New(r.client.URL, |
| 72 | codersdk.WithSessionToken(newUserAndToken.SessionToken), |
| 73 | codersdk.WithLogger(logger), |
| 74 | codersdk.WithLogBodies()) |
| 75 | |
| 76 | //nolint:gocritic // short log is fine |
| 77 | logger.Info(ctx, "user created", slog.F("username", newUser.Username), slog.F("user_id", newUser.ID.String())) |
| 78 | |
| 79 | workspaceBuildConfig := r.cfg.Workspace |
| 80 | workspaceBuildConfig.OrganizationID = r.cfg.User.OrganizationID |
| 81 | workspaceBuildConfig.UserID = newUser.ID.String() |
| 82 | // We'll wait for the build ourselves to avoid multiple API requests. |
| 83 | workspaceBuildConfig.NoWaitForBuild = true |
| 84 | workspaceBuildConfig.NoWaitForAgents = true |
| 85 | |
| 86 | r.workspacebuildRunner = workspacebuild.NewRunner(newUserClient, workspaceBuildConfig) |
| 87 | workspace, err := r.workspacebuildRunner.RunReturningWorkspace(ctx, id, logs) |
| 88 | if err != nil { |
| 89 | return result, xerrors.Errorf("create workspace: %w", err) |
| 90 | } |
| 91 | |
| 92 | result.WorkspaceID = workspace.ID |
| 93 | result.WorkspaceName = workspace.Name |
| 94 | |
| 95 | buildUpdates := r.cfg.BuildUpdates |
| 96 | |
| 97 | createWorkspaceCtx, cancel := context.WithTimeout(ctx, r.cfg.WorkspaceJobTimeout) |
| 98 | defer cancel() |
| 99 | |
| 100 | logger.Info(ctx, "waiting for initial workspace build", slog.F("workspace_name", workspace.Name), slog.F("workspace_id", workspace.ID.String())) |
| 101 | err = waitForBuild(createWorkspaceCtx, logger, buildUpdates, codersdk.WorkspaceTransitionStart) |
| 102 | if err != nil { |
| 103 | return result, xerrors.Errorf("wait for initial workspace build (workspace=%s, id=%s): %w", workspace.Name, workspace.ID, err) |
no test coverage detected