[saved objects] Strip version qualifier in SO service to fix unknown type deprecations. (#116480) (#116858)

Co-authored-by: Luke Elmers <luke.elmers@elastic.co>
This commit is contained in:
Kibana Machine 2021-10-29 20:13:19 -04:00 committed by GitHub
parent 91b28f3351
commit 3911490502
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
5 changed files with 84 additions and 14 deletions

View file

@ -46,15 +46,6 @@ describe('KibanaMigrator', () => {
beforeEach(() => { beforeEach(() => {
(DocumentMigrator as jest.Mock).mockClear(); (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', () => { describe('getActiveMappings', () => {
it('returns full index mappings w/ core properties', () => { it('returns full index mappings w/ core properties', () => {
const options = mockOptions(); const options = mockOptions();

View file

@ -88,7 +88,7 @@ export class KibanaMigrator {
this.serializer = new SavedObjectsSerializer(this.typeRegistry); this.serializer = new SavedObjectsSerializer(this.typeRegistry);
this.mappingProperties = mergeTypes(this.typeRegistry.getAllTypes()); this.mappingProperties = mergeTypes(this.typeRegistry.getAllTypes());
this.log = logger; 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({ this.documentMigrator = new DocumentMigrator({
kibanaVersion: this.kibanaVersion, kibanaVersion: this.kibanaVersion,
typeRegistry, typeRegistry,

View file

@ -25,3 +25,8 @@ export const typeRegistryInstanceMock = typeRegistryMock.create();
jest.doMock('./saved_objects_type_registry', () => ({ jest.doMock('./saved_objects_type_registry', () => ({
SavedObjectTypeRegistry: jest.fn().mockImplementation(() => typeRegistryInstanceMock), SavedObjectTypeRegistry: jest.fn().mockImplementation(() => typeRegistryInstanceMock),
})); }));
export const registerRoutesMock = jest.fn();
jest.doMock('./routes', () => ({
registerRoutes: registerRoutesMock,
}));

View file

@ -6,17 +6,25 @@
* Side Public License, v 1. * Side Public License, v 1.
*/ */
import { join } from 'path';
import loadJsonFile from 'load-json-file';
import { import {
migratorInstanceMock,
clientProviderInstanceMock, clientProviderInstanceMock,
KibanaMigratorMock,
migratorInstanceMock,
registerRoutesMock,
typeRegistryInstanceMock, typeRegistryInstanceMock,
} from './saved_objects_service.test.mocks'; } from './saved_objects_service.test.mocks';
import { BehaviorSubject } from 'rxjs'; import { BehaviorSubject } from 'rxjs';
import { RawPackageInfo } from '@kbn/config';
import { ByteSizeValue } from '@kbn/config-schema'; import { ByteSizeValue } from '@kbn/config-schema';
import { REPO_ROOT } from '@kbn/dev-utils';
import { SavedObjectsService } from './saved_objects_service'; import { SavedObjectsService } from './saved_objects_service';
import { mockCoreContext } from '../core_context.mock'; import { mockCoreContext } from '../core_context.mock';
import { Env } from '../config'; import { Env } from '../config';
import { getEnvOptions } from '../config/mocks';
import { configServiceMock } from '../mocks'; import { configServiceMock } from '../mocks';
import { elasticsearchServiceMock } from '../elasticsearch/elasticsearch_service.mock'; import { elasticsearchServiceMock } from '../elasticsearch/elasticsearch_service.mock';
import { coreUsageDataServiceMock } from '../core_usage_data/core_usage_data_service.mock'; import { coreUsageDataServiceMock } from '../core_usage_data/core_usage_data_service.mock';
@ -108,6 +116,42 @@ describe('SavedObjectsService', () => {
expect(mockRegistry.registerDeprecations).toHaveBeenCalledWith(deprecations); 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', () => { describe('#setClientFactoryProvider', () => {
it('registers the factory to the clientProvider', async () => { it('registers the factory to the clientProvider', async () => {
const coreContext = createCoreContext(); const coreContext = createCoreContext();
@ -218,6 +262,24 @@ describe('SavedObjectsService', () => {
expect(migratorInstanceMock.runMigrations).not.toHaveBeenCalled(); 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) => { it('waits for all es nodes to be compatible before running migrations', async (done) => {
expect.assertions(2); expect.assertions(2);
const coreContext = createCoreContext({ skipMigration: false }); const coreContext = createCoreContext({ skipMigration: false });

View file

@ -278,6 +278,7 @@ export class SavedObjectsService
implements CoreService<InternalSavedObjectsServiceSetup, InternalSavedObjectsServiceStart> implements CoreService<InternalSavedObjectsServiceSetup, InternalSavedObjectsServiceStart>
{ {
private logger: Logger; private logger: Logger;
private readonly kibanaVersion: string;
private setupDeps?: SavedObjectsSetupDeps; private setupDeps?: SavedObjectsSetupDeps;
private config?: SavedObjectConfig; private config?: SavedObjectConfig;
@ -290,6 +291,9 @@ export class SavedObjectsService
constructor(private readonly coreContext: CoreContext) { constructor(private readonly coreContext: CoreContext) {
this.logger = coreContext.logger.get('savedobjects-service'); this.logger = coreContext.logger.get('savedobjects-service');
this.kibanaVersion = SavedObjectsService.stripVersionQualifier(
this.coreContext.env.packageInfo.version
);
} }
public async setup(setupDeps: SavedObjectsSetupDeps): Promise<InternalSavedObjectsServiceSetup> { public async setup(setupDeps: SavedObjectsSetupDeps): Promise<InternalSavedObjectsServiceSetup> {
@ -312,7 +316,7 @@ export class SavedObjectsService
getSavedObjectsDeprecationsProvider({ getSavedObjectsDeprecationsProvider({
kibanaIndex, kibanaIndex,
savedObjectsConfig: this.config, savedObjectsConfig: this.config,
kibanaVersion: this.coreContext.env.packageInfo.version, kibanaVersion: this.kibanaVersion,
typeRegistry: this.typeRegistry, typeRegistry: this.typeRegistry,
}) })
); );
@ -326,7 +330,7 @@ export class SavedObjectsService
config: this.config, config: this.config,
migratorPromise: this.migrator$.pipe(first()).toPromise(), migratorPromise: this.migrator$.pipe(first()).toPromise(),
kibanaIndex, kibanaIndex,
kibanaVersion: this.coreContext.env.packageInfo.version, kibanaVersion: this.kibanaVersion,
}); });
registerCoreObjectTypes(this.typeRegistry); registerCoreObjectTypes(this.typeRegistry);
@ -502,11 +506,19 @@ export class SavedObjectsService
return new KibanaMigrator({ return new KibanaMigrator({
typeRegistry: this.typeRegistry, typeRegistry: this.typeRegistry,
logger: this.logger, logger: this.logger,
kibanaVersion: this.coreContext.env.packageInfo.version, kibanaVersion: this.kibanaVersion,
soMigrationsConfig, soMigrationsConfig,
kibanaIndex, kibanaIndex,
client, client,
migrationsRetryDelay, 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];
}
} }