Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 272edba

Browse files
authored
feat(codersdk/toolsdk): add template_version_id to coder_create_workspace_build (#17364)
The `coder_create_workspace_build` tool was missing the ability to change the template version.
1 parent 2d2c9bd commit 272edba

File tree

2 files changed

+70
-3
lines changed

2 files changed

+70
-3
lines changed

codersdk/toolsdk/toolsdk.go

+20-3
Original file line numberDiff line numberDiff line change
@@ -348,6 +348,11 @@ is provisioned correctly and the agent can connect to the control plane.
348348
"transition": map[string]any{
349349
"type": "string",
350350
"description": "The transition to perform. Must be one of: start, stop, delete",
351+
"enum": []string{"start", "stop", "delete"},
352+
},
353+
"template_version_id": map[string]any{
354+
"type": "string",
355+
"description": "(Optional) The template version ID to use for the workspace build. If not provided, the previously built version will be used.",
351356
},
352357
},
353358
Required: []string{"workspace_id", "transition"},
@@ -366,9 +371,17 @@ is provisioned correctly and the agent can connect to the control plane.
366371
if !ok {
367372
return codersdk.WorkspaceBuild{}, xerrors.New("transition must be a string")
368373
}
369-
return client.CreateWorkspaceBuild(ctx, workspaceID, codersdk.CreateWorkspaceBuildRequest{
374+
templateVersionID, err := uuidFromArgs(args, "template_version_id")
375+
if err != nil {
376+
return codersdk.WorkspaceBuild{}, err
377+
}
378+
cbr := codersdk.CreateWorkspaceBuildRequest{
370379
Transition: codersdk.WorkspaceTransition(rawTransition),
371-
})
380+
}
381+
if templateVersionID != uuid.Nil {
382+
cbr.TemplateVersionID = templateVersionID
383+
}
384+
return client.CreateWorkspaceBuild(ctx, workspaceID, cbr)
372385
},
373386
}
374387

@@ -1240,7 +1253,11 @@ func workspaceAppStatusSlugFromContext(ctx context.Context) (string, bool) {
12401253
}
12411254

12421255
func uuidFromArgs(args map[string]any, key string) (uuid.UUID, error) {
1243-
raw, ok := args[key].(string)
1256+
argKey, ok := args[key]
1257+
if !ok {
1258+
return uuid.Nil, nil // No error if key is not present
1259+
}
1260+
raw, ok := argKey.(string)
12441261
if !ok {
12451262
return uuid.Nil, xerrors.Errorf("%s must be a string", key)
12461263
}

codersdk/toolsdk/toolsdk_test.go

+50
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import (
88
"testing"
99
"time"
1010

11+
"github.com/google/uuid"
1112
"github.com/stretchr/testify/require"
1213

1314
"github.com/coder/coder/v2/coderd/coderdtest"
@@ -154,6 +155,8 @@ func TestTools(t *testing.T) {
154155
require.NoError(t, err)
155156
require.Equal(t, codersdk.WorkspaceTransitionStop, result.Transition)
156157
require.Equal(t, r.Workspace.ID, result.WorkspaceID)
158+
require.Equal(t, r.TemplateVersion.ID, result.TemplateVersionID)
159+
require.Equal(t, codersdk.WorkspaceTransitionStop, result.Transition)
157160

158161
// Important: cancel the build. We don't run any provisioners, so this
159162
// will remain in the 'pending' state indefinitely.
@@ -172,11 +175,58 @@ func TestTools(t *testing.T) {
172175
require.NoError(t, err)
173176
require.Equal(t, codersdk.WorkspaceTransitionStart, result.Transition)
174177
require.Equal(t, r.Workspace.ID, result.WorkspaceID)
178+
require.Equal(t, r.TemplateVersion.ID, result.TemplateVersionID)
179+
require.Equal(t, codersdk.WorkspaceTransitionStart, result.Transition)
175180

176181
// Important: cancel the build. We don't run any provisioners, so this
177182
// will remain in the 'pending' state indefinitely.
178183
require.NoError(t, client.CancelWorkspaceBuild(ctx, result.ID))
179184
})
185+
186+
t.Run("TemplateVersionChange", func(t *testing.T) {
187+
ctx := testutil.Context(t, testutil.WaitShort)
188+
ctx = toolsdk.WithClient(ctx, memberClient)
189+
190+
// Get the current template version ID before updating
191+
workspace, err := memberClient.Workspace(ctx, r.Workspace.ID)
192+
require.NoError(t, err)
193+
originalVersionID := workspace.LatestBuild.TemplateVersionID
194+
195+
// Create a new template version to update to
196+
newVersion := dbfake.TemplateVersion(t, store).
197+
// nolint:gocritic // This is in a test package and does not end up in the build
198+
Seed(database.TemplateVersion{
199+
OrganizationID: owner.OrganizationID,
200+
CreatedBy: owner.UserID,
201+
TemplateID: uuid.NullUUID{UUID: r.Template.ID, Valid: true},
202+
}).Do()
203+
204+
// Update to new version
205+
updateBuild, err := testTool(ctx, t, toolsdk.CreateWorkspaceBuild, map[string]any{
206+
"workspace_id": r.Workspace.ID.String(),
207+
"transition": "start",
208+
"template_version_id": newVersion.TemplateVersion.ID.String(),
209+
})
210+
require.NoError(t, err)
211+
require.Equal(t, codersdk.WorkspaceTransitionStart, updateBuild.Transition)
212+
require.Equal(t, r.Workspace.ID.String(), updateBuild.WorkspaceID.String())
213+
require.Equal(t, newVersion.TemplateVersion.ID.String(), updateBuild.TemplateVersionID.String())
214+
// Cancel the build so it doesn't remain in the 'pending' state indefinitely.
215+
require.NoError(t, client.CancelWorkspaceBuild(ctx, updateBuild.ID))
216+
217+
// Roll back to the original version
218+
rollbackBuild, err := testTool(ctx, t, toolsdk.CreateWorkspaceBuild, map[string]any{
219+
"workspace_id": r.Workspace.ID.String(),
220+
"transition": "start",
221+
"template_version_id": originalVersionID.String(),
222+
})
223+
require.NoError(t, err)
224+
require.Equal(t, codersdk.WorkspaceTransitionStart, rollbackBuild.Transition)
225+
require.Equal(t, r.Workspace.ID.String(), rollbackBuild.WorkspaceID.String())
226+
require.Equal(t, originalVersionID.String(), rollbackBuild.TemplateVersionID.String())
227+
// Cancel the build so it doesn't remain in the 'pending' state indefinitely.
228+
require.NoError(t, client.CancelWorkspaceBuild(ctx, rollbackBuild.ID))
229+
})
180230
})
181231

182232
t.Run("ListTemplateVersionParameters", func(t *testing.T) {

0 commit comments

Comments
 (0)