5
5
"net/http"
6
6
"time"
7
7
8
- "github.com/google/uuid"
9
8
"golang.org/x/xerrors"
10
9
11
10
"github.com/coder/coder/v2/cli/clibase"
@@ -32,44 +31,20 @@ func (r *RootCmd) start() *clibase.Cmd {
32
31
return err
33
32
}
34
33
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 ,
53
39
})
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 )
65
40
// It's possible for a workspace build to fail due to the template requiring starting
66
41
// workspaces with the active version.
67
42
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 ,
73
48
})
74
49
if err != nil {
75
50
return xerrors .Errorf ("start workspace with active template version: %w" , err )
@@ -93,71 +68,63 @@ func (r *RootCmd) start() *clibase.Cmd {
93
68
return cmd
94
69
}
95
70
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
104
76
}
105
77
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
+ }
108
87
109
- templateVersion , err := client .TemplateVersion ( ctx , args .TemplateVersionID )
88
+ lastBuildParameters , err := client .WorkspaceBuildParameters ( inv . Context () , args .workspace . LatestBuild . ID )
110
89
if err != nil {
111
- return nil , xerrors . Errorf ( "get template version: %w" , err )
90
+ return codersdk. WorkspaceBuild {} , err
112
91
}
113
92
114
- templateVersionParameters , err := client . TemplateVersionRichParameters ( inv . Context (), templateVersion . ID )
93
+ buildOptions , err := asWorkspaceBuildParameters ( args . parameterFlags . buildOptions )
115
94
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 )
117
96
}
118
97
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 )
137
99
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 )
139
101
}
140
102
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 ,
149
114
})
150
115
if err != nil {
151
116
return codersdk.WorkspaceBuild {}, err
152
117
}
153
118
154
- build , err := client . CreateWorkspaceBuild ( inv . Context (), args . Workspace . ID , codersdk.CreateWorkspaceBuildRequest {
119
+ req := codersdk.CreateWorkspaceBuildRequest {
155
120
Transition : codersdk .WorkspaceTransitionStart ,
156
121
RichParameterValues : buildParameters ,
157
- TemplateVersionID : template .ActiveVersionID ,
158
- })
122
+ TemplateVersionID : version ,
123
+ }
124
+
125
+ build , err := client .CreateWorkspaceBuild (inv .Context (), args .workspace .ID , req )
159
126
if err != nil {
160
- return codersdk.WorkspaceBuild {}, err
127
+ return codersdk.WorkspaceBuild {}, xerrors . Errorf ( "create workspace build: %w" , err )
161
128
}
162
129
163
130
return build , nil
0 commit comments