feat: Add template version warnings (#7483)

This commit is contained in:
Marcin Tojek
2023-05-12 09:21:49 +00:00
committed by GitHub
parent 8f768f8276
commit cd38cb8290
18 changed files with 373 additions and 27 deletions
+7
View File
@@ -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"
+12
View File
@@ -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) => {