Skip to content

Commit 0fcf2fd

Browse files
Merge branch 'master' into implement/ftr-configured-users
2 parents 44ea132 + 7f901f9 commit 0fcf2fd

File tree

9 files changed

+89
-33
lines changed

9 files changed

+89
-33
lines changed
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
/*
2+
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
3+
* or more contributor license agreements. Licensed under the Elastic License;
4+
* you may not use this file except in compliance with the Elastic License.
5+
*/
6+
7+
export interface ErrorResponse {
8+
body: {
9+
statusCode: number;
10+
error: string;
11+
message: string;
12+
};
13+
name: string;
14+
}
15+
16+
export function isErrorResponse(arg: any): arg is ErrorResponse {
17+
return arg?.body?.error !== undefined && arg?.body?.message !== undefined;
18+
}

x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/analytics_list/columns.tsx

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -43,13 +43,13 @@ enum TASK_STATE_COLOR {
4343

4444
export const getTaskStateBadge = (
4545
state: DataFrameAnalyticsStats['state'],
46-
reason?: DataFrameAnalyticsStats['reason']
46+
failureReason?: DataFrameAnalyticsStats['failure_reason']
4747
) => {
4848
const color = TASK_STATE_COLOR[state];
4949

50-
if (isDataFrameAnalyticsFailed(state) && reason !== undefined) {
50+
if (isDataFrameAnalyticsFailed(state) && failureReason !== undefined) {
5151
return (
52-
<EuiToolTip content={reason}>
52+
<EuiToolTip content={failureReason}>
5353
<EuiBadge className="mlTaskStateBadge" color={color}>
5454
{state}
5555
</EuiBadge>
@@ -229,7 +229,7 @@ export const getColumns = (
229229
sortable: (item: DataFrameAnalyticsListRow) => item.stats.state,
230230
truncateText: true,
231231
render(item: DataFrameAnalyticsListRow) {
232-
return getTaskStateBadge(item.stats.state, item.stats.reason);
232+
return getTaskStateBadge(item.stats.state, item.stats.failure_reason);
233233
},
234234
width: '100px',
235235
'data-test-subj': 'mlAnalyticsTableColumnStatus',

x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/analytics_list/common.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ export interface DataFrameAnalyticsStats {
5050
transport_address: string;
5151
};
5252
progress: ProgressSection[];
53-
reason?: string;
53+
failure_reason?: string;
5454
state: DATA_FRAME_TASK_STATE;
5555
}
5656

x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/analytics_list/expanded_row.tsx

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ import {
2424
loadEvalData,
2525
Eval,
2626
} from '../../../../common';
27+
import { getTaskStateBadge } from './columns';
2728
import { isCompletedAnalyticsJob } from './common';
2829
import {
2930
isRegressionAnalysis,
@@ -157,8 +158,15 @@ export const ExpandedRow: FC<Props> = ({ item }) => {
157158
title: i18n.translate('xpack.ml.dataframe.analyticsList.expandedRow.tabs.jobSettings.state', {
158159
defaultMessage: 'State',
159160
}),
160-
items: Object.entries(stateValues).map(s => {
161-
return { title: s[0].toString(), description: getItemDescription(s[1]) };
161+
items: Object.entries(stateValues).map(([stateKey, stateValue]) => {
162+
const title = stateKey.toString();
163+
if (title === 'state') {
164+
return {
165+
title,
166+
description: getTaskStateBadge(getItemDescription(stateValue)),
167+
};
168+
}
169+
return { title, description: getItemDescription(stateValue) };
162170
}),
163171
position: 'left',
164172
};

x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/create_analytics_form/messages.tsx

Lines changed: 25 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -6,25 +6,34 @@
66

77
import React, { Fragment, FC } from 'react';
88

9-
import { EuiCallOut, EuiSpacer } from '@elastic/eui';
9+
import { EuiCallOut, EuiCodeBlock, EuiSpacer } from '@elastic/eui';
1010

1111
import { FormMessage } from '../../hooks/use_create_analytics_form/state'; // State
1212

1313
interface Props {
14-
messages: any; // TODO: fix --> something like State['requestMessages'];
14+
messages: FormMessage[];
1515
}
1616

17-
export const Messages: FC<Props> = ({ messages }) =>
18-
messages.map((requestMessage: FormMessage, i: number) => (
19-
<Fragment key={i}>
20-
<EuiCallOut
21-
title={requestMessage.message}
22-
color={requestMessage.error !== undefined ? 'danger' : 'primary'}
23-
iconType={requestMessage.error !== undefined ? 'alert' : 'checkInCircleFilled'}
24-
size="s"
25-
>
26-
{requestMessage.error !== undefined ? <p>{requestMessage.error}</p> : null}
27-
</EuiCallOut>
28-
<EuiSpacer size="s" />
29-
</Fragment>
30-
));
17+
export const Messages: FC<Props> = ({ messages }) => {
18+
return (
19+
<>
20+
{messages.map((requestMessage, i) => (
21+
<Fragment key={i}>
22+
<EuiCallOut
23+
title={requestMessage.message}
24+
color={requestMessage.error !== undefined ? 'danger' : 'primary'}
25+
iconType={requestMessage.error !== undefined ? 'alert' : 'checkInCircleFilled'}
26+
size="s"
27+
>
28+
{requestMessage.error !== undefined && (
29+
<EuiCodeBlock language="json" fontSize="s" paddingSize="s" isCopyable>
30+
{requestMessage.error}
31+
</EuiCodeBlock>
32+
)}
33+
</EuiCallOut>
34+
<EuiSpacer size="s" />
35+
</Fragment>
36+
))}
37+
</>
38+
);
39+
};

x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/hooks/use_create_analytics_form/use_create_analytics_form.test.tsx

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -22,16 +22,23 @@ const getMountedHook = () =>
2222

2323
describe('getErrorMessage()', () => {
2424
test('verify error message response formats', () => {
25-
const errorMessage = getErrorMessage(new Error('the-error-message'));
26-
expect(errorMessage).toBe('the-error-message');
25+
const customError1 = {
26+
body: { statusCode: 403, error: 'Forbidden', message: 'the-error-message' },
27+
};
28+
const errorMessage1 = getErrorMessage(customError1);
29+
expect(errorMessage1).toBe('Forbidden: the-error-message');
2730

28-
const customError1 = { customErrorMessage: 'the-error-message' };
29-
const errorMessageMessage1 = getErrorMessage(customError1);
30-
expect(errorMessageMessage1).toBe('{"customErrorMessage":"the-error-message"}');
31+
const customError2 = new Error('the-error-message');
32+
const errorMessage2 = getErrorMessage(customError2);
33+
expect(errorMessage2).toBe('the-error-message');
3134

32-
const customError2 = { message: 'the-error-message' };
33-
const errorMessageMessage2 = getErrorMessage(customError2);
34-
expect(errorMessageMessage2).toBe('the-error-message');
35+
const customError3 = { customErrorMessage: 'the-error-message' };
36+
const errorMessage3 = getErrorMessage(customError3);
37+
expect(errorMessage3).toBe('{"customErrorMessage":"the-error-message"}');
38+
39+
const customError4 = { message: 'the-error-message' };
40+
const errorMessage4 = getErrorMessage(customError4);
41+
expect(errorMessage4).toBe('the-error-message');
3542
});
3643
});
3744

x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/hooks/use_create_analytics_form/use_create_analytics_form.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import { useReducer } from 'react';
99
import { i18n } from '@kbn/i18n';
1010

1111
import { SimpleSavedObject } from 'kibana/public';
12+
import { isErrorResponse } from '../../../../../../../common/types/errors';
1213
import { ml } from '../../../../../services/ml_api_service';
1314
import { useMlContext } from '../../../../../contexts/ml';
1415

@@ -40,6 +41,10 @@ export interface CreateAnalyticsFormProps {
4041
}
4142

4243
export function getErrorMessage(error: any) {
44+
if (isErrorResponse(error)) {
45+
return `${error.body.error}: ${error.body.message}`;
46+
}
47+
4348
if (typeof error === 'object' && typeof error.message === 'string') {
4449
return error.message;
4550
}

x-pack/plugins/ml/public/application/datavisualizer/file_based/components/file_datavisualizer_view/file_datavisualizer_view.js

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ import { FileCouldNotBeRead, FileTooLarge } from './file_error_callouts';
1919
import { EditFlyout } from '../edit_flyout';
2020
import { ImportView } from '../import_view';
2121
import { MAX_BYTES } from '../../../../../../common/constants/file_datavisualizer';
22+
import { isErrorResponse } from '../../../../../../common/types/errors';
2223
import {
2324
readFile,
2425
createUrlOverrides,
@@ -177,12 +178,20 @@ export class FileDataVisualizerView extends Component {
177178
});
178179
} catch (error) {
179180
console.error(error);
181+
182+
let serverErrorMsg;
183+
if (isErrorResponse(error) === true) {
184+
serverErrorMsg = `${error.body.error}: ${error.body.message}`;
185+
} else {
186+
serverErrorMsg = JSON.stringify(error, null, 2);
187+
}
188+
180189
this.setState({
181190
results: undefined,
182191
loaded: false,
183192
loading: false,
184193
fileCouldNotBeRead: true,
185-
serverErrorMessage: error.message,
194+
serverErrorMessage: serverErrorMsg,
186195
});
187196

188197
// as long as the previous overrides are different to the current overrides,

x-pack/plugins/ml/public/application/overview/components/analytics_panel/table.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ export const AnalyticsTable: FC<Props> = ({ items }) => {
6161
sortable: (item: DataFrameAnalyticsListRow) => item.stats.state,
6262
truncateText: true,
6363
render(item: DataFrameAnalyticsListRow) {
64-
return getTaskStateBadge(item.stats.state, item.stats.reason);
64+
return getTaskStateBadge(item.stats.state, item.stats.failure_reason);
6565
},
6666
width: '100px',
6767
},

0 commit comments

Comments
 (0)