From af9d69829d360edb1dde1fd70f1bb94ec1f05428 Mon Sep 17 00:00:00 2001 From: "opensearch-workspace-development[bot]" <144193788+opensearch-workspace-development[bot]@users.noreply.github.com> Date: Tue, 12 Sep 2023 12:57:50 +0800 Subject: [PATCH] Add workspaces parameter to resolve_import_errors API (#133) (#143) * Add workspaces parameter to resolve_import_errors API * Fix bug * Simplify some code --------- (cherry picked from commit 1250357f7bbfdb03cf92bcb2f51dd80370b80a87) Signed-off-by: gaobinlong Signed-off-by: github-actions[bot] Co-authored-by: github-actions[bot] --- .../saved_objects/import/resolve_import_errors.ts | 3 +++ src/core/server/saved_objects/import/types.ts | 2 ++ src/core/server/saved_objects/routes/import.ts | 7 ++++--- .../saved_objects/routes/resolve_import_errors.ts | 9 +++++++++ .../public/lib/resolve_import_errors.ts | 15 ++++++++++++--- .../objects_table/components/flyout.tsx | 2 ++ 6 files changed, 32 insertions(+), 6 deletions(-) diff --git a/src/core/server/saved_objects/import/resolve_import_errors.ts b/src/core/server/saved_objects/import/resolve_import_errors.ts index 162410c4ce9b..5bad2e4907b8 100644 --- a/src/core/server/saved_objects/import/resolve_import_errors.ts +++ b/src/core/server/saved_objects/import/resolve_import_errors.ts @@ -59,6 +59,7 @@ export async function resolveSavedObjectsImportErrors({ typeRegistry, namespace, createNewCopies, + workspaces, }: SavedObjectsResolveImportErrorsOptions): Promise { // throw a BadRequest error if we see invalid retries validateRetries(retries); @@ -126,6 +127,7 @@ export async function resolveSavedObjectsImportErrors({ namespace, retries, createNewCopies, + workspaces, }; const checkConflictsResult = await checkConflicts(checkConflictsParams); errorAccumulator = [...errorAccumulator, ...checkConflictsResult.errors]; @@ -157,6 +159,7 @@ export async function resolveSavedObjectsImportErrors({ importIdMap, namespace, overwrite, + workspaces, }; const { createdObjects, errors: bulkCreateErrors } = await createSavedObjects( createSavedObjectsParams diff --git a/src/core/server/saved_objects/import/types.ts b/src/core/server/saved_objects/import/types.ts index ab13fbfe4658..924d1b18895a 100644 --- a/src/core/server/saved_objects/import/types.ts +++ b/src/core/server/saved_objects/import/types.ts @@ -210,6 +210,8 @@ export interface SavedObjectsResolveImportErrorsOptions { namespace?: string; /** If true, will create new copies of import objects, each with a random `id` and undefined `originId`. */ createNewCopies: boolean; + /** if specified, will import in given workspaces, else will import as global object */ + workspaces?: string[]; } export type CreatedObject = SavedObject & { destinationId?: string }; diff --git a/src/core/server/saved_objects/routes/import.ts b/src/core/server/saved_objects/routes/import.ts index 60e6cb254ee5..2d221d2d47bc 100644 --- a/src/core/server/saved_objects/routes/import.ts +++ b/src/core/server/saved_objects/routes/import.ts @@ -94,9 +94,10 @@ export const registerImportRoute = (router: IRouter, config: SavedObjectConfig) }); } - const workspaces = req.query.workspaces - ? Array().concat(req.query.workspaces) - : undefined; + let workspaces = req.query.workspaces; + if (typeof workspaces === 'string') { + workspaces = [workspaces]; + } const result = await importSavedObjectsFromStream({ savedObjectsClient: context.core.savedObjects.client, diff --git a/src/core/server/saved_objects/routes/resolve_import_errors.ts b/src/core/server/saved_objects/routes/resolve_import_errors.ts index 5e07125671f1..32d67b5ae8ab 100644 --- a/src/core/server/saved_objects/routes/resolve_import_errors.ts +++ b/src/core/server/saved_objects/routes/resolve_import_errors.ts @@ -58,6 +58,9 @@ export const registerResolveImportErrorsRoute = (router: IRouter, config: SavedO validate: { query: schema.object({ createNewCopies: schema.boolean({ defaultValue: false }), + workspaces: schema.maybe( + schema.oneOf([schema.string(), schema.arrayOf(schema.string())]) + ), }), body: schema.object({ file: schema.stream(), @@ -98,6 +101,11 @@ export const registerResolveImportErrorsRoute = (router: IRouter, config: SavedO }); } + let workspaces = req.query.workspaces; + if (typeof workspaces === 'string') { + workspaces = [workspaces]; + } + const result = await resolveSavedObjectsImportErrors({ typeRegistry: context.core.savedObjects.typeRegistry, savedObjectsClient: context.core.savedObjects.client, @@ -105,6 +113,7 @@ export const registerResolveImportErrorsRoute = (router: IRouter, config: SavedO retries: req.body.retries, objectLimit: maxImportExportSize, createNewCopies: req.query.createNewCopies, + workspaces, }); return res.ok({ body: result }); diff --git a/src/plugins/saved_objects_management/public/lib/resolve_import_errors.ts b/src/plugins/saved_objects_management/public/lib/resolve_import_errors.ts index 34b0dfa5be0b..f1f64a01c721 100644 --- a/src/plugins/saved_objects_management/public/lib/resolve_import_errors.ts +++ b/src/plugins/saved_objects_management/public/lib/resolve_import_errors.ts @@ -89,12 +89,13 @@ async function callResolveImportErrorsApi( http: HttpStart, file: File, retries: any, - createNewCopies: boolean + createNewCopies: boolean, + workspaces?: string[] ): Promise { const formData = new FormData(); formData.append('file', file); formData.append('retries', JSON.stringify(retries)); - const query = createNewCopies ? { createNewCopies } : {}; + const query = createNewCopies ? { createNewCopies, workspaces } : { workspaces }; return http.post('/api/saved_objects/_resolve_import_errors', { headers: { // Important to be undefined, it forces proper headers to be set for FormData @@ -167,6 +168,7 @@ export async function resolveImportErrors({ http, getConflictResolutions, state, + workspaces, }: { http: HttpStart; getConflictResolutions: ( @@ -180,6 +182,7 @@ export async function resolveImportErrors({ file?: File; importMode: { createNewCopies: boolean; overwrite: boolean }; }; + workspaces?: string[]; }) { const retryDecisionCache = new Map(); const replaceReferencesCache = new Map(); @@ -264,7 +267,13 @@ export async function resolveImportErrors({ } // Call API - const response = await callResolveImportErrorsApi(http, file!, retries, createNewCopies); + const response = await callResolveImportErrorsApi( + http, + file!, + retries, + createNewCopies, + workspaces + ); importCount = response.successCount; // reset the success count since we retry all successful results each time failedImports = []; for (const { error, ...obj } of response.errors || []) { diff --git a/src/plugins/saved_objects_management/public/management_section/objects_table/components/flyout.tsx b/src/plugins/saved_objects_management/public/management_section/objects_table/components/flyout.tsx index 6b243788a9e9..35b97979a93b 100644 --- a/src/plugins/saved_objects_management/public/management_section/objects_table/components/flyout.tsx +++ b/src/plugins/saved_objects_management/public/management_section/objects_table/components/flyout.tsx @@ -249,12 +249,14 @@ export class Flyout extends Component { status: 'loading', loadingMessage: undefined, }); + const { workspaces } = this.props; try { const updatedState = await resolveImportErrors({ http: this.props.http, state: this.state, getConflictResolutions: this.getConflictResolutions, + workspaces, }); this.setState(updatedState); } catch (e) {