Skip to content

Commit e958e1a

Browse files
committed
cleanup
1 parent 7599090 commit e958e1a

File tree

2 files changed

+122
-107
lines changed

2 files changed

+122
-107
lines changed

cli/templatecreate.go

Lines changed: 22 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ import (
66
"io"
77
"strings"
88
"time"
9-
"unicode/utf8"
109

1110
"github.com/google/uuid"
1211
"golang.org/x/xerrors"
@@ -24,6 +23,7 @@ func (r *RootCmd) templateCreate() *clibase.Cmd {
2423
provisionerTags []string
2524
variablesFile string
2625
commandLineVariables []string
26+
versionName string
2727

2828
uploadFlags templateUploadFlags
2929
)
@@ -46,53 +46,23 @@ func (r *RootCmd) templateCreate() *clibase.Cmd {
4646
return err
4747
}
4848

49-
templateName, err := uploadFlags.templateName(inv.Args)
49+
name, err := uploadFlags.templateName(inv.Args)
5050
if err != nil {
5151
return err
5252
}
5353

54-
if utf8.RuneCountInString(templateName) > 31 {
55-
return xerrors.Errorf("Template name must be less than 32 characters")
56-
}
57-
58-
_, err = client.TemplateByName(inv.Context(), organization.ID, templateName)
59-
if err == nil {
60-
return xerrors.Errorf("A template already exists named %q!", templateName)
61-
}
62-
63-
err = uploadFlags.checkForLockfile(inv)
64-
if err != nil {
65-
return xerrors.Errorf("check for lockfile: %w", err)
66-
}
67-
68-
message := uploadFlags.templateMessage(inv)
69-
70-
// Confirm upload of the directory.
71-
resp, err := uploadFlags.upload(inv, client)
72-
if err != nil {
73-
return err
74-
}
75-
76-
tags, err := ParseProvisionerTags(provisionerTags)
77-
if err != nil {
78-
return err
79-
}
80-
81-
userVariableValues, err := ParseUserVariableValues(
82-
variablesFile,
83-
commandLineVariables)
84-
if err != nil {
85-
return err
86-
}
87-
88-
job, err := createValidTemplateVersion(inv, createValidTemplateVersionArgs{
89-
Message: message,
90-
Client: client,
91-
Organization: organization,
92-
Provisioner: codersdk.ProvisionerType(provisioner),
93-
FileID: resp.ID,
94-
ProvisionerTags: tags,
95-
UserVariableValues: userVariableValues,
54+
job, _, err := createTemplateVersion(createTemplateVersionArgs{
55+
inv: inv,
56+
client: client,
57+
name: name,
58+
org: organization,
59+
uploadFlags: uploadFlags,
60+
provisionerTags: provisionerTags,
61+
provisioner: provisioner,
62+
variablesFile: variablesFile,
63+
commandLineVariables: commandLineVariables,
64+
versionName: versionName,
65+
alwaysPrompt: false,
9666
})
9767
if err != nil {
9868
return err
@@ -109,7 +79,7 @@ func (r *RootCmd) templateCreate() *clibase.Cmd {
10979
}
11080

11181
createReq := codersdk.CreateTemplateRequest{
112-
Name: templateName,
82+
Name: name,
11383
VersionID: job.ID,
11484
}
11585

@@ -120,11 +90,11 @@ func (r *RootCmd) templateCreate() *clibase.Cmd {
12090

12191
_, _ = fmt.Fprintln(inv.Stdout, "\n"+pretty.Sprint(cliui.DefaultStyles.Wrap,
12292
"The "+pretty.Sprint(
123-
cliui.DefaultStyles.Keyword, templateName)+" template has been created at "+
93+
cliui.DefaultStyles.Keyword, name)+" template has been created at "+
12494
pretty.Sprint(cliui.DefaultStyles.DateTimeStamp, time.Now().Format(time.Stamp))+"! "+
12595
"Developers can provision a workspace with this template using:")+"\n")
12696

127-
_, _ = fmt.Fprintln(inv.Stdout, " "+pretty.Sprint(cliui.DefaultStyles.Code, fmt.Sprintf("coder create --template=%q [workspace name]", templateName)))
97+
_, _ = fmt.Fprintln(inv.Stdout, " "+pretty.Sprint(cliui.DefaultStyles.Code, fmt.Sprintf("coder create --template=%q [workspace name]", name)))
12898
_, _ = fmt.Fprintln(inv.Stdout)
12999

130100
return nil
@@ -158,6 +128,11 @@ func (r *RootCmd) templateCreate() *clibase.Cmd {
158128
Value: clibase.StringOf(&provisioner),
159129
Hidden: true,
160130
},
131+
{
132+
Flag: "name",
133+
Description: "Specify a name for the new template version. It will be automatically generated if not provided.",
134+
Value: clibase.StringOf(&versionName),
135+
},
161136

162137
cliui.SkipPromptOption(),
163138
}

cli/templatepush.go

Lines changed: 100 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -190,70 +190,24 @@ func (r *RootCmd) templatePush() *clibase.Cmd {
190190
return err
191191
}
192192

193-
if utf8.RuneCountInString(name) > 31 {
194-
return xerrors.Errorf("Template name must be less than 32 characters")
195-
}
196-
197-
var createTemplate bool
198-
template, err := client.TemplateByName(inv.Context(), organization.ID, name)
199-
if err != nil {
200-
var apiError *codersdk.Error
201-
if errors.As(err, &apiError) && apiError.StatusCode() != http.StatusNotFound {
202-
return err
203-
}
204-
createTemplate = true
205-
}
206-
207-
err = uploadFlags.checkForLockfile(inv)
208-
if err != nil {
209-
return xerrors.Errorf("check for lockfile: %w", err)
210-
}
211-
212-
message := uploadFlags.templateMessage(inv)
213-
214-
resp, err := uploadFlags.upload(inv, client)
215-
if err != nil {
216-
return err
217-
}
218-
219-
tags, err := ParseProvisionerTags(provisionerTags)
220-
if err != nil {
221-
return err
222-
}
223-
224-
userVariableValues, err := ParseUserVariableValues(
225-
variablesFile,
226-
commandLineVariables)
227-
if err != nil {
228-
return err
229-
}
230-
231-
args := createValidTemplateVersionArgs{
232-
Message: message,
233-
Client: client,
234-
Organization: organization,
235-
Provisioner: codersdk.ProvisionerType(provisioner),
236-
FileID: resp.ID,
237-
ProvisionerTags: tags,
238-
UserVariableValues: userVariableValues,
239-
}
240-
241-
if !createTemplate {
242-
args.Name = versionName
243-
args.Template = &template
244-
args.ReuseParameters = !alwaysPrompt
245-
}
246-
247-
job, err := createValidTemplateVersion(inv, args)
193+
job, template, err := createTemplateVersion(createTemplateVersionArgs{
194+
inv: inv,
195+
client: client,
196+
name: name,
197+
org: organization,
198+
uploadFlags: uploadFlags,
199+
provisionerTags: provisionerTags,
200+
provisioner: provisioner,
201+
variablesFile: variablesFile,
202+
commandLineVariables: commandLineVariables,
203+
versionName: versionName,
204+
alwaysPrompt: alwaysPrompt,
205+
})
248206
if err != nil {
249207
return err
250208
}
251209

252-
if job.Job.Status != codersdk.ProvisionerJobSucceeded {
253-
return xerrors.Errorf("job failed: %s", job.Job.Status)
254-
}
255-
256-
if createTemplate {
210+
if template == nil {
257211
_, err = client.CreateTemplate(inv.Context(), organization.ID, codersdk.CreateTemplateRequest{
258212
Name: name,
259213
VersionID: job.ID,
@@ -323,6 +277,11 @@ func (r *RootCmd) templatePush() *clibase.Cmd {
323277
Description: "Specify a name for the new template version. It will be automatically generated if not provided.",
324278
Value: clibase.StringOf(&versionName),
325279
},
280+
{
281+
Flag: "always-prompt",
282+
Description: "Always prompt all parameters. Does not pull parameter values from active template version.",
283+
Value: clibase.BoolOf(&alwaysPrompt),
284+
},
326285
cliui.SkipPromptOption(),
327286
}
328287
cmd.Options = append(cmd.Options, uploadFlags.options()...)
@@ -345,3 +304,84 @@ func prettyDirectoryPath(dir string) string {
345304
}
346305
return prettyDir
347306
}
307+
308+
type createTemplateVersionArgs struct {
309+
inv *clibase.Invocation
310+
client *codersdk.Client
311+
name string
312+
org codersdk.Organization
313+
uploadFlags templateUploadFlags
314+
provisionerTags []string
315+
provisioner string
316+
variablesFile string
317+
commandLineVariables []string
318+
versionName string
319+
alwaysPrompt bool
320+
}
321+
322+
func createTemplateVersion(args createTemplateVersionArgs) (*codersdk.TemplateVersion, *codersdk.Template, error) {
323+
if utf8.RuneCountInString(args.name) >= 32 {
324+
return nil, nil, xerrors.Errorf("Template name must be less than 32 characters")
325+
}
326+
327+
var createTemplate bool
328+
template, err := args.client.TemplateByName(args.inv.Context(), args.org.ID, args.name)
329+
if err != nil {
330+
var apiError *codersdk.Error
331+
if errors.As(err, &apiError) && apiError.StatusCode() != http.StatusNotFound {
332+
return nil, nil, err
333+
}
334+
createTemplate = true
335+
}
336+
337+
err = args.uploadFlags.checkForLockfile(args.inv)
338+
if err != nil {
339+
return nil, nil, xerrors.Errorf("check for lockfile: %w", err)
340+
}
341+
342+
message := args.uploadFlags.templateMessage(args.inv)
343+
344+
resp, err := args.uploadFlags.upload(args.inv, args.client)
345+
if err != nil {
346+
return nil, nil, err
347+
}
348+
349+
tags, err := ParseProvisionerTags(args.provisionerTags)
350+
if err != nil {
351+
return nil, nil, err
352+
}
353+
354+
userVariableValues, err := ParseUserVariableValues(
355+
args.variablesFile,
356+
args.commandLineVariables)
357+
if err != nil {
358+
return nil, nil, err
359+
}
360+
361+
versionArgs := createValidTemplateVersionArgs{
362+
Message: message,
363+
Client: args.client,
364+
Organization: args.org,
365+
Provisioner: codersdk.ProvisionerType(args.provisioner),
366+
FileID: resp.ID,
367+
ProvisionerTags: tags,
368+
UserVariableValues: userVariableValues,
369+
}
370+
371+
if !createTemplate {
372+
versionArgs.Name = args.versionName
373+
versionArgs.Template = &template
374+
versionArgs.ReuseParameters = !args.alwaysPrompt
375+
}
376+
377+
job, err := createValidTemplateVersion(args.inv, versionArgs)
378+
if err != nil {
379+
return nil, nil, err
380+
}
381+
382+
if job.Job.Status != codersdk.ProvisionerJobSucceeded {
383+
return nil, nil, xerrors.Errorf("job failed: %s", job.Job.Status)
384+
}
385+
386+
return job, &template, nil
387+
}

0 commit comments

Comments
 (0)