mirror of
https://github.com/coder/coder.git
synced 2026-09-24 15:04:27 +08:00
chore: modify parameter dynamic immutability behavior (#18583)
Immutability behavior is determined by the current build, not affected by the previous
This commit is contained in:
@@ -338,7 +338,6 @@ func TestDynamicParameterBuild(t *testing.T) {
|
||||
bld, err := templateAdmin.CreateWorkspaceBuild(ctx, wrk.ID, codersdk.CreateWorkspaceBuildRequest{
|
||||
TemplateVersionID: immutable.ID, // Use the new template version with the immutable parameter
|
||||
Transition: codersdk.WorkspaceTransitionDelete,
|
||||
DryRun: false,
|
||||
})
|
||||
require.NoError(t, err)
|
||||
coderdtest.AwaitWorkspaceBuildJobCompleted(t, templateAdmin, bld.ID)
|
||||
@@ -354,6 +353,75 @@ func TestDynamicParameterBuild(t *testing.T) {
|
||||
require.NoError(t, err)
|
||||
require.Equal(t, wrk.ID, deleted.ID, "workspace should be deleted")
|
||||
})
|
||||
|
||||
t.Run("PreviouslyImmutable", func(t *testing.T) {
|
||||
// Ok this is a weird test to document how things are working.
|
||||
// What if a parameter flips it's immutability based on a value?
|
||||
// The current behavior is to source immutability from the new state.
|
||||
// So the value is allowed to be changed.
|
||||
t.Parallel()
|
||||
|
||||
ctx := testutil.Context(t, testutil.WaitShort)
|
||||
// Start with a new template that has 1 parameter that is immutable
|
||||
immutable, _ := coderdtest.DynamicParameterTemplate(t, templateAdmin, orgID, coderdtest.DynamicParameterTemplateParams{
|
||||
MainTF: "# PreviouslyImmutable\n" + string(must(os.ReadFile("testdata/parameters/dynamicimmutable/main.tf"))),
|
||||
})
|
||||
|
||||
// Create the workspace with the immutable parameter
|
||||
wrk, err := templateAdmin.CreateUserWorkspace(ctx, codersdk.Me, codersdk.CreateWorkspaceRequest{
|
||||
TemplateID: immutable.ID,
|
||||
Name: coderdtest.RandomUsername(t),
|
||||
RichParameterValues: []codersdk.WorkspaceBuildParameter{
|
||||
{Name: "isimmutable", Value: "true"},
|
||||
{Name: "immutable", Value: "coder"},
|
||||
},
|
||||
})
|
||||
require.NoError(t, err)
|
||||
coderdtest.AwaitWorkspaceBuildJobCompleted(t, templateAdmin, wrk.LatestBuild.ID)
|
||||
|
||||
// Try new values
|
||||
_, err = templateAdmin.CreateWorkspaceBuild(ctx, wrk.ID, codersdk.CreateWorkspaceBuildRequest{
|
||||
Transition: codersdk.WorkspaceTransitionStart,
|
||||
RichParameterValues: []codersdk.WorkspaceBuildParameter{
|
||||
{Name: "isimmutable", Value: "false"},
|
||||
{Name: "immutable", Value: "not-coder"},
|
||||
},
|
||||
})
|
||||
require.NoError(t, err)
|
||||
})
|
||||
|
||||
t.Run("PreviouslyMutable", func(t *testing.T) {
|
||||
// The value cannot be changed because it becomes immutable.
|
||||
t.Parallel()
|
||||
|
||||
ctx := testutil.Context(t, testutil.WaitShort)
|
||||
immutable, _ := coderdtest.DynamicParameterTemplate(t, templateAdmin, orgID, coderdtest.DynamicParameterTemplateParams{
|
||||
MainTF: "# PreviouslyMutable\n" + string(must(os.ReadFile("testdata/parameters/dynamicimmutable/main.tf"))),
|
||||
})
|
||||
|
||||
// Create the workspace with the mutable parameter
|
||||
wrk, err := templateAdmin.CreateUserWorkspace(ctx, codersdk.Me, codersdk.CreateWorkspaceRequest{
|
||||
TemplateID: immutable.ID,
|
||||
Name: coderdtest.RandomUsername(t),
|
||||
RichParameterValues: []codersdk.WorkspaceBuildParameter{
|
||||
{Name: "isimmutable", Value: "false"},
|
||||
{Name: "immutable", Value: "coder"},
|
||||
},
|
||||
})
|
||||
require.NoError(t, err)
|
||||
coderdtest.AwaitWorkspaceBuildJobCompleted(t, templateAdmin, wrk.LatestBuild.ID)
|
||||
|
||||
// Switch it to immutable, which breaks the validation
|
||||
_, err = templateAdmin.CreateWorkspaceBuild(ctx, wrk.ID, codersdk.CreateWorkspaceBuildRequest{
|
||||
Transition: codersdk.WorkspaceTransitionStart,
|
||||
RichParameterValues: []codersdk.WorkspaceBuildParameter{
|
||||
{Name: "isimmutable", Value: "true"},
|
||||
{Name: "immutable", Value: "not-coder"},
|
||||
},
|
||||
})
|
||||
require.Error(t, err)
|
||||
require.ErrorContains(t, err, "is not mutable")
|
||||
})
|
||||
})
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,23 @@
|
||||
terraform {
|
||||
required_providers {
|
||||
coder = {
|
||||
source = "coder/coder"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
data "coder_workspace_owner" "me" {}
|
||||
|
||||
data "coder_parameter" "isimmutable" {
|
||||
name = "isimmutable"
|
||||
type = "bool"
|
||||
mutable = true
|
||||
default = "true"
|
||||
}
|
||||
|
||||
data "coder_parameter" "immutable" {
|
||||
name = "immutable"
|
||||
type = "string"
|
||||
mutable = data.coder_parameter.isimmutable.value == "false"
|
||||
default = "Hello World"
|
||||
}
|
||||
Reference in New Issue
Block a user