Skip to content

Commit 4b7c710

Browse files
authored
fix: Block creating workspaces with deleted templates (#5019)
@coadler and @deansheather bricked a Coder deployment with this...
1 parent 927c241 commit 4b7c710

File tree

2 files changed

+27
-1
lines changed

2 files changed

+27
-1
lines changed

coderd/workspaces.go

+6-1
Original file line numberDiff line numberDiff line change
@@ -283,7 +283,12 @@ func (api *API) postWorkspacesByOrganization(rw http.ResponseWriter, r *http.Req
283283
})
284284
return
285285
}
286-
286+
if template.Deleted {
287+
httpapi.Write(ctx, rw, http.StatusNotFound, codersdk.Response{
288+
Message: fmt.Sprintf("Template %q has been deleted!", template.Name),
289+
})
290+
return
291+
}
287292
if !api.Authorize(r, rbac.ActionRead, template) {
288293
httpapi.ResourceNotFound(rw)
289294
return

coderd/workspaces_test.go

+21
Original file line numberDiff line numberDiff line change
@@ -233,6 +233,27 @@ func TestPostWorkspacesByOrganization(t *testing.T) {
233233
assert.Equal(t, database.AuditActionCreate, auditor.AuditLogs[3].Action)
234234
})
235235

236+
t.Run("CreateWithDeletedTemplate", func(t *testing.T) {
237+
t.Parallel()
238+
client := coderdtest.New(t, &coderdtest.Options{IncludeProvisionerDaemon: true})
239+
user := coderdtest.CreateFirstUser(t, client)
240+
version := coderdtest.CreateTemplateVersion(t, client, user.OrganizationID, nil)
241+
template := coderdtest.CreateTemplate(t, client, user.OrganizationID, version.ID)
242+
coderdtest.AwaitTemplateVersionJob(t, client, version.ID)
243+
ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong)
244+
defer cancel()
245+
err := client.DeleteTemplate(ctx, template.ID)
246+
require.NoError(t, err)
247+
_, err = client.CreateWorkspace(ctx, user.OrganizationID, codersdk.Me, codersdk.CreateWorkspaceRequest{
248+
TemplateID: template.ID,
249+
Name: "testing",
250+
})
251+
require.Error(t, err)
252+
var apiErr *codersdk.Error
253+
require.ErrorAs(t, err, &apiErr)
254+
require.Equal(t, http.StatusNotFound, apiErr.StatusCode())
255+
})
256+
236257
t.Run("TemplateNoTTL", func(t *testing.T) {
237258
t.Parallel()
238259
client := coderdtest.New(t, &coderdtest.Options{IncludeProvisionerDaemon: true})

0 commit comments

Comments
 (0)