|
5 | 5 | "net/http"
|
6 | 6 | "time"
|
7 | 7 |
|
8 |
| - "golang.org/x/xerrors" |
9 |
| - |
10 | 8 | "github.com/google/uuid"
|
| 9 | + "golang.org/x/xerrors" |
11 | 10 |
|
12 | 11 | "github.com/coder/coder/v2/cli/clibase"
|
13 | 12 | "github.com/coder/coder/v2/cli/cliui"
|
@@ -66,29 +65,14 @@ func (r *RootCmd) start() *clibase.Cmd {
|
66 | 65 | // It's possible for a workspace build to fail due to the template requiring starting
|
67 | 66 | // workspaces with the active version.
|
68 | 67 | if cerr, ok := codersdk.AsError(err); ok && cerr.StatusCode() == http.StatusUnauthorized {
|
69 |
| - template, err := client.Template(inv.Context(), workspace.TemplateID) |
70 |
| - if err != nil { |
71 |
| - return xerrors.Errorf("get template: %w", err) |
72 |
| - } |
73 |
| - |
74 |
| - buildParameters, err = prepStartWorkspace(inv, client, prepStartWorkspaceArgs{ |
75 |
| - Action: WorkspaceStart, |
76 |
| - TemplateVersionID: template.ActiveVersionID, |
77 |
| - |
| 68 | + build, err = startWorkspaceActiveVersion(inv, client, startWorkspaceActiveVersionArgs{ |
| 69 | + BuildOptions: buildOptions, |
78 | 70 | LastBuildParameters: lastBuildParameters,
|
79 |
| - |
80 |
| - PromptBuildOptions: parameterFlags.promptBuildOptions, |
81 |
| - BuildOptions: buildOptions, |
| 71 | + PromptBuildOptions: parameterFlags.promptBuildOptions, |
| 72 | + Workspace: workspace, |
82 | 73 | })
|
83 | 74 | if err != nil {
|
84 |
| - return err |
85 |
| - } |
86 |
| - |
87 |
| - req.RichParameterValues = buildParameters |
88 |
| - req.TemplateVersionID = template.ActiveVersionID |
89 |
| - build, err = client.CreateWorkspaceBuild(inv.Context(), workspace.ID, req) |
90 |
| - if err != nil { |
91 |
| - return err |
| 75 | + return xerrors.Errorf("start workspace with active template version: %w", err) |
92 | 76 | }
|
93 | 77 | } else if err != nil {
|
94 | 78 | return err
|
@@ -138,3 +122,43 @@ func prepStartWorkspace(inv *clibase.Invocation, client *codersdk.Client, args p
|
138 | 122 | WithBuildOptions(args.BuildOptions)
|
139 | 123 | return resolver.Resolve(inv, args.Action, templateVersionParameters)
|
140 | 124 | }
|
| 125 | + |
| 126 | +type startWorkspaceActiveVersionArgs struct { |
| 127 | + BuildOptions []codersdk.WorkspaceBuildParameter |
| 128 | + LastBuildParameters []codersdk.WorkspaceBuildParameter |
| 129 | + PromptBuildOptions bool |
| 130 | + Workspace codersdk.Workspace |
| 131 | +} |
| 132 | + |
| 133 | +func startWorkspaceActiveVersion(inv *clibase.Invocation, client *codersdk.Client, args startWorkspaceActiveVersionArgs) (codersdk.WorkspaceBuild, error) { |
| 134 | + _, _ = fmt.Fprintln(inv.Stdout, "Failed to restart with the template version from your last build. Policy may require you to restart with the current active template version.") |
| 135 | + |
| 136 | + template, err := client.Template(inv.Context(), args.Workspace.TemplateID) |
| 137 | + if err != nil { |
| 138 | + return codersdk.WorkspaceBuild{}, xerrors.Errorf("get template: %w", err) |
| 139 | + } |
| 140 | + |
| 141 | + buildParameters, err := prepStartWorkspace(inv, client, prepStartWorkspaceArgs{ |
| 142 | + Action: WorkspaceStart, |
| 143 | + TemplateVersionID: template.ActiveVersionID, |
| 144 | + |
| 145 | + LastBuildParameters: args.LastBuildParameters, |
| 146 | + |
| 147 | + PromptBuildOptions: args.PromptBuildOptions, |
| 148 | + BuildOptions: args.BuildOptions, |
| 149 | + }) |
| 150 | + if err != nil { |
| 151 | + return codersdk.WorkspaceBuild{}, err |
| 152 | + } |
| 153 | + |
| 154 | + build, err := client.CreateWorkspaceBuild(inv.Context(), args.Workspace.ID, codersdk.CreateWorkspaceBuildRequest{ |
| 155 | + Transition: codersdk.WorkspaceTransitionStart, |
| 156 | + RichParameterValues: buildParameters, |
| 157 | + TemplateVersionID: template.ActiveVersionID, |
| 158 | + }) |
| 159 | + if err != nil { |
| 160 | + return codersdk.WorkspaceBuild{}, err |
| 161 | + } |
| 162 | + |
| 163 | + return build, nil |
| 164 | +} |
0 commit comments