fix: coder_parameter fallbacks to default (#7240)

This commit is contained in:
Marcin Tojek
2023-04-24 09:51:34 +02:00
committed by GitHub
parent ab077d1f15
commit c000f2ec28
3 changed files with 40 additions and 5 deletions

View File

@ -544,6 +544,15 @@ func (api *API) postWorkspaceBuilds(rw http.ResponseWriter, r *http.Request) {
// Check if parameter is defined in previous build // Check if parameter is defined in previous build
if buildParameter, found := findWorkspaceBuildParameter(apiLastBuildParameters, templateVersionParameter.Name); found { if buildParameter, found := findWorkspaceBuildParameter(apiLastBuildParameters, templateVersionParameter.Name); found {
parameters = append(parameters, *buildParameter) parameters = append(parameters, *buildParameter)
continue
}
// Check if default parameter value is in schema
if templateVersionParameter.DefaultValue != "" {
parameters = append(parameters, codersdk.WorkspaceBuildParameter{
Name: templateVersionParameter.Name,
Value: templateVersionParameter.DefaultValue,
})
} }
} }

View File

@ -901,12 +901,23 @@ func TestWorkspaceBuildWithRichParameters(t *testing.T) {
nextBuildParameters := []codersdk.WorkspaceBuildParameter{ nextBuildParameters := []codersdk.WorkspaceBuildParameter{
{Name: newImmutableParameterName, Value: "good"}, {Name: newImmutableParameterName, Value: "good"},
} }
_, err = client.CreateWorkspaceBuild(ctx, workspace.ID, codersdk.CreateWorkspaceBuildRequest{ nextWorkspaceBuild, err := client.CreateWorkspaceBuild(ctx, workspace.ID, codersdk.CreateWorkspaceBuildRequest{
TemplateVersionID: version2.ID, TemplateVersionID: version2.ID,
Transition: codersdk.WorkspaceTransitionStart, Transition: codersdk.WorkspaceTransitionStart,
RichParameterValues: nextBuildParameters, RichParameterValues: nextBuildParameters,
}) })
require.NoError(t, err) require.NoError(t, err)
require.NotEqual(t, workspaceBuild, nextWorkspaceBuild)
coderdtest.AwaitWorkspaceBuildJob(t, client, nextWorkspaceBuild.ID)
workspaceBuildParameters, err := client.WorkspaceBuildParameters(ctx, nextWorkspaceBuild.ID)
require.NoError(t, err)
expectedNextBuildParameters := append(initialBuildParameters, codersdk.WorkspaceBuildParameter{
Name: newImmutableParameterName,
Value: "good",
})
require.ElementsMatch(t, expectedNextBuildParameters, workspaceBuildParameters)
}) })
t.Run("NewImmutableOptionalParameterUsesDefault", func(t *testing.T) { t.Run("NewImmutableOptionalParameterUsesDefault", func(t *testing.T) {
@ -961,12 +972,23 @@ func TestWorkspaceBuildWithRichParameters(t *testing.T) {
defer cancel() defer cancel()
var nextBuildParameters []codersdk.WorkspaceBuildParameter var nextBuildParameters []codersdk.WorkspaceBuildParameter
_, err = client.CreateWorkspaceBuild(ctx, workspace.ID, codersdk.CreateWorkspaceBuildRequest{ nextWorkspaceBuild, err := client.CreateWorkspaceBuild(ctx, workspace.ID, codersdk.CreateWorkspaceBuildRequest{
TemplateVersionID: version2.ID, TemplateVersionID: version2.ID,
Transition: codersdk.WorkspaceTransitionStart, Transition: codersdk.WorkspaceTransitionStart,
RichParameterValues: nextBuildParameters, RichParameterValues: nextBuildParameters,
}) })
require.NoError(t, err) require.NoError(t, err)
require.NotEqual(t, workspaceBuild, nextWorkspaceBuild)
coderdtest.AwaitWorkspaceBuildJob(t, client, nextWorkspaceBuild.ID)
workspaceBuildParameters, err := client.WorkspaceBuildParameters(ctx, nextWorkspaceBuild.ID)
require.NoError(t, err)
expectedNextBuildParameters := append(initialBuildParameters, codersdk.WorkspaceBuildParameter{
Name: newImmutableParameterName,
Value: "12345",
})
require.ElementsMatch(t, expectedNextBuildParameters, workspaceBuildParameters)
}) })
} }

View File

@ -1057,15 +1057,19 @@ const getMissingParameters = (
const requiredParameters: TypesGen.TemplateVersionParameter[] = [] const requiredParameters: TypesGen.TemplateVersionParameter[] = []
templateParameters.forEach((p) => { templateParameters.forEach((p) => {
// Legacy parameters should be required. So we can migrate them. // Legacy parameters should not be required. Backend can just migrate them.
const isLegacy = p.legacy_variable_name === undefined const isLegacy = p.legacy_variable_name !== undefined
// It is mutable and required. Mutable values can be changed after so we // It is mutable and required. Mutable values can be changed after so we
// don't need to ask them if they are not required. // don't need to ask them if they are not required.
const isMutableAndRequired = p.mutable && p.required const isMutableAndRequired = p.mutable && p.required
// Is immutable, so we can check if it is its first time on the build // Is immutable, so we can check if it is its first time on the build
const isImmutable = !p.mutable const isImmutable = !p.mutable
if (isLegacy || isMutableAndRequired || isImmutable) { if (isLegacy) {
return
}
if (isMutableAndRequired || isImmutable) {
requiredParameters.push(p) requiredParameters.push(p)
return return
} }