Skip to content

Commit 2ad7fcc

Browse files
authored
fix: show template autostop setting when it overrides the workspace setting (#12910)
1 parent 22785a3 commit 2ad7fcc

File tree

4 files changed

+48
-4
lines changed

4 files changed

+48
-4
lines changed

coderd/workspaces.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1649,6 +1649,11 @@ func convertWorkspace(
16491649
}
16501650

16511651
ttlMillis := convertWorkspaceTTLMillis(workspace.Ttl)
1652+
// If the template doesn't allow a workspace-configured value, then report the
1653+
// template value instead.
1654+
if !template.AllowUserAutostop {
1655+
ttlMillis = convertWorkspaceTTLMillis(sql.NullInt64{Valid: true, Int64: template.DefaultTTL})
1656+
}
16521657

16531658
// Only show favorite status if you own the workspace.
16541659
requesterFavorite := workspace.OwnerID == requesterID && workspace.Favorite

coderd/workspaces_test.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -761,8 +761,8 @@ func TestPostWorkspacesByOrganization(t *testing.T) {
761761
coderdtest.AwaitWorkspaceBuildJobCompleted(t, client, workspace.LatestBuild.ID)
762762

763763
// TTL should be set by the template
764-
require.Equal(t, template.DefaultTTLMillis, templateTTL)
765-
require.Equal(t, template.DefaultTTLMillis, *workspace.TTLMillis)
764+
require.Equal(t, templateTTL, template.DefaultTTLMillis)
765+
require.Equal(t, templateTTL, *workspace.TTLMillis)
766766
})
767767

768768
t.Run("InvalidTTL", func(t *testing.T) {
@@ -789,7 +789,7 @@ func TestPostWorkspacesByOrganization(t *testing.T) {
789789
require.ErrorAs(t, err, &apiErr)
790790
require.Equal(t, http.StatusBadRequest, apiErr.StatusCode())
791791
require.Len(t, apiErr.Validations, 1)
792-
require.Equal(t, apiErr.Validations[0].Field, "ttl_ms")
792+
require.Equal(t, "ttl_ms", apiErr.Validations[0].Field)
793793
require.Equal(t, "time until shutdown must be at least one minute", apiErr.Validations[0].Detail)
794794
})
795795
})

enterprise/coderd/workspaces_test.go

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -913,6 +913,44 @@ func TestWorkspaceAutobuild(t *testing.T) {
913913
ws = coderdtest.MustWorkspace(t, client, ws.ID)
914914
require.Equal(t, version2.ID, ws.LatestBuild.TemplateVersionID)
915915
})
916+
917+
t.Run("TemplateDoesNotAllowUserAutostop", func(t *testing.T) {
918+
t.Parallel()
919+
client := coderdtest.New(t, &coderdtest.Options{
920+
IncludeProvisionerDaemon: true,
921+
TemplateScheduleStore: schedule.NewEnterpriseTemplateScheduleStore(agplUserQuietHoursScheduleStore()),
922+
})
923+
user := coderdtest.CreateFirstUser(t, client)
924+
version := coderdtest.CreateTemplateVersion(t, client, user.OrganizationID, nil)
925+
templateTTL := 24 * time.Hour.Milliseconds()
926+
template := coderdtest.CreateTemplate(t, client, user.OrganizationID, version.ID, func(ctr *codersdk.CreateTemplateRequest) {
927+
ctr.DefaultTTLMillis = ptr.Ref(templateTTL)
928+
ctr.AllowUserAutostop = ptr.Ref(false)
929+
})
930+
coderdtest.AwaitTemplateVersionJobCompleted(t, client, version.ID)
931+
workspace := coderdtest.CreateWorkspace(t, client, user.OrganizationID, template.ID, func(cwr *codersdk.CreateWorkspaceRequest) {
932+
cwr.TTLMillis = nil // ensure that no default TTL is set
933+
})
934+
coderdtest.AwaitWorkspaceBuildJobCompleted(t, client, workspace.LatestBuild.ID)
935+
936+
// TTL should be set by the template
937+
require.Equal(t, false, template.AllowUserAutostop)
938+
require.Equal(t, templateTTL, template.DefaultTTLMillis)
939+
require.Equal(t, templateTTL, *workspace.TTLMillis)
940+
941+
// Change the template's default TTL and refetch the workspace
942+
templateTTL = 72 * time.Hour.Milliseconds()
943+
ctx := testutil.Context(t, testutil.WaitShort)
944+
template = coderdtest.UpdateTemplateMeta(t, client, template.ID, codersdk.UpdateTemplateMeta{
945+
DefaultTTLMillis: templateTTL,
946+
})
947+
workspace, err := client.Workspace(ctx, workspace.ID)
948+
require.NoError(t, err)
949+
950+
// Ensure that the new value is reflected in the template and workspace
951+
require.Equal(t, templateTTL, template.DefaultTTLMillis)
952+
require.Equal(t, templateTTL, *workspace.TTLMillis)
953+
})
916954
}
917955

918956
// Blocked by autostart requirements

site/src/pages/WorkspaceSettingsPage/WorkspaceSettingsPage.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import type { FC } from "react";
12
import { Helmet } from "react-helmet-async";
23
import { useMutation } from "react-query";
34
import { useNavigate, useParams } from "react-router-dom";
@@ -8,7 +9,7 @@ import type { WorkspaceSettingsFormValues } from "./WorkspaceSettingsForm";
89
import { useWorkspaceSettings } from "./WorkspaceSettingsLayout";
910
import { WorkspaceSettingsPageView } from "./WorkspaceSettingsPageView";
1011

11-
const WorkspaceSettingsPage = () => {
12+
const WorkspaceSettingsPage: FC = () => {
1213
const params = useParams() as {
1314
workspace: string;
1415
username: string;

0 commit comments

Comments
 (0)