feat: allow new immutable parameters for existing workspaces (#18579)

Closes https://github.com/coder/coder/issues/18578
This commit is contained in:
Steven Masley
2025-06-25 15:41:53 +00:00
committed by GitHub
parent 072c81cd73
commit e396b06c25
8 changed files with 237 additions and 5 deletions
@@ -302,6 +302,57 @@ func TestDynamicParameterBuild(t *testing.T) {
require.ErrorContains(t, err, "Number must be between 0 and 10")
})
})
t.Run("ImmutableValidation", func(t *testing.T) {
t.Parallel()
// NewImmutable tests the case where a new immutable parameter is added to a template
// after a workspace has been created with an older version of the template.
// The test tries to delete the workspace, which should succeed.
t.Run("NewImmutable", func(t *testing.T) {
t.Parallel()
ctx := testutil.Context(t, testutil.WaitShort)
// Start with a new template that has 0 parameters
empty, _ := coderdtest.DynamicParameterTemplate(t, templateAdmin, orgID, coderdtest.DynamicParameterTemplateParams{
MainTF: string(must(os.ReadFile("testdata/parameters/none/main.tf"))),
})
// Create the workspace with 0 parameters
wrk, err := templateAdmin.CreateUserWorkspace(ctx, codersdk.Me, codersdk.CreateWorkspaceRequest{
TemplateID: empty.ID,
Name: coderdtest.RandomUsername(t),
RichParameterValues: []codersdk.WorkspaceBuildParameter{},
})
require.NoError(t, err)
coderdtest.AwaitWorkspaceBuildJobCompleted(t, templateAdmin, wrk.LatestBuild.ID)
// Update the template with a new immutable parameter
_, immutable := coderdtest.DynamicParameterTemplate(t, templateAdmin, orgID, coderdtest.DynamicParameterTemplateParams{
MainTF: string(must(os.ReadFile("testdata/parameters/immutable/main.tf"))),
TemplateID: empty.ID,
})
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)
// Verify the immutable parameter is set on the workspace build
params, err := templateAdmin.WorkspaceBuildParameters(ctx, bld.ID)
require.NoError(t, err)
require.Len(t, params, 1)
require.Equal(t, "Hello World", params[0].Value)
// Verify the workspace is deleted
deleted, err := templateAdmin.DeletedWorkspace(ctx, wrk.ID)
require.NoError(t, err)
require.Equal(t, wrk.ID, deleted.ID, "workspace should be deleted")
})
})
}
// TestDynamicParameterTemplate uses a template with some dynamic elements, and
+16
View File
@@ -0,0 +1,16 @@
terraform {
required_providers {
coder = {
source = "coder/coder"
}
}
}
data "coder_workspace_owner" "me" {}
data "coder_parameter" "immutable" {
name = "immutable"
type = "string"
mutable = false
default = "Hello World"
}
+10
View File
@@ -0,0 +1,10 @@
terraform {
required_providers {
coder = {
source = "coder/coder"
}
}
}
data "coder_workspace_owner" "me" {}