Fix more broken usages of bulkCreate (#76005)

This commit is contained in:
Joe Portner 2020-08-27 13:54:09 -04:00 committed by GitHub
parent 165752b05f
commit c31acce649
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 31 additions and 6 deletions

View file

@ -62,9 +62,12 @@ class SavedObjectsInstallerUi extends React.Component {
let resp;
try {
resp = await this.props.bulkCreate(this.props.savedObjects, {
overwrite: this.state.overwrite,
});
// Filter out the saved object version field, if present, to avoid inadvertently triggering optimistic concurrency control.
const objectsToCreate = this.props.savedObjects.map(
// eslint-disable-next-line no-unused-vars
({ version, ...savedObject }) => savedObject
);
resp = await this.props.bulkCreate(objectsToCreate, { overwrite: this.state.overwrite });
} catch (error) {
if (!this._isMounted) {
return;

View file

@ -79,4 +79,25 @@ describe('bulkCreate', () => {
expect(component).toMatchSnapshot();
});
test('should filter out saved object version before calling bulkCreate', async () => {
const bulkCreateMock = jest.fn().mockResolvedValue({
savedObjects: [savedObject],
});
const component = mountWithIntl(
<SavedObjectsInstaller.WrappedComponent
bulkCreate={bulkCreateMock}
savedObjects={[{ ...savedObject, version: 'foo' }]}
/>
);
findTestSubject(component, 'loadSavedObjects').simulate('click');
// Ensure all promises resolve
await new Promise((resolve) => process.nextTick(resolve));
// Ensure the state changes are reflected
component.update();
expect(bulkCreateMock).toHaveBeenCalledWith([savedObject], expect.any(Object));
});
});

View file

@ -20,6 +20,7 @@ import { getAuthorizationHeader } from '../../lib/request_authorization';
import { MlInfoResponse } from '../../../common/types/ml_server_info';
import {
KibanaObjects,
KibanaObjectConfig,
ModuleDataFeed,
ModuleJob,
Module,
@ -100,7 +101,7 @@ interface ObjectExistResponse {
id: string;
type: string;
exists: boolean;
savedObject?: any;
savedObject?: { id: string; type: string; attributes: KibanaObjectConfig };
}
interface SaveResults {
@ -678,14 +679,14 @@ export class DataRecognizer {
let results = { saved_objects: [] as any[] };
const filteredSavedObjects = objectExistResults
.filter((o) => o.exists === false)
.map((o) => o.savedObject);
.map((o) => o.savedObject!);
if (filteredSavedObjects.length) {
results = await this.savedObjectsClient.bulkCreate(
// Add an empty migrationVersion attribute to each saved object to ensure
// it is automatically migrated to the 7.0+ format with a references attribute.
filteredSavedObjects.map((doc) => ({
...doc,
migrationVersion: doc.migrationVersion || {},
migrationVersion: {},
}))
);
}