diff --git a/packages/core/saved-objects/core-saved-objects-migration-server-internal/src/kibana_migrator.test.ts b/packages/core/saved-objects/core-saved-objects-migration-server-internal/src/kibana_migrator.test.ts index f726141c7294d..9c2fe9747d7b5 100644 --- a/packages/core/saved-objects/core-saved-objects-migration-server-internal/src/kibana_migrator.test.ts +++ b/packages/core/saved-objects/core-saved-objects-migration-server-internal/src/kibana_migrator.test.ts @@ -562,6 +562,7 @@ const mockOptions = () => { }, client: mockedClient, docLinks: docLinksServiceMock.createSetupContract(), + nodeRoles: { backgroundTasks: true, ui: true, migrator: true }, }; return options; }; diff --git a/packages/core/saved-objects/core-saved-objects-migration-server-internal/src/kibana_migrator.ts b/packages/core/saved-objects/core-saved-objects-migration-server-internal/src/kibana_migrator.ts index d9b9f19b785e4..13805c800a63d 100644 --- a/packages/core/saved-objects/core-saved-objects-migration-server-internal/src/kibana_migrator.ts +++ b/packages/core/saved-objects/core-saved-objects-migration-server-internal/src/kibana_migrator.ts @@ -13,6 +13,7 @@ import { BehaviorSubject } from 'rxjs'; import Semver from 'semver'; +import type { NodeRoles } from '@kbn/core-node-server'; import type { Logger } from '@kbn/logging'; import type { DocLinksServiceStart } from '@kbn/core-doc-links-server'; import type { ElasticsearchClient } from '@kbn/core-elasticsearch-server'; @@ -52,6 +53,7 @@ export interface KibanaMigratorOptions { docLinks: DocLinksServiceStart; waitForMigrationCompletion: boolean; defaultIndexTypesMap?: IndexTypesMap; + nodeRoles: NodeRoles; } /** @@ -74,6 +76,7 @@ export class KibanaMigrator implements IKibanaMigrator { private readonly docLinks: DocLinksServiceStart; private readonly waitForMigrationCompletion: boolean; private readonly defaultIndexTypesMap: IndexTypesMap; + private readonly nodeRoles: NodeRoles; public readonly kibanaVersion: string; /** @@ -89,6 +92,7 @@ export class KibanaMigrator implements IKibanaMigrator { docLinks, defaultIndexTypesMap = DEFAULT_INDEX_TYPES_MAP, waitForMigrationCompletion, + nodeRoles, }: KibanaMigratorOptions) { this.client = client; this.kibanaIndex = kibanaIndex; @@ -105,6 +109,7 @@ export class KibanaMigrator implements IKibanaMigrator { log: this.log, }); this.waitForMigrationCompletion = waitForMigrationCompletion; + this.nodeRoles = nodeRoles; // Building the active mappings (and associated md5sums) is an expensive // operation so we cache the result this.activeMappings = buildActiveMappings(this.mappingProperties); @@ -159,6 +164,7 @@ export class KibanaMigrator implements IKibanaMigrator { docLinks: this.docLinks, serializer: this.serializer, elasticsearchClient: this.client, + nodeRoles: this.nodeRoles, }); } diff --git a/packages/core/saved-objects/core-saved-objects-migration-server-internal/src/zdt/context/create_context.ts b/packages/core/saved-objects/core-saved-objects-migration-server-internal/src/zdt/context/create_context.ts index 82234823d973a..39cc32bfc7599 100644 --- a/packages/core/saved-objects/core-saved-objects-migration-server-internal/src/zdt/context/create_context.ts +++ b/packages/core/saved-objects/core-saved-objects-migration-server-internal/src/zdt/context/create_context.ts @@ -26,6 +26,7 @@ export const createContext = ({ indexPrefix, typeRegistry, serializer, + nodeRoles, }: CreateContextOps): MigratorContext => { return { migrationConfig, @@ -41,5 +42,6 @@ export const createContext = ({ migrationDocLinks: docLinks.links.kibanaUpgradeSavedObjects, deletedTypes: REMOVED_TYPES, discardCorruptObjects: Boolean(migrationConfig.discardCorruptObjects), + nodeRoles, }; }; diff --git a/packages/core/saved-objects/core-saved-objects-migration-server-internal/src/zdt/migrate_index.ts b/packages/core/saved-objects/core-saved-objects-migration-server-internal/src/zdt/migrate_index.ts index 6c3850d5dc8e9..7105a83730b24 100644 --- a/packages/core/saved-objects/core-saved-objects-migration-server-internal/src/zdt/migrate_index.ts +++ b/packages/core/saved-objects/core-saved-objects-migration-server-internal/src/zdt/migrate_index.ts @@ -23,6 +23,7 @@ import { createContext } from './context'; import { next } from './next'; import { model } from './model'; import { createInitialState } from './state'; +import { NodeRoles } from "@kbn/core-node-server"; export interface MigrateIndexOptions { kibanaVersion: string; @@ -42,6 +43,8 @@ export interface MigrateIndexOptions { serializer: ISavedObjectsSerializer; /** The client to use for communications with ES */ elasticsearchClient: ElasticsearchClient; + /** The node roles of the Kibana instance*/ + readonly nodeRoles: NodeRoles; } export const migrateIndex = async ({ diff --git a/packages/core/saved-objects/core-saved-objects-migration-server-internal/src/zdt/model/model.test.ts b/packages/core/saved-objects/core-saved-objects-migration-server-internal/src/zdt/model/model.test.ts index bef92e1986748..0ba01a714b99d 100644 --- a/packages/core/saved-objects/core-saved-objects-migration-server-internal/src/zdt/model/model.test.ts +++ b/packages/core/saved-objects/core-saved-objects-migration-server-internal/src/zdt/model/model.test.ts @@ -30,6 +30,7 @@ describe('model', () => { retryCount: 0, retryDelay: 0, logs: [], + skipDocumentMigration: false, }; const retryableError: RetryableEsClientError = { diff --git a/packages/core/saved-objects/core-saved-objects-migration-server-internal/src/zdt/run_zdt_migration.ts b/packages/core/saved-objects/core-saved-objects-migration-server-internal/src/zdt/run_zdt_migration.ts index 44a067944bd05..a6fff5ac62c5f 100644 --- a/packages/core/saved-objects/core-saved-objects-migration-server-internal/src/zdt/run_zdt_migration.ts +++ b/packages/core/saved-objects/core-saved-objects-migration-server-internal/src/zdt/run_zdt_migration.ts @@ -8,6 +8,7 @@ import type { Logger } from '@kbn/logging'; import type { DocLinksServiceStart } from '@kbn/core-doc-links-server'; +import type { NodeRoles } from '@kbn/core-node-server'; import type { ElasticsearchClient } from '@kbn/core-elasticsearch-server'; import type { ISavedObjectTypeRegistry, @@ -40,6 +41,8 @@ export interface RunZeroDowntimeMigrationOpts { serializer: ISavedObjectsSerializer; /** The client to use for communications with ES */ elasticsearchClient: ElasticsearchClient; + /** The node roles of the Kibana instance*/ + nodeRoles: NodeRoles; } export const runZeroDowntimeMigration = async ( diff --git a/packages/core/saved-objects/core-saved-objects-server-internal/src/saved_objects_service.ts b/packages/core/saved-objects/core-saved-objects-server-internal/src/saved_objects_service.ts index 36b515f5b0cb1..1ea6f6b038463 100644 --- a/packages/core/saved-objects/core-saved-objects-server-internal/src/saved_objects_service.ts +++ b/packages/core/saved-objects/core-saved-objects-server-internal/src/saved_objects_service.ts @@ -221,7 +221,8 @@ export class SavedObjectsService this.config.migration, elasticsearch.client.asInternalUser, docLinks, - waitForMigrationCompletion + waitForMigrationCompletion, + node ); this.migrator$.next(migrator); @@ -365,7 +366,8 @@ export class SavedObjectsService soMigrationsConfig: SavedObjectsMigrationConfigType, client: ElasticsearchClient, docLinks: DocLinksServiceStart, - waitForMigrationCompletion: boolean + waitForMigrationCompletion: boolean, + nodeInfo: NodeInfo ): IKibanaMigrator { return new KibanaMigrator({ typeRegistry: this.typeRegistry, @@ -376,6 +378,7 @@ export class SavedObjectsService client, docLinks, waitForMigrationCompletion, + nodeRoles: nodeInfo.roles, }); } diff --git a/src/core/server/integration_tests/saved_objects/migrations/kibana_migrator_test_kit.ts b/src/core/server/integration_tests/saved_objects/migrations/kibana_migrator_test_kit.ts index 22e3fe218a495..de2b4a4c4155e 100644 --- a/src/core/server/integration_tests/saved_objects/migrations/kibana_migrator_test_kit.ts +++ b/src/core/server/integration_tests/saved_objects/migrations/kibana_migrator_test_kit.ts @@ -42,6 +42,7 @@ import { registerServiceConfig } from '@kbn/core-root-server-internal'; import type { ISavedObjectsRepository } from '@kbn/core-saved-objects-api-server'; import { getDocLinks, getDocLinksMeta } from '@kbn/doc-links'; import type { DocLinksServiceStart } from '@kbn/core-doc-links-server'; +import type { NodeRoles } from '@kbn/core-node-server'; import { baselineDocuments, baselineTypes } from './kibana_migrator_test_kit.fixtures'; import { delay } from './test_utils'; @@ -53,6 +54,7 @@ export const currentVersion = env.packageInfo.version; export const nextMinor = new SemVer(currentVersion).inc('minor').format(); export const currentBranch = env.packageInfo.branch; export const defaultKibanaIndex = '.kibana_migrator_tests'; +export const defaultNodeRoles: NodeRoles = { migrator: true, ui: true, backgroundTasks: true }; export interface GetEsClientParams { settings?: Record; @@ -64,6 +66,7 @@ export interface KibanaMigratorTestKitParams { kibanaIndex?: string; kibanaVersion?: string; kibanaBranch?: string; + nodeRoles?: NodeRoles; settings?: Record; types?: Array>; logFilePath?: string; @@ -121,6 +124,7 @@ export const getKibanaMigratorTestKit = async ({ kibanaBranch = currentBranch, types = [], logFilePath = defaultLogFilePath, + nodeRoles = defaultNodeRoles, }: KibanaMigratorTestKitParams = {}): Promise => { let hasRun = false; const loggingSystem = new LoggingSystem(); @@ -146,7 +150,8 @@ export const getKibanaMigratorTestKit = async ({ loggerFactory, kibanaIndex, kibanaVersion, - kibanaBranch + kibanaBranch, + nodeRoles ); const runMigrations = async () => { @@ -255,7 +260,8 @@ const getMigrator = async ( loggerFactory: LoggerFactory, kibanaIndex: string, kibanaVersion: string, - kibanaBranch: string + kibanaBranch: string, + nodeRoles: NodeRoles ) => { const savedObjectsConf = await firstValueFrom( configService.atPath('savedObjects') @@ -279,6 +285,7 @@ const getMigrator = async ( logger: loggerFactory.get('savedobjects-service'), docLinks, waitForMigrationCompletion: false, // ensure we have an active role in the migration + nodeRoles, }); }; @@ -371,7 +378,9 @@ export const getCompatibleMappingsMigrator = async ({ filterDeprecated = false, kibanaVersion = nextMinor, settings = {}, -}: GetMutatedMigratorParams & { filterDeprecated?: boolean } = {}) => { +}: GetMutatedMigratorParams & { + filterDeprecated?: boolean; +} = {}) => { const types = baselineTypes .filter((type) => !filterDeprecated || type.name !== 'deprecated') .map((type) => {