Skip to content

Commit 1b8590b

Browse files
committed
consolidate start workspace logic
1 parent a00f8fb commit 1b8590b

File tree

5 files changed

+75
-169
lines changed

5 files changed

+75
-169
lines changed

cli/create.go

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -140,9 +140,9 @@ func (r *RootCmd) create() *clibase.Cmd {
140140
}
141141

142142
richParameters, err := prepWorkspaceBuild(inv, client, prepWorkspaceBuildArgs{
143-
Action: WorkspaceCreate,
144-
Template: template,
145-
NewWorkspaceName: workspaceName,
143+
Action: WorkspaceCreate,
144+
TemplateVersionID: template.ActiveVersionID,
145+
NewWorkspaceName: workspaceName,
146146

147147
RichParameterFile: parameterFlags.richParameterFile,
148148
RichParameters: cliRichParameters,
@@ -224,10 +224,9 @@ func (r *RootCmd) create() *clibase.Cmd {
224224
}
225225

226226
type prepWorkspaceBuildArgs struct {
227-
Action WorkspaceCLIAction
228-
Template codersdk.Template
229-
NewWorkspaceName string
230-
WorkspaceID uuid.UUID
227+
Action WorkspaceCLIAction
228+
TemplateVersionID uuid.UUID
229+
NewWorkspaceName string
231230

232231
LastBuildParameters []codersdk.WorkspaceBuildParameter
233232

@@ -244,7 +243,7 @@ type prepWorkspaceBuildArgs struct {
244243
func prepWorkspaceBuild(inv *clibase.Invocation, client *codersdk.Client, args prepWorkspaceBuildArgs) ([]codersdk.WorkspaceBuildParameter, error) {
245244
ctx := inv.Context()
246245

247-
templateVersion, err := client.TemplateVersion(ctx, args.Template.ActiveVersionID)
246+
templateVersion, err := client.TemplateVersion(ctx, args.TemplateVersionID)
248247
if err != nil {
249248
return nil, xerrors.Errorf("get template version: %w", err)
250249
}

cli/exp_scaletest.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -600,9 +600,9 @@ func (r *RootCmd) scaletestCreateWorkspaces() *clibase.Cmd {
600600
}
601601

602602
richParameters, err := prepWorkspaceBuild(inv, client, prepWorkspaceBuildArgs{
603-
Action: WorkspaceCreate,
604-
Template: tpl,
605-
NewWorkspaceName: "scaletest-N", // TODO: the scaletest runner will pass in a different name here. Does this matter?
603+
Action: WorkspaceCreate,
604+
TemplateVersionID: tpl.ActiveVersionID,
605+
NewWorkspaceName: "scaletest-N", // TODO: the scaletest runner will pass in a different name here. Does this matter?
606606

607607
RichParameterFile: parameterFlags.richParameterFile,
608608
RichParameters: cliRichParameters,

cli/restart.go

Lines changed: 12 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -35,29 +35,6 @@ func (r *RootCmd) restart() *clibase.Cmd {
3535
return err
3636
}
3737

38-
lastBuildParameters, err := client.WorkspaceBuildParameters(inv.Context(), workspace.LatestBuild.ID)
39-
if err != nil {
40-
return err
41-
}
42-
43-
buildOptions, err := asWorkspaceBuildParameters(parameterFlags.buildOptions)
44-
if err != nil {
45-
return xerrors.Errorf("can't parse build options: %w", err)
46-
}
47-
48-
buildParameters, err := prepStartWorkspace(inv, client, prepStartWorkspaceArgs{
49-
Action: WorkspaceRestart,
50-
TemplateVersionID: workspace.LatestBuild.TemplateVersionID,
51-
52-
LastBuildParameters: lastBuildParameters,
53-
54-
PromptBuildOptions: parameterFlags.promptBuildOptions,
55-
BuildOptions: buildOptions,
56-
})
57-
if err != nil {
58-
return err
59-
}
60-
6138
_, err = cliui.Prompt(inv, cliui.PromptOptions{
6239
Text: "Confirm restart workspace?",
6340
IsConfirm: true,
@@ -72,26 +49,26 @@ func (r *RootCmd) restart() *clibase.Cmd {
7249
if err != nil {
7350
return err
7451
}
52+
7553
err = cliui.WorkspaceBuild(ctx, out, client, build.ID)
7654
if err != nil {
7755
return err
7856
}
7957

80-
req := codersdk.CreateWorkspaceBuildRequest{
81-
Transition: codersdk.WorkspaceTransitionStart,
82-
RichParameterValues: buildParameters,
83-
TemplateVersionID: workspace.LatestBuild.TemplateVersionID,
84-
}
85-
86-
build, err = client.CreateWorkspaceBuild(ctx, workspace.ID, req)
58+
build, err = startWorkspace(inv, client, startWorkspaceArgs{
59+
workspace: workspace,
60+
parameterFlags: parameterFlags,
61+
action: WorkspaceStart,
62+
alwaysPrompt: false,
63+
})
8764
// It's possible for a workspace build to fail due to the template requiring starting
8865
// workspaces with the active version.
8966
if cerr, ok := codersdk.AsError(err); ok && cerr.StatusCode() == http.StatusUnauthorized {
90-
build, err = startWorkspaceActiveVersion(inv, client, startWorkspaceActiveVersionArgs{
91-
BuildOptions: buildOptions,
92-
LastBuildParameters: lastBuildParameters,
93-
PromptBuildOptions: parameterFlags.promptBuildOptions,
94-
Workspace: workspace,
67+
build, err = startWorkspace(inv, client, startWorkspaceArgs{
68+
workspace: workspace,
69+
parameterFlags: parameterFlags,
70+
action: WorkspaceUpdate,
71+
alwaysPrompt: false,
9572
})
9673
if err != nil {
9774
return xerrors.Errorf("start workspace with active template version: %w", err)

cli/start.go

Lines changed: 47 additions & 80 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ import (
55
"net/http"
66
"time"
77

8-
"github.com/google/uuid"
98
"golang.org/x/xerrors"
109

1110
"github.com/coder/coder/v2/cli/clibase"
@@ -32,44 +31,20 @@ func (r *RootCmd) start() *clibase.Cmd {
3231
return err
3332
}
3433

35-
lastBuildParameters, err := client.WorkspaceBuildParameters(inv.Context(), workspace.LatestBuild.ID)
36-
if err != nil {
37-
return err
38-
}
39-
40-
buildOptions, err := asWorkspaceBuildParameters(parameterFlags.buildOptions)
41-
if err != nil {
42-
return xerrors.Errorf("unable to parse build options: %w", err)
43-
}
44-
45-
buildParameters, err := prepStartWorkspace(inv, client, prepStartWorkspaceArgs{
46-
Action: WorkspaceStart,
47-
TemplateVersionID: workspace.LatestBuild.TemplateVersionID,
48-
49-
LastBuildParameters: lastBuildParameters,
50-
51-
PromptBuildOptions: parameterFlags.promptBuildOptions,
52-
BuildOptions: buildOptions,
34+
build, err := startWorkspace(inv, client, startWorkspaceArgs{
35+
workspace: workspace,
36+
parameterFlags: parameterFlags,
37+
action: WorkspaceStart,
38+
alwaysPrompt: false,
5339
})
54-
if err != nil {
55-
return err
56-
}
57-
58-
req := codersdk.CreateWorkspaceBuildRequest{
59-
Transition: codersdk.WorkspaceTransitionStart,
60-
RichParameterValues: buildParameters,
61-
TemplateVersionID: workspace.LatestBuild.TemplateVersionID,
62-
}
63-
64-
build, err := client.CreateWorkspaceBuild(inv.Context(), workspace.ID, req)
6540
// It's possible for a workspace build to fail due to the template requiring starting
6641
// workspaces with the active version.
6742
if cerr, ok := codersdk.AsError(err); ok && cerr.StatusCode() == http.StatusUnauthorized {
68-
build, err = startWorkspaceActiveVersion(inv, client, startWorkspaceActiveVersionArgs{
69-
BuildOptions: buildOptions,
70-
LastBuildParameters: lastBuildParameters,
71-
PromptBuildOptions: parameterFlags.promptBuildOptions,
72-
Workspace: workspace,
43+
build, err = startWorkspace(inv, client, startWorkspaceArgs{
44+
workspace: workspace,
45+
parameterFlags: parameterFlags,
46+
action: WorkspaceUpdate,
47+
alwaysPrompt: false,
7348
})
7449
if err != nil {
7550
return xerrors.Errorf("start workspace with active template version: %w", err)
@@ -93,71 +68,63 @@ func (r *RootCmd) start() *clibase.Cmd {
9368
return cmd
9469
}
9570

96-
type prepStartWorkspaceArgs struct {
97-
Action WorkspaceCLIAction
98-
TemplateVersionID uuid.UUID
99-
100-
LastBuildParameters []codersdk.WorkspaceBuildParameter
101-
102-
PromptBuildOptions bool
103-
BuildOptions []codersdk.WorkspaceBuildParameter
71+
type startWorkspaceArgs struct {
72+
workspace codersdk.Workspace
73+
parameterFlags workspaceParameterFlags
74+
action WorkspaceCLIAction
75+
alwaysPrompt bool
10476
}
10577

106-
func prepStartWorkspace(inv *clibase.Invocation, client *codersdk.Client, args prepStartWorkspaceArgs) ([]codersdk.WorkspaceBuildParameter, error) {
107-
ctx := inv.Context()
78+
func startWorkspace(inv *clibase.Invocation, client *codersdk.Client, args startWorkspaceArgs) (codersdk.WorkspaceBuild, error) {
79+
version := args.workspace.LatestBuild.TemplateVersionID
80+
if args.workspace.AutomaticUpdates == codersdk.AutomaticUpdatesAlways || (args.action == WorkspaceUpdate || args.action == WorkspaceCreate) {
81+
template, err := client.Template(inv.Context(), args.workspace.TemplateID)
82+
if err != nil {
83+
return codersdk.WorkspaceBuild{}, xerrors.Errorf("get template: %w", err)
84+
}
85+
version = template.ActiveVersionID
86+
}
10887

109-
templateVersion, err := client.TemplateVersion(ctx, args.TemplateVersionID)
88+
lastBuildParameters, err := client.WorkspaceBuildParameters(inv.Context(), args.workspace.LatestBuild.ID)
11089
if err != nil {
111-
return nil, xerrors.Errorf("get template version: %w", err)
90+
return codersdk.WorkspaceBuild{}, err
11291
}
11392

114-
templateVersionParameters, err := client.TemplateVersionRichParameters(inv.Context(), templateVersion.ID)
93+
buildOptions, err := asWorkspaceBuildParameters(args.parameterFlags.buildOptions)
11594
if err != nil {
116-
return nil, xerrors.Errorf("get template version rich parameters: %w", err)
95+
return codersdk.WorkspaceBuild{}, xerrors.Errorf("unable to parse build options: %w", err)
11796
}
11897

119-
resolver := new(ParameterResolver).
120-
WithLastBuildParameters(args.LastBuildParameters).
121-
WithPromptBuildOptions(args.PromptBuildOptions).
122-
WithBuildOptions(args.BuildOptions)
123-
return resolver.Resolve(inv, args.Action, templateVersionParameters)
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)
98+
cliRichParameters, err := asWorkspaceBuildParameters(args.parameterFlags.richParameters)
13799
if err != nil {
138-
return codersdk.WorkspaceBuild{}, xerrors.Errorf("get template: %w", err)
100+
return codersdk.WorkspaceBuild{}, xerrors.Errorf("unable to parse build options: %w", err)
139101
}
140102

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,
103+
buildParameters, err := prepWorkspaceBuild(inv, client, prepWorkspaceBuildArgs{
104+
Action: args.action,
105+
TemplateVersionID: version,
106+
NewWorkspaceName: args.workspace.Name,
107+
LastBuildParameters: lastBuildParameters,
108+
109+
PromptBuildOptions: args.parameterFlags.promptBuildOptions,
110+
BuildOptions: buildOptions,
111+
PromptRichParameters: args.alwaysPrompt,
112+
RichParameters: cliRichParameters,
113+
RichParameterFile: args.parameterFlags.richParameterFile,
149114
})
150115
if err != nil {
151116
return codersdk.WorkspaceBuild{}, err
152117
}
153118

154-
build, err := client.CreateWorkspaceBuild(inv.Context(), args.Workspace.ID, codersdk.CreateWorkspaceBuildRequest{
119+
req := codersdk.CreateWorkspaceBuildRequest{
155120
Transition: codersdk.WorkspaceTransitionStart,
156121
RichParameterValues: buildParameters,
157-
TemplateVersionID: template.ActiveVersionID,
158-
})
122+
TemplateVersionID: version,
123+
}
124+
125+
build, err := client.CreateWorkspaceBuild(inv.Context(), args.workspace.ID, req)
159126
if err != nil {
160-
return codersdk.WorkspaceBuild{}, err
127+
return codersdk.WorkspaceBuild{}, xerrors.Errorf("create workspace build: %w", err)
161128
}
162129

163130
return build, nil

cli/update.go

Lines changed: 6 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -36,53 +36,16 @@ func (r *RootCmd) update() *clibase.Cmd {
3636
return nil
3737
}
3838

39-
buildOptions, err := asWorkspaceBuildParameters(parameterFlags.buildOptions)
40-
if err != nil {
41-
return err
42-
}
43-
44-
template, err := client.Template(inv.Context(), workspace.TemplateID)
45-
if err != nil {
46-
return err
47-
}
48-
49-
lastBuildParameters, err := client.WorkspaceBuildParameters(inv.Context(), workspace.LatestBuild.ID)
50-
if err != nil {
51-
return err
52-
}
53-
54-
cliRichParameters, err := asWorkspaceBuildParameters(parameterFlags.richParameters)
55-
if err != nil {
56-
return xerrors.Errorf("can't parse given parameter values: %w", err)
57-
}
58-
59-
buildParameters, err := prepWorkspaceBuild(inv, client, prepWorkspaceBuildArgs{
60-
Action: WorkspaceUpdate,
61-
Template: template,
62-
NewWorkspaceName: workspace.Name,
63-
WorkspaceID: workspace.LatestBuild.ID,
64-
65-
LastBuildParameters: lastBuildParameters,
66-
67-
PromptBuildOptions: parameterFlags.promptBuildOptions,
68-
BuildOptions: buildOptions,
69-
70-
PromptRichParameters: alwaysPrompt,
71-
RichParameters: cliRichParameters,
72-
RichParameterFile: parameterFlags.richParameterFile,
39+
build, err := startWorkspace(inv, client, startWorkspaceArgs{
40+
workspace: workspace,
41+
parameterFlags: parameterFlags,
42+
action: WorkspaceUpdate,
43+
alwaysPrompt: alwaysPrompt,
7344
})
7445
if err != nil {
75-
return err
46+
return xerrors.Errorf("start workspace: %w", err)
7647
}
7748

78-
build, err := client.CreateWorkspaceBuild(inv.Context(), workspace.ID, codersdk.CreateWorkspaceBuildRequest{
79-
TemplateVersionID: template.ActiveVersionID,
80-
Transition: codersdk.WorkspaceTransitionStart,
81-
RichParameterValues: buildParameters,
82-
})
83-
if err != nil {
84-
return err
85-
}
8649
logs, closer, err := client.WorkspaceBuildLogsAfter(inv.Context(), build.ID, 0)
8750
if err != nil {
8851
return err

0 commit comments

Comments
 (0)