= (
coreSetup: CoreSetup,
@@ -49,6 +50,7 @@ export type ServiceFromProvider = P extends CanvasServiceProvider ?
export const services = {
notify: new CanvasServiceProvider(notifyServiceFactory),
+ platform: new CanvasServiceProvider(platformServiceFactory),
};
export interface CanvasServices {
@@ -70,4 +72,4 @@ export const stopServices = () => {
Object.entries(services).forEach(([key, provider]) => provider.stop());
};
-export const { notify: notifyService } = services;
+export const { notify: notifyService, platform: platformService } = services;
diff --git a/x-pack/legacy/plugins/canvas/public/services/platform.ts b/x-pack/legacy/plugins/canvas/public/services/platform.ts
new file mode 100644
index 0000000000000..440e9523044c1
--- /dev/null
+++ b/x-pack/legacy/plugins/canvas/public/services/platform.ts
@@ -0,0 +1,24 @@
+/*
+ * 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 { CanvasServiceFactory } from '.';
+import { CoreStart, CoreSetup, CanvasSetupDeps, CanvasStartDeps } from '../plugin';
+
+interface PlatformService {
+ coreSetup: CoreSetup;
+ coreStart: CoreStart;
+ setupPlugins: CanvasSetupDeps;
+ startPlugins: CanvasStartDeps;
+}
+
+export const platformServiceFactory: CanvasServiceFactory = (
+ coreSetup,
+ coreStart,
+ setupPlugins,
+ startPlugins
+) => {
+ return { coreSetup, coreStart, setupPlugins, startPlugins };
+};
diff --git a/x-pack/legacy/plugins/canvas/public/state/initial_state.js b/x-pack/legacy/plugins/canvas/public/state/initial_state.js
index 40c017543147f..bfa68b33908e0 100644
--- a/x-pack/legacy/plugins/canvas/public/state/initial_state.js
+++ b/x-pack/legacy/plugins/canvas/public/state/initial_state.js
@@ -5,7 +5,7 @@
*/
import { get } from 'lodash';
-import { getCoreStart } from '../legacy';
+import { platformService } from '../services';
import { getDefaultWorkpad } from './defaults';
export const getInitialState = path => {
@@ -13,7 +13,7 @@ export const getInitialState = path => {
app: {}, // Kibana stuff in here
assets: {}, // assets end up here
transient: {
- canUserWrite: getCoreStart().application.capabilities.canvas.save,
+ canUserWrite: platformService.getService().coreStart.application.capabilities.canvas.save,
zoomScale: 1,
elementStats: {
total: 0,
diff --git a/x-pack/legacy/plugins/canvas/public/state/reducers/workpad.js b/x-pack/legacy/plugins/canvas/public/state/reducers/workpad.js
index 12733680ed32d..30f9c638a054f 100644
--- a/x-pack/legacy/plugins/canvas/public/state/reducers/workpad.js
+++ b/x-pack/legacy/plugins/canvas/public/state/reducers/workpad.js
@@ -5,7 +5,7 @@
*/
import { handleActions } from 'redux-actions';
-import { getCoreStart } from '../../legacy';
+import { platformService } from '../../services';
import { getDefaultWorkpad } from '../defaults';
import {
setWorkpad,
@@ -22,11 +22,13 @@ import { APP_ROUTE_WORKPAD } from '../../../common/lib/constants';
export const workpadReducer = handleActions(
{
[setWorkpad]: (workpadState, { payload }) => {
- getCoreStart().chrome.recentlyAccessed.add(
- `${APP_ROUTE_WORKPAD}/${payload.id}`,
- payload.name,
- payload.id
- );
+ platformService
+ .getService()
+ .coreStart.chrome.recentlyAccessed.add(
+ `${APP_ROUTE_WORKPAD}/${payload.id}`,
+ payload.name,
+ payload.id
+ );
return payload;
},
@@ -39,11 +41,13 @@ export const workpadReducer = handleActions(
},
[setName]: (workpadState, { payload }) => {
- getCoreStart().chrome.recentlyAccessed.add(
- `${APP_ROUTE_WORKPAD}/${workpadState.id}`,
- payload,
- workpadState.id
- );
+ platformService
+ .getService()
+ .coreStart.chrome.recentlyAccessed.add(
+ `${APP_ROUTE_WORKPAD}/${workpadState.id}`,
+ payload,
+ workpadState.id
+ );
return { ...workpadState, name: payload };
},
diff --git a/x-pack/legacy/plugins/monitoring/common/constants.ts b/x-pack/legacy/plugins/monitoring/common/constants.ts
index 3a4c7b71dcd03..36030e1fa7f2a 100644
--- a/x-pack/legacy/plugins/monitoring/common/constants.ts
+++ b/x-pack/legacy/plugins/monitoring/common/constants.ts
@@ -251,7 +251,7 @@ export const ALERT_TYPES = [ALERT_TYPE_LICENSE_EXPIRATION, ALERT_TYPE_CLUSTER_ST
/**
* Matches the id for the built-in in email action type
- * See x-pack/legacy/plugins/actions/server/builtin_action_types/email.ts
+ * See x-pack/plugins/actions/server/builtin_action_types/email.ts
*/
export const ALERT_ACTION_TYPE_EMAIL = '.email';
diff --git a/x-pack/legacy/plugins/security/index.ts b/x-pack/legacy/plugins/security/index.ts
index 5b2218af1fd52..b1dec2ce82c52 100644
--- a/x-pack/legacy/plugins/security/index.ts
+++ b/x-pack/legacy/plugins/security/index.ts
@@ -78,9 +78,7 @@ export const security = (kibana: Record) =>
// features are up to date.
xpackInfo
.feature(this.id)
- .registerLicenseCheckResultsGenerator(() =>
- securityPlugin.__legacyCompat.license.getFeatures()
- );
+ .registerLicenseCheckResultsGenerator(() => securityPlugin.license.getFeatures());
server.expose({
getUser: async (request: LegacyRequest) =>
diff --git a/x-pack/legacy/plugins/task_manager/server/index.ts b/x-pack/legacy/plugins/task_manager/server/index.ts
index 3ea687f7003f4..a3167920efa06 100644
--- a/x-pack/legacy/plugins/task_manager/server/index.ts
+++ b/x-pack/legacy/plugins/task_manager/server/index.ts
@@ -6,8 +6,6 @@
import { Root } from 'joi';
import { Legacy } from 'kibana';
-import mappings from './mappings.json';
-import { migrations } from './migrations';
import { createLegacyApi, getTaskManagerSetup } from './legacy';
export { LegacyTaskManagerApi, getTaskManagerSetup, getTaskManagerStart } from './legacy';
@@ -21,19 +19,6 @@ import {
ArrayOrItem,
} from '../../../../../src/legacy/plugin_discovery/types';
-const savedObjectSchemas = {
- task: {
- hidden: true,
- isNamespaceAgnostic: true,
- convertToAliasScript: `ctx._id = ctx._source.type + ':' + ctx._id`,
- // legacy config is marked as any in core, no choice here
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
- indexPattern(config: any) {
- return config.get('xpack.task_manager.index');
- },
- },
-};
-
export function taskManager(kibana: LegacyPluginApi): ArrayOrItem {
return new kibana.Plugin({
id: 'task_manager',
@@ -58,7 +43,7 @@ export function taskManager(kibana: LegacyPluginApi): ArrayOrItem {
// we can't tell the Kibana Platform Task Manager plugin to
// to wait to `start` as that happens before legacy plugins
@@ -77,10 +62,5 @@ export function taskManager(kibana: LegacyPluginApi): ArrayOrItem
- new kibana.Plugin({
- configPrefix: 'xpack.uptime',
- id: PLUGIN.ID,
- publicDir: resolve(__dirname, 'public'),
- require: ['alerting', 'kibana', 'elasticsearch', 'xpack_main'],
- uiExports: {
- app: {
- description: i18n.translate('xpack.uptime.pluginDescription', {
- defaultMessage: 'Uptime monitoring',
- description: 'The description text that will be shown to users in Kibana',
- }),
- icon: 'plugins/uptime/icons/heartbeat_white.svg',
- euiIconType: 'uptimeApp',
- title: i18n.translate('xpack.uptime.uptimeFeatureCatalogueTitle', {
- defaultMessage: 'Uptime',
- }),
- main: 'plugins/uptime/app',
- order: 8900,
- url: '/app/uptime#/',
- category: DEFAULT_APP_CATEGORIES.observability,
- },
- home: ['plugins/uptime/register_feature'],
- },
- });
diff --git a/x-pack/legacy/plugins/uptime/public/apps/index.ts b/x-pack/legacy/plugins/uptime/public/apps/index.ts
deleted file mode 100644
index d58bf8398fcde..0000000000000
--- a/x-pack/legacy/plugins/uptime/public/apps/index.ts
+++ /dev/null
@@ -1,16 +0,0 @@
-/*
- * 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 { npSetup } from 'ui/new_platform';
-import { Plugin } from './plugin';
-import 'uiExports/embeddableFactories';
-
-const plugin = new Plugin({
- opaqueId: Symbol('uptime'),
- env: {} as any,
- config: { get: () => ({} as any) },
-});
-plugin.setup(npSetup);
diff --git a/x-pack/legacy/plugins/uptime/public/apps/plugin.ts b/x-pack/legacy/plugins/uptime/public/apps/plugin.ts
deleted file mode 100644
index e73598c44c9f0..0000000000000
--- a/x-pack/legacy/plugins/uptime/public/apps/plugin.ts
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- * 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 { LegacyCoreSetup, PluginInitializerContext, AppMountParameters } from 'src/core/public';
-import { PluginsSetup } from 'ui/new_platform/new_platform';
-import { FeatureCatalogueCategory } from '../../../../../../src/plugins/home/public';
-import { UMFrontendLibs } from '../lib/lib';
-import { PLUGIN } from '../../common/constants';
-import { getKibanaFrameworkAdapter } from '../lib/adapters/framework/new_platform_adapter';
-
-export interface SetupObject {
- core: LegacyCoreSetup;
- plugins: PluginsSetup;
-}
-
-export class Plugin {
- constructor(
- // @ts-ignore this is added to satisfy the New Platform typing constraint,
- // but we're not leveraging any of its functionality yet.
- private readonly initializerContext: PluginInitializerContext
- ) {}
-
- public setup(setup: SetupObject) {
- const { core, plugins } = setup;
- const { home } = plugins;
-
- home.featureCatalogue.register({
- category: FeatureCatalogueCategory.DATA,
- description: PLUGIN.DESCRIPTION,
- icon: 'uptimeApp',
- id: PLUGIN.ID,
- path: '/app/uptime#/',
- showOnHomePage: true,
- title: PLUGIN.TITLE,
- });
-
- core.application.register({
- id: PLUGIN.ID,
- euiIconType: 'uptimeApp',
- order: 8900,
- title: 'Uptime',
- async mount(params: AppMountParameters) {
- const [coreStart] = await core.getStartServices();
- const { element } = params;
- const libs: UMFrontendLibs = {
- framework: getKibanaFrameworkAdapter(coreStart, plugins),
- };
- libs.framework.render(element);
- return () => {};
- },
- });
- }
-}
diff --git a/x-pack/legacy/plugins/uptime/public/register_feature.ts b/x-pack/legacy/plugins/uptime/public/register_feature.ts
deleted file mode 100644
index 2f83fa33ba4bc..0000000000000
--- a/x-pack/legacy/plugins/uptime/public/register_feature.ts
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * 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 { i18n } from '@kbn/i18n';
-import { npSetup } from 'ui/new_platform';
-import { FeatureCatalogueCategory } from '../../../../../src/plugins/home/public';
-
-const {
- plugins: { home },
-} = npSetup;
-
-home.featureCatalogue.register({
- id: 'uptime',
- title: i18n.translate('xpack.uptime.uptimeFeatureCatalogueTitle', { defaultMessage: 'Uptime' }),
- description: i18n.translate('xpack.uptime.featureCatalogueDescription', {
- defaultMessage: 'Perform endpoint health checks and uptime monitoring.',
- }),
- icon: 'uptimeApp',
- path: `uptime#/`,
- showOnHomePage: true,
- category: FeatureCatalogueCategory.DATA,
-});
diff --git a/x-pack/legacy/plugins/uptime/tsconfig.json b/x-pack/legacy/plugins/uptime/tsconfig.json
deleted file mode 100644
index 53425909db3e8..0000000000000
--- a/x-pack/legacy/plugins/uptime/tsconfig.json
+++ /dev/null
@@ -1,7 +0,0 @@
-{
- "extends": "../../../tsconfig.json",
- "exclude": ["**/node_modules/**"],
- "paths": {
- "react": ["../../../node_modules/@types/react"]
- }
-}
\ No newline at end of file
diff --git a/x-pack/plugins/actions/server/plugin.ts b/x-pack/plugins/actions/server/plugin.ts
index 10e4d64584340..a6cc1fb5463bb 100644
--- a/x-pack/plugins/actions/server/plugin.ts
+++ b/x-pack/plugins/actions/server/plugin.ts
@@ -53,6 +53,7 @@ import {
} from './routes';
import { IEventLogger, IEventLogService } from '../../event_log/server';
import { initializeActionsTelemetry, scheduleActionsTelemetry } from './usage/task';
+import { setupSavedObjects } from './saved_objects';
const EVENT_LOG_PROVIDER = 'actions';
export const EVENT_LOG_ACTIONS = {
@@ -133,19 +134,7 @@ export class ActionsPlugin implements Plugin, Plugi
);
}
- // Encrypted attributes
- // - `secrets` properties will be encrypted
- // - `config` will be included in AAD
- // - everything else excluded from AAD
- plugins.encryptedSavedObjects.registerType({
- type: 'action',
- attributesToEncrypt: new Set(['secrets']),
- attributesToExcludeFromAAD: new Set(['name']),
- });
- plugins.encryptedSavedObjects.registerType({
- type: 'action_task_params',
- attributesToEncrypt: new Set(['apiKey']),
- });
+ setupSavedObjects(core.savedObjects, plugins.encryptedSavedObjects);
plugins.eventLog.registerProviderActions(EVENT_LOG_PROVIDER, Object.values(EVENT_LOG_ACTIONS));
this.eventLogger = plugins.eventLog.getLogger({
diff --git a/x-pack/plugins/actions/server/saved_objects/index.ts b/x-pack/plugins/actions/server/saved_objects/index.ts
new file mode 100644
index 0000000000000..dbd7925f96871
--- /dev/null
+++ b/x-pack/plugins/actions/server/saved_objects/index.ts
@@ -0,0 +1,42 @@
+/*
+ * 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 { SavedObjectsServiceSetup } from 'kibana/server';
+import mappings from './mappings.json';
+import { EncryptedSavedObjectsPluginSetup } from '../../../encrypted_saved_objects/server';
+
+export function setupSavedObjects(
+ savedObjects: SavedObjectsServiceSetup,
+ encryptedSavedObjects: EncryptedSavedObjectsPluginSetup
+) {
+ savedObjects.registerType({
+ name: 'action',
+ hidden: false,
+ namespaceType: 'single',
+ mappings: mappings.action,
+ });
+
+ // Encrypted attributes
+ // - `secrets` properties will be encrypted
+ // - `config` will be included in AAD
+ // - everything else excluded from AAD
+ encryptedSavedObjects.registerType({
+ type: 'action',
+ attributesToEncrypt: new Set(['secrets']),
+ attributesToExcludeFromAAD: new Set(['name']),
+ });
+
+ savedObjects.registerType({
+ name: 'action_task_params',
+ hidden: false,
+ namespaceType: 'single',
+ mappings: mappings.action_task_params,
+ });
+ encryptedSavedObjects.registerType({
+ type: 'action_task_params',
+ attributesToEncrypt: new Set(['apiKey']),
+ });
+}
diff --git a/x-pack/legacy/plugins/actions/server/mappings.json b/x-pack/plugins/actions/server/saved_objects/mappings.json
similarity index 100%
rename from x-pack/legacy/plugins/actions/server/mappings.json
rename to x-pack/plugins/actions/server/saved_objects/mappings.json
diff --git a/x-pack/plugins/alerting/server/plugin.ts b/x-pack/plugins/alerting/server/plugin.ts
index c03d3506a051d..8cdde2eeb9877 100644
--- a/x-pack/plugins/alerting/server/plugin.ts
+++ b/x-pack/plugins/alerting/server/plugin.ts
@@ -58,6 +58,7 @@ import { Services } from './types';
import { registerAlertsUsageCollector } from './usage';
import { initializeAlertingTelemetry, scheduleAlertingTelemetry } from './usage/task';
import { IEventLogger, IEventLogService } from '../../event_log/server';
+import { setupSavedObjects } from './saved_objects';
const EVENT_LOG_PROVIDER = 'alerting';
export const EVENT_LOG_ACTIONS = {
@@ -134,17 +135,7 @@ export class AlertingPlugin {
);
}
- // Encrypted attributes
- plugins.encryptedSavedObjects.registerType({
- type: 'alert',
- attributesToEncrypt: new Set(['apiKey']),
- attributesToExcludeFromAAD: new Set([
- 'scheduledTaskId',
- 'muteAll',
- 'mutedInstanceIds',
- 'updatedBy',
- ]),
- });
+ setupSavedObjects(core.savedObjects, plugins.encryptedSavedObjects);
plugins.eventLog.registerProviderActions(EVENT_LOG_PROVIDER, Object.values(EVENT_LOG_ACTIONS));
this.eventLogger = plugins.eventLog.getLogger({
diff --git a/x-pack/plugins/alerting/server/saved_objects/index.ts b/x-pack/plugins/alerting/server/saved_objects/index.ts
new file mode 100644
index 0000000000000..4efec2fe55ef0
--- /dev/null
+++ b/x-pack/plugins/alerting/server/saved_objects/index.ts
@@ -0,0 +1,33 @@
+/*
+ * 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 { SavedObjectsServiceSetup } from 'kibana/server';
+import mappings from './mappings.json';
+import { EncryptedSavedObjectsPluginSetup } from '../../../encrypted_saved_objects/server';
+
+export function setupSavedObjects(
+ savedObjects: SavedObjectsServiceSetup,
+ encryptedSavedObjects: EncryptedSavedObjectsPluginSetup
+) {
+ savedObjects.registerType({
+ name: 'alert',
+ hidden: false,
+ namespaceType: 'single',
+ mappings: mappings.alert,
+ });
+
+ // Encrypted attributes
+ encryptedSavedObjects.registerType({
+ type: 'alert',
+ attributesToEncrypt: new Set(['apiKey']),
+ attributesToExcludeFromAAD: new Set([
+ 'scheduledTaskId',
+ 'muteAll',
+ 'mutedInstanceIds',
+ 'updatedBy',
+ ]),
+ });
+}
diff --git a/x-pack/legacy/plugins/alerting/server/mappings.json b/x-pack/plugins/alerting/server/saved_objects/mappings.json
similarity index 100%
rename from x-pack/legacy/plugins/alerting/server/mappings.json
rename to x-pack/plugins/alerting/server/saved_objects/mappings.json
diff --git a/x-pack/plugins/infra/public/plugin.ts b/x-pack/plugins/infra/public/plugin.ts
index 3f3e7358d6e4d..2d6bab124104d 100644
--- a/x-pack/plugins/infra/public/plugin.ts
+++ b/x-pack/plugins/infra/public/plugin.ts
@@ -21,6 +21,8 @@ import { UsageCollectionSetup } from '../../../../src/plugins/usage_collection/p
import { DataEnhancedSetup, DataEnhancedStart } from '../../data_enhanced/public';
import { TriggersAndActionsUIPublicPluginSetup } from '../../../plugins/triggers_actions_ui/public';
+import { getAlertType as getMetricsAlertType } from './components/alerting/metrics/metric_threshold_alert_type';
+import { getAlertType as getLogsAlertType } from './components/alerting/logs/log_threshold_alert_type';
import { getInventoryMetricAlertType } from './components/alerting/inventory/metric_inventory_threshold_alert_type';
import { getAlertType as getMetricsAlertType } from './components/alerting/metrics/metric_threshold_alert_type';
diff --git a/x-pack/plugins/ingest_manager/common/types/models/epm.ts b/x-pack/plugins/ingest_manager/common/types/models/epm.ts
index fb6bf235d1e26..05e160cdfb81a 100644
--- a/x-pack/plugins/ingest_manager/common/types/models/epm.ts
+++ b/x-pack/plugins/ingest_manager/common/types/models/epm.ts
@@ -97,6 +97,7 @@ export interface RegistryStream {
description?: string;
enabled?: boolean;
vars?: RegistryVarsEntry[];
+ template?: string;
}
export type RequirementVersion = string;
diff --git a/x-pack/plugins/ingest_manager/server/routes/datasource/handlers.ts b/x-pack/plugins/ingest_manager/server/routes/datasource/handlers.ts
index 56d6053a1451b..8f07e3ed1de02 100644
--- a/x-pack/plugins/ingest_manager/server/routes/datasource/handlers.ts
+++ b/x-pack/plugins/ingest_manager/server/routes/datasource/handlers.ts
@@ -7,7 +7,7 @@ import { TypeOf } from '@kbn/config-schema';
import Boom from 'boom';
import { RequestHandler } from 'src/core/server';
import { appContextService, datasourceService } from '../../services';
-import { ensureInstalledPackage } from '../../services/epm/packages';
+import { ensureInstalledPackage, getPackageInfo } from '../../services/epm/packages';
import {
GetDatasourcesRequestSchema,
GetOneDatasourceRequestSchema,
@@ -85,12 +85,13 @@ export const createDatasourceHandler: RequestHandler<
pkgName: request.body.package.name,
callCluster,
});
-
+ const pkgInfo = await getPackageInfo({
+ savedObjectsClient: soClient,
+ pkgName: request.body.package.name,
+ pkgVersion: request.body.package.version,
+ });
newData.inputs = (await datasourceService.assignPackageStream(
- {
- pkgName: request.body.package.name,
- pkgVersion: request.body.package.version,
- },
+ pkgInfo,
request.body.inputs
)) as TypeOf['inputs'];
}
@@ -127,13 +128,14 @@ export const updateDatasourceHandler: RequestHandler<
const pkg = newData.package || datasource.package;
const inputs = newData.inputs || datasource.inputs;
if (pkg && (newData.inputs || newData.package)) {
- newData.inputs = (await datasourceService.assignPackageStream(
- {
- pkgName: pkg.name,
- pkgVersion: pkg.version,
- },
- inputs
- )) as TypeOf['inputs'];
+ const pkgInfo = await getPackageInfo({
+ savedObjectsClient: soClient,
+ pkgName: pkg.name,
+ pkgVersion: pkg.version,
+ });
+ newData.inputs = (await datasourceService.assignPackageStream(pkgInfo, inputs)) as TypeOf<
+ typeof CreateDatasourceRequestSchema.body
+ >['inputs'];
}
const updatedDatasource = await datasourceService.update(
diff --git a/x-pack/plugins/ingest_manager/server/services/datasource.test.ts b/x-pack/plugins/ingest_manager/server/services/datasource.test.ts
index 4cbbadce7f5bb..3682ae6d1167b 100644
--- a/x-pack/plugins/ingest_manager/server/services/datasource.test.ts
+++ b/x-pack/plugins/ingest_manager/server/services/datasource.test.ts
@@ -5,39 +5,38 @@
*/
import { datasourceService } from './datasource';
+import { PackageInfo } from '../types';
-async function mockedGetAssetsData(_a: any, _b: any, dataset: string) {
- if (dataset === 'dataset1') {
- return [
- {
- buffer: Buffer.from(`
+const TEMPLATE = `
type: log
metricset: ["dataset1"]
paths:
{{#each paths}}
- {{this}}
{{/each}}
-`),
- },
- ];
- }
- return [];
-}
-
-jest.mock('./epm/packages/assets', () => {
- return {
- getAssetsDataForPackageKey: mockedGetAssetsData,
- };
-});
+`;
describe('Datasource service', () => {
describe('assignPackageStream', () => {
- it('should work with cofig variables from the stream', async () => {
+ it('should work with config variables from the stream', async () => {
const inputs = await datasourceService.assignPackageStream(
- {
- pkgName: 'package',
- pkgVersion: '1.0.0',
- },
+ ({
+ datasources: [
+ {
+ inputs: [
+ {
+ type: 'log',
+ streams: [
+ {
+ dataset: 'package.dataset1',
+ template: TEMPLATE,
+ },
+ ],
+ },
+ ],
+ },
+ ],
+ } as unknown) as PackageInfo,
[
{
type: 'log',
@@ -85,10 +84,23 @@ describe('Datasource service', () => {
it('should work with config variables at the input level', async () => {
const inputs = await datasourceService.assignPackageStream(
- {
- pkgName: 'package',
- pkgVersion: '1.0.0',
- },
+ ({
+ datasources: [
+ {
+ inputs: [
+ {
+ type: 'log',
+ streams: [
+ {
+ dataset: 'package.dataset1',
+ template: TEMPLATE,
+ },
+ ],
+ },
+ ],
+ },
+ ],
+ } as unknown) as PackageInfo,
[
{
type: 'log',
diff --git a/x-pack/plugins/ingest_manager/server/services/datasource.ts b/x-pack/plugins/ingest_manager/server/services/datasource.ts
index 55edfe67e540a..0a5ba43e40fba 100644
--- a/x-pack/plugins/ingest_manager/server/services/datasource.ts
+++ b/x-pack/plugins/ingest_manager/server/services/datasource.ts
@@ -10,13 +10,13 @@ import {
packageToConfigDatasource,
DatasourceInput,
DatasourceInputStream,
+ PackageInfo,
} from '../../common';
import { DATASOURCE_SAVED_OBJECT_TYPE } from '../constants';
import { NewDatasource, Datasource, ListWithKuery } from '../types';
import { agentConfigService } from './agent_config';
import { getPackageInfo, getInstallation } from './epm/packages';
import { outputService } from './output';
-import { getAssetsDataForPackageKey } from './epm/packages/assets';
import { createStream } from './epm/agent/agent';
const SAVED_OBJECT_TYPE = DATASOURCE_SAVED_OBJECT_TYPE;
@@ -200,20 +200,16 @@ class DatasourceService {
}
public async assignPackageStream(
- pkgInfo: { pkgName: string; pkgVersion: string },
+ pkgInfo: PackageInfo,
inputs: DatasourceInput[]
): Promise {
const inputsPromises = inputs.map(input => _assignPackageStreamToInput(pkgInfo, input));
+
return Promise.all(inputsPromises);
}
}
-const _isAgentStream = (p: string) => !!p.match(/agent\/stream\/stream\.yml/);
-
-async function _assignPackageStreamToInput(
- pkgInfo: { pkgName: string; pkgVersion: string },
- input: DatasourceInput
-) {
+async function _assignPackageStreamToInput(pkgInfo: PackageInfo, input: DatasourceInput) {
const streamsPromises = input.streams.map(stream =>
_assignPackageStreamToStream(pkgInfo, input, stream)
);
@@ -223,7 +219,7 @@ async function _assignPackageStreamToInput(
}
async function _assignPackageStreamToStream(
- pkgInfo: { pkgName: string; pkgVersion: string },
+ pkgInfo: PackageInfo,
input: DatasourceInput,
stream: DatasourceInputStream
) {
@@ -231,18 +227,33 @@ async function _assignPackageStreamToStream(
return { ...stream, agent_stream: undefined };
}
const dataset = getDataset(stream.dataset);
- const assetsData = await getAssetsDataForPackageKey(pkgInfo, _isAgentStream, dataset);
+ const datasource = pkgInfo.datasources?.[0];
+ if (!datasource) {
+ throw new Error('Stream template not found, no datasource');
+ }
+
+ const inputFromPkg = datasource.inputs.find(pkgInput => pkgInput.type === input.type);
+ if (!inputFromPkg) {
+ throw new Error(`Stream template not found, unable to found input ${input.type}`);
+ }
- const [pkgStream] = assetsData;
- if (!pkgStream || !pkgStream.buffer) {
+ const streamFromPkg = inputFromPkg.streams.find(
+ pkgStream => pkgStream.dataset === stream.dataset
+ );
+ if (!streamFromPkg) {
+ throw new Error(`Stream template not found, unable to found stream ${stream.dataset}`);
+ }
+
+ if (!streamFromPkg.template) {
throw new Error(`Stream template not found for dataset ${dataset}`);
}
const yaml = createStream(
// Populate template variables from input vars and stream vars
Object.assign({}, input.vars, stream.vars),
- pkgStream.buffer.toString()
+ streamFromPkg.template
);
+
stream.agent_stream = yaml;
return { ...stream };
diff --git a/x-pack/plugins/ingest_manager/server/services/epm/elasticsearch/template/template.test.ts b/x-pack/plugins/ingest_manager/server/services/epm/elasticsearch/template/template.test.ts
index 1a73c9581a2de..3679c577ee571 100644
--- a/x-pack/plugins/ingest_manager/server/services/epm/elasticsearch/template/template.test.ts
+++ b/x-pack/plugins/ingest_manager/server/services/epm/elasticsearch/template/template.test.ts
@@ -259,3 +259,53 @@ test('tests processing object field with dynamic set to strict', () => {
const mappings = generateMappings(processedFields);
expect(JSON.stringify(mappings)).toEqual(JSON.stringify(objectFieldDynamicStrictMapping));
});
+
+test('tests processing object field with property', () => {
+ const objectFieldWithPropertyLiteralYml = `
+- name: a
+ type: object
+- name: a.b
+ type: keyword
+ `;
+ const objectFieldWithPropertyMapping = {
+ properties: {
+ a: {
+ properties: {
+ b: {
+ ignore_above: 1024,
+ type: 'keyword',
+ },
+ },
+ },
+ },
+ };
+ const fields: Field[] = safeLoad(objectFieldWithPropertyLiteralYml);
+ const processedFields = processFields(fields);
+ const mappings = generateMappings(processedFields);
+ expect(JSON.stringify(mappings)).toEqual(JSON.stringify(objectFieldWithPropertyMapping));
+});
+
+test('tests processing object field with property, reverse order', () => {
+ const objectFieldWithPropertyReversedLiteralYml = `
+- name: a.b
+ type: keyword
+- name: a
+ type: object
+ `;
+ const objectFieldWithPropertyReversedMapping = {
+ properties: {
+ a: {
+ properties: {
+ b: {
+ ignore_above: 1024,
+ type: 'keyword',
+ },
+ },
+ },
+ },
+ };
+ const fields: Field[] = safeLoad(objectFieldWithPropertyReversedLiteralYml);
+ const processedFields = processFields(fields);
+ const mappings = generateMappings(processedFields);
+ expect(JSON.stringify(mappings)).toEqual(JSON.stringify(objectFieldWithPropertyReversedMapping));
+});
diff --git a/x-pack/plugins/ingest_manager/server/services/epm/fields/field.test.ts b/x-pack/plugins/ingest_manager/server/services/epm/fields/field.test.ts
index e3aef6077dbc3..42989bb1e3ac9 100644
--- a/x-pack/plugins/ingest_manager/server/services/epm/fields/field.test.ts
+++ b/x-pack/plugins/ingest_manager/server/services/epm/fields/field.test.ts
@@ -179,4 +179,35 @@ describe('processFields', () => {
JSON.stringify(mixedFieldsExpanded)
);
});
+
+ const objectFieldWithProperty = [
+ {
+ name: 'a',
+ type: 'object',
+ dynamic: true,
+ },
+ {
+ name: 'a.b',
+ type: 'keyword',
+ },
+ ];
+
+ const objectFieldWithPropertyExpanded = [
+ {
+ name: 'a',
+ type: 'group',
+ dynamic: true,
+ fields: [
+ {
+ name: 'b',
+ type: 'keyword',
+ },
+ ],
+ },
+ ];
+ test('correctly handles properties of object type fields', () => {
+ expect(JSON.stringify(processFields(objectFieldWithProperty))).toEqual(
+ JSON.stringify(objectFieldWithPropertyExpanded)
+ );
+ });
});
diff --git a/x-pack/plugins/ingest_manager/server/services/epm/fields/field.ts b/x-pack/plugins/ingest_manager/server/services/epm/fields/field.ts
index 9c9843e0454ab..edf7624d3f0d5 100644
--- a/x-pack/plugins/ingest_manager/server/services/epm/fields/field.ts
+++ b/x-pack/plugins/ingest_manager/server/services/epm/fields/field.ts
@@ -108,7 +108,15 @@ function dedupFields(fields: Fields): Fields {
return f.name === field.name;
});
if (found) {
- if (found.type === 'group' && field.type === 'group' && found.fields && field.fields) {
+ if (
+ (found.type === 'group' || found.type === 'object') &&
+ field.type === 'group' &&
+ field.fields
+ ) {
+ if (!found.fields) {
+ found.fields = [];
+ }
+ found.type = 'group';
found.fields = dedupFields(found.fields.concat(field.fields));
} else {
// only 'group' fields can be merged in this way
diff --git a/x-pack/plugins/ingest_manager/server/services/setup.ts b/x-pack/plugins/ingest_manager/server/services/setup.ts
index 206ad76703cf5..390e240841611 100644
--- a/x-pack/plugins/ingest_manager/server/services/setup.ts
+++ b/x-pack/plugins/ingest_manager/server/services/setup.ts
@@ -145,7 +145,7 @@ async function addPackageToConfig(
config.namespace
);
newDatasource.inputs = await datasourceService.assignPackageStream(
- { pkgName: packageToInstall.name, pkgVersion: packageToInstall.version },
+ packageInfo,
newDatasource.inputs
);
diff --git a/x-pack/plugins/lens/public/xy_visualization/index.ts b/x-pack/plugins/lens/public/xy_visualization/index.ts
index 5dfae097be834..3a280fb045b06 100644
--- a/x-pack/plugins/lens/public/xy_visualization/index.ts
+++ b/x-pack/plugins/lens/public/xy_visualization/index.ts
@@ -53,6 +53,7 @@ export class XyVisualization {
? EUI_CHARTS_THEME_DARK.theme
: EUI_CHARTS_THEME_LIGHT.theme,
timeZone: getTimeZone(core.uiSettings),
+ histogramBarTarget: core.uiSettings.get('histogram:barTarget'),
})
);
diff --git a/x-pack/plugins/lens/public/xy_visualization/xy_expression.test.tsx b/x-pack/plugins/lens/public/xy_visualization/xy_expression.test.tsx
index e75e5fe763d6a..8db00aba0e36d 100644
--- a/x-pack/plugins/lens/public/xy_visualization/xy_expression.test.tsx
+++ b/x-pack/plugins/lens/public/xy_visualization/xy_expression.test.tsx
@@ -40,7 +40,7 @@ const createSampleDatatableWithRows = (rows: KibanaDatatableRow[]): KibanaDatata
id: 'c',
name: 'c',
formatHint: { id: 'string' },
- meta: { type: 'date-histogram', aggConfigParams: { interval: '10s' } },
+ meta: { type: 'date-histogram', aggConfigParams: { interval: 'auto' } },
},
{ id: 'd', name: 'ColD', formatHint: { id: 'string' } },
],
@@ -156,6 +156,7 @@ describe('xy_expression', () => {
formatFactory={getFormatSpy}
timeZone="UTC"
chartTheme={{}}
+ histogramBarTarget={50}
executeTriggerActions={executeTriggerActions}
/>
);
@@ -203,6 +204,7 @@ describe('xy_expression', () => {
formatFactory={getFormatSpy}
timeZone="UTC"
chartTheme={{}}
+ histogramBarTarget={50}
executeTriggerActions={executeTriggerActions}
/>
);
@@ -237,15 +239,17 @@ describe('xy_expression', () => {
formatFactory={getFormatSpy}
timeZone="UTC"
chartTheme={{}}
+ histogramBarTarget={50}
executeTriggerActions={executeTriggerActions}
/>
);
+ // real auto interval is 30mins = 1800000
expect(component.find(Settings).prop('xDomain')).toMatchInlineSnapshot(`
Object {
"max": 1546491600000,
"min": 1546405200000,
- "minInterval": 10000,
+ "minInterval": 1728000,
}
`);
});
@@ -271,6 +275,7 @@ describe('xy_expression', () => {
formatFactory={getFormatSpy}
timeZone="UTC"
chartTheme={{}}
+ histogramBarTarget={50}
executeTriggerActions={executeTriggerActions}
/>
);
@@ -279,7 +284,7 @@ describe('xy_expression', () => {
Object {
"max": 1546491600000,
"min": 1546405200000,
- "minInterval": 10000,
+ "minInterval": 1728000,
}
`);
});
@@ -307,6 +312,7 @@ describe('xy_expression', () => {
formatFactory={getFormatSpy}
timeZone="UTC"
chartTheme={{}}
+ histogramBarTarget={50}
executeTriggerActions={executeTriggerActions}
/>
);
@@ -350,6 +356,7 @@ describe('xy_expression', () => {
formatFactory={getFormatSpy}
timeZone="UTC"
chartTheme={{}}
+ histogramBarTarget={50}
executeTriggerActions={executeTriggerActions}
/>
);
@@ -383,6 +390,7 @@ describe('xy_expression', () => {
formatFactory={getFormatSpy}
timeZone="UTC"
chartTheme={{}}
+ histogramBarTarget={50}
executeTriggerActions={executeTriggerActions}
/>
);
@@ -398,6 +406,7 @@ describe('xy_expression', () => {
formatFactory={getFormatSpy}
timeZone="UTC"
chartTheme={{}}
+ histogramBarTarget={50}
executeTriggerActions={executeTriggerActions}
/>
);
@@ -414,6 +423,7 @@ describe('xy_expression', () => {
formatFactory={getFormatSpy}
timeZone="UTC"
chartTheme={{}}
+ histogramBarTarget={50}
executeTriggerActions={executeTriggerActions}
/>
);
@@ -430,6 +440,7 @@ describe('xy_expression', () => {
formatFactory={getFormatSpy}
timeZone="UTC"
chartTheme={{}}
+ histogramBarTarget={50}
executeTriggerActions={executeTriggerActions}
/>
);
@@ -472,6 +483,7 @@ describe('xy_expression', () => {
formatFactory={getFormatSpy}
timeZone="UTC"
chartTheme={{}}
+ histogramBarTarget={50}
executeTriggerActions={executeTriggerActions}
/>
);
@@ -510,6 +522,7 @@ describe('xy_expression', () => {
formatFactory={getFormatSpy}
timeZone="UTC"
chartTheme={{}}
+ histogramBarTarget={50}
executeTriggerActions={executeTriggerActions}
/>
);
@@ -527,6 +540,7 @@ describe('xy_expression', () => {
formatFactory={getFormatSpy}
timeZone="UTC"
chartTheme={{}}
+ histogramBarTarget={50}
executeTriggerActions={executeTriggerActions}
/>
);
@@ -547,6 +561,7 @@ describe('xy_expression', () => {
formatFactory={getFormatSpy}
timeZone="UTC"
chartTheme={{}}
+ histogramBarTarget={50}
executeTriggerActions={executeTriggerActions}
/>
);
@@ -565,6 +580,7 @@ describe('xy_expression', () => {
formatFactory={getFormatSpy}
timeZone="CEST"
chartTheme={{}}
+ histogramBarTarget={50}
executeTriggerActions={executeTriggerActions}
/>
);
@@ -582,6 +598,7 @@ describe('xy_expression', () => {
formatFactory={getFormatSpy}
timeZone="UTC"
chartTheme={{}}
+ histogramBarTarget={50}
executeTriggerActions={executeTriggerActions}
/>
);
@@ -606,6 +623,7 @@ describe('xy_expression', () => {
formatFactory={getFormatSpy}
timeZone="UTC"
chartTheme={{}}
+ histogramBarTarget={50}
executeTriggerActions={executeTriggerActions}
/>
);
@@ -624,6 +642,7 @@ describe('xy_expression', () => {
formatFactory={getFormatSpy}
timeZone="UTC"
chartTheme={{}}
+ histogramBarTarget={50}
executeTriggerActions={executeTriggerActions}
/>
);
@@ -684,6 +703,7 @@ describe('xy_expression', () => {
formatFactory={getFormatSpy}
timeZone="UTC"
chartTheme={{}}
+ histogramBarTarget={50}
executeTriggerActions={executeTriggerActions}
/>
);
@@ -878,6 +898,7 @@ describe('xy_expression', () => {
formatFactory={getFormatSpy}
timeZone="UTC"
chartTheme={{}}
+ histogramBarTarget={50}
executeTriggerActions={executeTriggerActions}
/>
);
@@ -894,6 +915,7 @@ describe('xy_expression', () => {
formatFactory={getFormatSpy}
timeZone="UTC"
chartTheme={{}}
+ histogramBarTarget={50}
executeTriggerActions={executeTriggerActions}
/>
);
@@ -910,6 +932,7 @@ describe('xy_expression', () => {
formatFactory={getFormatSpy}
timeZone="UTC"
chartTheme={{}}
+ histogramBarTarget={50}
executeTriggerActions={executeTriggerActions}
/>
);
@@ -927,6 +950,7 @@ describe('xy_expression', () => {
formatFactory={getFormatSpy}
timeZone="UTC"
chartTheme={{}}
+ histogramBarTarget={50}
executeTriggerActions={executeTriggerActions}
/>
);
@@ -943,6 +967,7 @@ describe('xy_expression', () => {
args={{ ...args, layers: [{ ...args.layers[0], accessors: ['a'] }] }}
formatFactory={getFormatSpy}
chartTheme={{}}
+ histogramBarTarget={50}
timeZone="UTC"
executeTriggerActions={executeTriggerActions}
/>
@@ -963,6 +988,7 @@ describe('xy_expression', () => {
formatFactory={getFormatSpy}
timeZone="UTC"
chartTheme={{}}
+ histogramBarTarget={50}
executeTriggerActions={executeTriggerActions}
/>
);
diff --git a/x-pack/plugins/lens/public/xy_visualization/xy_expression.tsx b/x-pack/plugins/lens/public/xy_visualization/xy_expression.tsx
index d6b6de479acfb..85cf5753befd7 100644
--- a/x-pack/plugins/lens/public/xy_visualization/xy_expression.tsx
+++ b/x-pack/plugins/lens/public/xy_visualization/xy_expression.tsx
@@ -6,6 +6,7 @@
import React, { useState, useEffect } from 'react';
import ReactDOM from 'react-dom';
+import moment from 'moment';
import {
Chart,
Settings,
@@ -35,8 +36,8 @@ import { XYArgs, SeriesType, visualizationTypes } from './types';
import { VisualizationContainer } from '../visualization_container';
import { isHorizontalChart } from './state_helpers';
import { UiActionsStart } from '../../../../../src/plugins/ui_actions/public';
-import { parseInterval } from '../../../../../src/plugins/data/common';
import { getExecuteTriggerActions } from './services';
+import { parseInterval } from '../../../../../src/plugins/data/common';
type InferPropType = T extends React.FunctionComponent ? P : T;
type SeriesSpec = InferPropType &
@@ -58,6 +59,7 @@ type XYChartRenderProps = XYChartProps & {
chartTheme: PartialTheme;
formatFactory: FormatFactory;
timeZone: string;
+ histogramBarTarget: number;
executeTriggerActions: UiActionsStart['executeTriggerActions'];
};
@@ -110,6 +112,7 @@ export const xyChart: ExpressionFunctionDefinition<
export const getXyChartRenderer = (dependencies: {
formatFactory: Promise;
chartTheme: PartialTheme;
+ histogramBarTarget: number;
timeZone: string;
}): ExpressionRenderDefinition => ({
name: 'lens_xy_chart_renderer',
@@ -130,6 +133,7 @@ export const getXyChartRenderer = (dependencies: {
formatFactory={formatFactory}
chartTheme={dependencies.chartTheme}
timeZone={dependencies.timeZone}
+ histogramBarTarget={dependencies.histogramBarTarget}
executeTriggerActions={executeTriggerActions}
/>
,
@@ -169,6 +173,7 @@ export function XYChart({
formatFactory,
timeZone,
chartTheme,
+ histogramBarTarget,
executeTriggerActions,
}: XYChartRenderProps) {
const { legend, layers } = args;
@@ -212,18 +217,26 @@ export function XYChart({
const xTitle = (xAxisColumn && xAxisColumn.name) || args.xTitle;
- // add minInterval only for single row value as it cannot be determined from dataset
+ function calculateMinInterval() {
+ // add minInterval only for single row value as it cannot be determined from dataset
+ if (data.dateRange && layers.every(layer => data.tables[layer.layerId].rows.length <= 1)) {
+ if (xAxisColumn?.meta?.aggConfigParams?.interval !== 'auto')
+ return parseInterval(xAxisColumn?.meta?.aggConfigParams?.interval)?.asMilliseconds();
- const minInterval = layers.every(layer => data.tables[layer.layerId].rows.length <= 1)
- ? parseInterval(xAxisColumn?.meta?.aggConfigParams?.interval)?.asMilliseconds()
- : undefined;
+ const { fromDate, toDate } = data.dateRange;
+ const duration = moment(toDate).diff(moment(fromDate));
+ const targetMs = duration / histogramBarTarget;
+ return isNaN(targetMs) ? 0 : Math.max(Math.floor(targetMs), 1);
+ }
+ return undefined;
+ }
const xDomain =
data.dateRange && layers.every(l => l.xScaleType === 'time')
? {
min: data.dateRange.fromDate.getTime(),
max: data.dateRange.toDate.getTime(),
- minInterval,
+ minInterval: calculateMinInterval(),
}
: undefined;
return (
diff --git a/x-pack/plugins/ml/public/application/overview/components/analytics_panel/analytics_panel.tsx b/x-pack/plugins/ml/public/application/overview/components/analytics_panel/analytics_panel.tsx
index b2eda12abc578..c379cd702daee 100644
--- a/x-pack/plugins/ml/public/application/overview/components/analytics_panel/analytics_panel.tsx
+++ b/x-pack/plugins/ml/public/application/overview/components/analytics_panel/analytics_panel.tsx
@@ -82,14 +82,14 @@ export const AnalyticsPanel: FC = ({ jobCreationDisabled }) => {
title={
{i18n.translate('xpack.ml.overview.analyticsList.createFirstJobMessage', {
- defaultMessage: 'Create your first analytics job',
+ defaultMessage: 'Create your first data frame analytics job',
})}
}
body={
{i18n.translate('xpack.ml.overview.analyticsList.emptyPromptText', {
- defaultMessage: `Data frame analytics enable you to perform different analyses of your data and annotate it with the results. The analytics job stores the annotated data, as well as a copy of the source data, in a new index.`,
+ defaultMessage: `Data frame analytics enable you to perform different analyses of your data and annotates it with the results. The job puts the annotated data and a copy of the source data in a new index.`,
})}
}
diff --git a/x-pack/plugins/ml/public/application/overview/components/anomaly_detection_panel/anomaly_detection_panel.tsx b/x-pack/plugins/ml/public/application/overview/components/anomaly_detection_panel/anomaly_detection_panel.tsx
index 5f5c3f7c28670..dac39b1a2071d 100644
--- a/x-pack/plugins/ml/public/application/overview/components/anomaly_detection_panel/anomaly_detection_panel.tsx
+++ b/x-pack/plugins/ml/public/application/overview/components/anomaly_detection_panel/anomaly_detection_panel.tsx
@@ -172,7 +172,7 @@ export const AnomalyDetectionPanel: FC = ({ jobCreationDisabled }) => {
{i18n.translate('xpack.ml.overview.anomalyDetection.emptyPromptText', {
- defaultMessage: `Machine learning makes it easy to detect anomalies in time series data stored in Elasticsearch. Track one metric from a single machine or hundreds of metrics across thousands of machines. Start automatically spotting the anomalies hiding in your data and resolve issues faster.`,
+ defaultMessage: `Anomaly detection enables you to find unusual behavior in time series data. Start automatically spotting the anomalies hiding in your data and resolve issues faster.`,
})}
diff --git a/x-pack/plugins/ml/public/application/overview/components/sidebar.tsx b/x-pack/plugins/ml/public/application/overview/components/sidebar.tsx
index 219c195bab111..3e4e9cfbd2b66 100644
--- a/x-pack/plugins/ml/public/application/overview/components/sidebar.tsx
+++ b/x-pack/plugins/ml/public/application/overview/components/sidebar.tsx
@@ -11,7 +11,6 @@ import { useMlKibana } from '../../contexts/kibana';
const createJobLink = '#/jobs/new_job/step/index_or_search';
const feedbackLink = 'https://www.elastic.co/community/';
-const whatIsMachineLearningLink = 'https://www.elastic.co/what-is/elasticsearch-machine-learning';
interface Props {
createAnomalyDetectionJobDisabled: boolean;
@@ -60,7 +59,7 @@ export const OverviewSideBar: FC = ({ createAnomalyDetectionJobDisabled }
@@ -79,14 +78,6 @@ export const OverviewSideBar: FC = ({ createAnomalyDetectionJobDisabled }
/>
),
- whatIsMachineLearning: (
-
-
-
- ),
}}
/>
@@ -96,7 +87,7 @@ export const OverviewSideBar: FC = ({ createAnomalyDetectionJobDisabled }
diff --git a/x-pack/plugins/monitoring/common/constants.ts b/x-pack/plugins/monitoring/common/constants.ts
index edd6142455dfb..eeed7b4d5acf6 100644
--- a/x-pack/plugins/monitoring/common/constants.ts
+++ b/x-pack/plugins/monitoring/common/constants.ts
@@ -245,7 +245,7 @@ export const ALERT_TYPES = [ALERT_TYPE_LICENSE_EXPIRATION, ALERT_TYPE_CLUSTER_ST
/**
* Matches the id for the built-in in email action type
- * See x-pack/legacy/plugins/actions/server/builtin_action_types/email.ts
+ * See x-pack/plugins/actions/server/builtin_action_types/email.ts
*/
export const ALERT_ACTION_TYPE_EMAIL = '.email';
diff --git a/x-pack/plugins/security/server/mocks.ts b/x-pack/plugins/security/server/mocks.ts
index ababf12c2be60..a6407366bbd3b 100644
--- a/x-pack/plugins/security/server/mocks.ts
+++ b/x-pack/plugins/security/server/mocks.ts
@@ -8,6 +8,7 @@ import { SecurityPluginSetup } from './plugin';
import { authenticationMock } from './authentication/index.mock';
import { authorizationMock } from './authorization/index.mock';
+import { licenseMock } from '../common/licensing/index.mock';
function createSetupMock() {
const mockAuthz = authorizationMock.create();
@@ -19,6 +20,7 @@ function createSetupMock() {
mode: mockAuthz.mode,
},
registerSpacesService: jest.fn(),
+ license: licenseMock.create(),
__legacyCompat: {} as SecurityPluginSetup['__legacyCompat'],
};
}
diff --git a/x-pack/plugins/security/server/plugin.test.ts b/x-pack/plugins/security/server/plugin.test.ts
index 22a30f03c646a..d58c999ddccdf 100644
--- a/x-pack/plugins/security/server/plugin.test.ts
+++ b/x-pack/plugins/security/server/plugin.test.ts
@@ -50,21 +50,6 @@ describe('Security Plugin', () => {
await expect(plugin.setup(mockCoreSetup, mockDependencies)).resolves.toMatchInlineSnapshot(`
Object {
"__legacyCompat": Object {
- "license": Object {
- "features$": Observable {
- "_isScalar": false,
- "operator": MapOperator {
- "project": [Function],
- "thisArg": undefined,
- },
- "source": Observable {
- "_isScalar": false,
- "_subscribe": [Function],
- },
- },
- "getFeatures": [Function],
- "isEnabled": [Function],
- },
"registerLegacyAPI": [Function],
"registerPrivilegesWithCluster": [Function],
},
@@ -103,6 +88,21 @@ describe('Security Plugin', () => {
"useRbacForRequest": [Function],
},
},
+ "license": Object {
+ "features$": Observable {
+ "_isScalar": false,
+ "operator": MapOperator {
+ "project": [Function],
+ "thisArg": undefined,
+ },
+ "source": Observable {
+ "_isScalar": false,
+ "_subscribe": [Function],
+ },
+ },
+ "getFeatures": [Function],
+ "isEnabled": [Function],
+ },
"registerSpacesService": [Function],
}
`);
diff --git a/x-pack/plugins/security/server/plugin.ts b/x-pack/plugins/security/server/plugin.ts
index e30b0caf76ddc..97f5aea888dc7 100644
--- a/x-pack/plugins/security/server/plugin.ts
+++ b/x-pack/plugins/security/server/plugin.ts
@@ -59,6 +59,7 @@ export interface SecurityPluginSetup {
| 'invalidateAPIKeyAsInternalUser'
>;
authz: Pick;
+ license: SecurityLicense;
/**
* If Spaces plugin is available it's supposed to register its SpacesService with Security plugin
@@ -73,7 +74,6 @@ export interface SecurityPluginSetup {
__legacyCompat: {
registerLegacyAPI: (legacyAPI: LegacyAPI) => void;
registerPrivilegesWithCluster: () => void;
- license: SecurityLicense;
};
}
@@ -194,6 +194,8 @@ export class Plugin {
mode: authz.mode,
},
+ license,
+
registerSpacesService: service => {
if (this.wasSpacesServiceAccessed()) {
throw new Error('Spaces service has been accessed before registration.');
@@ -206,8 +208,6 @@ export class Plugin {
registerLegacyAPI: (legacyAPI: LegacyAPI) => (this.legacyAPI = legacyAPI),
registerPrivilegesWithCluster: async () => await authz.registerPrivilegesWithCluster(),
-
- license,
},
});
}
diff --git a/x-pack/plugins/siem/server/lib/timeline/types.ts b/x-pack/plugins/siem/common/types/timeline/index.ts
similarity index 85%
rename from x-pack/plugins/siem/server/lib/timeline/types.ts
rename to x-pack/plugins/siem/common/types/timeline/index.ts
index 0bce3300591c2..55b4f9c6aca4d 100644
--- a/x-pack/plugins/siem/server/lib/timeline/types.ts
+++ b/x-pack/plugins/siem/common/types/timeline/index.ts
@@ -7,14 +7,11 @@
/* eslint-disable @typescript-eslint/no-empty-interface */
import * as runtimeTypes from 'io-ts';
+import { SavedObjectsClient } from 'kibana/server';
-import { unionWithNullType } from '../framework';
-import { NoteSavedObjectToReturnRuntimeType, NoteSavedObject } from '../note/types';
-import {
- PinnedEventToReturnSavedObjectRuntimeType,
- PinnedEventSavedObject,
-} from '../pinned_event/types';
-import { SavedObjectsClient } from '../../../../../../src/core/server';
+import { unionWithNullType } from '../../utility_types';
+import { NoteSavedObject, NoteSavedObjectToReturnRuntimeType } from './note';
+import { PinnedEventToReturnSavedObjectRuntimeType, PinnedEventSavedObject } from './pinned_event';
/*
* ColumnHeader Types
@@ -136,6 +133,17 @@ const SavedSortRuntimeType = runtimeTypes.partial({
/*
* Timeline Types
*/
+
+export enum TimelineType {
+ default = 'default',
+ template = 'template',
+}
+
+export const TimelineTypeLiteralRt = runtimeTypes.union([
+ runtimeTypes.literal(TimelineType.template),
+ runtimeTypes.literal(TimelineType.default),
+]);
+
export const SavedTimelineRuntimeType = runtimeTypes.partial({
columns: unionWithNullType(runtimeTypes.array(SavedColumnHeaderRuntimeType)),
dataProviders: unionWithNullType(runtimeTypes.array(SavedDataProviderRuntimeType)),
@@ -146,6 +154,9 @@ export const SavedTimelineRuntimeType = runtimeTypes.partial({
kqlMode: unionWithNullType(runtimeTypes.string),
kqlQuery: unionWithNullType(SavedFilterQueryQueryRuntimeType),
title: unionWithNullType(runtimeTypes.string),
+ templateTimelineId: unionWithNullType(runtimeTypes.string),
+ templateTimelineVersion: unionWithNullType(runtimeTypes.number),
+ timelineType: unionWithNullType(TimelineTypeLiteralRt),
dateRange: unionWithNullType(SavedDateRangePickerRuntimeType),
savedQueryId: unionWithNullType(runtimeTypes.string),
sort: unionWithNullType(SavedSortRuntimeType),
@@ -192,6 +203,25 @@ export const TimelineSavedToReturnObjectRuntimeType = runtimeTypes.intersection(
export interface TimelineSavedObject
extends runtimeTypes.TypeOf {}
+/**
+ * All Timeline Saved object type with metadata
+ */
+export const TimelineResponseType = runtimeTypes.type({
+ data: runtimeTypes.type({
+ persistTimeline: runtimeTypes.intersection([
+ runtimeTypes.partial({
+ code: unionWithNullType(runtimeTypes.number),
+ message: unionWithNullType(runtimeTypes.string),
+ }),
+ runtimeTypes.type({
+ timeline: TimelineSavedToReturnObjectRuntimeType,
+ }),
+ ]),
+ }),
+});
+
+export interface TimelineResponse extends runtimeTypes.TypeOf {}
+
/**
* All Timeline Saved object type with metadata
*/
@@ -234,6 +264,11 @@ export type ExportedTimelines = TimelineSavedObject &
pinnedEventIds: string[];
};
+export interface ExportTimelineNotFoundError {
+ statusCode: number;
+ message: string;
+}
+
export interface BulkGetInput {
type: string;
id: string;
diff --git a/x-pack/plugins/siem/server/lib/note/types.ts b/x-pack/plugins/siem/common/types/timeline/note/index.ts
similarity index 90%
rename from x-pack/plugins/siem/server/lib/note/types.ts
rename to x-pack/plugins/siem/common/types/timeline/note/index.ts
index f7a10317bd84d..c8e674997c19c 100644
--- a/x-pack/plugins/siem/server/lib/note/types.ts
+++ b/x-pack/plugins/siem/common/types/timeline/note/index.ts
@@ -8,7 +8,7 @@
import * as runtimeTypes from 'io-ts';
-import { unionWithNullType } from '../framework';
+import { unionWithNullType } from '../../../utility_types';
/*
* Note Types
@@ -56,11 +56,7 @@ export const NoteSavedObjectToReturnRuntimeType = runtimeTypes.intersection([
version: runtimeTypes.string,
}),
runtimeTypes.partial({
- timelineVersion: runtimeTypes.union([
- runtimeTypes.string,
- runtimeTypes.null,
- runtimeTypes.undefined,
- ]),
+ timelineVersion: unionWithNullType(runtimeTypes.string),
}),
]);
diff --git a/x-pack/plugins/siem/server/lib/pinned_event/types.ts b/x-pack/plugins/siem/common/types/timeline/pinned_event/index.ts
similarity index 83%
rename from x-pack/plugins/siem/server/lib/pinned_event/types.ts
rename to x-pack/plugins/siem/common/types/timeline/pinned_event/index.ts
index e598f03935047..89a619598f7c1 100644
--- a/x-pack/plugins/siem/server/lib/pinned_event/types.ts
+++ b/x-pack/plugins/siem/common/types/timeline/pinned_event/index.ts
@@ -8,7 +8,7 @@
import * as runtimeTypes from 'io-ts';
-import { unionWithNullType } from '../framework';
+import { unionWithNullType } from '../../../utility_types';
/*
* Note Types
@@ -40,11 +40,7 @@ export const PinnedEventSavedObjectRuntimeType = runtimeTypes.intersection([
}),
runtimeTypes.partial({
pinnedEventId: unionWithNullType(runtimeTypes.string),
- timelineVersion: runtimeTypes.union([
- runtimeTypes.string,
- runtimeTypes.null,
- runtimeTypes.undefined,
- ]),
+ timelineVersion: unionWithNullType(runtimeTypes.string),
}),
]);
@@ -55,11 +51,7 @@ export const PinnedEventToReturnSavedObjectRuntimeType = runtimeTypes.intersecti
}),
SavedPinnedEventRuntimeType,
runtimeTypes.partial({
- timelineVersion: runtimeTypes.union([
- runtimeTypes.string,
- runtimeTypes.null,
- runtimeTypes.undefined,
- ]),
+ timelineVersion: unionWithNullType(runtimeTypes.string),
}),
]);
diff --git a/x-pack/plugins/siem/common/utility_types.ts b/x-pack/plugins/siem/common/utility_types.ts
index b46ccdbbe3d05..a12dd926a9181 100644
--- a/x-pack/plugins/siem/common/utility_types.ts
+++ b/x-pack/plugins/siem/common/utility_types.ts
@@ -4,6 +4,7 @@
* you may not use this file except in compliance with the Elastic License.
*/
+import * as runtimeTypes from 'io-ts';
import { ReactNode } from 'react';
// This type is for typing EuiDescriptionList
@@ -11,3 +12,6 @@ export interface DescriptionList {
title: NonNullable;
description: NonNullable;
}
+
+export const unionWithNullType = (type: T) =>
+ runtimeTypes.union([type, runtimeTypes.null]);
diff --git a/x-pack/plugins/siem/public/components/matrix_histogram/__snapshots__/index.test.tsx.snap b/x-pack/plugins/siem/public/components/matrix_histogram/__snapshots__/index.test.tsx.snap
index 5aa846d15b684..c4bdff7ea649a 100644
--- a/x-pack/plugins/siem/public/components/matrix_histogram/__snapshots__/index.test.tsx.snap
+++ b/x-pack/plugins/siem/public/components/matrix_histogram/__snapshots__/index.test.tsx.snap
@@ -1,5 +1,5 @@
// Jest Snapshot v1, https://goo.gl/fbAQLP
-exports[`Matrix Histogram Component not initial load it renders no MatrixLoader 1`] = `""`;
+exports[`Matrix Histogram Component not initial load it renders no MatrixLoader 1`] = `""`;
-exports[`Matrix Histogram Component on initial load it renders MatrixLoader 1`] = `""`;
+exports[`Matrix Histogram Component on initial load it renders MatrixLoader 1`] = `""`;
diff --git a/x-pack/plugins/siem/public/components/open_timeline/export_timeline/index.tsx b/x-pack/plugins/siem/public/components/open_timeline/export_timeline/index.tsx
index 946c4b3a612dd..12cf952bb1ff8 100644
--- a/x-pack/plugins/siem/public/components/open_timeline/export_timeline/index.tsx
+++ b/x-pack/plugins/siem/public/components/open_timeline/export_timeline/index.tsx
@@ -9,7 +9,7 @@ import { DeleteTimelines } from '../types';
import { TimelineDownloader } from './export_timeline';
import { DeleteTimelineModalOverlay } from '../delete_timeline_modal';
-import { exportSelectedTimeline } from '../../../containers/timeline/all/api';
+import { exportSelectedTimeline } from '../../../containers/timeline/api';
export interface ExportTimeline {
disableExportTimelineDownloader: () => void;
diff --git a/x-pack/plugins/siem/public/components/open_timeline/index.test.tsx b/x-pack/plugins/siem/public/components/open_timeline/index.test.tsx
index 04f0abe0d00d1..ea28bc06ef915 100644
--- a/x-pack/plugins/siem/public/components/open_timeline/index.test.tsx
+++ b/x-pack/plugins/siem/public/components/open_timeline/index.test.tsx
@@ -15,15 +15,34 @@ import { TestProviderWithoutDragAndDrop, apolloClient } from '../../mock/test_pr
import { mockOpenTimelineQueryResults } from '../../mock/timeline_results';
import { DEFAULT_SEARCH_RESULTS_PER_PAGE } from '../../pages/timelines/timelines_page';
-import { StatefulOpenTimeline } from '.';
import { NotePreviews } from './note_previews';
import { OPEN_TIMELINE_CLASS_NAME } from './helpers';
-
+import { StatefulOpenTimeline } from '.';
+import { useGetAllTimeline, getAllTimeline } from '../../containers/timeline/all';
jest.mock('../../lib/kibana');
+jest.mock('../../containers/timeline/all', () => {
+ const originalModule = jest.requireActual('../../containers/timeline/all');
+ return {
+ useGetAllTimeline: jest.fn(),
+ getAllTimeline: originalModule.getAllTimeline,
+ };
+});
describe('StatefulOpenTimeline', () => {
const theme = () => ({ eui: euiDarkVars, darkMode: true });
const title = 'All Timelines / Open Timelines';
+ beforeEach(() => {
+ ((useGetAllTimeline as unknown) as jest.Mock).mockReturnValue({
+ fetchAllTimeline: jest.fn(),
+ timelines: getAllTimeline(
+ '',
+ mockOpenTimelineQueryResults[0].result.data?.getAllTimeline?.timeline ?? []
+ ),
+ loading: false,
+ totalCount: mockOpenTimelineQueryResults[0].result.data.getAllTimeline.totalCount,
+ refetch: jest.fn(),
+ });
+ });
test('it has the expected initial state', () => {
const wrapper = mount(
@@ -459,6 +478,8 @@ describe('StatefulOpenTimeline', () => {
.find('[data-test-subj="expand-notes"]')
.first()
.simulate('click');
+ expect(wrapper.find('[data-test-subj="note-previews-container"]').exists()).toEqual(true);
+ expect(wrapper.find('[data-test-subj="updated-by"]').exists()).toEqual(true);
expect(
wrapper
@@ -532,7 +553,7 @@ describe('StatefulOpenTimeline', () => {
test('it renders the expected count of matching timelines when no query has been entered', async () => {
const wrapper = mount(
-
+
(
/** The requested field to sort on */
const [sortField, setSortField] = useState(DEFAULT_SORT_FIELD);
+ const { fetchAllTimeline, timelines, loading, totalCount, refetch } = useGetAllTimeline();
+
/** Invoked when the user presses enters to submit the text in the search input */
const onQueryChange: OnQueryChange = useCallback((query: EuiSearchBarQuery) => {
setSearch(query.queryText.trim());
@@ -133,45 +134,41 @@ export const StatefulOpenTimelineComponent = React.memo(
// }
// };
- const onDeleteOneTimeline: OnDeleteOneTimeline = useCallback(
- (timelineIds: string[]) => {
- deleteTimelines(timelineIds, {
- search,
- pageInfo: {
- pageIndex: pageIndex + 1,
- pageSize,
- },
- sort: {
- sortField: sortField as SortFieldTimeline,
- sortOrder: sortDirection as Direction,
- },
- onlyUserFavorite: onlyFavorites,
+ const deleteTimelines: DeleteTimelines = useCallback(
+ async (timelineIds: string[]) => {
+ if (timelineIds.includes(timeline.savedObjectId || '')) {
+ createNewTimeline({ id: 'timeline-1', columns: defaultHeaders, show: false });
+ }
+ await apolloClient.mutate<
+ DeleteTimelineMutation.Mutation,
+ DeleteTimelineMutation.Variables
+ >({
+ mutation: deleteTimelineMutation,
+ fetchPolicy: 'no-cache',
+ variables: { id: timelineIds },
});
+ refetch();
+ },
+ [apolloClient, createNewTimeline, refetch, timeline]
+ );
+
+ const onDeleteOneTimeline: OnDeleteOneTimeline = useCallback(
+ async (timelineIds: string[]) => {
+ await deleteTimelines(timelineIds);
},
- [search, pageIndex, pageSize, sortField, sortDirection, onlyFavorites]
+ [deleteTimelines]
);
/** Invoked when the user clicks the action to delete the selected timelines */
- const onDeleteSelected: OnDeleteSelected = useCallback(() => {
- deleteTimelines(getSelectedTimelineIds(selectedItems), {
- search,
- pageInfo: {
- pageIndex: pageIndex + 1,
- pageSize,
- },
- sort: {
- sortField: sortField as SortFieldTimeline,
- sortOrder: sortDirection as Direction,
- },
- onlyUserFavorite: onlyFavorites,
- });
+ const onDeleteSelected: OnDeleteSelected = useCallback(async () => {
+ await deleteTimelines(getSelectedTimelineIds(selectedItems));
// NOTE: we clear the selection state below, but if the server fails to
// delete a timeline, it will remain selected in the table:
resetSelectionState();
// TODO: the query must re-execute to show the results of the deletion
- }, [selectedItems, search, pageIndex, pageSize, sortField, sortDirection, onlyFavorites]);
+ }, [selectedItems, deleteTimelines]);
/** Invoked when the user selects (or de-selects) timelines */
const onSelectionChange: OnSelectionChange = useCallback(
@@ -227,99 +224,88 @@ export const StatefulOpenTimelineComponent = React.memo(
[apolloClient, updateIsLoading, updateTimeline]
);
- const deleteTimelines: DeleteTimelines = useCallback(
- (timelineIds: string[], variables?: AllTimelinesVariables) => {
- if (timelineIds.includes(timeline.savedObjectId || '')) {
- createNewTimeline({ id: 'timeline-1', columns: defaultHeaders, show: false });
- }
- apolloClient.mutate({
- mutation: deleteTimelineMutation,
- fetchPolicy: 'no-cache',
- variables: { id: timelineIds },
- refetchQueries: [
- {
- query: allTimelinesQuery,
- variables,
- },
- ],
- });
- },
- [apolloClient, createNewTimeline, timeline]
- );
-
useEffect(() => {
focusInput();
}, []);
- return (
- {
+ fetchAllTimeline({
+ pageInfo: {
pageIndex: pageIndex + 1,
pageSize,
- }}
- search={search}
- sort={{ sortField: sortField as SortFieldTimeline, sortOrder: sortDirection as Direction }}
- onlyUserFavorite={onlyFavorites}
- >
- {({ timelines, loading, totalCount, refetch }) => {
- return !isModal ? (
-
- ) : (
-
- );
- }}
-
+ },
+ search,
+ sort: { sortField: sortField as SortFieldTimeline, sortOrder: sortDirection as Direction },
+ onlyUserFavorite: onlyFavorites,
+ timelines,
+ totalCount,
+ });
+ }, [
+ pageIndex,
+ pageSize,
+ search,
+ sortField,
+ sortDirection,
+ timelines,
+ totalCount,
+ onlyFavorites,
+ ]);
+
+ return !isModal ? (
+
+ ) : (
+
);
}
);
@@ -328,7 +314,6 @@ const makeMapStateToProps = () => {
const getTimeline = timelineSelectors.getTimelineByIdSelector();
const mapStateToProps = (state: State) => {
const timeline = getTimeline(state, 'timeline-1') ?? timelineDefaults;
-
return {
timeline,
};
diff --git a/x-pack/plugins/siem/public/components/open_timeline/open_timeline.tsx b/x-pack/plugins/siem/public/components/open_timeline/open_timeline.tsx
index 6b2f953b82de4..26aeab87e3510 100644
--- a/x-pack/plugins/siem/public/components/open_timeline/open_timeline.tsx
+++ b/x-pack/plugins/siem/public/components/open_timeline/open_timeline.tsx
@@ -14,7 +14,7 @@ import { TimelinesTable } from './timelines_table';
import { TitleRow } from './title_row';
import { ImportDataModal } from '../import_data_modal';
import * as i18n from './translations';
-import { importTimelines } from '../../containers/timeline/all/api';
+import { importTimelines } from '../../containers/timeline/api';
import {
UtilityBarGroup,
diff --git a/x-pack/plugins/siem/public/components/open_timeline/open_timeline_modal/index.test.tsx b/x-pack/plugins/siem/public/components/open_timeline/open_timeline_modal/index.test.tsx
index ca8fa50c572fe..46a0d46c1e0d1 100644
--- a/x-pack/plugins/siem/public/components/open_timeline/open_timeline_modal/index.test.tsx
+++ b/x-pack/plugins/siem/public/components/open_timeline/open_timeline_modal/index.test.tsx
@@ -13,6 +13,7 @@ import { ThemeProvider } from 'styled-components';
import { wait } from '../../../lib/helpers';
import { TestProviderWithoutDragAndDrop } from '../../../mock/test_providers';
import { mockOpenTimelineQueryResults } from '../../../mock/timeline_results';
+import { useGetAllTimeline, getAllTimeline } from '../../../containers/timeline/all';
import { OpenTimelineModal } from '.';
@@ -20,9 +21,28 @@ jest.mock('../../../lib/kibana');
jest.mock('../../../utils/apollo_context', () => ({
useApolloClient: () => ({}),
}));
+jest.mock('../../../containers/timeline/all', () => {
+ const originalModule = jest.requireActual('../../../containers/timeline/all');
+ return {
+ useGetAllTimeline: jest.fn(),
+ getAllTimeline: originalModule.getAllTimeline,
+ };
+});
describe('OpenTimelineModal', () => {
const theme = () => ({ eui: euiDarkVars, darkMode: true });
+ beforeEach(() => {
+ ((useGetAllTimeline as unknown) as jest.Mock).mockReturnValue({
+ fetchAllTimeline: jest.fn(),
+ timelines: getAllTimeline(
+ '',
+ mockOpenTimelineQueryResults[0].result.data?.getAllTimeline?.timeline ?? []
+ ),
+ loading: false,
+ totalCount: mockOpenTimelineQueryResults[0].result.data.getAllTimeline.totalCount,
+ refetch: jest.fn(),
+ });
+ });
test('it renders the expected modal', async () => {
const wrapper = mount(
diff --git a/x-pack/plugins/siem/public/components/open_timeline/types.ts b/x-pack/plugins/siem/public/components/open_timeline/types.ts
index b7cc92ebd183f..41999c6249277 100644
--- a/x-pack/plugins/siem/public/components/open_timeline/types.ts
+++ b/x-pack/plugins/siem/public/components/open_timeline/types.ts
@@ -9,6 +9,7 @@ import { AllTimelinesVariables } from '../../containers/timeline/all';
import { TimelineModel } from '../../store/timeline/model';
import { NoteResult } from '../../graphql/types';
import { Refetch } from '../../store/inputs/model';
+import { TimelineType } from '../../../common/types/timeline';
/** The users who added a timeline to favorites */
export interface FavoriteTimelineResult {
@@ -47,6 +48,8 @@ export interface OpenTimelineResult {
pinnedEventIds?: Readonly> | null;
savedObjectId?: string | null;
title?: string | null;
+ templateTimelineId?: string | null;
+ type?: TimelineType.template | TimelineType.default;
updated?: number | null;
updatedBy?: string | null;
}
diff --git a/x-pack/plugins/siem/public/components/recent_timelines/index.tsx b/x-pack/plugins/siem/public/components/recent_timelines/index.tsx
index 5b851701b973c..b641038f35ba6 100644
--- a/x-pack/plugins/siem/public/components/recent_timelines/index.tsx
+++ b/x-pack/plugins/siem/public/components/recent_timelines/index.tsx
@@ -6,11 +6,11 @@
import ApolloClient from 'apollo-client';
import { EuiHorizontalRule, EuiLink, EuiText } from '@elastic/eui';
-import React, { useCallback, useMemo } from 'react';
+import React, { useCallback, useMemo, useEffect } from 'react';
import { connect, ConnectedProps } from 'react-redux';
import { Dispatch } from 'redux';
-import { AllTimelinesQuery } from '../../containers/timeline/all';
+import { useGetAllTimeline } from '../../containers/timeline/all';
import { SortFieldTimeline, Direction } from '../../graphql/types';
import { queryTimelineById, dispatchUpdateTimeline } from '../open_timeline/helpers';
import { OnOpenTimeline } from '../open_timeline/types';
@@ -62,35 +62,39 @@ const StatefulRecentTimelinesComponent = React.memo(
[filterBy]
);
- return (
- {
+ fetchAllTimeline({
+ pageInfo: {
pageIndex: 1,
pageSize: PAGE_SIZE,
- }}
- search={''}
- sort={{
+ },
+ search: '',
+ sort: {
sortField: SortFieldTimeline.updated,
sortOrder: Direction.desc,
- }}
- onlyUserFavorite={filterBy === 'favorites'}
- >
- {({ timelines, loading }) => (
- <>
- {loading ? (
- loadingPlaceholders
- ) : (
-
- )}
-
- {linkAllTimelines}
- >
+ },
+ onlyUserFavorite: filterBy === 'favorites',
+ timelines,
+ totalCount,
+ });
+ }, [filterBy, timelines, totalCount]);
+
+ return (
+ <>
+ {loading ? (
+ loadingPlaceholders
+ ) : (
+
)}
-
+
+ {linkAllTimelines}
+ >
);
}
);
diff --git a/x-pack/plugins/siem/public/components/timeline/selectable_timeline/index.tsx b/x-pack/plugins/siem/public/components/timeline/selectable_timeline/index.tsx
index 639d30bbe7bb9..4cc89e5bdba73 100644
--- a/x-pack/plugins/siem/public/components/timeline/selectable_timeline/index.tsx
+++ b/x-pack/plugins/siem/public/components/timeline/selectable_timeline/index.tsx
@@ -17,11 +17,11 @@ import {
EuiFilterButton,
} from '@elastic/eui';
import { isEmpty } from 'lodash/fp';
-import React, { memo, useCallback, useMemo, useState } from 'react';
+import React, { memo, useCallback, useMemo, useState, useEffect } from 'react';
import { ListProps } from 'react-virtualized';
import styled from 'styled-components';
-import { AllTimelinesQuery } from '../../../containers/timeline/all';
+import { useGetAllTimeline } from '../../../containers/timeline/all';
import { SortFieldTimeline, Direction } from '../../../graphql/types';
import { isUntitled } from '../../open_timeline/helpers';
import * as i18nTimeline from '../../open_timeline/translations';
@@ -96,6 +96,7 @@ const SelectableTimelineComponent: React.FC = ({
const [searchTimelineValue, setSearchTimelineValue] = useState('');
const [onlyFavorites, setOnlyFavorites] = useState(false);
const [searchRef, setSearchRef] = useState(null);
+ const { fetchAllTimeline, timelines, loading, totalCount: timelineCount } = useGetAllTimeline();
const onSearchTimeline = useCallback(val => {
setSearchTimelineValue(val);
@@ -215,61 +216,64 @@ const SelectableTimelineComponent: React.FC = ({
[searchRef, onlyFavorites, handleOnToggleOnlyFavorites]
);
+ useEffect(() => {
+ fetchAllTimeline({
+ pageInfo: {
+ pageIndex: 1,
+ pageSize,
+ },
+ search: searchTimelineValue,
+ sort: {
+ sortField: SortFieldTimeline.updated,
+ sortOrder: Direction.desc,
+ },
+ onlyUserFavorite: onlyFavorites,
+ timelines,
+ totalCount: timelineCount,
+ });
+ }, [onlyFavorites, pageSize, searchTimelineValue, timelines, timelineCount]);
+
return (
- <>
-
+ !hideUntitled || t.title !== '').length,
+ timelineCount
+ ),
+ } as unknown) as ListProps,
+ }}
+ renderOption={renderTimelineOption}
+ onChange={handleTimelineChange}
+ searchable
+ searchProps={{
+ 'data-test-subj': 'timeline-super-select-search-box',
+ isLoading: loading,
+ placeholder: i18n.SEARCH_BOX_TIMELINE_PLACEHOLDER,
+ onSearch: onSearchTimeline,
+ incremental: false,
+ inputRef: (ref: HTMLElement) => {
+ setSearchRef(ref);
+ },
}}
- search={searchTimelineValue}
- sort={{ sortField: SortFieldTimeline.updated, sortOrder: Direction.desc }}
- onlyUserFavorite={onlyFavorites}
+ singleSelection={true}
+ options={getSelectableOptions({ timelines, onlyFavorites, searchTimelineValue })}
>
- {({ timelines, loading, totalCount }) => (
-
- !hideUntitled || t.title !== '').length,
- totalCount
- ),
- } as unknown) as ListProps,
- }}
- renderOption={renderTimelineOption}
- onChange={handleTimelineChange}
- searchable
- searchProps={{
- 'data-test-subj': 'timeline-super-select-search-box',
- isLoading: loading,
- placeholder: i18n.SEARCH_BOX_TIMELINE_PLACEHOLDER,
- onSearch: onSearchTimeline,
- incremental: false,
- inputRef: (ref: HTMLElement) => {
- setSearchRef(ref);
- },
- }}
- singleSelection={true}
- options={getSelectableOptions({ timelines, onlyFavorites, searchTimelineValue })}
- >
- {(list, search) => (
- <>
- {search}
- {favoritePortal}
- {list}
- >
- )}
-
-
+ {(list, search) => (
+ <>
+ {search}
+ {favoritePortal}
+ {list}
+ >
)}
-
- >
+
+
);
};
diff --git a/x-pack/plugins/siem/public/containers/timeline/all/api.ts b/x-pack/plugins/siem/public/containers/timeline/all/api.ts
deleted file mode 100644
index 09c8374bad113..0000000000000
--- a/x-pack/plugins/siem/public/containers/timeline/all/api.ts
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * 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 { TIMELINE_IMPORT_URL, TIMELINE_EXPORT_URL } from '../../../../common/constants';
-import { ImportDataProps, ImportDataResponse } from '../../detection_engine/rules';
-import { KibanaServices } from '../../../lib/kibana';
-import { ExportSelectedData } from '../../../components/generic_downloader';
-
-export const importTimelines = async ({
- fileToImport,
- overwrite = false,
- signal,
-}: ImportDataProps): Promise => {
- const formData = new FormData();
- formData.append('file', fileToImport);
-
- return KibanaServices.get().http.fetch(`${TIMELINE_IMPORT_URL}`, {
- method: 'POST',
- headers: { 'Content-Type': undefined },
- query: { overwrite },
- body: formData,
- signal,
- });
-};
-
-export const exportSelectedTimeline: ExportSelectedData = async ({
- excludeExportDetails = false,
- filename = `timelines_export.ndjson`,
- ids = [],
- signal,
-}): Promise => {
- const body = ids.length > 0 ? JSON.stringify({ ids }) : undefined;
- const response = await KibanaServices.get().http.fetch(`${TIMELINE_EXPORT_URL}`, {
- method: 'POST',
- body,
- query: {
- exclude_export_details: excludeExportDetails,
- file_name: filename,
- },
- signal,
- asResponse: true,
- });
-
- return response.body!;
-};
diff --git a/x-pack/plugins/siem/public/containers/timeline/all/index.gql_query.ts b/x-pack/plugins/siem/public/containers/timeline/all/index.gql_query.ts
index e380e46e77070..7d30b6c22a110 100644
--- a/x-pack/plugins/siem/public/containers/timeline/all/index.gql_query.ts
+++ b/x-pack/plugins/siem/public/containers/timeline/all/index.gql_query.ts
@@ -55,6 +55,9 @@ export const allTimelinesQuery = gql`
noteIds
pinnedEventIds
title
+ timelineType
+ templateTimelineId
+ templateTimelineVersion
created
createdBy
updated
diff --git a/x-pack/plugins/siem/public/containers/timeline/all/index.tsx b/x-pack/plugins/siem/public/containers/timeline/all/index.tsx
index b5c91ca287f0b..62c8d21a2e944 100644
--- a/x-pack/plugins/siem/public/containers/timeline/all/index.tsx
+++ b/x-pack/plugins/siem/public/containers/timeline/all/index.tsx
@@ -3,23 +3,28 @@
* or more contributor license agreements. Licensed under the Elastic License;
* you may not use this file except in compliance with the Elastic License.
*/
-import React, { useCallback } from 'react';
-import { getOr } from 'lodash/fp';
-import memoizeOne from 'memoize-one';
-import { Query } from 'react-apollo';
+import { getOr, noop } from 'lodash/fp';
+import memoizeOne from 'memoize-one';
+import { useCallback, useState, useRef, useEffect } from 'react';
+import { useDispatch } from 'react-redux';
-import { ApolloQueryResult } from 'apollo-client';
import { OpenTimelineResult } from '../../../components/open_timeline/types';
+import { errorToToaster, useStateToaster } from '../../../components/toasters';
import {
GetAllTimeline,
PageInfoTimeline,
SortTimeline,
TimelineResult,
} from '../../../graphql/types';
+import { inputsModel, inputsActions } from '../../../store/inputs';
+import { useApolloClient } from '../../../utils/apollo_context';
+
import { allTimelinesQuery } from './index.gql_query';
+import * as i18n from '../../../pages/timelines/translations';
export interface AllTimelinesArgs {
+ fetchAllTimeline: ({ onlyUserFavorite, pageInfo, search, sort }: AllTimelinesVariables) => void;
timelines: OpenTimelineResult[];
loading: boolean;
totalCount: number;
@@ -31,17 +36,13 @@ export interface AllTimelinesVariables {
pageInfo: PageInfoTimeline;
search: string;
sort: SortTimeline;
+ timelines: OpenTimelineResult[];
+ totalCount: number;
}
-interface OwnProps extends AllTimelinesVariables {
- children?: (args: AllTimelinesArgs) => React.ReactNode;
-}
-
-type Refetch = (
- variables: GetAllTimeline.Variables | undefined
-) => Promise>;
+export const ALL_TIMELINE_QUERY_ID = 'FETCH_ALL_TIMELINES';
-const getAllTimeline = memoizeOne(
+export const getAllTimeline = memoizeOne(
(variables: string, timelines: TimelineResult[]): OpenTimelineResult[] =>
timelines.map(timeline => ({
created: timeline.created,
@@ -76,41 +77,117 @@ const getAllTimeline = memoizeOne(
}))
);
-const AllTimelinesQueryComponent: React.FC = ({
- children,
- onlyUserFavorite,
- pageInfo,
- search,
- sort,
-}) => {
- const variables: GetAllTimeline.Variables = {
- onlyUserFavorite,
- pageInfo,
- search,
- sort,
- };
- const handleRefetch = useCallback((refetch: Refetch) => refetch(variables), [variables]);
+export const useGetAllTimeline = (): AllTimelinesArgs => {
+ const dispatch = useDispatch();
+ const apolloClient = useApolloClient();
+ const refetch = useRef();
+ const [, dispatchToaster] = useStateToaster();
+ const [allTimelines, setAllTimelines] = useState({
+ fetchAllTimeline: noop,
+ loading: false,
+ refetch: refetch.current ?? noop,
+ totalCount: 0,
+ timelines: [],
+ });
+
+ const fetchAllTimeline = useCallback(
+ async ({
+ onlyUserFavorite,
+ pageInfo,
+ search,
+ sort,
+ timelines,
+ totalCount,
+ }: AllTimelinesVariables) => {
+ let didCancel = false;
+ const abortCtrl = new AbortController();
- return (
-
- query={allTimelinesQuery}
- fetchPolicy="network-only"
- notifyOnNetworkStatusChange
- variables={variables}
- >
- {({ data, loading, refetch }) =>
- children!({
- loading,
- refetch: handleRefetch.bind(null, refetch),
- totalCount: getOr(0, 'getAllTimeline.totalCount', data),
- timelines: getAllTimeline(
- JSON.stringify(variables),
- getOr([], 'getAllTimeline.timeline', data)
- ),
- })
- }
-
+ const fetchData = async () => {
+ try {
+ if (apolloClient != null) {
+ setAllTimelines({
+ ...allTimelines,
+ timelines: timelines ?? allTimelines.timelines,
+ totalCount: totalCount ?? allTimelines.totalCount,
+ loading: true,
+ });
+ const variables: GetAllTimeline.Variables = {
+ onlyUserFavorite,
+ pageInfo,
+ search,
+ sort,
+ };
+ const response = await apolloClient.query<
+ GetAllTimeline.Query,
+ GetAllTimeline.Variables
+ >({
+ query: allTimelinesQuery,
+ fetchPolicy: 'network-only',
+ variables,
+ context: {
+ fetchOptions: {
+ abortSignal: abortCtrl.signal,
+ },
+ },
+ });
+ if (!didCancel) {
+ dispatch(
+ inputsActions.setQuery({
+ inputId: 'global',
+ id: ALL_TIMELINE_QUERY_ID,
+ loading: false,
+ refetch: refetch.current ?? noop,
+ inspect: null,
+ })
+ );
+ setAllTimelines({
+ fetchAllTimeline,
+ loading: false,
+ refetch: refetch.current ?? noop,
+ totalCount: getOr(0, 'getAllTimeline.totalCount', response.data),
+ timelines: getAllTimeline(
+ JSON.stringify(variables),
+ getOr([], 'getAllTimeline.timeline', response.data)
+ ),
+ });
+ }
+ }
+ } catch (error) {
+ if (!didCancel) {
+ errorToToaster({
+ title: i18n.ERROR_FETCHING_TIMELINES_TITLE,
+ error: error.body && error.body.message ? new Error(error.body.message) : error,
+ dispatchToaster,
+ });
+ setAllTimelines({
+ fetchAllTimeline,
+ loading: false,
+ refetch: noop,
+ totalCount: 0,
+ timelines: [],
+ });
+ }
+ }
+ };
+ refetch.current = fetchData;
+ fetchData();
+ return () => {
+ didCancel = true;
+ abortCtrl.abort();
+ };
+ },
+ [apolloClient, allTimelines]
);
-};
-export const AllTimelinesQuery = React.memo(AllTimelinesQueryComponent);
+ useEffect(() => {
+ return () => {
+ dispatch(inputsActions.deleteOneQuery({ inputId: 'global', id: ALL_TIMELINE_QUERY_ID }));
+ };
+ }, [dispatch]);
+
+ return {
+ ...allTimelines,
+ fetchAllTimeline,
+ refetch: refetch.current ?? noop,
+ };
+};
diff --git a/x-pack/plugins/siem/public/containers/timeline/api.ts b/x-pack/plugins/siem/public/containers/timeline/api.ts
new file mode 100644
index 0000000000000..023e2e6af9f88
--- /dev/null
+++ b/x-pack/plugins/siem/public/containers/timeline/api.ts
@@ -0,0 +1,115 @@
+/*
+ * 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 { fold } from 'fp-ts/lib/Either';
+import { identity } from 'fp-ts/lib/function';
+import { pipe } from 'fp-ts/lib/pipeable';
+
+import { throwErrors } from '../../../../case/common/api';
+import {
+ SavedTimeline,
+ TimelineResponse,
+ TimelineResponseType,
+} from '../../../common/types/timeline';
+import { TIMELINE_URL, TIMELINE_IMPORT_URL, TIMELINE_EXPORT_URL } from '../../../common/constants';
+
+import { KibanaServices } from '../../lib/kibana';
+import { ExportSelectedData } from '../../components/generic_downloader';
+
+import { createToasterPlainError } from '../case/utils';
+import { ImportDataProps, ImportDataResponse } from '../detection_engine/rules';
+
+interface RequestPostTimeline {
+ timeline: SavedTimeline;
+ signal?: AbortSignal;
+}
+
+interface RequestPatchTimeline extends RequestPostTimeline {
+ timelineId: T;
+ version: T;
+}
+
+type RequestPersistTimeline = RequestPostTimeline & Partial>;
+
+const decodeTimelineResponse = (respTimeline?: TimelineResponse) =>
+ pipe(
+ TimelineResponseType.decode(respTimeline),
+ fold(throwErrors(createToasterPlainError), identity)
+ );
+
+const postTimeline = async ({ timeline }: RequestPostTimeline): Promise => {
+ const response = await KibanaServices.get().http.post(TIMELINE_URL, {
+ method: 'POST',
+ body: JSON.stringify({ timeline }),
+ });
+
+ return decodeTimelineResponse(response);
+};
+
+const patchTimeline = async ({
+ timelineId,
+ timeline,
+ version,
+}: RequestPatchTimeline): Promise => {
+ const response = await KibanaServices.get().http.patch(TIMELINE_URL, {
+ method: 'PATCH',
+ body: JSON.stringify({ timeline, timelineId, version }),
+ });
+
+ return decodeTimelineResponse(response);
+};
+
+export const persistTimeline = async ({
+ timelineId,
+ timeline,
+ version,
+}: RequestPersistTimeline): Promise => {
+ if (timelineId == null) {
+ return postTimeline({ timeline });
+ }
+ return patchTimeline({
+ timelineId,
+ timeline,
+ version: version ?? '',
+ });
+};
+
+export const importTimelines = async ({
+ fileToImport,
+ overwrite = false,
+ signal,
+}: ImportDataProps): Promise => {
+ const formData = new FormData();
+ formData.append('file', fileToImport);
+
+ return KibanaServices.get().http.fetch(`${TIMELINE_IMPORT_URL}`, {
+ method: 'POST',
+ headers: { 'Content-Type': undefined },
+ query: { overwrite },
+ body: formData,
+ signal,
+ });
+};
+
+export const exportSelectedTimeline: ExportSelectedData = async ({
+ excludeExportDetails = false,
+ filename = `timelines_export.ndjson`,
+ ids = [],
+ signal,
+}): Promise => {
+ const body = ids.length > 0 ? JSON.stringify({ ids }) : undefined;
+ const response = await KibanaServices.get().http.fetch(`${TIMELINE_EXPORT_URL}`, {
+ method: 'POST',
+ body,
+ query: {
+ exclude_export_details: excludeExportDetails,
+ file_name: filename,
+ },
+ signal,
+ asResponse: true,
+ });
+
+ return response.body!;
+};
diff --git a/x-pack/plugins/siem/public/graphql/introspection.json b/x-pack/plugins/siem/public/graphql/introspection.json
index 2a9dd8f2aacfe..4026a043c7778 100644
--- a/x-pack/plugins/siem/public/graphql/introspection.json
+++ b/x-pack/plugins/siem/public/graphql/introspection.json
@@ -9728,6 +9728,30 @@
"isDeprecated": false,
"deprecationReason": null
},
+ {
+ "name": "templateTimelineId",
+ "description": "",
+ "args": [],
+ "type": { "kind": "SCALAR", "name": "String", "ofType": null },
+ "isDeprecated": false,
+ "deprecationReason": null
+ },
+ {
+ "name": "templateTimelineVersion",
+ "description": "",
+ "args": [],
+ "type": { "kind": "SCALAR", "name": "Int", "ofType": null },
+ "isDeprecated": false,
+ "deprecationReason": null
+ },
+ {
+ "name": "timelineType",
+ "description": "",
+ "args": [],
+ "type": { "kind": "ENUM", "name": "TimelineType", "ofType": null },
+ "isDeprecated": false,
+ "deprecationReason": null
+ },
{
"name": "updated",
"description": "",
@@ -10323,6 +10347,39 @@
"enumValues": null,
"possibleTypes": null
},
+ {
+ "kind": "SCALAR",
+ "name": "Int",
+ "description": "The `Int` scalar type represents non-fractional signed whole numeric values. Int can represent values between -(2^31) and 2^31 - 1. ",
+ "fields": null,
+ "inputFields": null,
+ "interfaces": null,
+ "enumValues": null,
+ "possibleTypes": null
+ },
+ {
+ "kind": "ENUM",
+ "name": "TimelineType",
+ "description": "",
+ "fields": null,
+ "inputFields": null,
+ "interfaces": null,
+ "enumValues": [
+ {
+ "name": "default",
+ "description": "",
+ "isDeprecated": false,
+ "deprecationReason": null
+ },
+ {
+ "name": "template",
+ "description": "",
+ "isDeprecated": false,
+ "deprecationReason": null
+ }
+ ],
+ "possibleTypes": null
+ },
{
"kind": "INPUT_OBJECT",
"name": "PageInfoTimeline",
@@ -10863,6 +10920,24 @@
"type": { "kind": "SCALAR", "name": "String", "ofType": null },
"defaultValue": null
},
+ {
+ "name": "templateTimelineId",
+ "description": "",
+ "type": { "kind": "SCALAR", "name": "String", "ofType": null },
+ "defaultValue": null
+ },
+ {
+ "name": "templateTimelineVersion",
+ "description": "",
+ "type": { "kind": "SCALAR", "name": "Int", "ofType": null },
+ "defaultValue": null
+ },
+ {
+ "name": "timelineType",
+ "description": "",
+ "type": { "kind": "ENUM", "name": "TimelineType", "ofType": null },
+ "defaultValue": null
+ },
{
"name": "dateRange",
"description": "",
diff --git a/x-pack/plugins/siem/public/graphql/types.ts b/x-pack/plugins/siem/public/graphql/types.ts
index e15c099a007ad..8c39d5e58b99e 100644
--- a/x-pack/plugins/siem/public/graphql/types.ts
+++ b/x-pack/plugins/siem/public/graphql/types.ts
@@ -132,6 +132,12 @@ export interface TimelineInput {
title?: Maybe;
+ templateTimelineId?: Maybe;
+
+ templateTimelineVersion?: Maybe;
+
+ timelineType?: Maybe;
+
dateRange?: Maybe;
savedQueryId?: Maybe;
@@ -334,6 +340,11 @@ export enum TlsFields {
_id = '_id',
}
+export enum TimelineType {
+ default = 'default',
+ template = 'template',
+}
+
export enum SortFieldTimeline {
title = 'title',
description = 'description',
@@ -1944,6 +1955,12 @@ export interface TimelineResult {
title?: Maybe;
+ templateTimelineId?: Maybe;
+
+ templateTimelineVersion?: Maybe;
+
+ timelineType?: Maybe;
+
updated?: Maybe;
updatedBy?: Maybe;
@@ -4030,6 +4047,12 @@ export namespace GetAllTimeline {
title: Maybe;
+ timelineType: Maybe;
+
+ templateTimelineId: Maybe;
+
+ templateTimelineVersion: Maybe;
+
created: Maybe;
createdBy: Maybe;
diff --git a/x-pack/plugins/siem/public/mock/timeline_results.ts b/x-pack/plugins/siem/public/mock/timeline_results.ts
index 0e61457873bfd..edd1c73771829 100644
--- a/x-pack/plugins/siem/public/mock/timeline_results.ts
+++ b/x-pack/plugins/siem/public/mock/timeline_results.ts
@@ -168,6 +168,9 @@ export const mockOpenTimelineQueryResults: MockedProvidedQuery[] = [
'ZF0W12oB9v5HJNSHwY6L',
],
title: 'test 1',
+ timelineType: null,
+ templateTimelineId: null,
+ templateTimelineVersion: null,
created: 1558386787614,
createdBy: 'elastic',
updated: 1558390951234,
@@ -294,6 +297,9 @@ export const mockOpenTimelineQueryResults: MockedProvidedQuery[] = [
'ZF0W12oB9v5HJNSHwY6L',
],
title: 'test 2',
+ timelineType: null,
+ templateTimelineId: null,
+ templateTimelineVersion: null,
created: 1558386787614,
createdBy: 'elastic',
updated: 1558390951234,
@@ -420,6 +426,9 @@ export const mockOpenTimelineQueryResults: MockedProvidedQuery[] = [
'ZF0W12oB9v5HJNSHwY6L',
],
title: 'test 2',
+ timelineType: null,
+ templateTimelineId: null,
+ templateTimelineVersion: null,
created: 1558386787614,
createdBy: 'elastic',
updated: 1558390951234,
@@ -546,6 +555,9 @@ export const mockOpenTimelineQueryResults: MockedProvidedQuery[] = [
'ZF0W12oB9v5HJNSHwY6L',
],
title: 'test 3',
+ timelineType: null,
+ templateTimelineId: null,
+ templateTimelineVersion: null,
created: 1558386787614,
createdBy: 'elastic',
updated: 1558390951234,
@@ -672,6 +684,9 @@ export const mockOpenTimelineQueryResults: MockedProvidedQuery[] = [
'ZF0W12oB9v5HJNSHwY6L',
],
title: 'test 4',
+ timelineType: null,
+ templateTimelineId: null,
+ templateTimelineVersion: null,
created: 1558386787614,
createdBy: 'elastic',
updated: 1558390951234,
@@ -798,6 +813,9 @@ export const mockOpenTimelineQueryResults: MockedProvidedQuery[] = [
'ZF0W12oB9v5HJNSHwY6L',
],
title: 'test 5',
+ timelineType: null,
+ templateTimelineId: null,
+ templateTimelineVersion: null,
created: 1558386787614,
createdBy: 'elastic',
updated: 1558390951234,
@@ -924,6 +942,9 @@ export const mockOpenTimelineQueryResults: MockedProvidedQuery[] = [
'ZF0W12oB9v5HJNSHwY6L',
],
title: 'test 6',
+ timelineType: null,
+ templateTimelineId: null,
+ templateTimelineVersion: null,
created: 1558386787614,
createdBy: 'elastic',
updated: 1558390951234,
@@ -1050,6 +1071,9 @@ export const mockOpenTimelineQueryResults: MockedProvidedQuery[] = [
'ZF0W12oB9v5HJNSHwY6L',
],
title: 'test 7',
+ timelineType: null,
+ templateTimelineId: null,
+ templateTimelineVersion: null,
created: 1558386787614,
createdBy: 'elastic',
updated: 1558390951234,
@@ -1176,6 +1200,9 @@ export const mockOpenTimelineQueryResults: MockedProvidedQuery[] = [
'ZF0W12oB9v5HJNSHwY6L',
],
title: 'test 7',
+ timelineType: null,
+ templateTimelineId: null,
+ templateTimelineVersion: null,
created: 1558386787614,
createdBy: 'elastic',
updated: 1558390951234,
@@ -1302,6 +1329,9 @@ export const mockOpenTimelineQueryResults: MockedProvidedQuery[] = [
'ZF0W12oB9v5HJNSHwY6L',
],
title: 'test 7',
+ timelineType: null,
+ templateTimelineId: null,
+ templateTimelineVersion: null,
created: 1558386787614,
createdBy: 'elastic',
updated: 1558390951234,
@@ -1428,6 +1458,9 @@ export const mockOpenTimelineQueryResults: MockedProvidedQuery[] = [
'ZF0W12oB9v5HJNSHwY6L',
],
title: 'test 7',
+ timelineType: null,
+ templateTimelineId: null,
+ templateTimelineVersion: null,
created: 1558386787614,
createdBy: 'elastic',
updated: 1558390951234,
@@ -1554,6 +1587,9 @@ export const mockOpenTimelineQueryResults: MockedProvidedQuery[] = [
'ZF0W12oB9v5HJNSHwY6L',
],
title: 'test 7',
+ timelineType: null,
+ templateTimelineId: null,
+ templateTimelineVersion: null,
created: 1558386787614,
createdBy: 'elastic',
updated: 1558390951234,
@@ -1680,6 +1716,9 @@ export const mockOpenTimelineQueryResults: MockedProvidedQuery[] = [
'ZF0W12oB9v5HJNSHwY6L',
],
title: 'test 7',
+ timelineType: null,
+ templateTimelineId: null,
+ templateTimelineVersion: null,
created: 1558386787614,
createdBy: 'elastic',
updated: 1558390951234,
diff --git a/x-pack/plugins/siem/public/pages/timelines/translations.ts b/x-pack/plugins/siem/public/pages/timelines/translations.ts
index 723d164ad2cdd..304474bbff2c5 100644
--- a/x-pack/plugins/siem/public/pages/timelines/translations.ts
+++ b/x-pack/plugins/siem/public/pages/timelines/translations.ts
@@ -23,3 +23,10 @@ export const ALL_TIMELINES_IMPORT_TIMELINE_TITLE = i18n.translate(
defaultMessage: 'Import Timeline',
}
);
+
+export const ERROR_FETCHING_TIMELINES_TITLE = i18n.translate(
+ 'xpack.siem.timelines.allTimelines.errorFetchingTimelinesTitle',
+ {
+ defaultMessage: 'Failed to query all timelines data',
+ }
+);
diff --git a/x-pack/plugins/siem/public/store/store.ts b/x-pack/plugins/siem/public/store/store.ts
index d3559e7a7adde..2af0f87b4494d 100644
--- a/x-pack/plugins/siem/public/store/store.ts
+++ b/x-pack/plugins/siem/public/store/store.ts
@@ -32,6 +32,7 @@ export const createStore = (
const middlewareDependencies = {
apolloClient$: apolloClient,
+ selectAllTimelineQuery: inputsSelectors.globalQueryByIdSelector,
selectNotesByIdSelector: appSelectors.selectNotesByIdSelector,
timelineByIdSelector: timelineSelectors.timelineByIdSelector,
timelineTimeRangeSelector: inputsSelectors.timelineTimeRangeSelector,
diff --git a/x-pack/plugins/siem/public/store/timeline/epic.ts b/x-pack/plugins/siem/public/store/timeline/epic.ts
index 4fece0572274f..6812d8d8aa672 100644
--- a/x-pack/plugins/siem/public/store/timeline/epic.ts
+++ b/x-pack/plugins/siem/public/store/timeline/epic.ts
@@ -29,17 +29,11 @@ import {
} from 'rxjs/operators';
import { esFilters, Filter, MatchAllFilter } from '../../../../../../src/plugins/data/public';
-import { persistTimelineMutation } from '../../containers/timeline/persist.gql_query';
-import {
- PersistTimelineMutation,
- TimelineInput,
- ResponseTimeline,
- TimelineResult,
-} from '../../graphql/types';
+import { TimelineInput, ResponseTimeline, TimelineResult } from '../../graphql/types';
import { AppApolloClient } from '../../lib/lib';
import { addError } from '../app/actions';
import { NotesById } from '../app/model';
-import { TimeRange } from '../inputs/model';
+import { inputsModel } from '../inputs';
import {
applyKqlFilterQuery,
@@ -75,13 +69,15 @@ import { epicPersistPinnedEvent, timelinePinnedEventActionsType } from './epic_p
import { epicPersistTimelineFavorite, timelineFavoriteActionsType } from './epic_favorite';
import { isNotNull } from './helpers';
import { dispatcherTimelinePersistQueue } from './epic_dispatcher_timeline_persistence_queue';
-import { refetchQueries } from './refetch_queries';
import { myEpicTimelineId } from './my_epic_timeline_id';
import { ActionTimeline, TimelineById } from './types';
+import { persistTimeline } from '../../containers/timeline/api';
+import { ALL_TIMELINE_QUERY_ID } from '../../containers/timeline/all';
interface TimelineEpicDependencies {
timelineByIdSelector: (state: State) => TimelineById;
- timelineTimeRangeSelector: (state: State) => TimeRange;
+ timelineTimeRangeSelector: (state: State) => inputsModel.TimeRange;
+ selectAllTimelineQuery: () => (state: State, id: string) => inputsModel.GlobalQuery;
selectNotesByIdSelector: (state: State) => NotesById;
apolloClient$: Observable;
}
@@ -119,10 +115,24 @@ export const createTimelineEpic = (): Epic<
> => (
action$,
state$,
- { selectNotesByIdSelector, timelineByIdSelector, timelineTimeRangeSelector, apolloClient$ }
+ {
+ selectAllTimelineQuery,
+ selectNotesByIdSelector,
+ timelineByIdSelector,
+ timelineTimeRangeSelector,
+ apolloClient$,
+ }
) => {
const timeline$ = state$.pipe(map(timelineByIdSelector), filter(isNotNull));
+ const allTimelineQuery$ = state$.pipe(
+ map(state => {
+ const getQuery = selectAllTimelineQuery();
+ return getQuery(state, ALL_TIMELINE_QUERY_ID);
+ }),
+ filter(isNotNull)
+ );
+
const notes$ = state$.pipe(map(selectNotesByIdSelector), filter(isNotNull));
const timelineTimeRange$ = state$.pipe(map(timelineTimeRangeSelector), filter(isNotNull));
@@ -168,33 +178,52 @@ export const createTimelineEpic = (): Epic<
const version = myEpicTimelineId.getTimelineVersion();
if (timelineNoteActionsType.includes(action.type)) {
- return epicPersistNote(apolloClient, action, timeline, notes, action$, timeline$, notes$);
+ return epicPersistNote(
+ apolloClient,
+ action,
+ timeline,
+ notes,
+ action$,
+ timeline$,
+ notes$,
+ allTimelineQuery$
+ );
} else if (timelinePinnedEventActionsType.includes(action.type)) {
- return epicPersistPinnedEvent(apolloClient, action, timeline, action$, timeline$);
+ return epicPersistPinnedEvent(
+ apolloClient,
+ action,
+ timeline,
+ action$,
+ timeline$,
+ allTimelineQuery$
+ );
} else if (timelineFavoriteActionsType.includes(action.type)) {
- return epicPersistTimelineFavorite(apolloClient, action, timeline, action$, timeline$);
+ return epicPersistTimelineFavorite(
+ apolloClient,
+ action,
+ timeline,
+ action$,
+ timeline$,
+ allTimelineQuery$
+ );
} else if (timelineActionsType.includes(action.type)) {
return from(
- apolloClient.mutate<
- PersistTimelineMutation.Mutation,
- PersistTimelineMutation.Variables
- >({
- mutation: persistTimelineMutation,
- fetchPolicy: 'no-cache',
- variables: {
- timelineId,
- version,
- timeline: convertTimelineAsInput(timeline[action.payload.id], timelineTimeRange),
- },
- refetchQueries,
+ persistTimeline({
+ timelineId,
+ version,
+ timeline: convertTimelineAsInput(timeline[action.payload.id], timelineTimeRange),
})
).pipe(
- withLatestFrom(timeline$),
- mergeMap(([result, recentTimeline]) => {
+ withLatestFrom(timeline$, allTimelineQuery$),
+ mergeMap(([result, recentTimeline, allTimelineQuery]) => {
const savedTimeline = recentTimeline[action.payload.id];
const response: ResponseTimeline = get('data.persistTimeline', result);
const callOutMsg = response.code === 403 ? [showCallOutUnauthorizedMsg()] : [];
+ if (allTimelineQuery.refetch != null) {
+ (allTimelineQuery.refetch as inputsModel.Refetch)();
+ }
+
return [
response.code === 409
? updateAutoSaveMsg({
@@ -261,7 +290,7 @@ const timelineInput: TimelineInput = {
export const convertTimelineAsInput = (
timeline: TimelineModel,
- timelineTimeRange: TimeRange
+ timelineTimeRange: inputsModel.TimeRange
): TimelineInput =>
Object.keys(timelineInput).reduce((acc, key) => {
if (has(key, timeline)) {
diff --git a/x-pack/plugins/siem/public/store/timeline/epic_favorite.ts b/x-pack/plugins/siem/public/store/timeline/epic_favorite.ts
index 4d1b73aa70a6e..6a1dadb8a59f5 100644
--- a/x-pack/plugins/siem/public/store/timeline/epic_favorite.ts
+++ b/x-pack/plugins/siem/public/store/timeline/epic_favorite.ts
@@ -26,6 +26,7 @@ import { dispatcherTimelinePersistQueue } from './epic_dispatcher_timeline_persi
import { refetchQueries } from './refetch_queries';
import { myEpicTimelineId } from './my_epic_timeline_id';
import { ActionTimeline, TimelineById } from './types';
+import { inputsModel } from '../inputs';
export const timelineFavoriteActionsType = [updateIsFavorite.type];
@@ -34,7 +35,8 @@ export const epicPersistTimelineFavorite = (
action: ActionTimeline,
timeline: TimelineById,
action$: Observable,
- timeline$: Observable
+ timeline$: Observable,
+ allTimelineQuery$: Observable
// eslint-disable-next-line @typescript-eslint/no-explicit-any
): Observable =>
from(
@@ -50,12 +52,16 @@ export const epicPersistTimelineFavorite = (
refetchQueries,
})
).pipe(
- withLatestFrom(timeline$),
- mergeMap(([result, recentTimelines]) => {
+ withLatestFrom(timeline$, allTimelineQuery$),
+ mergeMap(([result, recentTimelines, allTimelineQuery]) => {
const savedTimeline = recentTimelines[action.payload.id];
const response: ResponseFavoriteTimeline = get('data.persistFavorite', result);
const callOutMsg = response.code === 403 ? [showCallOutUnauthorizedMsg()] : [];
+ if (allTimelineQuery.refetch != null) {
+ (allTimelineQuery.refetch as inputsModel.Refetch)();
+ }
+
return [
...callOutMsg,
updateTimeline({
diff --git a/x-pack/plugins/siem/public/store/timeline/epic_note.ts b/x-pack/plugins/siem/public/store/timeline/epic_note.ts
index e5a712fe2c666..3722a6ad8036c 100644
--- a/x-pack/plugins/siem/public/store/timeline/epic_note.ts
+++ b/x-pack/plugins/siem/public/store/timeline/epic_note.ts
@@ -16,6 +16,7 @@ import { persistTimelineNoteMutation } from '../../containers/timeline/notes/per
import { PersistTimelineNoteMutation, ResponseNote } from '../../graphql/types';
import { updateNote, addError } from '../app/actions';
import { NotesById } from '../app/model';
+import { inputsModel } from '../inputs';
import {
addNote,
@@ -39,7 +40,8 @@ export const epicPersistNote = (
notes: NotesById,
action$: Observable,
timeline$: Observable,
- notes$: Observable
+ notes$: Observable,
+ allTimelineQuery$: Observable
// eslint-disable-next-line @typescript-eslint/no-explicit-any
): Observable =>
from(
@@ -61,12 +63,16 @@ export const epicPersistNote = (
refetchQueries,
})
).pipe(
- withLatestFrom(timeline$, notes$),
- mergeMap(([result, recentTimeline, recentNotes]) => {
+ withLatestFrom(timeline$, notes$, allTimelineQuery$),
+ mergeMap(([result, recentTimeline, recentNotes, allTimelineQuery]) => {
const noteIdRedux = action.payload.noteId;
const response: ResponseNote = get('data.persistNote', result);
const callOutMsg = response.code === 403 ? [showCallOutUnauthorizedMsg()] : [];
+ if (allTimelineQuery.refetch != null) {
+ (allTimelineQuery.refetch as inputsModel.Refetch)();
+ }
+
return [
...callOutMsg,
recentTimeline[action.payload.id].savedObjectId == null
diff --git a/x-pack/plugins/siem/public/store/timeline/epic_pinned_event.ts b/x-pack/plugins/siem/public/store/timeline/epic_pinned_event.ts
index 2260999a91e7b..a1281250ba72a 100644
--- a/x-pack/plugins/siem/public/store/timeline/epic_pinned_event.ts
+++ b/x-pack/plugins/siem/public/store/timeline/epic_pinned_event.ts
@@ -15,6 +15,8 @@ import { filter, mergeMap, startWith, withLatestFrom, takeUntil } from 'rxjs/ope
import { persistTimelinePinnedEventMutation } from '../../containers/timeline/pinned_event/persist.gql_query';
import { PersistTimelinePinnedEventMutation, PinnedEvent } from '../../graphql/types';
import { addError } from '../app/actions';
+import { inputsModel } from '../inputs';
+
import {
pinEvent,
endTimelineSaving,
@@ -35,7 +37,8 @@ export const epicPersistPinnedEvent = (
action: ActionTimeline,
timeline: TimelineById,
action$: Observable,
- timeline$: Observable
+ timeline$: Observable,
+ allTimelineQuery$: Observable
// eslint-disable-next-line @typescript-eslint/no-explicit-any
): Observable =>
from(
@@ -57,12 +60,16 @@ export const epicPersistPinnedEvent = (
refetchQueries,
})
).pipe(
- withLatestFrom(timeline$),
- mergeMap(([result, recentTimeline]) => {
+ withLatestFrom(timeline$, allTimelineQuery$),
+ mergeMap(([result, recentTimeline, allTimelineQuery]) => {
const savedTimeline = recentTimeline[action.payload.id];
const response: PinnedEvent = get('data.persistPinnedEventOnTimeline', result);
const callOutMsg = response && response.code === 403 ? [showCallOutUnauthorizedMsg()] : [];
+ if (allTimelineQuery.refetch != null) {
+ (allTimelineQuery.refetch as inputsModel.Refetch)();
+ }
+
return [
response != null
? updateTimeline({
diff --git a/x-pack/plugins/siem/server/graphql/timeline/schema.gql.ts b/x-pack/plugins/siem/server/graphql/timeline/schema.gql.ts
index 9dd04247b7f47..bc2b3a53d85f3 100644
--- a/x-pack/plugins/siem/server/graphql/timeline/schema.gql.ts
+++ b/x-pack/plugins/siem/server/graphql/timeline/schema.gql.ts
@@ -125,6 +125,11 @@ export const timelineSchema = gql`
script: String
}
+ enum TimelineType {
+ default
+ template
+ }
+
input TimelineInput {
columns: [ColumnHeaderInput!]
dataProviders: [DataProviderInput!]
@@ -134,6 +139,9 @@ export const timelineSchema = gql`
kqlMode: String
kqlQuery: SerializedFilterQueryInput
title: String
+ templateTimelineId: String
+ templateTimelineVersion: Int
+ timelineType: TimelineType
dateRange: DateRangePickerInput
savedQueryId: String
sort: SortTimelineInput
@@ -237,6 +245,9 @@ export const timelineSchema = gql`
savedObjectId: String!
sort: SortTimelineResult
title: String
+ templateTimelineId: String
+ templateTimelineVersion: Int
+ timelineType: TimelineType
updated: Float
updatedBy: String
version: String!
diff --git a/x-pack/plugins/siem/server/graphql/types.ts b/x-pack/plugins/siem/server/graphql/types.ts
index d272b7ff59b79..6a35ba08f8e43 100644
--- a/x-pack/plugins/siem/server/graphql/types.ts
+++ b/x-pack/plugins/siem/server/graphql/types.ts
@@ -134,6 +134,12 @@ export interface TimelineInput {
title?: Maybe;
+ templateTimelineId?: Maybe;
+
+ templateTimelineVersion?: Maybe;
+
+ timelineType?: Maybe;
+
dateRange?: Maybe;
savedQueryId?: Maybe;
@@ -336,6 +342,11 @@ export enum TlsFields {
_id = '_id',
}
+export enum TimelineType {
+ default = 'default',
+ template = 'template',
+}
+
export enum SortFieldTimeline {
title = 'title',
description = 'description',
@@ -1946,6 +1957,12 @@ export interface TimelineResult {
title?: Maybe;
+ templateTimelineId?: Maybe;
+
+ templateTimelineVersion?: Maybe;
+
+ timelineType?: Maybe;
+
updated?: Maybe;
updatedBy?: Maybe;
@@ -8023,6 +8040,12 @@ export namespace TimelineResultResolvers {
title?: TitleResolver, TypeParent, TContext>;
+ templateTimelineId?: TemplateTimelineIdResolver, TypeParent, TContext>;
+
+ templateTimelineVersion?: TemplateTimelineVersionResolver, TypeParent, TContext>;
+
+ timelineType?: TimelineTypeResolver, TypeParent, TContext>;
+
updated?: UpdatedResolver, TypeParent, TContext>;
updatedBy?: UpdatedByResolver, TypeParent, TContext>;
@@ -8130,6 +8153,21 @@ export namespace TimelineResultResolvers {
Parent = TimelineResult,
TContext = SiemContext
> = Resolver;
+ export type TemplateTimelineIdResolver<
+ R = Maybe,
+ Parent = TimelineResult,
+ TContext = SiemContext
+ > = Resolver;
+ export type TemplateTimelineVersionResolver<
+ R = Maybe,
+ Parent = TimelineResult,
+ TContext = SiemContext
+ > = Resolver;
+ export type TimelineTypeResolver<
+ R = Maybe,
+ Parent = TimelineResult,
+ TContext = SiemContext
+ > = Resolver;
export type UpdatedResolver<
R = Maybe,
Parent = TimelineResult,
diff --git a/x-pack/plugins/siem/server/lib/compose/kibana.ts b/x-pack/plugins/siem/server/lib/compose/kibana.ts
index 9c46f3320e37e..4a595032e43eb 100644
--- a/x-pack/plugins/siem/server/lib/compose/kibana.ts
+++ b/x-pack/plugins/siem/server/lib/compose/kibana.ts
@@ -27,9 +27,9 @@ import { ElasticsearchSourceStatusAdapter, SourceStatus } from '../source_status
import { ConfigurationSourcesAdapter, Sources } from '../sources';
import { AppBackendLibs, AppDomainLibs } from '../types';
import { ElasticsearchUncommonProcessesAdapter, UncommonProcesses } from '../uncommon_processes';
-import { Note } from '../note/saved_object';
-import { PinnedEvent } from '../pinned_event/saved_object';
-import { Timeline } from '../timeline/saved_object';
+import * as note from '../note/saved_object';
+import * as pinnedEvent from '../pinned_event/saved_object';
+import * as timeline from '../timeline/saved_object';
import { ElasticsearchMatrixHistogramAdapter, MatrixHistogram } from '../matrix_histogram';
export function compose(
@@ -41,10 +41,6 @@ export function compose(
const sources = new Sources(new ConfigurationSourcesAdapter());
const sourceStatus = new SourceStatus(new ElasticsearchSourceStatusAdapter(framework));
- const timeline = new Timeline();
- const note = new Note();
- const pinnedEvent = new PinnedEvent();
-
const domainLibs: AppDomainLibs = {
authentications: new Authentications(new ElasticsearchAuthenticationAdapter(framework)),
events: new Events(new ElasticsearchEventsAdapter(framework)),
diff --git a/x-pack/plugins/siem/server/lib/detection_engine/scripts/get_action_instances.sh b/x-pack/plugins/siem/server/lib/detection_engine/scripts/get_action_instances.sh
index 750c5574f4a72..2028216e6770f 100755
--- a/x-pack/plugins/siem/server/lib/detection_engine/scripts/get_action_instances.sh
+++ b/x-pack/plugins/siem/server/lib/detection_engine/scripts/get_action_instances.sh
@@ -10,7 +10,7 @@ set -e
./check_env_variables.sh
# Example: ./get_action_instances.sh
-# https://github.com/elastic/kibana/blob/master/x-pack/legacy/plugins/actions/README.md#get-apiaction_find-find-actions
+# https://github.com/elastic/kibana/blob/master/x-pack/plugins/actions/README.md#get-apiaction_find-find-actions
curl -s -k \
-u ${ELASTICSEARCH_USERNAME}:${ELASTICSEARCH_PASSWORD} \
-X GET ${KIBANA_URL}${SPACE_URL}/api/action/_getAll \
diff --git a/x-pack/plugins/siem/server/lib/detection_engine/scripts/get_action_types.sh b/x-pack/plugins/siem/server/lib/detection_engine/scripts/get_action_types.sh
index 8d8cbdd70a803..c587e9a204182 100755
--- a/x-pack/plugins/siem/server/lib/detection_engine/scripts/get_action_types.sh
+++ b/x-pack/plugins/siem/server/lib/detection_engine/scripts/get_action_types.sh
@@ -10,7 +10,7 @@ set -e
./check_env_variables.sh
# Example: ./get_action_types.sh
-# https://github.com/elastic/kibana/blob/master/x-pack/legacy/plugins/actions/README.md
+# https://github.com/elastic/kibana/blob/master/x-pack/plugins/actions/README.md
curl -s -k \
-u ${ELASTICSEARCH_USERNAME}:${ELASTICSEARCH_PASSWORD} \
-X GET ${KIBANA_URL}${SPACE_URL}/api/action/types \
diff --git a/x-pack/plugins/siem/server/lib/note/saved_object.ts b/x-pack/plugins/siem/server/lib/note/saved_object.ts
index 3eae30625e422..219465f551457 100644
--- a/x-pack/plugins/siem/server/lib/note/saved_object.ts
+++ b/x-pack/plugins/siem/server/lib/note/saved_object.ts
@@ -15,6 +15,11 @@ import { identity } from 'fp-ts/lib/function';
import { SavedObjectsFindOptions } from '../../../../../../src/core/server';
import { AuthenticatedUser } from '../../../../security/common/model';
import { UNAUTHENTICATED_USER } from '../../../common/constants';
+import {
+ SavedNote,
+ NoteSavedObjectRuntimeType,
+ NoteSavedObject,
+} from '../../../common/types/timeline/note';
import {
PageInfoNote,
ResponseNote,
@@ -23,178 +28,198 @@ import {
NoteResult,
} from '../../graphql/types';
import { FrameworkRequest } from '../framework';
-import { SavedNote, NoteSavedObjectRuntimeType, NoteSavedObject } from './types';
import { noteSavedObjectType } from './saved_object_mappings';
import { pickSavedTimeline } from '../timeline/pick_saved_timeline';
import { convertSavedObjectToSavedTimeline } from '../timeline/convert_saved_object_to_savedtimeline';
import { timelineSavedObjectType } from '../timeline/saved_object_mappings';
-export class Note {
- public async deleteNote(request: FrameworkRequest, noteIds: string[]) {
- const savedObjectsClient = request.context.core.savedObjects.client;
-
- await Promise.all(
- noteIds.map(noteId => savedObjectsClient.delete(noteSavedObjectType, noteId))
- );
- }
-
- public async deleteNoteByTimelineId(request: FrameworkRequest, timelineId: string) {
- const options: SavedObjectsFindOptions = {
- type: noteSavedObjectType,
- search: timelineId,
- searchFields: ['timelineId'],
- };
- const notesToBeDeleted = await this.getAllSavedNote(request, options);
- const savedObjectsClient = request.context.core.savedObjects.client;
-
- await Promise.all(
- notesToBeDeleted.notes.map(note =>
- savedObjectsClient.delete(noteSavedObjectType, note.noteId)
- )
- );
- }
-
- public async getNote(request: FrameworkRequest, noteId: string): Promise {
- return this.getSavedNote(request, noteId);
- }
-
- public async getNotesByEventId(
- request: FrameworkRequest,
- eventId: string
- ): Promise {
- const options: SavedObjectsFindOptions = {
- type: noteSavedObjectType,
- search: eventId,
- searchFields: ['eventId'],
- };
- const notesByEventId = await this.getAllSavedNote(request, options);
- return notesByEventId.notes;
- }
-
- public async getNotesByTimelineId(
- request: FrameworkRequest,
- timelineId: string
- ): Promise {
- const options: SavedObjectsFindOptions = {
- type: noteSavedObjectType,
- search: timelineId,
- searchFields: ['timelineId'],
- };
- const notesByTimelineId = await this.getAllSavedNote(request, options);
- return notesByTimelineId.notes;
- }
-
- public async getAllNotes(
+export interface Note {
+ deleteNote: (request: FrameworkRequest, noteIds: string[]) => Promise;
+ deleteNoteByTimelineId: (request: FrameworkRequest, noteIds: string) => Promise;
+ getNote: (request: FrameworkRequest, noteId: string) => Promise;
+ getNotesByEventId: (request: FrameworkRequest, noteId: string) => Promise;
+ getNotesByTimelineId: (request: FrameworkRequest, noteId: string) => Promise;
+ getAllNotes: (
request: FrameworkRequest,
pageInfo: PageInfoNote | null,
search: string | null,
sort: SortNote | null
- ): Promise {
- const options: SavedObjectsFindOptions = {
- type: noteSavedObjectType,
- perPage: pageInfo != null ? pageInfo.pageSize : undefined,
- page: pageInfo != null ? pageInfo.pageIndex : undefined,
- search: search != null ? search : undefined,
- searchFields: ['note'],
- sortField: sort != null ? sort.sortField : undefined,
- sortOrder: sort != null ? sort.sortOrder : undefined,
- };
- return this.getAllSavedNote(request, options);
- }
-
- public async persistNote(
+ ) => Promise;
+ persistNote: (
request: FrameworkRequest,
noteId: string | null,
version: string | null,
note: SavedNote
- ): Promise {
- try {
- const savedObjectsClient = request.context.core.savedObjects.client;
-
- if (noteId == null) {
- const timelineVersionSavedObject =
- note.timelineId == null
- ? await (async () => {
- const timelineResult = convertSavedObjectToSavedTimeline(
- await savedObjectsClient.create(
- timelineSavedObjectType,
- pickSavedTimeline(null, {}, request.user)
- )
- );
- note.timelineId = timelineResult.savedObjectId;
- return timelineResult.version;
- })()
- : null;
-
- // Create new note
- return {
- code: 200,
- message: 'success',
- note: convertSavedObjectToSavedNote(
- await savedObjectsClient.create(
- noteSavedObjectType,
- pickSavedNote(noteId, note, request.user)
- ),
- timelineVersionSavedObject != null ? timelineVersionSavedObject : undefined
- ),
- };
- }
+ ) => Promise;
+ convertSavedObjectToSavedNote: (
+ savedObject: unknown,
+ timelineVersion?: string | undefined | null
+ ) => NoteSavedObject;
+}
+
+export const deleteNote = async (request: FrameworkRequest, noteIds: string[]) => {
+ const savedObjectsClient = request.context.core.savedObjects.client;
+
+ await Promise.all(noteIds.map(noteId => savedObjectsClient.delete(noteSavedObjectType, noteId)));
+};
+
+export const deleteNoteByTimelineId = async (request: FrameworkRequest, timelineId: string) => {
+ const options: SavedObjectsFindOptions = {
+ type: noteSavedObjectType,
+ search: timelineId,
+ searchFields: ['timelineId'],
+ };
+ const notesToBeDeleted = await getAllSavedNote(request, options);
+ const savedObjectsClient = request.context.core.savedObjects.client;
+
+ await Promise.all(
+ notesToBeDeleted.notes.map(note => savedObjectsClient.delete(noteSavedObjectType, note.noteId))
+ );
+};
+
+export const getNote = async (
+ request: FrameworkRequest,
+ noteId: string
+): Promise => {
+ return getSavedNote(request, noteId);
+};
+
+export const getNotesByEventId = async (
+ request: FrameworkRequest,
+ eventId: string
+): Promise => {
+ const options: SavedObjectsFindOptions = {
+ type: noteSavedObjectType,
+ search: eventId,
+ searchFields: ['eventId'],
+ };
+ const notesByEventId = await getAllSavedNote(request, options);
+ return notesByEventId.notes;
+};
+
+export const getNotesByTimelineId = async (
+ request: FrameworkRequest,
+ timelineId: string
+): Promise => {
+ const options: SavedObjectsFindOptions = {
+ type: noteSavedObjectType,
+ search: timelineId,
+ searchFields: ['timelineId'],
+ };
+ const notesByTimelineId = await getAllSavedNote(request, options);
+ return notesByTimelineId.notes;
+};
+
+export const getAllNotes = async (
+ request: FrameworkRequest,
+ pageInfo: PageInfoNote | null,
+ search: string | null,
+ sort: SortNote | null
+): Promise => {
+ const options: SavedObjectsFindOptions = {
+ type: noteSavedObjectType,
+ perPage: pageInfo != null ? pageInfo.pageSize : undefined,
+ page: pageInfo != null ? pageInfo.pageIndex : undefined,
+ search: search != null ? search : undefined,
+ searchFields: ['note'],
+ sortField: sort != null ? sort.sortField : undefined,
+ sortOrder: sort != null ? sort.sortOrder : undefined,
+ };
+ return getAllSavedNote(request, options);
+};
+
+export const persistNote = async (
+ request: FrameworkRequest,
+ noteId: string | null,
+ version: string | null,
+ note: SavedNote
+): Promise => {
+ try {
+ const savedObjectsClient = request.context.core.savedObjects.client;
- // Update new note
+ if (noteId == null) {
+ const timelineVersionSavedObject =
+ note.timelineId == null
+ ? await (async () => {
+ const timelineResult = convertSavedObjectToSavedTimeline(
+ await savedObjectsClient.create(
+ timelineSavedObjectType,
+ pickSavedTimeline(null, {}, request.user)
+ )
+ );
+ note.timelineId = timelineResult.savedObjectId;
+ return timelineResult.version;
+ })()
+ : null;
- const existingNote = await this.getSavedNote(request, noteId);
+ // Create new note
return {
code: 200,
message: 'success',
note: convertSavedObjectToSavedNote(
- await savedObjectsClient.update(
+ await savedObjectsClient.create(
noteSavedObjectType,
- noteId,
- pickSavedNote(noteId, note, request.user),
- {
- version: existingNote.version || undefined,
- }
- )
+ pickSavedNote(noteId, note, request.user)
+ ),
+ timelineVersionSavedObject != null ? timelineVersionSavedObject : undefined
),
};
- } catch (err) {
- if (getOr(null, 'output.statusCode', err) === 403) {
- const noteToReturn: NoteResult = {
- ...note,
- noteId: uuid.v1(),
- version: '',
- timelineId: '',
- timelineVersion: '',
- };
- return {
- code: 403,
- message: err.message,
- note: noteToReturn,
- };
- }
- throw err;
}
- }
- private async getSavedNote(request: FrameworkRequest, NoteId: string) {
- const savedObjectsClient = request.context.core.savedObjects.client;
- const savedObject = await savedObjectsClient.get(noteSavedObjectType, NoteId);
-
- return convertSavedObjectToSavedNote(savedObject);
- }
-
- private async getAllSavedNote(request: FrameworkRequest, options: SavedObjectsFindOptions) {
- const savedObjectsClient = request.context.core.savedObjects.client;
- const savedObjects = await savedObjectsClient.find(options);
+ // Update new note
+ const existingNote = await getSavedNote(request, noteId);
return {
- totalCount: savedObjects.total,
- notes: savedObjects.saved_objects.map(savedObject =>
- convertSavedObjectToSavedNote(savedObject)
+ code: 200,
+ message: 'success',
+ note: convertSavedObjectToSavedNote(
+ await savedObjectsClient.update(
+ noteSavedObjectType,
+ noteId,
+ pickSavedNote(noteId, note, request.user),
+ {
+ version: existingNote.version || undefined,
+ }
+ )
),
};
+ } catch (err) {
+ if (getOr(null, 'output.statusCode', err) === 403) {
+ const noteToReturn: NoteResult = {
+ ...note,
+ noteId: uuid.v1(),
+ version: '',
+ timelineId: '',
+ timelineVersion: '',
+ };
+ return {
+ code: 403,
+ message: err.message,
+ note: noteToReturn,
+ };
+ }
+ throw err;
}
-}
+};
+
+const getSavedNote = async (request: FrameworkRequest, NoteId: string) => {
+ const savedObjectsClient = request.context.core.savedObjects.client;
+ const savedObject = await savedObjectsClient.get(noteSavedObjectType, NoteId);
+
+ return convertSavedObjectToSavedNote(savedObject);
+};
+
+const getAllSavedNote = async (request: FrameworkRequest, options: SavedObjectsFindOptions) => {
+ const savedObjectsClient = request.context.core.savedObjects.client;
+ const savedObjects = await savedObjectsClient.find(options);
+
+ return {
+ totalCount: savedObjects.total,
+ notes: savedObjects.saved_objects.map(savedObject =>
+ convertSavedObjectToSavedNote(savedObject)
+ ),
+ };
+};
export const convertSavedObjectToSavedNote = (
savedObject: unknown,
diff --git a/x-pack/plugins/siem/server/lib/pinned_event/saved_object.ts b/x-pack/plugins/siem/server/lib/pinned_event/saved_object.ts
index 1e3a481e17106..c653f23d5c149 100644
--- a/x-pack/plugins/siem/server/lib/pinned_event/saved_object.ts
+++ b/x-pack/plugins/siem/server/lib/pinned_event/saved_object.ts
@@ -13,174 +13,224 @@ import { identity } from 'fp-ts/lib/function';
import { SavedObjectsFindOptions } from '../../../../../../src/core/server';
import { AuthenticatedUser } from '../../../../security/common/model';
import { UNAUTHENTICATED_USER } from '../../../common/constants';
-import { FrameworkRequest } from '../framework';
import {
PinnedEventSavedObject,
PinnedEventSavedObjectRuntimeType,
SavedPinnedEvent,
-} from './types';
+} from '../../../common/types/timeline/pinned_event';
+import { FrameworkRequest } from '../framework';
+
import { PageInfoNote, SortNote, PinnedEvent as PinnedEventResponse } from '../../graphql/types';
import { pickSavedTimeline } from '../timeline/pick_saved_timeline';
import { convertSavedObjectToSavedTimeline } from '../timeline/convert_saved_object_to_savedtimeline';
import { pinnedEventSavedObjectType } from './saved_object_mappings';
import { timelineSavedObjectType } from '../timeline/saved_object_mappings';
-export class PinnedEvent {
- public async deletePinnedEventOnTimeline(request: FrameworkRequest, pinnedEventIds: string[]) {
- const savedObjectsClient = request.context.core.savedObjects.client;
-
- await Promise.all(
- pinnedEventIds.map(pinnedEventId =>
- savedObjectsClient.delete(pinnedEventSavedObjectType, pinnedEventId)
- )
- );
- }
+export interface PinnedEvent {
+ deletePinnedEventOnTimeline: (
+ request: FrameworkRequest,
+ pinnedEventIds: string[]
+ ) => Promise;
- public async deleteAllPinnedEventsOnTimeline(request: FrameworkRequest, timelineId: string) {
- const savedObjectsClient = request.context.core.savedObjects.client;
- const options: SavedObjectsFindOptions = {
- type: pinnedEventSavedObjectType,
- search: timelineId,
- searchFields: ['timelineId'],
- };
- const pinnedEventToBeDeleted = await this.getAllSavedPinnedEvents(request, options);
- await Promise.all(
- pinnedEventToBeDeleted.map(pinnedEvent =>
- savedObjectsClient.delete(pinnedEventSavedObjectType, pinnedEvent.pinnedEventId)
- )
- );
- }
+ deleteAllPinnedEventsOnTimeline: (request: FrameworkRequest, timelineId: string) => Promise;
- public async getPinnedEvent(
+ getPinnedEvent: (
request: FrameworkRequest,
pinnedEventId: string
- ): Promise {
- return this.getSavedPinnedEvent(request, pinnedEventId);
- }
+ ) => Promise;
- public async getAllPinnedEventsByTimelineId(
+ getAllPinnedEventsByTimelineId: (
request: FrameworkRequest,
timelineId: string
- ): Promise {
- const options: SavedObjectsFindOptions = {
- type: pinnedEventSavedObjectType,
- search: timelineId,
- searchFields: ['timelineId'],
- };
- return this.getAllSavedPinnedEvents(request, options);
- }
+ ) => Promise;
- public async getAllPinnedEvents(
+ getAllPinnedEvents: (
request: FrameworkRequest,
pageInfo: PageInfoNote | null,
search: string | null,
sort: SortNote | null
- ): Promise {
- const options: SavedObjectsFindOptions = {
- type: pinnedEventSavedObjectType,
- perPage: pageInfo != null ? pageInfo.pageSize : undefined,
- page: pageInfo != null ? pageInfo.pageIndex : undefined,
- search: search != null ? search : undefined,
- searchFields: ['timelineId', 'eventId'],
- sortField: sort != null ? sort.sortField : undefined,
- sortOrder: sort != null ? sort.sortOrder : undefined,
- };
- return this.getAllSavedPinnedEvents(request, options);
- }
+ ) => Promise;
- public async persistPinnedEventOnTimeline(
+ persistPinnedEventOnTimeline: (
request: FrameworkRequest,
pinnedEventId: string | null, // pinned event saved object id
eventId: string,
timelineId: string | null
- ): Promise {
- const savedObjectsClient = request.context.core.savedObjects.client;
-
- try {
- if (pinnedEventId == null) {
- const timelineVersionSavedObject =
- timelineId == null
- ? await (async () => {
- const timelineResult = convertSavedObjectToSavedTimeline(
- await savedObjectsClient.create(
- timelineSavedObjectType,
- pickSavedTimeline(null, {}, request.user || null)
- )
- );
- timelineId = timelineResult.savedObjectId; // eslint-disable-line no-param-reassign
- return timelineResult.version;
- })()
- : null;
-
- if (timelineId != null) {
- const allPinnedEventId = await this.getAllPinnedEventsByTimelineId(request, timelineId);
- const isPinnedAlreadyExisting = allPinnedEventId.filter(
- pinnedEvent => pinnedEvent.eventId === eventId
- );
+ ) => Promise;
- if (isPinnedAlreadyExisting.length === 0) {
- const savedPinnedEvent: SavedPinnedEvent = {
- eventId,
- timelineId,
- };
- // create Pinned Event on Timeline
- return convertSavedObjectToSavedPinnedEvent(
- await savedObjectsClient.create(
- pinnedEventSavedObjectType,
- pickSavedPinnedEvent(pinnedEventId, savedPinnedEvent, request.user || null)
- ),
- timelineVersionSavedObject != null ? timelineVersionSavedObject : undefined
- );
- }
- return isPinnedAlreadyExisting[0];
+ convertSavedObjectToSavedPinnedEvent: (
+ savedObject: unknown,
+ timelineVersion?: string | undefined | null
+ ) => PinnedEventSavedObject;
+
+ pickSavedPinnedEvent: (
+ pinnedEventId: string | null,
+ savedPinnedEvent: SavedPinnedEvent,
+ userInfo: AuthenticatedUser | null
+ ) => // eslint-disable-next-line @typescript-eslint/no-explicit-any
+ any;
+}
+
+export const deletePinnedEventOnTimeline = async (
+ request: FrameworkRequest,
+ pinnedEventIds: string[]
+) => {
+ const savedObjectsClient = request.context.core.savedObjects.client;
+
+ await Promise.all(
+ pinnedEventIds.map(pinnedEventId =>
+ savedObjectsClient.delete(pinnedEventSavedObjectType, pinnedEventId)
+ )
+ );
+};
+
+export const deleteAllPinnedEventsOnTimeline = async (
+ request: FrameworkRequest,
+ timelineId: string
+) => {
+ const savedObjectsClient = request.context.core.savedObjects.client;
+ const options: SavedObjectsFindOptions = {
+ type: pinnedEventSavedObjectType,
+ search: timelineId,
+ searchFields: ['timelineId'],
+ };
+ const pinnedEventToBeDeleted = await getAllSavedPinnedEvents(request, options);
+ await Promise.all(
+ pinnedEventToBeDeleted.map(pinnedEvent =>
+ savedObjectsClient.delete(pinnedEventSavedObjectType, pinnedEvent.pinnedEventId)
+ )
+ );
+};
+
+export const getPinnedEvent = async (
+ request: FrameworkRequest,
+ pinnedEventId: string
+): Promise => {
+ return getSavedPinnedEvent(request, pinnedEventId);
+};
+
+export const getAllPinnedEventsByTimelineId = async (
+ request: FrameworkRequest,
+ timelineId: string
+): Promise => {
+ const options: SavedObjectsFindOptions = {
+ type: pinnedEventSavedObjectType,
+ search: timelineId,
+ searchFields: ['timelineId'],
+ };
+ return getAllSavedPinnedEvents(request, options);
+};
+
+export const getAllPinnedEvents = async (
+ request: FrameworkRequest,
+ pageInfo: PageInfoNote | null,
+ search: string | null,
+ sort: SortNote | null
+): Promise => {
+ const options: SavedObjectsFindOptions = {
+ type: pinnedEventSavedObjectType,
+ perPage: pageInfo != null ? pageInfo.pageSize : undefined,
+ page: pageInfo != null ? pageInfo.pageIndex : undefined,
+ search: search != null ? search : undefined,
+ searchFields: ['timelineId', 'eventId'],
+ sortField: sort != null ? sort.sortField : undefined,
+ sortOrder: sort != null ? sort.sortOrder : undefined,
+ };
+ return getAllSavedPinnedEvents(request, options);
+};
+
+export const persistPinnedEventOnTimeline = async (
+ request: FrameworkRequest,
+ pinnedEventId: string | null, // pinned event saved object id
+ eventId: string,
+ timelineId: string | null
+): Promise => {
+ const savedObjectsClient = request.context.core.savedObjects.client;
+
+ try {
+ if (pinnedEventId == null) {
+ const timelineVersionSavedObject =
+ timelineId == null
+ ? await (async () => {
+ const timelineResult = convertSavedObjectToSavedTimeline(
+ await savedObjectsClient.create(
+ timelineSavedObjectType,
+ pickSavedTimeline(null, {}, request.user || null)
+ )
+ );
+ timelineId = timelineResult.savedObjectId; // eslint-disable-line no-param-reassign
+ return timelineResult.version;
+ })()
+ : null;
+
+ if (timelineId != null) {
+ const allPinnedEventId = await getAllPinnedEventsByTimelineId(request, timelineId);
+ const isPinnedAlreadyExisting = allPinnedEventId.filter(
+ pinnedEvent => pinnedEvent.eventId === eventId
+ );
+
+ if (isPinnedAlreadyExisting.length === 0) {
+ const savedPinnedEvent: SavedPinnedEvent = {
+ eventId,
+ timelineId,
+ };
+ // create Pinned Event on Timeline
+ return convertSavedObjectToSavedPinnedEvent(
+ await savedObjectsClient.create(
+ pinnedEventSavedObjectType,
+ pickSavedPinnedEvent(pinnedEventId, savedPinnedEvent, request.user || null)
+ ),
+ timelineVersionSavedObject != null ? timelineVersionSavedObject : undefined
+ );
}
- throw new Error('You can NOT pinned event without a timelineID');
+ return isPinnedAlreadyExisting[0];
}
- // Delete Pinned Event on Timeline
- await this.deletePinnedEventOnTimeline(request, [pinnedEventId]);
+ throw new Error('You can NOT pinned event without a timelineID');
+ }
+ // Delete Pinned Event on Timeline
+ await deletePinnedEventOnTimeline(request, [pinnedEventId]);
+ return null;
+ } catch (err) {
+ if (getOr(null, 'output.statusCode', err) === 404) {
+ /*
+ * Why we are doing that, because if it is not found for sure that it will be unpinned
+ * There is no need to bring back this error since we can assume that it is unpinned
+ */
return null;
- } catch (err) {
- if (getOr(null, 'output.statusCode', err) === 404) {
- /*
- * Why we are doing that, because if it is not found for sure that it will be unpinned
- * There is no need to bring back this error since we can assume that it is unpinned
- */
- return null;
- }
- if (getOr(null, 'output.statusCode', err) === 403) {
- return pinnedEventId != null
- ? {
- code: 403,
- message: err.message,
- pinnedEventId: eventId,
- timelineId: '',
- timelineVersion: '',
- }
- : null;
- }
- throw err;
}
+ if (getOr(null, 'output.statusCode', err) === 403) {
+ return pinnedEventId != null
+ ? {
+ code: 403,
+ message: err.message,
+ pinnedEventId: eventId,
+ timelineId: '',
+ timelineVersion: '',
+ }
+ : null;
+ }
+ throw err;
}
+};
- private async getSavedPinnedEvent(request: FrameworkRequest, pinnedEventId: string) {
- const savedObjectsClient = request.context.core.savedObjects.client;
- const savedObject = await savedObjectsClient.get(pinnedEventSavedObjectType, pinnedEventId);
+const getSavedPinnedEvent = async (request: FrameworkRequest, pinnedEventId: string) => {
+ const savedObjectsClient = request.context.core.savedObjects.client;
+ const savedObject = await savedObjectsClient.get(pinnedEventSavedObjectType, pinnedEventId);
- return convertSavedObjectToSavedPinnedEvent(savedObject);
- }
+ return convertSavedObjectToSavedPinnedEvent(savedObject);
+};
- private async getAllSavedPinnedEvents(
- request: FrameworkRequest,
- options: SavedObjectsFindOptions
- ) {
- const savedObjectsClient = request.context.core.savedObjects.client;
- const savedObjects = await savedObjectsClient.find(options);
-
- return savedObjects.saved_objects.map(savedObject =>
- convertSavedObjectToSavedPinnedEvent(savedObject)
- );
- }
-}
+const getAllSavedPinnedEvents = async (
+ request: FrameworkRequest,
+ options: SavedObjectsFindOptions
+) => {
+ const savedObjectsClient = request.context.core.savedObjects.client;
+ const savedObjects = await savedObjectsClient.find(options);
+
+ return savedObjects.saved_objects.map(savedObject =>
+ convertSavedObjectToSavedPinnedEvent(savedObject)
+ );
+};
export const convertSavedObjectToSavedPinnedEvent = (
savedObject: unknown,
diff --git a/x-pack/plugins/siem/server/lib/timeline/convert_saved_object_to_savedtimeline.ts b/x-pack/plugins/siem/server/lib/timeline/convert_saved_object_to_savedtimeline.ts
index ea5db565483c8..bde24a338ec84 100644
--- a/x-pack/plugins/siem/server/lib/timeline/convert_saved_object_to_savedtimeline.ts
+++ b/x-pack/plugins/siem/server/lib/timeline/convert_saved_object_to_savedtimeline.ts
@@ -8,16 +8,21 @@ import { failure } from 'io-ts/lib/PathReporter';
import { pipe } from 'fp-ts/lib/pipeable';
import { map, fold } from 'fp-ts/lib/Either';
import { identity } from 'fp-ts/lib/function';
-import { TimelineSavedObjectRuntimeType, TimelineSavedObject } from './types';
+import {
+ TimelineSavedObjectRuntimeType,
+ TimelineSavedObject,
+} from '../../../common/types/timeline';
export const convertSavedObjectToSavedTimeline = (savedObject: unknown): TimelineSavedObject => {
const timeline = pipe(
TimelineSavedObjectRuntimeType.decode(savedObject),
- map(savedTimeline => ({
- savedObjectId: savedTimeline.id,
- version: savedTimeline.version,
- ...savedTimeline.attributes,
- })),
+ map(savedTimeline => {
+ return {
+ savedObjectId: savedTimeline.id,
+ version: savedTimeline.version,
+ ...savedTimeline.attributes,
+ };
+ }),
fold(errors => {
throw new Error(failure(errors).join('\n'));
}, identity)
diff --git a/x-pack/plugins/siem/server/lib/timeline/create_timelines_stream_from_ndjson.ts b/x-pack/plugins/siem/server/lib/timeline/create_timelines_stream_from_ndjson.ts
index abe8de9bf5b94..6b4017b5e4d5c 100644
--- a/x-pack/plugins/siem/server/lib/timeline/create_timelines_stream_from_ndjson.ts
+++ b/x-pack/plugins/siem/server/lib/timeline/create_timelines_stream_from_ndjson.ts
@@ -22,6 +22,7 @@ import {
import { ImportTimelineResponse } from './routes/utils/import_timelines';
import { ImportTimelinesSchemaRt } from './routes/schemas/import_timelines_schema';
+import { BadRequestError } from '../detection_engine/errors/bad_request_error';
type ErrorFactory = (message: string) => Error;
@@ -38,8 +39,11 @@ export const decodeOrThrow = (
pipe(runtimeType.decode(inputValue), fold(throwErrors(createError), identity));
export const validateTimelines = (): Transform =>
- createMapStream((obj: ImportTimelineResponse) => decodeOrThrow(ImportTimelinesSchemaRt)(obj));
-
+ createMapStream((obj: ImportTimelineResponse) =>
+ obj instanceof Error
+ ? new BadRequestError(obj.message)
+ : decodeOrThrow(ImportTimelinesSchemaRt)(obj)
+ );
export const createTimelinesStreamFromNdJson = (ruleLimit: number) => {
return [
createSplitStream('\n'),
diff --git a/x-pack/plugins/siem/server/lib/timeline/pick_saved_timeline.ts b/x-pack/plugins/siem/server/lib/timeline/pick_saved_timeline.ts
index 19adb7ac1045a..eeded1cc2532d 100644
--- a/x-pack/plugins/siem/server/lib/timeline/pick_saved_timeline.ts
+++ b/x-pack/plugins/siem/server/lib/timeline/pick_saved_timeline.ts
@@ -4,9 +4,10 @@
* you may not use this file except in compliance with the Elastic License.
*/
+import uuid from 'uuid';
import { AuthenticatedUser } from '../../../../security/common/model';
import { UNAUTHENTICATED_USER } from '../../../common/constants';
-import { SavedTimeline } from './types';
+import { SavedTimeline, TimelineType } from '../../../common/types/timeline';
export const pickSavedTimeline = (
timelineId: string | null,
@@ -24,5 +25,21 @@ export const pickSavedTimeline = (
savedTimeline.updated = dateNow;
savedTimeline.updatedBy = userInfo?.username ?? UNAUTHENTICATED_USER;
}
+
+ if (savedTimeline.timelineType === TimelineType.template) {
+ savedTimeline.timelineType = TimelineType.template;
+ if (savedTimeline.templateTimelineId == null) {
+ savedTimeline.templateTimelineId = uuid.v4();
+ }
+
+ if (savedTimeline.templateTimelineVersion == null) {
+ savedTimeline.templateTimelineVersion = 1;
+ }
+ } else {
+ savedTimeline.timelineType = TimelineType.default;
+ savedTimeline.templateTimelineId = null;
+ savedTimeline.templateTimelineVersion = null;
+ }
+
return savedTimeline;
};
diff --git a/x-pack/plugins/siem/server/lib/timeline/routes/README.md b/x-pack/plugins/siem/server/lib/timeline/routes/README.md
new file mode 100644
index 0000000000000..2c5547e39fc4e
--- /dev/null
+++ b/x-pack/plugins/siem/server/lib/timeline/routes/README.md
@@ -0,0 +1,326 @@
+**Timeline apis**
+
+ 1. Create timeline api
+ 2. Update timeline api
+ 3. Create template timeline api
+ 4. Update template timeline api
+
+
+## Create timeline api
+#### POST /api/timeline
+##### Authorization
+Type: Basic Auth
+username: Your Kibana username
+password: Your Kibana password
+
+
+##### Request header
+```
+Content-Type: application/json
+kbn-version: 8.0.0
+```
+##### Request body
+```json
+{
+ "timeline": {
+ "columns": [
+ {
+ "columnHeaderType": "not-filtered",
+ "id": "@timestamp"
+ },
+ {
+ "columnHeaderType": "not-filtered",
+ "id": "message"
+ },
+ {
+ "columnHeaderType": "not-filtered",
+ "id": "event.category"
+ },
+ {
+ "columnHeaderType": "not-filtered",
+ "id": "event.action"
+ },
+ {
+ "columnHeaderType": "not-filtered",
+ "id": "host.name"
+ },
+ {
+ "columnHeaderType": "not-filtered",
+ "id": "source.ip"
+ },
+ {
+ "columnHeaderType": "not-filtered",
+ "id": "destination.ip"
+ },
+ {
+ "columnHeaderType": "not-filtered",
+ "id": "user.name"
+ }
+ ],
+ "dataProviders": [],
+ "description": "",
+ "eventType": "all",
+ "filters": [],
+ "kqlMode": "filter",
+ "kqlQuery": {
+ "filterQuery": null
+ },
+ "title": "abd",
+ "dateRange": {
+ "start": 1587370079200,
+ "end": 1587456479201
+ },
+ "savedQueryId": null,
+ "sort": {
+ "columnId": "@timestamp",
+ "sortDirection": "desc"
+ }
+ },
+ "timelineId":null, // Leave this as null
+ "version":null // Leave this as null
+}
+```
+
+
+## Update timeline api
+#### PATCH /api/timeline
+##### Authorization
+Type: Basic Auth
+username: Your Kibana username
+password: Your Kibana password
+
+
+##### Request header
+```
+Content-Type: application/json
+kbn-version: 8.0.0
+```
+##### Request body
+```json
+{
+ "timeline": {
+ "columns": [
+ {
+ "columnHeaderType": "not-filtered",
+ "id": "@timestamp"
+ },
+ {
+ "columnHeaderType": "not-filtered",
+ "id": "message"
+ },
+ {
+ "columnHeaderType": "not-filtered",
+ "id": "event.category"
+ },
+ {
+ "columnHeaderType": "not-filtered",
+ "id": "event.action"
+ },
+ {
+ "columnHeaderType": "not-filtered",
+ "id": "host.name"
+ },
+ {
+ "columnHeaderType": "not-filtered",
+ "id": "source.ip"
+ },
+ {
+ "columnHeaderType": "not-filtered",
+ "id": "destination.ip"
+ },
+ {
+ "columnHeaderType": "not-filtered",
+ "id": "user.name"
+ }
+ ],
+ "dataProviders": [],
+ "description": "",
+ "eventType": "all",
+ "filters": [],
+ "kqlMode": "filter",
+ "kqlQuery": {
+ "filterQuery": null
+ },
+ "title": "abd",
+ "dateRange": {
+ "start": 1587370079200,
+ "end": 1587456479201
+ },
+ "savedQueryId": null,
+ "sort": {
+ "columnId": "@timestamp",
+ "sortDirection": "desc"
+ },
+ "created": 1587468588922,
+ "createdBy": "casetester",
+ "updated": 1587468588922,
+ "updatedBy": "casetester",
+ "timelineType": "default"
+ },
+ "timelineId":"68ea5330-83c3-11ea-bff9-ab01dd7cb6cc", // Have to match the existing timeline savedObject id
+ "version":"WzYwLDFd" // Have to match the existing timeline version
+}
+```
+
+## Create template timeline api
+#### POST /api/timeline
+##### Authorization
+Type: Basic Auth
+username: Your Kibana username
+password: Your Kibana password
+
+
+##### Request header
+```
+Content-Type: application/json
+kbn-version: 8.0.0
+```
+##### Request body
+```json
+{
+ "timeline": {
+ "columns": [
+ {
+ "columnHeaderType": "not-filtered",
+ "id": "@timestamp"
+ },
+ {
+ "columnHeaderType": "not-filtered",
+ "id": "message"
+ },
+ {
+ "columnHeaderType": "not-filtered",
+ "id": "event.category"
+ },
+ {
+ "columnHeaderType": "not-filtered",
+ "id": "event.action"
+ },
+ {
+ "columnHeaderType": "not-filtered",
+ "id": "host.name"
+ },
+ {
+ "columnHeaderType": "not-filtered",
+ "id": "source.ip"
+ },
+ {
+ "columnHeaderType": "not-filtered",
+ "id": "destination.ip"
+ },
+ {
+ "columnHeaderType": "not-filtered",
+ "id": "user.name"
+ }
+ ],
+ "dataProviders": [
+
+ ],
+ "description": "",
+ "eventType": "all",
+ "filters": [
+
+ ],
+ "kqlMode": "filter",
+ "kqlQuery": {
+ "filterQuery": null
+ },
+ "title": "abd",
+ "dateRange": {
+ "start": 1587370079200,
+ "end": 1587456479201
+ },
+ "savedQueryId": null,
+ "sort": {
+ "columnId": "@timestamp",
+ "sortDirection": "desc"
+ },
+ "timelineType": "template" // This is the difference between create timeline
+ },
+ "timelineId":null, // Leave this as null
+ "version":null // Leave this as null
+}
+```
+
+
+## Update template timeline api
+#### PATCH /api/timeline
+##### Authorization
+Type: Basic Auth
+username: Your Kibana username
+password: Your Kibana password
+
+
+##### Request header
+```
+Content-Type: application/json
+kbn-version: 8.0.0
+```
+##### Request body
+```json
+{
+ "timeline": {
+ "columns": [
+ {
+ "columnHeaderType": "not-filtered",
+ "id": "@timestamp"
+ },
+ {
+ "columnHeaderType": "not-filtered",
+ "id": "message"
+ },
+ {
+ "columnHeaderType": "not-filtered",
+ "id": "event.category"
+ },
+ {
+ "columnHeaderType": "not-filtered",
+ "id": "event.action"
+ },
+ {
+ "columnHeaderType": "not-filtered",
+ "id": "host.name"
+ },
+ {
+ "columnHeaderType": "not-filtered",
+ "id": "source.ip"
+ },
+ {
+ "columnHeaderType": "not-filtered",
+ "id": "destination.ip"
+ },
+ {
+ "columnHeaderType": "not-filtered",
+ "id": "user.name"
+ }
+ ],
+ "dataProviders": [],
+ "description": "",
+ "eventType": "all",
+ "filters": [],
+ "kqlMode": "filter",
+ "kqlQuery": {
+ "filterQuery": null
+ },
+ "title": "abd",
+ "dateRange": {
+ "start": 1587370079200,
+ "end": 1587456479201
+ },
+ "savedQueryId": null,
+ "sort": {
+ "columnId": "@timestamp",
+ "sortDirection": "desc"
+ },
+ "timelineType": "template",
+ "created": 1587473119992,
+ "createdBy": "casetester",
+ "updated": 1587473119992,
+ "updatedBy": "casetester",
+ "templateTimelineId": "745d0316-6af7-43bf-afd6-9747119754fb", // Please provide the existing template timeline version
+ "templateTimelineVersion": 2 // Please provide a template timeline version grater than existing one
+ },
+ "timelineId":"f5a4bd10-83cd-11ea-bf78-0547a65f1281", // This is a must as well
+ "version":"Wzg2LDFd" // Please provide the existing timeline version
+}
+```
\ No newline at end of file
diff --git a/x-pack/plugins/siem/server/lib/timeline/routes/__mocks__/import_timelines.ts b/x-pack/plugins/siem/server/lib/timeline/routes/__mocks__/import_timelines.ts
index 686f2b491cf88..a832c818d48b0 100644
--- a/x-pack/plugins/siem/server/lib/timeline/routes/__mocks__/import_timelines.ts
+++ b/x-pack/plugins/siem/server/lib/timeline/routes/__mocks__/import_timelines.ts
@@ -5,6 +5,7 @@
*/
import { omit } from 'lodash/fp';
+import { TimelineType } from '../../../../../common/types/timeline';
export const mockDuplicateIdErrors = [];
@@ -148,6 +149,13 @@ export const mockGetTimelineValue = {
pinnedEventIds: ['k-gi8nABm-sIqJ_scOoS'],
};
+export const mockGetTemplateTimelineValue = {
+ ...mockGetTimelineValue,
+ timelineType: TimelineType.template,
+ templateTimelineId: '79deb4c0-6bc1-11ea-a90b-f5341fb7a189',
+ templateTimelineVersion: 1,
+};
+
export const mockParsedTimelineObject = omit(
[
'globalNotes',
diff --git a/x-pack/plugins/siem/server/lib/timeline/routes/__mocks__/request_responses.ts b/x-pack/plugins/siem/server/lib/timeline/routes/__mocks__/request_responses.ts
index a83c443773302..304ca309775ff 100644
--- a/x-pack/plugins/siem/server/lib/timeline/routes/__mocks__/request_responses.ts
+++ b/x-pack/plugins/siem/server/lib/timeline/routes/__mocks__/request_responses.ts
@@ -3,10 +3,18 @@
* or more contributor license agreements. Licensed under the Elastic License;
* you may not use this file except in compliance with the Elastic License.
*/
-
-import { TIMELINE_EXPORT_URL, TIMELINE_IMPORT_URL } from '../../../../../common/constants';
-import { requestMock } from '../../../detection_engine/routes/__mocks__';
+import * as rt from 'io-ts';
+import {
+ TIMELINE_EXPORT_URL,
+ TIMELINE_IMPORT_URL,
+ TIMELINE_URL,
+} from '../../../../../common/constants';
import stream from 'stream';
+import { requestMock } from '../../../detection_engine/routes/__mocks__';
+import { SavedTimeline, TimelineType } from '../../../../../common/types/timeline';
+import { updateTimelineSchema } from '../schemas/update_timelines_schema';
+import { createTimelineSchema } from '../schemas/create_timelines_schema';
+
const readable = new stream.Readable();
export const getExportTimelinesRequest = () =>
requestMock.create({
@@ -31,6 +39,96 @@ export const getImportTimelinesRequest = (filename?: string) =>
},
});
+export const inputTimeline: SavedTimeline = {
+ columns: [
+ { columnHeaderType: 'not-filtered', id: '@timestamp' },
+ { columnHeaderType: 'not-filtered', id: 'message' },
+ { columnHeaderType: 'not-filtered', id: 'event.category' },
+ { columnHeaderType: 'not-filtered', id: 'event.action' },
+ { columnHeaderType: 'not-filtered', id: 'host.name' },
+ { columnHeaderType: 'not-filtered', id: 'source.ip' },
+ { columnHeaderType: 'not-filtered', id: 'destination.ip' },
+ { columnHeaderType: 'not-filtered', id: 'user.name' },
+ ],
+ dataProviders: [],
+ description: '',
+ eventType: 'all',
+ filters: [],
+ kqlMode: 'filter',
+ kqlQuery: { filterQuery: null },
+ title: 't',
+ timelineType: TimelineType.default,
+ templateTimelineId: null,
+ templateTimelineVersion: null,
+ dateRange: { start: 1585227005527, end: 1585313405527 },
+ savedQueryId: null,
+ sort: { columnId: '@timestamp', sortDirection: 'desc' },
+};
+
+export const inputTemplateTimeline = {
+ ...inputTimeline,
+ timelineType: TimelineType.template,
+ templateTimelineId: null,
+ templateTimelineVersion: null,
+};
+
+export const createTimelineWithoutTimelineId = {
+ templateTimelineId: null,
+ timeline: inputTimeline,
+ timelineId: null,
+ version: null,
+ timelineType: TimelineType.default,
+};
+
+export const createTemplateTimelineWithoutTimelineId = {
+ templateTimelineId: null,
+ timeline: inputTemplateTimeline,
+ timelineId: null,
+ version: null,
+ timelineType: TimelineType.template,
+};
+
+export const createTimelineWithTimelineId = {
+ ...createTimelineWithoutTimelineId,
+ timelineId: '79deb4c0-6bc1-11ea-a90b-f5341fb7a189',
+};
+
+export const createTemplateTimelineWithTimelineId = {
+ ...createTemplateTimelineWithoutTimelineId,
+ timelineId: '79deb4c0-6bc1-11ea-a90b-f5341fb7a189',
+ templateTimelineId: 'existing template timeline id',
+};
+
+export const updateTimelineWithTimelineId = {
+ timeline: inputTimeline,
+ timelineId: '79deb4c0-6bc1-11ea-a90b-f5341fb7a189',
+ version: 'WzEyMjUsMV0=',
+};
+
+export const updateTemplateTimelineWithTimelineId = {
+ timeline: {
+ ...inputTemplateTimeline,
+ templateTimelineId: '79deb4c0-6bc1-11ea-a90b-f5341fb7a189',
+ templateTimelineVersion: 2,
+ },
+ timelineId: '79deb4c0-6bc1-11ea-a90b-f5341fb7a189',
+ version: 'WzEyMjUsMV0=',
+};
+
+export const getCreateTimelinesRequest = (mockBody: rt.TypeOf) =>
+ requestMock.create({
+ method: 'post',
+ path: TIMELINE_URL,
+ body: mockBody,
+ });
+
+export const getUpdateTimelinesRequest = (mockBody: rt.TypeOf) =>
+ requestMock.create({
+ method: 'patch',
+ path: TIMELINE_URL,
+ body: mockBody,
+ });
+
export const getImportTimelinesRequestEnableOverwrite = (filename?: string) =>
requestMock.create({
method: 'post',
diff --git a/x-pack/plugins/siem/server/lib/timeline/routes/create_timelines_route.test.ts b/x-pack/plugins/siem/server/lib/timeline/routes/create_timelines_route.test.ts
new file mode 100644
index 0000000000000..70ee1532395a5
--- /dev/null
+++ b/x-pack/plugins/siem/server/lib/timeline/routes/create_timelines_route.test.ts
@@ -0,0 +1,272 @@
+/*
+ * 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 { SecurityPluginSetup } from '../../../../../../plugins/security/server';
+
+import {
+ serverMock,
+ requestContextMock,
+ createMockConfig,
+} from '../../detection_engine/routes/__mocks__';
+
+import {
+ mockGetCurrentUser,
+ mockGetTimelineValue,
+ mockGetTemplateTimelineValue,
+} from './__mocks__/import_timelines';
+import {
+ getCreateTimelinesRequest,
+ inputTimeline,
+ createTimelineWithoutTimelineId,
+ createTimelineWithTimelineId,
+ createTemplateTimelineWithoutTimelineId,
+ createTemplateTimelineWithTimelineId,
+} from './__mocks__/request_responses';
+import {
+ CREATE_TEMPLATE_TIMELINE_ERROR_MESSAGE,
+ CREATE_TIMELINE_ERROR_MESSAGE,
+} from './utils/create_timelines';
+
+describe('create timelines', () => {
+ let server: ReturnType;
+ let securitySetup: SecurityPluginSetup;
+ let { context } = requestContextMock.createTools();
+ let mockGetTimeline: jest.Mock;
+ let mockPersistTimeline: jest.Mock;
+ let mockPersistPinnedEventOnTimeline: jest.Mock;
+ let mockPersistNote: jest.Mock;
+
+ beforeEach(() => {
+ jest.resetModules();
+ jest.resetAllMocks();
+ jest.restoreAllMocks();
+ jest.clearAllMocks();
+
+ server = serverMock.create();
+ context = requestContextMock.createTools().context;
+
+ securitySetup = ({
+ authc: {
+ getCurrentUser: jest.fn().mockReturnValue(mockGetCurrentUser),
+ },
+ authz: {},
+ } as unknown) as SecurityPluginSetup;
+
+ mockGetTimeline = jest.fn();
+ mockPersistTimeline = jest.fn();
+ mockPersistPinnedEventOnTimeline = jest.fn();
+ mockPersistNote = jest.fn();
+ });
+
+ describe('Manipulate timeline', () => {
+ describe('Create a new timeline', () => {
+ beforeEach(async () => {
+ jest.doMock('../saved_object', () => {
+ return {
+ getTimeline: mockGetTimeline.mockReturnValue(null),
+ persistTimeline: mockPersistTimeline.mockReturnValue({
+ timeline: createTimelineWithTimelineId,
+ }),
+ };
+ });
+
+ jest.doMock('../../pinned_event/saved_object', () => {
+ return {
+ persistPinnedEventOnTimeline: mockPersistPinnedEventOnTimeline,
+ };
+ });
+
+ jest.doMock('../../note/saved_object', () => {
+ return {
+ persistNote: mockPersistNote,
+ };
+ });
+
+ const createTimelinesRoute = jest.requireActual('./create_timelines_route')
+ .createTimelinesRoute;
+ createTimelinesRoute(server.router, createMockConfig(), securitySetup);
+
+ const mockRequest = getCreateTimelinesRequest(createTimelineWithoutTimelineId);
+ await server.inject(mockRequest, context);
+ });
+
+ test('should Create a new timeline savedObject', async () => {
+ expect(mockPersistTimeline).toHaveBeenCalled();
+ });
+
+ test('should Create a new timeline savedObject without timelineId', async () => {
+ expect(mockPersistTimeline.mock.calls[0][1]).toBeNull();
+ });
+
+ test('should Create a new timeline savedObject without timeline version', async () => {
+ expect(mockPersistTimeline.mock.calls[0][2]).toBeNull();
+ });
+
+ test('should Create a new timeline savedObject witn given timeline', async () => {
+ expect(mockPersistTimeline.mock.calls[0][3]).toEqual(inputTimeline);
+ });
+
+ test('should NOT Create new pinned events', async () => {
+ expect(mockPersistPinnedEventOnTimeline).not.toBeCalled();
+ });
+
+ test('should NOT Create notes', async () => {
+ expect(mockPersistNote).not.toBeCalled();
+ });
+
+ test('returns 200 when create timeline successfully', async () => {
+ const response = await server.inject(
+ getCreateTimelinesRequest(createTimelineWithoutTimelineId),
+ context
+ );
+ expect(response.status).toEqual(200);
+ });
+ });
+
+ describe('Import a timeline already exist', () => {
+ beforeEach(() => {
+ jest.doMock('../saved_object', () => {
+ return {
+ getTimeline: mockGetTimeline.mockReturnValue(mockGetTimelineValue),
+ persistTimeline: mockPersistTimeline,
+ };
+ });
+
+ jest.doMock('../../pinned_event/saved_object', () => {
+ return {
+ persistPinnedEventOnTimeline: mockPersistPinnedEventOnTimeline,
+ };
+ });
+
+ jest.doMock('../../note/saved_object', () => {
+ return {
+ persistNote: mockPersistNote,
+ };
+ });
+
+ const createTimelinesRoute = jest.requireActual('./create_timelines_route')
+ .createTimelinesRoute;
+ createTimelinesRoute(server.router, createMockConfig(), securitySetup);
+ });
+
+ test('returns error message', async () => {
+ const response = await server.inject(
+ getCreateTimelinesRequest(createTimelineWithTimelineId),
+ context
+ );
+ expect(response.body).toEqual({
+ message: CREATE_TIMELINE_ERROR_MESSAGE,
+ status_code: 405,
+ });
+ });
+ });
+ });
+
+ describe('Manipulate template timeline', () => {
+ describe('Create a new template timeline', () => {
+ beforeEach(async () => {
+ jest.doMock('../saved_object', () => {
+ return {
+ getTimeline: mockGetTimeline.mockReturnValue(null),
+ persistTimeline: mockPersistTimeline.mockReturnValue({
+ timeline: createTemplateTimelineWithTimelineId,
+ }),
+ };
+ });
+
+ jest.doMock('../../pinned_event/saved_object', () => {
+ return {
+ persistPinnedEventOnTimeline: mockPersistPinnedEventOnTimeline,
+ };
+ });
+
+ jest.doMock('../../note/saved_object', () => {
+ return {
+ persistNote: mockPersistNote,
+ };
+ });
+
+ const createTimelinesRoute = jest.requireActual('./create_timelines_route')
+ .createTimelinesRoute;
+ createTimelinesRoute(server.router, createMockConfig(), securitySetup);
+
+ const mockRequest = getCreateTimelinesRequest(createTemplateTimelineWithoutTimelineId);
+ await server.inject(mockRequest, context);
+ });
+
+ test('should Create a new template timeline savedObject', async () => {
+ expect(mockPersistTimeline).toHaveBeenCalled();
+ });
+
+ test('should Create a new template timeline savedObject without timelineId', async () => {
+ expect(mockPersistTimeline.mock.calls[0][1]).toBeNull();
+ });
+
+ test('should Create a new template timeline savedObject without template timeline version', async () => {
+ expect(mockPersistTimeline.mock.calls[0][2]).toBeNull();
+ });
+
+ test('should Create a new template timeline savedObject witn given template timeline', async () => {
+ expect(mockPersistTimeline.mock.calls[0][3]).toEqual(
+ createTemplateTimelineWithTimelineId.timeline
+ );
+ });
+
+ test('should NOT Create new pinned events', async () => {
+ expect(mockPersistPinnedEventOnTimeline).not.toBeCalled();
+ });
+
+ test('should NOT Create notes', async () => {
+ expect(mockPersistNote).not.toBeCalled();
+ });
+
+ test('returns 200 when create timeline successfully', async () => {
+ const response = await server.inject(
+ getCreateTimelinesRequest(createTimelineWithoutTimelineId),
+ context
+ );
+ expect(response.status).toEqual(200);
+ });
+ });
+
+ describe('Import a template timeline already exist', () => {
+ beforeEach(() => {
+ jest.doMock('../saved_object', () => {
+ return {
+ getTimeline: mockGetTimeline.mockReturnValue(mockGetTemplateTimelineValue),
+ persistTimeline: mockPersistTimeline,
+ };
+ });
+
+ jest.doMock('../../pinned_event/saved_object', () => {
+ return {
+ persistPinnedEventOnTimeline: mockPersistPinnedEventOnTimeline,
+ };
+ });
+
+ jest.doMock('../../note/saved_object', () => {
+ return {
+ persistNote: mockPersistNote,
+ };
+ });
+
+ const createTimelinesRoute = jest.requireActual('./create_timelines_route')
+ .createTimelinesRoute;
+ createTimelinesRoute(server.router, createMockConfig(), securitySetup);
+ });
+
+ test('returns error message', async () => {
+ const response = await server.inject(
+ getCreateTimelinesRequest(createTemplateTimelineWithTimelineId),
+ context
+ );
+ expect(response.body).toEqual({
+ message: CREATE_TEMPLATE_TIMELINE_ERROR_MESSAGE,
+ status_code: 405,
+ });
+ });
+ });
+ });
+});
diff --git a/x-pack/plugins/siem/server/lib/timeline/routes/create_timelines_route.ts b/x-pack/plugins/siem/server/lib/timeline/routes/create_timelines_route.ts
new file mode 100644
index 0000000000000..c456ae31fb7da
--- /dev/null
+++ b/x-pack/plugins/siem/server/lib/timeline/routes/create_timelines_route.ts
@@ -0,0 +1,90 @@
+/*
+ * 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 { IRouter } from '../../../../../../../src/core/server';
+
+import { TIMELINE_URL } from '../../../../common/constants';
+import { TimelineType } from '../../../../common/types/timeline';
+
+import { ConfigType } from '../../..';
+import { SetupPlugins } from '../../../plugin';
+import { buildRouteValidation } from '../../../utils/build_validation/route_validation';
+
+import { transformError, buildSiemResponse } from '../../detection_engine/routes/utils';
+
+import { createTimelineSchema } from './schemas/create_timelines_schema';
+import { buildFrameworkRequest } from './utils/common';
+import {
+ createTimelines,
+ getTimeline,
+ getTemplateTimeline,
+ CREATE_TEMPLATE_TIMELINE_ERROR_MESSAGE,
+ CREATE_TIMELINE_ERROR_MESSAGE,
+} from './utils/create_timelines';
+
+export const createTimelinesRoute = (
+ router: IRouter,
+ config: ConfigType,
+ security: SetupPlugins['security']
+) => {
+ router.post(
+ {
+ path: TIMELINE_URL,
+ validate: {
+ body: buildRouteValidation(createTimelineSchema),
+ },
+ options: {
+ tags: ['access:siem'],
+ },
+ },
+ async (context, request, response) => {
+ const siemResponse = buildSiemResponse(response);
+
+ try {
+ const frameworkRequest = await buildFrameworkRequest(context, security, request);
+
+ const { timelineId, timeline, version } = request.body;
+ const { templateTimelineId, timelineType } = timeline;
+ const isHandlingTemplateTimeline = timelineType === TimelineType.template;
+
+ const existTimeline =
+ timelineId != null ? await getTimeline(frameworkRequest, timelineId) : null;
+ const existTemplateTimeline =
+ templateTimelineId != null
+ ? await getTemplateTimeline(frameworkRequest, templateTimelineId)
+ : null;
+
+ if (
+ (!isHandlingTemplateTimeline && existTimeline != null) ||
+ (isHandlingTemplateTimeline && (existTemplateTimeline != null || existTimeline != null))
+ ) {
+ return siemResponse.error({
+ body: isHandlingTemplateTimeline
+ ? CREATE_TEMPLATE_TIMELINE_ERROR_MESSAGE
+ : CREATE_TIMELINE_ERROR_MESSAGE,
+ statusCode: 405,
+ });
+ }
+
+ // Create timeline
+ const newTimeline = await createTimelines(frameworkRequest, timeline, null, version);
+ return response.ok({
+ body: {
+ data: {
+ persistTimeline: newTimeline,
+ },
+ },
+ });
+ } catch (err) {
+ const error = transformError(err);
+
+ return siemResponse.error({
+ body: error.message,
+ statusCode: error.statusCode,
+ });
+ }
+ }
+ );
+};
diff --git a/x-pack/plugins/siem/server/lib/timeline/routes/import_timelines_route.test.ts b/x-pack/plugins/siem/server/lib/timeline/routes/import_timelines_route.test.ts
index 9f41943cfa27f..56c152d02ae98 100644
--- a/x-pack/plugins/siem/server/lib/timeline/routes/import_timelines_route.test.ts
+++ b/x-pack/plugins/siem/server/lib/timeline/routes/import_timelines_route.test.ts
@@ -6,13 +6,13 @@
import { getImportTimelinesRequest } from './__mocks__/request_responses';
import {
- createMockConfig,
serverMock,
requestContextMock,
requestMock,
+ createMockConfig,
} from '../../detection_engine/routes/__mocks__';
import { TIMELINE_EXPORT_URL } from '../../../../common/constants';
-import { SecurityPluginSetup } from '../../../../../security/server';
+import { SecurityPluginSetup } from '../../../../../../plugins/security/server';
import {
mockUniqueParsedObjects,
@@ -24,7 +24,6 @@ import {
} from './__mocks__/import_timelines';
describe('import timelines', () => {
- let config: ReturnType;
let server: ReturnType;
let request: ReturnType;
let securitySetup: SecurityPluginSetup;
@@ -43,7 +42,6 @@ describe('import timelines', () => {
server = serverMock.create();
context = requestContextMock.createTools().context;
- config = createMockConfig();
securitySetup = ({
authc: {
@@ -84,40 +82,28 @@ describe('import timelines', () => {
beforeEach(() => {
jest.doMock('../saved_object', () => {
return {
- Timeline: jest.fn().mockImplementation(() => {
- return {
- getTimeline: mockGetTimeline.mockReturnValue(null),
- persistTimeline: mockPersistTimeline.mockReturnValue({
- timeline: { savedObjectId: newTimelineSavedObjectId, version: newTimelineVersion },
- }),
- };
+ getTimeline: mockGetTimeline.mockReturnValue(null),
+ persistTimeline: mockPersistTimeline.mockReturnValue({
+ timeline: { savedObjectId: newTimelineSavedObjectId, version: newTimelineVersion },
}),
};
});
jest.doMock('../../pinned_event/saved_object', () => {
return {
- PinnedEvent: jest.fn().mockImplementation(() => {
- return {
- persistPinnedEventOnTimeline: mockPersistPinnedEventOnTimeline,
- };
- }),
+ persistPinnedEventOnTimeline: mockPersistPinnedEventOnTimeline,
};
});
jest.doMock('../../note/saved_object', () => {
return {
- Note: jest.fn().mockImplementation(() => {
- return {
- persistNote: mockPersistNote,
- };
- }),
+ persistNote: mockPersistNote,
};
});
const importTimelinesRoute = jest.requireActual('./import_timelines_route')
.importTimelinesRoute;
- importTimelinesRoute(server.router, config, securitySetup);
+ importTimelinesRoute(server.router, createMockConfig(), securitySetup);
});
test('should use given timelineId to check if the timeline savedObject already exist', async () => {
@@ -230,38 +216,26 @@ describe('import timelines', () => {
beforeEach(() => {
jest.doMock('../saved_object', () => {
return {
- Timeline: jest.fn().mockImplementation(() => {
- return {
- getTimeline: mockGetTimeline.mockReturnValue(mockGetTimelineValue),
- persistTimeline: mockPersistTimeline,
- };
- }),
+ getTimeline: mockGetTimeline.mockReturnValue(mockGetTimelineValue),
+ persistTimeline: mockPersistTimeline,
};
});
jest.doMock('../../pinned_event/saved_object', () => {
return {
- PinnedEvent: jest.fn().mockImplementation(() => {
- return {
- persistPinnedEventOnTimeline: mockPersistPinnedEventOnTimeline,
- };
- }),
+ persistPinnedEventOnTimeline: mockPersistPinnedEventOnTimeline,
};
});
jest.doMock('../../note/saved_object', () => {
return {
- Note: jest.fn().mockImplementation(() => {
- return {
- persistNote: mockPersistNote,
- };
- }),
+ persistNote: mockPersistNote,
};
});
const importTimelinesRoute = jest.requireActual('./import_timelines_route')
.importTimelinesRoute;
- importTimelinesRoute(server.router, config, securitySetup);
+ importTimelinesRoute(server.router, createMockConfig(), securitySetup);
});
test('returns error message', async () => {
@@ -286,36 +260,24 @@ describe('import timelines', () => {
beforeEach(() => {
jest.doMock('../saved_object', () => {
return {
- Timeline: jest.fn().mockImplementation(() => {
- return {
- getTimeline: mockGetTimeline.mockReturnValue(null),
- persistTimeline: mockPersistTimeline.mockReturnValue({
- timeline: { savedObjectId: '79deb4c0-6bc1-11ea-9999-f5341fb7a189' },
- }),
- };
+ getTimeline: mockGetTimeline.mockReturnValue(null),
+ persistTimeline: mockPersistTimeline.mockReturnValue({
+ timeline: { savedObjectId: '79deb4c0-6bc1-11ea-9999-f5341fb7a189' },
}),
};
});
jest.doMock('../../pinned_event/saved_object', () => {
return {
- PinnedEvent: jest.fn().mockImplementation(() => {
- return {
- persistPinnedEventOnTimeline: mockPersistPinnedEventOnTimeline.mockReturnValue(
- new Error('Test error')
- ),
- };
- }),
+ persistPinnedEventOnTimeline: mockPersistPinnedEventOnTimeline.mockReturnValue(
+ new Error('Test error')
+ ),
};
});
jest.doMock('../../note/saved_object', () => {
return {
- Note: jest.fn().mockImplementation(() => {
- return {
- persistNote: mockPersistNote,
- };
- }),
+ persistNote: mockPersistNote,
};
});
});
@@ -328,11 +290,14 @@ describe('import timelines', () => {
const importTimelinesRoute = jest.requireActual('./import_timelines_route')
.importTimelinesRoute;
- importTimelinesRoute(server.router, config, securitySetup);
+ importTimelinesRoute(server.router, createMockConfig(), securitySetup);
const result = server.validate(request);
expect(result.badRequest).toHaveBeenCalledWith(
- 'Invalid value "undefined" supplied to "file",Invalid value "undefined" supplied to "file"'
+ [
+ 'Invalid value "undefined" supplied to "file"',
+ 'Invalid value "undefined" supplied to "file"',
+ ].join(',')
);
});
});
diff --git a/x-pack/plugins/siem/server/lib/timeline/routes/import_timelines_route.ts b/x-pack/plugins/siem/server/lib/timeline/routes/import_timelines_route.ts
index 9d148abf82cdd..bff89bdf9b5b2 100644
--- a/x-pack/plugins/siem/server/lib/timeline/routes/import_timelines_route.ts
+++ b/x-pack/plugins/siem/server/lib/timeline/routes/import_timelines_route.ts
@@ -5,9 +5,19 @@
*/
import { extname } from 'path';
-import { chunk, omit, set } from 'lodash/fp';
+import { chunk, omit } from 'lodash/fp';
+
+import { createPromiseFromStreams } from '../../../../../../../src/legacy/utils';
+import { IRouter } from '../../../../../../../src/core/server';
import { TIMELINE_IMPORT_URL } from '../../../../common/constants';
+
+import { SetupPlugins } from '../../../plugin';
+import { ConfigType } from '../../../config';
+import { buildRouteValidation } from '../../../utils/build_validation/route_validation';
+
+import { importRulesSchema } from '../../detection_engine/routes/schemas/response/import_rules_schema';
+import { validate } from '../../detection_engine/routes/rules/validate';
import {
buildSiemResponse,
createBulkErrorObject,
@@ -16,32 +26,22 @@ import {
} from '../../detection_engine/routes/utils';
import { createTimelinesStreamFromNdJson } from '../create_timelines_stream_from_ndjson';
-import { createPromiseFromStreams } from '../../../../../../../src/legacy/utils';
+import { ImportTimelinesPayloadSchemaRt } from './schemas/import_timelines_schema';
+import { buildFrameworkRequest } from './utils/common';
import {
- createTimelines,
getTupleDuplicateErrorsAndUniqueTimeline,
isBulkError,
isImportRegular,
ImportTimelineResponse,
ImportTimelinesSchema,
PromiseFromStreams,
+ timelineSavedObjectOmittedFields,
} from './utils/import_timelines';
+import { createTimelines, getTimeline } from './utils/create_timelines';
-import { IRouter } from '../../../../../../../src/core/server';
-import { SetupPlugins } from '../../../plugin';
-import { ImportTimelinesPayloadSchemaRt } from './schemas/import_timelines_schema';
-import { importRulesSchema } from '../../detection_engine/routes/schemas/response/import_rules_schema';
-import { ConfigType } from '../../../config';
-
-import { Timeline } from '../saved_object';
-import { validate } from '../../detection_engine/routes/rules/validate';
-import { FrameworkRequest } from '../../framework';
-import { buildRouteValidation } from '../../../utils/build_validation/route_validation';
const CHUNK_PARSED_OBJECT_SIZE = 10;
-const timelineLib = new Timeline();
-
export const importTimelinesRoute = (
router: IRouter,
config: ConfigType,
@@ -95,9 +95,7 @@ export const importTimelinesRoute = (
const chunkParseObjects = chunk(CHUNK_PARSED_OBJECT_SIZE, uniqueParsedObjects);
let importTimelineResponse: ImportTimelineResponse[] = [];
- const user = await security?.authc.getCurrentUser(request);
- let frameworkRequest = set('context.core.savedObjects.client', savedObjectsClient, request);
- frameworkRequest = set('user', user, frameworkRequest);
+ const frameworkRequest = await buildFrameworkRequest(context, security, request);
while (chunkParseObjects.length) {
const batchParseObjects = chunkParseObjects.shift() ?? [];
@@ -125,32 +123,16 @@ export const importTimelinesRoute = (
eventNotes,
} = parsedTimeline;
const parsedTimelineObject = omit(
- [
- 'globalNotes',
- 'eventNotes',
- 'pinnedEventIds',
- 'version',
- 'savedObjectId',
- 'created',
- 'createdBy',
- 'updated',
- 'updatedBy',
- ],
+ timelineSavedObjectOmittedFields,
parsedTimeline
);
+ let newTimeline = null;
try {
- let timeline = null;
- try {
- timeline = await timelineLib.getTimeline(
- (frameworkRequest as unknown) as FrameworkRequest,
- savedObjectId
- );
- // eslint-disable-next-line no-empty
- } catch (e) {}
+ const timeline = await getTimeline(frameworkRequest, savedObjectId);
if (timeline == null) {
- const newSavedObjectId = await createTimelines(
- (frameworkRequest as unknown) as FrameworkRequest,
+ newTimeline = await createTimelines(
+ frameworkRequest,
parsedTimelineObject,
null, // timelineSavedObjectId
null, // timelineVersion
@@ -159,7 +141,10 @@ export const importTimelinesRoute = (
[] // existing note ids
);
- resolve({ timeline_id: newSavedObjectId, status_code: 200 });
+ resolve({
+ timeline_id: newTimeline.timeline.savedObjectId,
+ status_code: 200,
+ });
} else {
resolve(
createBulkErrorObject({
diff --git a/x-pack/plugins/siem/server/lib/timeline/routes/schemas/create_timelines_schema.ts b/x-pack/plugins/siem/server/lib/timeline/routes/schemas/create_timelines_schema.ts
new file mode 100644
index 0000000000000..241d266a14c78
--- /dev/null
+++ b/x-pack/plugins/siem/server/lib/timeline/routes/schemas/create_timelines_schema.ts
@@ -0,0 +1,19 @@
+/*
+ * 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 * as rt from 'io-ts';
+
+import { SavedTimelineRuntimeType } from '../../../../../common/types/timeline';
+import { unionWithNullType } from '../../../../../common/utility_types';
+
+export const createTimelineSchema = rt.intersection([
+ rt.type({
+ timeline: SavedTimelineRuntimeType,
+ }),
+ rt.partial({
+ timelineId: unionWithNullType(rt.string),
+ version: unionWithNullType(rt.string),
+ }),
+]);
diff --git a/x-pack/plugins/siem/server/lib/timeline/routes/schemas/import_timelines_schema.ts b/x-pack/plugins/siem/server/lib/timeline/routes/schemas/import_timelines_schema.ts
index 056fdaf0d2515..3b340b1c15359 100644
--- a/x-pack/plugins/siem/server/lib/timeline/routes/schemas/import_timelines_schema.ts
+++ b/x-pack/plugins/siem/server/lib/timeline/routes/schemas/import_timelines_schema.ts
@@ -7,14 +7,17 @@ import * as rt from 'io-ts';
import { Readable } from 'stream';
import { either } from 'fp-ts/lib/Either';
+
+import { SavedTimelineRuntimeType } from '../../../../../common/types/timeline';
+
import { eventNotes, globalNotes, pinnedEventIds } from './schemas';
-import { SavedTimelineRuntimeType } from '../../types';
+import { unionWithNullType } from '../../../../../common/utility_types';
export const ImportTimelinesSchemaRt = rt.intersection([
SavedTimelineRuntimeType,
rt.type({
- savedObjectId: rt.string,
- version: rt.string,
+ savedObjectId: unionWithNullType(rt.string),
+ version: unionWithNullType(rt.string),
}),
rt.type({
globalNotes,
diff --git a/x-pack/plugins/siem/server/lib/timeline/routes/schemas/schemas.ts b/x-pack/plugins/siem/server/lib/timeline/routes/schemas/schemas.ts
index 71627363ef0f8..1fd3a3554dc15 100644
--- a/x-pack/plugins/siem/server/lib/timeline/routes/schemas/schemas.ts
+++ b/x-pack/plugins/siem/server/lib/timeline/routes/schemas/schemas.ts
@@ -4,9 +4,9 @@
* you may not use this file except in compliance with the Elastic License.
*/
import * as runtimeTypes from 'io-ts';
-import { unionWithNullType } from '../../../framework';
-import { SavedNoteRuntimeType } from '../../../note/types';
+import { unionWithNullType } from '../../../../../common/utility_types';
+import { SavedNoteRuntimeType } from '../../../../../common/types/timeline/note';
-export const eventNotes = runtimeTypes.array(unionWithNullType(SavedNoteRuntimeType));
-export const globalNotes = runtimeTypes.array(unionWithNullType(SavedNoteRuntimeType));
-export const pinnedEventIds = runtimeTypes.array(unionWithNullType(runtimeTypes.string));
+export const eventNotes = unionWithNullType(runtimeTypes.array(SavedNoteRuntimeType));
+export const globalNotes = unionWithNullType(runtimeTypes.array(SavedNoteRuntimeType));
+export const pinnedEventIds = unionWithNullType(runtimeTypes.array(runtimeTypes.string));
diff --git a/x-pack/plugins/siem/server/lib/timeline/routes/schemas/update_timelines_schema.ts b/x-pack/plugins/siem/server/lib/timeline/routes/schemas/update_timelines_schema.ts
new file mode 100644
index 0000000000000..43f4208947aa5
--- /dev/null
+++ b/x-pack/plugins/siem/server/lib/timeline/routes/schemas/update_timelines_schema.ts
@@ -0,0 +1,16 @@
+/*
+ * 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 * as rt from 'io-ts';
+
+import { SavedTimelineRuntimeType } from '../../../../../common/types/timeline';
+import { unionWithNullType } from '../../../../../common/utility_types';
+
+export const updateTimelineSchema = rt.type({
+ timeline: SavedTimelineRuntimeType,
+ timelineId: unionWithNullType(rt.string),
+ version: unionWithNullType(rt.string),
+});
diff --git a/x-pack/plugins/siem/server/lib/timeline/routes/update_timelines_route.test.ts b/x-pack/plugins/siem/server/lib/timeline/routes/update_timelines_route.test.ts
new file mode 100644
index 0000000000000..9c47488d47159
--- /dev/null
+++ b/x-pack/plugins/siem/server/lib/timeline/routes/update_timelines_route.test.ts
@@ -0,0 +1,288 @@
+/*
+ * 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 { SecurityPluginSetup } from '../../../../../../plugins/security/server';
+
+import {
+ serverMock,
+ requestContextMock,
+ createMockConfig,
+} from '../../detection_engine/routes/__mocks__';
+
+import {
+ getUpdateTimelinesRequest,
+ inputTimeline,
+ updateTimelineWithTimelineId,
+ updateTemplateTimelineWithTimelineId,
+} from './__mocks__/request_responses';
+import {
+ mockGetCurrentUser,
+ mockGetTimelineValue,
+ mockGetTemplateTimelineValue,
+} from './__mocks__/import_timelines';
+import {
+ UPDATE_TIMELINE_ERROR_MESSAGE,
+ UPDATE_TEMPLATE_TIMELINE_ERROR_MESSAGE,
+} from './utils/update_timelines';
+
+describe('update timelines', () => {
+ let server: ReturnType;
+ let securitySetup: SecurityPluginSetup;
+ let { context } = requestContextMock.createTools();
+ let mockGetTimeline: jest.Mock;
+ let mockGetTemplateTimeline: jest.Mock;
+ let mockPersistTimeline: jest.Mock;
+ let mockPersistPinnedEventOnTimeline: jest.Mock;
+ let mockPersistNote: jest.Mock;
+
+ beforeEach(() => {
+ jest.resetModules();
+ jest.resetAllMocks();
+ jest.restoreAllMocks();
+ jest.clearAllMocks();
+
+ server = serverMock.create();
+ context = requestContextMock.createTools().context;
+
+ securitySetup = ({
+ authc: {
+ getCurrentUser: jest.fn().mockReturnValue(mockGetCurrentUser),
+ },
+ authz: {},
+ } as unknown) as SecurityPluginSetup;
+
+ mockGetTimeline = jest.fn();
+ mockGetTemplateTimeline = jest.fn();
+ mockPersistTimeline = jest.fn();
+ mockPersistPinnedEventOnTimeline = jest.fn();
+ mockPersistNote = jest.fn();
+ });
+
+ describe('Manipulate timeline', () => {
+ describe('Update an existing timeline', () => {
+ beforeEach(async () => {
+ jest.doMock('../saved_object', () => {
+ return {
+ getTimeline: mockGetTimeline.mockReturnValue(mockGetTimelineValue),
+ persistTimeline: mockPersistTimeline.mockReturnValue({
+ timeline: updateTimelineWithTimelineId.timeline,
+ }),
+ };
+ });
+
+ jest.doMock('../../pinned_event/saved_object', () => {
+ return {
+ persistPinnedEventOnTimeline: mockPersistPinnedEventOnTimeline,
+ };
+ });
+
+ jest.doMock('../../note/saved_object', () => {
+ return {
+ persistNote: mockPersistNote,
+ };
+ });
+
+ const updateTimelinesRoute = jest.requireActual('./update_timelines_route')
+ .updateTimelinesRoute;
+ updateTimelinesRoute(server.router, createMockConfig(), securitySetup);
+
+ const mockRequest = getUpdateTimelinesRequest(updateTimelineWithTimelineId);
+ await server.inject(mockRequest, context);
+ });
+
+ test('should Check a if given timeline id exist', async () => {
+ expect(mockGetTimeline.mock.calls[0][1]).toEqual(updateTimelineWithTimelineId.timelineId);
+ });
+
+ test('should Update existing timeline savedObject with timelineId', async () => {
+ expect(mockPersistTimeline.mock.calls[0][1]).toEqual(
+ updateTimelineWithTimelineId.timelineId
+ );
+ });
+
+ test('should Update existing timeline savedObject with timeline version', async () => {
+ expect(mockPersistTimeline.mock.calls[0][2]).toEqual(updateTimelineWithTimelineId.version);
+ });
+
+ test('should Update existing timeline savedObject witn given timeline', async () => {
+ expect(mockPersistTimeline.mock.calls[0][3]).toEqual(inputTimeline);
+ });
+
+ test('should NOT Update new pinned events', async () => {
+ expect(mockPersistPinnedEventOnTimeline).not.toBeCalled();
+ });
+
+ test('should NOT Update notes', async () => {
+ expect(mockPersistNote).not.toBeCalled();
+ });
+
+ test('returns 200 when create timeline successfully', async () => {
+ const response = await server.inject(
+ getUpdateTimelinesRequest(updateTimelineWithTimelineId),
+ context
+ );
+ expect(response.status).toEqual(200);
+ });
+ });
+
+ describe("Update a timeline that doesn't exist", () => {
+ beforeEach(() => {
+ jest.doMock('../saved_object', () => {
+ return {
+ getTimeline: mockGetTimeline.mockReturnValue(null),
+ getTimelineByTemplateTimelineId: mockGetTemplateTimeline.mockReturnValue(null),
+ persistTimeline: mockPersistTimeline,
+ };
+ });
+
+ jest.doMock('../../pinned_event/saved_object', () => {
+ return {
+ persistPinnedEventOnTimeline: mockPersistPinnedEventOnTimeline,
+ };
+ });
+
+ jest.doMock('../../note/saved_object', () => {
+ return {
+ persistNote: mockPersistNote,
+ };
+ });
+
+ const updateTimelinesRoute = jest.requireActual('./update_timelines_route')
+ .updateTimelinesRoute;
+ updateTimelinesRoute(server.router, createMockConfig(), securitySetup);
+ });
+
+ test('returns error message', async () => {
+ const response = await server.inject(
+ getUpdateTimelinesRequest(updateTimelineWithTimelineId),
+ context
+ );
+ expect(response.body).toEqual({
+ message: UPDATE_TIMELINE_ERROR_MESSAGE,
+ status_code: 405,
+ });
+ });
+ });
+ });
+
+ describe('Manipulate template timeline', () => {
+ describe('Update an existing template timeline', () => {
+ beforeEach(async () => {
+ jest.doMock('../saved_object', () => {
+ return {
+ getTimeline: mockGetTimeline.mockReturnValue(mockGetTemplateTimelineValue),
+ getTimelineByTemplateTimelineId: mockGetTemplateTimeline.mockReturnValue({
+ timeline: [mockGetTemplateTimelineValue],
+ }),
+ persistTimeline: mockPersistTimeline.mockReturnValue({
+ timeline: updateTimelineWithTimelineId.timeline,
+ }),
+ };
+ });
+
+ jest.doMock('../../pinned_event/saved_object', () => {
+ return {
+ persistPinnedEventOnTimeline: mockPersistPinnedEventOnTimeline,
+ };
+ });
+
+ jest.doMock('../../note/saved_object', () => {
+ return {
+ persistNote: mockPersistNote,
+ };
+ });
+
+ const updateTimelinesRoute = jest.requireActual('./update_timelines_route')
+ .updateTimelinesRoute;
+ updateTimelinesRoute(server.router, createMockConfig(), securitySetup);
+
+ const mockRequest = getUpdateTimelinesRequest(updateTemplateTimelineWithTimelineId);
+ await server.inject(mockRequest, context);
+ });
+
+ test('should Check if given timeline id exist', async () => {
+ expect(mockGetTimeline.mock.calls[0][1]).toEqual(
+ updateTemplateTimelineWithTimelineId.timelineId
+ );
+ });
+
+ test('should Update existing template timeline with template timelineId', async () => {
+ expect(mockGetTemplateTimeline.mock.calls[0][1]).toEqual(
+ updateTemplateTimelineWithTimelineId.timelineId
+ );
+ });
+
+ test('should Update existing template timeline with timeline version', async () => {
+ expect(mockPersistTimeline.mock.calls[0][2]).toEqual(
+ updateTemplateTimelineWithTimelineId.version
+ );
+ });
+
+ test('should Update existing template timeline witn given timeline', async () => {
+ expect(mockPersistTimeline.mock.calls[0][3]).toEqual(
+ updateTemplateTimelineWithTimelineId.timeline
+ );
+ });
+
+ test('should NOT Update new pinned events', async () => {
+ expect(mockPersistPinnedEventOnTimeline).not.toBeCalled();
+ });
+
+ test('should NOT Update notes', async () => {
+ expect(mockPersistNote).not.toBeCalled();
+ });
+
+ test('returns 200 when create template timeline successfully', async () => {
+ const response = await server.inject(
+ getUpdateTimelinesRequest(updateTemplateTimelineWithTimelineId),
+ context
+ );
+ expect(response.status).toEqual(200);
+ });
+ });
+
+ describe("Update a template timeline that doesn't exist", () => {
+ beforeEach(() => {
+ jest.doMock('../saved_object', () => {
+ return {
+ getTimeline: mockGetTimeline.mockReturnValue(null),
+ getTimelineByTemplateTimelineId: mockGetTemplateTimeline.mockReturnValue({
+ timeline: [],
+ }),
+ persistTimeline: mockPersistTimeline,
+ };
+ });
+
+ jest.doMock('../../pinned_event/saved_object', () => {
+ return {
+ persistPinnedEventOnTimeline: mockPersistPinnedEventOnTimeline,
+ };
+ });
+
+ jest.doMock('../../note/saved_object', () => {
+ return {
+ persistNote: mockPersistNote,
+ };
+ });
+
+ const updateTimelinesRoute = jest.requireActual('./update_timelines_route')
+ .updateTimelinesRoute;
+ updateTimelinesRoute(server.router, createMockConfig(), securitySetup);
+ });
+
+ test('returns error message', async () => {
+ const response = await server.inject(
+ getUpdateTimelinesRequest(updateTemplateTimelineWithTimelineId),
+ context
+ );
+ expect(response.body).toEqual({
+ message: UPDATE_TEMPLATE_TIMELINE_ERROR_MESSAGE,
+ status_code: 405,
+ });
+ });
+ });
+ });
+});
diff --git a/x-pack/plugins/siem/server/lib/timeline/routes/update_timelines_route.ts b/x-pack/plugins/siem/server/lib/timeline/routes/update_timelines_route.ts
new file mode 100644
index 0000000000000..a0f3d11a1533d
--- /dev/null
+++ b/x-pack/plugins/siem/server/lib/timeline/routes/update_timelines_route.ts
@@ -0,0 +1,87 @@
+/*
+ * 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 { IRouter } from '../../../../../../../src/core/server';
+
+import { TIMELINE_URL } from '../../../../common/constants';
+import { TimelineType } from '../../../../common/types/timeline';
+
+import { SetupPlugins } from '../../../plugin';
+import { buildRouteValidation } from '../../../utils/build_validation/route_validation';
+import { ConfigType } from '../../..';
+
+import { transformError, buildSiemResponse } from '../../detection_engine/routes/utils';
+import { FrameworkRequest } from '../../framework';
+
+import { updateTimelineSchema } from './schemas/update_timelines_schema';
+import { buildFrameworkRequest } from './utils/common';
+import { createTimelines, getTimeline, getTemplateTimeline } from './utils/create_timelines';
+import { checkIsFailureCases } from './utils/update_timelines';
+
+export const updateTimelinesRoute = (
+ router: IRouter,
+ config: ConfigType,
+ security: SetupPlugins['security']
+) => {
+ router.patch(
+ {
+ path: TIMELINE_URL,
+ validate: {
+ body: buildRouteValidation(updateTimelineSchema),
+ },
+ options: {
+ tags: ['access:siem'],
+ },
+ },
+ // eslint-disable-next-line complexity
+ async (context, request, response) => {
+ const siemResponse = buildSiemResponse(response);
+
+ try {
+ const frameworkRequest = await buildFrameworkRequest(context, security, request);
+ const { timelineId, timeline, version } = request.body;
+ const { templateTimelineId, templateTimelineVersion, timelineType } = timeline;
+ const isHandlingTemplateTimeline = timelineType === TimelineType.template;
+ const existTimeline =
+ timelineId != null ? await getTimeline(frameworkRequest, timelineId) : null;
+
+ const existTemplateTimeline =
+ templateTimelineId != null
+ ? await getTemplateTimeline(frameworkRequest, templateTimelineId)
+ : null;
+ const errorObj = checkIsFailureCases(
+ isHandlingTemplateTimeline,
+ version,
+ templateTimelineVersion ?? null,
+ existTimeline,
+ existTemplateTimeline
+ );
+ if (errorObj != null) {
+ return siemResponse.error(errorObj);
+ }
+ const updatedTimeline = await createTimelines(
+ (frameworkRequest as unknown) as FrameworkRequest,
+ timeline,
+ timelineId,
+ version
+ );
+ return response.ok({
+ body: {
+ data: {
+ persistTimeline: updatedTimeline,
+ },
+ },
+ });
+ } catch (err) {
+ const error = transformError(err);
+ return siemResponse.error({
+ body: error.message,
+ statusCode: error.statusCode,
+ });
+ }
+ }
+ );
+};
diff --git a/x-pack/plugins/siem/server/lib/timeline/routes/utils/common.ts b/x-pack/plugins/siem/server/lib/timeline/routes/utils/common.ts
new file mode 100644
index 0000000000000..1036a74b74a03
--- /dev/null
+++ b/x-pack/plugins/siem/server/lib/timeline/routes/utils/common.ts
@@ -0,0 +1,30 @@
+/*
+ * 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 { set } from 'lodash/fp';
+
+import { SetupPlugins } from '../../../../plugin';
+import { KibanaRequest } from '../../../../../../../../src/core/server';
+import { RequestHandlerContext } from '../../../../../../../../target/types/core/server';
+import { FrameworkRequest } from '../../../framework';
+
+export const buildFrameworkRequest = async (
+ context: RequestHandlerContext,
+ security: SetupPlugins['security'],
+ request: KibanaRequest
+): Promise => {
+ const savedObjectsClient = context.core.savedObjects.client;
+ const user = await security?.authc.getCurrentUser(request);
+
+ return set(
+ 'user',
+ user,
+ set(
+ 'context.core.savedObjects.client',
+ savedObjectsClient,
+ request
+ )
+ );
+};
diff --git a/x-pack/plugins/siem/server/lib/timeline/routes/utils/create_timelines.ts b/x-pack/plugins/siem/server/lib/timeline/routes/utils/create_timelines.ts
new file mode 100644
index 0000000000000..2c67a514cdf97
--- /dev/null
+++ b/x-pack/plugins/siem/server/lib/timeline/routes/utils/create_timelines.ts
@@ -0,0 +1,150 @@
+/*
+ * 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 { isEmpty } from 'lodash/fp';
+
+import * as timelineLib from '../../saved_object';
+import * as pinnedEventLib from '../../../pinned_event/saved_object';
+import * as noteLib from '../../../note/saved_object';
+import { FrameworkRequest } from '../../../framework';
+import { SavedTimeline, TimelineSavedObject } from '../../../../../common/types/timeline';
+import { SavedNote } from '../../../../../common/types/timeline/note';
+import { NoteResult, ResponseTimeline } from '../../../../graphql/types';
+export const CREATE_TIMELINE_ERROR_MESSAGE =
+ 'UPDATE timeline with POST is not allowed, please use PATCH instead';
+export const CREATE_TEMPLATE_TIMELINE_ERROR_MESSAGE =
+ 'UPDATE template timeline with POST is not allowed, please use PATCH instead';
+
+export const saveTimelines = (
+ frameworkRequest: FrameworkRequest,
+ timeline: SavedTimeline,
+ timelineSavedObjectId?: string | null,
+ timelineVersion?: string | null
+): Promise => {
+ return timelineLib.persistTimeline(
+ frameworkRequest,
+ timelineSavedObjectId ?? null,
+ timelineVersion ?? null,
+ timeline
+ );
+};
+
+export const savePinnedEvents = (
+ frameworkRequest: FrameworkRequest,
+ timelineSavedObjectId: string,
+ pinnedEventIds: string[]
+) =>
+ Promise.all(
+ pinnedEventIds.map(eventId =>
+ pinnedEventLib.persistPinnedEventOnTimeline(
+ frameworkRequest,
+ null, // pinnedEventSavedObjectId
+ eventId,
+ timelineSavedObjectId
+ )
+ )
+ );
+
+export const saveNotes = (
+ frameworkRequest: FrameworkRequest,
+ timelineSavedObjectId: string,
+ timelineVersion?: string | null,
+ existingNoteIds?: string[],
+ newNotes?: NoteResult[]
+) => {
+ return Promise.all(
+ newNotes?.map(note => {
+ const newNote: SavedNote = {
+ eventId: note.eventId,
+ note: note.note,
+ timelineId: timelineSavedObjectId,
+ };
+
+ return noteLib.persistNote(
+ frameworkRequest,
+ existingNoteIds?.find(nId => nId === note.noteId) ?? null,
+ timelineVersion ?? null,
+ newNote
+ );
+ }) ?? []
+ );
+};
+
+export const createTimelines = async (
+ frameworkRequest: FrameworkRequest,
+ timeline: SavedTimeline,
+ timelineSavedObjectId?: string | null,
+ timelineVersion?: string | null,
+ pinnedEventIds?: string[] | null,
+ notes?: NoteResult[],
+ existingNoteIds?: string[]
+): Promise => {
+ const responseTimeline = await saveTimelines(
+ frameworkRequest,
+ timeline,
+ timelineSavedObjectId,
+ timelineVersion
+ );
+ const newTimelineSavedObjectId = responseTimeline.timeline.savedObjectId;
+ const newTimelineVersion = responseTimeline.timeline.version;
+
+ let myPromises: unknown[] = [];
+ if (pinnedEventIds != null && !isEmpty(pinnedEventIds)) {
+ myPromises = [
+ ...myPromises,
+ savePinnedEvents(
+ frameworkRequest,
+ timelineSavedObjectId ?? newTimelineSavedObjectId,
+ pinnedEventIds
+ ),
+ ];
+ }
+ if (!isEmpty(notes)) {
+ myPromises = [
+ ...myPromises,
+ saveNotes(
+ frameworkRequest,
+ timelineSavedObjectId ?? newTimelineSavedObjectId,
+ newTimelineVersion,
+ existingNoteIds,
+ notes
+ ),
+ ];
+ }
+
+ if (myPromises.length > 0) {
+ await Promise.all(myPromises);
+ }
+
+ return responseTimeline;
+};
+
+export const getTimeline = async (
+ frameworkRequest: FrameworkRequest,
+ savedObjectId: string
+): Promise => {
+ let timeline = null;
+ try {
+ timeline = await timelineLib.getTimeline(frameworkRequest, savedObjectId);
+ // eslint-disable-next-line no-empty
+ } catch (e) {}
+ return timeline;
+};
+
+export const getTemplateTimeline = async (
+ frameworkRequest: FrameworkRequest,
+ templateTimelineId: string
+): Promise => {
+ let templateTimeline = null;
+ try {
+ templateTimeline = await timelineLib.getTimelineByTemplateTimelineId(
+ frameworkRequest,
+ templateTimelineId
+ );
+ } catch (e) {
+ return null;
+ }
+ return templateTimeline.timeline[0];
+};
diff --git a/x-pack/plugins/siem/server/lib/timeline/routes/utils/export_timelines.ts b/x-pack/plugins/siem/server/lib/timeline/routes/utils/export_timelines.ts
index 677891fa16c02..ea9a5fab66805 100644
--- a/x-pack/plugins/siem/server/lib/timeline/routes/utils/export_timelines.ts
+++ b/x-pack/plugins/siem/server/lib/timeline/routes/utils/export_timelines.ts
@@ -4,13 +4,6 @@
* you may not use this file except in compliance with the Elastic License.
*/
-import { NoteSavedObject } from '../../../note/types';
-import { PinnedEventSavedObject } from '../../../pinned_event/types';
-import { convertSavedObjectToSavedTimeline } from '../../convert_saved_object_to_savedtimeline';
-
-import { convertSavedObjectToSavedPinnedEvent } from '../../../pinned_event/saved_object';
-import { convertSavedObjectToSavedNote } from '../../../note/saved_object';
-
import {
SavedObjectsClient,
SavedObjectsFindOptions,
@@ -22,11 +15,20 @@ import {
ExportTimelineSavedObjectsClient,
ExportedNotes,
TimelineSavedObject,
-} from '../../types';
+ ExportTimelineNotFoundError,
+} from '../../../../../common/types/timeline';
+import { NoteSavedObject } from '../../../../../common/types/timeline/note';
+import { PinnedEventSavedObject } from '../../../../../common/types/timeline/pinned_event';
+
import { transformDataToNdjson } from '../../../../utils/read_stream/create_stream_from_ndjson';
+
+import { convertSavedObjectToSavedPinnedEvent } from '../../../pinned_event/saved_object';
+import { convertSavedObjectToSavedNote } from '../../../note/saved_object';
import { pinnedEventSavedObjectType } from '../../../pinned_event/saved_object_mappings';
import { noteSavedObjectType } from '../../../note/saved_object_mappings';
+
import { timelineSavedObjectType } from '../../saved_object_mappings';
+import { convertSavedObjectToSavedTimeline } from '../../convert_saved_object_to_savedtimeline';
export type TimelineSavedObjectsClient = Pick<
SavedObjectsClient,
@@ -126,12 +128,23 @@ const getTimelines = async (
)
);
- const timelineObjects: TimelineSavedObject[] | undefined =
- savedObjects != null
- ? savedObjects.saved_objects.map((savedObject: unknown) => {
- return convertSavedObjectToSavedTimeline(savedObject);
- })
- : [];
+ const timelineObjects: {
+ timelines: TimelineSavedObject[];
+ errors: ExportTimelineNotFoundError[];
+ } = savedObjects.saved_objects.reduce(
+ (acc, savedObject) => {
+ return savedObject.error == null
+ ? {
+ errors: acc.errors,
+ timelines: [...acc.timelines, convertSavedObjectToSavedTimeline(savedObject)],
+ }
+ : { errors: [...acc.errors, savedObject.error], timelines: acc.timelines };
+ },
+ {
+ timelines: [] as TimelineSavedObject[],
+ errors: [] as ExportTimelineNotFoundError[],
+ }
+ );
return timelineObjects;
};
@@ -139,12 +152,8 @@ const getTimelines = async (
const getTimelinesFromObjects = async (
savedObjectsClient: ExportTimelineSavedObjectsClient,
ids: string[]
-): Promise => {
- const timelines: TimelineSavedObject[] = await getTimelines(savedObjectsClient, ids);
- // To Do for feature freeze
- // if (timelines.length !== request.body.ids.length) {
- // //figure out which is missing to tell user
- // }
+): Promise> => {
+ const { timelines, errors } = await getTimelines(savedObjectsClient, ids);
const [notes, pinnedEventIds] = await Promise.all([
Promise.all(ids.map(timelineId => getNotesByTimelineId(savedObjectsClient, timelineId))),
@@ -178,7 +187,7 @@ const getTimelinesFromObjects = async (
return acc;
}, []);
- return myResponse ?? [];
+ return [...myResponse, ...errors] ?? [];
};
export const getExportTimelineByObjectIds = async ({
diff --git a/x-pack/plugins/siem/server/lib/timeline/routes/utils/import_timelines.ts b/x-pack/plugins/siem/server/lib/timeline/routes/utils/import_timelines.ts
index f69a715f9b2c9..9e120cdc023dc 100644
--- a/x-pack/plugins/siem/server/lib/timeline/routes/utils/import_timelines.ts
+++ b/x-pack/plugins/siem/server/lib/timeline/routes/utils/import_timelines.ts
@@ -7,20 +7,10 @@
import uuid from 'uuid';
import { has } from 'lodash/fp';
import { createBulkErrorObject, BulkError } from '../../../detection_engine/routes/utils';
-import { PinnedEvent } from '../../../pinned_event/saved_object';
-import { Note } from '../../../note/saved_object';
-
-import { Timeline } from '../../saved_object';
-import { SavedTimeline } from '../../types';
-import { FrameworkRequest } from '../../../framework';
-import { SavedNote } from '../../../note/types';
+import { SavedTimeline } from '../../../../../common/types/timeline';
import { NoteResult } from '../../../../graphql/types';
import { HapiReadableStream } from '../../../detection_engine/rules/types';
-const pinnedEventLib = new PinnedEvent();
-const timelineLib = new Timeline();
-const noteLib = new Note();
-
export interface ImportTimelinesSchema {
success: boolean;
success_count: number;
@@ -84,100 +74,6 @@ export const getTupleDuplicateErrorsAndUniqueTimeline = (
return [Array.from(errors.values()), Array.from(timelinesAcc.values())];
};
-export const saveTimelines = async (
- frameworkRequest: FrameworkRequest,
- timeline: SavedTimeline,
- timelineSavedObjectId?: string | null,
- timelineVersion?: string | null
-) => {
- const newTimelineRes = await timelineLib.persistTimeline(
- frameworkRequest,
- timelineSavedObjectId ?? null,
- timelineVersion ?? null,
- timeline
- );
-
- return {
- newTimelineSavedObjectId: newTimelineRes?.timeline?.savedObjectId ?? null,
- newTimelineVersion: newTimelineRes?.timeline?.version ?? null,
- };
-};
-
-export const savePinnedEvents = (
- frameworkRequest: FrameworkRequest,
- timelineSavedObjectId: string,
- pinnedEventIds?: string[] | null
-) => {
- return (
- pinnedEventIds?.map(eventId => {
- return pinnedEventLib.persistPinnedEventOnTimeline(
- frameworkRequest,
- null, // pinnedEventSavedObjectId
- eventId,
- timelineSavedObjectId
- );
- }) ?? []
- );
-};
-
-export const saveNotes = (
- frameworkRequest: FrameworkRequest,
- timelineSavedObjectId: string,
- timelineVersion?: string | null,
- existingNoteIds?: string[],
- newNotes?: NoteResult[]
-) => {
- return Promise.all(
- newNotes?.map(note => {
- const newNote: SavedNote = {
- eventId: note.eventId,
- note: note.note,
- timelineId: timelineSavedObjectId,
- };
-
- return noteLib.persistNote(
- frameworkRequest,
- existingNoteIds?.find(nId => nId === note.noteId) ?? null,
- timelineVersion ?? null,
- newNote
- );
- }) ?? []
- );
-};
-
-export const createTimelines = async (
- frameworkRequest: FrameworkRequest,
- timeline: SavedTimeline,
- timelineSavedObjectId?: string | null,
- timelineVersion?: string | null,
- pinnedEventIds?: string[] | null,
- notes?: NoteResult[],
- existingNoteIds?: string[]
-) => {
- const { newTimelineSavedObjectId, newTimelineVersion } = await saveTimelines(
- frameworkRequest,
- timeline,
- timelineSavedObjectId,
- timelineVersion
- );
- await Promise.all([
- savePinnedEvents(
- frameworkRequest,
- timelineSavedObjectId ?? newTimelineSavedObjectId,
- pinnedEventIds
- ),
- saveNotes(
- frameworkRequest,
- timelineSavedObjectId ?? newTimelineSavedObjectId,
- newTimelineVersion,
- existingNoteIds,
- notes
- ),
- ]);
-
- return newTimelineSavedObjectId;
-};
-
export const isImportRegular = (
importTimelineResponse: ImportTimelineResponse
): importTimelineResponse is ImportRegular => {
@@ -189,3 +85,15 @@ export const isBulkError = (
): importRuleResponse is BulkError => {
return has('error', importRuleResponse);
};
+
+export const timelineSavedObjectOmittedFields = [
+ 'globalNotes',
+ 'eventNotes',
+ 'pinnedEventIds',
+ 'version',
+ 'savedObjectId',
+ 'created',
+ 'createdBy',
+ 'updated',
+ 'updatedBy',
+];
diff --git a/x-pack/plugins/siem/server/lib/timeline/routes/utils/update_timelines.ts b/x-pack/plugins/siem/server/lib/timeline/routes/utils/update_timelines.ts
new file mode 100644
index 0000000000000..6a25d8def9116
--- /dev/null
+++ b/x-pack/plugins/siem/server/lib/timeline/routes/utils/update_timelines.ts
@@ -0,0 +1,81 @@
+/*
+ * 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 { TimelineSavedObject } from '../../../../../common/types/timeline';
+
+export const UPDATE_TIMELINE_ERROR_MESSAGE =
+ 'CREATE timeline with PATCH is not allowed, please use POST instead';
+export const UPDATE_TEMPLATE_TIMELINE_ERROR_MESSAGE =
+ 'CREATE template timeline with PATCH is not allowed, please use POST instead';
+export const NO_MATCH_VERSION_ERROR_MESSAGE =
+ 'TimelineVersion conflict: The given version doesn not match with existing timeline';
+export const NO_MATCH_ID_ERROR_MESSAGE =
+ "Timeline id doesn't match with existing template timeline";
+export const OLDER_VERSION_ERROR_MESSAGE =
+ 'Template timelineVersion conflict: The given version is older then existing version';
+
+export const checkIsFailureCases = (
+ isHandlingTemplateTimeline: boolean,
+ version: string | null,
+ templateTimelineVersion: number | null,
+ existTimeline: TimelineSavedObject | null,
+ existTemplateTimeline: TimelineSavedObject | null
+) => {
+ if (!isHandlingTemplateTimeline && existTimeline == null) {
+ return {
+ body: UPDATE_TIMELINE_ERROR_MESSAGE,
+ statusCode: 405,
+ };
+ } else if (isHandlingTemplateTimeline && existTemplateTimeline == null) {
+ // Throw error to create template timeline in patch
+ return {
+ body: UPDATE_TEMPLATE_TIMELINE_ERROR_MESSAGE,
+ statusCode: 405,
+ };
+ } else if (
+ isHandlingTemplateTimeline &&
+ existTimeline != null &&
+ existTemplateTimeline != null &&
+ existTimeline.savedObjectId !== existTemplateTimeline.savedObjectId
+ ) {
+ // Throw error you can not have a no matching between your timeline and your template timeline during an update
+ return {
+ body: NO_MATCH_ID_ERROR_MESSAGE,
+ statusCode: 409,
+ };
+ } else if (!isHandlingTemplateTimeline && existTimeline?.version !== version) {
+ // throw error 409 conflict timeline
+ return {
+ body: NO_MATCH_VERSION_ERROR_MESSAGE,
+ statusCode: 409,
+ };
+ } else if (
+ isHandlingTemplateTimeline &&
+ existTemplateTimeline != null &&
+ existTemplateTimeline.templateTimelineVersion == null &&
+ existTemplateTimeline.version !== version
+ ) {
+ // throw error 409 conflict timeline
+ return {
+ body: NO_MATCH_VERSION_ERROR_MESSAGE,
+ statusCode: 409,
+ };
+ } else if (
+ isHandlingTemplateTimeline &&
+ templateTimelineVersion != null &&
+ existTemplateTimeline != null &&
+ existTemplateTimeline.templateTimelineVersion != null &&
+ existTemplateTimeline.templateTimelineVersion >= templateTimelineVersion
+ ) {
+ // Throw error you can not update a template timeline version with an old version
+ return {
+ body: OLDER_VERSION_ERROR_MESSAGE,
+ statusCode: 409,
+ };
+ } else {
+ return null;
+ }
+};
diff --git a/x-pack/plugins/siem/server/lib/timeline/saved_object.ts b/x-pack/plugins/siem/server/lib/timeline/saved_object.ts
index e8cd27947589f..d2df7589f3c4a 100644
--- a/x-pack/plugins/siem/server/lib/timeline/saved_object.ts
+++ b/x-pack/plugins/siem/server/lib/timeline/saved_object.ts
@@ -8,260 +8,308 @@ import { getOr } from 'lodash/fp';
import { SavedObjectsFindOptions } from '../../../../../../src/core/server';
import { UNAUTHENTICATED_USER } from '../../../common/constants';
+import { NoteSavedObject } from '../../../common/types/timeline/note';
+import { PinnedEventSavedObject } from '../../../common/types/timeline/pinned_event';
+import { SavedTimeline, TimelineSavedObject, TimelineType } from '../../../common/types/timeline';
import {
ResponseTimeline,
PageInfoTimeline,
SortTimeline,
ResponseFavoriteTimeline,
TimelineResult,
+ Maybe,
} from '../../graphql/types';
import { FrameworkRequest } from '../framework';
-import { Note } from '../note/saved_object';
-import { NoteSavedObject } from '../note/types';
-import { PinnedEventSavedObject } from '../pinned_event/types';
-import { PinnedEvent } from '../pinned_event/saved_object';
+import * as note from '../note/saved_object';
+import * as pinnedEvent from '../pinned_event/saved_object';
import { convertSavedObjectToSavedTimeline } from './convert_saved_object_to_savedtimeline';
import { pickSavedTimeline } from './pick_saved_timeline';
import { timelineSavedObjectType } from './saved_object_mappings';
-import { SavedTimeline, TimelineSavedObject } from './types';
interface ResponseTimelines {
timeline: TimelineSavedObject[];
totalCount: number;
}
-export class Timeline {
- private readonly note = new Note();
- private readonly pinnedEvent = new PinnedEvent();
+export interface ResponseTemplateTimeline {
+ code?: Maybe;
- public async getTimeline(
- request: FrameworkRequest,
- timelineId: string
- ): Promise {
- return this.getSavedTimeline(request, timelineId);
- }
+ message?: Maybe;
+
+ templateTimeline: TimelineResult;
+}
- public async getAllTimeline(
+export interface Timeline {
+ getTimeline: (request: FrameworkRequest, timelineId: string) => Promise;
+
+ getAllTimeline: (
request: FrameworkRequest,
onlyUserFavorite: boolean | null,
pageInfo: PageInfoTimeline | null,
search: string | null,
sort: SortTimeline | null
- ): Promise {
- const options: SavedObjectsFindOptions = {
- type: timelineSavedObjectType,
- perPage: pageInfo != null ? pageInfo.pageSize : undefined,
- page: pageInfo != null ? pageInfo.pageIndex : undefined,
- search: search != null ? search : undefined,
- searchFields: onlyUserFavorite
- ? ['title', 'description', 'favorite.keySearch']
- : ['title', 'description'],
- sortField: sort != null ? sort.sortField : undefined,
- sortOrder: sort != null ? sort.sortOrder : undefined,
- };
-
- return this.getAllSavedTimeline(request, options);
- }
+ ) => Promise;
- public async persistFavorite(
+ persistFavorite: (
request: FrameworkRequest,
timelineId: string | null
- ): Promise {
- const userName = request.user?.username ?? UNAUTHENTICATED_USER;
- const fullName = request.user?.full_name ?? '';
- try {
- let timeline: SavedTimeline = {};
- if (timelineId != null) {
- const {
- eventIdToNoteIds,
- notes,
- noteIds,
- pinnedEventIds,
- pinnedEventsSaveObject,
- savedObjectId,
- version,
- ...savedTimeline
- } = await this.getBasicSavedTimeline(request, timelineId);
- timelineId = savedObjectId; // eslint-disable-line no-param-reassign
- timeline = savedTimeline;
- }
+ ) => Promise;
- const userFavoriteTimeline = {
- keySearch: userName != null ? convertStringToBase64(userName) : null,
- favoriteDate: new Date().valueOf(),
- fullName,
- userName,
- };
- if (timeline.favorite != null) {
- const alreadyExistsTimelineFavoriteByUser = timeline.favorite.findIndex(
- user => user.userName === userName
- );
-
- timeline.favorite =
- alreadyExistsTimelineFavoriteByUser > -1
- ? [
- ...timeline.favorite.slice(0, alreadyExistsTimelineFavoriteByUser),
- ...timeline.favorite.slice(alreadyExistsTimelineFavoriteByUser + 1),
- ]
- : [...timeline.favorite, userFavoriteTimeline];
- } else if (timeline.favorite == null) {
- timeline.favorite = [userFavoriteTimeline];
- }
+ persistTimeline: (
+ request: FrameworkRequest,
+ timelineId: string | null,
+ version: string | null,
+ timeline: SavedTimeline,
+ timelineType?: TimelineType | null
+ ) => Promise;
- const persistResponse = await this.persistTimeline(request, timelineId, null, timeline);
+ deleteTimeline: (request: FrameworkRequest, timelineIds: string[]) => Promise;
+ convertStringToBase64: (text: string) => string;
+ timelineWithReduxProperties: (
+ notes: NoteSavedObject[],
+ pinnedEvents: PinnedEventSavedObject[],
+ timeline: TimelineSavedObject,
+ userName: string
+ ) => TimelineSavedObject;
+}
+
+export const getTimeline = async (
+ request: FrameworkRequest,
+ timelineId: string
+): Promise => {
+ return getSavedTimeline(request, timelineId);
+};
+
+export const getTimelineByTemplateTimelineId = async (
+ request: FrameworkRequest,
+ templateTimelineId: string
+): Promise<{
+ totalCount: number;
+ timeline: TimelineSavedObject[];
+}> => {
+ const options: SavedObjectsFindOptions = {
+ type: timelineSavedObjectType,
+ filter: `siem-ui-timeline.attributes.templateTimelineId: ${templateTimelineId}`,
+ };
+ return getAllSavedTimeline(request, options);
+};
+
+export const getAllTimeline = async (
+ request: FrameworkRequest,
+ onlyUserFavorite: boolean | null,
+ pageInfo: PageInfoTimeline | null,
+ search: string | null,
+ sort: SortTimeline | null
+): Promise => {
+ const options: SavedObjectsFindOptions = {
+ type: timelineSavedObjectType,
+ perPage: pageInfo != null ? pageInfo.pageSize : undefined,
+ page: pageInfo != null ? pageInfo.pageIndex : undefined,
+ search: search != null ? search : undefined,
+ searchFields: onlyUserFavorite
+ ? ['title', 'description', 'favorite.keySearch']
+ : ['title', 'description'],
+ sortField: sort != null ? sort.sortField : undefined,
+ sortOrder: sort != null ? sort.sortOrder : undefined,
+ };
+ return getAllSavedTimeline(request, options);
+};
+
+export const persistFavorite = async (
+ request: FrameworkRequest,
+ timelineId: string | null
+): Promise => {
+ const userName = request.user?.username ?? UNAUTHENTICATED_USER;
+ const fullName = request.user?.full_name ?? '';
+ try {
+ let timeline: SavedTimeline = {};
+ if (timelineId != null) {
+ const {
+ eventIdToNoteIds,
+ notes,
+ noteIds,
+ pinnedEventIds,
+ pinnedEventsSaveObject,
+ savedObjectId,
+ version,
+ ...savedTimeline
+ } = await getBasicSavedTimeline(request, timelineId);
+ timelineId = savedObjectId; // eslint-disable-line no-param-reassign
+ timeline = savedTimeline;
+ }
+
+ const userFavoriteTimeline = {
+ keySearch: userName != null ? convertStringToBase64(userName) : null,
+ favoriteDate: new Date().valueOf(),
+ fullName,
+ userName,
+ };
+ if (timeline.favorite != null) {
+ const alreadyExistsTimelineFavoriteByUser = timeline.favorite.findIndex(
+ user => user.userName === userName
+ );
+
+ timeline.favorite =
+ alreadyExistsTimelineFavoriteByUser > -1
+ ? [
+ ...timeline.favorite.slice(0, alreadyExistsTimelineFavoriteByUser),
+ ...timeline.favorite.slice(alreadyExistsTimelineFavoriteByUser + 1),
+ ]
+ : [...timeline.favorite, userFavoriteTimeline];
+ } else if (timeline.favorite == null) {
+ timeline.favorite = [userFavoriteTimeline];
+ }
+
+ const persistResponse = await persistTimeline(request, timelineId, null, timeline);
+ return {
+ savedObjectId: persistResponse.timeline.savedObjectId,
+ version: persistResponse.timeline.version,
+ favorite:
+ persistResponse.timeline.favorite != null
+ ? persistResponse.timeline.favorite.filter(fav => fav.userName === userName)
+ : [],
+ };
+ } catch (err) {
+ if (getOr(null, 'output.statusCode', err) === 403) {
return {
- savedObjectId: persistResponse.timeline.savedObjectId,
- version: persistResponse.timeline.version,
- favorite:
- persistResponse.timeline.favorite != null
- ? persistResponse.timeline.favorite.filter(fav => fav.userName === userName)
- : [],
+ savedObjectId: '',
+ version: '',
+ favorite: [],
+ code: 403,
+ message: err.message,
};
- } catch (err) {
- if (getOr(null, 'output.statusCode', err) === 403) {
- return {
- savedObjectId: '',
- version: '',
- favorite: [],
- code: 403,
- message: err.message,
- };
- }
- throw err;
}
+ throw err;
}
+};
- public async persistTimeline(
- request: FrameworkRequest,
- timelineId: string | null,
- version: string | null,
- timeline: SavedTimeline
- ): Promise {
- const savedObjectsClient = request.context.core.savedObjects.client;
- try {
- if (timelineId == null) {
- // Create new timeline
- const newTimeline = convertSavedObjectToSavedTimeline(
- await savedObjectsClient.create(
- timelineSavedObjectType,
- pickSavedTimeline(timelineId, timeline, request.user)
- )
- );
- return {
- code: 200,
- message: 'success',
- timeline: newTimeline,
- };
- }
- // Update Timeline
- await savedObjectsClient.update(
- timelineSavedObjectType,
- timelineId,
- pickSavedTimeline(timelineId, timeline, request.user),
- {
- version: version || undefined,
- }
+export const persistTimeline = async (
+ request: FrameworkRequest,
+ timelineId: string | null,
+ version: string | null,
+ timeline: SavedTimeline
+): Promise => {
+ const savedObjectsClient = request.context.core.savedObjects.client;
+ try {
+ if (timelineId == null) {
+ // Create new timeline
+ const newTimeline = convertSavedObjectToSavedTimeline(
+ await savedObjectsClient.create(
+ timelineSavedObjectType,
+ pickSavedTimeline(timelineId, timeline, request.user)
+ )
);
-
return {
code: 200,
message: 'success',
- timeline: await this.getSavedTimeline(request, timelineId),
+ timeline: newTimeline,
};
- } catch (err) {
- if (timelineId != null && savedObjectsClient.errors.isConflictError(err)) {
- return {
- code: 409,
- message: err.message,
- timeline: await this.getSavedTimeline(request, timelineId),
- };
- } else if (getOr(null, 'output.statusCode', err) === 403) {
- const timelineToReturn: TimelineResult = {
- ...timeline,
- savedObjectId: '',
- version: '',
- };
- return {
- code: 403,
- message: err.message,
- timeline: timelineToReturn,
- };
+ }
+ // Update Timeline
+ await savedObjectsClient.update(
+ timelineSavedObjectType,
+ timelineId,
+ pickSavedTimeline(timelineId, timeline, request.user),
+ {
+ version: version || undefined,
}
- throw err;
+ );
+
+ return {
+ code: 200,
+ message: 'success',
+ timeline: await getSavedTimeline(request, timelineId),
+ };
+ } catch (err) {
+ if (timelineId != null && savedObjectsClient.errors.isConflictError(err)) {
+ return {
+ code: 409,
+ message: err.message,
+ timeline: await getSavedTimeline(request, timelineId),
+ };
+ } else if (getOr(null, 'output.statusCode', err) === 403) {
+ const timelineToReturn: TimelineResult = {
+ ...timeline,
+ savedObjectId: '',
+ version: '',
+ };
+ return {
+ code: 403,
+ message: err.message,
+ timeline: timelineToReturn,
+ };
}
+ throw err;
}
+};
- public async deleteTimeline(request: FrameworkRequest, timelineIds: string[]) {
- const savedObjectsClient = request.context.core.savedObjects.client;
-
- await Promise.all(
- timelineIds.map(timelineId =>
- Promise.all([
- savedObjectsClient.delete(timelineSavedObjectType, timelineId),
- this.note.deleteNoteByTimelineId(request, timelineId),
- this.pinnedEvent.deleteAllPinnedEventsOnTimeline(request, timelineId),
- ])
- )
- );
- }
+export const deleteTimeline = async (request: FrameworkRequest, timelineIds: string[]) => {
+ const savedObjectsClient = request.context.core.savedObjects.client;
- private async getBasicSavedTimeline(request: FrameworkRequest, timelineId: string) {
- const savedObjectsClient = request.context.core.savedObjects.client;
- const savedObject = await savedObjectsClient.get(timelineSavedObjectType, timelineId);
+ await Promise.all(
+ timelineIds.map(timelineId =>
+ Promise.all([
+ savedObjectsClient.delete(timelineSavedObjectType, timelineId),
+ note.deleteNoteByTimelineId(request, timelineId),
+ pinnedEvent.deleteAllPinnedEventsOnTimeline(request, timelineId),
+ ])
+ )
+ );
+};
- return convertSavedObjectToSavedTimeline(savedObject);
- }
+const getBasicSavedTimeline = async (request: FrameworkRequest, timelineId: string) => {
+ const savedObjectsClient = request.context.core.savedObjects.client;
+ const savedObject = await savedObjectsClient.get(timelineSavedObjectType, timelineId);
+
+ return convertSavedObjectToSavedTimeline(savedObject);
+};
- private async getSavedTimeline(request: FrameworkRequest, timelineId: string) {
- const userName = request.user?.username ?? UNAUTHENTICATED_USER;
+const getSavedTimeline = async (request: FrameworkRequest, timelineId: string) => {
+ const userName = request.user?.username ?? UNAUTHENTICATED_USER;
- const savedObjectsClient = request.context.core.savedObjects.client;
- const savedObject = await savedObjectsClient.get(timelineSavedObjectType, timelineId);
- const timelineSaveObject = convertSavedObjectToSavedTimeline(savedObject);
- const timelineWithNotesAndPinnedEvents = await Promise.all([
- this.note.getNotesByTimelineId(request, timelineSaveObject.savedObjectId),
- this.pinnedEvent.getAllPinnedEventsByTimelineId(request, timelineSaveObject.savedObjectId),
- Promise.resolve(timelineSaveObject),
- ]);
+ const savedObjectsClient = request.context.core.savedObjects.client;
+ const savedObject = await savedObjectsClient.get(timelineSavedObjectType, timelineId);
+ const timelineSaveObject = convertSavedObjectToSavedTimeline(savedObject);
+ const timelineWithNotesAndPinnedEvents = await Promise.all([
+ note.getNotesByTimelineId(request, timelineSaveObject.savedObjectId),
+ pinnedEvent.getAllPinnedEventsByTimelineId(request, timelineSaveObject.savedObjectId),
+ Promise.resolve(timelineSaveObject),
+ ]);
- const [notes, pinnedEvents, timeline] = timelineWithNotesAndPinnedEvents;
+ const [notes, pinnedEvents, timeline] = timelineWithNotesAndPinnedEvents;
- return timelineWithReduxProperties(notes, pinnedEvents, timeline, userName);
+ return timelineWithReduxProperties(notes, pinnedEvents, timeline, userName);
+};
+
+const getAllSavedTimeline = async (request: FrameworkRequest, options: SavedObjectsFindOptions) => {
+ const userName = request.user?.username ?? UNAUTHENTICATED_USER;
+ const savedObjectsClient = request.context.core.savedObjects.client;
+ if (options.searchFields != null && options.searchFields.includes('favorite.keySearch')) {
+ options.search = `${options.search != null ? options.search : ''} ${
+ userName != null ? convertStringToBase64(userName) : null
+ }`;
}
- private async getAllSavedTimeline(request: FrameworkRequest, options: SavedObjectsFindOptions) {
- const userName = request.user?.username ?? UNAUTHENTICATED_USER;
- const savedObjectsClient = request.context.core.savedObjects.client;
- if (options.searchFields != null && options.searchFields.includes('favorite.keySearch')) {
- options.search = `${options.search != null ? options.search : ''} ${
- userName != null ? convertStringToBase64(userName) : null
- }`;
- }
+ const savedObjects = await savedObjectsClient.find(options);
- const savedObjects = await savedObjectsClient.find(options);
-
- const timelinesWithNotesAndPinnedEvents = await Promise.all(
- savedObjects.saved_objects.map(async savedObject => {
- const timelineSaveObject = convertSavedObjectToSavedTimeline(savedObject);
- return Promise.all([
- this.note.getNotesByTimelineId(request, timelineSaveObject.savedObjectId),
- this.pinnedEvent.getAllPinnedEventsByTimelineId(
- request,
- timelineSaveObject.savedObjectId
- ),
- Promise.resolve(timelineSaveObject),
- ]);
- })
- );
+ const timelinesWithNotesAndPinnedEvents = await Promise.all(
+ savedObjects.saved_objects.map(async savedObject => {
+ const timelineSaveObject = convertSavedObjectToSavedTimeline(savedObject);
+ return Promise.all([
+ note.getNotesByTimelineId(request, timelineSaveObject.savedObjectId),
+ pinnedEvent.getAllPinnedEventsByTimelineId(request, timelineSaveObject.savedObjectId),
+ Promise.resolve(timelineSaveObject),
+ ]);
+ })
+ );
- return {
- totalCount: savedObjects.total,
- timeline: timelinesWithNotesAndPinnedEvents.map(([notes, pinnedEvents, timeline]) =>
- timelineWithReduxProperties(notes, pinnedEvents, timeline, userName)
- ),
- };
- }
-}
+ return {
+ totalCount: savedObjects.total,
+ timeline: timelinesWithNotesAndPinnedEvents.map(([notes, pinnedEvents, timeline]) =>
+ timelineWithReduxProperties(notes, pinnedEvents, timeline, userName)
+ ),
+ };
+};
export const convertStringToBase64 = (text: string): string => Buffer.from(text).toString('base64');
@@ -283,11 +331,9 @@ export const timelineWithReduxProperties = (
timeline.favorite != null && userName != null
? timeline.favorite.filter(fav => fav.userName === userName)
: [],
- eventIdToNoteIds: notes.filter(note => note.eventId != null),
- noteIds: notes
- .filter(note => note.eventId == null && note.noteId != null)
- .map(note => note.noteId),
+ eventIdToNoteIds: notes.filter(n => n.eventId != null),
+ noteIds: notes.filter(n => n.eventId == null && n.noteId != null).map(n => n.noteId),
notes,
- pinnedEventIds: pinnedEvents.map(pinnedEvent => pinnedEvent.eventId),
+ pinnedEventIds: pinnedEvents.map(e => e.eventId),
pinnedEventsSaveObject: pinnedEvents,
});
diff --git a/x-pack/plugins/siem/server/lib/timeline/saved_object_mappings.ts b/x-pack/plugins/siem/server/lib/timeline/saved_object_mappings.ts
index b956e0f98fcb6..1cab24d0879ff 100644
--- a/x-pack/plugins/siem/server/lib/timeline/saved_object_mappings.ts
+++ b/x-pack/plugins/siem/server/lib/timeline/saved_object_mappings.ts
@@ -231,6 +231,15 @@ export const timelineSavedObjectMappings = {
title: {
type: 'text',
},
+ templateTimelineId: {
+ type: 'text',
+ },
+ templateTimelineVersion: {
+ type: 'integer',
+ },
+ timelineType: {
+ type: 'keyword',
+ },
dateRange: {
properties: {
start: {
diff --git a/x-pack/plugins/siem/server/routes/index.ts b/x-pack/plugins/siem/server/routes/index.ts
index 1c03823e85fd7..ffad86a09cee7 100644
--- a/x-pack/plugins/siem/server/routes/index.ts
+++ b/x-pack/plugins/siem/server/routes/index.ts
@@ -30,6 +30,8 @@ import { findRulesStatusesRoute } from '../lib/detection_engine/routes/rules/fin
import { getPrepackagedRulesStatusRoute } from '../lib/detection_engine/routes/rules/get_prepackaged_rules_status_route';
import { importTimelinesRoute } from '../lib/timeline/routes/import_timelines_route';
import { exportTimelinesRoute } from '../lib/timeline/routes/export_timelines_route';
+import { createTimelinesRoute } from '../lib/timeline/routes/create_timelines_route';
+import { updateTimelinesRoute } from '../lib/timeline/routes/update_timelines_route';
import { SetupPlugins } from '../plugin';
import { ConfigType } from '../config';
@@ -55,6 +57,8 @@ export const initRoutes = (
patchRulesBulkRoute(router);
deleteRulesBulkRoute(router);
+ createTimelinesRoute(router, config, security);
+ updateTimelinesRoute(router, config, security);
importRulesRoute(router, config);
exportRulesRoute(router, config);
diff --git a/x-pack/plugins/siem/server/utils/typed_resolvers.ts b/x-pack/plugins/siem/server/utils/typed_resolvers.ts
index da38e8a1e1bf2..4f19bd54b01f0 100644
--- a/x-pack/plugins/siem/server/utils/typed_resolvers.ts
+++ b/x-pack/plugins/siem/server/utils/typed_resolvers.ts
@@ -4,7 +4,6 @@
* you may not use this file except in compliance with the Elastic License.
*/
-import * as runtimeTypes from 'io-ts';
import { GraphQLResolveInfo } from 'graphql';
// eslint-disable-next-line @typescript-eslint/no-explicit-any
@@ -106,6 +105,3 @@ export type ChildResolverOf = ResolverWithParent<
Resolver_,
ResultOf
>;
-
-export const unionWithNullType = (type: T) =>
- runtimeTypes.union([type, runtimeTypes.null]);
diff --git a/x-pack/plugins/task_manager/server/plugin.ts b/x-pack/plugins/task_manager/server/plugin.ts
index a70fbdb18c30b..0f6e3fc31d96d 100644
--- a/x-pack/plugins/task_manager/server/plugin.ts
+++ b/x-pack/plugins/task_manager/server/plugin.ts
@@ -12,11 +12,10 @@ import { TaskManager } from './task_manager';
import { createTaskManager } from './create_task_manager';
import { TaskManagerConfig } from './config';
import { Middleware } from './lib/middleware';
+import { setupSavedObjects } from './saved_objects';
-// eslint-disable-next-line @typescript-eslint/no-empty-interface
-export interface PluginLegacyDependencies {}
export type TaskManagerSetupContract = {
- registerLegacyAPI: (legacyDependencies: PluginLegacyDependencies) => Promise;
+ registerLegacyAPI: () => Promise;
} & Pick;
export type TaskManagerStartContract = Pick<
@@ -35,12 +34,18 @@ export class TaskManagerPlugin
this.currentConfig = {} as TaskManagerConfig;
}
- public setup(core: CoreSetup, plugins: unknown): TaskManagerSetupContract {
+ public async setup(core: CoreSetup, plugins: unknown): Promise {
const logger = this.initContext.logger.get('taskManager');
- const config$ = this.initContext.config.create();
+ const config = await this.initContext.config
+ .create()
+ .pipe(first())
+ .toPromise();
+
+ setupSavedObjects(core.savedObjects, config);
+
return {
- registerLegacyAPI: once((__LEGACY: PluginLegacyDependencies) => {
- config$.subscribe(async config => {
+ registerLegacyAPI: once(() => {
+ (async () => {
const [{ savedObjects, elasticsearch }] = await core.getStartServices();
const savedObjectsRepository = savedObjects.createInternalRepository(['task']);
this.legacyTaskManager$.next(
@@ -53,7 +58,7 @@ export class TaskManagerPlugin
})
);
this.legacyTaskManager$.complete();
- });
+ })();
return this.taskManager;
}),
addMiddleware: (middleware: Middleware) => {
diff --git a/x-pack/plugins/task_manager/server/saved_objects/index.ts b/x-pack/plugins/task_manager/server/saved_objects/index.ts
new file mode 100644
index 0000000000000..0ad9021cd7f39
--- /dev/null
+++ b/x-pack/plugins/task_manager/server/saved_objects/index.ts
@@ -0,0 +1,23 @@
+/*
+ * 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 { SavedObjectsServiceSetup } from 'kibana/server';
+import mappings from './mappings.json';
+import { TaskManagerConfig } from '../config.js';
+
+export function setupSavedObjects(
+ savedObjects: SavedObjectsServiceSetup,
+ config: TaskManagerConfig
+) {
+ savedObjects.registerType({
+ name: 'task',
+ namespaceType: 'agnostic',
+ hidden: true,
+ convertToAliasScript: `ctx._id = ctx._source.type + ':' + ctx._id`,
+ mappings: mappings.task,
+ indexPattern: config.index,
+ });
+}
diff --git a/x-pack/legacy/plugins/task_manager/server/mappings.json b/x-pack/plugins/task_manager/server/saved_objects/mappings.json
similarity index 100%
rename from x-pack/legacy/plugins/task_manager/server/mappings.json
rename to x-pack/plugins/task_manager/server/saved_objects/mappings.json
diff --git a/x-pack/legacy/plugins/task_manager/server/migrations.ts b/x-pack/plugins/task_manager/server/saved_objects/migrations.ts
similarity index 100%
rename from x-pack/legacy/plugins/task_manager/server/migrations.ts
rename to x-pack/plugins/task_manager/server/saved_objects/migrations.ts
diff --git a/x-pack/plugins/task_manager/server/task_manager.ts b/x-pack/plugins/task_manager/server/task_manager.ts
index 24ceea0fe71ef..2a45a599120dd 100644
--- a/x-pack/plugins/task_manager/server/task_manager.ts
+++ b/x-pack/plugins/task_manager/server/task_manager.ts
@@ -240,7 +240,7 @@ export class TaskManager {
* @param taskDefinitions - The Kibana task definitions dictionary
*/
public registerTaskDefinitions(taskDefinitions: TaskDictionary) {
- this.assertUninitialized('register task definitions');
+ this.assertUninitialized('register task definitions', Object.keys(taskDefinitions).join(', '));
const duplicate = Object.keys(taskDefinitions).find(k => !!this.definitions[k]);
if (duplicate) {
throw new Error(`Task ${duplicate} is already defined!`);
@@ -360,9 +360,11 @@ export class TaskManager {
* @param {string} message shown if task manager is already initialized
* @returns void
*/
- private assertUninitialized(message: string) {
+ private assertUninitialized(message: string, context?: string) {
if (this.isStarted) {
- throw new Error(`Cannot ${message} after the task manager is initialized!`);
+ throw new Error(
+ `${context ? `[${context}] ` : ''}Cannot ${message} after the task manager is initialized`
+ );
}
}
}
diff --git a/x-pack/plugins/translations/translations/ja-JP.json b/x-pack/plugins/translations/translations/ja-JP.json
index cdff34ec3a603..8974f0b5b4d58 100644
--- a/x-pack/plugins/translations/translations/ja-JP.json
+++ b/x-pack/plugins/translations/translations/ja-JP.json
@@ -10505,10 +10505,9 @@
"xpack.ml.overview.feedbackSectionTitle": "フィードバック",
"xpack.ml.overview.gettingStartedSectionCreateJob": "新規ジョブを作成中",
"xpack.ml.overview.gettingStartedSectionDocs": "ドキュメンテーション",
- "xpack.ml.overview.gettingStartedSectionText": "機械学習へようこそ。はじめに{docs}や{createJob}をご参照ください。Elastic Stackの機械学習の詳細については、{whatIsMachineLearning}をご覧ください。{transforms}を使用して、分析ジョブの機能インデックスを作成することをお勧めします。",
+ "xpack.ml.overview.gettingStartedSectionText": "機械学習へようこそ。はじめに{docs}や{createJob}をご参照ください。{transforms}を使用して、分析ジョブの機能インデックスを作成することをお勧めします。",
"xpack.ml.overview.gettingStartedSectionTitle": "はじめて使う",
"xpack.ml.overview.gettingStartedSectionTransforms": "Elasticsearchの変換",
- "xpack.ml.overview.gettingStartedSectionWhatIsMachineLearning": "こちら",
"xpack.ml.overview.overviewLabel": "概要",
"xpack.ml.overview.statsBar.failedAnalyticsLabel": "失敗",
"xpack.ml.overview.statsBar.runningAnalyticsLabel": "実行中",
@@ -16112,7 +16111,6 @@
"xpack.uptime.emptyStateError.notAuthorized": "アップタイムデータの表示が承認されていません。システム管理者にお問い合わせください。",
"xpack.uptime.emptyStateError.notFoundPage": "ページが見つかりません",
"xpack.uptime.emptyStateError.title": "エラー",
- "xpack.uptime.featureCatalogueDescription": "エンドポイントヘルスチェックとアップタイム監視を行います。",
"xpack.uptime.featureRegistry.uptimeFeatureName": "アップタイム",
"xpack.uptime.filterBar.ariaLabel": "概要ページのインプットフィルター基準",
"xpack.uptime.filterBar.filterDownLabel": "ダウン",
diff --git a/x-pack/plugins/translations/translations/zh-CN.json b/x-pack/plugins/translations/translations/zh-CN.json
index 819112feb9f57..d36a62f15aee9 100644
--- a/x-pack/plugins/translations/translations/zh-CN.json
+++ b/x-pack/plugins/translations/translations/zh-CN.json
@@ -10508,10 +10508,9 @@
"xpack.ml.overview.feedbackSectionTitle": "反馈",
"xpack.ml.overview.gettingStartedSectionCreateJob": "创建新作业",
"xpack.ml.overview.gettingStartedSectionDocs": "文档",
- "xpack.ml.overview.gettingStartedSectionText": "欢迎使用 Machine Learning。首先阅读我们的{docs}或{createJob}。有关 Elastic Stack 中的机器学习的详情,请参阅{whatIsMachineLearning}。建议使用 {transforms}为分析作业创建功能索引。",
+ "xpack.ml.overview.gettingStartedSectionText": "欢迎使用 Machine Learning。首先阅读我们的{docs}或{createJob}。建议使用 {transforms}为分析作业创建功能索引。",
"xpack.ml.overview.gettingStartedSectionTitle": "入门",
"xpack.ml.overview.gettingStartedSectionTransforms": "Elasticsearch 的转换",
- "xpack.ml.overview.gettingStartedSectionWhatIsMachineLearning": "此处",
"xpack.ml.overview.overviewLabel": "概览",
"xpack.ml.overview.statsBar.failedAnalyticsLabel": "失败",
"xpack.ml.overview.statsBar.runningAnalyticsLabel": "正在运行",
@@ -16117,7 +16116,6 @@
"xpack.uptime.emptyStateError.notAuthorized": "您无权查看 Uptime 数据,请联系系统管理员。",
"xpack.uptime.emptyStateError.notFoundPage": "未找到页面",
"xpack.uptime.emptyStateError.title": "错误",
- "xpack.uptime.featureCatalogueDescription": "执行终端节点运行状况检查和运行时间监测。",
"xpack.uptime.featureRegistry.uptimeFeatureName": "运行时间",
"xpack.uptime.filterBar.ariaLabel": "概览页面的输入筛选条件",
"xpack.uptime.filterBar.filterDownLabel": "关闭",
diff --git a/x-pack/legacy/plugins/uptime/README.md b/x-pack/plugins/uptime/README.md
similarity index 100%
rename from x-pack/legacy/plugins/uptime/README.md
rename to x-pack/plugins/uptime/README.md
diff --git a/x-pack/legacy/plugins/uptime/common/constants/alerts.ts b/x-pack/plugins/uptime/common/constants/alerts.ts
similarity index 100%
rename from x-pack/legacy/plugins/uptime/common/constants/alerts.ts
rename to x-pack/plugins/uptime/common/constants/alerts.ts
diff --git a/x-pack/legacy/plugins/uptime/common/constants/capabilities.ts b/x-pack/plugins/uptime/common/constants/capabilities.ts
similarity index 100%
rename from x-pack/legacy/plugins/uptime/common/constants/capabilities.ts
rename to x-pack/plugins/uptime/common/constants/capabilities.ts
diff --git a/x-pack/legacy/plugins/uptime/common/constants/chart_format_limits.ts b/x-pack/plugins/uptime/common/constants/chart_format_limits.ts
similarity index 100%
rename from x-pack/legacy/plugins/uptime/common/constants/chart_format_limits.ts
rename to x-pack/plugins/uptime/common/constants/chart_format_limits.ts
diff --git a/x-pack/legacy/plugins/uptime/common/constants/client_defaults.ts b/x-pack/plugins/uptime/common/constants/client_defaults.ts
similarity index 100%
rename from x-pack/legacy/plugins/uptime/common/constants/client_defaults.ts
rename to x-pack/plugins/uptime/common/constants/client_defaults.ts
diff --git a/x-pack/legacy/plugins/uptime/common/constants/context_defaults.ts b/x-pack/plugins/uptime/common/constants/context_defaults.ts
similarity index 100%
rename from x-pack/legacy/plugins/uptime/common/constants/context_defaults.ts
rename to x-pack/plugins/uptime/common/constants/context_defaults.ts
diff --git a/x-pack/legacy/plugins/uptime/common/constants/index.ts b/x-pack/plugins/uptime/common/constants/index.ts
similarity index 100%
rename from x-pack/legacy/plugins/uptime/common/constants/index.ts
rename to x-pack/plugins/uptime/common/constants/index.ts
diff --git a/x-pack/legacy/plugins/uptime/common/constants/plugin.ts b/x-pack/plugins/uptime/common/constants/plugin.ts
similarity index 64%
rename from x-pack/legacy/plugins/uptime/common/constants/plugin.ts
rename to x-pack/plugins/uptime/common/constants/plugin.ts
index 00781726941d5..6064524872a0a 100644
--- a/x-pack/legacy/plugins/uptime/common/constants/plugin.ts
+++ b/x-pack/plugins/uptime/common/constants/plugin.ts
@@ -8,12 +8,17 @@ import { i18n } from '@kbn/i18n';
export const PLUGIN = {
APP_ROOT_ID: 'react-uptime-root',
- DESCRIPTION: 'Uptime monitoring',
+ DESCRIPTION: i18n.translate('xpack.uptime.pluginDescription', {
+ defaultMessage: 'Uptime monitoring',
+ description: 'The description text that will appear in the feature catalogue.',
+ }),
ID: 'uptime',
LOCAL_STORAGE_KEY: 'xpack.uptime',
NAME: i18n.translate('xpack.uptime.featureRegistry.uptimeFeatureName', {
defaultMessage: 'Uptime',
}),
ROUTER_BASE_NAME: '/app/uptime#',
- TITLE: 'uptime',
+ TITLE: i18n.translate('xpack.uptime.uptimeFeatureCatalogueTitle', {
+ defaultMessage: 'Uptime',
+ }),
};
diff --git a/x-pack/legacy/plugins/uptime/common/constants/query.ts b/x-pack/plugins/uptime/common/constants/query.ts
similarity index 100%
rename from x-pack/legacy/plugins/uptime/common/constants/query.ts
rename to x-pack/plugins/uptime/common/constants/query.ts
diff --git a/x-pack/legacy/plugins/uptime/common/constants/rest_api.ts b/x-pack/plugins/uptime/common/constants/rest_api.ts
similarity index 100%
rename from x-pack/legacy/plugins/uptime/common/constants/rest_api.ts
rename to x-pack/plugins/uptime/common/constants/rest_api.ts
diff --git a/x-pack/legacy/plugins/uptime/common/constants/settings_defaults.ts b/x-pack/plugins/uptime/common/constants/settings_defaults.ts
similarity index 100%
rename from x-pack/legacy/plugins/uptime/common/constants/settings_defaults.ts
rename to x-pack/plugins/uptime/common/constants/settings_defaults.ts
diff --git a/x-pack/legacy/plugins/uptime/common/constants/ui.ts b/x-pack/plugins/uptime/common/constants/ui.ts
similarity index 100%
rename from x-pack/legacy/plugins/uptime/common/constants/ui.ts
rename to x-pack/plugins/uptime/common/constants/ui.ts
diff --git a/x-pack/legacy/plugins/uptime/common/runtime_types/alerts/index.ts b/x-pack/plugins/uptime/common/runtime_types/alerts/index.ts
similarity index 100%
rename from x-pack/legacy/plugins/uptime/common/runtime_types/alerts/index.ts
rename to x-pack/plugins/uptime/common/runtime_types/alerts/index.ts
diff --git a/x-pack/legacy/plugins/uptime/common/runtime_types/alerts/status_check.ts b/x-pack/plugins/uptime/common/runtime_types/alerts/status_check.ts
similarity index 100%
rename from x-pack/legacy/plugins/uptime/common/runtime_types/alerts/status_check.ts
rename to x-pack/plugins/uptime/common/runtime_types/alerts/status_check.ts
diff --git a/x-pack/legacy/plugins/uptime/common/runtime_types/certs.ts b/x-pack/plugins/uptime/common/runtime_types/certs.ts
similarity index 100%
rename from x-pack/legacy/plugins/uptime/common/runtime_types/certs.ts
rename to x-pack/plugins/uptime/common/runtime_types/certs.ts
diff --git a/x-pack/legacy/plugins/uptime/common/runtime_types/common.ts b/x-pack/plugins/uptime/common/runtime_types/common.ts
similarity index 100%
rename from x-pack/legacy/plugins/uptime/common/runtime_types/common.ts
rename to x-pack/plugins/uptime/common/runtime_types/common.ts
diff --git a/x-pack/legacy/plugins/uptime/common/runtime_types/dynamic_settings.ts b/x-pack/plugins/uptime/common/runtime_types/dynamic_settings.ts
similarity index 100%
rename from x-pack/legacy/plugins/uptime/common/runtime_types/dynamic_settings.ts
rename to x-pack/plugins/uptime/common/runtime_types/dynamic_settings.ts
diff --git a/x-pack/legacy/plugins/uptime/common/runtime_types/index.ts b/x-pack/plugins/uptime/common/runtime_types/index.ts
similarity index 100%
rename from x-pack/legacy/plugins/uptime/common/runtime_types/index.ts
rename to x-pack/plugins/uptime/common/runtime_types/index.ts
index 78aab3806ae04..e80471bf8b56f 100644
--- a/x-pack/legacy/plugins/uptime/common/runtime_types/index.ts
+++ b/x-pack/plugins/uptime/common/runtime_types/index.ts
@@ -7,8 +7,8 @@
export * from './alerts';
export * from './certs';
export * from './common';
+export * from './dynamic_settings';
export * from './monitor';
export * from './overview_filters';
export * from './ping';
export * from './snapshot';
-export * from './dynamic_settings';
diff --git a/x-pack/legacy/plugins/uptime/common/runtime_types/monitor/details.ts b/x-pack/plugins/uptime/common/runtime_types/monitor/details.ts
similarity index 100%
rename from x-pack/legacy/plugins/uptime/common/runtime_types/monitor/details.ts
rename to x-pack/plugins/uptime/common/runtime_types/monitor/details.ts
diff --git a/x-pack/legacy/plugins/uptime/common/runtime_types/monitor/index.ts b/x-pack/plugins/uptime/common/runtime_types/monitor/index.ts
similarity index 100%
rename from x-pack/legacy/plugins/uptime/common/runtime_types/monitor/index.ts
rename to x-pack/plugins/uptime/common/runtime_types/monitor/index.ts
diff --git a/x-pack/legacy/plugins/uptime/common/runtime_types/monitor/locations.ts b/x-pack/plugins/uptime/common/runtime_types/monitor/locations.ts
similarity index 100%
rename from x-pack/legacy/plugins/uptime/common/runtime_types/monitor/locations.ts
rename to x-pack/plugins/uptime/common/runtime_types/monitor/locations.ts
diff --git a/x-pack/legacy/plugins/uptime/common/runtime_types/monitor/state.ts b/x-pack/plugins/uptime/common/runtime_types/monitor/state.ts
similarity index 100%
rename from x-pack/legacy/plugins/uptime/common/runtime_types/monitor/state.ts
rename to x-pack/plugins/uptime/common/runtime_types/monitor/state.ts
diff --git a/x-pack/legacy/plugins/uptime/common/runtime_types/overview_filters/index.ts b/x-pack/plugins/uptime/common/runtime_types/overview_filters/index.ts
similarity index 100%
rename from x-pack/legacy/plugins/uptime/common/runtime_types/overview_filters/index.ts
rename to x-pack/plugins/uptime/common/runtime_types/overview_filters/index.ts
diff --git a/x-pack/legacy/plugins/uptime/common/runtime_types/overview_filters/overview_filters.ts b/x-pack/plugins/uptime/common/runtime_types/overview_filters/overview_filters.ts
similarity index 100%
rename from x-pack/legacy/plugins/uptime/common/runtime_types/overview_filters/overview_filters.ts
rename to x-pack/plugins/uptime/common/runtime_types/overview_filters/overview_filters.ts
diff --git a/x-pack/legacy/plugins/uptime/common/runtime_types/ping/histogram.ts b/x-pack/plugins/uptime/common/runtime_types/ping/histogram.ts
similarity index 100%
rename from x-pack/legacy/plugins/uptime/common/runtime_types/ping/histogram.ts
rename to x-pack/plugins/uptime/common/runtime_types/ping/histogram.ts
diff --git a/x-pack/legacy/plugins/uptime/common/runtime_types/ping/index.ts b/x-pack/plugins/uptime/common/runtime_types/ping/index.ts
similarity index 100%
rename from x-pack/legacy/plugins/uptime/common/runtime_types/ping/index.ts
rename to x-pack/plugins/uptime/common/runtime_types/ping/index.ts
diff --git a/x-pack/legacy/plugins/uptime/common/runtime_types/ping/ping.ts b/x-pack/plugins/uptime/common/runtime_types/ping/ping.ts
similarity index 100%
rename from x-pack/legacy/plugins/uptime/common/runtime_types/ping/ping.ts
rename to x-pack/plugins/uptime/common/runtime_types/ping/ping.ts
diff --git a/x-pack/legacy/plugins/uptime/common/runtime_types/snapshot/index.ts b/x-pack/plugins/uptime/common/runtime_types/snapshot/index.ts
similarity index 100%
rename from x-pack/legacy/plugins/uptime/common/runtime_types/snapshot/index.ts
rename to x-pack/plugins/uptime/common/runtime_types/snapshot/index.ts
diff --git a/x-pack/legacy/plugins/uptime/common/runtime_types/snapshot/snapshot_count.ts b/x-pack/plugins/uptime/common/runtime_types/snapshot/snapshot_count.ts
similarity index 100%
rename from x-pack/legacy/plugins/uptime/common/runtime_types/snapshot/snapshot_count.ts
rename to x-pack/plugins/uptime/common/runtime_types/snapshot/snapshot_count.ts
diff --git a/x-pack/legacy/plugins/uptime/common/types/index.ts b/x-pack/plugins/uptime/common/types/index.ts
similarity index 69%
rename from x-pack/legacy/plugins/uptime/common/types/index.ts
rename to x-pack/plugins/uptime/common/types/index.ts
index a32eabd49a3e5..71ccd54dd3cdc 100644
--- a/x-pack/legacy/plugins/uptime/common/types/index.ts
+++ b/x-pack/plugins/uptime/common/types/index.ts
@@ -4,18 +4,6 @@
* you may not use this file except in compliance with the Elastic License.
*/
-/** Represents a bucket of monitor status information. */
-export interface StatusData {
- /** The timeseries point for this status data. */
- x: number;
- /** The value of up counts for this point. */
- up?: number | null;
- /** The value for down counts for this point. */
- down?: number | null;
- /** The total down counts for this point. */
- total?: number | null;
-}
-
/** Represents the average monitor duration ms at a point in time. */
export interface MonitorDurationAveragePoint {
/** The timeseries value for this point. */
diff --git a/x-pack/plugins/uptime/kibana.json b/x-pack/plugins/uptime/kibana.json
index 6ec8a755ebea0..ce8b64ce07254 100644
--- a/x-pack/plugins/uptime/kibana.json
+++ b/x-pack/plugins/uptime/kibana.json
@@ -2,8 +2,16 @@
"configPath": ["xpack", "uptime"],
"id": "uptime",
"kibanaVersion": "kibana",
- "requiredPlugins": ["alerting", "features", "licensing", "usageCollection"],
+ "optionalPlugins": ["capabilities", "data", "home"],
+ "requiredPlugins": [
+ "alerting",
+ "embeddable",
+ "features",
+ "licensing",
+ "triggers_actions_ui",
+ "usageCollection"
+ ],
"server": true,
- "ui": false,
+ "ui": true,
"version": "8.0.0"
}
diff --git a/x-pack/legacy/plugins/uptime/public/app.ts b/x-pack/plugins/uptime/public/app.ts
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/app.ts
rename to x-pack/plugins/uptime/public/app.ts
diff --git a/x-pack/legacy/plugins/actions/index.ts b/x-pack/plugins/uptime/public/apps/index.ts
similarity index 85%
rename from x-pack/legacy/plugins/actions/index.ts
rename to x-pack/plugins/uptime/public/apps/index.ts
index 276d1ea3accea..65b80d08d4f20 100644
--- a/x-pack/legacy/plugins/actions/index.ts
+++ b/x-pack/plugins/uptime/public/apps/index.ts
@@ -4,4 +4,4 @@
* you may not use this file except in compliance with the Elastic License.
*/
-export * from './server/';
+export { UptimePlugin } from './plugin';
diff --git a/x-pack/plugins/uptime/public/apps/plugin.ts b/x-pack/plugins/uptime/public/apps/plugin.ts
new file mode 100644
index 0000000000000..719dac022dada
--- /dev/null
+++ b/x-pack/plugins/uptime/public/apps/plugin.ts
@@ -0,0 +1,72 @@
+/*
+ * 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 { LegacyCoreStart, AppMountParameters } from 'src/core/public';
+import { CoreSetup, CoreStart, Plugin, PluginInitializerContext } from 'kibana/public';
+import { UMFrontendLibs } from '../lib/lib';
+import { PLUGIN } from '../../common/constants';
+import { FeatureCatalogueCategory } from '../../../../../src/plugins/home/public';
+import { getKibanaFrameworkAdapter } from '../lib/adapters/framework/new_platform_adapter';
+import { HomePublicPluginSetup } from '../../../../../src/plugins/home/public';
+import { EmbeddableStart } from '../../../../../src/plugins/embeddable/public';
+import { TriggersAndActionsUIPublicPluginSetup } from '../../../triggers_actions_ui/public';
+import { DataPublicPluginSetup } from '../../../../../src/plugins/data/public';
+
+export interface StartObject {
+ core: LegacyCoreStart;
+ plugins: any;
+}
+
+export interface ClientPluginsSetup {
+ data: DataPublicPluginSetup;
+ home: HomePublicPluginSetup;
+ triggers_actions_ui: TriggersAndActionsUIPublicPluginSetup;
+}
+
+export interface ClientPluginsStart {
+ embeddable: EmbeddableStart;
+}
+
+export class UptimePlugin implements Plugin {
+ constructor(_context: PluginInitializerContext) {}
+
+ public async setup(
+ core: CoreSetup,
+ plugins: ClientPluginsSetup
+ ): Promise {
+ if (plugins.home) {
+ plugins.home.featureCatalogue.register({
+ id: PLUGIN.ID,
+ title: PLUGIN.TITLE,
+ description: PLUGIN.DESCRIPTION,
+ icon: 'uptimeApp',
+ path: '/app/uptime#/',
+ showOnHomePage: true,
+ category: FeatureCatalogueCategory.DATA,
+ });
+ }
+
+ core.application.register({
+ appRoute: '/app/uptime#/',
+ id: PLUGIN.ID,
+ euiIconType: 'uptimeApp',
+ order: 8900,
+ title: PLUGIN.TITLE,
+ async mount(params: AppMountParameters) {
+ const [coreStart, corePlugins] = await core.getStartServices();
+ const { element } = params;
+ const libs: UMFrontendLibs = {
+ framework: getKibanaFrameworkAdapter(coreStart, plugins, corePlugins),
+ };
+ libs.framework.render(element);
+ return () => {};
+ },
+ });
+ }
+
+ public start(_start: CoreStart, _plugins: {}): void {}
+
+ public stop(): void {}
+}
diff --git a/x-pack/legacy/plugins/uptime/public/apps/template.html b/x-pack/plugins/uptime/public/apps/template.html
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/apps/template.html
rename to x-pack/plugins/uptime/public/apps/template.html
diff --git a/x-pack/legacy/plugins/uptime/public/badge.ts b/x-pack/plugins/uptime/public/badge.ts
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/badge.ts
rename to x-pack/plugins/uptime/public/badge.ts
diff --git a/x-pack/legacy/plugins/uptime/public/breadcrumbs.ts b/x-pack/plugins/uptime/public/breadcrumbs.ts
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/breadcrumbs.ts
rename to x-pack/plugins/uptime/public/breadcrumbs.ts
diff --git a/x-pack/legacy/plugins/uptime/public/components/common/__tests__/__snapshots__/location_link.test.tsx.snap b/x-pack/plugins/uptime/public/components/common/__tests__/__snapshots__/location_link.test.tsx.snap
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/components/common/__tests__/__snapshots__/location_link.test.tsx.snap
rename to x-pack/plugins/uptime/public/components/common/__tests__/__snapshots__/location_link.test.tsx.snap
diff --git a/x-pack/legacy/plugins/uptime/public/components/common/__tests__/__snapshots__/uptime_date_picker.test.tsx.snap b/x-pack/plugins/uptime/public/components/common/__tests__/__snapshots__/uptime_date_picker.test.tsx.snap
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/components/common/__tests__/__snapshots__/uptime_date_picker.test.tsx.snap
rename to x-pack/plugins/uptime/public/components/common/__tests__/__snapshots__/uptime_date_picker.test.tsx.snap
diff --git a/x-pack/legacy/plugins/uptime/public/components/common/__tests__/location_link.test.tsx b/x-pack/plugins/uptime/public/components/common/__tests__/location_link.test.tsx
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/components/common/__tests__/location_link.test.tsx
rename to x-pack/plugins/uptime/public/components/common/__tests__/location_link.test.tsx
diff --git a/x-pack/legacy/plugins/uptime/public/components/common/__tests__/uptime_date_picker.test.tsx b/x-pack/plugins/uptime/public/components/common/__tests__/uptime_date_picker.test.tsx
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/components/common/__tests__/uptime_date_picker.test.tsx
rename to x-pack/plugins/uptime/public/components/common/__tests__/uptime_date_picker.test.tsx
diff --git a/x-pack/legacy/plugins/uptime/public/components/common/charts/__tests__/__snapshots__/chart_empty_state.test.tsx.snap b/x-pack/plugins/uptime/public/components/common/charts/__tests__/__snapshots__/chart_empty_state.test.tsx.snap
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/components/common/charts/__tests__/__snapshots__/chart_empty_state.test.tsx.snap
rename to x-pack/plugins/uptime/public/components/common/charts/__tests__/__snapshots__/chart_empty_state.test.tsx.snap
diff --git a/x-pack/legacy/plugins/uptime/public/components/common/charts/__tests__/__snapshots__/chart_wrapper.test.tsx.snap b/x-pack/plugins/uptime/public/components/common/charts/__tests__/__snapshots__/chart_wrapper.test.tsx.snap
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/components/common/charts/__tests__/__snapshots__/chart_wrapper.test.tsx.snap
rename to x-pack/plugins/uptime/public/components/common/charts/__tests__/__snapshots__/chart_wrapper.test.tsx.snap
diff --git a/x-pack/legacy/plugins/uptime/public/components/common/charts/__tests__/__snapshots__/donut_chart.test.tsx.snap b/x-pack/plugins/uptime/public/components/common/charts/__tests__/__snapshots__/donut_chart.test.tsx.snap
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/components/common/charts/__tests__/__snapshots__/donut_chart.test.tsx.snap
rename to x-pack/plugins/uptime/public/components/common/charts/__tests__/__snapshots__/donut_chart.test.tsx.snap
diff --git a/x-pack/legacy/plugins/uptime/public/components/common/charts/__tests__/__snapshots__/donut_chart_legend.test.tsx.snap b/x-pack/plugins/uptime/public/components/common/charts/__tests__/__snapshots__/donut_chart_legend.test.tsx.snap
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/components/common/charts/__tests__/__snapshots__/donut_chart_legend.test.tsx.snap
rename to x-pack/plugins/uptime/public/components/common/charts/__tests__/__snapshots__/donut_chart_legend.test.tsx.snap
diff --git a/x-pack/legacy/plugins/uptime/public/components/common/charts/__tests__/__snapshots__/donut_chart_legend_row.test.tsx.snap b/x-pack/plugins/uptime/public/components/common/charts/__tests__/__snapshots__/donut_chart_legend_row.test.tsx.snap
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/components/common/charts/__tests__/__snapshots__/donut_chart_legend_row.test.tsx.snap
rename to x-pack/plugins/uptime/public/components/common/charts/__tests__/__snapshots__/donut_chart_legend_row.test.tsx.snap
diff --git a/x-pack/legacy/plugins/uptime/public/components/common/charts/__tests__/__snapshots__/duration_charts.test.tsx.snap b/x-pack/plugins/uptime/public/components/common/charts/__tests__/__snapshots__/duration_charts.test.tsx.snap
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/components/common/charts/__tests__/__snapshots__/duration_charts.test.tsx.snap
rename to x-pack/plugins/uptime/public/components/common/charts/__tests__/__snapshots__/duration_charts.test.tsx.snap
diff --git a/x-pack/legacy/plugins/uptime/public/components/common/charts/__tests__/__snapshots__/monitor_bar_series.test.tsx.snap b/x-pack/plugins/uptime/public/components/common/charts/__tests__/__snapshots__/monitor_bar_series.test.tsx.snap
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/components/common/charts/__tests__/__snapshots__/monitor_bar_series.test.tsx.snap
rename to x-pack/plugins/uptime/public/components/common/charts/__tests__/__snapshots__/monitor_bar_series.test.tsx.snap
diff --git a/x-pack/legacy/plugins/uptime/public/components/common/charts/__tests__/__snapshots__/ping_histogram.test.tsx.snap b/x-pack/plugins/uptime/public/components/common/charts/__tests__/__snapshots__/ping_histogram.test.tsx.snap
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/components/common/charts/__tests__/__snapshots__/ping_histogram.test.tsx.snap
rename to x-pack/plugins/uptime/public/components/common/charts/__tests__/__snapshots__/ping_histogram.test.tsx.snap
diff --git a/x-pack/legacy/plugins/uptime/public/components/common/charts/__tests__/chart_empty_state.test.tsx b/x-pack/plugins/uptime/public/components/common/charts/__tests__/chart_empty_state.test.tsx
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/components/common/charts/__tests__/chart_empty_state.test.tsx
rename to x-pack/plugins/uptime/public/components/common/charts/__tests__/chart_empty_state.test.tsx
diff --git a/x-pack/legacy/plugins/uptime/public/components/common/charts/__tests__/chart_wrapper.test.tsx b/x-pack/plugins/uptime/public/components/common/charts/__tests__/chart_wrapper.test.tsx
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/components/common/charts/__tests__/chart_wrapper.test.tsx
rename to x-pack/plugins/uptime/public/components/common/charts/__tests__/chart_wrapper.test.tsx
diff --git a/x-pack/legacy/plugins/uptime/public/components/common/charts/__tests__/donut_chart.test.tsx b/x-pack/plugins/uptime/public/components/common/charts/__tests__/donut_chart.test.tsx
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/components/common/charts/__tests__/donut_chart.test.tsx
rename to x-pack/plugins/uptime/public/components/common/charts/__tests__/donut_chart.test.tsx
diff --git a/x-pack/legacy/plugins/uptime/public/components/common/charts/__tests__/donut_chart_legend.test.tsx b/x-pack/plugins/uptime/public/components/common/charts/__tests__/donut_chart_legend.test.tsx
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/components/common/charts/__tests__/donut_chart_legend.test.tsx
rename to x-pack/plugins/uptime/public/components/common/charts/__tests__/donut_chart_legend.test.tsx
diff --git a/x-pack/legacy/plugins/uptime/public/components/common/charts/__tests__/donut_chart_legend_row.test.tsx b/x-pack/plugins/uptime/public/components/common/charts/__tests__/donut_chart_legend_row.test.tsx
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/components/common/charts/__tests__/donut_chart_legend_row.test.tsx
rename to x-pack/plugins/uptime/public/components/common/charts/__tests__/donut_chart_legend_row.test.tsx
diff --git a/x-pack/legacy/plugins/uptime/public/components/common/charts/__tests__/duration_charts.test.tsx b/x-pack/plugins/uptime/public/components/common/charts/__tests__/duration_charts.test.tsx
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/components/common/charts/__tests__/duration_charts.test.tsx
rename to x-pack/plugins/uptime/public/components/common/charts/__tests__/duration_charts.test.tsx
diff --git a/x-pack/legacy/plugins/uptime/public/components/common/charts/__tests__/get_tick_format.test.ts b/x-pack/plugins/uptime/public/components/common/charts/__tests__/get_tick_format.test.ts
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/components/common/charts/__tests__/get_tick_format.test.ts
rename to x-pack/plugins/uptime/public/components/common/charts/__tests__/get_tick_format.test.ts
diff --git a/x-pack/legacy/plugins/uptime/public/components/common/charts/__tests__/monitor_bar_series.test.tsx b/x-pack/plugins/uptime/public/components/common/charts/__tests__/monitor_bar_series.test.tsx
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/components/common/charts/__tests__/monitor_bar_series.test.tsx
rename to x-pack/plugins/uptime/public/components/common/charts/__tests__/monitor_bar_series.test.tsx
diff --git a/x-pack/legacy/plugins/uptime/public/components/common/charts/__tests__/ping_histogram.test.tsx b/x-pack/plugins/uptime/public/components/common/charts/__tests__/ping_histogram.test.tsx
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/components/common/charts/__tests__/ping_histogram.test.tsx
rename to x-pack/plugins/uptime/public/components/common/charts/__tests__/ping_histogram.test.tsx
diff --git a/x-pack/legacy/plugins/uptime/public/components/common/charts/annotation_tooltip.tsx b/x-pack/plugins/uptime/public/components/common/charts/annotation_tooltip.tsx
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/components/common/charts/annotation_tooltip.tsx
rename to x-pack/plugins/uptime/public/components/common/charts/annotation_tooltip.tsx
diff --git a/x-pack/legacy/plugins/uptime/public/components/common/charts/chart_empty_state.tsx b/x-pack/plugins/uptime/public/components/common/charts/chart_empty_state.tsx
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/components/common/charts/chart_empty_state.tsx
rename to x-pack/plugins/uptime/public/components/common/charts/chart_empty_state.tsx
diff --git a/x-pack/legacy/plugins/uptime/public/components/common/charts/chart_wrapper/chart_wrapper.tsx b/x-pack/plugins/uptime/public/components/common/charts/chart_wrapper/chart_wrapper.tsx
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/components/common/charts/chart_wrapper/chart_wrapper.tsx
rename to x-pack/plugins/uptime/public/components/common/charts/chart_wrapper/chart_wrapper.tsx
diff --git a/x-pack/legacy/plugins/uptime/public/components/common/charts/chart_wrapper/index.ts b/x-pack/plugins/uptime/public/components/common/charts/chart_wrapper/index.ts
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/components/common/charts/chart_wrapper/index.ts
rename to x-pack/plugins/uptime/public/components/common/charts/chart_wrapper/index.ts
diff --git a/x-pack/legacy/plugins/uptime/public/components/common/charts/donut_chart.tsx b/x-pack/plugins/uptime/public/components/common/charts/donut_chart.tsx
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/components/common/charts/donut_chart.tsx
rename to x-pack/plugins/uptime/public/components/common/charts/donut_chart.tsx
diff --git a/x-pack/legacy/plugins/uptime/public/components/common/charts/donut_chart_legend.tsx b/x-pack/plugins/uptime/public/components/common/charts/donut_chart_legend.tsx
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/components/common/charts/donut_chart_legend.tsx
rename to x-pack/plugins/uptime/public/components/common/charts/donut_chart_legend.tsx
diff --git a/x-pack/legacy/plugins/uptime/public/components/common/charts/donut_chart_legend_row.tsx b/x-pack/plugins/uptime/public/components/common/charts/donut_chart_legend_row.tsx
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/components/common/charts/donut_chart_legend_row.tsx
rename to x-pack/plugins/uptime/public/components/common/charts/donut_chart_legend_row.tsx
diff --git a/x-pack/legacy/plugins/uptime/public/components/common/charts/duration_chart.tsx b/x-pack/plugins/uptime/public/components/common/charts/duration_chart.tsx
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/components/common/charts/duration_chart.tsx
rename to x-pack/plugins/uptime/public/components/common/charts/duration_chart.tsx
diff --git a/x-pack/legacy/plugins/uptime/public/components/common/charts/duration_line_bar_list.tsx b/x-pack/plugins/uptime/public/components/common/charts/duration_line_bar_list.tsx
similarity index 94%
rename from x-pack/legacy/plugins/uptime/public/components/common/charts/duration_line_bar_list.tsx
rename to x-pack/plugins/uptime/public/components/common/charts/duration_line_bar_list.tsx
index a31a143b71fd2..ceb1e700f293e 100644
--- a/x-pack/legacy/plugins/uptime/public/components/common/charts/duration_line_bar_list.tsx
+++ b/x-pack/plugins/uptime/public/components/common/charts/duration_line_bar_list.tsx
@@ -9,11 +9,11 @@ import moment from 'moment';
import { AnnotationTooltipFormatter, RectAnnotation } from '@elastic/charts';
import { RectAnnotationDatum } from '@elastic/charts/dist/chart_types/xy_chart/utils/specs';
import { AnnotationTooltip } from './annotation_tooltip';
-import { ANOMALY_SEVERITY } from '../../../../../../../plugins/ml/common/constants/anomalies';
+import { ANOMALY_SEVERITY } from '../../../../../../plugins/ml/common/constants/anomalies';
import {
getSeverityColor,
getSeverityType,
-} from '../../../../../../../plugins/ml/common/util/anomaly_utils';
+} from '../../../../../../plugins/ml/common/util/anomaly_utils';
interface Props {
anomalies: any;
diff --git a/x-pack/legacy/plugins/uptime/public/components/common/charts/duration_line_series_list.tsx b/x-pack/plugins/uptime/public/components/common/charts/duration_line_series_list.tsx
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/components/common/charts/duration_line_series_list.tsx
rename to x-pack/plugins/uptime/public/components/common/charts/duration_line_series_list.tsx
diff --git a/x-pack/legacy/plugins/uptime/public/components/common/charts/get_tick_format.ts b/x-pack/plugins/uptime/public/components/common/charts/get_tick_format.ts
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/components/common/charts/get_tick_format.ts
rename to x-pack/plugins/uptime/public/components/common/charts/get_tick_format.ts
diff --git a/x-pack/legacy/plugins/uptime/public/components/common/charts/index.ts b/x-pack/plugins/uptime/public/components/common/charts/index.ts
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/components/common/charts/index.ts
rename to x-pack/plugins/uptime/public/components/common/charts/index.ts
diff --git a/x-pack/legacy/plugins/uptime/public/components/common/charts/monitor_bar_series.tsx b/x-pack/plugins/uptime/public/components/common/charts/monitor_bar_series.tsx
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/components/common/charts/monitor_bar_series.tsx
rename to x-pack/plugins/uptime/public/components/common/charts/monitor_bar_series.tsx
diff --git a/x-pack/legacy/plugins/uptime/public/components/common/charts/ping_histogram.tsx b/x-pack/plugins/uptime/public/components/common/charts/ping_histogram.tsx
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/components/common/charts/ping_histogram.tsx
rename to x-pack/plugins/uptime/public/components/common/charts/ping_histogram.tsx
diff --git a/x-pack/legacy/plugins/uptime/public/components/common/higher_order/__tests__/__snapshots__/responsive_wrapper.test.tsx.snap b/x-pack/plugins/uptime/public/components/common/higher_order/__tests__/__snapshots__/responsive_wrapper.test.tsx.snap
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/components/common/higher_order/__tests__/__snapshots__/responsive_wrapper.test.tsx.snap
rename to x-pack/plugins/uptime/public/components/common/higher_order/__tests__/__snapshots__/responsive_wrapper.test.tsx.snap
diff --git a/x-pack/legacy/plugins/uptime/public/components/common/higher_order/__tests__/responsive_wrapper.test.tsx b/x-pack/plugins/uptime/public/components/common/higher_order/__tests__/responsive_wrapper.test.tsx
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/components/common/higher_order/__tests__/responsive_wrapper.test.tsx
rename to x-pack/plugins/uptime/public/components/common/higher_order/__tests__/responsive_wrapper.test.tsx
diff --git a/x-pack/legacy/plugins/uptime/public/components/common/higher_order/index.ts b/x-pack/plugins/uptime/public/components/common/higher_order/index.ts
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/components/common/higher_order/index.ts
rename to x-pack/plugins/uptime/public/components/common/higher_order/index.ts
diff --git a/x-pack/legacy/plugins/uptime/public/components/common/higher_order/responsive_wrapper.tsx b/x-pack/plugins/uptime/public/components/common/higher_order/responsive_wrapper.tsx
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/components/common/higher_order/responsive_wrapper.tsx
rename to x-pack/plugins/uptime/public/components/common/higher_order/responsive_wrapper.tsx
diff --git a/x-pack/legacy/plugins/uptime/public/components/common/location_link.tsx b/x-pack/plugins/uptime/public/components/common/location_link.tsx
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/components/common/location_link.tsx
rename to x-pack/plugins/uptime/public/components/common/location_link.tsx
diff --git a/x-pack/legacy/plugins/uptime/public/components/common/uptime_date_picker.tsx b/x-pack/plugins/uptime/public/components/common/uptime_date_picker.tsx
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/components/common/uptime_date_picker.tsx
rename to x-pack/plugins/uptime/public/components/common/uptime_date_picker.tsx
diff --git a/x-pack/legacy/plugins/uptime/public/components/monitor/__tests__/__snapshots__/monitor_charts.test.tsx.snap b/x-pack/plugins/uptime/public/components/monitor/__tests__/__snapshots__/monitor_charts.test.tsx.snap
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/components/monitor/__tests__/__snapshots__/monitor_charts.test.tsx.snap
rename to x-pack/plugins/uptime/public/components/monitor/__tests__/__snapshots__/monitor_charts.test.tsx.snap
diff --git a/x-pack/legacy/plugins/uptime/public/components/monitor/__tests__/monitor_charts.test.tsx b/x-pack/plugins/uptime/public/components/monitor/__tests__/monitor_charts.test.tsx
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/components/monitor/__tests__/monitor_charts.test.tsx
rename to x-pack/plugins/uptime/public/components/monitor/__tests__/monitor_charts.test.tsx
diff --git a/x-pack/legacy/plugins/uptime/public/components/monitor/index.ts b/x-pack/plugins/uptime/public/components/monitor/index.ts
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/components/monitor/index.ts
rename to x-pack/plugins/uptime/public/components/monitor/index.ts
diff --git a/x-pack/legacy/plugins/uptime/public/components/monitor/location_map/__tests__/__snapshots__/location_map.test.tsx.snap b/x-pack/plugins/uptime/public/components/monitor/location_map/__tests__/__snapshots__/location_map.test.tsx.snap
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/components/monitor/location_map/__tests__/__snapshots__/location_map.test.tsx.snap
rename to x-pack/plugins/uptime/public/components/monitor/location_map/__tests__/__snapshots__/location_map.test.tsx.snap
diff --git a/x-pack/legacy/plugins/uptime/public/components/monitor/location_map/__tests__/__snapshots__/location_missing.test.tsx.snap b/x-pack/plugins/uptime/public/components/monitor/location_map/__tests__/__snapshots__/location_missing.test.tsx.snap
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/components/monitor/location_map/__tests__/__snapshots__/location_missing.test.tsx.snap
rename to x-pack/plugins/uptime/public/components/monitor/location_map/__tests__/__snapshots__/location_missing.test.tsx.snap
diff --git a/x-pack/legacy/plugins/uptime/public/components/monitor/location_map/__tests__/__snapshots__/location_status_tags.test.tsx.snap b/x-pack/plugins/uptime/public/components/monitor/location_map/__tests__/__snapshots__/location_status_tags.test.tsx.snap
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/components/monitor/location_map/__tests__/__snapshots__/location_status_tags.test.tsx.snap
rename to x-pack/plugins/uptime/public/components/monitor/location_map/__tests__/__snapshots__/location_status_tags.test.tsx.snap
diff --git a/x-pack/legacy/plugins/uptime/public/components/monitor/location_map/__tests__/location_map.test.tsx b/x-pack/plugins/uptime/public/components/monitor/location_map/__tests__/location_map.test.tsx
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/components/monitor/location_map/__tests__/location_map.test.tsx
rename to x-pack/plugins/uptime/public/components/monitor/location_map/__tests__/location_map.test.tsx
diff --git a/x-pack/legacy/plugins/uptime/public/components/monitor/location_map/__tests__/location_missing.test.tsx b/x-pack/plugins/uptime/public/components/monitor/location_map/__tests__/location_missing.test.tsx
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/components/monitor/location_map/__tests__/location_missing.test.tsx
rename to x-pack/plugins/uptime/public/components/monitor/location_map/__tests__/location_missing.test.tsx
diff --git a/x-pack/legacy/plugins/uptime/public/components/monitor/location_map/__tests__/location_status_tags.test.tsx b/x-pack/plugins/uptime/public/components/monitor/location_map/__tests__/location_status_tags.test.tsx
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/components/monitor/location_map/__tests__/location_status_tags.test.tsx
rename to x-pack/plugins/uptime/public/components/monitor/location_map/__tests__/location_status_tags.test.tsx
diff --git a/x-pack/legacy/plugins/uptime/public/components/monitor/location_map/embeddables/__tests__/__mocks__/mock.ts b/x-pack/plugins/uptime/public/components/monitor/location_map/embeddables/__tests__/__mocks__/mock.ts
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/components/monitor/location_map/embeddables/__tests__/__mocks__/mock.ts
rename to x-pack/plugins/uptime/public/components/monitor/location_map/embeddables/__tests__/__mocks__/mock.ts
diff --git a/x-pack/legacy/plugins/uptime/public/components/monitor/location_map/embeddables/__tests__/map_config.test.ts b/x-pack/plugins/uptime/public/components/monitor/location_map/embeddables/__tests__/map_config.test.ts
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/components/monitor/location_map/embeddables/__tests__/map_config.test.ts
rename to x-pack/plugins/uptime/public/components/monitor/location_map/embeddables/__tests__/map_config.test.ts
diff --git a/x-pack/legacy/plugins/uptime/public/components/monitor/location_map/embeddables/embedded_map.tsx b/x-pack/plugins/uptime/public/components/monitor/location_map/embeddables/embedded_map.tsx
similarity index 85%
rename from x-pack/legacy/plugins/uptime/public/components/monitor/location_map/embeddables/embedded_map.tsx
rename to x-pack/plugins/uptime/public/components/monitor/location_map/embeddables/embedded_map.tsx
index 85d0b1b593704..06cdb07bd8bcd 100644
--- a/x-pack/legacy/plugins/uptime/public/components/monitor/location_map/embeddables/embedded_map.tsx
+++ b/x-pack/plugins/uptime/public/components/monitor/location_map/embeddables/embedded_map.tsx
@@ -7,21 +7,17 @@
import React, { useEffect, useState, useContext, useRef } from 'react';
import uuid from 'uuid';
import styled from 'styled-components';
-import { npStart } from 'ui/new_platform';
-
-import {
- ViewMode,
- EmbeddableOutput,
- ErrorEmbeddable,
- isErrorEmbeddable,
-} from '../../../../../../../../../src/plugins/embeddable/public';
+import { MapEmbeddable, MapEmbeddableInput } from '../../../../../../../legacy/plugins/maps/public';
import * as i18n from './translations';
-import { MapEmbeddable, MapEmbeddableInput } from '../../../../../../maps/public';
-import { MAP_SAVED_OBJECT_TYPE } from '../../../../../../../../plugins/maps/public';
import { Location } from '../../../../../common/runtime_types';
-
import { getLayerList } from './map_config';
-import { UptimeThemeContext } from '../../../../contexts';
+import { UptimeThemeContext, UptimeStartupPluginsContext } from '../../../../contexts';
+import {
+ isErrorEmbeddable,
+ ViewMode,
+ ErrorEmbeddable,
+} from '../../../../../../../../src/plugins/embeddable/public';
+import { MAP_SAVED_OBJECT_TYPE } from '../../../../../../maps/public';
export interface EmbeddedMapProps {
upPoints: LocationPoint[];
@@ -52,11 +48,11 @@ export const EmbeddedMap = React.memo(({ upPoints, downPoints }: EmbeddedMapProp
const { colors } = useContext(UptimeThemeContext);
const [embeddable, setEmbeddable] = useState();
const embeddableRoot: React.RefObject = useRef(null);
- const factory = npStart.plugins.embeddable.getEmbeddableFactory<
- MapEmbeddableInput,
- EmbeddableOutput,
- MapEmbeddable
- >(MAP_SAVED_OBJECT_TYPE);
+ const { embeddable: embeddablePlugin } = useContext(UptimeStartupPluginsContext);
+ if (!embeddablePlugin) {
+ throw new Error('Embeddable start plugin not found');
+ }
+ const factory: any = embeddablePlugin.getEmbeddableFactory(MAP_SAVED_OBJECT_TYPE);
const input: MapEmbeddableInput = {
id: uuid.v4(),
@@ -88,7 +84,7 @@ export const EmbeddedMap = React.memo(({ upPoints, downPoints }: EmbeddedMapProp
if (!factory) {
throw new Error('Map embeddable not found.');
}
- const embeddableObject = await factory.create({
+ const embeddableObject: any = await factory.create({
...input,
title: i18n.MAP_TITLE,
});
diff --git a/x-pack/legacy/plugins/uptime/public/components/monitor/location_map/embeddables/low_poly_layer.json b/x-pack/plugins/uptime/public/components/monitor/location_map/embeddables/low_poly_layer.json
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/components/monitor/location_map/embeddables/low_poly_layer.json
rename to x-pack/plugins/uptime/public/components/monitor/location_map/embeddables/low_poly_layer.json
diff --git a/x-pack/legacy/plugins/uptime/public/components/monitor/location_map/embeddables/map_config.ts b/x-pack/plugins/uptime/public/components/monitor/location_map/embeddables/map_config.ts
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/components/monitor/location_map/embeddables/map_config.ts
rename to x-pack/plugins/uptime/public/components/monitor/location_map/embeddables/map_config.ts
diff --git a/x-pack/legacy/plugins/uptime/public/components/monitor/location_map/embeddables/translations.ts b/x-pack/plugins/uptime/public/components/monitor/location_map/embeddables/translations.ts
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/components/monitor/location_map/embeddables/translations.ts
rename to x-pack/plugins/uptime/public/components/monitor/location_map/embeddables/translations.ts
diff --git a/x-pack/legacy/plugins/uptime/public/components/monitor/location_map/index.tsx b/x-pack/plugins/uptime/public/components/monitor/location_map/index.ts
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/components/monitor/location_map/index.tsx
rename to x-pack/plugins/uptime/public/components/monitor/location_map/index.ts
diff --git a/x-pack/legacy/plugins/uptime/public/components/monitor/location_map/location_map.tsx b/x-pack/plugins/uptime/public/components/monitor/location_map/location_map.tsx
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/components/monitor/location_map/location_map.tsx
rename to x-pack/plugins/uptime/public/components/monitor/location_map/location_map.tsx
diff --git a/x-pack/legacy/plugins/uptime/public/components/monitor/location_map/location_missing.tsx b/x-pack/plugins/uptime/public/components/monitor/location_map/location_missing.tsx
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/components/monitor/location_map/location_missing.tsx
rename to x-pack/plugins/uptime/public/components/monitor/location_map/location_missing.tsx
diff --git a/x-pack/legacy/plugins/uptime/public/components/monitor/location_map/location_status_tags.tsx b/x-pack/plugins/uptime/public/components/monitor/location_map/location_status_tags.tsx
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/components/monitor/location_map/location_status_tags.tsx
rename to x-pack/plugins/uptime/public/components/monitor/location_map/location_status_tags.tsx
diff --git a/x-pack/legacy/plugins/uptime/public/components/monitor/ml/__tests__/__snapshots__/confirm_delete.test.tsx.snap b/x-pack/plugins/uptime/public/components/monitor/ml/__tests__/__snapshots__/confirm_delete.test.tsx.snap
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/components/monitor/ml/__tests__/__snapshots__/confirm_delete.test.tsx.snap
rename to x-pack/plugins/uptime/public/components/monitor/ml/__tests__/__snapshots__/confirm_delete.test.tsx.snap
diff --git a/x-pack/legacy/plugins/uptime/public/components/monitor/ml/__tests__/__snapshots__/license_info.test.tsx.snap b/x-pack/plugins/uptime/public/components/monitor/ml/__tests__/__snapshots__/license_info.test.tsx.snap
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/components/monitor/ml/__tests__/__snapshots__/license_info.test.tsx.snap
rename to x-pack/plugins/uptime/public/components/monitor/ml/__tests__/__snapshots__/license_info.test.tsx.snap
diff --git a/x-pack/legacy/plugins/uptime/public/components/monitor/ml/__tests__/__snapshots__/ml_flyout.test.tsx.snap b/x-pack/plugins/uptime/public/components/monitor/ml/__tests__/__snapshots__/ml_flyout.test.tsx.snap
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/components/monitor/ml/__tests__/__snapshots__/ml_flyout.test.tsx.snap
rename to x-pack/plugins/uptime/public/components/monitor/ml/__tests__/__snapshots__/ml_flyout.test.tsx.snap
diff --git a/x-pack/legacy/plugins/uptime/public/components/monitor/ml/__tests__/__snapshots__/ml_integerations.test.tsx.snap b/x-pack/plugins/uptime/public/components/monitor/ml/__tests__/__snapshots__/ml_integerations.test.tsx.snap
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/components/monitor/ml/__tests__/__snapshots__/ml_integerations.test.tsx.snap
rename to x-pack/plugins/uptime/public/components/monitor/ml/__tests__/__snapshots__/ml_integerations.test.tsx.snap
diff --git a/x-pack/legacy/plugins/uptime/public/components/monitor/ml/__tests__/__snapshots__/ml_job_link.test.tsx.snap b/x-pack/plugins/uptime/public/components/monitor/ml/__tests__/__snapshots__/ml_job_link.test.tsx.snap
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/components/monitor/ml/__tests__/__snapshots__/ml_job_link.test.tsx.snap
rename to x-pack/plugins/uptime/public/components/monitor/ml/__tests__/__snapshots__/ml_job_link.test.tsx.snap
diff --git a/x-pack/legacy/plugins/uptime/public/components/monitor/ml/__tests__/__snapshots__/ml_manage_job.test.tsx.snap b/x-pack/plugins/uptime/public/components/monitor/ml/__tests__/__snapshots__/ml_manage_job.test.tsx.snap
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/components/monitor/ml/__tests__/__snapshots__/ml_manage_job.test.tsx.snap
rename to x-pack/plugins/uptime/public/components/monitor/ml/__tests__/__snapshots__/ml_manage_job.test.tsx.snap
diff --git a/x-pack/legacy/plugins/uptime/public/components/monitor/ml/__tests__/confirm_delete.test.tsx b/x-pack/plugins/uptime/public/components/monitor/ml/__tests__/confirm_delete.test.tsx
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/components/monitor/ml/__tests__/confirm_delete.test.tsx
rename to x-pack/plugins/uptime/public/components/monitor/ml/__tests__/confirm_delete.test.tsx
diff --git a/x-pack/legacy/plugins/uptime/public/components/monitor/ml/__tests__/license_info.test.tsx b/x-pack/plugins/uptime/public/components/monitor/ml/__tests__/license_info.test.tsx
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/components/monitor/ml/__tests__/license_info.test.tsx
rename to x-pack/plugins/uptime/public/components/monitor/ml/__tests__/license_info.test.tsx
diff --git a/x-pack/legacy/plugins/uptime/public/components/monitor/ml/__tests__/ml_flyout.test.tsx b/x-pack/plugins/uptime/public/components/monitor/ml/__tests__/ml_flyout.test.tsx
similarity index 97%
rename from x-pack/legacy/plugins/uptime/public/components/monitor/ml/__tests__/ml_flyout.test.tsx
rename to x-pack/plugins/uptime/public/components/monitor/ml/__tests__/ml_flyout.test.tsx
index c0b02181dcce1..31cdcfac9feef 100644
--- a/x-pack/legacy/plugins/uptime/public/components/monitor/ml/__tests__/ml_flyout.test.tsx
+++ b/x-pack/plugins/uptime/public/components/monitor/ml/__tests__/ml_flyout.test.tsx
@@ -9,7 +9,7 @@ import { renderWithIntl, shallowWithIntl } from 'test_utils/enzyme_helpers';
import { MLFlyoutView } from '../ml_flyout';
import { UptimeSettingsContext } from '../../../../contexts';
import { CLIENT_DEFAULTS } from '../../../../../common/constants';
-import { License } from '../../../../../../../../plugins/licensing/common/license';
+import { License } from '../../../../../../../plugins/licensing/common/license';
const expiredLicense = new License({
signature: 'test signature',
diff --git a/x-pack/legacy/plugins/uptime/public/components/monitor/ml/__tests__/ml_integerations.test.tsx b/x-pack/plugins/uptime/public/components/monitor/ml/__tests__/ml_integerations.test.tsx
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/components/monitor/ml/__tests__/ml_integerations.test.tsx
rename to x-pack/plugins/uptime/public/components/monitor/ml/__tests__/ml_integerations.test.tsx
diff --git a/x-pack/legacy/plugins/uptime/public/components/monitor/ml/__tests__/ml_job_link.test.tsx b/x-pack/plugins/uptime/public/components/monitor/ml/__tests__/ml_job_link.test.tsx
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/components/monitor/ml/__tests__/ml_job_link.test.tsx
rename to x-pack/plugins/uptime/public/components/monitor/ml/__tests__/ml_job_link.test.tsx
diff --git a/x-pack/legacy/plugins/uptime/public/components/monitor/ml/__tests__/ml_manage_job.test.tsx b/x-pack/plugins/uptime/public/components/monitor/ml/__tests__/ml_manage_job.test.tsx
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/components/monitor/ml/__tests__/ml_manage_job.test.tsx
rename to x-pack/plugins/uptime/public/components/monitor/ml/__tests__/ml_manage_job.test.tsx
diff --git a/x-pack/legacy/plugins/uptime/public/components/monitor/ml/confirm_delete.tsx b/x-pack/plugins/uptime/public/components/monitor/ml/confirm_delete.tsx
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/components/monitor/ml/confirm_delete.tsx
rename to x-pack/plugins/uptime/public/components/monitor/ml/confirm_delete.tsx
diff --git a/x-pack/legacy/plugins/uptime/public/components/monitor/ml/index.ts b/x-pack/plugins/uptime/public/components/monitor/ml/index.ts
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/components/monitor/ml/index.ts
rename to x-pack/plugins/uptime/public/components/monitor/ml/index.ts
diff --git a/x-pack/legacy/plugins/uptime/public/components/monitor/ml/license_info.tsx b/x-pack/plugins/uptime/public/components/monitor/ml/license_info.tsx
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/components/monitor/ml/license_info.tsx
rename to x-pack/plugins/uptime/public/components/monitor/ml/license_info.tsx
diff --git a/x-pack/legacy/plugins/uptime/public/components/monitor/ml/manage_ml_job.tsx b/x-pack/plugins/uptime/public/components/monitor/ml/manage_ml_job.tsx
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/components/monitor/ml/manage_ml_job.tsx
rename to x-pack/plugins/uptime/public/components/monitor/ml/manage_ml_job.tsx
diff --git a/x-pack/legacy/plugins/uptime/public/components/monitor/ml/ml_flyout.tsx b/x-pack/plugins/uptime/public/components/monitor/ml/ml_flyout.tsx
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/components/monitor/ml/ml_flyout.tsx
rename to x-pack/plugins/uptime/public/components/monitor/ml/ml_flyout.tsx
diff --git a/x-pack/legacy/plugins/uptime/public/components/monitor/ml/ml_flyout_container.tsx b/x-pack/plugins/uptime/public/components/monitor/ml/ml_flyout_container.tsx
similarity index 98%
rename from x-pack/legacy/plugins/uptime/public/components/monitor/ml/ml_flyout_container.tsx
rename to x-pack/plugins/uptime/public/components/monitor/ml/ml_flyout_container.tsx
index c3e8579ca4837..6eec30d405f76 100644
--- a/x-pack/legacy/plugins/uptime/public/components/monitor/ml/ml_flyout_container.tsx
+++ b/x-pack/plugins/uptime/public/components/monitor/ml/ml_flyout_container.tsx
@@ -19,7 +19,7 @@ import * as labels from './translations';
import {
useKibana,
KibanaReactNotifications,
-} from '../../../../../../../../src/plugins/kibana_react/public';
+} from '../../../../../../../src/plugins/kibana_react/public';
import { MLFlyoutView } from './ml_flyout';
import { ML_JOB_ID } from '../../../../common/constants';
import { UptimeRefreshContext, UptimeSettingsContext } from '../../../contexts';
diff --git a/x-pack/legacy/plugins/uptime/public/components/monitor/ml/ml_integeration.tsx b/x-pack/plugins/uptime/public/components/monitor/ml/ml_integeration.tsx
similarity index 95%
rename from x-pack/legacy/plugins/uptime/public/components/monitor/ml/ml_integeration.tsx
rename to x-pack/plugins/uptime/public/components/monitor/ml/ml_integeration.tsx
index 4963a901f0ecc..7f19885c15406 100644
--- a/x-pack/legacy/plugins/uptime/public/components/monitor/ml/ml_integeration.tsx
+++ b/x-pack/plugins/uptime/public/components/monitor/ml/ml_integeration.tsx
@@ -18,9 +18,9 @@ import { ConfirmJobDeletion } from './confirm_delete';
import { UptimeRefreshContext } from '../../../contexts';
import { getMLJobId } from '../../../state/api/ml_anomaly';
import * as labels from './translations';
-import { useKibana } from '../../../../../../../../src/plugins/kibana_react/public';
+import { useKibana } from '../../../../../../../src/plugins/kibana_react/public';
import { ManageMLJobComponent } from './manage_ml_job';
-import { JobStat } from '../../../../../../../plugins/ml/common/types/data_recognizer';
+import { JobStat } from '../../../../../../plugins/ml/common/types/data_recognizer';
import { useMonitorId } from '../../../hooks';
export const MLIntegrationComponent = () => {
diff --git a/x-pack/legacy/plugins/uptime/public/components/monitor/ml/ml_job_link.tsx b/x-pack/plugins/uptime/public/components/monitor/ml/ml_job_link.tsx
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/components/monitor/ml/ml_job_link.tsx
rename to x-pack/plugins/uptime/public/components/monitor/ml/ml_job_link.tsx
diff --git a/x-pack/legacy/plugins/uptime/public/components/monitor/ml/translations.tsx b/x-pack/plugins/uptime/public/components/monitor/ml/translations.tsx
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/components/monitor/ml/translations.tsx
rename to x-pack/plugins/uptime/public/components/monitor/ml/translations.tsx
diff --git a/x-pack/legacy/plugins/uptime/public/components/monitor/monitor_charts.tsx b/x-pack/plugins/uptime/public/components/monitor/monitor_charts.tsx
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/components/monitor/monitor_charts.tsx
rename to x-pack/plugins/uptime/public/components/monitor/monitor_charts.tsx
diff --git a/x-pack/legacy/plugins/uptime/public/components/monitor/monitor_duration/index.ts b/x-pack/plugins/uptime/public/components/monitor/monitor_duration/index.ts
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/components/monitor/monitor_duration/index.ts
rename to x-pack/plugins/uptime/public/components/monitor/monitor_duration/index.ts
diff --git a/x-pack/legacy/plugins/uptime/public/components/monitor/monitor_duration/monitor_duration.tsx b/x-pack/plugins/uptime/public/components/monitor/monitor_duration/monitor_duration.tsx
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/components/monitor/monitor_duration/monitor_duration.tsx
rename to x-pack/plugins/uptime/public/components/monitor/monitor_duration/monitor_duration.tsx
diff --git a/x-pack/legacy/plugins/uptime/public/components/monitor/monitor_duration/monitor_duration_container.tsx b/x-pack/plugins/uptime/public/components/monitor/monitor_duration/monitor_duration_container.tsx
similarity index 96%
rename from x-pack/legacy/plugins/uptime/public/components/monitor/monitor_duration/monitor_duration_container.tsx
rename to x-pack/plugins/uptime/public/components/monitor/monitor_duration/monitor_duration_container.tsx
index 7e39b977f1271..52d4f620f84b3 100644
--- a/x-pack/legacy/plugins/uptime/public/components/monitor/monitor_duration/monitor_duration_container.tsx
+++ b/x-pack/plugins/uptime/public/components/monitor/monitor_duration/monitor_duration_container.tsx
@@ -20,7 +20,7 @@ import {
} from '../../../state/selectors';
import { UptimeRefreshContext } from '../../../contexts';
import { getMLJobId } from '../../../state/api/ml_anomaly';
-import { JobStat } from '../../../../../../../plugins/ml/common/types/data_recognizer';
+import { JobStat } from '../../../../../ml/common/types/data_recognizer';
import { MonitorDurationComponent } from './monitor_duration';
import { MonitorIdParam } from '../../../../common/types';
diff --git a/x-pack/legacy/plugins/uptime/public/components/monitor/monitor_status_details/__test__/__snapshots__/monitor_ssl_certificate.test.tsx.snap b/x-pack/plugins/uptime/public/components/monitor/monitor_status_details/__test__/__snapshots__/monitor_ssl_certificate.test.tsx.snap
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/components/monitor/monitor_status_details/__test__/__snapshots__/monitor_ssl_certificate.test.tsx.snap
rename to x-pack/plugins/uptime/public/components/monitor/monitor_status_details/__test__/__snapshots__/monitor_ssl_certificate.test.tsx.snap
diff --git a/x-pack/legacy/plugins/uptime/public/components/monitor/monitor_status_details/__test__/__snapshots__/monitor_status.bar.test.tsx.snap b/x-pack/plugins/uptime/public/components/monitor/monitor_status_details/__test__/__snapshots__/monitor_status.bar.test.tsx.snap
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/components/monitor/monitor_status_details/__test__/__snapshots__/monitor_status.bar.test.tsx.snap
rename to x-pack/plugins/uptime/public/components/monitor/monitor_status_details/__test__/__snapshots__/monitor_status.bar.test.tsx.snap
diff --git a/x-pack/legacy/plugins/uptime/public/components/monitor/monitor_status_details/__test__/__snapshots__/status_by_location.test.tsx.snap b/x-pack/plugins/uptime/public/components/monitor/monitor_status_details/__test__/__snapshots__/status_by_location.test.tsx.snap
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/components/monitor/monitor_status_details/__test__/__snapshots__/status_by_location.test.tsx.snap
rename to x-pack/plugins/uptime/public/components/monitor/monitor_status_details/__test__/__snapshots__/status_by_location.test.tsx.snap
diff --git a/x-pack/legacy/plugins/uptime/public/components/monitor/monitor_status_details/__test__/monitor_ssl_certificate.test.tsx b/x-pack/plugins/uptime/public/components/monitor/monitor_status_details/__test__/monitor_ssl_certificate.test.tsx
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/components/monitor/monitor_status_details/__test__/monitor_ssl_certificate.test.tsx
rename to x-pack/plugins/uptime/public/components/monitor/monitor_status_details/__test__/monitor_ssl_certificate.test.tsx
diff --git a/x-pack/legacy/plugins/uptime/public/components/monitor/monitor_status_details/__test__/monitor_status.bar.test.tsx b/x-pack/plugins/uptime/public/components/monitor/monitor_status_details/__test__/monitor_status.bar.test.tsx
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/components/monitor/monitor_status_details/__test__/monitor_status.bar.test.tsx
rename to x-pack/plugins/uptime/public/components/monitor/monitor_status_details/__test__/monitor_status.bar.test.tsx
diff --git a/x-pack/legacy/plugins/uptime/public/components/monitor/monitor_status_details/__test__/status_by_location.test.tsx b/x-pack/plugins/uptime/public/components/monitor/monitor_status_details/__test__/status_by_location.test.tsx
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/components/monitor/monitor_status_details/__test__/status_by_location.test.tsx
rename to x-pack/plugins/uptime/public/components/monitor/monitor_status_details/__test__/status_by_location.test.tsx
diff --git a/x-pack/legacy/plugins/uptime/public/components/monitor/monitor_status_details/index.ts b/x-pack/plugins/uptime/public/components/monitor/monitor_status_details/index.ts
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/components/monitor/monitor_status_details/index.ts
rename to x-pack/plugins/uptime/public/components/monitor/monitor_status_details/index.ts
diff --git a/x-pack/legacy/plugins/uptime/public/components/monitor/monitor_status_details/monitor_status_bar/index.ts b/x-pack/plugins/uptime/public/components/monitor/monitor_status_details/monitor_status_bar/index.ts
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/components/monitor/monitor_status_details/monitor_status_bar/index.ts
rename to x-pack/plugins/uptime/public/components/monitor/monitor_status_details/monitor_status_bar/index.ts
diff --git a/x-pack/legacy/plugins/uptime/public/components/monitor/monitor_status_details/monitor_status_bar/ssl_certificate.tsx b/x-pack/plugins/uptime/public/components/monitor/monitor_status_details/monitor_status_bar/ssl_certificate.tsx
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/components/monitor/monitor_status_details/monitor_status_bar/ssl_certificate.tsx
rename to x-pack/plugins/uptime/public/components/monitor/monitor_status_details/monitor_status_bar/ssl_certificate.tsx
diff --git a/x-pack/legacy/plugins/uptime/public/components/monitor/monitor_status_details/monitor_status_bar/status_bar.tsx b/x-pack/plugins/uptime/public/components/monitor/monitor_status_details/monitor_status_bar/status_bar.tsx
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/components/monitor/monitor_status_details/monitor_status_bar/status_bar.tsx
rename to x-pack/plugins/uptime/public/components/monitor/monitor_status_details/monitor_status_bar/status_bar.tsx
diff --git a/x-pack/legacy/plugins/uptime/public/components/monitor/monitor_status_details/monitor_status_bar/status_bar_container.tsx b/x-pack/plugins/uptime/public/components/monitor/monitor_status_details/monitor_status_bar/status_bar_container.tsx
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/components/monitor/monitor_status_details/monitor_status_bar/status_bar_container.tsx
rename to x-pack/plugins/uptime/public/components/monitor/monitor_status_details/monitor_status_bar/status_bar_container.tsx
diff --git a/x-pack/legacy/plugins/uptime/public/components/monitor/monitor_status_details/monitor_status_bar/status_by_location.tsx b/x-pack/plugins/uptime/public/components/monitor/monitor_status_details/monitor_status_bar/status_by_location.tsx
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/components/monitor/monitor_status_details/monitor_status_bar/status_by_location.tsx
rename to x-pack/plugins/uptime/public/components/monitor/monitor_status_details/monitor_status_bar/status_by_location.tsx
diff --git a/x-pack/legacy/plugins/uptime/public/components/monitor/monitor_status_details/monitor_status_bar/translations.ts b/x-pack/plugins/uptime/public/components/monitor/monitor_status_details/monitor_status_bar/translations.ts
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/components/monitor/monitor_status_details/monitor_status_bar/translations.ts
rename to x-pack/plugins/uptime/public/components/monitor/monitor_status_details/monitor_status_bar/translations.ts
diff --git a/x-pack/legacy/plugins/uptime/public/components/monitor/monitor_status_details/status_details.tsx b/x-pack/plugins/uptime/public/components/monitor/monitor_status_details/status_details.tsx
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/components/monitor/monitor_status_details/status_details.tsx
rename to x-pack/plugins/uptime/public/components/monitor/monitor_status_details/status_details.tsx
diff --git a/x-pack/legacy/plugins/uptime/public/components/monitor/monitor_status_details/status_details_container.tsx b/x-pack/plugins/uptime/public/components/monitor/monitor_status_details/status_details_container.tsx
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/components/monitor/monitor_status_details/status_details_container.tsx
rename to x-pack/plugins/uptime/public/components/monitor/monitor_status_details/status_details_container.tsx
diff --git a/x-pack/legacy/plugins/uptime/public/components/monitor/monitor_status_details/translations.ts b/x-pack/plugins/uptime/public/components/monitor/monitor_status_details/translations.ts
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/components/monitor/monitor_status_details/translations.ts
rename to x-pack/plugins/uptime/public/components/monitor/monitor_status_details/translations.ts
diff --git a/x-pack/legacy/plugins/uptime/public/components/monitor/ping_histogram/index.ts b/x-pack/plugins/uptime/public/components/monitor/ping_histogram/index.ts
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/components/monitor/ping_histogram/index.ts
rename to x-pack/plugins/uptime/public/components/monitor/ping_histogram/index.ts
diff --git a/x-pack/legacy/plugins/uptime/public/components/monitor/ping_histogram/ping_histogram_container.tsx b/x-pack/plugins/uptime/public/components/monitor/ping_histogram/ping_histogram_container.tsx
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/components/monitor/ping_histogram/ping_histogram_container.tsx
rename to x-pack/plugins/uptime/public/components/monitor/ping_histogram/ping_histogram_container.tsx
diff --git a/x-pack/legacy/plugins/uptime/public/components/monitor/ping_list/__tests__/__snapshots__/doc_link_body.test.tsx.snap b/x-pack/plugins/uptime/public/components/monitor/ping_list/__tests__/__snapshots__/doc_link_body.test.tsx.snap
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/components/monitor/ping_list/__tests__/__snapshots__/doc_link_body.test.tsx.snap
rename to x-pack/plugins/uptime/public/components/monitor/ping_list/__tests__/__snapshots__/doc_link_body.test.tsx.snap
diff --git a/x-pack/legacy/plugins/uptime/public/components/monitor/ping_list/__tests__/__snapshots__/expanded_row.test.tsx.snap b/x-pack/plugins/uptime/public/components/monitor/ping_list/__tests__/__snapshots__/expanded_row.test.tsx.snap
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/components/monitor/ping_list/__tests__/__snapshots__/expanded_row.test.tsx.snap
rename to x-pack/plugins/uptime/public/components/monitor/ping_list/__tests__/__snapshots__/expanded_row.test.tsx.snap
diff --git a/x-pack/legacy/plugins/uptime/public/components/monitor/ping_list/__tests__/__snapshots__/ping_list.test.tsx.snap b/x-pack/plugins/uptime/public/components/monitor/ping_list/__tests__/__snapshots__/ping_list.test.tsx.snap
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/components/monitor/ping_list/__tests__/__snapshots__/ping_list.test.tsx.snap
rename to x-pack/plugins/uptime/public/components/monitor/ping_list/__tests__/__snapshots__/ping_list.test.tsx.snap
diff --git a/x-pack/legacy/plugins/uptime/public/components/monitor/ping_list/__tests__/doc_link_body.test.tsx b/x-pack/plugins/uptime/public/components/monitor/ping_list/__tests__/doc_link_body.test.tsx
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/components/monitor/ping_list/__tests__/doc_link_body.test.tsx
rename to x-pack/plugins/uptime/public/components/monitor/ping_list/__tests__/doc_link_body.test.tsx
diff --git a/x-pack/legacy/plugins/uptime/public/components/monitor/ping_list/__tests__/expanded_row.test.tsx b/x-pack/plugins/uptime/public/components/monitor/ping_list/__tests__/expanded_row.test.tsx
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/components/monitor/ping_list/__tests__/expanded_row.test.tsx
rename to x-pack/plugins/uptime/public/components/monitor/ping_list/__tests__/expanded_row.test.tsx
diff --git a/x-pack/legacy/plugins/uptime/public/components/monitor/ping_list/__tests__/ping_list.test.tsx b/x-pack/plugins/uptime/public/components/monitor/ping_list/__tests__/ping_list.test.tsx
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/components/monitor/ping_list/__tests__/ping_list.test.tsx
rename to x-pack/plugins/uptime/public/components/monitor/ping_list/__tests__/ping_list.test.tsx
diff --git a/x-pack/legacy/plugins/uptime/public/components/monitor/ping_list/doc_link_body.tsx b/x-pack/plugins/uptime/public/components/monitor/ping_list/doc_link_body.tsx
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/components/monitor/ping_list/doc_link_body.tsx
rename to x-pack/plugins/uptime/public/components/monitor/ping_list/doc_link_body.tsx
diff --git a/x-pack/legacy/plugins/uptime/public/components/monitor/ping_list/expanded_row.tsx b/x-pack/plugins/uptime/public/components/monitor/ping_list/expanded_row.tsx
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/components/monitor/ping_list/expanded_row.tsx
rename to x-pack/plugins/uptime/public/components/monitor/ping_list/expanded_row.tsx
diff --git a/x-pack/legacy/plugins/uptime/public/components/monitor/ping_list/index.tsx b/x-pack/plugins/uptime/public/components/monitor/ping_list/index.tsx
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/components/monitor/ping_list/index.tsx
rename to x-pack/plugins/uptime/public/components/monitor/ping_list/index.tsx
diff --git a/x-pack/legacy/plugins/uptime/public/components/monitor/ping_list/location_name.tsx b/x-pack/plugins/uptime/public/components/monitor/ping_list/location_name.tsx
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/components/monitor/ping_list/location_name.tsx
rename to x-pack/plugins/uptime/public/components/monitor/ping_list/location_name.tsx
diff --git a/x-pack/legacy/plugins/uptime/public/components/monitor/ping_list/ping_list.tsx b/x-pack/plugins/uptime/public/components/monitor/ping_list/ping_list.tsx
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/components/monitor/ping_list/ping_list.tsx
rename to x-pack/plugins/uptime/public/components/monitor/ping_list/ping_list.tsx
diff --git a/x-pack/legacy/plugins/uptime/public/components/monitor/ping_list/ping_list_container.tsx b/x-pack/plugins/uptime/public/components/monitor/ping_list/ping_list_container.tsx
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/components/monitor/ping_list/ping_list_container.tsx
rename to x-pack/plugins/uptime/public/components/monitor/ping_list/ping_list_container.tsx
diff --git a/x-pack/legacy/plugins/uptime/public/components/overview/__tests__/__snapshots__/parsing_error_callout.test.tsx.snap b/x-pack/plugins/uptime/public/components/overview/__tests__/__snapshots__/parsing_error_callout.test.tsx.snap
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/components/overview/__tests__/__snapshots__/parsing_error_callout.test.tsx.snap
rename to x-pack/plugins/uptime/public/components/overview/__tests__/__snapshots__/parsing_error_callout.test.tsx.snap
diff --git a/x-pack/legacy/plugins/uptime/public/components/overview/__tests__/__snapshots__/snapshot.test.tsx.snap b/x-pack/plugins/uptime/public/components/overview/__tests__/__snapshots__/snapshot.test.tsx.snap
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/components/overview/__tests__/__snapshots__/snapshot.test.tsx.snap
rename to x-pack/plugins/uptime/public/components/overview/__tests__/__snapshots__/snapshot.test.tsx.snap
diff --git a/x-pack/legacy/plugins/uptime/public/components/overview/__tests__/__snapshots__/snapshot_heading.test.tsx.snap b/x-pack/plugins/uptime/public/components/overview/__tests__/__snapshots__/snapshot_heading.test.tsx.snap
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/components/overview/__tests__/__snapshots__/snapshot_heading.test.tsx.snap
rename to x-pack/plugins/uptime/public/components/overview/__tests__/__snapshots__/snapshot_heading.test.tsx.snap
diff --git a/x-pack/legacy/plugins/uptime/public/components/overview/__tests__/parsing_error_callout.test.tsx b/x-pack/plugins/uptime/public/components/overview/__tests__/parsing_error_callout.test.tsx
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/components/overview/__tests__/parsing_error_callout.test.tsx
rename to x-pack/plugins/uptime/public/components/overview/__tests__/parsing_error_callout.test.tsx
diff --git a/x-pack/legacy/plugins/uptime/public/components/overview/__tests__/snapshot.test.tsx b/x-pack/plugins/uptime/public/components/overview/__tests__/snapshot.test.tsx
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/components/overview/__tests__/snapshot.test.tsx
rename to x-pack/plugins/uptime/public/components/overview/__tests__/snapshot.test.tsx
diff --git a/x-pack/legacy/plugins/uptime/public/components/overview/__tests__/snapshot_heading.test.tsx b/x-pack/plugins/uptime/public/components/overview/__tests__/snapshot_heading.test.tsx
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/components/overview/__tests__/snapshot_heading.test.tsx
rename to x-pack/plugins/uptime/public/components/overview/__tests__/snapshot_heading.test.tsx
diff --git a/x-pack/legacy/plugins/uptime/public/components/overview/alerts/__tests__/alert_monitor_status.test.tsx b/x-pack/plugins/uptime/public/components/overview/alerts/__tests__/alert_monitor_status.test.tsx
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/components/overview/alerts/__tests__/alert_monitor_status.test.tsx
rename to x-pack/plugins/uptime/public/components/overview/alerts/__tests__/alert_monitor_status.test.tsx
diff --git a/x-pack/legacy/plugins/uptime/public/components/overview/alerts/alert_monitor_status.tsx b/x-pack/plugins/uptime/public/components/overview/alerts/alert_monitor_status.tsx
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/components/overview/alerts/alert_monitor_status.tsx
rename to x-pack/plugins/uptime/public/components/overview/alerts/alert_monitor_status.tsx
diff --git a/x-pack/legacy/plugins/uptime/public/components/overview/alerts/alerts_containers/alert_monitor_status.tsx b/x-pack/plugins/uptime/public/components/overview/alerts/alerts_containers/alert_monitor_status.tsx
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/components/overview/alerts/alerts_containers/alert_monitor_status.tsx
rename to x-pack/plugins/uptime/public/components/overview/alerts/alerts_containers/alert_monitor_status.tsx
diff --git a/x-pack/legacy/plugins/uptime/public/components/overview/alerts/alerts_containers/index.ts b/x-pack/plugins/uptime/public/components/overview/alerts/alerts_containers/index.ts
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/components/overview/alerts/alerts_containers/index.ts
rename to x-pack/plugins/uptime/public/components/overview/alerts/alerts_containers/index.ts
diff --git a/x-pack/legacy/plugins/uptime/public/components/overview/alerts/alerts_containers/toggle_alert_flyout_button.tsx b/x-pack/plugins/uptime/public/components/overview/alerts/alerts_containers/toggle_alert_flyout_button.tsx
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/components/overview/alerts/alerts_containers/toggle_alert_flyout_button.tsx
rename to x-pack/plugins/uptime/public/components/overview/alerts/alerts_containers/toggle_alert_flyout_button.tsx
diff --git a/x-pack/legacy/plugins/uptime/public/components/overview/alerts/alerts_containers/uptime_alerts_flyout_wrapper.tsx b/x-pack/plugins/uptime/public/components/overview/alerts/alerts_containers/uptime_alerts_flyout_wrapper.tsx
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/components/overview/alerts/alerts_containers/uptime_alerts_flyout_wrapper.tsx
rename to x-pack/plugins/uptime/public/components/overview/alerts/alerts_containers/uptime_alerts_flyout_wrapper.tsx
diff --git a/x-pack/legacy/plugins/uptime/public/components/overview/alerts/index.ts b/x-pack/plugins/uptime/public/components/overview/alerts/index.ts
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/components/overview/alerts/index.ts
rename to x-pack/plugins/uptime/public/components/overview/alerts/index.ts
diff --git a/x-pack/legacy/plugins/uptime/public/components/overview/alerts/toggle_alert_flyout_button.tsx b/x-pack/plugins/uptime/public/components/overview/alerts/toggle_alert_flyout_button.tsx
similarity index 97%
rename from x-pack/legacy/plugins/uptime/public/components/overview/alerts/toggle_alert_flyout_button.tsx
rename to x-pack/plugins/uptime/public/components/overview/alerts/toggle_alert_flyout_button.tsx
index 04dfe4b3e3509..92fc015a276d3 100644
--- a/x-pack/legacy/plugins/uptime/public/components/overview/alerts/toggle_alert_flyout_button.tsx
+++ b/x-pack/plugins/uptime/public/components/overview/alerts/toggle_alert_flyout_button.tsx
@@ -8,7 +8,7 @@ import { EuiButtonEmpty, EuiContextMenuItem, EuiContextMenuPanel, EuiPopover } f
import React, { useState } from 'react';
import { FormattedMessage } from '@kbn/i18n/react';
import { i18n } from '@kbn/i18n';
-import { useKibana } from '../../../../../../../../src/plugins/kibana_react/public';
+import { useKibana } from '../../../../../../../src/plugins/kibana_react/public';
interface Props {
setAlertFlyoutVisible: (value: boolean) => void;
diff --git a/x-pack/legacy/plugins/uptime/public/components/overview/alerts/uptime_alerts_context_provider.tsx b/x-pack/plugins/uptime/public/components/overview/alerts/uptime_alerts_context_provider.tsx
similarity index 83%
rename from x-pack/legacy/plugins/uptime/public/components/overview/alerts/uptime_alerts_context_provider.tsx
rename to x-pack/plugins/uptime/public/components/overview/alerts/uptime_alerts_context_provider.tsx
index 09e6dc72b7f98..262e1552e3660 100644
--- a/x-pack/legacy/plugins/uptime/public/components/overview/alerts/uptime_alerts_context_provider.tsx
+++ b/x-pack/plugins/uptime/public/components/overview/alerts/uptime_alerts_context_provider.tsx
@@ -5,8 +5,8 @@
*/
import React from 'react';
-import { AlertsContextProvider } from '../../../../../../../plugins/triggers_actions_ui/public';
-import { useKibana } from '../../../../../../../../src/plugins/kibana_react/public';
+import { AlertsContextProvider } from '../../../../../../plugins/triggers_actions_ui/public';
+import { useKibana } from '../../../../../../../src/plugins/kibana_react/public';
export const UptimeAlertsContextProvider: React.FC = ({ children }) => {
const {
diff --git a/x-pack/legacy/plugins/uptime/public/components/overview/alerts/uptime_alerts_flyout_wrapper.tsx b/x-pack/plugins/uptime/public/components/overview/alerts/uptime_alerts_flyout_wrapper.tsx
similarity index 90%
rename from x-pack/legacy/plugins/uptime/public/components/overview/alerts/uptime_alerts_flyout_wrapper.tsx
rename to x-pack/plugins/uptime/public/components/overview/alerts/uptime_alerts_flyout_wrapper.tsx
index 13705e7d19293..9b1d3a73dc661 100644
--- a/x-pack/legacy/plugins/uptime/public/components/overview/alerts/uptime_alerts_flyout_wrapper.tsx
+++ b/x-pack/plugins/uptime/public/components/overview/alerts/uptime_alerts_flyout_wrapper.tsx
@@ -5,7 +5,7 @@
*/
import React from 'react';
-import { AlertAdd } from '../../../../../../../plugins/triggers_actions_ui/public';
+import { AlertAdd } from '../../../../../../plugins/triggers_actions_ui/public';
interface Props {
alertFlyoutVisible: boolean;
diff --git a/x-pack/legacy/plugins/uptime/public/components/overview/empty_state/__tests__/__snapshots__/data_or_index_missing.test.tsx.snap b/x-pack/plugins/uptime/public/components/overview/empty_state/__tests__/__snapshots__/data_or_index_missing.test.tsx.snap
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/components/overview/empty_state/__tests__/__snapshots__/data_or_index_missing.test.tsx.snap
rename to x-pack/plugins/uptime/public/components/overview/empty_state/__tests__/__snapshots__/data_or_index_missing.test.tsx.snap
diff --git a/x-pack/legacy/plugins/uptime/public/components/overview/empty_state/__tests__/__snapshots__/empty_state.test.tsx.snap b/x-pack/plugins/uptime/public/components/overview/empty_state/__tests__/__snapshots__/empty_state.test.tsx.snap
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/components/overview/empty_state/__tests__/__snapshots__/empty_state.test.tsx.snap
rename to x-pack/plugins/uptime/public/components/overview/empty_state/__tests__/__snapshots__/empty_state.test.tsx.snap
diff --git a/x-pack/legacy/plugins/uptime/public/components/overview/empty_state/__tests__/data_or_index_missing.test.tsx b/x-pack/plugins/uptime/public/components/overview/empty_state/__tests__/data_or_index_missing.test.tsx
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/components/overview/empty_state/__tests__/data_or_index_missing.test.tsx
rename to x-pack/plugins/uptime/public/components/overview/empty_state/__tests__/data_or_index_missing.test.tsx
diff --git a/x-pack/legacy/plugins/uptime/public/components/overview/empty_state/__tests__/empty_state.test.tsx b/x-pack/plugins/uptime/public/components/overview/empty_state/__tests__/empty_state.test.tsx
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/components/overview/empty_state/__tests__/empty_state.test.tsx
rename to x-pack/plugins/uptime/public/components/overview/empty_state/__tests__/empty_state.test.tsx
diff --git a/x-pack/legacy/plugins/uptime/public/components/overview/empty_state/data_or_index_missing.tsx b/x-pack/plugins/uptime/public/components/overview/empty_state/data_or_index_missing.tsx
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/components/overview/empty_state/data_or_index_missing.tsx
rename to x-pack/plugins/uptime/public/components/overview/empty_state/data_or_index_missing.tsx
diff --git a/x-pack/legacy/plugins/uptime/public/components/overview/empty_state/empty_state.tsx b/x-pack/plugins/uptime/public/components/overview/empty_state/empty_state.tsx
similarity index 96%
rename from x-pack/legacy/plugins/uptime/public/components/overview/empty_state/empty_state.tsx
rename to x-pack/plugins/uptime/public/components/overview/empty_state/empty_state.tsx
index 651103a34bf21..d38f203739cea 100644
--- a/x-pack/legacy/plugins/uptime/public/components/overview/empty_state/empty_state.tsx
+++ b/x-pack/plugins/uptime/public/components/overview/empty_state/empty_state.tsx
@@ -10,7 +10,7 @@ import { EmptyStateError } from './empty_state_error';
import { EmptyStateLoading } from './empty_state_loading';
import { DataOrIndexMissing } from './data_or_index_missing';
import { DynamicSettings, StatesIndexStatus } from '../../../../common/runtime_types';
-import { IHttpFetchError } from '../../../../../../../../target/types/core/public/http';
+import { IHttpFetchError } from '../../../../../../../target/types/core/public/http';
interface EmptyStateProps {
children: JSX.Element[] | JSX.Element;
diff --git a/x-pack/legacy/plugins/uptime/public/components/overview/empty_state/empty_state_container.tsx b/x-pack/plugins/uptime/public/components/overview/empty_state/empty_state_container.tsx
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/components/overview/empty_state/empty_state_container.tsx
rename to x-pack/plugins/uptime/public/components/overview/empty_state/empty_state_container.tsx
diff --git a/x-pack/legacy/plugins/uptime/public/components/overview/empty_state/empty_state_error.tsx b/x-pack/plugins/uptime/public/components/overview/empty_state/empty_state_error.tsx
similarity index 95%
rename from x-pack/legacy/plugins/uptime/public/components/overview/empty_state/empty_state_error.tsx
rename to x-pack/plugins/uptime/public/components/overview/empty_state/empty_state_error.tsx
index 1135b969018a1..aa4040e319e0f 100644
--- a/x-pack/legacy/plugins/uptime/public/components/overview/empty_state/empty_state_error.tsx
+++ b/x-pack/plugins/uptime/public/components/overview/empty_state/empty_state_error.tsx
@@ -7,7 +7,7 @@
import { EuiEmptyPrompt, EuiPanel, EuiTitle, EuiFlexGroup, EuiFlexItem } from '@elastic/eui';
import { i18n } from '@kbn/i18n';
import React, { Fragment } from 'react';
-import { IHttpFetchError } from '../../../../../../../../target/types/core/public/http';
+import { IHttpFetchError } from '../../../../../../../target/types/core/public/http';
interface EmptyStateErrorProps {
errors: IHttpFetchError[];
diff --git a/x-pack/legacy/plugins/uptime/public/components/overview/empty_state/empty_state_loading.tsx b/x-pack/plugins/uptime/public/components/overview/empty_state/empty_state_loading.tsx
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/components/overview/empty_state/empty_state_loading.tsx
rename to x-pack/plugins/uptime/public/components/overview/empty_state/empty_state_loading.tsx
diff --git a/x-pack/legacy/plugins/uptime/public/components/overview/empty_state/index.ts b/x-pack/plugins/uptime/public/components/overview/empty_state/index.ts
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/components/overview/empty_state/index.ts
rename to x-pack/plugins/uptime/public/components/overview/empty_state/index.ts
diff --git a/x-pack/legacy/plugins/uptime/public/components/overview/filter_group/__tests__/__snapshots__/filter_popover.test.tsx.snap b/x-pack/plugins/uptime/public/components/overview/filter_group/__tests__/__snapshots__/filter_popover.test.tsx.snap
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/components/overview/filter_group/__tests__/__snapshots__/filter_popover.test.tsx.snap
rename to x-pack/plugins/uptime/public/components/overview/filter_group/__tests__/__snapshots__/filter_popover.test.tsx.snap
diff --git a/x-pack/legacy/plugins/uptime/public/components/overview/filter_group/__tests__/__snapshots__/filter_status_button.test.tsx.snap b/x-pack/plugins/uptime/public/components/overview/filter_group/__tests__/__snapshots__/filter_status_button.test.tsx.snap
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/components/overview/filter_group/__tests__/__snapshots__/filter_status_button.test.tsx.snap
rename to x-pack/plugins/uptime/public/components/overview/filter_group/__tests__/__snapshots__/filter_status_button.test.tsx.snap
diff --git a/x-pack/legacy/plugins/uptime/public/components/overview/filter_group/__tests__/__snapshots__/parse_filter_map.test.ts.snap b/x-pack/plugins/uptime/public/components/overview/filter_group/__tests__/__snapshots__/parse_filter_map.test.ts.snap
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/components/overview/filter_group/__tests__/__snapshots__/parse_filter_map.test.ts.snap
rename to x-pack/plugins/uptime/public/components/overview/filter_group/__tests__/__snapshots__/parse_filter_map.test.ts.snap
diff --git a/x-pack/legacy/plugins/uptime/public/components/overview/filter_group/__tests__/filter_popover.test.tsx b/x-pack/plugins/uptime/public/components/overview/filter_group/__tests__/filter_popover.test.tsx
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/components/overview/filter_group/__tests__/filter_popover.test.tsx
rename to x-pack/plugins/uptime/public/components/overview/filter_group/__tests__/filter_popover.test.tsx
diff --git a/x-pack/legacy/plugins/uptime/public/components/overview/filter_group/__tests__/filter_status_button.test.tsx b/x-pack/plugins/uptime/public/components/overview/filter_group/__tests__/filter_status_button.test.tsx
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/components/overview/filter_group/__tests__/filter_status_button.test.tsx
rename to x-pack/plugins/uptime/public/components/overview/filter_group/__tests__/filter_status_button.test.tsx
diff --git a/x-pack/legacy/plugins/uptime/public/components/overview/filter_group/__tests__/parse_filter_map.test.ts b/x-pack/plugins/uptime/public/components/overview/filter_group/__tests__/parse_filter_map.test.ts
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/components/overview/filter_group/__tests__/parse_filter_map.test.ts
rename to x-pack/plugins/uptime/public/components/overview/filter_group/__tests__/parse_filter_map.test.ts
diff --git a/x-pack/legacy/plugins/uptime/public/components/overview/filter_group/__tests__/toggle_selected_item.test.ts b/x-pack/plugins/uptime/public/components/overview/filter_group/__tests__/toggle_selected_item.test.ts
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/components/overview/filter_group/__tests__/toggle_selected_item.test.ts
rename to x-pack/plugins/uptime/public/components/overview/filter_group/__tests__/toggle_selected_item.test.ts
diff --git a/x-pack/legacy/plugins/uptime/public/components/overview/filter_group/filter_group.tsx b/x-pack/plugins/uptime/public/components/overview/filter_group/filter_group.tsx
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/components/overview/filter_group/filter_group.tsx
rename to x-pack/plugins/uptime/public/components/overview/filter_group/filter_group.tsx
diff --git a/x-pack/legacy/plugins/uptime/public/components/overview/filter_group/filter_group_container.tsx b/x-pack/plugins/uptime/public/components/overview/filter_group/filter_group_container.tsx
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/components/overview/filter_group/filter_group_container.tsx
rename to x-pack/plugins/uptime/public/components/overview/filter_group/filter_group_container.tsx
diff --git a/x-pack/legacy/plugins/uptime/public/components/overview/filter_group/filter_popover.tsx b/x-pack/plugins/uptime/public/components/overview/filter_group/filter_popover.tsx
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/components/overview/filter_group/filter_popover.tsx
rename to x-pack/plugins/uptime/public/components/overview/filter_group/filter_popover.tsx
diff --git a/x-pack/legacy/plugins/uptime/public/components/overview/filter_group/filter_status_button.tsx b/x-pack/plugins/uptime/public/components/overview/filter_group/filter_status_button.tsx
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/components/overview/filter_group/filter_status_button.tsx
rename to x-pack/plugins/uptime/public/components/overview/filter_group/filter_status_button.tsx
diff --git a/x-pack/legacy/plugins/uptime/public/components/overview/filter_group/index.ts b/x-pack/plugins/uptime/public/components/overview/filter_group/index.ts
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/components/overview/filter_group/index.ts
rename to x-pack/plugins/uptime/public/components/overview/filter_group/index.ts
diff --git a/x-pack/legacy/plugins/uptime/public/components/overview/filter_group/parse_filter_map.ts b/x-pack/plugins/uptime/public/components/overview/filter_group/parse_filter_map.ts
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/components/overview/filter_group/parse_filter_map.ts
rename to x-pack/plugins/uptime/public/components/overview/filter_group/parse_filter_map.ts
diff --git a/x-pack/legacy/plugins/uptime/public/components/overview/filter_group/toggle_selected_item.ts b/x-pack/plugins/uptime/public/components/overview/filter_group/toggle_selected_item.ts
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/components/overview/filter_group/toggle_selected_item.ts
rename to x-pack/plugins/uptime/public/components/overview/filter_group/toggle_selected_item.ts
diff --git a/x-pack/legacy/plugins/uptime/public/components/overview/filter_group/uptime_filter_button.tsx b/x-pack/plugins/uptime/public/components/overview/filter_group/uptime_filter_button.tsx
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/components/overview/filter_group/uptime_filter_button.tsx
rename to x-pack/plugins/uptime/public/components/overview/filter_group/uptime_filter_button.tsx
diff --git a/x-pack/legacy/plugins/uptime/public/components/overview/index.ts b/x-pack/plugins/uptime/public/components/overview/index.ts
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/components/overview/index.ts
rename to x-pack/plugins/uptime/public/components/overview/index.ts
diff --git a/x-pack/legacy/plugins/uptime/public/components/overview/kuery_bar/index.ts b/x-pack/plugins/uptime/public/components/overview/kuery_bar/index.ts
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/components/overview/kuery_bar/index.ts
rename to x-pack/plugins/uptime/public/components/overview/kuery_bar/index.ts
diff --git a/x-pack/legacy/plugins/uptime/public/components/overview/kuery_bar/kuery_bar.tsx b/x-pack/plugins/uptime/public/components/overview/kuery_bar/kuery_bar.tsx
similarity index 98%
rename from x-pack/legacy/plugins/uptime/public/components/overview/kuery_bar/kuery_bar.tsx
rename to x-pack/plugins/uptime/public/components/overview/kuery_bar/kuery_bar.tsx
index 63aceed2be636..792fff4c7cdca 100644
--- a/x-pack/legacy/plugins/uptime/public/components/overview/kuery_bar/kuery_bar.tsx
+++ b/x-pack/plugins/uptime/public/components/overview/kuery_bar/kuery_bar.tsx
@@ -16,7 +16,7 @@ import {
IIndexPattern,
QuerySuggestion,
DataPublicPluginSetup,
-} from '../../../../../../../../src/plugins/data/public';
+} from '../../../../../../../src/plugins/data/public';
const Container = styled.div`
margin-bottom: 10px;
diff --git a/x-pack/legacy/plugins/uptime/public/components/overview/kuery_bar/kuery_bar_container.tsx b/x-pack/plugins/uptime/public/components/overview/kuery_bar/kuery_bar_container.tsx
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/components/overview/kuery_bar/kuery_bar_container.tsx
rename to x-pack/plugins/uptime/public/components/overview/kuery_bar/kuery_bar_container.tsx
diff --git a/x-pack/legacy/plugins/uptime/public/components/overview/kuery_bar/typeahead/click_outside.js b/x-pack/plugins/uptime/public/components/overview/kuery_bar/typeahead/click_outside.js
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/components/overview/kuery_bar/typeahead/click_outside.js
rename to x-pack/plugins/uptime/public/components/overview/kuery_bar/typeahead/click_outside.js
diff --git a/x-pack/legacy/plugins/uptime/public/components/overview/kuery_bar/typeahead/index.d.ts b/x-pack/plugins/uptime/public/components/overview/kuery_bar/typeahead/index.d.ts
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/components/overview/kuery_bar/typeahead/index.d.ts
rename to x-pack/plugins/uptime/public/components/overview/kuery_bar/typeahead/index.d.ts
diff --git a/x-pack/legacy/plugins/uptime/public/components/overview/kuery_bar/typeahead/index.js b/x-pack/plugins/uptime/public/components/overview/kuery_bar/typeahead/index.js
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/components/overview/kuery_bar/typeahead/index.js
rename to x-pack/plugins/uptime/public/components/overview/kuery_bar/typeahead/index.js
diff --git a/x-pack/legacy/plugins/uptime/public/components/overview/kuery_bar/typeahead/suggestion.js b/x-pack/plugins/uptime/public/components/overview/kuery_bar/typeahead/suggestion.js
similarity index 97%
rename from x-pack/legacy/plugins/uptime/public/components/overview/kuery_bar/typeahead/suggestion.js
rename to x-pack/plugins/uptime/public/components/overview/kuery_bar/typeahead/suggestion.js
index 2b5ad9b59e39f..936eae04ffa64 100644
--- a/x-pack/legacy/plugins/uptime/public/components/overview/kuery_bar/typeahead/suggestion.js
+++ b/x-pack/plugins/uptime/public/components/overview/kuery_bar/typeahead/suggestion.js
@@ -14,7 +14,7 @@ import {
units,
fontSizes,
unit,
-} from '../../../../../../apm/public/style/variables';
+} from '../../../../../../../legacy/plugins/apm/public/style/variables';
import { tint } from 'polished';
import theme from '@elastic/eui/dist/eui_theme_light.json';
diff --git a/x-pack/legacy/plugins/uptime/public/components/overview/kuery_bar/typeahead/suggestions.js b/x-pack/plugins/uptime/public/components/overview/kuery_bar/typeahead/suggestions.js
similarity index 95%
rename from x-pack/legacy/plugins/uptime/public/components/overview/kuery_bar/typeahead/suggestions.js
rename to x-pack/plugins/uptime/public/components/overview/kuery_bar/typeahead/suggestions.js
index 7fbabe71bcdb5..ac6832050b9d3 100644
--- a/x-pack/legacy/plugins/uptime/public/components/overview/kuery_bar/typeahead/suggestions.js
+++ b/x-pack/plugins/uptime/public/components/overview/kuery_bar/typeahead/suggestions.js
@@ -9,7 +9,7 @@ import PropTypes from 'prop-types';
import styled from 'styled-components';
import { isEmpty } from 'lodash';
import Suggestion from './suggestion';
-import { units, px, unit } from '../../../../../../apm/public/style/variables';
+import { units, px, unit } from '../../../../../../../legacy/plugins/apm/public/style/variables';
import { tint } from 'polished';
import theme from '@elastic/eui/dist/eui_theme_light.json';
diff --git a/x-pack/legacy/plugins/uptime/public/components/overview/monitor_list/__tests__/__snapshots__/monitor_list.test.tsx.snap b/x-pack/plugins/uptime/public/components/overview/monitor_list/__tests__/__snapshots__/monitor_list.test.tsx.snap
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/components/overview/monitor_list/__tests__/__snapshots__/monitor_list.test.tsx.snap
rename to x-pack/plugins/uptime/public/components/overview/monitor_list/__tests__/__snapshots__/monitor_list.test.tsx.snap
diff --git a/x-pack/legacy/plugins/uptime/public/components/overview/monitor_list/__tests__/__snapshots__/monitor_list_status_column.test.tsx.snap b/x-pack/plugins/uptime/public/components/overview/monitor_list/__tests__/__snapshots__/monitor_list_status_column.test.tsx.snap
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/components/overview/monitor_list/__tests__/__snapshots__/monitor_list_status_column.test.tsx.snap
rename to x-pack/plugins/uptime/public/components/overview/monitor_list/__tests__/__snapshots__/monitor_list_status_column.test.tsx.snap
diff --git a/x-pack/legacy/plugins/uptime/public/components/overview/monitor_list/__tests__/__snapshots__/monitor_page_link.test.tsx.snap b/x-pack/plugins/uptime/public/components/overview/monitor_list/__tests__/__snapshots__/monitor_page_link.test.tsx.snap
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/components/overview/monitor_list/__tests__/__snapshots__/monitor_page_link.test.tsx.snap
rename to x-pack/plugins/uptime/public/components/overview/monitor_list/__tests__/__snapshots__/monitor_page_link.test.tsx.snap
diff --git a/x-pack/legacy/plugins/uptime/public/components/overview/monitor_list/__tests__/monitor_list.test.tsx b/x-pack/plugins/uptime/public/components/overview/monitor_list/__tests__/monitor_list.test.tsx
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/components/overview/monitor_list/__tests__/monitor_list.test.tsx
rename to x-pack/plugins/uptime/public/components/overview/monitor_list/__tests__/monitor_list.test.tsx
diff --git a/x-pack/legacy/plugins/uptime/public/components/overview/monitor_list/__tests__/monitor_list_page_size_select.test.tsx b/x-pack/plugins/uptime/public/components/overview/monitor_list/__tests__/monitor_list_page_size_select.test.tsx
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/components/overview/monitor_list/__tests__/monitor_list_page_size_select.test.tsx
rename to x-pack/plugins/uptime/public/components/overview/monitor_list/__tests__/monitor_list_page_size_select.test.tsx
diff --git a/x-pack/legacy/plugins/uptime/public/components/overview/monitor_list/__tests__/monitor_list_status_column.test.tsx b/x-pack/plugins/uptime/public/components/overview/monitor_list/__tests__/monitor_list_status_column.test.tsx
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/components/overview/monitor_list/__tests__/monitor_list_status_column.test.tsx
rename to x-pack/plugins/uptime/public/components/overview/monitor_list/__tests__/monitor_list_status_column.test.tsx
diff --git a/x-pack/legacy/plugins/uptime/public/components/overview/monitor_list/__tests__/monitor_page_link.test.tsx b/x-pack/plugins/uptime/public/components/overview/monitor_list/__tests__/monitor_page_link.test.tsx
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/components/overview/monitor_list/__tests__/monitor_page_link.test.tsx
rename to x-pack/plugins/uptime/public/components/overview/monitor_list/__tests__/monitor_page_link.test.tsx
diff --git a/x-pack/legacy/plugins/uptime/public/components/overview/monitor_list/__tests__/parse_timestamp.test.ts b/x-pack/plugins/uptime/public/components/overview/monitor_list/__tests__/parse_timestamp.test.ts
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/components/overview/monitor_list/__tests__/parse_timestamp.test.ts
rename to x-pack/plugins/uptime/public/components/overview/monitor_list/__tests__/parse_timestamp.test.ts
diff --git a/x-pack/legacy/plugins/uptime/public/components/overview/monitor_list/index.ts b/x-pack/plugins/uptime/public/components/overview/monitor_list/index.ts
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/components/overview/monitor_list/index.ts
rename to x-pack/plugins/uptime/public/components/overview/monitor_list/index.ts
diff --git a/x-pack/legacy/plugins/uptime/public/components/overview/monitor_list/monitor_list.tsx b/x-pack/plugins/uptime/public/components/overview/monitor_list/monitor_list.tsx
similarity index 96%
rename from x-pack/legacy/plugins/uptime/public/components/overview/monitor_list/monitor_list.tsx
rename to x-pack/plugins/uptime/public/components/overview/monitor_list/monitor_list.tsx
index 18e2e2437e147..7e9536689470e 100644
--- a/x-pack/legacy/plugins/uptime/public/components/overview/monitor_list/monitor_list.tsx
+++ b/x-pack/plugins/uptime/public/components/overview/monitor_list/monitor_list.tsx
@@ -202,13 +202,7 @@ export const MonitorListComponent: React.FC = ({
itemId="monitor_id"
itemIdToExpandedRowMap={getExpandedRowMap()}
items={items}
- // TODO: not needed without sorting and pagination
- // onChange={onChange}
noItemsMessage={!!filters ? labels.NO_MONITOR_ITEM_SELECTED : labels.NO_DATA_MESSAGE}
- // TODO: reintegrate pagination in future release
- // pagination={pagination}
- // TODO: reintegrate sorting in future release
- // sorting={sorting}
columns={columns}
/>
diff --git a/x-pack/legacy/plugins/uptime/public/components/overview/monitor_list/monitor_list_container.tsx b/x-pack/plugins/uptime/public/components/overview/monitor_list/monitor_list_container.tsx
similarity index 95%
rename from x-pack/legacy/plugins/uptime/public/components/overview/monitor_list/monitor_list_container.tsx
rename to x-pack/plugins/uptime/public/components/overview/monitor_list/monitor_list_container.tsx
index 5bfe6ff0c5b4f..6fb880e28c734 100644
--- a/x-pack/legacy/plugins/uptime/public/components/overview/monitor_list/monitor_list_container.tsx
+++ b/x-pack/plugins/uptime/public/components/overview/monitor_list/monitor_list_container.tsx
@@ -9,7 +9,7 @@ import { useSelector, useDispatch } from 'react-redux';
import { getMonitorList } from '../../../state/actions';
import { FetchMonitorStatesQueryArgs } from '../../../../common/runtime_types';
import { monitorListSelector } from '../../../state/selectors';
-import { MonitorListComponent } from './index';
+import { MonitorListComponent } from './monitor_list';
export interface MonitorListProps {
filters?: string;
diff --git a/x-pack/legacy/plugins/uptime/public/components/overview/monitor_list/monitor_list_drawer/__tests__/__snapshots__/integration_group.test.tsx.snap b/x-pack/plugins/uptime/public/components/overview/monitor_list/monitor_list_drawer/__tests__/__snapshots__/integration_group.test.tsx.snap
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/components/overview/monitor_list/monitor_list_drawer/__tests__/__snapshots__/integration_group.test.tsx.snap
rename to x-pack/plugins/uptime/public/components/overview/monitor_list/monitor_list_drawer/__tests__/__snapshots__/integration_group.test.tsx.snap
diff --git a/x-pack/legacy/plugins/uptime/public/components/overview/monitor_list/monitor_list_drawer/__tests__/__snapshots__/integration_link.test.tsx.snap b/x-pack/plugins/uptime/public/components/overview/monitor_list/monitor_list_drawer/__tests__/__snapshots__/integration_link.test.tsx.snap
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/components/overview/monitor_list/monitor_list_drawer/__tests__/__snapshots__/integration_link.test.tsx.snap
rename to x-pack/plugins/uptime/public/components/overview/monitor_list/monitor_list_drawer/__tests__/__snapshots__/integration_link.test.tsx.snap
diff --git a/x-pack/legacy/plugins/uptime/public/components/overview/monitor_list/monitor_list_drawer/__tests__/__snapshots__/monitor_list_drawer.test.tsx.snap b/x-pack/plugins/uptime/public/components/overview/monitor_list/monitor_list_drawer/__tests__/__snapshots__/monitor_list_drawer.test.tsx.snap
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/components/overview/monitor_list/monitor_list_drawer/__tests__/__snapshots__/monitor_list_drawer.test.tsx.snap
rename to x-pack/plugins/uptime/public/components/overview/monitor_list/monitor_list_drawer/__tests__/__snapshots__/monitor_list_drawer.test.tsx.snap
diff --git a/x-pack/legacy/plugins/uptime/public/components/overview/monitor_list/monitor_list_drawer/__tests__/__snapshots__/monitor_status_list.test.tsx.snap b/x-pack/plugins/uptime/public/components/overview/monitor_list/monitor_list_drawer/__tests__/__snapshots__/monitor_status_list.test.tsx.snap
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/components/overview/monitor_list/monitor_list_drawer/__tests__/__snapshots__/monitor_status_list.test.tsx.snap
rename to x-pack/plugins/uptime/public/components/overview/monitor_list/monitor_list_drawer/__tests__/__snapshots__/monitor_status_list.test.tsx.snap
diff --git a/x-pack/legacy/plugins/uptime/public/components/overview/monitor_list/monitor_list_drawer/__tests__/__snapshots__/monitor_status_row.test.tsx.snap b/x-pack/plugins/uptime/public/components/overview/monitor_list/monitor_list_drawer/__tests__/__snapshots__/monitor_status_row.test.tsx.snap
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/components/overview/monitor_list/monitor_list_drawer/__tests__/__snapshots__/monitor_status_row.test.tsx.snap
rename to x-pack/plugins/uptime/public/components/overview/monitor_list/monitor_list_drawer/__tests__/__snapshots__/monitor_status_row.test.tsx.snap
diff --git a/x-pack/legacy/plugins/uptime/public/components/overview/monitor_list/monitor_list_drawer/__tests__/__snapshots__/most_recent_error.test.tsx.snap b/x-pack/plugins/uptime/public/components/overview/monitor_list/monitor_list_drawer/__tests__/__snapshots__/most_recent_error.test.tsx.snap
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/components/overview/monitor_list/monitor_list_drawer/__tests__/__snapshots__/most_recent_error.test.tsx.snap
rename to x-pack/plugins/uptime/public/components/overview/monitor_list/monitor_list_drawer/__tests__/__snapshots__/most_recent_error.test.tsx.snap
diff --git a/x-pack/legacy/plugins/uptime/public/components/overview/monitor_list/monitor_list_drawer/__tests__/data.json b/x-pack/plugins/uptime/public/components/overview/monitor_list/monitor_list_drawer/__tests__/data.json
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/components/overview/monitor_list/monitor_list_drawer/__tests__/data.json
rename to x-pack/plugins/uptime/public/components/overview/monitor_list/monitor_list_drawer/__tests__/data.json
diff --git a/x-pack/legacy/plugins/uptime/public/components/overview/monitor_list/monitor_list_drawer/__tests__/integration_group.test.tsx b/x-pack/plugins/uptime/public/components/overview/monitor_list/monitor_list_drawer/__tests__/integration_group.test.tsx
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/components/overview/monitor_list/monitor_list_drawer/__tests__/integration_group.test.tsx
rename to x-pack/plugins/uptime/public/components/overview/monitor_list/monitor_list_drawer/__tests__/integration_group.test.tsx
diff --git a/x-pack/legacy/plugins/uptime/public/components/overview/monitor_list/monitor_list_drawer/__tests__/integration_link.test.tsx b/x-pack/plugins/uptime/public/components/overview/monitor_list/monitor_list_drawer/__tests__/integration_link.test.tsx
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/components/overview/monitor_list/monitor_list_drawer/__tests__/integration_link.test.tsx
rename to x-pack/plugins/uptime/public/components/overview/monitor_list/monitor_list_drawer/__tests__/integration_link.test.tsx
diff --git a/x-pack/legacy/plugins/uptime/public/components/overview/monitor_list/monitor_list_drawer/__tests__/monitor_list_drawer.test.tsx b/x-pack/plugins/uptime/public/components/overview/monitor_list/monitor_list_drawer/__tests__/monitor_list_drawer.test.tsx
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/components/overview/monitor_list/monitor_list_drawer/__tests__/monitor_list_drawer.test.tsx
rename to x-pack/plugins/uptime/public/components/overview/monitor_list/monitor_list_drawer/__tests__/monitor_list_drawer.test.tsx
diff --git a/x-pack/legacy/plugins/uptime/public/components/overview/monitor_list/monitor_list_drawer/__tests__/monitor_status_list.test.tsx b/x-pack/plugins/uptime/public/components/overview/monitor_list/monitor_list_drawer/__tests__/monitor_status_list.test.tsx
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/components/overview/monitor_list/monitor_list_drawer/__tests__/monitor_status_list.test.tsx
rename to x-pack/plugins/uptime/public/components/overview/monitor_list/monitor_list_drawer/__tests__/monitor_status_list.test.tsx
diff --git a/x-pack/legacy/plugins/uptime/public/components/overview/monitor_list/monitor_list_drawer/__tests__/monitor_status_row.test.tsx b/x-pack/plugins/uptime/public/components/overview/monitor_list/monitor_list_drawer/__tests__/monitor_status_row.test.tsx
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/components/overview/monitor_list/monitor_list_drawer/__tests__/monitor_status_row.test.tsx
rename to x-pack/plugins/uptime/public/components/overview/monitor_list/monitor_list_drawer/__tests__/monitor_status_row.test.tsx
diff --git a/x-pack/legacy/plugins/uptime/public/components/overview/monitor_list/monitor_list_drawer/__tests__/most_recent_error.test.tsx b/x-pack/plugins/uptime/public/components/overview/monitor_list/monitor_list_drawer/__tests__/most_recent_error.test.tsx
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/components/overview/monitor_list/monitor_list_drawer/__tests__/most_recent_error.test.tsx
rename to x-pack/plugins/uptime/public/components/overview/monitor_list/monitor_list_drawer/__tests__/most_recent_error.test.tsx
diff --git a/x-pack/legacy/plugins/uptime/public/components/overview/monitor_list/monitor_list_drawer/actions_popover/actions_popover.tsx b/x-pack/plugins/uptime/public/components/overview/monitor_list/monitor_list_drawer/actions_popover/actions_popover.tsx
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/components/overview/monitor_list/monitor_list_drawer/actions_popover/actions_popover.tsx
rename to x-pack/plugins/uptime/public/components/overview/monitor_list/monitor_list_drawer/actions_popover/actions_popover.tsx
diff --git a/x-pack/legacy/plugins/uptime/public/components/overview/monitor_list/monitor_list_drawer/actions_popover/actions_popover_container.tsx b/x-pack/plugins/uptime/public/components/overview/monitor_list/monitor_list_drawer/actions_popover/actions_popover_container.tsx
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/components/overview/monitor_list/monitor_list_drawer/actions_popover/actions_popover_container.tsx
rename to x-pack/plugins/uptime/public/components/overview/monitor_list/monitor_list_drawer/actions_popover/actions_popover_container.tsx
diff --git a/x-pack/legacy/plugins/uptime/public/components/overview/monitor_list/monitor_list_drawer/actions_popover/integration_group.tsx b/x-pack/plugins/uptime/public/components/overview/monitor_list/monitor_list_drawer/actions_popover/integration_group.tsx
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/components/overview/monitor_list/monitor_list_drawer/actions_popover/integration_group.tsx
rename to x-pack/plugins/uptime/public/components/overview/monitor_list/monitor_list_drawer/actions_popover/integration_group.tsx
diff --git a/x-pack/legacy/plugins/uptime/public/components/overview/monitor_list/monitor_list_drawer/actions_popover/integration_link.tsx b/x-pack/plugins/uptime/public/components/overview/monitor_list/monitor_list_drawer/actions_popover/integration_link.tsx
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/components/overview/monitor_list/monitor_list_drawer/actions_popover/integration_link.tsx
rename to x-pack/plugins/uptime/public/components/overview/monitor_list/monitor_list_drawer/actions_popover/integration_link.tsx
diff --git a/x-pack/legacy/plugins/uptime/public/components/overview/monitor_list/monitor_list_drawer/index.ts b/x-pack/plugins/uptime/public/components/overview/monitor_list/monitor_list_drawer/index.ts
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/components/overview/monitor_list/monitor_list_drawer/index.ts
rename to x-pack/plugins/uptime/public/components/overview/monitor_list/monitor_list_drawer/index.ts
diff --git a/x-pack/legacy/plugins/uptime/public/components/overview/monitor_list/monitor_list_drawer/list_drawer_container.tsx b/x-pack/plugins/uptime/public/components/overview/monitor_list/monitor_list_drawer/list_drawer_container.tsx
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/components/overview/monitor_list/monitor_list_drawer/list_drawer_container.tsx
rename to x-pack/plugins/uptime/public/components/overview/monitor_list/monitor_list_drawer/list_drawer_container.tsx
diff --git a/x-pack/legacy/plugins/uptime/public/components/overview/monitor_list/monitor_list_drawer/monitor_list_drawer.tsx b/x-pack/plugins/uptime/public/components/overview/monitor_list/monitor_list_drawer/monitor_list_drawer.tsx
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/components/overview/monitor_list/monitor_list_drawer/monitor_list_drawer.tsx
rename to x-pack/plugins/uptime/public/components/overview/monitor_list/monitor_list_drawer/monitor_list_drawer.tsx
diff --git a/x-pack/legacy/plugins/uptime/public/components/overview/monitor_list/monitor_list_drawer/monitor_status_list.tsx b/x-pack/plugins/uptime/public/components/overview/monitor_list/monitor_list_drawer/monitor_status_list.tsx
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/components/overview/monitor_list/monitor_list_drawer/monitor_status_list.tsx
rename to x-pack/plugins/uptime/public/components/overview/monitor_list/monitor_list_drawer/monitor_status_list.tsx
diff --git a/x-pack/legacy/plugins/uptime/public/components/overview/monitor_list/monitor_list_drawer/monitor_status_row.tsx b/x-pack/plugins/uptime/public/components/overview/monitor_list/monitor_list_drawer/monitor_status_row.tsx
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/components/overview/monitor_list/monitor_list_drawer/monitor_status_row.tsx
rename to x-pack/plugins/uptime/public/components/overview/monitor_list/monitor_list_drawer/monitor_status_row.tsx
diff --git a/x-pack/legacy/plugins/uptime/public/components/overview/monitor_list/monitor_list_drawer/most_recent_error.tsx b/x-pack/plugins/uptime/public/components/overview/monitor_list/monitor_list_drawer/most_recent_error.tsx
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/components/overview/monitor_list/monitor_list_drawer/most_recent_error.tsx
rename to x-pack/plugins/uptime/public/components/overview/monitor_list/monitor_list_drawer/most_recent_error.tsx
diff --git a/x-pack/legacy/plugins/uptime/public/components/overview/monitor_list/monitor_list_page_size_select.tsx b/x-pack/plugins/uptime/public/components/overview/monitor_list/monitor_list_page_size_select.tsx
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/components/overview/monitor_list/monitor_list_page_size_select.tsx
rename to x-pack/plugins/uptime/public/components/overview/monitor_list/monitor_list_page_size_select.tsx
diff --git a/x-pack/legacy/plugins/uptime/public/components/overview/monitor_list/monitor_list_status_column.tsx b/x-pack/plugins/uptime/public/components/overview/monitor_list/monitor_list_status_column.tsx
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/components/overview/monitor_list/monitor_list_status_column.tsx
rename to x-pack/plugins/uptime/public/components/overview/monitor_list/monitor_list_status_column.tsx
diff --git a/x-pack/legacy/plugins/uptime/public/components/overview/monitor_list/monitor_page_link.tsx b/x-pack/plugins/uptime/public/components/overview/monitor_list/monitor_page_link.tsx
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/components/overview/monitor_list/monitor_page_link.tsx
rename to x-pack/plugins/uptime/public/components/overview/monitor_list/monitor_page_link.tsx
diff --git a/x-pack/legacy/plugins/uptime/public/components/overview/monitor_list/overview_page_link.tsx b/x-pack/plugins/uptime/public/components/overview/monitor_list/overview_page_link.tsx
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/components/overview/monitor_list/overview_page_link.tsx
rename to x-pack/plugins/uptime/public/components/overview/monitor_list/overview_page_link.tsx
diff --git a/x-pack/legacy/plugins/uptime/public/components/overview/monitor_list/parse_timestamp.ts b/x-pack/plugins/uptime/public/components/overview/monitor_list/parse_timestamp.ts
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/components/overview/monitor_list/parse_timestamp.ts
rename to x-pack/plugins/uptime/public/components/overview/monitor_list/parse_timestamp.ts
diff --git a/x-pack/legacy/plugins/uptime/public/components/overview/monitor_list/translations.ts b/x-pack/plugins/uptime/public/components/overview/monitor_list/translations.ts
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/components/overview/monitor_list/translations.ts
rename to x-pack/plugins/uptime/public/components/overview/monitor_list/translations.ts
diff --git a/x-pack/legacy/plugins/uptime/public/components/overview/monitor_list/types.ts b/x-pack/plugins/uptime/public/components/overview/monitor_list/types.ts
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/components/overview/monitor_list/types.ts
rename to x-pack/plugins/uptime/public/components/overview/monitor_list/types.ts
diff --git a/x-pack/legacy/plugins/uptime/public/components/overview/overview_container.tsx b/x-pack/plugins/uptime/public/components/overview/overview_container.tsx
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/components/overview/overview_container.tsx
rename to x-pack/plugins/uptime/public/components/overview/overview_container.tsx
diff --git a/x-pack/legacy/plugins/uptime/public/components/overview/parsing_error_callout.tsx b/x-pack/plugins/uptime/public/components/overview/parsing_error_callout.tsx
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/components/overview/parsing_error_callout.tsx
rename to x-pack/plugins/uptime/public/components/overview/parsing_error_callout.tsx
diff --git a/x-pack/legacy/plugins/uptime/public/components/overview/snapshot/index.ts b/x-pack/plugins/uptime/public/components/overview/snapshot/index.ts
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/components/overview/snapshot/index.ts
rename to x-pack/plugins/uptime/public/components/overview/snapshot/index.ts
diff --git a/x-pack/legacy/plugins/uptime/public/components/overview/snapshot/snapshot.tsx b/x-pack/plugins/uptime/public/components/overview/snapshot/snapshot.tsx
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/components/overview/snapshot/snapshot.tsx
rename to x-pack/plugins/uptime/public/components/overview/snapshot/snapshot.tsx
diff --git a/x-pack/legacy/plugins/uptime/public/components/overview/snapshot/snapshot_container.tsx b/x-pack/plugins/uptime/public/components/overview/snapshot/snapshot_container.tsx
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/components/overview/snapshot/snapshot_container.tsx
rename to x-pack/plugins/uptime/public/components/overview/snapshot/snapshot_container.tsx
diff --git a/x-pack/legacy/plugins/uptime/public/components/overview/snapshot/snapshot_heading.tsx b/x-pack/plugins/uptime/public/components/overview/snapshot/snapshot_heading.tsx
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/components/overview/snapshot/snapshot_heading.tsx
rename to x-pack/plugins/uptime/public/components/overview/snapshot/snapshot_heading.tsx
diff --git a/x-pack/legacy/plugins/uptime/public/components/overview/status_panel.tsx b/x-pack/plugins/uptime/public/components/overview/status_panel.tsx
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/components/overview/status_panel.tsx
rename to x-pack/plugins/uptime/public/components/overview/status_panel.tsx
diff --git a/x-pack/legacy/plugins/uptime/public/components/settings/__tests__/__snapshots__/certificate_form.test.tsx.snap b/x-pack/plugins/uptime/public/components/settings/__tests__/__snapshots__/certificate_form.test.tsx.snap
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/components/settings/__tests__/__snapshots__/certificate_form.test.tsx.snap
rename to x-pack/plugins/uptime/public/components/settings/__tests__/__snapshots__/certificate_form.test.tsx.snap
diff --git a/x-pack/legacy/plugins/uptime/public/components/settings/__tests__/__snapshots__/indices_form.test.tsx.snap b/x-pack/plugins/uptime/public/components/settings/__tests__/__snapshots__/indices_form.test.tsx.snap
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/components/settings/__tests__/__snapshots__/indices_form.test.tsx.snap
rename to x-pack/plugins/uptime/public/components/settings/__tests__/__snapshots__/indices_form.test.tsx.snap
diff --git a/x-pack/legacy/plugins/uptime/public/components/settings/__tests__/certificate_form.test.tsx b/x-pack/plugins/uptime/public/components/settings/__tests__/certificate_form.test.tsx
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/components/settings/__tests__/certificate_form.test.tsx
rename to x-pack/plugins/uptime/public/components/settings/__tests__/certificate_form.test.tsx
diff --git a/x-pack/legacy/plugins/uptime/public/components/settings/__tests__/indices_form.test.tsx b/x-pack/plugins/uptime/public/components/settings/__tests__/indices_form.test.tsx
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/components/settings/__tests__/indices_form.test.tsx
rename to x-pack/plugins/uptime/public/components/settings/__tests__/indices_form.test.tsx
diff --git a/x-pack/legacy/plugins/uptime/public/components/settings/certificate_form.tsx b/x-pack/plugins/uptime/public/components/settings/certificate_form.tsx
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/components/settings/certificate_form.tsx
rename to x-pack/plugins/uptime/public/components/settings/certificate_form.tsx
diff --git a/x-pack/legacy/plugins/uptime/public/components/settings/indices_form.tsx b/x-pack/plugins/uptime/public/components/settings/indices_form.tsx
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/components/settings/indices_form.tsx
rename to x-pack/plugins/uptime/public/components/settings/indices_form.tsx
diff --git a/x-pack/legacy/plugins/uptime/public/contexts/index.ts b/x-pack/plugins/uptime/public/contexts/index.ts
similarity index 82%
rename from x-pack/legacy/plugins/uptime/public/contexts/index.ts
rename to x-pack/plugins/uptime/public/contexts/index.ts
index 2b27fcfe907ab..243a25c26901a 100644
--- a/x-pack/legacy/plugins/uptime/public/contexts/index.ts
+++ b/x-pack/plugins/uptime/public/contexts/index.ts
@@ -11,3 +11,7 @@ export {
UptimeSettingsContextProvider,
} from './uptime_settings_context';
export { UptimeThemeContextProvider, UptimeThemeContext } from './uptime_theme_context';
+export {
+ UptimeStartupPluginsContext,
+ UptimeStartupPluginsContextProvider,
+} from './uptime_startup_plugins_context';
diff --git a/x-pack/legacy/plugins/uptime/public/contexts/uptime_refresh_context.tsx b/x-pack/plugins/uptime/public/contexts/uptime_refresh_context.tsx
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/contexts/uptime_refresh_context.tsx
rename to x-pack/plugins/uptime/public/contexts/uptime_refresh_context.tsx
diff --git a/x-pack/legacy/plugins/uptime/public/contexts/uptime_settings_context.tsx b/x-pack/plugins/uptime/public/contexts/uptime_settings_context.tsx
similarity index 96%
rename from x-pack/legacy/plugins/uptime/public/contexts/uptime_settings_context.tsx
rename to x-pack/plugins/uptime/public/contexts/uptime_settings_context.tsx
index 137846de103b4..4fabf3f2ed497 100644
--- a/x-pack/legacy/plugins/uptime/public/contexts/uptime_settings_context.tsx
+++ b/x-pack/plugins/uptime/public/contexts/uptime_settings_context.tsx
@@ -9,7 +9,7 @@ import { UptimeAppProps } from '../uptime_app';
import { CLIENT_DEFAULTS, CONTEXT_DEFAULTS } from '../../common/constants';
import { CommonlyUsedRange } from '../components/common/uptime_date_picker';
import { useGetUrlParams } from '../hooks';
-import { ILicense } from '../../../../../plugins/licensing/common/types';
+import { ILicense } from '../../../../plugins/licensing/common/types';
export interface UptimeSettingsContextValues {
basePath: string;
diff --git a/x-pack/plugins/uptime/public/contexts/uptime_startup_plugins_context.tsx b/x-pack/plugins/uptime/public/contexts/uptime_startup_plugins_context.tsx
new file mode 100644
index 0000000000000..e516ff44aa12a
--- /dev/null
+++ b/x-pack/plugins/uptime/public/contexts/uptime_startup_plugins_context.tsx
@@ -0,0 +1,15 @@
+/*
+ * 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 React, { createContext } from 'react';
+import { ClientPluginsStart } from '../apps/plugin';
+
+export const UptimeStartupPluginsContext = createContext>({});
+
+export const UptimeStartupPluginsContextProvider: React.FC> = ({
+ children,
+ ...props
+}) => ;
diff --git a/x-pack/legacy/plugins/uptime/public/contexts/uptime_theme_context.tsx b/x-pack/plugins/uptime/public/contexts/uptime_theme_context.tsx
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/contexts/uptime_theme_context.tsx
rename to x-pack/plugins/uptime/public/contexts/uptime_theme_context.tsx
diff --git a/x-pack/legacy/plugins/uptime/public/hooks/__tests__/__snapshots__/use_url_params.test.tsx.snap b/x-pack/plugins/uptime/public/hooks/__tests__/__snapshots__/use_url_params.test.tsx.snap
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/hooks/__tests__/__snapshots__/use_url_params.test.tsx.snap
rename to x-pack/plugins/uptime/public/hooks/__tests__/__snapshots__/use_url_params.test.tsx.snap
diff --git a/x-pack/legacy/plugins/uptime/public/hooks/__tests__/use_breadcrumbs.test.tsx b/x-pack/plugins/uptime/public/hooks/__tests__/use_breadcrumbs.test.tsx
similarity index 95%
rename from x-pack/legacy/plugins/uptime/public/hooks/__tests__/use_breadcrumbs.test.tsx
rename to x-pack/plugins/uptime/public/hooks/__tests__/use_breadcrumbs.test.tsx
index 1ce00fe7ce3af..306919015fcb1 100644
--- a/x-pack/legacy/plugins/uptime/public/hooks/__tests__/use_breadcrumbs.test.tsx
+++ b/x-pack/plugins/uptime/public/hooks/__tests__/use_breadcrumbs.test.tsx
@@ -9,7 +9,7 @@ import React from 'react';
import { Route } from 'react-router-dom';
import { mountWithRouter } from '../../lib';
import { OVERVIEW_ROUTE } from '../../../common/constants';
-import { KibanaContextProvider } from '../../../../../../../src/plugins/kibana_react/public';
+import { KibanaContextProvider } from '../../../../../../src/plugins/kibana_react/public';
import { UptimeUrlParams, getSupportedUrlParams } from '../../lib/helper';
import { makeBaseBreadcrumb, useBreadcrumbs } from '../use_breadcrumbs';
diff --git a/x-pack/legacy/plugins/uptime/public/hooks/__tests__/use_url_params.test.tsx b/x-pack/plugins/uptime/public/hooks/__tests__/use_url_params.test.tsx
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/hooks/__tests__/use_url_params.test.tsx
rename to x-pack/plugins/uptime/public/hooks/__tests__/use_url_params.test.tsx
diff --git a/x-pack/legacy/plugins/uptime/public/hooks/index.ts b/x-pack/plugins/uptime/public/hooks/index.ts
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/hooks/index.ts
rename to x-pack/plugins/uptime/public/hooks/index.ts
diff --git a/x-pack/legacy/plugins/uptime/public/hooks/update_kuery_string.ts b/x-pack/plugins/uptime/public/hooks/update_kuery_string.ts
similarity index 95%
rename from x-pack/legacy/plugins/uptime/public/hooks/update_kuery_string.ts
rename to x-pack/plugins/uptime/public/hooks/update_kuery_string.ts
index ab4d6f75849e8..492d2bab5bb80 100644
--- a/x-pack/legacy/plugins/uptime/public/hooks/update_kuery_string.ts
+++ b/x-pack/plugins/uptime/public/hooks/update_kuery_string.ts
@@ -5,7 +5,7 @@
*/
import { combineFiltersAndUserSearch, stringifyKueries } from '../lib/helper';
-import { esKuery, IIndexPattern } from '../../../../../../src/plugins/data/public';
+import { esKuery, IIndexPattern } from '../../../../../src/plugins/data/public';
const getKueryString = (urlFilters: string): string => {
let kueryString = '';
diff --git a/x-pack/legacy/plugins/uptime/public/hooks/use_breadcrumbs.ts b/x-pack/plugins/uptime/public/hooks/use_breadcrumbs.ts
similarity index 94%
rename from x-pack/legacy/plugins/uptime/public/hooks/use_breadcrumbs.ts
rename to x-pack/plugins/uptime/public/hooks/use_breadcrumbs.ts
index d1cc8e1897386..182c6b0114128 100644
--- a/x-pack/legacy/plugins/uptime/public/hooks/use_breadcrumbs.ts
+++ b/x-pack/plugins/uptime/public/hooks/use_breadcrumbs.ts
@@ -9,7 +9,7 @@ import { i18n } from '@kbn/i18n';
import { useEffect } from 'react';
import { UptimeUrlParams } from '../lib/helper';
import { stringifyUrlParams } from '../lib/helper/stringify_url_params';
-import { useKibana } from '../../../../../../src/plugins/kibana_react/public';
+import { useKibana } from '../../../../../src/plugins/kibana_react/public';
import { useUrlParams } from '.';
export const makeBaseBreadcrumb = (params?: UptimeUrlParams): ChromeBreadcrumb => {
diff --git a/x-pack/legacy/plugins/uptime/public/hooks/use_monitor.ts b/x-pack/plugins/uptime/public/hooks/use_monitor.ts
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/hooks/use_monitor.ts
rename to x-pack/plugins/uptime/public/hooks/use_monitor.ts
diff --git a/x-pack/legacy/plugins/uptime/public/hooks/use_telemetry.ts b/x-pack/plugins/uptime/public/hooks/use_telemetry.ts
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/hooks/use_telemetry.ts
rename to x-pack/plugins/uptime/public/hooks/use_telemetry.ts
diff --git a/x-pack/legacy/plugins/uptime/public/hooks/use_url_params.ts b/x-pack/plugins/uptime/public/hooks/use_url_params.ts
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/hooks/use_url_params.ts
rename to x-pack/plugins/uptime/public/hooks/use_url_params.ts
diff --git a/x-pack/legacy/plugins/uptime/public/icons/heartbeat_white.svg b/x-pack/plugins/uptime/public/icons/heartbeat_white.svg
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/icons/heartbeat_white.svg
rename to x-pack/plugins/uptime/public/icons/heartbeat_white.svg
diff --git a/x-pack/legacy/plugins/uptime/common/graphql/resolver_types.ts b/x-pack/plugins/uptime/public/index.ts
similarity index 53%
rename from x-pack/legacy/plugins/uptime/common/graphql/resolver_types.ts
rename to x-pack/plugins/uptime/public/index.ts
index 22df610d2d516..48cf2c90ad07b 100644
--- a/x-pack/legacy/plugins/uptime/common/graphql/resolver_types.ts
+++ b/x-pack/plugins/uptime/public/index.ts
@@ -4,10 +4,8 @@
* you may not use this file except in compliance with the Elastic License.
*/
-type UMResolverResult = Promise | T;
+import { PluginInitializerContext } from 'kibana/public';
+import { UptimePlugin } from './apps';
-export type UMResolver = (
- parent: Parent,
- args: Args,
- context: Context
-) => UMResolverResult;
+export const plugin = (initializerContext: PluginInitializerContext) =>
+ new UptimePlugin(initializerContext);
diff --git a/x-pack/legacy/plugins/uptime/public/lib/adapters/framework/capabilities_adapter.ts b/x-pack/plugins/uptime/public/lib/adapters/framework/capabilities_adapter.ts
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/lib/adapters/framework/capabilities_adapter.ts
rename to x-pack/plugins/uptime/public/lib/adapters/framework/capabilities_adapter.ts
diff --git a/x-pack/legacy/plugins/uptime/public/lib/adapters/framework/new_platform_adapter.tsx b/x-pack/plugins/uptime/public/lib/adapters/framework/new_platform_adapter.tsx
similarity index 86%
rename from x-pack/legacy/plugins/uptime/public/lib/adapters/framework/new_platform_adapter.tsx
rename to x-pack/plugins/uptime/public/lib/adapters/framework/new_platform_adapter.tsx
index 71c73bf5ba5d4..f7f9e056f41af 100644
--- a/x-pack/legacy/plugins/uptime/public/lib/adapters/framework/new_platform_adapter.tsx
+++ b/x-pack/plugins/uptime/public/lib/adapters/framework/new_platform_adapter.tsx
@@ -9,7 +9,6 @@ import React from 'react';
import ReactDOM from 'react-dom';
import { get } from 'lodash';
import { i18n as i18nFormatter } from '@kbn/i18n';
-import { PluginsSetup } from 'ui/new_platform/new_platform';
import { alertTypeInitializers } from '../../alert_types';
import { UptimeApp, UptimeAppProps } from '../../../uptime_app';
import { getIntegratedAppAvailability } from './capabilities_adapter';
@@ -20,10 +19,12 @@ import {
DEFAULT_TIMEPICKER_QUICK_RANGES,
} from '../../../../common/constants';
import { UMFrameworkAdapter } from '../../lib';
+import { ClientPluginsStart, ClientPluginsSetup } from '../../../apps/plugin';
export const getKibanaFrameworkAdapter = (
core: CoreStart,
- plugins: PluginsSetup
+ plugins: ClientPluginsSetup,
+ startPlugins: ClientPluginsStart
): UMFrameworkAdapter => {
const {
application: { capabilities },
@@ -35,14 +36,15 @@ export const getKibanaFrameworkAdapter = (
const {
data: { autocomplete },
- // TODO: after NP migration we can likely fix this typing problem
- // @ts-ignore we don't control this type
triggers_actions_ui,
} = plugins;
- alertTypeInitializers.forEach(init =>
- triggers_actions_ui.alertTypeRegistry.register(init({ autocomplete }))
- );
+ alertTypeInitializers.forEach(init => {
+ const alertInitializer = init({ autocomplete });
+ if (!triggers_actions_ui.alertTypeRegistry.has(alertInitializer.id)) {
+ triggers_actions_ui.alertTypeRegistry.register(init({ autocomplete }));
+ }
+ });
let breadcrumbs: ChromeBreadcrumb[] = [];
core.chrome.getBreadcrumbs$().subscribe((nextBreadcrumbs?: ChromeBreadcrumb[]) => {
@@ -68,6 +70,7 @@ export const getKibanaFrameworkAdapter = (
isLogsAvailable: logs,
kibanaBreadcrumbs: breadcrumbs,
plugins,
+ startPlugins,
renderGlobalHelpControls: () =>
setHelpExtension({
appName: i18nFormatter.translate('xpack.uptime.header.appName', {
diff --git a/x-pack/legacy/plugins/uptime/public/lib/alert_types/__tests__/monitor_status.test.ts b/x-pack/plugins/uptime/public/lib/alert_types/__tests__/monitor_status.test.ts
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/lib/alert_types/__tests__/monitor_status.test.ts
rename to x-pack/plugins/uptime/public/lib/alert_types/__tests__/monitor_status.test.ts
diff --git a/x-pack/legacy/plugins/uptime/public/lib/alert_types/index.ts b/x-pack/plugins/uptime/public/lib/alert_types/index.ts
similarity index 67%
rename from x-pack/legacy/plugins/uptime/public/lib/alert_types/index.ts
rename to x-pack/plugins/uptime/public/lib/alert_types/index.ts
index 74160577cb0b1..f7ab254ffe675 100644
--- a/x-pack/legacy/plugins/uptime/public/lib/alert_types/index.ts
+++ b/x-pack/plugins/uptime/public/lib/alert_types/index.ts
@@ -4,9 +4,7 @@
* you may not use this file except in compliance with the Elastic License.
*/
-// TODO: after NP migration is complete we should be able to remove this lint ignore comment
-// eslint-disable-next-line @kbn/eslint/no-restricted-paths
-import { AlertTypeModel } from '../../../../../../plugins/triggers_actions_ui/public';
+import { AlertTypeModel } from '../../../../triggers_actions_ui/public';
import { initMonitorStatusAlertType } from './monitor_status';
export type AlertTypeInitializer = (dependenies: { autocomplete: any }) => AlertTypeModel;
diff --git a/x-pack/legacy/plugins/uptime/public/lib/alert_types/monitor_status.tsx b/x-pack/plugins/uptime/public/lib/alert_types/monitor_status.tsx
similarity index 88%
rename from x-pack/legacy/plugins/uptime/public/lib/alert_types/monitor_status.tsx
rename to x-pack/plugins/uptime/public/lib/alert_types/monitor_status.tsx
index 0624d20b197c0..e7695fb1cbb56 100644
--- a/x-pack/legacy/plugins/uptime/public/lib/alert_types/monitor_status.tsx
+++ b/x-pack/plugins/uptime/public/lib/alert_types/monitor_status.tsx
@@ -8,17 +8,12 @@ import { PathReporter } from 'io-ts/lib/PathReporter';
import React from 'react';
import DateMath from '@elastic/datemath';
import { isRight } from 'fp-ts/lib/Either';
-import {
- AlertTypeModel,
- ValidationResult,
- // TODO: this typing issue should be resolved after NP migration
- // eslint-disable-next-line @kbn/eslint/no-restricted-paths
-} from '../../../../../../plugins/triggers_actions_ui/public/types';
+import { AlertTypeModel } from '../../../../triggers_actions_ui/public';
import { AlertTypeInitializer } from '.';
import { StatusCheckExecutorParamsType } from '../../../common/runtime_types';
import { AlertMonitorStatus } from '../../components/overview/alerts/alerts_containers';
-export const validate = (alertParams: any): ValidationResult => {
+export const validate = (alertParams: any) => {
const errors: Record = {};
const decoded = StatusCheckExecutorParamsType.decode(alertParams);
diff --git a/x-pack/legacy/plugins/uptime/public/lib/helper/__tests__/__snapshots__/stringify_kueries.test.ts.snap b/x-pack/plugins/uptime/public/lib/helper/__tests__/__snapshots__/stringify_kueries.test.ts.snap
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/lib/helper/__tests__/__snapshots__/stringify_kueries.test.ts.snap
rename to x-pack/plugins/uptime/public/lib/helper/__tests__/__snapshots__/stringify_kueries.test.ts.snap
diff --git a/x-pack/legacy/plugins/uptime/public/lib/helper/__tests__/__snapshots__/stringify_url_params.test.ts.snap b/x-pack/plugins/uptime/public/lib/helper/__tests__/__snapshots__/stringify_url_params.test.ts.snap
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/lib/helper/__tests__/__snapshots__/stringify_url_params.test.ts.snap
rename to x-pack/plugins/uptime/public/lib/helper/__tests__/__snapshots__/stringify_url_params.test.ts.snap
diff --git a/x-pack/legacy/plugins/uptime/public/lib/helper/__tests__/combine_filters_and_user_search.test.ts b/x-pack/plugins/uptime/public/lib/helper/__tests__/combine_filters_and_user_search.test.ts
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/lib/helper/__tests__/combine_filters_and_user_search.test.ts
rename to x-pack/plugins/uptime/public/lib/helper/__tests__/combine_filters_and_user_search.test.ts
diff --git a/x-pack/legacy/plugins/uptime/public/lib/helper/__tests__/convert_measurements.test.ts b/x-pack/plugins/uptime/public/lib/helper/__tests__/convert_measurements.test.ts
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/lib/helper/__tests__/convert_measurements.test.ts
rename to x-pack/plugins/uptime/public/lib/helper/__tests__/convert_measurements.test.ts
diff --git a/x-pack/legacy/plugins/uptime/public/lib/helper/__tests__/series_has_down_values.test.ts b/x-pack/plugins/uptime/public/lib/helper/__tests__/series_has_down_values.test.ts
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/lib/helper/__tests__/series_has_down_values.test.ts
rename to x-pack/plugins/uptime/public/lib/helper/__tests__/series_has_down_values.test.ts
diff --git a/x-pack/legacy/plugins/uptime/public/lib/helper/__tests__/stringify_kueries.test.ts b/x-pack/plugins/uptime/public/lib/helper/__tests__/stringify_kueries.test.ts
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/lib/helper/__tests__/stringify_kueries.test.ts
rename to x-pack/plugins/uptime/public/lib/helper/__tests__/stringify_kueries.test.ts
diff --git a/x-pack/legacy/plugins/uptime/public/lib/helper/__tests__/stringify_url_params.test.ts b/x-pack/plugins/uptime/public/lib/helper/__tests__/stringify_url_params.test.ts
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/lib/helper/__tests__/stringify_url_params.test.ts
rename to x-pack/plugins/uptime/public/lib/helper/__tests__/stringify_url_params.test.ts
diff --git a/x-pack/legacy/plugins/uptime/public/lib/helper/charts/__tests__/get_label_format.test.ts b/x-pack/plugins/uptime/public/lib/helper/charts/__tests__/get_label_format.test.ts
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/lib/helper/charts/__tests__/get_label_format.test.ts
rename to x-pack/plugins/uptime/public/lib/helper/charts/__tests__/get_label_format.test.ts
diff --git a/x-pack/legacy/plugins/uptime/public/lib/helper/charts/__tests__/is_within_current_date.test.ts b/x-pack/plugins/uptime/public/lib/helper/charts/__tests__/is_within_current_date.test.ts
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/lib/helper/charts/__tests__/is_within_current_date.test.ts
rename to x-pack/plugins/uptime/public/lib/helper/charts/__tests__/is_within_current_date.test.ts
diff --git a/x-pack/legacy/plugins/uptime/public/lib/helper/charts/get_chart_date_label.ts b/x-pack/plugins/uptime/public/lib/helper/charts/get_chart_date_label.ts
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/lib/helper/charts/get_chart_date_label.ts
rename to x-pack/plugins/uptime/public/lib/helper/charts/get_chart_date_label.ts
diff --git a/x-pack/legacy/plugins/uptime/public/lib/helper/charts/get_label_format.ts b/x-pack/plugins/uptime/public/lib/helper/charts/get_label_format.ts
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/lib/helper/charts/get_label_format.ts
rename to x-pack/plugins/uptime/public/lib/helper/charts/get_label_format.ts
diff --git a/x-pack/legacy/plugins/uptime/public/lib/helper/charts/index.ts b/x-pack/plugins/uptime/public/lib/helper/charts/index.ts
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/lib/helper/charts/index.ts
rename to x-pack/plugins/uptime/public/lib/helper/charts/index.ts
diff --git a/x-pack/legacy/plugins/uptime/public/lib/helper/charts/is_within_current_date.ts b/x-pack/plugins/uptime/public/lib/helper/charts/is_within_current_date.ts
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/lib/helper/charts/is_within_current_date.ts
rename to x-pack/plugins/uptime/public/lib/helper/charts/is_within_current_date.ts
diff --git a/x-pack/legacy/plugins/uptime/public/lib/helper/combine_filters_and_user_search.ts b/x-pack/plugins/uptime/public/lib/helper/combine_filters_and_user_search.ts
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/lib/helper/combine_filters_and_user_search.ts
rename to x-pack/plugins/uptime/public/lib/helper/combine_filters_and_user_search.ts
diff --git a/x-pack/legacy/plugins/uptime/public/lib/helper/convert_measurements.ts b/x-pack/plugins/uptime/public/lib/helper/convert_measurements.ts
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/lib/helper/convert_measurements.ts
rename to x-pack/plugins/uptime/public/lib/helper/convert_measurements.ts
diff --git a/x-pack/legacy/plugins/uptime/public/lib/helper/get_title.ts b/x-pack/plugins/uptime/public/lib/helper/get_title.ts
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/lib/helper/get_title.ts
rename to x-pack/plugins/uptime/public/lib/helper/get_title.ts
diff --git a/x-pack/legacy/plugins/uptime/public/lib/helper/helper_with_router.tsx b/x-pack/plugins/uptime/public/lib/helper/helper_with_router.tsx
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/lib/helper/helper_with_router.tsx
rename to x-pack/plugins/uptime/public/lib/helper/helper_with_router.tsx
diff --git a/x-pack/legacy/plugins/uptime/public/lib/helper/index.ts b/x-pack/plugins/uptime/public/lib/helper/index.ts
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/lib/helper/index.ts
rename to x-pack/plugins/uptime/public/lib/helper/index.ts
diff --git a/x-pack/legacy/plugins/uptime/public/lib/helper/observability_integration/__tests__/get_apm_href.test.ts b/x-pack/plugins/uptime/public/lib/helper/observability_integration/__tests__/get_apm_href.test.ts
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/lib/helper/observability_integration/__tests__/get_apm_href.test.ts
rename to x-pack/plugins/uptime/public/lib/helper/observability_integration/__tests__/get_apm_href.test.ts
diff --git a/x-pack/legacy/plugins/uptime/public/lib/helper/observability_integration/__tests__/get_infra_href.test.ts b/x-pack/plugins/uptime/public/lib/helper/observability_integration/__tests__/get_infra_href.test.ts
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/lib/helper/observability_integration/__tests__/get_infra_href.test.ts
rename to x-pack/plugins/uptime/public/lib/helper/observability_integration/__tests__/get_infra_href.test.ts
diff --git a/x-pack/legacy/plugins/uptime/public/lib/helper/observability_integration/__tests__/get_logging_href.test.ts b/x-pack/plugins/uptime/public/lib/helper/observability_integration/__tests__/get_logging_href.test.ts
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/lib/helper/observability_integration/__tests__/get_logging_href.test.ts
rename to x-pack/plugins/uptime/public/lib/helper/observability_integration/__tests__/get_logging_href.test.ts
diff --git a/x-pack/legacy/plugins/uptime/public/lib/helper/observability_integration/add_base_path.ts b/x-pack/plugins/uptime/public/lib/helper/observability_integration/add_base_path.ts
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/lib/helper/observability_integration/add_base_path.ts
rename to x-pack/plugins/uptime/public/lib/helper/observability_integration/add_base_path.ts
diff --git a/x-pack/legacy/plugins/uptime/public/lib/helper/observability_integration/build_href.ts b/x-pack/plugins/uptime/public/lib/helper/observability_integration/build_href.ts
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/lib/helper/observability_integration/build_href.ts
rename to x-pack/plugins/uptime/public/lib/helper/observability_integration/build_href.ts
diff --git a/x-pack/legacy/plugins/uptime/public/lib/helper/observability_integration/get_apm_href.ts b/x-pack/plugins/uptime/public/lib/helper/observability_integration/get_apm_href.ts
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/lib/helper/observability_integration/get_apm_href.ts
rename to x-pack/plugins/uptime/public/lib/helper/observability_integration/get_apm_href.ts
diff --git a/x-pack/legacy/plugins/uptime/public/lib/helper/observability_integration/get_infra_href.ts b/x-pack/plugins/uptime/public/lib/helper/observability_integration/get_infra_href.ts
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/lib/helper/observability_integration/get_infra_href.ts
rename to x-pack/plugins/uptime/public/lib/helper/observability_integration/get_infra_href.ts
diff --git a/x-pack/legacy/plugins/uptime/public/lib/helper/observability_integration/get_logging_href.ts b/x-pack/plugins/uptime/public/lib/helper/observability_integration/get_logging_href.ts
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/lib/helper/observability_integration/get_logging_href.ts
rename to x-pack/plugins/uptime/public/lib/helper/observability_integration/get_logging_href.ts
diff --git a/x-pack/legacy/plugins/uptime/public/lib/helper/observability_integration/index.ts b/x-pack/plugins/uptime/public/lib/helper/observability_integration/index.ts
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/lib/helper/observability_integration/index.ts
rename to x-pack/plugins/uptime/public/lib/helper/observability_integration/index.ts
diff --git a/x-pack/legacy/plugins/uptime/public/lib/helper/series_has_down_values.ts b/x-pack/plugins/uptime/public/lib/helper/series_has_down_values.ts
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/lib/helper/series_has_down_values.ts
rename to x-pack/plugins/uptime/public/lib/helper/series_has_down_values.ts
diff --git a/x-pack/legacy/plugins/uptime/public/lib/helper/stringify_kueries.ts b/x-pack/plugins/uptime/public/lib/helper/stringify_kueries.ts
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/lib/helper/stringify_kueries.ts
rename to x-pack/plugins/uptime/public/lib/helper/stringify_kueries.ts
diff --git a/x-pack/legacy/plugins/uptime/public/lib/helper/stringify_url_params.ts b/x-pack/plugins/uptime/public/lib/helper/stringify_url_params.ts
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/lib/helper/stringify_url_params.ts
rename to x-pack/plugins/uptime/public/lib/helper/stringify_url_params.ts
diff --git a/x-pack/legacy/plugins/uptime/public/lib/helper/url_params/__tests__/__snapshots__/get_supported_url_params.test.ts.snap b/x-pack/plugins/uptime/public/lib/helper/url_params/__tests__/__snapshots__/get_supported_url_params.test.ts.snap
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/lib/helper/url_params/__tests__/__snapshots__/get_supported_url_params.test.ts.snap
rename to x-pack/plugins/uptime/public/lib/helper/url_params/__tests__/__snapshots__/get_supported_url_params.test.ts.snap
diff --git a/x-pack/legacy/plugins/uptime/public/lib/helper/url_params/__tests__/get_supported_url_params.test.ts b/x-pack/plugins/uptime/public/lib/helper/url_params/__tests__/get_supported_url_params.test.ts
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/lib/helper/url_params/__tests__/get_supported_url_params.test.ts
rename to x-pack/plugins/uptime/public/lib/helper/url_params/__tests__/get_supported_url_params.test.ts
diff --git a/x-pack/legacy/plugins/uptime/public/lib/helper/url_params/__tests__/parse_absolute_date.test.ts b/x-pack/plugins/uptime/public/lib/helper/url_params/__tests__/parse_absolute_date.test.ts
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/lib/helper/url_params/__tests__/parse_absolute_date.test.ts
rename to x-pack/plugins/uptime/public/lib/helper/url_params/__tests__/parse_absolute_date.test.ts
diff --git a/x-pack/legacy/plugins/uptime/public/lib/helper/url_params/__tests__/parse_url_int.test.ts b/x-pack/plugins/uptime/public/lib/helper/url_params/__tests__/parse_autorefresh_interval.test.ts
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/lib/helper/url_params/__tests__/parse_url_int.test.ts
rename to x-pack/plugins/uptime/public/lib/helper/url_params/__tests__/parse_autorefresh_interval.test.ts
diff --git a/x-pack/legacy/plugins/uptime/public/lib/helper/url_params/__tests__/parse_is_paused.test.ts b/x-pack/plugins/uptime/public/lib/helper/url_params/__tests__/parse_is_paused.test.ts
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/lib/helper/url_params/__tests__/parse_is_paused.test.ts
rename to x-pack/plugins/uptime/public/lib/helper/url_params/__tests__/parse_is_paused.test.ts
diff --git a/x-pack/plugins/uptime/public/lib/helper/url_params/__tests__/parse_url_int.test.ts b/x-pack/plugins/uptime/public/lib/helper/url_params/__tests__/parse_url_int.test.ts
new file mode 100644
index 0000000000000..a5c2168378089
--- /dev/null
+++ b/x-pack/plugins/uptime/public/lib/helper/url_params/__tests__/parse_url_int.test.ts
@@ -0,0 +1,24 @@
+/*
+ * 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 { parseUrlInt } from '../parse_url_int';
+
+describe('parseUrlInt', () => {
+ it('parses a number', () => {
+ const result = parseUrlInt('23', 50);
+ expect(result).toBe(23);
+ });
+
+ it('returns default value for empty string', () => {
+ const result = parseUrlInt('', 50);
+ expect(result).toBe(50);
+ });
+
+ it('returns default value for non-numeric string', () => {
+ const result = parseUrlInt('abc', 50);
+ expect(result).toBe(50);
+ });
+});
diff --git a/x-pack/legacy/plugins/uptime/public/lib/helper/url_params/get_supported_url_params.ts b/x-pack/plugins/uptime/public/lib/helper/url_params/get_supported_url_params.ts
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/lib/helper/url_params/get_supported_url_params.ts
rename to x-pack/plugins/uptime/public/lib/helper/url_params/get_supported_url_params.ts
diff --git a/x-pack/legacy/plugins/uptime/public/lib/helper/url_params/index.ts b/x-pack/plugins/uptime/public/lib/helper/url_params/index.ts
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/lib/helper/url_params/index.ts
rename to x-pack/plugins/uptime/public/lib/helper/url_params/index.ts
diff --git a/x-pack/legacy/plugins/uptime/public/lib/helper/url_params/parse_absolute_date.ts b/x-pack/plugins/uptime/public/lib/helper/url_params/parse_absolute_date.ts
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/lib/helper/url_params/parse_absolute_date.ts
rename to x-pack/plugins/uptime/public/lib/helper/url_params/parse_absolute_date.ts
diff --git a/x-pack/legacy/plugins/uptime/public/lib/helper/url_params/parse_is_paused.ts b/x-pack/plugins/uptime/public/lib/helper/url_params/parse_is_paused.ts
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/lib/helper/url_params/parse_is_paused.ts
rename to x-pack/plugins/uptime/public/lib/helper/url_params/parse_is_paused.ts
diff --git a/x-pack/legacy/plugins/uptime/public/lib/helper/url_params/parse_url_int.ts b/x-pack/plugins/uptime/public/lib/helper/url_params/parse_url_int.ts
similarity index 87%
rename from x-pack/legacy/plugins/uptime/public/lib/helper/url_params/parse_url_int.ts
rename to x-pack/plugins/uptime/public/lib/helper/url_params/parse_url_int.ts
index b1a4d0a2aba0d..0e5363527b516 100644
--- a/x-pack/legacy/plugins/uptime/public/lib/helper/url_params/parse_url_int.ts
+++ b/x-pack/plugins/uptime/public/lib/helper/url_params/parse_url_int.ts
@@ -4,7 +4,6 @@
* you may not use this file except in compliance with the Elastic License.
*/
-// TODO: add a comment explaining the purpose of this function
export const parseUrlInt = (value: string | undefined, defaultValue: number): number => {
const parsed = parseInt(value || '', 10);
return isNaN(parsed) ? defaultValue : parsed;
diff --git a/x-pack/legacy/plugins/uptime/public/lib/index.ts b/x-pack/plugins/uptime/public/lib/index.ts
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/lib/index.ts
rename to x-pack/plugins/uptime/public/lib/index.ts
diff --git a/x-pack/legacy/plugins/uptime/public/lib/lib.ts b/x-pack/plugins/uptime/public/lib/lib.ts
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/lib/lib.ts
rename to x-pack/plugins/uptime/public/lib/lib.ts
diff --git a/x-pack/legacy/plugins/uptime/public/pages/__tests__/__snapshots__/monitor.test.tsx.snap b/x-pack/plugins/uptime/public/pages/__tests__/__snapshots__/monitor.test.tsx.snap
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/pages/__tests__/__snapshots__/monitor.test.tsx.snap
rename to x-pack/plugins/uptime/public/pages/__tests__/__snapshots__/monitor.test.tsx.snap
diff --git a/x-pack/legacy/plugins/uptime/public/pages/__tests__/__snapshots__/not_found.test.tsx.snap b/x-pack/plugins/uptime/public/pages/__tests__/__snapshots__/not_found.test.tsx.snap
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/pages/__tests__/__snapshots__/not_found.test.tsx.snap
rename to x-pack/plugins/uptime/public/pages/__tests__/__snapshots__/not_found.test.tsx.snap
diff --git a/x-pack/legacy/plugins/uptime/public/pages/__tests__/__snapshots__/overview.test.tsx.snap b/x-pack/plugins/uptime/public/pages/__tests__/__snapshots__/overview.test.tsx.snap
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/pages/__tests__/__snapshots__/overview.test.tsx.snap
rename to x-pack/plugins/uptime/public/pages/__tests__/__snapshots__/overview.test.tsx.snap
diff --git a/x-pack/legacy/plugins/uptime/public/pages/__tests__/__snapshots__/page_header.test.tsx.snap b/x-pack/plugins/uptime/public/pages/__tests__/__snapshots__/page_header.test.tsx.snap
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/pages/__tests__/__snapshots__/page_header.test.tsx.snap
rename to x-pack/plugins/uptime/public/pages/__tests__/__snapshots__/page_header.test.tsx.snap
diff --git a/x-pack/legacy/plugins/uptime/public/pages/__tests__/monitor.test.tsx b/x-pack/plugins/uptime/public/pages/__tests__/monitor.test.tsx
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/pages/__tests__/monitor.test.tsx
rename to x-pack/plugins/uptime/public/pages/__tests__/monitor.test.tsx
diff --git a/x-pack/legacy/plugins/uptime/public/pages/__tests__/not_found.test.tsx b/x-pack/plugins/uptime/public/pages/__tests__/not_found.test.tsx
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/pages/__tests__/not_found.test.tsx
rename to x-pack/plugins/uptime/public/pages/__tests__/not_found.test.tsx
diff --git a/x-pack/legacy/plugins/uptime/public/pages/__tests__/overview.test.tsx b/x-pack/plugins/uptime/public/pages/__tests__/overview.test.tsx
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/pages/__tests__/overview.test.tsx
rename to x-pack/plugins/uptime/public/pages/__tests__/overview.test.tsx
diff --git a/x-pack/legacy/plugins/uptime/public/pages/__tests__/page_header.test.tsx b/x-pack/plugins/uptime/public/pages/__tests__/page_header.test.tsx
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/pages/__tests__/page_header.test.tsx
rename to x-pack/plugins/uptime/public/pages/__tests__/page_header.test.tsx
diff --git a/x-pack/legacy/plugins/uptime/public/pages/index.ts b/x-pack/plugins/uptime/public/pages/index.ts
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/pages/index.ts
rename to x-pack/plugins/uptime/public/pages/index.ts
diff --git a/x-pack/legacy/plugins/uptime/public/pages/monitor.tsx b/x-pack/plugins/uptime/public/pages/monitor.tsx
similarity index 87%
rename from x-pack/legacy/plugins/uptime/public/pages/monitor.tsx
rename to x-pack/plugins/uptime/public/pages/monitor.tsx
index 4495be9b24dc1..8a309db75acd2 100644
--- a/x-pack/legacy/plugins/uptime/public/pages/monitor.tsx
+++ b/x-pack/plugins/uptime/public/pages/monitor.tsx
@@ -7,14 +7,13 @@
import { EuiSpacer } from '@elastic/eui';
import React from 'react';
import { useSelector } from 'react-redux';
-import { useTrackPageview } from '../../../../../plugins/observability/public';
import { monitorStatusSelector } from '../state/selectors';
import { PageHeader } from './page_header';
import { useBreadcrumbs } from '../hooks/use_breadcrumbs';
+import { useTrackPageview } from '../../../observability/public';
import { useMonitorId, useUptimeTelemetry, UptimePage } from '../hooks';
import { MonitorCharts } from '../components/monitor';
-import { MonitorStatusDetails } from '../components/monitor';
-import { PingList } from '../components/monitor';
+import { MonitorStatusDetails, PingList } from '../components/monitor';
export const MonitorPage: React.FC = () => {
const monitorId = useMonitorId();
diff --git a/x-pack/legacy/plugins/uptime/public/pages/not_found.tsx b/x-pack/plugins/uptime/public/pages/not_found.tsx
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/pages/not_found.tsx
rename to x-pack/plugins/uptime/public/pages/not_found.tsx
diff --git a/x-pack/legacy/plugins/uptime/public/pages/overview.tsx b/x-pack/plugins/uptime/public/pages/overview.tsx
similarity index 96%
rename from x-pack/legacy/plugins/uptime/public/pages/overview.tsx
rename to x-pack/plugins/uptime/public/pages/overview.tsx
index adc36efa6f7db..fefd804cbfabf 100644
--- a/x-pack/legacy/plugins/uptime/public/pages/overview.tsx
+++ b/x-pack/plugins/uptime/public/pages/overview.tsx
@@ -10,11 +10,11 @@ import styled from 'styled-components';
import { i18n } from '@kbn/i18n';
import { useUptimeTelemetry, UptimePage, useGetUrlParams } from '../hooks';
import { stringifyUrlParams } from '../lib/helper/stringify_url_params';
-import { useTrackPageview } from '../../../../../plugins/observability/public';
-import { DataPublicPluginSetup, IIndexPattern } from '../../../../../../src/plugins/data/public';
-import { useUpdateKueryString } from '../hooks';
import { PageHeader } from './page_header';
+import { DataPublicPluginSetup, IIndexPattern } from '../../../../../src/plugins/data/public';
+import { useUpdateKueryString } from '../hooks';
import { useBreadcrumbs } from '../hooks/use_breadcrumbs';
+import { useTrackPageview } from '../../../observability/public';
import { MonitorList } from '../components/overview/monitor_list/monitor_list_container';
import { EmptyState, FilterGroup, KueryBar, ParsingErrorCallout } from '../components/overview';
import { StatusPanel } from '../components/overview/status_panel';
diff --git a/x-pack/legacy/plugins/uptime/public/pages/page_header.tsx b/x-pack/plugins/uptime/public/pages/page_header.tsx
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/pages/page_header.tsx
rename to x-pack/plugins/uptime/public/pages/page_header.tsx
diff --git a/x-pack/legacy/plugins/uptime/public/pages/settings.tsx b/x-pack/plugins/uptime/public/pages/settings.tsx
similarity index 98%
rename from x-pack/legacy/plugins/uptime/public/pages/settings.tsx
rename to x-pack/plugins/uptime/public/pages/settings.tsx
index d8c2a78092854..52096a49435d7 100644
--- a/x-pack/legacy/plugins/uptime/public/pages/settings.tsx
+++ b/x-pack/plugins/uptime/public/pages/settings.tsx
@@ -24,7 +24,7 @@ import { getDynamicSettings, setDynamicSettings } from '../state/actions/dynamic
import { DynamicSettings } from '../../common/runtime_types';
import { useBreadcrumbs } from '../hooks/use_breadcrumbs';
import { OVERVIEW_ROUTE } from '../../common/constants';
-import { useKibana } from '../../../../../../src/plugins/kibana_react/public';
+import { useKibana } from '../../../../../src/plugins/kibana_react/public';
import { UptimePage, useUptimeTelemetry } from '../hooks';
import { IndicesForm } from '../components/settings/indices_form';
import {
diff --git a/x-pack/legacy/plugins/uptime/public/pages/translations.ts b/x-pack/plugins/uptime/public/pages/translations.ts
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/pages/translations.ts
rename to x-pack/plugins/uptime/public/pages/translations.ts
diff --git a/x-pack/legacy/plugins/uptime/public/routes.tsx b/x-pack/plugins/uptime/public/routes.tsx
similarity index 93%
rename from x-pack/legacy/plugins/uptime/public/routes.tsx
rename to x-pack/plugins/uptime/public/routes.tsx
index b5e20ef8a70a9..eb0587c0417a2 100644
--- a/x-pack/legacy/plugins/uptime/public/routes.tsx
+++ b/x-pack/plugins/uptime/public/routes.tsx
@@ -6,7 +6,7 @@
import React, { FC } from 'react';
import { Route, Switch } from 'react-router-dom';
-import { DataPublicPluginSetup } from '../../../../../src/plugins/data/public';
+import { DataPublicPluginSetup } from '../../../../src/plugins/data/public';
import { OverviewPage } from './components/overview/overview_container';
import { MONITOR_ROUTE, OVERVIEW_ROUTE, SETTINGS_ROUTE } from '../common/constants';
import { MonitorPage, NotFoundPage, SettingsPage } from './pages';
diff --git a/x-pack/legacy/plugins/uptime/public/state/actions/__tests__/__snapshots__/overview_filters.test.ts.snap b/x-pack/plugins/uptime/public/state/actions/__tests__/__snapshots__/overview_filters.test.ts.snap
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/state/actions/__tests__/__snapshots__/overview_filters.test.ts.snap
rename to x-pack/plugins/uptime/public/state/actions/__tests__/__snapshots__/overview_filters.test.ts.snap
diff --git a/x-pack/legacy/plugins/uptime/public/state/actions/__tests__/overview_filters.test.ts b/x-pack/plugins/uptime/public/state/actions/__tests__/overview_filters.test.ts
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/state/actions/__tests__/overview_filters.test.ts
rename to x-pack/plugins/uptime/public/state/actions/__tests__/overview_filters.test.ts
diff --git a/x-pack/legacy/plugins/uptime/public/state/actions/dynamic_settings.ts b/x-pack/plugins/uptime/public/state/actions/dynamic_settings.ts
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/state/actions/dynamic_settings.ts
rename to x-pack/plugins/uptime/public/state/actions/dynamic_settings.ts
diff --git a/x-pack/legacy/plugins/uptime/public/state/actions/index.ts b/x-pack/plugins/uptime/public/state/actions/index.ts
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/state/actions/index.ts
rename to x-pack/plugins/uptime/public/state/actions/index.ts
diff --git a/x-pack/legacy/plugins/uptime/public/state/actions/index_patternts.ts b/x-pack/plugins/uptime/public/state/actions/index_patternts.ts
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/state/actions/index_patternts.ts
rename to x-pack/plugins/uptime/public/state/actions/index_patternts.ts
diff --git a/x-pack/legacy/plugins/uptime/public/state/actions/index_status.ts b/x-pack/plugins/uptime/public/state/actions/index_status.ts
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/state/actions/index_status.ts
rename to x-pack/plugins/uptime/public/state/actions/index_status.ts
diff --git a/x-pack/legacy/plugins/uptime/public/state/actions/ml_anomaly.ts b/x-pack/plugins/uptime/public/state/actions/ml_anomaly.ts
similarity index 82%
rename from x-pack/legacy/plugins/uptime/public/state/actions/ml_anomaly.ts
rename to x-pack/plugins/uptime/public/state/actions/ml_anomaly.ts
index 67c75314a7305..441a3cefdf204 100644
--- a/x-pack/legacy/plugins/uptime/public/state/actions/ml_anomaly.ts
+++ b/x-pack/plugins/uptime/public/state/actions/ml_anomaly.ts
@@ -6,15 +6,15 @@
import { createAction } from 'redux-actions';
import { createAsyncAction } from './utils';
-import { MlCapabilitiesResponse } from '../../../../../../plugins/ml/common/types/capabilities';
-import { AnomaliesTableRecord } from '../../../../../../plugins/ml/common/types/anomalies';
+import { MlCapabilitiesResponse } from '../../../../../plugins/ml/common/types/capabilities';
+import { AnomaliesTableRecord } from '../../../../../plugins/ml/common/types/anomalies';
import {
CreateMLJobSuccess,
DeleteJobResults,
MonitorIdParam,
HeartbeatIndicesParam,
} from './types';
-import { JobExistResult } from '../../../../../../plugins/ml/common/types/data_recognizer';
+import { JobExistResult } from '../../../../../plugins/ml/common/types/data_recognizer';
export const resetMLState = createAction('RESET_ML_STATE');
diff --git a/x-pack/legacy/plugins/uptime/public/state/actions/monitor.ts b/x-pack/plugins/uptime/public/state/actions/monitor.ts
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/state/actions/monitor.ts
rename to x-pack/plugins/uptime/public/state/actions/monitor.ts
diff --git a/x-pack/legacy/plugins/uptime/public/state/actions/monitor_duration.ts b/x-pack/plugins/uptime/public/state/actions/monitor_duration.ts
similarity index 90%
rename from x-pack/legacy/plugins/uptime/public/state/actions/monitor_duration.ts
rename to x-pack/plugins/uptime/public/state/actions/monitor_duration.ts
index 9a2db5be60b12..524044f873687 100644
--- a/x-pack/legacy/plugins/uptime/public/state/actions/monitor_duration.ts
+++ b/x-pack/plugins/uptime/public/state/actions/monitor_duration.ts
@@ -7,7 +7,7 @@
import { createAction } from 'redux-actions';
import { QueryParams } from './types';
import { MonitorDurationResult } from '../../../common/types';
-import { IHttpFetchError } from '../../../../../../../target/types/core/public/http';
+import { IHttpFetchError } from '../../../../../../target/types/core/public/http';
type MonitorQueryParams = QueryParams & { monitorId: string };
diff --git a/x-pack/legacy/plugins/uptime/public/state/actions/monitor_list.ts b/x-pack/plugins/uptime/public/state/actions/monitor_list.ts
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/state/actions/monitor_list.ts
rename to x-pack/plugins/uptime/public/state/actions/monitor_list.ts
diff --git a/x-pack/legacy/plugins/uptime/public/state/actions/monitor_status.ts b/x-pack/plugins/uptime/public/state/actions/monitor_status.ts
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/state/actions/monitor_status.ts
rename to x-pack/plugins/uptime/public/state/actions/monitor_status.ts
diff --git a/x-pack/legacy/plugins/uptime/public/state/actions/overview_filters.ts b/x-pack/plugins/uptime/public/state/actions/overview_filters.ts
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/state/actions/overview_filters.ts
rename to x-pack/plugins/uptime/public/state/actions/overview_filters.ts
diff --git a/x-pack/legacy/plugins/uptime/public/state/actions/ping.ts b/x-pack/plugins/uptime/public/state/actions/ping.ts
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/state/actions/ping.ts
rename to x-pack/plugins/uptime/public/state/actions/ping.ts
diff --git a/x-pack/legacy/plugins/uptime/public/state/actions/snapshot.ts b/x-pack/plugins/uptime/public/state/actions/snapshot.ts
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/state/actions/snapshot.ts
rename to x-pack/plugins/uptime/public/state/actions/snapshot.ts
diff --git a/x-pack/legacy/plugins/uptime/public/state/actions/types.ts b/x-pack/plugins/uptime/public/state/actions/types.ts
similarity index 94%
rename from x-pack/legacy/plugins/uptime/public/state/actions/types.ts
rename to x-pack/plugins/uptime/public/state/actions/types.ts
index 41381afd31453..dee2df77707d2 100644
--- a/x-pack/legacy/plugins/uptime/public/state/actions/types.ts
+++ b/x-pack/plugins/uptime/public/state/actions/types.ts
@@ -5,7 +5,7 @@
*/
import { Action } from 'redux-actions';
-import { IHttpFetchError } from '../../../../../../../target/types/core/public/http';
+import { IHttpFetchError } from '../../../../../../target/types/core/public/http';
export interface AsyncAction {
get: (payload: Payload) => Action;
diff --git a/x-pack/legacy/plugins/uptime/public/state/actions/ui.ts b/x-pack/plugins/uptime/public/state/actions/ui.ts
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/state/actions/ui.ts
rename to x-pack/plugins/uptime/public/state/actions/ui.ts
diff --git a/x-pack/legacy/plugins/uptime/public/state/actions/utils.ts b/x-pack/plugins/uptime/public/state/actions/utils.ts
similarity index 90%
rename from x-pack/legacy/plugins/uptime/public/state/actions/utils.ts
rename to x-pack/plugins/uptime/public/state/actions/utils.ts
index a5adb96731f33..8ce4cf011406b 100644
--- a/x-pack/legacy/plugins/uptime/public/state/actions/utils.ts
+++ b/x-pack/plugins/uptime/public/state/actions/utils.ts
@@ -6,7 +6,7 @@
import { createAction } from 'redux-actions';
import { AsyncAction, AsyncAction1 } from './types';
-import { IHttpFetchError } from '../../../../../../../target/types/core/public/http';
+import { IHttpFetchError } from '../../../../../../target/types/core/public/http';
export function createAsyncAction(
actionStr: string
diff --git a/x-pack/legacy/plugins/uptime/public/state/api/__tests__/__snapshots__/snapshot.test.ts.snap b/x-pack/plugins/uptime/public/state/api/__tests__/__snapshots__/snapshot.test.ts.snap
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/state/api/__tests__/__snapshots__/snapshot.test.ts.snap
rename to x-pack/plugins/uptime/public/state/api/__tests__/__snapshots__/snapshot.test.ts.snap
diff --git a/x-pack/legacy/plugins/uptime/public/state/api/__tests__/ml_anomaly.test.ts b/x-pack/plugins/uptime/public/state/api/__tests__/ml_anomaly.test.ts
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/state/api/__tests__/ml_anomaly.test.ts
rename to x-pack/plugins/uptime/public/state/api/__tests__/ml_anomaly.test.ts
diff --git a/x-pack/legacy/plugins/uptime/public/state/api/__tests__/snapshot.test.ts b/x-pack/plugins/uptime/public/state/api/__tests__/snapshot.test.ts
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/state/api/__tests__/snapshot.test.ts
rename to x-pack/plugins/uptime/public/state/api/__tests__/snapshot.test.ts
diff --git a/x-pack/legacy/plugins/uptime/public/state/api/dynamic_settings.ts b/x-pack/plugins/uptime/public/state/api/dynamic_settings.ts
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/state/api/dynamic_settings.ts
rename to x-pack/plugins/uptime/public/state/api/dynamic_settings.ts
diff --git a/x-pack/legacy/plugins/uptime/public/state/api/index.ts b/x-pack/plugins/uptime/public/state/api/index.ts
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/state/api/index.ts
rename to x-pack/plugins/uptime/public/state/api/index.ts
diff --git a/x-pack/legacy/plugins/uptime/public/state/api/index_pattern.ts b/x-pack/plugins/uptime/public/state/api/index_pattern.ts
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/state/api/index_pattern.ts
rename to x-pack/plugins/uptime/public/state/api/index_pattern.ts
diff --git a/x-pack/legacy/plugins/uptime/public/state/api/index_status.ts b/x-pack/plugins/uptime/public/state/api/index_status.ts
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/state/api/index_status.ts
rename to x-pack/plugins/uptime/public/state/api/index_status.ts
diff --git a/x-pack/legacy/plugins/uptime/public/state/api/ml_anomaly.ts b/x-pack/plugins/uptime/public/state/api/ml_anomaly.ts
similarity index 92%
rename from x-pack/legacy/plugins/uptime/public/state/api/ml_anomaly.ts
rename to x-pack/plugins/uptime/public/state/api/ml_anomaly.ts
index ca324895c26db..c4ecb769abefc 100644
--- a/x-pack/legacy/plugins/uptime/public/state/api/ml_anomaly.ts
+++ b/x-pack/plugins/uptime/public/state/api/ml_anomaly.ts
@@ -8,15 +8,15 @@ import moment from 'moment';
import { apiService } from './utils';
import { AnomalyRecords, AnomalyRecordsParams } from '../actions';
import { API_URLS, ML_JOB_ID, ML_MODULE_ID } from '../../../common/constants';
-import { MlCapabilitiesResponse } from '../../../../../../plugins/ml/common/types/capabilities';
+import { MlCapabilitiesResponse } from '../../../../../plugins/ml/common/types/capabilities';
import {
CreateMLJobSuccess,
DeleteJobResults,
MonitorIdParam,
HeartbeatIndicesParam,
} from '../actions/types';
-import { DataRecognizerConfigResponse } from '../../../../../../plugins/ml/common/types/modules';
-import { JobExistResult } from '../../../../../../plugins/ml/common/types/data_recognizer';
+import { DataRecognizerConfigResponse } from '../../../../../plugins/ml/common/types/modules';
+import { JobExistResult } from '../../../../../plugins/ml/common/types/data_recognizer';
const getJobPrefix = (monitorId: string) => {
// ML App doesn't support upper case characters in job name
diff --git a/x-pack/legacy/plugins/uptime/public/state/api/monitor.ts b/x-pack/plugins/uptime/public/state/api/monitor.ts
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/state/api/monitor.ts
rename to x-pack/plugins/uptime/public/state/api/monitor.ts
diff --git a/x-pack/legacy/plugins/uptime/public/state/api/monitor_duration.ts b/x-pack/plugins/uptime/public/state/api/monitor_duration.ts
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/state/api/monitor_duration.ts
rename to x-pack/plugins/uptime/public/state/api/monitor_duration.ts
diff --git a/x-pack/legacy/plugins/uptime/public/state/api/monitor_list.ts b/x-pack/plugins/uptime/public/state/api/monitor_list.ts
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/state/api/monitor_list.ts
rename to x-pack/plugins/uptime/public/state/api/monitor_list.ts
diff --git a/x-pack/legacy/plugins/uptime/public/state/api/monitor_status.ts b/x-pack/plugins/uptime/public/state/api/monitor_status.ts
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/state/api/monitor_status.ts
rename to x-pack/plugins/uptime/public/state/api/monitor_status.ts
diff --git a/x-pack/legacy/plugins/uptime/public/state/api/overview_filters.ts b/x-pack/plugins/uptime/public/state/api/overview_filters.ts
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/state/api/overview_filters.ts
rename to x-pack/plugins/uptime/public/state/api/overview_filters.ts
diff --git a/x-pack/legacy/plugins/uptime/public/state/api/ping.ts b/x-pack/plugins/uptime/public/state/api/ping.ts
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/state/api/ping.ts
rename to x-pack/plugins/uptime/public/state/api/ping.ts
diff --git a/x-pack/legacy/plugins/uptime/public/state/api/snapshot.ts b/x-pack/plugins/uptime/public/state/api/snapshot.ts
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/state/api/snapshot.ts
rename to x-pack/plugins/uptime/public/state/api/snapshot.ts
diff --git a/x-pack/legacy/plugins/uptime/public/state/api/types.ts b/x-pack/plugins/uptime/public/state/api/types.ts
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/state/api/types.ts
rename to x-pack/plugins/uptime/public/state/api/types.ts
diff --git a/x-pack/legacy/plugins/uptime/public/state/api/utils.ts b/x-pack/plugins/uptime/public/state/api/utils.ts
similarity index 95%
rename from x-pack/legacy/plugins/uptime/public/state/api/utils.ts
rename to x-pack/plugins/uptime/public/state/api/utils.ts
index e67efa8570c11..acd9bec5a74bc 100644
--- a/x-pack/legacy/plugins/uptime/public/state/api/utils.ts
+++ b/x-pack/plugins/uptime/public/state/api/utils.ts
@@ -6,7 +6,7 @@
import { PathReporter } from 'io-ts/lib/PathReporter';
import { isRight } from 'fp-ts/lib/Either';
-import { HttpFetchQuery, HttpSetup } from '../../../../../../../target/types/core/public';
+import { HttpFetchQuery, HttpSetup } from '../../../../../../target/types/core/public';
class ApiService {
private static instance: ApiService;
diff --git a/x-pack/legacy/plugins/uptime/public/state/effects/__tests__/fetch_effect.test.ts b/x-pack/plugins/uptime/public/state/effects/__tests__/fetch_effect.test.ts
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/state/effects/__tests__/fetch_effect.test.ts
rename to x-pack/plugins/uptime/public/state/effects/__tests__/fetch_effect.test.ts
diff --git a/x-pack/legacy/plugins/uptime/public/state/effects/dynamic_settings.ts b/x-pack/plugins/uptime/public/state/effects/dynamic_settings.ts
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/state/effects/dynamic_settings.ts
rename to x-pack/plugins/uptime/public/state/effects/dynamic_settings.ts
diff --git a/x-pack/legacy/plugins/uptime/public/state/effects/fetch_effect.ts b/x-pack/plugins/uptime/public/state/effects/fetch_effect.ts
similarity index 94%
rename from x-pack/legacy/plugins/uptime/public/state/effects/fetch_effect.ts
rename to x-pack/plugins/uptime/public/state/effects/fetch_effect.ts
index b0734cb5ccabb..0aa85609fe4f0 100644
--- a/x-pack/legacy/plugins/uptime/public/state/effects/fetch_effect.ts
+++ b/x-pack/plugins/uptime/public/state/effects/fetch_effect.ts
@@ -6,7 +6,7 @@
import { call, put } from 'redux-saga/effects';
import { Action } from 'redux-actions';
-import { IHttpFetchError } from '../../../../../../../target/types/core/public/http';
+import { IHttpFetchError } from '../../../../../../target/types/core/public/http';
/**
* Factory function for a fetch effect. It expects three action creators,
diff --git a/x-pack/legacy/plugins/uptime/public/state/effects/index.ts b/x-pack/plugins/uptime/public/state/effects/index.ts
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/state/effects/index.ts
rename to x-pack/plugins/uptime/public/state/effects/index.ts
diff --git a/x-pack/legacy/plugins/uptime/public/state/effects/index_pattern.ts b/x-pack/plugins/uptime/public/state/effects/index_pattern.ts
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/state/effects/index_pattern.ts
rename to x-pack/plugins/uptime/public/state/effects/index_pattern.ts
diff --git a/x-pack/legacy/plugins/uptime/public/state/effects/index_status.ts b/x-pack/plugins/uptime/public/state/effects/index_status.ts
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/state/effects/index_status.ts
rename to x-pack/plugins/uptime/public/state/effects/index_status.ts
diff --git a/x-pack/legacy/plugins/uptime/public/state/effects/ml_anomaly.ts b/x-pack/plugins/uptime/public/state/effects/ml_anomaly.ts
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/state/effects/ml_anomaly.ts
rename to x-pack/plugins/uptime/public/state/effects/ml_anomaly.ts
diff --git a/x-pack/legacy/plugins/uptime/public/state/effects/monitor.ts b/x-pack/plugins/uptime/public/state/effects/monitor.ts
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/state/effects/monitor.ts
rename to x-pack/plugins/uptime/public/state/effects/monitor.ts
diff --git a/x-pack/legacy/plugins/uptime/public/state/effects/monitor_duration.ts b/x-pack/plugins/uptime/public/state/effects/monitor_duration.ts
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/state/effects/monitor_duration.ts
rename to x-pack/plugins/uptime/public/state/effects/monitor_duration.ts
diff --git a/x-pack/legacy/plugins/uptime/public/state/effects/monitor_list.ts b/x-pack/plugins/uptime/public/state/effects/monitor_list.ts
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/state/effects/monitor_list.ts
rename to x-pack/plugins/uptime/public/state/effects/monitor_list.ts
diff --git a/x-pack/legacy/plugins/uptime/public/state/effects/monitor_status.ts b/x-pack/plugins/uptime/public/state/effects/monitor_status.ts
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/state/effects/monitor_status.ts
rename to x-pack/plugins/uptime/public/state/effects/monitor_status.ts
diff --git a/x-pack/legacy/plugins/uptime/public/state/effects/overview_filters.ts b/x-pack/plugins/uptime/public/state/effects/overview_filters.ts
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/state/effects/overview_filters.ts
rename to x-pack/plugins/uptime/public/state/effects/overview_filters.ts
diff --git a/x-pack/legacy/plugins/uptime/public/state/effects/ping.ts b/x-pack/plugins/uptime/public/state/effects/ping.ts
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/state/effects/ping.ts
rename to x-pack/plugins/uptime/public/state/effects/ping.ts
diff --git a/x-pack/legacy/plugins/uptime/public/state/effects/snapshot.ts b/x-pack/plugins/uptime/public/state/effects/snapshot.ts
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/state/effects/snapshot.ts
rename to x-pack/plugins/uptime/public/state/effects/snapshot.ts
diff --git a/x-pack/legacy/plugins/uptime/public/state/index.ts b/x-pack/plugins/uptime/public/state/index.ts
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/state/index.ts
rename to x-pack/plugins/uptime/public/state/index.ts
diff --git a/x-pack/legacy/plugins/uptime/public/state/kibana_service.ts b/x-pack/plugins/uptime/public/state/kibana_service.ts
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/state/kibana_service.ts
rename to x-pack/plugins/uptime/public/state/kibana_service.ts
diff --git a/x-pack/legacy/plugins/uptime/public/state/reducers/__tests__/__snapshots__/snapshot.test.ts.snap b/x-pack/plugins/uptime/public/state/reducers/__tests__/__snapshots__/snapshot.test.ts.snap
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/state/reducers/__tests__/__snapshots__/snapshot.test.ts.snap
rename to x-pack/plugins/uptime/public/state/reducers/__tests__/__snapshots__/snapshot.test.ts.snap
diff --git a/x-pack/legacy/plugins/uptime/public/state/reducers/__tests__/__snapshots__/ui.test.ts.snap b/x-pack/plugins/uptime/public/state/reducers/__tests__/__snapshots__/ui.test.ts.snap
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/state/reducers/__tests__/__snapshots__/ui.test.ts.snap
rename to x-pack/plugins/uptime/public/state/reducers/__tests__/__snapshots__/ui.test.ts.snap
diff --git a/x-pack/legacy/plugins/uptime/public/state/reducers/__tests__/snapshot.test.ts b/x-pack/plugins/uptime/public/state/reducers/__tests__/snapshot.test.ts
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/state/reducers/__tests__/snapshot.test.ts
rename to x-pack/plugins/uptime/public/state/reducers/__tests__/snapshot.test.ts
diff --git a/x-pack/legacy/plugins/uptime/public/state/reducers/__tests__/ui.test.ts b/x-pack/plugins/uptime/public/state/reducers/__tests__/ui.test.ts
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/state/reducers/__tests__/ui.test.ts
rename to x-pack/plugins/uptime/public/state/reducers/__tests__/ui.test.ts
diff --git a/x-pack/legacy/plugins/uptime/public/state/reducers/dynamic_settings.ts b/x-pack/plugins/uptime/public/state/reducers/dynamic_settings.ts
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/state/reducers/dynamic_settings.ts
rename to x-pack/plugins/uptime/public/state/reducers/dynamic_settings.ts
diff --git a/x-pack/legacy/plugins/uptime/public/state/reducers/index.ts b/x-pack/plugins/uptime/public/state/reducers/index.ts
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/state/reducers/index.ts
rename to x-pack/plugins/uptime/public/state/reducers/index.ts
diff --git a/x-pack/legacy/plugins/uptime/public/state/reducers/index_pattern.ts b/x-pack/plugins/uptime/public/state/reducers/index_pattern.ts
similarity index 92%
rename from x-pack/legacy/plugins/uptime/public/state/reducers/index_pattern.ts
rename to x-pack/plugins/uptime/public/state/reducers/index_pattern.ts
index bc482e2f35c45..b357f5a904ea6 100644
--- a/x-pack/legacy/plugins/uptime/public/state/reducers/index_pattern.ts
+++ b/x-pack/plugins/uptime/public/state/reducers/index_pattern.ts
@@ -5,7 +5,7 @@
*/
import { handleActions, Action } from 'redux-actions';
import { getIndexPattern, getIndexPatternSuccess, getIndexPatternFail } from '../actions';
-import { IIndexPattern } from '../../../../../../../src/plugins/data/common/index_patterns';
+import { IIndexPattern } from '../../../../../../src/plugins/data/common/index_patterns';
export interface IndexPatternState {
index_pattern: IIndexPattern | null;
diff --git a/x-pack/legacy/plugins/uptime/public/state/reducers/index_status.ts b/x-pack/plugins/uptime/public/state/reducers/index_status.ts
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/state/reducers/index_status.ts
rename to x-pack/plugins/uptime/public/state/reducers/index_status.ts
diff --git a/x-pack/legacy/plugins/uptime/public/state/reducers/ml_anomaly.ts b/x-pack/plugins/uptime/public/state/reducers/ml_anomaly.ts
similarity index 88%
rename from x-pack/legacy/plugins/uptime/public/state/reducers/ml_anomaly.ts
rename to x-pack/plugins/uptime/public/state/reducers/ml_anomaly.ts
index df5e825c3488b..61e03a9592921 100644
--- a/x-pack/legacy/plugins/uptime/public/state/reducers/ml_anomaly.ts
+++ b/x-pack/plugins/uptime/public/state/reducers/ml_anomaly.ts
@@ -15,11 +15,11 @@ import {
getMLCapabilitiesAction,
} from '../actions';
import { getAsyncInitialState, handleAsyncAction } from './utils';
-import { IHttpFetchError } from '../../../../../../../target/types/core/public/http';
+import { IHttpFetchError } from '../../../../../../target/types/core/public/http';
import { AsyncInitialState } from './types';
-import { MlCapabilitiesResponse } from '../../../../../../plugins/ml/common/types/capabilities';
+import { MlCapabilitiesResponse } from '../../../../../plugins/ml/common/types/capabilities';
import { CreateMLJobSuccess, DeleteJobResults } from '../actions/types';
-import { JobExistResult } from '../../../../../../plugins/ml/common/types/data_recognizer';
+import { JobExistResult } from '../../../../../plugins/ml/common/types/data_recognizer';
export interface MLJobState {
mlJob: AsyncInitialState;
diff --git a/x-pack/legacy/plugins/uptime/public/state/reducers/monitor.ts b/x-pack/plugins/uptime/public/state/reducers/monitor.ts
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/state/reducers/monitor.ts
rename to x-pack/plugins/uptime/public/state/reducers/monitor.ts
diff --git a/x-pack/legacy/plugins/uptime/public/state/reducers/monitor_duration.ts b/x-pack/plugins/uptime/public/state/reducers/monitor_duration.ts
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/state/reducers/monitor_duration.ts
rename to x-pack/plugins/uptime/public/state/reducers/monitor_duration.ts
diff --git a/x-pack/legacy/plugins/uptime/public/state/reducers/monitor_list.ts b/x-pack/plugins/uptime/public/state/reducers/monitor_list.ts
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/state/reducers/monitor_list.ts
rename to x-pack/plugins/uptime/public/state/reducers/monitor_list.ts
diff --git a/x-pack/legacy/plugins/uptime/public/state/reducers/monitor_status.ts b/x-pack/plugins/uptime/public/state/reducers/monitor_status.ts
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/state/reducers/monitor_status.ts
rename to x-pack/plugins/uptime/public/state/reducers/monitor_status.ts
diff --git a/x-pack/legacy/plugins/uptime/public/state/reducers/overview_filters.ts b/x-pack/plugins/uptime/public/state/reducers/overview_filters.ts
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/state/reducers/overview_filters.ts
rename to x-pack/plugins/uptime/public/state/reducers/overview_filters.ts
diff --git a/x-pack/legacy/plugins/uptime/public/state/reducers/ping.ts b/x-pack/plugins/uptime/public/state/reducers/ping.ts
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/state/reducers/ping.ts
rename to x-pack/plugins/uptime/public/state/reducers/ping.ts
diff --git a/x-pack/legacy/plugins/uptime/public/state/reducers/ping_list.ts b/x-pack/plugins/uptime/public/state/reducers/ping_list.ts
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/state/reducers/ping_list.ts
rename to x-pack/plugins/uptime/public/state/reducers/ping_list.ts
diff --git a/x-pack/legacy/plugins/uptime/public/state/reducers/snapshot.ts b/x-pack/plugins/uptime/public/state/reducers/snapshot.ts
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/state/reducers/snapshot.ts
rename to x-pack/plugins/uptime/public/state/reducers/snapshot.ts
diff --git a/x-pack/legacy/plugins/uptime/public/state/reducers/types.ts b/x-pack/plugins/uptime/public/state/reducers/types.ts
similarity index 81%
rename from x-pack/legacy/plugins/uptime/public/state/reducers/types.ts
rename to x-pack/plugins/uptime/public/state/reducers/types.ts
index 88995a2f5dd70..c81ee6875f305 100644
--- a/x-pack/legacy/plugins/uptime/public/state/reducers/types.ts
+++ b/x-pack/plugins/uptime/public/state/reducers/types.ts
@@ -4,7 +4,7 @@
* you may not use this file except in compliance with the Elastic License.
*/
-import { IHttpFetchError } from '../../../../../../../target/types/core/public/http';
+import { IHttpFetchError } from '../../../../../../target/types/core/public/http';
export interface AsyncInitialState {
data: ReduceStateType | null;
diff --git a/x-pack/legacy/plugins/uptime/public/state/reducers/ui.ts b/x-pack/plugins/uptime/public/state/reducers/ui.ts
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/state/reducers/ui.ts
rename to x-pack/plugins/uptime/public/state/reducers/ui.ts
diff --git a/x-pack/legacy/plugins/uptime/public/state/reducers/utils.ts b/x-pack/plugins/uptime/public/state/reducers/utils.ts
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/state/reducers/utils.ts
rename to x-pack/plugins/uptime/public/state/reducers/utils.ts
diff --git a/x-pack/legacy/plugins/uptime/public/state/selectors/__tests__/index.test.ts b/x-pack/plugins/uptime/public/state/selectors/__tests__/index.test.ts
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/state/selectors/__tests__/index.test.ts
rename to x-pack/plugins/uptime/public/state/selectors/__tests__/index.test.ts
diff --git a/x-pack/legacy/plugins/uptime/public/state/selectors/index.ts b/x-pack/plugins/uptime/public/state/selectors/index.ts
similarity index 100%
rename from x-pack/legacy/plugins/uptime/public/state/selectors/index.ts
rename to x-pack/plugins/uptime/public/state/selectors/index.ts
diff --git a/x-pack/legacy/plugins/uptime/public/uptime_app.tsx b/x-pack/plugins/uptime/public/uptime_app.tsx
similarity index 75%
rename from x-pack/legacy/plugins/uptime/public/uptime_app.tsx
rename to x-pack/plugins/uptime/public/uptime_app.tsx
index 92775a2663863..0d18f959230d1 100644
--- a/x-pack/legacy/plugins/uptime/public/uptime_app.tsx
+++ b/x-pack/plugins/uptime/public/uptime_app.tsx
@@ -10,13 +10,14 @@ import React, { useEffect } from 'react';
import { Provider as ReduxProvider } from 'react-redux';
import { BrowserRouter as Router } from 'react-router-dom';
import { I18nStart, ChromeBreadcrumb, CoreStart } from 'src/core/public';
-import { PluginsSetup } from 'ui/new_platform/new_platform';
-import { KibanaContextProvider } from '../../../../../src/plugins/kibana_react/public';
+import { KibanaContextProvider } from '../../../../src/plugins/kibana_react/public';
+import { ClientPluginsSetup, ClientPluginsStart } from './apps/plugin';
import { UMUpdateBadge } from './lib/lib';
import {
UptimeRefreshContextProvider,
UptimeSettingsContextProvider,
UptimeThemeContextProvider,
+ UptimeStartupPluginsContextProvider,
} from './contexts';
import { CommonlyUsedRange } from './components/common/uptime_date_picker';
import { store } from './state';
@@ -47,7 +48,8 @@ export interface UptimeAppProps {
isInfraAvailable: boolean;
isLogsAvailable: boolean;
kibanaBreadcrumbs: ChromeBreadcrumb[];
- plugins: PluginsSetup;
+ plugins: ClientPluginsSetup;
+ startPlugins: ClientPluginsStart;
routerBasename: string;
setBadge: UMUpdateBadge;
renderGlobalHelpControls(): void;
@@ -66,6 +68,7 @@ const Application = (props: UptimeAppProps) => {
renderGlobalHelpControls,
routerBasename,
setBadge,
+ startPlugins,
} = props;
useEffect(() => {
@@ -87,7 +90,6 @@ const Application = (props: UptimeAppProps) => {
kibanaService.core = core;
- // @ts-ignore
store.dispatch(setBasePath(basePath));
return (
@@ -99,17 +101,19 @@ const Application = (props: UptimeAppProps) => {
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
diff --git a/x-pack/plugins/uptime/server/kibana.index.ts b/x-pack/plugins/uptime/server/kibana.index.ts
index 725b53aeca02d..d68bbabe82b86 100644
--- a/x-pack/plugins/uptime/server/kibana.index.ts
+++ b/x-pack/plugins/uptime/server/kibana.index.ts
@@ -5,7 +5,7 @@
*/
import { Request, Server } from 'hapi';
-import { PLUGIN } from '../../../legacy/plugins/uptime/common/constants';
+import { PLUGIN } from '../common/constants';
import { compose } from './lib/compose/kibana';
import { initUptimeServer } from './uptime_server';
import { UptimeCorePlugins, UptimeCoreSetup } from './lib/adapters/framework';
diff --git a/x-pack/plugins/uptime/server/lib/adapters/framework/adapter_types.ts b/x-pack/plugins/uptime/server/lib/adapters/framework/adapter_types.ts
index 98c6be5aa3c8e..f4d1c72770494 100644
--- a/x-pack/plugins/uptime/server/lib/adapters/framework/adapter_types.ts
+++ b/x-pack/plugins/uptime/server/lib/adapters/framework/adapter_types.ts
@@ -13,7 +13,7 @@ import {
} from 'src/core/server';
import { UMKibanaRoute } from '../../../rest_api';
import { PluginSetupContract } from '../../../../../features/server';
-import { DynamicSettings } from '../../../../../../legacy/plugins/uptime/common/runtime_types';
+import { DynamicSettings } from '../../../../common/runtime_types';
export type APICaller = (
endpoint: string,
@@ -31,7 +31,7 @@ export type UMSavedObjectsQueryFn = (
) => Promise | T;
export interface UptimeCoreSetup {
- route: IRouter;
+ router: IRouter;
}
export interface UptimeCorePlugins {
diff --git a/x-pack/plugins/uptime/server/lib/adapters/framework/kibana_framework_adapter.ts b/x-pack/plugins/uptime/server/lib/adapters/framework/kibana_framework_adapter.ts
index 0176471aec1be..46f46720d4c04 100644
--- a/x-pack/plugins/uptime/server/lib/adapters/framework/kibana_framework_adapter.ts
+++ b/x-pack/plugins/uptime/server/lib/adapters/framework/kibana_framework_adapter.ts
@@ -21,10 +21,10 @@ export class UMKibanaBackendFrameworkAdapter implements UMBackendFrameworkAdapte
};
switch (method) {
case 'GET':
- this.server.route.get(routeDefinition, handler);
+ this.server.router.get(routeDefinition, handler);
break;
case 'POST':
- this.server.route.post(routeDefinition, handler);
+ this.server.router.post(routeDefinition, handler);
break;
default:
throw new Error(`Handler for method ${method} is not defined`);
diff --git a/x-pack/plugins/uptime/server/lib/alerts/__tests__/status_check.test.ts b/x-pack/plugins/uptime/server/lib/alerts/__tests__/status_check.test.ts
index 4f4c6e3011ad1..24da3f3fa4d06 100644
--- a/x-pack/plugins/uptime/server/lib/alerts/__tests__/status_check.test.ts
+++ b/x-pack/plugins/uptime/server/lib/alerts/__tests__/status_check.test.ts
@@ -16,7 +16,7 @@ import { AlertType } from '../../../../../alerting/server';
import { IRouter } from 'kibana/server';
import { UMServerLibs } from '../../lib';
import { UptimeCoreSetup } from '../../adapters';
-import { DYNAMIC_SETTINGS_DEFAULTS } from '../../../../../../legacy/plugins/uptime/common/constants';
+import { DYNAMIC_SETTINGS_DEFAULTS } from '../../../../common/constants';
import { alertsMock, AlertServicesMock } from '../../../../../alerting/server/mocks';
/**
@@ -27,10 +27,10 @@ import { alertsMock, AlertServicesMock } from '../../../../../alerting/server/mo
* so we don't have to mock them all for each test.
*/
const bootstrapDependencies = (customRequests?: any) => {
- const route: IRouter = {} as IRouter;
+ const router: IRouter = {} as IRouter;
// these server/libs parameters don't have any functionality, which is fine
// because we aren't testing them here
- const server: UptimeCoreSetup = { route };
+ const server: UptimeCoreSetup = { router };
const libs: UMServerLibs = { requests: {} } as UMServerLibs;
libs.requests = { ...libs.requests, ...customRequests };
return { server, libs };
diff --git a/x-pack/plugins/uptime/server/lib/alerts/status_check.ts b/x-pack/plugins/uptime/server/lib/alerts/status_check.ts
index 829e6f92d3702..f9df559a3977b 100644
--- a/x-pack/plugins/uptime/server/lib/alerts/status_check.ts
+++ b/x-pack/plugins/uptime/server/lib/alerts/status_check.ts
@@ -9,14 +9,14 @@ import { isRight } from 'fp-ts/lib/Either';
import { ThrowReporter } from 'io-ts/lib/ThrowReporter';
import { i18n } from '@kbn/i18n';
import { AlertExecutorOptions } from '../../../../alerting/server';
-import { ACTION_GROUP_DEFINITIONS } from '../../../../../legacy/plugins/uptime/common/constants';
import { UptimeAlertTypeFactory } from './types';
import { GetMonitorStatusResult } from '../requests';
import {
StatusCheckExecutorParamsType,
StatusCheckAlertStateType,
StatusCheckAlertState,
-} from '../../../../../legacy/plugins/uptime/common/runtime_types';
+} from '../../../common/runtime_types';
+import { ACTION_GROUP_DEFINITIONS } from '../../../common/constants';
import { savedObjectsAdapter } from '../saved_objects';
const { MONITOR_STATUS } = ACTION_GROUP_DEFINITIONS;
diff --git a/x-pack/plugins/uptime/server/lib/helper/get_histogram_interval.ts b/x-pack/plugins/uptime/server/lib/helper/get_histogram_interval.ts
index fb44f5727aab3..26515fb4b4c63 100644
--- a/x-pack/plugins/uptime/server/lib/helper/get_histogram_interval.ts
+++ b/x-pack/plugins/uptime/server/lib/helper/get_histogram_interval.ts
@@ -5,7 +5,7 @@
*/
import DateMath from '@elastic/datemath';
-import { QUERY } from '../../../../../legacy/plugins/uptime/common/constants';
+import { QUERY } from '../../../common/constants';
export const parseRelativeDate = (dateStr: string, options = {}) => {
// We need this this parsing because if user selects This week or this date
diff --git a/x-pack/plugins/uptime/server/lib/requests/__tests__/get_certs.test.ts b/x-pack/plugins/uptime/server/lib/requests/__tests__/get_certs.test.ts
index b49a6b22ff976..894e2316dc927 100644
--- a/x-pack/plugins/uptime/server/lib/requests/__tests__/get_certs.test.ts
+++ b/x-pack/plugins/uptime/server/lib/requests/__tests__/get_certs.test.ts
@@ -5,7 +5,7 @@
*/
import { getCerts } from '../get_certs';
-import { DYNAMIC_SETTINGS_DEFAULTS } from '../../../../../../legacy/plugins/uptime/common/constants';
+import { DYNAMIC_SETTINGS_DEFAULTS } from '../../../../common/constants';
describe('getCerts', () => {
let mockHits: any;
diff --git a/x-pack/plugins/uptime/server/lib/requests/__tests__/get_latest_monitor.test.ts b/x-pack/plugins/uptime/server/lib/requests/__tests__/get_latest_monitor.test.ts
index 03e2bc7a44bd0..75bf5096bd997 100644
--- a/x-pack/plugins/uptime/server/lib/requests/__tests__/get_latest_monitor.test.ts
+++ b/x-pack/plugins/uptime/server/lib/requests/__tests__/get_latest_monitor.test.ts
@@ -5,7 +5,7 @@
*/
import { getLatestMonitor } from '../get_latest_monitor';
-import { DYNAMIC_SETTINGS_DEFAULTS } from '../../../../../../legacy/plugins/uptime/common/constants';
+import { DYNAMIC_SETTINGS_DEFAULTS } from '../../../../common/constants';
describe('getLatestMonitor', () => {
let expectedGetLatestSearchParams: any;
diff --git a/x-pack/plugins/uptime/server/lib/requests/__tests__/get_monitor_charts.test.ts b/x-pack/plugins/uptime/server/lib/requests/__tests__/get_monitor_charts.test.ts
index 5d3f9ce8d4ad9..45be1df3e8d3b 100644
--- a/x-pack/plugins/uptime/server/lib/requests/__tests__/get_monitor_charts.test.ts
+++ b/x-pack/plugins/uptime/server/lib/requests/__tests__/get_monitor_charts.test.ts
@@ -7,7 +7,7 @@
import { set } from 'lodash';
import mockChartsData from './monitor_charts_mock.json';
import { getMonitorDurationChart } from '../get_monitor_duration';
-import { DYNAMIC_SETTINGS_DEFAULTS } from '../../../../../../legacy/plugins/uptime/common/constants';
+import { DYNAMIC_SETTINGS_DEFAULTS } from '../../../../common/constants';
describe('ElasticsearchMonitorsAdapter', () => {
it('getMonitorChartsData will provide expected filters', async () => {
diff --git a/x-pack/plugins/uptime/server/lib/requests/__tests__/get_monitor_status.test.ts b/x-pack/plugins/uptime/server/lib/requests/__tests__/get_monitor_status.test.ts
index e47be617d7c99..82e624221c301 100644
--- a/x-pack/plugins/uptime/server/lib/requests/__tests__/get_monitor_status.test.ts
+++ b/x-pack/plugins/uptime/server/lib/requests/__tests__/get_monitor_status.test.ts
@@ -6,8 +6,8 @@
import { elasticsearchServiceMock } from '../../../../../../../src/core/server/mocks';
import { getMonitorStatus } from '../get_monitor_status';
-import { DYNAMIC_SETTINGS_DEFAULTS } from '../../../../../../legacy/plugins/uptime/common/constants';
import { ScopedClusterClient } from 'src/core/server';
+import { DYNAMIC_SETTINGS_DEFAULTS } from '../../../../common/constants';
interface BucketItemCriteria {
monitor_id: string;
diff --git a/x-pack/plugins/uptime/server/lib/requests/__tests__/get_ping_histogram.test.ts b/x-pack/plugins/uptime/server/lib/requests/__tests__/get_ping_histogram.test.ts
index 4de7d3ffd2a7d..e456670a5e68d 100644
--- a/x-pack/plugins/uptime/server/lib/requests/__tests__/get_ping_histogram.test.ts
+++ b/x-pack/plugins/uptime/server/lib/requests/__tests__/get_ping_histogram.test.ts
@@ -5,7 +5,7 @@
*/
import { getPingHistogram } from '../get_ping_histogram';
-import { DYNAMIC_SETTINGS_DEFAULTS } from '../../../../../../legacy/plugins/uptime/common/constants';
+import { DYNAMIC_SETTINGS_DEFAULTS } from '../../../../common/constants';
describe('getPingHistogram', () => {
const standardMockResponse: any = {
diff --git a/x-pack/plugins/uptime/server/lib/requests/__tests__/get_pings.test.ts b/x-pack/plugins/uptime/server/lib/requests/__tests__/get_pings.test.ts
index abd3655cc6402..fd890a30cf742 100644
--- a/x-pack/plugins/uptime/server/lib/requests/__tests__/get_pings.test.ts
+++ b/x-pack/plugins/uptime/server/lib/requests/__tests__/get_pings.test.ts
@@ -6,7 +6,7 @@
import { getPings } from '../get_pings';
import { set } from 'lodash';
-import { DYNAMIC_SETTINGS_DEFAULTS } from '../../../../../../legacy/plugins/uptime/common/constants';
+import { DYNAMIC_SETTINGS_DEFAULTS } from '../../../../common/constants';
describe('getAll', () => {
let mockEsSearchResult: any;
diff --git a/x-pack/plugins/uptime/server/lib/requests/get_certs.ts b/x-pack/plugins/uptime/server/lib/requests/get_certs.ts
index 4f99fbe94d54c..b427e7cae1a7e 100644
--- a/x-pack/plugins/uptime/server/lib/requests/get_certs.ts
+++ b/x-pack/plugins/uptime/server/lib/requests/get_certs.ts
@@ -5,7 +5,7 @@
*/
import { UMElasticsearchQueryFn } from '../adapters';
-import { Cert, GetCertsParams } from '../../../../../legacy/plugins/uptime/common/runtime_types';
+import { Cert, GetCertsParams } from '../../../common/runtime_types';
export const getCerts: UMElasticsearchQueryFn = async ({
callES,
diff --git a/x-pack/plugins/uptime/server/lib/requests/get_filter_bar.ts b/x-pack/plugins/uptime/server/lib/requests/get_filter_bar.ts
index 95d23ddcbf466..dbe71cf689214 100644
--- a/x-pack/plugins/uptime/server/lib/requests/get_filter_bar.ts
+++ b/x-pack/plugins/uptime/server/lib/requests/get_filter_bar.ts
@@ -5,7 +5,7 @@
*/
import { UMElasticsearchQueryFn } from '../adapters';
-import { OverviewFilters } from '../../../../../legacy/plugins/uptime/common/runtime_types';
+import { OverviewFilters } from '../../../common/runtime_types';
import { generateFilterAggs } from './generate_filter_aggs';
export interface GetFilterBarParams {
diff --git a/x-pack/plugins/uptime/server/lib/requests/get_index_status.ts b/x-pack/plugins/uptime/server/lib/requests/get_index_status.ts
index 6f7854d35b308..7688f04f1acd9 100644
--- a/x-pack/plugins/uptime/server/lib/requests/get_index_status.ts
+++ b/x-pack/plugins/uptime/server/lib/requests/get_index_status.ts
@@ -5,7 +5,7 @@
*/
import { UMElasticsearchQueryFn } from '../adapters';
-import { StatesIndexStatus } from '../../../../../legacy/plugins/uptime/common/runtime_types';
+import { StatesIndexStatus } from '../../../common/runtime_types';
export const getIndexStatus: UMElasticsearchQueryFn<{}, StatesIndexStatus> = async ({
callES,
diff --git a/x-pack/plugins/uptime/server/lib/requests/get_latest_monitor.ts b/x-pack/plugins/uptime/server/lib/requests/get_latest_monitor.ts
index a8e9ccb875a08..98ce449002f21 100644
--- a/x-pack/plugins/uptime/server/lib/requests/get_latest_monitor.ts
+++ b/x-pack/plugins/uptime/server/lib/requests/get_latest_monitor.ts
@@ -5,7 +5,7 @@
*/
import { UMElasticsearchQueryFn } from '../adapters';
-import { Ping } from '../../../../../legacy/plugins/uptime/common/runtime_types';
+import { Ping } from '../../../common/runtime_types';
export interface GetLatestMonitorParams {
/** @member dateRangeStart timestamp bounds */
diff --git a/x-pack/plugins/uptime/server/lib/requests/get_monitor_details.ts b/x-pack/plugins/uptime/server/lib/requests/get_monitor_details.ts
index 4ce7176b57b19..cf4ffa339ddfc 100644
--- a/x-pack/plugins/uptime/server/lib/requests/get_monitor_details.ts
+++ b/x-pack/plugins/uptime/server/lib/requests/get_monitor_details.ts
@@ -5,10 +5,7 @@
*/
import { UMElasticsearchQueryFn } from '../adapters';
-import {
- MonitorDetails,
- MonitorError,
-} from '../../../../../legacy/plugins/uptime/common/runtime_types';
+import { MonitorDetails, MonitorError } from '../../../common/runtime_types';
export interface GetMonitorDetailsParams {
monitorId: string;
diff --git a/x-pack/plugins/uptime/server/lib/requests/get_monitor_duration.ts b/x-pack/plugins/uptime/server/lib/requests/get_monitor_duration.ts
index e9c745b0a8713..ea2a7e790652b 100644
--- a/x-pack/plugins/uptime/server/lib/requests/get_monitor_duration.ts
+++ b/x-pack/plugins/uptime/server/lib/requests/get_monitor_duration.ts
@@ -5,11 +5,8 @@
*/
import { UMElasticsearchQueryFn } from '../adapters';
-import { QUERY } from '../../../../../legacy/plugins/uptime/common/constants';
-import {
- LocationDurationLine,
- MonitorDurationResult,
-} from '../../../../../legacy/plugins/uptime/common/types';
+import { LocationDurationLine, MonitorDurationResult } from '../../../common/types';
+import { QUERY } from '../../../common/constants';
export interface GetMonitorChartsParams {
/** @member monitorId ID value for the selected monitor */
diff --git a/x-pack/plugins/uptime/server/lib/requests/get_monitor_locations.ts b/x-pack/plugins/uptime/server/lib/requests/get_monitor_locations.ts
index f49e404ffb084..c8d3ca043edc5 100644
--- a/x-pack/plugins/uptime/server/lib/requests/get_monitor_locations.ts
+++ b/x-pack/plugins/uptime/server/lib/requests/get_monitor_locations.ts
@@ -5,11 +5,8 @@
*/
import { UMElasticsearchQueryFn } from '../adapters';
-import { UNNAMED_LOCATION } from '../../../../../legacy/plugins/uptime/common/constants';
-import {
- MonitorLocations,
- MonitorLocation,
-} from '../../../../../legacy/plugins/uptime/common/runtime_types';
+import { MonitorLocations, MonitorLocation } from '../../../common/runtime_types';
+import { UNNAMED_LOCATION } from '../../../common/constants';
/**
* Fetch data for the monitor page title.
diff --git a/x-pack/plugins/uptime/server/lib/requests/get_monitor_states.ts b/x-pack/plugins/uptime/server/lib/requests/get_monitor_states.ts
index 4b40943a85705..b1791dd04861c 100644
--- a/x-pack/plugins/uptime/server/lib/requests/get_monitor_states.ts
+++ b/x-pack/plugins/uptime/server/lib/requests/get_monitor_states.ts
@@ -4,15 +4,10 @@
* you may not use this file except in compliance with the Elastic License.
*/
-import { CONTEXT_DEFAULTS } from '../../../../../legacy/plugins/uptime/common/constants';
+import { CONTEXT_DEFAULTS } from '../../../common/constants';
import { fetchPage } from './search';
import { UMElasticsearchQueryFn } from '../adapters';
-import {
- SortOrder,
- CursorDirection,
- MonitorSummary,
-} from '../../../../../legacy/plugins/uptime/common/runtime_types';
-
+import { MonitorSummary, SortOrder, CursorDirection } from '../../../common/runtime_types';
import { QueryContext } from './search';
export interface CursorPagination {
diff --git a/x-pack/plugins/uptime/server/lib/requests/get_ping_histogram.ts b/x-pack/plugins/uptime/server/lib/requests/get_ping_histogram.ts
index 5a8927764ea5c..299913c8dff08 100644
--- a/x-pack/plugins/uptime/server/lib/requests/get_ping_histogram.ts
+++ b/x-pack/plugins/uptime/server/lib/requests/get_ping_histogram.ts
@@ -5,12 +5,9 @@
*/
import { UMElasticsearchQueryFn } from '../adapters';
-import { QUERY } from '../../../../../legacy/plugins/uptime/common/constants';
import { getFilterClause } from '../helper';
-import {
- HistogramResult,
- HistogramQueryResult,
-} from '../../../../../legacy/plugins/uptime/common/runtime_types';
+import { HistogramResult, HistogramQueryResult } from '../../../common/runtime_types';
+import { QUERY } from '../../../common/constants';
export interface GetPingHistogramParams {
/** @member dateRangeStart timestamp bounds */
diff --git a/x-pack/plugins/uptime/server/lib/requests/get_pings.ts b/x-pack/plugins/uptime/server/lib/requests/get_pings.ts
index 6eccfdb13cef7..a6a0e3c3d6542 100644
--- a/x-pack/plugins/uptime/server/lib/requests/get_pings.ts
+++ b/x-pack/plugins/uptime/server/lib/requests/get_pings.ts
@@ -10,7 +10,7 @@ import {
HttpResponseBody,
PingsResponse,
Ping,
-} from '../../../../../legacy/plugins/uptime/common/runtime_types';
+} from '../../../common/runtime_types';
const DEFAULT_PAGE_SIZE = 25;
diff --git a/x-pack/plugins/uptime/server/lib/requests/get_snapshot_counts.ts b/x-pack/plugins/uptime/server/lib/requests/get_snapshot_counts.ts
index 01f2ad88161cf..b57bc87d45418 100644
--- a/x-pack/plugins/uptime/server/lib/requests/get_snapshot_counts.ts
+++ b/x-pack/plugins/uptime/server/lib/requests/get_snapshot_counts.ts
@@ -5,8 +5,8 @@
*/
import { UMElasticsearchQueryFn } from '../adapters';
-import { Snapshot } from '../../../../../legacy/plugins/uptime/common/runtime_types';
-import { CONTEXT_DEFAULTS } from '../../../../../legacy/plugins/uptime/common/constants';
+import { CONTEXT_DEFAULTS } from '../../../common/constants';
+import { Snapshot } from '../../../common/runtime_types';
import { QueryContext } from './search';
export interface GetSnapshotCountParams {
diff --git a/x-pack/plugins/uptime/server/lib/requests/search/__tests__/fetch_page.test.ts b/x-pack/plugins/uptime/server/lib/requests/search/__tests__/fetch_page.test.ts
index 2a8f681ab3453..d4ad80c85ec3d 100644
--- a/x-pack/plugins/uptime/server/lib/requests/search/__tests__/fetch_page.test.ts
+++ b/x-pack/plugins/uptime/server/lib/requests/search/__tests__/fetch_page.test.ts
@@ -12,7 +12,7 @@ import {
MonitorGroupsPage,
} from '../fetch_page';
import { QueryContext } from '../query_context';
-import { MonitorSummary } from '../../../../../../../legacy/plugins/uptime/common/runtime_types';
+import { MonitorSummary } from '../../../../../common/runtime_types';
import { nextPagination, prevPagination, simpleQueryContext } from './test_helpers';
const simpleFixture: MonitorGroups[] = [
diff --git a/x-pack/plugins/uptime/server/lib/requests/search/__tests__/query_context.test.ts b/x-pack/plugins/uptime/server/lib/requests/search/__tests__/query_context.test.ts
index 84774cdeed856..e53fff429dd8d 100644
--- a/x-pack/plugins/uptime/server/lib/requests/search/__tests__/query_context.test.ts
+++ b/x-pack/plugins/uptime/server/lib/requests/search/__tests__/query_context.test.ts
@@ -6,10 +6,7 @@
import { QueryContext } from '../query_context';
import { CursorPagination } from '../types';
-import {
- CursorDirection,
- SortOrder,
-} from '../../../../../../../legacy/plugins/uptime/common/runtime_types';
+import { CursorDirection, SortOrder } from '../../../../../common/runtime_types';
describe(QueryContext, () => {
// 10 minute range
diff --git a/x-pack/plugins/uptime/server/lib/requests/search/__tests__/test_helpers.ts b/x-pack/plugins/uptime/server/lib/requests/search/__tests__/test_helpers.ts
index 47034c2130116..40775bde1c7f5 100644
--- a/x-pack/plugins/uptime/server/lib/requests/search/__tests__/test_helpers.ts
+++ b/x-pack/plugins/uptime/server/lib/requests/search/__tests__/test_helpers.ts
@@ -5,10 +5,7 @@
*/
import { CursorPagination } from '../types';
-import {
- CursorDirection,
- SortOrder,
-} from '../../../../../../../legacy/plugins/uptime/common/runtime_types';
+import { CursorDirection, SortOrder } from '../../../../../common/runtime_types';
import { QueryContext } from '../query_context';
export const prevPagination = (key: any): CursorPagination => {
diff --git a/x-pack/plugins/uptime/server/lib/requests/search/enrich_monitor_groups.ts b/x-pack/plugins/uptime/server/lib/requests/search/enrich_monitor_groups.ts
index 4739c804d24e7..d21259fad77a6 100644
--- a/x-pack/plugins/uptime/server/lib/requests/search/enrich_monitor_groups.ts
+++ b/x-pack/plugins/uptime/server/lib/requests/search/enrich_monitor_groups.ts
@@ -6,14 +6,14 @@
import { get, sortBy } from 'lodash';
import { QueryContext } from './query_context';
-import { QUERY, STATES } from '../../../../../../legacy/plugins/uptime/common/constants';
+import { QUERY, STATES } from '../../../../common/constants';
import {
Check,
Histogram,
MonitorSummary,
CursorDirection,
SortOrder,
-} from '../../../../../../legacy/plugins/uptime/common/runtime_types';
+} from '../../../../common/runtime_types';
import { MonitorEnricher } from './fetch_page';
export const enrichMonitorGroups: MonitorEnricher = async (
diff --git a/x-pack/plugins/uptime/server/lib/requests/search/fetch_page.ts b/x-pack/plugins/uptime/server/lib/requests/search/fetch_page.ts
index 84167840d5d9b..bef8106ad1896 100644
--- a/x-pack/plugins/uptime/server/lib/requests/search/fetch_page.ts
+++ b/x-pack/plugins/uptime/server/lib/requests/search/fetch_page.ts
@@ -7,12 +7,8 @@
import { flatten } from 'lodash';
import { CursorPagination } from './types';
import { QueryContext } from './query_context';
-import { QUERY } from '../../../../../../legacy/plugins/uptime/common/constants';
-import {
- CursorDirection,
- MonitorSummary,
- SortOrder,
-} from '../../../../../../legacy/plugins/uptime/common/runtime_types';
+import { QUERY } from '../../../../common/constants';
+import { CursorDirection, MonitorSummary, SortOrder } from '../../../../common/runtime_types';
import { enrichMonitorGroups } from './enrich_monitor_groups';
import { MonitorGroupIterator } from './monitor_group_iterator';
diff --git a/x-pack/plugins/uptime/server/lib/requests/search/find_potential_matches.ts b/x-pack/plugins/uptime/server/lib/requests/search/find_potential_matches.ts
index 3449febfa5b05..e60c52660915a 100644
--- a/x-pack/plugins/uptime/server/lib/requests/search/find_potential_matches.ts
+++ b/x-pack/plugins/uptime/server/lib/requests/search/find_potential_matches.ts
@@ -5,7 +5,7 @@
*/
import { get, set } from 'lodash';
-import { CursorDirection } from '../../../../../../legacy/plugins/uptime/common/runtime_types';
+import { CursorDirection } from '../../../../common/runtime_types';
import { QueryContext } from './query_context';
// This is the first phase of the query. In it, we find the most recent check groups that matched the given query.
diff --git a/x-pack/plugins/uptime/server/lib/requests/search/monitor_group_iterator.ts b/x-pack/plugins/uptime/server/lib/requests/search/monitor_group_iterator.ts
index 31d9166eb1e73..2fb9562028258 100644
--- a/x-pack/plugins/uptime/server/lib/requests/search/monitor_group_iterator.ts
+++ b/x-pack/plugins/uptime/server/lib/requests/search/monitor_group_iterator.ts
@@ -6,7 +6,7 @@
import { QueryContext } from './query_context';
import { fetchChunk } from './fetch_chunk';
-import { CursorDirection } from '../../../../../../legacy/plugins/uptime/common/runtime_types';
+import { CursorDirection } from '../../../../common/runtime_types';
import { MonitorGroups } from './fetch_page';
import { CursorPagination } from './types';
diff --git a/x-pack/plugins/uptime/server/lib/requests/search/refine_potential_matches.ts b/x-pack/plugins/uptime/server/lib/requests/search/refine_potential_matches.ts
index 43fc54fb25808..977c32ad1f984 100644
--- a/x-pack/plugins/uptime/server/lib/requests/search/refine_potential_matches.ts
+++ b/x-pack/plugins/uptime/server/lib/requests/search/refine_potential_matches.ts
@@ -5,7 +5,7 @@
*/
import { QueryContext } from './query_context';
-import { CursorDirection } from '../../../../../../legacy/plugins/uptime/common/runtime_types';
+import { CursorDirection } from '../../../../common/runtime_types';
import { MonitorGroups, MonitorLocCheckGroup } from './fetch_page';
/**
diff --git a/x-pack/plugins/uptime/server/lib/requests/search/types.ts b/x-pack/plugins/uptime/server/lib/requests/search/types.ts
index 2ec52d400b597..35e9647196454 100644
--- a/x-pack/plugins/uptime/server/lib/requests/search/types.ts
+++ b/x-pack/plugins/uptime/server/lib/requests/search/types.ts
@@ -4,10 +4,7 @@
* you may not use this file except in compliance with the Elastic License.
*/
-import {
- CursorDirection,
- SortOrder,
-} from '../../../../../../legacy/plugins/uptime/common/runtime_types';
+import { CursorDirection, SortOrder } from '../../../../common/runtime_types';
export interface CursorPagination {
cursorKey?: any;
diff --git a/x-pack/plugins/uptime/server/lib/requests/uptime_requests.ts b/x-pack/plugins/uptime/server/lib/requests/uptime_requests.ts
index 84154429b9188..69507d2950cd8 100644
--- a/x-pack/plugins/uptime/server/lib/requests/uptime_requests.ts
+++ b/x-pack/plugins/uptime/server/lib/requests/uptime_requests.ts
@@ -8,10 +8,17 @@ import { UMElasticsearchQueryFn } from '../adapters';
import {
HistogramResult,
Ping,
- PingsResponse as PingResults,
+ PingsResponse,
GetCertsParams,
GetPingsParams,
-} from '../../../../../legacy/plugins/uptime/common/runtime_types';
+ Cert,
+ OverviewFilters,
+ MonitorDetails,
+ MonitorLocations,
+ Snapshot,
+ StatesIndexStatus,
+} from '../../../common/runtime_types';
+import { MonitorDurationResult } from '../../../common/types';
import {
GetFilterBarParams,
GetLatestMonitorParams,
@@ -23,17 +30,8 @@ import {
GetMonitorStatusParams,
GetMonitorStatusResult,
} from '.';
-import {
- OverviewFilters,
- MonitorDetails,
- MonitorLocations,
- Snapshot,
- StatesIndexStatus,
- Cert,
-} from '../../../../../legacy/plugins/uptime/common/runtime_types';
import { GetMonitorStatesResult } from './get_monitor_states';
import { GetSnapshotCountParams } from './get_snapshot_counts';
-import { MonitorDurationResult } from '../../../../../legacy/plugins/uptime/common/types';
type ESQ = UMElasticsearchQueryFn
;
@@ -47,7 +45,7 @@ export interface UptimeRequests {
getMonitorLocations: ESQ;
getMonitorStates: ESQ;
getMonitorStatus: ESQ;
- getPings: ESQ;
+ getPings: ESQ;
getPingHistogram: ESQ;
getSnapshotCount: ESQ;
getIndexStatus: ESQ<{}, StatesIndexStatus>;
diff --git a/x-pack/plugins/uptime/server/lib/saved_objects.ts b/x-pack/plugins/uptime/server/lib/saved_objects.ts
index d849fbd8ce0a8..28b9eaad2cf6f 100644
--- a/x-pack/plugins/uptime/server/lib/saved_objects.ts
+++ b/x-pack/plugins/uptime/server/lib/saved_objects.ts
@@ -4,8 +4,8 @@
* you may not use this file except in compliance with the Elastic License.
*/
-import { DynamicSettings } from '../../../../legacy/plugins/uptime/common/runtime_types';
-import { DYNAMIC_SETTINGS_DEFAULTS } from '../../../../legacy/plugins/uptime/common/constants';
+import { DYNAMIC_SETTINGS_DEFAULTS } from '../../common/constants';
+import { DynamicSettings } from '../../common/runtime_types';
import { SavedObjectsType, SavedObjectsErrorHelpers } from '../../../../../src/core/server';
import { UMSavedObjectsQueryFn } from './adapters';
diff --git a/x-pack/plugins/uptime/server/plugin.ts b/x-pack/plugins/uptime/server/plugin.ts
index 7cc591a6b2db1..13d1ae216f204 100644
--- a/x-pack/plugins/uptime/server/plugin.ts
+++ b/x-pack/plugins/uptime/server/plugin.ts
@@ -8,19 +8,20 @@ import {
PluginInitializerContext,
CoreStart,
CoreSetup,
+ Plugin as PluginType,
ISavedObjectsRepository,
} from '../../../../src/core/server';
import { initServerWithKibana } from './kibana.index';
import { KibanaTelemetryAdapter, UptimeCorePlugins } from './lib/adapters';
import { umDynamicSettings } from './lib/saved_objects';
-export class Plugin {
+export class Plugin implements PluginType {
private savedObjectsClient?: ISavedObjectsRepository;
constructor(_initializerContext: PluginInitializerContext) {}
public setup(core: CoreSetup, plugins: UptimeCorePlugins) {
- initServerWithKibana({ route: core.http.createRouter() }, plugins);
+ initServerWithKibana({ router: core.http.createRouter() }, plugins);
core.savedObjects.registerType(umDynamicSettings);
KibanaTelemetryAdapter.registerUsageCollector(
plugins.usageCollection,
@@ -28,7 +29,9 @@ export class Plugin {
);
}
- public start(_core: CoreStart, _plugins: any) {
- this.savedObjectsClient = _core.savedObjects.createInternalRepository();
+ public start(core: CoreStart, _plugins: any) {
+ this.savedObjectsClient = core.savedObjects.createInternalRepository();
}
+
+ public stop() {}
}
diff --git a/x-pack/plugins/uptime/server/rest_api/certs.ts b/x-pack/plugins/uptime/server/rest_api/certs.ts
index 31fb3f4ab96a7..f2e1700b23e7d 100644
--- a/x-pack/plugins/uptime/server/rest_api/certs.ts
+++ b/x-pack/plugins/uptime/server/rest_api/certs.ts
@@ -7,7 +7,7 @@
import { schema } from '@kbn/config-schema';
import { UMServerLibs } from '../lib/lib';
import { UMRestApiRouteFactory } from '.';
-import { API_URLS } from '../../../../legacy/plugins/uptime/common/constants/rest_api';
+import { API_URLS } from '../../common/constants';
const DEFAULT_INDEX = 0;
const DEFAULT_SIZE = 25;
diff --git a/x-pack/plugins/uptime/server/rest_api/dynamic_settings.ts b/x-pack/plugins/uptime/server/rest_api/dynamic_settings.ts
index 3f4e2fc345182..31833a25ee8ac 100644
--- a/x-pack/plugins/uptime/server/rest_api/dynamic_settings.ts
+++ b/x-pack/plugins/uptime/server/rest_api/dynamic_settings.ts
@@ -8,10 +8,7 @@ import { schema } from '@kbn/config-schema';
import { isRight } from 'fp-ts/lib/Either';
import { PathReporter } from 'io-ts/lib/PathReporter';
import { UMServerLibs } from '../lib/lib';
-import {
- DynamicSettings,
- DynamicSettingsType,
-} from '../../../../legacy/plugins/uptime/common/runtime_types';
+import { DynamicSettings, DynamicSettingsType } from '../../common/runtime_types';
import { UMRestApiRouteFactory } from '.';
import { savedObjectsAdapter } from '../lib/saved_objects';
diff --git a/x-pack/plugins/uptime/server/rest_api/index_state/get_index_pattern.ts b/x-pack/plugins/uptime/server/rest_api/index_state/get_index_pattern.ts
index 689a75c5903a6..26715f0ff37b6 100644
--- a/x-pack/plugins/uptime/server/rest_api/index_state/get_index_pattern.ts
+++ b/x-pack/plugins/uptime/server/rest_api/index_state/get_index_pattern.ts
@@ -6,7 +6,7 @@
import { UMServerLibs } from '../../lib/lib';
import { UMRestApiRouteFactory } from '../types';
-import { API_URLS } from '../../../../../legacy/plugins/uptime/common/constants/rest_api';
+import { API_URLS } from '../../../common/constants';
export const createGetIndexPatternRoute: UMRestApiRouteFactory = (libs: UMServerLibs) => ({
method: 'GET',
diff --git a/x-pack/plugins/uptime/server/rest_api/index_state/get_index_status.ts b/x-pack/plugins/uptime/server/rest_api/index_state/get_index_status.ts
index 8ed73d90b2389..9a4280efa98f9 100644
--- a/x-pack/plugins/uptime/server/rest_api/index_state/get_index_status.ts
+++ b/x-pack/plugins/uptime/server/rest_api/index_state/get_index_status.ts
@@ -6,7 +6,7 @@
import { UMServerLibs } from '../../lib/lib';
import { UMRestApiRouteFactory } from '../types';
-import { API_URLS } from '../../../../../legacy/plugins/uptime/common/constants';
+import { API_URLS } from '../../../common/constants';
export const createGetIndexStatusRoute: UMRestApiRouteFactory = (libs: UMServerLibs) => ({
method: 'GET',
diff --git a/x-pack/plugins/uptime/server/rest_api/monitors/monitor_list.ts b/x-pack/plugins/uptime/server/rest_api/monitors/monitor_list.ts
index 5cb4e8a6241b7..60b3eafaa765e 100644
--- a/x-pack/plugins/uptime/server/rest_api/monitors/monitor_list.ts
+++ b/x-pack/plugins/uptime/server/rest_api/monitors/monitor_list.ts
@@ -6,8 +6,7 @@
import { schema } from '@kbn/config-schema';
import { UMRestApiRouteFactory } from '../types';
-import { CONTEXT_DEFAULTS } from '../../../../../legacy/plugins/uptime/common/constants';
-import { API_URLS } from '../../../../../legacy/plugins/uptime/common/constants/rest_api';
+import { API_URLS, CONTEXT_DEFAULTS } from '../../../common/constants';
export const createMonitorListRoute: UMRestApiRouteFactory = libs => ({
method: 'GET',
diff --git a/x-pack/plugins/uptime/server/rest_api/monitors/monitor_locations.ts b/x-pack/plugins/uptime/server/rest_api/monitors/monitor_locations.ts
index 66ce9871506d4..a110209043a7e 100644
--- a/x-pack/plugins/uptime/server/rest_api/monitors/monitor_locations.ts
+++ b/x-pack/plugins/uptime/server/rest_api/monitors/monitor_locations.ts
@@ -7,7 +7,7 @@
import { schema } from '@kbn/config-schema';
import { UMServerLibs } from '../../lib/lib';
import { UMRestApiRouteFactory } from '../types';
-import { API_URLS } from '../../../../../legacy/plugins/uptime/common/constants/rest_api';
+import { API_URLS } from '../../../common/constants';
export const createGetMonitorLocationsRoute: UMRestApiRouteFactory = (libs: UMServerLibs) => ({
method: 'GET',
diff --git a/x-pack/plugins/uptime/server/rest_api/monitors/monitor_status.ts b/x-pack/plugins/uptime/server/rest_api/monitors/monitor_status.ts
index 9cf1340fb9409..bb002f8a8c286 100644
--- a/x-pack/plugins/uptime/server/rest_api/monitors/monitor_status.ts
+++ b/x-pack/plugins/uptime/server/rest_api/monitors/monitor_status.ts
@@ -7,7 +7,7 @@
import { schema } from '@kbn/config-schema';
import { UMServerLibs } from '../../lib/lib';
import { UMRestApiRouteFactory } from '../types';
-import { API_URLS } from '../../../../../legacy/plugins/uptime/common/constants';
+import { API_URLS } from '../../../common/constants';
export const createGetStatusBarRoute: UMRestApiRouteFactory = (libs: UMServerLibs) => ({
method: 'GET',
diff --git a/x-pack/plugins/uptime/server/rest_api/monitors/monitors_details.ts b/x-pack/plugins/uptime/server/rest_api/monitors/monitors_details.ts
index 1cc010781457e..69e719efb0719 100644
--- a/x-pack/plugins/uptime/server/rest_api/monitors/monitors_details.ts
+++ b/x-pack/plugins/uptime/server/rest_api/monitors/monitors_details.ts
@@ -7,7 +7,7 @@
import { schema } from '@kbn/config-schema';
import { UMServerLibs } from '../../lib/lib';
import { UMRestApiRouteFactory } from '../types';
-import { API_URLS } from '../../../../../legacy/plugins/uptime/common/constants/rest_api';
+import { API_URLS } from '../../../common/constants';
export const createGetMonitorDetailsRoute: UMRestApiRouteFactory = (libs: UMServerLibs) => ({
method: 'GET',
diff --git a/x-pack/plugins/uptime/server/rest_api/monitors/monitors_durations.ts b/x-pack/plugins/uptime/server/rest_api/monitors/monitors_durations.ts
index 9743ced13350a..34313211061b0 100644
--- a/x-pack/plugins/uptime/server/rest_api/monitors/monitors_durations.ts
+++ b/x-pack/plugins/uptime/server/rest_api/monitors/monitors_durations.ts
@@ -7,7 +7,7 @@
import { schema } from '@kbn/config-schema';
import { UMServerLibs } from '../../lib/lib';
import { UMRestApiRouteFactory } from '../types';
-import { API_URLS } from '../../../../../legacy/plugins/uptime/common/constants/rest_api';
+import { API_URLS } from '../../../common/constants';
export const createGetMonitorDurationRoute: UMRestApiRouteFactory = (libs: UMServerLibs) => ({
method: 'GET',
diff --git a/x-pack/plugins/uptime/server/rest_api/overview_filters/get_overview_filters.ts b/x-pack/plugins/uptime/server/rest_api/overview_filters/get_overview_filters.ts
index deac05f36c8dc..00cbaf0d16723 100644
--- a/x-pack/plugins/uptime/server/rest_api/overview_filters/get_overview_filters.ts
+++ b/x-pack/plugins/uptime/server/rest_api/overview_filters/get_overview_filters.ts
@@ -8,7 +8,7 @@ import { schema } from '@kbn/config-schema';
import { UMServerLibs } from '../../lib/lib';
import { UMRestApiRouteFactory } from '../types';
import { objectValuesToArrays } from '../../lib/helper';
-import { API_URLS } from '../../../../../legacy/plugins/uptime/common/constants/rest_api';
+import { API_URLS } from '../../../common/constants';
const arrayOrStringType = schema.maybe(
schema.oneOf([schema.string(), schema.arrayOf(schema.string())])
diff --git a/x-pack/plugins/uptime/server/rest_api/pings/get_ping_histogram.ts b/x-pack/plugins/uptime/server/rest_api/pings/get_ping_histogram.ts
index dceef5ecb7848..41078f735920b 100644
--- a/x-pack/plugins/uptime/server/rest_api/pings/get_ping_histogram.ts
+++ b/x-pack/plugins/uptime/server/rest_api/pings/get_ping_histogram.ts
@@ -7,7 +7,7 @@
import { schema } from '@kbn/config-schema';
import { UMServerLibs } from '../../lib/lib';
import { UMRestApiRouteFactory } from '../types';
-import { API_URLS } from '../../../../../legacy/plugins/uptime/common/constants/rest_api';
+import { API_URLS } from '../../../common/constants';
export const createGetPingHistogramRoute: UMRestApiRouteFactory = (libs: UMServerLibs) => ({
method: 'GET',
diff --git a/x-pack/plugins/uptime/server/rest_api/pings/get_pings.ts b/x-pack/plugins/uptime/server/rest_api/pings/get_pings.ts
index 80a887a7f64a9..d97195a7fe2b1 100644
--- a/x-pack/plugins/uptime/server/rest_api/pings/get_pings.ts
+++ b/x-pack/plugins/uptime/server/rest_api/pings/get_pings.ts
@@ -9,8 +9,8 @@ import { isLeft } from 'fp-ts/lib/Either';
import { PathReporter } from 'io-ts/lib/PathReporter';
import { UMServerLibs } from '../../lib/lib';
import { UMRestApiRouteFactory } from '../types';
-import { API_URLS } from '../../../../../legacy/plugins/uptime/common/constants/rest_api';
-import { GetPingsParamsType } from '../../../../../legacy/plugins/uptime/common/runtime_types';
+import { API_URLS } from '../../../common/constants';
+import { GetPingsParamsType } from '../../../common/runtime_types';
export const createGetPingsRoute: UMRestApiRouteFactory = (libs: UMServerLibs) => ({
method: 'GET',
diff --git a/x-pack/plugins/uptime/server/rest_api/snapshot/get_snapshot_count.ts b/x-pack/plugins/uptime/server/rest_api/snapshot/get_snapshot_count.ts
index d870f49280117..7809e102a499f 100644
--- a/x-pack/plugins/uptime/server/rest_api/snapshot/get_snapshot_count.ts
+++ b/x-pack/plugins/uptime/server/rest_api/snapshot/get_snapshot_count.ts
@@ -7,7 +7,7 @@
import { schema } from '@kbn/config-schema';
import { UMServerLibs } from '../../lib/lib';
import { UMRestApiRouteFactory } from '../types';
-import { API_URLS } from '../../../../../legacy/plugins/uptime/common/constants';
+import { API_URLS } from '../../../common/constants';
export const createGetSnapshotCount: UMRestApiRouteFactory = (libs: UMServerLibs) => ({
method: 'GET',
diff --git a/x-pack/plugins/uptime/server/rest_api/telemetry/log_page_view.ts b/x-pack/plugins/uptime/server/rest_api/telemetry/log_page_view.ts
index 4b2db71037071..d8387e79e9089 100644
--- a/x-pack/plugins/uptime/server/rest_api/telemetry/log_page_view.ts
+++ b/x-pack/plugins/uptime/server/rest_api/telemetry/log_page_view.ts
@@ -8,7 +8,7 @@ import { schema } from '@kbn/config-schema';
import { KibanaTelemetryAdapter } from '../../lib/adapters/telemetry';
import { UMRestApiRouteFactory } from '../types';
import { PageViewParams } from '../../lib/adapters/telemetry/types';
-import { API_URLS } from '../../../../../legacy/plugins/uptime/common/constants';
+import { API_URLS } from '../../../common/constants';
export const createLogPageViewRoute: UMRestApiRouteFactory = () => ({
method: 'POST',
diff --git a/x-pack/plugins/uptime/server/rest_api/types.ts b/x-pack/plugins/uptime/server/rest_api/types.ts
index e05e7a4d7faf1..8720b9dc60b12 100644
--- a/x-pack/plugins/uptime/server/rest_api/types.ts
+++ b/x-pack/plugins/uptime/server/rest_api/types.ts
@@ -15,8 +15,8 @@ import {
KibanaRequest,
KibanaResponseFactory,
IKibanaResponse,
-} from 'src/core/server';
-import { DynamicSettings } from '../../../../legacy/plugins/uptime/common/runtime_types';
+} from 'kibana/server';
+import { DynamicSettings } from '../../common/runtime_types';
import { UMServerLibs } from '../lib/lib';
/**
diff --git a/x-pack/test/alerting_api_integration/basic/tests/actions/builtin_action_types/servicenow.ts b/x-pack/test/alerting_api_integration/basic/tests/actions/builtin_action_types/servicenow.ts
index a7551ad7e2fad..1244657ed9988 100644
--- a/x-pack/test/alerting_api_integration/basic/tests/actions/builtin_action_types/servicenow.ts
+++ b/x-pack/test/alerting_api_integration/basic/tests/actions/builtin_action_types/servicenow.ts
@@ -9,7 +9,7 @@ import { FtrProviderContext } from '../../../../common/ftr_provider_context';
import {
getExternalServiceSimulatorPath,
ExternalServiceSimulator,
-} from '../../../../common/fixtures/plugins/actions';
+} from '../../../../common/fixtures/plugins/actions_simulators';
// node ../scripts/functional_test_runner.js --grep "Actions.servicenddd" --config=test/alerting_api_integration/security_and_spaces/config.ts
diff --git a/x-pack/test/alerting_api_integration/basic/tests/actions/builtin_action_types/slack.ts b/x-pack/test/alerting_api_integration/basic/tests/actions/builtin_action_types/slack.ts
index 46258e41d5d69..4151deab45213 100644
--- a/x-pack/test/alerting_api_integration/basic/tests/actions/builtin_action_types/slack.ts
+++ b/x-pack/test/alerting_api_integration/basic/tests/actions/builtin_action_types/slack.ts
@@ -9,7 +9,7 @@ import { FtrProviderContext } from '../../../../common/ftr_provider_context';
import {
getExternalServiceSimulatorPath,
ExternalServiceSimulator,
-} from '../../../../common/fixtures/plugins/actions';
+} from '../../../../common/fixtures/plugins/actions_simulators';
// eslint-disable-next-line import/no-default-export
export default function slackTest({ getService }: FtrProviderContext) {
diff --git a/x-pack/test/alerting_api_integration/basic/tests/actions/builtin_action_types/webhook.ts b/x-pack/test/alerting_api_integration/basic/tests/actions/builtin_action_types/webhook.ts
index 338610e9243a4..bae6dada48fb7 100644
--- a/x-pack/test/alerting_api_integration/basic/tests/actions/builtin_action_types/webhook.ts
+++ b/x-pack/test/alerting_api_integration/basic/tests/actions/builtin_action_types/webhook.ts
@@ -8,7 +8,7 @@ import { FtrProviderContext } from '../../../../common/ftr_provider_context';
import {
getExternalServiceSimulatorPath,
ExternalServiceSimulator,
-} from '../../../../common/fixtures/plugins/actions';
+} from '../../../../common/fixtures/plugins/actions_simulators';
// eslint-disable-next-line import/no-default-export
export default function webhookTest({ getService }: FtrProviderContext) {
diff --git a/x-pack/test/alerting_api_integration/common/config.ts b/x-pack/test/alerting_api_integration/common/config.ts
index 457b7621e84bd..870ed3cf0cc0f 100644
--- a/x-pack/test/alerting_api_integration/common/config.ts
+++ b/x-pack/test/alerting_api_integration/common/config.ts
@@ -8,7 +8,7 @@ import path from 'path';
import { CA_CERT_PATH } from '@kbn/dev-utils';
import { FtrConfigProviderContext } from '@kbn/test/types/ftr';
import { services } from './services';
-import { getAllExternalServiceSimulatorPaths } from './fixtures/plugins/actions';
+import { getAllExternalServiceSimulatorPaths } from './fixtures/plugins/actions_simulators';
interface CreateTestConfigOptions {
license: string;
@@ -75,7 +75,6 @@ export function createTestConfig(name: string, options: CreateTestConfigOptions)
'some.non.existent.com',
])}`,
`--xpack.actions.enabledActionTypes=${JSON.stringify(enabledActionTypes)}`,
- '--xpack.alerting.enabled=true',
'--xpack.eventLog.logEntries=true',
`--xpack.actions.preconfigured=${JSON.stringify([
{
@@ -124,7 +123,7 @@ export function createTestConfig(name: string, options: CreateTestConfigOptions)
])}`,
...disabledPlugins.map(key => `--xpack.${key}.enabled=false`),
`--plugin-path=${path.join(__dirname, 'fixtures', 'plugins', 'alerts')}`,
- `--plugin-path=${path.join(__dirname, 'fixtures', 'plugins', 'actions')}`,
+ `--plugin-path=${path.join(__dirname, 'fixtures', 'plugins', 'actions_simulators')}`,
`--plugin-path=${path.join(__dirname, 'fixtures', 'plugins', 'task_manager')}`,
`--plugin-path=${path.join(__dirname, 'fixtures', 'plugins', 'aad')}`,
`--server.xsrf.whitelist=${JSON.stringify(getAllExternalServiceSimulatorPaths())}`,
diff --git a/x-pack/test/alerting_api_integration/common/fixtures/plugins/aad/index.ts b/x-pack/test/alerting_api_integration/common/fixtures/plugins/aad/index.ts
index 05139213b76b9..400aec7e11c8d 100644
--- a/x-pack/test/alerting_api_integration/common/fixtures/plugins/aad/index.ts
+++ b/x-pack/test/alerting_api_integration/common/fixtures/plugins/aad/index.ts
@@ -21,7 +21,7 @@ interface CheckAADRequest extends Hapi.Request {
// eslint-disable-next-line import/no-default-export
export default function(kibana: any) {
return new kibana.Plugin({
- require: ['actions', 'alerting', 'encryptedSavedObjects'],
+ require: ['encryptedSavedObjects'],
name: 'aad-fixtures',
init(server: Legacy.Server) {
const newPlatform = ((server as unknown) as KbnServer).newPlatform;
diff --git a/x-pack/test/alerting_api_integration/common/fixtures/plugins/actions/README.md b/x-pack/test/alerting_api_integration/common/fixtures/plugins/actions_simulators/README.md
similarity index 100%
rename from x-pack/test/alerting_api_integration/common/fixtures/plugins/actions/README.md
rename to x-pack/test/alerting_api_integration/common/fixtures/plugins/actions_simulators/README.md
diff --git a/x-pack/test/alerting_api_integration/common/fixtures/plugins/actions/index.ts b/x-pack/test/alerting_api_integration/common/fixtures/plugins/actions_simulators/index.ts
similarity index 98%
rename from x-pack/test/alerting_api_integration/common/fixtures/plugins/actions/index.ts
rename to x-pack/test/alerting_api_integration/common/fixtures/plugins/actions_simulators/index.ts
index 019b15cc1862a..45edd4c092da9 100644
--- a/x-pack/test/alerting_api_integration/common/fixtures/plugins/actions/index.ts
+++ b/x-pack/test/alerting_api_integration/common/fixtures/plugins/actions_simulators/index.ts
@@ -36,7 +36,7 @@ export function getAllExternalServiceSimulatorPaths(): string[] {
// eslint-disable-next-line import/no-default-export
export default function(kibana: any) {
return new kibana.Plugin({
- require: ['xpack_main', 'actions'],
+ require: ['xpack_main'],
name: NAME,
init: (server: Hapi.Server) => {
// this action is specifically NOT enabled in ../../config.ts
diff --git a/x-pack/test/alerting_api_integration/common/fixtures/plugins/actions/package.json b/x-pack/test/alerting_api_integration/common/fixtures/plugins/actions_simulators/package.json
similarity index 100%
rename from x-pack/test/alerting_api_integration/common/fixtures/plugins/actions/package.json
rename to x-pack/test/alerting_api_integration/common/fixtures/plugins/actions_simulators/package.json
diff --git a/x-pack/test/alerting_api_integration/common/fixtures/plugins/actions/pagerduty_simulation.ts b/x-pack/test/alerting_api_integration/common/fixtures/plugins/actions_simulators/pagerduty_simulation.ts
similarity index 100%
rename from x-pack/test/alerting_api_integration/common/fixtures/plugins/actions/pagerduty_simulation.ts
rename to x-pack/test/alerting_api_integration/common/fixtures/plugins/actions_simulators/pagerduty_simulation.ts
diff --git a/x-pack/test/alerting_api_integration/common/fixtures/plugins/actions/servicenow_simulation.ts b/x-pack/test/alerting_api_integration/common/fixtures/plugins/actions_simulators/servicenow_simulation.ts
similarity index 100%
rename from x-pack/test/alerting_api_integration/common/fixtures/plugins/actions/servicenow_simulation.ts
rename to x-pack/test/alerting_api_integration/common/fixtures/plugins/actions_simulators/servicenow_simulation.ts
diff --git a/x-pack/test/alerting_api_integration/common/fixtures/plugins/actions/slack_simulation.ts b/x-pack/test/alerting_api_integration/common/fixtures/plugins/actions_simulators/slack_simulation.ts
similarity index 100%
rename from x-pack/test/alerting_api_integration/common/fixtures/plugins/actions/slack_simulation.ts
rename to x-pack/test/alerting_api_integration/common/fixtures/plugins/actions_simulators/slack_simulation.ts
diff --git a/x-pack/test/alerting_api_integration/common/fixtures/plugins/actions/webhook_simulation.ts b/x-pack/test/alerting_api_integration/common/fixtures/plugins/actions_simulators/webhook_simulation.ts
similarity index 100%
rename from x-pack/test/alerting_api_integration/common/fixtures/plugins/actions/webhook_simulation.ts
rename to x-pack/test/alerting_api_integration/common/fixtures/plugins/actions_simulators/webhook_simulation.ts
diff --git a/x-pack/test/alerting_api_integration/common/fixtures/plugins/alerts/index.ts b/x-pack/test/alerting_api_integration/common/fixtures/plugins/alerts/index.ts
index 43d533ad3ae14..1a47addf36ab3 100644
--- a/x-pack/test/alerting_api_integration/common/fixtures/plugins/alerts/index.ts
+++ b/x-pack/test/alerting_api_integration/common/fixtures/plugins/alerts/index.ts
@@ -11,8 +11,8 @@ import { ActionTypeExecutorOptions, ActionType } from '../../../../../../plugins
// eslint-disable-next-line import/no-default-export
export default function(kibana: any) {
return new kibana.Plugin({
- require: ['xpack_main', 'actions', 'alerting', 'elasticsearch'],
- name: 'alerts',
+ require: ['xpack_main', 'elasticsearch'],
+ name: 'alerts-fixture',
init(server: any) {
const clusterClient = server.newPlatform.start.core.elasticsearch.legacy.client;
server.plugins.xpack_main.registerFeature({
diff --git a/x-pack/test/alerting_api_integration/common/fixtures/plugins/task_manager/index.ts b/x-pack/test/alerting_api_integration/common/fixtures/plugins/task_manager/index.ts
index 29708f86b0a9b..ac32f05805e4a 100644
--- a/x-pack/test/alerting_api_integration/common/fixtures/plugins/task_manager/index.ts
+++ b/x-pack/test/alerting_api_integration/common/fixtures/plugins/task_manager/index.ts
@@ -31,7 +31,7 @@ const taskByIdQuery = (id: string) => ({
export default function(kibana: any) {
return new kibana.Plugin({
name: 'taskManagerHelpers',
- require: ['elasticsearch', 'task_manager'],
+ require: ['elasticsearch'],
config(Joi: any) {
return Joi.object({
diff --git a/x-pack/test/alerting_api_integration/security_and_spaces/tests/actions/builtin_action_types/pagerduty.ts b/x-pack/test/alerting_api_integration/security_and_spaces/tests/actions/builtin_action_types/pagerduty.ts
index eeb0818b5fbab..4c76ebfb93b0b 100644
--- a/x-pack/test/alerting_api_integration/security_and_spaces/tests/actions/builtin_action_types/pagerduty.ts
+++ b/x-pack/test/alerting_api_integration/security_and_spaces/tests/actions/builtin_action_types/pagerduty.ts
@@ -11,7 +11,7 @@ import { FtrProviderContext } from '../../../../common/ftr_provider_context';
import {
getExternalServiceSimulatorPath,
ExternalServiceSimulator,
-} from '../../../../common/fixtures/plugins/actions';
+} from '../../../../common/fixtures/plugins/actions_simulators';
// eslint-disable-next-line import/no-default-export
export default function pagerdutyTest({ getService }: FtrProviderContext) {
diff --git a/x-pack/test/alerting_api_integration/security_and_spaces/tests/actions/builtin_action_types/servicenow.ts b/x-pack/test/alerting_api_integration/security_and_spaces/tests/actions/builtin_action_types/servicenow.ts
index 054f8f6141817..399ae0f27f5b1 100644
--- a/x-pack/test/alerting_api_integration/security_and_spaces/tests/actions/builtin_action_types/servicenow.ts
+++ b/x-pack/test/alerting_api_integration/security_and_spaces/tests/actions/builtin_action_types/servicenow.ts
@@ -11,7 +11,7 @@ import { FtrProviderContext } from '../../../../common/ftr_provider_context';
import {
getExternalServiceSimulatorPath,
ExternalServiceSimulator,
-} from '../../../../common/fixtures/plugins/actions';
+} from '../../../../common/fixtures/plugins/actions_simulators';
// node ../scripts/functional_test_runner.js --grep "servicenow" --config=test/alerting_api_integration/security_and_spaces/config.ts
diff --git a/x-pack/test/alerting_api_integration/security_and_spaces/tests/actions/builtin_action_types/slack.ts b/x-pack/test/alerting_api_integration/security_and_spaces/tests/actions/builtin_action_types/slack.ts
index e00589b7e85b7..386254e49c19c 100644
--- a/x-pack/test/alerting_api_integration/security_and_spaces/tests/actions/builtin_action_types/slack.ts
+++ b/x-pack/test/alerting_api_integration/security_and_spaces/tests/actions/builtin_action_types/slack.ts
@@ -11,7 +11,7 @@ import { FtrProviderContext } from '../../../../common/ftr_provider_context';
import {
getExternalServiceSimulatorPath,
ExternalServiceSimulator,
-} from '../../../../common/fixtures/plugins/actions';
+} from '../../../../common/fixtures/plugins/actions_simulators';
// eslint-disable-next-line import/no-default-export
export default function slackTest({ getService }: FtrProviderContext) {
diff --git a/x-pack/test/alerting_api_integration/security_and_spaces/tests/actions/builtin_action_types/webhook.ts b/x-pack/test/alerting_api_integration/security_and_spaces/tests/actions/builtin_action_types/webhook.ts
index fd996ea4507ba..9b66326fa6157 100644
--- a/x-pack/test/alerting_api_integration/security_and_spaces/tests/actions/builtin_action_types/webhook.ts
+++ b/x-pack/test/alerting_api_integration/security_and_spaces/tests/actions/builtin_action_types/webhook.ts
@@ -10,7 +10,7 @@ import { FtrProviderContext } from '../../../../common/ftr_provider_context';
import {
getExternalServiceSimulatorPath,
ExternalServiceSimulator,
-} from '../../../../common/fixtures/plugins/actions';
+} from '../../../../common/fixtures/plugins/actions_simulators';
const defaultValues: Record = {
headers: null,
diff --git a/x-pack/test/alerting_api_integration/spaces_only/tests/actions/builtin_action_types/webhook.ts b/x-pack/test/alerting_api_integration/spaces_only/tests/actions/builtin_action_types/webhook.ts
index 5122a74d53b72..112149a32649a 100644
--- a/x-pack/test/alerting_api_integration/spaces_only/tests/actions/builtin_action_types/webhook.ts
+++ b/x-pack/test/alerting_api_integration/spaces_only/tests/actions/builtin_action_types/webhook.ts
@@ -10,7 +10,7 @@ import { FtrProviderContext } from '../../../../common/ftr_provider_context';
import {
getExternalServiceSimulatorPath,
ExternalServiceSimulator,
-} from '../../../../common/fixtures/plugins/actions';
+} from '../../../../common/fixtures/plugins/actions_simulators';
// eslint-disable-next-line import/no-default-export
export default function webhookTest({ getService }: FtrProviderContext) {
diff --git a/x-pack/test/api_integration/apis/uptime/feature_controls.ts b/x-pack/test/api_integration/apis/uptime/feature_controls.ts
index 6d125807e169d..6c566ec7cb23b 100644
--- a/x-pack/test/api_integration/apis/uptime/feature_controls.ts
+++ b/x-pack/test/api_integration/apis/uptime/feature_controls.ts
@@ -7,7 +7,7 @@
import expect from '@kbn/expect';
import { FtrProviderContext } from '../../ftr_provider_context';
import { PINGS_DATE_RANGE_END, PINGS_DATE_RANGE_START } from './constants';
-import { API_URLS } from '../../../../legacy/plugins/uptime/common/constants';
+import { API_URLS } from '../../../../plugins/uptime/common/constants';
export default function featureControlsTests({ getService }: FtrProviderContext) {
const supertest = getService('supertestWithoutAuth');
diff --git a/x-pack/test/api_integration/apis/uptime/rest/certs.ts b/x-pack/test/api_integration/apis/uptime/rest/certs.ts
index 7510ea3f34d28..a3a15d8f8b014 100644
--- a/x-pack/test/api_integration/apis/uptime/rest/certs.ts
+++ b/x-pack/test/api_integration/apis/uptime/rest/certs.ts
@@ -8,8 +8,8 @@ import expect from '@kbn/expect';
import moment from 'moment';
import { isRight } from 'fp-ts/lib/Either';
import { FtrProviderContext } from '../../../ftr_provider_context';
-import { API_URLS } from '../../../../../legacy/plugins/uptime/common/constants';
-import { CertType } from '../../../../../legacy/plugins/uptime/common/runtime_types';
+import { API_URLS } from '../../../../../plugins/uptime/common/constants';
+import { CertType } from '../../../../../plugins/uptime/common/runtime_types';
import { makeChecksWithStatus } from './helper/make_checks';
export default function({ getService }: FtrProviderContext) {
diff --git a/x-pack/test/api_integration/apis/uptime/rest/doc_count.ts b/x-pack/test/api_integration/apis/uptime/rest/doc_count.ts
index 5258426cf193c..f343cd1da8788 100644
--- a/x-pack/test/api_integration/apis/uptime/rest/doc_count.ts
+++ b/x-pack/test/api_integration/apis/uptime/rest/doc_count.ts
@@ -5,7 +5,7 @@
*/
import { FtrProviderContext } from '../../../ftr_provider_context';
import { expectFixtureEql } from './helper/expect_fixture_eql';
-import { API_URLS } from '../../../../../legacy/plugins/uptime/common/constants';
+import { API_URLS } from '../../../../../plugins/uptime/common/constants';
export default function({ getService }: FtrProviderContext) {
describe('docCount query', () => {
diff --git a/x-pack/test/api_integration/apis/uptime/rest/dynamic_settings.ts b/x-pack/test/api_integration/apis/uptime/rest/dynamic_settings.ts
index ea980721b831b..95caf50d1ca7a 100644
--- a/x-pack/test/api_integration/apis/uptime/rest/dynamic_settings.ts
+++ b/x-pack/test/api_integration/apis/uptime/rest/dynamic_settings.ts
@@ -7,9 +7,8 @@
import expect from '@kbn/expect';
import { isRight } from 'fp-ts/lib/Either';
import { FtrProviderContext } from '../../../ftr_provider_context';
-import { DYNAMIC_SETTINGS_DEFAULTS } from '../../../../../legacy/plugins/uptime/common/constants';
-import { DynamicSettingsType } from '../../../../../legacy/plugins/uptime/common/runtime_types';
-
+import { DynamicSettingsType } from '../../../../../plugins/uptime/common/runtime_types';
+import { DYNAMIC_SETTINGS_DEFAULTS } from '../../../../../plugins/uptime/common/constants';
export default function({ getService }: FtrProviderContext) {
const supertest = getService('supertest');
diff --git a/x-pack/test/api_integration/apis/uptime/rest/monitor_states_generated.ts b/x-pack/test/api_integration/apis/uptime/rest/monitor_states_generated.ts
index 3c17370532f91..c3d5849e028ab 100644
--- a/x-pack/test/api_integration/apis/uptime/rest/monitor_states_generated.ts
+++ b/x-pack/test/api_integration/apis/uptime/rest/monitor_states_generated.ts
@@ -7,8 +7,8 @@
import expect from '@kbn/expect';
import { FtrProviderContext } from '../../../ftr_provider_context';
import { makeChecksWithStatus } from './helper/make_checks';
-import { API_URLS } from '../../../../../legacy/plugins/uptime/common/constants';
-import { MonitorSummary } from '../../../../../legacy/plugins/uptime/common/runtime_types';
+import { MonitorSummary } from '../../../../../plugins/uptime/common/runtime_types';
+import { API_URLS } from '../../../../../plugins/uptime/common/constants';
export default function({ getService }: FtrProviderContext) {
const supertest = getService('supertest');
diff --git a/x-pack/test/api_integration/apis/uptime/rest/monitor_states_real_data.ts b/x-pack/test/api_integration/apis/uptime/rest/monitor_states_real_data.ts
index f1e37bff405fd..c5a691312f525 100644
--- a/x-pack/test/api_integration/apis/uptime/rest/monitor_states_real_data.ts
+++ b/x-pack/test/api_integration/apis/uptime/rest/monitor_states_real_data.ts
@@ -7,8 +7,8 @@
import expect from '@kbn/expect';
import { isRight } from 'fp-ts/lib/Either';
import { FtrProviderContext } from '../../../ftr_provider_context';
-import { API_URLS } from '../../../../../legacy/plugins/uptime/common/constants';
-import { MonitorSummaryResultType } from '../../../../../legacy/plugins/uptime/common/runtime_types';
+import { MonitorSummaryResultType } from '../../../../../plugins/uptime/common/runtime_types';
+import { API_URLS } from '../../../../../plugins/uptime/common/constants';
interface ExpectedMonitorStatesPage {
response: any;
diff --git a/x-pack/test/api_integration/apis/uptime/rest/ping_list.ts b/x-pack/test/api_integration/apis/uptime/rest/ping_list.ts
index a261763d5991f..3d754d89cf9be 100644
--- a/x-pack/test/api_integration/apis/uptime/rest/ping_list.ts
+++ b/x-pack/test/api_integration/apis/uptime/rest/ping_list.ts
@@ -7,7 +7,7 @@
import expect from '@kbn/expect';
import { isLeft } from 'fp-ts/lib/Either';
import { PathReporter } from 'io-ts/lib/PathReporter';
-import { PingsResponseType } from '../../../../../legacy/plugins/uptime/common/runtime_types';
+import { PingsResponseType } from '../../../../../plugins/uptime/common/runtime_types';
import { FtrProviderContext } from '../../../ftr_provider_context';
function decodePingsResponseData(response: any) {
diff --git a/x-pack/test/api_integration/apis/uptime/rest/telemetry_collectors.ts b/x-pack/test/api_integration/apis/uptime/rest/telemetry_collectors.ts
index 017ef02afe5ea..99e09aa5ce886 100644
--- a/x-pack/test/api_integration/apis/uptime/rest/telemetry_collectors.ts
+++ b/x-pack/test/api_integration/apis/uptime/rest/telemetry_collectors.ts
@@ -6,7 +6,7 @@
import expect from '@kbn/expect';
import { FtrProviderContext } from '../../../ftr_provider_context';
-import { API_URLS } from '../../../../../legacy/plugins/uptime/common/constants';
+import { API_URLS } from '../../../../../plugins/uptime/common/constants';
import { makeChecksWithStatus } from './helper/make_checks';
export default function({ getService }: FtrProviderContext) {
diff --git a/x-pack/test/detection_engine_api_integration/common/config.ts b/x-pack/test/detection_engine_api_integration/common/config.ts
index e89352118990a..1e6600c7cd2c0 100644
--- a/x-pack/test/detection_engine_api_integration/common/config.ts
+++ b/x-pack/test/detection_engine_api_integration/common/config.ts
@@ -78,7 +78,6 @@ export function createTestConfig(name: string, options: CreateTestConfigOptions)
'some.non.existent.com',
])}`,
`--xpack.actions.enabledActionTypes=${JSON.stringify(enabledActionTypes)}`,
- '--xpack.alerting.enabled=true',
'--xpack.eventLog.logEntries=true',
...disabledPlugins.map(key => `--xpack.${key}.enabled=false`),
`--plugin-path=${path.join(__dirname, 'fixtures', 'plugins', 'alerts')}`,
diff --git a/x-pack/test/functional/apps/uptime/settings.ts b/x-pack/test/functional/apps/uptime/settings.ts
index 64b6300e0df63..7a813a5cdfb52 100644
--- a/x-pack/test/functional/apps/uptime/settings.ts
+++ b/x-pack/test/functional/apps/uptime/settings.ts
@@ -6,8 +6,8 @@
import expect from '@kbn/expect';
import { FtrProviderContext } from '../../ftr_provider_context';
-import { DYNAMIC_SETTINGS_DEFAULTS } from '../../../../legacy/plugins/uptime/common/constants';
-import { DynamicSettings } from '../../../../legacy/plugins/uptime/common/runtime_types';
+import { DynamicSettings } from '../../../../plugins/uptime/common/runtime_types';
+import { DYNAMIC_SETTINGS_DEFAULTS } from '../../../../plugins/uptime/common/constants';
import { makeChecks } from '../../../api_integration/apis/uptime/rest/helper/make_checks';
export default ({ getPageObjects, getService }: FtrProviderContext) => {
diff --git a/x-pack/test/functional/page_objects/lens_page.ts b/x-pack/test/functional/page_objects/lens_page.ts
index 1bf637c50b0ba..57b2847cc2e50 100644
--- a/x-pack/test/functional/page_objects/lens_page.ts
+++ b/x-pack/test/functional/page_objects/lens_page.ts
@@ -12,6 +12,7 @@ export function LensPageProvider({ getService, getPageObjects }: FtrProviderCont
const testSubjects = getService('testSubjects');
const retry = getService('retry');
const find = getService('find');
+ const comboBox = getService('comboBox');
const PageObjects = getPageObjects([
'header',
'common',
@@ -107,20 +108,17 @@ export function LensPageProvider({ getService, getPageObjects }: FtrProviderCont
* @param opts.operation - the desired operation ID for the dimension
* @param opts.field - the desired field for the dimension
*/
- async configureDimension(opts: { dimension: string; operation?: string; field?: string }) {
+ async configureDimension(opts: { dimension: string; operation: string; field: string }) {
await find.clickByCssSelector(opts.dimension);
- if (opts.operation) {
- await find.clickByCssSelector(
- `[data-test-subj="lns-indexPatternDimensionIncompatible-${opts.operation}"],
- [data-test-subj="lns-indexPatternDimension-${opts.operation}"]`
- );
- }
+ await find.clickByCssSelector(
+ `[data-test-subj="lns-indexPatternDimensionIncompatible-${opts.operation}"],
+ [data-test-subj="lns-indexPatternDimension-${opts.operation}"]`
+ );
- if (opts.field) {
- await testSubjects.click('indexPattern-dimension-field');
- await testSubjects.click(`lns-fieldOption-${opts.field}`);
- }
+ const target = await testSubjects.find('indexPattern-dimension-field');
+ await comboBox.openOptionsList(target);
+ await comboBox.setElement(target, opts.field);
},
/**
diff --git a/x-pack/test/functional/services/uptime/settings.ts b/x-pack/test/functional/services/uptime/settings.ts
index 9719152b62d35..96f5e45ce2ca4 100644
--- a/x-pack/test/functional/services/uptime/settings.ts
+++ b/x-pack/test/functional/services/uptime/settings.ts
@@ -5,7 +5,7 @@
*/
import { FtrProviderContext } from '../../ftr_provider_context';
-import { DynamicSettings } from '../../../../legacy/plugins/uptime/common/runtime_types';
+import { DynamicSettings } from '../../../../plugins/uptime/common/runtime_types';
export function UptimeSettingsProvider({ getService }: FtrProviderContext) {
const testSubjects = getService('testSubjects');
diff --git a/x-pack/test/functional_with_es_ssl/config.ts b/x-pack/test/functional_with_es_ssl/config.ts
index a620b1d953376..71b22a336f6b9 100644
--- a/x-pack/test/functional_with_es_ssl/config.ts
+++ b/x-pack/test/functional_with_es_ssl/config.ts
@@ -50,8 +50,6 @@ export default async function({ readConfigFile }: FtrConfigProviderContext) {
`--elasticsearch.hosts=https://${servers.elasticsearch.hostname}:${servers.elasticsearch.port}`,
`--elasticsearch.ssl.certificateAuthorities=${CA_CERT_PATH}`,
`--plugin-path=${join(__dirname, 'fixtures', 'plugins', 'alerts')}`,
- '--xpack.actions.enabled=true',
- '--xpack.alerting.enabled=true',
`--xpack.actions.preconfigured=${JSON.stringify([
{
id: 'my-slack1',
diff --git a/x-pack/test/plugin_api_integration/plugins/sample_task_plugin/kibana.json b/x-pack/test/plugin_api_integration/plugins/sample_task_plugin/kibana.json
new file mode 100644
index 0000000000000..416ef7fa34591
--- /dev/null
+++ b/x-pack/test/plugin_api_integration/plugins/sample_task_plugin/kibana.json
@@ -0,0 +1,9 @@
+{
+ "id": "sample_task_plugin",
+ "version": "1.0.0",
+ "kibanaVersion": "kibana",
+ "configPath": ["xpack"],
+ "requiredPlugins": ["taskManager"],
+ "server": true,
+ "ui": false
+}
diff --git a/x-pack/test/plugin_api_integration/plugins/sample_task_plugin/package.json b/x-pack/test/plugin_api_integration/plugins/sample_task_plugin/package.json
new file mode 100644
index 0000000000000..c8d47decd94c1
--- /dev/null
+++ b/x-pack/test/plugin_api_integration/plugins/sample_task_plugin/package.json
@@ -0,0 +1,18 @@
+{
+ "name": "sample_task_plugin",
+ "version": "1.0.0",
+ "kibana": {
+ "version": "kibana",
+ "templateVersion": "1.0.0"
+ },
+ "main": "target/test/plugin_api_integration/plugins/sample_task_plugin",
+ "scripts": {
+ "kbn": "node ../../../../../scripts/kbn.js",
+ "build": "rm -rf './target' && tsc"
+ },
+ "devDependencies": {
+ "typescript": "3.7.2"
+ },
+ "license": "Apache-2.0",
+ "dependencies": {}
+}
diff --git a/x-pack/legacy/plugins/alerting/index.ts b/x-pack/test/plugin_api_integration/plugins/sample_task_plugin/server/index.ts
similarity index 65%
rename from x-pack/legacy/plugins/alerting/index.ts
rename to x-pack/test/plugin_api_integration/plugins/sample_task_plugin/server/index.ts
index 0d0a698841269..77233f463734a 100644
--- a/x-pack/legacy/plugins/alerting/index.ts
+++ b/x-pack/test/plugin_api_integration/plugins/sample_task_plugin/server/index.ts
@@ -4,4 +4,6 @@
* you may not use this file except in compliance with the Elastic License.
*/
-export * from './server';
+import { SampleTaskManagerFixturePlugin } from './plugin';
+
+export const plugin = () => new SampleTaskManagerFixturePlugin();
diff --git a/x-pack/test/plugin_api_integration/plugins/sample_task_plugin/server/init_routes.ts b/x-pack/test/plugin_api_integration/plugins/sample_task_plugin/server/init_routes.ts
new file mode 100644
index 0000000000000..1fee2decbcba9
--- /dev/null
+++ b/x-pack/test/plugin_api_integration/plugins/sample_task_plugin/server/init_routes.ts
@@ -0,0 +1,252 @@
+/*
+ * 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 { schema } from '@kbn/config-schema';
+import {
+ RequestHandlerContext,
+ KibanaRequest,
+ KibanaResponseFactory,
+ IKibanaResponse,
+ IRouter,
+ CoreSetup,
+} from 'kibana/server';
+import { EventEmitter } from 'events';
+import { TaskManagerStartContract } from '../../../../../plugins/task_manager/server';
+
+const scope = 'testing';
+const taskManagerQuery = {
+ bool: {
+ filter: {
+ bool: {
+ must: [
+ {
+ term: {
+ 'task.scope': scope,
+ },
+ },
+ ],
+ },
+ },
+ },
+};
+
+export function initRoutes(
+ router: IRouter,
+ core: CoreSetup,
+ taskManagerStart: Promise,
+ taskTestingEvents: EventEmitter
+) {
+ async function ensureIndexIsRefreshed() {
+ return await core.elasticsearch.adminClient.callAsInternalUser('indices.refresh', {
+ index: '.kibana_task_manager',
+ });
+ }
+
+ router.post(
+ {
+ path: `/api/sample_tasks/schedule`,
+ validate: {
+ body: schema.object({
+ task: schema.object({
+ taskType: schema.string(),
+ schedule: schema.maybe(
+ schema.object({
+ interval: schema.string(),
+ })
+ ),
+ interval: schema.maybe(schema.string()),
+ params: schema.recordOf(schema.string(), schema.any(), { defaultValue: {} }),
+ state: schema.recordOf(schema.string(), schema.any(), { defaultValue: {} }),
+ id: schema.maybe(schema.string()),
+ }),
+ }),
+ },
+ },
+ async function(
+ context: RequestHandlerContext,
+ req: KibanaRequest,
+ res: KibanaResponseFactory
+ ): Promise> {
+ try {
+ const taskManager = await taskManagerStart;
+ const { task: taskFields } = req.body;
+ const task = {
+ ...taskFields,
+ scope: [scope],
+ };
+
+ const taskResult = await taskManager.schedule(task, { req });
+
+ return res.ok({ body: taskResult });
+ } catch (err) {
+ return res.internalError({ body: err });
+ }
+ }
+ );
+
+ router.post(
+ {
+ path: `/api/sample_tasks/run_now`,
+ validate: {
+ body: schema.object({
+ task: schema.object({
+ id: schema.string({}),
+ }),
+ }),
+ },
+ },
+ async function(
+ context: RequestHandlerContext,
+ req: KibanaRequest,
+ res: KibanaResponseFactory
+ ): Promise> {
+ const {
+ task: { id },
+ } = req.body;
+ try {
+ const taskManager = await taskManagerStart;
+ return res.ok({ body: await taskManager.runNow(id) });
+ } catch (err) {
+ return res.ok({ body: { id, error: `${err}` } });
+ }
+ }
+ );
+
+ router.post(
+ {
+ path: `/api/sample_tasks/ensure_scheduled`,
+ validate: {
+ body: schema.object({
+ task: schema.object({
+ taskType: schema.string(),
+ params: schema.object({}),
+ state: schema.maybe(schema.object({})),
+ id: schema.maybe(schema.string()),
+ }),
+ }),
+ },
+ },
+ async function(
+ context: RequestHandlerContext,
+ req: KibanaRequest,
+ res: KibanaResponseFactory
+ ): Promise> {
+ try {
+ const { task: taskFields } = req.body;
+ const task = {
+ ...taskFields,
+ scope: [scope],
+ };
+
+ const taskManager = await taskManagerStart;
+ const taskResult = await taskManager.ensureScheduled(task, { req });
+
+ return res.ok({ body: taskResult });
+ } catch (err) {
+ return res.ok({ body: err });
+ }
+ }
+ );
+
+ router.post(
+ {
+ path: `/api/sample_tasks/event`,
+ validate: {
+ body: schema.object({
+ event: schema.string(),
+ data: schema.recordOf(schema.string(), schema.any(), { defaultValue: {} }),
+ }),
+ },
+ },
+ async function(
+ context: RequestHandlerContext,
+ req: KibanaRequest,
+ res: KibanaResponseFactory
+ ): Promise> {
+ try {
+ const { event, data } = req.body;
+ taskTestingEvents.emit(event, data);
+ return res.ok({ body: event });
+ } catch (err) {
+ return res.ok({ body: err });
+ }
+ }
+ );
+
+ router.get(
+ {
+ path: `/api/sample_tasks`,
+ validate: {},
+ },
+ async function(
+ context: RequestHandlerContext,
+ req: KibanaRequest,
+ res: KibanaResponseFactory
+ ): Promise> {
+ try {
+ const taskManager = await taskManagerStart;
+ return res.ok({
+ body: await taskManager.fetch({
+ query: taskManagerQuery,
+ }),
+ });
+ } catch (err) {
+ return res.ok({ body: err });
+ }
+ }
+ );
+
+ router.get(
+ {
+ path: `/api/sample_tasks/task/{taskId}`,
+ validate: {
+ params: schema.object({
+ taskId: schema.string(),
+ }),
+ },
+ },
+ async function(
+ context: RequestHandlerContext,
+ req: KibanaRequest,
+ res: KibanaResponseFactory
+ ): Promise> {
+ try {
+ await ensureIndexIsRefreshed();
+ const taskManager = await taskManagerStart;
+ return res.ok({ body: await taskManager.get(req.params.taskId) });
+ } catch (err) {
+ return res.ok({ body: err });
+ }
+ return res.ok({ body: {} });
+ }
+ );
+
+ router.delete(
+ {
+ path: `/api/sample_tasks`,
+ validate: {},
+ },
+ async function(
+ context: RequestHandlerContext,
+ req: KibanaRequest,
+ res: KibanaResponseFactory
+ ): Promise> {
+ try {
+ let tasksFound = 0;
+ const taskManager = await taskManagerStart;
+ do {
+ const { docs: tasks } = await taskManager.fetch({
+ query: taskManagerQuery,
+ });
+ tasksFound = tasks.length;
+ await Promise.all(tasks.map(task => taskManager.remove(task.id)));
+ } while (tasksFound > 0);
+ return res.ok({ body: 'OK' });
+ } catch (err) {
+ return res.ok({ body: err });
+ }
+ }
+ );
+}
diff --git a/x-pack/test/plugin_api_integration/plugins/sample_task_plugin/server/plugin.ts b/x-pack/test/plugin_api_integration/plugins/sample_task_plugin/server/plugin.ts
new file mode 100644
index 0000000000000..508d58b8f0ca9
--- /dev/null
+++ b/x-pack/test/plugin_api_integration/plugins/sample_task_plugin/server/plugin.ts
@@ -0,0 +1,164 @@
+/*
+ * 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 { Plugin, CoreSetup, CoreStart } from 'kibana/server';
+import { EventEmitter } from 'events';
+import { Subject } from 'rxjs';
+import { first } from 'rxjs/operators';
+import { initRoutes } from './init_routes';
+import {
+ TaskManagerSetupContract,
+ TaskManagerStartContract,
+ ConcreteTaskInstance,
+} from '../../../../../plugins/task_manager/server';
+import { DEFAULT_MAX_WORKERS } from '../../../../../plugins/task_manager/server/config';
+
+// this plugin's dependendencies
+export interface SampleTaskManagerFixtureSetupDeps {
+ taskManager: TaskManagerSetupContract;
+}
+export interface SampleTaskManagerFixtureStartDeps {
+ taskManager: TaskManagerStartContract;
+}
+
+export class SampleTaskManagerFixturePlugin
+ implements
+ Plugin