Skip to content

Commit

Permalink
Fixes elastic#9680 (wrong title when overwriting saved objects)
Browse files Browse the repository at this point in the history
  • Loading branch information
friol committed Aug 29, 2019
1 parent b727f6d commit 96d3640
Show file tree
Hide file tree
Showing 6 changed files with 74 additions and 38 deletions.
8 changes: 4 additions & 4 deletions src/core/server/saved_objects/import/extract_errors.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -21,13 +21,13 @@ import { SavedObject } from '../types';
import { extractErrors } from './extract_errors';

describe('extractErrors()', () => {
test('returns empty array when no errors exist', () => {
test('returns empty array when no errors exist', async () => {
const savedObjects: SavedObject[] = [];
const result = extractErrors(savedObjects, savedObjects);
const result = await extractErrors(savedObjects, savedObjects);
expect(result).toMatchInlineSnapshot(`Array []`);
});

test('extracts errors from saved objects', () => {
test('extracts errors from saved objects', async () => {
const savedObjects: SavedObject[] = [
{
id: '1',
Expand Down Expand Up @@ -62,7 +62,7 @@ describe('extractErrors()', () => {
},
},
];
const result = extractErrors(savedObjects, savedObjects);
const result = await extractErrors(savedObjects, savedObjects);
expect(result).toMatchInlineSnapshot(`
Array [
Object {
Expand Down
30 changes: 27 additions & 3 deletions src/core/server/saved_objects/import/extract_errors.ts
Original file line number Diff line number Diff line change
Expand Up @@ -16,15 +16,19 @@
* specific language governing permissions and limitations
* under the License.
*/
import { SavedObjectsClientContract } from 'src/core/server';
import { SavedObject } from '../types';
import { SavedObjectsImportError } from './types';

export function extractErrors(
export async function extractErrors(
savedObjectResults: SavedObject[],
savedObjectsToImport: SavedObject[]
savedObjectsToImport: SavedObject[],
savedObjectsClient?: SavedObjectsClientContract,
sourceSpaceId?: string
) {
const errors: SavedObjectsImportError[] = [];
const originalSavedObjectsMap = new Map<string, SavedObject>();

for (const savedObject of savedObjectsToImport) {
originalSavedObjectsMap.set(`${savedObject.type}:${savedObject.id}`, savedObject);
}
Expand All @@ -37,11 +41,31 @@ export function extractErrors(
originalSavedObject &&
originalSavedObject.attributes &&
originalSavedObject.attributes.title;

if (savedObject.error.statusCode === 409) {
// find the correct title of the saved object that conflicts, in order to use it in the message box
let realTitle = title;

if (savedObjectsClient) {
try {
if (sourceSpaceId !== undefined) {
const resp = await savedObjectsClient.get(savedObject.type, savedObject.id, {
namespace: sourceSpaceId,
});
realTitle = resp.attributes.title;
} else {
const resp = await savedObjectsClient.get(savedObject.type, savedObject.id);
realTitle = resp.attributes.title;
}
} catch (e) {
// this shouldn't go wrong, but we re-throw the exception just in case
throw e;
}
}
errors.push({
id: savedObject.id,
type: savedObject.type,
title,
title: realTitle,
error: {
type: 'conflict',
},
Expand Down
30 changes: 18 additions & 12 deletions src/core/server/saved_objects/import/import_saved_objects.ts
Original file line number Diff line number Diff line change
Expand Up @@ -26,14 +26,17 @@ import {
} from './types';
import { validateReferences } from './validate_references';

export async function importSavedObjects({
readStream,
objectLimit,
overwrite,
savedObjectsClient,
supportedTypes,
namespace,
}: SavedObjectsImportOptions): Promise<SavedObjectsImportResponse> {
export async function importSavedObjects(
{
readStream,
objectLimit,
overwrite,
savedObjectsClient,
supportedTypes,
namespace,
}: SavedObjectsImportOptions,
sourceSpaceId?: string
): Promise<SavedObjectsImportResponse> {
let errorAccumulator: SavedObjectsImportError[] = [];

// Get the objects to import
Expand Down Expand Up @@ -65,11 +68,14 @@ export async function importSavedObjects({
overwrite,
namespace,
});
errorAccumulator = [
...errorAccumulator,
...extractErrors(bulkCreateResult.saved_objects, filteredObjects),
];

const soErrors = await extractErrors(
bulkCreateResult.saved_objects,
filteredObjects,
savedObjectsClient,
sourceSpaceId
);
errorAccumulator = [...errorAccumulator, ...soErrors];
return {
success: errorAccumulator.length === 0,
successCount: bulkCreateResult.saved_objects.filter(obj => !obj.error).length,
Expand Down
14 changes: 6 additions & 8 deletions src/core/server/saved_objects/import/resolve_import_errors.ts
Original file line number Diff line number Diff line change
Expand Up @@ -89,20 +89,18 @@ export async function resolveImportErrors({
overwrite: true,
namespace,
});
errorAccumulator = [
...errorAccumulator,
...extractErrors(bulkCreateResult.saved_objects, objectsToOverwrite),
];

const extractErrs = await extractErrors(bulkCreateResult.saved_objects, objectsToOverwrite);
errorAccumulator = [...errorAccumulator, ...extractErrs];
successCount += bulkCreateResult.saved_objects.filter(obj => !obj.error).length;
}
if (objectsToNotOverwrite.length) {
const bulkCreateResult = await savedObjectsClient.bulkCreate(objectsToNotOverwrite, {
namespace,
});
errorAccumulator = [
...errorAccumulator,
...extractErrors(bulkCreateResult.saved_objects, objectsToNotOverwrite),
];

const extractErrs = await extractErrors(bulkCreateResult.saved_objects, objectsToNotOverwrite);
errorAccumulator = [...errorAccumulator, ...extractErrs];
successCount += bulkCreateResult.saved_objects.filter(obj => !obj.error).length;
}

Expand Down
5 changes: 4 additions & 1 deletion src/core/server/saved_objects/service/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,10 @@ export interface SavedObjectsService<Request = any> {
getSavedObjectsRepository(...rest: any[]): any;
importExport: {
objectLimit: number;
importSavedObjects(options: SavedObjectsImportOptions): Promise<SavedObjectsImportResponse>;
importSavedObjects(
options: SavedObjectsImportOptions,
srcSpaceId?: string
): Promise<SavedObjectsImportResponse>;
resolveImportErrors(
options: SavedObjectsResolveImportErrorsOptions
): Promise<SavedObjectsImportResponse>;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -44,17 +44,21 @@ export function copySavedObjectsToSpacesFactory(
const importObjectsToSpace = async (
spaceId: string,
objectsStream: Readable,
options: CopyOptions
options: CopyOptions,
srcSpaceId?: string
) => {
try {
const importResponse = await importExport.importSavedObjects({
namespace: spaceIdToNamespace(spaceId),
objectLimit: importExport.objectLimit,
overwrite: options.overwrite,
savedObjectsClient,
supportedTypes: eligibleTypes,
readStream: objectsStream,
});
const importResponse = await importExport.importSavedObjects(
{
namespace: spaceIdToNamespace(spaceId),
objectLimit: importExport.objectLimit,
overwrite: options.overwrite,
savedObjectsClient,
supportedTypes: eligibleTypes,
readStream: objectsStream,
},
srcSpaceId
);

return {
success: importResponse.success,
Expand All @@ -79,7 +83,8 @@ export function copySavedObjectsToSpacesFactory(
response[spaceId] = await importObjectsToSpace(
spaceId,
createReadableStreamFromArray(exportedSavedObjects),
options
options,
sourceSpaceId
);
}

Expand Down

0 comments on commit 96d3640

Please sign in to comment.