Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit56c792a

Browse files
authored
feat(site): warn on provisioner health during builds (#15589)
This PR adds warning alerts to log drawers for templates and templateversions. warning alerts for workspace builds to follow in a subsequentPR. Phrasing to be finalised. Stories added and manually verified. Seescreenshots below.Updating a template version with no provisioners:<img width="1250" alt="Screenshot 2024-11-27 at 11 06 28"src="https://github.com/user-attachments/assets/47aa0940-57a8-44e1-b9a3-25a638fa2c8d">Build Errors for template versions now show tags as well:<img width="1250" alt="Screenshot 2024-11-27 at 11 07 01"src="https://github.com/user-attachments/assets/566e5339-0fe1-4cf7-8eab-9bf4892ed28a">Updating a template version with provisioners that are busy orunresponsive:<img width="1250" alt="Screenshot 2024-11-27 at 11 06 40"src="https://github.com/user-attachments/assets/71977c8c-e4ed-457f-8587-2154850e7567">Creating a new template with provisioners that are busy or unresponsive:<img width="819" alt="Screenshot 2024-11-27 at 11 08 55"src="https://github.com/user-attachments/assets/bda11501-b482-4046-95c5-feabcd1ad7f5">Creating a new template when there are no provisioners to do the build:<img width="819" alt="Screenshot 2024-11-27 at 11 08 45"src="https://github.com/user-attachments/assets/e4279ebb-399e-4c6e-86e2-ead8f3ac7605">
1 parent74f7961 commit56c792a

File tree

12 files changed

+365
-27
lines changed

12 files changed

+365
-27
lines changed

‎site/src/api/api.ts

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -682,12 +682,20 @@ class ApiMethods {
682682

683683
/**
684684
*@param organization Can be the organization's ID or name
685+
*@param tags to filter provisioner daemons by.
685686
*/
686687
getProvisionerDaemonsByOrganization=async(
687688
organization:string,
689+
tags?:Record<string,string>,
688690
):Promise<TypesGen.ProvisionerDaemon[]>=>{
691+
constparams=newURLSearchParams();
692+
693+
if(tags){
694+
params.append("tags",JSON.stringify(tags));
695+
}
696+
689697
constresponse=awaitthis.axios.get<TypesGen.ProvisionerDaemon[]>(
690-
`/api/v2/organizations/${organization}/provisionerdaemons`,
698+
`/api/v2/organizations/${organization}/provisionerdaemons?${params.toString()}`,
691699
);
692700
returnresponse.data;
693701
};

‎site/src/api/queries/organizations.ts

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -115,16 +115,18 @@ export const organizations = () => {
115115
};
116116
};
117117

118-
exportconstgetProvisionerDaemonsKey=(organization:string)=>[
119-
"organization",
120-
organization,
121-
"provisionerDaemons",
122-
];
118+
exportconstgetProvisionerDaemonsKey=(
119+
organization:string,
120+
tags?:Record<string,string>,
121+
)=>["organization",organization,tags,"provisionerDaemons"];
123122

124-
exportconstprovisionerDaemons=(organization:string)=>{
123+
exportconstprovisionerDaemons=(
124+
organization:string,
125+
tags?:Record<string,string>,
126+
)=>{
125127
return{
126-
queryKey:getProvisionerDaemonsKey(organization),
127-
queryFn:()=>API.getProvisionerDaemonsByOrganization(organization),
128+
queryKey:getProvisionerDaemonsKey(organization,tags),
129+
queryFn:()=>API.getProvisionerDaemonsByOrganization(organization,tags),
128130
};
129131
};
130132

‎site/src/components/Alert/Alert.tsx

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
importMuiAlert,{
2+
typeAlertColorasMuiAlertColor,
23
typeAlertPropsasMuiAlertProps,
34
// biome-ignore lint/nursery/noRestrictedImports: Used as base component
45
}from"@mui/material/Alert";
@@ -11,6 +12,8 @@ import {
1112
useState,
1213
}from"react";
1314

15+
exporttypeAlertColor=MuiAlertColor;
16+
1417
exporttypeAlertProps=MuiAlertProps&{
1518
actions?:ReactNode;
1619
dismissible?:boolean;
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
importtype{Meta,StoryObj}from"@storybook/react";
2+
import{chromatic}from"testHelpers/chromatic";
3+
import{ProvisionerAlert}from"./ProvisionerAlert";
4+
5+
constmeta:Meta<typeofProvisionerAlert>={
6+
title:"modules/provisioners/ProvisionerAlert",
7+
parameters:{
8+
chromatic,
9+
layout:"centered",
10+
},
11+
component:ProvisionerAlert,
12+
args:{
13+
title:"Title",
14+
detail:"Detail",
15+
severity:"info",
16+
tags:{tag:"tagValue"},
17+
},
18+
};
19+
20+
exportdefaultmeta;
21+
typeStory=StoryObj<typeofProvisionerAlert>;
22+
23+
exportconstInfo:Story={};
24+
exportconstNullTags:Story={
25+
args:{
26+
tags:undefined,
27+
},
28+
};
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
importAlertTitlefrom"@mui/material/AlertTitle";
2+
import{Alert,typeAlertColor}from"components/Alert/Alert";
3+
import{AlertDetail}from"components/Alert/Alert";
4+
import{Stack}from"components/Stack/Stack";
5+
import{ProvisionerTag}from"modules/provisioners/ProvisionerTag";
6+
importtype{FC}from"react";
7+
interfaceProvisionerAlertProps{
8+
title:string;
9+
detail:string;
10+
severity:AlertColor;
11+
tags:Record<string,string>;
12+
}
13+
14+
exportconstProvisionerAlert:FC<ProvisionerAlertProps>=({
15+
title,
16+
detail,
17+
severity,
18+
tags,
19+
})=>{
20+
return(
21+
<Alert
22+
severity={severity}
23+
css={(theme)=>{
24+
return{
25+
borderRadius:0,
26+
border:0,
27+
borderBottom:`1px solid${theme.palette.divider}`,
28+
borderLeft:`2px solid${theme.palette[severity].main}`,
29+
};
30+
}}
31+
>
32+
<AlertTitle>{title}</AlertTitle>
33+
<AlertDetail>
34+
<div>{detail}</div>
35+
<Stackdirection="row"spacing={1}wrap="wrap">
36+
{Object.entries(tags??{})
37+
.filter(([key])=>key!=="owner")
38+
.map(([key,value])=>(
39+
<ProvisionerTagkey={key}tagName={key}tagValue={value}/>
40+
))}
41+
</Stack>
42+
</AlertDetail>
43+
</Alert>
44+
);
45+
};
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
importtype{Meta,StoryObj}from"@storybook/react";
2+
import{chromatic}from"testHelpers/chromatic";
3+
import{MockTemplateVersion}from"testHelpers/entities";
4+
import{ProvisionerStatusAlert}from"./ProvisionerStatusAlert";
5+
6+
constmeta:Meta<typeofProvisionerStatusAlert>={
7+
title:"modules/provisioners/ProvisionerStatusAlert",
8+
parameters:{
9+
chromatic,
10+
layout:"centered",
11+
},
12+
component:ProvisionerStatusAlert,
13+
args:{
14+
matchingProvisioners:0,
15+
availableProvisioners:0,
16+
tags:MockTemplateVersion.job.tags,
17+
},
18+
};
19+
20+
exportdefaultmeta;
21+
typeStory=StoryObj<typeofProvisionerStatusAlert>;
22+
23+
exportconstHealthyProvisioners:Story={
24+
args:{
25+
matchingProvisioners:1,
26+
availableProvisioners:1,
27+
},
28+
};
29+
30+
exportconstUndefinedMatchingProvisioners:Story={
31+
args:{
32+
matchingProvisioners:undefined,
33+
availableProvisioners:undefined,
34+
},
35+
};
36+
37+
exportconstUndefinedAvailableProvisioners:Story={
38+
args:{
39+
matchingProvisioners:1,
40+
availableProvisioners:undefined,
41+
},
42+
};
43+
44+
exportconstNoMatchingProvisioners:Story={
45+
args:{
46+
matchingProvisioners:0,
47+
},
48+
};
49+
50+
exportconstNoAvailableProvisioners:Story={
51+
args:{
52+
matchingProvisioners:1,
53+
availableProvisioners:0,
54+
},
55+
};
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
importtype{AlertColor}from"components/Alert/Alert";
2+
importtype{FC}from"react";
3+
import{ProvisionerAlert}from"./ProvisionerAlert";
4+
5+
interfaceProvisionerStatusAlertProps{
6+
matchingProvisioners:number|undefined;
7+
availableProvisioners:number|undefined;
8+
tags:Record<string,string>;
9+
}
10+
11+
exportconstProvisionerStatusAlert:FC<ProvisionerStatusAlertProps>=({
12+
matchingProvisioners,
13+
availableProvisioners,
14+
tags,
15+
})=>{
16+
lettitle:string;
17+
letdetail:string;
18+
letseverity:AlertColor;
19+
switch(true){
20+
casematchingProvisioners===0:
21+
title="Build pending provisioner deployment";
22+
detail=
23+
"Your build has been enqueued, but there are no provisioners that accept the required tags. Once a compatible provisioner becomes available, your build will continue. Please contact your administrator.";
24+
severity="warning";
25+
break;
26+
caseavailableProvisioners===0:
27+
title="Build delayed";
28+
detail=
29+
"Provisioners that accept the required tags have not responded for longer than expected. This may delay your build. Please contact your administrator if your build does not complete.";
30+
severity="warning";
31+
break;
32+
default:
33+
title="Build enqueued";
34+
detail=
35+
"Your build has been enqueued and will begin once a provisioner becomes available to process it.";
36+
severity="info";
37+
}
38+
39+
return(
40+
<ProvisionerAlert
41+
title={title}
42+
detail={detail}
43+
severity={severity}
44+
tags={tags}
45+
/>
46+
);
47+
};

‎site/src/pages/CreateTemplatePage/BuildLogsDrawer.stories.tsx

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,42 @@ export const MissingVariables: Story = {
3434
},
3535
};
3636

37+
exportconstNoProvisioners:Story={
38+
args:{
39+
templateVersion:{
40+
...MockTemplateVersion,
41+
matched_provisioners:{
42+
count:0,
43+
available:0,
44+
},
45+
},
46+
},
47+
};
48+
49+
exportconstProvisionersUnhealthy:Story={
50+
args:{
51+
templateVersion:{
52+
...MockTemplateVersion,
53+
matched_provisioners:{
54+
count:1,
55+
available:0,
56+
},
57+
},
58+
},
59+
};
60+
61+
exportconstProvisionersHealthy:Story={
62+
args:{
63+
templateVersion:{
64+
...MockTemplateVersion,
65+
matched_provisioners:{
66+
count:1,
67+
available:1,
68+
},
69+
},
70+
},
71+
};
72+
3773
exportconstLogs:Story={
3874
args:{
3975
templateVersion:{

‎site/src/pages/CreateTemplatePage/BuildLogsDrawer.tsx

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import { visuallyHidden } from "@mui/utils";
88
import{JobError}from"api/queries/templates";
99
importtype{TemplateVersion}from"api/typesGenerated";
1010
import{Loader}from"components/Loader/Loader";
11+
import{ProvisionerStatusAlert}from"modules/provisioners/ProvisionerStatusAlert";
1112
import{useWatchVersionLogs}from"modules/templates/useWatchVersionLogs";
1213
import{WorkspaceBuildLogs}from"modules/workspaces/WorkspaceBuildLogs/WorkspaceBuildLogs";
1314
import{typeFC,useLayoutEffect,useRef}from"react";
@@ -27,6 +28,10 @@ export const BuildLogsDrawer: FC<BuildLogsDrawerProps> = ({
2728
variablesSectionRef,
2829
...drawerProps
2930
})=>{
31+
constmatchingProvisioners=templateVersion?.matched_provisioners?.count;
32+
constavailableProvisioners=
33+
templateVersion?.matched_provisioners?.available;
34+
3035
constlogs=useWatchVersionLogs(templateVersion);
3136
constlogsContainer=useRef<HTMLDivElement>(null);
3237

@@ -65,6 +70,8 @@ export const BuildLogsDrawer: FC<BuildLogsDrawerProps> = ({
6570
</IconButton>
6671
</header>
6772

73+
{}
74+
6875
{isMissingVariables ?(
6976
<MissingVariablesBanner
7077
onFillVariables={()=>{
@@ -82,7 +89,14 @@ export const BuildLogsDrawer: FC<BuildLogsDrawerProps> = ({
8289
<WorkspaceBuildLogslogs={logs}css={{border:0}}/>
8390
</section>
8491
) :(
85-
<Loader/>
92+
<>
93+
<ProvisionerStatusAlert
94+
matchingProvisioners={matchingProvisioners}
95+
availableProvisioners={availableProvisioners}
96+
tags={templateVersion?.job.tags??{}}
97+
/>
98+
<Loader/>
99+
</>
86100
)}
87101
</div>
88102
</Drawer>

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp