Skip to content

Commit 765d145

Browse files
change: [DPS-41857] - Logs: Add new statuses - deactivating, failed
1 parent 8dd6057 commit 765d145

File tree

7 files changed

+109
-59
lines changed

7 files changed

+109
-59
lines changed

packages/api-v4/src/delivery/types.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
export const streamStatus = {
22
Active: 'active',
3+
Deactivating: 'deactivating',
4+
Failed: 'failed',
35
Inactive: 'inactive',
46
Provisioning: 'provisioning',
57
} as const;

packages/manager/src/features/Delivery/Shared/types.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,16 @@ export const streamStatusOptions: AutocompleteOption[] = [
4949
label: 'Active',
5050
pendoId: 'Logs Delivery Streams-Status Active',
5151
},
52+
{
53+
value: streamStatus.Deactivating,
54+
label: 'Deactivating',
55+
pendoId: 'Logs Delivery Streams-Status Deactivating',
56+
},
57+
{
58+
value: streamStatus.Failed,
59+
label: 'Failed',
60+
pendoId: 'Logs Delivery Streams-Status Failed',
61+
},
5262
{
5363
value: streamStatus.Inactive,
5464
label: 'Inactive',

packages/manager/src/features/Delivery/Streams/StreamActionMenu.tsx

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ interface StreamActionMenuProps extends StreamHandlers {
1717

1818
export const StreamActionMenu = (props: StreamActionMenuProps) => {
1919
const { stream, onDelete, onDisableOrEnable, onEdit } = props;
20+
const { status, label } = stream;
2021

2122
const menuActions: Action[] = [
2223
{
@@ -25,14 +26,19 @@ export const StreamActionMenu = (props: StreamActionMenuProps) => {
2526
},
2627
title: 'Edit',
2728
pendoId: 'Logs Delivery Streams-Edit',
29+
disabled:
30+
status === streamStatus.Deactivating || status === streamStatus.Failed,
2831
},
2932
{
3033
onClick: () => {
3134
onDisableOrEnable(stream);
3235
},
33-
title: stream.status === streamStatus.Active ? 'Deactivate' : 'Activate',
34-
pendoId: `Logs Delivery Streams-${stream.status === streamStatus.Active ? 'Deactivate' : 'Activate'}`,
35-
disabled: stream.status === streamStatus.Provisioning,
36+
title: status === streamStatus.Active ? 'Deactivate' : 'Activate',
37+
pendoId: `Logs Delivery Streams-${status === streamStatus.Active ? 'Deactivate' : 'Activate'}`,
38+
disabled:
39+
status === streamStatus.Deactivating ||
40+
status === streamStatus.Failed ||
41+
status === streamStatus.Provisioning,
3642
},
3743
{
3844
onClick: () => {
@@ -46,7 +52,7 @@ export const StreamActionMenu = (props: StreamActionMenuProps) => {
4652
return (
4753
<ActionMenu
4854
actionsList={menuActions}
49-
ariaLabel={`Action menu for Stream ${stream.label}`}
55+
ariaLabel={`Action menu for Stream ${label}`}
5056
pendoId="Logs Delivery Streams-Action Menu"
5157
/>
5258
);

packages/manager/src/features/Delivery/Streams/StreamForm/StreamEdit.test.tsx

Lines changed: 54 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import { streamStatus } from '@linode/api-v4';
12
import {
23
screen,
34
waitFor,
@@ -239,47 +240,60 @@ describe('StreamEdit', () => {
239240
});
240241
});
241242

242-
describe('and stream has status: provisioning', () => {
243-
it('should have disabled Edit Stream button and show info tooltip', async () => {
244-
server.use(
245-
http.get('*/monitor/streams/destinations', () => {
246-
return HttpResponse.json(makeResourcePage(mockDestinations));
247-
}),
248-
http.get(`*/monitor/streams/${streamId}`, () => {
249-
return HttpResponse.json({
250-
...mockStream,
251-
status: 'provisioning',
252-
});
253-
})
254-
);
255-
256-
renderWithThemeAndHookFormContext({
257-
component: <StreamEdit />,
243+
const blockingStatuses = [
244+
streamStatus.Deactivating,
245+
streamStatus.Failed,
246+
streamStatus.Provisioning,
247+
];
248+
249+
describe.each(blockingStatuses)(
250+
'and stream has status: %status',
251+
(status) => {
252+
it('should have disabled Edit Stream button and show info tooltip', async () => {
253+
server.use(
254+
http.get('*/monitor/streams/destinations', () => {
255+
return HttpResponse.json(
256+
makeResourcePage(mockDestinations)
257+
);
258+
}),
259+
http.get(`*/monitor/streams/${streamId}`, () => {
260+
return HttpResponse.json({
261+
...mockStream,
262+
status,
263+
});
264+
})
265+
);
266+
267+
renderWithThemeAndHookFormContext({
268+
component: <StreamEdit />,
269+
});
270+
const loadingElement = screen.queryByTestId(loadingTestId);
271+
await waitForElementToBeRemoved(loadingElement);
272+
273+
const editStreamButton = screen.getByRole('button', {
274+
name: saveStreamButtonText,
275+
});
276+
277+
// Edit stream button should be disabled
278+
expect(editStreamButton).toBeDisabled();
279+
280+
// Edit stream
281+
await userEvent.hover(editStreamButton);
282+
283+
await waitFor(() => {
284+
expect(screen.getByRole('tooltip')).toBeInTheDocument();
285+
});
286+
287+
const disabledButtonTooltip = screen.getByText((content) =>
288+
content.includes(
289+
`You cannot save changes while the stream status is ${status}`
290+
)
291+
);
292+
293+
expect(disabledButtonTooltip).toBeInTheDocument();
258294
});
259-
const loadingElement = screen.queryByTestId(loadingTestId);
260-
await waitForElementToBeRemoved(loadingElement);
261-
262-
const editStreamButton = screen.getByRole('button', {
263-
name: saveStreamButtonText,
264-
});
265-
266-
// Edit stream button should be disabled
267-
expect(editStreamButton).toBeDisabled();
268-
269-
// Edit stream
270-
await userEvent.hover(editStreamButton);
271-
272-
await waitFor(() => {
273-
expect(screen.getByRole('tooltip')).toBeInTheDocument();
274-
});
275-
276-
const disabledButtonTooltip = screen.getByText(
277-
'You cannot save changes while the stream is provisioning.'
278-
);
279-
280-
expect(disabledButtonTooltip).toBeInTheDocument();
281-
});
282-
});
295+
}
296+
);
283297
});
284298
});
285299

packages/manager/src/features/Delivery/Streams/StreamForm/StreamForm.tsx

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -77,12 +77,23 @@ export const StreamForm = (props: StreamFormProps) => {
7777
control,
7878
name: 'stream.status',
7979
});
80+
81+
const isStreamStatusBlocking =
82+
!!selectedStreamStatus &&
83+
(
84+
[
85+
streamStatus.Provisioning,
86+
streamStatus.Deactivating,
87+
streamStatus.Failed,
88+
] as StreamStatus[]
89+
).includes(selectedStreamStatus);
90+
8091
const submitButtonTooltip = useMemo(
8192
() =>
82-
selectedStreamStatus === streamStatus.Provisioning
83-
? 'You cannot save changes while the stream is provisioning.'
93+
isStreamStatusBlocking
94+
? `You cannot save changes while the stream status is ${selectedStreamStatus}`
8495
: undefined,
85-
[selectedStreamStatus]
96+
[isStreamStatusBlocking, selectedStreamStatus]
8697
);
8798

8899
useEffect(() => {
@@ -211,8 +222,7 @@ export const StreamForm = (props: StreamFormProps) => {
211222
<Grid size={{ lg: 3, md: 12, sm: 12, xs: 12 }}>
212223
<FormSubmitBar
213224
blockSubmit={
214-
selectedStreamStatus === streamStatus.Provisioning ||
215-
!selectedDestinations?.length
225+
isStreamStatusBlocking || !selectedDestinations?.length
216226
}
217227
connectionTested={destinationVerified}
218228
destinationType={destination?.type}

packages/manager/src/features/Delivery/Streams/StreamTableRow.tsx

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,9 +23,13 @@ interface StreamTableRowProps extends StreamHandlers {
2323
export const StreamTableRow = React.memo((props: StreamTableRowProps) => {
2424
const { stream, onDelete, onDisableOrEnable, onEdit } = props;
2525
const { id, status } = stream;
26-
const iconStatus = (
27-
['active', 'error', 'inactive'].includes(status) ? status : 'other'
28-
) as Status;
26+
const iconStatus = ((): Status => {
27+
if (status === 'failed') return 'error';
28+
if (['active', 'error', 'inactive'].includes(status)) {
29+
return status as Status;
30+
}
31+
return 'other';
32+
})();
2933

3034
return (
3135
<TableRow key={id}>
@@ -72,6 +76,10 @@ const humanizeStreamStatus = (status: StreamStatus) => {
7276
switch (status) {
7377
case 'active':
7478
return 'Active';
79+
case 'deactivating':
80+
return 'Deactivating';
81+
case 'failed':
82+
return 'Failed';
7583
case 'inactive':
7684
return 'Inactive';
7785
case 'provisioning':

packages/validation/src/delivery.schema.ts

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -351,11 +351,9 @@ const streamSchemaBase = object({
351351
.min(3, 'Stream name must have at least 3 characters.')
352352
.max(maxLength, maxLengthMessage)
353353
.required('Stream name is required.'),
354-
status: mixed<'active' | 'inactive' | 'provisioning'>().oneOf([
355-
'active',
356-
'inactive',
357-
'provisioning',
358-
]),
354+
status: mixed<
355+
'active' | 'deactivating' | 'failed' | 'inactive' | 'provisioning'
356+
>().oneOf(['active', 'deactivating', 'failed', 'inactive', 'provisioning']),
359357
type: string()
360358
.oneOf(['audit_logs', 'lke_audit_logs'])
361359
.required('Stream type is required.'),
@@ -372,8 +370,10 @@ export const createStreamSchema = streamSchemaBase;
372370
export const updateStreamSchema = streamSchemaBase
373371
.omit(['type'])
374372
.shape({
375-
status: mixed<'active' | 'inactive' | 'provisioning'>()
376-
.oneOf(['active', 'inactive', 'provisioning'])
373+
status: mixed<
374+
'active' | 'deactivating' | 'failed' | 'inactive' | 'provisioning'
375+
>()
376+
.oneOf(['active', 'deactivating', 'failed', 'inactive', 'provisioning'])
377377
.required(),
378378
details: lazy((value) => {
379379
if (

0 commit comments

Comments
 (0)