Skip to content

Commit 570a514

Browse files
committed
feat: add frontend support for mandating active template version
1 parent 997493d commit 570a514

File tree

9 files changed

+92
-35
lines changed

9 files changed

+92
-35
lines changed

coderd/apidoc/docs.go

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

coderd/apidoc/swagger.json

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

codersdk/deployment.go

+2
Original file line numberDiff line numberDiff line change
@@ -2002,6 +2002,8 @@ const (
20022002
// ExperimentDashboardTheme mutates the dashboard to use a new, dark color scheme.
20032003
ExperimentDashboardTheme Experiment = "dashboard_theme"
20042004

2005+
ExperimentTemplateUpdatePolicies Experiment = "template_update_policies"
2006+
20052007
// Add new experiments here!
20062008
// ExperimentExample Experiment = "example"
20072009
)

docs/api/schemas.md

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

scripts/develop.sh

+1-1
Original file line numberDiff line numberDiff line change
@@ -136,7 +136,7 @@ fatal() {
136136
trap 'fatal "Script encountered an error"' ERR
137137

138138
cdroot
139-
start_cmd API "" "${CODER_DEV_SHIM}" server --http-address 0.0.0.0:3000 --swagger-enable --access-url "${CODER_DEV_ACCESS_URL}" --dangerous-allow-cors-requests=true "$@"
139+
start_cmd API "" "${CODER_DEV_SHIM}" server --http-address 0.0.0.0:3000 --swagger-enable --access-url "${CODER_DEV_ACCESS_URL}" --experiments="template_update_policies" --dangerous-allow-cors-requests=true "$@"
140140

141141
echo '== Waiting for Coder to become ready'
142142
# Start the timeout in the background so interrupting this script

site/src/api/typesGenerated.ts

+3-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

+67-29
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ export const getValidationSchema = (): Yup.AnyObjectSchema =>
3737
),
3838
allow_user_cancel_workspace_jobs: Yup.boolean(),
3939
icon: iconValidator,
40+
require_active_version: Yup.boolean(),
4041
});
4142

4243
export interface TemplateSettingsForm {
@@ -47,6 +48,7 @@ export interface TemplateSettingsForm {
4748
error?: unknown;
4849
// Helpful to show field errors on Storybook
4950
initialTouched?: FormikTouched<UpdateTemplateMeta>;
51+
accessControlEnabled: boolean;
5052
}
5153

5254
export const TemplateSettingsForm: FC<TemplateSettingsForm> = ({
@@ -56,6 +58,7 @@ export const TemplateSettingsForm: FC<TemplateSettingsForm> = ({
5658
error,
5759
isSubmitting,
5860
initialTouched,
61+
accessControlEnabled,
5962
}) => {
6063
const validationSchema = getValidationSchema();
6164
const form: FormikContextType<UpdateTemplateMeta> =
@@ -135,38 +138,73 @@ export const TemplateSettingsForm: FC<TemplateSettingsForm> = ({
135138
title="Operations"
136139
description="Regulate actions allowed on workspaces created from this template."
137140
>
138-
<label htmlFor="allow_user_cancel_workspace_jobs">
139-
<Stack direction="row" spacing={1}>
140-
<Checkbox
141-
id="allow_user_cancel_workspace_jobs"
142-
name="allow_user_cancel_workspace_jobs"
143-
disabled={isSubmitting}
144-
checked={form.values.allow_user_cancel_workspace_jobs}
145-
onChange={form.handleChange}
146-
/>
141+
<Stack direction="column" spacing={5}>
142+
<label htmlFor="allow_user_cancel_workspace_jobs">
143+
<Stack direction="row" spacing={1}>
144+
<Checkbox
145+
id="allow_user_cancel_workspace_jobs"
146+
name="allow_user_cancel_workspace_jobs"
147+
disabled={isSubmitting}
148+
checked={form.values.allow_user_cancel_workspace_jobs}
149+
onChange={form.handleChange}
150+
/>
147151

148-
<Stack direction="column" spacing={0.5}>
149-
<Stack
150-
direction="row"
151-
alignItems="center"
152-
spacing={0.5}
153-
className={styles.optionText}
154-
>
155-
Allow users to cancel in-progress workspace jobs.
156-
<HelpTooltip>
157-
<HelpTooltipText>
158-
If checked, users may be able to corrupt their workspace.
159-
</HelpTooltipText>
160-
</HelpTooltip>
152+
<Stack direction="column" spacing={0.5}>
153+
<Stack
154+
direction="row"
155+
alignItems="center"
156+
spacing={0.5}
157+
className={styles.optionText}
158+
>
159+
Allow users to cancel in-progress workspace jobs.
160+
<HelpTooltip>
161+
<HelpTooltipText>
162+
If checked, users may be able to corrupt their workspace.
163+
</HelpTooltipText>
164+
</HelpTooltip>
165+
</Stack>
166+
<span className={styles.optionHelperText}>
167+
Depending on your template, canceling builds may leave
168+
workspaces in an unhealthy state. This option isn&apos;t
169+
recommended for most use cases.
170+
</span>
161171
</Stack>
162-
<span className={styles.optionHelperText}>
163-
Depending on your template, canceling builds may leave
164-
workspaces in an unhealthy state. This option isn&apos;t
165-
recommended for most use cases.
166-
</span>
167172
</Stack>
168-
</Stack>
169-
</label>
173+
</label>
174+
{accessControlEnabled && (
175+
<label htmlFor="require_active_version">
176+
<Stack direction="row" spacing={1}>
177+
<Checkbox
178+
id="require_active_version"
179+
name="require_active_vesrion"
180+
disabled={isSubmitting}
181+
checked={form.values.require_active_version}
182+
onChange={form.handleChange}
183+
/>
184+
185+
<Stack direction="column" spacing={0.5}>
186+
<Stack
187+
direction="row"
188+
alignItems="center"
189+
spacing={0.5}
190+
className={styles.optionText}
191+
>
192+
Require the active template version for workspace builds.
193+
<HelpTooltip>
194+
<HelpTooltipText>
195+
This setting is not enforced for template admins.
196+
</HelpTooltipText>
197+
</HelpTooltip>
198+
</Stack>
199+
<span className={styles.optionHelperText}>
200+
Workspaces that are manually started or auto-started will
201+
use the promoted template version.
202+
</span>
203+
</Stack>
204+
</Stack>
205+
</label>
206+
)}
207+
</Stack>
170208
</FormSection>
171209

172210
<FormFooter onCancel={onCancel} isLoading={isSubmitting} />

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

+7
Original file line numberDiff line numberDiff line change
@@ -10,13 +10,19 @@ import { useTemplateSettings } from "../TemplateSettingsLayout";
1010
import { TemplateSettingsPageView } from "./TemplateSettingsPageView";
1111
import { templateByNameKey } from "api/queries/templates";
1212
import { useOrganizationId } from "hooks";
13+
import { useDashboard } from "components/Dashboard/DashboardProvider";
1314

1415
export const TemplateSettingsPage: FC = () => {
1516
const { template: templateName } = useParams() as { template: string };
1617
const navigate = useNavigate();
1718
const orgId = useOrganizationId();
1819
const { template } = useTemplateSettings();
1920
const queryClient = useQueryClient();
21+
const { entitlements, experiments } = useDashboard();
22+
const accessControlEnabled =
23+
entitlements.features["advanced_template_scheduling"].enabled &&
24+
experiments.includes("template_update_policies");
25+
2026
const {
2127
mutate: updateTemplate,
2228
isLoading: isSubmitting,
@@ -51,6 +57,7 @@ export const TemplateSettingsPage: FC = () => {
5157
...templateSettings,
5258
});
5359
}}
60+
accessControlEnabled={accessControlEnabled}
5461
/>
5562
</>
5663
);

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

+3
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ export interface TemplateSettingsPageViewProps {
1212
initialTouched?: ComponentProps<
1313
typeof TemplateSettingsForm
1414
>["initialTouched"];
15+
accessControlEnabled: boolean;
1516
}
1617

1718
export const TemplateSettingsPageView: FC<TemplateSettingsPageViewProps> = ({
@@ -21,6 +22,7 @@ export const TemplateSettingsPageView: FC<TemplateSettingsPageViewProps> = ({
2122
isSubmitting,
2223
submitError,
2324
initialTouched,
25+
accessControlEnabled,
2426
}) => {
2527
return (
2628
<>
@@ -35,6 +37,7 @@ export const TemplateSettingsPageView: FC<TemplateSettingsPageViewProps> = ({
3537
onSubmit={onSubmit}
3638
onCancel={onCancel}
3739
error={submitError}
40+
accessControlEnabled={accessControlEnabled}
3841
/>
3942
</>
4043
);

0 commit comments

Comments
 (0)