Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Bug 5861 Fix: fix import api always display overwritten after importing saved objects, after this fix, the first time import will display new and after that will display overwritten if import the same objects #5871

Merged
merged 9 commits into from
Feb 16, 2024
Next Next commit
bug fix 5861
Signed-off-by: yujin-emma <yujin.emma.work@gmail.com>
  • Loading branch information
yujin-emma committed Feb 12, 2024
commit abc69112e8d3b5ab86cb722b0756afc6f9f106e7
Original file line number Diff line number Diff line change
Expand Up @@ -18,13 +18,13 @@ interface ImportIdMapEntry {
}

/**
* function to check the conflict when multiple data sources are enabled.
* function to only check the data souerce conflict when multiple data sources are enabled.
* the purpose of this function is to check the conflict of the imported saved objects and data source
* @param objects, this the array of saved objects to be verified whether contains the data source conflict
* @param ignoreRegularConflicts whether to override
* @param retries import operations list
* @param dataSourceId the id to identify the data source
* @returns {filteredObjects, errors, importIdMap, pendingOverwrites }
* @returns {filteredObjects, errors, importIdMap }
*/
export async function checkConflictsForDataSource({
objects,
Expand All @@ -35,11 +35,9 @@ export async function checkConflictsForDataSource({
const filteredObjects: Array<SavedObject<{ title?: string }>> = [];
const errors: SavedObjectsImportError[] = [];
const importIdMap = new Map<string, ImportIdMapEntry>();
const pendingOverwrites = new Set<string>();

// exit early if there are no objects to check
if (objects.length === 0) {
return { filteredObjects, errors, importIdMap, pendingOverwrites };
return { filteredObjects, errors, importIdMap };
}
const retryMap = retries.reduce(
(acc, cur) => acc.set(`${cur.type}:${cur.id}`, cur),
Expand Down Expand Up @@ -73,13 +71,15 @@ export async function checkConflictsForDataSource({
} else if (previoudDataSourceId && previoudDataSourceId === dataSourceId) {
filteredObjects.push(object);
} else {
/**
* Only update importIdMap and filtered objects
*/
const omitOriginId = ignoreRegularConflicts;
importIdMap.set(`${type}:${id}`, { id: `${dataSourceId}_${rawId}`, omitOriginId });
pendingOverwrites.add(`${type}:${id}`);
filteredObjects.push({ ...object, id: `${dataSourceId}_${rawId}` });
}
}
});

return { filteredObjects, errors, importIdMap, pendingOverwrites };
return { filteredObjects, errors, importIdMap };
}
Original file line number Diff line number Diff line change
Expand Up @@ -86,7 +86,6 @@ describe('#importSavedObjectsFromStream', () => {
errors: [],
filteredObjects: [],
importIdMap: new Map(),
pendingOverwrites: new Set(),
});
getMockFn(createSavedObjects).mockResolvedValue({ errors: [], createdObjects: [] });
});
Expand Down Expand Up @@ -500,7 +499,6 @@ describe('#importSavedObjectsFromStream', () => {
errors: [],
filteredObjects: [],
importIdMap: new Map(),
pendingOverwrites: new Set([`${dsSuccess2.type}:${dsSuccess2.id}`]),
});
getMockFn(checkConflicts).mockResolvedValue({
errors: [],
Expand Down
29 changes: 13 additions & 16 deletions src/core/server/saved_objects/import/import_saved_objects.ts
Original file line number Diff line number Diff line change
Expand Up @@ -94,22 +94,6 @@ export async function importSavedObjectsFromStream({
ignoreRegularConflicts: overwrite,
};

// resolve when data source exist, pass the filtered objects to next check conflict
if (dataSourceId) {
const checkConflictsForDataSourceResult = await checkConflictsForDataSource({
objects: collectSavedObjectsResult.collectedObjects,
ignoreRegularConflicts: overwrite,
dataSourceId,
});

checkConflictsParams.objects = checkConflictsForDataSourceResult.filteredObjects;

pendingOverwrites = new Set([
...pendingOverwrites,
...checkConflictsForDataSourceResult.pendingOverwrites,
]);
}

const checkConflictsResult = await checkConflicts(checkConflictsParams);
errorAccumulator = [...errorAccumulator, ...checkConflictsResult.errors];
importIdMap = new Map([...importIdMap, ...checkConflictsResult.importIdMap]);
Expand All @@ -124,6 +108,19 @@ export async function importSavedObjectsFromStream({
ignoreRegularConflicts: overwrite,
importIdMap,
};

/**
* If dataSourceId exist,
*/
if (dataSourceId) {
const checkConflictsForDataSourceResult = await checkConflictsForDataSource({
objects: checkConflictsResult.filteredObjects,
ignoreRegularConflicts: overwrite,
dataSourceId,
});
checkOriginConflictsParams.objects = checkConflictsForDataSourceResult.filteredObjects;
}

const checkOriginConflictsResult = await checkOriginConflicts(checkOriginConflictsParams);
errorAccumulator = [...errorAccumulator, ...checkOriginConflictsResult.errors];
importIdMap = new Map([...importIdMap, ...checkOriginConflictsResult.importIdMap]);
Expand Down