Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit903ff2d

Browse files
mtojekpull[bot]
authored andcommitted
feat(cli): provide parameter values via command line (#8898)
1 parent952a552 commit903ff2d

19 files changed

+682
-247
lines changed

‎cli/create.go‎

Lines changed: 50 additions & 103 deletions
Original file line numberDiff line numberDiff line change
@@ -18,11 +18,12 @@ import (
1818

1919
func (r*RootCmd)create()*clibase.Cmd {
2020
var (
21-
richParameterFilestring
22-
templateNamestring
23-
startAtstring
24-
stopAfter time.Duration
25-
workspaceNamestring
21+
templateNamestring
22+
startAtstring
23+
stopAfter time.Duration
24+
workspaceNamestring
25+
26+
parameterFlagsworkspaceParameterFlags
2627
)
2728
client:=new(codersdk.Client)
2829
cmd:=&clibase.Cmd{
@@ -129,10 +130,18 @@ func (r *RootCmd) create() *clibase.Cmd {
129130
schedSpec=ptr.Ref(sched.String())
130131
}
131132

132-
buildParams,err:=prepWorkspaceBuild(inv,client,prepWorkspaceBuildArgs{
133-
Template:template,
134-
RichParameterFile:richParameterFile,
135-
NewWorkspaceName:workspaceName,
133+
cliRichParameters,err:=asWorkspaceBuildParameters(parameterFlags.richParameters)
134+
iferr!=nil {
135+
returnxerrors.Errorf("can't parse given parameter values: %w",err)
136+
}
137+
138+
richParameters,err:=prepWorkspaceBuild(inv,client,prepWorkspaceBuildArgs{
139+
Action:WorkspaceCreate,
140+
Template:template,
141+
NewWorkspaceName:workspaceName,
142+
143+
RichParameterFile:parameterFlags.richParameterFile,
144+
RichParameters:cliRichParameters,
136145
})
137146
iferr!=nil {
138147
returnxerrors.Errorf("prepare build: %w",err)
@@ -156,7 +165,7 @@ func (r *RootCmd) create() *clibase.Cmd {
156165
Name:workspaceName,
157166
AutostartSchedule:schedSpec,
158167
TTLMillis:ttlMillis,
159-
RichParameterValues:buildParams.richParameters,
168+
RichParameterValues:richParameters,
160169
})
161170
iferr!=nil {
162171
returnxerrors.Errorf("create workspace: %w",err)
@@ -179,12 +188,6 @@ func (r *RootCmd) create() *clibase.Cmd {
179188
Description:"Specify a template name.",
180189
Value:clibase.StringOf(&templateName),
181190
},
182-
clibase.Option{
183-
Flag:"rich-parameter-file",
184-
Env:"CODER_RICH_PARAMETER_FILE",
185-
Description:"Specify a file path with values for rich parameters defined in the template.",
186-
Value:clibase.StringOf(&richParameterFile),
187-
},
188191
clibase.Option{
189192
Flag:"start-at",
190193
Env:"CODER_WORKSPACE_START_AT",
@@ -199,99 +202,59 @@ func (r *RootCmd) create() *clibase.Cmd {
199202
},
200203
cliui.SkipPromptOption(),
201204
)
205+
cmd.Options=append(cmd.Options,parameterFlags.cliParameters()...)
202206
returncmd
203207
}
204208

205209
typeprepWorkspaceBuildArgsstruct {
206-
Templatecodersdk.Template
207-
ExistingRichParams []codersdk.WorkspaceBuildParameter
208-
RichParameterFilestring
209-
NewWorkspaceNamestring
210-
211-
UpdateWorkspacebool
212-
BuildOptionsbool
213-
WorkspaceID uuid.UUID
214-
}
210+
ActionWorkspaceCLIAction
211+
Templatecodersdk.Template
212+
NewWorkspaceNamestring
213+
WorkspaceID uuid.UUID
214+
215+
LastBuildParameters []codersdk.WorkspaceBuildParameter
216+
217+
PromptBuildOptionsbool
218+
BuildOptions []codersdk.WorkspaceBuildParameter
215219

216-
typebuildParametersstruct {
217-
// Rich parameters stores values for build parameters annotated with description, icon, type, etc.
218-
richParameters []codersdk.WorkspaceBuildParameter
220+
PromptRichParametersbool
221+
RichParameters []codersdk.WorkspaceBuildParameter
222+
RichParameterFilestring
219223
}
220224

221225
// prepWorkspaceBuild will ensure a workspace build will succeed on the latest template version.
222-
// Any missing params will be prompted to the user. It supportslegacy andrich parameters.
223-
funcprepWorkspaceBuild(inv*clibase.Invocation,client*codersdk.Client,argsprepWorkspaceBuildArgs) (*buildParameters,error) {
226+
// Any missing params will be prompted to the user. It supports rich parameters.
227+
funcprepWorkspaceBuild(inv*clibase.Invocation,client*codersdk.Client,argsprepWorkspaceBuildArgs) ([]codersdk.WorkspaceBuildParameter,error) {
224228
ctx:=inv.Context()
225229

226230
templateVersion,err:=client.TemplateVersion(ctx,args.Template.ActiveVersionID)
227231
iferr!=nil {
228-
returnnil,err
232+
returnnil,xerrors.Errorf("get template version: %w",err)
229233
}
230234

231-
// Rich parameters
232235
templateVersionParameters,err:=client.TemplateVersionRichParameters(inv.Context(),templateVersion.ID)
233236
iferr!=nil {
234237
returnnil,xerrors.Errorf("get template version rich parameters: %w",err)
235238
}
236239

237-
parameterMapFromFile:=map[string]string{}
238-
useParamFile:=false
240+
parameterFile:=map[string]string{}
239241
ifargs.RichParameterFile!="" {
240-
useParamFile=true
241-
_,_=fmt.Fprintln(inv.Stdout,cliui.DefaultStyles.Paragraph.Render("Attempting to read the variables from the rich parameter file.")+"\r\n")
242-
parameterMapFromFile,err=createParameterMapFromFile(args.RichParameterFile)
243-
iferr!=nil {
244-
returnnil,err
245-
}
246-
}
247-
disclaimerPrinted:=false
248-
richParameters:=make([]codersdk.WorkspaceBuildParameter,0)
249-
PromptRichParamLoop:
250-
for_,templateVersionParameter:=rangetemplateVersionParameters {
251-
if!args.BuildOptions&&templateVersionParameter.Ephemeral {
252-
continue
253-
}
254-
255-
if!disclaimerPrinted {
256-
_,_=fmt.Fprintln(inv.Stdout,cliui.DefaultStyles.Paragraph.Render("This template has customizable parameters. Values can be changed after create, but may have unintended side effects (like data loss).")+"\r\n")
257-
disclaimerPrinted=true
258-
}
259-
260-
// Param file is all or nothing
261-
if!useParamFile&&!templateVersionParameter.Ephemeral {
262-
for_,e:=rangeargs.ExistingRichParams {
263-
ife.Name==templateVersionParameter.Name {
264-
// If the param already exists, we do not need to prompt it again.
265-
// The workspace scope will reuse params for each build.
266-
continue PromptRichParamLoop
267-
}
268-
}
269-
}
270-
271-
ifargs.UpdateWorkspace&&!templateVersionParameter.Mutable {
272-
// Check if the immutable parameter was used in the previous build. If so, then it isn't a fresh one
273-
// and the user should be warned.
274-
exists,err:=workspaceBuildParameterExists(ctx,client,args.WorkspaceID,templateVersionParameter)
275-
iferr!=nil {
276-
returnnil,err
277-
}
278-
279-
ifexists {
280-
_,_=fmt.Fprintln(inv.Stdout,cliui.DefaultStyles.Warn.Render(fmt.Sprintf(`Parameter %q is not mutable, so can't be customized after workspace creation.`,templateVersionParameter.Name)))
281-
continue
282-
}
283-
}
284-
285-
parameterValue,err:=getWorkspaceBuildParameterValueFromMapOrInput(inv,parameterMapFromFile,templateVersionParameter)
242+
parameterFile,err=parseParameterMapFile(args.RichParameterFile)
286243
iferr!=nil {
287-
returnnil,err
244+
returnnil,xerrors.Errorf("can't parse parameter map file: %w",err)
288245
}
289-
290-
richParameters=append(richParameters,*parameterValue)
291246
}
292247

293-
ifdisclaimerPrinted {
294-
_,_=fmt.Fprintln(inv.Stdout)
248+
resolver:=new(ParameterResolver).
249+
WithLastBuildParameters(args.LastBuildParameters).
250+
WithPromptBuildOptions(args.PromptBuildOptions).
251+
WithBuildOptions(args.BuildOptions).
252+
WithPromptRichParameters(args.PromptRichParameters).
253+
WithRichParameters(args.RichParameters).
254+
WithRichParametersFile(parameterFile)
255+
buildParameters,err:=resolver.Resolve(inv,args.Action,templateVersionParameters)
256+
iferr!=nil {
257+
returnnil,err
295258
}
296259

297260
err=cliui.GitAuth(ctx,inv.Stdout, cliui.GitAuthOptions{
@@ -306,7 +269,7 @@ PromptRichParamLoop:
306269
// Run a dry-run with the given parameters to check correctness
307270
dryRun,err:=client.CreateTemplateVersionDryRun(inv.Context(),templateVersion.ID, codersdk.CreateTemplateVersionDryRunRequest{
308271
WorkspaceName:args.NewWorkspaceName,
309-
RichParameterValues:richParameters,
272+
RichParameterValues:buildParameters,
310273
})
311274
iferr!=nil {
312275
returnnil,xerrors.Errorf("begin workspace dry-run: %w",err)
@@ -346,21 +309,5 @@ PromptRichParamLoop:
346309
returnnil,xerrors.Errorf("get resources: %w",err)
347310
}
348311

349-
return&buildParameters{
350-
richParameters:richParameters,
351-
},nil
352-
}
353-
354-
funcworkspaceBuildParameterExists(ctx context.Context,client*codersdk.Client,workspaceID uuid.UUID,templateVersionParameter codersdk.TemplateVersionParameter) (bool,error) {
355-
lastBuildParameters,err:=client.WorkspaceBuildParameters(ctx,workspaceID)
356-
iferr!=nil {
357-
returnfalse,xerrors.Errorf("can't fetch last workspace build parameters: %w",err)
358-
}
359-
360-
for_,p:=rangelastBuildParameters {
361-
ifp.Name==templateVersionParameter.Name {
362-
returntrue,nil
363-
}
364-
}
365-
returnfalse,nil
312+
returnbuildParameters,nil
366313
}

‎cli/create_test.go‎

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package cli_test
22

33
import (
44
"context"
5+
"fmt"
56
"net/http"
67
"os"
78
"regexp"
@@ -357,6 +358,41 @@ func TestCreateWithRichParameters(t *testing.T) {
357358
}
358359
<-doneChan
359360
})
361+
362+
t.Run("ParameterFlags",func(t*testing.T) {
363+
t.Parallel()
364+
365+
client:=coderdtest.New(t,&coderdtest.Options{IncludeProvisionerDaemon:true})
366+
user:=coderdtest.CreateFirstUser(t,client)
367+
version:=coderdtest.CreateTemplateVersion(t,client,user.OrganizationID,echoResponses)
368+
coderdtest.AwaitTemplateVersionJob(t,client,version.ID)
369+
370+
template:=coderdtest.CreateTemplate(t,client,user.OrganizationID,version.ID)
371+
372+
inv,root:=clitest.New(t,"create","my-workspace","--template",template.Name,
373+
"--parameter",fmt.Sprintf("%s=%s",firstParameterName,firstParameterValue),
374+
"--parameter",fmt.Sprintf("%s=%s",secondParameterName,secondParameterValue),
375+
"--parameter",fmt.Sprintf("%s=%s",immutableParameterName,immutableParameterValue))
376+
clitest.SetupConfig(t,client,root)
377+
doneChan:=make(chanstruct{})
378+
pty:=ptytest.New(t).Attach(inv)
379+
gofunc() {
380+
deferclose(doneChan)
381+
err:=inv.Run()
382+
assert.NoError(t,err)
383+
}()
384+
385+
matches:= []string{
386+
"Confirm create?","yes",
387+
}
388+
fori:=0;i<len(matches);i+=2 {
389+
match:=matches[i]
390+
value:=matches[i+1]
391+
pty.ExpectMatch(match)
392+
pty.WriteLine(value)
393+
}
394+
<-doneChan
395+
})
360396
}
361397

362398
funcTestCreateValidateRichParameters(t*testing.T) {

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp