Skip to content

Commit 9407595

Browse files
change: [DPS-41857] - Logs: Add new statuses - deactivating, failed (#13551)
1 parent f62fd99 commit 9407595

8 files changed

Lines changed: 115 additions & 59 deletions

File tree

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;
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"@linode/manager": Added
3+
---
4+
5+
New stream statuses - deactivating, failed ([#13551](https://github.com/linode/manager/pull/13551))

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: 8 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
{
@@ -30,9 +31,12 @@ export const StreamActionMenu = (props: StreamActionMenuProps) => {
3031
onClick: () => {
3132
onDisableOrEnable(stream);
3233
},
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,
34+
title: status === streamStatus.Active ? 'Deactivate' : 'Activate',
35+
pendoId: `Logs Delivery Streams-${status === streamStatus.Active ? 'Deactivate' : 'Activate'}`,
36+
disabled:
37+
status === streamStatus.Deactivating ||
38+
status === streamStatus.Failed ||
39+
status === streamStatus.Provisioning,
3640
},
3741
{
3842
onClick: () => {
@@ -46,7 +50,7 @@ export const StreamActionMenu = (props: StreamActionMenuProps) => {
4650
return (
4751
<ActionMenu
4852
actionsList={menuActions}
49-
ariaLabel={`Action menu for Stream ${stream.label}`}
53+
ariaLabel={`Action menu for Stream ${label}`}
5054
pendoId="Logs Delivery Streams-Action Menu"
5155
/>
5256
);

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

Lines changed: 57 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,
@@ -241,47 +242,63 @@ describe('StreamEdit', () => {
241242
});
242243
});
243244

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

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(() => {
@@ -212,8 +223,7 @@ export const StreamForm = (props: StreamFormProps) => {
212223
<Grid size={{ lg: 3, md: 12, sm: 12, xs: 12 }}>
213224
<FormSubmitBar
214225
blockSubmit={
215-
selectedStreamStatus === streamStatus.Provisioning ||
216-
!selectedDestinations?.length
226+
isStreamStatusBlocking || !selectedDestinations?.length
217227
}
218228
connectionTested={destinationVerified}
219229
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)