feat(coderd): support ephemeral parameters (#8367)

This commit is contained in:
Marcin Tojek
2023-07-10 13:44:03 +02:00
committed by GitHub
parent 8f4157c28d
commit 9f2a931eb8
29 changed files with 626 additions and 345 deletions
+2 -2
View File
@@ -148,8 +148,8 @@ func (r *ParameterResolver) ValidateResolve(p TemplateVersionParameter, v *Works
}
// First, the provided value
resolvedValue := v
// Second, previous value
if resolvedValue == nil {
// Second, previous value if not ephemeral
if resolvedValue == nil && !p.Ephemeral {
resolvedValue = prevV
}
// Last, default value
+86
View File
@@ -304,3 +304,89 @@ func TestRichParameterValidation(t *testing.T) {
}
})
}
func TestParameterResolver_ValidateResolve_Ephemeral_OverridePrevious(t *testing.T) {
t.Parallel()
uut := codersdk.ParameterResolver{
Rich: []codersdk.WorkspaceBuildParameter{{Name: "n", Value: "5"}},
}
p := codersdk.TemplateVersionParameter{
Name: "n",
Type: "number",
Mutable: true,
Required: true,
Ephemeral: true,
}
v, err := uut.ValidateResolve(p, &codersdk.WorkspaceBuildParameter{
Name: "n",
Value: "6",
})
require.NoError(t, err)
require.Equal(t, "6", v)
}
func TestParameterResolver_ValidateResolve_Ephemeral_FirstTime(t *testing.T) {
t.Parallel()
uut := codersdk.ParameterResolver{}
p := codersdk.TemplateVersionParameter{
Name: "n",
Type: "number",
Mutable: true,
Required: true,
Ephemeral: true,
}
v, err := uut.ValidateResolve(p, &codersdk.WorkspaceBuildParameter{
Name: "n",
Value: "6",
})
require.NoError(t, err)
require.Equal(t, "6", v)
}
func TestParameterResolver_ValidateResolve_Ephemeral_UseDefault(t *testing.T) {
t.Parallel()
uut := codersdk.ParameterResolver{}
p := codersdk.TemplateVersionParameter{
Name: "n",
Type: "number",
Mutable: true,
DefaultValue: "5",
Ephemeral: true,
}
v, err := uut.ValidateResolve(p, nil)
require.NoError(t, err)
require.Equal(t, "5", v)
}
func TestParameterResolver_ValidateResolve_Ephemeral_UseEmptyDefault(t *testing.T) {
t.Parallel()
uut := codersdk.ParameterResolver{}
p := codersdk.TemplateVersionParameter{
Name: "n",
Type: "number",
Mutable: true,
DefaultValue: "",
Ephemeral: true,
}
v, err := uut.ValidateResolve(p, nil)
require.NoError(t, err)
require.Equal(t, "", v)
}
func TestParameterResolver_ValidateResolve_Ephemeral_RequiredButMissing(t *testing.T) {
t.Parallel()
uut := codersdk.ParameterResolver{}
p := codersdk.TemplateVersionParameter{
Name: "n",
Type: "number",
Mutable: true,
Required: true,
Ephemeral: true,
}
// It is more theoretical than practical case. Schema allows to configure a parameter,
// which always requires from initiator to provide the value, but it is not persisted between
// consecutive workspace builds.
v, err := uut.ValidateResolve(p, nil)
require.Error(t, err) // Parameter is required, but not provided.
require.Equal(t, "", v)
}
+1
View File
@@ -63,6 +63,7 @@ type TemplateVersionParameter struct {
ValidationMax *int32 `json:"validation_max,omitempty"`
ValidationMonotonic ValidationMonotonicOrder `json:"validation_monotonic,omitempty" enums:"increasing,decreasing"`
Required bool `json:"required"`
Ephemeral bool `json:"ephemeral"`
}
// TemplateVersionParameterOption represents a selectable option for a template parameter.