Skip to content

Commit f6134aa

Browse files
committed
initial frontend updates
1 parent 29ad77c commit f6134aa

File tree

6 files changed

+99
-4
lines changed

6 files changed

+99
-4
lines changed

coderd/provisionerdserver/provisionerdserver.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -903,6 +903,12 @@ func (s *server) UpdateJob(ctx context.Context, request *proto.UpdateJobRequest)
903903
}
904904

905905
if len(request.Logs) > 0 {
906+
if job.LogsOverflowed {
907+
return &proto.UpdateJobResponse{
908+
Canceled: job.CanceledAt.Valid,
909+
}, nil
910+
}
911+
906912
//nolint:exhaustruct // We append to the additional fields below.
907913
insertParams := database.InsertProvisionerJobLogsParams{
908914
JobID: parsedID,

coderd/provisionerdserver/provisionerdserver_test.go

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1018,6 +1018,51 @@ func TestUpdateJob(t *testing.T) {
10181018
require.Equal(t, expectedSize, jobResult.LogsLength)
10191019
require.False(t, jobResult.LogsOverflowed)
10201020
})
1021+
1022+
t.Run("LogOverflowStopsProcessing", func(t *testing.T) {
1023+
t.Parallel()
1024+
srv, db, _, pd := setup(t, false, &overrides{})
1025+
job := setupJob(t, db, pd.ID, pd.Tags)
1026+
1027+
// First: trigger overflow
1028+
largeOutput := strings.Repeat("a", 1048577) // 1MB + 1 byte
1029+
_, err := srv.UpdateJob(ctx, &proto.UpdateJobRequest{
1030+
JobId: job.String(),
1031+
Logs: []*proto.Log{{
1032+
Source: proto.LogSource_PROVISIONER,
1033+
Level: sdkproto.LogLevel_INFO,
1034+
Output: largeOutput,
1035+
}},
1036+
})
1037+
require.NoError(t, err)
1038+
1039+
// Get the initial log count
1040+
initialLogs, err := db.GetProvisionerLogsAfterID(ctx, database.GetProvisionerLogsAfterIDParams{
1041+
JobID: job,
1042+
CreatedAfter: -1,
1043+
})
1044+
require.NoError(t, err)
1045+
initialCount := len(initialLogs)
1046+
1047+
// Second: try to send more logs - should be ignored
1048+
_, err = srv.UpdateJob(ctx, &proto.UpdateJobRequest{
1049+
JobId: job.String(),
1050+
Logs: []*proto.Log{{
1051+
Source: proto.LogSource_PROVISIONER,
1052+
Level: sdkproto.LogLevel_INFO,
1053+
Output: "this should be ignored",
1054+
}},
1055+
})
1056+
require.NoError(t, err)
1057+
1058+
// Verify no new logs were added
1059+
finalLogs, err := db.GetProvisionerLogsAfterID(ctx, database.GetProvisionerLogsAfterIDParams{
1060+
JobID: job,
1061+
CreatedAfter: -1,
1062+
})
1063+
require.NoError(t, err)
1064+
require.Equal(t, initialCount, len(finalLogs))
1065+
})
10211066
}
10221067

10231068
func TestFailJob(t *testing.T) {

site/src/api/typesGenerated.ts

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

site/src/modules/workspaces/WorkspaceBuildLogs/WorkspaceBuildLogs.tsx

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
import { type Interpolation, type Theme, useTheme } from "@emotion/react";
2-
import type { ProvisionerJobLog } from "api/typesGenerated";
2+
import type { ProvisionerJobLog, WorkspaceBuild } from "api/typesGenerated";
33
import type { Line } from "components/Logs/LogLine";
44
import { DEFAULT_LOG_LINE_SIDE_PADDING, Logs } from "components/Logs/Logs";
55
import dayjs from "dayjs";
6-
import { type FC, Fragment, type HTMLAttributes } from "react";
6+
import { type FC, Fragment, type HTMLAttributes, useMemo } from "react";
77
import { BODY_FONT_FAMILY, MONOSPACE_FONT_FAMILY } from "theme/constants";
88

99
const Language = {
@@ -42,15 +42,36 @@ interface WorkspaceBuildLogsProps extends HTMLAttributes<HTMLDivElement> {
4242
hideTimestamps?: boolean;
4343
sticky?: boolean;
4444
logs: ProvisionerJobLog[];
45+
build?: WorkspaceBuild;
4546
}
4647

4748
export const WorkspaceBuildLogs: FC<WorkspaceBuildLogsProps> = ({
4849
hideTimestamps,
4950
sticky,
5051
logs,
52+
build,
5153
...attrs
5254
}) => {
5355
const theme = useTheme();
56+
57+
const processedLogs = useMemo(() => {
58+
const allLogs = logs || [];
59+
60+
// Add synthetic overflow message if needed
61+
if (build?.job?.logs_overflowed) {
62+
allLogs.push({
63+
id: -1,
64+
created_at: new Date().toISOString(),
65+
log_level: "error",
66+
log_source: "provisioner",
67+
output: "Provisioner logs exceeded the max size of 1MB!",
68+
stage: "overflow",
69+
});
70+
}
71+
72+
return allLogs;
73+
}, [logs, build?.job?.logs_overflowed]);
74+
5475
const groupedLogsByStage = groupLogsByStage(logs);
5576

5677
return (

site/src/pages/WorkspaceBuildPage/WorkspaceBuildPageView.tsx

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -212,7 +212,24 @@ export const WorkspaceBuildPageView: FC<WorkspaceBuildPageViewProps> = ({
212212
</Alert>
213213
)}
214214

215-
{tabState.value === "build" && <BuildLogsContent logs={logs} />}
215+
{build?.job?.logs_overflowed && (
216+
<Alert
217+
severity="warning"
218+
css={{
219+
borderRadius: 0,
220+
border: 0,
221+
background: theme.roles.warning.background,
222+
borderBottom: `1px solid ${theme.palette.divider}`,
223+
}}
224+
>
225+
Provisioner logs exceeded the maximum size of 1MB and were
226+
truncated.
227+
</Alert>
228+
)}
229+
230+
{tabState.value === "build" && (
231+
<BuildLogsContent logs={logs} build={build} />
232+
)}
216233
{tabState.value !== "build" && selectedAgent && (
217234
<AgentLogsContent agent={selectedAgent} />
218235
)}
@@ -261,7 +278,10 @@ const ScrollArea: FC<HTMLProps<HTMLDivElement>> = (props) => {
261278
);
262279
};
263280

264-
const BuildLogsContent: FC<{ logs?: ProvisionerJobLog[] }> = ({ logs }) => {
281+
const BuildLogsContent: FC<{
282+
logs?: ProvisionerJobLog[];
283+
build?: WorkspaceBuild;
284+
}> = ({ logs, build }) => {
265285
if (!logs) {
266286
return <Loader />;
267287
}
@@ -278,6 +298,7 @@ const BuildLogsContent: FC<{ logs?: ProvisionerJobLog[] }> = ({ logs }) => {
278298
},
279299
}}
280300
logs={sortLogsByCreatedAt(logs)}
301+
build={build}
281302
/>
282303
);
283304
};

site/src/testHelpers/entities.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -689,6 +689,7 @@ export const MockProvisionerJob: TypesGen.ProvisionerJob = {
689689
template_version_name: "test-version",
690690
workspace_name: "test-workspace",
691691
},
692+
logs_overflowed: false,
692693
};
693694

694695
export const MockFailedProvisionerJob: TypesGen.ProvisionerJob = {

0 commit comments

Comments
 (0)