From 53134b60faf2601d8d9d225b2141445f6a3e7789 Mon Sep 17 00:00:00 2001 From: Marcin Tojek Date: Mon, 17 Jul 2023 13:45:50 +0200 Subject: [PATCH] feat: assume empty value for ephemeral, required parameter while stopping workspace --- coderd/wsbuilder/wsbuilder.go | 4 +++- codersdk/richparameters.go | 9 ++++++++- codersdk/richparameters_test.go | 21 ++++++++++++++++++++- 3 files changed, 31 insertions(+), 3 deletions(-) diff --git a/coderd/wsbuilder/wsbuilder.go b/coderd/wsbuilder/wsbuilder.go index 7f6d840f9db6d..2b29c06c4c6bf 100644 --- a/coderd/wsbuilder/wsbuilder.go +++ b/coderd/wsbuilder/wsbuilder.go @@ -495,8 +495,10 @@ func (b *Builder) getParameters() (names, values []string, err error) { if err != nil { return nil, nil, BuildError{http.StatusBadRequest, "Unable to build workspace with unsupported parameters", err} } + resolver := codersdk.ParameterResolver{ - Rich: db2sdk.WorkspaceBuildParameters(lastBuildParameters), + Rich: db2sdk.WorkspaceBuildParameters(lastBuildParameters), + Transition: codersdk.WorkspaceTransition(b.trans), } for _, templateVersionParameter := range templateVersionParameters { tvp, err := db2sdk.TemplateVersionParameter(templateVersionParameter) diff --git a/codersdk/richparameters.go b/codersdk/richparameters.go index d26b6abeed0c6..22b81e89caa21 100644 --- a/codersdk/richparameters.go +++ b/codersdk/richparameters.go @@ -145,12 +145,18 @@ func validationEnabled(param TemplateVersionParameter) bool { // correctly validates. // @typescript-ignore ParameterResolver type ParameterResolver struct { - Rich []WorkspaceBuildParameter + Rich []WorkspaceBuildParameter + Transition WorkspaceTransition } // ValidateResolve checks the provided value, v, against the parameter, p, and the previous build. If v is nil, it also // resolves the correct value. It returns the value of the parameter, if valid, and an error if invalid. func (r *ParameterResolver) ValidateResolve(p TemplateVersionParameter, v *WorkspaceBuildParameter) (value string, err error) { + // Assume value for required, ephemeral parameter for stopped/deleted workspace + if p.Ephemeral && r.Transition != "" && r.Transition != WorkspaceTransitionStart { + return "", nil + } + prevV := r.findLastValue(p) if !p.Mutable && v != nil && prevV != nil { return "", xerrors.Errorf("Parameter %q is not mutable, so it can't be updated after creating a workspace.", p.Name) @@ -171,6 +177,7 @@ func (r *ParameterResolver) ValidateResolve(p TemplateVersionParameter, v *Works Value: p.DefaultValue, } } + err = ValidateWorkspaceBuildParameter(p, resolvedValue, prevV) if err != nil { return "", err diff --git a/codersdk/richparameters_test.go b/codersdk/richparameters_test.go index e009421d9a553..75d95d886aeb1 100644 --- a/codersdk/richparameters_test.go +++ b/codersdk/richparameters_test.go @@ -379,7 +379,9 @@ func TestParameterResolver_ValidateResolve_Ephemeral_UseEmptyDefault(t *testing. func TestParameterResolver_ValidateResolve_Ephemeral_RequiredButMissing(t *testing.T) { t.Parallel() - uut := codersdk.ParameterResolver{} + uut := codersdk.ParameterResolver{ + Transition: codersdk.WorkspaceTransitionStart, + } p := codersdk.TemplateVersionParameter{ Name: "n", Type: "number", @@ -394,3 +396,20 @@ func TestParameterResolver_ValidateResolve_Ephemeral_RequiredButMissing(t *testi require.Error(t, err) // Parameter is required, but not provided. require.Equal(t, "", v) } + +func TestParameterResolver_ValidateResolve_Ephemeral_RequiredButMissing_StoppedWorkspace(t *testing.T) { + t.Parallel() + uut := codersdk.ParameterResolver{ + Transition: codersdk.WorkspaceTransitionStop, + } + p := codersdk.TemplateVersionParameter{ + Name: "n", + Type: "number", + Mutable: true, + Required: true, + Ephemeral: true, + } + v, err := uut.ValidateResolve(p, nil) + require.NoError(t, err) // Parameter is not provided, but resolver assumes an empty value. + require.Equal(t, "", v) +}