10000 Add provisioner health warning to workspace page · coder/coder@ad9725e · GitHub
[go: up one dir, main page]

Skip to content

Commit ad9725e

Browse files
committed
Add provisioner health warning to workspace page
1 parent 6bd9e00 commit ad9725e

File tree

10 files changed

+110
-21
lines changed

10 files changed

+110
-21
lines changed

site/src/modules/provisioners/ProvisionerAlert.stories.tsx

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import type { Meta, StoryObj } from "@storybook/react";
22
import { chromatic } from "testHelpers/chromatic";
3-
import { ProvisionerAlert } from "./ProvisionerAlert";
3+
import { ProvisionerAlert, AlertVariant } from "./ProvisionerAlert";
44

55
const meta: Meta<typeof ProvisionerAlert> = {
66
title: "modules/provisioners/ProvisionerAlert",
@@ -21,6 +21,26 @@ export default meta;
2121
type Story = StoryObj<typeof ProvisionerAlert>;
2222

2323
export const Info: Story = {};
24+
25+
export const InfoStyledForLogs: Story = {
26+
args: {
27+
variant: AlertVariant.InLogs,
28+
},
29+
};
30+
31+
export const Warning: Story = {
32+
args: {
33+
severity: "warning",
34+
},
35+
};
36+
37+
export const WarningStyledForLogs: Story = {
38+
args: {
39+
severity: "warning",
40+
variant: AlertVariant.InLogs,
41+
},
42+
};
43+
2444
export const NullTags: Story = {
2545
args: {
2646
tags: undefined,

site/src/modules/provisioners/ProvisionerAlert.tsx

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,30 +4,38 @@ import { AlertDetail } from "components/Alert/Alert";
44
import { Stack } from "components/Stack/Stack";
55
import { ProvisionerTag } from "modules/provisioners/ProvisionerTag";
66
import type { FC } from "react";
7+
8+
export enum AlertVariant {
9+
Standalone = "Standalone",
10+
InLogs = "InLogs",
11+
}
12+
713
interface ProvisionerAlertProps {
814
title: string;
915
detail: string;
1016
severity: AlertColor;
1117
tags: Record<string, string>;
18+
variant?: AlertVariant;
1219
}
1320

1421
export const ProvisionerAlert: FC<ProvisionerAlertProps> = ({
1522
title,
1623
detail,
1724
severity,
1825
tags,
26+
variant = AlertVariant.Standalone,
1927
}) => {
2028
return (
2129
<Alert
2230
severity={severity}
23-
css={(theme) => {
24-
return {
31+
{...(variant === AlertVariant.InLogs && {
32+
css: (theme) => ({
2533
borderRadius: 0,
2634
border: 0,
2735
borderBottom: `1px solid ${theme.palette.divider}`,
2836
borderLeft: `2px solid ${theme.palette[severity].main}`,
29-
};
30-
}}
37+
}),
38+
})}
3139
>
3240
<AlertTitle>{title}</AlertTitle>
3341
<AlertDetail>

site/src/modules/provisioners/ProvisionerStatusAlert.stories.tsx

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import type { Meta, StoryObj } from "@storybook/react";
22
import { chromatic } from "testHelpers/chromatic";
33
import { MockTemplateVersion } from "testHelpers/entities";
44
import { ProvisionerStatusAlert } from "./ProvisionerStatusAlert";
5+
import { AlertVariant } from "./ProvisionerAlert";
56

67
const meta: Meta<typeof ProvisionerStatusAlert> = {
78
title: "modules/provisioners/ProvisionerStatusAlert",
@@ -47,9 +48,24 @@ export const NoMatchingProvisioners: Story = {
4748
},
4849
};
4950

51+
export const NoMatchingProvisionersInLogs: Story = {
52+
args: {
53+
matchingProvisioners: 0,
54+
variant: AlertVariant.InLogs,
55+
},
56+
};
57+
5058
export const NoAvailableProvisioners: Story = {
5159
args: {
5260
matchingProvisioners: 1,
5361
availableProvisioners: 0,
5462
},
5563
};
64+
65+
export const NoAvailableProvisionersInLogs: Story = {
66+
args: {
67+
matchingProvisioners: 1,
68+
availableProvisioners: 0,
69+
variant: AlertVariant.InLogs,
70+
},
71+
};

site/src/modules/provisioners/ProvisionerStatusAlert.tsx

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,19 @@
11
import type { AlertColor } from "components/Alert/Alert";
22
import type { FC } from "react";
3-
import { ProvisionerAlert } from "./ProvisionerAlert";
3+
import { ProvisionerAlert, AlertVariant } from "./ProvisionerAlert";
44

55
interface ProvisionerStatusAlertProps {
66
matchingProvisioners: number | undefined;
77
availableProvisioners: number | undefined;
88
tags: Record<string, string>;
9+
variant?: AlertVariant;
910
}
1011

1112
export const ProvisionerStatusAlert: FC<ProvisionerStatusAlertProps> = ({
1213
matchingProvisioners,
1314
availableProvisioners,
1415
tags,
16+
variant = AlertVariant.Standalone,
1517
}) => {
1618
let title: string;
1719
let detail: string;
@@ -42,6 +44,7 @@ export const ProvisionerStatusAlert: FC<ProvisionerStatusAlertProps> = ({
4244
detail={detail}
4345
severity={severity}
4446
tags={tags}
47+
variant={variant}
4548
/>
4649
);
4750
};

site/src/pages/CreateTemplatePage/BuildLogsDrawer.tsx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import { JobError } from "api/queries/templates";
99
import type { TemplateVersion } from "api/typesGenerated";
1010
import { Loader } from "compone 1C6A nts/Loader/Loader";
1111
import { ProvisionerStatusAlert } from "modules/provisioners/ProvisionerStatusAlert";
12+
import { AlertVariant } from "modules/provisioners/ProvisionerAlert";
1213
import { useWatchVersionLogs } from "modules/templates/useWatchVersionLogs";
1314
import { WorkspaceBuildLogs } from "modules/workspaces/WorkspaceBuildLogs/WorkspaceBuildLogs";
1415
import { type FC, useLayoutEffect, useRef } from "react";
@@ -94,6 +95,7 @@ export const BuildLogsDrawer: FC<BuildLogsDrawerProps> = ({
9495
matchingProvisioners={matchingProvisioners}
9596
availableProvisioners={availableProvisioners}
9697
tags={templateVersion?.job.tags ?? {}}
98+
variant={AlertVariant.InLogs}
9799
/>
98100
<Loader />
99101
</>

site/src/pages/TemplateVersionEditorPage/TemplateVersionEditor.tsx

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ import { Loader } from "components/Loader/Loader";
3030
import { linkToTemplate, useLinks } from "modules/navigation";
3131
import { ProvisionerAlert } from "modules/provisioners/ProvisionerAlert";
3232
import { ProvisionerStatusAlert } from "modules/provisioners/ProvisionerStatusAlert";
33+
import { AlertVariant } from "modules/provisioners/ProvisionerAlert";
3334
import { TemplateFileTree } from "modules/templates/TemplateFiles/TemplateFileTree";
3435
import { isBinaryData } from "modules/templates/TemplateFiles/isBinaryData";
3536
import { TemplateResourcesTable } from "modules/templates/TemplateResourcesTable/TemplateResourcesTable";
@@ -593,6 +594,7 @@ export const TemplateVersionEditor: FC<TemplateVersionEditorProps> = ({
593594
detail={templateVersion.job.error}
594595
severity="error"
595596
tags={templateVersion.job.tags}
597+
variant={AlertVariant.InLogs}
596598
/>
597599
</div>
598600
) : (
@@ -602,6 +604,7 @@ export const TemplateVersionEditor: FC<TemplateVersionEditorProps> = ({
602604
matchingProvisioners={matchingProvisioners}
603605
availableProvisioners={availableProvisioners}
604606
tags={templateVersion.job.tags}
607+
variant={AlertVariant.InLogs}
605608
/>
606609
<Loader css={{ height: "100%" }} />
607610
</>

site/src/pages/WorkspacePage/Workspace.stories.tsx

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,38 @@ export const PendingInQueue: Story = {
9595
},
9696
};
9797

98+
export const PendingWithNoProvisioners: Story = {
99+
args: {
100+
...Running.args,
101+
workspace: {
102+
...Mocks.MockPendingWorkspace,
103+
latest_build: {
104+
...Mocks.MockPendingWorkspace.latest_build,
105+
matched_provisioners: {
106+
count: 0,
107+
available: 0,
108+
},
109+
},
110+
},
111+
},
112+
};
113+
114+
export const PendingWithNoAvailableProvisioners: Story = {
115+
args: {
116+
...Running.args,
117+
workspace: {
118+
...Mocks.MockPendingWorkspace,
119+
latest_build: {
120+
...Mocks.MockPendingWorkspace.latest_build,
121+
matched_provisioners: {
122+
count: 1,
123+
available: 0,
124+
},
125+
},
126+
},
127+
},
128+
};
129+
98130
export const Starting: Story = {
99131
args: {
100132
...Running.args,

site/src/pages/WorkspacePage/Workspace.tsx

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ import { WorkspaceDeletedBanner } from "./WorkspaceDeletedBanner";
2222
import { WorkspaceTopbar } from "./WorkspaceTopbar";
2323
import type { WorkspacePermissions } from "./permissions";
2424
import { resourceOptionValue, useResourcesNav } from "./useResourcesNav";
25+
import { ProvisionerStatusAlert } from "modules/provisioners/ProvisionerStatusAlert";
2526

2627
export interface WorkspaceProps {
2728
handleStart: (buildParameters?: TypesGen.WorkspaceBuildParameter[]) => void;
@@ -108,6 +109,12 @@ export const Workspace: FC<WorkspaceProps> = ({
108109
(r) => resourceOptionValue(r) === resourcesNav.value,
109110
);
110111

112+
const provisionersHealthy =
113+
(workspace.latest_build.matched_provisioners?.available ?? 0) > 0;
114+
const shouldShowProvisionerAlert =
115+
workspace.latest_build.status === "pending" &&
116+
!provisionersHealthy && !buildLogs;
117+
111118
return (
112119
<div
113120
css={{
@@ -208,6 +215,14 @@ export const Workspace: FC<WorkspaceProps> = ({
208215
/>
209216
)}
210217

218+
{shouldShowProvisionerAlert && (
219+
<ProvisionerStatusAlert
220+
matchingProvisioners={workspace.latest_build.matched_provisioners?.count}
221+
availableProvisioners={workspace.latest_build.matched_provisioners?.available ?? 0}
222+
tags={workspace.latest_build.job.tags}
223+
/>
224+
)}
225+
211226
{workspace.latest_build.job.error && (
212227
<Alert severity="error">
213228
<AlertTitle>Workspace build failed</AlertTitle>
@@ -222,7 +237,6 @@ export const Workspace: FC<WorkspaceProps> = ({
222237
/>
223238
)}
224239

225-
{buildLogs}
226240

227241
{selectedResource && (
228242
<section

site/src/pages/WorkspacePage/WorkspaceBuildLogsSection.tsx

Lines changed: 1 addition & 14 deletions
341A
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,15 @@
11
import { useTheme } from "@emotion/react";
2-
import type { MatchedProvisioners, ProvisionerJobLog } from "api/typesGenerated";
2+
import type { ProvisionerJobLog } from "api/typesGenerated";
33
import { Loader } from "components/Loader/Loader";
44
import { WorkspaceBuildLogs } from "modules/workspaces/WorkspaceBuildLogs/WorkspaceBuildLogs";
55
import { type FC, useEffect, useRef } from "react";
6-
import { ProvisionerStatusAlert } from "modules/provisioners/ProvisionerStatusAlert";
76

87
interface WorkspaceBuildLogsSectionProps {
98
logs?: ProvisionerJobLog[];
10-
tags: Record<string, string>;
11-
matchedProvisioners: MatchedProvisioners;
129
}
1310

1411
export const WorkspaceBuildLogsSection: FC<WorkspaceBuildLogsSectionProps> = ({
1512
logs,
16-
tags,
17-
matchedProvisioners,
1813
}) => {
1914
const scrollRef = useRef<HTMLDivElement>(null);
2015
const theme = useTheme();
@@ -32,9 +27,6 @@ export const WorkspaceBuildLogsSection: FC<WorkspaceBuildLogsSectionProps> = ({
3227
}
3328
}, [logs]);
3429

35-
const availableProvisioners = matchedProvisioners.available;
36-
const matchingProvisioners = matchedProvisioners.count;
37-
3830
return (
3931
<div
4032
css={{
@@ -75,11 +67,6 @@ export const WorkspaceBuildLogsSection: FC<WorkspaceBuildLogsSectionProps> = ({
7567
height: "100%",
7668
}}
7769
>
78-
<ProvisionerStatusAlert
79-
matchingProvisioners={matchingProvisioners}
80-
availableProvisioners={availableProvisioners}
81-
tags={tags}
82-
/>
8370
<Loader />
8471
</div>
8572
)}

site/src/testHelpers/entities.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1199,6 +1199,10 @@ export const MockWorkspaceBuild: TypesGen.WorkspaceBuild = {
11991199
resources: [MockWorkspaceResource],
12001200
status: "running",
12011201
daily_cost: 20,
1202+
matched_provisioners: {
1203+
count: 1,
1204+
available: 1,
1205+
},
12021206
};
12031207

12041208
export const MockWorkspaceBuildAutostart: TypesGen.WorkspaceBuild = {

0 commit comments

Comments
 (0)
0