[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(() => {
(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();

View file

@ -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,

View file

@ -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,
}));

View file

@ -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 });

View file

@ -278,6 +278,7 @@ export class SavedObjectsService
implements CoreService<InternalSavedObjectsServiceSetup, InternalSavedObjectsServiceStart>
{
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<InternalSavedObjectsServiceSetup> {
@ -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];
}
}