[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:
parent
91b28f3351
commit
3911490502
|
@ -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();
|
||||||
|
|
|
@ -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,
|
||||||
|
|
|
@ -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,
|
||||||
|
}));
|
||||||
|
|
|
@ -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 });
|
||||||
|
|
|
@ -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];
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue