Skip to content

Commit 2d4706a

Browse files
authored
feat: mark coder_parameter as "required" (#6433)
* Add required column * Pass through providerd * Pass the required property down * Optional * Fix * Fix * Fix * fix * CLI create: support for optional fields * Use HTML API to mark fields required * Fix * Improve validation * more fixes * make fmt * Fix * WIP * Fix: test * CLI update tets * OptionalParameterAdded * Fix: migration
1 parent f19076c commit 2d4706a

30 files changed

+646
-404
lines changed

cli/cliui/parameter.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,7 @@ func RichParameter(cmd *cobra.Command, templateVersionParameter codersdk.Templat
8585
}
8686
} else {
8787
text := "Enter a value"
88-
if templateVersionParameter.DefaultValue != "" {
88+
if !templateVersionParameter.Required {
8989
text += fmt.Sprintf(" (default: %q)", templateVersionParameter.DefaultValue)
9090
}
9191
text += ":"
@@ -111,7 +111,7 @@ func RichParameter(cmd *cobra.Command, templateVersionParameter codersdk.Templat
111111
}
112112

113113
func validateRichPrompt(value string, p codersdk.TemplateVersionParameter) error {
114-
return codersdk.ValidateWorkspaceBuildParameter(p, codersdk.WorkspaceBuildParameter{
114+
return codersdk.ValidateWorkspaceBuildParameter(p, &codersdk.WorkspaceBuildParameter{
115115
Name: p.Name,
116116
Value: value,
117117
}, nil)

cli/update_test.go

+138
Original file line numberDiff line numberDiff line change
@@ -424,4 +424,142 @@ func TestUpdateValidateRichParameters(t *testing.T) {
424424
}
425425
<-doneChan
426426
})
427+
428+
t.Run("RequiredParameterAdded", func(t *testing.T) {
429+
t.Parallel()
430+
431+
client := coderdtest.New(t, &coderdtest.Options{IncludeProvisionerDaemon: true})
432+
user := coderdtest.CreateFirstUser(t, client)
433+
434+
// Upload the initial template
435+
version := coderdtest.CreateTemplateVersion(t, client, user.OrganizationID, prepareEchoResponses(stringRichParameters))
436+
coderdtest.AwaitTemplateVersionJob(t, client, version.ID)
437+
template := coderdtest.CreateTemplate(t, client, user.OrganizationID, version.ID)
438+
439+
tempDir := t.TempDir()
440+
removeTmpDirUntilSuccessAfterTest(t, tempDir)
441+
parameterFile, _ := os.CreateTemp(tempDir, "testParameterFile*.yaml")
442+
_, _ = parameterFile.WriteString(
443+
stringParameterName + ": " + stringParameterValue)
444+
445+
// Create workspace
446+
cmd, root := clitest.New(t, "create", "my-workspace", "--template", template.Name, "--rich-parameter-file", parameterFile.Name(), "-y")
447+
clitest.SetupConfig(t, client, root)
448+
err := cmd.Execute()
449+
require.NoError(t, err)
450+
451+
// Modify template
452+
const addedParameterName = "added_parameter"
453+
454+
var modifiedParameters []*proto.RichParameter
455+
modifiedParameters = append(modifiedParameters, stringRichParameters...)
456+
modifiedParameters = append(modifiedParameters, &proto.RichParameter{
457+
Name: addedParameterName,
458+
Type: "string",
459+
Mutable: true,
460+
Required: true,
461+
})
462+
version = coderdtest.UpdateTemplateVersion(t, client, user.OrganizationID, prepareEchoResponses(modifiedParameters), template.ID)
463+
coderdtest.AwaitTemplateVersionJob(t, client, version.ID)
464+
err = client.UpdateActiveTemplateVersion(context.Background(), template.ID, codersdk.UpdateActiveTemplateVersion{
465+
ID: version.ID,
466+
})
467+
require.NoError(t, err)
468+
469+
// Update the workspace
470+
cmd, root = clitest.New(t, "update", "my-workspace")
471+
clitest.SetupConfig(t, client, root)
472+
doneChan := make(chan struct{})
473+
pty := ptytest.New(t)
474+
cmd.SetIn(pty.Input())
475+
cmd.SetOut(pty.Output())
476+
go func() {
477+
defer close(doneChan)
478+
err := cmd.Execute()
479+
assert.NoError(t, err)
480+
}()
481+
482+
matches := []string{
483+
"added_parameter", "",
484+
"Enter a value:", "abc",
485+
}
486+
for i := 0; i < len(matches); i += 2 {
487+
match := matches[i]
488+
value := matches[i+1]
489+
pty.ExpectMatch(match)
490+
491+
if value != "" {
492+
pty.WriteLine(value)
493+
}
494+
}
495+
<-doneChan
496+
})
497+
498+
t.Run("OptionalParameterAdded", func(t *testing.T) {
499+
t.Parallel()
500+
501+
client := coderdtest.New(t, &coderdtest.Options{IncludeProvisionerDaemon: true})
502+
user := coderdtest.CreateFirstUser(t, client)
503+
504+
// Upload the initial template
505+
version := coderdtest.CreateTemplateVersion(t, client, user.OrganizationID, prepareEchoResponses(stringRichParameters))
506+
coderdtest.AwaitTemplateVersionJob(t, client, version.ID)
507+
template := coderdtest.CreateTemplate(t, client, user.OrganizationID, version.ID)
508+
509+
tempDir := t.TempDir()
510+
removeTmpDirUntilSuccessAfterTest(t, tempDir)
511+
parameterFile, _ := os.CreateTemp(tempDir, "testParameterFile*.yaml")
512+
_, _ = parameterFile.WriteString(
513+
stringParameterName + ": " + stringParameterValue)
514+
515+
// Create workspace
516+
cmd, root := clitest.New(t, "create", "my-workspace", "--template", template.Name, "--rich-parameter-file", parameterFile.Name(), "-y")
517+
clitest.SetupConfig(t, client, root)
518+
err := cmd.Execute()
519+
require.NoError(t, err)
520+
521+
// Modify template
522+
const addedParameterName = "added_parameter"
523+
524+
var modifiedParameters []*proto.RichParameter
525+
modifiedParameters = append(modifiedParameters, stringRichParameters...)
526+
modifiedParameters = append(modifiedParameters, &proto.RichParameter{
527+
Name: addedParameterName,
528+
Type: "string",
529+
Mutable: true,
530+
DefaultValue: "foobar",
531+
Required: false,
532+
})
533+
version = coderdtest.UpdateTemplateVersion(t, client, user.OrganizationID, prepareEchoResponses(modifiedParameters), template.ID)
534+
coderdtest.AwaitTemplateVersionJob(t, client, version.ID)
535+
err = client.UpdateActiveTemplateVersion(context.Background(), template.ID, codersdk.UpdateActiveTemplateVersion{
536+
ID: version.ID,
537+
})
538+
require.NoError(t, err)
539+
540+
// Update the workspace
541+
cmd, root = clitest.New(t, "update", "my-workspace")
542+
clitest.SetupConfig(t, client, root)
543+
doneChan := make(chan struct{})
544+
pty := ptytest.New(t)
545+
cmd.SetIn(pty.Input())
546+
cmd.SetOut(pty.Output())
547+
go func() {
548+
defer close(doneChan)
549+
err := cmd.Execute()
550+
assert.NoError(t, err)
551+
}()
552+
553+
matches := []string{
554+
"added_parameter", "",
555+
`Enter a value (default: "foobar")`, "abc",
556+
}
557+
for i := 0; i < len(matches); i += 2 {
558+
match := matches[i]
559+
value := matches[i+1]
560+
pty.ExpectMatch(match)
561+
pty.WriteLine(value)
562+
}
563+
<-doneChan
564+
})
427565
}

coderd/apidoc/docs.go

+3
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

coderd/apidoc/swagger.json

+3
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

coderd/database/dbfake/databasefake.go

+1
Original file line numberDiff line numberDiff line change
@@ -2722,6 +2722,7 @@ func (q *fakeQuerier) InsertTemplateVersionParameter(_ context.Context, arg data
27222722
ValidationMin: arg.ValidationMin,
27232723
ValidationMax: arg.ValidationMax,
27242724
ValidationMonotonic: arg.ValidationMonotonic,
2725+
Required: arg.Required,
27252726
}
27262727
q.templateVersionParameters = append(q.templateVersionParameters, param)
27272728
return param, nil

coderd/database/dump.sql

+3
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
ALTER TABLE template_version_parameters DROP COLUMN required;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
ALTER TABLE template_version_parameters ADD COLUMN required boolean NOT NULL DEFAULT true; -- default: true, as so far every parameter should be marked as required
2+
3+
COMMENT ON COLUMN template_version_parameters.required IS 'Is parameter required?';

coderd/database/models.go

+2
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

coderd/database/queries.sql.go

+10-4
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

coderd/database/queries/templateversionparameters.sql

+4-2
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,8 @@ INSERT INTO
1313
validation_min,
1414
validation_max,
1515
validation_error,
16-
validation_monotonic
16+
validation_monotonic,
17+
required
1718
)
1819
VALUES
1920
(
@@ -29,7 +30,8 @@ VALUES
2930
$10,
3031
$11,
3132
$12,
32-
$13
33+
$13,
34+
$14
3335
) RETURNING *;
3436

3537
-- name: GetTemplateVersionParameters :many

coderd/provisionerdserver/provisionerdserver.go

+1
Original file line numberDiff line numberDiff line change
@@ -828,6 +828,7 @@ func (server *Server) CompleteJob(ctx context.Context, completed *proto.Complete
828828
ValidationMin: richParameter.ValidationMin,
829829
ValidationMax: richParameter.ValidationMax,
830830
ValidationMonotonic: richParameter.ValidationMonotonic,
831+
Required: richParameter.Required,
831832
})
832833
if err != nil {
833834
return nil, xerrors.Errorf("insert parameter: %w", err)

coderd/templateversions.go

+1
Original file line numberDiff line numberDiff line change
@@ -1621,6 +1621,7 @@ func convertTemplateVersionParameter(param database.TemplateVersionParameter) (c
16211621
ValidationMax: param.ValidationMax,
16221622
ValidationError: param.ValidationError,
16231623
ValidationMonotonic: codersdk.ValidationMonotonicOrder(param.ValidationMonotonic),
1624+
Required: param.Required,
16241625
}, nil
16251626
}
16261627

0 commit comments

Comments
 (0)