Skip to content

Commit 4a77c6e

Browse files
committed
prevent regular users from starting workspaces when template option enabled
1 parent 570a514 commit 4a77c6e

File tree

11 files changed

+46
-4
lines changed

11 files changed

+46
-4
lines changed

coderd/apidoc/docs.go

+3
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

coderd/apidoc/swagger.json

+3
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

coderd/workspaces.go

+1
Original file line numberDiff line numberDiff line change
@@ -1338,6 +1338,7 @@ func convertWorkspace(
13381338
TemplateDisplayName: template.DisplayName,
13391339
TemplateAllowUserCancelWorkspaceJobs: template.AllowUserCancelWorkspaceJobs,
13401340
TemplateActiveVersionID: template.ActiveVersionID,
1341+
TemplateRequireActiveVersion: template.RequireActiveVersion,
13411342
Outdated: workspaceBuild.TemplateVersionID.String() != template.ActiveVersionID.String(),
13421343
Name: workspace.Name,
13431344
AutostartSchedule: autostartSchedule,

codersdk/workspaces.go

+1
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ type Workspace struct {
3636
TemplateIcon string `json:"template_icon"`
3737
TemplateAllowUserCancelWorkspaceJobs bool `json:"template_allow_user_cancel_workspace_jobs"`
3838
TemplateActiveVersionID uuid.UUID `json:"template_active_version_id" format:"uuid"`
39+
TemplateRequireActiveVersion bool `json:"template_require_active_version"`
3940
LatestBuild WorkspaceBuild `json:"latest_build"`
4041
Outdated bool `json:"outdated"`
4142
Name string `json:"name"`

docs/api/schemas.md

+3
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

docs/api/workspaces.md

+5
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

site/src/api/typesGenerated.ts

+1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

site/src/pages/TemplateSettingsPage/TemplateGeneralSettingsPage/TemplateSettingsForm.tsx

+2-3
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ export const TemplateSettingsForm: FC<TemplateSettingsForm> = ({
7272
template.allow_user_cancel_workspace_jobs,
7373
update_workspace_last_used_at: false,
7474
update_workspace_dormant_at: false,
75-
require_active_version: false,
75+
require_active_version: template.require_active_version,
7676
},
7777
validationSchema,
7878
onSubmit,
@@ -176,8 +176,7 @@ export const TemplateSettingsForm: FC<TemplateSettingsForm> = ({
176176
<Stack direction="row" spacing={1}>
177177
<Checkbox
178178
id="require_active_version"
179-
name="require_active_vesrion"
180-
disabled={isSubmitting}
179+
name="require_active_version"
181180
checked={form.values.require_active_version}
182181
onChange={form.handleChange}
183182
/>

site/src/pages/WorkspacePage/WorkspaceActions/WorkspaceActions.tsx

+5-1
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,11 @@ export const WorkspaceActions: FC<WorkspaceActionsProps> = ({
6161
canCancel,
6262
canAcceptJobs,
6363
actions: actionsByStatus,
64-
} = actionsByWorkspaceStatus(workspace, workspace.latest_build.status);
64+
} = actionsByWorkspaceStatus(
65+
workspace,
66+
workspace.latest_build.status,
67+
canChangeVersions,
68+
);
6569
const canBeUpdated = workspace.outdated && canAcceptJobs;
6670
const menuTriggerRef = useRef<HTMLButtonElement>(null);
6771
const [isMenuOpen, setIsMenuOpen] = useState(false);

site/src/pages/WorkspacePage/WorkspaceActions/constants.ts

+21
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ interface WorkspaceAbilities {
3333
export const actionsByWorkspaceStatus = (
3434
workspace: Workspace,
3535
status: WorkspaceStatus,
36+
canChangeVersions: boolean,
3637
): WorkspaceAbilities => {
3738
if (workspace.dormant_at) {
3839
return {
@@ -41,6 +42,26 @@ export const actionsByWorkspaceStatus = (
4142
canAcceptJobs: false,
4243
};
4344
}
45+
if (
46+
workspace.template_require_active_version &&
47+
workspace.outdated &&
48+
!canChangeVersions
49+
) {
50+
if (status === "running") {
51+
return {
52+
actions: [ButtonTypesEnum.stop],
53+
canCancel: false,
54+
canAcceptJobs: true,
55+
};
56+
}
57+
if (status === "stopped") {
58+
return {
59+
actions: [],
60+
canCancel: false,
61+
canAcceptJobs: true,
62+
};
63+
}
64+
}
4465
return statusToActions[status];
4566
};
4667

site/src/testHelpers/entities.ts

+1
Original file line numberDiff line numberDiff line change
@@ -960,6 +960,7 @@ export const MockWorkspace: TypesGen.Workspace = {
960960
template_allow_user_cancel_workspace_jobs:
961961
MockTemplate.allow_user_cancel_workspace_jobs,
962962
template_active_version_id: MockTemplate.active_version_id,
963+
template_require_active_version: MockTemplate.require_active_version,
963964
outdated: false,
964965
owner_id: MockUser.id,
965966
organization_id: MockOrganization.id,

0 commit comments

Comments
 (0)