From b68bd3146fbff6003d5ea24424687c5cba7b54c1 Mon Sep 17 00:00:00 2001 From: Gerard Soldevila Date: Mon, 23 Sep 2024 13:01:33 +0200 Subject: [PATCH] Remove tests that are not applicable in 9.x --- .../7.13.2_so_with_multiple_namespaces.zip | Bin 79703 -> 0 bytes .../group2/batch_size_bytes.test.ts | 175 ------------ .../group3/migration_from_older_v1.test.ts | 223 --------------- .../migrations/group3/rewriting_id.test.ts | 258 ------------------ 4 files changed, 656 deletions(-) delete mode 100644 src/core/server/integration_tests/saved_objects/migrations/archives/7.13.2_so_with_multiple_namespaces.zip delete mode 100644 src/core/server/integration_tests/saved_objects/migrations/group2/batch_size_bytes.test.ts delete mode 100644 src/core/server/integration_tests/saved_objects/migrations/group3/migration_from_older_v1.test.ts delete mode 100644 src/core/server/integration_tests/saved_objects/migrations/group3/rewriting_id.test.ts diff --git a/src/core/server/integration_tests/saved_objects/migrations/archives/7.13.2_so_with_multiple_namespaces.zip b/src/core/server/integration_tests/saved_objects/migrations/archives/7.13.2_so_with_multiple_namespaces.zip deleted file mode 100644 index bc305de2d45606d82c668d30fe51b45687e6bf24..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 79703 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�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 W6Jl_R4S`sIKl=O-$RIq4hWsDNPtNoJ diff --git a/src/core/server/integration_tests/saved_objects/migrations/group2/batch_size_bytes.test.ts b/src/core/server/integration_tests/saved_objects/migrations/group2/batch_size_bytes.test.ts deleted file mode 100644 index a360fd4114d91..0000000000000 --- a/src/core/server/integration_tests/saved_objects/migrations/group2/batch_size_bytes.test.ts +++ /dev/null @@ -1,175 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the "Elastic License - * 2.0", the "GNU Affero General Public License v3.0 only", and the "Server Side - * Public License v 1"; you may not use this file except in compliance with, at - * your election, the "Elastic License 2.0", the "GNU Affero General Public - * License v3.0 only", or the "Server Side Public License, v 1". - */ - -import Path from 'path'; -import fs from 'fs/promises'; -import JSON5 from 'json5'; -import { - createTestServers, - createRootWithCorePlugins, - type TestElasticsearchUtils, -} from '@kbn/core-test-helpers-kbn-server'; -import { Root } from '@kbn/core-root-server-internal'; -import type { ElasticsearchClient } from '@kbn/core-elasticsearch-server'; -import { Env } from '@kbn/config'; -import { REPO_ROOT } from '@kbn/repo-info'; -import { getEnvOptions } from '@kbn/config-mocks'; -import { LogRecord } from '@kbn/logging'; -import { retryAsync } from '@kbn/core-saved-objects-migration-server-mocks'; - -const kibanaVersion = Env.createDefault(REPO_ROOT, getEnvOptions()).packageInfo.version; -const targetIndex = `.kibana_${kibanaVersion}_001`; -const logFilePath = Path.join(__dirname, 'batch_size_bytes.log'); - -async function removeLogFile() { - // ignore errors if it doesn't exist - await fs.unlink(logFilePath).catch(() => void 0); -} -function sortByTypeAndId(a: { type: string; id: string }, b: { type: string; id: string }) { - return a.type.localeCompare(b.type) || a.id.localeCompare(b.id); -} - -async function fetchDocuments(esClient: ElasticsearchClient, index: string) { - const body = await esClient.search({ - index, - body: { - query: { - match_all: {}, - }, - _source: ['type', 'id'], - }, - }); - - return body.hits.hits - .map((h) => ({ - ...h._source, - id: h._id, - })) - .sort(sortByTypeAndId); -} - -const assertMigratedDocuments = (arr: any[], target: any[]) => target.every((v) => arr.includes(v)); - -// Failing 9.0 version update: https://github.com/elastic/kibana/issues/192624 -describe.skip('migration v2', () => { - let esServer: TestElasticsearchUtils; - let root: Root; - let startES: () => Promise; - - beforeAll(async () => { - await removeLogFile(); - }); - - beforeEach(() => { - ({ startES } = createTestServers({ - adjustTimeout: (t: number) => jest.setTimeout(t), - settings: { - es: { - license: 'basic', - dataArchive: Path.join( - __dirname, - '..', - 'archives', - '7.14.0_xpack_sample_saved_objects.zip' - ), - esArgs: ['http.max_content_length=1715329b'], - }, - }, - })); - }); - - afterEach(async () => { - if (root) { - await root.shutdown(); - } - if (esServer) { - await esServer.stop(); - } - }); - - it('completes the migration even when a full batch would exceed ES http.max_content_length', async () => { - root = createRoot({ maxBatchSizeBytes: 1715329 }); - esServer = await startES(); - await root.preboot(); - await root.setup(); - await expect(root.start()).resolves.toBeTruthy(); - - // After plugins start, some saved objects are deleted/recreated, so we - // wait a bit for the count to settle. - await new Promise((resolve) => setTimeout(resolve, 5000)); - - const esClient: ElasticsearchClient = esServer.es.getClient(); - - // assert that the docs from the original index have been migrated rather than comparing a doc count after startup - const originalDocs = await fetchDocuments(esClient, '.kibana_7.14.0_001'); - const migratedDocs = await fetchDocuments(esClient, targetIndex); - expect(assertMigratedDocuments(migratedDocs, originalDocs)); - }); - - it('fails with a descriptive message when a single document exceeds maxBatchSizeBytes', async () => { - root = createRoot({ maxBatchSizeBytes: 1015275 }); - esServer = await startES(); - await root.preboot(); - await root.setup(); - await expect(root.start()).rejects.toMatchInlineSnapshot( - `[Error: Unable to complete saved object migrations for the [.kibana] index: The document with _id "canvas-workpad-template:workpad-template-061d7868-2b4e-4dc8-8bf7-3772b52926e5" is 1715319 bytes which exceeds the configured maximum batch size of 1015275 bytes. To proceed, please increase the 'migrations.maxBatchSizeBytes' Kibana configuration option and ensure that the Elasticsearch 'http.max_content_length' configuration option is set to an equal or larger value.]` - ); - - await retryAsync( - async () => { - const logFileContent = await fs.readFile(logFilePath, 'utf-8'); - const records = logFileContent - .split('\n') - .filter(Boolean) - .map((str) => JSON5.parse(str)) as LogRecord[]; - expect( - records.find((rec) => - rec.message.startsWith( - `Reason: Unable to complete saved object migrations for the [.kibana] index: The document with _id "canvas-workpad-template:workpad-template-061d7868-2b4e-4dc8-8bf7-3772b52926e5" is 1715319 bytes which exceeds the configured maximum batch size of 1015275 bytes. To proceed, please increase the 'migrations.maxBatchSizeBytes' Kibana configuration option and ensure that the Elasticsearch 'http.max_content_length' configuration option is set to an equal or larger value.` - ) - ) - ).toBeDefined(); - }, - { retryAttempts: 10, retryDelayMs: 200 } - ); - }); -}); - -function createRoot(options: { maxBatchSizeBytes?: number }) { - return createRootWithCorePlugins( - { - migrations: { - skip: false, - batchSize: 1000, - maxBatchSizeBytes: options.maxBatchSizeBytes, - }, - logging: { - appenders: { - file: { - type: 'file', - fileName: logFilePath, - layout: { - type: 'json', - }, - }, - }, - loggers: [ - { - name: 'root', - level: 'info', - appenders: ['file'], - }, - ], - }, - }, - { - oss: false, - } - ); -} diff --git a/src/core/server/integration_tests/saved_objects/migrations/group3/migration_from_older_v1.test.ts b/src/core/server/integration_tests/saved_objects/migrations/group3/migration_from_older_v1.test.ts deleted file mode 100644 index f9918966e9576..0000000000000 --- a/src/core/server/integration_tests/saved_objects/migrations/group3/migration_from_older_v1.test.ts +++ /dev/null @@ -1,223 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the "Elastic License - * 2.0", the "GNU Affero General Public License v3.0 only", and the "Server Side - * Public License v 1"; you may not use this file except in compliance with, at - * your election, the "Elastic License 2.0", the "GNU Affero General Public - * License v3.0 only", or the "Server Side Public License, v 1". - */ - -import Path from 'path'; -import Fs from 'fs'; -import Util from 'util'; -import Semver from 'semver'; -import { REPO_ROOT } from '@kbn/repo-info'; -import { Env } from '@kbn/config'; -import { getEnvOptions } from '@kbn/config-mocks'; -import { ElasticsearchClient } from '@kbn/core-elasticsearch-server'; -import type { SavedObjectsRawDoc } from '@kbn/core-saved-objects-server'; -import { modelVersionToVirtualVersion } from '@kbn/core-saved-objects-base-server-internal'; -import { - createTestServers, - createRootWithCorePlugins, - type TestElasticsearchUtils, -} from '@kbn/core-test-helpers-kbn-server'; -import { InternalCoreStart } from '@kbn/core-lifecycle-server-internal'; -import { Root } from '@kbn/core-root-server-internal'; - -const kibanaVersion = Env.createDefault(REPO_ROOT, getEnvOptions()).packageInfo.version; - -const logFilePath = Path.join(__dirname, 'migration_from_older_v1.log'); - -const asyncUnlink = Util.promisify(Fs.unlink); -async function removeLogFile() { - // ignore errors if it doesn't exist - await asyncUnlink(logFilePath).catch(() => void 0); -} -const assertMigratedDocuments = (arr: any[], target: any[]) => target.every((v) => arr.includes(v)); - -function sortByTypeAndId(a: { type: string; id: string }, b: { type: string; id: string }) { - return a.type.localeCompare(b.type) || a.id.localeCompare(b.id); -} - -async function fetchDocuments(esClient: ElasticsearchClient, index: string) { - const body = await esClient.search({ - index, - body: { - query: { - match_all: {}, - }, - _source: ['type', 'id'], - }, - }); - - return body.hits.hits - .map((h) => ({ - ...h._source, - id: h._id, - })) - .sort(sortByTypeAndId); -} - -// Failing 9.0 version update: https://github.com/elastic/kibana/issues/192624 -describe.skip('migrating from 7.3.0-xpack which used v1 migrations', () => { - const migratedIndex = `.kibana_${kibanaVersion}_001`; - const originalIndex = `.kibana_1`; // v1 migrations index - - let esServer: TestElasticsearchUtils; - let root: Root; - let coreStart: InternalCoreStart; - let esClient: ElasticsearchClient; - - const startServers = async ({ dataArchive, oss }: { dataArchive: string; oss: boolean }) => { - const { startES } = createTestServers({ - adjustTimeout: (t: number) => jest.setTimeout(t), - settings: { - es: { - license: 'basic', - dataArchive, - }, - }, - }); - - root = createRootWithCorePlugins( - { - migrations: { - skip: false, - // There are 40 docs in fixtures. Batch size configured to enforce 3 migration steps. - batchSize: 15, - }, - logging: { - appenders: { - file: { - type: 'file', - fileName: logFilePath, - layout: { - type: 'json', - }, - }, - }, - loggers: [ - { - name: 'root', - appenders: ['file'], - level: 'info', - }, - ], - }, - }, - { - oss, - } - ); - - const startEsPromise = startES().then((es) => (esServer = es)); - const startKibanaPromise = root - .preboot() - .then(() => root.setup()) - .then(() => root.start()) - .then((start) => { - coreStart = start; - esClient = coreStart.elasticsearch.client.asInternalUser; - }); - return await Promise.all([startEsPromise, startKibanaPromise]); - }; - - const getExpectedVersionPerType = () => - coreStart.savedObjects - .getTypeRegistry() - .getAllTypes() - .reduce((versionMap, type) => { - const { name, migrations, convertToMultiNamespaceTypeVersion, modelVersions } = type; - if (migrations || convertToMultiNamespaceTypeVersion) { - const migrationsMap = typeof migrations === 'function' ? migrations() : migrations; - const migrationsKeys = migrationsMap ? Object.keys(migrationsMap) : []; - if (convertToMultiNamespaceTypeVersion) { - // Setting this option registers a conversion migration that is reflected in the object's `typeMigrationVersions` field - migrationsKeys.push(convertToMultiNamespaceTypeVersion); - } - - const modelVersionCreateSchemas = - typeof modelVersions === 'function' ? modelVersions() : modelVersions ?? {}; - - Object.entries(modelVersionCreateSchemas).forEach(([key, modelVersion]) => { - migrationsKeys.push(modelVersionToVirtualVersion(key)); - }); - - const highestVersion = migrationsKeys.sort(Semver.compare).reverse()[0]; - return { - ...versionMap, - [name]: highestVersion, - }; - } else { - return { - ...versionMap, - [name]: undefined, - }; - } - }, {} as Record); - - const assertMigrationVersion = ( - doc: SavedObjectsRawDoc, - expectedVersions: Record - ) => { - const type = doc._source.type; - expect(doc._source.typeMigrationVersion).toEqual(expectedVersions[type]); - }; - - const stopServers = async () => { - if (root) { - await root.shutdown(); - } - if (esServer) { - await esServer.stop(); - } - }; - - beforeAll(async () => { - await removeLogFile(); - await startServers({ - oss: false, - dataArchive: Path.join(__dirname, '..', 'archives', '7.3.0_xpack_sample_saved_objects.zip'), - }); - }); - - afterAll(async () => { - await stopServers(); - }); - - it('creates the new index and the correct aliases', async () => { - const body = await esClient.indices.get( - { - index: migratedIndex, - }, - { ignore: [404] } - ); - - const response = body[migratedIndex]; - - expect(response).toBeDefined(); - expect(Object.keys(response.aliases!).sort()).toEqual(['.kibana', `.kibana_${kibanaVersion}`]); - }); - - it('copies all the document of the previous index to the new one', async () => { - const originalDocs = await fetchDocuments(esClient, originalIndex); - const migratedDocs = await fetchDocuments(esClient, migratedIndex); - expect(assertMigratedDocuments(migratedDocs, originalDocs)); - }); - - it('migrates the documents to the highest version', async () => { - const expectedVersions = getExpectedVersionPerType(); - const res = await esClient.search({ - index: migratedIndex, - body: { - sort: ['_doc'], - }, - size: 10000, - }); - const allDocuments = res.hits.hits as SavedObjectsRawDoc[]; - allDocuments.forEach((doc) => { - assertMigrationVersion(doc, expectedVersions); - }); - }); -}); diff --git a/src/core/server/integration_tests/saved_objects/migrations/group3/rewriting_id.test.ts b/src/core/server/integration_tests/saved_objects/migrations/group3/rewriting_id.test.ts deleted file mode 100644 index 7e7c6c13465cd..0000000000000 --- a/src/core/server/integration_tests/saved_objects/migrations/group3/rewriting_id.test.ts +++ /dev/null @@ -1,258 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the "Elastic License - * 2.0", the "GNU Affero General Public License v3.0 only", and the "Server Side - * Public License v 1"; you may not use this file except in compliance with, at - * your election, the "Elastic License 2.0", the "GNU Affero General Public - * License v3.0 only", or the "Server Side Public License, v 1". - */ - -import Path from 'path'; -import Fs from 'fs'; -import Util from 'util'; -import { kibanaPackageJson as pkg } from '@kbn/repo-info'; -import { - createRootWithCorePlugins, - createTestServers, - type TestElasticsearchUtils, -} from '@kbn/core-test-helpers-kbn-server'; -import type { ElasticsearchClient } from '@kbn/core-elasticsearch-server'; -import { Root } from '@kbn/core-root-server-internal'; -import { deterministicallyRegenerateObjectId } from '@kbn/core-saved-objects-migration-server-internal'; - -const logFilePath = Path.join(__dirname, 'rewriting_id.log'); - -const asyncUnlink = Util.promisify(Fs.unlink); -async function removeLogFile() { - // ignore errors if it doesn't exist - await asyncUnlink(logFilePath).catch(() => void 0); -} - -function sortByTypeAndId(a: { type: string; id: string }, b: { type: string; id: string }) { - return a.type.localeCompare(b.type) || a.id.localeCompare(b.id); -} - -async function fetchDocs(esClient: ElasticsearchClient, index: string) { - const body = await esClient.search({ - index, - body: { - query: { - bool: { - should: [ - { - term: { type: 'foo' }, - }, - { - term: { type: 'bar' }, - }, - { - term: { type: 'legacy-url-alias' }, - }, - ], - }, - }, - }, - }); - - return body.hits.hits - .map((h) => ({ - ...h._source, - id: h._id, - })) - .sort(sortByTypeAndId); -} - -function createRoot() { - return createRootWithCorePlugins( - { - migrations: { - skip: false, - }, - logging: { - appenders: { - file: { - type: 'file', - fileName: logFilePath, - layout: { - type: 'json', - }, - }, - }, - loggers: [ - { - name: 'root', - level: 'info', - appenders: ['file'], - }, - ], - }, - }, - { - oss: true, - } - ); -} - -// Failing 9.0 version update: https://github.com/elastic/kibana/issues/192624 -describe.skip('migration v2', () => { - let esServer: TestElasticsearchUtils; - let root: Root; - - beforeAll(async () => { - await removeLogFile(); - }); - - afterAll(async () => { - if (root) { - await root.shutdown(); - } - if (esServer) { - await esServer.stop(); - } - }); - - it('rewrites id deterministically for SO with namespaceType: "multiple" and "multiple-isolated"', async () => { - const migratedIndexAlias = `.kibana_${pkg.version}`; - const { startES } = createTestServers({ - adjustTimeout: (t: number) => jest.setTimeout(t), - settings: { - es: { - license: 'basic', - // original SO: - // [ - // { id: 'foo:1', type: 'foo', foo: { name: 'Foo 1 default' } }, - // { id: 'spacex:foo:1', type: 'foo', foo: { name: 'Foo 1 spacex' }, namespace: 'spacex' }, - // { - // id: 'bar:1', - // type: 'bar', - // bar: { nomnom: 1 }, - // references: [{ type: 'foo', id: '1', name: 'Foo 1 default' }], - // }, - // { - // id: 'spacex:bar:1', - // type: 'bar', - // bar: { nomnom: 2 }, - // references: [{ type: 'foo', id: '1', name: 'Foo 1 spacex' }], - // namespace: 'spacex', - // }, - // ]; - dataArchive: Path.join( - __dirname, - '..', - 'archives', - '7.13.2_so_with_multiple_namespaces.zip' - ), - }, - }, - }); - - root = createRoot(); - - esServer = await startES(); - await root.preboot(); - const coreSetup = await root.setup(); - - coreSetup.savedObjects.registerType({ - name: 'foo', - hidden: false, - mappings: { properties: { name: { type: 'text' } } }, - namespaceType: 'multiple', - convertToMultiNamespaceTypeVersion: '8.0.0', - }); - - coreSetup.savedObjects.registerType({ - name: 'bar', - hidden: false, - mappings: { properties: { nomnom: { type: 'integer' } } }, - namespaceType: 'multiple-isolated', - convertToMultiNamespaceTypeVersion: '8.0.0', - }); - - const coreStart = await root.start(); - const esClient = coreStart.elasticsearch.client.asInternalUser; - - const migratedDocs = await fetchDocs(esClient, migratedIndexAlias); - - // each newly converted multi-namespace object in a non-default space has its ID deterministically regenerated, and a legacy-url-alias - // object is created which links the old ID to the new ID - const newFooId = deterministicallyRegenerateObjectId('spacex', 'foo', '1'); - const newBarId = deterministicallyRegenerateObjectId('spacex', 'bar', '1'); - - expect(migratedDocs).toEqual( - [ - { - id: 'foo:1', - type: 'foo', - foo: { name: 'Foo 1 default' }, - references: [], - namespaces: ['default'], - coreMigrationVersion: expect.any(String), - typeMigrationVersion: '8.0.0', - managed: false, - }, - { - id: `foo:${newFooId}`, - type: 'foo', - foo: { name: 'Foo 1 spacex' }, - references: [], - namespaces: ['spacex'], - originId: '1', - coreMigrationVersion: expect.any(String), - typeMigrationVersion: '8.0.0', - managed: false, - }, - { - // new object for spacex:foo:1 - id: 'legacy-url-alias:spacex:foo:1', - type: 'legacy-url-alias', - 'legacy-url-alias': { - sourceId: '1', - targetId: newFooId, - targetNamespace: 'spacex', - targetType: 'foo', - purpose: 'savedObjectConversion', - }, - references: [], - coreMigrationVersion: expect.any(String), - typeMigrationVersion: '8.2.0', - }, - { - id: 'bar:1', - type: 'bar', - bar: { nomnom: 1 }, - references: [{ type: 'foo', id: '1', name: 'Foo 1 default' }], - namespaces: ['default'], - coreMigrationVersion: expect.any(String), - typeMigrationVersion: '8.0.0', - managed: false, - }, - { - id: `bar:${newBarId}`, - type: 'bar', - bar: { nomnom: 2 }, - references: [{ type: 'foo', id: newFooId, name: 'Foo 1 spacex' }], - namespaces: ['spacex'], - originId: '1', - coreMigrationVersion: expect.any(String), - typeMigrationVersion: '8.0.0', - managed: false, - }, - { - // new object for spacex:bar:1 - id: 'legacy-url-alias:spacex:bar:1', - type: 'legacy-url-alias', - 'legacy-url-alias': { - sourceId: '1', - targetId: newBarId, - targetNamespace: 'spacex', - targetType: 'bar', - purpose: 'savedObjectConversion', - }, - references: [], - coreMigrationVersion: expect.any(String), - typeMigrationVersion: '8.2.0', - }, - ].sort(sortByTypeAndId) - ); - }); -});