mirror of
https://github.com/coder/coder.git
synced 2026-09-24 15:04:27 +08:00
feat: Add template version warnings (#7483)
This commit is contained in:
@@ -899,6 +899,7 @@ export interface TemplateVersion {
|
||||
readonly job: ProvisionerJob
|
||||
readonly readme: string
|
||||
readonly created_by: User
|
||||
readonly warnings?: TemplateVersionWarning[]
|
||||
}
|
||||
|
||||
// From codersdk/templateversions.go
|
||||
@@ -1591,6 +1592,12 @@ export const ServerSentEventTypes: ServerSentEventType[] = [
|
||||
export type TemplateRole = "" | "admin" | "use"
|
||||
export const TemplateRoles: TemplateRole[] = ["", "admin", "use"]
|
||||
|
||||
// From codersdk/templateversions.go
|
||||
export type TemplateVersionWarning = "DEPRECATED_PARAMETERS"
|
||||
export const TemplateVersionWarnings: TemplateVersionWarning[] = [
|
||||
"DEPRECATED_PARAMETERS",
|
||||
]
|
||||
|
||||
// From codersdk/users.go
|
||||
export type UserStatus = "active" | "suspended"
|
||||
export const UserStatuses: UserStatus[] = ["active", "suspended"]
|
||||
|
||||
@@ -0,0 +1,19 @@
|
||||
import { Story } from "@storybook/react"
|
||||
import {
|
||||
TemplateVersionWarnings,
|
||||
TemplateVersionWarningsProps,
|
||||
} from "./TemplateVersionWarnings"
|
||||
|
||||
export default {
|
||||
title: "components/TemplateVersionWarnings",
|
||||
component: TemplateVersionWarnings,
|
||||
}
|
||||
|
||||
const Template: Story<TemplateVersionWarningsProps> = (args) => (
|
||||
<TemplateVersionWarnings {...args} />
|
||||
)
|
||||
|
||||
export const DeprecatedParameters = Template.bind({})
|
||||
DeprecatedParameters.args = {
|
||||
warnings: ["DEPRECATED_PARAMETERS"],
|
||||
}
|
||||
@@ -0,0 +1,34 @@
|
||||
import { FC } from "react"
|
||||
import * as TypesGen from "api/typesGenerated"
|
||||
import { AlertBanner } from "components/AlertBanner/AlertBanner"
|
||||
import { Maybe } from "components/Conditionals/Maybe"
|
||||
import Link from "@mui/material/Link"
|
||||
|
||||
export interface TemplateVersionWarningsProps {
|
||||
warnings?: TypesGen.TemplateVersionWarning[]
|
||||
}
|
||||
|
||||
export const TemplateVersionWarnings: FC<
|
||||
React.PropsWithChildren<TemplateVersionWarningsProps>
|
||||
> = ({ warnings }) => {
|
||||
if (!warnings) {
|
||||
return <></>
|
||||
}
|
||||
|
||||
return (
|
||||
<Maybe condition={Boolean(warnings.includes("DEPRECATED_PARAMETERS"))}>
|
||||
<div data-testid="warning-deprecated-parameters">
|
||||
<AlertBanner severity="warning">
|
||||
<div>
|
||||
This template uses legacy parameters which will be deprecated in the
|
||||
next Coder release. Learn how to migrate in{" "}
|
||||
<Link href="https://coder.com/docs/v2/latest/templates/parameters#migration">
|
||||
our documentation
|
||||
</Link>
|
||||
.
|
||||
</div>
|
||||
</AlertBanner>
|
||||
</div>
|
||||
</Maybe>
|
||||
)
|
||||
}
|
||||
@@ -660,3 +660,9 @@ function makeFailedBuildLogs(): ProvisionerJobLog[] {
|
||||
},
|
||||
]
|
||||
}
|
||||
|
||||
export const WithDeprecatedParameters = Template.bind({})
|
||||
WithDeprecatedParameters.args = {
|
||||
...Running.args,
|
||||
templateWarnings: ["DEPRECATED_PARAMETERS"],
|
||||
}
|
||||
|
||||
@@ -26,6 +26,7 @@ import {
|
||||
PageHeaderTitle,
|
||||
PageHeaderSubtitle,
|
||||
} from "components/PageHeader/FullWidthPageHeader"
|
||||
import { TemplateVersionWarnings } from "components/TemplateVersionWarnings/TemplateVersionWarnings"
|
||||
|
||||
export enum WorkspaceErrors {
|
||||
GET_BUILDS_ERROR = "getBuildsError",
|
||||
@@ -52,6 +53,7 @@ export interface WorkspaceProps {
|
||||
workspace: TypesGen.Workspace
|
||||
resources?: TypesGen.WorkspaceResource[]
|
||||
builds?: TypesGen.WorkspaceBuild[]
|
||||
templateWarnings?: TypesGen.TemplateVersionWarning[]
|
||||
canUpdateWorkspace: boolean
|
||||
canUpdateTemplate: boolean
|
||||
canChangeVersions: boolean
|
||||
@@ -96,6 +98,7 @@ export const Workspace: FC<React.PropsWithChildren<WorkspaceProps>> = ({
|
||||
quota_budget,
|
||||
failedBuildLogs,
|
||||
handleBuildRetry,
|
||||
templateWarnings,
|
||||
}) => {
|
||||
const styles = useStyles()
|
||||
const navigate = useNavigate()
|
||||
@@ -186,6 +189,8 @@ export const Workspace: FC<React.PropsWithChildren<WorkspaceProps>> = ({
|
||||
handleClick={() => navigate(`/templates`)}
|
||||
/>
|
||||
|
||||
<TemplateVersionWarnings warnings={templateWarnings} />
|
||||
|
||||
{failedBuildLogs && (
|
||||
<Stack>
|
||||
<AlertBanner severity="error">
|
||||
|
||||
@@ -3,6 +3,7 @@ import {
|
||||
MockTemplate,
|
||||
MockTemplateDAUResponse,
|
||||
MockTemplateVersion,
|
||||
MockTemplateVersion3,
|
||||
MockWorkspaceResource,
|
||||
MockWorkspaceResource2,
|
||||
} from "testHelpers/entities"
|
||||
@@ -65,3 +66,13 @@ SmallViewport.args = {
|
||||
SmallViewport.parameters = {
|
||||
chromatic: { viewports: [600] },
|
||||
}
|
||||
|
||||
export const WithDeprecatedParameters = Template.bind({})
|
||||
WithDeprecatedParameters.args = {
|
||||
template: MockTemplate,
|
||||
activeVersion: MockTemplateVersion3,
|
||||
data: {
|
||||
resources: [MockWorkspaceResource, MockWorkspaceResource2],
|
||||
daus: MockTemplateDAUResponse,
|
||||
},
|
||||
}
|
||||
|
||||
@@ -11,6 +11,7 @@ import { FC, useEffect } from "react"
|
||||
import { DAUChart } from "../../../components/DAUChart/DAUChart"
|
||||
import { TemplateSummaryData } from "./data"
|
||||
import { useLocation, useNavigate } from "react-router-dom"
|
||||
import { TemplateVersionWarnings } from "components/TemplateVersionWarnings/TemplateVersionWarnings"
|
||||
|
||||
export interface TemplateSummaryPageViewProps {
|
||||
data?: TemplateSummaryData
|
||||
@@ -48,6 +49,7 @@ export const TemplateSummaryPageView: FC<TemplateSummaryPageViewProps> = ({
|
||||
|
||||
return (
|
||||
<Stack spacing={4}>
|
||||
<TemplateVersionWarnings warnings={activeVersion.warnings} />
|
||||
<TemplateStats template={template} activeVersion={activeVersion} />
|
||||
{daus && <DAUChart daus={daus} />}
|
||||
<TemplateResourcesTable resources={getStartedResources(resources)} />
|
||||
|
||||
@@ -19,6 +19,7 @@ import {
|
||||
MockDeletingWorkspace,
|
||||
MockDeletedWorkspace,
|
||||
MockBuilds,
|
||||
MockTemplateVersion3,
|
||||
} from "testHelpers/entities"
|
||||
import * as api from "../../api/api"
|
||||
import { Workspace } from "../../api/typesGenerated"
|
||||
@@ -351,4 +352,18 @@ describe("WorkspacePage", () => {
|
||||
expect(rows).toHaveLength(MockBuilds.length + 1)
|
||||
})
|
||||
})
|
||||
|
||||
it("shows the template warnings", async () => {
|
||||
server.use(
|
||||
rest.get(
|
||||
"/api/v2/templateversions/:templateVersionId",
|
||||
async (req, res, ctx) => {
|
||||
return res(ctx.status(200), ctx.json(MockTemplateVersion3))
|
||||
},
|
||||
),
|
||||
)
|
||||
|
||||
await renderWorkspacePage()
|
||||
await screen.findByTestId("warning-deprecated-parameters")
|
||||
})
|
||||
})
|
||||
|
||||
@@ -54,6 +54,7 @@ export const WorkspaceReadyPage = ({
|
||||
const {
|
||||
workspace,
|
||||
template,
|
||||
templateVersion,
|
||||
builds,
|
||||
getBuildsError,
|
||||
buildError,
|
||||
@@ -157,6 +158,7 @@ export const WorkspaceReadyPage = ({
|
||||
sshPrefix={sshPrefix}
|
||||
template={template}
|
||||
quota_budget={quotaState.context.quota?.budget}
|
||||
templateWarnings={templateVersion?.warnings}
|
||||
/>
|
||||
<DeleteDialog
|
||||
entity="workspace"
|
||||
|
||||
@@ -341,6 +341,18 @@ You can add instructions here
|
||||
created_by: MockUser,
|
||||
}
|
||||
|
||||
export const MockTemplateVersion3: TypesGen.TemplateVersion = {
|
||||
id: "test-template-version-3",
|
||||
created_at: "2022-05-17T17:39:01.382927298Z",
|
||||
updated_at: "2022-05-17T17:39:01.382927298Z",
|
||||
template_id: "test-template",
|
||||
job: MockProvisionerJob,
|
||||
name: "test-version-3",
|
||||
readme: "README",
|
||||
created_by: MockUser,
|
||||
warnings: ["DEPRECATED_PARAMETERS"],
|
||||
}
|
||||
|
||||
export const MockTemplate: TypesGen.Template = {
|
||||
id: "test-template",
|
||||
created_at: "2022-05-17T17:39:01.382927298Z",
|
||||
|
||||
@@ -59,6 +59,7 @@ export interface WorkspaceContext {
|
||||
eventSource?: EventSource
|
||||
workspace?: TypesGen.Workspace
|
||||
template?: TypesGen.Template
|
||||
templateVersion?: TypesGen.TemplateVersion
|
||||
build?: TypesGen.WorkspaceBuild
|
||||
getWorkspaceError?: AxiosError
|
||||
getTemplateWarning: Error | unknown
|
||||
@@ -157,6 +158,9 @@ export const workspaceMachine = createMachine(
|
||||
getTemplate: {
|
||||
data: TypesGen.Template
|
||||
}
|
||||
getTemplateVersion: {
|
||||
data: TypesGen.TemplateVersion
|
||||
}
|
||||
getTemplateParameters: {
|
||||
data: TypesGen.TemplateVersionParameter[]
|
||||
}
|
||||
@@ -221,6 +225,28 @@ export const workspaceMachine = createMachine(
|
||||
onDone: [
|
||||
{
|
||||
actions: ["assignTemplate", "clearGetTemplateWarning"],
|
||||
target: "gettingTemplateVersion",
|
||||
},
|
||||
],
|
||||
onError: [
|
||||
{
|
||||
actions: [
|
||||
"assignGetTemplateWarning",
|
||||
"displayGetTemplateWarning",
|
||||
],
|
||||
target: "error",
|
||||
},
|
||||
],
|
||||
},
|
||||
tags: "loading",
|
||||
},
|
||||
gettingTemplateVersion: {
|
||||
invoke: {
|
||||
src: "getTemplateVersion",
|
||||
id: "getTemplateVersion",
|
||||
onDone: [
|
||||
{
|
||||
actions: ["assignTemplateVersion", "clearGetTemplateWarning"],
|
||||
target: "gettingPermissions",
|
||||
},
|
||||
],
|
||||
@@ -557,6 +583,9 @@ export const workspaceMachine = createMachine(
|
||||
assignTemplate: assign({
|
||||
template: (_, event) => event.data,
|
||||
}),
|
||||
assignTemplateVersion: assign({
|
||||
templateVersion: (_, event) => event.data,
|
||||
}),
|
||||
assignPermissions: assign({
|
||||
// Setting event.data as Permissions to be more stricted. So we know
|
||||
// what permissions we asked for.
|
||||
@@ -689,6 +718,15 @@ export const workspaceMachine = createMachine(
|
||||
throw Error("Cannot get template without workspace")
|
||||
}
|
||||
},
|
||||
getTemplateVersion: async (context) => {
|
||||
if (context.template) {
|
||||
return await API.getTemplateVersion(
|
||||
context.template.active_version_id,
|
||||
)
|
||||
} else {
|
||||
throw Error("Cannot get template version without template")
|
||||
}
|
||||
},
|
||||
updateWorkspace:
|
||||
({ workspace }, { buildParameters }) =>
|
||||
async (send) => {
|
||||
|
||||
Reference in New Issue
Block a user