Skip to content

Commit e8e2e53

Browse files
committed
WIP
1 parent df9ddf3 commit e8e2e53

File tree

3 files changed

+131
-27
lines changed

3 files changed

+131
-27
lines changed

cli/cliui/parameter.go

+53
Original file line numberDiff line numberDiff line change
@@ -60,3 +60,56 @@ func ParameterSchema(cmd *cobra.Command, parameterSchema codersdk.ParameterSchem
6060

6161
return value, nil
6262
}
63+
64+
func RichParameter(cmd *cobra.Command, templateVersionParameter codersdk.TemplateVersionParameter) (string, error) {
65+
_, _ = fmt.Fprintln(cmd.OutOrStdout(), Styles.Bold.Render(templateVersionParameter.Name))
66+
if templateVersionParameter.Description != "" {
67+
_, _ = fmt.Fprintln(cmd.OutOrStdout(), " "+strings.TrimSpace(strings.Join(strings.Split(templateVersionParameter.Description, "\n"), "\n "))+"\n")
68+
}
69+
70+
// TODO Implement full validation and show descriptions.
71+
var err error
72+
var value string
73+
if len(templateVersionParameter.Options) > 0 {
74+
// Move the cursor up a single line for nicer display!
75+
_, _ = fmt.Fprint(cmd.OutOrStdout(), "\033[1A")
76+
value, err = Select(cmd, SelectOptions{
77+
Options: templateVersionParameterOptionValues(templateVersionParameter),
78+
Default: templateVersionParameter.DefaultValue,
79+
HideSearch: true,
80+
})
81+
if err == nil {
82+
_, _ = fmt.Fprintln(cmd.OutOrStdout())
83+
_, _ = fmt.Fprintln(cmd.OutOrStdout(), " "+Styles.Prompt.String()+Styles.Field.Render(value))
84+
}
85+
} else {
86+
text := "Enter a value"
87+
if templateVersionParameter.DefaultValue != "" {
88+
text += fmt.Sprintf(" (default: %q)", templateVersionParameter.DefaultValue)
89+
}
90+
text += ":"
91+
92+
value, err = Prompt(cmd, PromptOptions{
93+
Text: Styles.Bold.Render(text),
94+
})
95+
value = strings.TrimSpace(value)
96+
}
97+
if err != nil {
98+
return "", err
99+
}
100+
101+
// If they didn't specify anything, use the default value if set.
102+
if len(templateVersionParameter.Options) == 0 && value == "" {
103+
value = templateVersionParameter.DefaultValue
104+
}
105+
106+
return value, nil
107+
}
108+
109+
func templateVersionParameterOptionValues(parameter codersdk.TemplateVersionParameter) []string {
110+
var options []string
111+
for _, opt := range parameter.Options {
112+
options = append(options, opt.Value)
113+
}
114+
return options
115+
}

cli/create.go

+53-25
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package cli
22

33
import (
4-
"context"
54
"fmt"
65
"io"
76
"time"
@@ -197,23 +196,7 @@ func prepWorkspaceBuild(cmd *cobra.Command, client *codersdk.Client, args prepWo
197196
return nil, err
198197
}
199198

200-
legacyParameters, err := prepLegacyParameters(ctx, cmd, client, templateVersion, args)
201-
if err != nil {
202-
return nil, err
203-
}
204-
205-
richParameters, err := prepRichParameters()
206-
if err != nil {
207-
return nil, err
208-
}
209-
210-
return &buildParameters{
211-
parameters: legacyParameters,
212-
richParameters: richParameters,
213-
}, nil
214-
}
215-
216-
func prepLegacyParameters(ctx context.Context, cmd *cobra.Command, client *codersdk.Client, templateVersion codersdk.TemplateVersion, args prepWorkspaceBuildArgs) ([]codersdk.CreateParameterRequest, error) {
199+
// Legacy parameters
217200
parameterSchemas, err := client.TemplateVersionSchema(ctx, templateVersion.ID)
218201
if err != nil {
219202
return nil, err
@@ -231,7 +214,7 @@ func prepLegacyParameters(ctx context.Context, cmd *cobra.Command, client *coder
231214
}
232215
}
233216
disclaimerPrinted := false
234-
parameters := make([]codersdk.CreateParameterRequest, 0)
217+
legacyParameters := make([]codersdk.CreateParameterRequest, 0)
235218
PromptParamLoop:
236219
for _, parameterSchema := range parameterSchemas {
237220
if !parameterSchema.AllowOverrideSource {
@@ -258,7 +241,7 @@ PromptParamLoop:
258241
return nil, err
259242
}
260243

261-
parameters = append(parameters, codersdk.CreateParameterRequest{
244+
legacyParameters = append(legacyParameters, codersdk.CreateParameterRequest{
262245
Name: parameterSchema.Name,
263246
SourceValue: parameterValue,
264247
SourceScheme: codersdk.ParameterSourceSchemeData,
@@ -267,10 +250,55 @@ PromptParamLoop:
267250
}
268251
_, _ = fmt.Fprintln(cmd.OutOrStdout())
269252

253+
// Rich parameters
254+
templateVersionParameters, err := client.TemplateVersionRichParameters(cmd.Context(), templateVersion.ID)
255+
if err != nil {
256+
return nil, xerrors.Errorf("get template version rich parameters", err)
257+
}
258+
259+
parameterMapFromFile = map[string]string{}
260+
useParamFile = false
261+
if args.ParameterFile != "" {
262+
useParamFile = true
263+
_, _ = fmt.Fprintln(cmd.OutOrStdout(), cliui.Styles.Paragraph.Render("Attempting to read the variables from the rich parameter file.")+"\r\n")
264+
parameterMapFromFile, err = createParameterMapFromFile(args.ParameterFile)
265+
if err != nil {
266+
return nil, err
267+
}
268+
}
269+
disclaimerPrinted = false
270+
richParameters := make([]codersdk.WorkspaceBuildParameter, 0)
271+
PromptRichParamLoop:
272+
for _, templateVersionParameter := range templateVersionParameters {
273+
if !disclaimerPrinted {
274+
_, _ = fmt.Fprintln(cmd.OutOrStdout(), cliui.Styles.Paragraph.Render("This template has customizable parameters. Values can be changed after create, but may have unintended side effects (like data loss).")+"\r\n")
275+
disclaimerPrinted = true
276+
}
277+
278+
// Param file is all or nothing
279+
if !useParamFile {
280+
for _, e := range args.ExistingParams {
281+
if e.Name == templateVersionParameter.Name {
282+
// If the param already exists, we do not need to prompt it again.
283+
// The workspace scope will reuse params for each build.
284+
continue PromptRichParamLoop
285+
}
286+
}
287+
}
288+
289+
parameterValue, err := getWorkspaceBuildParameterValueFromMapOrInput(cmd, parameterMapFromFile, templateVersionParameter)
290+
if err != nil {
291+
return nil, err
292+
}
293+
294+
richParameters = append(richParameters, *parameterValue)
295+
}
296+
270297
// Run a dry-run with the given parameters to check correctness
271298
dryRun, err := client.CreateTemplateVersionDryRun(cmd.Context(), templateVersion.ID, codersdk.CreateTemplateVersionDryRunRequest{
272299
WorkspaceName: args.NewWorkspaceName,
273-
ParameterValues: parameters,
300+
ParameterValues: legacyParameters,
301+
// TODO RichParameterValues
274302
})
275303
if err != nil {
276304
return nil, xerrors.Errorf("begin workspace dry-run: %w", err)
@@ -309,9 +337,9 @@ PromptParamLoop:
309337
if err != nil {
310338
return nil, err
311339
}
312-
return parameters, nil
313-
}
314340

315-
func prepRichParameters() ([]codersdk.WorkspaceBuildParameter, error) {
316-
return nil, nil
341+
return &buildParameters{
342+
parameters: legacyParameters,
343+
richParameters: richParameters,
344+
}, nil
317345
}

cli/parameter.go

+25-2
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,10 @@ package cli
33
import (
44
"os"
55

6+
"github.com/spf13/cobra"
67
"golang.org/x/xerrors"
78
"gopkg.in/yaml.v3"
89

9-
"github.com/spf13/cobra"
10-
1110
"github.com/coder/coder/cli/cliui"
1211
"github.com/coder/coder/codersdk"
1312
)
@@ -58,3 +57,27 @@ func getParameterValueFromMapOrInput(cmd *cobra.Command, parameterMap map[string
5857
}
5958
return parameterValue, nil
6059
}
60+
61+
func getWorkspaceBuildParameterValueFromMapOrInput(cmd *cobra.Command, parameterMap map[string]string, templateVersionParameter codersdk.TemplateVersionParameter) (*codersdk.WorkspaceBuildParameter, error) {
62+
var parameterValue string
63+
var err error
64+
if parameterMap != nil {
65+
var ok bool
66+
parameterValue, ok = parameterMap[templateVersionParameter.Name]
67+
if !ok {
68+
parameterValue, err = cliui.RichParameter(cmd, templateVersionParameter)
69+
if err != nil {
70+
return nil, err
71+
}
72+
}
73+
} else {
74+
parameterValue, err = cliui.RichParameter(cmd, templateVersionParameter)
75+
if err != nil {
76+
return nil, err
77+
}
78+
}
79+
return &codersdk.WorkspaceBuildParameter{
80+
Name: templateVersionParameter.Name,
81+
Value: parameterValue,
82+
}, nil
83+
}

0 commit comments

Comments
 (0)