diff --git a/cli/templatecreate.go b/cli/templatecreate.go index 7f2bd4a1bafea..51a4c33cfa226 100644 --- a/cli/templatecreate.go +++ b/cli/templatecreate.go @@ -78,15 +78,6 @@ func (r *RootCmd) templateCreate() *clibase.Cmd { if !entitlements.Features[codersdk.FeatureAccessControl].Enabled { return xerrors.Errorf("your license is not entitled to use enterprise access control, so you cannot set --require-active-version") } - - experiments, exErr := client.Experiments(inv.Context()) - if exErr != nil { - return xerrors.Errorf("get experiments: %w", exErr) - } - - if !experiments.Enabled(codersdk.ExperimentTemplateUpdatePolicies) { - return xerrors.Errorf("--require-active-version is an experimental feature, contact an administrator to enable the 'template_update_policies' experiment on your Coder server") - } } } diff --git a/cli/templatecreate_test.go b/cli/templatecreate_test.go index ec1720ba2a6a4..02174f59f7f5a 100644 --- a/cli/templatecreate_test.go +++ b/cli/templatecreate_test.go @@ -13,7 +13,6 @@ import ( "github.com/coder/coder/v2/cli/clitest" "github.com/coder/coder/v2/coderd/coderdtest" "github.com/coder/coder/v2/coderd/database" - "github.com/coder/coder/v2/codersdk" "github.com/coder/coder/v2/provisioner/echo" "github.com/coder/coder/v2/provisionersdk/proto" "github.com/coder/coder/v2/pty/ptytest" @@ -398,14 +397,8 @@ func TestTemplateCreate(t *testing.T) { t.Run("RequireActiveVersionInvalid", func(t *testing.T) { t.Parallel() - dv := coderdtest.DeploymentValues(t) - dv.Experiments = []string{ - string(codersdk.ExperimentTemplateUpdatePolicies), - } - client := coderdtest.New(t, &coderdtest.Options{ IncludeProvisionerDaemon: true, - DeploymentValues: dv, }) coderdtest.CreateFirstUser(t, client) source := clitest.CreateTemplateVersionSource(t, completeWithAgent()) diff --git a/cli/templateedit.go b/cli/templateedit.go index 19ef3e8cf3d7e..9cbcefc88730f 100644 --- a/cli/templateedit.go +++ b/cli/templateedit.go @@ -86,15 +86,6 @@ func (r *RootCmd) templateEdit() *clibase.Cmd { if !entitlements.Features[codersdk.FeatureAccessControl].Enabled { return xerrors.Errorf("your license is not entitled to use enterprise access control, so you cannot set --require-active-version") } - - experiments, exErr := client.Experiments(inv.Context()) - if exErr != nil { - return xerrors.Errorf("get experiments: %w", exErr) - } - - if !experiments.Enabled(codersdk.ExperimentTemplateUpdatePolicies) { - return xerrors.Errorf("--require-active-version is an experimental feature, contact an administrator to enable the 'template_update_policies' experiment on your Coder server") - } } } diff --git a/coderd/apidoc/docs.go b/coderd/apidoc/docs.go index 0ec0116f9d86d..6fa579c05da8a 100644 --- a/coderd/apidoc/docs.go +++ b/coderd/apidoc/docs.go @@ -8829,15 +8829,13 @@ const docTemplate = `{ "workspace_actions", "tailnet_pg_coordinator", "single_tailnet", - "deployment_health_page", - "template_update_policies" + "deployment_health_page" ], "x-enum-varnames": [ "ExperimentWorkspaceActions", "ExperimentTailnetPGCoordinator", "ExperimentSingleTailnet", - "ExperimentDeploymentHealthPage", - "ExperimentTemplateUpdatePolicies" + "ExperimentDeploymentHealthPage" ] }, "codersdk.ExternalAuth": { diff --git a/coderd/apidoc/swagger.json b/coderd/apidoc/swagger.json index 03010d3f01037..478797d1f1062 100644 --- a/coderd/apidoc/swagger.json +++ b/coderd/apidoc/swagger.json @@ -7907,15 +7907,13 @@ "workspace_actions", "tailnet_pg_coordinator", "single_tailnet", - "deployment_health_page", - "template_update_policies" + "deployment_health_page" ], "x-enum-varnames": [ "ExperimentWorkspaceActions", "ExperimentTailnetPGCoordinator", "ExperimentSingleTailnet", - "ExperimentDeploymentHealthPage", - "ExperimentTemplateUpdatePolicies" + "ExperimentDeploymentHealthPage" ] }, "codersdk.ExternalAuth": { diff --git a/codersdk/deployment.go b/codersdk/deployment.go index ae72f184bd9ab..76711ca7bd7c8 100644 --- a/codersdk/deployment.go +++ b/codersdk/deployment.go @@ -2088,7 +2088,6 @@ const ( // Deployment health page ExperimentDeploymentHealthPage Experiment = "deployment_health_page" - ExperimentTemplateUpdatePolicies Experiment = "template_update_policies" // Add new experiments here! // ExperimentExample Experiment = "example" ) diff --git a/docs/api/schemas.md b/docs/api/schemas.md index 588ddc9fb990c..1c8e97c3220f7 100644 --- a/docs/api/schemas.md +++ b/docs/api/schemas.md @@ -2872,13 +2872,12 @@ AuthorizationObject can represent a "set" of objects, such as: all workspaces in #### Enumerated Values -| Value | -| -------------------------- | -| `workspace_actions` | -| `tailnet_pg_coordinator` | -| `single_tailnet` | -| `deployment_health_page` | -| `template_update_policies` | +| Value | +| ------------------------ | +| `workspace_actions` | +| `tailnet_pg_coordinator` | +| `single_tailnet` | +| `deployment_health_page` | ## codersdk.ExternalAuth diff --git a/enterprise/cli/templatecreate_test.go b/enterprise/cli/templatecreate_test.go index c95298f903be3..9499810b7df3a 100644 --- a/enterprise/cli/templatecreate_test.go +++ b/enterprise/cli/templatecreate_test.go @@ -23,11 +23,6 @@ func TestTemplateCreate(t *testing.T) { t.Run("RequireActiveVersion", func(t *testing.T) { t.Parallel() - dv := coderdtest.DeploymentValues(t) - dv.Experiments = []string{ - string(codersdk.ExperimentTemplateUpdatePolicies), - } - client, user := coderdenttest.New(t, &coderdenttest.Options{ LicenseOptions: &coderdenttest.LicenseOptions{ Features: license.Features{ @@ -35,7 +30,6 @@ func TestTemplateCreate(t *testing.T) { }, }, Options: &coderdtest.Options{ - DeploymentValues: dv, IncludeProvisionerDaemon: true, }, }) @@ -124,17 +118,11 @@ func TestTemplateCreate(t *testing.T) { t.Run("NotEntitled", func(t *testing.T) { t.Parallel() - dv := coderdtest.DeploymentValues(t) - dv.Experiments = []string{ - string(codersdk.ExperimentTemplateUpdatePolicies), - } - client, admin := coderdenttest.New(t, &coderdenttest.Options{ LicenseOptions: &coderdenttest.LicenseOptions{ Features: license.Features{}, }, Options: &coderdtest.Options{ - DeploymentValues: dv, IncludeProvisionerDaemon: true, }, }) diff --git a/enterprise/cli/templateedit_test.go b/enterprise/cli/templateedit_test.go index ceeeb2aceb629..36b17e23d2119 100644 --- a/enterprise/cli/templateedit_test.go +++ b/enterprise/cli/templateedit_test.go @@ -21,11 +21,6 @@ func TestTemplateEdit(t *testing.T) { t.Run("OK", func(t *testing.T) { t.Parallel() - dv := coderdtest.DeploymentValues(t) - dv.Experiments = []string{ - string(codersdk.ExperimentTemplateUpdatePolicies), - } - ownerClient, owner := coderdenttest.New(t, &coderdenttest.Options{ LicenseOptions: &coderdenttest.LicenseOptions{ Features: license.Features{ @@ -33,7 +28,6 @@ func TestTemplateEdit(t *testing.T) { }, }, Options: &coderdtest.Options{ - DeploymentValues: dv, IncludeProvisionerDaemon: true, }, }) @@ -64,17 +58,11 @@ func TestTemplateEdit(t *testing.T) { t.Run("NotEntitled", func(t *testing.T) { t.Parallel() - dv := coderdtest.DeploymentValues(t) - dv.Experiments = []string{ - string(codersdk.ExperimentTemplateUpdatePolicies), - } - client, owner := coderdenttest.New(t, &coderdenttest.Options{ LicenseOptions: &coderdenttest.LicenseOptions{ Features: license.Features{}, }, Options: &coderdtest.Options{ - DeploymentValues: dv, IncludeProvisionerDaemon: true, }, }) diff --git a/site/src/api/typesGenerated.ts b/site/src/api/typesGenerated.ts index d073ef2037fa8..1c9f64be2f0d1 100644 --- a/site/src/api/typesGenerated.ts +++ b/site/src/api/typesGenerated.ts @@ -1780,13 +1780,11 @@ export type Experiment = | "deployment_health_page" | "single_tailnet" | "tailnet_pg_coordinator" - | "template_update_policies" | "workspace_actions"; export const Experiments: Experiment[] = [ "deployment_health_page", "single_tailnet", "tailnet_pg_coordinator", - "template_update_policies", "workspace_actions", ]; diff --git a/site/src/components/Dashboard/DashboardProvider.tsx b/site/src/components/Dashboard/DashboardProvider.tsx index 4243c8b01effe..ae05ff0ae7447 100644 --- a/site/src/components/Dashboard/DashboardProvider.tsx +++ b/site/src/components/Dashboard/DashboardProvider.tsx @@ -121,11 +121,3 @@ export const useIsWorkspaceActionsEnabled = (): boolean => { const allowWorkspaceActions = experiments.includes("workspace_actions"); return allowWorkspaceActions && allowAdvancedScheduling; }; - -export const useTemplatePoliciesEnabled = (): boolean => { - const { entitlements, experiments } = useDashboard(); - return ( - entitlements.features.access_control.enabled && - experiments.includes("template_update_policies") - ); -}; diff --git a/site/src/pages/TemplateSettingsPage/TemplateGeneralSettingsPage/TemplateSettingsForm.tsx b/site/src/pages/TemplateSettingsPage/TemplateGeneralSettingsPage/TemplateSettingsForm.tsx index eab1957c7c486..2c37ca5729ba6 100644 --- a/site/src/pages/TemplateSettingsPage/TemplateGeneralSettingsPage/TemplateSettingsForm.tsx +++ b/site/src/pages/TemplateSettingsPage/TemplateGeneralSettingsPage/TemplateSettingsForm.tsx @@ -52,7 +52,6 @@ export interface TemplateSettingsForm { // Helpful to show field errors on Storybook initialTouched?: FormikTouched; accessControlEnabled: boolean; - templatePoliciesEnabled: boolean; } export const TemplateSettingsForm: FC = ({ @@ -63,7 +62,6 @@ export const TemplateSettingsForm: FC = ({ isSubmitting, initialTouched, accessControlEnabled, - templatePoliciesEnabled, }) => { const validationSchema = getValidationSchema(); const form: FormikContextType = @@ -180,41 +178,39 @@ export const TemplateSettingsForm: FC = ({ - {templatePoliciesEnabled && ( - diff --git a/site/src/pages/TemplateSettingsPage/TemplateGeneralSettingsPage/TemplateSettingsPage.test.tsx b/site/src/pages/TemplateSettingsPage/TemplateGeneralSettingsPage/TemplateSettingsPage.test.tsx index 7449457aa998f..be0d593c9e13e 100644 --- a/site/src/pages/TemplateSettingsPage/TemplateGeneralSettingsPage/TemplateSettingsPage.test.tsx +++ b/site/src/pages/TemplateSettingsPage/TemplateGeneralSettingsPage/TemplateSettingsPage.test.tsx @@ -80,7 +80,9 @@ const fillAndSubmitForm = async ({ await userEvent.clear(iconField); await userEvent.type(iconField, icon); - const allowCancelJobsField = screen.getByRole("checkbox"); + const allowCancelJobsField = screen.getByRole("checkbox", { + name: "Allow users to cancel in-progress workspace jobs. Depending on your template, canceling builds may leave workspaces in an unhealthy state. This option isn't recommended for most use cases.", + }); // checkbox is checked by default, so it must be clicked to get unchecked if (!allow_user_cancel_workspace_jobs) { await userEvent.click(allowCancelJobsField); diff --git a/site/src/pages/TemplateSettingsPage/TemplateGeneralSettingsPage/TemplateSettingsPage.tsx b/site/src/pages/TemplateSettingsPage/TemplateGeneralSettingsPage/TemplateSettingsPage.tsx index 38e9b35f1caac..b9fd383f63e93 100644 --- a/site/src/pages/TemplateSettingsPage/TemplateGeneralSettingsPage/TemplateSettingsPage.tsx +++ b/site/src/pages/TemplateSettingsPage/TemplateGeneralSettingsPage/TemplateSettingsPage.tsx @@ -10,10 +10,7 @@ import { useTemplateSettings } from "../TemplateSettingsLayout"; import { TemplateSettingsPageView } from "./TemplateSettingsPageView"; import { templateByNameKey } from "api/queries/templates"; import { useOrganizationId } from "hooks"; -import { - useDashboard, - useTemplatePoliciesEnabled, -} from "components/Dashboard/DashboardProvider"; +import { useDashboard } from "components/Dashboard/DashboardProvider"; export const TemplateSettingsPage: FC = () => { const { template: templateName } = useParams() as { template: string }; @@ -23,7 +20,6 @@ export const TemplateSettingsPage: FC = () => { const queryClient = useQueryClient(); const { entitlements } = useDashboard(); const accessControlEnabled = entitlements.features.access_control.enabled; - const templatePoliciesEnabled = useTemplatePoliciesEnabled(); const { mutate: updateTemplate, @@ -62,7 +58,6 @@ export const TemplateSettingsPage: FC = () => { }); }} accessControlEnabled={accessControlEnabled} - templatePoliciesEnabled={templatePoliciesEnabled} /> ); diff --git a/site/src/pages/TemplateSettingsPage/TemplateGeneralSettingsPage/TemplateSettingsPageView.stories.tsx b/site/src/pages/TemplateSettingsPage/TemplateGeneralSettingsPage/TemplateSettingsPageView.stories.tsx index 23e7797bf9fc5..613b90154467a 100644 --- a/site/src/pages/TemplateSettingsPage/TemplateGeneralSettingsPage/TemplateSettingsPageView.stories.tsx +++ b/site/src/pages/TemplateSettingsPage/TemplateGeneralSettingsPage/TemplateSettingsPageView.stories.tsx @@ -8,7 +8,6 @@ const meta: Meta = { args: { template: MockTemplate, accessControlEnabled: true, - templatePoliciesEnabled: true, }, }; diff --git a/site/src/pages/TemplateSettingsPage/TemplateGeneralSettingsPage/TemplateSettingsPageView.tsx b/site/src/pages/TemplateSettingsPage/TemplateGeneralSettingsPage/TemplateSettingsPageView.tsx index 1bda2acb7e142..5eac1759d5ca2 100644 --- a/site/src/pages/TemplateSettingsPage/TemplateGeneralSettingsPage/TemplateSettingsPageView.tsx +++ b/site/src/pages/TemplateSettingsPage/TemplateGeneralSettingsPage/TemplateSettingsPageView.tsx @@ -13,7 +13,6 @@ export interface TemplateSettingsPageViewProps { typeof TemplateSettingsForm >["initialTouched"]; accessControlEnabled: boolean; - templatePoliciesEnabled: boolean; } export const TemplateSettingsPageView: FC = ({ @@ -24,7 +23,6 @@ export const TemplateSettingsPageView: FC = ({ submitError, initialTouched, accessControlEnabled, - templatePoliciesEnabled, }) => { return ( <> @@ -40,7 +38,6 @@ export const TemplateSettingsPageView: FC = ({ onCancel={onCancel} error={submitError} accessControlEnabled={accessControlEnabled} - templatePoliciesEnabled={templatePoliciesEnabled} /> ); diff --git a/site/src/pages/WorkspaceSettingsPage/WorkspaceSettingsForm.tsx b/site/src/pages/WorkspaceSettingsPage/WorkspaceSettingsForm.tsx index 824d47460ab55..1820e1b795f3a 100644 --- a/site/src/pages/WorkspaceSettingsPage/WorkspaceSettingsForm.tsx +++ b/site/src/pages/WorkspaceSettingsPage/WorkspaceSettingsForm.tsx @@ -30,13 +30,11 @@ export type WorkspaceSettingsFormValues = { export const WorkspaceSettingsForm: FC<{ workspace: Workspace; error: unknown; - templatePoliciesEnabled: boolean; onCancel: () => void; onSubmit: (values: WorkspaceSettingsFormValues) => Promise; -}> = ({ onCancel, onSubmit, workspace, error, templatePoliciesEnabled }) => { +}> = ({ onCancel, onSubmit, workspace, error }) => { const formEnabled = - (templatePoliciesEnabled && !workspace.template_require_active_version) || - workspace.allow_renames; + !workspace.template_require_active_version || workspace.allow_renames; const form = useFormik({ onSubmit, @@ -78,39 +76,37 @@ export const WorkspaceSettingsForm: FC<{ /> - {templatePoliciesEnabled && ( - - - - {AutomaticUpdateses.map((value) => ( - - {upperFirst(value)} - - ))} - - - - )} + + + + {AutomaticUpdateses.map((value) => ( + + {upperFirst(value)} + + ))} + + + {formEnabled && ( )} diff --git a/site/src/pages/WorkspaceSettingsPage/WorkspaceSettingsPage.tsx b/site/src/pages/WorkspaceSettingsPage/WorkspaceSettingsPage.tsx index 4ba770eb65735..bf4b06e00b59c 100644 --- a/site/src/pages/WorkspaceSettingsPage/WorkspaceSettingsPage.tsx +++ b/site/src/pages/WorkspaceSettingsPage/WorkspaceSettingsPage.tsx @@ -7,7 +7,6 @@ import { useMutation } from "react-query"; import { displaySuccess } from "components/GlobalSnackbar/utils"; import { patchWorkspace, updateWorkspaceAutomaticUpdates } from "api/api"; import { WorkspaceSettingsFormValues } from "./WorkspaceSettingsForm"; -import { useTemplatePoliciesEnabled } from "components/Dashboard/DashboardProvider"; const WorkspaceSettingsPage = () => { const params = useParams() as { @@ -18,7 +17,6 @@ const WorkspaceSettingsPage = () => { const username = params.username.replace("@", ""); const workspace = useWorkspaceSettings(); const navigate = useNavigate(); - const templatePoliciesEnabled = useTemplatePoliciesEnabled(); const mutation = useMutation({ mutationFn: async (formValues: WorkspaceSettingsFormValues) => { @@ -47,7 +45,6 @@ const WorkspaceSettingsPage = () => { workspace={workspace} onCancel={() => navigate(`/@${username}/${workspaceName}`)} onSubmit={mutation.mutateAsync} - templatePoliciesEnabled={templatePoliciesEnabled} /> ); diff --git a/site/src/pages/WorkspaceSettingsPage/WorkspaceSettingsPageView.stories.tsx b/site/src/pages/WorkspaceSettingsPage/WorkspaceSettingsPageView.stories.tsx index 41c2633473be0..18b2e697547cf 100644 --- a/site/src/pages/WorkspaceSettingsPage/WorkspaceSettingsPageView.stories.tsx +++ b/site/src/pages/WorkspaceSettingsPage/WorkspaceSettingsPageView.stories.tsx @@ -16,12 +16,6 @@ type Story = StoryObj; export const Example: Story = {}; -export const AutoUpdates: Story = { - args: { - templatePoliciesEnabled: true, - }, -}; - export const RenamesDisabled: Story = { args: { workspace: { ...MockWorkspace, allow_renames: false }, diff --git a/site/src/pages/WorkspaceSettingsPage/WorkspaceSettingsPageView.tsx b/site/src/pages/WorkspaceSettingsPage/WorkspaceSettingsPageView.tsx index 20bb4664dbd27..571888ab34304 100644 --- a/site/src/pages/WorkspaceSettingsPage/WorkspaceSettingsPageView.tsx +++ b/site/src/pages/WorkspaceSettingsPage/WorkspaceSettingsPageView.tsx @@ -8,7 +8,6 @@ export type WorkspaceSettingsPageViewProps = { workspace: Workspace; onCancel: () => void; onSubmit: ComponentProps["onSubmit"]; - templatePoliciesEnabled: boolean; }; export const WorkspaceSettingsPageView: FC = ({ @@ -16,7 +15,6 @@ export const WorkspaceSettingsPageView: FC = ({ onSubmit, error, workspace, - templatePoliciesEnabled, }) => { return ( <> @@ -33,7 +31,6 @@ export const WorkspaceSettingsPageView: FC = ({ workspace={workspace} onCancel={onCancel} onSubmit={onSubmit} - templatePoliciesEnabled={templatePoliciesEnabled} /> );