mirror of
https://github.com/coder/coder.git
synced 2026-09-24 15:04:27 +08:00
feat(coderd): support ephemeral parameters (#8367)
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
@@ -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.
|
||||
|
||||
Reference in New Issue
Block a user