;
- const managedRepository = await getManagedRepositoryName(callAsCurrentUser);
+ const managedRepository = await getManagedRepositoryName(clusterClient.asCurrentUser);
try {
- const {
- responses: snapshotsResponse,
- }: {
- responses: Array<{
- repository: string;
- snapshots: SnapshotDetailsEs[];
- error?: any;
- }>;
- } = await callAsCurrentUser('snapshot.get', {
+ const response = await clusterClient.asCurrentUser.snapshot.get({
repository,
snapshot: '_all',
ignore_unavailable: true,
});
+ // @ts-expect-error @elastic/elasticsearch remove this "as unknown" workaround when the types for this endpoint are correct. Track progress at https://github.com/elastic/elastic-client-generator/issues/250.
+ const { responses: snapshotsResponse } = response.body;
+
const snapshotsList =
snapshotsResponse && snapshotsResponse[0] && snapshotsResponse[0].snapshots;
+ if (!snapshotsList || snapshotsList.length === 0) {
+ return res.notFound({ body: 'Snapshot not found' });
+ }
const selectedSnapshot = snapshotsList.find(
+ // @ts-expect-error @elastic/elasticsearch related to above incorrect type from client
({ snapshot: snapshotName }) => snapshot === snapshotName
) as SnapshotDetailsEs;
@@ -155,10 +154,12 @@ export function registerSnapshotsRoutes({
}
const successfulSnapshots = snapshotsList
+ // @ts-expect-error @elastic/elasticsearch related to above incorrect type from client
.filter(({ state }) => state === 'SUCCESS')
+ // @ts-expect-error @elastic/elasticsearch related to above incorrect type from client
.sort((a, b) => {
- return +new Date(b.end_time) - +new Date(a.end_time);
- });
+ return +new Date(b.end_time!) - +new Date(a.end_time!);
+ }) as SnapshotDetailsEs[];
return res.ok({
body: deserializeSnapshotDetails(
@@ -169,14 +170,7 @@ export function registerSnapshotsRoutes({
),
});
} catch (e) {
- if (isEsError(e)) {
- return res.customError({
- statusCode: e.statusCode,
- body: e,
- });
- }
- // Case: default
- throw e;
+ return handleEsError({ error: e, response: res });
}
})
);
@@ -192,7 +186,7 @@ export function registerSnapshotsRoutes({
router.post(
{ path: addBasePath('snapshots/bulk_delete'), validate: { body: deleteSchema } },
license.guardApiRoute(async (ctx, req, res) => {
- const { callAsCurrentUser } = ctx.snapshotRestore!.client;
+ const { client: clusterClient } = ctx.core.elasticsearch;
const response: {
itemsDeleted: Array<{ snapshot: string; repository: string }>;
@@ -210,7 +204,8 @@ export function registerSnapshotsRoutes({
for (let i = 0; i < snapshots.length; i++) {
const { snapshot, repository } = snapshots[i];
- await callAsCurrentUser('snapshot.delete', { snapshot, repository })
+ await clusterClient.asCurrentUser.snapshot
+ .delete({ snapshot, repository })
.then(() => response.itemsDeleted.push({ snapshot, repository }))
.catch((e) =>
response.errors.push({
@@ -222,14 +217,7 @@ export function registerSnapshotsRoutes({
return res.ok({ body: response });
} catch (e) {
- if (isEsError(e)) {
- return res.customError({
- statusCode: e.statusCode,
- body: e,
- });
- }
- // Case: default
- throw e;
+ return handleEsError({ error: e, response: res });
}
})
);
diff --git a/x-pack/plugins/snapshot_restore/server/routes/api/validate_schemas.ts b/x-pack/plugins/snapshot_restore/server/routes/api/validate_schemas.ts
index fe156f6ba9750..af31466c2cefe 100644
--- a/x-pack/plugins/snapshot_restore/server/routes/api/validate_schemas.ts
+++ b/x-pack/plugins/snapshot_restore/server/routes/api/validate_schemas.ts
@@ -176,4 +176,5 @@ export const restoreSettingsSchema = schema.object({
indexSettings: schema.maybe(schema.string()),
ignoreIndexSettings: schema.maybe(schema.arrayOf(schema.string())),
ignoreUnavailable: schema.maybe(schema.boolean()),
+ includeAliases: schema.maybe(schema.boolean()),
});
diff --git a/x-pack/plugins/snapshot_restore/server/services/license.ts b/x-pack/plugins/snapshot_restore/server/services/license.ts
index 93cf86eae5359..e209edcd899b4 100644
--- a/x-pack/plugins/snapshot_restore/server/services/license.ts
+++ b/x-pack/plugins/snapshot_restore/server/services/license.ts
@@ -6,11 +6,15 @@
*/
import { Logger } from 'src/core/server';
-import type { KibanaRequest, KibanaResponseFactory, RequestHandler } from 'kibana/server';
+import type {
+ KibanaRequest,
+ KibanaResponseFactory,
+ RequestHandler,
+ RequestHandlerContext,
+} from 'kibana/server';
import { LicensingPluginSetup } from '../../../licensing/server';
import { LicenseType } from '../../../licensing/common/types';
-import type { SnapshotRestoreRequestHandlerContext } from '../types';
export interface LicenseStatus {
isValid: boolean;
@@ -51,13 +55,11 @@ export class License {
});
}
- guardApiRoute(
- handler: RequestHandler
- ) {
+ guardApiRoute
(handler: RequestHandler
) {
const license = this;
return function licenseCheck(
- ctx: Context,
+ ctx: RequestHandlerContext,
request: KibanaRequest
,
response: KibanaResponseFactory
) {
diff --git a/x-pack/plugins/snapshot_restore/server/shared_imports.ts b/x-pack/plugins/snapshot_restore/server/shared_imports.ts
index df9b3dd53cc1f..7f55d189457c7 100644
--- a/x-pack/plugins/snapshot_restore/server/shared_imports.ts
+++ b/x-pack/plugins/snapshot_restore/server/shared_imports.ts
@@ -5,4 +5,4 @@
* 2.0.
*/
-export { isEsError } from '../../../../src/plugins/es_ui_shared/server';
+export { handleEsError } from '../../../../src/plugins/es_ui_shared/server';
diff --git a/x-pack/plugins/snapshot_restore/server/test/helpers/route_dependencies.ts b/x-pack/plugins/snapshot_restore/server/test/helpers/route_dependencies.ts
index 6bd7c10497b24..77c8ab4759b53 100644
--- a/x-pack/plugins/snapshot_restore/server/test/helpers/route_dependencies.ts
+++ b/x-pack/plugins/snapshot_restore/server/test/helpers/route_dependencies.ts
@@ -6,13 +6,14 @@
*/
import { License } from '../../services';
+import { handleEsError } from '../../shared_imports';
import { wrapEsError } from '../../lib';
-import { isEsError } from '../../shared_imports';
+import type { RouteDependencies } from '../../types';
const license = new License();
license.getStatus = jest.fn().mockReturnValue({ isValid: true });
-export const routeDependencies = {
+export const routeDependencies: Omit = {
license,
config: {
isSecurityEnabled: jest.fn().mockReturnValue(true),
@@ -20,7 +21,7 @@ export const routeDependencies = {
isSlmEnabled: true,
},
lib: {
- isEsError,
wrapEsError,
+ handleEsError,
},
};
diff --git a/x-pack/plugins/snapshot_restore/server/test/helpers/router_mock.ts b/x-pack/plugins/snapshot_restore/server/test/helpers/router_mock.ts
index 656301abc5358..efd0ebd0fd1c4 100644
--- a/x-pack/plugins/snapshot_restore/server/test/helpers/router_mock.ts
+++ b/x-pack/plugins/snapshot_restore/server/test/helpers/router_mock.ts
@@ -5,7 +5,10 @@
* 2.0.
*/
-import { set } from '@elastic/safer-lodash-set';
+import type { IRouter } from 'src/core/server';
+import { get } from 'lodash';
+
+import { elasticsearchServiceMock } from '../../../../../../src/core/server/mocks';
type RequestHandler = (...params: any[]) => any;
@@ -48,7 +51,7 @@ export interface RequestMock {
[key: string]: any;
}
-export class RouterMock {
+export class RouterMock implements IRouter {
/**
* Cache to keep a reference to all the request handler defined on the router for each HTTP method and path
*/
@@ -60,15 +63,13 @@ export class RouterMock {
patch: {},
};
- private _callAsCurrentUserCallCount = 0;
- private _callAsCurrentUserResponses: any[] = [];
- private contextMock = {};
+ public contextMock = {
+ core: { elasticsearch: { client: elasticsearchServiceMock.createScopedClusterClient() } },
+ };
- constructor(pathToESclient = 'core.elasticsearch.dataClient') {
- set(this.contextMock, pathToESclient, {
- callAsCurrentUser: this.callAsCurrentUser.bind(this),
- });
- }
+ getRoutes = jest.fn();
+ handleLegacyErrors = jest.fn();
+ routerPath = '';
get({ path }: { path: string }, handler: RequestHandler) {
this.cacheHandlers.get[path] = handler;
@@ -90,17 +91,8 @@ export class RouterMock {
this.cacheHandlers.patch[path] = handler;
}
- private callAsCurrentUser() {
- const index = this._callAsCurrentUserCallCount;
- this._callAsCurrentUserCallCount += 1;
- const response = this._callAsCurrentUserResponses[index];
-
- return typeof response === 'function' ? Promise.resolve(response()) : Promise.resolve(response);
- }
-
- public set callAsCurrentUserResponses(responses: any[]) {
- this._callAsCurrentUserCallCount = 0;
- this._callAsCurrentUserResponses = responses;
+ getMockApiFn(path: string): jest.Mock {
+ return get(this.contextMock.core.elasticsearch.client.asCurrentUser, path);
}
runRequest({ method, path, ...mockRequest }: RequestMock) {
diff --git a/x-pack/plugins/snapshot_restore/server/types.ts b/x-pack/plugins/snapshot_restore/server/types.ts
index c92de645aa2de..8c2ad74865e45 100644
--- a/x-pack/plugins/snapshot_restore/server/types.ts
+++ b/x-pack/plugins/snapshot_restore/server/types.ts
@@ -5,19 +5,14 @@
* 2.0.
*/
-import type {
- LegacyScopedClusterClient,
- ILegacyScopedClusterClient,
- IRouter,
- RequestHandlerContext,
-} from 'src/core/server';
+import type { IRouter, RequestHandlerContext, IScopedClusterClient } from 'src/core/server';
import { LicensingPluginSetup } from '../../licensing/server';
import { SecurityPluginSetup } from '../../security/server';
import { CloudSetup } from '../../cloud/server';
import { PluginSetupContract as FeaturesPluginSetup } from '../../features/server';
import { License } from './services';
import { wrapEsError } from './lib';
-import { isEsError } from './shared_imports';
+import { handleEsError } from './shared_imports';
export interface Dependencies {
licensing: LicensingPluginSetup;
@@ -27,7 +22,7 @@ export interface Dependencies {
}
export interface RouteDependencies {
- router: SnapshotRestoreRouter;
+ router: IRouter;
license: License;
config: {
isSlmEnabled: boolean;
@@ -35,8 +30,8 @@ export interface RouteDependencies {
isCloudEnabled: boolean;
};
lib: {
- isEsError: typeof isEsError;
wrapEsError: typeof wrapEsError;
+ handleEsError: typeof handleEsError;
};
}
@@ -56,13 +51,13 @@ export interface ResolveIndexResponseFromES {
data_streams: Array<{ name: string; backing_indices: string[]; timestamp_field: string }>;
}
-export type CallAsCurrentUser = LegacyScopedClusterClient['callAsCurrentUser'];
+export type CallAsCurrentUser = IScopedClusterClient['asCurrentUser'];
/**
* @internal
*/
export interface SnapshotRestoreContext {
- client: ILegacyScopedClusterClient;
+ client: IScopedClusterClient;
}
/**
@@ -71,8 +66,3 @@ export interface SnapshotRestoreContext {
export interface SnapshotRestoreRequestHandlerContext extends RequestHandlerContext {
snapshotRestore: SnapshotRestoreContext;
}
-
-/**
- * @internal
- */
-export type SnapshotRestoreRouter = IRouter;
diff --git a/x-pack/plugins/telemetry_collection_xpack/schema/xpack_plugins.json b/x-pack/plugins/telemetry_collection_xpack/schema/xpack_plugins.json
index ef09937da3fbc..e1e0711c2bb2c 100644
--- a/x-pack/plugins/telemetry_collection_xpack/schema/xpack_plugins.json
+++ b/x-pack/plugins/telemetry_collection_xpack/schema/xpack_plugins.json
@@ -1837,17 +1837,35 @@
},
"agents": {
"properties": {
- "total": {
- "type": "long"
+ "total_enrolled": {
+ "type": "long",
+ "_meta": {
+ "description": "The total number of enrolled agents, in any state"
+ }
},
- "online": {
- "type": "long"
+ "healthy": {
+ "type": "long",
+ "_meta": {
+ "description": "The total number of enrolled agents in a healthy state"
+ }
},
- "error": {
- "type": "long"
+ "unhealthy": {
+ "type": "long",
+ "_meta": {
+ "description": "The total number of enrolled agents in an unhealthy state"
+ }
},
"offline": {
- "type": "long"
+ "type": "long",
+ "_meta": {
+ "description": "The total number of enrolled agents currently offline"
+ }
+ },
+ "total_all_statuses": {
+ "type": "long",
+ "_meta": {
+ "description": "The total number of agents in any state, both enrolled and inactive"
+ }
}
}
},
@@ -1978,6 +1996,42 @@
"xy_layer_added": {
"type": "long"
},
+ "open_field_editor_edit": {
+ "type": "long",
+ "_meta": {
+ "description": "Number of times the user opened the editor flyout to edit a field from within Lens."
+ }
+ },
+ "open_field_editor_add": {
+ "type": "long",
+ "_meta": {
+ "description": "Number of times the user opened the editor flyout to add a field from within Lens."
+ }
+ },
+ "save_field_edit": {
+ "type": "long",
+ "_meta": {
+ "description": "Number of times the user edited a field from within Lens."
+ }
+ },
+ "save_field_add": {
+ "type": "long",
+ "_meta": {
+ "description": "Number of times the user added a field from within Lens."
+ }
+ },
+ "open_field_delete_modal": {
+ "type": "long",
+ "_meta": {
+ "description": "Number of times the user opened the field delete modal from within Lens."
+ }
+ },
+ "delete_field": {
+ "type": "long",
+ "_meta": {
+ "description": "Number of times the user deleted a field from within Lens."
+ }
+ },
"indexpattern_dimension_operation_terms": {
"type": "long",
"_meta": {
@@ -2034,70 +2088,50 @@
},
"indexpattern_dimension_operation_range": {
"type": "long",
- "_meta": { "description": "Number of times the range function was selected" }
+ "_meta": {
+ "description": "Number of times the range function was selected"
+ }
},
"indexpattern_dimension_operation_median": {
"type": "long",
- "_meta": { "description": "Number of times the median function was selected" }
+ "_meta": {
+ "description": "Number of times the median function was selected"
+ }
},
"indexpattern_dimension_operation_percentile": {
- "type": "long",
- "_meta": { "description": "Number of times the percentile function was selected" }
- },
- "indexpattern_dimension_operation_last_value": {
- "type": "long",
- "_meta": { "description": "Number of times the last value function was selected" }
- },
- "indexpattern_dimension_operation_cumulative_sum": {
- "type": "long",
- "_meta": { "description": "Number of times the cumulative sum function was selected" }
- },
- "indexpattern_dimension_operation_counter_rate": {
- "type": "long",
- "_meta": { "description": "Number of times the counter rate function was selected" }
- },
- "indexpattern_dimension_operation_derivative": {
- "type": "long",
- "_meta": { "description": "Number of times the derivative function was selected" }
- },
- "indexpattern_dimension_operation_moving_average": {
- "type": "long",
- "_meta": { "description": "Number of times the moving average function was selected" }
- },
- "open_field_editor_edit": {
"type": "long",
"_meta": {
- "description": "Number of times the user opened the editor flyout to edit a field from within Lens."
+ "description": "Number of times the percentile function was selected"
}
},
- "open_field_editor_add": {
+ "indexpattern_dimension_operation_last_value": {
"type": "long",
"_meta": {
- "description": "Number of times the user opened the editor flyout to add a field from within Lens."
+ "description": "Number of times the last value function was selected"
}
},
- "save_field_edit": {
+ "indexpattern_dimension_operation_cumulative_sum": {
"type": "long",
"_meta": {
- "description": "Number of times the user edited a field from within Lens."
+ "description": "Number of times the cumulative sum function was selected"
}
},
- "save_field_add": {
+ "indexpattern_dimension_operation_counter_rate": {
"type": "long",
"_meta": {
- "description": "Number of times the user added a field from within Lens."
+ "description": "Number of times the counter rate function was selected"
}
},
- "open_field_delete_modal": {
+ "indexpattern_dimension_operation_derivative": {
"type": "long",
"_meta": {
- "description": "Number of times the user opened the field delete modal from within Lens."
+ "description": "Number of times the derivative function was selected"
}
},
- "delete_field": {
+ "indexpattern_dimension_operation_moving_average": {
"type": "long",
"_meta": {
- "description": "Number of times the user deleted a field from within Lens."
+ "description": "Number of times the moving average function was selected"
}
}
}
@@ -2185,6 +2219,42 @@
"xy_layer_added": {
"type": "long"
},
+ "open_field_editor_edit": {
+ "type": "long",
+ "_meta": {
+ "description": "Number of times the user opened the editor flyout to edit a field from within Lens."
+ }
+ },
+ "open_field_editor_add": {
+ "type": "long",
+ "_meta": {
+ "description": "Number of times the user opened the editor flyout to add a field from within Lens."
+ }
+ },
+ "save_field_edit": {
+ "type": "long",
+ "_meta": {
+ "description": "Number of times the user edited a field from within Lens."
+ }
+ },
+ "save_field_add": {
+ "type": "long",
+ "_meta": {
+ "description": "Number of times the user added a field from within Lens."
+ }
+ },
+ "open_field_delete_modal": {
+ "type": "long",
+ "_meta": {
+ "description": "Number of times the user opened the field delete modal from within Lens."
+ }
+ },
+ "delete_field": {
+ "type": "long",
+ "_meta": {
+ "description": "Number of times the user deleted a field from within Lens."
+ }
+ },
"indexpattern_dimension_operation_terms": {
"type": "long",
"_meta": {
@@ -2241,70 +2311,50 @@
},
"indexpattern_dimension_operation_range": {
"type": "long",
- "_meta": { "description": "Number of times the range function was selected" }
+ "_meta": {
+ "description": "Number of times the range function was selected"
+ }
},
"indexpattern_dimension_operation_median": {
"type": "long",
- "_meta": { "description": "Number of times the median function was selected" }
+ "_meta": {
+ "description": "Number of times the median function was selected"
+ }
},
"indexpattern_dimension_operation_percentile": {
- "type": "long",
- "_meta": { "description": "Number of times the percentile function was selected" }
- },
- "indexpattern_dimension_operation_last_value": {
- "type": "long",
- "_meta": { "description": "Number of times the last value function was selected" }
- },
- "indexpattern_dimension_operation_cumulative_sum": {
- "type": "long",
- "_meta": { "description": "Number of times the cumulative sum function was selected" }
- },
- "indexpattern_dimension_operation_counter_rate": {
- "type": "long",
- "_meta": { "description": "Number of times the counter rate function was selected" }
- },
- "indexpattern_dimension_operation_derivative": {
- "type": "long",
- "_meta": { "description": "Number of times the derivative function was selected" }
- },
- "indexpattern_dimension_operation_moving_average": {
- "type": "long",
- "_meta": { "description": "Number of times the moving average function was selected" }
- },
- "open_field_editor_edit": {
"type": "long",
"_meta": {
- "description": "Number of times the user opened the editor flyout to edit a field from within Lens."
+ "description": "Number of times the percentile function was selected"
}
},
- "open_field_editor_add": {
+ "indexpattern_dimension_operation_last_value": {
"type": "long",
"_meta": {
- "description": "Number of times the user opened the editor flyout to add a field from within Lens."
+ "description": "Number of times the last value function was selected"
}
},
- "save_field_edit": {
+ "indexpattern_dimension_operation_cumulative_sum": {
"type": "long",
"_meta": {
- "description": "Number of times the user edited a field from within Lens."
+ "description": "Number of times the cumulative sum function was selected"
}
},
- "save_field_add": {
+ "indexpattern_dimension_operation_counter_rate": {
"type": "long",
"_meta": {
- "description": "Number of times the user added a field from within Lens."
+ "description": "Number of times the counter rate function was selected"
}
},
- "open_field_delete_modal": {
+ "indexpattern_dimension_operation_derivative": {
"type": "long",
"_meta": {
- "description": "Number of times the user opened the field delete modal from within Lens."
+ "description": "Number of times the derivative function was selected"
}
},
- "delete_field": {
+ "indexpattern_dimension_operation_moving_average": {
"type": "long",
"_meta": {
- "description": "Number of times the user deleted a field from within Lens."
+ "description": "Number of times the moving average function was selected"
}
}
}
diff --git a/x-pack/plugins/timelines/.eslintrc.js b/x-pack/plugins/timelines/.eslintrc.js
new file mode 100644
index 0000000000000..b267018448ba6
--- /dev/null
+++ b/x-pack/plugins/timelines/.eslintrc.js
@@ -0,0 +1,7 @@
+module.exports = {
+ root: true,
+ extends: ['@elastic/eslint-config-kibana', 'plugin:@elastic/eui/recommended'],
+ rules: {
+ '@kbn/eslint/require-license-header': 'off',
+ },
+};
diff --git a/x-pack/plugins/timelines/.i18nrc.json b/x-pack/plugins/timelines/.i18nrc.json
new file mode 100644
index 0000000000000..4fe01ccc7bc69
--- /dev/null
+++ b/x-pack/plugins/timelines/.i18nrc.json
@@ -0,0 +1,7 @@
+{
+ "prefix": "timelines",
+ "paths": {
+ "timelines": "."
+ },
+ "translations": ["translations/ja-JP.json"]
+}
diff --git a/x-pack/plugins/timelines/README.md b/x-pack/plugins/timelines/README.md
new file mode 100644
index 0000000000000..441a505903698
--- /dev/null
+++ b/x-pack/plugins/timelines/README.md
@@ -0,0 +1,11 @@
+# timelines
+Timelines is a plugin that provides a grid component with accompanying server side apis to help users identify events of interest and perform root cause analysis within Kibana.
+
+
+## Using timelines in another plugin
+- Add `TimelinesPluginSetup` to Kibana plugin `SetupServices` dependencies:
+
+```ts
+timelines: TimelinesPluginSetup;
+```
+- Once `timelines` is added as a required plugin in the consuming plugin's kibana.json, timeline functionality will be available as any other kibana plugin, ie PluginSetupDependencies.timelines.getTimeline()
diff --git a/x-pack/plugins/timelines/common/index.ts b/x-pack/plugins/timelines/common/index.ts
new file mode 100644
index 0000000000000..2354c513f73b8
--- /dev/null
+++ b/x-pack/plugins/timelines/common/index.ts
@@ -0,0 +1,2 @@
+export const PLUGIN_ID = 'timelines';
+export const PLUGIN_NAME = 'timelines';
diff --git a/x-pack/plugins/timelines/kibana.json b/x-pack/plugins/timelines/kibana.json
new file mode 100644
index 0000000000000..552ddfd25ce73
--- /dev/null
+++ b/x-pack/plugins/timelines/kibana.json
@@ -0,0 +1,10 @@
+{
+ "id": "timelines",
+ "version": "1.0.0",
+ "kibanaVersion": "kibana",
+ "configPath": ["xpack", "timelines"],
+ "server": true,
+ "ui": true,
+ "requiredPlugins": [],
+ "optionalPlugins": []
+}
diff --git a/x-pack/plugins/timelines/public/components/index.tsx b/x-pack/plugins/timelines/public/components/index.tsx
new file mode 100644
index 0000000000000..3388b3c44baff
--- /dev/null
+++ b/x-pack/plugins/timelines/public/components/index.tsx
@@ -0,0 +1,22 @@
+import React from 'react';
+import { FormattedMessage, I18nProvider } from '@kbn/i18n/react';
+
+import { PLUGIN_NAME } from '../../common';
+import { TimelineProps } from '../types';
+
+export const Timeline = (props: TimelineProps) => {
+ return (
+
+
+
+
+
+ );
+};
+
+// eslint-disable-next-line import/no-default-export
+export { Timeline as default };
diff --git a/x-pack/plugins/timelines/public/index.scss b/x-pack/plugins/timelines/public/index.scss
new file mode 100644
index 0000000000000..e69de29bb2d1d
diff --git a/x-pack/plugins/timelines/public/index.ts b/x-pack/plugins/timelines/public/index.ts
new file mode 100644
index 0000000000000..b535def809de3
--- /dev/null
+++ b/x-pack/plugins/timelines/public/index.ts
@@ -0,0 +1,11 @@
+import './index.scss';
+
+import { PluginInitializerContext } from 'src/core/public';
+import { TimelinesPlugin } from './plugin';
+
+// This exports static code and TypeScript types,
+// as well as, Kibana Platform `plugin()` initializer.
+export function plugin(initializerContext: PluginInitializerContext) {
+ return new TimelinesPlugin(initializerContext);
+}
+export { TimelinesPluginSetup } from './types';
diff --git a/x-pack/plugins/timelines/public/methods/index.tsx b/x-pack/plugins/timelines/public/methods/index.tsx
new file mode 100644
index 0000000000000..f999e14ce910c
--- /dev/null
+++ b/x-pack/plugins/timelines/public/methods/index.tsx
@@ -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
+ * 2.0; you may not use this file except in compliance with the Elastic License
+ * 2.0.
+ */
+
+import React, { lazy, Suspense } from 'react';
+import { EuiLoadingSpinner } from '@elastic/eui';
+import { TimelineProps } from '../types';
+
+export const getTimelineLazy = (props: TimelineProps) => {
+ const TimelineLazy = lazy(() => import('../components'));
+ return (
+ }>
+
+
+ );
+};
diff --git a/x-pack/plugins/timelines/public/plugin.ts b/x-pack/plugins/timelines/public/plugin.ts
new file mode 100644
index 0000000000000..7e90d9467fefd
--- /dev/null
+++ b/x-pack/plugins/timelines/public/plugin.ts
@@ -0,0 +1,24 @@
+import { CoreSetup, Plugin, PluginInitializerContext } from '../../../../src/core/public';
+import { TimelinesPluginSetup, TimelineProps } from './types';
+import { getTimelineLazy } from './methods';
+
+export class TimelinesPlugin implements Plugin {
+ constructor(private readonly initializerContext: PluginInitializerContext) {}
+
+ public setup(core: CoreSetup): TimelinesPluginSetup {
+ const config = this.initializerContext.config.get<{ enabled: boolean }>();
+ if (!config.enabled) {
+ return {};
+ }
+
+ return {
+ getTimeline: (props: TimelineProps) => {
+ return getTimelineLazy(props);
+ },
+ };
+ }
+
+ public start() {}
+
+ public stop() {}
+}
diff --git a/x-pack/plugins/timelines/public/types.ts b/x-pack/plugins/timelines/public/types.ts
new file mode 100644
index 0000000000000..b199b45902718
--- /dev/null
+++ b/x-pack/plugins/timelines/public/types.ts
@@ -0,0 +1,9 @@
+import { ReactElement } from 'react';
+
+export interface TimelinesPluginSetup {
+ getTimeline?: (props: TimelineProps) => ReactElement;
+}
+
+export interface TimelineProps {
+ timelineId: string;
+}
diff --git a/x-pack/plugins/timelines/server/config.ts b/x-pack/plugins/timelines/server/config.ts
new file mode 100644
index 0000000000000..633a95b8f91a7
--- /dev/null
+++ b/x-pack/plugins/timelines/server/config.ts
@@ -0,0 +1,13 @@
+/*
+ * 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 { TypeOf, schema } from '@kbn/config-schema';
+
+export const ConfigSchema = schema.object({
+ enabled: schema.boolean({ defaultValue: false }),
+});
+
+export type ConfigType = TypeOf;
diff --git a/x-pack/plugins/timelines/server/index.ts b/x-pack/plugins/timelines/server/index.ts
new file mode 100644
index 0000000000000..32de97be2704a
--- /dev/null
+++ b/x-pack/plugins/timelines/server/index.ts
@@ -0,0 +1,21 @@
+/*
+ * 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 { PluginInitializerContext } from '../../../../src/core/server';
+import { TimelinesPlugin } from './plugin';
+import { ConfigSchema } from './config';
+
+export const config = {
+ schema: ConfigSchema,
+ exposeToBrowser: {
+ enabled: true,
+ },
+};
+export function plugin(initializerContext: PluginInitializerContext) {
+ return new TimelinesPlugin(initializerContext);
+}
+
+export { TimelinesPluginSetup, TimelinesPluginStart } from './types';
diff --git a/x-pack/plugins/timelines/server/plugin.ts b/x-pack/plugins/timelines/server/plugin.ts
new file mode 100644
index 0000000000000..3e330b19b7fdb
--- /dev/null
+++ b/x-pack/plugins/timelines/server/plugin.ts
@@ -0,0 +1,35 @@
+import {
+ PluginInitializerContext,
+ CoreSetup,
+ CoreStart,
+ Plugin,
+ Logger,
+} from '../../../../src/core/server';
+
+import { TimelinesPluginSetup, TimelinesPluginStart } from './types';
+import { defineRoutes } from './routes';
+
+export class TimelinesPlugin implements Plugin {
+ private readonly logger: Logger;
+
+ constructor(initializerContext: PluginInitializerContext) {
+ this.logger = initializerContext.logger.get();
+ }
+
+ public setup(core: CoreSetup) {
+ this.logger.debug('timelines: Setup');
+ const router = core.http.createRouter();
+
+ // Register server side APIs
+ defineRoutes(router);
+
+ return {};
+ }
+
+ public start(core: CoreStart) {
+ this.logger.debug('timelines: Started');
+ return {};
+ }
+
+ public stop() {}
+}
diff --git a/x-pack/plugins/timelines/server/routes/index.ts b/x-pack/plugins/timelines/server/routes/index.ts
new file mode 100644
index 0000000000000..edb10c579b30b
--- /dev/null
+++ b/x-pack/plugins/timelines/server/routes/index.ts
@@ -0,0 +1,17 @@
+import { IRouter } from '../../../../../src/core/server';
+
+export function defineRoutes(router: IRouter) {
+ router.get(
+ {
+ path: '/api/timeline/example',
+ validate: false,
+ },
+ async (context, request, response) => {
+ return response.ok({
+ body: {
+ time: new Date().toISOString(),
+ },
+ });
+ }
+ );
+}
diff --git a/x-pack/plugins/timelines/server/types.ts b/x-pack/plugins/timelines/server/types.ts
new file mode 100644
index 0000000000000..cb544562b79b4
--- /dev/null
+++ b/x-pack/plugins/timelines/server/types.ts
@@ -0,0 +1,4 @@
+// eslint-disable-next-line @typescript-eslint/no-empty-interface
+export interface TimelinesPluginSetup {}
+// eslint-disable-next-line @typescript-eslint/no-empty-interface
+export interface TimelinesPluginStart {}
diff --git a/x-pack/plugins/timelines/tsconfig.json b/x-pack/plugins/timelines/tsconfig.json
new file mode 100644
index 0000000000000..67e606e798c03
--- /dev/null
+++ b/x-pack/plugins/timelines/tsconfig.json
@@ -0,0 +1,19 @@
+{
+ "extends": "../../../tsconfig.base.json",
+ "compilerOptions": {
+ "composite": true,
+ "outDir": "./target/types",
+ "emitDeclarationOnly": true,
+ "declaration": true,
+ "declarationMap": true
+ },
+ "include": [
+ // add all the folders contains files to be compiled
+ "common/**/*",
+ "public/**/*",
+ "server/**/*"
+ ],
+ "references": [
+ { "path": "../../../src/core/tsconfig.json" },
+ ]
+}
diff --git a/x-pack/plugins/translations/translations/ja-JP.json b/x-pack/plugins/translations/translations/ja-JP.json
index f55b6c5217ad9..b5cd924f480f9 100644
--- a/x-pack/plugins/translations/translations/ja-JP.json
+++ b/x-pack/plugins/translations/translations/ja-JP.json
@@ -2097,7 +2097,7 @@
"home.tutorials.common.auditbeatStatusCheck.successText": "データを受信しました",
"home.tutorials.common.auditbeatStatusCheck.text": "Auditbeat からデータを受け取ったことを確認してください。",
"home.tutorials.common.auditbeatStatusCheck.title": "ステータス",
- "home.tutorials.common.cloudInstructions.passwordAndResetLink": "{passwordTemplate}が「Elastic」ユーザーのパスワードです。\\{#config.cloud.resetPasswordUrl\\}\n パスワードを忘れた場合[Elastic Cloudでリセット] (\\{config.cloud.resetPasswordUrl\\}) 。\n \\{/config.cloud.resetPasswordUrl\\}",
+ "home.tutorials.common.cloudInstructions.passwordAndResetLink": "{passwordTemplate}が「Elastic」ユーザーのパスワードです。\\{#config.cloud.base_url\\}\\{#config.cloud.profile_url\\}\n パスワードを忘れた場合[Elastic Cloudでリセット] (\\{#config.cloud.base_url\\}\\{config.cloud.profile_url\\}) 。\n \\{#config.cloud.base_url\\}\\{/config.cloud.profile_url\\}",
"home.tutorials.common.filebeat.cloudInstructions.gettingStarted.title": "はじめに",
"home.tutorials.common.filebeat.premCloudInstructions.gettingStarted.title": "はじめに",
"home.tutorials.common.filebeat.premInstructions.gettingStarted.title": "はじめに",
@@ -3027,7 +3027,6 @@
"kibana-react.tableListView.listing.listingLimitExceeded.advancedSettingsLinkText": "高度な設定",
"kibana-react.tableListView.listing.listingLimitExceededDescription": "{totalItems} 件の {entityNamePlural} がありますが、{listingLimitText} の設定により {listingLimitValue} 件までしか下の表に表示できません。{advancedSettingsLink} の下でこの設定を変更できます。",
"kibana-react.tableListView.listing.listingLimitExceededTitle": "リスティング制限超過",
- "kibana-react.tableListView.listing.noAvailableItemsMessage": "利用可能な {entityNamePlural} がありません。",
"kibana-react.tableListView.listing.noMatchedItemsMessage": "検索条件に一致する {entityNamePlural} がありません。",
"kibana-react.tableListView.listing.table.actionTitle": "アクション",
"kibana-react.tableListView.listing.table.editActionDescription": "編集",
@@ -12579,7 +12578,6 @@
"xpack.maps.mapListing.descriptionFieldTitle": "説明",
"xpack.maps.mapListing.entityName": "マップ",
"xpack.maps.mapListing.entityNamePlural": "マップ",
- "xpack.maps.mapListing.errorAttemptingToLoadSavedMaps": "マップを読み込めません",
"xpack.maps.mapListing.titleFieldTitle": "タイトル",
"xpack.maps.maps.choropleth.rightSourcePlaceholder": "インデックスパターンを選択",
"xpack.maps.mapSavedObjectLabel": "マップ",
diff --git a/x-pack/plugins/translations/translations/zh-CN.json b/x-pack/plugins/translations/translations/zh-CN.json
index c0652b8ac2a65..58119a0739812 100644
--- a/x-pack/plugins/translations/translations/zh-CN.json
+++ b/x-pack/plugins/translations/translations/zh-CN.json
@@ -2108,7 +2108,7 @@
"home.tutorials.common.auditbeatStatusCheck.successText": "已成功接收数据",
"home.tutorials.common.auditbeatStatusCheck.text": "确认从 Auditbeat 收到数据",
"home.tutorials.common.auditbeatStatusCheck.title": "状态",
- "home.tutorials.common.cloudInstructions.passwordAndResetLink": "其中 {passwordTemplate} 是用户 `elastic` 的密码。\\{#config.cloud.resetPasswordUrl\\}\n 忘了密码?[在 Elastic Cloud 中重置](\\{config.cloud.resetPasswordUrl\\})。\n \\{/config.cloud.resetPasswordUrl\\}",
+ "home.tutorials.common.cloudInstructions.passwordAndResetLink": "其中 {passwordTemplate} 是用户 `elastic` 的密码。\\{#config.cloud.base_url\\}\\{#config.cloud.profile_url\\}\n 忘了密码?[在 Elastic Cloud 中重置](\\{#config.cloud.base_url\\}\\{config.cloud.profile_url\\})。\n \\{#config.cloud.base_url\\}\\{/config.cloud.profile_url\\}",
"home.tutorials.common.filebeat.cloudInstructions.gettingStarted.title": "入门",
"home.tutorials.common.filebeat.premCloudInstructions.gettingStarted.title": "入门",
"home.tutorials.common.filebeat.premInstructions.gettingStarted.title": "入门",
@@ -3048,7 +3048,6 @@
"kibana-react.tableListView.listing.listingLimitExceeded.advancedSettingsLinkText": "高级设置",
"kibana-react.tableListView.listing.listingLimitExceededDescription": "您有 {totalItems} 个{entityNamePlural},但您的“{listingLimitText}”设置阻止下表显示 {listingLimitValue} 个以上。您可以在“{advancedSettingsLink}”下更改此设置。",
"kibana-react.tableListView.listing.listingLimitExceededTitle": "已超过列表限制",
- "kibana-react.tableListView.listing.noAvailableItemsMessage": "没有可用的{entityNamePlural}。",
"kibana-react.tableListView.listing.noMatchedItemsMessage": "没有任何{entityNamePlural}匹配您的搜索。",
"kibana-react.tableListView.listing.table.actionTitle": "操作",
"kibana-react.tableListView.listing.table.editActionDescription": "编辑",
@@ -12744,7 +12743,6 @@
"xpack.maps.mapListing.descriptionFieldTitle": "描述",
"xpack.maps.mapListing.entityName": "地图",
"xpack.maps.mapListing.entityNamePlural": "地图",
- "xpack.maps.mapListing.errorAttemptingToLoadSavedMaps": "无法加载地图",
"xpack.maps.mapListing.titleFieldTitle": "标题",
"xpack.maps.maps.choropleth.rightSourcePlaceholder": "选择索引模式",
"xpack.maps.mapSavedObjectLabel": "地图",
diff --git a/x-pack/plugins/uptime/public/components/monitor/status_details/location_map/embeddables/embedded_map.tsx b/x-pack/plugins/uptime/public/components/monitor/status_details/location_map/embeddables/embedded_map.tsx
index f2da38091e37f..6706a435c7b6b 100644
--- a/x-pack/plugins/uptime/public/components/monitor/status_details/location_map/embeddables/embedded_map.tsx
+++ b/x-pack/plugins/uptime/public/components/monitor/status_details/location_map/embeddables/embedded_map.tsx
@@ -26,7 +26,7 @@ import {
import { MAP_SAVED_OBJECT_TYPE } from '../../../../../../../maps/public';
import { MapToolTipComponent } from './map_tool_tip';
// eslint-disable-next-line @kbn/eslint/no-restricted-paths
-import { RenderTooltipContentParams } from '../../../../../../../maps/public/classes/tooltips/tooltip_property';
+import type { RenderTooltipContentParams } from '../../../../../../../maps/public/classes/tooltips/tooltip_property';
export interface EmbeddedMapProps {
upPoints: LocationPoint[];
diff --git a/x-pack/plugins/uptime/public/components/monitor/status_details/location_map/embeddables/map_tool_tip.tsx b/x-pack/plugins/uptime/public/components/monitor/status_details/location_map/embeddables/map_tool_tip.tsx
index f2d1227fe870e..c03ed94f8c544 100644
--- a/x-pack/plugins/uptime/public/components/monitor/status_details/location_map/embeddables/map_tool_tip.tsx
+++ b/x-pack/plugins/uptime/public/components/monitor/status_details/location_map/embeddables/map_tool_tip.tsx
@@ -22,8 +22,7 @@ import { AppState } from '../../../../../state';
import { monitorLocationsSelector } from '../../../../../state/selectors';
import { useMonitorId } from '../../../../../hooks';
import { MonitorLocation } from '../../../../../../common/runtime_types/monitor';
-// eslint-disable-next-line @kbn/eslint/no-restricted-paths
-import { RenderTooltipContentParams } from '../../../../../../../maps/public/classes/tooltips/tooltip_property';
+import type { RenderTooltipContentParams } from '../../../../../../../maps/public';
import { formatAvailabilityValue } from '../../availability_reporting/availability_reporting';
import { LastCheckLabel } from '../../translations';
diff --git a/x-pack/test/accessibility/apps/lens.ts b/x-pack/test/accessibility/apps/lens.ts
index 59ce697811aa7..a8d20ff56de08 100644
--- a/x-pack/test/accessibility/apps/lens.ts
+++ b/x-pack/test/accessibility/apps/lens.ts
@@ -112,8 +112,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) {
await a11y.testAppSnapshot();
});
- // Skip until https://github.com/elastic/kibana/issues/88661 gets closed
- it.skip('lens XY chart with multiple layers', async () => {
+ it('lens XY chart with multiple layers', async () => {
await PageObjects.lens.createLayer();
await PageObjects.lens.switchToVisualization('area');
diff --git a/x-pack/test/api_integration/apis/management/rollup/rollup.js b/x-pack/test/api_integration/apis/management/rollup/rollup.js
index 4cb2ef6ea0fa0..a556c8071ca80 100644
--- a/x-pack/test/api_integration/apis/management/rollup/rollup.js
+++ b/x-pack/test/api_integration/apis/management/rollup/rollup.js
@@ -24,7 +24,8 @@ export default function ({ getService }) {
cleanUp,
} = registerHelpers(getService);
- describe('jobs', () => {
+ // FAILING ES PROMOTION: https://github.com/elastic/kibana/issues/96002
+ describe.skip('jobs', () => {
after(() => cleanUp());
describe('indices', () => {
diff --git a/x-pack/test/api_integration/apis/management/snapshot_restore/lib/elasticsearch.ts b/x-pack/test/api_integration/apis/management/snapshot_restore/lib/elasticsearch.ts
index 06ea5dc800e45..9b4d39a3b10b3 100644
--- a/x-pack/test/api_integration/apis/management/snapshot_restore/lib/elasticsearch.ts
+++ b/x-pack/test/api_integration/apis/management/snapshot_restore/lib/elasticsearch.ts
@@ -14,7 +14,7 @@ interface SlmPolicy {
repository: string;
isManagedPolicy: boolean;
config?: {
- indices?: string | string[];
+ indices: string | string[];
ignoreUnavailable?: boolean;
includeGlobalState?: boolean;
partial?: boolean;
@@ -36,19 +36,21 @@ interface SlmPolicy {
export const registerEsHelpers = (getService: FtrProviderContext['getService']) => {
let policiesCreated: string[] = [];
- const es = getService('legacyEs');
+ const es = getService('es');
const createRepository = (repoName: string) => {
- return es.snapshot.createRepository({
- repository: repoName,
- body: {
- type: 'fs',
- settings: {
- location: '/tmp/',
+ return es.snapshot
+ .createRepository({
+ repository: repoName,
+ body: {
+ type: 'fs',
+ settings: {
+ location: '/tmp/',
+ },
},
- },
- verify: false,
- });
+ verify: false,
+ })
+ .then(({ body }) => body);
};
const createPolicy = (policy: SlmPolicy, cachePolicy?: boolean) => {
@@ -56,20 +58,27 @@ export const registerEsHelpers = (getService: FtrProviderContext['getService'])
policiesCreated.push(policy.name);
}
- return es.sr.updatePolicy({
- name: policy.name,
- body: policy,
- });
+ return es.slm
+ .putLifecycle({
+ policy_id: policy.name,
+ // TODO: bring {@link SlmPolicy} in line with {@link PutSnapshotLifecycleRequest['body']}
+ // @ts-expect-error
+ body: policy,
+ })
+ .then(({ body }) => body);
};
const getPolicy = (policyName: string) => {
- return es.sr.policy({
- name: policyName,
- human: true,
- });
+ return es.slm
+ .getLifecycle({
+ policy_id: policyName,
+ human: true,
+ })
+ .then(({ body }) => body);
};
- const deletePolicy = (policyName: string) => es.sr.deletePolicy({ name: policyName });
+ const deletePolicy = (policyName: string) =>
+ es.slm.deleteLifecycle({ policy_id: policyName }).then(({ body }) => body);
const cleanupPolicies = () =>
Promise.all(policiesCreated.map(deletePolicy))
diff --git a/x-pack/test/api_integration/services/legacy_es.js b/x-pack/test/api_integration/services/legacy_es.js
index 49482292bfb25..0b02d394b107f 100644
--- a/x-pack/test/api_integration/services/legacy_es.js
+++ b/x-pack/test/api_integration/services/legacy_es.js
@@ -10,7 +10,6 @@ import { format as formatUrl } from 'url';
import * as legacyElasticsearch from 'elasticsearch';
import { elasticsearchJsPlugin as indexManagementEsClientPlugin } from '../../../plugins/index_management/server/client/elasticsearch';
-import { elasticsearchJsPlugin as snapshotRestoreEsClientPlugin } from '../../../plugins/snapshot_restore/server/client/elasticsearch_sr';
// eslint-disable-next-line @kbn/eslint/no-restricted-paths
import { DEFAULT_API_VERSION } from '../../../../src/core/server/elasticsearch/elasticsearch_config';
@@ -21,6 +20,6 @@ export function LegacyEsProvider({ getService }) {
apiVersion: DEFAULT_API_VERSION,
host: formatUrl(config.get('servers.elasticsearch')),
requestTimeout: config.get('timeouts.esRequestTimeout'),
- plugins: [indexManagementEsClientPlugin, snapshotRestoreEsClientPlugin],
+ plugins: [indexManagementEsClientPlugin],
});
}
diff --git a/x-pack/test/banners_functional/config.ts b/x-pack/test/banners_functional/config.ts
new file mode 100644
index 0000000000000..21cce31ca5d85
--- /dev/null
+++ b/x-pack/test/banners_functional/config.ts
@@ -0,0 +1,45 @@
+/*
+ * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
+ * or more contributor license agreements. Licensed under the Elastic License
+ * 2.0; you may not use this file except in compliance with the Elastic License
+ * 2.0.
+ */
+
+import path from 'path';
+import { FtrConfigProviderContext } from '@kbn/test/types/ftr';
+import { services, pageObjects } from './ftr_provider_context';
+
+export default async function ({ readConfigFile }: FtrConfigProviderContext) {
+ const kibanaFunctionalConfig = await readConfigFile(require.resolve('../functional/config.js'));
+
+ return {
+ testFiles: [require.resolve('./tests')],
+ servers: {
+ ...kibanaFunctionalConfig.get('servers'),
+ },
+ services,
+ pageObjects,
+
+ junit: {
+ reportName: 'X-Pack Banners Functional Tests',
+ },
+
+ esTestCluster: kibanaFunctionalConfig.get('esTestCluster'),
+ apps: {
+ ...kibanaFunctionalConfig.get('apps'),
+ },
+
+ esArchiver: {
+ directory: path.resolve(__dirname, '..', 'functional', 'es_archives'),
+ },
+
+ kbnTestServer: {
+ ...kibanaFunctionalConfig.get('kbnTestServer'),
+ serverArgs: [
+ ...kibanaFunctionalConfig.get('kbnTestServer.serverArgs'),
+ '--xpack.banners.placement=header',
+ '--xpack.banners.textContent="global banner text"',
+ ],
+ },
+ };
+}
diff --git a/x-pack/test/banners_functional/ftr_provider_context.ts b/x-pack/test/banners_functional/ftr_provider_context.ts
new file mode 100644
index 0000000000000..faac2954b00f6
--- /dev/null
+++ b/x-pack/test/banners_functional/ftr_provider_context.ts
@@ -0,0 +1,13 @@
+/*
+ * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
+ * or more contributor license agreements. Licensed under the Elastic License
+ * 2.0; you may not use this file except in compliance with the Elastic License
+ * 2.0.
+ */
+
+import { GenericFtrProviderContext } from '@kbn/test/types/ftr';
+import { services } from '../functional/services';
+import { pageObjects } from '../functional/page_objects';
+
+export type FtrProviderContext = GenericFtrProviderContext;
+export { services, pageObjects };
diff --git a/x-pack/test/banners_functional/tests/global.ts b/x-pack/test/banners_functional/tests/global.ts
new file mode 100644
index 0000000000000..cef404d7ed132
--- /dev/null
+++ b/x-pack/test/banners_functional/tests/global.ts
@@ -0,0 +1,22 @@
+/*
+ * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
+ * or more contributor license agreements. Licensed under the Elastic License
+ * 2.0; you may not use this file except in compliance with the Elastic License
+ * 2.0.
+ */
+
+import expect from '@kbn/expect';
+import { FtrProviderContext } from '../ftr_provider_context';
+
+export default function ({ getPageObjects }: FtrProviderContext) {
+ const PageObjects = getPageObjects(['common', 'security', 'banners']);
+
+ describe('global pages', () => {
+ it('displays the global banner on the login page', async () => {
+ await PageObjects.common.navigateToApp('login');
+
+ expect(await PageObjects.banners.isTopBannerVisible()).to.eql(true);
+ expect(await PageObjects.banners.getTopBannerText()).to.eql('global banner text');
+ });
+ });
+}
diff --git a/x-pack/test/banners_functional/tests/index.ts b/x-pack/test/banners_functional/tests/index.ts
new file mode 100644
index 0000000000000..301c872c746e1
--- /dev/null
+++ b/x-pack/test/banners_functional/tests/index.ts
@@ -0,0 +1,17 @@
+/*
+ * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
+ * or more contributor license agreements. Licensed under the Elastic License
+ * 2.0; you may not use this file except in compliance with the Elastic License
+ * 2.0.
+ */
+
+import { FtrProviderContext } from '../ftr_provider_context';
+
+export default function ({ loadTestFile }: FtrProviderContext) {
+ describe('banners - functional tests', function () {
+ this.tags('ciGroup2');
+
+ loadTestFile(require.resolve('./global'));
+ loadTestFile(require.resolve('./spaces'));
+ });
+}
diff --git a/x-pack/test/banners_functional/tests/spaces.ts b/x-pack/test/banners_functional/tests/spaces.ts
new file mode 100644
index 0000000000000..f8c412c0df0e3
--- /dev/null
+++ b/x-pack/test/banners_functional/tests/spaces.ts
@@ -0,0 +1,67 @@
+/*
+ * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
+ * or more contributor license agreements. Licensed under the Elastic License
+ * 2.0; you may not use this file except in compliance with the Elastic License
+ * 2.0.
+ */
+
+import expect from '@kbn/expect';
+import { FtrProviderContext } from '../ftr_provider_context';
+
+export default function ({ getPageObjects, getService }: FtrProviderContext) {
+ const esArchiver = getService('esArchiver');
+ const PageObjects = getPageObjects([
+ 'common',
+ 'security',
+ 'banners',
+ 'settings',
+ 'spaceSelector',
+ ]);
+
+ describe('per-spaces banners', () => {
+ before(async () => {
+ await esArchiver.load('banners/multispace');
+ });
+
+ after(async () => {
+ await esArchiver.unload('banners/multispace');
+ });
+
+ before(async () => {
+ await PageObjects.security.login(undefined, undefined, {
+ expectSpaceSelector: true,
+ });
+ await PageObjects.spaceSelector.clickSpaceCard('default');
+
+ await PageObjects.settings.navigateTo();
+ await PageObjects.settings.clickKibanaSettings();
+
+ await PageObjects.settings.setAdvancedSettingsTextArea(
+ 'banners:textContent',
+ 'default space banner text'
+ );
+ });
+
+ it('displays the space-specific banner within the space', async () => {
+ await PageObjects.common.navigateToApp('home');
+
+ expect(await PageObjects.banners.isTopBannerVisible()).to.eql(true);
+ expect(await PageObjects.banners.getTopBannerText()).to.eql('default space banner text');
+ });
+
+ it('displays the global banner within another space', async () => {
+ await PageObjects.common.navigateToApp('home', { basePath: '/s/another-space' });
+
+ expect(await PageObjects.banners.isTopBannerVisible()).to.eql(true);
+ expect(await PageObjects.banners.getTopBannerText()).to.eql('global banner text');
+ });
+
+ it('displays the global banner on the login page', async () => {
+ await PageObjects.security.forceLogout();
+ await PageObjects.common.navigateToApp('login');
+
+ expect(await PageObjects.banners.isTopBannerVisible()).to.eql(true);
+ expect(await PageObjects.banners.getTopBannerText()).to.eql('global banner text');
+ });
+ });
+}
diff --git a/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/create_threat_matching.ts b/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/create_threat_matching.ts
index a7925fa756693..f0b173d2d4c48 100644
--- a/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/create_threat_matching.ts
+++ b/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/create_threat_matching.ts
@@ -317,6 +317,16 @@ export default ({ getService }: FtrProviderContext) => {
{
description: "domain should match the auditbeat hosts' data's source.ip",
domain: '159.89.119.67',
+ event: {
+ category: 'threat',
+ created: '2021-01-26T11:09:05.529Z',
+ dataset: 'threatintel.abuseurl',
+ ingested: '2021-01-26T11:09:06.595350Z',
+ kind: 'enrichment',
+ module: 'threatintel',
+ reference: 'https://urlhaus.abuse.ch/url/978783/',
+ type: 'indicator',
+ },
first_seen: '2021-01-26T11:09:04.000Z',
matched: {
atomic: '159.89.119.67',
@@ -339,6 +349,16 @@ export default ({ getService }: FtrProviderContext) => {
{
description: "domain should match the auditbeat hosts' data's source.ip",
domain: '159.89.119.67',
+ event: {
+ category: 'threat',
+ created: '2021-01-26T11:09:05.529Z',
+ dataset: 'threatintel.abuseurl',
+ ingested: '2021-01-26T11:09:06.595350Z',
+ kind: 'enrichment',
+ module: 'threatintel',
+ reference: 'https://urlhaus.abuse.ch/url/978783/',
+ type: 'indicator',
+ },
first_seen: '2021-01-26T11:09:04.000Z',
matched: {
atomic: '159.89.119.67',
@@ -412,6 +432,16 @@ export default ({ getService }: FtrProviderContext) => {
port: 57324,
provider: 'geenensp',
type: 'url',
+ event: {
+ category: 'threat',
+ created: '2021-01-26T11:09:05.529Z',
+ dataset: 'threatintel.abuseurl',
+ ingested: '2021-01-26T11:09:06.616763Z',
+ kind: 'enrichment',
+ module: 'threatintel',
+ reference: 'https://urlhaus.abuse.ch/url/978782/',
+ type: 'indicator',
+ },
},
{
description: 'this should match auditbeat/hosts on ip',
@@ -426,6 +456,16 @@ export default ({ getService }: FtrProviderContext) => {
},
provider: 'other_provider',
type: 'ip',
+ event: {
+ category: 'threat',
+ created: '2021-01-26T11:09:05.529Z',
+ dataset: 'threatintel.abuseurl',
+ ingested: '2021-01-26T11:09:06.616763Z',
+ kind: 'enrichment',
+ module: 'threatintel',
+ reference: 'https://urlhaus.abuse.ch/url/978782/',
+ type: 'indicator',
+ },
},
]);
});
@@ -492,6 +532,16 @@ export default ({ getService }: FtrProviderContext) => {
port: 57324,
provider: 'geenensp',
type: 'url',
+ event: {
+ category: 'threat',
+ created: '2021-01-26T11:09:05.529Z',
+ dataset: 'threatintel.abuseurl',
+ ingested: '2021-01-26T11:09:06.616763Z',
+ kind: 'enrichment',
+ module: 'threatintel',
+ reference: 'https://urlhaus.abuse.ch/url/978782/',
+ type: 'indicator',
+ },
},
// We do not merge matched indicators during enrichment, so in
// certain circumstances a given indicator document could appear
@@ -512,6 +562,16 @@ export default ({ getService }: FtrProviderContext) => {
port: 57324,
provider: 'geenensp',
type: 'url',
+ event: {
+ category: 'threat',
+ created: '2021-01-26T11:09:05.529Z',
+ dataset: 'threatintel.abuseurl',
+ ingested: '2021-01-26T11:09:06.616763Z',
+ kind: 'enrichment',
+ module: 'threatintel',
+ reference: 'https://urlhaus.abuse.ch/url/978782/',
+ type: 'indicator',
+ },
},
{
description: 'this should match auditbeat/hosts on ip',
@@ -526,6 +586,16 @@ export default ({ getService }: FtrProviderContext) => {
},
provider: 'other_provider',
type: 'ip',
+ event: {
+ category: 'threat',
+ created: '2021-01-26T11:09:05.529Z',
+ dataset: 'threatintel.abuseurl',
+ ingested: '2021-01-26T11:09:06.616763Z',
+ kind: 'enrichment',
+ module: 'threatintel',
+ reference: 'https://urlhaus.abuse.ch/url/978782/',
+ type: 'indicator',
+ },
},
]);
});
@@ -600,6 +670,16 @@ export default ({ getService }: FtrProviderContext) => {
full: 'http://159.89.119.67:59600/bin.sh',
scheme: 'http',
},
+ event: {
+ category: 'threat',
+ created: '2021-01-26T11:09:05.529Z',
+ dataset: 'threatintel.abuseurl',
+ ingested: '2021-01-26T11:09:06.595350Z',
+ kind: 'enrichment',
+ module: 'threatintel',
+ reference: 'https://urlhaus.abuse.ch/url/978783/',
+ type: 'indicator',
+ },
},
]);
@@ -621,6 +701,16 @@ export default ({ getService }: FtrProviderContext) => {
full: 'http://159.89.119.67:59600/bin.sh',
scheme: 'http',
},
+ event: {
+ category: 'threat',
+ created: '2021-01-26T11:09:05.529Z',
+ dataset: 'threatintel.abuseurl',
+ ingested: '2021-01-26T11:09:06.595350Z',
+ kind: 'enrichment',
+ module: 'threatintel',
+ reference: 'https://urlhaus.abuse.ch/url/978783/',
+ type: 'indicator',
+ },
},
{
description: 'this should match auditbeat/hosts on both port and ip',
@@ -636,6 +726,16 @@ export default ({ getService }: FtrProviderContext) => {
port: 57324,
provider: 'geenensp',
type: 'url',
+ event: {
+ category: 'threat',
+ created: '2021-01-26T11:09:05.529Z',
+ dataset: 'threatintel.abuseurl',
+ ingested: '2021-01-26T11:09:06.616763Z',
+ kind: 'enrichment',
+ module: 'threatintel',
+ reference: 'https://urlhaus.abuse.ch/url/978782/',
+ type: 'indicator',
+ },
},
{
description: 'this should match auditbeat/hosts on both port and ip',
@@ -651,6 +751,16 @@ export default ({ getService }: FtrProviderContext) => {
port: 57324,
provider: 'geenensp',
type: 'url',
+ event: {
+ category: 'threat',
+ created: '2021-01-26T11:09:05.529Z',
+ dataset: 'threatintel.abuseurl',
+ ingested: '2021-01-26T11:09:06.616763Z',
+ kind: 'enrichment',
+ module: 'threatintel',
+ reference: 'https://urlhaus.abuse.ch/url/978782/',
+ type: 'indicator',
+ },
},
]);
});
diff --git a/x-pack/test/fleet_api_integration/apis/agents/status.ts b/x-pack/test/fleet_api_integration/apis/agents/status.ts
index 3245b9a459fb1..f79ff15b64d33 100644
--- a/x-pack/test/fleet_api_integration/apis/agents/status.ts
+++ b/x-pack/test/fleet_api_integration/apis/agents/status.ts
@@ -79,6 +79,7 @@ export default function ({ getService }: FtrProviderContext) {
offline: 1,
updating: 1,
other: 1,
+ inactive: 0,
},
});
});
diff --git a/x-pack/test/functional/apps/dashboard/feature_controls/index.ts b/x-pack/test/functional/apps/dashboard/feature_controls/index.ts
index 38d139c59430e..3b32ea031f6e2 100644
--- a/x-pack/test/functional/apps/dashboard/feature_controls/index.ts
+++ b/x-pack/test/functional/apps/dashboard/feature_controls/index.ts
@@ -11,6 +11,7 @@ export default function ({ loadTestFile }: FtrProviderContext) {
describe('feature controls', function () {
this.tags(['skipFirefox']);
loadTestFile(require.resolve('./dashboard_security'));
+ loadTestFile(require.resolve('./time_to_visualize_security'));
loadTestFile(require.resolve('./dashboard_spaces'));
});
}
diff --git a/x-pack/test/functional/apps/dashboard/feature_controls/time_to_visualize_security.ts b/x-pack/test/functional/apps/dashboard/feature_controls/time_to_visualize_security.ts
new file mode 100644
index 0000000000000..3ebc53cc7cf27
--- /dev/null
+++ b/x-pack/test/functional/apps/dashboard/feature_controls/time_to_visualize_security.ts
@@ -0,0 +1,233 @@
+/*
+ * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
+ * or more contributor license agreements. Licensed under the Elastic License
+ * 2.0; you may not use this file except in compliance with the Elastic License
+ * 2.0.
+ */
+
+import expect from '@kbn/expect';
+import { FtrProviderContext } from '../../../ftr_provider_context';
+
+export default function ({ getPageObjects, getService }: FtrProviderContext) {
+ const PageObjects = getPageObjects([
+ 'timeToVisualize',
+ 'timePicker',
+ 'dashboard',
+ 'visEditor',
+ 'visualize',
+ 'security',
+ 'common',
+ 'header',
+ 'lens',
+ ]);
+
+ const dashboardVisualizations = getService('dashboardVisualizations');
+ const dashboardPanelActions = getService('dashboardPanelActions');
+ const dashboardExpect = getService('dashboardExpect');
+ const testSubjects = getService('testSubjects');
+ const esArchiver = getService('esArchiver');
+ const security = getService('security');
+ const find = getService('find');
+
+ describe('dashboard time to visualize security', () => {
+ before(async () => {
+ await esArchiver.load('dashboard/feature_controls/security');
+ await esArchiver.loadIfNeeded('logstash_functional');
+
+ // ensure we're logged out so we can login as the appropriate users
+ await PageObjects.security.forceLogout();
+
+ await security.role.create('dashboard_write_vis_read', {
+ elasticsearch: {
+ indices: [{ names: ['logstash-*'], privileges: ['read', 'view_index_metadata'] }],
+ },
+ kibana: [
+ {
+ feature: {
+ dashboard: ['all'],
+ visualize: ['read'],
+ },
+ spaces: ['*'],
+ },
+ ],
+ });
+
+ await security.user.create('dashboard_write_vis_read_user', {
+ password: 'dashboard_write_vis_read_user-password',
+ roles: ['dashboard_write_vis_read'],
+ full_name: 'test user',
+ });
+
+ await PageObjects.security.login(
+ 'dashboard_write_vis_read_user',
+ 'dashboard_write_vis_read_user-password',
+ {
+ expectSpaceSelector: false,
+ }
+ );
+ });
+
+ after(async () => {
+ await security.role.delete('dashboard_write_vis_read');
+ await security.user.delete('dashboard_write_vis_read_user');
+
+ await esArchiver.unload('dashboard/feature_controls/security');
+
+ // logout, so the other tests don't accidentally run as the custom users we're testing below
+ await PageObjects.security.forceLogout();
+ });
+
+ describe('lens by value works without library save permissions', () => {
+ before(async () => {
+ await PageObjects.common.navigateToApp('dashboard');
+ await PageObjects.dashboard.preserveCrossAppState();
+ await PageObjects.dashboard.clickNewDashboard();
+ });
+
+ it('can add a lens panel by value', async () => {
+ await dashboardVisualizations.ensureNewVisualizationDialogIsShowing();
+ await PageObjects.lens.createAndAddLensFromDashboard({});
+ const newPanelCount = await PageObjects.dashboard.getPanelCount();
+ expect(newPanelCount).to.eql(1);
+ });
+
+ it('edits to a by value lens panel are properly applied', async () => {
+ await PageObjects.dashboard.waitForRenderComplete();
+ await dashboardPanelActions.openContextMenu();
+ await dashboardPanelActions.clickEdit();
+ await PageObjects.lens.switchToVisualization('donut');
+ await PageObjects.lens.saveAndReturn();
+ await PageObjects.dashboard.waitForRenderComplete();
+
+ const pieExists = await find.existsByCssSelector('.lnsPieExpression__container');
+ expect(pieExists).to.be(true);
+ });
+
+ it('disables save to library button without visualize save permissions', async () => {
+ await PageObjects.dashboard.waitForRenderComplete();
+ await dashboardPanelActions.openContextMenu();
+ await dashboardPanelActions.clickEdit();
+ const saveButton = await testSubjects.find('lnsApp_saveButton');
+ expect(await saveButton.getAttribute('disabled')).to.equal('true');
+ await PageObjects.lens.saveAndReturn();
+ await PageObjects.timeToVisualize.resetNewDashboard();
+ });
+
+ it('should allow new lens to be added by value, but not by reference', async () => {
+ await PageObjects.visualize.navigateToNewVisualization();
+ await PageObjects.visualize.clickVisType('lens');
+ await PageObjects.lens.goToTimeRange();
+
+ await PageObjects.lens.configureDimension({
+ dimension: 'lnsXY_yDimensionPanel > lns-empty-dimension',
+ operation: 'average',
+ field: 'bytes',
+ });
+
+ await PageObjects.lens.switchToVisualization('lnsMetric');
+
+ await PageObjects.lens.waitForVisualization();
+ await PageObjects.lens.assertMetric('Average of bytes', '5,727.322');
+
+ await PageObjects.header.waitUntilLoadingHasFinished();
+ await testSubjects.click('lnsApp_saveButton');
+
+ const libraryCheckbox = await find.byCssSelector('#add-to-library-checkbox');
+ expect(await libraryCheckbox.getAttribute('disabled')).to.equal('true');
+
+ await PageObjects.timeToVisualize.saveFromModal('New Lens from Modal', {
+ addToDashboard: 'new',
+ saveAsNew: true,
+ saveToLibrary: false,
+ });
+
+ await PageObjects.dashboard.waitForRenderComplete();
+
+ await PageObjects.lens.assertMetric('Average of bytes', '5,727.322');
+ const isLinked = await PageObjects.timeToVisualize.libraryNotificationExists(
+ 'New Lens from Modal'
+ );
+ expect(isLinked).to.be(false);
+
+ const panelCount = await PageObjects.dashboard.getPanelCount();
+ expect(panelCount).to.eql(1);
+
+ await PageObjects.timeToVisualize.resetNewDashboard();
+ });
+ });
+
+ describe('visualize by value works without library save permissions', () => {
+ const originalMarkdownText = 'Original markdown text';
+ const modifiedMarkdownText = 'Modified markdown text';
+
+ before(async () => {
+ await PageObjects.common.navigateToApp('dashboard');
+ await PageObjects.dashboard.preserveCrossAppState();
+ await PageObjects.dashboard.clickNewDashboard();
+ });
+
+ it('can add a markdown panel by value', async () => {
+ await PageObjects.common.navigateToApp('dashboard');
+ await PageObjects.dashboard.clickNewDashboard();
+ await PageObjects.dashboard.waitForRenderComplete();
+
+ await testSubjects.click('dashboardAddNewPanelButton');
+ await dashboardVisualizations.ensureNewVisualizationDialogIsShowing();
+ await PageObjects.visualize.clickMarkdownWidget();
+ await PageObjects.visEditor.setMarkdownTxt(originalMarkdownText);
+ await PageObjects.visEditor.clickGo();
+
+ await PageObjects.visualize.saveVisualizationAndReturn();
+ const newPanelCount = await PageObjects.dashboard.getPanelCount();
+ expect(newPanelCount).to.eql(1);
+ });
+
+ it('edits to a by value visualize panel are properly applied', async () => {
+ await dashboardPanelActions.openContextMenu();
+ await dashboardPanelActions.clickEdit();
+ await PageObjects.header.waitUntilLoadingHasFinished();
+ await PageObjects.visEditor.setMarkdownTxt(modifiedMarkdownText);
+ await PageObjects.visEditor.clickGo();
+ await PageObjects.visualize.saveVisualizationAndReturn();
+
+ await PageObjects.dashboard.waitForRenderComplete();
+ const markdownText = await testSubjects.find('markdownBody');
+ expect(await markdownText.getVisibleText()).to.eql(modifiedMarkdownText);
+
+ const newPanelCount = PageObjects.dashboard.getPanelCount();
+ expect(newPanelCount).to.eql(1);
+ });
+
+ it('disables save to library button without visualize save permissions', async () => {
+ await dashboardPanelActions.openContextMenu();
+ await dashboardPanelActions.clickEdit();
+ await PageObjects.header.waitUntilLoadingHasFinished();
+ await testSubjects.missingOrFail('visualizeSaveButton');
+ await PageObjects.visualize.saveVisualizationAndReturn();
+ await PageObjects.timeToVisualize.resetNewDashboard();
+ });
+
+ it('should allow new visualization to be added by value, but not by reference', async function () {
+ await PageObjects.visualize.navigateToNewAggBasedVisualization();
+ await PageObjects.visualize.clickMetric();
+ await PageObjects.visualize.clickNewSearch();
+ await PageObjects.timePicker.setDefaultAbsoluteRange();
+
+ await testSubjects.click('visualizeSaveButton');
+
+ await PageObjects.visualize.ensureSavePanelOpen();
+ const libraryCheckbox = await find.byCssSelector('#add-to-library-checkbox');
+ expect(await libraryCheckbox.getAttribute('disabled')).to.equal('true');
+
+ await PageObjects.timeToVisualize.saveFromModal('My New Vis 1', {
+ addToDashboard: 'new',
+ });
+
+ await PageObjects.dashboard.waitForRenderComplete();
+ await dashboardExpect.metricValuesExist(['14,005']);
+ const panelCount = await PageObjects.dashboard.getPanelCount();
+ expect(panelCount).to.eql(1);
+ });
+ });
+ });
+}
diff --git a/x-pack/test/functional/apps/dashboard/reporting/download_csv.ts b/x-pack/test/functional/apps/dashboard/reporting/download_csv.ts
index d4a909f6a0474..c437cfaa8f5dc 100644
--- a/x-pack/test/functional/apps/dashboard/reporting/download_csv.ts
+++ b/x-pack/test/functional/apps/dashboard/reporting/download_csv.ts
@@ -50,7 +50,8 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) {
await testSubjects.existOrFail('csvDownloadStarted'); // validate toast panel
};
- describe('Download CSV', () => {
+ // FAILING ES PROMOTION: https://github.com/elastic/kibana/issues/96000
+ describe.skip('Download CSV', () => {
before('initialize tests', async () => {
log.debug('ReportingPage:initTests');
await browser.setWindowSize(1600, 850);
diff --git a/x-pack/test/functional/apps/discover/__snapshots__/reporting.snap b/x-pack/test/functional/apps/discover/__snapshots__/reporting.snap
index 5ddef936b41ae..baa49cb6f9d81 100644
--- a/x-pack/test/functional/apps/discover/__snapshots__/reporting.snap
+++ b/x-pack/test/functional/apps/discover/__snapshots__/reporting.snap
@@ -71,7 +71,7 @@ exports[`discover Discover CSV Export Generate CSV: new search generates a repor
24.5
],
\\"\\"type\\"\\": \\"\\"Point\\"\\"
-}\\",\\"Abu Dhabi\\",\\"Angeldale, Oceanavigations, Microlutions\\",\\"Angeldale, Oceanavigations, Microlutions\\",\\"Jul 12, 2019 @ 00:00:00.000\\",716724,\\"sold_product_716724_23975, sold_product_716724_6338, sold_product_716724_14116, sold_product_716724_15290\\",\\"sold_product_716724_23975, sold_product_716724_6338, sold_product_716724_14116, sold_product_716724_15290\\",\\"79.99, 59.99, 21.99, 11.99\\",\\"79.99, 59.99, 21.99, 11.99\\",\\"Men's Shoes, Men's Clothing, Women's Accessories, Men's Accessories\\",\\"Men's Shoes, Men's Clothing, Women's Accessories, Men's Accessories\\",\\"Dec 31, 2016 @ 00:00:00.000, Dec 31, 2016 @ 00:00:00.000, Dec 31, 2016 @ 00:00:00.000, Dec 31, 2016 @ 00:00:00.000\\",\\"0, 0, 0, 0\\",\\"0, 0, 0, 0\\",\\"Angeldale, Oceanavigations, Microlutions, Oceanavigations\\",\\"Angeldale, Oceanavigations, Microlutions, Oceanavigations\\",\\"42.39, 32.99, 10.34, 6.11\\",\\"79.99, 59.99, 21.99, 11.99\\",\\"23,975, 6,338, 14,116, 15,290\\",\\"Winter boots - cognac, Trenchcoat - black, Watch - black, Hat - light grey multicolor\\",\\"Winter boots - cognac, Trenchcoat - black, Watch - black, Hat - light grey multicolor\\",\\"1, 1, 1, 1\\",\\"ZO0687606876, ZO0290502905, ZO0126701267, ZO0308503085\\",\\"0, 0, 0, 0\\",\\"79.99, 59.99, 21.99, 11.99\\",\\"79.99, 59.99, 21.99, 11.99\\",\\"0, 0, 0, 0\\",\\"ZO0687606876, ZO0290502905, ZO0126701267, ZO0308503085\\",\\"173.96\\",\\"173.96\\",4,4,order,sultan
+}\\",\\"Abu Dhabi\\",\\"Angeldale, Oceanavigations, Microlutions\\",\\"Angeldale, Oceanavigations, Microlutions\\",\\"Jul 12, 2019 @ 00:00:00.000\\",716724,\\"sold_product_716724_23975, sold_product_716724_6338, sold_product_716724_14116, sold_product_716724_15290\\",\\"sold_product_716724_23975, sold_product_716724_6338, sold_product_716724_14116, sold_product_716724_15290\\",\\"80, 60, 21.984, 11.992\\",\\"80, 60, 21.984, 11.992\\",\\"Men's Shoes, Men's Clothing, Women's Accessories, Men's Accessories\\",\\"Men's Shoes, Men's Clothing, Women's Accessories, Men's Accessories\\",\\"Dec 31, 2016 @ 00:00:00.000, Dec 31, 2016 @ 00:00:00.000, Dec 31, 2016 @ 00:00:00.000, Dec 31, 2016 @ 00:00:00.000\\",\\"0, 0, 0, 0\\",\\"0, 0, 0, 0\\",\\"Angeldale, Oceanavigations, Microlutions, Oceanavigations\\",\\"Angeldale, Oceanavigations, Microlutions, Oceanavigations\\",\\"42.375, 33, 10.344, 6.109\\",\\"80, 60, 21.984, 11.992\\",\\"23,975, 6,338, 14,116, 15,290\\",\\"Winter boots - cognac, Trenchcoat - black, Watch - black, Hat - light grey multicolor\\",\\"Winter boots - cognac, Trenchcoat - black, Watch - black, Hat - light grey multicolor\\",\\"1, 1, 1, 1\\",\\"ZO0687606876, ZO0290502905, ZO0126701267, ZO0308503085\\",\\"0, 0, 0, 0\\",\\"80, 60, 21.984, 11.992\\",\\"80, 60, 21.984, 11.992\\",\\"0, 0, 0, 0\\",\\"ZO0687606876, ZO0290502905, ZO0126701267, ZO0308503085\\",174,174,4,4,order,sultan
"
`;
@@ -83,6 +83,6 @@ exports[`discover Discover CSV Export Generate CSV: new search generates a repor
24.5
],
\\"\\"type\\"\\": \\"\\"Point\\"\\"
-}\\",\\"Abu Dhabi\\",\\"Angeldale, Oceanavigations, Microlutions\\",\\"Angeldale, Oceanavigations, Microlutions\\",\\"Jul 12, 2019 @ 00:00:00.000\\",716724,\\"sold_product_716724_23975, sold_product_716724_6338, sold_product_716724_14116, sold_product_716724_15290\\",\\"sold_product_716724_23975, sold_product_716724_6338, sold_product_716724_14116, sold_product_716724_15290\\",\\"79.99, 59.99, 21.99, 11.99\\",\\"79.99, 59.99, 21.99, 11.99\\",\\"Men's Shoes, Men's Clothing, Women's Accessories, Men's Accessories\\",\\"Men's Shoes, Men's Clothing, Women's Accessories, Men's Accessories\\",\\"Dec 31, 2016 @ 00:00:00.000, Dec 31, 2016 @ 00:00:00.000, Dec 31, 2016 @ 00:00:00.000, Dec 31, 2016 @ 00:00:00.000\\",\\"0, 0, 0, 0\\",\\"0, 0, 0, 0\\",\\"Angeldale, Oceanavigations, Microlutions, Oceanavigations\\",\\"Angeldale, Oceanavigations, Microlutions, Oceanavigations\\",\\"42.39, 32.99, 10.34, 6.11\\",\\"79.99, 59.99, 21.99, 11.99\\",\\"23,975, 6,338, 14,116, 15,290\\",\\"Winter boots - cognac, Trenchcoat - black, Watch - black, Hat - light grey multicolor\\",\\"Winter boots - cognac, Trenchcoat - black, Watch - black, Hat - light grey multicolor\\",\\"1, 1, 1, 1\\",\\"ZO0687606876, ZO0290502905, ZO0126701267, ZO0308503085\\",\\"0, 0, 0, 0\\",\\"79.99, 59.99, 21.99, 11.99\\",\\"79.99, 59.99, 21.99, 11.99\\",\\"0, 0, 0, 0\\",\\"ZO0687606876, ZO0290502905, ZO0126701267, ZO0308503085\\",\\"173.96\\",\\"173.96\\",4,4,order,sultan
+}\\",\\"Abu Dhabi\\",\\"Angeldale, Oceanavigations, Microlutions\\",\\"Angeldale, Oceanavigations, Microlutions\\",\\"Jul 12, 2019 @ 00:00:00.000\\",716724,\\"sold_product_716724_23975, sold_product_716724_6338, sold_product_716724_14116, sold_product_716724_15290\\",\\"sold_product_716724_23975, sold_product_716724_6338, sold_product_716724_14116, sold_product_716724_15290\\",\\"80, 60, 21.984, 11.992\\",\\"80, 60, 21.984, 11.992\\",\\"Men's Shoes, Men's Clothing, Women's Accessories, Men's Accessories\\",\\"Men's Shoes, Men's Clothing, Women's Accessories, Men's Accessories\\",\\"Dec 31, 2016 @ 00:00:00.000, Dec 31, 2016 @ 00:00:00.000, Dec 31, 2016 @ 00:00:00.000, Dec 31, 2016 @ 00:00:00.000\\",\\"0, 0, 0, 0\\",\\"0, 0, 0, 0\\",\\"Angeldale, Oceanavigations, Microlutions, Oceanavigations\\",\\"Angeldale, Oceanavigations, Microlutions, Oceanavigations\\",\\"42.375, 33, 10.344, 6.109\\",\\"80, 60, 21.984, 11.992\\",\\"23,975, 6,338, 14,116, 15,290\\",\\"Winter boots - cognac, Trenchcoat - black, Watch - black, Hat - light grey multicolor\\",\\"Winter boots - cognac, Trenchcoat - black, Watch - black, Hat - light grey multicolor\\",\\"1, 1, 1, 1\\",\\"ZO0687606876, ZO0290502905, ZO0126701267, ZO0308503085\\",\\"0, 0, 0, 0\\",\\"80, 60, 21.984, 11.992\\",\\"80, 60, 21.984, 11.992\\",\\"0, 0, 0, 0\\",\\"ZO0687606876, ZO0290502905, ZO0126701267, ZO0308503085\\",174,174,4,4,order,sultan
"
`;
diff --git a/x-pack/test/functional/apps/discover/reporting.ts b/x-pack/test/functional/apps/discover/reporting.ts
index 9acb4c311c113..d7dd961e2f103 100644
--- a/x-pack/test/functional/apps/discover/reporting.ts
+++ b/x-pack/test/functional/apps/discover/reporting.ts
@@ -21,8 +21,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) {
await kibanaServer.uiSettings.update({ 'discover:searchFieldsFromSource': setValue });
};
- // Failing: See https://github.com/elastic/kibana/issues/95592
- describe.skip('Discover CSV Export', () => {
+ describe('Discover CSV Export', () => {
before('initialize tests', async () => {
log.debug('ReportingPage:initTests');
await esArchiver.load('reporting/ecommerce');
diff --git a/x-pack/test/functional/apps/security/users.js b/x-pack/test/functional/apps/security/users.js
index 0cab12bc6672f..250a2d4ed71f9 100644
--- a/x-pack/test/functional/apps/security/users.js
+++ b/x-pack/test/functional/apps/security/users.js
@@ -12,7 +12,8 @@ export default function ({ getService, getPageObjects }) {
const config = getService('config');
const log = getService('log');
- describe('users', function () {
+ // FAILING ES PROMOTION: https://github.com/elastic/kibana/issues/96001
+ describe.skip('users', function () {
before(async () => {
log.debug('users');
await PageObjects.settings.navigateTo();
diff --git a/x-pack/test/functional/apps/snapshot_restore/home_page.ts b/x-pack/test/functional/apps/snapshot_restore/home_page.ts
index 955618774bdfd..b72656a96980f 100644
--- a/x-pack/test/functional/apps/snapshot_restore/home_page.ts
+++ b/x-pack/test/functional/apps/snapshot_restore/home_page.ts
@@ -11,7 +11,7 @@ import { FtrProviderContext } from '../../ftr_provider_context';
export default ({ getPageObjects, getService }: FtrProviderContext) => {
const pageObjects = getPageObjects(['common', 'snapshotRestore']);
const log = getService('log');
- const es = getService('legacyEs');
+ const es = getService('es');
describe('Home page', function () {
before(async () => {
diff --git a/x-pack/test/functional/es_archives/banners/multispace/data.json b/x-pack/test/functional/es_archives/banners/multispace/data.json
new file mode 100644
index 0000000000000..fc0e0dc7b7eee
--- /dev/null
+++ b/x-pack/test/functional/es_archives/banners/multispace/data.json
@@ -0,0 +1,62 @@
+{
+ "type": "doc",
+ "value": {
+ "id": "config:6.0.0",
+ "index": ".kibana",
+ "source": {
+ "config": {
+ "buildNum": 8467,
+ "dateFormat:tz": "UTC",
+ "defaultRoute": "http://example.com/evil"
+ },
+ "type": "config"
+ }
+ }
+}
+
+{
+ "type": "doc",
+ "value": {
+ "id": "another-space:config:6.0.0",
+ "index": ".kibana",
+ "source": {
+ "namespace": "another-space",
+ "config": {
+ "buildNum": 8467,
+ "dateFormat:tz": "UTC",
+ "defaultRoute": "/app/canvas"
+ },
+ "type": "config"
+ }
+ }
+}
+
+{
+ "type": "doc",
+ "value": {
+ "id": "space:default",
+ "index": ".kibana",
+ "source": {
+ "space": {
+ "description": "This is the default space!",
+ "name": "Default"
+ },
+ "type": "space"
+ }
+ }
+}
+
+{
+ "type": "doc",
+ "value": {
+ "id": "space:another-space",
+ "index": ".kibana",
+ "source": {
+ "space": {
+ "description": "This is another space",
+ "name": "Another Space"
+ },
+ "type": "space"
+ }
+ }
+}
diff --git a/x-pack/test/functional/es_archives/banners/multispace/mappings.json b/x-pack/test/functional/es_archives/banners/multispace/mappings.json
new file mode 100644
index 0000000000000..f3793c7ca6780
--- /dev/null
+++ b/x-pack/test/functional/es_archives/banners/multispace/mappings.json
@@ -0,0 +1,287 @@
+{
+ "type": "index",
+ "value": {
+ "index": ".kibana",
+ "mappings": {
+ "properties": {
+ "config": {
+ "dynamic": "true",
+ "properties": {
+ "buildNum": {
+ "type": "keyword"
+ },
+ "dateFormat:tz": {
+ "fields": {
+ "keyword": {
+ "ignore_above": 256,
+ "type": "keyword"
+ }
+ },
+ "type": "text"
+ },
+ "defaultRoute": {
+ "type": "keyword"
+ }
+ }
+ },
+ "dashboard": {
+ "dynamic": "strict",
+ "properties": {
+ "description": {
+ "type": "text"
+ },
+ "hits": {
+ "type": "integer"
+ },
+ "kibanaSavedObjectMeta": {
+ "properties": {
+ "searchSourceJSON": {
+ "type": "text"
+ }
+ }
+ },
+ "optionsJSON": {
+ "type": "text"
+ },
+ "panelsJSON": {
+ "type": "text"
+ },
+ "refreshInterval": {
+ "properties": {
+ "display": {
+ "type": "keyword"
+ },
+ "pause": {
+ "type": "boolean"
+ },
+ "section": {
+ "type": "integer"
+ },
+ "value": {
+ "type": "integer"
+ }
+ }
+ },
+ "timeFrom": {
+ "type": "keyword"
+ },
+ "timeRestore": {
+ "type": "boolean"
+ },
+ "timeTo": {
+ "type": "keyword"
+ },
+ "title": {
+ "type": "text"
+ },
+ "uiStateJSON": {
+ "type": "text"
+ },
+ "version": {
+ "type": "integer"
+ }
+ }
+ },
+ "index-pattern": {
+ "dynamic": "strict",
+ "properties": {
+ "fieldFormatMap": {
+ "type": "text"
+ },
+ "fields": {
+ "type": "text"
+ },
+ "intervalName": {
+ "type": "keyword"
+ },
+ "notExpandable": {
+ "type": "boolean"
+ },
+ "sourceFilters": {
+ "type": "text"
+ },
+ "timeFieldName": {
+ "type": "keyword"
+ },
+ "title": {
+ "type": "text"
+ }
+ }
+ },
+ "search": {
+ "dynamic": "strict",
+ "properties": {
+ "columns": {
+ "type": "keyword"
+ },
+ "description": {
+ "type": "text"
+ },
+ "hits": {
+ "type": "integer"
+ },
+ "kibanaSavedObjectMeta": {
+ "properties": {
+ "searchSourceJSON": {
+ "type": "text"
+ }
+ }
+ },
+ "sort": {
+ "type": "keyword"
+ },
+ "title": {
+ "type": "text"
+ },
+ "version": {
+ "type": "integer"
+ }
+ }
+ },
+ "server": {
+ "dynamic": "strict",
+ "properties": {
+ "uuid": {
+ "type": "keyword"
+ }
+ }
+ },
+ "space": {
+ "properties": {
+ "_reserved": {
+ "type": "boolean"
+ },
+ "color": {
+ "type": "keyword"
+ },
+ "description": {
+ "type": "text"
+ },
+ "disabledFeatures": {
+ "type": "keyword"
+ },
+ "initials": {
+ "type": "keyword"
+ },
+ "name": {
+ "fields": {
+ "keyword": {
+ "ignore_above": 2048,
+ "type": "keyword"
+ }
+ },
+ "type": "text"
+ }
+ }
+ },
+ "spaceId": {
+ "type": "keyword"
+ },
+ "timelion-sheet": {
+ "dynamic": "strict",
+ "properties": {
+ "description": {
+ "type": "text"
+ },
+ "hits": {
+ "type": "integer"
+ },
+ "kibanaSavedObjectMeta": {
+ "properties": {
+ "searchSourceJSON": {
+ "type": "text"
+ }
+ }
+ },
+ "timelion_chart_height": {
+ "type": "integer"
+ },
+ "timelion_columns": {
+ "type": "integer"
+ },
+ "timelion_interval": {
+ "type": "keyword"
+ },
+ "timelion_other_interval": {
+ "type": "keyword"
+ },
+ "timelion_rows": {
+ "type": "integer"
+ },
+ "timelion_sheet": {
+ "type": "text"
+ },
+ "title": {
+ "type": "text"
+ },
+ "version": {
+ "type": "integer"
+ }
+ }
+ },
+ "type": {
+ "type": "keyword"
+ },
+ "url": {
+ "dynamic": "strict",
+ "properties": {
+ "accessCount": {
+ "type": "long"
+ },
+ "accessDate": {
+ "type": "date"
+ },
+ "createDate": {
+ "type": "date"
+ },
+ "url": {
+ "fields": {
+ "keyword": {
+ "ignore_above": 2048,
+ "type": "keyword"
+ }
+ },
+ "type": "text"
+ }
+ }
+ },
+ "visualization": {
+ "dynamic": "strict",
+ "properties": {
+ "description": {
+ "type": "text"
+ },
+ "kibanaSavedObjectMeta": {
+ "properties": {
+ "searchSourceJSON": {
+ "type": "text"
+ }
+ }
+ },
+ "savedSearchId": {
+ "type": "keyword"
+ },
+ "title": {
+ "type": "text"
+ },
+ "uiStateJSON": {
+ "type": "text"
+ },
+ "version": {
+ "type": "integer"
+ },
+ "visState": {
+ "type": "text"
+ }
+ }
+ }
+ }
+ },
+ "settings": {
+ "index": {
+ "number_of_replicas": "1",
+ "number_of_shards": "1"
+ }
+ }
+ }
+}
diff --git a/x-pack/test/functional/page_objects/banners_page.ts b/x-pack/test/functional/page_objects/banners_page.ts
new file mode 100644
index 0000000000000..d2e4e43cec117
--- /dev/null
+++ b/x-pack/test/functional/page_objects/banners_page.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
+ * 2.0; you may not use this file except in compliance with the Elastic License
+ * 2.0.
+ */
+
+import { FtrProviderContext } from '../ftr_provider_context';
+
+export function BannersPageProvider({ getService }: FtrProviderContext) {
+ const find = getService('find');
+
+ class BannersPage {
+ isTopBannerVisible() {
+ return find.existsByCssSelector('.header__topBanner .kbnUserBanner__container');
+ }
+
+ async getTopBannerText() {
+ if (!(await this.isTopBannerVisible())) {
+ return '';
+ }
+ const bannerContainer = await find.byCssSelector(
+ '.header__topBanner .kbnUserBanner__container'
+ );
+ return bannerContainer.getVisibleText();
+ }
+ }
+
+ return new BannersPage();
+}
diff --git a/x-pack/test/functional/page_objects/index.ts b/x-pack/test/functional/page_objects/index.ts
index cf92191075fba..81c0328e76342 100644
--- a/x-pack/test/functional/page_objects/index.ts
+++ b/x-pack/test/functional/page_objects/index.ts
@@ -41,6 +41,7 @@ import { TagManagementPageProvider } from './tag_management_page';
import { NavigationalSearchProvider } from './navigational_search';
import { SearchSessionsPageProvider } from './search_sessions_management_page';
import { DetectionsPageProvider } from '../../security_solution_ftr/page_objects/detections';
+import { BannersPageProvider } from './banners_page';
// just like services, PageObjects are defined as a map of
// names to Providers. Merge in Kibana's or pick specific ones
@@ -78,5 +79,6 @@ export const pageObjects = {
roleMappings: RoleMappingsPageProvider,
ingestPipelines: IngestPipelinesPageProvider,
navigationalSearch: NavigationalSearchProvider,
+ banners: BannersPageProvider,
detections: DetectionsPageProvider,
};
diff --git a/x-pack/test/functional/page_objects/lens_page.ts b/x-pack/test/functional/page_objects/lens_page.ts
index 205a4391062a2..65020be390f9d 100644
--- a/x-pack/test/functional/page_objects/lens_page.ts
+++ b/x-pack/test/functional/page_objects/lens_page.ts
@@ -197,7 +197,10 @@ export function LensPageProvider({ getService, getPageObjects }: FtrProviderCont
},
async searchField(name: string) {
- await testSubjects.setValue('lnsIndexPatternFieldSearch', name);
+ await testSubjects.setValue('lnsIndexPatternFieldSearch', name, {
+ clearWithKeyboard: true,
+ typeCharByChar: true,
+ });
},
async waitForField(field: string) {
diff --git a/x-pack/test/functional_with_es_ssl/apps/triggers_actions_ui/alerts_list.ts b/x-pack/test/functional_with_es_ssl/apps/triggers_actions_ui/alerts_list.ts
index 550e6ca455b22..7b760dfb8b6a1 100644
--- a/x-pack/test/functional_with_es_ssl/apps/triggers_actions_ui/alerts_list.ts
+++ b/x-pack/test/functional_with_es_ssl/apps/triggers_actions_ui/alerts_list.ts
@@ -54,7 +54,7 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => {
await testSubjects.click('rulesTab');
}
- // Failing: See https://github.com/elastic/kibana/issues/95590
+ // FLAKY: https://github.com/elastic/kibana/issues/95591
describe.skip('alerts list', function () {
before(async () => {
await pageObjects.common.navigateToApp('triggersActions');
@@ -129,13 +129,11 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => {
await pageObjects.triggersActionsUI.toggleSwitch('disableSwitch');
- await pageObjects.triggersActionsUI.searchAlerts(createdAlert.name);
-
- await testSubjects.click('collapsedItemActions');
-
- const disableSwitchAfterDisable = await testSubjects.find('disableSwitch');
- const isChecked = await disableSwitchAfterDisable.getAttribute('aria-checked');
- expect(isChecked).to.eql('true');
+ await pageObjects.triggersActionsUI.ensureRuleActionToggleApplied(
+ createdAlert.name,
+ 'disableSwitch',
+ 'true'
+ );
});
it('should re-enable single alert', async () => {
@@ -147,19 +145,23 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => {
await pageObjects.triggersActionsUI.toggleSwitch('disableSwitch');
+ await pageObjects.triggersActionsUI.ensureRuleActionToggleApplied(
+ createdAlert.name,
+ 'disableSwitch',
+ 'true'
+ );
+
await pageObjects.triggersActionsUI.searchAlerts(createdAlert.name);
await testSubjects.click('collapsedItemActions');
await pageObjects.triggersActionsUI.toggleSwitch('disableSwitch');
- await pageObjects.triggersActionsUI.searchAlerts(createdAlert.name);
-
- await testSubjects.click('collapsedItemActions');
-
- const disableSwitchAfterReEnable = await testSubjects.find('disableSwitch');
- const isChecked = await disableSwitchAfterReEnable.getAttribute('aria-checked');
- expect(isChecked).to.eql('false');
+ await pageObjects.triggersActionsUI.ensureRuleActionToggleApplied(
+ createdAlert.name,
+ 'disableSwitch',
+ 'false'
+ );
});
it('should mute single alert', async () => {
@@ -171,13 +173,11 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => {
await pageObjects.triggersActionsUI.toggleSwitch('muteSwitch');
- await pageObjects.triggersActionsUI.searchAlerts(createdAlert.name);
-
- await testSubjects.click('collapsedItemActions');
-
- const muteSwitchAfterMute = await testSubjects.find('muteSwitch');
- const isChecked = await muteSwitchAfterMute.getAttribute('aria-checked');
- expect(isChecked).to.eql('true');
+ await pageObjects.triggersActionsUI.ensureRuleActionToggleApplied(
+ createdAlert.name,
+ 'muteSwitch',
+ 'true'
+ );
});
it('should unmute single alert', async () => {
@@ -189,19 +189,23 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => {
await pageObjects.triggersActionsUI.toggleSwitch('muteSwitch');
+ await pageObjects.triggersActionsUI.ensureRuleActionToggleApplied(
+ createdAlert.name,
+ 'muteSwitch',
+ 'true'
+ );
+
await pageObjects.triggersActionsUI.searchAlerts(createdAlert.name);
await testSubjects.click('collapsedItemActions');
await pageObjects.triggersActionsUI.toggleSwitch('muteSwitch');
- await pageObjects.triggersActionsUI.searchAlerts(createdAlert.name);
-
- await testSubjects.click('collapsedItemActions');
-
- const muteSwitchAfterUnmute = await testSubjects.find('muteSwitch');
- const isChecked = await muteSwitchAfterUnmute.getAttribute('aria-checked');
- expect(isChecked).to.eql('false');
+ await pageObjects.triggersActionsUI.ensureRuleActionToggleApplied(
+ createdAlert.name,
+ 'muteSwitch',
+ 'false'
+ );
});
it('should delete single alert', async () => {
diff --git a/x-pack/test/functional_with_es_ssl/page_objects/triggers_actions_ui_page.ts b/x-pack/test/functional_with_es_ssl/page_objects/triggers_actions_ui_page.ts
index 8d4311a3ec322..e5971ddba415f 100644
--- a/x-pack/test/functional_with_es_ssl/page_objects/triggers_actions_ui_page.ts
+++ b/x-pack/test/functional_with_es_ssl/page_objects/triggers_actions_ui_page.ts
@@ -186,5 +186,18 @@ export function TriggersActionsPageProvider({ getService }: FtrProviderContext)
expect(isConfirmationModalVisible).to.eql(true, 'Expect confirmation modal to be visible');
await testSubjects.click('confirmModalConfirmButton');
},
+ async ensureRuleActionToggleApplied(
+ ruleName: string,
+ switchName: string,
+ shouldBeCheckedAsString: string
+ ) {
+ await retry.try(async () => {
+ await this.searchAlerts(ruleName);
+ await testSubjects.click('collapsedItemActions');
+ const switchControl = await testSubjects.find(switchName);
+ const isChecked = await switchControl.getAttribute('aria-checked');
+ expect(isChecked).to.eql(shouldBeCheckedAsString);
+ });
+ },
};
}
diff --git a/x-pack/test/plugin_functional/config.ts b/x-pack/test/plugin_functional/config.ts
index 5b846e414bd4c..104d11eb87f7c 100644
--- a/x-pack/test/plugin_functional/config.ts
+++ b/x-pack/test/plugin_functional/config.ts
@@ -30,6 +30,7 @@ export default async function ({ readConfigFile }: FtrConfigProviderContext) {
testFiles: [
resolve(__dirname, './test_suites/resolver'),
resolve(__dirname, './test_suites/global_search'),
+ resolve(__dirname, './test_suites/timelines'),
],
services,
@@ -47,6 +48,7 @@ export default async function ({ readConfigFile }: FtrConfigProviderContext) {
KIBANA_ROOT,
'test/plugin_functional/plugins/core_provider_plugin'
)}`,
+ '--xpack.timelines.enabled=true',
...plugins.map((pluginDir) => `--plugin-path=${resolve(__dirname, 'plugins', pluginDir)}`),
],
},
@@ -60,6 +62,9 @@ export default async function ({ readConfigFile }: FtrConfigProviderContext) {
resolverTest: {
pathname: '/app/resolverTest',
},
+ timelineTest: {
+ pathname: '/app/timelinesTest',
+ },
},
// choose where esArchiver should load archives from
diff --git a/x-pack/test/plugin_functional/plugins/timelines_test/kibana.json b/x-pack/test/plugin_functional/plugins/timelines_test/kibana.json
new file mode 100644
index 0000000000000..85c2639ef7d47
--- /dev/null
+++ b/x-pack/test/plugin_functional/plugins/timelines_test/kibana.json
@@ -0,0 +1,12 @@
+{
+ "id": "timelinesTest",
+ "version": "1.0.0",
+ "kibanaVersion": "kibana",
+ "configPath": ["xpack", "timelinesTest"],
+ "requiredPlugins": ["timelines"],
+ "requiredBundles": [
+ "kibanaReact"
+ ],
+ "server": false,
+ "ui": true
+}
diff --git a/x-pack/test/plugin_functional/plugins/timelines_test/public/applications/timelines_test/index.tsx b/x-pack/test/plugin_functional/plugins/timelines_test/public/applications/timelines_test/index.tsx
new file mode 100644
index 0000000000000..a6772c3b0bb5b
--- /dev/null
+++ b/x-pack/test/plugin_functional/plugins/timelines_test/public/applications/timelines_test/index.tsx
@@ -0,0 +1,60 @@
+/*
+ * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
+ * or more contributor license agreements. Licensed under the Elastic License
+ * 2.0; you may not use this file except in compliance with the Elastic License
+ * 2.0.
+ */
+
+import { Router } from 'react-router-dom';
+import React from 'react';
+import ReactDOM from 'react-dom';
+import { AppMountParameters, CoreStart } from 'kibana/public';
+import { I18nProvider } from '@kbn/i18n/react';
+import { KibanaContextProvider } from '../../../../../../../../src/plugins/kibana_react/public';
+import { TimelinesPluginSetup } from '../../../../../../../plugins/timelines/public';
+
+/**
+ * Render the Timeline Test app. Returns a cleanup function.
+ */
+export function renderApp(
+ coreStart: CoreStart,
+ parameters: AppMountParameters,
+ timelinesPluginSetup: TimelinesPluginSetup
+) {
+ ReactDOM.render(
+ ,
+ parameters.element
+ );
+
+ return () => {
+ ReactDOM.unmountComponentAtNode(parameters.element);
+ };
+}
+
+const AppRoot = React.memo(
+ ({
+ coreStart,
+ parameters,
+ timelinesPluginSetup,
+ }: {
+ coreStart: CoreStart;
+ parameters: AppMountParameters;
+ timelinesPluginSetup: TimelinesPluginSetup;
+ }) => {
+ return (
+
+
+
+ {(timelinesPluginSetup.getTimeline &&
+ timelinesPluginSetup.getTimeline({ timelineId: 'test' })) ??
+ null}
+
+
+
+ );
+ }
+);
diff --git a/x-pack/test/plugin_functional/plugins/timelines_test/public/index.ts b/x-pack/test/plugin_functional/plugins/timelines_test/public/index.ts
new file mode 100644
index 0000000000000..5f038b5b933e6
--- /dev/null
+++ b/x-pack/test/plugin_functional/plugins/timelines_test/public/index.ts
@@ -0,0 +1,20 @@
+/*
+ * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
+ * or more contributor license agreements. Licensed under the Elastic License
+ * 2.0; you may not use this file except in compliance with the Elastic License
+ * 2.0.
+ */
+
+import { PluginInitializer } from 'kibana/public';
+import {
+ TimelinesTestPlugin,
+ TimelinesTestPluginSetupDependencies,
+ TimelinesTestPluginStartDependencies,
+} from './plugin';
+
+export const plugin: PluginInitializer<
+ void,
+ void,
+ TimelinesTestPluginSetupDependencies,
+ TimelinesTestPluginStartDependencies
+> = () => new TimelinesTestPlugin();
diff --git a/x-pack/test/plugin_functional/plugins/timelines_test/public/plugin.ts b/x-pack/test/plugin_functional/plugins/timelines_test/public/plugin.ts
new file mode 100644
index 0000000000000..5cf900e194d0c
--- /dev/null
+++ b/x-pack/test/plugin_functional/plugins/timelines_test/public/plugin.ts
@@ -0,0 +1,50 @@
+/*
+ * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
+ * or more contributor license agreements. Licensed under the Elastic License
+ * 2.0; you may not use this file except in compliance with the Elastic License
+ * 2.0.
+ */
+
+import { Plugin, CoreSetup, AppMountParameters } from 'kibana/public';
+import { i18n } from '@kbn/i18n';
+import { TimelinesPluginSetup } from '../../../../../plugins/timelines/public';
+import { renderApp } from './applications/timelines_test';
+
+export type TimelinesTestPluginSetup = void;
+export type TimelinesTestPluginStart = void;
+export interface TimelinesTestPluginSetupDependencies {
+ timelines: TimelinesPluginSetup;
+}
+
+// eslint-disable-next-line @typescript-eslint/no-empty-interface
+export interface TimelinesTestPluginStartDependencies {}
+
+export class TimelinesTestPlugin
+ implements
+ Plugin<
+ TimelinesTestPluginSetup,
+ void,
+ TimelinesTestPluginSetupDependencies,
+ TimelinesTestPluginStartDependencies
+ > {
+ public setup(
+ core: CoreSetup,
+ setupDependencies: TimelinesTestPluginSetupDependencies
+ ) {
+ core.application.register({
+ id: 'timelinesTest',
+ title: i18n.translate('xpack.timelinesTest.pluginTitle', {
+ defaultMessage: 'Timelines Test',
+ }),
+ mount: async (params: AppMountParameters) => {
+ const startServices = await core.getStartServices();
+ const [coreStart] = startServices;
+ const { timelines } = setupDependencies;
+
+ return renderApp(coreStart, params, timelines);
+ },
+ });
+ }
+
+ public start() {}
+}
diff --git a/x-pack/test/plugin_functional/test_suites/global_search/global_search_bar.ts b/x-pack/test/plugin_functional/test_suites/global_search/global_search_bar.ts
index 077044d29f7d9..a44ded43a0bfe 100644
--- a/x-pack/test/plugin_functional/test_suites/global_search/global_search_bar.ts
+++ b/x-pack/test/plugin_functional/test_suites/global_search/global_search_bar.ts
@@ -9,7 +9,7 @@ import expect from '@kbn/expect';
import { FtrProviderContext } from '../../ftr_provider_context';
export default function ({ getPageObjects, getService }: FtrProviderContext) {
- describe('TOTO GlobalSearchBar', function () {
+ describe('GlobalSearchBar', function () {
const { common, navigationalSearch } = getPageObjects(['common', 'navigationalSearch']);
const esArchiver = getService('esArchiver');
const browser = getService('browser');
diff --git a/x-pack/test/plugin_functional/test_suites/timelines/index.ts b/x-pack/test/plugin_functional/test_suites/timelines/index.ts
new file mode 100644
index 0000000000000..655ed9dc3898a
--- /dev/null
+++ b/x-pack/test/plugin_functional/test_suites/timelines/index.ts
@@ -0,0 +1,25 @@
+/*
+ * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
+ * or more contributor license agreements. Licensed under the Elastic License
+ * 2.0; you may not use this file except in compliance with the Elastic License
+ * 2.0.
+ */
+
+import { FtrProviderContext } from '../../ftr_provider_context';
+
+export default function ({ getPageObjects, getService }: FtrProviderContext) {
+ describe('Timelines plugin API', function () {
+ this.tags('ciGroup7');
+ const pageObjects = getPageObjects(['common']);
+ const testSubjects = getService('testSubjects');
+
+ describe('timelines plugin rendering', function () {
+ before(async () => {
+ await pageObjects.common.navigateToApp('timelineTest');
+ });
+ it('shows the timeline component on navigation', async () => {
+ await testSubjects.existOrFail('timeline-wrapper');
+ });
+ });
+ });
+}
diff --git a/x-pack/test/reporting_api_integration/reporting_and_security/__snapshots__/csv_searchsource_immediate.snap b/x-pack/test/reporting_api_integration/reporting_and_security/__snapshots__/csv_searchsource_immediate.snap
index c7ef39f65f552..094d72942353d 100644
--- a/x-pack/test/reporting_api_integration/reporting_and_security/__snapshots__/csv_searchsource_immediate.snap
+++ b/x-pack/test/reporting_api_integration/reporting_and_security/__snapshots__/csv_searchsource_immediate.snap
@@ -8,28 +8,28 @@ exports[`Reporting APIs CSV Generation from SearchSource Exports CSV with all fi
24.5
],
\\"\\"type\\"\\": \\"\\"Point\\"\\"
-}\\",\\"Abu Dhabi\\",\\"Angeldale, Oceanavigations, Microlutions\\",\\"Angeldale, Oceanavigations, Microlutions\\",\\"Jul 12, 2019 @ 00:00:00.000\\",716724,\\"sold_product_716724_23975, sold_product_716724_6338, sold_product_716724_14116, sold_product_716724_15290\\",\\"sold_product_716724_23975, sold_product_716724_6338, sold_product_716724_14116, sold_product_716724_15290\\",\\"79.99, 59.99, 21.99, 11.99\\",\\"79.99, 59.99, 21.99, 11.99\\",\\"Men's Shoes, Men's Clothing, Women's Accessories, Men's Accessories\\",\\"Men's Shoes, Men's Clothing, Women's Accessories, Men's Accessories\\",\\"Dec 31, 2016 @ 00:00:00.000, Dec 31, 2016 @ 00:00:00.000, Dec 31, 2016 @ 00:00:00.000, Dec 31, 2016 @ 00:00:00.000\\",\\"0, 0, 0, 0\\",\\"0, 0, 0, 0\\",\\"Angeldale, Oceanavigations, Microlutions, Oceanavigations\\",\\"Angeldale, Oceanavigations, Microlutions, Oceanavigations\\",\\"42.39, 32.99, 10.34, 6.11\\",\\"79.99, 59.99, 21.99, 11.99\\",\\"23,975, 6,338, 14,116, 15,290\\",\\"Winter boots - cognac, Trenchcoat - black, Watch - black, Hat - light grey multicolor\\",\\"Winter boots - cognac, Trenchcoat - black, Watch - black, Hat - light grey multicolor\\",\\"1, 1, 1, 1\\",\\"ZO0687606876, ZO0290502905, ZO0126701267, ZO0308503085\\",\\"0, 0, 0, 0\\",\\"79.99, 59.99, 21.99, 11.99\\",\\"79.99, 59.99, 21.99, 11.99\\",\\"0, 0, 0, 0\\",\\"ZO0687606876, ZO0290502905, ZO0126701267, ZO0308503085\\",\\"173.96\\",\\"173.96\\",4,4,order,sultan
+}\\",\\"Abu Dhabi\\",\\"Angeldale, Oceanavigations, Microlutions\\",\\"Angeldale, Oceanavigations, Microlutions\\",\\"Jul 12, 2019 @ 00:00:00.000\\",716724,\\"sold_product_716724_23975, sold_product_716724_6338, sold_product_716724_14116, sold_product_716724_15290\\",\\"sold_product_716724_23975, sold_product_716724_6338, sold_product_716724_14116, sold_product_716724_15290\\",\\"80, 60, 21.984, 11.992\\",\\"80, 60, 21.984, 11.992\\",\\"Men's Shoes, Men's Clothing, Women's Accessories, Men's Accessories\\",\\"Men's Shoes, Men's Clothing, Women's Accessories, Men's Accessories\\",\\"Dec 31, 2016 @ 00:00:00.000, Dec 31, 2016 @ 00:00:00.000, Dec 31, 2016 @ 00:00:00.000, Dec 31, 2016 @ 00:00:00.000\\",\\"0, 0, 0, 0\\",\\"0, 0, 0, 0\\",\\"Angeldale, Oceanavigations, Microlutions, Oceanavigations\\",\\"Angeldale, Oceanavigations, Microlutions, Oceanavigations\\",\\"42.375, 33, 10.344, 6.109\\",\\"80, 60, 21.984, 11.992\\",\\"23,975, 6,338, 14,116, 15,290\\",\\"Winter boots - cognac, Trenchcoat - black, Watch - black, Hat - light grey multicolor\\",\\"Winter boots - cognac, Trenchcoat - black, Watch - black, Hat - light grey multicolor\\",\\"1, 1, 1, 1\\",\\"ZO0687606876, ZO0290502905, ZO0126701267, ZO0308503085\\",\\"0, 0, 0, 0\\",\\"80, 60, 21.984, 11.992\\",\\"80, 60, 21.984, 11.992\\",\\"0, 0, 0, 0\\",\\"ZO0687606876, ZO0290502905, ZO0126701267, ZO0308503085\\",174,174,4,4,order,sultan
9gMtOW0BH63Xcmy432DJ,ecommerce,\\"-\\",\\"-\\",\\"Women's Shoes, Women's Clothing\\",\\"Women's Shoes, Women's Clothing\\",EUR,Pia,Pia,\\"Pia Richards\\",\\"Pia Richards\\",FEMALE,45,Richards,Richards,,Saturday,5,\\"pia@richards-family.zzz\\",Cannes,Europe,FR,\\"{
\\"\\"coordinates\\"\\": [
7,
43.6
],
\\"\\"type\\"\\": \\"\\"Point\\"\\"
-}\\",\\"Alpes-Maritimes\\",\\"Tigress Enterprises, Pyramidustries\\",\\"Tigress Enterprises, Pyramidustries\\",\\"Jul 12, 2019 @ 00:00:00.000\\",591503,\\"sold_product_591503_14761, sold_product_591503_11632\\",\\"sold_product_591503_14761, sold_product_591503_11632\\",\\"20.99, 20.99\\",\\"20.99, 20.99\\",\\"Women's Shoes, Women's Clothing\\",\\"Women's Shoes, Women's Clothing\\",\\"Dec 31, 2016 @ 00:00:00.000, Dec 31, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Tigress Enterprises, Pyramidustries\\",\\"Tigress Enterprises, Pyramidustries\\",\\"10.7, 9.87\\",\\"20.99, 20.99\\",\\"14,761, 11,632\\",\\"Classic heels - blue, Summer dress - coral/pink\\",\\"Classic heels - blue, Summer dress - coral/pink\\",\\"1, 1\\",\\"ZO0006400064, ZO0150601506\\",\\"0, 0\\",\\"20.99, 20.99\\",\\"20.99, 20.99\\",\\"0, 0\\",\\"ZO0006400064, ZO0150601506\\",\\"41.98\\",\\"41.98\\",2,2,order,pia
+}\\",\\"Alpes-Maritimes\\",\\"Tigress Enterprises, Pyramidustries\\",\\"Tigress Enterprises, Pyramidustries\\",\\"Jul 12, 2019 @ 00:00:00.000\\",591503,\\"sold_product_591503_14761, sold_product_591503_11632\\",\\"sold_product_591503_14761, sold_product_591503_11632\\",\\"20.984, 20.984\\",\\"20.984, 20.984\\",\\"Women's Shoes, Women's Clothing\\",\\"Women's Shoes, Women's Clothing\\",\\"Dec 31, 2016 @ 00:00:00.000, Dec 31, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Tigress Enterprises, Pyramidustries\\",\\"Tigress Enterprises, Pyramidustries\\",\\"10.703, 9.867\\",\\"20.984, 20.984\\",\\"14,761, 11,632\\",\\"Classic heels - blue, Summer dress - coral/pink\\",\\"Classic heels - blue, Summer dress - coral/pink\\",\\"1, 1\\",\\"ZO0006400064, ZO0150601506\\",\\"0, 0\\",\\"20.984, 20.984\\",\\"20.984, 20.984\\",\\"0, 0\\",\\"ZO0006400064, ZO0150601506\\",\\"41.969\\",\\"41.969\\",2,2,order,pia
BgMtOW0BH63Xcmy432LJ,ecommerce,\\"-\\",\\"-\\",\\"Women's Clothing\\",\\"Women's Clothing\\",EUR,Brigitte,Brigitte,\\"Brigitte Meyer\\",\\"Brigitte Meyer\\",FEMALE,12,Meyer,Meyer,,Saturday,5,\\"brigitte@meyer-family.zzz\\",\\"New York\\",\\"North America\\",US,\\"{
\\"\\"coordinates\\"\\": [
-74,
40.8
],
\\"\\"type\\"\\": \\"\\"Point\\"\\"
-}\\",\\"New York\\",\\"Spherecords, Tigress Enterprises\\",\\"Spherecords, Tigress Enterprises\\",\\"Jul 12, 2019 @ 00:00:00.000\\",591709,\\"sold_product_591709_20734, sold_product_591709_7539\\",\\"sold_product_591709_20734, sold_product_591709_7539\\",\\"7.99, 32.99\\",\\"7.99, 32.99\\",\\"Women's Clothing, Women's Clothing\\",\\"Women's Clothing, Women's Clothing\\",\\"Dec 31, 2016 @ 00:00:00.000, Dec 31, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Spherecords, Tigress Enterprises\\",\\"Spherecords, Tigress Enterprises\\",\\"3.6, 17.48\\",\\"7.99, 32.99\\",\\"20,734, 7,539\\",\\"Basic T-shirt - dark blue, Summer dress - scarab\\",\\"Basic T-shirt - dark blue, Summer dress - scarab\\",\\"1, 1\\",\\"ZO0638206382, ZO0038800388\\",\\"0, 0\\",\\"7.99, 32.99\\",\\"7.99, 32.99\\",\\"0, 0\\",\\"ZO0638206382, ZO0038800388\\",\\"40.98\\",\\"40.98\\",2,2,order,brigitte
+}\\",\\"New York\\",\\"Spherecords, Tigress Enterprises\\",\\"Spherecords, Tigress Enterprises\\",\\"Jul 12, 2019 @ 00:00:00.000\\",591709,\\"sold_product_591709_20734, sold_product_591709_7539\\",\\"sold_product_591709_20734, sold_product_591709_7539\\",\\"7.988, 33\\",\\"7.988, 33\\",\\"Women's Clothing, Women's Clothing\\",\\"Women's Clothing, Women's Clothing\\",\\"Dec 31, 2016 @ 00:00:00.000, Dec 31, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Spherecords, Tigress Enterprises\\",\\"Spherecords, Tigress Enterprises\\",\\"3.6, 17.484\\",\\"7.988, 33\\",\\"20,734, 7,539\\",\\"Basic T-shirt - dark blue, Summer dress - scarab\\",\\"Basic T-shirt - dark blue, Summer dress - scarab\\",\\"1, 1\\",\\"ZO0638206382, ZO0038800388\\",\\"0, 0\\",\\"7.988, 33\\",\\"7.988, 33\\",\\"0, 0\\",\\"ZO0638206382, ZO0038800388\\",\\"40.969\\",\\"40.969\\",2,2,order,brigitte
KQMtOW0BH63Xcmy432LJ,ecommerce,\\"-\\",\\"-\\",\\"Men's Clothing\\",\\"Men's Clothing\\",EUR,Abd,Abd,\\"Abd Mccarthy\\",\\"Abd Mccarthy\\",MALE,52,Mccarthy,Mccarthy,,Saturday,5,\\"abd@mccarthy-family.zzz\\",Cairo,Africa,EG,\\"{
\\"\\"coordinates\\"\\": [
31.3,
30.1
],
\\"\\"type\\"\\": \\"\\"Point\\"\\"
-}\\",\\"Cairo Governorate\\",\\"Oceanavigations, Elitelligence\\",\\"Oceanavigations, Elitelligence\\",\\"Jul 12, 2019 @ 00:00:00.000\\",590937,\\"sold_product_590937_14438, sold_product_590937_23607\\",\\"sold_product_590937_14438, sold_product_590937_23607\\",\\"28.99, 12.99\\",\\"28.99, 12.99\\",\\"Men's Clothing, Men's Clothing\\",\\"Men's Clothing, Men's Clothing\\",\\"Dec 31, 2016 @ 00:00:00.000, Dec 31, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Oceanavigations, Elitelligence\\",\\"Oceanavigations, Elitelligence\\",\\"13.34, 6.11\\",\\"28.99, 12.99\\",\\"14,438, 23,607\\",\\"Jumper - dark grey multicolor, Print T-shirt - black\\",\\"Jumper - dark grey multicolor, Print T-shirt - black\\",\\"1, 1\\",\\"ZO0297602976, ZO0565605656\\",\\"0, 0\\",\\"28.99, 12.99\\",\\"28.99, 12.99\\",\\"0, 0\\",\\"ZO0297602976, ZO0565605656\\",\\"41.98\\",\\"41.98\\",2,2,order,abd
+}\\",\\"Cairo Governorate\\",\\"Oceanavigations, Elitelligence\\",\\"Oceanavigations, Elitelligence\\",\\"Jul 12, 2019 @ 00:00:00.000\\",590937,\\"sold_product_590937_14438, sold_product_590937_23607\\",\\"sold_product_590937_14438, sold_product_590937_23607\\",\\"28.984, 12.992\\",\\"28.984, 12.992\\",\\"Men's Clothing, Men's Clothing\\",\\"Men's Clothing, Men's Clothing\\",\\"Dec 31, 2016 @ 00:00:00.000, Dec 31, 2016 @ 00:00:00.000\\",\\"0, 0\\",\\"0, 0\\",\\"Oceanavigations, Elitelligence\\",\\"Oceanavigations, Elitelligence\\",\\"13.344, 6.109\\",\\"28.984, 12.992\\",\\"14,438, 23,607\\",\\"Jumper - dark grey multicolor, Print T-shirt - black\\",\\"Jumper - dark grey multicolor, Print T-shirt - black\\",\\"1, 1\\",\\"ZO0297602976, ZO0565605656\\",\\"0, 0\\",\\"28.984, 12.992\\",\\"28.984, 12.992\\",\\"0, 0\\",\\"ZO0297602976, ZO0565605656\\",\\"41.969\\",\\"41.969\\",2,2,order,abd
"
`;
diff --git a/x-pack/test/reporting_api_integration/reporting_and_security/csv_searchsource_immediate.ts b/x-pack/test/reporting_api_integration/reporting_and_security/csv_searchsource_immediate.ts
index ffaa4cb2f8fb6..ebc7badd88f42 100644
--- a/x-pack/test/reporting_api_integration/reporting_and_security/csv_searchsource_immediate.ts
+++ b/x-pack/test/reporting_api_integration/reporting_and_security/csv_searchsource_immediate.ts
@@ -31,7 +31,7 @@ export default function ({ getService }: FtrProviderContext) {
},
};
- // Failing: See https://github.com/elastic/kibana/issues/95594
+ // FAILING ES PROMOTION: https://github.com/elastic/kibana/issues/96000
describe.skip('CSV Generation from SearchSource', () => {
before(async () => {
await kibanaServer.uiSettings.update({
diff --git a/yarn.lock b/yarn.lock
index 486752dce5587..80ad1acf7fccd 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -1349,10 +1349,10 @@
dependencies:
object-hash "^1.3.0"
-"@elastic/charts@26.0.0":
- version "26.0.0"
- resolved "https://registry.yarnpkg.com/@elastic/charts/-/charts-26.0.0.tgz#42f06d3be0f40e0128e301b37bdfc509169c387b"
- integrity sha512-5eBPSjdBb+pVDCcQOYA0dFBiYonHcw7ewxOUxgR8qMmay0xHc7gGUXZiDfIkyUDpJA+a9DS9juNNqKn/M4UbiQ==
+"@elastic/charts@26.1.0":
+ version "26.1.0"
+ resolved "https://registry.yarnpkg.com/@elastic/charts/-/charts-26.1.0.tgz#3c8677d84e52ac7209aee19484fb2b7e2a22e5cc"
+ integrity sha512-RiidG+9QIn17o5AW8cntrznH+MaOO8gIAwrkJW1EMInntZgEA66WhVs4Kg2Negp6hsPMMeArQVWbDhXE9ST3qg==
dependencies:
"@popperjs/core" "^2.4.0"
chroma-js "^2.1.0"