diff --git a/coderd/workspaces.go b/coderd/workspaces.go index 4c7e3f89ec9d8..4a6b36a8760e9 100644 --- a/coderd/workspaces.go +++ b/coderd/workspaces.go @@ -283,7 +283,12 @@ func (api *API) postWorkspacesByOrganization(rw http.ResponseWriter, r *http.Req }) return } - + if template.Deleted { + httpapi.Write(ctx, rw, http.StatusNotFound, codersdk.Response{ + Message: fmt.Sprintf("Template %q has been deleted!", template.Name), + }) + return + } if !api.Authorize(r, rbac.ActionRead, template) { httpapi.ResourceNotFound(rw) return diff --git a/coderd/workspaces_test.go b/coderd/workspaces_test.go index 51969fc820fda..f0780a7cfc3fe 100644 --- a/coderd/workspaces_test.go +++ b/coderd/workspaces_test.go @@ -233,6 +233,27 @@ func TestPostWorkspacesByOrganization(t *testing.T) { assert.Equal(t, database.AuditActionCreate, auditor.AuditLogs[3].Action) }) + t.Run("CreateWithDeletedTemplate", func(t *testing.T) { + t.Parallel() + client := coderdtest.New(t, &coderdtest.Options{IncludeProvisionerDaemon: true}) + user := coderdtest.CreateFirstUser(t, client) + version := coderdtest.CreateTemplateVersion(t, client, user.OrganizationID, nil) + template := coderdtest.CreateTemplate(t, client, user.OrganizationID, version.ID) + coderdtest.AwaitTemplateVersionJob(t, client, version.ID) + ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong) + defer cancel() + err := client.DeleteTemplate(ctx, template.ID) + require.NoError(t, err) + _, err = client.CreateWorkspace(ctx, user.OrganizationID, codersdk.Me, codersdk.CreateWorkspaceRequest{ + TemplateID: template.ID, + Name: "testing", + }) + require.Error(t, err) + var apiErr *codersdk.Error + require.ErrorAs(t, err, &apiErr) + require.Equal(t, http.StatusNotFound, apiErr.StatusCode()) + }) + t.Run("TemplateNoTTL", func(t *testing.T) { t.Parallel() client := coderdtest.New(t, &coderdtest.Options{IncludeProvisionerDaemon: true})