From 5b3c3bca0acae2a349cec02d643d6b8a2f6f5060 Mon Sep 17 00:00:00 2001 From: Mark Hopkin Date: Thu, 25 Nov 2021 11:28:20 +0000 Subject: [PATCH] create index patterns at the same time as other assets --- .../services/epm/kibana/assets/install.ts | 9 +++-- .../epm/kibana/index_pattern/install.ts | 34 +++---------------- .../epm/packages/_install_package.test.ts | 11 ++---- .../epm/packages/bulk_install_packages.ts | 3 -- .../server/services/epm/packages/install.ts | 14 ++------ 5 files changed, 16 insertions(+), 55 deletions(-) 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 65f4a04d4454e9e..a858871a7ce47af 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 @@ -20,7 +20,7 @@ import { getAsset, getPathParts } from '../../archive'; import { KibanaAssetType, KibanaSavedObjectType } from '../../../../types'; import type { AssetType, AssetReference, AssetParts } from '../../../../types'; import { savedObjectTypes } from '../../packages'; -import { indexPatternTypes } from '../index_pattern/install'; +import { indexPatternTypes, getIndexPatternSavedObjects } from '../index_pattern/install'; import { appContextService } from '../../../../services'; const validKibanaAssetTypes = new Set(Object.values(KibanaAssetType)); @@ -97,9 +97,14 @@ export async function installKibanaAssets(options: { return []; } + // As we use `import` to create our saved objects, we have to install + // their references (the index patterns) at the same time + // to prevent a reference error + const indexPatternSavedObjects = getIndexPatternSavedObjects() as ArchiveAsset[]; + const installedAssets = await installKibanaSavedObjects({ savedObjectsClient, - kibanaAssets: assetsToInstall, + kibanaAssets: [...indexPatternSavedObjects, ...assetsToInstall], }); return installedAssets; diff --git a/x-pack/plugins/fleet/server/services/epm/kibana/index_pattern/install.ts b/x-pack/plugins/fleet/server/services/epm/kibana/index_pattern/install.ts index 9d17db097039801..c42029f2c453d2e 100644 --- a/x-pack/plugins/fleet/server/services/epm/kibana/index_pattern/install.ts +++ b/x-pack/plugins/fleet/server/services/epm/kibana/index_pattern/install.ts @@ -7,8 +7,6 @@ import type { SavedObjectsClientContract } from 'src/core/server'; -import { createListStream } from '@kbn/utils'; - import { dataTypes, installationStatuses } from '../../../../../common/constants'; import { appContextService } from '../../../../services'; import { getPackageSavedObjects } from '../../packages/get'; @@ -16,40 +14,16 @@ const INDEX_PATTERN_SAVED_OBJECT_TYPE = 'index-pattern'; export const indexPatternTypes = Object.values(dataTypes); -export async function installIndexPatterns(savedObjectsClient: SavedObjectsClientContract) { - const logger = appContextService.getLogger(); - - const indexPatterns = indexPatternTypes.map((indexPatternType) => `${indexPatternType}-*`); - logger.debug(`creating index patterns ${indexPatterns}`); - const kibanaIndexPatterns = indexPatterns.map((indexPattern) => ({ - id: indexPattern, +export function getIndexPatternSavedObjects() { + return indexPatternTypes.map((indexPatternType) => ({ + id: `${indexPatternType}-*`, type: INDEX_PATTERN_SAVED_OBJECT_TYPE, attributes: { - title: indexPattern, + title: `${indexPatternType}-*`, timeFieldName: '@timestamp', allowNoIndex: true, }, })); - - const savedObjectsImporter = appContextService - .getSavedObjects() - .createImporter(savedObjectsClient); - - const { successResults, errors } = await savedObjectsImporter.import({ - overwrite: true, - readStream: createListStream(kibanaIndexPatterns), - createNewCopies: false, - }); - - if (errors?.length) { - throw new Error( - `Encountered ${errors.length} creating index patterns: ${JSON.stringify( - errors.map(({ id, error }) => ({ id, error })) // discard other fields - )}` - ); - } - - return successResults || []; } export async function removeUnusedIndexPatterns(savedObjectsClient: SavedObjectsClientContract) { diff --git a/x-pack/plugins/fleet/server/services/epm/packages/_install_package.test.ts b/x-pack/plugins/fleet/server/services/epm/packages/_install_package.test.ts index 7996cbfb79ef8d6..0d3ceb1743ab3be 100644 --- a/x-pack/plugins/fleet/server/services/epm/packages/_install_package.test.ts +++ b/x-pack/plugins/fleet/server/services/epm/packages/_install_package.test.ts @@ -19,7 +19,6 @@ jest.mock('./get'); import { updateCurrentWriteIndices } from '../elasticsearch/template/template'; import { installKibanaAssets } from '../kibana/assets/install'; -import { installIndexPatterns } from '../kibana/index_pattern/install'; import { _installPackage } from './_install_package'; @@ -29,9 +28,6 @@ const mockedUpdateCurrentWriteIndices = updateCurrentWriteIndices as jest.Mocked const mockedGetKibanaAssets = installKibanaAssets as jest.MockedFunction< typeof installKibanaAssets >; -const mockedInstallIndexPatterns = installIndexPatterns as jest.MockedFunction< - typeof installIndexPatterns ->; function sleep(millis: number) { return new Promise((resolve) => setTimeout(resolve, millis)); @@ -49,14 +45,11 @@ describe('_installPackage', () => { afterEach(async () => { appContextService.stop(); }); - it('handles errors from installIndexPatterns or installKibanaAssets', async () => { - // force errors from either/both these functions + it('handles errors from installKibanaAssets', async () => { + // force errors from this function mockedGetKibanaAssets.mockImplementation(async () => { throw new Error('mocked async error A: should be caught'); }); - mockedInstallIndexPatterns.mockImplementation(async () => { - throw new Error('mocked async error B: should be caught'); - }); // pick any function between when those are called and when await Promise.all is defined later // and force it to take long enough for the errors to occur diff --git a/x-pack/plugins/fleet/server/services/epm/packages/bulk_install_packages.ts b/x-pack/plugins/fleet/server/services/epm/packages/bulk_install_packages.ts index fec697e509717fc..2f04efba8fab8e3 100644 --- a/x-pack/plugins/fleet/server/services/epm/packages/bulk_install_packages.ts +++ b/x-pack/plugins/fleet/server/services/epm/packages/bulk_install_packages.ts @@ -9,7 +9,6 @@ import type { ElasticsearchClient, SavedObjectsClientContract } from 'src/core/s import { appContextService } from '../../app_context'; import * as Registry from '../registry'; -import { installIndexPatterns } from '../kibana/index_pattern/install'; import type { InstallResult } from '../../../types'; @@ -31,7 +30,6 @@ export async function bulkInstallPackages({ }: BulkInstallPackagesParams): Promise { const logger = appContextService.getLogger(); const installSource = 'registry'; - await installIndexPatterns(savedObjectsClient); const packagesResults = await Promise.allSettled( packagesToInstall.map((pkg) => { @@ -73,7 +71,6 @@ export async function bulkInstallPackages({ esClient, pkgkey: Registry.pkgToPkgKey(pkgKeyProps), installSource, - skipIndexPatternCreation: true, force, }); if (installResult.error) { diff --git a/x-pack/plugins/fleet/server/services/epm/packages/install.ts b/x-pack/plugins/fleet/server/services/epm/packages/install.ts index 024cf1056b770db..325b73a1408b972 100644 --- a/x-pack/plugins/fleet/server/services/epm/packages/install.ts +++ b/x-pack/plugins/fleet/server/services/epm/packages/install.ts @@ -39,7 +39,6 @@ import * as Registry from '../registry'; import { setPackageInfo, parseAndVerifyArchiveEntries, unpackBufferToCache } from '../archive'; import { toAssetReference } from '../kibana/assets/install'; import type { ArchiveAsset } from '../kibana/assets/install'; -import { installIndexPatterns } from '../kibana/index_pattern/install'; import type { PackageUpdateEvent } from '../../upgrade_sender'; import { sendTelemetryEvents, UpdateEventType } from '../../upgrade_sender'; @@ -438,23 +437,16 @@ async function installPackageByUpload({ } } -export type InstallPackageParams = { - skipIndexPatternCreation?: boolean; -} & ( +export type InstallPackageParams = | ({ installSource: Extract } & InstallRegistryPackageParams) - | ({ installSource: Extract } & InstallUploadedArchiveParams) -); + | ({ installSource: Extract } & InstallUploadedArchiveParams); export async function installPackage(args: InstallPackageParams) { if (!('installSource' in args)) { throw new Error('installSource is required'); } const logger = appContextService.getLogger(); - const { savedObjectsClient, esClient, skipIndexPatternCreation = false } = args; - - if (!skipIndexPatternCreation) { - await installIndexPatterns(savedObjectsClient); - } + const { savedObjectsClient, esClient } = args; if (args.installSource === 'registry') { const { pkgkey, force } = args;