Skip to content

Commit 2eca36f

Browse files
[ML] Handling data recognizer saved object errors (#72447) (#72631)
* [ML] Handling data recognizer saved object errors * adding text for unknown errors * fixing typos
1 parent e06dd30 commit 2eca36f

File tree

4 files changed

+36
-4
lines changed

4 files changed

+36
-4
lines changed

x-pack/plugins/ml/common/types/capabilities.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ export function getPluginPrivileges() {
8181
catalogue: [PLUGIN_ID],
8282
savedObject: {
8383
all: [],
84-
read: ['index-pattern', 'search'],
84+
read: ['index-pattern', 'dashboard', 'search', 'visualization'],
8585
},
8686
};
8787

x-pack/plugins/ml/common/types/modules.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ export interface KibanaObject {
3030
title: string;
3131
config: KibanaObjectConfig;
3232
exists?: boolean;
33+
error?: any;
3334
}
3435

3536
export interface KibanaObjects {

x-pack/plugins/ml/public/application/jobs/new_job/recognize/components/kibana_objects.tsx

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ export const KibanaObjects: FC<KibanaObjectItemProps> = memo(
4646
</EuiTitle>
4747
<EuiSpacer size="s" />
4848
<ul>
49-
{kibanaObjects.map(({ id, title, success, exists }, i) => (
49+
{kibanaObjects.map(({ id, title, success, exists, error }, i) => (
5050
<li key={id}>
5151
<EuiFlexGroup alignItems="center" gutterSize="s">
5252
<EuiFlexItem>
@@ -55,6 +55,11 @@ export const KibanaObjects: FC<KibanaObjectItemProps> = memo(
5555
<EuiText size="s" color={exists ? 'subdued' : 'secondary'}>
5656
{title}
5757
</EuiText>
58+
{success === false && error !== undefined && (
59+
<EuiText size="xs" color="danger">
60+
{error.message}
61+
</EuiText>
62+
)}
5863
</EuiFlexItem>
5964
{exists && (
6065
<EuiFlexItem grow={false}>

x-pack/plugins/ml/server/models/data_recognizer/data_recognizer.ts

Lines changed: 28 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,7 @@ export interface RecognizeResult {
9393
interface ObjectExistResult {
9494
id: string;
9595
type: string;
96+
exists?: boolean;
9697
}
9798

9899
interface ObjectExistResponse {
@@ -493,7 +494,13 @@ export class DataRecognizer {
493494
// update the exists flag in the results
494495
this.updateKibanaResults(results.kibana, savedObjects);
495496
// create the savedObjects
496-
saveResults.savedObjects = await this.saveKibanaObjects(savedObjects);
497+
try {
498+
saveResults.savedObjects = await this.saveKibanaObjects(savedObjects);
499+
} catch (error) {
500+
// only one error is returned for the bulk create saved object request
501+
// so populate every saved object with the same error.
502+
this.populateKibanaResultErrors(results.kibana, error.output?.payload);
503+
}
497504
}
498505
// merge all the save results
499506
this.updateResults(results, saveResults);
@@ -610,7 +617,26 @@ export class DataRecognizer {
610617
(type) => {
611618
kibanaSaveResults[type].forEach((resultItem) => {
612619
const i = objectExistResults.find((o) => o.id === resultItem.id && o.type === type);
613-
resultItem.exists = i !== undefined;
620+
resultItem.exists = i !== undefined && i.exists;
621+
});
622+
}
623+
);
624+
}
625+
626+
// add an error object to every kibana saved object,
627+
// if it doesn't already exist.
628+
populateKibanaResultErrors(
629+
kibanaSaveResults: DataRecognizerConfigResponse['kibana'],
630+
error: any
631+
) {
632+
const errorObj =
633+
error === undefined ? { message: 'Unknown error when creating saved object' } : error;
634+
(Object.keys(kibanaSaveResults) as Array<keyof DataRecognizerConfigResponse['kibana']>).forEach(
635+
(type) => {
636+
kibanaSaveResults[type].forEach((resultItem) => {
637+
if (resultItem.exists === false) {
638+
resultItem.error = errorObj;
639+
}
614640
});
615641
}
616642
);

0 commit comments

Comments
 (0)