diff --git a/x-pack/plugins/fleet/server/services/epm/kibana/assets/install.ts b/x-pack/plugins/fleet/server/services/epm/kibana/assets/install.ts index 2cf665e0fc094..b9f398d454499 100644 --- a/x-pack/plugins/fleet/server/services/epm/kibana/assets/install.ts +++ b/x-pack/plugins/fleet/server/services/epm/kibana/assets/install.ts @@ -163,7 +163,7 @@ export async function installKibanaAssetsAndReferences({ kibanaAssets ); - await installKibanaAssets({ + const importedAssets = await installKibanaAssets({ logger, savedObjectsImporter, pkgName, @@ -177,6 +177,7 @@ export async function installKibanaAssetsAndReferences({ pkgTitle, pkgName, spaceId, + importedAssets, }) ); @@ -292,7 +293,6 @@ export async function installKibanaSavedObjects({ overwrite: true, readStream: createListStream(toBeSavedObjects), createNewCopies: false, - refresh: false, }) ); diff --git a/x-pack/plugins/fleet/server/services/epm/kibana/assets/tag_assets.test.ts b/x-pack/plugins/fleet/server/services/epm/kibana/assets/tag_assets.test.ts index d887631240175..5471381686963 100644 --- a/x-pack/plugins/fleet/server/services/epm/kibana/assets/tag_assets.test.ts +++ b/x-pack/plugins/fleet/server/services/epm/kibana/assets/tag_assets.test.ts @@ -35,6 +35,7 @@ describe('tagKibanaAssets', () => { pkgTitle: 'System', pkgName: 'system', spaceId: 'default', + importedAssets: [], }); expect(savedObjectTagClient.create).toHaveBeenCalledWith( @@ -72,6 +73,7 @@ describe('tagKibanaAssets', () => { pkgTitle: 'System', pkgName: 'system', spaceId: 'default', + importedAssets: [], }); expect(savedObjectTagClient.create).not.toHaveBeenCalled(); @@ -83,6 +85,29 @@ describe('tagKibanaAssets', () => { }); }); + it('should use destinationId instead of original SO id if imported asset has it', async () => { + savedObjectTagClient.get.mockResolvedValue({ name: '', color: '', description: '' }); + const kibanaAssets = { dashboard: [{ id: 'dashboard1', type: 'dashboard' }] } as any; + + await tagKibanaAssets({ + savedObjectTagAssignmentService, + savedObjectTagClient, + kibanaAssets, + pkgTitle: 'System', + pkgName: 'system', + spaceId: 'default', + importedAssets: [{ id: 'dashboard1', destinationId: 'destination1' } as any], + }); + + expect(savedObjectTagClient.create).not.toHaveBeenCalled(); + expect(savedObjectTagAssignmentService.updateTagAssignments).toHaveBeenCalledWith({ + tags: ['fleet-managed-default', 'fleet-pkg-system-default'], + assign: [{ id: 'destination1', type: 'dashboard' }], + unassign: [], + refresh: false, + }); + }); + it('should skip non taggable asset types', async () => { savedObjectTagClient.get.mockRejectedValue(new Error('tag not found')); savedObjectTagClient.create.mockImplementation(({ name }: { name: string }) => @@ -104,6 +129,7 @@ describe('tagKibanaAssets', () => { pkgTitle: 'System', pkgName: 'system', spaceId: 'default', + importedAssets: [], }); expect(savedObjectTagAssignmentService.updateTagAssignments).toHaveBeenCalledWith({ @@ -130,6 +156,7 @@ describe('tagKibanaAssets', () => { pkgTitle: 'System', pkgName: 'system', spaceId: 'default', + importedAssets: [], }); expect(savedObjectTagAssignmentService.updateTagAssignments).not.toHaveBeenCalled(); @@ -154,6 +181,7 @@ describe('tagKibanaAssets', () => { pkgTitle: 'System', pkgName: 'system', spaceId: 'default', + importedAssets: [], }); expect(savedObjectTagClient.create).not.toHaveBeenCalledWith( @@ -200,6 +228,7 @@ describe('tagKibanaAssets', () => { pkgTitle: 'System', pkgName: 'system', spaceId: 'default', + importedAssets: [], }); expect(savedObjectTagClient.create).toHaveBeenCalledWith( @@ -247,6 +276,7 @@ describe('tagKibanaAssets', () => { pkgTitle: 'System', pkgName: 'system', spaceId: 'default', + importedAssets: [], }); expect(savedObjectTagClient.create).not.toHaveBeenCalled(); diff --git a/x-pack/plugins/fleet/server/services/epm/kibana/assets/tag_assets.ts b/x-pack/plugins/fleet/server/services/epm/kibana/assets/tag_assets.ts index 7e44e2186c34d..14d169a406ff5 100644 --- a/x-pack/plugins/fleet/server/services/epm/kibana/assets/tag_assets.ts +++ b/x-pack/plugins/fleet/server/services/epm/kibana/assets/tag_assets.ts @@ -5,6 +5,7 @@ * 2.0. */ +import type { SavedObjectsImportSuccess } from '@kbn/core-saved-objects-common'; import { taggableTypes } from '@kbn/saved-objects-tagging-plugin/common/constants'; import type { IAssignmentService, ITagsClient } from '@kbn/saved-objects-tagging-plugin/server'; @@ -29,11 +30,17 @@ interface TagAssetsParams { pkgTitle: string; pkgName: string; spaceId: string; + importedAssets: SavedObjectsImportSuccess[]; } export async function tagKibanaAssets(opts: TagAssetsParams) { - const { savedObjectTagAssignmentService, kibanaAssets } = opts; - const taggableAssets = getTaggableAssets(kibanaAssets); + const { savedObjectTagAssignmentService, kibanaAssets, importedAssets } = opts; + const getNewId = (assetId: string) => + importedAssets.find((imported) => imported.id === assetId)?.destinationId ?? assetId; + const taggableAssets = getTaggableAssets(kibanaAssets).map((asset) => ({ + ...asset, + id: getNewId(asset.id), + })); // no assets to tag if (taggableAssets.length === 0) {