[Reporting/Migration] ReportingSetup, LegacySetup (#54198) (#55441)

* ReportingSetup, LegacySetup

* fix ts
This commit is contained in:
Tim Sullivan 2020-01-21 17:38:53 -07:00 committed by GitHub
parent 0373fd46ca
commit 03cf52161d
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 123 additions and 68 deletions

View file

@ -7,47 +7,20 @@
import { resolve } from 'path';
import { i18n } from '@kbn/i18n';
import { Legacy } from 'kibana';
import { IUiSettingsClient } from 'src/core/server';
import { XPackMainPlugin } from '../xpack_main/server/xpack_main';
import { PLUGIN_ID, UI_SETTINGS_CUSTOM_PDF_LOGO } from './common/constants';
// @ts-ignore untyped module defintition
import { mirrorPluginStatus } from '../../server/lib/mirror_plugin_status';
import { registerRoutes } from './server/routes';
import {
LevelLogger,
checkLicenseFactory,
getExportTypesRegistry,
runValidations,
} from './server/lib';
import { createBrowserDriverFactory } from './server/browsers';
import { registerReportingUsageCollector } from './server/usage';
import { ReportingConfigOptions, ReportingPluginSpecOptions } from './types.d';
import { config as reportingConfig } from './config';
import { logConfiguration } from './log_configuration';
import {
LegacySetup,
ReportingPlugin,
ReportingSetupDeps,
reportingPluginFactory,
} from './server/plugin';
const kbToBase64Length = (kb: number) => {
return Math.floor((kb * 1024 * 8) / 6);
};
type LegacyPlugins = Legacy.Server['plugins'];
export interface ServerFacade {
config: Legacy.Server['config'];
info: Legacy.Server['info'];
log: Legacy.Server['log'];
plugins: {
elasticsearch: LegacyPlugins['elasticsearch'];
security: LegacyPlugins['security'];
xpack_main: XPackMainPlugin & {
status?: any;
};
};
route: Legacy.Server['route'];
savedObjects: Legacy.Server['savedObjects'];
uiSettingsServiceFactory: Legacy.Server['uiSettingsServiceFactory'];
fieldFormatServiceFactory: (uiConfig: IUiSettingsClient) => unknown;
}
export const reporting = (kibana: any) => {
return new kibana.Plugin({
id: PLUGIN_ID,
@ -93,7 +66,11 @@ export const reporting = (kibana: any) => {
},
async init(server: Legacy.Server) {
const serverFacade: ServerFacade = {
const coreSetup = server.newPlatform.setup.core;
const pluginsSetup: ReportingSetupDeps = {
usageCollection: server.newPlatform.setup.plugins.usageCollection,
};
const __LEGACY: LegacySetup = {
config: server.config,
info: server.info,
route: server.route.bind(server),
@ -108,38 +85,9 @@ export const reporting = (kibana: any) => {
fieldFormatServiceFactory: server.fieldFormatServiceFactory,
log: server.log.bind(server),
};
const exportTypesRegistry = getExportTypesRegistry();
let isCollectorReady = false;
// Register a function with server to manage the collection of usage stats
const { usageCollection } = server.newPlatform.setup.plugins;
registerReportingUsageCollector(
usageCollection,
serverFacade,
() => isCollectorReady,
exportTypesRegistry
);
const logger = LevelLogger.createForServer(serverFacade, [PLUGIN_ID]);
const browserDriverFactory = await createBrowserDriverFactory(serverFacade);
logConfiguration(serverFacade, logger);
runValidations(serverFacade, logger, browserDriverFactory);
const { xpack_main: xpackMainPlugin } = serverFacade.plugins;
mirrorPluginStatus(xpackMainPlugin, this);
const checkLicense = checkLicenseFactory(exportTypesRegistry);
(xpackMainPlugin as any).status.once('green', () => {
// Register a function that is called whenever the xpack info changes,
// to re-compute the license check results for this plugin
xpackMainPlugin.info.feature(this.id).registerLicenseCheckResultsGenerator(checkLicense);
});
// Post initialization of the above code, the collector is now ready to fetch its data
isCollectorReady = true;
// Reporting routes
registerRoutes(serverFacade, exportTypesRegistry, browserDriverFactory, logger);
const plugin: ReportingPlugin = reportingPluginFactory(__LEGACY, this);
await plugin.setup(coreSetup, pluginsSetup);
},
deprecations({ unused }: any) {

View file

@ -0,0 +1,107 @@
/*
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
* or more contributor license agreements. Licensed under the Elastic License;
* you may not use this file except in compliance with the Elastic License.
*/
import { Legacy } from 'kibana';
import { CoreSetup, CoreStart, Plugin } from 'src/core/server';
import { IUiSettingsClient } from 'src/core/server';
import { UsageCollectionSetup } from 'src/plugins/usage_collection/server';
import { XPackMainPlugin } from '../../xpack_main/server/xpack_main';
// @ts-ignore
import { mirrorPluginStatus } from '../../../server/lib/mirror_plugin_status';
import { PLUGIN_ID } from '../common/constants';
import { ReportingPluginSpecOptions } from '../types.d';
import { registerRoutes } from './routes';
import { LevelLogger, checkLicenseFactory, getExportTypesRegistry, runValidations } from './lib';
import { createBrowserDriverFactory } from './browsers';
import { registerReportingUsageCollector } from './usage';
import { logConfiguration } from '../log_configuration';
// For now there is no exposed functionality to other plugins
export type ReportingSetup = object;
export type ReportingStart = object;
export interface ReportingSetupDeps {
usageCollection: UsageCollectionSetup;
}
export type ReportingStartDeps = object;
type LegacyPlugins = Legacy.Server['plugins'];
export interface LegacySetup {
config: Legacy.Server['config'];
info: Legacy.Server['info'];
log: Legacy.Server['log'];
plugins: {
elasticsearch: LegacyPlugins['elasticsearch'];
security: LegacyPlugins['security'];
xpack_main: XPackMainPlugin & {
status?: any;
};
};
route: Legacy.Server['route'];
savedObjects: Legacy.Server['savedObjects'];
uiSettingsServiceFactory: Legacy.Server['uiSettingsServiceFactory'];
fieldFormatServiceFactory: (uiConfig: IUiSettingsClient) => unknown;
}
export type ReportingPlugin = Plugin<
ReportingSetup,
ReportingStart,
ReportingSetupDeps,
ReportingStartDeps
>;
/* We need a factory that returns an instance of the class because the class
* implementation itself restricts against having Legacy dependencies passed
* into `setup`. The factory parameters take the legacy dependencies, and the
* `setup` method gets it from enclosure */
export function reportingPluginFactory(
__LEGACY: LegacySetup,
legacyPlugin: ReportingPluginSpecOptions
) {
return new (class ReportingPlugin implements ReportingPlugin {
public async setup(core: CoreSetup, plugins: ReportingSetupDeps): Promise<ReportingSetup> {
const exportTypesRegistry = getExportTypesRegistry();
let isCollectorReady = false;
// Register a function with server to manage the collection of usage stats
const { usageCollection } = plugins;
registerReportingUsageCollector(
usageCollection,
__LEGACY,
() => isCollectorReady,
exportTypesRegistry
);
const logger = LevelLogger.createForServer(__LEGACY, [PLUGIN_ID]);
const browserDriverFactory = await createBrowserDriverFactory(__LEGACY);
logConfiguration(__LEGACY, logger);
runValidations(__LEGACY, logger, browserDriverFactory);
const { xpack_main: xpackMainPlugin } = __LEGACY.plugins;
mirrorPluginStatus(xpackMainPlugin, legacyPlugin);
const checkLicense = checkLicenseFactory(exportTypesRegistry);
(xpackMainPlugin as any).status.once('green', () => {
// Register a function that is called whenever the xpack info changes,
// to re-compute the license check results for this plugin
xpackMainPlugin.info.feature(PLUGIN_ID).registerLicenseCheckResultsGenerator(checkLicense);
});
// Post initialization of the above code, the collector is now ready to fetch its data
isCollectorReady = true;
// Reporting routes
registerRoutes(__LEGACY, exportTypesRegistry, browserDriverFactory, logger);
return {};
}
public start(core: CoreStart, plugins: ReportingStartDeps): ReportingStart {
return {};
}
})();
}

View file

@ -15,7 +15,7 @@ import { CancellationToken } from './common/cancellation_token';
import { LevelLogger } from './server/lib/level_logger';
import { HeadlessChromiumDriverFactory } from './server/browsers/chromium/driver_factory';
import { BrowserType } from './server/browsers/types';
import { ServerFacade } from './index';
import { LegacySetup } from './server/plugin';
export type ReportingPlugin = object; // For Plugin contract
@ -69,6 +69,8 @@ interface GenerateExportTypePayload {
* Legacy System
*/
export type ServerFacade = LegacySetup;
export type ReportingPluginSpecOptions = Legacy.PluginSpecOptions;
export type EnqueueJobFn = <JobParamsType>(
@ -352,5 +354,3 @@ export interface InterceptedRequest {
frameId: string;
resourceType: string;
}
export { ServerFacade };