From 3911490502b96f231468f5a4005b450f5bd24f21 Mon Sep 17 00:00:00 2001 From: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> Date: Fri, 29 Oct 2021 20:13:19 -0400 Subject: [PATCH] [saved objects] Strip version qualifier in SO service to fix unknown type deprecations. (#116480) (#116858) Co-authored-by: Luke Elmers --- .../migrations/kibana/kibana_migrator.test.ts | 9 --- .../migrations/kibana/kibana_migrator.ts | 2 +- .../saved_objects_service.test.mocks.ts | 5 ++ .../saved_objects_service.test.ts | 64 ++++++++++++++++++- .../saved_objects/saved_objects_service.ts | 18 +++++- 5 files changed, 84 insertions(+), 14 deletions(-) diff --git a/src/core/server/saved_objects/migrations/kibana/kibana_migrator.test.ts b/src/core/server/saved_objects/migrations/kibana/kibana_migrator.test.ts index 599b5dca0d90..fe3d6c469726 100644 --- a/src/core/server/saved_objects/migrations/kibana/kibana_migrator.test.ts +++ b/src/core/server/saved_objects/migrations/kibana/kibana_migrator.test.ts @@ -46,15 +46,6 @@ describe('KibanaMigrator', () => { beforeEach(() => { (DocumentMigrator as jest.Mock).mockClear(); }); - describe('constructor', () => { - it('coerces the current Kibana version if it has a hyphen', () => { - const options = mockOptions(); - options.kibanaVersion = '3.2.1-SNAPSHOT'; - const migrator = new KibanaMigrator(options); - expect(migrator.kibanaVersion).toEqual('3.2.1'); - expect((DocumentMigrator as jest.Mock).mock.calls[0][0].kibanaVersion).toEqual('3.2.1'); - }); - }); describe('getActiveMappings', () => { it('returns full index mappings w/ core properties', () => { const options = mockOptions(); diff --git a/src/core/server/saved_objects/migrations/kibana/kibana_migrator.ts b/src/core/server/saved_objects/migrations/kibana/kibana_migrator.ts index a812339cef07..198983538c93 100644 --- a/src/core/server/saved_objects/migrations/kibana/kibana_migrator.ts +++ b/src/core/server/saved_objects/migrations/kibana/kibana_migrator.ts @@ -88,7 +88,7 @@ export class KibanaMigrator { this.serializer = new SavedObjectsSerializer(this.typeRegistry); this.mappingProperties = mergeTypes(this.typeRegistry.getAllTypes()); this.log = logger; - this.kibanaVersion = kibanaVersion.split('-')[0]; // coerce a semver-like string (x.y.z-SNAPSHOT) or prerelease version (x.y.z-alpha) to a regular semver (x.y.z); + this.kibanaVersion = kibanaVersion; this.documentMigrator = new DocumentMigrator({ kibanaVersion: this.kibanaVersion, typeRegistry, diff --git a/src/core/server/saved_objects/saved_objects_service.test.mocks.ts b/src/core/server/saved_objects/saved_objects_service.test.mocks.ts index d0ac98fa5e3c..1faebcc5fcc9 100644 --- a/src/core/server/saved_objects/saved_objects_service.test.mocks.ts +++ b/src/core/server/saved_objects/saved_objects_service.test.mocks.ts @@ -25,3 +25,8 @@ export const typeRegistryInstanceMock = typeRegistryMock.create(); jest.doMock('./saved_objects_type_registry', () => ({ SavedObjectTypeRegistry: jest.fn().mockImplementation(() => typeRegistryInstanceMock), })); + +export const registerRoutesMock = jest.fn(); +jest.doMock('./routes', () => ({ + registerRoutes: registerRoutesMock, +})); diff --git a/src/core/server/saved_objects/saved_objects_service.test.ts b/src/core/server/saved_objects/saved_objects_service.test.ts index 7321e760273b..a4f6c019c962 100644 --- a/src/core/server/saved_objects/saved_objects_service.test.ts +++ b/src/core/server/saved_objects/saved_objects_service.test.ts @@ -6,17 +6,25 @@ * Side Public License, v 1. */ +import { join } from 'path'; +import loadJsonFile from 'load-json-file'; + import { - migratorInstanceMock, clientProviderInstanceMock, + KibanaMigratorMock, + migratorInstanceMock, + registerRoutesMock, typeRegistryInstanceMock, } from './saved_objects_service.test.mocks'; import { BehaviorSubject } from 'rxjs'; +import { RawPackageInfo } from '@kbn/config'; import { ByteSizeValue } from '@kbn/config-schema'; +import { REPO_ROOT } from '@kbn/dev-utils'; import { SavedObjectsService } from './saved_objects_service'; import { mockCoreContext } from '../core_context.mock'; import { Env } from '../config'; +import { getEnvOptions } from '../config/mocks'; import { configServiceMock } from '../mocks'; import { elasticsearchServiceMock } from '../elasticsearch/elasticsearch_service.mock'; import { coreUsageDataServiceMock } from '../core_usage_data/core_usage_data_service.mock'; @@ -108,6 +116,42 @@ describe('SavedObjectsService', () => { expect(mockRegistry.registerDeprecations).toHaveBeenCalledWith(deprecations); }); + it('registers the deprecation provider with the correct kibanaVersion', async () => { + const pkg = loadJsonFile.sync(join(REPO_ROOT, 'package.json')) as RawPackageInfo; + const kibanaVersion = pkg.version; + + const coreContext = createCoreContext({ + env: Env.createDefault(REPO_ROOT, getEnvOptions(), { + ...pkg, + version: `${kibanaVersion}-beta1`, // test behavior when release has a version qualifier + }), + }); + + const soService = new SavedObjectsService(coreContext); + await soService.setup(createSetupDeps()); + + expect(getSavedObjectsDeprecationsProvider).toHaveBeenCalledWith( + expect.objectContaining({ kibanaVersion }) + ); + }); + + it('calls registerRoutes with the correct kibanaVersion', async () => { + const pkg = loadJsonFile.sync(join(REPO_ROOT, 'package.json')) as RawPackageInfo; + const kibanaVersion = pkg.version; + + const coreContext = createCoreContext({ + env: Env.createDefault(REPO_ROOT, getEnvOptions(), { + ...pkg, + version: `${kibanaVersion}-beta1`, // test behavior when release has a version qualifier + }), + }); + + const soService = new SavedObjectsService(coreContext); + await soService.setup(createSetupDeps()); + + expect(registerRoutesMock).toHaveBeenCalledWith(expect.objectContaining({ kibanaVersion })); + }); + describe('#setClientFactoryProvider', () => { it('registers the factory to the clientProvider', async () => { const coreContext = createCoreContext(); @@ -218,6 +262,24 @@ describe('SavedObjectsService', () => { expect(migratorInstanceMock.runMigrations).not.toHaveBeenCalled(); }); + it('calls KibanaMigrator with correct version', async () => { + const pkg = loadJsonFile.sync(join(REPO_ROOT, 'package.json')) as RawPackageInfo; + const kibanaVersion = pkg.version; + + const coreContext = createCoreContext({ + env: Env.createDefault(REPO_ROOT, getEnvOptions(), { + ...pkg, + version: `${kibanaVersion}-beta1`, // test behavior when release has a version qualifier + }), + }); + + const soService = new SavedObjectsService(coreContext); + await soService.setup(createSetupDeps()); + await soService.start(createStartDeps()); + + expect(KibanaMigratorMock).toHaveBeenCalledWith(expect.objectContaining({ kibanaVersion })); + }); + it('waits for all es nodes to be compatible before running migrations', async (done) => { expect.assertions(2); const coreContext = createCoreContext({ skipMigration: false }); diff --git a/src/core/server/saved_objects/saved_objects_service.ts b/src/core/server/saved_objects/saved_objects_service.ts index 33d75c38f436..baa1636dde13 100644 --- a/src/core/server/saved_objects/saved_objects_service.ts +++ b/src/core/server/saved_objects/saved_objects_service.ts @@ -278,6 +278,7 @@ export class SavedObjectsService implements CoreService { private logger: Logger; + private readonly kibanaVersion: string; private setupDeps?: SavedObjectsSetupDeps; private config?: SavedObjectConfig; @@ -290,6 +291,9 @@ export class SavedObjectsService constructor(private readonly coreContext: CoreContext) { this.logger = coreContext.logger.get('savedobjects-service'); + this.kibanaVersion = SavedObjectsService.stripVersionQualifier( + this.coreContext.env.packageInfo.version + ); } public async setup(setupDeps: SavedObjectsSetupDeps): Promise { @@ -312,7 +316,7 @@ export class SavedObjectsService getSavedObjectsDeprecationsProvider({ kibanaIndex, savedObjectsConfig: this.config, - kibanaVersion: this.coreContext.env.packageInfo.version, + kibanaVersion: this.kibanaVersion, typeRegistry: this.typeRegistry, }) ); @@ -326,7 +330,7 @@ export class SavedObjectsService config: this.config, migratorPromise: this.migrator$.pipe(first()).toPromise(), kibanaIndex, - kibanaVersion: this.coreContext.env.packageInfo.version, + kibanaVersion: this.kibanaVersion, }); registerCoreObjectTypes(this.typeRegistry); @@ -502,11 +506,19 @@ export class SavedObjectsService return new KibanaMigrator({ typeRegistry: this.typeRegistry, logger: this.logger, - kibanaVersion: this.coreContext.env.packageInfo.version, + kibanaVersion: this.kibanaVersion, soMigrationsConfig, kibanaIndex, client, migrationsRetryDelay, }); } + + /** + * Coerce a semver-like string (x.y.z-SNAPSHOT) or prerelease version (x.y.z-alpha) + * to regular semver (x.y.z). + */ + private static stripVersionQualifier(version: string) { + return version.split('-')[0]; + } }