Skip to content

Commit b27d3f6

Browse files
committed
Add error handling to top-level pages; filter out index_not_found_exception
Signed-off-by: Tyler Ohlsen <ohltyler@amazon.com>
1 parent 2a9f3a7 commit b27d3f6

File tree

8 files changed

+39
-24
lines changed

8 files changed

+39
-24
lines changed

common/constants.ts

+1
Original file line numberDiff line numberDiff line change
@@ -64,3 +64,4 @@ export const FETCH_ALL_QUERY_BODY = {
6464
},
6565
size: 1000,
6666
};
67+
export const INDEX_NOT_FOUND_EXCEPTION = 'index_not_found_exception';

public/pages/workflow_detail/component_details/input_fields/text_field.tsx

+4-6
Original file line numberDiff line numberDiff line change
@@ -57,12 +57,10 @@ export function TextField(props: TextFieldProps) {
5757
placeholder={props.field.placeholder || ''}
5858
compressed={false}
5959
value={field.value || getInitialValue(props.field.type)}
60-
onChange={(e) => form.setFieldValue(formField, e.target.value)}
61-
// This is a design decision to only trigger form updates onBlur() instead
62-
// of onChange(). This is to rate limit the number of updates & re-renders made, as users
63-
// typically rapidly type things into a text box, which would consequently trigger
64-
// onChange() much more often.
65-
onBlur={() => props.onFormChange()}
60+
onChange={(e) => {
61+
form.setFieldValue(formField, e.target.value);
62+
props.onFormChange();
63+
}}
6664
/>
6765
</EuiFormRow>
6866
);

public/pages/workflow_detail/components/header.tsx

+5-8
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ import React from 'react';
77
import {
88
EuiPageHeader,
99
EuiButton,
10-
EuiLoadingSpinner,
1110
EuiFlexGroup,
1211
EuiFlexItem,
1312
EuiText,
@@ -26,13 +25,11 @@ interface WorkflowDetailHeaderProps {
2625

2726
export function WorkflowDetailHeader(props: WorkflowDetailHeaderProps) {
2827
function getTitle() {
29-
return props.workflow ? (
30-
props.workflow.name
31-
) : props.isNewWorkflow && !props.workflow ? (
32-
DEFAULT_NEW_WORKFLOW_NAME
33-
) : (
34-
<EuiLoadingSpinner size="xl" />
35-
);
28+
return props.workflow
29+
? props.workflow.name
30+
: props.isNewWorkflow && !props.workflow
31+
? DEFAULT_NEW_WORKFLOW_NAME
32+
: '';
3633
}
3734

3835
function getState() {

public/pages/workflow_detail/workflow_detail.tsx

+9-1
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ function replaceActiveTab(activeTab: string, props: WorkflowDetailProps) {
6363

6464
export function WorkflowDetail(props: WorkflowDetailProps) {
6565
const dispatch = useAppDispatch();
66-
const { workflows, cachedWorkflow } = useSelector(
66+
const { workflows, cachedWorkflow, errorMessage } = useSelector(
6767
(state: AppState) => state.workflows
6868
);
6969

@@ -115,6 +115,14 @@ export function WorkflowDetail(props: WorkflowDetailProps) {
115115
dispatch(searchModels(FETCH_ALL_QUERY_BODY));
116116
}, []);
117117

118+
// Show a toast if an error message exists in state
119+
useEffect(() => {
120+
if (errorMessage) {
121+
console.error(errorMessage);
122+
getCore().notifications.toasts.addDanger(errorMessage);
123+
}
124+
}, [errorMessage]);
125+
118126
const tabs = [
119127
{
120128
id: WORKFLOW_DETAILS_TAB.EDITOR,

public/pages/workflow_detail/workspace/resizable_workspace.tsx

-8
Original file line numberDiff line numberDiff line change
@@ -343,8 +343,6 @@ export function ResizableWorkspace(props: ResizableWorkspaceProps) {
343343
setIsDeprovisioning(false);
344344
})
345345
.catch((error: any) => {
346-
// TODO: process error (toast msg?)
347-
console.log('error: ', error);
348346
setIsDeprovisioning(false);
349347
});
350348
} else {
@@ -369,8 +367,6 @@ export function ResizableWorkspace(props: ResizableWorkspaceProps) {
369367
setIsProvisioning(false);
370368
})
371369
.catch((error: any) => {
372-
// TODO: process error (toast msg?)
373-
console.log('error: ', error);
374370
setIsProvisioning(false);
375371
});
376372
} else {
@@ -407,8 +403,6 @@ export function ResizableWorkspace(props: ResizableWorkspaceProps) {
407403
setIsSaving(false);
408404
})
409405
.catch((error: any) => {
410-
// TODO: process error (toast msg?)
411-
console.log('error: ', error);
412406
setIsSaving(false);
413407
});
414408
} else {
@@ -420,8 +414,6 @@ export function ResizableWorkspace(props: ResizableWorkspaceProps) {
420414
history.go(0);
421415
})
422416
.catch((error: any) => {
423-
// TODO: process error (toast msg?)
424-
console.log('error: ', error);
425417
setIsSaving(false);
426418
});
427419
}

public/pages/workflows/workflows.tsx

+9-1
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ function replaceActiveTab(activeTab: string, props: WorkflowsProps) {
5050
*/
5151
export function Workflows(props: WorkflowsProps) {
5252
const dispatch = useAppDispatch();
53-
const { workflows, loading } = useSelector(
53+
const { workflows, loading, errorMessage } = useSelector(
5454
(state: AppState) => state.workflows
5555
);
5656

@@ -84,6 +84,14 @@ export function Workflows(props: WorkflowsProps) {
8484
]);
8585
});
8686

87+
// Show a toast if an error message exists in state
88+
useEffect(() => {
89+
if (errorMessage) {
90+
console.error(errorMessage);
91+
getCore().notifications.toasts.addDanger(errorMessage);
92+
}
93+
}, [errorMessage]);
94+
8795
// On initial render: fetch all workflows
8896
useEffect(() => {
8997
dispatch(searchWorkflows(FETCH_ALL_QUERY_BODY));

server/routes/flow_framework_routes_service.ts

+5
Original file line numberDiff line numberDiff line change
@@ -25,13 +25,15 @@ import {
2525
UPDATE_WORKFLOW_NODE_API_PATH,
2626
WORKFLOW_STATE,
2727
Workflow,
28+
WorkflowDict,
2829
WorkflowTemplate,
2930
validateWorkflowTemplate,
3031
} from '../../common';
3132
import {
3233
generateCustomError,
3334
getWorkflowStateFromResponse,
3435
getWorkflowsFromResponses,
36+
isIgnorableError,
3537
} from './helpers';
3638

3739
/**
@@ -196,6 +198,9 @@ export class FlowFrameworkRoutesService {
196198
);
197199
return res.ok({ body: { workflows: workflowDict } });
198200
} catch (err: any) {
201+
if (isIgnorableError(err)) {
202+
return res.ok({ body: { workflows: {} as WorkflowDict } });
203+
}
199204
return generateCustomError(res, err);
200205
}
201206
};

server/routes/helpers.ts

+6
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55

66
import {
77
DEFAULT_NEW_WORKFLOW_STATE_TYPE,
8+
INDEX_NOT_FOUND_EXCEPTION,
89
Model,
910
ModelDict,
1011
WORKFLOW_STATE,
@@ -26,6 +27,11 @@ export function generateCustomError(res: any, err: any) {
2627
});
2728
}
2829

30+
// Helper fn to filter out backend errors that we don't want to propagate on the frontend.
31+
export function isIgnorableError(error: any): boolean {
32+
return error.body?.error?.type === INDEX_NOT_FOUND_EXCEPTION;
33+
}
34+
2935
function toWorkflowObj(workflowHit: any): Workflow {
3036
// TODO: update schema parsing after hit schema has been updated.
3137
// https://github.com/opensearch-project/flow-framework/issues/546

0 commit comments

Comments
 (0)