From 519d4905bce5a563f104fa2161b93cc0ae065093 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loix?= Date: Mon, 5 Oct 2020 15:15:38 +0200 Subject: [PATCH 01/49] [Mappings editor] Fix app crash when selecting "other" field type (#79434) --- .../forms/hook_form_lib/hooks/use_field.ts | 48 ++++++-- .../datatypes/other_datatype.test.tsx | 112 ++++++++++++++++++ .../helpers/mappings_editor.helpers.tsx | 13 +- .../other_type_name_parameter.tsx | 70 ++++++++--- .../fields/edit_field/edit_field.tsx | 4 +- .../constants/parameters_definition.tsx | 2 +- 6 files changed, 224 insertions(+), 25 deletions(-) create mode 100644 x-pack/plugins/index_management/public/application/components/mappings_editor/__jest__/client_integration/datatypes/other_datatype.test.tsx diff --git a/src/plugins/es_ui_shared/static/forms/hook_form_lib/hooks/use_field.ts b/src/plugins/es_ui_shared/static/forms/hook_form_lib/hooks/use_field.ts index bb4aae6eccae8..0119d86e92a36 100644 --- a/src/plugins/es_ui_shared/static/forms/hook_form_lib/hooks/use_field.ts +++ b/src/plugins/es_ui_shared/static/forms/hook_form_lib/hooks/use_field.ts @@ -464,24 +464,58 @@ export const useField = ( [errors] ); + /** + * Handler to update the state and make sure the component is still mounted. + * When resetting the form, some field might get unmounted (e.g. a toggle on "true" becomes "false" and now certain fields should not be in the DOM). + * In that scenario there is a race condition in the "reset" method below, because the useState() hook is not synchronous. + * + * A better approach would be to have the state in a reducer and being able to update all values in a single dispatch action. + */ + const updateStateIfMounted = useCallback( + ( + state: 'isPristine' | 'isValidating' | 'isChangingValue' | 'isValidated' | 'errors' | 'value', + nextValue: any + ) => { + if (isMounted.current === false) { + return; + } + + switch (state) { + case 'value': + return setValue(nextValue); + case 'errors': + return setErrors(nextValue); + case 'isChangingValue': + return setIsChangingValue(nextValue); + case 'isPristine': + return setPristine(nextValue); + case 'isValidated': + return setIsValidated(nextValue); + case 'isValidating': + return setValidating(nextValue); + } + }, + [setValue] + ); + const reset: FieldHook['reset'] = useCallback( (resetOptions = { resetValue: true }) => { const { resetValue = true, defaultValue: updatedDefaultValue } = resetOptions; - setPristine(true); - setValidating(false); - setIsChangingValue(false); - setIsValidated(false); - setErrors([]); + updateStateIfMounted('isPristine', true); + updateStateIfMounted('isValidating', false); + updateStateIfMounted('isChangingValue', false); + updateStateIfMounted('isValidated', false); + updateStateIfMounted('errors', []); if (resetValue) { hasBeenReset.current = true; const newValue = deserializeValue(updatedDefaultValue ?? defaultValue); - setValue(newValue); + updateStateIfMounted('value', newValue); return newValue; } }, - [setValue, deserializeValue, defaultValue] + [updateStateIfMounted, deserializeValue, defaultValue] ); // Don't take into account non blocker validation. Some are just warning (like trying to add a wrong ComboBox item) diff --git a/x-pack/plugins/index_management/public/application/components/mappings_editor/__jest__/client_integration/datatypes/other_datatype.test.tsx b/x-pack/plugins/index_management/public/application/components/mappings_editor/__jest__/client_integration/datatypes/other_datatype.test.tsx new file mode 100644 index 0000000000000..c1474b0ec6781 --- /dev/null +++ b/x-pack/plugins/index_management/public/application/components/mappings_editor/__jest__/client_integration/datatypes/other_datatype.test.tsx @@ -0,0 +1,112 @@ +/* + * 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 { act } from 'react-dom/test-utils'; + +import { componentHelpers, MappingsEditorTestBed } from '../helpers'; + +const { setup, getMappingsEditorDataFactory } = componentHelpers.mappingsEditor; + +describe('Mappings editor: other datatype', () => { + /** + * Variable to store the mappings data forwarded to the consumer component + */ + let data: any; + let onChangeHandler: jest.Mock = jest.fn(); + let getMappingsEditorData = getMappingsEditorDataFactory(onChangeHandler); + let testBed: MappingsEditorTestBed; + + beforeAll(() => { + jest.useFakeTimers(); + }); + + afterAll(() => { + jest.useRealTimers(); + }); + + beforeEach(() => { + onChangeHandler = jest.fn(); + getMappingsEditorData = getMappingsEditorDataFactory(onChangeHandler); + }); + + test('allow to add custom field type', async () => { + await act(async () => { + testBed = setup({ onChange: onChangeHandler }); + }); + testBed.component.update(); + + const { + component, + actions: { addField }, + } = testBed; + + await addField('myField', 'other', 'customType'); + + const mappings = { + properties: { + myField: { + type: 'customType', + }, + }, + }; + + ({ data } = await getMappingsEditorData(component)); + expect(data).toEqual(mappings); + }); + + test('allow to change a field type to a custom type', async () => { + const defaultMappings = { + properties: { + myField: { + type: 'text', + }, + }, + }; + + let updatedMappings = { ...defaultMappings }; + + await act(async () => { + testBed = setup({ value: defaultMappings, onChange: onChangeHandler }); + }); + testBed.component.update(); + + const { + component, + find, + form, + actions: { startEditField, updateFieldAndCloseFlyout }, + } = testBed; + + // Open the flyout to edit the field + await startEditField('myField'); + + // Change the field type + await act(async () => { + find('mappingsEditorFieldEdit.fieldType').simulate('change', [ + { + label: 'other', + value: 'other', + }, + ]); + }); + component.update(); + + form.setInputValue('mappingsEditorFieldEdit.fieldSubType', 'customType'); + + // Save the field and close the flyout + await updateFieldAndCloseFlyout(); + + updatedMappings = { + properties: { + myField: { + type: 'customType', + }, + }, + }; + + ({ data } = await getMappingsEditorData(component)); + expect(data).toEqual(updatedMappings); + }); +}); diff --git a/x-pack/plugins/index_management/public/application/components/mappings_editor/__jest__/client_integration/helpers/mappings_editor.helpers.tsx b/x-pack/plugins/index_management/public/application/components/mappings_editor/__jest__/client_integration/helpers/mappings_editor.helpers.tsx index e123dea6ff2ff..2eb56a97dc3a0 100644 --- a/x-pack/plugins/index_management/public/application/components/mappings_editor/__jest__/client_integration/helpers/mappings_editor.helpers.tsx +++ b/x-pack/plugins/index_management/public/application/components/mappings_editor/__jest__/client_integration/helpers/mappings_editor.helpers.tsx @@ -149,7 +149,7 @@ const createActions = (testBed: TestBed) => { return { field: find(testSubject as TestSubjects), testSubject }; }; - const addField = async (name: string, type: string) => { + const addField = async (name: string, type: string, subType?: string) => { await act(async () => { form.setInputValue('nameParameterInput', name); find('createFieldForm.fieldType').simulate('change', [ @@ -160,6 +160,17 @@ const createActions = (testBed: TestBed) => { ]); }); + component.update(); + + if (subType !== undefined) { + await act(async () => { + if (type === 'other') { + // subType is a text input + form.setInputValue('createFieldForm.fieldSubType', subType); + } + }); + } + await act(async () => { find('createFieldForm.addButton').simulate('click'); }); diff --git a/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/field_parameters/other_type_name_parameter.tsx b/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/field_parameters/other_type_name_parameter.tsx index 6004e484323a1..8043a0deaf8da 100644 --- a/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/field_parameters/other_type_name_parameter.tsx +++ b/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/field_parameters/other_type_name_parameter.tsx @@ -4,13 +4,11 @@ * you may not use this file except in compliance with the Elastic License. */ -import React from 'react'; +import React, { useCallback } from 'react'; import { i18n } from '@kbn/i18n'; -import { UseField, TextField, FieldConfig } from '../../../shared_imports'; -import { fieldValidators } from '../../../shared_imports'; - -const { emptyField } = fieldValidators; +import { UseField, TextField, FieldConfig, FieldHook } from '../../../shared_imports'; +import { getFieldConfig } from '../../../lib'; /** * This is a special component that does not have an explicit entry in {@link PARAMETERS_DEFINITION}. @@ -18,25 +16,69 @@ const { emptyField } = fieldValidators; * We use it to store the name of types unknown to the mappings editor in the "subType" path. */ +type FieldType = [{ value: string }]; + +const typeParameterConfig = getFieldConfig('type'); + const fieldConfig: FieldConfig = { label: i18n.translate('xpack.idxMgmt.mappingsEditor.otherTypeNameFieldLabel', { defaultMessage: 'Type Name', }), defaultValue: '', + deserializer: typeParameterConfig.deserializer, + serializer: typeParameterConfig.serializer, validations: [ { - validator: emptyField( - i18n.translate( - 'xpack.idxMgmt.mappingsEditor.parameters.validations.otherTypeNameIsRequiredErrorMessage', - { - defaultMessage: 'The type name is required.', - } - ) - ), + validator: ({ value: fieldValue }) => { + if ((fieldValue as FieldType)[0].value.trim() === '') { + return { + message: i18n.translate( + 'xpack.idxMgmt.mappingsEditor.parameters.validations.otherTypeNameIsRequiredErrorMessage', + { + defaultMessage: 'The type name is required.', + } + ), + }; + } + }, }, ], }; +interface Props { + field: FieldHook; +} + +/** + * The "subType" parameter can be configured either with a ComboBox (when the type is known) + * or with a TextField (when the type is unknown). This causes its value to have different type + * (either an array of object either a string). In order to align both value and let the consumer of + * the value worry about a single type, we will create a custom TextField component that works with the + * array of object that the ComboBox works with. + */ +const CustomTextField = ({ field }: Props) => { + const { setValue } = field; + + const transformedField: FieldHook = { + ...field, + value: field.value[0]?.value ?? '', + }; + + const onChange = useCallback( + (e: React.ChangeEvent) => { + setValue([{ value: e.target.value }]); + }, + [setValue] + ); + + return ( + + ); +}; + export const OtherTypeNameParameter = () => ( - + ); diff --git a/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/fields/edit_field/edit_field.tsx b/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/fields/edit_field/edit_field.tsx index 95575124b6abd..faa0c8c9dc792 100644 --- a/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/fields/edit_field/edit_field.tsx +++ b/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/fields/edit_field/edit_field.tsx @@ -91,8 +91,8 @@ export const EditField = React.memo(({ form, field, allFields, exitEdit, updateF {({ type, subType }) => { const linkDocumentation = - documentationService.getTypeDocLink(subType?.[0].value) || - documentationService.getTypeDocLink(type?.[0].value); + documentationService.getTypeDocLink(subType?.[0]?.value) || + documentationService.getTypeDocLink(type?.[0]?.value); if (!linkDocumentation) { return null; diff --git a/x-pack/plugins/index_management/public/application/components/mappings_editor/constants/parameters_definition.tsx b/x-pack/plugins/index_management/public/application/components/mappings_editor/constants/parameters_definition.tsx index 4c9786d88bfa2..74cca4dae7817 100644 --- a/x-pack/plugins/index_management/public/application/components/mappings_editor/constants/parameters_definition.tsx +++ b/x-pack/plugins/index_management/public/application/components/mappings_editor/constants/parameters_definition.tsx @@ -168,7 +168,7 @@ export const PARAMETERS_DEFINITION: { [key in ParameterName]: ParameterDefinitio }, ]; } - return []; + return [{ value: '' }]; }, serializer: (fieldType: ComboBoxOption[] | undefined) => fieldType && fieldType.length ? fieldType[0].value : fieldType, From f960e89ef6a9f17c9da0bb73e369e179a673c453 Mon Sep 17 00:00:00 2001 From: Ahmad Bamieh Date: Mon, 5 Oct 2020 16:16:07 +0300 Subject: [PATCH 02/49] [Telemetry] server fetcher check all collectors ready before sending (#79398) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Alejandro Fernández Haro --- src/plugins/telemetry/server/fetcher.test.ts | 84 +++++++++++++++++-- src/plugins/telemetry/server/fetcher.ts | 30 +++++-- .../server/index.ts | 1 + .../server/plugin.ts | 6 ++ .../server/types.ts | 2 + .../server/collector/collector_set.ts | 29 ++++--- 6 files changed, 130 insertions(+), 22 deletions(-) diff --git a/src/plugins/telemetry/server/fetcher.test.ts b/src/plugins/telemetry/server/fetcher.test.ts index 245adf59799cc..45712df772e1c 100644 --- a/src/plugins/telemetry/server/fetcher.test.ts +++ b/src/plugins/telemetry/server/fetcher.test.ts @@ -23,19 +23,93 @@ import { coreMock } from '../../../core/server/mocks'; describe('FetcherTask', () => { describe('sendIfDue', () => { - it('returns undefined and warns when it fails to get telemetry configs', async () => { + it('stops when it fails to get telemetry configs', async () => { const initializerContext = coreMock.createPluginInitializerContext({}); const fetcherTask = new FetcherTask(initializerContext); const mockError = new Error('Some message.'); - fetcherTask['getCurrentConfigs'] = async () => { - throw mockError; - }; + const getCurrentConfigs = jest.fn().mockRejectedValue(mockError); + const fetchTelemetry = jest.fn(); + const sendTelemetry = jest.fn(); + Object.assign(fetcherTask, { + getCurrentConfigs, + fetchTelemetry, + sendTelemetry, + }); const result = await fetcherTask['sendIfDue'](); expect(result).toBe(undefined); + expect(getCurrentConfigs).toBeCalledTimes(1); + expect(fetchTelemetry).toBeCalledTimes(0); + expect(sendTelemetry).toBeCalledTimes(0); expect(fetcherTask['logger'].warn).toBeCalledTimes(1); expect(fetcherTask['logger'].warn).toHaveBeenCalledWith( - `Error fetching telemetry configs: ${mockError}` + `Error getting telemetry configs. (${mockError})` ); }); + + it('stops when all collectors are not ready', async () => { + const initializerContext = coreMock.createPluginInitializerContext({}); + const fetcherTask = new FetcherTask(initializerContext); + const getCurrentConfigs = jest.fn().mockResolvedValue({}); + const areAllCollectorsReady = jest.fn().mockResolvedValue(false); + const shouldSendReport = jest.fn().mockReturnValue(true); + const fetchTelemetry = jest.fn(); + const sendTelemetry = jest.fn(); + const updateReportFailure = jest.fn(); + + Object.assign(fetcherTask, { + getCurrentConfigs, + areAllCollectorsReady, + shouldSendReport, + fetchTelemetry, + updateReportFailure, + sendTelemetry, + }); + + await fetcherTask['sendIfDue'](); + + expect(fetchTelemetry).toBeCalledTimes(0); + expect(sendTelemetry).toBeCalledTimes(0); + + expect(areAllCollectorsReady).toBeCalledTimes(1); + expect(updateReportFailure).toBeCalledTimes(0); + expect(fetcherTask['logger'].warn).toBeCalledTimes(1); + expect(fetcherTask['logger'].warn).toHaveBeenCalledWith( + `Error fetching usage. (Error: Not all collectors are ready.)` + ); + }); + + it('fetches usage and send telemetry', async () => { + const initializerContext = coreMock.createPluginInitializerContext({}); + const fetcherTask = new FetcherTask(initializerContext); + const mockTelemetryUrl = 'mock_telemetry_url'; + const mockClusters = ['cluster_1', 'cluster_2']; + const getCurrentConfigs = jest.fn().mockResolvedValue({ + telemetryUrl: mockTelemetryUrl, + }); + const areAllCollectorsReady = jest.fn().mockResolvedValue(true); + const shouldSendReport = jest.fn().mockReturnValue(true); + + const fetchTelemetry = jest.fn().mockResolvedValue(mockClusters); + const sendTelemetry = jest.fn(); + const updateReportFailure = jest.fn(); + + Object.assign(fetcherTask, { + getCurrentConfigs, + areAllCollectorsReady, + shouldSendReport, + fetchTelemetry, + updateReportFailure, + sendTelemetry, + }); + + await fetcherTask['sendIfDue'](); + + expect(areAllCollectorsReady).toBeCalledTimes(1); + expect(fetchTelemetry).toBeCalledTimes(1); + expect(sendTelemetry).toBeCalledTimes(2); + expect(sendTelemetry).toHaveBeenNthCalledWith(1, mockTelemetryUrl, mockClusters[0]); + expect(sendTelemetry).toHaveBeenNthCalledWith(2, mockTelemetryUrl, mockClusters[1]); + expect(updateReportFailure).toBeCalledTimes(0); + }); }); }); diff --git a/src/plugins/telemetry/server/fetcher.ts b/src/plugins/telemetry/server/fetcher.ts index 75cfac721bcd3..e6d909965f5f7 100644 --- a/src/plugins/telemetry/server/fetcher.ts +++ b/src/plugins/telemetry/server/fetcher.ts @@ -22,7 +22,10 @@ import { Observable } from 'rxjs'; import { take } from 'rxjs/operators'; // @ts-ignore import fetch from 'node-fetch'; -import { TelemetryCollectionManagerPluginStart } from 'src/plugins/telemetry_collection_manager/server'; +import { + TelemetryCollectionManagerPluginStart, + UsageStatsPayload, +} from 'src/plugins/telemetry_collection_manager/server'; import { PluginInitializerContext, Logger, @@ -94,6 +97,10 @@ export class FetcherTask { } } + private async areAllCollectorsReady() { + return (await this.telemetryCollectionManager?.areAllCollectorsReady()) ?? false; + } + private async sendIfDue() { if (this.isSending) { return; @@ -103,7 +110,7 @@ export class FetcherTask { try { telemetryConfig = await this.getCurrentConfigs(); } catch (err) { - this.logger.warn(`Error fetching telemetry configs: ${err}`); + this.logger.warn(`Error getting telemetry configs. (${err})`); return; } @@ -111,9 +118,22 @@ export class FetcherTask { return; } + let clusters: Array = []; + this.isSending = true; + + try { + const allCollectorsReady = await this.areAllCollectorsReady(); + if (!allCollectorsReady) { + throw new Error('Not all collectors are ready.'); + } + clusters = await this.fetchTelemetry(); + } catch (err) { + this.logger.warn(`Error fetching usage. (${err})`); + this.isSending = false; + return; + } + try { - this.isSending = true; - const clusters = await this.fetchTelemetry(); const { telemetryUrl } = telemetryConfig; for (const cluster of clusters) { await this.sendTelemetry(telemetryUrl, cluster); @@ -123,7 +143,7 @@ export class FetcherTask { } catch (err) { await this.updateReportFailure(telemetryConfig); - this.logger.warn(`Error sending telemetry usage data: ${err}`); + this.logger.warn(`Error sending telemetry usage data. (${err})`); } this.isSending = false; } diff --git a/src/plugins/telemetry_collection_manager/server/index.ts b/src/plugins/telemetry_collection_manager/server/index.ts index 8761c28e14095..36ab64731fe58 100644 --- a/src/plugins/telemetry_collection_manager/server/index.ts +++ b/src/plugins/telemetry_collection_manager/server/index.ts @@ -38,4 +38,5 @@ export { ClusterDetails, ClusterDetailsGetter, LicenseGetter, + UsageStatsPayload, } from './types'; diff --git a/src/plugins/telemetry_collection_manager/server/plugin.ts b/src/plugins/telemetry_collection_manager/server/plugin.ts index e54e7451a670a..ff63262004cf5 100644 --- a/src/plugins/telemetry_collection_manager/server/plugin.ts +++ b/src/plugins/telemetry_collection_manager/server/plugin.ts @@ -67,6 +67,7 @@ export class TelemetryCollectionManagerPlugin setCollection: this.setCollection.bind(this), getOptInStats: this.getOptInStats.bind(this), getStats: this.getStats.bind(this), + areAllCollectorsReady: this.areAllCollectorsReady.bind(this), }; } @@ -75,6 +76,7 @@ export class TelemetryCollectionManagerPlugin setCollection: this.setCollection.bind(this), getOptInStats: this.getOptInStats.bind(this), getStats: this.getStats.bind(this), + areAllCollectorsReady: this.areAllCollectorsReady.bind(this), }; } @@ -185,6 +187,10 @@ export class TelemetryCollectionManagerPlugin return []; } + private areAllCollectorsReady = async () => { + return await this.usageCollection?.areAllCollectorsReady(); + }; + private getOptInStatsForCollection = async ( collection: Collection, optInStatus: boolean, diff --git a/src/plugins/telemetry_collection_manager/server/types.ts b/src/plugins/telemetry_collection_manager/server/types.ts index 44970df30fd16..3b0936fb73a60 100644 --- a/src/plugins/telemetry_collection_manager/server/types.ts +++ b/src/plugins/telemetry_collection_manager/server/types.ts @@ -34,6 +34,7 @@ export interface TelemetryCollectionManagerPluginSetup { ) => void; getOptInStats: TelemetryCollectionManagerPlugin['getOptInStats']; getStats: TelemetryCollectionManagerPlugin['getStats']; + areAllCollectorsReady: TelemetryCollectionManagerPlugin['areAllCollectorsReady']; } export interface TelemetryCollectionManagerPluginStart { @@ -42,6 +43,7 @@ export interface TelemetryCollectionManagerPluginStart { ) => void; getOptInStats: TelemetryCollectionManagerPlugin['getOptInStats']; getStats: TelemetryCollectionManagerPlugin['getStats']; + areAllCollectorsReady: TelemetryCollectionManagerPlugin['areAllCollectorsReady']; } export interface TelemetryOptInStats { diff --git a/src/plugins/usage_collection/server/collector/collector_set.ts b/src/plugins/usage_collection/server/collector/collector_set.ts index 6861be7f4f76b..7bf4e19c72cc0 100644 --- a/src/plugins/usage_collection/server/collector/collector_set.ts +++ b/src/plugins/usage_collection/server/collector/collector_set.ts @@ -76,23 +76,27 @@ export class CollectorSet { }; public areAllCollectorsReady = async (collectorSet: CollectorSet = this) => { - // Kept this for runtime validation in JS code. if (!(collectorSet instanceof CollectorSet)) { throw new Error( `areAllCollectorsReady method given bad collectorSet parameter: ` + typeof collectorSet ); } - const collectorTypesNotReady = ( - await Promise.all( - [...collectorSet.collectors.values()].map(async (collector) => { - if (!(await collector.isReady())) { - return collector.type; - } - }) - ) - ).filter((collectorType): collectorType is string => !!collectorType); - const allReady = collectorTypesNotReady.length === 0; + const collectors = [...collectorSet.collectors.values()]; + const collectorsWithStatus = await Promise.all( + collectors.map(async (collector) => { + return { + isReady: await collector.isReady(), + collector, + }; + }) + ); + + const collectorsTypesNotReady = collectorsWithStatus + .filter((collectorWithStatus) => collectorWithStatus.isReady === false) + .map((collectorWithStatus) => collectorWithStatus.collector.type); + + const allReady = collectorsTypesNotReady.length === 0; if (!allReady && this.maximumWaitTimeForAllCollectorsInS >= 0) { const nowTimestamp = +new Date(); @@ -102,10 +106,11 @@ export class CollectorSet { const timeLeftInMS = this.maximumWaitTimeForAllCollectorsInS * 1000 - timeWaitedInMS; if (timeLeftInMS <= 0) { this.logger.debug( - `All collectors are not ready (waiting for ${collectorTypesNotReady.join(',')}) ` + + `All collectors are not ready (waiting for ${collectorsTypesNotReady.join(',')}) ` + `but we have waited the required ` + `${this.maximumWaitTimeForAllCollectorsInS}s and will return data from all collectors that are ready.` ); + return true; } else { this.logger.debug(`All collectors are not ready. Waiting for ${timeLeftInMS}ms longer.`); From a8b1b9e281cc24f97781bc0c3b91f0d09a607060 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loix?= Date: Mon, 5 Oct 2020 15:19:36 +0200 Subject: [PATCH 03/49] [Index management] Update TemplateDeserialized interface (#78913) Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- .../home/index_templates_tab.test.ts | 4 +-- .../template_clone.test.tsx | 2 +- .../common/lib/template_serialization.ts | 4 +-- .../common/types/templates.ts | 4 +-- .../template_form/template_form.tsx | 27 ++++++++++--------- .../template_details_content.tsx | 4 +-- 6 files changed, 22 insertions(+), 23 deletions(-) diff --git a/x-pack/plugins/index_management/__jest__/client_integration/home/index_templates_tab.test.ts b/x-pack/plugins/index_management/__jest__/client_integration/home/index_templates_tab.test.ts index 06f57896d4900..37df55f784252 100644 --- a/x-pack/plugins/index_management/__jest__/client_integration/home/index_templates_tab.test.ts +++ b/x-pack/plugins/index_management/__jest__/client_integration/home/index_templates_tab.test.ts @@ -127,7 +127,7 @@ describe('Index Templates tab', () => { const indexTemplate = templates[i]; const { name, indexPatterns, ilmPolicy, composedOf, template } = indexTemplate; - const hasContent = !!template.settings || !!template.mappings || !!template.aliases; + const hasContent = !!template?.settings || !!template?.mappings || !!template?.aliases; const ilmPolicyName = ilmPolicy && ilmPolicy.name ? ilmPolicy.name : ''; const composedOfString = composedOf ? composedOf.join(',') : ''; @@ -152,7 +152,7 @@ describe('Index Templates tab', () => { const legacyIndexTemplate = legacyTemplates[i]; const { name, indexPatterns, ilmPolicy, template } = legacyIndexTemplate; - const hasContent = !!template.settings || !!template.mappings || !!template.aliases; + const hasContent = !!template?.settings || !!template?.mappings || !!template?.aliases; const ilmPolicyName = ilmPolicy && ilmPolicy.name ? ilmPolicy.name : ''; try { diff --git a/x-pack/plugins/index_management/__jest__/client_integration/index_template_wizard/template_clone.test.tsx b/x-pack/plugins/index_management/__jest__/client_integration/index_template_wizard/template_clone.test.tsx index 8b74e9fb0cdf8..f0c0128fd6463 100644 --- a/x-pack/plugins/index_management/__jest__/client_integration/index_template_wizard/template_clone.test.tsx +++ b/x-pack/plugins/index_management/__jest__/client_integration/index_template_wizard/template_clone.test.tsx @@ -112,7 +112,7 @@ describe('', () => { name: `${templateToClone.name}-copy`, indexPatterns: DEFAULT_INDEX_PATTERNS, }; - // @ts-expect-error + delete expected.template; // As no settings, mappings or aliases have been defined, no "template" param is sent expect(JSON.parse(JSON.parse(latestRequest.requestBody).body)).toEqual(expected); diff --git a/x-pack/plugins/index_management/common/lib/template_serialization.ts b/x-pack/plugins/index_management/common/lib/template_serialization.ts index 1803d89a40016..bb7604f06c302 100644 --- a/x-pack/plugins/index_management/common/lib/template_serialization.ts +++ b/x-pack/plugins/index_management/common/lib/template_serialization.ts @@ -85,7 +85,7 @@ export function deserializeTemplateList( ): TemplateListItem[] { return indexTemplates.map(({ name, index_template: templateSerialized }) => { const { - template: { mappings, settings, aliases }, + template: { mappings, settings, aliases } = {}, ...deserializedTemplate } = deserializeTemplate({ name, ...templateSerialized }, cloudManagedTemplatePrefix); @@ -149,7 +149,7 @@ export function deserializeLegacyTemplateList( ): TemplateListItem[] { return Object.entries(indexTemplatesByName).map(([name, templateSerialized]) => { const { - template: { mappings, settings, aliases }, + template: { mappings, settings, aliases } = {}, ...deserializedTemplate } = deserializeLegacyTemplate({ name, ...templateSerialized }, cloudManagedTemplatePrefix); diff --git a/x-pack/plugins/index_management/common/types/templates.ts b/x-pack/plugins/index_management/common/types/templates.ts index eda00ec819159..d1b51fe5b89bf 100644 --- a/x-pack/plugins/index_management/common/types/templates.ts +++ b/x-pack/plugins/index_management/common/types/templates.ts @@ -13,7 +13,7 @@ import { Mappings } from './mappings'; */ export interface TemplateSerialized { index_patterns: string[]; - template: { + template?: { settings?: IndexSettings; aliases?: Aliases; mappings?: Mappings; @@ -33,7 +33,7 @@ export interface TemplateSerialized { export interface TemplateDeserialized { name: string; indexPatterns: string[]; - template: { + template?: { settings?: IndexSettings; aliases?: Aliases; mappings?: Mappings; diff --git a/x-pack/plugins/index_management/public/application/components/template_form/template_form.tsx b/x-pack/plugins/index_management/public/application/components/template_form/template_form.tsx index 3a03835e85970..8e84abb5ce495 100644 --- a/x-pack/plugins/index_management/public/application/components/template_form/template_form.tsx +++ b/x-pack/plugins/index_management/public/application/components/template_form/template_form.tsx @@ -117,7 +117,7 @@ export const TemplateForm = ({ }; const { - template: { settings, mappings, aliases }, + template: { settings, mappings, aliases } = {}, composedOf, _kbnMeta, ...logistics @@ -170,18 +170,19 @@ export const TemplateForm = ({ const cleanupTemplateObject = (template: TemplateDeserialized) => { const outputTemplate = { ...template }; - if (outputTemplate.template.settings === undefined) { - delete outputTemplate.template.settings; - } - if (outputTemplate.template.mappings === undefined) { - delete outputTemplate.template.mappings; - } - if (outputTemplate.template.aliases === undefined) { - delete outputTemplate.template.aliases; - } - if (Object.keys(outputTemplate.template).length === 0) { - // @ts-expect-error - delete outputTemplate.template; + if (outputTemplate.template) { + if (outputTemplate.template.settings === undefined) { + delete outputTemplate.template.settings; + } + if (outputTemplate.template.mappings === undefined) { + delete outputTemplate.template.mappings; + } + if (outputTemplate.template.aliases === undefined) { + delete outputTemplate.template.aliases; + } + if (Object.keys(outputTemplate.template).length === 0) { + delete outputTemplate.template; + } } return outputTemplate; diff --git a/x-pack/plugins/index_management/public/application/sections/home/template_list/template_details/template_details_content.tsx b/x-pack/plugins/index_management/public/application/sections/home/template_list/template_details/template_details_content.tsx index 94891297c857e..48083f324de3d 100644 --- a/x-pack/plugins/index_management/public/application/sections/home/template_list/template_details/template_details_content.tsx +++ b/x-pack/plugins/index_management/public/application/sections/home/template_list/template_details/template_details_content.tsx @@ -161,9 +161,7 @@ export const TemplateDetailsContent = ({ } if (templateDetails) { - const { - template: { settings, mappings, aliases }, - } = templateDetails; + const { template: { settings, mappings, aliases } = {} } = templateDetails; const tabToComponentMap: Record = { [SUMMARY_TAB_ID]: , From 5ca87308eac4b4971521b894534dccfbabc55893 Mon Sep 17 00:00:00 2001 From: Mikhail Shustov Date: Mon, 5 Oct 2020 17:00:27 +0300 Subject: [PATCH 04/49] global search to ts refs (#79446) --- x-pack/plugins/global_search/tsconfig.json | 21 +++++++++++++++++++++ x-pack/test/tsconfig.json | 3 ++- x-pack/tsconfig.json | 6 ++++-- x-pack/tsconfig.refs.json | 3 ++- 4 files changed, 29 insertions(+), 4 deletions(-) create mode 100644 x-pack/plugins/global_search/tsconfig.json diff --git a/x-pack/plugins/global_search/tsconfig.json b/x-pack/plugins/global_search/tsconfig.json new file mode 100644 index 0000000000000..2d05328f445df --- /dev/null +++ b/x-pack/plugins/global_search/tsconfig.json @@ -0,0 +1,21 @@ +{ + "extends": "../../../tsconfig.base.json", + "compilerOptions": { + "composite": true, + "outDir": "./target/types", + "emitDeclarationOnly": true, + "declaration": true, + "declarationMap": true + }, + "include": [ + "public/**/*", + "server/**/*", + "common/**/*", + "../../../typings/**/*" + ], + "references": [ + { "path": "../../../src/core/tsconfig.json" }, + { "path": "../licensing/tsconfig.json" } + ] +} + diff --git a/x-pack/test/tsconfig.json b/x-pack/test/tsconfig.json index 628f2edefb079..8e378ff1f4a6a 100644 --- a/x-pack/test/tsconfig.json +++ b/x-pack/test/tsconfig.json @@ -20,6 +20,7 @@ { "path": "../../src/core/tsconfig.json" }, { "path": "../../src/plugins/kibana_utils/tsconfig.json" }, { "path": "../../src/plugins/kibana_react/tsconfig.json" }, - { "path": "../plugins/licensing/tsconfig.json" } + { "path": "../plugins/licensing/tsconfig.json" }, + { "path": "../plugins/global_search/tsconfig.json" }, ] } diff --git a/x-pack/tsconfig.json b/x-pack/tsconfig.json index 9a52aca381e87..f751aac1806dd 100644 --- a/x-pack/tsconfig.json +++ b/x-pack/tsconfig.json @@ -12,7 +12,8 @@ "plugins/security_solution/cypress/**/*", "plugins/apm/e2e/cypress/**/*", "plugins/apm/scripts/**/*", - "plugins/licensing/**/*" + "plugins/licensing/**/*", + "plugins/global_search/**/*", ], "compilerOptions": { "paths": { @@ -28,6 +29,7 @@ { "path": "../src/core/tsconfig.json" }, { "path": "../src/plugins/kibana_utils/tsconfig.json" }, { "path": "../src/plugins/kibana_react/tsconfig.json" }, - { "path": "./plugins/licensing/tsconfig.json" } + { "path": "./plugins/licensing/tsconfig.json" }, + { "path": "./plugins/global_search/tsconfig.json" }, ] } diff --git a/x-pack/tsconfig.refs.json b/x-pack/tsconfig.refs.json index 0b4c46b893aa8..a389bbcf0272b 100644 --- a/x-pack/tsconfig.refs.json +++ b/x-pack/tsconfig.refs.json @@ -1,6 +1,7 @@ { "include": [], "references": [ - { "path": "./plugins/licensing/tsconfig.json" } + { "path": "./plugins/licensing/tsconfig.json" }, + { "path": "./plugins/global_search/tsconfig.json" }, ] } From e067604d7800a76ab99440405e291e8b2764842f Mon Sep 17 00:00:00 2001 From: Quynh Nguyen <43350163+qn895@users.noreply.github.com> Date: Mon, 5 Oct 2020 09:06:55 -0500 Subject: [PATCH 05/49] [ML] Only adjust the bounds of SMV if annotations are visible (#79210) Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- .../components/timeseries_chart/timeseries_chart.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/x-pack/plugins/ml/public/application/timeseriesexplorer/components/timeseries_chart/timeseries_chart.js b/x-pack/plugins/ml/public/application/timeseriesexplorer/components/timeseries_chart/timeseries_chart.js index 4c87c3b374ff3..448d39db3e444 100644 --- a/x-pack/plugins/ml/public/application/timeseriesexplorer/components/timeseries_chart/timeseries_chart.js +++ b/x-pack/plugins/ml/public/application/timeseriesexplorer/components/timeseries_chart/timeseries_chart.js @@ -672,7 +672,7 @@ class TimeseriesChartIntl extends Component { // if annotations are present, we extend yMax to avoid overlap // between annotation labels, chart lines and anomalies. - if (focusAnnotationData && focusAnnotationData.length > 0) { + if (showAnnotations && focusAnnotationData && focusAnnotationData.length > 0) { const levels = getAnnotationLevels(focusAnnotationData); const maxLevel = d3.max(Object.keys(levels).map((key) => levels[key])); // TODO needs revisiting to be a more robust normalization From cc633a4a915ed59339af6ea79e7779dff2afed04 Mon Sep 17 00:00:00 2001 From: Jonathan Buttner <56361221+jonathan-buttner@users.noreply.github.com> Date: Mon, 5 Oct 2020 10:11:28 -0400 Subject: [PATCH 06/49] [Security Solution] Adding tests for dns pipeline in the endpoint package (#79177) * Adding tests for dns pipeline in the endpoint package * Adding test to make sure non dns events are ingested correctly * Bring the docker container with the new endpoint package Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- .../common/endpoint/types/index.ts | 5 +- .../endpoint/pipeline/dns/data.json.gz | Bin 0 -> 1256 bytes .../ingest_manager_api_integration/config.ts | 2 +- .../apis/package.ts | 74 ++++++++++++++++++ 4 files changed, 79 insertions(+), 2 deletions(-) create mode 100644 x-pack/test/functional/es_archives/endpoint/pipeline/dns/data.json.gz diff --git a/x-pack/plugins/security_solution/common/endpoint/types/index.ts b/x-pack/plugins/security_solution/common/endpoint/types/index.ts index abb0ccee8d909..0054c1f1abdd5 100644 --- a/x-pack/plugins/security_solution/common/endpoint/types/index.ts +++ b/x-pack/plugins/security_solution/common/endpoint/types/index.ts @@ -718,7 +718,10 @@ export type SafeEndpointEvent = Partial<{ forwarded_ip: ECSField; }>; dns: Partial<{ - question: Partial<{ name: ECSField }>; + question: Partial<{ + name: ECSField; + type: ECSField; + }>; }>; process: Partial<{ entity_id: ECSField; diff --git a/x-pack/test/functional/es_archives/endpoint/pipeline/dns/data.json.gz b/x-pack/test/functional/es_archives/endpoint/pipeline/dns/data.json.gz new file mode 100644 index 0000000000000000000000000000000000000000..5caab4767dbec92b37150a272b3a7e0f1b232db3 GIT binary patch literal 1256 zcmVQOZ*BnXS6gr5MihR}udsM()!3Tx6&$TpHjv$H zV@L`lB4rf~_5cpX+w~EtNdx zmX5{30|`>G@(5qxtM7^3PH@eQ&sQJusOEAW_M=bUC=(YFp+{#zC}6`xrlA)xKjaF1 zpdn9`kn$;u$FfHUBn|jlDPd{ses=>azjJ>=6HX?Pu%#ju$r#B9x3Oj$$i{|(bFf$kc{#!RjZ>+th?4>V4E z7K&|4sVJJItsUvip7l2OiRP2|n&GJ(&gl{P{Ygv_oVG+6r zZ91JQL&k;yRa`bH6>P7=KW|)DFV1Us@b1)0-`(tFMBS~7axKA%p`hI&(11XEZc%M_ zTs8xPR*$^rwSImW;=|4)5_eS~=o1^K(Opcls!=cBOP6puWbqv2{wfr5H5Qw-uX!by zFk$D_C*{o}xU9-We9>xNf4)x6x)r@$^?%DAdX|?Q0{~=3vkK%kCd^BNXHQikiV*IOWz$z0}9#G4aD=O;Co@Z8Mtf_rd)lGF^Sp}_VJ29+U3W7ge z%*?j&{?1Q`yKMp?d-=h5`Pr}eilkVweK>ZZBfBDEpJdZsx`F1iX#yxBUB4H!82xxI`H2MB7zGrLvIMRrKBAI{Q4;7$SRkPDSQ6(! z!pAG66>{frTblZOBrO3O;9B~VCU9RQ;C17EeZY%%l0fi~>_hR0#iG52wio+1htXbM zHappZfC~w~cnc9Y|8QGwV;}6?e)=+Lv`7AJt;@Ujow;+0P_x~|7wsYL-Z;FgHb&j{ z*{FHbMcqXQ*4A(}zG${xknK#Hr#fofpX-gqaOzY)d?nzAUTY3F-9%G+J;!%rmaqY@dqaA9sesZp z*%8_=h(%dOSVe}pGjC}^-=Mp@gZ{pB_wpU+E=xJI zJljrEH@h95CByhYh7V-;K!%?u!)ke(4Xdhw%LtXrmQhwMwaAIlh7t>HTapZELOq|z zF`P;o%U~QUaHu>bTUO>|#F%h*@{;@zX-jFiLj { + describe('network processors', () => { + let networkIndexData: InsertedEvents; + + after(async () => { + await resolver.deleteData(networkIndexData); + }); + + it('handles events without the `network.protocol` field being defined', async () => { + const eventWithoutNetworkObject = generator.generateEvent(); + // ensure that `network.protocol` does not exist in the event to test that the pipeline handles those type of events + delete eventWithoutNetworkObject.network; + + // this call will fail if the pipeline fails + networkIndexData = await resolver.insertEvents([eventWithoutNetworkObject], networkIndex); + const eventWithBothIPs = await searchForID( + networkIndexData.eventsInfo[0]._id + ); + + // ensure that the event was inserted into ES + expect(eventWithBothIPs.body.hits.hits[0]._source.event?.id).to.be( + eventWithoutNetworkObject.event?.id + ); + }); + }); + + describe('dns processor', () => { + before(async () => { + await esArchiver.load('endpoint/pipeline/dns', { useCreate: true }); + }); + + after(async () => { + await deleteEventsStream(getService); + }); + + it('does not set dns.question.type if it is already populated', async () => { + // this id comes from the es archive file endpoint/pipeline/dns + const id = 'LrLSOVHVsFY94TAi++++++eF'; + const { body }: { body: ResolverPaginatedEvents } = await supertest + .post(`/api/endpoint/resolver/events?limit=1`) + .set('kbn-xsrf', 'xxx') + .send({ + filter: `event.id:"${id}"`, + }) + .expect(200); + expect(body.events.length).to.eql(1); + expect((body.events[0] as SafeEndpointEvent).dns?.question?.name).to.eql('www.google.com'); + expect((body.events[0] as SafeEndpointEvent).dns?.question?.type).to.eql('INVALID_VALUE'); + }); + + it('sets dns.question.type if it is not populated', async () => { + // this id comes from the es archive file endpoint/pipeline/dns + const id = 'LrLSOVHVsFY94TAi++++++eP'; + const { body }: { body: ResolverPaginatedEvents } = await supertest + .post(`/api/endpoint/resolver/events?limit=1`) + .set('kbn-xsrf', 'xxx') + .send({ + filter: `event.id:"${id}"`, + }) + .expect(200); + expect(body.events.length).to.eql(1); + expect((body.events[0] as SafeEndpointEvent).dns?.question?.name).to.eql('www.aol.com'); + // This value is parsed out of the message field in the event. type 28 = AAAA + expect((body.events[0] as SafeEndpointEvent).dns?.question?.type).to.eql('AAAA'); + }); + }); + describe('ingested processor', () => { let event: Event; let genData: InsertedEvents; @@ -92,6 +165,7 @@ export default function ({ getService }: FtrProviderContext) { const eventWithSourceOnly = generator.generateEvent({ extensions: { source: { ip: '8.8.8.8' } }, }); + networkIndexData = await resolver.insertEvents( [eventWithBothIPs, eventWithSourceOnly], networkIndex From a66259aaa10f51f27583788d5f0711e9983e5c59 Mon Sep 17 00:00:00 2001 From: Michail Yasonik Date: Mon, 5 Oct 2020 10:16:06 -0400 Subject: [PATCH 07/49] PR template a11y checklist item improvement (#79243) --- .github/PULL_REQUEST_TEMPLATE.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index 534b1cea6242f..c366819c49dde 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -9,8 +9,9 @@ Delete any items that are not applicable to this PR. - [ ] Any text added follows [EUI's writing guidelines](https://elastic.github.io/eui/#/guidelines/writing), uses sentence case text and includes [i18n support](https://github.com/elastic/kibana/blob/master/packages/kbn-i18n/README.md) - [ ] [Documentation](https://www.elastic.co/guide/en/kibana/master/development-documentation.html) was added for features that require explanation or tutorials - [ ] [Unit or functional tests](https://www.elastic.co/guide/en/kibana/master/development-tests.html) were updated or added to match the most common scenarios -- [ ] This was checked for [keyboard-only and screenreader accessibility](https://developer.mozilla.org/en-US/docs/Learn/Tools_and_testing/Cross_browser_testing/Accessibility#Accessibility_testing_checklist) -- [ ] This renders correctly on smaller devices using a responsive layout. (You can test this [in your browser](https://www.browserstack.com/guide/responsive-testing-on-local-server) +- [ ] Any UI touched in this PR is usable by keyboard only (learn more about [keyboard accessibility](https://webaim.org/techniques/keyboard/)) +- [ ] Any UI touched in this PR does not create any new axe failures (run axe in browser: [FF](https://addons.mozilla.org/en-US/firefox/addon/axe-devtools/), [Chrome](https://chrome.google.com/webstore/detail/axe-web-accessibility-tes/lhdoppojpmngadmnindnejefpokejbdd?hl=en-US)) +- [ ] This renders correctly on smaller devices using a responsive layout. (You can test this [in your browser](https://www.browserstack.com/guide/responsive-testing-on-local-server)) - [ ] This was checked for [cross-browser compatibility](https://www.elastic.co/support/matrix#matrix_browsers) ### For maintainers From fdc6562350a83511da49c2beaafee17740a1a655 Mon Sep 17 00:00:00 2001 From: MadameSheema Date: Mon, 5 Oct 2020 16:17:48 +0200 Subject: [PATCH 08/49] adds EQL sequence rule test (#79287) Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- .../alerts_detection_rules_eql.spec.ts | 42 ++++++++++++++++++- .../security_solution/cypress/objects/rule.ts | 19 +++++++++ .../cypress/tasks/create_new_rule.ts | 1 - 3 files changed, 60 insertions(+), 2 deletions(-) diff --git a/x-pack/plugins/security_solution/cypress/integration/alerts_detection_rules_eql.spec.ts b/x-pack/plugins/security_solution/cypress/integration/alerts_detection_rules_eql.spec.ts index ca7832603f13d..a7ddba94bffd2 100644 --- a/x-pack/plugins/security_solution/cypress/integration/alerts_detection_rules_eql.spec.ts +++ b/x-pack/plugins/security_solution/cypress/integration/alerts_detection_rules_eql.spec.ts @@ -4,7 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ -import { eqlRule, indexPatterns } from '../objects/rule'; +import { eqlRule, eqlSequenceRule, indexPatterns } from '../objects/rule'; import { ALERT_RULE_METHOD, @@ -85,6 +85,7 @@ const expectedMitre = eqlRule.mitre .join(''); const expectedNumberOfRules = 1; const expectedNumberOfAlerts = 7; +const expectedNumberOfSequenceAlerts = 1; describe('Detection rules, EQL', () => { before(() => { @@ -172,4 +173,43 @@ describe('Detection rules, EQL', () => { cy.get(ALERT_RULE_SEVERITY).first().should('have.text', eqlRule.severity.toLowerCase()); cy.get(ALERT_RULE_RISK_SCORE).first().should('have.text', eqlRule.riskScore); }); + + it('Creates and activates a new EQL rule with a sequence', () => { + loginAndWaitForPageWithoutDateRange(DETECTIONS_URL); + waitForAlertsPanelToBeLoaded(); + waitForAlertsIndexToBeCreated(); + goToManageAlertsDetectionRules(); + waitForLoadElasticPrebuiltDetectionRulesTableToBeLoaded(); + goToCreateNewRule(); + selectEqlRuleType(); + fillDefineEqlRuleAndContinue(eqlSequenceRule); + fillAboutRuleAndContinue(eqlSequenceRule); + fillScheduleRuleAndContinue(eqlSequenceRule); + createAndActivateRule(); + + cy.get(CUSTOM_RULES_BTN).should('have.text', 'Custom rules (1)'); + + changeToThreeHundredRowsPerPage(); + waitForRulesToBeLoaded(); + + cy.get(RULES_TABLE).then(($table) => { + cy.wrap($table.find(RULES_ROW).length).should('eql', expectedNumberOfRules); + }); + + filterByCustomRules(); + goToRuleDetails(); + refreshPage(); + waitForTheRuleToBeExecuted(); + + cy.get(NUMBER_OF_ALERTS) + .invoke('text') + .then((numberOfAlertsText) => { + cy.wrap(parseInt(numberOfAlertsText, 10)).should('eql', expectedNumberOfSequenceAlerts); + }); + cy.get(ALERT_RULE_NAME).first().should('have.text', eqlSequenceRule.name); + cy.get(ALERT_RULE_VERSION).first().should('have.text', '1'); + cy.get(ALERT_RULE_METHOD).first().should('have.text', 'eql'); + cy.get(ALERT_RULE_SEVERITY).first().should('have.text', eqlSequenceRule.severity.toLowerCase()); + cy.get(ALERT_RULE_RISK_SCORE).first().should('have.text', eqlSequenceRule.riskScore); + }); }); diff --git a/x-pack/plugins/security_solution/cypress/objects/rule.ts b/x-pack/plugins/security_solution/cypress/objects/rule.ts index f375eccd902c4..0bb4c8e356091 100644 --- a/x-pack/plugins/security_solution/cypress/objects/rule.ts +++ b/x-pack/plugins/security_solution/cypress/objects/rule.ts @@ -230,6 +230,25 @@ export const eqlRule: CustomRule = { lookBack, }; +export const eqlSequenceRule: CustomRule = { + customQuery: + 'sequence with maxspan=30s\ + [any where process.name == "which"]\ + [any where process.name == "xargs"]', + name: 'New EQL Sequence Rule', + description: 'New EQL rule description.', + severity: 'High', + riskScore: '17', + tags: ['test', 'newRule'], + referenceUrls: ['https://www.google.com/', 'https://elastic.co/'], + falsePositivesExamples: ['False1', 'False2'], + mitre: [mitre1, mitre2], + note: '# test markdown', + timelineId: '0162c130-78be-11ea-9718-118a926974a4', + runsEvery, + lookBack, +}; + export const indexPatterns = [ 'apm-*-transaction*', 'auditbeat-*', diff --git a/x-pack/plugins/security_solution/cypress/tasks/create_new_rule.ts b/x-pack/plugins/security_solution/cypress/tasks/create_new_rule.ts index 914566a13a9a9..079c18b6abe6e 100644 --- a/x-pack/plugins/security_solution/cypress/tasks/create_new_rule.ts +++ b/x-pack/plugins/security_solution/cypress/tasks/create_new_rule.ts @@ -223,7 +223,6 @@ export const fillDefineThresholdRuleAndContinue = (rule: ThresholdRule) => { export const fillDefineEqlRuleAndContinue = (rule: CustomRule) => { cy.get(EQL_QUERY_INPUT).type(rule.customQuery); - cy.get(EQL_QUERY_INPUT).invoke('text').should('eq', rule.customQuery); cy.get(DEFINE_CONTINUE_BUTTON).should('exist').click({ force: true }); cy.get(EQL_QUERY_INPUT).should('not.exist'); From 13a737e67530d98afb3bb0384968205e522392a6 Mon Sep 17 00:00:00 2001 From: Nathan L Smith Date: Mon, 5 Oct 2020 09:18:24 -0500 Subject: [PATCH 09/49] Storybook and Jest cleanup (#79305) * Fix all broken stories * Get rid of all Jest warnings * Remove `@ts-expect-error`s added for JSON imports and fix their type errors * Convert some stories to [Component Story Format](https://storybook.js.org/docs/react/api/csf) * Replace story for Service Map with many external services with one for the popover with many external services * Center and fit cytoscape maps in stories * Rename some files to snake_case --- .../ErrorCountAlertTrigger/index.stories.tsx | 55 +- .../components/alerting/fields.test.tsx | 2 +- .../apm/public/components/alerting/fields.tsx | 4 +- .../List/__test__/List.test.tsx | 1 - .../__test__/__snapshots__/List.test.tsx.snap | 60 +- .../List/__test__/props.json | 16 +- .../__stories__/CoreVitals.stories.tsx | 152 +- .../ServiceMap/Popover/Popover.stories.tsx | 176 +- .../Popover/service_stats_list.stories.tsx | 63 + .../__stories__/Cytoscape.stories.tsx | 623 +++-- .../CytoscapeExampleData.stories.tsx | 275 --- .../app/ServiceMap/__stories__/centerer.tsx | 27 + .../cytoscape_example_data.stories.tsx | 228 ++ .../example_grouped_connections.json | 875 +++++++ .../example_response_one_domain_many_ips.json | 2122 ----------------- ...yBanner.test.tsx => empty_banner.test.tsx} | 4 +- ...sx.snap => service_overview.test.tsx.snap} | 0 ...iew.test.tsx => service_overview.test.tsx} | 32 +- ...Preview.test.tsx => link_preview.test.tsx} | 4 +- .../CustomizeUI/CustomLink/index.test.tsx | 9 +- ...TraceLink.test.tsx => trace_link.test.tsx} | 23 +- .../WaterfallContainer.stories.tsx | 159 +- .../TransactionList.stories.tsx | 58 +- .../shared/ApmHeader/ApmHeader.stories.tsx | 30 - .../shared/ApmHeader/apm_header.stories.tsx | 49 + ...tePicker.test.tsx => date_picker.test.tsx} | 14 +- .../LicensePrompt/LicensePrompt.stories.tsx | 40 +- ...discover_transaction_button.test.tsx.snap} | 0 ...x => discover_transaction_button.test.tsx} | 8 +- ...Transaction.json => mock_transaction.json} | 5 +- ... => anomaly_detection_setup_link.test.tsx} | 4 +- ...t.test.tsx => url_params_context.test.tsx} | 16 +- ...t.tsx => use_fetcher.integration.test.tsx} | 10 +- .../plugins/apm/public/utils/testHelpers.tsx | 6 +- .../service_map/group_resource_nodes.test.ts | 8 +- .../annotations/__fixtures__/no_versions.json | 2 +- .../annotations/__fixtures__/one_version.json | 2 +- .../lib/services/annotations/index.test.ts | 40 +- 38 files changed, 2010 insertions(+), 3192 deletions(-) create mode 100644 x-pack/plugins/apm/public/components/app/ServiceMap/Popover/service_stats_list.stories.tsx delete mode 100644 x-pack/plugins/apm/public/components/app/ServiceMap/__stories__/CytoscapeExampleData.stories.tsx create mode 100644 x-pack/plugins/apm/public/components/app/ServiceMap/__stories__/centerer.tsx create mode 100644 x-pack/plugins/apm/public/components/app/ServiceMap/__stories__/cytoscape_example_data.stories.tsx create mode 100644 x-pack/plugins/apm/public/components/app/ServiceMap/__stories__/example_grouped_connections.json delete mode 100644 x-pack/plugins/apm/public/components/app/ServiceMap/__stories__/example_response_one_domain_many_ips.json rename x-pack/plugins/apm/public/components/app/ServiceMap/{EmptyBanner.test.tsx => empty_banner.test.tsx} (95%) rename x-pack/plugins/apm/public/components/app/ServiceOverview/__test__/__snapshots__/{ServiceOverview.test.tsx.snap => service_overview.test.tsx.snap} (100%) rename x-pack/plugins/apm/public/components/app/ServiceOverview/__test__/{ServiceOverview.test.tsx => service_overview.test.tsx} (87%) rename x-pack/plugins/apm/public/components/app/Settings/CustomizeUI/CustomLink/CustomLinkFlyout/{LinkPreview.test.tsx => link_preview.test.tsx} (97%) rename x-pack/plugins/apm/public/components/app/TraceLink/{__test__/TraceLink.test.tsx => trace_link.test.tsx} (83%) delete mode 100644 x-pack/plugins/apm/public/components/shared/ApmHeader/ApmHeader.stories.tsx create mode 100644 x-pack/plugins/apm/public/components/shared/ApmHeader/apm_header.stories.tsx rename x-pack/plugins/apm/public/components/shared/DatePicker/{__test__/DatePicker.test.tsx => date_picker.test.tsx} (91%) rename x-pack/plugins/apm/public/components/shared/Links/DiscoverLinks/__test__/__snapshots__/{DiscoverTransactionButton.test.tsx.snap => discover_transaction_button.test.tsx.snap} (100%) rename x-pack/plugins/apm/public/components/shared/Links/DiscoverLinks/__test__/{DiscoverTransactionButton.test.tsx => discover_transaction_button.test.tsx} (78%) rename x-pack/plugins/apm/public/components/shared/Links/DiscoverLinks/__test__/{mockTransaction.json => mock_transaction.json} (98%) rename x-pack/plugins/apm/public/components/shared/Links/apm/{AnomalyDetectionSetupLink.test.tsx => anomaly_detection_setup_link.test.tsx} (96%) rename x-pack/plugins/apm/public/context/UrlParamsContext/{__tests__/UrlParamsContext.test.tsx => url_params_context.test.tsx} (94%) rename x-pack/plugins/apm/public/hooks/{useFetcher.integration.test.tsx => use_fetcher.integration.test.tsx} (94%) diff --git a/x-pack/plugins/apm/public/components/alerting/ErrorCountAlertTrigger/index.stories.tsx b/x-pack/plugins/apm/public/components/alerting/ErrorCountAlertTrigger/index.stories.tsx index c30cef7210a43..1a565ab8708bc 100644 --- a/x-pack/plugins/apm/public/components/alerting/ErrorCountAlertTrigger/index.stories.tsx +++ b/x-pack/plugins/apm/public/components/alerting/ErrorCountAlertTrigger/index.stories.tsx @@ -4,8 +4,8 @@ * you may not use this file except in compliance with the Elastic License. */ -import { storiesOf } from '@storybook/react'; import React from 'react'; +import { MemoryRouter } from 'react-router-dom'; import { ErrorCountAlertTrigger } from '.'; import { ApmPluginContextValue } from '../../../context/ApmPluginContext'; import { @@ -13,32 +13,35 @@ import { MockApmPluginContextWrapper, } from '../../../context/ApmPluginContext/MockApmPluginContext'; -storiesOf('app/ErrorCountAlertTrigger', module).add( - 'example', - () => { - const params = { - threshold: 2, - window: '5m', - }; - - return ( +export default { + title: 'app/ErrorCountAlertTrigger', + component: ErrorCountAlertTrigger, + decorators: [ + (Story: React.ComponentClass) => ( -
- undefined} - setAlertProperty={() => undefined} - /> -
+ +
+ +
+
- ); - }, - { - info: { - propTablesExclude: [ErrorCountAlertTrigger, MockApmPluginContextWrapper], - source: false, - }, - } -); + ), + ], +}; + +export function Example() { + const params = { + threshold: 2, + window: '5m', + }; + + return ( + undefined} + setAlertProperty={() => undefined} + /> + ); +} diff --git a/x-pack/plugins/apm/public/components/alerting/fields.test.tsx b/x-pack/plugins/apm/public/components/alerting/fields.test.tsx index 7ffb46d3dda49..5af05cedf7fa3 100644 --- a/x-pack/plugins/apm/public/components/alerting/fields.test.tsx +++ b/x-pack/plugins/apm/public/components/alerting/fields.test.tsx @@ -9,7 +9,7 @@ import { act, fireEvent, render } from '@testing-library/react'; import { expectTextsInDocument } from '../../utils/testHelpers'; describe('alerting fields', () => { - describe('Service Fiels', () => { + describe('Service Field', () => { it('renders with value', () => { const component = render(); expectTextsInDocument(component, ['foo']); diff --git a/x-pack/plugins/apm/public/components/alerting/fields.tsx b/x-pack/plugins/apm/public/components/alerting/fields.tsx index aac64649546cc..858604d2baa2a 100644 --- a/x-pack/plugins/apm/public/components/alerting/fields.tsx +++ b/x-pack/plugins/apm/public/components/alerting/fields.tsx @@ -43,7 +43,7 @@ export function EnvironmentField({ })} > List', () => { - {/* @ts-expect-error invalid json props */} diff --git a/x-pack/plugins/apm/public/components/app/ErrorGroupOverview/List/__test__/__snapshots__/List.test.tsx.snap b/x-pack/plugins/apm/public/components/app/ErrorGroupOverview/List/__test__/__snapshots__/List.test.tsx.snap index 5183432b4ae0f..f45b4913243ee 100644 --- a/x-pack/plugins/apm/public/components/app/ErrorGroupOverview/List/__test__/__snapshots__/List.test.tsx.snap +++ b/x-pack/plugins/apm/public/components/app/ErrorGroupOverview/List/__test__/__snapshots__/List.test.tsx.snap @@ -454,30 +454,38 @@ exports[`ErrorGroupOverview -> List should render with data 1`] = ` Object { "culprit": "elasticapm.contrib.django.client.capture", "groupId": "a0ce2c8978ef92cdf2ff163ae28576ee", + "handled": true, "latestOccurrenceAt": "2018-01-10T10:06:37.561Z", "message": "About to blow up!", "occurrenceCount": 75, + "type": "AssertionError", }, Object { "culprit": "opbeans.views.oopsie", "groupId": "f3ac95493913cc7a3cfec30a19d2120a", + "handled": true, "latestOccurrenceAt": "2018-01-10T10:06:37.630Z", "message": "AssertionError: ", "occurrenceCount": 75, + "type": "AssertionError", }, Object { "culprit": "opbeans.tasks.update_stats", "groupId": "e90863d04b7a692435305f09bbe8c840", + "handled": true, "latestOccurrenceAt": "2018-01-10T10:06:36.859Z", "message": "AssertionError: Bad luck!", "occurrenceCount": 24, + "type": "AssertionError", }, Object { "culprit": "opbeans.views.customer", "groupId": "8673d8bf7a032e387c101bafbab0d2bc", + "handled": true, "latestOccurrenceAt": "2018-01-10T10:06:13.211Z", "message": "Customer with ID 8517 not found", "occurrenceCount": 15, + "type": "AssertionError", }, ] } @@ -818,7 +826,7 @@ exports[`ErrorGroupOverview -> List should render with data 1`] = ` query={ Object { "end": "2018-01-10T10:06:41.050Z", - "kuery": "error.exception.type:undefined", + "kuery": "error.exception.type:AssertionError", "page": 0, "serviceName": "opbeans-python", "start": "2018-01-10T09:51:41.050Z", @@ -826,16 +834,21 @@ exports[`ErrorGroupOverview -> List should render with data 1`] = ` } } serviceName="opbeans-python" + title="AssertionError" > + title="AssertionError" + > + AssertionError + @@ -1052,7 +1065,7 @@ exports[`ErrorGroupOverview -> List should render with data 1`] = ` query={ Object { "end": "2018-01-10T10:06:41.050Z", - "kuery": "error.exception.type:undefined", + "kuery": "error.exception.type:AssertionError", "page": 0, "serviceName": "opbeans-python", "start": "2018-01-10T09:51:41.050Z", @@ -1060,16 +1073,21 @@ exports[`ErrorGroupOverview -> List should render with data 1`] = ` } } serviceName="opbeans-python" + title="AssertionError" > + title="AssertionError" + > + AssertionError + @@ -1286,7 +1304,7 @@ exports[`ErrorGroupOverview -> List should render with data 1`] = ` query={ Object { "end": "2018-01-10T10:06:41.050Z", - "kuery": "error.exception.type:undefined", + "kuery": "error.exception.type:AssertionError", "page": 0, "serviceName": "opbeans-python", "start": "2018-01-10T09:51:41.050Z", @@ -1294,16 +1312,21 @@ exports[`ErrorGroupOverview -> List should render with data 1`] = ` } } serviceName="opbeans-python" + title="AssertionError" > + title="AssertionError" + > + AssertionError + @@ -1520,7 +1543,7 @@ exports[`ErrorGroupOverview -> List should render with data 1`] = ` query={ Object { "end": "2018-01-10T10:06:41.050Z", - "kuery": "error.exception.type:undefined", + "kuery": "error.exception.type:AssertionError", "page": 0, "serviceName": "opbeans-python", "start": "2018-01-10T09:51:41.050Z", @@ -1528,16 +1551,21 @@ exports[`ErrorGroupOverview -> List should render with data 1`] = ` } } serviceName="opbeans-python" + title="AssertionError" > + title="AssertionError" + > + AssertionError + diff --git a/x-pack/plugins/apm/public/components/app/ErrorGroupOverview/List/__test__/props.json b/x-pack/plugins/apm/public/components/app/ErrorGroupOverview/List/__test__/props.json index 431a6c71b103b..ad49cd048aee3 100644 --- a/x-pack/plugins/apm/public/components/app/ErrorGroupOverview/List/__test__/props.json +++ b/x-pack/plugins/apm/public/components/app/ErrorGroupOverview/List/__test__/props.json @@ -2,31 +2,39 @@ "items": [ { "message": "About to blow up!", + "type": "AssertionError", "occurrenceCount": 75, "culprit": "elasticapm.contrib.django.client.capture", "groupId": "a0ce2c8978ef92cdf2ff163ae28576ee", - "latestOccurrenceAt": "2018-01-10T10:06:37.561Z" + "latestOccurrenceAt": "2018-01-10T10:06:37.561Z", + "handled": true }, { "message": "AssertionError: ", + "type": "AssertionError", "occurrenceCount": 75, "culprit": "opbeans.views.oopsie", "groupId": "f3ac95493913cc7a3cfec30a19d2120a", - "latestOccurrenceAt": "2018-01-10T10:06:37.630Z" + "latestOccurrenceAt": "2018-01-10T10:06:37.630Z", + "handled": true }, { "message": "AssertionError: Bad luck!", + "type": "AssertionError", "occurrenceCount": 24, "culprit": "opbeans.tasks.update_stats", "groupId": "e90863d04b7a692435305f09bbe8c840", - "latestOccurrenceAt": "2018-01-10T10:06:36.859Z" + "latestOccurrenceAt": "2018-01-10T10:06:36.859Z", + "handled": true }, { "message": "Customer with ID 8517 not found", + "type": "AssertionError", "occurrenceCount": 15, "culprit": "opbeans.views.customer", "groupId": "8673d8bf7a032e387c101bafbab0d2bc", - "latestOccurrenceAt": "2018-01-10T10:06:13.211Z" + "latestOccurrenceAt": "2018-01-10T10:06:13.211Z", + "handled": true } ], "location": { diff --git a/x-pack/plugins/apm/public/components/app/RumDashboard/CoreVitals/__stories__/CoreVitals.stories.tsx b/x-pack/plugins/apm/public/components/app/RumDashboard/CoreVitals/__stories__/CoreVitals.stories.tsx index a611df00f1e65..6ab75469e2b10 100644 --- a/x-pack/plugins/apm/public/components/app/RumDashboard/CoreVitals/__stories__/CoreVitals.stories.tsx +++ b/x-pack/plugins/apm/public/components/app/RumDashboard/CoreVitals/__stories__/CoreVitals.stories.tsx @@ -4,90 +4,78 @@ * you may not use this file except in compliance with the Elastic License. */ -import { storiesOf } from '@storybook/react'; -import React from 'react'; +import React, { ComponentType } from 'react'; +import { IntlProvider } from 'react-intl'; +import { Observable } from 'rxjs'; +import { CoreStart } from 'src/core/public'; +import { createKibanaReactContext } from '../../../../../../../../../src/plugins/kibana_react/public'; import { EuiThemeProvider } from '../../../../../../../observability/public'; import { CoreVitalItem } from '../CoreVitalItem'; import { LCP_LABEL } from '../translations'; -storiesOf('app/RumDashboard/WebCoreVitals', module) - .addDecorator((storyFn) => {storyFn()}) - .add( - 'Basic', - () => { - return ( - - ); - }, - { - info: { - propTables: false, - source: false, - }, - } - ) - .add( - '50% Good', - () => { - return ( - - ); - }, - { - info: { - propTables: false, - source: false, - }, - } - ) - .add( - '100% Bad', - () => { - return ( - - ); - }, - { - info: { - propTables: false, - source: false, - }, - } - ) - .add( - '100% Average', - () => { - return ( - - ); - }, - { - info: { - propTables: false, - source: false, - }, - } +const KibanaReactContext = createKibanaReactContext(({ + uiSettings: { get: () => {}, get$: () => new Observable() }, +} as unknown) as Partial); + +export default { + title: 'app/RumDashboard/CoreVitalItem', + component: CoreVitalItem, + decorators: [ + (Story: ComponentType) => ( + + + + + + + + ), + ], +}; + +export function Basic() { + return ( + + ); +} + +export function FiftyPercentGood() { + return ( + + ); +} + +export function OneHundredPercentBad() { + return ( + + ); +} + +export function OneHundredPercentAverage() { + return ( + ); +} diff --git a/x-pack/plugins/apm/public/components/app/ServiceMap/Popover/Popover.stories.tsx b/x-pack/plugins/apm/public/components/app/ServiceMap/Popover/Popover.stories.tsx index 55a0bddcc7818..70eb5eaf8e576 100644 --- a/x-pack/plugins/apm/public/components/app/ServiceMap/Popover/Popover.stories.tsx +++ b/x-pack/plugins/apm/public/components/app/ServiceMap/Popover/Popover.stories.tsx @@ -4,132 +4,92 @@ * you may not use this file except in compliance with the Elastic License. */ -import { storiesOf } from '@storybook/react'; import cytoscape from 'cytoscape'; import { HttpSetup } from 'kibana/public'; -import React from 'react'; +import React, { ComponentType } from 'react'; import { EuiThemeProvider } from '../../../../../../observability/public'; import { MockApmPluginContextWrapper } from '../../../../context/ApmPluginContext/MockApmPluginContext'; import { MockUrlParamsContextProvider } from '../../../../context/UrlParamsContext/MockUrlParamsContextProvider'; import { createCallApmApi } from '../../../../services/rest/createCallApmApi'; import { CytoscapeContext } from '../Cytoscape'; import { Popover } from './'; -import { ServiceStatsList } from './ServiceStatsList'; +import exampleGroupedConnectionsData from '../__stories__/example_grouped_connections.json'; -storiesOf('app/ServiceMap/Popover', module) - .addDecorator((storyFn) => { +export default { + title: 'app/ServiceMap/Popover', + component: Popover, + decorators: [ + (Story: ComponentType) => { + const httpMock = ({ + get: async () => ({ + avgCpuUsage: 0.32809666568309237, + avgErrorRate: 0.556068173242986, + avgMemoryUsage: 0.5504868173242986, + transactionStats: { + avgRequestsPerMinute: 164.47222031860858, + avgTransactionDuration: 61634.38905590272, + }, + }), + } as unknown) as HttpSetup; + + createCallApmApi(httpMock); + + return ( + + + +
+ +
+
+
+
+ ); + }, + ], +}; + +export function Example() { + return ; +} +Example.decorators = [ + (Story: ComponentType) => { const node = { data: { id: 'example service', 'service.name': 'example service' }, }; - const cy = cytoscape({ elements: [node] }); - const httpMock = ({ - get: async () => ({ - avgCpuUsage: 0.32809666568309237, - avgErrorRate: 0.556068173242986, - avgMemoryUsage: 0.5504868173242986, - transactionStats: { - avgRequestsPerMinute: 164.47222031860858, - avgTransactionDuration: 61634.38905590272, - }, - }), - } as unknown) as HttpSetup; - createCallApmApi(httpMock); + const cy = cytoscape({ elements: [node] }); setTimeout(() => { cy.$id('example service').select(); }, 0); return ( - - - - -
{storyFn()}
-
-
-
-
+ + + ); - }) - .add( - 'example', - () => { - return ; - }, - { - info: { - propTablesExclude: [ - CytoscapeContext.Provider, - EuiThemeProvider, - MockApmPluginContextWrapper, - MockUrlParamsContextProvider, - Popover, - ], - source: false, - }, - } - ); + }, +]; + +export function Externals() { + return ; +} +Externals.decorators = [ + (Story: ComponentType) => { + const node = { + data: exampleGroupedConnectionsData, + }; + const cy = cytoscape({ elements: [node] }); + + setTimeout(() => { + cy.$id(exampleGroupedConnectionsData.id).select(); + }, 0); -storiesOf('app/ServiceMap/Popover/ServiceStatsList', module) - .addDecorator((storyFn) => {storyFn()}) - .add( - 'example', - () => ( - - ), - { info: { propTablesExclude: [EuiThemeProvider] } } - ) - .add( - 'loading', - () => ( - - ), - { info: { propTablesExclude: [EuiThemeProvider] } } - ) - .add( - 'some null values', - () => ( - - ), - { info: { propTablesExclude: [EuiThemeProvider] } } - ) - .add( - 'all null values', - () => ( - - ), - { info: { propTablesExclude: [EuiThemeProvider] } } - ); + return ( + + + + ); + }, +]; diff --git a/x-pack/plugins/apm/public/components/app/ServiceMap/Popover/service_stats_list.stories.tsx b/x-pack/plugins/apm/public/components/app/ServiceMap/Popover/service_stats_list.stories.tsx new file mode 100644 index 0000000000000..052f9e9515751 --- /dev/null +++ b/x-pack/plugins/apm/public/components/app/ServiceMap/Popover/service_stats_list.stories.tsx @@ -0,0 +1,63 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import React, { ComponentType } from 'react'; +import { EuiThemeProvider } from '../../../../../../observability/public'; +import { ServiceStatsList } from './ServiceStatsList'; + +export default { + title: 'app/ServiceMap/Popover/ServiceStatsList', + component: ServiceStatsList, + decorators: [ + (Story: ComponentType) => ( + + + + ), + ], +}; + +export function Example() { + return ( + + ); +} + +export function SomeNullValues() { + return ( + + ); +} + +export function AllNullValues() { + return ( + + ); +} diff --git a/x-pack/plugins/apm/public/components/app/ServiceMap/__stories__/Cytoscape.stories.tsx b/x-pack/plugins/apm/public/components/app/ServiceMap/__stories__/Cytoscape.stories.tsx index 5b50eb953d896..ee334e2ae9567 100644 --- a/x-pack/plugins/apm/public/components/app/ServiceMap/__stories__/Cytoscape.stories.tsx +++ b/x-pack/plugins/apm/public/components/app/ServiceMap/__stories__/Cytoscape.stories.tsx @@ -5,332 +5,315 @@ */ import { EuiCard, EuiFlexGroup, EuiFlexItem } from '@elastic/eui'; -import { storiesOf } from '@storybook/react'; import cytoscape from 'cytoscape'; -import React from 'react'; +import React, { ComponentType } from 'react'; +import { EuiThemeProvider } from '../../../../../../observability/public'; import { Cytoscape } from '../Cytoscape'; import { iconForNode } from '../icons'; -import { EuiThemeProvider } from '../../../../../../observability/public'; +import { Centerer } from './centerer'; + +export default { + title: 'app/ServiceMap/Cytoscape', + component: Cytoscape, + decorators: [ + (Story: ComponentType) => ( + + + + ), + ], +}; + +export function Example() { + const elements: cytoscape.ElementDefinition[] = [ + { + data: { + id: 'opbeans-python', + 'service.name': 'opbeans-python', + 'agent.name': 'python', + }, + }, + { + data: { + id: 'opbeans-node', + 'service.name': 'opbeans-node', + 'agent.name': 'nodejs', + }, + }, + { + data: { + id: 'opbeans-ruby', + 'service.name': 'opbeans-ruby', + 'agent.name': 'ruby', + }, + }, + { data: { source: 'opbeans-python', target: 'opbeans-node' } }, + { + data: { + bidirectional: true, + source: 'opbeans-python', + target: 'opbeans-ruby', + }, + }, + ]; + const serviceName = 'opbeans-python'; -storiesOf('app/ServiceMap/Cytoscape', module) - .addDecorator((storyFn) => {storyFn()}) - .add( - 'example', - () => { - const elements: cytoscape.ElementDefinition[] = [ - { - data: { - id: 'opbeans-python', - 'service.name': 'opbeans-python', - 'agent.name': 'python', - }, - }, - { - data: { - id: 'opbeans-node', - 'service.name': 'opbeans-node', - 'agent.name': 'nodejs', - }, - }, - { - data: { - id: 'opbeans-ruby', - 'service.name': 'opbeans-ruby', - 'agent.name': 'ruby', - }, - }, - { data: { source: 'opbeans-python', target: 'opbeans-node' } }, - { - data: { - bidirectional: true, - source: 'opbeans-python', - target: 'opbeans-ruby', - }, - }, - ]; - const height = 300; - const serviceName = 'opbeans-python'; - return ( - - ); - }, - { - info: { - propTables: false, - source: false, - }, - } + return ( + + + ); +} -storiesOf('app/ServiceMap/Cytoscape', module).add( - 'node icons', - () => { - const cy = cytoscape(); - const elements = [ - { data: { id: 'default' } }, - { - data: { - id: 'aws', - 'span.type': 'aws', - 'span.subtype': 'servicename', - }, - }, - { data: { id: 'cache', 'span.type': 'cache' } }, - { data: { id: 'database', 'span.type': 'db' } }, - { - data: { - id: 'cassandra', - 'span.type': 'db', - 'span.subtype': 'cassandra', - }, - }, - { - data: { - id: 'elasticsearch', - 'span.type': 'db', - 'span.subtype': 'elasticsearch', - }, - }, - { - data: { - id: 'mongodb', - 'span.type': 'db', - 'span.subtype': 'mongodb', - }, - }, - { - data: { - id: 'mysql', - 'span.type': 'db', - 'span.subtype': 'mysql', - }, - }, - { - data: { - id: 'postgresql', - 'span.type': 'db', - 'span.subtype': 'postgresql', - }, - }, - { - data: { - id: 'redis', - 'span.type': 'db', - 'span.subtype': 'redis', - }, - }, - { data: { id: 'external', 'span.type': 'external' } }, - { data: { id: 'ext', 'span.type': 'ext' } }, - { - data: { - id: 'graphql', - 'span.type': 'external', - 'span.subtype': 'graphql', - }, - }, - { - data: { - id: 'grpc', - 'span.type': 'external', - 'span.subtype': 'grpc', - }, - }, - { - data: { - id: 'websocket', - 'span.type': 'external', - 'span.subtype': 'websocket', - }, - }, - { data: { id: 'messaging', 'span.type': 'messaging' } }, - { - data: { - id: 'jms', - 'span.type': 'messaging', - 'span.subtype': 'jms', - }, - }, - { - data: { - id: 'kafka', - 'span.type': 'messaging', - 'span.subtype': 'kafka', - }, - }, - { data: { id: 'template', 'span.type': 'template' } }, - { - data: { - id: 'handlebars', - 'span.type': 'template', - 'span.subtype': 'handlebars', - }, - }, - { - data: { - id: 'dark', - 'service.name': 'dark service', - 'agent.name': 'dark', - }, - }, - { - data: { - id: 'dotnet', - 'service.name': 'dotnet service', - 'agent.name': 'dotnet', - }, - }, - { - data: { - id: 'dotNet', - 'service.name': 'dotNet service', - 'agent.name': 'dotNet', - }, - }, - { - data: { - id: 'go', - 'service.name': 'go service', - 'agent.name': 'go', - }, - }, - { - data: { - id: 'java', - 'service.name': 'java service', - 'agent.name': 'java', - }, - }, - { - data: { - id: 'RUM (js-base)', - 'service.name': 'RUM service', - 'agent.name': 'js-base', - }, - }, - { - data: { - id: 'RUM (rum-js)', - 'service.name': 'RUM service', - 'agent.name': 'rum-js', - }, - }, - { - data: { - id: 'nodejs', - 'service.name': 'nodejs service', - 'agent.name': 'nodejs', - }, - }, - { - data: { - id: 'php', - 'service.name': 'php service', - 'agent.name': 'php', - }, - }, - { - data: { - id: 'python', - 'service.name': 'python service', - 'agent.name': 'python', - }, - }, - { - data: { - id: 'ruby', - 'service.name': 'ruby service', - 'agent.name': 'ruby', - }, - }, - ]; - cy.add(elements); +export function NodeIcons() { + const cy = cytoscape(); + const elements = [ + { data: { id: 'default' } }, + { + data: { + id: 'aws', + 'span.type': 'aws', + 'span.subtype': 'servicename', + }, + }, + { data: { id: 'cache', 'span.type': 'cache' } }, + { data: { id: 'database', 'span.type': 'db' } }, + { + data: { + id: 'cassandra', + 'span.type': 'db', + 'span.subtype': 'cassandra', + }, + }, + { + data: { + id: 'elasticsearch', + 'span.type': 'db', + 'span.subtype': 'elasticsearch', + }, + }, + { + data: { + id: 'mongodb', + 'span.type': 'db', + 'span.subtype': 'mongodb', + }, + }, + { + data: { + id: 'mysql', + 'span.type': 'db', + 'span.subtype': 'mysql', + }, + }, + { + data: { + id: 'postgresql', + 'span.type': 'db', + 'span.subtype': 'postgresql', + }, + }, + { + data: { + id: 'redis', + 'span.type': 'db', + 'span.subtype': 'redis', + }, + }, + { data: { id: 'external', 'span.type': 'external' } }, + { data: { id: 'ext', 'span.type': 'ext' } }, + { + data: { + id: 'graphql', + 'span.type': 'external', + 'span.subtype': 'graphql', + }, + }, + { + data: { + id: 'grpc', + 'span.type': 'external', + 'span.subtype': 'grpc', + }, + }, + { + data: { + id: 'websocket', + 'span.type': 'external', + 'span.subtype': 'websocket', + }, + }, + { data: { id: 'messaging', 'span.type': 'messaging' } }, + { + data: { + id: 'jms', + 'span.type': 'messaging', + 'span.subtype': 'jms', + }, + }, + { + data: { + id: 'kafka', + 'span.type': 'messaging', + 'span.subtype': 'kafka', + }, + }, + { data: { id: 'template', 'span.type': 'template' } }, + { + data: { + id: 'handlebars', + 'span.type': 'template', + 'span.subtype': 'handlebars', + }, + }, + { + data: { + id: 'dotnet', + 'service.name': 'dotnet service', + 'agent.name': 'dotnet', + }, + }, + { + data: { + id: 'dotNet', + 'service.name': 'dotNet service', + 'agent.name': 'dotNet', + }, + }, + { + data: { + id: 'go', + 'service.name': 'go service', + 'agent.name': 'go', + }, + }, + { + data: { + id: 'java', + 'service.name': 'java service', + 'agent.name': 'java', + }, + }, + { + data: { + id: 'RUM (js-base)', + 'service.name': 'RUM service', + 'agent.name': 'js-base', + }, + }, + { + data: { + id: 'RUM (rum-js)', + 'service.name': 'RUM service', + 'agent.name': 'rum-js', + }, + }, + { + data: { + id: 'nodejs', + 'service.name': 'nodejs service', + 'agent.name': 'nodejs', + }, + }, + { + data: { + id: 'opentelemetry', + 'service.name': 'OpenTelemetry service', + 'agent.name': 'otlp', + }, + }, + { + data: { + id: 'php', + 'service.name': 'php service', + 'agent.name': 'php', + }, + }, + { + data: { + id: 'python', + 'service.name': 'python service', + 'agent.name': 'python', + }, + }, + { + data: { + id: 'ruby', + 'service.name': 'ruby service', + 'agent.name': 'ruby', + }, + }, + ]; + cy.add(elements); - return ( - - {cy.nodes().map((node) => ( - - - agent.name: {node.data('agent.name') || 'undefined'} -
- span.type: {node.data('span.type') || 'undefined'} -
- span.subtype: {node.data('span.subtype') || 'undefined'} - - } - icon={ - {node.data('label')} - } - title={node.data('id')} - /> -
- ))} -
- ); - }, - { - info: { - propTables: false, - source: false, - }, - } -); + return ( + + {cy.nodes().map((node) => ( + + + agent.name: {node.data('agent.name') || 'undefined'} +
+ span.type: {node.data('span.type') || 'undefined'} +
+ span.subtype: {node.data('span.subtype') || 'undefined'} + + } + icon={ + {node.data('label')} + } + title={node.data('id')} + /> +
+ ))} +
+ ); +} -storiesOf('app/ServiceMap/Cytoscape', module) - .addDecorator((storyFn) => {storyFn()}) - .add( - 'node severity', - () => { - const elements = [ - { - data: { - id: 'undefined', - 'service.name': 'severity: undefined', - serviceAnomalyStats: { anomalyScore: undefined }, - }, - }, - { - data: { - id: 'warning', - 'service.name': 'severity: warning', - serviceAnomalyStats: { anomalyScore: 0 }, - }, - }, - { - data: { - id: 'minor', - 'service.name': 'severity: minor', - serviceAnomalyStats: { anomalyScore: 40 }, - }, - }, - { - data: { - id: 'major', - 'service.name': 'severity: major', - serviceAnomalyStats: { anomalyScore: 60 }, - }, - }, - { - data: { - id: 'critical', - 'service.name': 'severity: critical', - serviceAnomalyStats: { anomalyScore: 80 }, - }, - }, - ]; - return ; - }, - { - info: { propTables: false, source: false }, - } +export function NodeHealthStatus() { + const elements = [ + { + data: { + id: 'undefined', + 'service.name': 'undefined', + serviceAnomalyStats: { healthStatus: undefined }, + }, + }, + { + data: { + id: 'healthy', + 'service.name': 'healthy', + serviceAnomalyStats: { healthStatus: 'healthy' }, + }, + }, + { + data: { + id: 'warning', + 'service.name': 'warning', + serviceAnomalyStats: { healthStatus: 'warning' }, + }, + }, + { + data: { + id: 'critical', + 'service.name': 'critical', + serviceAnomalyStats: { healthStatus: 'critical' }, + }, + }, + ]; + return ( + + + ); +} diff --git a/x-pack/plugins/apm/public/components/app/ServiceMap/__stories__/CytoscapeExampleData.stories.tsx b/x-pack/plugins/apm/public/components/app/ServiceMap/__stories__/CytoscapeExampleData.stories.tsx deleted file mode 100644 index d8dcc71f5051d..0000000000000 --- a/x-pack/plugins/apm/public/components/app/ServiceMap/__stories__/CytoscapeExampleData.stories.tsx +++ /dev/null @@ -1,275 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import { - EuiButton, - EuiCodeEditor, - EuiFieldNumber, - EuiFilePicker, - EuiFlexGroup, - EuiFlexItem, - EuiForm, - EuiSpacer, - EuiToolTip, -} from '@elastic/eui'; -import { storiesOf } from '@storybook/react'; -import React, { useEffect, useState } from 'react'; -import { EuiThemeProvider } from '../../../../../../observability/public'; -import { Cytoscape } from '../Cytoscape'; -import exampleResponseHipsterStore from './example_response_hipster_store.json'; -import exampleResponseOpbeansBeats from './example_response_opbeans_beats.json'; -import exampleResponseTodo from './example_response_todo.json'; -import exampleResponseOneDomainManyIPs from './example_response_one_domain_many_ips.json'; -import { generateServiceMapElements } from './generate_service_map_elements'; - -const STORYBOOK_PATH = 'app/ServiceMap/Cytoscape/Example data'; - -const SESSION_STORAGE_KEY = `${STORYBOOK_PATH}/pre-loaded map`; -function getSessionJson() { - return window.sessionStorage.getItem(SESSION_STORAGE_KEY); -} -function setSessionJson(json: string) { - window.sessionStorage.setItem(SESSION_STORAGE_KEY, json); -} - -const getCytoscapeHeight = () => window.innerHeight - 300; - -storiesOf(STORYBOOK_PATH, module) - .addDecorator((storyFn) => {storyFn()}) - .add( - 'Generate map', - () => { - const [size, setSize] = useState(10); - const [json, setJson] = useState(''); - const [elements, setElements] = useState( - generateServiceMapElements({ size, hasAnomalies: true }) - ); - return ( -
- - - { - setElements( - generateServiceMapElements({ size, hasAnomalies: true }) - ); - setJson(''); - }} - > - Generate service map - - - - - setSize(e.target.valueAsNumber)} - /> - - - - { - setJson(JSON.stringify({ elements }, null, 2)); - }} - > - Get JSON - - - - - - - {json && ( - - )} -
- ); - }, - { - info: { propTables: false, source: false }, - } - ); - -storiesOf(STORYBOOK_PATH, module) - .addDecorator((storyFn) => {storyFn()}) - .add( - 'Map from JSON', - () => { - const [json, setJson] = useState( - getSessionJson() || JSON.stringify(exampleResponseTodo, null, 2) - ); - const [error, setError] = useState(); - - const [elements, setElements] = useState([]); - useEffect(() => { - try { - setElements(JSON.parse(json).elements); - } catch (e) { - setError(e.message); - } - // eslint-disable-next-line react-hooks/exhaustive-deps - }, []); - - return ( -
- - - - - { - setJson(value); - }} - /> - - - - { - const item = event?.item(0); - - if (item) { - const f = new FileReader(); - f.onload = (onloadEvent) => { - const result = onloadEvent?.target?.result; - if (typeof result === 'string') { - setJson(result); - } - }; - f.readAsText(item); - } - }} - /> - - { - try { - setElements(JSON.parse(json).elements); - setSessionJson(json); - setError(undefined); - } catch (e) { - setError(e.message); - } - }} - > - Render JSON - - - - - -
- ); - }, - { - info: { - propTables: false, - source: false, - text: ` - Enter JSON map data into the text box or upload a file and click "Render JSON" to see the results. You can enable a download button on the service map by putting - - \`\`\` - sessionStorage.setItem('apm_debug', 'true') - \`\`\` - - into the JavaScript console and reloading the page.`, - }, - } - ); - -storiesOf(STORYBOOK_PATH, module) - .addDecorator((storyFn) => {storyFn()}) - .add( - 'Todo app', - () => { - return ( -
- -
- ); - }, - { - info: { propTables: false, source: false }, - } - ); - -storiesOf(STORYBOOK_PATH, module) - .addDecorator((storyFn) => {storyFn()}) - .add( - 'Opbeans + beats', - () => { - return ( -
- -
- ); - }, - { - info: { propTables: false, source: false }, - } - ); - -storiesOf(STORYBOOK_PATH, module) - .addDecorator((storyFn) => {storyFn()}) - .add( - 'Hipster store', - () => { - return ( -
- -
- ); - }, - { - info: { propTables: false, source: false }, - } - ); - -storiesOf(STORYBOOK_PATH, module) - .addDecorator((storyFn) => {storyFn()}) - .add( - 'Node resolves one domain name to many IPs', - () => { - return ( -
- -
- ); - }, - { - info: { propTables: false, source: false }, - } - ); diff --git a/x-pack/plugins/apm/public/components/app/ServiceMap/__stories__/centerer.tsx b/x-pack/plugins/apm/public/components/app/ServiceMap/__stories__/centerer.tsx new file mode 100644 index 0000000000000..16dad1e03b5a6 --- /dev/null +++ b/x-pack/plugins/apm/public/components/app/ServiceMap/__stories__/centerer.tsx @@ -0,0 +1,27 @@ +/* + * 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 { useContext, useEffect } from 'react'; +import { CytoscapeContext } from '../Cytoscape'; + +// Component to center map on load +export function Centerer() { + const cy = useContext(CytoscapeContext); + + useEffect(() => { + if (cy) { + cy.one('layoutstop', (event) => { + event.cy.animate({ + duration: 50, + center: { eles: '' }, + fit: { eles: '', padding: 50 }, + }); + }); + } + }, [cy]); + + return null; +} diff --git a/x-pack/plugins/apm/public/components/app/ServiceMap/__stories__/cytoscape_example_data.stories.tsx b/x-pack/plugins/apm/public/components/app/ServiceMap/__stories__/cytoscape_example_data.stories.tsx new file mode 100644 index 0000000000000..0673735ba0adb --- /dev/null +++ b/x-pack/plugins/apm/public/components/app/ServiceMap/__stories__/cytoscape_example_data.stories.tsx @@ -0,0 +1,228 @@ +/* + * 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 { + EuiButton, + EuiCodeEditor, + EuiFieldNumber, + EuiFilePicker, + EuiFlexGroup, + EuiFlexItem, + EuiForm, + EuiSpacer, + EuiToolTip, +} from '@elastic/eui'; +import React, { ComponentType, useEffect, useState } from 'react'; +import { EuiThemeProvider } from '../../../../../../observability/public'; +import { Cytoscape } from '../Cytoscape'; +import { Centerer } from './centerer'; +import exampleResponseHipsterStore from './example_response_hipster_store.json'; +import exampleResponseOpbeansBeats from './example_response_opbeans_beats.json'; +import exampleResponseTodo from './example_response_todo.json'; +import { generateServiceMapElements } from './generate_service_map_elements'; + +const STORYBOOK_PATH = 'app/ServiceMap/Cytoscape/Example data'; + +const SESSION_STORAGE_KEY = `${STORYBOOK_PATH}/pre-loaded map`; +function getSessionJson() { + return window.sessionStorage.getItem(SESSION_STORAGE_KEY); +} +function setSessionJson(json: string) { + window.sessionStorage.setItem(SESSION_STORAGE_KEY, json); +} + +function getHeight() { + return window.innerHeight - 300; +} + +export default { + title: 'app/ServiceMap/Cytoscape/Example data', + component: Cytoscape, + decorators: [ + (Story: ComponentType) => ( + + + + ), + ], +}; + +export function GenerateMap() { + const [size, setSize] = useState(10); + const [json, setJson] = useState(''); + const [elements, setElements] = useState( + generateServiceMapElements({ size, hasAnomalies: true }) + ); + return ( +
+ + + { + setElements( + generateServiceMapElements({ size, hasAnomalies: true }) + ); + setJson(''); + }} + > + Generate service map + + + + + setSize(e.target.valueAsNumber)} + /> + + + + { + setJson(JSON.stringify({ elements }, null, 2)); + }} + > + Get JSON + + + + + + + + + {json && ( + + )} +
+ ); +} + +export function MapFromJSON() { + const [json, setJson] = useState( + getSessionJson() || JSON.stringify(exampleResponseTodo, null, 2) + ); + const [error, setError] = useState(); + + const [elements, setElements] = useState([]); + useEffect(() => { + try { + setElements(JSON.parse(json).elements); + } catch (e) { + setError(e.message); + } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []); + + return ( +
+ + + + + + + { + setJson(value); + }} + /> + + + + { + const item = event?.item(0); + + if (item) { + const f = new FileReader(); + f.onload = (onloadEvent) => { + const result = onloadEvent?.target?.result; + if (typeof result === 'string') { + setJson(result); + } + }; + f.readAsText(item); + } + }} + /> + + { + try { + setElements(JSON.parse(json).elements); + setSessionJson(json); + setError(undefined); + } catch (e) { + setError(e.message); + } + }} + > + Render JSON + + + + + +
+ ); +} + +export function TodoApp() { + return ( +
+ + + +
+ ); +} + +export function OpbeansAndBeats() { + return ( +
+ + + +
+ ); +} + +export function HipsterStore() { + return ( +
+ + + +
+ ); +} diff --git a/x-pack/plugins/apm/public/components/app/ServiceMap/__stories__/example_grouped_connections.json b/x-pack/plugins/apm/public/components/app/ServiceMap/__stories__/example_grouped_connections.json new file mode 100644 index 0000000000000..55686f99f388a --- /dev/null +++ b/x-pack/plugins/apm/public/components/app/ServiceMap/__stories__/example_grouped_connections.json @@ -0,0 +1,875 @@ +{ + "id": "resourceGroup{elastic-co-frontend}", + "span.type": "external", + "label": "124 resources", + "groupedConnections": [ + { + "label": "813-mam-392.mktoresp.com:443", + "span.subtype": "http", + "span.destination.service.resource": "813-mam-392.mktoresp.com:443", + "span.type": "external", + "id": ">813-mam-392.mktoresp.com:443" + }, + { + "label": "813-mam-392.mktoutil.com:443", + "span.subtype": "http", + "span.destination.service.resource": "813-mam-392.mktoutil.com:443", + "span.type": "external", + "id": ">813-mam-392.mktoutil.com:443" + }, + { + "label": "8d1f.com:443", + "span.subtype": "link", + "span.destination.service.resource": "8d1f.com:443", + "span.type": "resource", + "id": ">8d1f.com:443" + }, + { + "label": "a.ssl-checking.com:443", + "span.subtype": "xmlhttprequest", + "span.destination.service.resource": "a.ssl-checking.com:443", + "span.type": "resource", + "id": ">a.ssl-checking.com:443" + }, + { + "label": "a18132920325.cdn.optimizely.com:443", + "span.subtype": "iframe", + "span.destination.service.resource": "a18132920325.cdn.optimizely.com:443", + "span.type": "resource", + "id": ">a18132920325.cdn.optimizely.com:443" + }, + { + "label": "api.contentstack.io:443", + "span.subtype": "img", + "span.destination.service.resource": "api.contentstack.io:443", + "span.type": "resource", + "id": ">api.contentstack.io:443" + }, + { + "label": "assets.website-files.com:443", + "span.subtype": "css", + "span.destination.service.resource": "assets.website-files.com:443", + "span.type": "resource", + "id": ">assets.website-files.com:443" + }, + { + "label": "bat.bing.com:443", + "span.subtype": "img", + "span.destination.service.resource": "bat.bing.com:443", + "span.type": "resource", + "id": ">bat.bing.com:443" + }, + { + "label": "bid.g.doubleclick.net:443", + "span.subtype": "iframe", + "span.destination.service.resource": "bid.g.doubleclick.net:443", + "span.type": "resource", + "id": ">bid.g.doubleclick.net:443" + }, + { + "label": "cdn.iubenda.com:443", + "span.subtype": "iframe", + "span.destination.service.resource": "cdn.iubenda.com:443", + "span.type": "resource", + "id": ">cdn.iubenda.com:443" + }, + { + "label": "cdn.loom.com:443", + "span.subtype": "css", + "span.destination.service.resource": "cdn.loom.com:443", + "span.type": "resource", + "id": ">cdn.loom.com:443" + }, + { + "label": "cdn.optimizely.com:443", + "span.subtype": "script", + "span.destination.service.resource": "cdn.optimizely.com:443", + "span.type": "resource", + "id": ">cdn.optimizely.com:443" + }, + { + "label": "cdncache-a.akamaihd.net:443", + "span.subtype": "http", + "span.destination.service.resource": "cdncache-a.akamaihd.net:443", + "span.type": "external", + "id": ">cdncache-a.akamaihd.net:443" + }, + { + "label": "cloud.githubusercontent.com:443", + "span.subtype": "img", + "span.destination.service.resource": "cloud.githubusercontent.com:443", + "span.type": "resource", + "id": ">cloud.githubusercontent.com:443" + }, + { + "label": "config.privoxy.org:443", + "span.subtype": "script", + "span.destination.service.resource": "config.privoxy.org:443", + "span.type": "resource", + "id": ">config.privoxy.org:443" + }, + { + "label": "connect.facebook.net:443", + "span.subtype": "script", + "span.destination.service.resource": "connect.facebook.net:443", + "span.type": "resource", + "id": ">connect.facebook.net:443" + }, + { + "label": "dpx.airpr.com:443", + "span.subtype": "img", + "span.destination.service.resource": "dpx.airpr.com:443", + "span.type": "resource", + "id": ">dpx.airpr.com:443" + }, + { + "label": "errors.client.optimizely.com:443", + "span.subtype": "http", + "span.destination.service.resource": "errors.client.optimizely.com:443", + "span.type": "external", + "id": ">errors.client.optimizely.com:443" + }, + { + "label": "fonts.googleapis.com:443", + "span.subtype": "css", + "span.destination.service.resource": "fonts.googleapis.com:443", + "span.type": "resource", + "id": ">fonts.googleapis.com:443" + }, + { + "label": "fonts.gstatic.com:443", + "span.subtype": "css", + "span.destination.service.resource": "fonts.gstatic.com:443", + "span.type": "resource", + "id": ">fonts.gstatic.com:443" + }, + { + "label": "ga.clearbit.com:443", + "span.subtype": "script", + "span.destination.service.resource": "ga.clearbit.com:443", + "span.type": "resource", + "id": ">ga.clearbit.com:443" + }, + { + "label": "gc.kis.v2.scr.kaspersky-labs.com:443", + "span.subtype": "script", + "span.destination.service.resource": "gc.kis.v2.scr.kaspersky-labs.com:443", + "span.type": "resource", + "id": ">gc.kis.v2.scr.kaspersky-labs.com:443" + }, + { + "label": "googleads.g.doubleclick.net:443", + "span.subtype": "script", + "span.destination.service.resource": "googleads.g.doubleclick.net:443", + "span.type": "resource", + "id": ">googleads.g.doubleclick.net:443" + }, + { + "label": "hits-i.iubenda.com:443", + "span.subtype": "http", + "span.destination.service.resource": "hits-i.iubenda.com:443", + "span.type": "external", + "id": ">hits-i.iubenda.com:443" + }, + { + "label": "host-1r8dhi.api.swiftype.com:443", + "span.subtype": "http", + "span.destination.service.resource": "host-1r8dhi.api.swiftype.com:443", + "span.type": "external", + "id": ">host-1r8dhi.api.swiftype.com:443" + }, + { + "label": "host-nm1h2z.api.swiftype.com:443", + "span.subtype": "http", + "span.destination.service.resource": "host-nm1h2z.api.swiftype.com:443", + "span.type": "external", + "id": ">host-nm1h2z.api.swiftype.com:443" + }, + { + "label": "images.contentstack.io:443", + "span.subtype": "css", + "span.destination.service.resource": "images.contentstack.io:443", + "span.type": "resource", + "id": ">images.contentstack.io:443" + }, + { + "label": "info.elastic.co:443", + "span.subtype": "iframe", + "span.destination.service.resource": "info.elastic.co:443", + "span.type": "resource", + "id": ">info.elastic.co:443" + }, + { + "label": "info.elastic.co:80", + "span.subtype": "img", + "span.destination.service.resource": "info.elastic.co:80", + "span.type": "resource", + "id": ">info.elastic.co:80" + }, + { + "label": "js.clearbit.com:443", + "span.subtype": "script", + "span.destination.service.resource": "js.clearbit.com:443", + "span.type": "resource", + "id": ">js.clearbit.com:443" + }, + { + "label": "lh4.googleusercontent.com:443", + "span.subtype": "img", + "span.destination.service.resource": "lh4.googleusercontent.com:443", + "span.type": "resource", + "id": ">lh4.googleusercontent.com:443" + }, + { + "label": "lh6.googleusercontent.com:443", + "span.subtype": "img", + "span.destination.service.resource": "lh6.googleusercontent.com:443", + "span.type": "resource", + "id": ">lh6.googleusercontent.com:443" + }, + { + "label": "logx.optimizely.com:443", + "span.subtype": "http", + "span.destination.service.resource": "logx.optimizely.com:443", + "span.type": "external", + "id": ">logx.optimizely.com:443" + }, + { + "label": "m98.prod2016.com:443", + "span.subtype": "http", + "span.destination.service.resource": "m98.prod2016.com:443", + "span.type": "external", + "id": ">m98.prod2016.com:443" + }, + { + "label": "maps.googleapis.com:443", + "span.subtype": "img", + "span.destination.service.resource": "maps.googleapis.com:443", + "span.type": "resource", + "id": ">maps.googleapis.com:443" + }, + { + "label": "maps.gstatic.com:443", + "span.subtype": "css", + "span.destination.service.resource": "maps.gstatic.com:443", + "span.type": "resource", + "id": ">maps.gstatic.com:443" + }, + { + "label": "munchkin.marketo.net:443", + "span.subtype": "script", + "span.destination.service.resource": "munchkin.marketo.net:443", + "span.type": "resource", + "id": ">munchkin.marketo.net:443" + }, + { + "label": "negbar.ad-blocker.org:443", + "span.subtype": "script", + "span.destination.service.resource": "negbar.ad-blocker.org:443", + "span.type": "resource", + "id": ">negbar.ad-blocker.org:443" + }, + { + "label": "p.typekit.net:443", + "span.subtype": "css", + "span.destination.service.resource": "p.typekit.net:443", + "span.type": "resource", + "id": ">p.typekit.net:443" + }, + { + "label": "platform.twitter.com:443", + "span.subtype": "iframe", + "span.destination.service.resource": "platform.twitter.com:443", + "span.type": "resource", + "id": ">platform.twitter.com:443" + }, + { + "label": "play.vidyard.com:443", + "span.subtype": "iframe", + "span.destination.service.resource": "play.vidyard.com:443", + "span.type": "resource", + "id": ">play.vidyard.com:443" + }, + { + "label": "px.ads.linkedin.com:443", + "span.subtype": "img", + "span.destination.service.resource": "px.ads.linkedin.com:443", + "span.type": "resource", + "id": ">px.ads.linkedin.com:443" + }, + { + "label": "px.airpr.com:443", + "span.subtype": "script", + "span.destination.service.resource": "px.airpr.com:443", + "span.type": "resource", + "id": ">px.airpr.com:443" + }, + { + "label": "q.quora.com:443", + "span.subtype": "img", + "span.destination.service.resource": "q.quora.com:443", + "span.type": "resource", + "id": ">q.quora.com:443" + }, + { + "label": "risk.clearbit.com:443", + "span.subtype": "http", + "span.destination.service.resource": "risk.clearbit.com:443", + "span.type": "external", + "id": ">risk.clearbit.com:443" + }, + { + "label": "rtp-static.marketo.com:443", + "span.subtype": "http", + "span.destination.service.resource": "rtp-static.marketo.com:443", + "span.type": "external", + "id": ">rtp-static.marketo.com:443" + }, + { + "label": "rum.optimizely.com:443", + "span.subtype": "http", + "span.destination.service.resource": "rum.optimizely.com:443", + "span.type": "external", + "id": ">rum.optimizely.com:443" + }, + { + "label": "s3-us-west-1.amazonaws.com:443", + "span.subtype": "script", + "span.destination.service.resource": "s3-us-west-1.amazonaws.com:443", + "span.type": "resource", + "id": ">s3-us-west-1.amazonaws.com:443" + }, + { + "label": "sjrtp2-cdn.marketo.com:443", + "span.subtype": "script", + "span.destination.service.resource": "sjrtp2-cdn.marketo.com:443", + "span.type": "resource", + "id": ">sjrtp2-cdn.marketo.com:443" + }, + { + "label": "sjrtp2.marketo.com:443", + "span.subtype": "http", + "span.destination.service.resource": "sjrtp2.marketo.com:443", + "span.type": "external", + "id": ">sjrtp2.marketo.com:443" + }, + { + "label": "snap.licdn.com:443", + "span.subtype": "script", + "span.destination.service.resource": "snap.licdn.com:443", + "span.type": "resource", + "id": ">snap.licdn.com:443" + }, + { + "label": "speakerdeck.com:443", + "span.subtype": "iframe", + "span.destination.service.resource": "speakerdeck.com:443", + "span.type": "resource", + "id": ">speakerdeck.com:443" + }, + { + "label": "stag-static-www.elastic.co:443", + "span.subtype": "img", + "span.destination.service.resource": "stag-static-www.elastic.co:443", + "span.type": "resource", + "id": ">stag-static-www.elastic.co:443" + }, + { + "label": "static-www.elastic.co:443", + "span.subtype": "css", + "span.destination.service.resource": "static-www.elastic.co:443", + "span.type": "resource", + "id": ">static-www.elastic.co:443" + }, + { + "label": "stats.g.doubleclick.net:443", + "span.subtype": "http", + "span.destination.service.resource": "stats.g.doubleclick.net:443", + "span.type": "external", + "id": ">stats.g.doubleclick.net:443" + }, + { + "label": "translate.google.com:443", + "span.subtype": "img", + "span.destination.service.resource": "translate.google.com:443", + "span.type": "resource", + "id": ">translate.google.com:443" + }, + { + "label": "translate.googleapis.com:443", + "span.subtype": "link", + "span.destination.service.resource": "translate.googleapis.com:443", + "span.type": "resource", + "id": ">translate.googleapis.com:443" + }, + { + "label": "use.typekit.net:443", + "span.subtype": "link", + "span.destination.service.resource": "use.typekit.net:443", + "span.type": "resource", + "id": ">use.typekit.net:443" + }, + { + "label": "www.elastic.co:443", + "span.subtype": "browser-timing", + "span.destination.service.resource": "www.elastic.co:443", + "span.type": "external", + "id": ">www.elastic.co:443" + }, + { + "label": "www.facebook.com:443", + "span.subtype": "beacon", + "span.destination.service.resource": "www.facebook.com:443", + "span.type": "resource", + "id": ">www.facebook.com:443" + }, + { + "label": "www.google-analytics.com:443", + "span.subtype": "beacon", + "span.destination.service.resource": "www.google-analytics.com:443", + "span.type": "external", + "id": ">www.google-analytics.com:443" + }, + { + "label": "www.google.ae:443", + "span.subtype": "img", + "span.destination.service.resource": "www.google.ae:443", + "span.type": "resource", + "id": ">www.google.ae:443" + }, + { + "label": "www.google.al:443", + "span.subtype": "img", + "span.destination.service.resource": "www.google.al:443", + "span.type": "resource", + "id": ">www.google.al:443" + }, + { + "label": "www.google.at:443", + "span.subtype": "img", + "span.destination.service.resource": "www.google.at:443", + "span.type": "resource", + "id": ">www.google.at:443" + }, + { + "label": "www.google.ba:443", + "span.subtype": "img", + "span.destination.service.resource": "www.google.ba:443", + "span.type": "resource", + "id": ">www.google.ba:443" + }, + { + "label": "www.google.be:443", + "span.subtype": "img", + "span.destination.service.resource": "www.google.be:443", + "span.type": "resource", + "id": ">www.google.be:443" + }, + { + "label": "www.google.bg:443", + "span.subtype": "img", + "span.destination.service.resource": "www.google.bg:443", + "span.type": "resource", + "id": ">www.google.bg:443" + }, + { + "label": "www.google.by:443", + "span.subtype": "img", + "span.destination.service.resource": "www.google.by:443", + "span.type": "resource", + "id": ">www.google.by:443" + }, + { + "label": "www.google.ca:443", + "span.subtype": "img", + "span.destination.service.resource": "www.google.ca:443", + "span.type": "resource", + "id": ">www.google.ca:443" + }, + { + "label": "www.google.ch:443", + "span.subtype": "img", + "span.destination.service.resource": "www.google.ch:443", + "span.type": "resource", + "id": ">www.google.ch:443" + }, + { + "label": "www.google.cl:443", + "span.subtype": "img", + "span.destination.service.resource": "www.google.cl:443", + "span.type": "resource", + "id": ">www.google.cl:443" + }, + { + "label": "www.google.co.cr:443", + "span.subtype": "img", + "span.destination.service.resource": "www.google.co.cr:443", + "span.type": "resource", + "id": ">www.google.co.cr:443" + }, + { + "label": "www.google.co.id:443", + "span.subtype": "img", + "span.destination.service.resource": "www.google.co.id:443", + "span.type": "resource", + "id": ">www.google.co.id:443" + }, + { + "label": "www.google.co.il:443", + "span.subtype": "img", + "span.destination.service.resource": "www.google.co.il:443", + "span.type": "resource", + "id": ">www.google.co.il:443" + }, + { + "label": "www.google.co.in:443", + "span.subtype": "img", + "span.destination.service.resource": "www.google.co.in:443", + "span.type": "resource", + "id": ">www.google.co.in:443" + }, + { + "label": "www.google.co.jp:443", + "span.subtype": "img", + "span.destination.service.resource": "www.google.co.jp:443", + "span.type": "resource", + "id": ">www.google.co.jp:443" + }, + { + "label": "www.google.co.kr:443", + "span.subtype": "img", + "span.destination.service.resource": "www.google.co.kr:443", + "span.type": "resource", + "id": ">www.google.co.kr:443" + }, + { + "label": "www.google.co.ma:443", + "span.subtype": "img", + "span.destination.service.resource": "www.google.co.ma:443", + "span.type": "resource", + "id": ">www.google.co.ma:443" + }, + { + "label": "www.google.co.uk:443", + "span.subtype": "img", + "span.destination.service.resource": "www.google.co.uk:443", + "span.type": "resource", + "id": ">www.google.co.uk:443" + }, + { + "label": "www.google.co.za:443", + "span.subtype": "img", + "span.destination.service.resource": "www.google.co.za:443", + "span.type": "resource", + "id": ">www.google.co.za:443" + }, + { + "label": "www.google.com.ar:443", + "span.subtype": "img", + "span.destination.service.resource": "www.google.com.ar:443", + "span.type": "resource", + "id": ">www.google.com.ar:443" + }, + { + "label": "www.google.com.au:443", + "span.subtype": "img", + "span.destination.service.resource": "www.google.com.au:443", + "span.type": "resource", + "id": ">www.google.com.au:443" + }, + { + "label": "www.google.com.bo:443", + "span.subtype": "img", + "span.destination.service.resource": "www.google.com.bo:443", + "span.type": "resource", + "id": ">www.google.com.bo:443" + }, + { + "label": "www.google.com.br:443", + "span.subtype": "img", + "span.destination.service.resource": "www.google.com.br:443", + "span.type": "resource", + "id": ">www.google.com.br:443" + }, + { + "label": "www.google.com.co:443", + "span.subtype": "img", + "span.destination.service.resource": "www.google.com.co:443", + "span.type": "resource", + "id": ">www.google.com.co:443" + }, + { + "label": "www.google.com.eg:443", + "span.subtype": "img", + "span.destination.service.resource": "www.google.com.eg:443", + "span.type": "resource", + "id": ">www.google.com.eg:443" + }, + { + "label": "www.google.com.mm:443", + "span.subtype": "img", + "span.destination.service.resource": "www.google.com.mm:443", + "span.type": "resource", + "id": ">www.google.com.mm:443" + }, + { + "label": "www.google.com.mx:443", + "span.subtype": "img", + "span.destination.service.resource": "www.google.com.mx:443", + "span.type": "resource", + "id": ">www.google.com.mx:443" + }, + { + "label": "www.google.com.my:443", + "span.subtype": "img", + "span.destination.service.resource": "www.google.com.my:443", + "span.type": "resource", + "id": ">www.google.com.my:443" + }, + { + "label": "www.google.com.pe:443", + "span.subtype": "img", + "span.destination.service.resource": "www.google.com.pe:443", + "span.type": "resource", + "id": ">www.google.com.pe:443" + }, + { + "label": "www.google.com.sa:443", + "span.subtype": "img", + "span.destination.service.resource": "www.google.com.sa:443", + "span.type": "resource", + "id": ">www.google.com.sa:443" + }, + { + "label": "www.google.com.sg:443", + "span.subtype": "img", + "span.destination.service.resource": "www.google.com.sg:443", + "span.type": "resource", + "id": ">www.google.com.sg:443" + }, + { + "label": "www.google.com.tr:443", + "span.subtype": "img", + "span.destination.service.resource": "www.google.com.tr:443", + "span.type": "resource", + "id": ">www.google.com.tr:443" + }, + { + "label": "www.google.com.ua:443", + "span.subtype": "img", + "span.destination.service.resource": "www.google.com.ua:443", + "span.type": "resource", + "id": ">www.google.com.ua:443" + }, + { + "label": "www.google.com.uy:443", + "span.subtype": "img", + "span.destination.service.resource": "www.google.com.uy:443", + "span.type": "resource", + "id": ">www.google.com.uy:443" + }, + { + "label": "www.google.com:443", + "span.subtype": "beacon", + "span.destination.service.resource": "www.google.com:443", + "span.type": "resource", + "id": ">www.google.com:443" + }, + { + "label": "www.google.cz:443", + "span.subtype": "img", + "span.destination.service.resource": "www.google.cz:443", + "span.type": "resource", + "id": ">www.google.cz:443" + }, + { + "label": "www.google.de:443", + "span.subtype": "img", + "span.destination.service.resource": "www.google.de:443", + "span.type": "resource", + "id": ">www.google.de:443" + }, + { + "label": "www.google.dk:443", + "span.subtype": "img", + "span.destination.service.resource": "www.google.dk:443", + "span.type": "resource", + "id": ">www.google.dk:443" + }, + { + "label": "www.google.es:443", + "span.subtype": "img", + "span.destination.service.resource": "www.google.es:443", + "span.type": "resource", + "id": ">www.google.es:443" + }, + { + "label": "www.google.fr:443", + "span.subtype": "img", + "span.destination.service.resource": "www.google.fr:443", + "span.type": "resource", + "id": ">www.google.fr:443" + }, + { + "label": "www.google.gr:443", + "span.subtype": "img", + "span.destination.service.resource": "www.google.gr:443", + "span.type": "resource", + "id": ">www.google.gr:443" + }, + { + "label": "www.google.hu:443", + "span.subtype": "img", + "span.destination.service.resource": "www.google.hu:443", + "span.type": "resource", + "id": ">www.google.hu:443" + }, + { + "label": "www.google.is:443", + "span.subtype": "img", + "span.destination.service.resource": "www.google.is:443", + "span.type": "resource", + "id": ">www.google.is:443" + }, + { + "label": "www.google.it:443", + "span.subtype": "img", + "span.destination.service.resource": "www.google.it:443", + "span.type": "resource", + "id": ">www.google.it:443" + }, + { + "label": "www.google.lk:443", + "span.subtype": "img", + "span.destination.service.resource": "www.google.lk:443", + "span.type": "resource", + "id": ">www.google.lk:443" + }, + { + "label": "www.google.md:443", + "span.subtype": "img", + "span.destination.service.resource": "www.google.md:443", + "span.type": "resource", + "id": ">www.google.md:443" + }, + { + "label": "www.google.mk:443", + "span.subtype": "img", + "span.destination.service.resource": "www.google.mk:443", + "span.type": "resource", + "id": ">www.google.mk:443" + }, + { + "label": "www.google.nl:443", + "span.subtype": "img", + "span.destination.service.resource": "www.google.nl:443", + "span.type": "resource", + "id": ">www.google.nl:443" + }, + { + "label": "www.google.no:443", + "span.subtype": "img", + "span.destination.service.resource": "www.google.no:443", + "span.type": "resource", + "id": ">www.google.no:443" + }, + { + "label": "www.google.pl:443", + "span.subtype": "img", + "span.destination.service.resource": "www.google.pl:443", + "span.type": "resource", + "id": ">www.google.pl:443" + }, + { + "label": "www.google.pt:443", + "span.subtype": "img", + "span.destination.service.resource": "www.google.pt:443", + "span.type": "resource", + "id": ">www.google.pt:443" + }, + { + "label": "www.google.ro:443", + "span.subtype": "img", + "span.destination.service.resource": "www.google.ro:443", + "span.type": "resource", + "id": ">www.google.ro:443" + }, + { + "label": "www.google.rs:443", + "span.subtype": "img", + "span.destination.service.resource": "www.google.rs:443", + "span.type": "resource", + "id": ">www.google.rs:443" + }, + { + "label": "www.google.ru:443", + "span.subtype": "img", + "span.destination.service.resource": "www.google.ru:443", + "span.type": "resource", + "id": ">www.google.ru:443" + }, + { + "label": "www.google.se:443", + "span.subtype": "img", + "span.destination.service.resource": "www.google.se:443", + "span.type": "resource", + "id": ">www.google.se:443" + }, + { + "label": "www.google.tn:443", + "span.subtype": "img", + "span.destination.service.resource": "www.google.tn:443", + "span.type": "resource", + "id": ">www.google.tn:443" + }, + { + "label": "www.googleadservices.com:443", + "span.subtype": "script", + "span.destination.service.resource": "www.googleadservices.com:443", + "span.type": "resource", + "id": ">www.googleadservices.com:443" + }, + { + "label": "www.googletagmanager.com:443", + "span.subtype": "script", + "span.destination.service.resource": "www.googletagmanager.com:443", + "span.type": "resource", + "id": ">www.googletagmanager.com:443" + }, + { + "label": "www.gstatic.com:443", + "span.subtype": "css", + "span.destination.service.resource": "www.gstatic.com:443", + "span.type": "resource", + "id": ">www.gstatic.com:443" + }, + { + "label": "www.iubenda.com:443", + "span.subtype": "script", + "span.destination.service.resource": "www.iubenda.com:443", + "span.type": "resource", + "id": ">www.iubenda.com:443" + }, + { + "label": "www.slideshare.net:443", + "span.subtype": "iframe", + "span.destination.service.resource": "www.slideshare.net:443", + "span.type": "resource", + "id": ">www.slideshare.net:443" + }, + { + "label": "www.youtube.com:443", + "span.subtype": "iframe", + "span.destination.service.resource": "www.youtube.com:443", + "span.type": "resource", + "id": ">www.youtube.com:443" + }, + { + "label": "x.clearbit.com:443", + "span.subtype": "http", + "span.destination.service.resource": "x.clearbit.com:443", + "span.type": "external", + "id": ">x.clearbit.com:443" + } + ] +} diff --git a/x-pack/plugins/apm/public/components/app/ServiceMap/__stories__/example_response_one_domain_many_ips.json b/x-pack/plugins/apm/public/components/app/ServiceMap/__stories__/example_response_one_domain_many_ips.json deleted file mode 100644 index f9b8a273d8577..0000000000000 --- a/x-pack/plugins/apm/public/components/app/ServiceMap/__stories__/example_response_one_domain_many_ips.json +++ /dev/null @@ -1,2122 +0,0 @@ -{ - "elements": [ - { - "data": { - "source": "artifact_api", - "target": ">192.0.2.99:80", - "id": "artifact_api~>192.0.2.99:80", - "sourceData": { - "id": "artifact_api", - "service.environment": "development", - "service.name": "artifact_api", - "agent.name": "nodejs", - "service.framework.name": "express" - }, - "targetData": { - "span.subtype": "http", - "span.destination.service.resource": "192.0.2.99:80", - "span.type": "external", - "id": ">192.0.2.99:80", - "label": ">192.0.2.99:80" - } - } - }, - { - "data": { - "source": "artifact_api", - "target": ">192.0.2.47:443", - "id": "artifact_api~>192.0.2.47:443", - "sourceData": { - "id": "artifact_api", - "service.environment": "development", - "service.name": "artifact_api", - "agent.name": "nodejs", - "service.framework.name": "express" - }, - "targetData": { - "span.subtype": "https", - "span.destination.service.resource": "192.0.2.47:443", - "span.type": "external", - "id": ">192.0.2.47:443", - "label": ">192.0.2.47:443" - } - } - }, - { - "data": { - "source": "artifact_api", - "target": ">192.0.2.13:443", - "id": "artifact_api~>192.0.2.13:443", - "sourceData": { - "id": "artifact_api", - "service.environment": "development", - "service.name": "artifact_api", - "agent.name": "nodejs", - "service.framework.name": "express" - }, - "targetData": { - "span.subtype": "https", - "span.destination.service.resource": "192.0.2.13:443", - "span.type": "external", - "id": ">192.0.2.13:443", - "label": ">192.0.2.13:443" - } - } - }, - { - "data": { - "source": "artifact_api", - "target": ">192.0.2.106:443", - "id": "artifact_api~>192.0.2.106:443", - "sourceData": { - "id": "artifact_api", - "service.environment": "development", - "service.name": "artifact_api", - "agent.name": "nodejs", - "service.framework.name": "express" - }, - "targetData": { - "span.subtype": "https", - "span.destination.service.resource": "192.0.2.106:443", - "span.type": "external", - "id": ">192.0.2.106:443", - "label": ">192.0.2.106:443" - } - } - }, - { - "data": { - "source": "artifact_api", - "target": ">192.0.2.83:443", - "id": "artifact_api~>192.0.2.83:443", - "sourceData": { - "id": "artifact_api", - "service.environment": "development", - "service.name": "artifact_api", - "agent.name": "nodejs", - "service.framework.name": "express" - }, - "targetData": { - "span.subtype": "https", - "span.destination.service.resource": "192.0.2.83:443", - "span.type": "external", - "id": ">192.0.2.83:443", - "label": ">192.0.2.83:443" - } - } - }, - { - "data": { - "source": "artifact_api", - "target": ">192.0.2.111:443", - "id": "artifact_api~>192.0.2.111:443", - "sourceData": { - "id": "artifact_api", - "service.environment": "development", - "service.name": "artifact_api", - "agent.name": "nodejs", - "service.framework.name": "express" - }, - "targetData": { - "span.subtype": "https", - "span.destination.service.resource": "192.0.2.111:443", - "span.type": "external", - "id": ">192.0.2.111:443", - "label": ">192.0.2.111:443" - } - } - }, - { - "data": { - "source": "artifact_api", - "target": ">192.0.2.189:443", - "id": "artifact_api~>192.0.2.189:443", - "sourceData": { - "id": "artifact_api", - "service.environment": "development", - "service.name": "artifact_api", - "agent.name": "nodejs", - "service.framework.name": "express" - }, - "targetData": { - "span.subtype": "https", - "span.destination.service.resource": "192.0.2.189:443", - "span.type": "external", - "id": ">192.0.2.189:443", - "label": ">192.0.2.189:443" - } - } - }, - { - "data": { - "source": "artifact_api", - "target": ">192.0.2.148:443", - "id": "artifact_api~>192.0.2.148:443", - "sourceData": { - "id": "artifact_api", - "service.environment": "development", - "service.name": "artifact_api", - "agent.name": "nodejs", - "service.framework.name": "express" - }, - "targetData": { - "span.subtype": "https", - "span.destination.service.resource": "192.0.2.148:443", - "span.type": "external", - "id": ">192.0.2.148:443", - "label": ">192.0.2.148:443" - } - } - }, - { - "data": { - "source": "artifact_api", - "target": ">192.0.2.39:443", - "id": "artifact_api~>192.0.2.39:443", - "sourceData": { - "id": "artifact_api", - "service.environment": "development", - "service.name": "artifact_api", - "agent.name": "nodejs", - "service.framework.name": "express" - }, - "targetData": { - "span.subtype": "https", - "span.destination.service.resource": "192.0.2.39:443", - "span.type": "external", - "id": ">192.0.2.39:443", - "label": ">192.0.2.39:443" - } - } - }, - { - "data": { - "source": "artifact_api", - "target": ">192.0.2.42:443", - "id": "artifact_api~>192.0.2.42:443", - "sourceData": { - "id": "artifact_api", - "service.environment": "development", - "service.name": "artifact_api", - "agent.name": "nodejs", - "service.framework.name": "express" - }, - "targetData": { - "span.subtype": "https", - "span.destination.service.resource": "192.0.2.42:443", - "span.type": "external", - "id": ">192.0.2.42:443", - "label": ">192.0.2.42:443" - } - } - }, - { - "data": { - "source": "artifact_api", - "target": ">192.0.2.240:443", - "id": "artifact_api~>192.0.2.240:443", - "sourceData": { - "id": "artifact_api", - "service.environment": "development", - "service.name": "artifact_api", - "agent.name": "nodejs", - "service.framework.name": "express" - }, - "targetData": { - "span.subtype": "https", - "span.destination.service.resource": "192.0.2.240:443", - "span.type": "external", - "id": ">192.0.2.240:443", - "label": ">192.0.2.240:443" - } - } - }, - { - "data": { - "source": "artifact_api", - "target": ">192.0.2.156:443", - "id": "artifact_api~>192.0.2.156:443", - "sourceData": { - "id": "artifact_api", - "service.environment": "development", - "service.name": "artifact_api", - "agent.name": "nodejs", - "service.framework.name": "express" - }, - "targetData": { - "span.subtype": "https", - "span.destination.service.resource": "192.0.2.156:443", - "span.type": "external", - "id": ">192.0.2.156:443", - "label": ">192.0.2.156:443" - } - } - }, - { - "data": { - "source": "artifact_api", - "target": ">192.0.2.245:443", - "id": "artifact_api~>192.0.2.245:443", - "sourceData": { - "id": "artifact_api", - "service.environment": "development", - "service.name": "artifact_api", - "agent.name": "nodejs", - "service.framework.name": "express" - }, - "targetData": { - "span.subtype": "https", - "span.destination.service.resource": "192.0.2.245:443", - "span.type": "external", - "id": ">192.0.2.245:443", - "label": ">192.0.2.245:443" - } - } - }, - { - "data": { - "source": "artifact_api", - "target": ">192.0.2.198:443", - "id": "artifact_api~>192.0.2.198:443", - "sourceData": { - "id": "artifact_api", - "service.environment": "development", - "service.name": "artifact_api", - "agent.name": "nodejs", - "service.framework.name": "express" - }, - "targetData": { - "span.subtype": "https", - "span.destination.service.resource": "192.0.2.198:443", - "span.type": "external", - "id": ">192.0.2.198:443", - "label": ">192.0.2.198:443" - } - } - }, - { - "data": { - "source": "artifact_api", - "target": ">192.0.2.77:443", - "id": "artifact_api~>192.0.2.77:443", - "sourceData": { - "id": "artifact_api", - "service.environment": "development", - "service.name": "artifact_api", - "agent.name": "nodejs", - "service.framework.name": "express" - }, - "targetData": { - "span.subtype": "https", - "span.destination.service.resource": "192.0.2.77:443", - "span.type": "external", - "id": ">192.0.2.77:443", - "label": ">192.0.2.77:443" - } - } - }, - { - "data": { - "source": "artifact_api", - "target": ">192.0.2.8:443", - "id": "artifact_api~>192.0.2.8:443", - "sourceData": { - "id": "artifact_api", - "service.environment": "development", - "service.name": "artifact_api", - "agent.name": "nodejs", - "service.framework.name": "express" - }, - "targetData": { - "span.subtype": "https", - "span.destination.service.resource": "192.0.2.8:443", - "span.type": "external", - "id": ">192.0.2.8:443", - "label": ">192.0.2.8:443" - } - } - }, - { - "data": { - "source": "artifact_api", - "target": ">192.0.2.69:443", - "id": "artifact_api~>192.0.2.69:443", - "sourceData": { - "id": "artifact_api", - "service.environment": "development", - "service.name": "artifact_api", - "agent.name": "nodejs", - "service.framework.name": "express" - }, - "targetData": { - "span.subtype": "https", - "span.destination.service.resource": "192.0.2.69:443", - "span.type": "external", - "id": ">192.0.2.69:443", - "label": ">192.0.2.69:443" - } - } - }, - { - "data": { - "source": "artifact_api", - "target": ">192.0.2.5:443", - "id": "artifact_api~>192.0.2.5:443", - "sourceData": { - "id": "artifact_api", - "service.environment": "development", - "service.name": "artifact_api", - "agent.name": "nodejs", - "service.framework.name": "express" - }, - "targetData": { - "span.subtype": "https", - "span.destination.service.resource": "192.0.2.5:443", - "span.type": "external", - "id": ">192.0.2.5:443", - "label": ">192.0.2.5:443" - } - } - }, - { - "data": { - "source": "artifact_api", - "target": ">192.0.2.139:443", - "id": "artifact_api~>192.0.2.139:443", - "sourceData": { - "id": "artifact_api", - "service.environment": "development", - "service.name": "artifact_api", - "agent.name": "nodejs", - "service.framework.name": "express" - }, - "targetData": { - "span.subtype": "https", - "span.destination.service.resource": "192.0.2.139:443", - "span.type": "external", - "id": ">192.0.2.139:443", - "label": ">192.0.2.139:443" - } - } - }, - { - "data": { - "source": "artifact_api", - "target": ">192.0.2.113:443", - "id": "artifact_api~>192.0.2.113:443", - "sourceData": { - "id": "artifact_api", - "service.environment": "development", - "service.name": "artifact_api", - "agent.name": "nodejs", - "service.framework.name": "express" - }, - "targetData": { - "span.subtype": "https", - "span.destination.service.resource": "192.0.2.113:443", - "span.type": "external", - "id": ">192.0.2.113:443", - "label": ">192.0.2.113:443" - } - } - }, - { - "data": { - "source": "artifact_api", - "target": ">192.0.2.2:443", - "id": "artifact_api~>192.0.2.2:443", - "sourceData": { - "id": "artifact_api", - "service.environment": "development", - "service.name": "artifact_api", - "agent.name": "nodejs", - "service.framework.name": "express" - }, - "targetData": { - "span.subtype": "https", - "span.destination.service.resource": "192.0.2.2:443", - "span.type": "external", - "id": ">192.0.2.2:443", - "label": ">192.0.2.2:443" - } - } - }, - { - "data": { - "source": "artifact_api", - "target": ">192.0.2.213:443", - "id": "artifact_api~>192.0.2.213:443", - "sourceData": { - "id": "artifact_api", - "service.environment": "development", - "service.name": "artifact_api", - "agent.name": "nodejs", - "service.framework.name": "express" - }, - "targetData": { - "span.subtype": "https", - "span.destination.service.resource": "192.0.2.213:443", - "span.type": "external", - "id": ">192.0.2.213:443", - "label": ">192.0.2.213:443" - } - } - }, - { - "data": { - "source": "artifact_api", - "target": ">192.0.2.153:443", - "id": "artifact_api~>192.0.2.153:443", - "sourceData": { - "id": "artifact_api", - "service.environment": "development", - "service.name": "artifact_api", - "agent.name": "nodejs", - "service.framework.name": "express" - }, - "targetData": { - "span.subtype": "https", - "span.destination.service.resource": "192.0.2.153:443", - "span.type": "external", - "id": ">192.0.2.153:443", - "label": ">192.0.2.153:443" - } - } - }, - { - "data": { - "source": "artifact_api", - "target": ">192.0.2.36:443", - "id": "artifact_api~>192.0.2.36:443", - "sourceData": { - "id": "artifact_api", - "service.environment": "development", - "service.name": "artifact_api", - "agent.name": "nodejs", - "service.framework.name": "express" - }, - "targetData": { - "span.subtype": "https", - "span.destination.service.resource": "192.0.2.36:443", - "span.type": "external", - "id": ">192.0.2.36:443", - "label": ">192.0.2.36:443" - } - } - }, - { - "data": { - "source": "artifact_api", - "target": ">192.0.2.164:443", - "id": "artifact_api~>192.0.2.164:443", - "sourceData": { - "id": "artifact_api", - "service.environment": "development", - "service.name": "artifact_api", - "agent.name": "nodejs", - "service.framework.name": "express" - }, - "targetData": { - "span.subtype": "https", - "span.destination.service.resource": "192.0.2.164:443", - "span.type": "external", - "id": ">192.0.2.164:443", - "label": ">192.0.2.164:443" - } - } - }, - { - "data": { - "source": "artifact_api", - "target": ">192.0.2.190:443", - "id": "artifact_api~>192.0.2.190:443", - "sourceData": { - "id": "artifact_api", - "service.environment": "development", - "service.name": "artifact_api", - "agent.name": "nodejs", - "service.framework.name": "express" - }, - "targetData": { - "span.subtype": "https", - "span.destination.service.resource": "192.0.2.190:443", - "span.type": "external", - "id": ">192.0.2.190:443", - "label": ">192.0.2.190:443" - } - } - }, - { - "data": { - "source": "artifact_api", - "target": ">192.0.2.9:443", - "id": "artifact_api~>192.0.2.9:443", - "sourceData": { - "id": "artifact_api", - "service.environment": "development", - "service.name": "artifact_api", - "agent.name": "nodejs", - "service.framework.name": "express" - }, - "targetData": { - "span.subtype": "https", - "span.destination.service.resource": "192.0.2.9:443", - "span.type": "external", - "id": ">192.0.2.9:443", - "label": ">192.0.2.9:443" - } - } - }, - { - "data": { - "source": "artifact_api", - "target": ">192.0.2.210:443", - "id": "artifact_api~>192.0.2.210:443", - "sourceData": { - "id": "artifact_api", - "service.environment": "development", - "service.name": "artifact_api", - "agent.name": "nodejs", - "service.framework.name": "express" - }, - "targetData": { - "span.subtype": "https", - "span.destination.service.resource": "192.0.2.210:443", - "span.type": "external", - "id": ">192.0.2.210:443", - "label": ">192.0.2.210:443" - } - } - }, - { - "data": { - "source": "artifact_api", - "target": ">192.0.2.21:443", - "id": "artifact_api~>192.0.2.21:443", - "sourceData": { - "id": "artifact_api", - "service.environment": "development", - "service.name": "artifact_api", - "agent.name": "nodejs", - "service.framework.name": "express" - }, - "targetData": { - "span.subtype": "https", - "span.destination.service.resource": "192.0.2.21:443", - "span.type": "external", - "id": ">192.0.2.21:443", - "label": ">192.0.2.21:443" - } - } - }, - { - "data": { - "source": "artifact_api", - "target": ">192.0.2.176:443", - "id": "artifact_api~>192.0.2.176:443", - "sourceData": { - "id": "artifact_api", - "service.environment": "development", - "service.name": "artifact_api", - "agent.name": "nodejs", - "service.framework.name": "express" - }, - "targetData": { - "span.subtype": "https", - "span.destination.service.resource": "192.0.2.176:443", - "span.type": "external", - "id": ">192.0.2.176:443", - "label": ">192.0.2.176:443" - } - } - }, - { - "data": { - "source": "artifact_api", - "target": ">192.0.2.81:443", - "id": "artifact_api~>192.0.2.81:443", - "sourceData": { - "id": "artifact_api", - "service.environment": "development", - "service.name": "artifact_api", - "agent.name": "nodejs", - "service.framework.name": "express" - }, - "targetData": { - "span.subtype": "https", - "span.destination.service.resource": "192.0.2.81:443", - "span.type": "external", - "id": ">192.0.2.81:443", - "label": ">192.0.2.81:443" - } - } - }, - { - "data": { - "source": "artifact_api", - "target": ">192.0.2.118:443", - "id": "artifact_api~>192.0.2.118:443", - "sourceData": { - "id": "artifact_api", - "service.environment": "development", - "service.name": "artifact_api", - "agent.name": "nodejs", - "service.framework.name": "express" - }, - "targetData": { - "span.subtype": "https", - "span.destination.service.resource": "192.0.2.118:443", - "span.type": "external", - "id": ">192.0.2.118:443", - "label": ">192.0.2.118:443" - } - } - }, - { - "data": { - "source": "artifact_api", - "target": ">192.0.2.103:443", - "id": "artifact_api~>192.0.2.103:443", - "sourceData": { - "id": "artifact_api", - "service.environment": "development", - "service.name": "artifact_api", - "agent.name": "nodejs", - "service.framework.name": "express" - }, - "targetData": { - "span.subtype": "https", - "span.destination.service.resource": "192.0.2.103:443", - "span.type": "external", - "id": ">192.0.2.103:443", - "label": ">192.0.2.103:443" - } - } - }, - { - "data": { - "source": "artifact_api", - "target": ">192.0.2.3:443", - "id": "artifact_api~>192.0.2.3:443", - "sourceData": { - "id": "artifact_api", - "service.environment": "development", - "service.name": "artifact_api", - "agent.name": "nodejs", - "service.framework.name": "express" - }, - "targetData": { - "span.subtype": "https", - "span.destination.service.resource": "192.0.2.3:443", - "span.type": "external", - "id": ">192.0.2.3:443", - "label": ">192.0.2.3:443" - } - } - }, - { - "data": { - "source": "artifact_api", - "target": ">192.0.2.135:443", - "id": "artifact_api~>192.0.2.135:443", - "sourceData": { - "id": "artifact_api", - "service.environment": "development", - "service.name": "artifact_api", - "agent.name": "nodejs", - "service.framework.name": "express" - }, - "targetData": { - "span.subtype": "https", - "span.destination.service.resource": "192.0.2.135:443", - "span.type": "external", - "id": ">192.0.2.135:443", - "label": ">192.0.2.135:443" - } - } - }, - { - "data": { - "source": "artifact_api", - "target": ">192.0.2.26:443", - "id": "artifact_api~>192.0.2.26:443", - "sourceData": { - "id": "artifact_api", - "service.environment": "development", - "service.name": "artifact_api", - "agent.name": "nodejs", - "service.framework.name": "express" - }, - "targetData": { - "span.subtype": "https", - "span.destination.service.resource": "192.0.2.26:443", - "span.type": "external", - "id": ">192.0.2.26:443", - "label": ">192.0.2.26:443" - } - } - }, - { - "data": { - "source": "artifact_api", - "target": ">192.0.2.185:443", - "id": "artifact_api~>192.0.2.185:443", - "sourceData": { - "id": "artifact_api", - "service.environment": "development", - "service.name": "artifact_api", - "agent.name": "nodejs", - "service.framework.name": "express" - }, - "targetData": { - "span.subtype": "https", - "span.destination.service.resource": "192.0.2.185:443", - "span.type": "external", - "id": ">192.0.2.185:443", - "label": ">192.0.2.185:443" - } - } - }, - { - "data": { - "source": "artifact_api", - "target": ">192.0.2.173:443", - "id": "artifact_api~>192.0.2.173:443", - "sourceData": { - "id": "artifact_api", - "service.environment": "development", - "service.name": "artifact_api", - "agent.name": "nodejs", - "service.framework.name": "express" - }, - "targetData": { - "span.subtype": "https", - "span.destination.service.resource": "192.0.2.173:443", - "span.type": "external", - "id": ">192.0.2.173:443", - "label": ">192.0.2.173:443" - } - } - }, - { - "data": { - "source": "artifact_api", - "target": ">192.0.2.45:443", - "id": "artifact_api~>192.0.2.45:443", - "sourceData": { - "id": "artifact_api", - "service.environment": "development", - "service.name": "artifact_api", - "agent.name": "nodejs", - "service.framework.name": "express" - }, - "targetData": { - "span.subtype": "https", - "span.destination.service.resource": "192.0.2.45:443", - "span.type": "external", - "id": ">192.0.2.45:443", - "label": ">192.0.2.45:443" - } - } - }, - { - "data": { - "source": "artifact_api", - "target": ">192.0.2.144:443", - "id": "artifact_api~>192.0.2.144:443", - "sourceData": { - "id": "artifact_api", - "service.environment": "development", - "service.name": "artifact_api", - "agent.name": "nodejs", - "service.framework.name": "express" - }, - "targetData": { - "span.subtype": "https", - "span.destination.service.resource": "192.0.2.144:443", - "span.type": "external", - "id": ">192.0.2.144:443", - "label": ">192.0.2.144:443" - } - } - }, - { - "data": { - "source": "artifact_api", - "target": ">192.0.2.165:443", - "id": "artifact_api~>192.0.2.165:443", - "sourceData": { - "id": "artifact_api", - "service.environment": "development", - "service.name": "artifact_api", - "agent.name": "nodejs", - "service.framework.name": "express" - }, - "targetData": { - "span.subtype": "https", - "span.destination.service.resource": "192.0.2.165:443", - "span.type": "external", - "id": ">192.0.2.165:443", - "label": ">192.0.2.165:443" - } - } - }, - { - "data": { - "source": "artifact_api", - "target": ">192.0.2.119:443", - "id": "artifact_api~>192.0.2.119:443", - "sourceData": { - "id": "artifact_api", - "service.environment": "development", - "service.name": "artifact_api", - "agent.name": "nodejs", - "service.framework.name": "express" - }, - "targetData": { - "span.subtype": "https", - "span.destination.service.resource": "192.0.2.119:443", - "span.type": "external", - "id": ">192.0.2.119:443", - "label": ">192.0.2.119:443" - } - } - }, - { - "data": { - "source": "artifact_api", - "target": ">192.0.2.186:443", - "id": "artifact_api~>192.0.2.186:443", - "sourceData": { - "id": "artifact_api", - "service.environment": "development", - "service.name": "artifact_api", - "agent.name": "nodejs", - "service.framework.name": "express" - }, - "targetData": { - "span.subtype": "https", - "span.destination.service.resource": "192.0.2.186:443", - "span.type": "external", - "id": ">192.0.2.186:443", - "label": ">192.0.2.186:443" - } - } - }, - { - "data": { - "source": "artifact_api", - "target": ">192.0.2.54:443", - "id": "artifact_api~>192.0.2.54:443", - "sourceData": { - "id": "artifact_api", - "service.environment": "development", - "service.name": "artifact_api", - "agent.name": "nodejs", - "service.framework.name": "express" - }, - "targetData": { - "span.subtype": "https", - "span.destination.service.resource": "192.0.2.54:443", - "span.type": "external", - "id": ">192.0.2.54:443", - "label": ">192.0.2.54:443" - } - } - }, - { - "data": { - "source": "artifact_api", - "target": ">192.0.2.23:443", - "id": "artifact_api~>192.0.2.23:443", - "sourceData": { - "id": "artifact_api", - "service.environment": "development", - "service.name": "artifact_api", - "agent.name": "nodejs", - "service.framework.name": "express" - }, - "targetData": { - "span.subtype": "https", - "span.destination.service.resource": "192.0.2.23:443", - "span.type": "external", - "id": ">192.0.2.23:443", - "label": ">192.0.2.23:443" - } - } - }, - { - "data": { - "source": "artifact_api", - "target": ">192.0.2.34:443", - "id": "artifact_api~>192.0.2.34:443", - "sourceData": { - "id": "artifact_api", - "service.environment": "development", - "service.name": "artifact_api", - "agent.name": "nodejs", - "service.framework.name": "express" - }, - "targetData": { - "span.subtype": "https", - "span.destination.service.resource": "192.0.2.34:443", - "span.type": "external", - "id": ">192.0.2.34:443", - "label": ">192.0.2.34:443" - } - } - }, - { - "data": { - "source": "artifact_api", - "target": ">192.0.2.169:443", - "id": "artifact_api~>192.0.2.169:443", - "sourceData": { - "id": "artifact_api", - "service.environment": "development", - "service.name": "artifact_api", - "agent.name": "nodejs", - "service.framework.name": "express" - }, - "targetData": { - "span.subtype": "https", - "span.destination.service.resource": "192.0.2.169:443", - "span.type": "external", - "id": ">192.0.2.169:443", - "label": ">192.0.2.169:443" - } - } - }, - { - "data": { - "source": "artifact_api", - "target": ">192.0.2.226:443", - "id": "artifact_api~>192.0.2.226:443", - "sourceData": { - "id": "artifact_api", - "service.environment": "development", - "service.name": "artifact_api", - "agent.name": "nodejs", - "service.framework.name": "express" - }, - "targetData": { - "span.subtype": "https", - "span.destination.service.resource": "192.0.2.226:443", - "span.type": "external", - "id": ">192.0.2.226:443", - "label": ">192.0.2.226:443" - } - } - }, - { - "data": { - "source": "artifact_api", - "target": ">192.0.2.82:443", - "id": "artifact_api~>192.0.2.82:443", - "sourceData": { - "id": "artifact_api", - "service.environment": "development", - "service.name": "artifact_api", - "agent.name": "nodejs", - "service.framework.name": "express" - }, - "targetData": { - "span.subtype": "https", - "span.destination.service.resource": "192.0.2.82:443", - "span.type": "external", - "id": ">192.0.2.82:443", - "label": ">192.0.2.82:443" - } - } - }, - { - "data": { - "source": "artifact_api", - "target": ">192.0.2.132:443", - "id": "artifact_api~>192.0.2.132:443", - "sourceData": { - "id": "artifact_api", - "service.environment": "development", - "service.name": "artifact_api", - "agent.name": "nodejs", - "service.framework.name": "express" - }, - "targetData": { - "span.subtype": "https", - "span.destination.service.resource": "192.0.2.132:443", - "span.type": "external", - "id": ">192.0.2.132:443", - "label": ">192.0.2.132:443" - } - } - }, - { - "data": { - "source": "artifact_api", - "target": ">192.0.2.78:443", - "id": "artifact_api~>192.0.2.78:443", - "sourceData": { - "id": "artifact_api", - "service.environment": "development", - "service.name": "artifact_api", - "agent.name": "nodejs", - "service.framework.name": "express" - }, - "targetData": { - "span.subtype": "https", - "span.destination.service.resource": "192.0.2.78:443", - "span.type": "external", - "id": ">192.0.2.78:443", - "label": ">192.0.2.78:443" - } - } - }, - { - "data": { - "source": "artifact_api", - "target": ">192.0.2.71:443", - "id": "artifact_api~>192.0.2.71:443", - "sourceData": { - "id": "artifact_api", - "service.environment": "development", - "service.name": "artifact_api", - "agent.name": "nodejs", - "service.framework.name": "express" - }, - "targetData": { - "span.subtype": "https", - "span.destination.service.resource": "192.0.2.71:443", - "span.type": "external", - "id": ">192.0.2.71:443", - "label": ">192.0.2.71:443" - } - } - }, - { - "data": { - "source": "artifact_api", - "target": ">192.0.2.48:443", - "id": "artifact_api~>192.0.2.48:443", - "sourceData": { - "id": "artifact_api", - "service.environment": "development", - "service.name": "artifact_api", - "agent.name": "nodejs", - "service.framework.name": "express" - }, - "targetData": { - "span.subtype": "https", - "span.destination.service.resource": "192.0.2.48:443", - "span.type": "external", - "id": ">192.0.2.48:443", - "label": ">192.0.2.48:443" - } - } - }, - { - "data": { - "source": "artifact_api", - "target": ">192.0.2.107:443", - "id": "artifact_api~>192.0.2.107:443", - "sourceData": { - "id": "artifact_api", - "service.environment": "development", - "service.name": "artifact_api", - "agent.name": "nodejs", - "service.framework.name": "express" - }, - "targetData": { - "span.subtype": "https", - "span.destination.service.resource": "192.0.2.107:443", - "span.type": "external", - "id": ">192.0.2.107:443", - "label": ">192.0.2.107:443" - } - } - }, - { - "data": { - "source": "artifact_api", - "target": ">192.0.2.239:443", - "id": "artifact_api~>192.0.2.239:443", - "sourceData": { - "id": "artifact_api", - "service.environment": "development", - "service.name": "artifact_api", - "agent.name": "nodejs", - "service.framework.name": "express" - }, - "targetData": { - "span.subtype": "https", - "span.destination.service.resource": "192.0.2.239:443", - "span.type": "external", - "id": ">192.0.2.239:443", - "label": ">192.0.2.239:443" - } - } - }, - { - "data": { - "source": "artifact_api", - "target": ">192.0.2.209:443", - "id": "artifact_api~>192.0.2.209:443", - "sourceData": { - "id": "artifact_api", - "service.environment": "development", - "service.name": "artifact_api", - "agent.name": "nodejs", - "service.framework.name": "express" - }, - "targetData": { - "span.subtype": "https", - "span.destination.service.resource": "192.0.2.209:443", - "span.type": "external", - "id": ">192.0.2.209:443", - "label": ">192.0.2.209:443" - } - } - }, - { - "data": { - "source": "artifact_api", - "target": ">192.0.2.248:443", - "id": "artifact_api~>192.0.2.248:443", - "sourceData": { - "id": "artifact_api", - "service.environment": "development", - "service.name": "artifact_api", - "agent.name": "nodejs", - "service.framework.name": "express" - }, - "targetData": { - "span.subtype": "https", - "span.destination.service.resource": "192.0.2.248:443", - "span.type": "external", - "id": ">192.0.2.248:443", - "label": ">192.0.2.248:443" - } - } - }, - { - "data": { - "source": "artifact_api", - "target": ">192.0.2.18:443", - "id": "artifact_api~>192.0.2.18:443", - "sourceData": { - "id": "artifact_api", - "service.environment": "development", - "service.name": "artifact_api", - "agent.name": "nodejs", - "service.framework.name": "express" - }, - "targetData": { - "span.subtype": "https", - "span.destination.service.resource": "192.0.2.18:443", - "span.type": "external", - "id": ">192.0.2.18:443", - "label": ">192.0.2.18:443" - } - } - }, - { - "data": { - "source": "artifact_api", - "target": ">192.0.2.228:443", - "id": "artifact_api~>192.0.2.228:443", - "sourceData": { - "id": "artifact_api", - "service.environment": "development", - "service.name": "artifact_api", - "agent.name": "nodejs", - "service.framework.name": "express" - }, - "targetData": { - "span.subtype": "https", - "span.destination.service.resource": "192.0.2.228:443", - "span.type": "external", - "id": ">192.0.2.228:443", - "label": ">192.0.2.228:443" - } - } - }, - { - "data": { - "source": "artifact_api", - "target": ">192.0.2.145:443", - "id": "artifact_api~>192.0.2.145:443", - "sourceData": { - "id": "artifact_api", - "service.environment": "development", - "service.name": "artifact_api", - "agent.name": "nodejs", - "service.framework.name": "express" - }, - "targetData": { - "span.subtype": "https", - "span.destination.service.resource": "192.0.2.145:443", - "span.type": "external", - "id": ">192.0.2.145:443", - "label": ">192.0.2.145:443" - } - } - }, - { - "data": { - "source": "artifact_api", - "target": ">192.0.2.25:443", - "id": "artifact_api~>192.0.2.25:443", - "sourceData": { - "id": "artifact_api", - "service.environment": "development", - "service.name": "artifact_api", - "agent.name": "nodejs", - "service.framework.name": "express" - }, - "targetData": { - "span.subtype": "https", - "span.destination.service.resource": "192.0.2.25:443", - "span.type": "external", - "id": ">192.0.2.25:443", - "label": ">192.0.2.25:443" - } - } - }, - { - "data": { - "source": "artifact_api", - "target": ">192.0.2.162:443", - "id": "artifact_api~>192.0.2.162:443", - "sourceData": { - "id": "artifact_api", - "service.environment": "development", - "service.name": "artifact_api", - "agent.name": "nodejs", - "service.framework.name": "express" - }, - "targetData": { - "span.subtype": "https", - "span.destination.service.resource": "192.0.2.162:443", - "span.type": "external", - "id": ">192.0.2.162:443", - "label": ">192.0.2.162:443" - } - } - }, - { - "data": { - "source": "artifact_api", - "target": ">192.0.2.202:443", - "id": "artifact_api~>192.0.2.202:443", - "sourceData": { - "id": "artifact_api", - "service.environment": "development", - "service.name": "artifact_api", - "agent.name": "nodejs", - "service.framework.name": "express" - }, - "targetData": { - "span.subtype": "https", - "span.destination.service.resource": "192.0.2.202:443", - "span.type": "external", - "id": ">192.0.2.202:443", - "label": ">192.0.2.202:443" - } - } - }, - { - "data": { - "source": "artifact_api", - "target": ">192.0.2.60:443", - "id": "artifact_api~>192.0.2.60:443", - "sourceData": { - "id": "artifact_api", - "service.environment": "development", - "service.name": "artifact_api", - "agent.name": "nodejs", - "service.framework.name": "express" - }, - "targetData": { - "span.subtype": "https", - "span.destination.service.resource": "192.0.2.60:443", - "span.type": "external", - "id": ">192.0.2.60:443", - "label": ">192.0.2.60:443" - } - } - }, - { - "data": { - "source": "artifact_api", - "target": ">192.0.2.59:443", - "id": "artifact_api~>192.0.2.59:443", - "sourceData": { - "id": "artifact_api", - "service.environment": "development", - "service.name": "artifact_api", - "agent.name": "nodejs", - "service.framework.name": "express" - }, - "targetData": { - "span.subtype": "https", - "span.destination.service.resource": "192.0.2.59:443", - "span.type": "external", - "id": ">192.0.2.59:443", - "label": ">192.0.2.59:443" - } - } - }, - { - "data": { - "source": "artifact_api", - "target": ">192.0.2.114:443", - "id": "artifact_api~>192.0.2.114:443", - "sourceData": { - "id": "artifact_api", - "service.environment": "development", - "service.name": "artifact_api", - "agent.name": "nodejs", - "service.framework.name": "express" - }, - "targetData": { - "span.subtype": "https", - "span.destination.service.resource": "192.0.2.114:443", - "span.type": "external", - "id": ">192.0.2.114:443", - "label": ">192.0.2.114:443" - } - } - }, - { - "data": { - "source": "artifact_api", - "target": ">192.0.2.215:443", - "id": "artifact_api~>192.0.2.215:443", - "sourceData": { - "id": "artifact_api", - "service.environment": "development", - "service.name": "artifact_api", - "agent.name": "nodejs", - "service.framework.name": "express" - }, - "targetData": { - "span.subtype": "https", - "span.destination.service.resource": "192.0.2.215:443", - "span.type": "external", - "id": ">192.0.2.215:443", - "label": ">192.0.2.215:443" - } - } - }, - { - "data": { - "source": "artifact_api", - "target": ">192.0.2.238:443", - "id": "artifact_api~>192.0.2.238:443", - "sourceData": { - "id": "artifact_api", - "service.environment": "development", - "service.name": "artifact_api", - "agent.name": "nodejs", - "service.framework.name": "express" - }, - "targetData": { - "span.subtype": "https", - "span.destination.service.resource": "192.0.2.238:443", - "span.type": "external", - "id": ">192.0.2.238:443", - "label": ">192.0.2.238:443" - } - } - }, - { - "data": { - "source": "artifact_api", - "target": ">192.0.2.160:443", - "id": "artifact_api~>192.0.2.160:443", - "sourceData": { - "id": "artifact_api", - "service.environment": "development", - "service.name": "artifact_api", - "agent.name": "nodejs", - "service.framework.name": "express" - }, - "targetData": { - "span.subtype": "https", - "span.destination.service.resource": "192.0.2.160:443", - "span.type": "external", - "id": ">192.0.2.160:443", - "label": ">192.0.2.160:443" - } - } - }, - { - "data": { - "source": "artifact_api", - "target": ">192.0.2.70:443", - "id": "artifact_api~>192.0.2.70:443", - "sourceData": { - "id": "artifact_api", - "service.environment": "development", - "service.name": "artifact_api", - "agent.name": "nodejs", - "service.framework.name": "express" - }, - "targetData": { - "span.subtype": "https", - "span.destination.service.resource": "192.0.2.70:443", - "span.type": "external", - "id": ">192.0.2.70:443", - "label": ">192.0.2.70:443" - } - } - }, - { - "data": { - "id": "artifact_api", - "service.environment": "development", - "service.name": "artifact_api", - "agent.name": "nodejs", - "service.framework.name": "express" - } - }, - { - "data": { - "span.subtype": "http", - "span.destination.service.resource": "192.0.2.99:80", - "span.type": "external", - "id": ">192.0.2.99:80", - "label": ">192.0.2.99:80" - } - }, - { - "data": { - "span.subtype": "https", - "span.destination.service.resource": "192.0.2.186:443", - "span.type": "external", - "id": ">192.0.2.186:443", - "label": ">192.0.2.186:443" - } - }, - { - "data": { - "span.subtype": "https", - "span.destination.service.resource": "192.0.2.78:443", - "span.type": "external", - "id": ">192.0.2.78:443", - "label": ">192.0.2.78:443" - } - }, - { - "data": { - "span.subtype": "https", - "span.destination.service.resource": "192.0.2.226:443", - "span.type": "external", - "id": ">192.0.2.226:443", - "label": ">192.0.2.226:443" - } - }, - { - "data": { - "span.subtype": "https", - "span.destination.service.resource": "192.0.2.245:443", - "span.type": "external", - "id": ">192.0.2.245:443", - "label": ">192.0.2.245:443" - } - }, - { - "data": { - "span.subtype": "https", - "span.destination.service.resource": "192.0.2.77:443", - "span.type": "external", - "id": ">192.0.2.77:443", - "label": ">192.0.2.77:443" - } - }, - { - "data": { - "span.subtype": "https", - "span.destination.service.resource": "192.0.2.2:443", - "span.type": "external", - "id": ">192.0.2.2:443", - "label": ">192.0.2.2:443" - } - }, - { - "data": { - "span.subtype": "https", - "span.destination.service.resource": "192.0.2.198:443", - "span.type": "external", - "id": ">192.0.2.198:443", - "label": ">192.0.2.198:443" - } - }, - { - "data": { - "span.subtype": "https", - "span.destination.service.resource": "192.0.2.113:443", - "span.type": "external", - "id": ">192.0.2.113:443", - "label": ">192.0.2.113:443" - } - }, - { - "data": { - "span.subtype": "https", - "span.destination.service.resource": "192.0.2.39:443", - "span.type": "external", - "id": ">192.0.2.39:443", - "label": ">192.0.2.39:443" - } - }, - { - "data": { - "span.subtype": "https", - "span.destination.service.resource": "192.0.2.83:443", - "span.type": "external", - "id": ">192.0.2.83:443", - "label": ">192.0.2.83:443" - } - }, - { - "data": { - "span.subtype": "https", - "span.destination.service.resource": "192.0.2.5:443", - "span.type": "external", - "id": ">192.0.2.5:443", - "label": ">192.0.2.5:443" - } - }, - { - "data": { - "span.subtype": "https", - "span.destination.service.resource": "192.0.2.165:443", - "span.type": "external", - "id": ">192.0.2.165:443", - "label": ">192.0.2.165:443" - } - }, - { - "data": { - "span.subtype": "https", - "span.destination.service.resource": "192.0.2.156:443", - "span.type": "external", - "id": ">192.0.2.156:443", - "label": ">192.0.2.156:443" - } - }, - { - "data": { - "span.subtype": "https", - "span.destination.service.resource": "192.0.2.132:443", - "span.type": "external", - "id": ">192.0.2.132:443", - "label": ">192.0.2.132:443" - } - }, - { - "data": { - "span.subtype": "https", - "span.destination.service.resource": "192.0.2.240:443", - "span.type": "external", - "id": ">192.0.2.240:443", - "label": ">192.0.2.240:443" - } - }, - { - "data": { - "span.subtype": "https", - "span.destination.service.resource": "192.0.2.54:443", - "span.type": "external", - "id": ">192.0.2.54:443", - "label": ">192.0.2.54:443" - } - }, - { - "data": { - "span.subtype": "https", - "span.destination.service.resource": "192.0.2.213:443", - "span.type": "external", - "id": ">192.0.2.213:443", - "label": ">192.0.2.213:443" - } - }, - { - "data": { - "span.subtype": "https", - "span.destination.service.resource": "192.0.2.81:443", - "span.type": "external", - "id": ">192.0.2.81:443", - "label": ">192.0.2.81:443" - } - }, - { - "data": { - "span.subtype": "https", - "span.destination.service.resource": "192.0.2.176:443", - "span.type": "external", - "id": ">192.0.2.176:443", - "label": ">192.0.2.176:443" - } - }, - { - "data": { - "span.subtype": "https", - "span.destination.service.resource": "192.0.2.82:443", - "span.type": "external", - "id": ">192.0.2.82:443", - "label": ">192.0.2.82:443" - } - }, - { - "data": { - "span.subtype": "https", - "span.destination.service.resource": "192.0.2.23:443", - "span.type": "external", - "id": ">192.0.2.23:443", - "label": ">192.0.2.23:443" - } - }, - { - "data": { - "span.subtype": "https", - "span.destination.service.resource": "192.0.2.189:443", - "span.type": "external", - "id": ">192.0.2.189:443", - "label": ">192.0.2.189:443" - } - }, - { - "data": { - "span.subtype": "https", - "span.destination.service.resource": "192.0.2.190:443", - "span.type": "external", - "id": ">192.0.2.190:443", - "label": ">192.0.2.190:443" - } - }, - { - "data": { - "span.subtype": "https", - "span.destination.service.resource": "192.0.2.119:443", - "span.type": "external", - "id": ">192.0.2.119:443", - "label": ">192.0.2.119:443" - } - }, - { - "data": { - "span.subtype": "https", - "span.destination.service.resource": "192.0.2.169:443", - "span.type": "external", - "id": ">192.0.2.169:443", - "label": ">192.0.2.169:443" - } - }, - { - "data": { - "span.subtype": "https", - "span.destination.service.resource": "192.0.2.210:443", - "span.type": "external", - "id": ">192.0.2.210:443", - "label": ">192.0.2.210:443" - } - }, - { - "data": { - "span.subtype": "https", - "span.destination.service.resource": "192.0.2.148:443", - "span.type": "external", - "id": ">192.0.2.148:443", - "label": ">192.0.2.148:443" - } - }, - { - "data": { - "span.subtype": "https", - "span.destination.service.resource": "192.0.2.26:443", - "span.type": "external", - "id": ">192.0.2.26:443", - "label": ">192.0.2.26:443" - } - }, - { - "data": { - "span.subtype": "https", - "span.destination.service.resource": "192.0.2.139:443", - "span.type": "external", - "id": ">192.0.2.139:443", - "label": ">192.0.2.139:443" - } - }, - { - "data": { - "span.subtype": "https", - "span.destination.service.resource": "192.0.2.111:443", - "span.type": "external", - "id": ">192.0.2.111:443", - "label": ">192.0.2.111:443" - } - }, - { - "data": { - "span.subtype": "https", - "span.destination.service.resource": "192.0.2.13:443", - "span.type": "external", - "id": ">192.0.2.13:443", - "label": ">192.0.2.13:443" - } - }, - { - "data": { - "span.subtype": "https", - "span.destination.service.resource": "192.0.2.36:443", - "span.type": "external", - "id": ">192.0.2.36:443", - "label": ">192.0.2.36:443" - } - }, - { - "data": { - "span.subtype": "https", - "span.destination.service.resource": "192.0.2.69:443", - "span.type": "external", - "id": ">192.0.2.69:443", - "label": ">192.0.2.69:443" - } - }, - { - "data": { - "span.subtype": "https", - "span.destination.service.resource": "192.0.2.173:443", - "span.type": "external", - "id": ">192.0.2.173:443", - "label": ">192.0.2.173:443" - } - }, - { - "data": { - "span.subtype": "https", - "span.destination.service.resource": "192.0.2.144:443", - "span.type": "external", - "id": ">192.0.2.144:443", - "label": ">192.0.2.144:443" - } - }, - { - "data": { - "span.subtype": "https", - "span.destination.service.resource": "192.0.2.135:443", - "span.type": "external", - "id": ">192.0.2.135:443", - "label": ">192.0.2.135:443" - } - }, - { - "data": { - "span.subtype": "https", - "span.destination.service.resource": "192.0.2.21:443", - "span.type": "external", - "id": ">192.0.2.21:443", - "label": ">192.0.2.21:443" - } - }, - { - "data": { - "span.subtype": "https", - "span.destination.service.resource": "192.0.2.118:443", - "span.type": "external", - "id": ">192.0.2.118:443", - "label": ">192.0.2.118:443" - } - }, - { - "data": { - "span.subtype": "https", - "span.destination.service.resource": "192.0.2.42:443", - "span.type": "external", - "id": ">192.0.2.42:443", - "label": ">192.0.2.42:443" - } - }, - { - "data": { - "span.subtype": "https", - "span.destination.service.resource": "192.0.2.106:443", - "span.type": "external", - "id": ">192.0.2.106:443", - "label": ">192.0.2.106:443" - } - }, - { - "data": { - "span.subtype": "https", - "span.destination.service.resource": "192.0.2.3:443", - "span.type": "external", - "id": ">192.0.2.3:443", - "label": ">192.0.2.3:443" - } - }, - { - "data": { - "span.subtype": "https", - "span.destination.service.resource": "192.0.2.34:443", - "span.type": "external", - "id": ">192.0.2.34:443", - "label": ">192.0.2.34:443" - } - }, - { - "data": { - "span.subtype": "https", - "span.destination.service.resource": "192.0.2.185:443", - "span.type": "external", - "id": ">192.0.2.185:443", - "label": ">192.0.2.185:443" - } - }, - { - "data": { - "span.subtype": "https", - "span.destination.service.resource": "192.0.2.153:443", - "span.type": "external", - "id": ">192.0.2.153:443", - "label": ">192.0.2.153:443" - } - }, - { - "data": { - "span.subtype": "https", - "span.destination.service.resource": "192.0.2.9:443", - "span.type": "external", - "id": ">192.0.2.9:443", - "label": ">192.0.2.9:443" - } - }, - { - "data": { - "span.subtype": "https", - "span.destination.service.resource": "192.0.2.164:443", - "span.type": "external", - "id": ">192.0.2.164:443", - "label": ">192.0.2.164:443" - } - }, - { - "data": { - "span.subtype": "https", - "span.destination.service.resource": "192.0.2.47:443", - "span.type": "external", - "id": ">192.0.2.47:443", - "label": ">192.0.2.47:443" - } - }, - { - "data": { - "span.subtype": "https", - "span.destination.service.resource": "192.0.2.45:443", - "span.type": "external", - "id": ">192.0.2.45:443", - "label": ">192.0.2.45:443" - } - }, - { - "data": { - "span.subtype": "https", - "span.destination.service.resource": "192.0.2.8:443", - "span.type": "external", - "id": ">192.0.2.8:443", - "label": ">192.0.2.8:443" - } - }, - { - "data": { - "span.subtype": "https", - "span.destination.service.resource": "192.0.2.103:443", - "span.type": "external", - "id": ">192.0.2.103:443", - "label": ">192.0.2.103:443" - } - }, - { - "data": { - "span.subtype": "https", - "span.destination.service.resource": "192.0.2.60:443", - "span.type": "external", - "id": ">192.0.2.60:443", - "label": ">192.0.2.60:443" - } - }, - { - "data": { - "span.subtype": "https", - "span.destination.service.resource": "192.0.2.202:443", - "span.type": "external", - "id": ">192.0.2.202:443", - "label": ">192.0.2.202:443" - } - }, - { - "data": { - "span.subtype": "https", - "span.destination.service.resource": "192.0.2.70:443", - "span.type": "external", - "id": ">192.0.2.70:443", - "label": ">192.0.2.70:443" - } - }, - { - "data": { - "span.subtype": "https", - "span.destination.service.resource": "192.0.2.114:443", - "span.type": "external", - "id": ">192.0.2.114:443", - "label": ">192.0.2.114:443" - } - }, - { - "data": { - "span.subtype": "https", - "span.destination.service.resource": "192.0.2.25:443", - "span.type": "external", - "id": ">192.0.2.25:443", - "label": ">192.0.2.25:443" - } - }, - { - "data": { - "span.subtype": "https", - "span.destination.service.resource": "192.0.2.209:443", - "span.type": "external", - "id": ">192.0.2.209:443", - "label": ">192.0.2.209:443" - } - }, - { - "data": { - "span.subtype": "https", - "span.destination.service.resource": "192.0.2.248:443", - "span.type": "external", - "id": ">192.0.2.248:443", - "label": ">192.0.2.248:443" - } - }, - { - "data": { - "span.subtype": "https", - "span.destination.service.resource": "192.0.2.18:443", - "span.type": "external", - "id": ">192.0.2.18:443", - "label": ">192.0.2.18:443" - } - }, - { - "data": { - "span.subtype": "https", - "span.destination.service.resource": "192.0.2.107:443", - "span.type": "external", - "id": ">192.0.2.107:443", - "label": ">192.0.2.107:443" - } - }, - { - "data": { - "span.subtype": "https", - "span.destination.service.resource": "192.0.2.160:443", - "span.type": "external", - "id": ">192.0.2.160:443", - "label": ">192.0.2.160:443" - } - }, - { - "data": { - "span.subtype": "https", - "span.destination.service.resource": "192.0.2.228:443", - "span.type": "external", - "id": ">192.0.2.228:443", - "label": ">192.0.2.228:443" - } - }, - { - "data": { - "span.subtype": "https", - "span.destination.service.resource": "192.0.2.215:443", - "span.type": "external", - "id": ">192.0.2.215:443", - "label": ">192.0.2.215:443" - } - }, - { - "data": { - "span.subtype": "https", - "span.destination.service.resource": "192.0.2.162:443", - "span.type": "external", - "id": ">192.0.2.162:443", - "label": ">192.0.2.162:443" - } - }, - { - "data": { - "span.subtype": "https", - "span.destination.service.resource": "192.0.2.238:443", - "span.type": "external", - "id": ">192.0.2.238:443", - "label": ">192.0.2.238:443" - } - }, - { - "data": { - "span.subtype": "https", - "span.destination.service.resource": "192.0.2.145:443", - "span.type": "external", - "id": ">192.0.2.145:443", - "label": ">192.0.2.145:443" - } - }, - { - "data": { - "span.subtype": "https", - "span.destination.service.resource": "192.0.2.239:443", - "span.type": "external", - "id": ">192.0.2.239:443", - "label": ">192.0.2.239:443" - } - }, - { - "data": { - "span.subtype": "https", - "span.destination.service.resource": "192.0.2.59:443", - "span.type": "external", - "id": ">192.0.2.59:443", - "label": ">192.0.2.59:443" - } - }, - { - "data": { - "span.subtype": "https", - "span.destination.service.resource": "192.0.2.71:443", - "span.type": "external", - "id": ">192.0.2.71:443", - "label": ">192.0.2.71:443" - } - }, - { - "data": { - "span.subtype": "https", - "span.destination.service.resource": "192.0.2.48:443", - "span.type": "external", - "id": ">192.0.2.48:443", - "label": ">192.0.2.48:443" - } - }, - { - "data": { - "service.name": "graphics-worker", - "agent.name": "nodejs", - "service.environment": null, - "service.framework.name": null, - "id": "graphics-worker" - } - } - ] -} diff --git a/x-pack/plugins/apm/public/components/app/ServiceMap/EmptyBanner.test.tsx b/x-pack/plugins/apm/public/components/app/ServiceMap/empty_banner.test.tsx similarity index 95% rename from x-pack/plugins/apm/public/components/app/ServiceMap/EmptyBanner.test.tsx rename to x-pack/plugins/apm/public/components/app/ServiceMap/empty_banner.test.tsx index f314fbbb1fba0..ae27d4d3baf75 100644 --- a/x-pack/plugins/apm/public/components/app/ServiceMap/EmptyBanner.test.tsx +++ b/x-pack/plugins/apm/public/components/app/ServiceMap/empty_banner.test.tsx @@ -4,7 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ -import { act, wait } from '@testing-library/react'; +import { act, waitFor } from '@testing-library/react'; import cytoscape from 'cytoscape'; import React, { ReactNode } from 'react'; import { MockApmPluginContextWrapper } from '../../../context/ApmPluginContext/MockApmPluginContext'; @@ -60,7 +60,7 @@ describe('EmptyBanner', () => { await act(async () => { cy.add({ data: { id: 'test id' } }); - await wait(() => { + await waitFor(() => { expect(component.container.children.length).toBeGreaterThan(0); }); }); diff --git a/x-pack/plugins/apm/public/components/app/ServiceOverview/__test__/__snapshots__/ServiceOverview.test.tsx.snap b/x-pack/plugins/apm/public/components/app/ServiceOverview/__test__/__snapshots__/service_overview.test.tsx.snap similarity index 100% rename from x-pack/plugins/apm/public/components/app/ServiceOverview/__test__/__snapshots__/ServiceOverview.test.tsx.snap rename to x-pack/plugins/apm/public/components/app/ServiceOverview/__test__/__snapshots__/service_overview.test.tsx.snap diff --git a/x-pack/plugins/apm/public/components/app/ServiceOverview/__test__/ServiceOverview.test.tsx b/x-pack/plugins/apm/public/components/app/ServiceOverview/__test__/service_overview.test.tsx similarity index 87% rename from x-pack/plugins/apm/public/components/app/ServiceOverview/__test__/ServiceOverview.test.tsx rename to x-pack/plugins/apm/public/components/app/ServiceOverview/__test__/service_overview.test.tsx index d8c8f25616560..06e9008d5aebe 100644 --- a/x-pack/plugins/apm/public/components/app/ServiceOverview/__test__/ServiceOverview.test.tsx +++ b/x-pack/plugins/apm/public/components/app/ServiceOverview/__test__/service_overview.test.tsx @@ -4,7 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ -import { render, wait, waitForElement } from '@testing-library/react'; +import { render, waitFor } from '@testing-library/react'; import { CoreStart } from 'kibana/public'; import { merge } from 'lodash'; import React, { FunctionComponent, ReactChild } from 'react'; @@ -129,11 +129,11 @@ describe('Service Overview -> View', () => { ], }); - const { container, getByText } = renderServiceOverview(); + const { container, findByText } = renderServiceOverview(); // wait for requests to be made - await wait(() => expect(httpGet).toHaveBeenCalledTimes(1)); - await waitForElement(() => getByText('My Python Service')); + await waitFor(() => expect(httpGet).toHaveBeenCalledTimes(1)); + await findByText('My Python Service'); expect(container.querySelectorAll('.euiTableRow')).toMatchSnapshot(); }); @@ -145,16 +145,14 @@ describe('Service Overview -> View', () => { items: [], }); - const { container, getByText } = renderServiceOverview(); + const { container, findByText } = renderServiceOverview(); // wait for requests to be made - await wait(() => expect(httpGet).toHaveBeenCalledTimes(1)); + await waitFor(() => expect(httpGet).toHaveBeenCalledTimes(1)); // wait for elements to be rendered - await waitForElement(() => - getByText( - "Looks like you don't have any APM services installed. Let's add some!" - ) + await findByText( + "Looks like you don't have any APM services installed. Let's add some!" ); expect(container.querySelectorAll('.euiTableRow')).toMatchSnapshot(); @@ -167,11 +165,11 @@ describe('Service Overview -> View', () => { items: [], }); - const { container, getByText } = renderServiceOverview(); + const { container, findByText } = renderServiceOverview(); // wait for requests to be made - await wait(() => expect(httpGet).toHaveBeenCalledTimes(1)); - await waitForElement(() => getByText('No services found')); + await waitFor(() => expect(httpGet).toHaveBeenCalledTimes(1)); + await findByText('No services found'); expect(container.querySelectorAll('.euiTableRow')).toMatchSnapshot(); }); @@ -187,7 +185,7 @@ describe('Service Overview -> View', () => { renderServiceOverview(); // wait for requests to be made - await wait(() => expect(httpGet).toHaveBeenCalledTimes(1)); + await waitFor(() => expect(httpGet).toHaveBeenCalledTimes(1)); expect(addWarning).toHaveBeenLastCalledWith( expect.objectContaining({ @@ -208,7 +206,7 @@ describe('Service Overview -> View', () => { renderServiceOverview(); // wait for requests to be made - await wait(() => expect(httpGet).toHaveBeenCalledTimes(1)); + await waitFor(() => expect(httpGet).toHaveBeenCalledTimes(1)); expect(addWarning).not.toHaveBeenCalled(); }); @@ -234,7 +232,7 @@ describe('Service Overview -> View', () => { const { queryByText } = renderServiceOverview(); // wait for requests to be made - await wait(() => expect(httpGet).toHaveBeenCalledTimes(1)); + await waitFor(() => expect(httpGet).toHaveBeenCalledTimes(1)); expect(queryByText('Health')).toBeNull(); }); @@ -261,7 +259,7 @@ describe('Service Overview -> View', () => { const { queryAllByText } = renderServiceOverview(); // wait for requests to be made - await wait(() => expect(httpGet).toHaveBeenCalledTimes(1)); + await waitFor(() => expect(httpGet).toHaveBeenCalledTimes(1)); expect(queryAllByText('Health').length).toBeGreaterThan(1); }); diff --git a/x-pack/plugins/apm/public/components/app/Settings/CustomizeUI/CustomLink/CustomLinkFlyout/LinkPreview.test.tsx b/x-pack/plugins/apm/public/components/app/Settings/CustomizeUI/CustomLink/CustomLinkFlyout/link_preview.test.tsx similarity index 97% rename from x-pack/plugins/apm/public/components/app/Settings/CustomizeUI/CustomLink/CustomLinkFlyout/LinkPreview.test.tsx rename to x-pack/plugins/apm/public/components/app/Settings/CustomizeUI/CustomLink/CustomLinkFlyout/link_preview.test.tsx index 62aa08c223bde..4ccfc5b3013e9 100644 --- a/x-pack/plugins/apm/public/components/app/Settings/CustomizeUI/CustomLink/CustomLinkFlyout/LinkPreview.test.tsx +++ b/x-pack/plugins/apm/public/components/app/Settings/CustomizeUI/CustomLink/CustomLinkFlyout/link_preview.test.tsx @@ -10,7 +10,7 @@ import { getNodeText, getByTestId, act, - wait, + waitFor, } from '@testing-library/react'; import * as apmApi from '../../../../../../services/rest/createCallApmApi'; @@ -82,7 +82,7 @@ describe('LinkPreview', () => { filters={[{ key: '', value: '' }]} /> ); - await wait(() => expect(callApmApiSpy).toHaveBeenCalled()); + await waitFor(() => expect(callApmApiSpy).toHaveBeenCalled()); expect(getElementValue(container, 'preview-label')).toEqual('foo'); expect( (getByTestId(container, 'preview-link') as HTMLAnchorElement).text diff --git a/x-pack/plugins/apm/public/components/app/Settings/CustomizeUI/CustomLink/index.test.tsx b/x-pack/plugins/apm/public/components/app/Settings/CustomizeUI/CustomLink/index.test.tsx index 56c420878cdba..fea22e890dc10 100644 --- a/x-pack/plugins/apm/public/components/app/Settings/CustomizeUI/CustomLink/index.test.tsx +++ b/x-pack/plugins/apm/public/components/app/Settings/CustomizeUI/CustomLink/index.test.tsx @@ -4,7 +4,12 @@ * you may not use this file except in compliance with the Elastic License. */ -import { fireEvent, render, wait, RenderResult } from '@testing-library/react'; +import { + fireEvent, + render, + waitFor, + RenderResult, +} from '@testing-library/react'; import React from 'react'; import { act } from 'react-dom/test-utils'; import * as apmApi from '../../../../../services/rest/createCallApmApi'; @@ -181,7 +186,7 @@ describe('CustomLink', () => { act(() => { fireEvent.click(editButtons[0]); }); - await wait(() => + await waitFor(() => expect(component.queryByText('Create link')).toBeInTheDocument() ); await act(async () => { diff --git a/x-pack/plugins/apm/public/components/app/TraceLink/__test__/TraceLink.test.tsx b/x-pack/plugins/apm/public/components/app/TraceLink/trace_link.test.tsx similarity index 83% rename from x-pack/plugins/apm/public/components/app/TraceLink/__test__/TraceLink.test.tsx rename to x-pack/plugins/apm/public/components/app/TraceLink/trace_link.test.tsx index 8d37a8e54d87c..e7c0400290dcb 100644 --- a/x-pack/plugins/apm/public/components/app/TraceLink/__test__/TraceLink.test.tsx +++ b/x-pack/plugins/apm/public/components/app/TraceLink/trace_link.test.tsx @@ -3,18 +3,18 @@ * or more contributor license agreements. Licensed under the Elastic License; * you may not use this file except in compliance with the Elastic License. */ -import { render } from '@testing-library/react'; +import { act, render, waitFor } from '@testing-library/react'; import { shallow } from 'enzyme'; import React, { ReactNode } from 'react'; import { MemoryRouter, RouteComponentProps } from 'react-router-dom'; -import { TraceLink } from '../'; -import { ApmPluginContextValue } from '../../../../context/ApmPluginContext'; +import { TraceLink } from './'; +import { ApmPluginContextValue } from '../../../context/ApmPluginContext'; import { mockApmPluginContextValue, MockApmPluginContextWrapper, -} from '../../../../context/ApmPluginContext/MockApmPluginContext'; -import * as hooks from '../../../../hooks/useFetcher'; -import * as urlParamsHooks from '../../../../hooks/useUrlParams'; +} from '../../../context/ApmPluginContext/MockApmPluginContext'; +import * as hooks from '../../../hooks/useFetcher'; +import * as urlParamsHooks from '../../../hooks/useUrlParams'; function Wrapper({ children }: { children?: ReactNode }) { return ( @@ -43,13 +43,18 @@ describe('TraceLink', () => { jest.clearAllMocks(); }); - it('renders a transition page', () => { + it('renders a transition page', async () => { const props = ({ match: { params: { traceId: 'x' } }, } as unknown) as RouteComponentProps<{ traceId: string }>; - const component = render(, renderOptions); + let result; + act(() => { + const component = render(, renderOptions); - expect(component.getByText('Fetching trace...')).toBeDefined(); + result = component.getByText('Fetching trace...'); + }); + await waitFor(() => {}); + expect(result).toBeDefined(); }); describe('when no transaction is found', () => { diff --git a/x-pack/plugins/apm/public/components/app/TransactionDetails/WaterfallWithSummmary/WaterfallContainer/WaterfallContainer.stories.tsx b/x-pack/plugins/apm/public/components/app/TransactionDetails/WaterfallWithSummmary/WaterfallContainer/WaterfallContainer.stories.tsx index 8e3d0effb97a6..e3ba02ce42c2e 100644 --- a/x-pack/plugins/apm/public/components/app/TransactionDetails/WaterfallWithSummmary/WaterfallContainer/WaterfallContainer.stories.tsx +++ b/x-pack/plugins/apm/public/components/app/TransactionDetails/WaterfallWithSummmary/WaterfallContainer/WaterfallContainer.stories.tsx @@ -4,102 +4,95 @@ * you may not use this file except in compliance with the Elastic License. */ -import React from 'react'; -import { storiesOf } from '@storybook/react'; +import React, { ComponentType } from 'react'; +import { MemoryRouter } from 'react-router-dom'; +import { EuiThemeProvider } from '../../../../../../../observability/public'; // eslint-disable-next-line @kbn/eslint/no-restricted-paths import { TraceAPIResponse } from '../../../../../../server/lib/traces/get_trace'; +import { MockApmPluginContextWrapper } from '../../../../../context/ApmPluginContext/MockApmPluginContext'; import { WaterfallContainer } from './index'; +import { getWaterfall } from './Waterfall/waterfall_helpers/waterfall_helpers'; import { + inferredSpans, location, - urlParams, simpleTrace, - traceWithErrors, traceChildStartBeforeParent, - inferredSpans, + traceWithErrors, + urlParams, } from './waterfallContainer.stories.data'; -import { getWaterfall } from './Waterfall/waterfall_helpers/waterfall_helpers'; -import { EuiThemeProvider } from '../../../../../../../observability/public'; -storiesOf('app/TransactionDetails/Waterfall', module) - .addDecorator((storyFn) => {storyFn()}) - .add( - 'example', - () => { - const waterfall = getWaterfall( - simpleTrace as TraceAPIResponse, - '975c8d5bfd1dd20b' - ); - return ( - - ); - }, - { info: { propTablesExclude: [EuiThemeProvider], source: false } } +export default { + title: 'app/TransactionDetails/Waterfall', + component: WaterfallContainer, + decorators: [ + (Story: ComponentType) => ( + + + + + + + + ), + ], +}; + +export function Example() { + const waterfall = getWaterfall( + simpleTrace as TraceAPIResponse, + '975c8d5bfd1dd20b' + ); + return ( + ); +} -storiesOf('app/TransactionDetails/Waterfall', module) - .addDecorator((storyFn) => {storyFn()}) - .add( - 'with errors', - () => { - const waterfall = getWaterfall( - (traceWithErrors as unknown) as TraceAPIResponse, - '975c8d5bfd1dd20b' - ); - return ( - - ); - }, - { info: { propTablesExclude: [EuiThemeProvider], source: false } } +export function WithErrors() { + const waterfall = getWaterfall( + (traceWithErrors as unknown) as TraceAPIResponse, + '975c8d5bfd1dd20b' ); + return ( + + ); +} -storiesOf('app/TransactionDetails/Waterfall', module) - .addDecorator((storyFn) => {storyFn()}) - .add( - 'child starts before parent', - () => { - const waterfall = getWaterfall( - traceChildStartBeforeParent as TraceAPIResponse, - '975c8d5bfd1dd20b' - ); - return ( - - ); - }, - { info: { propTablesExclude: [EuiThemeProvider], source: false } } +export function ChildStartsBeforeParent() { + const waterfall = getWaterfall( + traceChildStartBeforeParent as TraceAPIResponse, + '975c8d5bfd1dd20b' + ); + return ( + ); +} -storiesOf('app/TransactionDetails/Waterfall', module) - .addDecorator((storyFn) => {storyFn()}) - .add( - 'inferred spans', - () => { - const waterfall = getWaterfall( - inferredSpans as TraceAPIResponse, - 'f2387d37260d00bd' - ); - return ( - - ); - }, - { info: { propTablesExclude: [EuiThemeProvider], source: false } } +export function InferredSpans() { + const waterfall = getWaterfall( + inferredSpans as TraceAPIResponse, + 'f2387d37260d00bd' + ); + return ( + ); +} diff --git a/x-pack/plugins/apm/public/components/app/TransactionOverview/TransactionList/TransactionList.stories.tsx b/x-pack/plugins/apm/public/components/app/TransactionOverview/TransactionList/TransactionList.stories.tsx index a65589bdd147f..049c5934813a2 100644 --- a/x-pack/plugins/apm/public/components/app/TransactionOverview/TransactionList/TransactionList.stories.tsx +++ b/x-pack/plugins/apm/public/components/app/TransactionOverview/TransactionList/TransactionList.stories.tsx @@ -4,33 +4,45 @@ * you may not use this file except in compliance with the Elastic License. */ -import { storiesOf } from '@storybook/react'; -import React from 'react'; +import React, { ComponentType } from 'react'; +import { MemoryRouter } from 'react-router-dom'; // eslint-disable-next-line @kbn/eslint/no-restricted-paths import { TransactionGroup } from '../../../../../server/lib/transaction_groups/fetcher'; +import { MockApmPluginContextWrapper } from '../../../../context/ApmPluginContext/MockApmPluginContext'; import { TransactionList } from './'; -storiesOf('app/TransactionOverview/TransactionList', module).add( - 'Single Row', - () => { - const items: TransactionGroup[] = [ - { - key: { - ['service.name']: 'adminconsole', - ['transaction.name']: - 'GET /api/v1/regions/azure-eastus2/clusters/elasticsearch/xc18de071deb4262be54baebf5f6a1ce/proxy/_snapshot/found-snapshots/_all', - }, - transactionName: +export default { + title: 'app/TransactionOverview/TransactionList', + component: TransactionList, + decorators: [ + (Story: ComponentType) => ( + + + + + + ), + ], +}; + +export function SingleRow() { + const items: TransactionGroup[] = [ + { + key: { + ['service.name']: 'adminconsole', + ['transaction.name']: 'GET /api/v1/regions/azure-eastus2/clusters/elasticsearch/xc18de071deb4262be54baebf5f6a1ce/proxy/_snapshot/found-snapshots/_all', - serviceName: 'adminconsole', - transactionType: 'request', - p95: 11974156, - averageResponseTime: 8087434.558974359, - transactionsPerMinute: 0.40625, - impact: 100, }, - ]; + transactionName: + 'GET /api/v1/regions/azure-eastus2/clusters/elasticsearch/xc18de071deb4262be54baebf5f6a1ce/proxy/_snapshot/found-snapshots/_all', + serviceName: 'adminconsole', + transactionType: 'request', + p95: 11974156, + averageResponseTime: 8087434.558974359, + transactionsPerMinute: 0.40625, + impact: 100, + }, + ]; - return ; - } -); + return ; +} diff --git a/x-pack/plugins/apm/public/components/shared/ApmHeader/ApmHeader.stories.tsx b/x-pack/plugins/apm/public/components/shared/ApmHeader/ApmHeader.stories.tsx deleted file mode 100644 index c9b7c77409840..0000000000000 --- a/x-pack/plugins/apm/public/components/shared/ApmHeader/ApmHeader.stories.tsx +++ /dev/null @@ -1,30 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import { EuiTitle } from '@elastic/eui'; -import { storiesOf } from '@storybook/react'; -import React from 'react'; -import { MockApmPluginContextWrapper } from '../../../context/ApmPluginContext/MockApmPluginContext'; -import { ApmHeader } from './'; - -storiesOf('shared/ApmHeader', module) - .addDecorator((storyFn) => { - return ( - {storyFn()} - ); - }) - .add('Example', () => { - return ( - - -

- GET - /api/v1/regions/azure-eastus2/clusters/elasticsearch/xc18de071deb4262be54baebf5f6a1ce/proxy/_snapshot/found-snapshots/_all -

-
-
- ); - }); diff --git a/x-pack/plugins/apm/public/components/shared/ApmHeader/apm_header.stories.tsx b/x-pack/plugins/apm/public/components/shared/ApmHeader/apm_header.stories.tsx new file mode 100644 index 0000000000000..4078998bc7e3e --- /dev/null +++ b/x-pack/plugins/apm/public/components/shared/ApmHeader/apm_header.stories.tsx @@ -0,0 +1,49 @@ +/* + * 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 { EuiTitle } from '@elastic/eui'; +import React, { ComponentType } from 'react'; +import { MemoryRouter } from 'react-router-dom'; +import { HttpSetup } from '../../../../../../../src/core/public'; +import { MockApmPluginContextWrapper } from '../../../context/ApmPluginContext/MockApmPluginContext'; +import { MockUrlParamsContextProvider } from '../../../context/UrlParamsContext/MockUrlParamsContextProvider'; +import { createCallApmApi } from '../../../services/rest/createCallApmApi'; +import { ApmHeader } from './'; + +export default { + title: 'shared/ApmHeader', + component: ApmHeader, + decorators: [ + (Story: ComponentType) => { + createCallApmApi(({} as unknown) as HttpSetup); + + return ( + + + + + + + + ); + }, + ], +}; + +export function Example() { + return ( + + +

+ GET + /api/v1/regions/azure-eastus2/clusters/elasticsearch/xc18de071deb4262be54baebf5f6a1ce/proxy/_snapshot/found-snapshots/_all +

+
+
+ ); +} diff --git a/x-pack/plugins/apm/public/components/shared/DatePicker/__test__/DatePicker.test.tsx b/x-pack/plugins/apm/public/components/shared/DatePicker/date_picker.test.tsx similarity index 91% rename from x-pack/plugins/apm/public/components/shared/DatePicker/__test__/DatePicker.test.tsx rename to x-pack/plugins/apm/public/components/shared/DatePicker/date_picker.test.tsx index 9de70d50b25e1..efa827a0e5df8 100644 --- a/x-pack/plugins/apm/public/components/shared/DatePicker/__test__/DatePicker.test.tsx +++ b/x-pack/plugins/apm/public/components/shared/DatePicker/date_picker.test.tsx @@ -5,18 +5,18 @@ */ import { EuiSuperDatePicker } from '@elastic/eui'; -import { wait } from '@testing-library/react'; +import { waitFor } from '@testing-library/react'; import { mount } from 'enzyme'; import { createMemoryHistory } from 'history'; import React, { ReactNode } from 'react'; import { Router } from 'react-router-dom'; -import { MockApmPluginContextWrapper } from '../../../../context/ApmPluginContext/MockApmPluginContext'; +import { MockApmPluginContextWrapper } from '../../../context/ApmPluginContext/MockApmPluginContext'; import { UrlParamsContext, useUiFilters, -} from '../../../../context/UrlParamsContext'; -import { IUrlParams } from '../../../../context/UrlParamsContext/types'; -import { DatePicker } from '../index'; +} from '../../../context/UrlParamsContext'; +import { IUrlParams } from '../../../context/UrlParamsContext/types'; +import { DatePicker } from './'; const history = createMemoryHistory(); const mockHistoryPush = jest.spyOn(history, 'push'); @@ -124,7 +124,7 @@ describe('DatePicker', () => { }); expect(mockRefreshTimeRange).not.toHaveBeenCalled(); jest.advanceTimersByTime(1000); - await wait(); + await waitFor(() => {}); expect(mockRefreshTimeRange).toHaveBeenCalled(); wrapper.unmount(); }); @@ -134,7 +134,7 @@ describe('DatePicker', () => { mountDatePicker({ refreshPaused: true, refreshInterval: 1000 }); expect(mockRefreshTimeRange).not.toHaveBeenCalled(); jest.advanceTimersByTime(1000); - await wait(); + await waitFor(() => {}); expect(mockRefreshTimeRange).not.toHaveBeenCalled(); }); }); diff --git a/x-pack/plugins/apm/public/components/shared/LicensePrompt/LicensePrompt.stories.tsx b/x-pack/plugins/apm/public/components/shared/LicensePrompt/LicensePrompt.stories.tsx index 45fa3dd382266..1819e71a49753 100644 --- a/x-pack/plugins/apm/public/components/shared/LicensePrompt/LicensePrompt.stories.tsx +++ b/x-pack/plugins/apm/public/components/shared/LicensePrompt/LicensePrompt.stories.tsx @@ -4,31 +4,31 @@ * you may not use this file except in compliance with the Elastic License. */ -import { storiesOf } from '@storybook/react'; -import React from 'react'; +import React, { ComponentType } from 'react'; +import { LicensePrompt } from '.'; import { ApmPluginContext, ApmPluginContextValue, } from '../../../context/ApmPluginContext'; -import { LicensePrompt } from '.'; -storiesOf('app/LicensePrompt', module).add( - 'example', - () => { - const contextMock = ({ - core: { http: { basePath: { prepend: () => {} } } }, - } as unknown) as ApmPluginContextValue; +const contextMock = ({ + core: { http: { basePath: { prepend: () => {} } } }, +} as unknown) as ApmPluginContextValue; - return ( +export default { + title: 'app/LicensePrompt', + component: LicensePrompt, + decorators: [ + (Story: ComponentType) => ( - + {' '} - ); - }, - { - info: { - propTablesExclude: [ApmPluginContext.Provider, LicensePrompt], - source: false, - }, - } -); + ), + ], +}; + +export function Example() { + return ( + + ); +} diff --git a/x-pack/plugins/apm/public/components/shared/Links/DiscoverLinks/__test__/__snapshots__/DiscoverTransactionButton.test.tsx.snap b/x-pack/plugins/apm/public/components/shared/Links/DiscoverLinks/__test__/__snapshots__/discover_transaction_button.test.tsx.snap similarity index 100% rename from x-pack/plugins/apm/public/components/shared/Links/DiscoverLinks/__test__/__snapshots__/DiscoverTransactionButton.test.tsx.snap rename to x-pack/plugins/apm/public/components/shared/Links/DiscoverLinks/__test__/__snapshots__/discover_transaction_button.test.tsx.snap diff --git a/x-pack/plugins/apm/public/components/shared/Links/DiscoverLinks/__test__/DiscoverTransactionButton.test.tsx b/x-pack/plugins/apm/public/components/shared/Links/DiscoverLinks/__test__/discover_transaction_button.test.tsx similarity index 78% rename from x-pack/plugins/apm/public/components/shared/Links/DiscoverLinks/__test__/DiscoverTransactionButton.test.tsx rename to x-pack/plugins/apm/public/components/shared/Links/DiscoverLinks/__test__/discover_transaction_button.test.tsx index 17dca4796ec74..4a68a5c0b4904 100644 --- a/x-pack/plugins/apm/public/components/shared/Links/DiscoverLinks/__test__/DiscoverTransactionButton.test.tsx +++ b/x-pack/plugins/apm/public/components/shared/Links/DiscoverLinks/__test__/discover_transaction_button.test.tsx @@ -11,12 +11,11 @@ import { DiscoverTransactionLink, getDiscoverQuery, } from '../DiscoverTransactionLink'; -import mockTransaction from './mockTransaction.json'; +import mockTransaction from './mock_transaction.json'; describe('DiscoverTransactionLink component', () => { it('should render with data', () => { - // @ts-expect-error invalid json mock - const transaction: Transaction = mockTransaction; + const transaction = mockTransaction as Transaction; expect( shallow() @@ -26,8 +25,7 @@ describe('DiscoverTransactionLink component', () => { describe('getDiscoverQuery', () => { it('should return the correct query params object', () => { - // @ts-expect-error invalid json mock - const transaction: Transaction = mockTransaction; + const transaction = mockTransaction as Transaction; const result = getDiscoverQuery(transaction); expect(result).toMatchSnapshot(); }); diff --git a/x-pack/plugins/apm/public/components/shared/Links/DiscoverLinks/__test__/mockTransaction.json b/x-pack/plugins/apm/public/components/shared/Links/DiscoverLinks/__test__/mock_transaction.json similarity index 98% rename from x-pack/plugins/apm/public/components/shared/Links/DiscoverLinks/__test__/mockTransaction.json rename to x-pack/plugins/apm/public/components/shared/Links/DiscoverLinks/__test__/mock_transaction.json index 4d038cd7e8397..6c08eedf50b06 100644 --- a/x-pack/plugins/apm/public/components/shared/Links/DiscoverLinks/__test__/mockTransaction.json +++ b/x-pack/plugins/apm/public/components/shared/Links/DiscoverLinks/__test__/mock_transaction.json @@ -1,6 +1,7 @@ { "agent": { "hostname": "227453131a17", + "name": "go", "type": "apm-server", "version": "7.0.0" }, @@ -91,9 +92,7 @@ }, "name": "GET /api/products/:id/customers", "span_count": { - "dropped": { - "total": 0 - }, + "dropped": 0, "started": 1 }, "id": "8b60bd32ecc6e150", diff --git a/x-pack/plugins/apm/public/components/shared/Links/apm/AnomalyDetectionSetupLink.test.tsx b/x-pack/plugins/apm/public/components/shared/Links/apm/anomaly_detection_setup_link.test.tsx similarity index 96% rename from x-pack/plugins/apm/public/components/shared/Links/apm/AnomalyDetectionSetupLink.test.tsx rename to x-pack/plugins/apm/public/components/shared/Links/apm/anomaly_detection_setup_link.test.tsx index 585ab22b5fb27..3f675f494a661 100644 --- a/x-pack/plugins/apm/public/components/shared/Links/apm/AnomalyDetectionSetupLink.test.tsx +++ b/x-pack/plugins/apm/public/components/shared/Links/apm/anomaly_detection_setup_link.test.tsx @@ -5,7 +5,7 @@ */ import React from 'react'; -import { render, fireEvent, wait } from '@testing-library/react'; +import { render, fireEvent, waitFor } from '@testing-library/react'; import { MissingJobsAlert } from './AnomalyDetectionSetupLink'; import * as hooks from '../../../../hooks/useFetcher'; @@ -33,7 +33,7 @@ async function renderTooltipAnchor({ fireEvent.mouseOver(toolTipAnchor); // wait for tooltip text to be in the DOM - await wait(() => { + await waitFor(() => { const toolTipText = baseElement.querySelector('.euiToolTipPopover') ?.textContent; expect(toolTipText).not.toBe(undefined); diff --git a/x-pack/plugins/apm/public/context/UrlParamsContext/__tests__/UrlParamsContext.test.tsx b/x-pack/plugins/apm/public/context/UrlParamsContext/url_params_context.test.tsx similarity index 94% rename from x-pack/plugins/apm/public/context/UrlParamsContext/__tests__/UrlParamsContext.test.tsx rename to x-pack/plugins/apm/public/context/UrlParamsContext/url_params_context.test.tsx index 9989e568953f5..3a6ccce178cd4 100644 --- a/x-pack/plugins/apm/public/context/UrlParamsContext/__tests__/UrlParamsContext.test.tsx +++ b/x-pack/plugins/apm/public/context/UrlParamsContext/url_params_context.test.tsx @@ -5,14 +5,14 @@ */ import * as React from 'react'; -import { UrlParamsContext, UrlParamsProvider } from '..'; +import { UrlParamsContext, UrlParamsProvider } from './'; import { mount } from 'enzyme'; import { Location, History } from 'history'; import { MemoryRouter, Router } from 'react-router-dom'; import moment from 'moment-timezone'; -import { IUrlParams } from '../types'; -import { getParsedDate } from '../helpers'; -import { wait } from '@testing-library/react'; +import { IUrlParams } from './types'; +import { getParsedDate } from './helpers'; +import { waitFor } from '@testing-library/react'; function mountParams(location: Location) { return mount( @@ -119,13 +119,13 @@ describe('UrlParamsContext', () => { ); - await wait(); + await waitFor(() => {}); expect(calls.length).toBe(1); wrapper.find('button').simulate('click'); - await wait(); + await waitFor(() => {}); expect(calls.length).toBe(2); @@ -170,11 +170,11 @@ describe('UrlParamsContext', () => { ); - await wait(); + await waitFor(() => {}); wrapper.find('button').simulate('click'); - await wait(); + await waitFor(() => {}); const params = getDataFromOutput(wrapper); expect(params.start).toEqual('2000-06-14T00:00:00.000Z'); diff --git a/x-pack/plugins/apm/public/hooks/useFetcher.integration.test.tsx b/x-pack/plugins/apm/public/hooks/use_fetcher.integration.test.tsx similarity index 94% rename from x-pack/plugins/apm/public/hooks/useFetcher.integration.test.tsx rename to x-pack/plugins/apm/public/hooks/use_fetcher.integration.test.tsx index 0081662200b93..e837851828d94 100644 --- a/x-pack/plugins/apm/public/hooks/useFetcher.integration.test.tsx +++ b/x-pack/plugins/apm/public/hooks/use_fetcher.integration.test.tsx @@ -4,7 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ -import { render, wait } from '@testing-library/react'; +import { render, waitFor } from '@testing-library/react'; import React from 'react'; import { delay } from '../utils/testHelpers'; import { useFetcher } from './useFetcher'; @@ -65,7 +65,7 @@ describe('when simulating race condition', () => { it('should render "Hello from Peter" after 200ms', async () => { jest.advanceTimersByTime(200); - await wait(); + await waitFor(() => {}); expect(renderSpy).lastCalledWith({ data: 'Hello from Peter', @@ -76,7 +76,7 @@ describe('when simulating race condition', () => { it('should render "Hello from Peter" after 600ms', async () => { jest.advanceTimersByTime(600); - await wait(); + await waitFor(() => {}); expect(renderSpy).lastCalledWith({ data: 'Hello from Peter', @@ -87,7 +87,7 @@ describe('when simulating race condition', () => { it('should should NOT have rendered "Hello from John" at any point', async () => { jest.advanceTimersByTime(600); - await wait(); + await waitFor(() => {}); expect(renderSpy).not.toHaveBeenCalledWith({ data: 'Hello from John', @@ -98,7 +98,7 @@ describe('when simulating race condition', () => { it('should send and receive calls in the right order', async () => { jest.advanceTimersByTime(600); - await wait(); + await waitFor(() => {}); expect(requestCallOrder).toEqual([ ['request', 'John', 500], diff --git a/x-pack/plugins/apm/public/utils/testHelpers.tsx b/x-pack/plugins/apm/public/utils/testHelpers.tsx index 7826e9672a3bb..f990c4387ddf1 100644 --- a/x-pack/plugins/apm/public/utils/testHelpers.tsx +++ b/x-pack/plugins/apm/public/utils/testHelpers.tsx @@ -12,7 +12,7 @@ import enzymeToJson from 'enzyme-to-json'; import { Location } from 'history'; import moment from 'moment'; import { Moment } from 'moment-timezone'; -import { render, waitForElement } from '@testing-library/react'; +import { render, waitFor } from '@testing-library/react'; import { MemoryRouter } from 'react-router-dom'; // eslint-disable-next-line @kbn/eslint/no-restricted-paths import { APMConfig } from '../../server'; @@ -75,10 +75,10 @@ export async function getRenderedHref(Component: React.FC, location: Location) {
); + const a = el.container.querySelector('a'); - await waitForElement(() => el.container.querySelector('a')); + await waitFor(() => {}, { container: a! }); - const a = el.container.querySelector('a'); return a ? a.getAttribute('href') : ''; } diff --git a/x-pack/plugins/apm/server/lib/service_map/group_resource_nodes.test.ts b/x-pack/plugins/apm/server/lib/service_map/group_resource_nodes.test.ts index 23ef3f92e21a2..c3238963eedee 100644 --- a/x-pack/plugins/apm/server/lib/service_map/group_resource_nodes.test.ts +++ b/x-pack/plugins/apm/server/lib/service_map/group_resource_nodes.test.ts @@ -4,14 +4,16 @@ * you may not use this file except in compliance with the Elastic License. */ +import { ConnectionElement } from '../../../common/service_map'; import { groupResourceNodes } from './group_resource_nodes'; -import preGroupedData from './mock_responses/group_resource_nodes_pregrouped.json'; import expectedGroupedData from './mock_responses/group_resource_nodes_grouped.json'; +import preGroupedData from './mock_responses/group_resource_nodes_pregrouped.json'; describe('groupResourceNodes', () => { it('should group external nodes', () => { - // @ts-expect-error invalid json mock - const responseWithGroups = groupResourceNodes(preGroupedData); + const responseWithGroups = groupResourceNodes( + preGroupedData as { elements: ConnectionElement[] } + ); expect(responseWithGroups.elements).toHaveLength( expectedGroupedData.elements.length ); diff --git a/x-pack/plugins/apm/server/lib/services/annotations/__fixtures__/no_versions.json b/x-pack/plugins/apm/server/lib/services/annotations/__fixtures__/no_versions.json index fa5c63f1b9a54..863d4bed998e9 100644 --- a/x-pack/plugins/apm/server/lib/services/annotations/__fixtures__/no_versions.json +++ b/x-pack/plugins/apm/server/lib/services/annotations/__fixtures__/no_versions.json @@ -12,7 +12,7 @@ "value": 10000, "relation": "gte" }, - "max_score": null, + "max_score": 0, "hits": [] }, "aggregations": { diff --git a/x-pack/plugins/apm/server/lib/services/annotations/__fixtures__/one_version.json b/x-pack/plugins/apm/server/lib/services/annotations/__fixtures__/one_version.json index 56303909bcd6f..d74f7bf82c2b9 100644 --- a/x-pack/plugins/apm/server/lib/services/annotations/__fixtures__/one_version.json +++ b/x-pack/plugins/apm/server/lib/services/annotations/__fixtures__/one_version.json @@ -12,7 +12,7 @@ "value": 10000, "relation": "gte" }, - "max_score": null, + "max_score": 0, "hits": [] }, "aggregations": { diff --git a/x-pack/plugins/apm/server/lib/services/annotations/index.test.ts b/x-pack/plugins/apm/server/lib/services/annotations/index.test.ts index 9bd9c7b7a1040..f30b77f147710 100644 --- a/x-pack/plugins/apm/server/lib/services/annotations/index.test.ts +++ b/x-pack/plugins/apm/server/lib/services/annotations/index.test.ts @@ -3,14 +3,18 @@ * or more contributor license agreements. Licensed under the Elastic License; * you may not use this file except in compliance with the Elastic License. */ -import { getDerivedServiceAnnotations } from './get_derived_service_annotations'; import { - SearchParamsMock, + ESSearchRequest, + ESSearchResponse, +} from '../../../../typings/elasticsearch'; +import { inspectSearchParams, + SearchParamsMock, } from '../../../utils/test_helpers'; +import { getDerivedServiceAnnotations } from './get_derived_service_annotations'; +import multipleVersions from './__fixtures__/multiple_versions.json'; import noVersions from './__fixtures__/no_versions.json'; import oneVersion from './__fixtures__/one_version.json'; -import multipleVersions from './__fixtures__/multiple_versions.json'; import versionsFirstSeen from './__fixtures__/versions_first_seen.json'; describe('getServiceAnnotations', () => { @@ -31,8 +35,14 @@ describe('getServiceAnnotations', () => { searchAggregatedTransactions: false, }), { - // @ts-expect-error invalid json mock - mockResponse: () => noVersions, + mockResponse: () => + noVersions as ESSearchResponse< + unknown, + ESSearchRequest, + { + restTotalHitsAsInt: false; + } + >, } ); @@ -51,8 +61,14 @@ describe('getServiceAnnotations', () => { searchAggregatedTransactions: false, }), { - // @ts-expect-error invalid json mock - mockResponse: () => oneVersion, + mockResponse: () => + oneVersion as ESSearchResponse< + unknown, + ESSearchRequest, + { + restTotalHitsAsInt: false; + } + >, } ); @@ -76,8 +92,14 @@ describe('getServiceAnnotations', () => { searchAggregatedTransactions: false, }), { - // @ts-expect-error invalid json mock - mockResponse: () => responses.shift(), + mockResponse: () => + (responses.shift() as unknown) as ESSearchResponse< + unknown, + ESSearchRequest, + { + restTotalHitsAsInt: false; + } + >, } ); From 59e4e0631608ae58d933864a5b968511a13f2ec9 Mon Sep 17 00:00:00 2001 From: Vadim Dalecky Date: Mon, 5 Oct 2020 16:31:30 +0200 Subject: [PATCH 10/49] Drilldowns in examples (#75640) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat: 🎸 add telemetry for in-chart "Explore underlying data" * feat: 🎸 add telemetry for in-chart "Explore underlying data" * refactor: 💡 move all drilldowns into a sub-folder * feat: 🎸 setup example app section for ui_actions_enhanced * feat: 🎸 set up Drilldown Manager section * feat: 🎸 open drilldown manager from example plugin * refactor: 💡 rename supportedTriggers -> triggers prop * feat: 🎸 show dev warning if triggers prop is empty * refactor: 💡 rename "supportedTriggers" -> "triggers" props * feat: 🎸 open and close drilldown manager from example plugin * feat: 🎸 add sample ML job trigger * feat: 🎸 add sample ML URL drilldown * refactor: 💡 move KibanaURL to share plugin * refactor: 💡 add index file to ml drilldown * feat: 🎸 add AbstractDashboardDrilldown * refactor: 💡 make dashboard drilldown use abstract drilldown * refactor: 💡 rename dashboard drilldown to embeddable drilldown * feat: 🎸 add Dashboard drilldown to sample plugin * feat: 🎸 open dashboard drilldown in list view * feat: 🎸 add drilldown execute button * refactor: 💡 move drilldown React hooks into /hooks folder * test: 💍 fix tests after renaming triggers * chore: 🤖 populate "requireBundles" * fix: 🐛 fix TypeScript errors * fix: 🐛 fix Kibana plugin dependency * chore: 🤖 remoe unused import * feat: 🎸 persist drilldown manager state across app navigations * refactor: 💡 move no-embeddable example into a seprate file * feat: 🎸 set up example with embeddable * feat: 🎸 improve embeddable example * refactor: 💡 rename without embeddable example * feat: 🎸 set up no-embeddable single click example * feat: 🎸 add dashboard drilldown to single button example * fix: 🐛 remove unused margin * fix: 🐛 make "Get more actions" translation static * chore: 🤖 remove old dashboard drilldown definition * refactor: 💡 rename samples to generic names * refactor: 💡 make app 1 example drilldown "hello world" * chore: 🤖 remove unused required bundle * chore: 🤖 add dashboardEnhanced back * [kbn/optimizer] only build xpack examples when building xpack plugins * move alerting_example into x-pack/examples * remove filter for alertingExample plugin in oss plugins CI step * revert unrelated change * fix: 🐛 use correct prop name * test: 💍 fix embeddable-to-dashboard drilldown mock * test: 💍 fix a test after refactor * chore: 🤖 remove unused import * chore: 🤖 add dashboard_enahcned to example plugin * chore: 🤖 address review comments * feat: 🎸 add description to UI Actions Enhanced examples * docs: ✏️ improve docs of example plugin Co-authored-by: spalger Co-authored-by: Elastic Machine Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- src/plugins/dashboard/public/index.ts | 7 +- src/plugins/dashboard/public/plugin.tsx | 17 +- src/plugins/share/public/index.ts | 2 + src/plugins/share/public/kibana_url.ts | 44 ++++++ .../ui_actions_enhanced_examples/README.md | 74 ++++++++- .../ui_actions_enhanced_examples/kibana.json | 15 +- .../public/components/page/index.tsx | 38 +++++ .../public/components/section/index.tsx | 7 + .../public/components/section/section.tsx | 24 +++ .../public/containers/app/app.tsx | 20 +++ .../public/containers/app/index.tsx | 7 + .../drilldowns_manager/drilldowns_manager.tsx | 39 +++++ .../containers/drilldowns_manager/index.tsx | 7 + .../drilldowns_with_embeddable_example.tsx | 134 ++++++++++++++++ .../index.tsx | 7 + .../drilldowns_without_embeddable_example.tsx | 129 ++++++++++++++++ .../index.tsx | 7 + ...thout_embeddable_single_button_example.tsx | 62 ++++++++ .../index.tsx | 7 + .../public/context/context.ts | 22 +++ .../public/context}/index.ts | 2 +- .../app1_hello_world_drilldown.tsx | 66 ++++++++ .../app1_hello_world_drilldown/index.tsx | 7 + .../app1_to_dashboard_drilldown.ts | 32 ++++ .../app1_to_dashboard_drilldown/index.tsx | 7 + .../app2_to_dashboard_drilldown.ts | 32 ++++ .../app2_to_dashboard_drilldown/index.tsx | 7 + .../dashboard_hello_world_drilldown/README.md | 0 .../dashboard_hello_world_drilldown/index.tsx | 10 +- .../README.md | 0 .../index.tsx | 12 +- .../collect_config_container.tsx | 0 .../discover_drilldown_config.tsx | 0 .../discover_drilldown_config/i18n.ts | 0 .../discover_drilldown_config/index.ts | 0 .../components/index.ts | 0 .../constants.ts | 0 .../drilldown.tsx | 10 +- .../dashboard_to_discover_drilldown/i18n.ts | 0 .../dashboard_to_discover_drilldown/index.ts | 0 .../dashboard_to_discover_drilldown/types.ts | 4 +- .../button_embeddable/button_embeddable.ts | 53 +++++++ .../button_embeddable_component.tsx | 27 ++++ .../embeddables/button_embeddable/index.ts | 7 + .../public/mount.tsx | 38 +++++ .../public/plugin.ts | 146 +++++++++++++++++- .../public/triggers/index.ts | 8 + .../public/triggers/sample_app1_trigger.ts | 31 ++++ .../public/triggers/sample_app2_trigger.ts | 31 ++++ x-pack/plugins/dashboard_enhanced/kibana.json | 1 + .../dashboard_enhanced/public/index.ts | 6 + .../abstract_dashboard_drilldown.tsx | 89 +++++++++++ .../components/collect_config_container.tsx | 6 +- .../dashboard_drilldown_config.story.tsx} | 0 .../dashboard_drilldown_config.test.tsx | 0 .../dashboard_drilldown_config.tsx | 0 .../dashboard_drilldown_config/i18n.ts | 0 .../dashboard_drilldown_config/index.ts | 0 .../components/i18n.ts | 0 .../components}/index.ts | 8 +- .../i18n.ts | 0 .../abstract_dashboard_drilldown/index.ts | 11 ++ .../types.ts | 0 .../flyout_create_drilldown.tsx | 2 +- .../flyout_edit_drilldown.tsx | 2 +- .../dashboard_drilldowns_services.ts | 13 +- .../drilldown.tsx | 125 --------------- .../constants.ts | 8 +- ...mbeddable_to_dashboard_drilldown.test.tsx} | 42 ++--- .../embeddable_to_dashboard_drilldown.tsx | 83 ++++++++++ .../index.ts | 11 ++ x-pack/plugins/discover_enhanced/kibana.json | 2 +- .../abstract_explore_data_action.ts | 2 +- .../explore_data/explore_data_chart_action.ts | 2 +- .../explore_data_context_menu_action.ts | 2 +- .../public/actions/explore_data/kibana_url.ts | 31 ---- .../embeddable_action_storage.test.ts | 3 +- .../action_wizard/action_wizard.tsx | 12 +- .../components/action_wizard/test_data.tsx | 2 +- ...ected_flyout_manage_drilldowns.stories.tsx | 4 +- ...onnected_flyout_manage_drilldowns.test.tsx | 20 +-- .../connected_flyout_manage_drilldowns.tsx | 135 ++-------------- .../i18n.ts | 81 ---------- .../flyout_drilldown_wizard.tsx | 2 +- .../form_drilldown_wizard.stories.tsx | 6 +- .../form_drilldown_wizard.test.tsx | 6 +- .../form_drilldown_wizard.tsx | 26 +++- .../components/form_drilldown_wizard/i18n.ts | 7 + .../public/drilldowns/hooks/i18n.ts | 88 +++++++++++ ...le_action_factories_for_current_context.ts | 35 +++++ .../hooks/use_drilldown_state_manager.tsx | 86 +++++++++++ .../drilldowns/hooks/use_welcome_message.ts | 22 +++ 92 files changed, 1687 insertions(+), 493 deletions(-) create mode 100644 src/plugins/share/public/kibana_url.ts create mode 100644 x-pack/examples/ui_actions_enhanced_examples/public/components/page/index.tsx create mode 100644 x-pack/examples/ui_actions_enhanced_examples/public/components/section/index.tsx create mode 100644 x-pack/examples/ui_actions_enhanced_examples/public/components/section/section.tsx create mode 100644 x-pack/examples/ui_actions_enhanced_examples/public/containers/app/app.tsx create mode 100644 x-pack/examples/ui_actions_enhanced_examples/public/containers/app/index.tsx create mode 100644 x-pack/examples/ui_actions_enhanced_examples/public/containers/drilldowns_manager/drilldowns_manager.tsx create mode 100644 x-pack/examples/ui_actions_enhanced_examples/public/containers/drilldowns_manager/index.tsx create mode 100644 x-pack/examples/ui_actions_enhanced_examples/public/containers/drilldowns_with_embeddable_example/drilldowns_with_embeddable_example.tsx create mode 100644 x-pack/examples/ui_actions_enhanced_examples/public/containers/drilldowns_with_embeddable_example/index.tsx create mode 100644 x-pack/examples/ui_actions_enhanced_examples/public/containers/drilldowns_without_embeddable_example/drilldowns_without_embeddable_example.tsx create mode 100644 x-pack/examples/ui_actions_enhanced_examples/public/containers/drilldowns_without_embeddable_example/index.tsx create mode 100644 x-pack/examples/ui_actions_enhanced_examples/public/containers/drilldowns_without_embeddable_single_button_example/drilldowns_without_embeddable_single_button_example.tsx create mode 100644 x-pack/examples/ui_actions_enhanced_examples/public/containers/drilldowns_without_embeddable_single_button_example/index.tsx create mode 100644 x-pack/examples/ui_actions_enhanced_examples/public/context/context.ts rename x-pack/{plugins/dashboard_enhanced/public/services/drilldowns/dashboard_to_dashboard_drilldown/components => examples/ui_actions_enhanced_examples/public/context}/index.ts (77%) create mode 100644 x-pack/examples/ui_actions_enhanced_examples/public/drilldowns/app1_hello_world_drilldown/app1_hello_world_drilldown.tsx create mode 100644 x-pack/examples/ui_actions_enhanced_examples/public/drilldowns/app1_hello_world_drilldown/index.tsx create mode 100644 x-pack/examples/ui_actions_enhanced_examples/public/drilldowns/app1_to_dashboard_drilldown/app1_to_dashboard_drilldown.ts create mode 100644 x-pack/examples/ui_actions_enhanced_examples/public/drilldowns/app1_to_dashboard_drilldown/index.tsx create mode 100644 x-pack/examples/ui_actions_enhanced_examples/public/drilldowns/app2_to_dashboard_drilldown/app2_to_dashboard_drilldown.ts create mode 100644 x-pack/examples/ui_actions_enhanced_examples/public/drilldowns/app2_to_dashboard_drilldown/index.tsx rename x-pack/examples/ui_actions_enhanced_examples/public/{ => drilldowns}/dashboard_hello_world_drilldown/README.md (100%) rename x-pack/examples/ui_actions_enhanced_examples/public/{ => drilldowns}/dashboard_hello_world_drilldown/index.tsx (83%) rename x-pack/examples/ui_actions_enhanced_examples/public/{ => drilldowns}/dashboard_hello_world_only_range_select_drilldown/README.md (100%) rename x-pack/examples/ui_actions_enhanced_examples/public/{ => drilldowns}/dashboard_hello_world_only_range_select_drilldown/index.tsx (81%) rename x-pack/examples/ui_actions_enhanced_examples/public/{ => drilldowns}/dashboard_to_discover_drilldown/collect_config_container.tsx (100%) rename x-pack/examples/ui_actions_enhanced_examples/public/{ => drilldowns}/dashboard_to_discover_drilldown/components/discover_drilldown_config/discover_drilldown_config.tsx (100%) rename x-pack/examples/ui_actions_enhanced_examples/public/{ => drilldowns}/dashboard_to_discover_drilldown/components/discover_drilldown_config/i18n.ts (100%) rename x-pack/examples/ui_actions_enhanced_examples/public/{ => drilldowns}/dashboard_to_discover_drilldown/components/discover_drilldown_config/index.ts (100%) rename x-pack/examples/ui_actions_enhanced_examples/public/{ => drilldowns}/dashboard_to_discover_drilldown/components/index.ts (100%) rename x-pack/examples/ui_actions_enhanced_examples/public/{ => drilldowns}/dashboard_to_discover_drilldown/constants.ts (100%) rename x-pack/examples/ui_actions_enhanced_examples/public/{ => drilldowns}/dashboard_to_discover_drilldown/drilldown.tsx (88%) rename x-pack/examples/ui_actions_enhanced_examples/public/{ => drilldowns}/dashboard_to_discover_drilldown/i18n.ts (100%) rename x-pack/examples/ui_actions_enhanced_examples/public/{ => drilldowns}/dashboard_to_discover_drilldown/index.ts (100%) rename x-pack/examples/ui_actions_enhanced_examples/public/{ => drilldowns}/dashboard_to_discover_drilldown/types.ts (87%) create mode 100644 x-pack/examples/ui_actions_enhanced_examples/public/embeddables/button_embeddable/button_embeddable.ts create mode 100644 x-pack/examples/ui_actions_enhanced_examples/public/embeddables/button_embeddable/button_embeddable_component.tsx create mode 100644 x-pack/examples/ui_actions_enhanced_examples/public/embeddables/button_embeddable/index.ts create mode 100644 x-pack/examples/ui_actions_enhanced_examples/public/mount.tsx create mode 100644 x-pack/examples/ui_actions_enhanced_examples/public/triggers/index.ts create mode 100644 x-pack/examples/ui_actions_enhanced_examples/public/triggers/sample_app1_trigger.ts create mode 100644 x-pack/examples/ui_actions_enhanced_examples/public/triggers/sample_app2_trigger.ts create mode 100644 x-pack/plugins/dashboard_enhanced/public/services/drilldowns/abstract_dashboard_drilldown/abstract_dashboard_drilldown.tsx rename x-pack/plugins/dashboard_enhanced/public/services/drilldowns/{dashboard_to_dashboard_drilldown => abstract_dashboard_drilldown}/components/collect_config_container.tsx (96%) rename x-pack/plugins/dashboard_enhanced/public/services/drilldowns/{dashboard_to_dashboard_drilldown/components/dashboard_drilldown_config/dashboard_drilldown_config.stories.tsx => abstract_dashboard_drilldown/components/dashboard_drilldown_config/dashboard_drilldown_config.story.tsx} (100%) rename x-pack/plugins/dashboard_enhanced/public/services/drilldowns/{dashboard_to_dashboard_drilldown => abstract_dashboard_drilldown}/components/dashboard_drilldown_config/dashboard_drilldown_config.test.tsx (100%) rename x-pack/plugins/dashboard_enhanced/public/services/drilldowns/{dashboard_to_dashboard_drilldown => abstract_dashboard_drilldown}/components/dashboard_drilldown_config/dashboard_drilldown_config.tsx (100%) rename x-pack/plugins/dashboard_enhanced/public/services/drilldowns/{dashboard_to_dashboard_drilldown => abstract_dashboard_drilldown}/components/dashboard_drilldown_config/i18n.ts (100%) rename x-pack/plugins/dashboard_enhanced/public/services/drilldowns/{dashboard_to_dashboard_drilldown => abstract_dashboard_drilldown}/components/dashboard_drilldown_config/index.ts (100%) rename x-pack/plugins/dashboard_enhanced/public/services/drilldowns/{dashboard_to_dashboard_drilldown => abstract_dashboard_drilldown}/components/i18n.ts (100%) rename x-pack/plugins/dashboard_enhanced/public/services/drilldowns/{dashboard_to_dashboard_drilldown => abstract_dashboard_drilldown/components}/index.ts (55%) rename x-pack/plugins/dashboard_enhanced/public/services/drilldowns/{dashboard_to_dashboard_drilldown => abstract_dashboard_drilldown}/i18n.ts (100%) create mode 100644 x-pack/plugins/dashboard_enhanced/public/services/drilldowns/abstract_dashboard_drilldown/index.ts rename x-pack/plugins/dashboard_enhanced/public/services/drilldowns/{dashboard_to_dashboard_drilldown => abstract_dashboard_drilldown}/types.ts (100%) delete mode 100644 x-pack/plugins/dashboard_enhanced/public/services/drilldowns/dashboard_to_dashboard_drilldown/drilldown.tsx rename x-pack/plugins/dashboard_enhanced/public/services/drilldowns/{dashboard_to_dashboard_drilldown => embeddable_to_dashboard_drilldown}/constants.ts (68%) rename x-pack/plugins/dashboard_enhanced/public/services/drilldowns/{dashboard_to_dashboard_drilldown/drilldown.test.tsx => embeddable_to_dashboard_drilldown/embeddable_to_dashboard_drilldown.test.tsx} (88%) create mode 100644 x-pack/plugins/dashboard_enhanced/public/services/drilldowns/embeddable_to_dashboard_drilldown/embeddable_to_dashboard_drilldown.tsx create mode 100644 x-pack/plugins/dashboard_enhanced/public/services/drilldowns/embeddable_to_dashboard_drilldown/index.ts delete mode 100644 x-pack/plugins/discover_enhanced/public/actions/explore_data/kibana_url.ts create mode 100644 x-pack/plugins/ui_actions_enhanced/public/drilldowns/hooks/i18n.ts create mode 100644 x-pack/plugins/ui_actions_enhanced/public/drilldowns/hooks/use_compatible_action_factories_for_current_context.ts create mode 100644 x-pack/plugins/ui_actions_enhanced/public/drilldowns/hooks/use_drilldown_state_manager.tsx create mode 100644 x-pack/plugins/ui_actions_enhanced/public/drilldowns/hooks/use_welcome_message.ts diff --git a/src/plugins/dashboard/public/index.ts b/src/plugins/dashboard/public/index.ts index 315afd61c7c44..bf9a3b2b8a217 100644 --- a/src/plugins/dashboard/public/index.ts +++ b/src/plugins/dashboard/public/index.ts @@ -31,7 +31,12 @@ export { } from './application'; export { DashboardConstants, createDashboardEditUrl } from './dashboard_constants'; -export { DashboardStart, DashboardUrlGenerator, DashboardFeatureFlagConfig } from './plugin'; +export { + DashboardSetup, + DashboardStart, + DashboardUrlGenerator, + DashboardFeatureFlagConfig, +} from './plugin'; export { DASHBOARD_APP_URL_GENERATOR, createDashboardUrlGenerator, diff --git a/src/plugins/dashboard/public/plugin.tsx b/src/plugins/dashboard/public/plugin.tsx index eadb3cd207e4d..52318ce2e39f3 100644 --- a/src/plugins/dashboard/public/plugin.tsx +++ b/src/plugins/dashboard/public/plugin.tsx @@ -145,7 +145,7 @@ interface StartDependencies { savedObjects: SavedObjectsStart; } -export type Setup = void; +export type DashboardSetup = void; export interface DashboardStart { getSavedDashboardLoader: () => SavedObjectLoader; @@ -180,7 +180,7 @@ declare module '../../../plugins/ui_actions/public' { } export class DashboardPlugin - implements Plugin { + implements Plugin { constructor(private initializerContext: PluginInitializerContext) {} private appStateUpdater = new BehaviorSubject(() => ({})); @@ -193,17 +193,8 @@ export class DashboardPlugin public setup( core: CoreSetup, - { - share, - uiActions, - embeddable, - home, - kibanaLegacy, - urlForwarding, - data, - usageCollection, - }: SetupDependencies - ): Setup { + { share, uiActions, embeddable, home, urlForwarding, data, usageCollection }: SetupDependencies + ): DashboardSetup { this.dashboardFeatureFlagConfig = this.initializerContext.config.get< DashboardFeatureFlagConfig >(); diff --git a/src/plugins/share/public/index.ts b/src/plugins/share/public/index.ts index e3d6c41a278cd..950ecebeaadc7 100644 --- a/src/plugins/share/public/index.ts +++ b/src/plugins/share/public/index.ts @@ -40,4 +40,6 @@ export { import { SharePlugin } from './plugin'; +export { KibanaURL } from './kibana_url'; + export const plugin = () => new SharePlugin(); diff --git a/src/plugins/share/public/kibana_url.ts b/src/plugins/share/public/kibana_url.ts new file mode 100644 index 0000000000000..40c3372579f6a --- /dev/null +++ b/src/plugins/share/public/kibana_url.ts @@ -0,0 +1,44 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +// TODO: Replace this logic with KibanaURL once it is available. +// https://github.com/elastic/kibana/issues/64497 +export class KibanaURL { + public readonly path: string; + public readonly appName: string; + public readonly appPath: string; + + constructor(path: string) { + const match = path.match(/^.*\/app\/([^\/#]+)(.+)$/); + + if (!match) { + throw new Error('Unexpected URL path.'); + } + + const [, appName, appPath] = match; + + if (!appName || !appPath) { + throw new Error('Could not parse URL path.'); + } + + this.path = path; + this.appName = appName; + this.appPath = appPath; + } +} diff --git a/x-pack/examples/ui_actions_enhanced_examples/README.md b/x-pack/examples/ui_actions_enhanced_examples/README.md index ec049bbd33dec..8096fdbf13cfd 100644 --- a/x-pack/examples/ui_actions_enhanced_examples/README.md +++ b/x-pack/examples/ui_actions_enhanced_examples/README.md @@ -5,7 +5,8 @@ To run this example plugin, use the command `yarn start --run-examples`. ## Drilldown examples -This plugin holds few examples on how to add drilldown types to dashboard. +This plugin holds few examples on how to add drilldown types to dashboard. See +`./public/drilldowns/` folder. To play with drilldowns, open any dashboard, click "Edit" to put it in *edit mode*. Now when opening context menu of dashboard panels you should see "Create drilldown" option. @@ -34,3 +35,74 @@ One can see how middle-click or Ctrl + click behavior could be supported using ### `dashboard_to_discover_drilldown` `dashboard_to_discover_drilldown` shows how a real-world drilldown could look like. + + +## Drilldown Manager examples + +*Drilldown Manager* is a collectio of code and React components that allows you +to add drilldowns to any app. To see examples of how drilldows can be added to +your app, run Kibana with `--run-examples` flag: + +``` +yarn start --run-examples +``` + +Then go to "Developer examples" and "UI Actions Enhanced", where you can see examples +where *Drilldown Manager* is used outside of the Dashboard app: + +![image](https://user-images.githubusercontent.com/9773803/94044547-969a3400-fdce-11ea-826a-cbd0773a4000.png) + +These examples show how you can create your custom UI Actions triggers and add +drilldowns to them, or use an embeddable in your app and add drilldows to it. + + +### Trigger examples + +The `/public/triggers` folder shows how you can create custom triggers for your app. +Triggers are things that trigger some action in UI, like "user click". + +Once you have defined your triggers, you need to register them in your plugin: + +```ts +export class MyPlugin implements Plugin { + public setup(core, { uiActionsEnhanced: uiActions }: SetupDependencies) { + uiActions.registerTrigger(myTrigger); + } +} +``` + +### `app1_hello_world_drilldown` + +`app1_hello_world_drilldown` is a basic example that shows how you can add the most +basic drilldown to your custom trigger. + +### `appx_to_dashboard_drilldown` + +`app1_to_dashboard_drilldown` and `app2_to_dashboard_drilldown` show how the Dashboard +drilldown can be used in other apps, outside of Dashboard. + +Basically you define it: + +```ts +type Trigger = typeof MY_TRIGGER_TRIGGER; +type Context = MyAppClickContext; + +export class App1ToDashboardDrilldown extends AbstractDashboardDrilldown { + public readonly supportedTriggers = () => [MY_TRIGGER] as Trigger[]; + + protected async getURL(config: Config, context: Context): Promise { + return 'https://...'; + } +} +``` + +and then you register it in your plugin: + +```ts +export class MyPlugin implements Plugin { + public setup(core, { uiActionsEnhanced: uiActions }: SetupDependencies) { + const drilldown = new App2ToDashboardDrilldown(/* You can pass in dependencies here. */); + uiActions.registerDrilldown(drilldown); + } +} +``` diff --git a/x-pack/examples/ui_actions_enhanced_examples/kibana.json b/x-pack/examples/ui_actions_enhanced_examples/kibana.json index 1bae09b488a2e..4f5ac8519fe5b 100644 --- a/x-pack/examples/ui_actions_enhanced_examples/kibana.json +++ b/x-pack/examples/ui_actions_enhanced_examples/kibana.json @@ -5,10 +5,21 @@ "configPath": ["ui_actions_enhanced_examples"], "server": false, "ui": true, - "requiredPlugins": ["uiActions","uiActionsEnhanced", "data", "discover"], + "requiredPlugins": [ + "uiActions", + "uiActionsEnhanced", + "data", + "discover", + "dashboard", + "dashboardEnhanced", + "developerExamples" + ], "optionalPlugins": [], "requiredBundles": [ + "dashboardEnhanced", + "embeddable", "kibanaUtils", - "kibanaReact" + "kibanaReact", + "share" ] } diff --git a/x-pack/examples/ui_actions_enhanced_examples/public/components/page/index.tsx b/x-pack/examples/ui_actions_enhanced_examples/public/components/page/index.tsx new file mode 100644 index 0000000000000..7b3e19ff94f0f --- /dev/null +++ b/x-pack/examples/ui_actions_enhanced_examples/public/components/page/index.tsx @@ -0,0 +1,38 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import * as React from 'react'; +import { + EuiPageBody, + EuiPageContent, + EuiPageContentBody, + EuiPageHeader, + EuiPageHeaderSection, + EuiTitle, +} from '@elastic/eui'; + +export interface PageProps { + title?: React.ReactNode; +} + +export const Page: React.FC = ({ title = 'Untitled', children }) => { + return ( + + + + +

{title}

+
+
+
+ + + {children} + + +
+ ); +}; diff --git a/x-pack/examples/ui_actions_enhanced_examples/public/components/section/index.tsx b/x-pack/examples/ui_actions_enhanced_examples/public/components/section/index.tsx new file mode 100644 index 0000000000000..399f44df5d403 --- /dev/null +++ b/x-pack/examples/ui_actions_enhanced_examples/public/components/section/index.tsx @@ -0,0 +1,7 @@ +/* + * 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. + */ + +export * from './section'; diff --git a/x-pack/examples/ui_actions_enhanced_examples/public/components/section/section.tsx b/x-pack/examples/ui_actions_enhanced_examples/public/components/section/section.tsx new file mode 100644 index 0000000000000..2f210ad53ef7a --- /dev/null +++ b/x-pack/examples/ui_actions_enhanced_examples/public/components/section/section.tsx @@ -0,0 +1,24 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import React from 'react'; +import { EuiTitle, EuiSpacer } from '@elastic/eui'; + +export interface Props { + title: React.ReactNode; +} + +export const Section: React.FC = ({ title, children }) => { + return ( +
+ +

{title}

+
+ + {children} +
+ ); +}; diff --git a/x-pack/examples/ui_actions_enhanced_examples/public/containers/app/app.tsx b/x-pack/examples/ui_actions_enhanced_examples/public/containers/app/app.tsx new file mode 100644 index 0000000000000..33f55a1c35bb4 --- /dev/null +++ b/x-pack/examples/ui_actions_enhanced_examples/public/containers/app/app.tsx @@ -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; + * you may not use this file except in compliance with the Elastic License. + */ + +import React from 'react'; +import { EuiPage } from '@elastic/eui'; +import { Page } from '../../components/page'; +import { DrilldownsManager } from '../drilldowns_manager'; + +export const App: React.FC = () => { + return ( + + + + + + ); +}; diff --git a/x-pack/examples/ui_actions_enhanced_examples/public/containers/app/index.tsx b/x-pack/examples/ui_actions_enhanced_examples/public/containers/app/index.tsx new file mode 100644 index 0000000000000..1460fdfef37e6 --- /dev/null +++ b/x-pack/examples/ui_actions_enhanced_examples/public/containers/app/index.tsx @@ -0,0 +1,7 @@ +/* + * 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. + */ + +export * from './app'; diff --git a/x-pack/examples/ui_actions_enhanced_examples/public/containers/drilldowns_manager/drilldowns_manager.tsx b/x-pack/examples/ui_actions_enhanced_examples/public/containers/drilldowns_manager/drilldowns_manager.tsx new file mode 100644 index 0000000000000..3376e8b2df76e --- /dev/null +++ b/x-pack/examples/ui_actions_enhanced_examples/public/containers/drilldowns_manager/drilldowns_manager.tsx @@ -0,0 +1,39 @@ +/* + * 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 { EuiHorizontalRule } from '@elastic/eui'; +import React from 'react'; +import { Section } from '../../components/section/section'; +import { SampleMlJob, SampleApp1ClickContext } from '../../triggers'; +import { DrilldownsWithoutEmbeddableExample } from '../drilldowns_without_embeddable_example'; +import { DrilldownsWithoutEmbeddableSingleButtonExample } from '../drilldowns_without_embeddable_single_button_example/drilldowns_without_embeddable_single_button_example'; +import { DrilldownsWithEmbeddableExample } from '../drilldowns_with_embeddable_example'; + +export const job: SampleMlJob = { + job_id: '123', + job_type: 'anomaly_detector', + description: 'This is some ML job.', +}; + +export const context: SampleApp1ClickContext = { job }; + +export const DrilldownsManager: React.FC = () => { + return ( +
+
+ + + + + + + + + +
+
+ ); +}; diff --git a/x-pack/examples/ui_actions_enhanced_examples/public/containers/drilldowns_manager/index.tsx b/x-pack/examples/ui_actions_enhanced_examples/public/containers/drilldowns_manager/index.tsx new file mode 100644 index 0000000000000..1964b32c2d215 --- /dev/null +++ b/x-pack/examples/ui_actions_enhanced_examples/public/containers/drilldowns_manager/index.tsx @@ -0,0 +1,7 @@ +/* + * 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. + */ + +export * from './drilldowns_manager'; diff --git a/x-pack/examples/ui_actions_enhanced_examples/public/containers/drilldowns_with_embeddable_example/drilldowns_with_embeddable_example.tsx b/x-pack/examples/ui_actions_enhanced_examples/public/containers/drilldowns_with_embeddable_example/drilldowns_with_embeddable_example.tsx new file mode 100644 index 0000000000000..a90147d01e8b6 --- /dev/null +++ b/x-pack/examples/ui_actions_enhanced_examples/public/containers/drilldowns_with_embeddable_example/drilldowns_with_embeddable_example.tsx @@ -0,0 +1,134 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import React from 'react'; +import { + EuiText, + EuiSpacer, + EuiContextMenuPanelDescriptor, + EuiButton, + EuiPopover, + EuiContextMenu, + EuiFlyout, + EuiCode, + EuiFlexItem, + EuiFlexGroup, +} from '@elastic/eui'; +import { SampleMlJob, SampleApp1ClickContext } from '../../triggers'; +import { EmbeddableRoot } from '../../../../../../src/plugins/embeddable/public'; +import { ButtonEmbeddable } from '../../embeddables/button_embeddable'; +import { useUiActions } from '../../context'; +import { VALUE_CLICK_TRIGGER } from '../../../../../../src/plugins/ui_actions/public'; + +export const job: SampleMlJob = { + job_id: '123', + job_type: 'anomaly_detector', + description: 'This is some ML job.', +}; + +export const context: SampleApp1ClickContext = { job }; + +export const DrilldownsWithEmbeddableExample: React.FC = () => { + const { plugins, managerWithEmbeddable } = useUiActions(); + const embeddable = React.useMemo( + () => + new ButtonEmbeddable( + { id: 'DrilldownsWithEmbeddableExample' }, + { uiActions: plugins.uiActionsEnhanced } + ), + [plugins.uiActionsEnhanced] + ); + const [showManager, setShowManager] = React.useState(false); + const [openPopup, setOpenPopup] = React.useState(false); + const viewRef = React.useRef<'create' | 'manage'>('create'); + + const panels: EuiContextMenuPanelDescriptor[] = [ + { + id: 0, + items: [ + { + name: 'Create new view', + icon: 'plusInCircle', + onClick: () => { + setOpenPopup(false); + viewRef.current = 'create'; + setShowManager((x) => !x); + }, + }, + { + name: 'Drilldown list view', + icon: 'list', + onClick: () => { + setOpenPopup(false); + viewRef.current = 'manage'; + setShowManager((x) => !x); + }, + }, + ], + }, + ]; + + const openManagerButton = showManager ? ( + setShowManager(false)}>Close + ) : ( + setOpenPopup((x) => !x)} + > + Open Drilldown Manager + + } + isOpen={openPopup} + closePopover={() => setOpenPopup(false)} + panelPaddingSize="none" + withTitle + anchorPosition="downLeft" + > + + + ); + + return ( + <> + +

With embeddable example

+

+ This example shows how drilldown manager can be added to an embeddable which executes{' '} + VALUE_CLICK_TRIGGER trigger. Below card is an embeddable which executes + VALUE_CLICK_TRIGGER when it is clicked on. +

+
+ + + + + {openManagerButton} + +
+ +
+
+
+ + {showManager && ( + setShowManager(false)} aria-labelledby="Drilldown Manager"> + setShowManager(false)} + viewMode={viewRef.current} + dynamicActionManager={managerWithEmbeddable} + triggers={[VALUE_CLICK_TRIGGER]} + placeContext={{ embeddable }} + /> + + )} + + ); +}; diff --git a/x-pack/examples/ui_actions_enhanced_examples/public/containers/drilldowns_with_embeddable_example/index.tsx b/x-pack/examples/ui_actions_enhanced_examples/public/containers/drilldowns_with_embeddable_example/index.tsx new file mode 100644 index 0000000000000..ca2f7b1060f19 --- /dev/null +++ b/x-pack/examples/ui_actions_enhanced_examples/public/containers/drilldowns_with_embeddable_example/index.tsx @@ -0,0 +1,7 @@ +/* + * 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. + */ + +export * from './drilldowns_with_embeddable_example'; diff --git a/x-pack/examples/ui_actions_enhanced_examples/public/containers/drilldowns_without_embeddable_example/drilldowns_without_embeddable_example.tsx b/x-pack/examples/ui_actions_enhanced_examples/public/containers/drilldowns_without_embeddable_example/drilldowns_without_embeddable_example.tsx new file mode 100644 index 0000000000000..fb22e98e4a6d9 --- /dev/null +++ b/x-pack/examples/ui_actions_enhanced_examples/public/containers/drilldowns_without_embeddable_example/drilldowns_without_embeddable_example.tsx @@ -0,0 +1,129 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import React from 'react'; +import { + EuiText, + EuiFlexGroup, + EuiFlexItem, + EuiButton, + EuiSpacer, + EuiFlyout, + EuiPopover, + EuiContextMenu, + EuiContextMenuPanelDescriptor, +} from '@elastic/eui'; +import { useUiActions } from '../../context'; +import { SAMPLE_APP1_CLICK_TRIGGER, SampleMlJob, SampleApp1ClickContext } from '../../triggers'; + +export const job: SampleMlJob = { + job_id: '123', + job_type: 'anomaly_detector', + description: 'This is some ML job.', +}; + +export const context: SampleApp1ClickContext = { job }; + +export const DrilldownsWithoutEmbeddableExample: React.FC = () => { + const { plugins, managerWithoutEmbeddable } = useUiActions(); + const [showManager, setShowManager] = React.useState(false); + const [openPopup, setOpenPopup] = React.useState(false); + const viewRef = React.useRef<'create' | 'manage'>('create'); + + const panels: EuiContextMenuPanelDescriptor[] = [ + { + id: 0, + items: [ + { + name: 'Create new view', + icon: 'plusInCircle', + onClick: () => { + setOpenPopup(false); + viewRef.current = 'create'; + setShowManager((x) => !x); + }, + }, + { + name: 'Drilldown list view', + icon: 'list', + onClick: () => { + setOpenPopup(false); + viewRef.current = 'manage'; + setShowManager((x) => !x); + }, + }, + ], + }, + ]; + + const openManagerButton = showManager ? ( + setShowManager(false)}>Close + ) : ( + setOpenPopup((x) => !x)} + > + Open Drilldown Manager + + } + isOpen={openPopup} + closePopover={() => setOpenPopup(false)} + panelPaddingSize="none" + withTitle + anchorPosition="downLeft" + > + + + ); + + return ( + <> + +

Without embeddable example (app 1)

+

+ Drilldown Manager can be integrated into any app in Kibana. This example shows + that drilldown manager can be used in an app which does not use embeddables and executes + its custom UI Actions triggers. +

+
+ + + + + {openManagerButton} + + + plugins.uiActionsEnhanced.executeTriggerActions(SAMPLE_APP1_CLICK_TRIGGER, context) + } + > + Execute click action + + + + + {showManager && ( + setShowManager(false)} aria-labelledby="Drilldown Manager"> + setShowManager(false)} + viewMode={viewRef.current} + dynamicActionManager={managerWithoutEmbeddable} + triggers={[SAMPLE_APP1_CLICK_TRIGGER]} + /> + + )} + + ); +}; diff --git a/x-pack/examples/ui_actions_enhanced_examples/public/containers/drilldowns_without_embeddable_example/index.tsx b/x-pack/examples/ui_actions_enhanced_examples/public/containers/drilldowns_without_embeddable_example/index.tsx new file mode 100644 index 0000000000000..0dee7cf367b04 --- /dev/null +++ b/x-pack/examples/ui_actions_enhanced_examples/public/containers/drilldowns_without_embeddable_example/index.tsx @@ -0,0 +1,7 @@ +/* + * 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. + */ + +export * from './drilldowns_without_embeddable_example'; diff --git a/x-pack/examples/ui_actions_enhanced_examples/public/containers/drilldowns_without_embeddable_single_button_example/drilldowns_without_embeddable_single_button_example.tsx b/x-pack/examples/ui_actions_enhanced_examples/public/containers/drilldowns_without_embeddable_single_button_example/drilldowns_without_embeddable_single_button_example.tsx new file mode 100644 index 0000000000000..58d382fdc2a76 --- /dev/null +++ b/x-pack/examples/ui_actions_enhanced_examples/public/containers/drilldowns_without_embeddable_single_button_example/drilldowns_without_embeddable_single_button_example.tsx @@ -0,0 +1,62 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import React from 'react'; +import { EuiText, EuiFlexGroup, EuiFlexItem, EuiButton, EuiSpacer, EuiFlyout } from '@elastic/eui'; +import { useUiActions } from '../../context'; +import { sampleApp2ClickContext, SAMPLE_APP2_CLICK_TRIGGER } from '../../triggers'; + +export const DrilldownsWithoutEmbeddableSingleButtonExample: React.FC = () => { + const { plugins, managerWithoutEmbeddableSingleButton } = useUiActions(); + const [showManager, setShowManager] = React.useState(false); + const viewRef = React.useRef<'create' | 'manage'>('create'); + + return ( + <> + +

Without embeddable example, single button (app 2)

+

+ This example is the same as Without embeddable example but it shows that + drilldown manager actions and user created drilldowns can be combined in one menu, this is + useful, for example, for Canvas where clicking on a Canvas element would show the combined + menu of drilldown manager actions and drilldown actions. +

+
+ + + + + + + plugins.uiActionsEnhanced.executeTriggerActions( + SAMPLE_APP2_CLICK_TRIGGER, + sampleApp2ClickContext + ) + } + > + Click this element + + + + + {showManager && ( + setShowManager(false)} aria-labelledby="Drilldown Manager"> + setShowManager(false)} + viewMode={viewRef.current} + dynamicActionManager={managerWithoutEmbeddableSingleButton} + triggers={[SAMPLE_APP2_CLICK_TRIGGER]} + /> + + )} + + ); +}; diff --git a/x-pack/examples/ui_actions_enhanced_examples/public/containers/drilldowns_without_embeddable_single_button_example/index.tsx b/x-pack/examples/ui_actions_enhanced_examples/public/containers/drilldowns_without_embeddable_single_button_example/index.tsx new file mode 100644 index 0000000000000..74766309dc723 --- /dev/null +++ b/x-pack/examples/ui_actions_enhanced_examples/public/containers/drilldowns_without_embeddable_single_button_example/index.tsx @@ -0,0 +1,7 @@ +/* + * 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. + */ + +export * from './drilldowns_without_embeddable_single_button_example'; diff --git a/x-pack/examples/ui_actions_enhanced_examples/public/context/context.ts b/x-pack/examples/ui_actions_enhanced_examples/public/context/context.ts new file mode 100644 index 0000000000000..2edb29eb5b28a --- /dev/null +++ b/x-pack/examples/ui_actions_enhanced_examples/public/context/context.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; + * you may not use this file except in compliance with the Elastic License. + */ + +import { createContext, useContext } from 'react'; +import { CoreStart } from 'src/core/public'; +import { UiActionsEnhancedDynamicActionManager } from '../../../../plugins/ui_actions_enhanced/public'; +import { StartDependencies } from '../plugin'; + +export interface UiActionsExampleAppContextValue { + appBasePath: string; + core: CoreStart; + plugins: StartDependencies; + managerWithoutEmbeddable: UiActionsEnhancedDynamicActionManager; + managerWithoutEmbeddableSingleButton: UiActionsEnhancedDynamicActionManager; + managerWithEmbeddable: UiActionsEnhancedDynamicActionManager; +} + +export const context = createContext(null); +export const useUiActions = () => useContext(context)!; diff --git a/x-pack/plugins/dashboard_enhanced/public/services/drilldowns/dashboard_to_dashboard_drilldown/components/index.ts b/x-pack/examples/ui_actions_enhanced_examples/public/context/index.ts similarity index 77% rename from x-pack/plugins/dashboard_enhanced/public/services/drilldowns/dashboard_to_dashboard_drilldown/components/index.ts rename to x-pack/examples/ui_actions_enhanced_examples/public/context/index.ts index c34290528d914..94b6977050535 100644 --- a/x-pack/plugins/dashboard_enhanced/public/services/drilldowns/dashboard_to_dashboard_drilldown/components/index.ts +++ b/x-pack/examples/ui_actions_enhanced_examples/public/context/index.ts @@ -4,4 +4,4 @@ * you may not use this file except in compliance with the Elastic License. */ -export { CollectConfigContainer } from './collect_config_container'; +export * from './context'; diff --git a/x-pack/examples/ui_actions_enhanced_examples/public/drilldowns/app1_hello_world_drilldown/app1_hello_world_drilldown.tsx b/x-pack/examples/ui_actions_enhanced_examples/public/drilldowns/app1_hello_world_drilldown/app1_hello_world_drilldown.tsx new file mode 100644 index 0000000000000..25de2f5953f31 --- /dev/null +++ b/x-pack/examples/ui_actions_enhanced_examples/public/drilldowns/app1_hello_world_drilldown/app1_hello_world_drilldown.tsx @@ -0,0 +1,66 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import React from 'react'; +import { EuiFieldText, EuiFormRow } from '@elastic/eui'; +import { reactToUiComponent } from '../../../../../../src/plugins/kibana_react/public'; +import { UiActionsEnhancedDrilldownDefinition as Drilldown } from '../../../../../plugins/ui_actions_enhanced/public'; +import { CollectConfigProps as CollectConfigPropsBase } from '../../../../../../src/plugins/kibana_utils/public'; +import { SAMPLE_APP1_CLICK_TRIGGER, SampleApp1ClickContext } from '../../triggers'; +import { SerializableState } from '../../../../../../src/plugins/kibana_utils/common'; + +export interface Config extends SerializableState { + name: string; +} + +type Trigger = typeof SAMPLE_APP1_CLICK_TRIGGER; +type Context = SampleApp1ClickContext; + +export type CollectConfigProps = CollectConfigPropsBase; + +export const APP1_HELLO_WORLD_DRILLDOWN = 'APP1_HELLO_WORLD_DRILLDOWN'; + +export class App1HelloWorldDrilldown implements Drilldown { + public readonly id = APP1_HELLO_WORLD_DRILLDOWN; + + public readonly order = 8; + + public readonly getDisplayName = () => 'Hello world (app 1)'; + + public readonly euiIcon = 'cheer'; + + supportedTriggers(): Trigger[] { + return [SAMPLE_APP1_CLICK_TRIGGER]; + } + + private readonly ReactCollectConfig: React.FC = ({ + config, + onConfig, + context, + }) => ( + + onConfig({ ...config, name: event.target.value })} + /> + + ); + + public readonly CollectConfig = reactToUiComponent(this.ReactCollectConfig); + + public readonly createConfig = () => ({ + name: '', + }); + + public readonly isConfigValid = (config: Config): config is Config => { + return !!config.name; + }; + + public readonly execute = async (config: Config, context: Context) => { + alert(`Hello, ${config.name}`); + }; +} diff --git a/x-pack/examples/ui_actions_enhanced_examples/public/drilldowns/app1_hello_world_drilldown/index.tsx b/x-pack/examples/ui_actions_enhanced_examples/public/drilldowns/app1_hello_world_drilldown/index.tsx new file mode 100644 index 0000000000000..a92ba24d3f345 --- /dev/null +++ b/x-pack/examples/ui_actions_enhanced_examples/public/drilldowns/app1_hello_world_drilldown/index.tsx @@ -0,0 +1,7 @@ +/* + * 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. + */ + +export * from './app1_hello_world_drilldown'; diff --git a/x-pack/examples/ui_actions_enhanced_examples/public/drilldowns/app1_to_dashboard_drilldown/app1_to_dashboard_drilldown.ts b/x-pack/examples/ui_actions_enhanced_examples/public/drilldowns/app1_to_dashboard_drilldown/app1_to_dashboard_drilldown.ts new file mode 100644 index 0000000000000..058b52c78b427 --- /dev/null +++ b/x-pack/examples/ui_actions_enhanced_examples/public/drilldowns/app1_to_dashboard_drilldown/app1_to_dashboard_drilldown.ts @@ -0,0 +1,32 @@ +/* + * 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 { + DashboardEnhancedAbstractDashboardDrilldown as AbstractDashboardDrilldown, + DashboardEnhancedAbstractDashboardDrilldownConfig as Config, +} from '../../../../../plugins/dashboard_enhanced/public'; +import { SAMPLE_APP1_CLICK_TRIGGER, SampleApp1ClickContext } from '../../triggers'; +import { KibanaURL } from '../../../../../../src/plugins/share/public'; + +export const APP1_TO_DASHBOARD_DRILLDOWN = 'APP1_TO_DASHBOARD_DRILLDOWN'; + +type Trigger = typeof SAMPLE_APP1_CLICK_TRIGGER; +type Context = SampleApp1ClickContext; + +export class App1ToDashboardDrilldown extends AbstractDashboardDrilldown { + public readonly id = APP1_TO_DASHBOARD_DRILLDOWN; + + public readonly supportedTriggers = () => [SAMPLE_APP1_CLICK_TRIGGER] as Trigger[]; + + protected async getURL(config: Config, context: Context): Promise { + const path = await this.urlGenerator.createUrl({ + dashboardId: config.dashboardId, + }); + const url = new KibanaURL(path); + + return url; + } +} diff --git a/x-pack/examples/ui_actions_enhanced_examples/public/drilldowns/app1_to_dashboard_drilldown/index.tsx b/x-pack/examples/ui_actions_enhanced_examples/public/drilldowns/app1_to_dashboard_drilldown/index.tsx new file mode 100644 index 0000000000000..4c0c2c221496a --- /dev/null +++ b/x-pack/examples/ui_actions_enhanced_examples/public/drilldowns/app1_to_dashboard_drilldown/index.tsx @@ -0,0 +1,7 @@ +/* + * 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. + */ + +export * from './app1_to_dashboard_drilldown'; diff --git a/x-pack/examples/ui_actions_enhanced_examples/public/drilldowns/app2_to_dashboard_drilldown/app2_to_dashboard_drilldown.ts b/x-pack/examples/ui_actions_enhanced_examples/public/drilldowns/app2_to_dashboard_drilldown/app2_to_dashboard_drilldown.ts new file mode 100644 index 0000000000000..33bf54d4b4cc2 --- /dev/null +++ b/x-pack/examples/ui_actions_enhanced_examples/public/drilldowns/app2_to_dashboard_drilldown/app2_to_dashboard_drilldown.ts @@ -0,0 +1,32 @@ +/* + * 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 { + DashboardEnhancedAbstractDashboardDrilldown as AbstractDashboardDrilldown, + DashboardEnhancedAbstractDashboardDrilldownConfig as Config, +} from '../../../../../plugins/dashboard_enhanced/public'; +import { SAMPLE_APP2_CLICK_TRIGGER, SampleApp2ClickContext } from '../../triggers'; +import { KibanaURL } from '../../../../../../src/plugins/share/public'; + +export const APP2_TO_DASHBOARD_DRILLDOWN = 'APP2_TO_DASHBOARD_DRILLDOWN'; + +type Trigger = typeof SAMPLE_APP2_CLICK_TRIGGER; +type Context = SampleApp2ClickContext; + +export class App2ToDashboardDrilldown extends AbstractDashboardDrilldown { + public readonly id = APP2_TO_DASHBOARD_DRILLDOWN; + + public readonly supportedTriggers = () => [SAMPLE_APP2_CLICK_TRIGGER] as Trigger[]; + + protected async getURL(config: Config, context: Context): Promise { + const path = await this.urlGenerator.createUrl({ + dashboardId: config.dashboardId, + }); + const url = new KibanaURL(path); + + return url; + } +} diff --git a/x-pack/examples/ui_actions_enhanced_examples/public/drilldowns/app2_to_dashboard_drilldown/index.tsx b/x-pack/examples/ui_actions_enhanced_examples/public/drilldowns/app2_to_dashboard_drilldown/index.tsx new file mode 100644 index 0000000000000..ef09061115f43 --- /dev/null +++ b/x-pack/examples/ui_actions_enhanced_examples/public/drilldowns/app2_to_dashboard_drilldown/index.tsx @@ -0,0 +1,7 @@ +/* + * 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. + */ + +export * from './app2_to_dashboard_drilldown'; diff --git a/x-pack/examples/ui_actions_enhanced_examples/public/dashboard_hello_world_drilldown/README.md b/x-pack/examples/ui_actions_enhanced_examples/public/drilldowns/dashboard_hello_world_drilldown/README.md similarity index 100% rename from x-pack/examples/ui_actions_enhanced_examples/public/dashboard_hello_world_drilldown/README.md rename to x-pack/examples/ui_actions_enhanced_examples/public/drilldowns/dashboard_hello_world_drilldown/README.md diff --git a/x-pack/examples/ui_actions_enhanced_examples/public/dashboard_hello_world_drilldown/index.tsx b/x-pack/examples/ui_actions_enhanced_examples/public/drilldowns/dashboard_hello_world_drilldown/index.tsx similarity index 83% rename from x-pack/examples/ui_actions_enhanced_examples/public/dashboard_hello_world_drilldown/index.tsx rename to x-pack/examples/ui_actions_enhanced_examples/public/drilldowns/dashboard_hello_world_drilldown/index.tsx index cac5f0b29dc6e..a7324f5530130 100644 --- a/x-pack/examples/ui_actions_enhanced_examples/public/dashboard_hello_world_drilldown/index.tsx +++ b/x-pack/examples/ui_actions_enhanced_examples/public/drilldowns/dashboard_hello_world_drilldown/index.tsx @@ -6,14 +6,14 @@ import React from 'react'; import { EuiFormRow, EuiFieldText } from '@elastic/eui'; -import { reactToUiComponent } from '../../../../../src/plugins/kibana_react/public'; -import { UiActionsEnhancedDrilldownDefinition as Drilldown } from '../../../../plugins/ui_actions_enhanced/public'; -import { ChartActionContext } from '../../../../../src/plugins/embeddable/public'; -import { CollectConfigProps } from '../../../../../src/plugins/kibana_utils/public'; +import { reactToUiComponent } from '../../../../../../src/plugins/kibana_react/public'; +import { UiActionsEnhancedDrilldownDefinition as Drilldown } from '../../../../../plugins/ui_actions_enhanced/public'; +import { ChartActionContext } from '../../../../../../src/plugins/embeddable/public'; +import { CollectConfigProps } from '../../../../../../src/plugins/kibana_utils/public'; import { SELECT_RANGE_TRIGGER, VALUE_CLICK_TRIGGER, -} from '../../../../../src/plugins/ui_actions/public'; +} from '../../../../../../src/plugins/ui_actions/public'; export type ActionContext = ChartActionContext; diff --git a/x-pack/examples/ui_actions_enhanced_examples/public/dashboard_hello_world_only_range_select_drilldown/README.md b/x-pack/examples/ui_actions_enhanced_examples/public/drilldowns/dashboard_hello_world_only_range_select_drilldown/README.md similarity index 100% rename from x-pack/examples/ui_actions_enhanced_examples/public/dashboard_hello_world_only_range_select_drilldown/README.md rename to x-pack/examples/ui_actions_enhanced_examples/public/drilldowns/dashboard_hello_world_only_range_select_drilldown/README.md diff --git a/x-pack/examples/ui_actions_enhanced_examples/public/dashboard_hello_world_only_range_select_drilldown/index.tsx b/x-pack/examples/ui_actions_enhanced_examples/public/drilldowns/dashboard_hello_world_only_range_select_drilldown/index.tsx similarity index 81% rename from x-pack/examples/ui_actions_enhanced_examples/public/dashboard_hello_world_only_range_select_drilldown/index.tsx rename to x-pack/examples/ui_actions_enhanced_examples/public/drilldowns/dashboard_hello_world_only_range_select_drilldown/index.tsx index fa2f0825f9335..24385bd6baa42 100644 --- a/x-pack/examples/ui_actions_enhanced_examples/public/dashboard_hello_world_only_range_select_drilldown/index.tsx +++ b/x-pack/examples/ui_actions_enhanced_examples/public/drilldowns/dashboard_hello_world_only_range_select_drilldown/index.tsx @@ -6,12 +6,12 @@ import React from 'react'; import { EuiFormRow, EuiFieldText } from '@elastic/eui'; -import { reactToUiComponent } from '../../../../../src/plugins/kibana_react/public'; -import { UiActionsEnhancedDrilldownDefinition as Drilldown } from '../../../../plugins/ui_actions_enhanced/public'; -import { RangeSelectContext } from '../../../../../src/plugins/embeddable/public'; -import { CollectConfigProps } from '../../../../../src/plugins/kibana_utils/public'; -import { SELECT_RANGE_TRIGGER } from '../../../../../src/plugins/ui_actions/public'; -import { BaseActionFactoryContext } from '../../../../plugins/ui_actions_enhanced/public/dynamic_actions'; +import { reactToUiComponent } from '../../../../../../src/plugins/kibana_react/public'; +import { UiActionsEnhancedDrilldownDefinition as Drilldown } from '../../../../../plugins/ui_actions_enhanced/public'; +import { RangeSelectContext } from '../../../../../../src/plugins/embeddable/public'; +import { CollectConfigProps } from '../../../../../../src/plugins/kibana_utils/public'; +import { SELECT_RANGE_TRIGGER } from '../../../../../../src/plugins/ui_actions/public'; +import { BaseActionFactoryContext } from '../../../../../plugins/ui_actions_enhanced/public/dynamic_actions'; export type Config = { name: string; diff --git a/x-pack/examples/ui_actions_enhanced_examples/public/dashboard_to_discover_drilldown/collect_config_container.tsx b/x-pack/examples/ui_actions_enhanced_examples/public/drilldowns/dashboard_to_discover_drilldown/collect_config_container.tsx similarity index 100% rename from x-pack/examples/ui_actions_enhanced_examples/public/dashboard_to_discover_drilldown/collect_config_container.tsx rename to x-pack/examples/ui_actions_enhanced_examples/public/drilldowns/dashboard_to_discover_drilldown/collect_config_container.tsx diff --git a/x-pack/examples/ui_actions_enhanced_examples/public/dashboard_to_discover_drilldown/components/discover_drilldown_config/discover_drilldown_config.tsx b/x-pack/examples/ui_actions_enhanced_examples/public/drilldowns/dashboard_to_discover_drilldown/components/discover_drilldown_config/discover_drilldown_config.tsx similarity index 100% rename from x-pack/examples/ui_actions_enhanced_examples/public/dashboard_to_discover_drilldown/components/discover_drilldown_config/discover_drilldown_config.tsx rename to x-pack/examples/ui_actions_enhanced_examples/public/drilldowns/dashboard_to_discover_drilldown/components/discover_drilldown_config/discover_drilldown_config.tsx diff --git a/x-pack/examples/ui_actions_enhanced_examples/public/dashboard_to_discover_drilldown/components/discover_drilldown_config/i18n.ts b/x-pack/examples/ui_actions_enhanced_examples/public/drilldowns/dashboard_to_discover_drilldown/components/discover_drilldown_config/i18n.ts similarity index 100% rename from x-pack/examples/ui_actions_enhanced_examples/public/dashboard_to_discover_drilldown/components/discover_drilldown_config/i18n.ts rename to x-pack/examples/ui_actions_enhanced_examples/public/drilldowns/dashboard_to_discover_drilldown/components/discover_drilldown_config/i18n.ts diff --git a/x-pack/examples/ui_actions_enhanced_examples/public/dashboard_to_discover_drilldown/components/discover_drilldown_config/index.ts b/x-pack/examples/ui_actions_enhanced_examples/public/drilldowns/dashboard_to_discover_drilldown/components/discover_drilldown_config/index.ts similarity index 100% rename from x-pack/examples/ui_actions_enhanced_examples/public/dashboard_to_discover_drilldown/components/discover_drilldown_config/index.ts rename to x-pack/examples/ui_actions_enhanced_examples/public/drilldowns/dashboard_to_discover_drilldown/components/discover_drilldown_config/index.ts diff --git a/x-pack/examples/ui_actions_enhanced_examples/public/dashboard_to_discover_drilldown/components/index.ts b/x-pack/examples/ui_actions_enhanced_examples/public/drilldowns/dashboard_to_discover_drilldown/components/index.ts similarity index 100% rename from x-pack/examples/ui_actions_enhanced_examples/public/dashboard_to_discover_drilldown/components/index.ts rename to x-pack/examples/ui_actions_enhanced_examples/public/drilldowns/dashboard_to_discover_drilldown/components/index.ts diff --git a/x-pack/examples/ui_actions_enhanced_examples/public/dashboard_to_discover_drilldown/constants.ts b/x-pack/examples/ui_actions_enhanced_examples/public/drilldowns/dashboard_to_discover_drilldown/constants.ts similarity index 100% rename from x-pack/examples/ui_actions_enhanced_examples/public/dashboard_to_discover_drilldown/constants.ts rename to x-pack/examples/ui_actions_enhanced_examples/public/drilldowns/dashboard_to_discover_drilldown/constants.ts diff --git a/x-pack/examples/ui_actions_enhanced_examples/public/dashboard_to_discover_drilldown/drilldown.tsx b/x-pack/examples/ui_actions_enhanced_examples/public/drilldowns/dashboard_to_discover_drilldown/drilldown.tsx similarity index 88% rename from x-pack/examples/ui_actions_enhanced_examples/public/dashboard_to_discover_drilldown/drilldown.tsx rename to x-pack/examples/ui_actions_enhanced_examples/public/drilldowns/dashboard_to_discover_drilldown/drilldown.tsx index ba8d7f395e738..9cda534a340d6 100644 --- a/x-pack/examples/ui_actions_enhanced_examples/public/dashboard_to_discover_drilldown/drilldown.tsx +++ b/x-pack/examples/ui_actions_enhanced_examples/public/drilldowns/dashboard_to_discover_drilldown/drilldown.tsx @@ -5,15 +5,15 @@ */ import React from 'react'; -import { StartDependencies as Start } from '../plugin'; -import { reactToUiComponent } from '../../../../../src/plugins/kibana_react/public'; -import { StartServicesGetter } from '../../../../../src/plugins/kibana_utils/public'; +import { StartDependencies as Start } from '../../plugin'; +import { reactToUiComponent } from '../../../../../../src/plugins/kibana_react/public'; +import { StartServicesGetter } from '../../../../../../src/plugins/kibana_utils/public'; import { ActionContext, Config, CollectConfigProps } from './types'; import { CollectConfigContainer } from './collect_config_container'; import { SAMPLE_DASHBOARD_TO_DISCOVER_DRILLDOWN } from './constants'; -import { UiActionsEnhancedDrilldownDefinition as Drilldown } from '../../../../plugins/ui_actions_enhanced/public'; +import { UiActionsEnhancedDrilldownDefinition as Drilldown } from '../../../../../plugins/ui_actions_enhanced/public'; import { txtGoToDiscover } from './i18n'; -import { APPLY_FILTER_TRIGGER } from '../../../../../src/plugins/ui_actions/public'; +import { APPLY_FILTER_TRIGGER } from '../../../../../../src/plugins/ui_actions/public'; const isOutputWithIndexPatterns = ( output: unknown diff --git a/x-pack/examples/ui_actions_enhanced_examples/public/dashboard_to_discover_drilldown/i18n.ts b/x-pack/examples/ui_actions_enhanced_examples/public/drilldowns/dashboard_to_discover_drilldown/i18n.ts similarity index 100% rename from x-pack/examples/ui_actions_enhanced_examples/public/dashboard_to_discover_drilldown/i18n.ts rename to x-pack/examples/ui_actions_enhanced_examples/public/drilldowns/dashboard_to_discover_drilldown/i18n.ts diff --git a/x-pack/examples/ui_actions_enhanced_examples/public/dashboard_to_discover_drilldown/index.ts b/x-pack/examples/ui_actions_enhanced_examples/public/drilldowns/dashboard_to_discover_drilldown/index.ts similarity index 100% rename from x-pack/examples/ui_actions_enhanced_examples/public/dashboard_to_discover_drilldown/index.ts rename to x-pack/examples/ui_actions_enhanced_examples/public/drilldowns/dashboard_to_discover_drilldown/index.ts diff --git a/x-pack/examples/ui_actions_enhanced_examples/public/dashboard_to_discover_drilldown/types.ts b/x-pack/examples/ui_actions_enhanced_examples/public/drilldowns/dashboard_to_discover_drilldown/types.ts similarity index 87% rename from x-pack/examples/ui_actions_enhanced_examples/public/dashboard_to_discover_drilldown/types.ts rename to x-pack/examples/ui_actions_enhanced_examples/public/drilldowns/dashboard_to_discover_drilldown/types.ts index 692de571e8a00..f0497780430d4 100644 --- a/x-pack/examples/ui_actions_enhanced_examples/public/dashboard_to_discover_drilldown/types.ts +++ b/x-pack/examples/ui_actions_enhanced_examples/public/drilldowns/dashboard_to_discover_drilldown/types.ts @@ -4,8 +4,8 @@ * you may not use this file except in compliance with the Elastic License. */ -import { CollectConfigProps as CollectConfigPropsBase } from '../../../../../src/plugins/kibana_utils/public'; -import { ApplyGlobalFilterActionContext } from '../../../../../src/plugins/data/public'; +import { CollectConfigProps as CollectConfigPropsBase } from '../../../../../../src/plugins/kibana_utils/public'; +import { ApplyGlobalFilterActionContext } from '../../../../../../src/plugins/data/public'; export type ActionContext = ApplyGlobalFilterActionContext; diff --git a/x-pack/examples/ui_actions_enhanced_examples/public/embeddables/button_embeddable/button_embeddable.ts b/x-pack/examples/ui_actions_enhanced_examples/public/embeddables/button_embeddable/button_embeddable.ts new file mode 100644 index 0000000000000..fcd0c9b94c988 --- /dev/null +++ b/x-pack/examples/ui_actions_enhanced_examples/public/embeddables/button_embeddable/button_embeddable.ts @@ -0,0 +1,53 @@ +/* + * 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 { createElement } from 'react'; +import { render, unmountComponentAtNode } from 'react-dom'; +import { AdvancedUiActionsStart } from '../../../../../plugins/ui_actions_enhanced/public'; +import { Embeddable, EmbeddableInput } from '../../../../../../src/plugins/embeddable/public'; +import { ButtonEmbeddableComponent } from './button_embeddable_component'; +import { VALUE_CLICK_TRIGGER } from '../../../../../../src/plugins/ui_actions/public'; + +export const BUTTON_EMBEDDABLE = 'BUTTON_EMBEDDABLE'; + +export interface ButtonEmbeddableParams { + uiActions: AdvancedUiActionsStart; +} + +export class ButtonEmbeddable extends Embeddable { + type = BUTTON_EMBEDDABLE; + + constructor(input: EmbeddableInput, private readonly params: ButtonEmbeddableParams) { + super(input, {}); + } + + reload() {} + + private el?: HTMLElement; + + public render(el: HTMLElement): void { + super.render(el); + this.el = el; + render( + createElement(ButtonEmbeddableComponent, { + onClick: () => { + this.params.uiActions.getTrigger(VALUE_CLICK_TRIGGER).exec({ + embeddable: this, + data: { + data: [], + }, + }); + }, + }), + el + ); + } + + public destroy() { + super.destroy(); + if (this.el) unmountComponentAtNode(this.el); + } +} diff --git a/x-pack/examples/ui_actions_enhanced_examples/public/embeddables/button_embeddable/button_embeddable_component.tsx b/x-pack/examples/ui_actions_enhanced_examples/public/embeddables/button_embeddable/button_embeddable_component.tsx new file mode 100644 index 0000000000000..d810870de467b --- /dev/null +++ b/x-pack/examples/ui_actions_enhanced_examples/public/embeddables/button_embeddable/button_embeddable_component.tsx @@ -0,0 +1,27 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import * as React from 'react'; +import { EuiCard, EuiFlexItem, EuiIcon } from '@elastic/eui'; + +export interface ButtonEmbeddableComponentProps { + onClick: () => void; +} + +export const ButtonEmbeddableComponent: React.FC = ({ + onClick, +}) => { + return ( + + } + title={`Click me!`} + description={'This embeddable fires "VALUE_CLICK" trigger on click'} + onClick={onClick} + /> + + ); +}; diff --git a/x-pack/examples/ui_actions_enhanced_examples/public/embeddables/button_embeddable/index.ts b/x-pack/examples/ui_actions_enhanced_examples/public/embeddables/button_embeddable/index.ts new file mode 100644 index 0000000000000..e3bfc9c7da425 --- /dev/null +++ b/x-pack/examples/ui_actions_enhanced_examples/public/embeddables/button_embeddable/index.ts @@ -0,0 +1,7 @@ +/* + * 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. + */ + +export * from './button_embeddable'; diff --git a/x-pack/examples/ui_actions_enhanced_examples/public/mount.tsx b/x-pack/examples/ui_actions_enhanced_examples/public/mount.tsx new file mode 100644 index 0000000000000..b2909c636b528 --- /dev/null +++ b/x-pack/examples/ui_actions_enhanced_examples/public/mount.tsx @@ -0,0 +1,38 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import * as React from 'react'; +import { render, unmountComponentAtNode } from 'react-dom'; +import { CoreSetup, AppMountParameters } from 'kibana/public'; +import { StartDependencies, UiActionsEnhancedExamplesStart } from './plugin'; +import { UiActionsExampleAppContextValue, context } from './context'; + +export const mount = ( + coreSetup: CoreSetup +) => async ({ appBasePath, element }: AppMountParameters) => { + const [ + core, + plugins, + { managerWithoutEmbeddable, managerWithoutEmbeddableSingleButton, managerWithEmbeddable }, + ] = await coreSetup.getStartServices(); + const { App } = await import('./containers/app'); + + const deps: UiActionsExampleAppContextValue = { + appBasePath, + core, + plugins, + managerWithoutEmbeddable, + managerWithoutEmbeddableSingleButton, + managerWithEmbeddable, + }; + const reactElement = ( + + + + ); + render(reactElement, element); + return () => unmountComponentAtNode(element); +}; diff --git a/x-pack/examples/ui_actions_enhanced_examples/public/plugin.ts b/x-pack/examples/ui_actions_enhanced_examples/public/plugin.ts index 3f0b64a2ac9ed..c09f64f7b110b 100644 --- a/x-pack/examples/ui_actions_enhanced_examples/public/plugin.ts +++ b/x-pack/examples/ui_actions_enhanced_examples/public/plugin.ts @@ -4,44 +4,174 @@ * you may not use this file except in compliance with the Elastic License. */ -import { Plugin, CoreSetup, CoreStart } from '../../../../src/core/public'; +import { createElement as h } from 'react'; +import { toMountPoint } from '../../../../src/plugins/kibana_react/public'; +import { Plugin, CoreSetup, CoreStart, AppNavLinkStatus } from '../../../../src/core/public'; import { DataPublicPluginSetup, DataPublicPluginStart } from '../../../../src/plugins/data/public'; import { AdvancedUiActionsSetup, AdvancedUiActionsStart, } from '../../../../x-pack/plugins/ui_actions_enhanced/public'; -import { DashboardHelloWorldDrilldown } from './dashboard_hello_world_drilldown'; -import { DashboardToDiscoverDrilldown } from './dashboard_to_discover_drilldown'; +import { DashboardHelloWorldDrilldown } from './drilldowns/dashboard_hello_world_drilldown'; +import { DashboardToDiscoverDrilldown } from './drilldowns/dashboard_to_discover_drilldown'; +import { App1ToDashboardDrilldown } from './drilldowns/app1_to_dashboard_drilldown'; +import { App1HelloWorldDrilldown } from './drilldowns/app1_hello_world_drilldown'; import { createStartServicesGetter } from '../../../../src/plugins/kibana_utils/public'; import { DiscoverSetup, DiscoverStart } from '../../../../src/plugins/discover/public'; -import { DashboardHelloWorldOnlyRangeSelectDrilldown } from './dashboard_hello_world_only_range_select_drilldown'; +import { DashboardSetup, DashboardStart } from '../../../../src/plugins/dashboard/public'; +import { DashboardHelloWorldOnlyRangeSelectDrilldown } from './drilldowns/dashboard_hello_world_only_range_select_drilldown'; +import { DeveloperExamplesSetup } from '../../../../examples/developer_examples/public'; +import { + sampleApp1ClickTrigger, + sampleApp2ClickTrigger, + SAMPLE_APP2_CLICK_TRIGGER, + SampleApp2ClickContext, + sampleApp2ClickContext, +} from './triggers'; +import { mount } from './mount'; +import { + UiActionsEnhancedMemoryActionStorage, + UiActionsEnhancedDynamicActionManager, +} from '../../../plugins/ui_actions_enhanced/public'; +import { App2ToDashboardDrilldown } from './drilldowns/app2_to_dashboard_drilldown'; export interface SetupDependencies { + dashboard: DashboardSetup; data: DataPublicPluginSetup; + developerExamples: DeveloperExamplesSetup; discover: DiscoverSetup; uiActionsEnhanced: AdvancedUiActionsSetup; } export interface StartDependencies { + dashboard: DashboardStart; data: DataPublicPluginStart; discover: DiscoverStart; uiActionsEnhanced: AdvancedUiActionsStart; } +export interface UiActionsEnhancedExamplesStart { + managerWithoutEmbeddable: UiActionsEnhancedDynamicActionManager; + managerWithoutEmbeddableSingleButton: UiActionsEnhancedDynamicActionManager; + managerWithEmbeddable: UiActionsEnhancedDynamicActionManager; +} + export class UiActionsEnhancedExamplesPlugin - implements Plugin { + implements Plugin { public setup( - core: CoreSetup, - { uiActionsEnhanced: uiActions }: SetupDependencies + core: CoreSetup, + { uiActionsEnhanced: uiActions, developerExamples }: SetupDependencies ) { const start = createStartServicesGetter(core.getStartServices); uiActions.registerDrilldown(new DashboardHelloWorldDrilldown()); uiActions.registerDrilldown(new DashboardHelloWorldOnlyRangeSelectDrilldown()); uiActions.registerDrilldown(new DashboardToDiscoverDrilldown({ start })); + uiActions.registerDrilldown(new App1HelloWorldDrilldown()); + uiActions.registerDrilldown(new App1ToDashboardDrilldown({ start })); + uiActions.registerDrilldown(new App2ToDashboardDrilldown({ start })); + + uiActions.registerTrigger(sampleApp1ClickTrigger); + uiActions.registerTrigger(sampleApp2ClickTrigger); + + uiActions.addTriggerAction(SAMPLE_APP2_CLICK_TRIGGER, { + id: 'SINGLE_ELEMENT_EXAMPLE_OPEN_FLYOUT_AT_CREATE', + order: 2, + getDisplayName: () => 'Add drilldown', + getIconType: () => 'plusInCircle', + isCompatible: async ({ workpadId, elementId }: SampleApp2ClickContext) => + workpadId === '123' && elementId === '456', + execute: async () => { + const { core: coreStart, plugins: pluginsStart, self } = start(); + const handle = coreStart.overlays.openFlyout( + toMountPoint( + h(pluginsStart.uiActionsEnhanced.FlyoutManageDrilldowns, { + onClose: () => handle.close(), + viewMode: 'create', + dynamicActionManager: self.managerWithoutEmbeddableSingleButton, + triggers: [SAMPLE_APP2_CLICK_TRIGGER], + placeContext: {}, + }) + ), + { + ownFocus: true, + } + ); + }, + }); + uiActions.addTriggerAction(SAMPLE_APP2_CLICK_TRIGGER, { + id: 'SINGLE_ELEMENT_EXAMPLE_OPEN_FLYOUT_AT_MANAGE', + order: 1, + getDisplayName: () => 'Manage drilldowns', + getIconType: () => 'list', + isCompatible: async ({ workpadId, elementId }: SampleApp2ClickContext) => + workpadId === '123' && elementId === '456', + execute: async () => { + const { core: coreStart, plugins: pluginsStart, self } = start(); + const handle = coreStart.overlays.openFlyout( + toMountPoint( + h(pluginsStart.uiActionsEnhanced.FlyoutManageDrilldowns, { + onClose: () => handle.close(), + viewMode: 'manage', + dynamicActionManager: self.managerWithoutEmbeddableSingleButton, + triggers: [SAMPLE_APP2_CLICK_TRIGGER], + placeContext: { sampleApp2ClickContext }, + }) + ), + { + ownFocus: true, + } + ); + }, + }); + + core.application.register({ + id: 'ui_actions_enhanced-explorer', + title: 'UI Actions Enhanced Explorer', + navLinkStatus: AppNavLinkStatus.hidden, + mount: mount(core), + }); + + developerExamples.register({ + appId: 'ui_actions_enhanced-explorer', + title: 'UI Actions Enhanced', + description: 'Examples of how to use drilldowns.', + links: [ + { + label: 'README', + href: + 'https://github.com/elastic/kibana/tree/master/x-pack/examples/ui_actions_enhanced_examples#ui-actions-enhanced-examples', + iconType: 'logoGithub', + size: 's', + target: '_blank', + }, + ], + }); } - public start(core: CoreStart, plugins: StartDependencies) {} + public start(core: CoreStart, plugins: StartDependencies): UiActionsEnhancedExamplesStart { + const managerWithoutEmbeddable = new UiActionsEnhancedDynamicActionManager({ + storage: new UiActionsEnhancedMemoryActionStorage(), + isCompatible: async () => true, + uiActions: plugins.uiActionsEnhanced, + }); + const managerWithoutEmbeddableSingleButton = new UiActionsEnhancedDynamicActionManager({ + storage: new UiActionsEnhancedMemoryActionStorage(), + isCompatible: async () => true, + uiActions: plugins.uiActionsEnhanced, + }); + const managerWithEmbeddable = new UiActionsEnhancedDynamicActionManager({ + storage: new UiActionsEnhancedMemoryActionStorage(), + isCompatible: async () => true, + uiActions: plugins.uiActionsEnhanced, + }); + + return { + managerWithoutEmbeddable, + managerWithoutEmbeddableSingleButton, + managerWithEmbeddable, + }; + } public stop() {} } diff --git a/x-pack/examples/ui_actions_enhanced_examples/public/triggers/index.ts b/x-pack/examples/ui_actions_enhanced_examples/public/triggers/index.ts new file mode 100644 index 0000000000000..554cb778934cb --- /dev/null +++ b/x-pack/examples/ui_actions_enhanced_examples/public/triggers/index.ts @@ -0,0 +1,8 @@ +/* + * 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. + */ + +export * from './sample_app1_trigger'; +export * from './sample_app2_trigger'; diff --git a/x-pack/examples/ui_actions_enhanced_examples/public/triggers/sample_app1_trigger.ts b/x-pack/examples/ui_actions_enhanced_examples/public/triggers/sample_app1_trigger.ts new file mode 100644 index 0000000000000..93a985626c6cd --- /dev/null +++ b/x-pack/examples/ui_actions_enhanced_examples/public/triggers/sample_app1_trigger.ts @@ -0,0 +1,31 @@ +/* + * 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 { Trigger } from '../../../../../src/plugins/ui_actions/public'; + +export const SAMPLE_APP1_CLICK_TRIGGER = 'SAMPLE_APP1_CLICK_TRIGGER'; + +export const sampleApp1ClickTrigger: Trigger<'SAMPLE_APP1_CLICK_TRIGGER'> = { + id: SAMPLE_APP1_CLICK_TRIGGER, + title: 'App 1 trigger fired on click', + description: 'Could be a click on a ML job in ML app.', +}; + +declare module '../../../../../src/plugins/ui_actions/public' { + export interface TriggerContextMapping { + [SAMPLE_APP1_CLICK_TRIGGER]: SampleApp1ClickContext; + } +} + +export interface SampleApp1ClickContext { + job: SampleMlJob; +} + +export interface SampleMlJob { + job_id: string; + job_type: 'anomaly_detector'; + description: string; +} diff --git a/x-pack/examples/ui_actions_enhanced_examples/public/triggers/sample_app2_trigger.ts b/x-pack/examples/ui_actions_enhanced_examples/public/triggers/sample_app2_trigger.ts new file mode 100644 index 0000000000000..664c99afc94a5 --- /dev/null +++ b/x-pack/examples/ui_actions_enhanced_examples/public/triggers/sample_app2_trigger.ts @@ -0,0 +1,31 @@ +/* + * 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 { Trigger } from '../../../../../src/plugins/ui_actions/public'; + +export const SAMPLE_APP2_CLICK_TRIGGER = 'SAMPLE_APP2_CLICK_TRIGGER'; + +export const sampleApp2ClickTrigger: Trigger<'SAMPLE_APP2_CLICK_TRIGGER'> = { + id: SAMPLE_APP2_CLICK_TRIGGER, + title: 'App 2 trigger fired on click', + description: 'Could be a click on an element in Canvas app.', +}; + +declare module '../../../../../src/plugins/ui_actions/public' { + export interface TriggerContextMapping { + [SAMPLE_APP2_CLICK_TRIGGER]: SampleApp2ClickContext; + } +} + +export interface SampleApp2ClickContext { + workpadId: string; + elementId: string; +} + +export const sampleApp2ClickContext: SampleApp2ClickContext = { + workpadId: '123', + elementId: '456', +}; diff --git a/x-pack/plugins/dashboard_enhanced/kibana.json b/x-pack/plugins/dashboard_enhanced/kibana.json index 264fa0438ea11..f79a69c9f4aba 100644 --- a/x-pack/plugins/dashboard_enhanced/kibana.json +++ b/x-pack/plugins/dashboard_enhanced/kibana.json @@ -6,6 +6,7 @@ "requiredPlugins": ["data", "uiActionsEnhanced", "embeddable", "dashboard", "share"], "configPath": ["xpack", "dashboardEnhanced"], "requiredBundles": [ + "embeddable", "kibanaUtils", "embeddableEnhanced", "kibanaReact", diff --git a/x-pack/plugins/dashboard_enhanced/public/index.ts b/x-pack/plugins/dashboard_enhanced/public/index.ts index 53540a4a1ad2e..8bc1dfc9d6c56 100644 --- a/x-pack/plugins/dashboard_enhanced/public/index.ts +++ b/x-pack/plugins/dashboard_enhanced/public/index.ts @@ -14,6 +14,12 @@ export { StartDependencies as DashboardEnhancedStartDependencies, } from './plugin'; +export { + AbstractDashboardDrilldown as DashboardEnhancedAbstractDashboardDrilldown, + AbstractDashboardDrilldownConfig as DashboardEnhancedAbstractDashboardDrilldownConfig, + AbstractDashboardDrilldownParams as DashboardEnhancedAbstractDashboardDrilldownParams, +} from './services/drilldowns/abstract_dashboard_drilldown'; + export function plugin(context: PluginInitializerContext) { return new DashboardEnhancedPlugin(context); } diff --git a/x-pack/plugins/dashboard_enhanced/public/services/drilldowns/abstract_dashboard_drilldown/abstract_dashboard_drilldown.tsx b/x-pack/plugins/dashboard_enhanced/public/services/drilldowns/abstract_dashboard_drilldown/abstract_dashboard_drilldown.tsx new file mode 100644 index 0000000000000..b098d66619814 --- /dev/null +++ b/x-pack/plugins/dashboard_enhanced/public/services/drilldowns/abstract_dashboard_drilldown/abstract_dashboard_drilldown.tsx @@ -0,0 +1,89 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import React from 'react'; +import { DataPublicPluginStart } from 'src/plugins/data/public'; +import { DashboardStart } from 'src/plugins/dashboard/public'; +import { reactToUiComponent } from '../../../../../../../src/plugins/kibana_react/public'; +import { + TriggerId, + TriggerContextMapping, +} from '../../../../../../../src/plugins/ui_actions/public'; +import { CollectConfigContainer } from './components'; +import { + UiActionsEnhancedDrilldownDefinition as Drilldown, + UiActionsEnhancedBaseActionFactoryContext as BaseActionFactoryContext, + AdvancedUiActionsStart, +} from '../../../../../ui_actions_enhanced/public'; +import { txtGoToDashboard } from './i18n'; +import { + StartServicesGetter, + CollectConfigProps, +} from '../../../../../../../src/plugins/kibana_utils/public'; +import { KibanaURL } from '../../../../../../../src/plugins/share/public'; +import { Config } from './types'; + +export interface Params { + start: StartServicesGetter<{ + uiActionsEnhanced: AdvancedUiActionsStart; + data: DataPublicPluginStart; + dashboard: DashboardStart; + }>; +} + +export abstract class AbstractDashboardDrilldown + implements Drilldown> { + constructor(protected readonly params: Params) {} + + public abstract readonly id: string; + + public abstract readonly supportedTriggers: () => T[]; + + protected abstract getURL(config: Config, context: TriggerContextMapping[T]): Promise; + + public readonly order = 100; + + public readonly getDisplayName = () => txtGoToDashboard; + + public readonly euiIcon = 'dashboardApp'; + + private readonly ReactCollectConfig: React.FC< + CollectConfigProps> + > = (props) => ; + + public readonly CollectConfig = reactToUiComponent(this.ReactCollectConfig); + + public readonly createConfig = () => ({ + dashboardId: '', + useCurrentFilters: true, + useCurrentDateRange: true, + }); + + public readonly isConfigValid = (config: Config): config is Config => { + if (!config.dashboardId) return false; + return true; + }; + + public readonly getHref = async ( + config: Config, + context: TriggerContextMapping[T] + ): Promise => { + const url = await this.getURL(config, context); + return url.path; + }; + + public readonly execute = async (config: Config, context: TriggerContextMapping[T]) => { + const url = await this.getURL(config, context); + await this.params.start().core.application.navigateToApp(url.appName, { path: url.appPath }); + }; + + protected get urlGenerator() { + const urlGenerator = this.params.start().plugins.dashboard.dashboardUrlGenerator; + if (!urlGenerator) + throw new Error('Dashboard URL generator is required for dashboard drilldown.'); + return urlGenerator; + } +} diff --git a/x-pack/plugins/dashboard_enhanced/public/services/drilldowns/dashboard_to_dashboard_drilldown/components/collect_config_container.tsx b/x-pack/plugins/dashboard_enhanced/public/services/drilldowns/abstract_dashboard_drilldown/components/collect_config_container.tsx similarity index 96% rename from x-pack/plugins/dashboard_enhanced/public/services/drilldowns/dashboard_to_dashboard_drilldown/components/collect_config_container.tsx rename to x-pack/plugins/dashboard_enhanced/public/services/drilldowns/abstract_dashboard_drilldown/components/collect_config_container.tsx index 5cbf65f7645dd..ddae64d1c0e49 100644 --- a/x-pack/plugins/dashboard_enhanced/public/services/drilldowns/dashboard_to_dashboard_drilldown/components/collect_config_container.tsx +++ b/x-pack/plugins/dashboard_enhanced/public/services/drilldowns/abstract_dashboard_drilldown/components/collect_config_container.tsx @@ -11,8 +11,8 @@ import { SimpleSavedObject } from '../../../../../../../../src/core/public'; import { DashboardDrilldownConfig } from './dashboard_drilldown_config'; import { txtDestinationDashboardNotFound } from './i18n'; import { CollectConfigProps } from '../../../../../../../../src/plugins/kibana_utils/public'; -import { Config, FactoryContext } from '../types'; -import { Params } from '../drilldown'; +import { Config } from '../types'; +import { Params } from '../abstract_dashboard_drilldown'; const mergeDashboards = ( dashboards: Array>, @@ -34,7 +34,7 @@ const dashboardSavedObjectToMenuItem = ( label: savedObject.attributes.title, }); -interface DashboardDrilldownCollectConfigProps extends CollectConfigProps { +export interface DashboardDrilldownCollectConfigProps extends CollectConfigProps { params: Params; } diff --git a/x-pack/plugins/dashboard_enhanced/public/services/drilldowns/dashboard_to_dashboard_drilldown/components/dashboard_drilldown_config/dashboard_drilldown_config.stories.tsx b/x-pack/plugins/dashboard_enhanced/public/services/drilldowns/abstract_dashboard_drilldown/components/dashboard_drilldown_config/dashboard_drilldown_config.story.tsx similarity index 100% rename from x-pack/plugins/dashboard_enhanced/public/services/drilldowns/dashboard_to_dashboard_drilldown/components/dashboard_drilldown_config/dashboard_drilldown_config.stories.tsx rename to x-pack/plugins/dashboard_enhanced/public/services/drilldowns/abstract_dashboard_drilldown/components/dashboard_drilldown_config/dashboard_drilldown_config.story.tsx diff --git a/x-pack/plugins/dashboard_enhanced/public/services/drilldowns/dashboard_to_dashboard_drilldown/components/dashboard_drilldown_config/dashboard_drilldown_config.test.tsx b/x-pack/plugins/dashboard_enhanced/public/services/drilldowns/abstract_dashboard_drilldown/components/dashboard_drilldown_config/dashboard_drilldown_config.test.tsx similarity index 100% rename from x-pack/plugins/dashboard_enhanced/public/services/drilldowns/dashboard_to_dashboard_drilldown/components/dashboard_drilldown_config/dashboard_drilldown_config.test.tsx rename to x-pack/plugins/dashboard_enhanced/public/services/drilldowns/abstract_dashboard_drilldown/components/dashboard_drilldown_config/dashboard_drilldown_config.test.tsx diff --git a/x-pack/plugins/dashboard_enhanced/public/services/drilldowns/dashboard_to_dashboard_drilldown/components/dashboard_drilldown_config/dashboard_drilldown_config.tsx b/x-pack/plugins/dashboard_enhanced/public/services/drilldowns/abstract_dashboard_drilldown/components/dashboard_drilldown_config/dashboard_drilldown_config.tsx similarity index 100% rename from x-pack/plugins/dashboard_enhanced/public/services/drilldowns/dashboard_to_dashboard_drilldown/components/dashboard_drilldown_config/dashboard_drilldown_config.tsx rename to x-pack/plugins/dashboard_enhanced/public/services/drilldowns/abstract_dashboard_drilldown/components/dashboard_drilldown_config/dashboard_drilldown_config.tsx diff --git a/x-pack/plugins/dashboard_enhanced/public/services/drilldowns/dashboard_to_dashboard_drilldown/components/dashboard_drilldown_config/i18n.ts b/x-pack/plugins/dashboard_enhanced/public/services/drilldowns/abstract_dashboard_drilldown/components/dashboard_drilldown_config/i18n.ts similarity index 100% rename from x-pack/plugins/dashboard_enhanced/public/services/drilldowns/dashboard_to_dashboard_drilldown/components/dashboard_drilldown_config/i18n.ts rename to x-pack/plugins/dashboard_enhanced/public/services/drilldowns/abstract_dashboard_drilldown/components/dashboard_drilldown_config/i18n.ts diff --git a/x-pack/plugins/dashboard_enhanced/public/services/drilldowns/dashboard_to_dashboard_drilldown/components/dashboard_drilldown_config/index.ts b/x-pack/plugins/dashboard_enhanced/public/services/drilldowns/abstract_dashboard_drilldown/components/dashboard_drilldown_config/index.ts similarity index 100% rename from x-pack/plugins/dashboard_enhanced/public/services/drilldowns/dashboard_to_dashboard_drilldown/components/dashboard_drilldown_config/index.ts rename to x-pack/plugins/dashboard_enhanced/public/services/drilldowns/abstract_dashboard_drilldown/components/dashboard_drilldown_config/index.ts diff --git a/x-pack/plugins/dashboard_enhanced/public/services/drilldowns/dashboard_to_dashboard_drilldown/components/i18n.ts b/x-pack/plugins/dashboard_enhanced/public/services/drilldowns/abstract_dashboard_drilldown/components/i18n.ts similarity index 100% rename from x-pack/plugins/dashboard_enhanced/public/services/drilldowns/dashboard_to_dashboard_drilldown/components/i18n.ts rename to x-pack/plugins/dashboard_enhanced/public/services/drilldowns/abstract_dashboard_drilldown/components/i18n.ts diff --git a/x-pack/plugins/dashboard_enhanced/public/services/drilldowns/dashboard_to_dashboard_drilldown/index.ts b/x-pack/plugins/dashboard_enhanced/public/services/drilldowns/abstract_dashboard_drilldown/components/index.ts similarity index 55% rename from x-pack/plugins/dashboard_enhanced/public/services/drilldowns/dashboard_to_dashboard_drilldown/index.ts rename to x-pack/plugins/dashboard_enhanced/public/services/drilldowns/abstract_dashboard_drilldown/components/index.ts index 49065a96b4f7b..5ec560a55bdaf 100644 --- a/x-pack/plugins/dashboard_enhanced/public/services/drilldowns/dashboard_to_dashboard_drilldown/index.ts +++ b/x-pack/plugins/dashboard_enhanced/public/services/drilldowns/abstract_dashboard_drilldown/components/index.ts @@ -4,9 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ -export { DASHBOARD_TO_DASHBOARD_DRILLDOWN } from './constants'; export { - DashboardToDashboardDrilldown, - Params as DashboardToDashboardDrilldownParams, -} from './drilldown'; -export { Config } from './types'; + CollectConfigContainer, + DashboardDrilldownCollectConfigProps, +} from './collect_config_container'; diff --git a/x-pack/plugins/dashboard_enhanced/public/services/drilldowns/dashboard_to_dashboard_drilldown/i18n.ts b/x-pack/plugins/dashboard_enhanced/public/services/drilldowns/abstract_dashboard_drilldown/i18n.ts similarity index 100% rename from x-pack/plugins/dashboard_enhanced/public/services/drilldowns/dashboard_to_dashboard_drilldown/i18n.ts rename to x-pack/plugins/dashboard_enhanced/public/services/drilldowns/abstract_dashboard_drilldown/i18n.ts diff --git a/x-pack/plugins/dashboard_enhanced/public/services/drilldowns/abstract_dashboard_drilldown/index.ts b/x-pack/plugins/dashboard_enhanced/public/services/drilldowns/abstract_dashboard_drilldown/index.ts new file mode 100644 index 0000000000000..5fc823e341094 --- /dev/null +++ b/x-pack/plugins/dashboard_enhanced/public/services/drilldowns/abstract_dashboard_drilldown/index.ts @@ -0,0 +1,11 @@ +/* + * 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. + */ + +export { + AbstractDashboardDrilldown, + Params as AbstractDashboardDrilldownParams, +} from './abstract_dashboard_drilldown'; +export { Config as AbstractDashboardDrilldownConfig } from './types'; diff --git a/x-pack/plugins/dashboard_enhanced/public/services/drilldowns/dashboard_to_dashboard_drilldown/types.ts b/x-pack/plugins/dashboard_enhanced/public/services/drilldowns/abstract_dashboard_drilldown/types.ts similarity index 100% rename from x-pack/plugins/dashboard_enhanced/public/services/drilldowns/dashboard_to_dashboard_drilldown/types.ts rename to x-pack/plugins/dashboard_enhanced/public/services/drilldowns/abstract_dashboard_drilldown/types.ts diff --git a/x-pack/plugins/dashboard_enhanced/public/services/drilldowns/actions/flyout_create_drilldown/flyout_create_drilldown.tsx b/x-pack/plugins/dashboard_enhanced/public/services/drilldowns/actions/flyout_create_drilldown/flyout_create_drilldown.tsx index cd800baaf026e..a2192808c2d40 100644 --- a/x-pack/plugins/dashboard_enhanced/public/services/drilldowns/actions/flyout_create_drilldown/flyout_create_drilldown.tsx +++ b/x-pack/plugins/dashboard_enhanced/public/services/drilldowns/actions/flyout_create_drilldown/flyout_create_drilldown.tsx @@ -83,7 +83,7 @@ export class FlyoutCreateDrilldownAction implements ActionByType handle.close()} viewMode={'create'} dynamicActionManager={embeddable.enhancements.dynamicActions} - supportedTriggers={ensureNestedTriggers(embeddable.supportedTriggers())} + triggers={ensureNestedTriggers(embeddable.supportedTriggers())} placeContext={{ embeddable }} /> ), diff --git a/x-pack/plugins/dashboard_enhanced/public/services/drilldowns/actions/flyout_edit_drilldown/flyout_edit_drilldown.tsx b/x-pack/plugins/dashboard_enhanced/public/services/drilldowns/actions/flyout_edit_drilldown/flyout_edit_drilldown.tsx index 0469034094623..56ef25005078b 100644 --- a/x-pack/plugins/dashboard_enhanced/public/services/drilldowns/actions/flyout_edit_drilldown/flyout_edit_drilldown.tsx +++ b/x-pack/plugins/dashboard_enhanced/public/services/drilldowns/actions/flyout_edit_drilldown/flyout_edit_drilldown.tsx @@ -67,7 +67,7 @@ export class FlyoutEditDrilldownAction implements ActionByType handle.close()} viewMode={'manage'} dynamicActionManager={embeddable.enhancements.dynamicActions} - supportedTriggers={ensureNestedTriggers(embeddable.supportedTriggers())} + triggers={ensureNestedTriggers(embeddable.supportedTriggers())} placeContext={{ embeddable }} /> ), diff --git a/x-pack/plugins/dashboard_enhanced/public/services/drilldowns/dashboard_drilldowns_services.ts b/x-pack/plugins/dashboard_enhanced/public/services/drilldowns/dashboard_drilldowns_services.ts index 4325e3309b898..e1b6493be5200 100644 --- a/x-pack/plugins/dashboard_enhanced/public/services/drilldowns/dashboard_drilldowns_services.ts +++ b/x-pack/plugins/dashboard_enhanced/public/services/drilldowns/dashboard_drilldowns_services.ts @@ -14,7 +14,7 @@ import { OPEN_FLYOUT_ADD_DRILLDOWN, OPEN_FLYOUT_EDIT_DRILLDOWN, } from './actions'; -import { DashboardToDashboardDrilldown } from './dashboard_to_dashboard_drilldown'; +import { EmbeddableToDashboardDrilldown } from './embeddable_to_dashboard_drilldown'; import { createStartServicesGetter } from '../../../../../../src/plugins/kibana_utils/public'; declare module '../../../../../../src/plugins/ui_actions/public' { @@ -44,12 +44,6 @@ export class DashboardDrilldownsService { { uiActionsEnhanced: uiActions }: SetupDependencies ) { const start = createStartServicesGetter(core.getStartServices); - const getDashboardUrlGenerator = () => { - const urlGenerator = start().plugins.dashboard.dashboardUrlGenerator; - if (!urlGenerator) - throw new Error('dashboardUrlGenerator is required for dashboard to dashboard drilldown'); - return urlGenerator; - }; const actionFlyoutCreateDrilldown = new FlyoutCreateDrilldownAction({ start }); uiActions.addTriggerAction(CONTEXT_MENU_TRIGGER, actionFlyoutCreateDrilldown); @@ -57,10 +51,7 @@ export class DashboardDrilldownsService { const actionFlyoutEditDrilldown = new FlyoutEditDrilldownAction({ start }); uiActions.addTriggerAction(CONTEXT_MENU_TRIGGER, actionFlyoutEditDrilldown); - const dashboardToDashboardDrilldown = new DashboardToDashboardDrilldown({ - start, - getDashboardUrlGenerator, - }); + const dashboardToDashboardDrilldown = new EmbeddableToDashboardDrilldown({ start }); uiActions.registerDrilldown(dashboardToDashboardDrilldown); } } diff --git a/x-pack/plugins/dashboard_enhanced/public/services/drilldowns/dashboard_to_dashboard_drilldown/drilldown.tsx b/x-pack/plugins/dashboard_enhanced/public/services/drilldowns/dashboard_to_dashboard_drilldown/drilldown.tsx deleted file mode 100644 index 056feeb2b2167..0000000000000 --- a/x-pack/plugins/dashboard_enhanced/public/services/drilldowns/dashboard_to_dashboard_drilldown/drilldown.tsx +++ /dev/null @@ -1,125 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import React from 'react'; -import { reactToUiComponent } from '../../../../../../../src/plugins/kibana_react/public'; -import { APPLY_FILTER_TRIGGER } from '../../../../../../../src/plugins/ui_actions/public'; -import { - DashboardUrlGenerator, - DashboardUrlGeneratorState, -} from '../../../../../../../src/plugins/dashboard/public'; -import { CollectConfigContainer } from './components'; -import { DASHBOARD_TO_DASHBOARD_DRILLDOWN } from './constants'; -import { UiActionsEnhancedDrilldownDefinition as Drilldown } from '../../../../../ui_actions_enhanced/public'; -import { txtGoToDashboard } from './i18n'; -import { - ApplyGlobalFilterActionContext, - esFilters, - isFilters, - isQuery, - isTimeRange, -} from '../../../../../../../src/plugins/data/public'; -import { StartServicesGetter } from '../../../../../../../src/plugins/kibana_utils/public'; -import { StartDependencies } from '../../../plugin'; -import { Config, FactoryContext } from './types'; -import { SearchInput } from '../../../../../../../src/plugins/discover/public'; - -export interface Params { - start: StartServicesGetter>; - getDashboardUrlGenerator: () => DashboardUrlGenerator; -} - -export class DashboardToDashboardDrilldown - implements Drilldown { - constructor(protected readonly params: Params) {} - - public readonly id = DASHBOARD_TO_DASHBOARD_DRILLDOWN; - - public readonly order = 100; - - public readonly getDisplayName = () => txtGoToDashboard; - - public readonly euiIcon = 'dashboardApp'; - - private readonly ReactCollectConfig: React.FC = (props) => ( - - ); - - public readonly CollectConfig = reactToUiComponent(this.ReactCollectConfig); - - public readonly createConfig = () => ({ - dashboardId: '', - useCurrentFilters: true, - useCurrentDateRange: true, - }); - - public readonly isConfigValid = (config: Config): config is Config => { - if (!config.dashboardId) return false; - return true; - }; - - public supportedTriggers(): Array { - return [APPLY_FILTER_TRIGGER]; - } - - public readonly getHref = async ( - config: Config, - context: ApplyGlobalFilterActionContext - ): Promise => { - return this.getDestinationUrl(config, context); - }; - - public readonly execute = async (config: Config, context: ApplyGlobalFilterActionContext) => { - const dashboardPath = await this.getDestinationUrl(config, context); - const dashboardHash = dashboardPath.split('#')[1]; - - await this.params.start().core.application.navigateToApp('dashboards', { - path: `#${dashboardHash}`, - }); - }; - - private getDestinationUrl = async ( - config: Config, - context: ApplyGlobalFilterActionContext - ): Promise => { - const state: DashboardUrlGeneratorState = { - dashboardId: config.dashboardId, - }; - - if (context.embeddable) { - const input = context.embeddable.getInput() as Readonly; - if (isQuery(input.query) && config.useCurrentFilters) state.query = input.query; - - // if useCurrentDashboardDataRange is enabled, then preserve current time range - // if undefined is passed, then destination dashboard will figure out time range itself - // for brush event this time range would be overwritten - if (isTimeRange(input.timeRange) && config.useCurrentDateRange) - state.timeRange = input.timeRange; - - // if useCurrentDashboardFilters enabled, then preserve all the filters (pinned and unpinned) - // otherwise preserve only pinned - if (isFilters(input.filters)) - state.filters = config.useCurrentFilters - ? input.filters - : input.filters?.filter((f) => esFilters.isFilterPinned(f)); - } - - const { - restOfFilters: filtersFromEvent, - timeRange: timeRangeFromEvent, - } = esFilters.extractTimeRange(context.filters, context.timeFieldName); - - if (filtersFromEvent) { - state.filters = [...(state.filters ?? []), ...filtersFromEvent]; - } - - if (timeRangeFromEvent) { - state.timeRange = timeRangeFromEvent; - } - - return this.params.getDashboardUrlGenerator().createUrl(state); - }; -} diff --git a/x-pack/plugins/dashboard_enhanced/public/services/drilldowns/dashboard_to_dashboard_drilldown/constants.ts b/x-pack/plugins/dashboard_enhanced/public/services/drilldowns/embeddable_to_dashboard_drilldown/constants.ts similarity index 68% rename from x-pack/plugins/dashboard_enhanced/public/services/drilldowns/dashboard_to_dashboard_drilldown/constants.ts rename to x-pack/plugins/dashboard_enhanced/public/services/drilldowns/embeddable_to_dashboard_drilldown/constants.ts index daefcf2d68cc5..922ec36619a4b 100644 --- a/x-pack/plugins/dashboard_enhanced/public/services/drilldowns/dashboard_to_dashboard_drilldown/constants.ts +++ b/x-pack/plugins/dashboard_enhanced/public/services/drilldowns/embeddable_to_dashboard_drilldown/constants.ts @@ -5,10 +5,10 @@ */ /** - * note: - * don't change this string without carefull consideration, - * because it is stored in saved objects. + * NOTE: DO NOT CHANGE THIS STRING WITHOUT CAREFUL CONSIDERATOIN, BECAUSE IT IS + * STORED IN SAVED OBJECTS. + * * Also temporary dashboard drilldown migration code inside embeddable plugin relies on it * x-pack/plugins/embeddable_enhanced/public/embeddables/embeddable_action_storage.ts */ -export const DASHBOARD_TO_DASHBOARD_DRILLDOWN = 'DASHBOARD_TO_DASHBOARD_DRILLDOWN'; +export const EMBEDDABLE_TO_DASHBOARD_DRILLDOWN = 'DASHBOARD_TO_DASHBOARD_DRILLDOWN'; diff --git a/x-pack/plugins/dashboard_enhanced/public/services/drilldowns/dashboard_to_dashboard_drilldown/drilldown.test.tsx b/x-pack/plugins/dashboard_enhanced/public/services/drilldowns/embeddable_to_dashboard_drilldown/embeddable_to_dashboard_drilldown.test.tsx similarity index 88% rename from x-pack/plugins/dashboard_enhanced/public/services/drilldowns/dashboard_to_dashboard_drilldown/drilldown.test.tsx rename to x-pack/plugins/dashboard_enhanced/public/services/drilldowns/embeddable_to_dashboard_drilldown/embeddable_to_dashboard_drilldown.test.tsx index 40fa469feb34b..f6de2ba931c58 100644 --- a/x-pack/plugins/dashboard_enhanced/public/services/drilldowns/dashboard_to_dashboard_drilldown/drilldown.test.tsx +++ b/x-pack/plugins/dashboard_enhanced/public/services/drilldowns/embeddable_to_dashboard_drilldown/embeddable_to_dashboard_drilldown.test.tsx @@ -4,8 +4,8 @@ * you may not use this file except in compliance with the Elastic License. */ -import { DashboardToDashboardDrilldown } from './drilldown'; -import { Config } from './types'; +import { EmbeddableToDashboardDrilldown } from './embeddable_to_dashboard_drilldown'; +import { AbstractDashboardDrilldownConfig as Config } from '../abstract_dashboard_drilldown'; import { coreMock, savedObjectsServiceMock } from '../../../../../../../src/core/public/mocks'; import { Filter, @@ -18,7 +18,6 @@ import { ApplyGlobalFilterActionContext, esFilters, } from '../../../../../../../src/plugins/data/public'; -// convenient to use real implementation here. import { createDashboardUrlGenerator } from '../../../../../../../src/plugins/dashboard/public/url_generator'; import { UrlGeneratorsService } from '../../../../../../../src/plugins/share/public/url_generators'; import { StartDependencies } from '../../../plugin'; @@ -26,7 +25,7 @@ import { SavedObjectLoader } from '../../../../../../../src/plugins/saved_object import { StartServicesGetter } from '../../../../../../../src/plugins/kibana_utils/public/core'; describe('.isConfigValid()', () => { - const drilldown = new DashboardToDashboardDrilldown({} as any); + const drilldown = new EmbeddableToDashboardDrilldown({} as any); test('returns false for invalid config with missing dashboard id', () => { expect( @@ -50,19 +49,19 @@ describe('.isConfigValid()', () => { }); test('config component exist', () => { - const drilldown = new DashboardToDashboardDrilldown({} as any); + const drilldown = new EmbeddableToDashboardDrilldown({} as any); expect(drilldown.CollectConfig).toEqual(expect.any(Function)); }); test('initial config: switches are ON', () => { - const drilldown = new DashboardToDashboardDrilldown({} as any); + const drilldown = new EmbeddableToDashboardDrilldown({} as any); const { useCurrentDateRange, useCurrentFilters } = drilldown.createConfig(); expect(useCurrentDateRange).toBe(true); expect(useCurrentFilters).toBe(true); }); test('getHref is defined', () => { - const drilldown = new DashboardToDashboardDrilldown({} as any); + const drilldown = new EmbeddableToDashboardDrilldown({} as any); expect(drilldown.getHref).toBeDefined(); }); @@ -84,7 +83,7 @@ describe('.execute() & getHref', () => { const getUrlForApp = jest.fn((app, opt) => `${app}/${opt.path}`); const savedObjectsClient = savedObjectsServiceMock.createStartContract().client; - const drilldown = new DashboardToDashboardDrilldown({ + const drilldown = new EmbeddableToDashboardDrilldown({ start: ((() => ({ core: { application: { @@ -97,19 +96,24 @@ describe('.execute() & getHref', () => { }, plugins: { uiActionsEnhanced: {}, + dashboard: { + dashboardUrlGenerator: new UrlGeneratorsService() + .setup(coreMock.createSetup()) + .registerUrlGenerator( + createDashboardUrlGenerator(() => + Promise.resolve({ + appBasePath: 'xyz/app/dashboards', + useHashedUrl: false, + savedDashboardLoader: ({} as unknown) as SavedObjectLoader, + }) + ) + ), + }, }, self: {}, - })) as unknown) as StartServicesGetter>, - getDashboardUrlGenerator: () => - new UrlGeneratorsService().setup(coreMock.createSetup()).registerUrlGenerator( - createDashboardUrlGenerator(() => - Promise.resolve({ - appBasePath: 'test', - useHashedUrl: false, - savedDashboardLoader: ({} as unknown) as SavedObjectLoader, - }) - ) - ), + })) as unknown) as StartServicesGetter< + Pick + >, }); const completeConfig: Config = { diff --git a/x-pack/plugins/dashboard_enhanced/public/services/drilldowns/embeddable_to_dashboard_drilldown/embeddable_to_dashboard_drilldown.tsx b/x-pack/plugins/dashboard_enhanced/public/services/drilldowns/embeddable_to_dashboard_drilldown/embeddable_to_dashboard_drilldown.tsx new file mode 100644 index 0000000000000..25bc93ad38b36 --- /dev/null +++ b/x-pack/plugins/dashboard_enhanced/public/services/drilldowns/embeddable_to_dashboard_drilldown/embeddable_to_dashboard_drilldown.tsx @@ -0,0 +1,83 @@ +/* + * 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 { + TriggerContextMapping, + APPLY_FILTER_TRIGGER, +} from '../../../../../../../src/plugins/ui_actions/public'; +import { DashboardUrlGeneratorState } from '../../../../../../../src/plugins/dashboard/public'; +import { + esFilters, + isFilters, + isQuery, + isTimeRange, +} from '../../../../../../../src/plugins/data/public'; +import { + AbstractDashboardDrilldown, + AbstractDashboardDrilldownParams, + AbstractDashboardDrilldownConfig as Config, +} from '../abstract_dashboard_drilldown'; +import { KibanaURL } from '../../../../../../../src/plugins/share/public'; +import { EMBEDDABLE_TO_DASHBOARD_DRILLDOWN } from './constants'; + +type Trigger = typeof APPLY_FILTER_TRIGGER; +type Context = TriggerContextMapping[Trigger]; +export type Params = AbstractDashboardDrilldownParams; + +/** + * This drilldown is the "Go to Dashboard" you can find in Dashboard app panles. + * This drilldown can be used on any embeddable and it is tied to embeddables + * in two ways: (1) it works with APPLY_FILTER_TRIGGER, which is usually executed + * by embeddables (but not necessarily); (2) its `getURL` method depends on + * `embeddable` field being present in `context`. + */ +export class EmbeddableToDashboardDrilldown extends AbstractDashboardDrilldown { + public readonly id = EMBEDDABLE_TO_DASHBOARD_DRILLDOWN; + + public readonly supportedTriggers = () => [APPLY_FILTER_TRIGGER] as Trigger[]; + + protected async getURL(config: Config, context: Context): Promise { + const state: DashboardUrlGeneratorState = { + dashboardId: config.dashboardId, + }; + + if (context.embeddable) { + const input = context.embeddable.getInput(); + if (isQuery(input.query) && config.useCurrentFilters) state.query = input.query; + + // if useCurrentDashboardDataRange is enabled, then preserve current time range + // if undefined is passed, then destination dashboard will figure out time range itself + // for brush event this time range would be overwritten + if (isTimeRange(input.timeRange) && config.useCurrentDateRange) + state.timeRange = input.timeRange; + + // if useCurrentDashboardFilters enabled, then preserve all the filters (pinned and unpinned) + // otherwise preserve only pinned + if (isFilters(input.filters)) + state.filters = config.useCurrentFilters + ? input.filters + : input.filters?.filter((f) => esFilters.isFilterPinned(f)); + } + + const { + restOfFilters: filtersFromEvent, + timeRange: timeRangeFromEvent, + } = esFilters.extractTimeRange(context.filters, context.timeFieldName); + + if (filtersFromEvent) { + state.filters = [...(state.filters ?? []), ...filtersFromEvent]; + } + + if (timeRangeFromEvent) { + state.timeRange = timeRangeFromEvent; + } + + const path = await this.urlGenerator.createUrl(state); + const url = new KibanaURL(path); + + return url; + } +} diff --git a/x-pack/plugins/dashboard_enhanced/public/services/drilldowns/embeddable_to_dashboard_drilldown/index.ts b/x-pack/plugins/dashboard_enhanced/public/services/drilldowns/embeddable_to_dashboard_drilldown/index.ts new file mode 100644 index 0000000000000..a48ab02224248 --- /dev/null +++ b/x-pack/plugins/dashboard_enhanced/public/services/drilldowns/embeddable_to_dashboard_drilldown/index.ts @@ -0,0 +1,11 @@ +/* + * 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. + */ + +export { EMBEDDABLE_TO_DASHBOARD_DRILLDOWN } from './constants'; +export { + EmbeddableToDashboardDrilldown, + Params as EmbeddableToDashboardDrilldownParams, +} from './embeddable_to_dashboard_drilldown'; diff --git a/x-pack/plugins/discover_enhanced/kibana.json b/x-pack/plugins/discover_enhanced/kibana.json index da95a0f21a020..01a3624d3e320 100644 --- a/x-pack/plugins/discover_enhanced/kibana.json +++ b/x-pack/plugins/discover_enhanced/kibana.json @@ -7,5 +7,5 @@ "requiredPlugins": ["uiActions", "embeddable", "discover"], "optionalPlugins": ["share", "kibanaLegacy", "usageCollection"], "configPath": ["xpack", "discoverEnhanced"], - "requiredBundles": ["kibanaUtils", "data"] + "requiredBundles": ["kibanaUtils", "data", "share"] } diff --git a/x-pack/plugins/discover_enhanced/public/actions/explore_data/abstract_explore_data_action.ts b/x-pack/plugins/discover_enhanced/public/actions/explore_data/abstract_explore_data_action.ts index 36a844752a1c3..40e7691e621fd 100644 --- a/x-pack/plugins/discover_enhanced/public/actions/explore_data/abstract_explore_data_action.ts +++ b/x-pack/plugins/discover_enhanced/public/actions/explore_data/abstract_explore_data_action.ts @@ -10,7 +10,7 @@ import { ViewMode, IEmbeddable } from '../../../../../../src/plugins/embeddable/ import { StartServicesGetter } from '../../../../../../src/plugins/kibana_utils/public'; import { KibanaLegacyStart } from '../../../../../../src/plugins/kibana_legacy/public'; import { CoreStart } from '../../../../../../src/core/public'; -import { KibanaURL } from './kibana_url'; +import { KibanaURL } from '../../../../../../src/plugins/share/public'; import * as shared from './shared'; export const ACTION_EXPLORE_DATA = 'ACTION_EXPLORE_DATA'; diff --git a/x-pack/plugins/discover_enhanced/public/actions/explore_data/explore_data_chart_action.ts b/x-pack/plugins/discover_enhanced/public/actions/explore_data/explore_data_chart_action.ts index 0a7be858691af..52946b3dca7a1 100644 --- a/x-pack/plugins/discover_enhanced/public/actions/explore_data/explore_data_chart_action.ts +++ b/x-pack/plugins/discover_enhanced/public/actions/explore_data/explore_data_chart_action.ts @@ -13,7 +13,7 @@ import { ApplyGlobalFilterActionContext, esFilters, } from '../../../../../../src/plugins/data/public'; -import { KibanaURL } from './kibana_url'; +import { KibanaURL } from '../../../../../../src/plugins/share/public'; import * as shared from './shared'; import { AbstractExploreDataAction } from './abstract_explore_data_action'; diff --git a/x-pack/plugins/discover_enhanced/public/actions/explore_data/explore_data_context_menu_action.ts b/x-pack/plugins/discover_enhanced/public/actions/explore_data/explore_data_context_menu_action.ts index 6e748030fe107..fdd096e718339 100644 --- a/x-pack/plugins/discover_enhanced/public/actions/explore_data/explore_data_context_menu_action.ts +++ b/x-pack/plugins/discover_enhanced/public/actions/explore_data/explore_data_context_menu_action.ts @@ -7,7 +7,7 @@ import { Action } from '../../../../../../src/plugins/ui_actions/public'; import { EmbeddableContext } from '../../../../../../src/plugins/embeddable/public'; import { DiscoverUrlGeneratorState } from '../../../../../../src/plugins/discover/public'; -import { KibanaURL } from './kibana_url'; +import { KibanaURL } from '../../../../../../src/plugins/share/public'; import * as shared from './shared'; import { AbstractExploreDataAction } from './abstract_explore_data_action'; diff --git a/x-pack/plugins/discover_enhanced/public/actions/explore_data/kibana_url.ts b/x-pack/plugins/discover_enhanced/public/actions/explore_data/kibana_url.ts deleted file mode 100644 index 3c25fc2b3c3d1..0000000000000 --- a/x-pack/plugins/discover_enhanced/public/actions/explore_data/kibana_url.ts +++ /dev/null @@ -1,31 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -// TODO: Replace this logic with KibanaURL once it is available. -// https://github.com/elastic/kibana/issues/64497 -export class KibanaURL { - public readonly path: string; - public readonly appName: string; - public readonly appPath: string; - - constructor(path: string) { - const match = path.match(/^.*\/app\/([^\/#]+)(.+)$/); - - if (!match) { - throw new Error('Unexpected Discover URL path.'); - } - - const [, appName, appPath] = match; - - if (!appName || !appPath) { - throw new Error('Could not parse Discover URL path.'); - } - - this.path = path; - this.appName = appName; - this.appPath = appPath; - } -} diff --git a/x-pack/plugins/embeddable_enhanced/public/embeddables/embeddable_action_storage.test.ts b/x-pack/plugins/embeddable_enhanced/public/embeddables/embeddable_action_storage.test.ts index fffb75451f8ac..9856d3a558e24 100644 --- a/x-pack/plugins/embeddable_enhanced/public/embeddables/embeddable_action_storage.test.ts +++ b/x-pack/plugins/embeddable_enhanced/public/embeddables/embeddable_action_storage.test.ts @@ -12,7 +12,6 @@ import { import { UiActionsEnhancedSerializedEvent } from '../../../ui_actions_enhanced/public'; import { of } from '../../../../../src/plugins/kibana_utils/public'; // use real const to make test fail in case someone accidentally changes it -import { DASHBOARD_TO_DASHBOARD_DRILLDOWN } from '../../../dashboard_enhanced/public/services/drilldowns/dashboard_to_dashboard_drilldown'; import { APPLY_FILTER_TRIGGER } from '../../../../../src/plugins/ui_actions/public'; class TestEmbeddable extends Embeddable { @@ -555,7 +554,7 @@ describe('EmbeddableActionStorage', () => { eventId: '1', triggers: [OTHER_TRIGGER], action: { - factoryId: DASHBOARD_TO_DASHBOARD_DRILLDOWN, + factoryId: 'DASHBOARD_TO_DASHBOARD_DRILLDOWN', name: '', config: {}, }, diff --git a/x-pack/plugins/ui_actions_enhanced/public/components/action_wizard/action_wizard.tsx b/x-pack/plugins/ui_actions_enhanced/public/components/action_wizard/action_wizard.tsx index e935798179402..7a705f03c0650 100644 --- a/x-pack/plugins/ui_actions_enhanced/public/components/action_wizard/action_wizard.tsx +++ b/x-pack/plugins/ui_actions_enhanced/public/components/action_wizard/action_wizard.tsx @@ -80,7 +80,7 @@ export interface ActionWizardProps< /** * List of possible triggers in current context */ - supportedTriggers: TriggerId[]; + triggers: TriggerId[]; triggerPickerDocsLink?: string; } @@ -94,7 +94,7 @@ export const ActionWizard: React.FC = ({ context, onSelectedTriggersChange, getTriggerInfo, - supportedTriggers, + triggers, triggerPickerDocsLink, }) => { // auto pick action factory if there is only 1 available @@ -108,14 +108,14 @@ export const ActionWizard: React.FC = ({ // auto pick selected trigger if none is picked if (currentActionFactory && !((context.triggers?.length ?? 0) > 0)) { - const triggers = getTriggersForActionFactory(currentActionFactory, supportedTriggers); - if (triggers.length > 0) { - onSelectedTriggersChange([triggers[0]]); + const actionTriggers = getTriggersForActionFactory(currentActionFactory, triggers); + if (actionTriggers.length > 0) { + onSelectedTriggersChange([actionTriggers[0]]); } } if (currentActionFactory && config) { - const allTriggers = getTriggersForActionFactory(currentActionFactory, supportedTriggers); + const allTriggers = getTriggersForActionFactory(currentActionFactory, triggers); return (

diff --git a/x-pack/plugins/ui_actions_enhanced/public/drilldowns/components/connected_flyout_manage_drilldowns/connected_flyout_manage_drilldowns.stories.tsx b/x-pack/plugins/ui_actions_enhanced/public/drilldowns/components/connected_flyout_manage_drilldowns/connected_flyout_manage_drilldowns.stories.tsx index daa56354289cf..a909d2a27f454 100644 --- a/x-pack/plugins/ui_actions_enhanced/public/drilldowns/components/connected_flyout_manage_drilldowns/connected_flyout_manage_drilldowns.stories.tsx +++ b/x-pack/plugins/ui_actions_enhanced/public/drilldowns/components/connected_flyout_manage_drilldowns/connected_flyout_manage_drilldowns.stories.tsx @@ -34,7 +34,7 @@ storiesOf('components/FlyoutManageDrilldowns', module) {}}> )) @@ -42,7 +42,7 @@ storiesOf('components/FlyoutManageDrilldowns', module) {}}> )); diff --git a/x-pack/plugins/ui_actions_enhanced/public/drilldowns/components/connected_flyout_manage_drilldowns/connected_flyout_manage_drilldowns.test.tsx b/x-pack/plugins/ui_actions_enhanced/public/drilldowns/components/connected_flyout_manage_drilldowns/connected_flyout_manage_drilldowns.test.tsx index 48dbd5a864170..bef6834ed4c47 100644 --- a/x-pack/plugins/ui_actions_enhanced/public/drilldowns/components/connected_flyout_manage_drilldowns/connected_flyout_manage_drilldowns.test.tsx +++ b/x-pack/plugins/ui_actions_enhanced/public/drilldowns/components/connected_flyout_manage_drilldowns/connected_flyout_manage_drilldowns.test.tsx @@ -19,7 +19,7 @@ import { TEST_SUBJ_DRILLDOWN_ITEM } from '../list_manage_drilldowns'; import { WELCOME_MESSAGE_TEST_SUBJ } from '../drilldown_hello_bar'; import { coreMock } from '../../../../../../../src/core/public/mocks'; import { NotificationsStart } from 'kibana/public'; -import { toastDrilldownsCRUDError } from './i18n'; +import { toastDrilldownsCRUDError } from '../../hooks/i18n'; const storage = new Storage(new StubBrowserStorage()); const toasts = coreMock.createStart().notifications.toasts; @@ -41,7 +41,7 @@ test('Allows to manage drilldowns', async () => { const screen = render( ); @@ -115,7 +115,7 @@ test('Can delete multiple drilldowns', async () => { const screen = render( ); // wait for initial render. It is async because resolving compatible action factories is async @@ -157,7 +157,7 @@ test('Create only mode', async () => { dynamicActionManager={mockDynamicActionManager} viewMode={'create'} onClose={onClose} - supportedTriggers={mockSupportedTriggers} + triggers={mockSupportedTriggers} /> ); // wait for initial render. It is async because resolving compatible action factories is async @@ -181,7 +181,7 @@ test('After switching between action factories state is restored', async () => { ); // wait for initial render. It is async because resolving compatible action factories is async @@ -222,7 +222,7 @@ test("Error when can't save drilldown changes", async () => { const screen = render( ); // wait for initial render. It is async because resolving compatible action factories is async @@ -245,7 +245,7 @@ test('Should show drilldown welcome message. Should be able to dismiss it', asyn let screen = render( ); @@ -260,7 +260,7 @@ test('Should show drilldown welcome message. Should be able to dismiss it', asyn screen = render( ); // wait for initial render. It is async because resolving compatible action factories is async @@ -272,7 +272,7 @@ test('Drilldown type is not shown if no supported trigger', async () => { const screen = render( ); @@ -286,7 +286,7 @@ test('Can pick a trigger', async () => { const screen = render( ); diff --git a/x-pack/plugins/ui_actions_enhanced/public/drilldowns/components/connected_flyout_manage_drilldowns/connected_flyout_manage_drilldowns.tsx b/x-pack/plugins/ui_actions_enhanced/public/drilldowns/components/connected_flyout_manage_drilldowns/connected_flyout_manage_drilldowns.tsx index 272ec3edc9d29..1f148de7b5178 100644 --- a/x-pack/plugins/ui_actions_enhanced/public/drilldowns/components/connected_flyout_manage_drilldowns/connected_flyout_manage_drilldowns.tsx +++ b/x-pack/plugins/ui_actions_enhanced/public/drilldowns/components/connected_flyout_manage_drilldowns/connected_flyout_manage_drilldowns.tsx @@ -4,33 +4,25 @@ * you may not use this file except in compliance with the Elastic License. */ -import React, { useEffect, useState, useMemo } from 'react'; +import React, { useState, useMemo } from 'react'; import { ToastsStart } from 'kibana/public'; -import useMountedState from 'react-use/lib/useMountedState'; import { intersection } from 'lodash'; import { DrilldownWizardConfig, FlyoutDrilldownWizard } from '../flyout_drilldown_wizard'; import { FlyoutListManageDrilldowns } from '../flyout_list_manage_drilldowns'; import { IStorageWrapper } from '../../../../../../../src/plugins/kibana_utils/public'; import { Trigger, TriggerId } from '../../../../../../../src/plugins/ui_actions/public'; -import { useContainerState } from '../../../../../../../src/plugins/kibana_utils/public'; import { DrilldownListItem } from '../list_manage_drilldowns'; -import { - insufficientLicenseLevel, - invalidDrilldownType, - toastDrilldownCreated, - toastDrilldownDeleted, - toastDrilldownEdited, - toastDrilldownsCRUDError, - toastDrilldownsDeleted, -} from './i18n'; +import { insufficientLicenseLevel, invalidDrilldownType } from './i18n'; import { ActionFactory, BaseActionConfig, BaseActionFactoryContext, DynamicActionManager, - SerializedAction, SerializedEvent, } from '../../../dynamic_actions'; +import { useWelcomeMessage } from '../../hooks/use_welcome_message'; +import { useCompatibleActionFactoriesForCurrentContext } from '../../hooks/use_compatible_action_factories_for_current_context'; +import { useDrilldownsStateManager } from '../../hooks/use_drilldown_state_manager'; import { ActionFactoryPlaceContext } from '../types'; interface ConnectedFlyoutManageDrilldownsProps< @@ -43,7 +35,7 @@ interface ConnectedFlyoutManageDrilldownsProps< /** * List of possible triggers in current context */ - supportedTriggers: TriggerId[]; + triggers: TriggerId[]; /** * Extra action factory context passed into action factories CollectConfig, getIconType, getDisplayName and etc... @@ -74,7 +66,7 @@ export function createFlyoutManageDrilldowns({ toastService: ToastsStart; docsLink?: string; triggerPickerDocsLink?: string; -}) { +}): React.FC { const allActionFactoriesById = allActionFactories.reduce((acc, next) => { acc[next.id] = next; return acc; @@ -84,8 +76,8 @@ export function createFlyoutManageDrilldowns({ const isCreateOnly = props.viewMode === 'create'; const factoryContext: BaseActionFactoryContext = useMemo( - () => ({ ...props.placeContext, triggers: props.supportedTriggers }), - [props.placeContext, props.supportedTriggers] + () => ({ ...props.placeContext, triggers: props.triggers }), + [props.placeContext, props.triggers] ); const actionFactories = useCompatibleActionFactoriesForCurrentContext( allActionFactories, @@ -210,7 +202,7 @@ export function createFlyoutManageDrilldowns({ }} actionFactoryPlaceContext={props.placeContext} initialDrilldownWizardConfig={resolveInitialDrilldownWizardConfig()} - supportedTriggers={props.supportedTriggers} + supportedTriggers={props.triggers} getTrigger={getTrigger} /> ); @@ -220,7 +212,7 @@ export function createFlyoutManageDrilldowns({ // show trigger column in case if there is more then 1 possible trigger in current context const showTriggerColumn = intersection( - props.supportedTriggers, + props.triggers, actionFactories .map((factory) => factory.supportedTriggers()) .reduce((res, next) => res.concat(next), []) @@ -250,108 +242,3 @@ export function createFlyoutManageDrilldowns({ } }; } - -function useCompatibleActionFactoriesForCurrentContext< - Context extends BaseActionFactoryContext = BaseActionFactoryContext ->(actionFactories: ActionFactory[], context: Context) { - const [compatibleActionFactories, setCompatibleActionFactories] = useState(); - useEffect(() => { - let canceled = false; - async function updateCompatibleFactoriesForContext() { - const compatibility = await Promise.all( - actionFactories.map((factory) => factory.isCompatible(context)) - ); - if (canceled) return; - - const compatibleFactories = actionFactories.filter((_, i) => compatibility[i]); - const triggerSupportedFactories = compatibleFactories.filter((factory) => - factory.supportedTriggers().some((trigger) => context.triggers.includes(trigger)) - ); - setCompatibleActionFactories(triggerSupportedFactories); - } - updateCompatibleFactoriesForContext(); - return () => { - canceled = true; - }; - }, [context, actionFactories, context.triggers]); - - return compatibleActionFactories; -} - -function useWelcomeMessage(storage: IStorageWrapper): [boolean, () => void] { - const key = `drilldowns:hidWelcomeMessage`; - const [hidWelcomeMessage, setHidWelcomeMessage] = useState(storage.get(key) ?? false); - - return [ - !hidWelcomeMessage, - () => { - if (hidWelcomeMessage) return; - setHidWelcomeMessage(true); - storage.set(key, true); - }, - ]; -} - -function useDrilldownsStateManager(actionManager: DynamicActionManager, toastService: ToastsStart) { - const { events: drilldowns } = useContainerState(actionManager.state); - const [isLoading, setIsLoading] = useState(false); - const isMounted = useMountedState(); - - async function run(op: () => Promise) { - setIsLoading(true); - try { - await op(); - } catch (e) { - toastService.addError(e, { - title: toastDrilldownsCRUDError, - }); - if (!isMounted) return; - setIsLoading(false); - return; - } - } - - async function createDrilldown(action: SerializedAction, selectedTriggers: TriggerId[]) { - await run(async () => { - await actionManager.createEvent(action, selectedTriggers); - toastService.addSuccess({ - title: toastDrilldownCreated.title(action.name), - text: toastDrilldownCreated.text, - }); - }); - } - - async function editDrilldown( - drilldownId: string, - action: SerializedAction, - selectedTriggers: TriggerId[] - ) { - await run(async () => { - await actionManager.updateEvent(drilldownId, action, selectedTriggers); - toastService.addSuccess({ - title: toastDrilldownEdited.title(action.name), - text: toastDrilldownEdited.text, - }); - }); - } - - async function deleteDrilldown(drilldownIds: string | string[]) { - await run(async () => { - drilldownIds = Array.isArray(drilldownIds) ? drilldownIds : [drilldownIds]; - await actionManager.deleteEvents(drilldownIds); - toastService.addSuccess( - drilldownIds.length === 1 - ? { - title: toastDrilldownDeleted.title, - text: toastDrilldownDeleted.text, - } - : { - title: toastDrilldownsDeleted.title(drilldownIds.length), - text: toastDrilldownsDeleted.text, - } - ); - }); - } - - return { drilldowns, isLoading, createDrilldown, editDrilldown, deleteDrilldown }; -} diff --git a/x-pack/plugins/ui_actions_enhanced/public/drilldowns/components/connected_flyout_manage_drilldowns/i18n.ts b/x-pack/plugins/ui_actions_enhanced/public/drilldowns/components/connected_flyout_manage_drilldowns/i18n.ts index 4b2be5db0c558..b684189a60fee 100644 --- a/x-pack/plugins/ui_actions_enhanced/public/drilldowns/components/connected_flyout_manage_drilldowns/i18n.ts +++ b/x-pack/plugins/ui_actions_enhanced/public/drilldowns/components/connected_flyout_manage_drilldowns/i18n.ts @@ -6,87 +6,6 @@ import { i18n } from '@kbn/i18n'; -export const toastDrilldownCreated = { - title: (drilldownName: string) => - i18n.translate( - 'xpack.uiActionsEnhanced.drilldowns.components.flyoutDrilldownWizard.toast.drilldownCreatedTitle', - { - defaultMessage: 'Drilldown "{drilldownName}" created', - values: { - drilldownName, - }, - } - ), - text: i18n.translate( - 'xpack.uiActionsEnhanced.drilldowns.components.flyoutDrilldownWizard.toast.drilldownCreatedText', - { - // TODO: remove `Save your dashboard before testing.` part - // when drilldowns are used not only in dashboard - // or after https://github.com/elastic/kibana/issues/65179 implemented - defaultMessage: 'Save your dashboard before testing.', - } - ), -}; - -export const toastDrilldownEdited = { - title: (drilldownName: string) => - i18n.translate( - 'xpack.uiActionsEnhanced.drilldowns.components.flyoutDrilldownWizard.toast.drilldownEditedTitle', - { - defaultMessage: 'Drilldown "{drilldownName}" updated', - values: { - drilldownName, - }, - } - ), - text: i18n.translate( - 'xpack.uiActionsEnhanced.drilldowns.components.flyoutDrilldownWizard.toast.drilldownEditedText', - { - defaultMessage: 'Save your dashboard before testing.', - } - ), -}; - -export const toastDrilldownDeleted = { - title: i18n.translate( - 'xpack.uiActionsEnhanced.drilldowns.components.flyoutDrilldownWizard.toast.drilldownDeletedTitle', - { - defaultMessage: 'Drilldown deleted', - } - ), - text: i18n.translate( - 'xpack.uiActionsEnhanced.drilldowns.components.flyoutDrilldownWizard.toast.drilldownDeletedText', - { - defaultMessage: 'Save your dashboard before testing.', - } - ), -}; - -export const toastDrilldownsDeleted = { - title: (n: number) => - i18n.translate( - 'xpack.uiActionsEnhanced.drilldowns.components.flyoutDrilldownWizard.toast.drilldownsDeletedTitle', - { - defaultMessage: '{n} drilldowns deleted', - values: { n }, - } - ), - text: i18n.translate( - 'xpack.uiActionsEnhanced.drilldowns.components.flyoutDrilldownWizard.toast.drilldownsDeletedText', - { - defaultMessage: 'Save your dashboard before testing.', - } - ), -}; - -export const toastDrilldownsCRUDError = i18n.translate( - 'xpack.uiActionsEnhanced.drilldowns.components.flyoutDrilldownWizard.toast.drilldownsCRUDErrorTitle', - { - defaultMessage: 'Error saving drilldown', - description: 'Title for generic error toast when persisting drilldown updates failed', - } -); - export const insufficientLicenseLevel = i18n.translate( 'xpack.uiActionsEnhanced.drilldowns.components.flyoutDrilldownWizard.insufficientLicenseLevelError', { diff --git a/x-pack/plugins/ui_actions_enhanced/public/drilldowns/components/flyout_drilldown_wizard/flyout_drilldown_wizard.tsx b/x-pack/plugins/ui_actions_enhanced/public/drilldowns/components/flyout_drilldown_wizard/flyout_drilldown_wizard.tsx index c67a6bbdd30b6..d54bfe0af3b8b 100644 --- a/x-pack/plugins/ui_actions_enhanced/public/drilldowns/components/flyout_drilldown_wizard/flyout_drilldown_wizard.tsx +++ b/x-pack/plugins/ui_actions_enhanced/public/drilldowns/components/flyout_drilldown_wizard/flyout_drilldown_wizard.tsx @@ -230,7 +230,7 @@ export function FlyoutDrilldownWizard< actionFactories={drilldownActionFactories} actionFactoryContext={actionFactoryContext} onSelectedTriggersChange={setSelectedTriggers} - supportedTriggers={supportedTriggers} + triggers={supportedTriggers} getTriggerInfo={getTrigger} triggerPickerDocsLink={triggerPickerDocsLink} /> diff --git a/x-pack/plugins/ui_actions_enhanced/public/drilldowns/components/form_drilldown_wizard/form_drilldown_wizard.stories.tsx b/x-pack/plugins/ui_actions_enhanced/public/drilldowns/components/form_drilldown_wizard/form_drilldown_wizard.stories.tsx index 9ab893f23b398..386ec0fb0e62b 100644 --- a/x-pack/plugins/ui_actions_enhanced/public/drilldowns/components/form_drilldown_wizard/form_drilldown_wizard.stories.tsx +++ b/x-pack/plugins/ui_actions_enhanced/public/drilldowns/components/form_drilldown_wizard/form_drilldown_wizard.stories.tsx @@ -10,11 +10,7 @@ import { FormDrilldownWizard } from './index'; import { Trigger, TriggerId } from '../../../../../../../src/plugins/ui_actions/public'; const otherProps = { - supportedTriggers: [ - 'VALUE_CLICK_TRIGGER', - 'SELECT_RANGE_TRIGGER', - 'FILTER_TRIGGER', - ] as TriggerId[], + triggers: ['VALUE_CLICK_TRIGGER', 'SELECT_RANGE_TRIGGER', 'FILTER_TRIGGER'] as TriggerId[], getTriggerInfo: (id: TriggerId) => ({ id } as Trigger), onSelectedTriggersChange: () => {}, actionFactoryContext: { triggers: [] as TriggerId[] }, diff --git a/x-pack/plugins/ui_actions_enhanced/public/drilldowns/components/form_drilldown_wizard/form_drilldown_wizard.test.tsx b/x-pack/plugins/ui_actions_enhanced/public/drilldowns/components/form_drilldown_wizard/form_drilldown_wizard.test.tsx index 614679ed02a41..35a897913b537 100644 --- a/x-pack/plugins/ui_actions_enhanced/public/drilldowns/components/form_drilldown_wizard/form_drilldown_wizard.test.tsx +++ b/x-pack/plugins/ui_actions_enhanced/public/drilldowns/components/form_drilldown_wizard/form_drilldown_wizard.test.tsx @@ -13,11 +13,7 @@ import { Trigger, TriggerId } from '../../../../../../../src/plugins/ui_actions/ const otherProps = { actionFactoryContext: { triggers: [] as TriggerId[] }, - supportedTriggers: [ - 'VALUE_CLICK_TRIGGER', - 'SELECT_RANGE_TRIGGER', - 'FILTER_TRIGGER', - ] as TriggerId[], + triggers: ['VALUE_CLICK_TRIGGER', 'SELECT_RANGE_TRIGGER', 'FILTER_TRIGGER'] as TriggerId[], getTriggerInfo: (id: TriggerId) => ({ id } as Trigger), onSelectedTriggersChange: () => {}, }; diff --git a/x-pack/plugins/ui_actions_enhanced/public/drilldowns/components/form_drilldown_wizard/form_drilldown_wizard.tsx b/x-pack/plugins/ui_actions_enhanced/public/drilldowns/components/form_drilldown_wizard/form_drilldown_wizard.tsx index 45655c2634fe7..5f5b577706cf9 100644 --- a/x-pack/plugins/ui_actions_enhanced/public/drilldowns/components/form_drilldown_wizard/form_drilldown_wizard.tsx +++ b/x-pack/plugins/ui_actions_enhanced/public/drilldowns/components/form_drilldown_wizard/form_drilldown_wizard.tsx @@ -6,7 +6,8 @@ import React from 'react'; import { EuiFieldText, EuiForm, EuiFormRow, EuiLink, EuiSpacer, EuiText } from '@elastic/eui'; -import { FormattedMessage } from '@kbn/i18n/react'; +import { EuiCallOut } from '@elastic/eui'; +import { EuiCode } from '@elastic/eui'; import { txtDrilldownAction, txtNameOfDrilldown, txtUntitledDrilldown } from './i18n'; import { ActionFactory, @@ -15,6 +16,7 @@ import { } from '../../../dynamic_actions'; import { ActionWizard } from '../../../components/action_wizard'; import { Trigger, TriggerId } from '../../../../../../../src/plugins/ui_actions/public'; +import { txtGetMoreActions } from './i18n'; const GET_MORE_ACTIONS_LINK = 'https://www.elastic.co/subscriptions'; @@ -46,7 +48,7 @@ export interface FormDrilldownWizardProps< /** * List of possible triggers in current context */ - supportedTriggers: TriggerId[]; + triggers: TriggerId[]; triggerPickerDocsLink?: string; } @@ -62,9 +64,20 @@ export const FormDrilldownWizard: React.FC = ({ actionFactoryContext, onSelectedTriggersChange, getTriggerInfo, - supportedTriggers, + triggers, triggerPickerDocsLink, }) => { + if (!triggers || !triggers.length) { + // Below callout is not translated, because this message is only for developers. + return ( + +

+ No triggers provided in trigger prop. +

+
+ ); + } + const nameFragment = ( = ({ external data-test-subj={'getMoreActionsLink'} > - + {txtGetMoreActions} ); @@ -114,7 +124,7 @@ export const FormDrilldownWizard: React.FC = ({ context={actionFactoryContext} onSelectedTriggersChange={onSelectedTriggersChange} getTriggerInfo={getTriggerInfo} - supportedTriggers={supportedTriggers} + triggers={triggers} triggerPickerDocsLink={triggerPickerDocsLink} /> diff --git a/x-pack/plugins/ui_actions_enhanced/public/drilldowns/components/form_drilldown_wizard/i18n.ts b/x-pack/plugins/ui_actions_enhanced/public/drilldowns/components/form_drilldown_wizard/i18n.ts index 9636b6e8a74e7..bf0a012f559f8 100644 --- a/x-pack/plugins/ui_actions_enhanced/public/drilldowns/components/form_drilldown_wizard/i18n.ts +++ b/x-pack/plugins/ui_actions_enhanced/public/drilldowns/components/form_drilldown_wizard/i18n.ts @@ -26,3 +26,10 @@ export const txtDrilldownAction = i18n.translate( defaultMessage: 'Action', } ); + +export const txtGetMoreActions = i18n.translate( + 'xpack.uiActionsEnhanced.drilldowns.components.FormDrilldownWizard.getMoreActionsLinkLabel', + { + defaultMessage: 'Get more actions', + } +); diff --git a/x-pack/plugins/ui_actions_enhanced/public/drilldowns/hooks/i18n.ts b/x-pack/plugins/ui_actions_enhanced/public/drilldowns/hooks/i18n.ts new file mode 100644 index 0000000000000..e75ee2634aa43 --- /dev/null +++ b/x-pack/plugins/ui_actions_enhanced/public/drilldowns/hooks/i18n.ts @@ -0,0 +1,88 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { i18n } from '@kbn/i18n'; + +export const toastDrilldownCreated = { + title: (drilldownName: string) => + i18n.translate( + 'xpack.uiActionsEnhanced.drilldowns.components.flyoutDrilldownWizard.toast.drilldownCreatedTitle', + { + defaultMessage: 'Drilldown "{drilldownName}" created', + values: { + drilldownName, + }, + } + ), + text: i18n.translate( + 'xpack.uiActionsEnhanced.drilldowns.components.flyoutDrilldownWizard.toast.drilldownCreatedText', + { + // TODO: remove `Save your dashboard before testing.` part + // when drilldowns are used not only in dashboard + // or after https://github.com/elastic/kibana/issues/65179 implemented + defaultMessage: 'Save your dashboard before testing.', + } + ), +}; + +export const toastDrilldownEdited = { + title: (drilldownName: string) => + i18n.translate( + 'xpack.uiActionsEnhanced.drilldowns.components.flyoutDrilldownWizard.toast.drilldownEditedTitle', + { + defaultMessage: 'Drilldown "{drilldownName}" updated', + values: { + drilldownName, + }, + } + ), + text: i18n.translate( + 'xpack.uiActionsEnhanced.drilldowns.components.flyoutDrilldownWizard.toast.drilldownEditedText', + { + defaultMessage: 'Save your dashboard before testing.', + } + ), +}; + +export const toastDrilldownDeleted = { + title: i18n.translate( + 'xpack.uiActionsEnhanced.drilldowns.components.flyoutDrilldownWizard.toast.drilldownDeletedTitle', + { + defaultMessage: 'Drilldown deleted', + } + ), + text: i18n.translate( + 'xpack.uiActionsEnhanced.drilldowns.components.flyoutDrilldownWizard.toast.drilldownDeletedText', + { + defaultMessage: 'Save your dashboard before testing.', + } + ), +}; + +export const toastDrilldownsDeleted = { + title: (n: number) => + i18n.translate( + 'xpack.uiActionsEnhanced.drilldowns.components.flyoutDrilldownWizard.toast.drilldownsDeletedTitle', + { + defaultMessage: '{n} drilldowns deleted', + values: { n }, + } + ), + text: i18n.translate( + 'xpack.uiActionsEnhanced.drilldowns.components.flyoutDrilldownWizard.toast.drilldownsDeletedText', + { + defaultMessage: 'Save your dashboard before testing.', + } + ), +}; + +export const toastDrilldownsCRUDError = i18n.translate( + 'xpack.uiActionsEnhanced.drilldowns.components.flyoutDrilldownWizard.toast.drilldownsCRUDErrorTitle', + { + defaultMessage: 'Error saving drilldown', + description: 'Title for generic error toast when persisting drilldown updates failed', + } +); diff --git a/x-pack/plugins/ui_actions_enhanced/public/drilldowns/hooks/use_compatible_action_factories_for_current_context.ts b/x-pack/plugins/ui_actions_enhanced/public/drilldowns/hooks/use_compatible_action_factories_for_current_context.ts new file mode 100644 index 0000000000000..d99889045d469 --- /dev/null +++ b/x-pack/plugins/ui_actions_enhanced/public/drilldowns/hooks/use_compatible_action_factories_for_current_context.ts @@ -0,0 +1,35 @@ +/* + * 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 { useEffect, useState } from 'react'; +import { ActionFactory, BaseActionFactoryContext } from '../../dynamic_actions'; + +export function useCompatibleActionFactoriesForCurrentContext< + Context extends BaseActionFactoryContext = BaseActionFactoryContext +>(actionFactories: ActionFactory[], context: Context) { + const [compatibleActionFactories, setCompatibleActionFactories] = useState(); + useEffect(() => { + let canceled = false; + async function updateCompatibleFactoriesForContext() { + const compatibility = await Promise.all( + actionFactories.map((factory) => factory.isCompatible(context)) + ); + if (canceled) return; + + const compatibleFactories = actionFactories.filter((_, i) => compatibility[i]); + const triggerSupportedFactories = compatibleFactories.filter((factory) => + factory.supportedTriggers().some((trigger) => context.triggers.includes(trigger)) + ); + setCompatibleActionFactories(triggerSupportedFactories); + } + updateCompatibleFactoriesForContext(); + return () => { + canceled = true; + }; + }, [context, actionFactories, context.triggers]); + + return compatibleActionFactories; +} diff --git a/x-pack/plugins/ui_actions_enhanced/public/drilldowns/hooks/use_drilldown_state_manager.tsx b/x-pack/plugins/ui_actions_enhanced/public/drilldowns/hooks/use_drilldown_state_manager.tsx new file mode 100644 index 0000000000000..b578e36ba0606 --- /dev/null +++ b/x-pack/plugins/ui_actions_enhanced/public/drilldowns/hooks/use_drilldown_state_manager.tsx @@ -0,0 +1,86 @@ +/* + * 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 { useState } from 'react'; +import { ToastsStart } from 'kibana/public'; +import useMountedState from 'react-use/lib/useMountedState'; +import { TriggerId } from '../../../../../../src/plugins/ui_actions/public'; +import { useContainerState } from '../../../../../../src/plugins/kibana_utils/public'; +import { + toastDrilldownCreated, + toastDrilldownDeleted, + toastDrilldownEdited, + toastDrilldownsCRUDError, + toastDrilldownsDeleted, +} from './i18n'; +import { DynamicActionManager, SerializedAction } from '../../dynamic_actions'; + +export function useDrilldownsStateManager( + actionManager: DynamicActionManager, + toastService: ToastsStart +) { + const { events: drilldowns } = useContainerState(actionManager.state); + const [isLoading, setIsLoading] = useState(false); + const isMounted = useMountedState(); + + async function run(op: () => Promise) { + setIsLoading(true); + try { + await op(); + } catch (e) { + toastService.addError(e, { + title: toastDrilldownsCRUDError, + }); + if (!isMounted) return; + setIsLoading(false); + return; + } + } + + async function createDrilldown(action: SerializedAction, selectedTriggers: TriggerId[]) { + await run(async () => { + await actionManager.createEvent(action, selectedTriggers); + toastService.addSuccess({ + title: toastDrilldownCreated.title(action.name), + text: toastDrilldownCreated.text, + }); + }); + } + + async function editDrilldown( + drilldownId: string, + action: SerializedAction, + selectedTriggers: TriggerId[] + ) { + await run(async () => { + await actionManager.updateEvent(drilldownId, action, selectedTriggers); + toastService.addSuccess({ + title: toastDrilldownEdited.title(action.name), + text: toastDrilldownEdited.text, + }); + }); + } + + async function deleteDrilldown(drilldownIds: string | string[]) { + await run(async () => { + drilldownIds = Array.isArray(drilldownIds) ? drilldownIds : [drilldownIds]; + await actionManager.deleteEvents(drilldownIds); + toastService.addSuccess( + drilldownIds.length === 1 + ? { + title: toastDrilldownDeleted.title, + text: toastDrilldownDeleted.text, + } + : { + title: toastDrilldownsDeleted.title(drilldownIds.length), + text: toastDrilldownsDeleted.text, + } + ); + }); + } + + return { drilldowns, isLoading, createDrilldown, editDrilldown, deleteDrilldown }; +} diff --git a/x-pack/plugins/ui_actions_enhanced/public/drilldowns/hooks/use_welcome_message.ts b/x-pack/plugins/ui_actions_enhanced/public/drilldowns/hooks/use_welcome_message.ts new file mode 100644 index 0000000000000..89c9445b09a4b --- /dev/null +++ b/x-pack/plugins/ui_actions_enhanced/public/drilldowns/hooks/use_welcome_message.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; + * you may not use this file except in compliance with the Elastic License. + */ + +import { useState } from 'react'; +import { IStorageWrapper } from '../../../../../../src/plugins/kibana_utils/public'; + +export function useWelcomeMessage(storage: IStorageWrapper): [boolean, () => void] { + const key = `drilldowns:hidWelcomeMessage`; + const [hideWelcomeMessage, setHideWelcomeMessage] = useState(storage.get(key) ?? false); + + return [ + !hideWelcomeMessage, + () => { + if (hideWelcomeMessage) return; + setHideWelcomeMessage(true); + storage.set(key, true); + }, + ]; +} From 18a67b68b1c7a5e1b2cfba0fb8b3c3d6f7a41b24 Mon Sep 17 00:00:00 2001 From: Alison Goryachev Date: Mon, 5 Oct 2020 10:52:08 -0400 Subject: [PATCH 11/49] [Ingest pipelines] Clean up component integration tests (#78838) --- .../helpers/pipeline_form.helpers.ts | 32 ++++---- .../helpers/pipelines_list.helpers.ts | 30 ++++--- .../helpers/setup_environment.tsx | 15 ++-- .../ingest_pipelines_clone.test.tsx | 19 ++--- .../ingest_pipelines_create.test.tsx | 82 +++++++++---------- .../ingest_pipelines_edit.test.tsx | 16 ++-- .../ingest_pipelines_list.test.ts | 62 ++++++-------- .../pipeline_processors_editor.helpers.tsx | 36 +------- .../__jest__/processors_editor.tsx | 43 ++++++++++ .../__jest__/test_pipeline.helpers.tsx | 45 +--------- 10 files changed, 170 insertions(+), 210 deletions(-) create mode 100644 x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/__jest__/processors_editor.tsx diff --git a/x-pack/plugins/ingest_pipelines/__jest__/client_integration/helpers/pipeline_form.helpers.ts b/x-pack/plugins/ingest_pipelines/__jest__/client_integration/helpers/pipeline_form.helpers.ts index 752ffef51b43b..dd354b4927836 100644 --- a/x-pack/plugins/ingest_pipelines/__jest__/client_integration/helpers/pipeline_form.helpers.ts +++ b/x-pack/plugins/ingest_pipelines/__jest__/client_integration/helpers/pipeline_form.helpers.ts @@ -3,38 +3,42 @@ * or more contributor license agreements. Licensed under the Elastic License; * you may not use this file except in compliance with the Elastic License. */ +import { act } from 'react-dom/test-utils'; + import { TestBed } from '../../../../../test_utils'; export const getFormActions = (testBed: TestBed) => { - const { find, form } = testBed; + const { find, form, component } = testBed; // User actions - const clickSubmitButton = () => { - find('submitButton').simulate('click'); - }; + const clickSubmitButton = async () => { + await act(async () => { + find('submitButton').simulate('click'); + }); - const clickAddDocumentsButton = () => { - find('addDocumentsButton').simulate('click'); + component.update(); }; - const clickShowRequestLink = () => { - find('showRequestLink').simulate('click'); + const clickShowRequestLink = async () => { + await act(async () => { + find('showRequestLink').simulate('click'); + }); + + component.update(); }; const toggleVersionSwitch = () => { - form.toggleEuiSwitch('versionToggle'); - }; + act(() => { + form.toggleEuiSwitch('versionToggle'); + }); - const toggleOnFailureSwitch = () => { - form.toggleEuiSwitch('onFailureToggle'); + component.update(); }; return { clickSubmitButton, clickShowRequestLink, toggleVersionSwitch, - toggleOnFailureSwitch, - clickAddDocumentsButton, }; }; diff --git a/x-pack/plugins/ingest_pipelines/__jest__/client_integration/helpers/pipelines_list.helpers.ts b/x-pack/plugins/ingest_pipelines/__jest__/client_integration/helpers/pipelines_list.helpers.ts index 43ca849e61aee..6c446e8254f6b 100644 --- a/x-pack/plugins/ingest_pipelines/__jest__/client_integration/helpers/pipelines_list.helpers.ts +++ b/x-pack/plugins/ingest_pipelines/__jest__/client_integration/helpers/pipelines_list.helpers.ts @@ -11,7 +11,6 @@ import { TestBed, TestBedConfig, findTestSubject, - nextTick, } from '../../../../../test_utils'; import { PipelinesList } from '../../../public/application/sections/pipelines_list'; import { WithAppDependencies } from './setup_environment'; @@ -32,13 +31,17 @@ export type PipelineListTestBed = TestBed & { }; const createActions = (testBed: TestBed) => { - const { find } = testBed; - /** * User Actions */ - const clickReloadButton = () => { - find('reloadButton').simulate('click'); + const clickReloadButton = async () => { + const { component, find } = testBed; + + await act(async () => { + find('reloadButton').simulate('click'); + }); + + component.update(); }; const clickPipelineAt = async (index: number) => { @@ -49,16 +52,19 @@ const createActions = (testBed: TestBed) => { await act(async () => { const { href } = pipelineLink.props(); router.navigateTo(href!); - await nextTick(); - component.update(); }); + component.update(); }; const clickActionMenu = (pipelineName: string) => { const { component } = testBed; - // When a table has > 2 actions, EUI displays an overflow menu with an id "-actions" - component.find(`div[id="${pipelineName}-actions"] button`).simulate('click'); + act(() => { + // When a table has > 2 actions, EUI displays an overflow menu with an id "-actions" + component.find(`div[id="${pipelineName}-actions"] button`).simulate('click'); + }); + + component.update(); }; const clickPipelineAction = (pipelineName: string, action: 'edit' | 'clone' | 'delete') => { @@ -67,7 +73,11 @@ const createActions = (testBed: TestBed) => { clickActionMenu(pipelineName); - component.find('.euiContextMenuItem').at(actions.indexOf(action)).simulate('click'); + act(() => { + component.find('.euiContextMenuItem').at(actions.indexOf(action)).simulate('click'); + }); + + component.update(); }; return { diff --git a/x-pack/plugins/ingest_pipelines/__jest__/client_integration/helpers/setup_environment.tsx b/x-pack/plugins/ingest_pipelines/__jest__/client_integration/helpers/setup_environment.tsx index d9a0ac4115389..eff2572aea38d 100644 --- a/x-pack/plugins/ingest_pipelines/__jest__/client_integration/helpers/setup_environment.tsx +++ b/x-pack/plugins/ingest_pipelines/__jest__/client_integration/helpers/setup_environment.tsx @@ -4,20 +4,20 @@ * you may not use this file except in compliance with the Elastic License. */ import React from 'react'; +import axios from 'axios'; +import axiosXhrAdapter from 'axios/lib/adapters/xhr'; import { LocationDescriptorObject } from 'history'; +import { HttpSetup } from 'kibana/public'; + import { KibanaContextProvider } from '../../../../../../src/plugins/kibana_react/public'; import { notificationServiceMock, - fatalErrorsServiceMock, docLinksServiceMock, - injectedMetadataServiceMock, scopedHistoryMock, } from '../../../../../../src/core/public/mocks'; import { usageCollectionPluginMock } from '../../../../../../src/plugins/usage_collection/public/mocks'; -import { HttpService } from '../../../../../../src/core/public/http'; - import { breadcrumbService, documentationService, @@ -27,10 +27,7 @@ import { import { init as initHttpRequests } from './http_requests'; -const httpServiceSetupMock = new HttpService().setup({ - injectedMetadata: injectedMetadataServiceMock.createSetupContract(), - fatalErrors: fatalErrorsServiceMock.createSetupContract(), -}); +const mockHttpClient = axios.create({ adapter: axiosXhrAdapter }); const history = scopedHistoryMock.create(); history.createHref.mockImplementation((location: LocationDescriptorObject) => { @@ -53,7 +50,7 @@ const appServices = { export const setupEnvironment = () => { uiMetricService.setup(usageCollectionPluginMock.createSetupContract()); - apiService.setup(httpServiceSetupMock, uiMetricService); + apiService.setup((mockHttpClient as unknown) as HttpSetup, uiMetricService); documentationService.setup(docLinksServiceMock.createStartContract()); breadcrumbService.setup(() => {}); diff --git a/x-pack/plugins/ingest_pipelines/__jest__/client_integration/ingest_pipelines_clone.test.tsx b/x-pack/plugins/ingest_pipelines/__jest__/client_integration/ingest_pipelines_clone.test.tsx index f8e0030441ba0..6e0889ac55d4d 100644 --- a/x-pack/plugins/ingest_pipelines/__jest__/client_integration/ingest_pipelines_clone.test.tsx +++ b/x-pack/plugins/ingest_pipelines/__jest__/client_integration/ingest_pipelines_clone.test.tsx @@ -28,8 +28,7 @@ jest.mock('@elastic/eui', () => { }; }); -// FLAKY: https://github.com/elastic/kibana/issues/66856 -describe.skip('', () => { +describe('', () => { let testBed: PipelinesCloneTestBed; const { server, httpRequestsMockHelpers } = setupEnvironment(); @@ -38,13 +37,14 @@ describe.skip('', () => { server.restore(); }); - beforeEach(async () => { - httpRequestsMockHelpers.setLoadPipelineResponse(PIPELINE_TO_CLONE); + httpRequestsMockHelpers.setLoadPipelineResponse(PIPELINE_TO_CLONE); + beforeEach(async () => { await act(async () => { testBed = await setup(); - await testBed.waitFor('pipelineForm'); }); + + testBed.component.update(); }); test('should render the correct page header', () => { @@ -61,12 +61,9 @@ describe.skip('', () => { describe('form submission', () => { it('should send the correct payload', async () => { - const { actions, waitFor } = testBed; + const { actions } = testBed; - await act(async () => { - actions.clickSubmitButton(); - await waitFor('pipelineForm', 0); - }); + await actions.clickSubmitButton(); const latestRequest = server.requests[server.requests.length - 1]; @@ -75,7 +72,7 @@ describe.skip('', () => { name: `${PIPELINE_TO_CLONE.name}-copy`, }; - expect(JSON.parse(latestRequest.requestBody)).toEqual(expected); + expect(JSON.parse(JSON.parse(latestRequest.requestBody).body)).toEqual(expected); }); }); }); diff --git a/x-pack/plugins/ingest_pipelines/__jest__/client_integration/ingest_pipelines_create.test.tsx b/x-pack/plugins/ingest_pipelines/__jest__/client_integration/ingest_pipelines_create.test.tsx index 18ca71f2bb73a..976627b1fa8a8 100644 --- a/x-pack/plugins/ingest_pipelines/__jest__/client_integration/ingest_pipelines_create.test.tsx +++ b/x-pack/plugins/ingest_pipelines/__jest__/client_integration/ingest_pipelines_create.test.tsx @@ -6,7 +6,7 @@ import React from 'react'; import { act } from 'react-dom/test-utils'; -import { setupEnvironment, pageHelpers, nextTick } from './helpers'; +import { setupEnvironment, pageHelpers } from './helpers'; import { PipelinesCreateTestBed } from './helpers/pipelines_create.helpers'; import { nestedProcessorsErrorFixture } from './fixtures'; @@ -43,8 +43,9 @@ describe('', () => { beforeEach(async () => { await act(async () => { testBed = await setup(); - await testBed.waitFor('pipelineForm'); }); + + testBed.component.update(); }); test('should render the correct page header', () => { @@ -60,28 +61,20 @@ describe('', () => { }); test('should toggle the version field', async () => { - const { actions, component, exists } = testBed; + const { actions, exists } = testBed; // Version field should be hidden by default expect(exists('versionField')).toBe(false); - await act(async () => { - actions.toggleVersionSwitch(); - await nextTick(); - component.update(); - }); + actions.toggleVersionSwitch(); expect(exists('versionField')).toBe(true); }); test('should show the request flyout', async () => { - const { actions, component, find, exists } = testBed; + const { actions, find, exists } = testBed; - await act(async () => { - actions.clickShowRequestLink(); - await nextTick(); - component.update(); - }); + await actions.clickShowRequestLink(); // Verify request flyout opens expect(exists('requestFlyout')).toBe(true); @@ -92,23 +85,18 @@ describe('', () => { test('should prevent form submission if required fields are missing', async () => { const { form, actions, component, find } = testBed; - await act(async () => { - actions.clickSubmitButton(); - await nextTick(); - component.update(); - }); + await actions.clickSubmitButton(); expect(form.getErrorsMessages()).toEqual(['Name is required.']); expect(find('submitButton').props().disabled).toEqual(true); - // Add required fields and verify button is enabled again - form.setInputValue('nameField.input', 'my_pipeline'); - await act(async () => { - await nextTick(); - component.update(); + // Add required fields and verify button is enabled again + form.setInputValue('nameField.input', 'my_pipeline'); }); + component.update(); + expect(find('submitButton').props().disabled).toEqual(false); }); }); @@ -117,23 +105,27 @@ describe('', () => { beforeEach(async () => { await act(async () => { testBed = await setup(); + }); - const { waitFor, form } = testBed; + testBed.component.update(); + + await act(async () => { + testBed.form.setInputValue('nameField.input', 'my_pipeline'); + }); - await waitFor('pipelineForm'); + testBed.component.update(); - form.setInputValue('nameField.input', 'my_pipeline'); - form.setInputValue('descriptionField.input', 'pipeline description'); + await act(async () => { + testBed.form.setInputValue('descriptionField.input', 'pipeline description'); }); + + testBed.component.update(); }); test('should send the correct payload', async () => { - const { actions, waitFor } = testBed; + const { actions } = testBed; - await act(async () => { - actions.clickSubmitButton(); - await waitFor('pipelineForm', 0); - }); + await actions.clickSubmitButton(); const latestRequest = server.requests[server.requests.length - 1]; @@ -143,11 +135,11 @@ describe('', () => { processors: [], }; - expect(JSON.parse(latestRequest.requestBody)).toEqual(expected); + expect(JSON.parse(JSON.parse(latestRequest.requestBody).body)).toEqual(expected); }); test('should surface API errors from the request', async () => { - const { actions, find, exists, waitFor } = testBed; + const { actions, find, exists } = testBed; const error = { status: 409, @@ -157,29 +149,29 @@ describe('', () => { httpRequestsMockHelpers.setCreatePipelineResponse(undefined, { body: error }); - await act(async () => { - actions.clickSubmitButton(); - await waitFor('savePipelineError'); - }); + await actions.clickSubmitButton(); expect(exists('savePipelineError')).toBe(true); expect(find('savePipelineError').text()).toContain(error.message); }); test('displays nested pipeline errors as a flat list', async () => { - const { actions, find, exists, waitFor } = testBed; + const { actions, find, exists, component } = testBed; httpRequestsMockHelpers.setCreatePipelineResponse(undefined, { body: nestedProcessorsErrorFixture, }); - await act(async () => { - actions.clickSubmitButton(); - await waitFor('savePipelineError'); - }); + await actions.clickSubmitButton(); expect(exists('savePipelineError')).toBe(true); expect(exists('savePipelineError.showErrorsButton')).toBe(true); - find('savePipelineError.showErrorsButton').simulate('click'); + + await act(async () => { + find('savePipelineError.showErrorsButton').simulate('click'); + }); + + component.update(); + expect(exists('savePipelineError.hideErrorsButton')).toBe(true); expect(exists('savePipelineError.showErrorsButton')).toBe(false); expect(find('savePipelineError').find('li').length).toBe(8); diff --git a/x-pack/plugins/ingest_pipelines/__jest__/client_integration/ingest_pipelines_edit.test.tsx b/x-pack/plugins/ingest_pipelines/__jest__/client_integration/ingest_pipelines_edit.test.tsx index 6c89216e34733..3fe7f5ec42710 100644 --- a/x-pack/plugins/ingest_pipelines/__jest__/client_integration/ingest_pipelines_edit.test.tsx +++ b/x-pack/plugins/ingest_pipelines/__jest__/client_integration/ingest_pipelines_edit.test.tsx @@ -37,13 +37,14 @@ describe('', () => { server.restore(); }); - beforeEach(async () => { - httpRequestsMockHelpers.setLoadPipelineResponse(PIPELINE_TO_EDIT); + httpRequestsMockHelpers.setLoadPipelineResponse(PIPELINE_TO_EDIT); + beforeEach(async () => { await act(async () => { testBed = await setup(); - await testBed.waitFor('pipelineForm'); }); + + testBed.component.update(); }); test('should render the correct page header', () => { @@ -68,15 +69,12 @@ describe('', () => { describe('form submission', () => { it('should send the correct payload with changed values', async () => { const UPDATED_DESCRIPTION = 'updated pipeline description'; - const { actions, form, waitFor } = testBed; + const { actions, form } = testBed; // Make change to description field form.setInputValue('descriptionField.input', UPDATED_DESCRIPTION); - await act(async () => { - actions.clickSubmitButton(); - await waitFor('pipelineForm', 0); - }); + await actions.clickSubmitButton(); const latestRequest = server.requests[server.requests.length - 1]; @@ -87,7 +85,7 @@ describe('', () => { description: UPDATED_DESCRIPTION, }; - expect(JSON.parse(latestRequest.requestBody)).toEqual(expected); + expect(JSON.parse(JSON.parse(latestRequest.requestBody).body)).toEqual(expected); }); }); }); diff --git a/x-pack/plugins/ingest_pipelines/__jest__/client_integration/ingest_pipelines_list.test.ts b/x-pack/plugins/ingest_pipelines/__jest__/client_integration/ingest_pipelines_list.test.ts index c0acc39ca35a1..d29d38da80e47 100644 --- a/x-pack/plugins/ingest_pipelines/__jest__/client_integration/ingest_pipelines_list.test.ts +++ b/x-pack/plugins/ingest_pipelines/__jest__/client_integration/ingest_pipelines_list.test.ts @@ -8,7 +8,7 @@ import { act } from 'react-dom/test-utils'; import { API_BASE_PATH } from '../../common/constants'; -import { setupEnvironment, pageHelpers, nextTick } from './helpers'; +import { setupEnvironment, pageHelpers } from './helpers'; import { PipelineListTestBed } from './helpers/pipelines_list.helpers'; const { setup } = pageHelpers.pipelinesList; @@ -22,6 +22,14 @@ describe('', () => { }); describe('With pipelines', () => { + beforeEach(async () => { + await act(async () => { + testBed = await setup(); + }); + + testBed.component.update(); + }); + const pipeline1 = { name: 'test_pipeline1', description: 'test_pipeline1 description', @@ -38,16 +46,6 @@ describe('', () => { httpRequestsMockHelpers.setLoadPipelinesResponse(pipelines); - beforeEach(async () => { - testBed = await setup(); - - await act(async () => { - const { waitFor } = testBed; - - await waitFor('pipelinesTable'); - }); - }); - test('should render the list view', async () => { const { exists, find, table } = testBed; @@ -72,14 +70,10 @@ describe('', () => { }); test('should reload the pipeline data', async () => { - const { component, actions } = testBed; + const { actions } = testBed; const totalRequests = server.requests.length; - await act(async () => { - actions.clickReloadButton(); - await nextTick(100); - component.update(); - }); + await actions.clickReloadButton(); expect(server.requests.length).toBe(totalRequests + 1); expect(server.requests[server.requests.length - 1].url).toBe(API_BASE_PATH); @@ -118,33 +112,27 @@ describe('', () => { await act(async () => { confirmButton!.click(); - await nextTick(); - component.update(); }); - const latestRequest = server.requests[server.requests.length - 1]; + component.update(); + + const deleteRequest = server.requests[server.requests.length - 2]; - expect(latestRequest.method).toBe('DELETE'); - expect(latestRequest.url).toBe(`${API_BASE_PATH}/${pipelineName}`); - expect(latestRequest.status).toEqual(200); + expect(deleteRequest.method).toBe('DELETE'); + expect(deleteRequest.url).toBe(`${API_BASE_PATH}/${pipelineName}`); + expect(deleteRequest.status).toEqual(200); }); }); describe('No pipelines', () => { - beforeEach(async () => { + test('should display an empty prompt', async () => { httpRequestsMockHelpers.setLoadPipelinesResponse([]); - testBed = await setup(); - await act(async () => { - const { waitFor } = testBed; - - await waitFor('emptyList'); + testBed = await setup(); }); - }); - - test('should display an empty prompt', async () => { - const { exists, find } = testBed; + const { exists, component, find } = testBed; + component.update(); expect(exists('sectionLoading')).toBe(false); expect(exists('emptyList')).toBe(true); @@ -162,13 +150,11 @@ describe('', () => { httpRequestsMockHelpers.setLoadPipelinesResponse(undefined, { body: error }); - testBed = await setup(); - await act(async () => { - const { waitFor } = testBed; - - await waitFor('pipelineLoadError'); + testBed = await setup(); }); + + testBed.component.update(); }); test('should render an error message if error fetching pipelines', async () => { diff --git a/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/__jest__/pipeline_processors_editor.helpers.tsx b/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/__jest__/pipeline_processors_editor.helpers.tsx index 10fb73df1ce1c..72c25d6dff72d 100644 --- a/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/__jest__/pipeline_processors_editor.helpers.tsx +++ b/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/__jest__/pipeline_processors_editor.helpers.tsx @@ -6,19 +6,9 @@ import { act } from 'react-dom/test-utils'; import React from 'react'; -import { notificationServiceMock, scopedHistoryMock } from 'src/core/public/mocks'; - -import { LocationDescriptorObject } from 'history'; -import { KibanaContextProvider } from 'src/plugins/kibana_react/public'; import { registerTestBed, TestBed } from '../../../../../../../test_utils'; -import { ProcessorsEditorContextProvider, Props, PipelineProcessorsEditor } from '../'; - -import { - breadcrumbService, - uiMetricService, - documentationService, - apiService, -} from '../../../services'; +import { Props } from '../'; +import { ProcessorsEditorWithDeps } from './processors_editor'; jest.mock('@elastic/eui', () => { const original = jest.requireActual('@elastic/eui'); @@ -67,28 +57,8 @@ jest.mock('react-virtualized', () => { }; }); -const history = scopedHistoryMock.create(); -history.createHref.mockImplementation((location: LocationDescriptorObject) => { - return `${location.pathname}?${location.search}`; -}); - -const appServices = { - breadcrumbs: breadcrumbService, - metric: uiMetricService, - documentation: documentationService, - api: apiService, - notifications: notificationServiceMock.createSetupContract(), - history, -}; - const testBedSetup = registerTestBed( - (props: Props) => ( - - - - - - ), + (props: Props) => , { doMountAsync: false, } diff --git a/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/__jest__/processors_editor.tsx b/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/__jest__/processors_editor.tsx new file mode 100644 index 0000000000000..8fb51ade921a9 --- /dev/null +++ b/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/__jest__/processors_editor.tsx @@ -0,0 +1,43 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ +import React from 'react'; + +import { notificationServiceMock, scopedHistoryMock } from 'src/core/public/mocks'; + +import { LocationDescriptorObject } from 'history'; +import { KibanaContextProvider } from 'src/plugins/kibana_react/public'; +import { ProcessorsEditorContextProvider, Props, PipelineProcessorsEditor } from '../'; + +import { + breadcrumbService, + uiMetricService, + documentationService, + apiService, +} from '../../../services'; + +const history = scopedHistoryMock.create(); +history.createHref.mockImplementation((location: LocationDescriptorObject) => { + return `${location.pathname}?${location.search}`; +}); + +const appServices = { + breadcrumbs: breadcrumbService, + metric: uiMetricService, + documentation: documentationService, + api: apiService, + notifications: notificationServiceMock.createSetupContract(), + history, +}; + +export const ProcessorsEditorWithDeps: React.FunctionComponent = (props) => { + return ( + + + + + + ); +}; diff --git a/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/__jest__/test_pipeline.helpers.tsx b/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/__jest__/test_pipeline.helpers.tsx index 222e0a491e0d2..570d9878f7634 100644 --- a/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/__jest__/test_pipeline.helpers.tsx +++ b/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/__jest__/test_pipeline.helpers.tsx @@ -8,26 +8,15 @@ import React from 'react'; import axios from 'axios'; import axiosXhrAdapter from 'axios/lib/adapters/xhr'; -import { notificationServiceMock, scopedHistoryMock } from 'src/core/public/mocks'; - -import { LocationDescriptorObject } from 'history'; -import { KibanaContextProvider } from 'src/plugins/kibana_react/public'; /* eslint-disable @kbn/eslint/no-restricted-paths */ import { usageCollectionPluginMock } from 'src/plugins/usage_collection/public/mocks'; import { registerTestBed, TestBed } from '../../../../../../../test_utils'; import { stubWebWorker } from '../../../../../../../test_utils/stub_web_worker'; - -import { - breadcrumbService, - uiMetricService, - documentationService, - apiService, -} from '../../../services'; - -import { ProcessorsEditorContextProvider, Props, PipelineProcessorsEditor } from '../'; - +import { uiMetricService, apiService } from '../../../services'; +import { Props } from '../'; import { initHttpRequests } from './http_requests.helpers'; +import { ProcessorsEditorWithDeps } from './processors_editor'; stubWebWorker(); @@ -75,34 +64,8 @@ jest.mock('react-virtualized', () => { }; }); -const history = scopedHistoryMock.create(); -history.createHref.mockImplementation((location: LocationDescriptorObject) => { - return `${location.pathname}?${location.search}`; -}); - -const appServices = { - breadcrumbs: breadcrumbService, - metric: uiMetricService, - documentation: documentationService, - api: apiService, - notifications: notificationServiceMock.createSetupContract(), - history, - uiSettings: {}, - urlGenerators: { - getUrlGenerator: jest.fn().mockReturnValue({ - createUrl: jest.fn(), - }), - }, -}; - const testBedSetup = registerTestBed( - (props: Props) => ( - - - - - - ), + (props: Props) => , { doMountAsync: false, } From f6729dc3f4e7d679c280a02955e134e10e7b0097 Mon Sep 17 00:00:00 2001 From: Jean-Louis Leysens Date: Mon, 5 Oct 2020 17:05:10 +0200 Subject: [PATCH 12/49] [Ingest Pipelines] Processors editor a11y focus states (#79122) * Fix showing of accessibility border - fix use of flex items (removed unnecessary use thereof) - also fixed overflow when tabbing through drop zones (compressed) * refactor isLast to compressed * optimize keyboard focus states in move mode * fix jest test Co-authored-by: Elastic Machine Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- .../inline_text_input.tsx | 18 ++- .../pipeline_processors_editor_item.tsx | 1 + .../components/drop_zone_button.tsx | 25 ++- .../components/private_tree.tsx | 151 +++++++++--------- .../processors_tree/processors_tree.scss | 9 +- .../processors_tree/processors_tree.tsx | 17 +- 6 files changed, 117 insertions(+), 104 deletions(-) diff --git a/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/pipeline_processors_editor_item/inline_text_input.tsx b/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/pipeline_processors_editor_item/inline_text_input.tsx index e91974adca20a..833888e9062df 100644 --- a/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/pipeline_processors_editor_item/inline_text_input.tsx +++ b/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/pipeline_processors_editor_item/inline_text_input.tsx @@ -11,15 +11,23 @@ export interface Props { placeholder: string; ariaLabel: string; onChange: (value: string) => void; - disabled: boolean; + /** + * Whether the containing element of the text input can be focused. + * + * If it cannot be focused, this component cannot switch to showing + * the text input field. + * + * Defaults to false. + */ + disabled?: boolean; text?: string; } export const InlineTextInput: FunctionComponent = ({ - disabled, placeholder, text, ariaLabel, + disabled = false, onChange, }) => { const [isShowingTextInput, setIsShowingTextInput] = useState(false); @@ -71,7 +79,11 @@ export const InlineTextInput: FunctionComponent = ({ />
) : ( -
setIsShowingTextInput(true)}> +
setIsShowingTextInput(true)} + >
{text || {placeholder}} diff --git a/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/pipeline_processors_editor_item/pipeline_processors_editor_item.tsx b/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/pipeline_processors_editor_item/pipeline_processors_editor_item.tsx index bf69f817183ab..aa76f67413306 100644 --- a/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/pipeline_processors_editor_item/pipeline_processors_editor_item.tsx +++ b/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/pipeline_processors_editor_item/pipeline_processors_editor_item.tsx @@ -159,6 +159,7 @@ export const PipelineProcessorsEditorItem: FunctionComponent = memo( color={isDimmed ? 'subdued' : undefined} > { editor.setMode({ diff --git a/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/processors_tree/components/drop_zone_button.tsx b/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/processors_tree/components/drop_zone_button.tsx index 57ecb6f7f1187..cd32e2ec54726 100644 --- a/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/processors_tree/components/drop_zone_button.tsx +++ b/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/processors_tree/components/drop_zone_button.tsx @@ -7,11 +7,15 @@ import { i18n } from '@kbn/i18n'; import React, { FunctionComponent } from 'react'; import classNames from 'classnames'; -import { EuiButtonIcon, EuiToolTip } from '@elastic/eui'; +import { EuiButtonIcon } from '@elastic/eui'; export interface Props { isVisible: boolean; isDisabled: boolean; + /** + * Useful for buttons at the very top or bottom of lists to avoid any overflow. + */ + compressed?: boolean; onClick: (event: React.MouseEvent) => void; 'data-test-subj'?: string; } @@ -29,7 +33,7 @@ const cannotMoveHereLabel = i18n.translate( ); export const DropZoneButton: FunctionComponent = (props) => { - const { onClick, isDisabled, isVisible } = props; + const { onClick, isDisabled, isVisible, compressed } = props; const isUnavailable = isVisible && isDisabled; const containerClasses = classNames({ // eslint-disable-next-line @typescript-eslint/naming-convention @@ -40,14 +44,16 @@ export const DropZoneButton: FunctionComponent = (props) => { const buttonClasses = classNames({ // eslint-disable-next-line @typescript-eslint/naming-convention 'pipelineProcessorsEditor__tree__dropZoneButton--visible': isVisible, + // eslint-disable-next-line @typescript-eslint/naming-convention + 'pipelineProcessorsEditor__tree__dropZoneButton--compressed': compressed, }); - const content = ( + return (
{} : onClick} @@ -55,15 +61,4 @@ export const DropZoneButton: FunctionComponent = (props) => { />
); - - return isUnavailable ? ( - - {content} - - ) : ( - content - ); }; diff --git a/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/processors_tree/components/private_tree.tsx b/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/processors_tree/components/private_tree.tsx index 89407fd4366d8..27e612f196667 100644 --- a/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/processors_tree/components/private_tree.tsx +++ b/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/processors_tree/components/private_tree.tsx @@ -5,7 +5,7 @@ */ import React, { FunctionComponent, MutableRefObject, useEffect } from 'react'; -import { EuiFlexGroup, EuiFlexItem } from '@elastic/eui'; +import { EuiFlexGroup } from '@elastic/eui'; import { AutoSizer, List, WindowScroller } from 'react-virtualized'; import { DropSpecialLocations } from '../../../constants'; @@ -78,50 +78,45 @@ export const PrivateTree: FunctionComponent = ({ return ( <> {idx === 0 ? ( - - { - event.preventDefault(); - onAction({ - type: 'move', - payload: { - destination: selector.concat(DropSpecialLocations.top), - source: movingProcessor!.selector, - }, - }); - }} - isVisible={Boolean(movingProcessor)} - isDisabled={!movingProcessor || isDropZoneAboveDisabled(info, movingProcessor)} - /> - - ) : undefined} - - - - { event.preventDefault(); onAction({ type: 'move', payload: { - destination: selector.concat(String(idx + 1)), + destination: selector.concat(DropSpecialLocations.top), source: movingProcessor!.selector, }, }); }} + isVisible={Boolean(movingProcessor)} + isDisabled={!movingProcessor || isDropZoneAboveDisabled(info, movingProcessor)} /> - + ) : undefined} + + { + event.preventDefault(); + onAction({ + type: 'move', + payload: { + destination: selector.concat(String(idx + 1)), + source: movingProcessor!.selector, + }, + }); + }} + /> ); }; @@ -141,52 +136,50 @@ export const PrivateTree: FunctionComponent = ({ {({ height, registerChild, isScrolling, onChildScroll, scrollTop }: any) => { return ( - - - {({ width }) => { - return ( -
- { - const processor = processors[index]; - return calculateItemHeight({ - processor, - isFirstInArray: index === 0, - }); - }} - rowRenderer={({ index: idx, style }) => { - const processor = processors[idx]; - const above = processors[idx - 1]; - const below = processors[idx + 1]; - const info: ProcessorInfo = { - id: processor.id, - selector: selector.concat(String(idx)), - aboveId: above?.id, - belowId: below?.id, - }; + + {({ width }) => { + return ( +
+ { + const processor = processors[index]; + return calculateItemHeight({ + processor, + isFirstInArray: index === 0, + }); + }} + rowRenderer={({ index: idx, style }) => { + const processor = processors[idx]; + const above = processors[idx - 1]; + const below = processors[idx + 1]; + const info: ProcessorInfo = { + id: processor.id, + selector: selector.concat(String(idx)), + aboveId: above?.id, + belowId: below?.id, + }; - return ( -
- {renderRow({ processor, info, idx })} -
- ); - }} - processors={processors} - /> -
- ); - }} -
- + return ( +
+ {renderRow({ processor, info, idx })} +
+ ); + }} + processors={processors} + /> +
+ ); + }} +
); }}
diff --git a/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/processors_tree/processors_tree.scss b/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/processors_tree/processors_tree.scss index 25e4eb7320bf4..f1e399428cdf2 100644 --- a/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/processors_tree/processors_tree.scss +++ b/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/processors_tree/processors_tree.scss @@ -31,15 +31,14 @@ } } $dropZoneButtonHeight: 60px; - $dropZoneButtonOffsetY: $dropZoneButtonHeight * -0.5; + $dropZoneButtonOffsetY: $dropZoneButtonHeight * 0.5; &__dropZoneButton { position: absolute; padding: 0; height: $dropZoneButtonHeight; - margin-top: $dropZoneButtonOffsetY; + margin-top: -$dropZoneButtonOffsetY; width: 100%; - opacity: 0; text-decoration: none !important; z-index: $dropZoneZIndex; @@ -49,6 +48,10 @@ transform: none !important; } } + + &--compressed { + height: $dropZoneButtonOffsetY; + } } &__addProcessorButton { diff --git a/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/processors_tree/processors_tree.tsx b/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/processors_tree/processors_tree.tsx index ffc0a1459b791..46d237e1467e7 100644 --- a/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/processors_tree/processors_tree.tsx +++ b/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/processors_tree/processors_tree.tsx @@ -98,9 +98,16 @@ export const ProcessorsTree: FunctionComponent = memo((props) => { /> - - - {!processors.length && ( + + {!processors.length && ( + // We want to make this dropzone the max length of its container + = memo((props) => { }); }} /> - )} + + )} + { onAction({ type: 'addProcessor', payload: { target: baseSelector } }); From 14e58fbadb55d71a5aecd5d9e257506eac75aac4 Mon Sep 17 00:00:00 2001 From: Bhavya RM Date: Mon, 5 Oct 2020 11:09:14 -0400 Subject: [PATCH 13/49] A11y tests for user page (#79199) --- .../users/edit_user/edit_user_page.tsx | 2 +- .../users/users_grid/users_grid_page.tsx | 1 + x-pack/test/accessibility/apps/users.ts | 106 ++++++++++++++++++ x-pack/test/accessibility/config.ts | 1 + 4 files changed, 109 insertions(+), 1 deletion(-) create mode 100644 x-pack/test/accessibility/apps/users.ts diff --git a/x-pack/plugins/security/public/management/users/edit_user/edit_user_page.tsx b/x-pack/plugins/security/public/management/users/edit_user/edit_user_page.tsx index 9eb2616cebb18..9a62187cffd33 100644 --- a/x-pack/plugins/security/public/management/users/edit_user/edit_user_page.tsx +++ b/x-pack/plugins/security/public/management/users/edit_user/edit_user_page.tsx @@ -536,7 +536,7 @@ export class EditUserPage extends Component { {isNewUser || showChangePasswordForm ? null : ( - + { toolsRight: this.renderToolsRight(), box: { incremental: true, + 'data-test-subj': 'searchUsers', }, onChange: (query: any) => { this.setState({ diff --git a/x-pack/test/accessibility/apps/users.ts b/x-pack/test/accessibility/apps/users.ts new file mode 100644 index 0000000000000..b3426410962af --- /dev/null +++ b/x-pack/test/accessibility/apps/users.ts @@ -0,0 +1,106 @@ +/* + * 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. + */ + +// a11y tests for spaces, space selection and spacce creation and feature controls + +import { FtrProviderContext } from '../ftr_provider_context'; + +export default function ({ getService, getPageObjects }: FtrProviderContext) { + const PageObjects = getPageObjects(['security', 'settings']); + const a11y = getService('a11y'); + const esArchiver = getService('esArchiver'); + const testSubjects = getService('testSubjects'); + const retry = getService('retry'); + + describe('Kibana users page a11y tests', () => { + before(async () => { + await esArchiver.load('empty_kibana'); + await PageObjects.security.clickElasticsearchUsers(); + }); + + it('a11y test for user page', async () => { + await a11y.testAppSnapshot(); + }); + + it('a11y test for search user bar', async () => { + await testSubjects.click('searchUsers'); + await a11y.testAppSnapshot(); + }); + + it('a11y test for searching a user', async () => { + await testSubjects.setValue('searchUsers', 'test'); + await a11y.testAppSnapshot(); + await testSubjects.setValue('searchUsers', ''); + }); + + it('a11y test for toggle button for show reserved users only', async () => { + await retry.waitFor( + 'show reserved users toggle button is visible', + async () => await testSubjects.exists('showReservedUsersSwitch') + ); + await testSubjects.click('showReservedUsersSwitch'); + await a11y.testAppSnapshot(); + await testSubjects.click('showReservedUsersSwitch'); + }); + + it('a11y test for toggle button for show reserved users only', async () => { + await retry.waitFor( + 'show reserved users toggle button is visible', + async () => await testSubjects.exists('showReservedUsersSwitch') + ); + await testSubjects.click('showReservedUsersSwitch'); + await a11y.testAppSnapshot(); + await testSubjects.click('showReservedUsersSwitch'); + }); + + it('a11y test for create user panel', async () => { + await testSubjects.click('createUserButton'); + await a11y.testAppSnapshot(); + }); + + // https://github.com/elastic/eui/issues/2841 + it.skip('a11y test for roles drop down', async () => { + await testSubjects.setValue('userFormUserNameInput', 'a11y'); + await testSubjects.setValue('passwordInput', 'password'); + await testSubjects.setValue('passwordConfirmationInput', 'password'); + await testSubjects.setValue('userFormFullNameInput', 'a11y user'); + await testSubjects.setValue('userFormEmailInput', 'example@example.com'); + await testSubjects.click('rolesDropdown'); + await a11y.testAppSnapshot(); + }); + + it('a11y test for display of delete button on users page ', async () => { + await testSubjects.setValue('userFormUserNameInput', 'deleteA11y'); + await testSubjects.setValue('passwordInput', 'password'); + await testSubjects.setValue('passwordConfirmationInput', 'password'); + await testSubjects.setValue('userFormFullNameInput', 'DeleteA11y user'); + await testSubjects.setValue('userFormEmailInput', 'example@example.com'); + await testSubjects.click('rolesDropdown'); + await testSubjects.setValue('rolesDropdown', 'roleOption-apm_user'); + await testSubjects.click('userFormSaveButton'); + await testSubjects.click('checkboxSelectRow-deleteA11y'); + await a11y.testAppSnapshot(); + }); + + it('a11y test for delete user panel ', async () => { + await testSubjects.click('deleteUserButton'); + await a11y.testAppSnapshot(); + }); + + it('a11y test for edit user panel', async () => { + await testSubjects.click('confirmModalCancelButton'); + await PageObjects.settings.clickLinkText('deleteA11y'); + await a11y.testAppSnapshot(); + }); + + // https://github.com/elastic/eui/issues/2841 + it.skip('a11y test for Change password screen', async () => { + await PageObjects.settings.clickLinkText('deleteA11y'); + await testSubjects.click('changePassword'); + await a11y.testAppSnapshot(); + }); + }); +} diff --git a/x-pack/test/accessibility/config.ts b/x-pack/test/accessibility/config.ts index 915872d8b3fb0..5ea5c03696479 100644 --- a/x-pack/test/accessibility/config.ts +++ b/x-pack/test/accessibility/config.ts @@ -23,6 +23,7 @@ export default async function ({ readConfigFile }: FtrConfigProviderContext) { require.resolve('./apps/spaces'), require.resolve('./apps/advanced_settings'), require.resolve('./apps/dashboard_edit_panel'), + require.resolve('./apps/users'), ], pageObjects, From f490268a2eb21499104250a8bfb61991a7102b7f Mon Sep 17 00:00:00 2001 From: igoristic Date: Mon, 5 Oct 2020 11:22:17 -0400 Subject: [PATCH 14/49] [Monitoring] JVM memory usage alert (#79039) * Memory usage first draft * Fixed tests * CR feedback * Feedback and tests * Added size to optimize query * Removed scheduled check * Removed globalstate date Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- x-pack/plugins/monitoring/common/constants.ts | 2 + .../alerts/memory_usage_alert/index.tsx | 29 ++ .../cluster/overview/elasticsearch_panel.js | 2 + x-pack/plugins/monitoring/public/plugin.ts | 12 +- .../elasticsearch/node/advanced/index.js | 8 +- .../public/views/elasticsearch/node/index.js | 8 +- .../public/views/elasticsearch/nodes/index.js | 8 +- .../server/alerts/alerts_factory.test.ts | 2 +- .../server/alerts/alerts_factory.ts | 3 + .../monitoring/server/alerts/base_alert.ts | 8 + .../server/alerts/cpu_usage_alert.test.ts | 10 +- .../server/alerts/cpu_usage_alert.ts | 4 +- .../server/alerts/disk_usage_alert.test.ts | 2 - .../server/alerts/disk_usage_alert.ts | 16 +- .../plugins/monitoring/server/alerts/index.ts | 1 + .../server/alerts/memory_usage_alert.ts | 355 ++++++++++++++++++ .../missing_monitoring_data_alert.test.ts | 10 +- .../alerts/missing_monitoring_data_alert.ts | 17 +- .../monitoring/server/alerts/types.d.ts | 38 +- .../alerts/fetch_memory_usage_node_stats.ts | 118 ++++++ 20 files changed, 594 insertions(+), 59 deletions(-) create mode 100644 x-pack/plugins/monitoring/public/alerts/memory_usage_alert/index.tsx create mode 100644 x-pack/plugins/monitoring/server/alerts/memory_usage_alert.ts create mode 100644 x-pack/plugins/monitoring/server/lib/alerts/fetch_memory_usage_node_stats.ts diff --git a/x-pack/plugins/monitoring/common/constants.ts b/x-pack/plugins/monitoring/common/constants.ts index 860f6439f3fdf..76d9e7517b6ab 100644 --- a/x-pack/plugins/monitoring/common/constants.ts +++ b/x-pack/plugins/monitoring/common/constants.ts @@ -236,6 +236,7 @@ export const ALERT_NODES_CHANGED = `${ALERT_PREFIX}alert_nodes_changed`; export const ALERT_ELASTICSEARCH_VERSION_MISMATCH = `${ALERT_PREFIX}alert_elasticsearch_version_mismatch`; export const ALERT_KIBANA_VERSION_MISMATCH = `${ALERT_PREFIX}alert_kibana_version_mismatch`; export const ALERT_LOGSTASH_VERSION_MISMATCH = `${ALERT_PREFIX}alert_logstash_version_mismatch`; +export const ALERT_MEMORY_USAGE = `${ALERT_PREFIX}alert_jvm_memory_usage`; export const ALERT_MISSING_MONITORING_DATA = `${ALERT_PREFIX}alert_missing_monitoring_data`; /** @@ -250,6 +251,7 @@ export const ALERTS = [ ALERT_ELASTICSEARCH_VERSION_MISMATCH, ALERT_KIBANA_VERSION_MISMATCH, ALERT_LOGSTASH_VERSION_MISMATCH, + ALERT_MEMORY_USAGE, ALERT_MISSING_MONITORING_DATA, ]; diff --git a/x-pack/plugins/monitoring/public/alerts/memory_usage_alert/index.tsx b/x-pack/plugins/monitoring/public/alerts/memory_usage_alert/index.tsx new file mode 100644 index 0000000000000..dd60967a3458b --- /dev/null +++ b/x-pack/plugins/monitoring/public/alerts/memory_usage_alert/index.tsx @@ -0,0 +1,29 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import React from 'react'; +import { validate } from '../components/duration/validation'; +import { Expression, Props } from '../components/duration/expression'; + +// eslint-disable-next-line @kbn/eslint/no-restricted-paths +import { AlertTypeModel } from '../../../../triggers_actions_ui/public/types'; + +// eslint-disable-next-line @kbn/eslint/no-restricted-paths +import { MemoryUsageAlert } from '../../../server/alerts'; + +export function createMemoryUsageAlertType(): AlertTypeModel { + return { + id: MemoryUsageAlert.TYPE, + name: MemoryUsageAlert.LABEL, + iconClass: 'bell', + alertParamsExpression: (props: Props) => ( + + ), + validate, + defaultActionMessage: '{{context.internalFullMessage}}', + requiresAppContext: true, + }; +} diff --git a/x-pack/plugins/monitoring/public/components/cluster/overview/elasticsearch_panel.js b/x-pack/plugins/monitoring/public/components/cluster/overview/elasticsearch_panel.js index 667f64458b8f9..13324ba3ecac9 100644 --- a/x-pack/plugins/monitoring/public/components/cluster/overview/elasticsearch_panel.js +++ b/x-pack/plugins/monitoring/public/components/cluster/overview/elasticsearch_panel.js @@ -41,6 +41,7 @@ import { ALERT_CLUSTER_HEALTH, ALERT_CPU_USAGE, ALERT_DISK_USAGE, + ALERT_MEMORY_USAGE, ALERT_NODES_CHANGED, ALERT_ELASTICSEARCH_VERSION_MISMATCH, ALERT_MISSING_MONITORING_DATA, @@ -160,6 +161,7 @@ const OVERVIEW_PANEL_ALERTS = [ALERT_CLUSTER_HEALTH, ALERT_LICENSE_EXPIRATION]; const NODES_PANEL_ALERTS = [ ALERT_CPU_USAGE, ALERT_DISK_USAGE, + ALERT_MEMORY_USAGE, ALERT_NODES_CHANGED, ALERT_ELASTICSEARCH_VERSION_MISMATCH, ALERT_MISSING_MONITORING_DATA, diff --git a/x-pack/plugins/monitoring/public/plugin.ts b/x-pack/plugins/monitoring/public/plugin.ts index f4f66185346e8..2af23f3d7b316 100644 --- a/x-pack/plugins/monitoring/public/plugin.ts +++ b/x-pack/plugins/monitoring/public/plugin.ts @@ -26,6 +26,7 @@ import { createCpuUsageAlertType } from './alerts/cpu_usage_alert'; import { createMissingMonitoringDataAlertType } from './alerts/missing_monitoring_data_alert'; import { createLegacyAlertTypes } from './alerts/legacy_alert'; import { createDiskUsageAlertType } from './alerts/disk_usage_alert'; +import { createMemoryUsageAlertType } from './alerts/memory_usage_alert'; interface MonitoringSetupPluginDependencies { home?: HomePublicPluginSetup; @@ -72,12 +73,15 @@ export class MonitoringPlugin }); } - plugins.triggers_actions_ui.alertTypeRegistry.register(createCpuUsageAlertType()); - plugins.triggers_actions_ui.alertTypeRegistry.register(createMissingMonitoringDataAlertType()); - plugins.triggers_actions_ui.alertTypeRegistry.register(createDiskUsageAlertType()); + const { alertTypeRegistry } = plugins.triggers_actions_ui; + alertTypeRegistry.register(createCpuUsageAlertType()); + alertTypeRegistry.register(createDiskUsageAlertType()); + alertTypeRegistry.register(createMemoryUsageAlertType()); + alertTypeRegistry.register(createMissingMonitoringDataAlertType()); + const legacyAlertTypes = createLegacyAlertTypes(); for (const legacyAlertType of legacyAlertTypes) { - plugins.triggers_actions_ui.alertTypeRegistry.register(legacyAlertType); + alertTypeRegistry.register(legacyAlertType); } const app: App = { diff --git a/x-pack/plugins/monitoring/public/views/elasticsearch/node/advanced/index.js b/x-pack/plugins/monitoring/public/views/elasticsearch/node/advanced/index.js index ff7f29c58b2f6..03c0714864f92 100644 --- a/x-pack/plugins/monitoring/public/views/elasticsearch/node/advanced/index.js +++ b/x-pack/plugins/monitoring/public/views/elasticsearch/node/advanced/index.js @@ -22,6 +22,7 @@ import { ALERT_CPU_USAGE, ALERT_MISSING_MONITORING_DATA, ALERT_DISK_USAGE, + ALERT_MEMORY_USAGE, } from '../../../../../common/constants'; function getPageData($injector) { @@ -72,7 +73,12 @@ uiRoutes.when('/elasticsearch/nodes/:node/advanced', { alerts: { shouldFetch: true, options: { - alertTypeIds: [ALERT_CPU_USAGE, ALERT_DISK_USAGE, ALERT_MISSING_MONITORING_DATA], + alertTypeIds: [ + ALERT_CPU_USAGE, + ALERT_DISK_USAGE, + ALERT_MEMORY_USAGE, + ALERT_MISSING_MONITORING_DATA, + ], filters: [ { nodeUuid: nodeName, diff --git a/x-pack/plugins/monitoring/public/views/elasticsearch/node/index.js b/x-pack/plugins/monitoring/public/views/elasticsearch/node/index.js index 15b9b7b4c0e4a..5164e93c266ca 100644 --- a/x-pack/plugins/monitoring/public/views/elasticsearch/node/index.js +++ b/x-pack/plugins/monitoring/public/views/elasticsearch/node/index.js @@ -23,6 +23,7 @@ import { ALERT_CPU_USAGE, ALERT_MISSING_MONITORING_DATA, ALERT_DISK_USAGE, + ALERT_MEMORY_USAGE, } from '../../../../common/constants'; uiRoutes.when('/elasticsearch/nodes/:node', { @@ -56,7 +57,12 @@ uiRoutes.when('/elasticsearch/nodes/:node', { alerts: { shouldFetch: true, options: { - alertTypeIds: [ALERT_CPU_USAGE, ALERT_DISK_USAGE, ALERT_MISSING_MONITORING_DATA], + alertTypeIds: [ + ALERT_CPU_USAGE, + ALERT_DISK_USAGE, + ALERT_MEMORY_USAGE, + ALERT_MISSING_MONITORING_DATA, + ], filters: [ { nodeUuid: nodeName, diff --git a/x-pack/plugins/monitoring/public/views/elasticsearch/nodes/index.js b/x-pack/plugins/monitoring/public/views/elasticsearch/nodes/index.js index ef807bf9b377d..4f66508c2d30f 100644 --- a/x-pack/plugins/monitoring/public/views/elasticsearch/nodes/index.js +++ b/x-pack/plugins/monitoring/public/views/elasticsearch/nodes/index.js @@ -21,6 +21,7 @@ import { ALERT_CPU_USAGE, ALERT_MISSING_MONITORING_DATA, ALERT_DISK_USAGE, + ALERT_MEMORY_USAGE, } from '../../../../common/constants'; uiRoutes.when('/elasticsearch/nodes', { @@ -88,7 +89,12 @@ uiRoutes.when('/elasticsearch/nodes', { alerts: { shouldFetch: true, options: { - alertTypeIds: [ALERT_CPU_USAGE, ALERT_DISK_USAGE, ALERT_MISSING_MONITORING_DATA], + alertTypeIds: [ + ALERT_CPU_USAGE, + ALERT_DISK_USAGE, + ALERT_MEMORY_USAGE, + ALERT_MISSING_MONITORING_DATA, + ], filters: [ { stackProduct: ELASTICSEARCH_SYSTEM_ID, diff --git a/x-pack/plugins/monitoring/server/alerts/alerts_factory.test.ts b/x-pack/plugins/monitoring/server/alerts/alerts_factory.test.ts index ddc8dcafebd21..f486061109b39 100644 --- a/x-pack/plugins/monitoring/server/alerts/alerts_factory.test.ts +++ b/x-pack/plugins/monitoring/server/alerts/alerts_factory.test.ts @@ -63,6 +63,6 @@ describe('AlertsFactory', () => { it('should get all', () => { const alerts = AlertsFactory.getAll(); - expect(alerts.length).toBe(9); + expect(alerts.length).toBe(10); }); }); diff --git a/x-pack/plugins/monitoring/server/alerts/alerts_factory.ts b/x-pack/plugins/monitoring/server/alerts/alerts_factory.ts index 05a92cea5469b..22c41c9c60038 100644 --- a/x-pack/plugins/monitoring/server/alerts/alerts_factory.ts +++ b/x-pack/plugins/monitoring/server/alerts/alerts_factory.ts @@ -8,6 +8,7 @@ import { CpuUsageAlert, MissingMonitoringDataAlert, DiskUsageAlert, + MemoryUsageAlert, NodesChangedAlert, ClusterHealthAlert, LicenseExpirationAlert, @@ -22,6 +23,7 @@ import { ALERT_CPU_USAGE, ALERT_MISSING_MONITORING_DATA, ALERT_DISK_USAGE, + ALERT_MEMORY_USAGE, ALERT_NODES_CHANGED, ALERT_LOGSTASH_VERSION_MISMATCH, ALERT_KIBANA_VERSION_MISMATCH, @@ -35,6 +37,7 @@ export const BY_TYPE = { [ALERT_CPU_USAGE]: CpuUsageAlert, [ALERT_MISSING_MONITORING_DATA]: MissingMonitoringDataAlert, [ALERT_DISK_USAGE]: DiskUsageAlert, + [ALERT_MEMORY_USAGE]: MemoryUsageAlert, [ALERT_NODES_CHANGED]: NodesChangedAlert, [ALERT_LOGSTASH_VERSION_MISMATCH]: LogstashVersionMismatchAlert, [ALERT_KIBANA_VERSION_MISMATCH]: KibanaVersionMismatchAlert, diff --git a/x-pack/plugins/monitoring/server/alerts/base_alert.ts b/x-pack/plugins/monitoring/server/alerts/base_alert.ts index 61486626040f7..c92291cf72093 100644 --- a/x-pack/plugins/monitoring/server/alerts/base_alert.ts +++ b/x-pack/plugins/monitoring/server/alerts/base_alert.ts @@ -377,4 +377,12 @@ export class BaseAlert { ) { throw new Error('Child classes must implement `executeActions`'); } + + protected createGlobalStateLink(link: string, clusterUuid: string, ccs?: string) { + const globalState = [`cluster_uuid:${clusterUuid}`]; + if (ccs) { + globalState.push(`ccs:${ccs}`); + } + return `${this.kibanaUrl}/app/monitoring#/${link}?_g=(${globalState.toString()})`; + } } diff --git a/x-pack/plugins/monitoring/server/alerts/cpu_usage_alert.test.ts b/x-pack/plugins/monitoring/server/alerts/cpu_usage_alert.test.ts index 495fe993cca1b..a53ae1f9d0dd5 100644 --- a/x-pack/plugins/monitoring/server/alerts/cpu_usage_alert.test.ts +++ b/x-pack/plugins/monitoring/server/alerts/cpu_usage_alert.test.ts @@ -78,7 +78,6 @@ describe('CpuUsageAlert', () => { }; const kibanaUrl = 'http://localhost:5601'; - const hasScheduledActions = jest.fn(); const replaceState = jest.fn(); const scheduleActions = jest.fn(); const getState = jest.fn(); @@ -87,7 +86,6 @@ describe('CpuUsageAlert', () => { callCluster: jest.fn(), alertInstanceFactory: jest.fn().mockImplementation(() => { return { - hasScheduledActions, replaceState, scheduleActions, getState, @@ -154,7 +152,7 @@ describe('CpuUsageAlert', () => { endToken: '#end_link', type: 'docLink', partialUrl: - '{elasticWebsiteUrl}/guide/en/elasticsearch/reference/{docLinkVersion}/cluster-nodes-hot-threads.html', + '{elasticWebsiteUrl}guide/en/elasticsearch/reference/{docLinkVersion}/cluster-nodes-hot-threads.html', }, ], }, @@ -166,7 +164,7 @@ describe('CpuUsageAlert', () => { endToken: '#end_link', type: 'docLink', partialUrl: - '{elasticWebsiteUrl}/guide/en/elasticsearch/reference/{docLinkVersion}/tasks.html', + '{elasticWebsiteUrl}guide/en/elasticsearch/reference/{docLinkVersion}/tasks.html', }, ], }, @@ -506,7 +504,7 @@ describe('CpuUsageAlert', () => { endToken: '#end_link', type: 'docLink', partialUrl: - '{elasticWebsiteUrl}/guide/en/elasticsearch/reference/{docLinkVersion}/cluster-nodes-hot-threads.html', + '{elasticWebsiteUrl}guide/en/elasticsearch/reference/{docLinkVersion}/cluster-nodes-hot-threads.html', }, ], }, @@ -518,7 +516,7 @@ describe('CpuUsageAlert', () => { endToken: '#end_link', type: 'docLink', partialUrl: - '{elasticWebsiteUrl}/guide/en/elasticsearch/reference/{docLinkVersion}/tasks.html', + '{elasticWebsiteUrl}guide/en/elasticsearch/reference/{docLinkVersion}/tasks.html', }, ], }, diff --git a/x-pack/plugins/monitoring/server/alerts/cpu_usage_alert.ts b/x-pack/plugins/monitoring/server/alerts/cpu_usage_alert.ts index ca9674c57216b..3117a160ecb62 100644 --- a/x-pack/plugins/monitoring/server/alerts/cpu_usage_alert.ts +++ b/x-pack/plugins/monitoring/server/alerts/cpu_usage_alert.ts @@ -193,13 +193,13 @@ export class CpuUsageAlert extends BaseAlert { i18n.translate('xpack.monitoring.alerts.cpuUsage.ui.nextSteps.hotThreads', { defaultMessage: '#start_linkCheck hot threads#end_link', }), - `{elasticWebsiteUrl}/guide/en/elasticsearch/reference/{docLinkVersion}/cluster-nodes-hot-threads.html` + `{elasticWebsiteUrl}guide/en/elasticsearch/reference/{docLinkVersion}/cluster-nodes-hot-threads.html` ), createLink( i18n.translate('xpack.monitoring.alerts.cpuUsage.ui.nextSteps.runningTasks', { defaultMessage: '#start_linkCheck long running tasks#end_link', }), - `{elasticWebsiteUrl}/guide/en/elasticsearch/reference/{docLinkVersion}/tasks.html` + `{elasticWebsiteUrl}guide/en/elasticsearch/reference/{docLinkVersion}/tasks.html` ), ], tokens: [ diff --git a/x-pack/plugins/monitoring/server/alerts/disk_usage_alert.test.ts b/x-pack/plugins/monitoring/server/alerts/disk_usage_alert.test.ts index 546399f666b6c..e3d69820ebb05 100644 --- a/x-pack/plugins/monitoring/server/alerts/disk_usage_alert.test.ts +++ b/x-pack/plugins/monitoring/server/alerts/disk_usage_alert.test.ts @@ -89,7 +89,6 @@ describe('DiskUsageAlert', () => { }; const kibanaUrl = 'http://localhost:5601'; - const hasScheduledActions = jest.fn(); const replaceState = jest.fn(); const scheduleActions = jest.fn(); const getState = jest.fn(); @@ -98,7 +97,6 @@ describe('DiskUsageAlert', () => { callCluster: jest.fn(), alertInstanceFactory: jest.fn().mockImplementation(() => { return { - hasScheduledActions, replaceState, scheduleActions, getState, diff --git a/x-pack/plugins/monitoring/server/alerts/disk_usage_alert.ts b/x-pack/plugins/monitoring/server/alerts/disk_usage_alert.ts index e43dca3ce87b1..c577550de8617 100644 --- a/x-pack/plugins/monitoring/server/alerts/disk_usage_alert.ts +++ b/x-pack/plugins/monitoring/server/alerts/disk_usage_alert.ts @@ -109,13 +109,13 @@ export class DiskUsageAlert extends BaseAlert { protected filterAlertInstance(alertInstance: RawAlertInstance, filters: CommonAlertFilter[]) { const alertInstanceStates = alertInstance.state?.alertStates as AlertDiskUsageState[]; - const nodeUuid = filters?.find((filter) => filter.nodeUuid); + const nodeFilter = filters?.find((filter) => filter.nodeUuid); - if (!filters || !filters.length || !alertInstanceStates?.length || !nodeUuid) { + if (!filters || !filters.length || !alertInstanceStates?.length || !nodeFilter?.nodeUuid) { return true; } - const nodeAlerts = alertInstanceStates.filter(({ nodeId }) => nodeId === nodeUuid); + const nodeAlerts = alertInstanceStates.filter(({ nodeId }) => nodeId === nodeFilter.nodeUuid); return Boolean(nodeAlerts.length); } @@ -160,7 +160,7 @@ export class DiskUsageAlert extends BaseAlert { i18n.translate('xpack.monitoring.alerts.diskUsage.ui.nextSteps.tuneDisk', { defaultMessage: '#start_linkTune for disk usage#end_link', }), - `{elasticWebsiteUrl}/guide/en/elasticsearch/reference/{docLinkVersion}/tune-for-disk-usage.html` + `{elasticWebsiteUrl}guide/en/elasticsearch/reference/{docLinkVersion}/tune-for-disk-usage.html` ), createLink( i18n.translate('xpack.monitoring.alerts.diskUsage.ui.nextSteps.identifyIndices', { @@ -173,19 +173,19 @@ export class DiskUsageAlert extends BaseAlert { i18n.translate('xpack.monitoring.alerts.diskUsage.ui.nextSteps.ilmPolicies', { defaultMessage: '#start_linkImplement ILM policies#end_link', }), - `{elasticWebsiteUrl}/guide/en/elasticsearch/reference/{docLinkVersion}/index-lifecycle-management.html` + `{elasticWebsiteUrl}guide/en/elasticsearch/reference/{docLinkVersion}/index-lifecycle-management.html` ), createLink( i18n.translate('xpack.monitoring.alerts.diskUsage.ui.nextSteps.addMoreNodes', { defaultMessage: '#start_linkAdd more data nodes#end_link', }), - `{elasticWebsiteUrl}/guide/en/elasticsearch/reference/{docLinkVersion}/add-elasticsearch-nodes.html` + `{elasticWebsiteUrl}guide/en/elasticsearch/reference/{docLinkVersion}/add-elasticsearch-nodes.html` ), createLink( i18n.translate('xpack.monitoring.alerts.diskUsage.ui.nextSteps.resizeYourDeployment', { defaultMessage: '#start_linkResize your deployment (ECE)#end_link', }), - `{elasticWebsiteUrl}/guide/en/cloud-enterprise/current/ece-resize-deployment.html` + `{elasticWebsiteUrl}guide/en/cloud-enterprise/current/ece-resize-deployment.html` ), ], tokens: [ @@ -331,7 +331,7 @@ export class DiskUsageAlert extends BaseAlert { const alertInstanceState = { alertStates: newAlertStates }; instance.replaceState(alertInstanceState); - if (newAlertStates.length && !instance.hasScheduledActions()) { + if (newAlertStates.length) { this.executeActions(instance, alertInstanceState, null, cluster); state.lastExecutedAction = currentUTC; } diff --git a/x-pack/plugins/monitoring/server/alerts/index.ts b/x-pack/plugins/monitoring/server/alerts/index.ts index 41f6daa38d1dc..48254f2dec326 100644 --- a/x-pack/plugins/monitoring/server/alerts/index.ts +++ b/x-pack/plugins/monitoring/server/alerts/index.ts @@ -8,6 +8,7 @@ export { BaseAlert } from './base_alert'; export { CpuUsageAlert } from './cpu_usage_alert'; export { MissingMonitoringDataAlert } from './missing_monitoring_data_alert'; export { DiskUsageAlert } from './disk_usage_alert'; +export { MemoryUsageAlert } from './memory_usage_alert'; export { ClusterHealthAlert } from './cluster_health_alert'; export { LicenseExpirationAlert } from './license_expiration_alert'; export { NodesChangedAlert } from './nodes_changed_alert'; diff --git a/x-pack/plugins/monitoring/server/alerts/memory_usage_alert.ts b/x-pack/plugins/monitoring/server/alerts/memory_usage_alert.ts new file mode 100644 index 0000000000000..8dc707afab1e1 --- /dev/null +++ b/x-pack/plugins/monitoring/server/alerts/memory_usage_alert.ts @@ -0,0 +1,355 @@ +/* + * 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 { IUiSettingsClient, Logger } from 'kibana/server'; +import { i18n } from '@kbn/i18n'; +import { BaseAlert } from './base_alert'; +import { + AlertData, + AlertCluster, + AlertState, + AlertMessage, + AlertMemoryUsageState, + AlertMessageTimeToken, + AlertMessageLinkToken, + AlertInstanceState, +} from './types'; +import { AlertInstance, AlertServices } from '../../../alerts/server'; +import { INDEX_PATTERN_ELASTICSEARCH, ALERT_MEMORY_USAGE } from '../../common/constants'; +import { fetchMemoryUsageNodeStats } from '../lib/alerts/fetch_memory_usage_node_stats'; +import { getCcsIndexPattern } from '../lib/alerts/get_ccs_index_pattern'; +import { AlertMessageTokenType, AlertSeverity, AlertParamType } from '../../common/enums'; +import { RawAlertInstance } from '../../../alerts/common'; +import { CommonAlertFilter, CommonAlertParams, CommonAlertParamDetail } from '../../common/types'; +import { AlertingDefaults, createLink } from './alerts_common'; +import { appendMetricbeatIndex } from '../lib/alerts/append_mb_index'; +import { parseDuration } from '../../../alerts/common/parse_duration'; + +interface ParamDetails { + [key: string]: CommonAlertParamDetail; +} + +export class MemoryUsageAlert extends BaseAlert { + public static readonly PARAM_DETAILS: ParamDetails = { + threshold: { + label: i18n.translate('xpack.monitoring.alerts.memoryUsage.paramDetails.threshold.label', { + defaultMessage: `Notify when memory usage is over`, + }), + type: AlertParamType.Percentage, + }, + duration: { + label: i18n.translate('xpack.monitoring.alerts.memoryUsage.paramDetails.duration.label', { + defaultMessage: `Look at the average over`, + }), + type: AlertParamType.Duration, + }, + }; + public static paramDetails = MemoryUsageAlert.PARAM_DETAILS; + public static readonly TYPE = ALERT_MEMORY_USAGE; + public static readonly LABEL = i18n.translate('xpack.monitoring.alerts.memoryUsage.label', { + defaultMessage: 'Memory Usage (JVM)', + }); + public type = MemoryUsageAlert.TYPE; + public label = MemoryUsageAlert.LABEL; + + protected defaultParams = { + threshold: 85, + duration: '5m', + }; + + protected actionVariables = [ + { + name: 'nodes', + description: i18n.translate('xpack.monitoring.alerts.memoryUsage.actionVariables.nodes', { + defaultMessage: 'The list of nodes reporting high memory usage.', + }), + }, + { + name: 'count', + description: i18n.translate('xpack.monitoring.alerts.memoryUsage.actionVariables.count', { + defaultMessage: 'The number of nodes reporting high memory usage.', + }), + }, + ...Object.values(AlertingDefaults.ALERT_TYPE.context), + ]; + + protected async fetchData( + params: CommonAlertParams, + callCluster: any, + clusters: AlertCluster[], + uiSettings: IUiSettingsClient, + availableCcs: string[] + ): Promise { + let esIndexPattern = appendMetricbeatIndex(this.config, INDEX_PATTERN_ELASTICSEARCH); + if (availableCcs) { + esIndexPattern = getCcsIndexPattern(esIndexPattern, availableCcs); + } + const { duration, threshold } = params; + const parsedDuration = parseDuration(duration as string); + const endMs = +new Date(); + const startMs = endMs - parsedDuration; + + const stats = await fetchMemoryUsageNodeStats( + callCluster, + clusters, + esIndexPattern, + startMs, + endMs, + this.config.ui.max_bucket_size + ); + + return stats.map((stat) => { + const { clusterUuid, nodeId, memoryUsage, ccs } = stat; + return { + instanceKey: `${clusterUuid}:${nodeId}`, + shouldFire: memoryUsage > threshold, + severity: AlertSeverity.Danger, + meta: stat, + clusterUuid, + ccs, + }; + }); + } + + protected filterAlertInstance(alertInstance: RawAlertInstance, filters: CommonAlertFilter[]) { + const alertInstanceStates = alertInstance.state?.alertStates as AlertMemoryUsageState[]; + const nodeFilter = filters?.find((filter) => filter.nodeUuid); + + if (!filters || !filters.length || !alertInstanceStates?.length || !nodeFilter?.nodeUuid) { + return true; + } + + const nodeAlerts = alertInstanceStates.filter(({ nodeId }) => nodeId === nodeFilter.nodeUuid); + return Boolean(nodeAlerts.length); + } + + protected getDefaultAlertState(cluster: AlertCluster, item: AlertData): AlertState { + const currentState = super.getDefaultAlertState(cluster, item); + currentState.ui.severity = AlertSeverity.Warning; + return currentState; + } + + protected getUiMessage(alertState: AlertState, item: AlertData): AlertMessage { + const stat = item.meta as AlertMemoryUsageState; + if (!alertState.ui.isFiring) { + return { + text: i18n.translate('xpack.monitoring.alerts.memoryUsage.ui.resolvedMessage', { + defaultMessage: `The JVM memory usage on node {nodeName} is now under the threshold, currently reporting at {memoryUsage}% as of #resolved`, + values: { + nodeName: stat.nodeName, + memoryUsage: stat.memoryUsage.toFixed(2), + }, + }), + tokens: [ + { + startToken: '#resolved', + type: AlertMessageTokenType.Time, + isAbsolute: true, + isRelative: false, + timestamp: alertState.ui.resolvedMS, + } as AlertMessageTimeToken, + ], + }; + } + return { + text: i18n.translate('xpack.monitoring.alerts.memoryUsage.ui.firingMessage', { + defaultMessage: `Node #start_link{nodeName}#end_link is reporting JVM memory usage of {memoryUsage}% at #absolute`, + values: { + nodeName: stat.nodeName, + memoryUsage: stat.memoryUsage, + }, + }), + nextSteps: [ + createLink( + i18n.translate('xpack.monitoring.alerts.memoryUsage.ui.nextSteps.tuneThreadPools', { + defaultMessage: '#start_linkTune thread pools#end_link', + }), + `{elasticWebsiteUrl}guide/en/elasticsearch/reference/{docLinkVersion}/modules-threadpool.html` + ), + createLink( + i18n.translate('xpack.monitoring.alerts.memoryUsage.ui.nextSteps.managingHeap', { + defaultMessage: '#start_linkManaging ES Heap#end_link', + }), + `{elasticWebsiteUrl}blog/a-heap-of-trouble` + ), + createLink( + i18n.translate('xpack.monitoring.alerts.memoryUsage.ui.nextSteps.identifyIndicesShards', { + defaultMessage: '#start_linkIdentify large indices/shards#end_link', + }), + 'elasticsearch/indices', + AlertMessageTokenType.Link + ), + createLink( + i18n.translate('xpack.monitoring.alerts.memoryUsage.ui.nextSteps.addMoreNodes', { + defaultMessage: '#start_linkAdd more data nodes#end_link', + }), + `{elasticWebsiteUrl}guide/en/elasticsearch/reference/{docLinkVersion}/add-elasticsearch-nodes.html` + ), + createLink( + i18n.translate('xpack.monitoring.alerts.memoryUsage.ui.nextSteps.resizeYourDeployment', { + defaultMessage: '#start_linkResize your deployment (ECE)#end_link', + }), + `{elasticWebsiteUrl}guide/en/cloud-enterprise/current/ece-resize-deployment.html` + ), + ], + tokens: [ + { + startToken: '#absolute', + type: AlertMessageTokenType.Time, + isAbsolute: true, + isRelative: false, + timestamp: alertState.ui.triggeredMS, + } as AlertMessageTimeToken, + { + startToken: '#start_link', + endToken: '#end_link', + type: AlertMessageTokenType.Link, + url: `elasticsearch/nodes/${stat.nodeId}`, + } as AlertMessageLinkToken, + ], + }; + } + + protected executeActions( + instance: AlertInstance, + { alertStates }: AlertInstanceState, + item: AlertData | null, + cluster: AlertCluster + ) { + const firingNodes = alertStates.filter( + (alertState) => alertState.ui.isFiring + ) as AlertMemoryUsageState[]; + const firingCount = firingNodes.length; + + if (firingCount > 0) { + const shortActionText = i18n.translate('xpack.monitoring.alerts.memoryUsage.shortAction', { + defaultMessage: 'Verify memory usage levels across affected nodes.', + }); + const fullActionText = i18n.translate('xpack.monitoring.alerts.memoryUsage.fullAction', { + defaultMessage: 'View nodes', + }); + + const ccs = alertStates.find((state) => state.ccs)?.ccs; + const globalStateLink = this.createGlobalStateLink( + 'elasticsearch/nodes', + cluster.clusterUuid, + ccs + ); + const action = `[${fullActionText}](${globalStateLink})`; + const internalShortMessage = i18n.translate( + 'xpack.monitoring.alerts.memoryUsage.firing.internalShortMessage', + { + defaultMessage: `Memory usage alert is firing for {count} node(s) in cluster: {clusterName}. {shortActionText}`, + values: { + count: firingCount, + clusterName: cluster.clusterName, + shortActionText, + }, + } + ); + const internalFullMessage = i18n.translate( + 'xpack.monitoring.alerts.memoryUsage.firing.internalFullMessage', + { + defaultMessage: `Memory usage alert is firing for {count} node(s) in cluster: {clusterName}. {action}`, + values: { + count: firingCount, + clusterName: cluster.clusterName, + action, + }, + } + ); + + instance.scheduleActions('default', { + internalShortMessage, + internalFullMessage: this.isCloud ? internalShortMessage : internalFullMessage, + state: AlertingDefaults.ALERT_STATE.firing, + nodes: firingNodes + .map((state) => `${state.nodeName}:${state.memoryUsage.toFixed(2)}`) + .join(','), + count: firingCount, + clusterName: cluster.clusterName, + action, + actionPlain: shortActionText, + }); + } else { + const resolvedNodes = (alertStates as AlertMemoryUsageState[]) + .filter((state) => !state.ui.isFiring) + .map((state) => `${state.nodeName}:${state.memoryUsage.toFixed(2)}`); + const resolvedCount = resolvedNodes.length; + + if (resolvedCount > 0) { + const internalMessage = i18n.translate( + 'xpack.monitoring.alerts.memoryUsage.resolved.internalMessage', + { + defaultMessage: `Memory usage alert is resolved for {count} node(s) in cluster: {clusterName}.`, + values: { + count: resolvedCount, + clusterName: cluster.clusterName, + }, + } + ); + + instance.scheduleActions('default', { + internalShortMessage: internalMessage, + internalFullMessage: internalMessage, + state: AlertingDefaults.ALERT_STATE.resolved, + nodes: resolvedNodes.join(','), + count: resolvedCount, + clusterName: cluster.clusterName, + }); + } + } + } + + protected async processData( + data: AlertData[], + clusters: AlertCluster[], + services: AlertServices, + logger: Logger, + state: any + ) { + const currentUTC = +new Date(); + for (const cluster of clusters) { + const nodes = data.filter((node) => node.clusterUuid === cluster.clusterUuid); + if (!nodes.length) { + continue; + } + + const firingNodeUuids = nodes + .filter((node) => node.shouldFire) + .map((node) => node.meta.nodeId) + .join(','); + const instanceId = `${this.type}:${cluster.clusterUuid}:${firingNodeUuids}`; + const instance = services.alertInstanceFactory(instanceId); + const newAlertStates: AlertMemoryUsageState[] = []; + + for (const node of nodes) { + const stat = node.meta as AlertMemoryUsageState; + const nodeState = this.getDefaultAlertState(cluster, node) as AlertMemoryUsageState; + nodeState.memoryUsage = stat.memoryUsage; + nodeState.nodeId = stat.nodeId; + nodeState.nodeName = stat.nodeName; + + if (node.shouldFire) { + nodeState.ui.triggeredMS = currentUTC; + nodeState.ui.isFiring = true; + nodeState.ui.severity = node.severity; + newAlertStates.push(nodeState); + } + nodeState.ui.message = this.getUiMessage(nodeState, node); + } + + const alertInstanceState = { alertStates: newAlertStates }; + instance.replaceState(alertInstanceState); + if (newAlertStates.length) { + this.executeActions(instance, alertInstanceState, null, cluster); + state.lastExecutedAction = currentUTC; + } + } + + state.lastChecked = currentUTC; + return state; + } +} diff --git a/x-pack/plugins/monitoring/server/alerts/missing_monitoring_data_alert.test.ts b/x-pack/plugins/monitoring/server/alerts/missing_monitoring_data_alert.test.ts index 4c06d9718c455..6ed237a055b5c 100644 --- a/x-pack/plugins/monitoring/server/alerts/missing_monitoring_data_alert.test.ts +++ b/x-pack/plugins/monitoring/server/alerts/missing_monitoring_data_alert.test.ts @@ -234,9 +234,9 @@ describe('MissingMonitoringDataAlert', () => { ], }); expect(scheduleActions).toHaveBeenCalledWith('default', { - internalFullMessage: `We have not detected any monitoring data for 2 stack product(s) in cluster: testCluster. [View what monitoring data we do have for these stack products.](http://localhost:5601/app/monitoring#overview?_g=(cluster_uuid:abc123))`, + internalFullMessage: `We have not detected any monitoring data for 2 stack product(s) in cluster: testCluster. [View what monitoring data we do have for these stack products.](http://localhost:5601/app/monitoring#/overview?_g=(cluster_uuid:abc123))`, internalShortMessage: `We have not detected any monitoring data for 2 stack product(s) in cluster: testCluster. Verify these stack products are up and running, then double check the monitoring settings.`, - action: `[View what monitoring data we do have for these stack products.](http://localhost:5601/app/monitoring#overview?_g=(cluster_uuid:abc123))`, + action: `[View what monitoring data we do have for these stack products.](http://localhost:5601/app/monitoring#/overview?_g=(cluster_uuid:abc123))`, actionPlain: 'Verify these stack products are up and running, then double check the monitoring settings.', clusterName, @@ -414,9 +414,9 @@ describe('MissingMonitoringDataAlert', () => { } as any); const count = 1; expect(scheduleActions).toHaveBeenCalledWith('default', { - internalFullMessage: `We have not detected any monitoring data for 1 stack product(s) in cluster: testCluster. [View what monitoring data we do have for these stack products.](http://localhost:5601/app/monitoring#overview?_g=(cluster_uuid:abc123,ccs:testCluster))`, + internalFullMessage: `We have not detected any monitoring data for 1 stack product(s) in cluster: testCluster. [View what monitoring data we do have for these stack products.](http://localhost:5601/app/monitoring#/overview?_g=(cluster_uuid:abc123,ccs:testCluster))`, internalShortMessage: `We have not detected any monitoring data for 1 stack product(s) in cluster: testCluster. Verify these stack products are up and running, then double check the monitoring settings.`, - action: `[View what monitoring data we do have for these stack products.](http://localhost:5601/app/monitoring#overview?_g=(cluster_uuid:abc123,ccs:testCluster))`, + action: `[View what monitoring data we do have for these stack products.](http://localhost:5601/app/monitoring#/overview?_g=(cluster_uuid:abc123,ccs:testCluster))`, actionPlain: 'Verify these stack products are up and running, then double check the monitoring settings.', clusterName, @@ -446,7 +446,7 @@ describe('MissingMonitoringDataAlert', () => { expect(scheduleActions).toHaveBeenCalledWith('default', { internalFullMessage: `We have not detected any monitoring data for 2 stack product(s) in cluster: testCluster. Verify these stack products are up and running, then double check the monitoring settings.`, internalShortMessage: `We have not detected any monitoring data for 2 stack product(s) in cluster: testCluster. Verify these stack products are up and running, then double check the monitoring settings.`, - action: `[View what monitoring data we do have for these stack products.](http://localhost:5601/app/monitoring#overview?_g=(cluster_uuid:abc123))`, + action: `[View what monitoring data we do have for these stack products.](http://localhost:5601/app/monitoring#/overview?_g=(cluster_uuid:abc123))`, actionPlain: 'Verify these stack products are up and running, then double check the monitoring settings.', clusterName, diff --git a/x-pack/plugins/monitoring/server/alerts/missing_monitoring_data_alert.ts b/x-pack/plugins/monitoring/server/alerts/missing_monitoring_data_alert.ts index 6017314f332e6..75dee475e7525 100644 --- a/x-pack/plugins/monitoring/server/alerts/missing_monitoring_data_alert.ts +++ b/x-pack/plugins/monitoring/server/alerts/missing_monitoring_data_alert.ts @@ -309,13 +309,6 @@ export class MissingMonitoringDataAlert extends BaseAlert { return; } - const ccs = instanceState.alertStates.reduce((accum: string, state): string => { - if (state.ccs) { - return state.ccs; - } - return accum; - }, ''); - const firingCount = instanceState.alertStates.filter((alertState) => alertState.ui.isFiring) .length; const firingStackProducts = instanceState.alertStates @@ -336,12 +329,10 @@ export class MissingMonitoringDataAlert extends BaseAlert { const fullActionText = i18n.translate('xpack.monitoring.alerts.missingData.fullAction', { defaultMessage: 'View what monitoring data we do have for these stack products.', }); - const globalState = [`cluster_uuid:${cluster.clusterUuid}`]; - if (ccs) { - globalState.push(`ccs:${ccs}`); - } - const url = `${this.kibanaUrl}/app/monitoring#overview?_g=(${globalState.join(',')})`; - const action = `[${fullActionText}](${url})`; + + const ccs = instanceState.alertStates.find((state) => state.ccs)?.ccs; + const globalStateLink = this.createGlobalStateLink('overview', cluster.clusterUuid, ccs); + const action = `[${fullActionText}](${globalStateLink})`; const internalShortMessage = i18n.translate( 'xpack.monitoring.alerts.missingData.firing.internalShortMessage', { diff --git a/x-pack/plugins/monitoring/server/alerts/types.d.ts b/x-pack/plugins/monitoring/server/alerts/types.d.ts index 4b78bca9f47ca..0b346e770a299 100644 --- a/x-pack/plugins/monitoring/server/alerts/types.d.ts +++ b/x-pack/plugins/monitoring/server/alerts/types.d.ts @@ -22,10 +22,17 @@ export interface AlertState { ui: AlertUiState; } -export interface AlertCpuUsageState extends AlertState { - cpuUsage: number; +export interface AlertNodeState extends AlertState { nodeId: string; - nodeName: string; + nodeName?: string; +} + +export interface AlertCpuUsageState extends AlertNodeState { + cpuUsage: number; +} + +export interface AlertDiskUsageState extends AlertNodeState { + diskUsage: number; } export interface AlertMissingDataState extends AlertState { @@ -35,10 +42,8 @@ export interface AlertMissingDataState extends AlertState { gapDuration: number; } -export interface AlertDiskUsageState extends AlertState { - diskUsage: number; - nodeId: string; - nodeName?: string; +export interface AlertMemoryUsageState extends AlertNodeState { + memoryUsage: number; } export interface AlertUiState { @@ -81,23 +86,26 @@ export interface AlertCluster { clusterName: string; } -export interface AlertCpuUsageNodeStats { +export interface AlertNodeStats { clusterUuid: string; nodeId: string; - nodeName: string; + nodeName?: string; + ccs?: string; +} + +export interface AlertCpuUsageNodeStats extends AlertNodeStats { cpuUsage: number; containerUsage: number; containerPeriods: number; containerQuota: number; - ccs?: string; } -export interface AlertDiskUsageNodeStats { - clusterUuid: string; - nodeId: string; - nodeName: string; +export interface AlertDiskUsageNodeStats extends AlertNodeStats { diskUsage: number; - ccs?: string; +} + +export interface AlertMemoryUsageNodeStats extends AlertNodeStats { + memoryUsage: number; } export interface AlertMissingData { diff --git a/x-pack/plugins/monitoring/server/lib/alerts/fetch_memory_usage_node_stats.ts b/x-pack/plugins/monitoring/server/lib/alerts/fetch_memory_usage_node_stats.ts new file mode 100644 index 0000000000000..c6843c3ed5f12 --- /dev/null +++ b/x-pack/plugins/monitoring/server/lib/alerts/fetch_memory_usage_node_stats.ts @@ -0,0 +1,118 @@ +/* + * 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 { get } from 'lodash'; +import { AlertCluster, AlertMemoryUsageNodeStats } from '../../alerts/types'; + +export async function fetchMemoryUsageNodeStats( + callCluster: any, + clusters: AlertCluster[], + index: string, + startMs: number, + endMs: number, + size: number +): Promise { + const clustersIds = clusters.map((cluster) => cluster.clusterUuid); + const params = { + index, + filterPath: ['aggregations'], + body: { + size: 0, + query: { + bool: { + filter: [ + { + terms: { + cluster_uuid: clustersIds, + }, + }, + { + term: { + type: 'node_stats', + }, + }, + { + range: { + timestamp: { + format: 'epoch_millis', + gte: startMs, + lte: endMs, + }, + }, + }, + ], + }, + }, + aggs: { + clusters: { + terms: { + field: 'cluster_uuid', + size, + }, + aggs: { + nodes: { + terms: { + field: 'source_node.uuid', + size, + }, + aggs: { + index: { + terms: { + field: '_index', + size: 1, + }, + }, + avg_heap: { + avg: { + field: 'node_stats.jvm.mem.heap_used_percent', + }, + }, + cluster_uuid: { + terms: { + field: 'cluster_uuid', + size: 1, + }, + }, + name: { + terms: { + field: 'source_node.name', + size: 1, + }, + }, + }, + }, + }, + }, + }, + }, + }; + + const response = await callCluster('search', params); + const stats: AlertMemoryUsageNodeStats[] = []; + const { buckets: clusterBuckets = [] } = response.aggregations.clusters; + + if (!clusterBuckets.length) { + return stats; + } + + for (const clusterBucket of clusterBuckets) { + for (const node of clusterBucket.nodes.buckets) { + const indexName = get(node, 'index.buckets[0].key', ''); + const memoryUsage = Math.floor(Number(get(node, 'avg_heap.value'))); + if (isNaN(memoryUsage) || memoryUsage === undefined || memoryUsage === null) { + continue; + } + stats.push({ + memoryUsage, + clusterUuid: clusterBucket.key, + nodeId: node.key, + nodeName: get(node, 'name.buckets[0].key'), + ccs: indexName.includes(':') ? indexName.split(':')[0] : null, + }); + } + } + return stats; +} From 53f22dcf36434aeb60c4c2b976656a7500546794 Mon Sep 17 00:00:00 2001 From: Sandra Gonzales Date: Mon, 5 Oct 2020 11:33:41 -0400 Subject: [PATCH 15/49] [Ingest Manager] Upgrade Agents in Fleet (#78810) * add kibanaVersion context and hook, add upgrade available indications * add agent upgrade modals and action buttons * fix import * add bulk actions api and remove source_uri as required * add upgrading to AgentHealth status * buildKueryForUpgradingAgents * bulk actions UI * remove source_uri * add release type to agent details * don't allow upgrade of unenrolled/unenrolling agent * hide upgradeable button when not upgradeable * fix test * add udpating agent status * remove upgrade available filter button for now * update isUpgradeAvailable to use local_metadata upgradeable * add UPDATING to agent event subtype * use saved object for updating agent status * add updating badge type label * add upgrade available button and update agent list endpoint to accept showUpgradeable * add schema and type for UPDATING * fix type * dont try to upgrade local_metadata * exclude from AAD upgrade_started_at and upgraded_at Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- .../ingest_manager/common/constants/routes.ts | 1 + .../common/services/agent_status.ts | 10 +- .../ingest_manager/common/services/index.ts | 1 + .../services/is_agent_upgradeable.test.ts | 100 ++++++++++++ .../common/services/is_agent_upgradeable.ts | 21 +++ .../ingest_manager/common/services/routes.ts | 3 + .../common/types/models/agent.ts | 9 +- .../common/types/rest_spec/agent.ts | 25 ++- .../ingest_manager/hooks/index.ts | 1 + .../hooks/use_kibana_version.ts | 17 ++ .../hooks/use_request/agents.ts | 29 ++++ .../applications/ingest_manager/index.tsx | 15 +- .../components/actions_menu.tsx | 36 ++++- .../components/agent_details.tsx | 42 ++++- .../components/type_labels.tsx | 8 + .../fleet/agent_details_page/index.tsx | 43 +++++ .../components/bulk_actions.tsx | 38 ++++- .../sections/fleet/agent_list_page/index.tsx | 84 +++++++++- .../fleet/components/agent_health.tsx | 10 ++ .../components/agent_upgrade_modal/index.tsx | 126 +++++++++++++++ .../sections/fleet/components/index.tsx | 1 + .../ingest_manager/services/index.ts | 1 + .../ingest_manager/types/index.ts | 4 + .../plugins/ingest_manager/public/plugin.ts | 5 +- .../server/routes/agent/handlers.ts | 1 + .../server/routes/agent/index.ts | 12 +- .../server/routes/agent/upgrade_handler.ts | 62 +++++++- .../server/saved_objects/index.ts | 2 + .../server/services/agents/crud.ts | 13 +- .../server/services/agents/upgrade.ts | 69 ++++++-- .../server/types/models/agent.ts | 1 + .../server/types/rest_spec/agent.ts | 16 +- .../server/types/rest_spec/common.ts | 1 + .../apis/fleet/agents/acks.ts | 2 +- .../apis/fleet/agents/upgrade.ts | 149 ++++++++++++++++-- 35 files changed, 901 insertions(+), 57 deletions(-) create mode 100644 x-pack/plugins/ingest_manager/common/services/is_agent_upgradeable.test.ts create mode 100644 x-pack/plugins/ingest_manager/common/services/is_agent_upgradeable.ts create mode 100644 x-pack/plugins/ingest_manager/public/applications/ingest_manager/hooks/use_kibana_version.ts create mode 100644 x-pack/plugins/ingest_manager/public/applications/ingest_manager/sections/fleet/components/agent_upgrade_modal/index.tsx diff --git a/x-pack/plugins/ingest_manager/common/constants/routes.ts b/x-pack/plugins/ingest_manager/common/constants/routes.ts index 69672dfb9ec6c..2b1d24f14874f 100644 --- a/x-pack/plugins/ingest_manager/common/constants/routes.ts +++ b/x-pack/plugins/ingest_manager/common/constants/routes.ts @@ -91,6 +91,7 @@ export const AGENT_API_ROUTES = { BULK_REASSIGN_PATTERN: `${FLEET_API_ROOT}/agents/bulk_reassign`, STATUS_PATTERN: `${FLEET_API_ROOT}/agent-status`, UPGRADE_PATTERN: `${FLEET_API_ROOT}/agents/{agentId}/upgrade`, + BULK_UPGRADE_PATTERN: `${FLEET_API_ROOT}/agents/bulk_upgrade`, }; export const ENROLLMENT_API_KEY_ROUTES = { diff --git a/x-pack/plugins/ingest_manager/common/services/agent_status.ts b/x-pack/plugins/ingest_manager/common/services/agent_status.ts index 70f4d7f9344f9..cd990d70c3612 100644 --- a/x-pack/plugins/ingest_manager/common/services/agent_status.ts +++ b/x-pack/plugins/ingest_manager/common/services/agent_status.ts @@ -19,9 +19,6 @@ export function getAgentStatus(agent: Agent, now: number = Date.now()): AgentSta if (!agent.last_checkin) { return 'enrolling'; } - if (agent.upgrade_started_at && !agent.upgraded_at) { - return 'upgrading'; - } const msLastCheckIn = new Date(lastCheckIn || 0).getTime(); const msSinceLastCheckIn = new Date().getTime() - msLastCheckIn; @@ -33,6 +30,9 @@ export function getAgentStatus(agent: Agent, now: number = Date.now()): AgentSta if (agent.last_checkin_status === 'degraded') { return 'degraded'; } + if (agent.upgrade_started_at && !agent.upgraded_at) { + return 'updating'; + } if (intervalsSinceLastCheckIn >= 4) { return 'offline'; } @@ -61,3 +61,7 @@ export function buildKueryForOfflineAgents() { (4 * AGENT_POLLING_THRESHOLD_MS) / 1000 }s AND not (${buildKueryForErrorAgents()})`; } + +export function buildKueryForUpdatingAgents() { + return `${AGENT_SAVED_OBJECT_TYPE}.upgrade_started_at:*`; +} diff --git a/x-pack/plugins/ingest_manager/common/services/index.ts b/x-pack/plugins/ingest_manager/common/services/index.ts index 4bffa01ad5ee2..19285e921e931 100644 --- a/x-pack/plugins/ingest_manager/common/services/index.ts +++ b/x-pack/plugins/ingest_manager/common/services/index.ts @@ -13,3 +13,4 @@ export { decodeCloudId } from './decode_cloud_id'; export { isValidNamespace } from './is_valid_namespace'; export { isDiffPathProtocol } from './is_diff_path_protocol'; export { LicenseService } from './license'; +export { isAgentUpgradeable } from './is_agent_upgradeable'; diff --git a/x-pack/plugins/ingest_manager/common/services/is_agent_upgradeable.test.ts b/x-pack/plugins/ingest_manager/common/services/is_agent_upgradeable.test.ts new file mode 100644 index 0000000000000..cb087a3b8f805 --- /dev/null +++ b/x-pack/plugins/ingest_manager/common/services/is_agent_upgradeable.test.ts @@ -0,0 +1,100 @@ +/* + * 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 { isAgentUpgradeable } from './is_agent_upgradeable'; +import { Agent } from '../types/models/agent'; + +const getAgent = (version: string, upgradeable: boolean): Agent => { + const agent: Agent = { + id: 'de9006e1-54a7-4320-b24e-927e6fe518a8', + active: true, + policy_id: '63a284b0-0334-11eb-a4e0-09883c57114b', + type: 'PERMANENT', + enrolled_at: '2020-09-30T20:24:08.347Z', + user_provided_metadata: {}, + local_metadata: { + elastic: { + agent: { + id: 'de9006e1-54a7-4320-b24e-927e6fe518a8', + version, + snapshot: false, + 'build.original': + '8.0.0 (build: e2ef4fc375a5ece83d5d38f57b2977d7866b5819 at 2020-09-30 20:21:35 +0000 UTC)', + }, + }, + host: { + architecture: 'x86_64', + hostname: 'Sandras-MBP.fios-router.home', + name: 'Sandras-MBP.fios-router.home', + id: '1112D0AD-526D-5268-8E86-765D35A0F484', + ip: [ + '127.0.0.1/8', + '::1/128', + 'fe80::1/64', + 'fe80::aede:48ff:fe00:1122/64', + 'fe80::4fc:2526:7d51:19cc/64', + '192.168.1.161/24', + 'fe80::3083:5ff:fe30:4b00/64', + 'fe80::3083:5ff:fe30:4b00/64', + 'fe80::f7fb:518e:2c3c:7815/64', + 'fe80::2abd:20e3:9bc3:c054/64', + 'fe80::531a:20ab:1f38:7f9/64', + ], + mac: [ + 'a6:83:e7:b0:1a:d2', + 'ac:de:48:00:11:22', + 'a4:83:e7:b0:1a:d2', + '82:c5:c2:25:b0:01', + '82:c5:c2:25:b0:00', + '82:c5:c2:25:b0:05', + '82:c5:c2:25:b0:04', + '82:c5:c2:25:b0:01', + '06:83:e7:b0:1a:d2', + '32:83:05:30:4b:00', + '32:83:05:30:4b:00', + ], + }, + os: { + family: 'darwin', + kernel: '19.4.0', + platform: 'darwin', + version: '10.15.4', + name: 'Mac OS X', + full: 'Mac OS X(10.15.4)', + }, + }, + access_api_key_id: 'A_6v4HQBEEDXi-A9vxPE', + default_api_key_id: 'BP6v4HQBEEDXi-A95xMk', + policy_revision: 1, + packages: ['system'], + last_checkin: '2020-10-01T14:43:27.255Z', + current_error_events: [], + status: 'online', + }; + if (upgradeable) { + agent.local_metadata.elastic.agent.upgradeable = true; + } + return agent; +}; +describe('Ingest Manager - isAgentUpgradeable', () => { + it('returns false if agent reports not upgradeable with agent version < kibana version', () => { + expect(isAgentUpgradeable(getAgent('7.9.0', false), '8.0.0')).toBe(false); + }); + it('returns false if agent reports not upgradeable with agent version > kibana version', () => { + expect(isAgentUpgradeable(getAgent('8.0.0', false), '7.9.0')).toBe(false); + }); + it('returns false if agent reports not upgradeable with agent version === kibana version', () => { + expect(isAgentUpgradeable(getAgent('8.0.0', false), '8.0.0')).toBe(false); + }); + it('returns false if agent reports upgradeable, with agent version === kibana version', () => { + expect(isAgentUpgradeable(getAgent('8.0.0', true), '8.0.0')).toBe(false); + }); + it('returns false if agent reports upgradeable, with agent version > kibana version', () => { + expect(isAgentUpgradeable(getAgent('8.0.0', true), '7.9.0')).toBe(false); + }); + it('returns true if agent reports upgradeable, with agent version < kibana version', () => { + expect(isAgentUpgradeable(getAgent('7.9.0', true), '8.0.0')).toBe(true); + }); +}); diff --git a/x-pack/plugins/ingest_manager/common/services/is_agent_upgradeable.ts b/x-pack/plugins/ingest_manager/common/services/is_agent_upgradeable.ts new file mode 100644 index 0000000000000..5f96e108e6184 --- /dev/null +++ b/x-pack/plugins/ingest_manager/common/services/is_agent_upgradeable.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 semver from 'semver'; +import { Agent } from '../types'; + +export function isAgentUpgradeable(agent: Agent, kibanaVersion: string) { + let agentVersion: string; + if (typeof agent?.local_metadata?.elastic?.agent?.version === 'string') { + agentVersion = agent.local_metadata.elastic.agent.version; + } else { + return false; + } + const kibanaVersionParsed = semver.parse(kibanaVersion); + const agentVersionParsed = semver.parse(agentVersion); + if (!agentVersionParsed || !kibanaVersionParsed) return false; + if (!agent.local_metadata.elastic.agent.upgradeable) return false; + return semver.lt(agentVersionParsed, kibanaVersionParsed); +} diff --git a/x-pack/plugins/ingest_manager/common/services/routes.ts b/x-pack/plugins/ingest_manager/common/services/routes.ts index 3c3534926908a..c709794f2ce55 100644 --- a/x-pack/plugins/ingest_manager/common/services/routes.ts +++ b/x-pack/plugins/ingest_manager/common/services/routes.ts @@ -135,6 +135,9 @@ export const agentRouteService = { getReassignPath: (agentId: string) => AGENT_API_ROUTES.REASSIGN_PATTERN.replace('{agentId}', agentId), getBulkReassignPath: () => AGENT_API_ROUTES.BULK_REASSIGN_PATTERN, + getUpgradePath: (agentId: string) => + AGENT_API_ROUTES.UPGRADE_PATTERN.replace('{agentId}', agentId), + getBulkUpgradePath: () => AGENT_API_ROUTES.BULK_UPGRADE_PATTERN, getListPath: () => AGENT_API_ROUTES.LIST_PATTERN, getStatusPath: () => AGENT_API_ROUTES.STATUS_PATTERN, }; diff --git a/x-pack/plugins/ingest_manager/common/types/models/agent.ts b/x-pack/plugins/ingest_manager/common/types/models/agent.ts index 6ac783820ce82..215764939d3d1 100644 --- a/x-pack/plugins/ingest_manager/common/types/models/agent.ts +++ b/x-pack/plugins/ingest_manager/common/types/models/agent.ts @@ -19,7 +19,7 @@ export type AgentStatus = | 'warning' | 'enrolling' | 'unenrolling' - | 'upgrading' + | 'updating' | 'degraded'; export type AgentActionType = 'POLICY_CHANGE' | 'UNENROLL' | 'UPGRADE'; @@ -89,6 +89,7 @@ export interface NewAgentEvent { | 'STOPPING' | 'STOPPED' | 'DEGRADED' + | 'UPDATING' // Action results | 'DATA_DUMP' // Actions @@ -109,10 +110,8 @@ export interface AgentEvent extends NewAgentEvent { export type AgentEventSOAttributes = NewAgentEvent; -type MetadataValue = string | AgentMetadata; - export interface AgentMetadata { - [x: string]: MetadataValue; + [x: string]: any; } interface AgentBase { type: AgentType; @@ -129,7 +128,7 @@ interface AgentBase { policy_id?: string; policy_revision?: number | null; last_checkin?: string; - last_checkin_status?: 'error' | 'online' | 'degraded'; + last_checkin_status?: 'error' | 'online' | 'degraded' | 'updating'; user_provided_metadata: AgentMetadata; local_metadata: AgentMetadata; } diff --git a/x-pack/plugins/ingest_manager/common/types/rest_spec/agent.ts b/x-pack/plugins/ingest_manager/common/types/rest_spec/agent.ts index ab4c372c4e1d6..da7d126c4ecd3 100644 --- a/x-pack/plugins/ingest_manager/common/types/rest_spec/agent.ts +++ b/x-pack/plugins/ingest_manager/common/types/rest_spec/agent.ts @@ -20,6 +20,7 @@ export interface GetAgentsRequest { perPage: number; kuery?: string; showInactive: boolean; + showUpgradeable?: boolean; }; } @@ -113,22 +114,38 @@ export interface PostAgentUnenrollRequest { // eslint-disable-next-line @typescript-eslint/no-empty-interface export interface PostAgentUnenrollResponse {} +export interface PostBulkAgentUnenrollRequest { + body: { + agents: string[] | string; + force?: boolean; + }; +} + +// eslint-disable-next-line @typescript-eslint/no-empty-interface +export interface PostBulkAgentUnenrollResponse {} + export interface PostAgentUpgradeRequest { params: { agentId: string; }; + body: { + source_uri?: string; + version: string; + }; } -export interface PostBulkAgentUnenrollRequest { + +export interface PostBulkAgentUpgradeRequest { body: { agents: string[] | string; - force?: boolean; + source_uri?: string; + version: string; }; } +// eslint-disable-next-line @typescript-eslint/no-empty-interface +export interface PostBulkAgentUpgradeResponse {} // eslint-disable-next-line @typescript-eslint/no-empty-interface export interface PostAgentUpgradeResponse {} -// eslint-disable-next-line @typescript-eslint/no-empty-interface -export interface PostBulkAgentUnenrollResponse {} export interface PutAgentReassignRequest { params: { diff --git a/x-pack/plugins/ingest_manager/public/applications/ingest_manager/hooks/index.ts b/x-pack/plugins/ingest_manager/public/applications/ingest_manager/hooks/index.ts index 64434e163f043..29843f6a3e5b1 100644 --- a/x-pack/plugins/ingest_manager/public/applications/ingest_manager/hooks/index.ts +++ b/x-pack/plugins/ingest_manager/public/applications/ingest_manager/hooks/index.ts @@ -7,6 +7,7 @@ export { useCapabilities } from './use_capabilities'; export { useCore } from './use_core'; export { useConfig, ConfigContext } from './use_config'; +export { useKibanaVersion, KibanaVersionContext } from './use_kibana_version'; export { useSetupDeps, useStartDeps, DepsContext } from './use_deps'; export { licenseService, useLicense } from './use_license'; export { useBreadcrumbs } from './use_breadcrumbs'; diff --git a/x-pack/plugins/ingest_manager/public/applications/ingest_manager/hooks/use_kibana_version.ts b/x-pack/plugins/ingest_manager/public/applications/ingest_manager/hooks/use_kibana_version.ts new file mode 100644 index 0000000000000..a5113ca10d439 --- /dev/null +++ b/x-pack/plugins/ingest_manager/public/applications/ingest_manager/hooks/use_kibana_version.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; + * you may not use this file except in compliance with the Elastic License. + */ + +import React, { useContext } from 'react'; + +export const KibanaVersionContext = React.createContext(null); + +export function useKibanaVersion() { + const version = useContext(KibanaVersionContext); + if (version === null) { + throw new Error('KibanaVersionContext is not initialized'); + } + return version; +} diff --git a/x-pack/plugins/ingest_manager/public/applications/ingest_manager/hooks/use_request/agents.ts b/x-pack/plugins/ingest_manager/public/applications/ingest_manager/hooks/use_request/agents.ts index 41967fd068e0b..564e7b225cf45 100644 --- a/x-pack/plugins/ingest_manager/public/applications/ingest_manager/hooks/use_request/agents.ts +++ b/x-pack/plugins/ingest_manager/public/applications/ingest_manager/hooks/use_request/agents.ts @@ -22,6 +22,10 @@ import { GetAgentsResponse, GetAgentStatusRequest, GetAgentStatusResponse, + PostAgentUpgradeRequest, + PostBulkAgentUpgradeRequest, + PostAgentUpgradeResponse, + PostBulkAgentUpgradeResponse, } from '../../types'; type RequestOptions = Pick, 'pollIntervalMs'>; @@ -126,3 +130,28 @@ export function sendPostBulkAgentUnenroll( ...options, }); } + +export function sendPostAgentUpgrade( + agentId: string, + body: PostAgentUpgradeRequest['body'], + options?: RequestOptions +) { + return sendRequest({ + path: agentRouteService.getUpgradePath(agentId), + method: 'post', + body, + ...options, + }); +} + +export function sendPostBulkAgentUpgrade( + body: PostBulkAgentUpgradeRequest['body'], + options?: RequestOptions +) { + return sendRequest({ + path: agentRouteService.getBulkUpgradePath(), + method: 'post', + body, + ...options, + }); +} diff --git a/x-pack/plugins/ingest_manager/public/applications/ingest_manager/index.tsx b/x-pack/plugins/ingest_manager/public/applications/ingest_manager/index.tsx index 0bef3c20ddd1a..c61a290cf2470 100644 --- a/x-pack/plugins/ingest_manager/public/applications/ingest_manager/index.tsx +++ b/x-pack/plugins/ingest_manager/public/applications/ingest_manager/index.tsx @@ -30,6 +30,7 @@ import { sendSetup, sendGetPermissionsCheck, licenseService, + KibanaVersionContext, } from './hooks'; import { PackageInstallProvider } from './sections/epm/hooks'; import { FleetStatusProvider } from './hooks/use_fleet_status'; @@ -235,6 +236,7 @@ const IngestManagerApp = ({ startDeps, config, history, + kibanaVersion, }: { basepath: string; coreStart: CoreStart; @@ -242,6 +244,7 @@ const IngestManagerApp = ({ startDeps: IngestManagerStartDeps; config: IngestManagerConfigType; history: AppMountParameters['history']; + kibanaVersion: string; }) => { const isDarkMode = useObservable(coreStart.uiSettings.get$('theme:darkMode')); return ( @@ -249,9 +252,11 @@ const IngestManagerApp = ({ - - - + + + + + @@ -264,7 +269,8 @@ export function renderApp( { element, appBasePath, history }: AppMountParameters, setupDeps: IngestManagerSetupDeps, startDeps: IngestManagerStartDeps, - config: IngestManagerConfigType + config: IngestManagerConfigType, + kibanaVersion: string ) { ReactDOM.render( , element ); diff --git a/x-pack/plugins/ingest_manager/public/applications/ingest_manager/sections/fleet/agent_details_page/components/actions_menu.tsx b/x-pack/plugins/ingest_manager/public/applications/ingest_manager/sections/fleet/agent_details_page/components/actions_menu.tsx index ea5dcce8c05bb..9ed464401fdc6 100644 --- a/x-pack/plugins/ingest_manager/public/applications/ingest_manager/sections/fleet/agent_details_page/components/actions_menu.tsx +++ b/x-pack/plugins/ingest_manager/public/applications/ingest_manager/sections/fleet/agent_details_page/components/actions_menu.tsx @@ -7,10 +7,15 @@ import React, { memo, useState, useMemo } from 'react'; import { EuiPortal, EuiContextMenuItem } from '@elastic/eui'; import { FormattedMessage } from '@kbn/i18n/react'; import { Agent } from '../../../../types'; -import { useCapabilities } from '../../../../hooks'; +import { useCapabilities, useKibanaVersion } from '../../../../hooks'; import { ContextMenuActions } from '../../../../components'; -import { AgentUnenrollAgentModal, AgentReassignAgentPolicyFlyout } from '../../components'; +import { + AgentUnenrollAgentModal, + AgentReassignAgentPolicyFlyout, + AgentUpgradeAgentModal, +} from '../../components'; import { useAgentRefresh } from '../hooks'; +import { isAgentUpgradeable } from '../../../../services'; export const AgentDetailsActionMenu: React.FunctionComponent<{ agent: Agent; @@ -18,9 +23,11 @@ export const AgentDetailsActionMenu: React.FunctionComponent<{ onCancelReassign?: () => void; }> = memo(({ agent, assignFlyoutOpenByDefault = false, onCancelReassign }) => { const hasWriteCapabilites = useCapabilities().write; + const kibanaVersion = useKibanaVersion(); const refreshAgent = useAgentRefresh(); const [isReassignFlyoutOpen, setIsReassignFlyoutOpen] = useState(assignFlyoutOpenByDefault); const [isUnenrollModalOpen, setIsUnenrollModalOpen] = useState(false); + const [isUpgradeModalOpen, setIsUpgradeModalOpen] = useState(false); const isUnenrolling = agent.status === 'unenrolling'; const onClose = useMemo(() => { @@ -51,6 +58,19 @@ export const AgentDetailsActionMenu: React.FunctionComponent<{ /> )} + {isUpgradeModalOpen && ( + + { + setIsUpgradeModalOpen(false); + refreshAgent(); + }} + /> + + )} )} , + { + setIsUpgradeModalOpen(true); + }} + > + + , ]} /> diff --git a/x-pack/plugins/ingest_manager/public/applications/ingest_manager/sections/fleet/agent_details_page/components/agent_details.tsx b/x-pack/plugins/ingest_manager/public/applications/ingest_manager/sections/fleet/agent_details_page/components/agent_details.tsx index 68abb43abac18..2493fda3317d2 100644 --- a/x-pack/plugins/ingest_manager/public/applications/ingest_manager/sections/fleet/agent_details_page/components/agent_details.tsx +++ b/x-pack/plugins/ingest_manager/public/applications/ingest_manager/sections/fleet/agent_details_page/components/agent_details.tsx @@ -13,15 +13,20 @@ import { EuiLink, } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; +import { EuiText } from '@elastic/eui'; +import { EuiIcon } from '@elastic/eui'; +import { FormattedMessage } from '@kbn/i18n/react'; import { Agent, AgentPolicy } from '../../../../types'; -import { useLink } from '../../../../hooks'; +import { useKibanaVersion, useLink } from '../../../../hooks'; import { AgentHealth } from '../../components'; +import { isAgentUpgradeable } from '../../../../services'; export const AgentDetailsContent: React.FunctionComponent<{ agent: Agent; agentPolicy?: AgentPolicy; }> = memo(({ agent, agentPolicy }) => { const { getHref } = useLink(); + const kibanaVersion = useKibanaVersion(); return ( {[ @@ -69,8 +74,39 @@ export const AgentDetailsContent: React.FunctionComponent<{ description: typeof agent.local_metadata.elastic === 'object' && typeof agent.local_metadata.elastic.agent === 'object' && - typeof agent.local_metadata.elastic.agent.version === 'string' - ? agent.local_metadata.elastic.agent.version + typeof agent.local_metadata.elastic.agent.version === 'string' ? ( + + + {agent.local_metadata.elastic.agent.version} + + {isAgentUpgradeable(agent, kibanaVersion) ? ( + + + +   + + + + ) : null} + + ) : ( + '-' + ), + }, + { + title: i18n.translate('xpack.ingestManager.agentDetails.releaseLabel', { + defaultMessage: 'Agent release', + }), + description: + typeof agent.local_metadata.elastic === 'object' && + typeof agent.local_metadata.elastic.agent === 'object' && + typeof agent.local_metadata.elastic.agent.snapshot === 'boolean' + ? agent.local_metadata.elastic.agent.snapshot === true + ? 'snapshot' + : 'stable' : '-', }, { diff --git a/x-pack/plugins/ingest_manager/public/applications/ingest_manager/sections/fleet/agent_details_page/components/type_labels.tsx b/x-pack/plugins/ingest_manager/public/applications/ingest_manager/sections/fleet/agent_details_page/components/type_labels.tsx index 56af9519bc1da..f597b9c72ab02 100644 --- a/x-pack/plugins/ingest_manager/public/applications/ingest_manager/sections/fleet/agent_details_page/components/type_labels.tsx +++ b/x-pack/plugins/ingest_manager/public/applications/ingest_manager/sections/fleet/agent_details_page/components/type_labels.tsx @@ -119,6 +119,14 @@ export const SUBTYPE_LABEL: { [key in AgentEvent['subtype']]: JSX.Element } = { /> ), + UPDATING: ( + + + + ), UNKNOWN: ( { params: { agentId, tabId = '' }, } = useRouteMatch<{ agentId: string; tabId?: string }>(); const { getHref } = useLink(); + const kibanaVersion = useKibanaVersion(); const { isLoading, isInitialRequest, @@ -144,6 +148,45 @@ export const AgentDetailsPage: React.FunctionComponent = () => { ), }, { isDivider: true }, + { + label: i18n.translate('xpack.ingestManager.agentDetails.agentVersionLabel', { + defaultMessage: 'Agent version', + }), + content: + typeof agentData.item.local_metadata.elastic === 'object' && + typeof agentData.item.local_metadata.elastic.agent === 'object' && + typeof agentData.item.local_metadata.elastic.agent.version === 'string' ? ( + + + {agentData.item.local_metadata.elastic.agent.version} + + {isAgentUpgradeable(agentData.item, kibanaVersion) ? ( + + + + ) : null} + + ) : ( + '-' + ), + }, + { isDivider: true }, { content: ( { + const kibanaVersion = useKibanaVersion(); // Bulk actions menu states const [isMenuOpen, setIsMenuOpen] = useState(false); const closeMenu = () => setIsMenuOpen(false); @@ -67,6 +73,7 @@ export const AgentBulkActions: React.FunctionComponent<{ // Actions states const [isReassignFlyoutOpen, setIsReassignFlyoutOpen] = useState(false); const [isUnenrollModalOpen, setIsUnenrollModalOpen] = useState(false); + const [isUpgradeModalOpen, setIsUpgradeModalOpen] = useState(false); // Check if user is working with only inactive agents const atLeastOneActiveAgentSelected = @@ -106,6 +113,20 @@ export const AgentBulkActions: React.FunctionComponent<{ setIsUnenrollModalOpen(true); }, }, + { + name: ( + + ), + icon: , + disabled: !atLeastOneActiveAgentSelected, + onClick: () => { + closeMenu(); + setIsUpgradeModalOpen(true); + }, + }, { name: ( )} + {isUpgradeModalOpen && ( + + { + setIsUpgradeModalOpen(false); + refreshAgents(); + }} + /> + + )} diff --git a/x-pack/plugins/ingest_manager/public/applications/ingest_manager/sections/fleet/agent_list_page/index.tsx b/x-pack/plugins/ingest_manager/public/applications/ingest_manager/sections/fleet/agent_list_page/index.tsx index 0bc463ce98590..83cbb9ccb728c 100644 --- a/x-pack/plugins/ingest_manager/public/applications/ingest_manager/sections/fleet/agent_list_page/index.tsx +++ b/x-pack/plugins/ingest_manager/public/applications/ingest_manager/sections/fleet/agent_list_page/index.tsx @@ -35,14 +35,16 @@ import { useLink, useBreadcrumbs, useLicense, + useKibanaVersion, } from '../../../hooks'; import { SearchBar, ContextMenuActions } from '../../../components'; -import { AgentStatusKueryHelper } from '../../../services'; +import { AgentStatusKueryHelper, isAgentUpgradeable } from '../../../services'; import { AGENT_SAVED_OBJECT_TYPE } from '../../../constants'; import { AgentReassignAgentPolicyFlyout, AgentHealth, AgentUnenrollAgentModal, + AgentUpgradeAgentModal, } from '../components'; import { AgentBulkActions, SelectionMode } from './components/bulk_actions'; @@ -68,6 +70,12 @@ const statusFilters = [ defaultMessage: 'Error', }), }, + { + status: 'updating', + label: i18n.translate('xpack.ingestManager.agentList.statusUpdatingFilterText', { + defaultMessage: 'Updating', + }), + }, ] as Array<{ label: string; status: string }>; const RowActions = React.memo<{ @@ -75,11 +83,13 @@ const RowActions = React.memo<{ refresh: () => void; onReassignClick: () => void; onUnenrollClick: () => void; -}>(({ agent, refresh, onReassignClick, onUnenrollClick }) => { + onUpgradeClick: () => void; +}>(({ agent, refresh, onReassignClick, onUnenrollClick, onUpgradeClick }) => { const { getHref } = useLink(); const hasWriteCapabilites = useCapabilities().write; const isUnenrolling = agent.status === 'unenrolling'; + const kibanaVersion = useKibanaVersion(); const [isMenuOpen, setIsMenuOpen] = useState(false); return ( )} , + { + onUpgradeClick(); + }} + > + + , ]} /> ); @@ -146,10 +168,11 @@ export const AgentListPage: React.FunctionComponent<{}> = () => { const defaultKuery: string = (useUrlParams().urlParams.kuery as string) || ''; const hasWriteCapabilites = useCapabilities().write; const isGoldPlus = useLicense().isGoldPlus(); + const kibanaVersion = useKibanaVersion(); // Agent data states const [showInactive, setShowInactive] = useState(false); - + const [showUpgradeable, setShowUpgradeable] = useState(false); // Table and search states const [search, setSearch] = useState(defaultKuery); const [selectionMode, setSelectionMode] = useState('manual'); @@ -189,6 +212,7 @@ export const AgentListPage: React.FunctionComponent<{}> = () => { // Agent actions states const [agentToReassign, setAgentToReassign] = useState(undefined); const [agentToUnenroll, setAgentToUnenroll] = useState(undefined); + const [agentToUpgrade, setAgentToUpgrade] = useState(undefined); let kuery = search.trim(); if (selectedAgentPolicies.length) { @@ -199,7 +223,6 @@ export const AgentListPage: React.FunctionComponent<{}> = () => { .map((agentPolicy) => `"${agentPolicy}"`) .join(' or ')})`; } - if (selectedStatus.length) { const kueryStatus = selectedStatus .map((status) => { @@ -208,6 +231,8 @@ export const AgentListPage: React.FunctionComponent<{}> = () => { return AgentStatusKueryHelper.buildKueryForOnlineAgents(); case 'offline': return AgentStatusKueryHelper.buildKueryForOfflineAgents(); + case 'updating': + return AgentStatusKueryHelper.buildKueryForUpdatingAgents(); case 'error': return AgentStatusKueryHelper.buildKueryForErrorAgents(); } @@ -229,6 +254,7 @@ export const AgentListPage: React.FunctionComponent<{}> = () => { perPage: pagination.pageSize, kuery: kuery && kuery !== '' ? kuery : undefined, showInactive, + showUpgradeable, }, { pollIntervalMs: REFRESH_INTERVAL_MS, @@ -329,11 +355,29 @@ export const AgentListPage: React.FunctionComponent<{}> = () => { }, { field: 'local_metadata.elastic.agent.version', - width: '100px', + width: '200px', name: i18n.translate('xpack.ingestManager.agentList.versionTitle', { defaultMessage: 'Version', }), - render: (version: string, agent: Agent) => safeMetadata(version), + render: (version: string, agent: Agent) => ( + + + {safeMetadata(version)} + + {isAgentUpgradeable(agent, kibanaVersion) ? ( + + + +   + + + + ) : null} + + ), }, { field: 'last_checkin', @@ -356,6 +400,7 @@ export const AgentListPage: React.FunctionComponent<{}> = () => { refresh={() => agentsRequest.resendRequest()} onReassignClick={() => setAgentToReassign(agent)} onUnenrollClick={() => setAgentToUnenroll(agent)} + onUpgradeClick={() => setAgentToUpgrade(agent)} /> ); }, @@ -421,6 +466,20 @@ export const AgentListPage: React.FunctionComponent<{}> = () => { )} + {agentToUpgrade && ( + + { + setAgentToUpgrade(undefined); + agentsRequest.resendRequest(); + }} + version={kibanaVersion} + /> + + )} + {/* Search and filter bar */} @@ -519,13 +578,24 @@ export const AgentListPage: React.FunctionComponent<{}> = () => { ))}
+ { + setShowUpgradeable(!showUpgradeable); + }} + > + + setShowInactive(!showInactive)} > diff --git a/x-pack/plugins/ingest_manager/public/applications/ingest_manager/sections/fleet/components/agent_health.tsx b/x-pack/plugins/ingest_manager/public/applications/ingest_manager/sections/fleet/components/agent_health.tsx index 7c6c95cab420f..a16d4e7347ad1 100644 --- a/x-pack/plugins/ingest_manager/public/applications/ingest_manager/sections/fleet/components/agent_health.tsx +++ b/x-pack/plugins/ingest_manager/public/applications/ingest_manager/sections/fleet/components/agent_health.tsx @@ -77,6 +77,14 @@ const Status = { /> ), + Upgrading: ( + + + + ), }; function getStatusComponent(agent: Agent): React.ReactElement { @@ -95,6 +103,8 @@ function getStatusComponent(agent: Agent): React.ReactElement { return Status.Unenrolling; case 'enrolling': return Status.Enrolling; + case 'updating': + return Status.Upgrading; default: return Status.Online; } diff --git a/x-pack/plugins/ingest_manager/public/applications/ingest_manager/sections/fleet/components/agent_upgrade_modal/index.tsx b/x-pack/plugins/ingest_manager/public/applications/ingest_manager/sections/fleet/components/agent_upgrade_modal/index.tsx new file mode 100644 index 0000000000000..a59f503d2994b --- /dev/null +++ b/x-pack/plugins/ingest_manager/public/applications/ingest_manager/sections/fleet/components/agent_upgrade_modal/index.tsx @@ -0,0 +1,126 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ +import React, { useState } from 'react'; +import { i18n } from '@kbn/i18n'; +import { EuiConfirmModal, EuiOverlayMask } from '@elastic/eui'; +import { FormattedMessage } from '@kbn/i18n/react'; +import { Agent } from '../../../../types'; +import { sendPostAgentUpgrade, sendPostBulkAgentUpgrade, useCore } from '../../../../hooks'; + +interface Props { + onClose: () => void; + agents: Agent[] | string; + agentCount: number; + version: string; +} + +export const AgentUpgradeAgentModal: React.FunctionComponent = ({ + onClose, + agents, + agentCount, + version, +}) => { + const { notifications } = useCore(); + const [isSubmitting, setIsSubmitting] = useState(false); + const isSingleAgent = Array.isArray(agents) && agents.length === 1; + async function onSubmit() { + try { + setIsSubmitting(true); + const { error } = isSingleAgent + ? await sendPostAgentUpgrade((agents[0] as Agent).id, { + version, + }) + : await sendPostBulkAgentUpgrade({ + agents: Array.isArray(agents) ? agents.map((agent) => agent.id) : agents, + version, + }); + if (error) { + throw error; + } + setIsSubmitting(false); + const successMessage = isSingleAgent + ? i18n.translate('xpack.ingestManager.upgradeAgents.successSingleNotificationTitle', { + defaultMessage: 'Upgrading agent', + }) + : i18n.translate('xpack.ingestManager.upgradeAgents.successMultiNotificationTitle', { + defaultMessage: 'Upgrading agents', + }); + notifications.toasts.addSuccess(successMessage); + onClose(); + } catch (error) { + setIsSubmitting(false); + notifications.toasts.addError(error, { + title: i18n.translate('xpack.ingestManager.upgradeAgents.fatalErrorNotificationTitle', { + defaultMessage: 'Error upgrading {count, plural, one {agent} other {agents}}', + values: { count: agentCount }, + }), + }); + } + } + + return ( + + + ) : ( + + ) + } + onCancel={onClose} + onConfirm={onSubmit} + cancelButtonText={ + + } + confirmButtonDisabled={isSubmitting} + confirmButtonText={ + isSingleAgent ? ( + + ) : ( + + ) + } + > +

+ {isSingleAgent ? ( + + ) : ( + + )} +

+
+
+ ); +}; diff --git a/x-pack/plugins/ingest_manager/public/applications/ingest_manager/sections/fleet/components/index.tsx b/x-pack/plugins/ingest_manager/public/applications/ingest_manager/sections/fleet/components/index.tsx index eea4ed3b712b1..3dd04b4f5b0b7 100644 --- a/x-pack/plugins/ingest_manager/public/applications/ingest_manager/sections/fleet/components/index.tsx +++ b/x-pack/plugins/ingest_manager/public/applications/ingest_manager/sections/fleet/components/index.tsx @@ -9,3 +9,4 @@ export * from './agent_reassign_policy_flyout'; export * from './agent_enrollment_flyout'; export * from './agent_health'; export * from './agent_unenroll_modal'; +export * from './agent_upgrade_modal'; diff --git a/x-pack/plugins/ingest_manager/public/applications/ingest_manager/services/index.ts b/x-pack/plugins/ingest_manager/public/applications/ingest_manager/services/index.ts index ed6ba5c891a0b..ee976d40402cc 100644 --- a/x-pack/plugins/ingest_manager/public/applications/ingest_manager/services/index.ts +++ b/x-pack/plugins/ingest_manager/public/applications/ingest_manager/services/index.ts @@ -26,4 +26,5 @@ export { doesAgentPolicyAlreadyIncludePackage, isValidNamespace, LicenseService, + isAgentUpgradeable, } from '../../../../common'; diff --git a/x-pack/plugins/ingest_manager/public/applications/ingest_manager/types/index.ts b/x-pack/plugins/ingest_manager/public/applications/ingest_manager/types/index.ts index e825448f359d6..386ffa5649cc2 100644 --- a/x-pack/plugins/ingest_manager/public/applications/ingest_manager/types/index.ts +++ b/x-pack/plugins/ingest_manager/public/applications/ingest_manager/types/index.ts @@ -53,6 +53,10 @@ export { PostAgentUnenrollResponse, PostBulkAgentUnenrollRequest, PostBulkAgentUnenrollResponse, + PostAgentUpgradeRequest, + PostBulkAgentUpgradeRequest, + PostAgentUpgradeResponse, + PostBulkAgentUpgradeResponse, GetOneAgentEventsRequest, GetOneAgentEventsResponse, GetAgentStatusRequest, diff --git a/x-pack/plugins/ingest_manager/public/plugin.ts b/x-pack/plugins/ingest_manager/public/plugin.ts index 59741ce79dd8b..cb1d59b698f0a 100644 --- a/x-pack/plugins/ingest_manager/public/plugin.ts +++ b/x-pack/plugins/ingest_manager/public/plugin.ts @@ -60,13 +60,16 @@ export class IngestManagerPlugin implements Plugin { private config: IngestManagerConfigType; + private kibanaVersion: string; constructor(private readonly initializerContext: PluginInitializerContext) { this.config = this.initializerContext.config.get(); + this.kibanaVersion = initializerContext.env.packageInfo.version; } public setup(core: CoreSetup, deps: IngestManagerSetupDeps) { const config = this.config; + const kibanaVersion = this.kibanaVersion; // Set up http client setHttpClient(core.http); @@ -88,7 +91,7 @@ export class IngestManagerPlugin IngestManagerStart ]; const { renderApp, teardownIngestManager } = await import('./applications/ingest_manager'); - const unmount = renderApp(coreStart, params, deps, startDeps, config); + const unmount = renderApp(coreStart, params, deps, startDeps, config, kibanaVersion); return () => { unmount(); diff --git a/x-pack/plugins/ingest_manager/server/routes/agent/handlers.ts b/x-pack/plugins/ingest_manager/server/routes/agent/handlers.ts index fb867af513fdc..5e075cbbcdf5e 100644 --- a/x-pack/plugins/ingest_manager/server/routes/agent/handlers.ts +++ b/x-pack/plugins/ingest_manager/server/routes/agent/handlers.ts @@ -239,6 +239,7 @@ export const getAgentsHandler: RequestHandler< page: request.query.page, perPage: request.query.perPage, showInactive: request.query.showInactive, + showUpgradeable: request.query.showUpgradeable, kuery: request.query.kuery, }); const totalInactive = request.query.showInactive diff --git a/x-pack/plugins/ingest_manager/server/routes/agent/index.ts b/x-pack/plugins/ingest_manager/server/routes/agent/index.ts index 73ed276ba02e7..12116d3f037e0 100644 --- a/x-pack/plugins/ingest_manager/server/routes/agent/index.ts +++ b/x-pack/plugins/ingest_manager/server/routes/agent/index.ts @@ -30,6 +30,7 @@ import { PostBulkAgentReassignRequestSchema, PostAgentEnrollRequestBodyJSONSchema, PostAgentUpgradeRequestSchema, + PostBulkAgentUpgradeRequestSchema, } from '../../types'; import { getAgentsHandler, @@ -49,7 +50,7 @@ import { postNewAgentActionHandlerBuilder } from './actions_handlers'; import { appContextService } from '../../services'; import { postAgentUnenrollHandler, postBulkAgentsUnenrollHandler } from './unenroll_handler'; import { IngestManagerConfigType } from '../..'; -import { postAgentUpgradeHandler } from './upgrade_handler'; +import { postAgentUpgradeHandler, postBulkAgentsUpgradeHandler } from './upgrade_handler'; const ajv = new Ajv({ coerceTypes: true, @@ -226,6 +227,15 @@ export const registerRoutes = (router: IRouter, config: IngestManagerConfigType) }, postAgentUpgradeHandler ); + // bulk upgrade + router.post( + { + path: AGENT_API_ROUTES.BULK_UPGRADE_PATTERN, + validate: PostBulkAgentUpgradeRequestSchema, + options: { tags: [`access:${PLUGIN_ID}-all`] }, + }, + postBulkAgentsUpgradeHandler + ); // Bulk reassign router.post( { diff --git a/x-pack/plugins/ingest_manager/server/routes/agent/upgrade_handler.ts b/x-pack/plugins/ingest_manager/server/routes/agent/upgrade_handler.ts index e5d7a44c00768..c4aa33999cf22 100644 --- a/x-pack/plugins/ingest_manager/server/routes/agent/upgrade_handler.ts +++ b/x-pack/plugins/ingest_manager/server/routes/agent/upgrade_handler.ts @@ -6,11 +6,16 @@ import { RequestHandler } from 'src/core/server'; import { TypeOf } from '@kbn/config-schema'; -import { PostAgentUpgradeResponse } from '../../../common/types'; -import { PostAgentUpgradeRequestSchema } from '../../types'; +import { + AgentSOAttributes, + PostAgentUpgradeResponse, + PostBulkAgentUpgradeResponse, +} from '../../../common/types'; +import { PostAgentUpgradeRequestSchema, PostBulkAgentUpgradeRequestSchema } from '../../types'; import * as AgentService from '../../services/agents'; import { appContextService } from '../../services'; import { defaultIngestErrorHandler } from '../../errors'; +import { AGENT_SAVED_OBJECT_TYPE } from '../../constants'; export const postAgentUpgradeHandler: RequestHandler< TypeOf, @@ -30,6 +35,18 @@ export const postAgentUpgradeHandler: RequestHandler< }, }); } + const agent = await soClient.get( + AGENT_SAVED_OBJECT_TYPE, + request.params.agentId + ); + if (agent.attributes.unenrollment_started_at || agent.attributes.unenrolled_at) { + return response.customError({ + statusCode: 400, + body: { + message: `cannot upgrade an unenrolling or unenrolled agent`, + }, + }); + } try { await AgentService.sendUpgradeAgentAction({ @@ -45,3 +62,44 @@ export const postAgentUpgradeHandler: RequestHandler< return defaultIngestErrorHandler({ error, response }); } }; + +export const postBulkAgentsUpgradeHandler: RequestHandler< + undefined, + undefined, + TypeOf +> = async (context, request, response) => { + const soClient = context.core.savedObjects.client; + const { version, source_uri: sourceUri, agents } = request.body; + + // temporarily only allow upgrading to the same version as the installed kibana version + const kibanaVersion = appContextService.getKibanaVersion(); + if (kibanaVersion !== version) { + return response.customError({ + statusCode: 400, + body: { + message: `cannot upgrade agent to ${version} because it is different than the installed kibana version ${kibanaVersion}`, + }, + }); + } + + try { + if (Array.isArray(agents)) { + await AgentService.sendUpgradeAgentsActions(soClient, { + agentIds: agents, + sourceUri, + version, + }); + } else { + await AgentService.sendUpgradeAgentsActions(soClient, { + kuery: agents, + sourceUri, + version, + }); + } + + const body: PostBulkAgentUpgradeResponse = {}; + return response.ok({ body }); + } catch (error) { + return defaultIngestErrorHandler({ error, response }); + } +}; diff --git a/x-pack/plugins/ingest_manager/server/saved_objects/index.ts b/x-pack/plugins/ingest_manager/server/saved_objects/index.ts index 95433f896b9a3..34dee7f47399e 100644 --- a/x-pack/plugins/ingest_manager/server/saved_objects/index.ts +++ b/x-pack/plugins/ingest_manager/server/saved_objects/index.ts @@ -370,6 +370,8 @@ export function registerEncryptedSavedObjects( 'unenrolled_at', 'unenrollment_started_at', 'packages', + 'upgraded_at', + 'upgrade_started_at', ]), }); encryptedSavedObjects.registerType({ diff --git a/x-pack/plugins/ingest_manager/server/services/agents/crud.ts b/x-pack/plugins/ingest_manager/server/services/agents/crud.ts index c941b0512e597..90db6c4b17713 100644 --- a/x-pack/plugins/ingest_manager/server/services/agents/crud.ts +++ b/x-pack/plugins/ingest_manager/server/services/agents/crud.ts @@ -5,10 +5,12 @@ */ import Boom from 'boom'; import { SavedObjectsClientContract } from 'src/core/server'; +import { isAgentUpgradeable } from '../../../common'; import { AGENT_SAVED_OBJECT_TYPE, AGENT_EVENT_SAVED_OBJECT_TYPE } from '../../constants'; import { AgentSOAttributes, Agent, AgentEventSOAttributes, ListWithKuery } from '../../types'; import { escapeSearchQueryPhrase, normalizeKuery, findAllSOs } from '../saved_object'; import { savedObjectToAgent } from './saved_objects'; +import { appContextService } from '../../services'; const ACTIVE_AGENT_CONDITION = `${AGENT_SAVED_OBJECT_TYPE}.attributes.active:true`; const INACTIVE_AGENT_CONDITION = `NOT (${ACTIVE_AGENT_CONDITION})`; @@ -41,6 +43,7 @@ export async function listAgents( sortOrder = 'desc', kuery, showInactive = false, + showUpgradeable, } = options; const filters = []; @@ -52,7 +55,7 @@ export async function listAgents( filters.push(ACTIVE_AGENT_CONDITION); } - const { saved_objects: agentSOs, total } = await soClient.find({ + let { saved_objects: agentSOs, total } = await soClient.find({ type: AGENT_SAVED_OBJECT_TYPE, filter: _joinFilters(filters), sortField, @@ -60,6 +63,14 @@ export async function listAgents( page, perPage, }); + // filtering for a range on the version string will not work, + // nor does filtering on a flattened field (local_metadata), so filter here + if (showUpgradeable) { + agentSOs = agentSOs.filter((agent) => + isAgentUpgradeable(savedObjectToAgent(agent), appContextService.getKibanaVersion()) + ); + total = agentSOs.length; + } return { agents: agentSOs.map(savedObjectToAgent), diff --git a/x-pack/plugins/ingest_manager/server/services/agents/upgrade.ts b/x-pack/plugins/ingest_manager/server/services/agents/upgrade.ts index cee3bc69f25db..612ebf9c11ab3 100644 --- a/x-pack/plugins/ingest_manager/server/services/agents/upgrade.ts +++ b/x-pack/plugins/ingest_manager/server/services/agents/upgrade.ts @@ -7,7 +7,8 @@ import { SavedObjectsClientContract } from 'src/core/server'; import { AgentSOAttributes, AgentAction, AgentActionSOAttributes } from '../../types'; import { AGENT_ACTION_SAVED_OBJECT_TYPE, AGENT_SAVED_OBJECT_TYPE } from '../../constants'; -import { createAgentAction } from './actions'; +import { bulkCreateAgentActions, createAgentAction } from './actions'; +import { getAgents, listAllAgents } from './crud'; export async function sendUpgradeAgentAction({ soClient, @@ -18,7 +19,7 @@ export async function sendUpgradeAgentAction({ soClient: SavedObjectsClientContract; agentId: string; version: string; - sourceUri: string; + sourceUri: string | undefined; }) { const now = new Date().toISOString(); const data = { @@ -50,12 +51,62 @@ export async function ackAgentUpgraded( if (!version) throw new Error('version missing from UPGRADE action'); await soClient.update(AGENT_SAVED_OBJECT_TYPE, agentAction.agent_id, { upgraded_at: new Date().toISOString(), - local_metadata: { - elastic: { - agent: { - version, - }, - }, - }, + upgrade_started_at: undefined, }); } + +export async function sendUpgradeAgentsActions( + soClient: SavedObjectsClientContract, + options: + | { + agentIds: string[]; + sourceUri: string | undefined; + version: string; + } + | { + kuery: string; + sourceUri: string | undefined; + version: string; + } +) { + // Filter out agents currently unenrolling, agents unenrolled + const agents = + 'agentIds' in options + ? await getAgents(soClient, options.agentIds) + : ( + await listAllAgents(soClient, { + kuery: options.kuery, + showInactive: false, + }) + ).agents; + const agentsToUpdate = agents.filter( + (agent) => !agent.unenrollment_started_at && !agent.unenrolled_at + ); + const now = new Date().toISOString(); + const data = { + version: options.version, + source_uri: options.sourceUri, + }; + // Create upgrade action for each agent + await bulkCreateAgentActions( + soClient, + agentsToUpdate.map((agent) => ({ + agent_id: agent.id, + created_at: now, + data, + ack_data: data, + type: 'UPGRADE', + })) + ); + + return await soClient.bulkUpdate( + agentsToUpdate.map((agent) => ({ + type: AGENT_SAVED_OBJECT_TYPE, + id: agent.id, + attributes: { + upgraded_at: undefined, + upgrade_started_at: now, + }, + })) + ); +} diff --git a/x-pack/plugins/ingest_manager/server/types/models/agent.ts b/x-pack/plugins/ingest_manager/server/types/models/agent.ts index 87e9257b7189c..24ac1970cb225 100644 --- a/x-pack/plugins/ingest_manager/server/types/models/agent.ts +++ b/x-pack/plugins/ingest_manager/server/types/models/agent.ts @@ -31,6 +31,7 @@ const AgentEventBase = { schema.literal('STOPPING'), schema.literal('STOPPED'), schema.literal('DEGRADED'), + schema.literal('UPDATING'), ]), // Action results schema.literal('DATA_DUMP'), diff --git a/x-pack/plugins/ingest_manager/server/types/rest_spec/agent.ts b/x-pack/plugins/ingest_manager/server/types/rest_spec/agent.ts index 3866ef095563e..4fd1f3f3e1573 100644 --- a/x-pack/plugins/ingest_manager/server/types/rest_spec/agent.ts +++ b/x-pack/plugins/ingest_manager/server/types/rest_spec/agent.ts @@ -13,6 +13,7 @@ export const GetAgentsRequestSchema = { perPage: schema.number({ defaultValue: 20 }), kuery: schema.maybe(schema.string()), showInactive: schema.boolean({ defaultValue: false }), + showUpgradeable: schema.boolean({ defaultValue: false }), }), }; @@ -58,6 +59,7 @@ export const PostAgentCheckinRequestBodyJSONSchema = { 'DEGRADED', 'DATA_DUMP', 'ACKNOWLEDGED', + 'UPDATING', 'UNKNOWN', ], }, @@ -172,20 +174,28 @@ export const PostAgentUnenrollRequestSchema = { ), }; +export const PostBulkAgentUnenrollRequestSchema = { + body: schema.object({ + agents: schema.oneOf([schema.arrayOf(schema.string()), schema.string()]), + force: schema.maybe(schema.boolean()), + }), +}; + export const PostAgentUpgradeRequestSchema = { params: schema.object({ agentId: schema.string(), }), body: schema.object({ - source_uri: schema.string(), + source_uri: schema.maybe(schema.string()), version: schema.string(), }), }; -export const PostBulkAgentUnenrollRequestSchema = { +export const PostBulkAgentUpgradeRequestSchema = { body: schema.object({ agents: schema.oneOf([schema.arrayOf(schema.string()), schema.string()]), - force: schema.maybe(schema.boolean()), + source_uri: schema.maybe(schema.string()), + version: schema.string(), }), }; diff --git a/x-pack/plugins/ingest_manager/server/types/rest_spec/common.ts b/x-pack/plugins/ingest_manager/server/types/rest_spec/common.ts index dc0f111680490..cdb23da5b6b11 100644 --- a/x-pack/plugins/ingest_manager/server/types/rest_spec/common.ts +++ b/x-pack/plugins/ingest_manager/server/types/rest_spec/common.ts @@ -10,6 +10,7 @@ export const ListWithKuerySchema = schema.object({ perPage: schema.maybe(schema.number({ defaultValue: 20 })), sortField: schema.maybe(schema.string()), sortOrder: schema.maybe(schema.oneOf([schema.literal('desc'), schema.literal('asc')])), + showUpgradeable: schema.maybe(schema.boolean()), kuery: schema.maybe(schema.string()), }); diff --git a/x-pack/test/ingest_manager_api_integration/apis/fleet/agents/acks.ts b/x-pack/test/ingest_manager_api_integration/apis/fleet/agents/acks.ts index 360b91203dfc8..b119e6d58dc35 100644 --- a/x-pack/test/ingest_manager_api_integration/apis/fleet/agents/acks.ts +++ b/x-pack/test/ingest_manager_api_integration/apis/fleet/agents/acks.ts @@ -218,7 +218,7 @@ export default function (providerContext: FtrProviderContext) { .send({ action: { type: 'UPGRADE', - ack_data: { version: '8.0.0', source_uri: 'http://localhost:8000' }, + ack_data: { version: '8.0.0' }, }, }) .expect(200); diff --git a/x-pack/test/ingest_manager_api_integration/apis/fleet/agents/upgrade.ts b/x-pack/test/ingest_manager_api_integration/apis/fleet/agents/upgrade.ts index a783f806c03ee..04e32b2b80f56 100644 --- a/x-pack/test/ingest_manager_api_integration/apis/fleet/agents/upgrade.ts +++ b/x-pack/test/ingest_manager_api_integration/apis/fleet/agents/upgrade.ts @@ -5,9 +5,11 @@ */ import expect from '@kbn/expect/expect.js'; +import semver from 'semver'; import { FtrProviderContext } from '../../../../api_integration/ftr_provider_context'; import { setupIngest } from './services'; import { skipIfNoDockerRegistry } from '../../../helpers'; +import { AGENT_SAVED_OBJECT_TYPE } from '../../../../../plugins/ingest_manager/common'; export default function (providerContext: FtrProviderContext) { const { getService } = providerContext; @@ -18,16 +20,15 @@ export default function (providerContext: FtrProviderContext) { describe('fleet upgrade agent', () => { skipIfNoDockerRegistry(providerContext); setupIngest(providerContext); - before(async () => { + beforeEach(async () => { await esArchiver.loadIfNeeded('fleet/agents'); }); - after(async () => { + afterEach(async () => { await esArchiver.unload('fleet/agents'); }); it('should respond 200 to upgrade agent and update the agent SO', async () => { - const kibanaVersionAccessor = kibanaServer.version; - const kibanaVersion = await kibanaVersionAccessor.get(); + const kibanaVersion = await kibanaServer.version.get(); await supertest .post(`/api/ingest_manager/fleet/agents/agent1/upgrade`) .set('kbn-xsrf', 'xxx') @@ -36,22 +37,150 @@ export default function (providerContext: FtrProviderContext) { source_uri: 'http://path/to/download', }) .expect(200); - const res = await kibanaServer.savedObjects.get({ - type: 'fleet-agents', - id: 'agent1', - }); - expect(res.attributes.upgrade_started_at).to.be.ok(); + + const res = await supertest + .get(`/api/ingest_manager/fleet/agents/agent1`) + .set('kbn-xsrf', 'xxx'); + expect(typeof res.body.item.upgrade_started_at).to.be('string'); + }); + it('should respond 200 to upgrade agent and update the agent SO without source_uri', async () => { + const kibanaVersion = await kibanaServer.version.get(); + await supertest + .post(`/api/ingest_manager/fleet/agents/agent1/upgrade`) + .set('kbn-xsrf', 'xxx') + .send({ + version: kibanaVersion, + }) + .expect(200); + const res = await supertest + .get(`/api/ingest_manager/fleet/agents/agent1`) + .set('kbn-xsrf', 'xxx'); + expect(typeof res.body.item.upgrade_started_at).to.be('string'); }); it('should respond 400 if trying to upgrade to a version that does not match installed kibana version', async () => { + const kibanaVersion = await kibanaServer.version.get(); + const higherVersion = semver.inc(kibanaVersion, 'patch'); await supertest .post(`/api/ingest_manager/fleet/agents/agent1/upgrade`) .set('kbn-xsrf', 'xxx') .send({ - version: '8.0.1', + version: higherVersion, source_uri: 'http://path/to/download', }) .expect(400); }); + it('should respond 400 if trying to upgrade an agent that is unenrolling', async () => { + const kibanaVersion = await kibanaServer.version.get(); + await supertest + .post(`/api/ingest_manager/fleet/agents/agent1/unenroll`) + .set('kbn-xsrf', 'xxx') + .send({ + force: true, + }); + await supertest + .post(`/api/ingest_manager/fleet/agents/agent1/upgrade`) + .set('kbn-xsrf', 'xxx') + .send({ + version: kibanaVersion, + }) + .expect(400); + }); + it('should respond 400 if trying to upgrade an agent that is unenrolled', async () => { + const kibanaVersion = await kibanaServer.version.get(); + await kibanaServer.savedObjects.update({ + id: 'agent1', + type: AGENT_SAVED_OBJECT_TYPE, + attributes: { unenrolled_at: new Date().toISOString() }, + }); + await supertest + .post(`/api/ingest_manager/fleet/agents/agent1/upgrade`) + .set('kbn-xsrf', 'xxx') + .send({ + version: kibanaVersion, + }) + .expect(400); + }); + + it('should respond 200 to bulk upgrade agents and update the agent SOs', async () => { + const kibanaVersion = await kibanaServer.version.get(); + await supertest + .post(`/api/ingest_manager/fleet/agents/bulk_upgrade`) + .set('kbn-xsrf', 'xxx') + .send({ + version: kibanaVersion, + agents: ['agent1', 'agent2'], + }) + .expect(200); + + const [agent1data, agent2data] = await Promise.all([ + supertest.get(`/api/ingest_manager/fleet/agents/agent1`).set('kbn-xsrf', 'xxx'), + supertest.get(`/api/ingest_manager/fleet/agents/agent2`).set('kbn-xsrf', 'xxx'), + ]); + expect(typeof agent1data.body.item.upgrade_started_at).to.be('string'); + expect(typeof agent2data.body.item.upgrade_started_at).to.be('string'); + }); + + it('should allow to upgrade multiple agents by kuery', async () => { + const kibanaVersion = await kibanaServer.version.get(); + await supertest + .post(`/api/ingest_manager/fleet/agents/bulk_upgrade`) + .set('kbn-xsrf', 'xxx') + .send({ + agents: 'fleet-agents.active: true', + version: kibanaVersion, + }) + .expect(200); + const [agent1data, agent2data] = await Promise.all([ + supertest.get(`/api/ingest_manager/fleet/agents/agent1`).set('kbn-xsrf', 'xxx'), + supertest.get(`/api/ingest_manager/fleet/agents/agent2`).set('kbn-xsrf', 'xxx'), + ]); + expect(typeof agent1data.body.item.upgrade_started_at).to.be('string'); + expect(typeof agent2data.body.item.upgrade_started_at).to.be('string'); + }); + + it('should not upgrade an unenrolling agent during bulk_upgrade', async () => { + const kibanaVersion = await kibanaServer.version.get(); + await supertest + .post(`/api/ingest_manager/fleet/agents/agent1/unenroll`) + .set('kbn-xsrf', 'xxx') + .send({ + force: true, + }); + await supertest + .post(`/api/ingest_manager/fleet/agents/bulk_upgrade`) + .set('kbn-xsrf', 'xxx') + .send({ + agents: ['agent1', 'agent2'], + version: kibanaVersion, + }); + const [agent1data, agent2data] = await Promise.all([ + supertest.get(`/api/ingest_manager/fleet/agents/agent1`).set('kbn-xsrf', 'xxx'), + supertest.get(`/api/ingest_manager/fleet/agents/agent2`).set('kbn-xsrf', 'xxx'), + ]); + expect(typeof agent1data.body.item.upgrade_started_at).to.be('undefined'); + expect(typeof agent2data.body.item.upgrade_started_at).to.be('string'); + }); + it('should not upgrade an unenrolled agent during bulk_upgrade', async () => { + const kibanaVersion = await kibanaServer.version.get(); + kibanaServer.savedObjects.update({ + id: 'agent1', + type: AGENT_SAVED_OBJECT_TYPE, + attributes: { unenrolled_at: new Date().toISOString() }, + }); + await supertest + .post(`/api/ingest_manager/fleet/agents/bulk_upgrade`) + .set('kbn-xsrf', 'xxx') + .send({ + agents: ['agent1', 'agent2'], + version: kibanaVersion, + }); + const [agent1data, agent2data] = await Promise.all([ + supertest.get(`/api/ingest_manager/fleet/agents/agent1`).set('kbn-xsrf', 'xxx'), + supertest.get(`/api/ingest_manager/fleet/agents/agent2`).set('kbn-xsrf', 'xxx'), + ]); + expect(typeof agent1data.body.item.upgrade_started_at).to.be('undefined'); + expect(typeof agent2data.body.item.upgrade_started_at).to.be('string'); + }); }); } From 88ddde817c0796b28f2ed1bd0ca077d98a4564c9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Patryk=20Kopyci=C5=84ski?= Date: Mon, 5 Oct 2020 17:42:48 +0200 Subject: [PATCH 16/49] [Security Solution] Fix source.ip and destination.ip draggables (#79399) --- .../common/components/draggables/index.tsx | 2 +- .../ip/__snapshots__/index.test.tsx.snap | 1 + .../public/network/components/ip/index.test.tsx | 2 +- .../public/network/components/ip/index.tsx | 1 + .../source_destination_ip.test.tsx | 16 ++++++++-------- .../components/fields_browser/field_name.tsx | 1 + .../timelines/components/formatted_ip/index.tsx | 7 +++++-- .../timeline/body/renderers/formatted_field.tsx | 1 + 8 files changed, 19 insertions(+), 12 deletions(-) diff --git a/x-pack/plugins/security_solution/public/common/components/draggables/index.tsx b/x-pack/plugins/security_solution/public/common/components/draggables/index.tsx index d37de2cd3ec3d..c3592360672ad 100644 --- a/x-pack/plugins/security_solution/public/common/components/draggables/index.tsx +++ b/x-pack/plugins/security_solution/public/common/components/draggables/index.tsx @@ -53,7 +53,7 @@ export const getDefaultWhenTooltipIsUnspecified = ({ /** * Renders the content of the draggable, wrapped in a tooltip */ -const Content = React.memo<{ +export const Content = React.memo<{ children?: React.ReactNode; field: string; tooltipContent?: React.ReactNode; diff --git a/x-pack/plugins/security_solution/public/network/components/ip/__snapshots__/index.test.tsx.snap b/x-pack/plugins/security_solution/public/network/components/ip/__snapshots__/index.test.tsx.snap index a2c71b914b989..2e1465da73a4c 100644 --- a/x-pack/plugins/security_solution/public/network/components/ip/__snapshots__/index.test.tsx.snap +++ b/x-pack/plugins/security_solution/public/network/components/ip/__snapshots__/index.test.tsx.snap @@ -7,6 +7,7 @@ exports[`Port renders correctly against snapshot 1`] = ` eventId="abcd" fieldName="destination.ip" fieldType="ip" + truncate={true} value="10.1.2.3" /> `; diff --git a/x-pack/plugins/security_solution/public/network/components/ip/index.test.tsx b/x-pack/plugins/security_solution/public/network/components/ip/index.test.tsx index 39ecb27606181..8afc22d799a7d 100644 --- a/x-pack/plugins/security_solution/public/network/components/ip/index.test.tsx +++ b/x-pack/plugins/security_solution/public/network/components/ip/index.test.tsx @@ -43,7 +43,7 @@ describe('Port', () => { ); expect( - wrapper.find('[data-test-subj="draggable-content-destination.ip"]').find('a').first().props() + wrapper.find('[data-test-subj="draggable-truncatable-content"]').find('a').first().props() .href ).toEqual('/ip/10.1.2.3/source'); }); diff --git a/x-pack/plugins/security_solution/public/network/components/ip/index.tsx b/x-pack/plugins/security_solution/public/network/components/ip/index.tsx index 21e2dd3ebc04d..701094cee88a2 100644 --- a/x-pack/plugins/security_solution/public/network/components/ip/index.tsx +++ b/x-pack/plugins/security_solution/public/network/components/ip/index.tsx @@ -30,6 +30,7 @@ export const Ip = React.memo<{ fieldName={fieldName} fieldType={IP_FIELD_TYPE} value={value} + truncate /> )); diff --git a/x-pack/plugins/security_solution/public/network/components/source_destination/source_destination_ip.test.tsx b/x-pack/plugins/security_solution/public/network/components/source_destination/source_destination_ip.test.tsx index 847b6a3ced554..890add4222503 100644 --- a/x-pack/plugins/security_solution/public/network/components/source_destination/source_destination_ip.test.tsx +++ b/x-pack/plugins/security_solution/public/network/components/source_destination/source_destination_ip.test.tsx @@ -772,7 +772,7 @@ describe('SourceDestinationIp', () => { ); - expect(wrapper.find('[data-test-subj="draggable-content-source.ip"]').first().text()).toEqual( + expect(wrapper.find('[data-test-subj="draggable-truncatable-content"]').first().text()).toEqual( '192.168.1.2' ); }); @@ -823,7 +823,7 @@ describe('SourceDestinationIp', () => { ); - expect(wrapper.find('[data-test-subj="draggable-content-source.ip"]').first().text()).toEqual( + expect(wrapper.find('[data-test-subj="draggable-truncatable-content"]').first().text()).toEqual( '192.168.1.2' ); }); @@ -874,9 +874,9 @@ describe('SourceDestinationIp', () => { ); - expect( - wrapper.find('[data-test-subj="draggable-content-destination.ip"]').first().text() - ).toEqual('10.1.2.3'); + expect(wrapper.find('[data-test-subj="draggable-truncatable-content"]').first().text()).toEqual( + '10.1.2.3' + ); }); test('it renders the expected destination IP when type is `destination`, but the length of the destinationIp and destinationPort port arrays is different', () => { @@ -925,9 +925,9 @@ describe('SourceDestinationIp', () => { ); - expect( - wrapper.find('[data-test-subj="draggable-content-destination.ip"]').first().text() - ).toEqual('10.1.2.3'); + expect(wrapper.find('[data-test-subj="draggable-truncatable-content"]').first().text()).toEqual( + '10.1.2.3' + ); }); test('it renders the expected source port when type is `source`, and both sourceIp and sourcePort are populated', () => { diff --git a/x-pack/plugins/security_solution/public/timelines/components/fields_browser/field_name.tsx b/x-pack/plugins/security_solution/public/timelines/components/fields_browser/field_name.tsx index 62e41d967cb9a..b6829bcce28fa 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/fields_browser/field_name.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/fields_browser/field_name.tsx @@ -21,6 +21,7 @@ import { */ export const FieldNameContainer = styled.span` border-radius: 4px; + display: flex; padding: 0 4px 0 8px; position: relative; diff --git a/x-pack/plugins/security_solution/public/timelines/components/formatted_ip/index.tsx b/x-pack/plugins/security_solution/public/timelines/components/formatted_ip/index.tsx index 091bb41bc2080..65210ab2fd60a 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/formatted_ip/index.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/formatted_ip/index.tsx @@ -12,6 +12,7 @@ import { DraggableWrapper, } from '../../../common/components/drag_and_drop/draggable_wrapper'; import { escapeDataProviderId } from '../../../common/components/drag_and_drop/helpers'; +import { Content } from '../../../common/components/draggables'; import { getOrEmptyTagFromValue } from '../../../common/components/empty_value'; import { NetworkDetailsLink } from '../../../common/components/links'; import { parseQueryValue } from '../../../timelines/components/timeline/body/renderers/parse_query_value'; @@ -148,9 +149,11 @@ const AddressLinksItemComponent: React.FC = ({ ) : ( - + + + ), - [address, dataProviderProp] + [address, dataProviderProp, fieldName] ); return ( diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/body/renderers/formatted_field.tsx b/x-pack/plugins/security_solution/public/timelines/components/timeline/body/renderers/formatted_field.tsx index ab9e47f5ae3f5..04709458a7428 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/timeline/body/renderers/formatted_field.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/timeline/body/renderers/formatted_field.tsx @@ -54,6 +54,7 @@ const FormattedFieldValueComponent: React.FC<{ contextId={contextId} fieldName={fieldName} value={!isNumber(value) ? value : String(value)} + truncate={truncate} /> ); } else if (fieldType === DATE_FIELD_TYPE) { From 1dacabc5347ccaf020620499dddcca1369d2c565 Mon Sep 17 00:00:00 2001 From: Paul Tavares <56442535+paul-tavares@users.noreply.github.com> Date: Mon, 5 Oct 2020 12:02:29 -0400 Subject: [PATCH 17/49] Un-skip endpoint policy details tests (#79460) --- .../security_solution_endpoint/apps/endpoint/policy_details.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/x-pack/test/security_solution_endpoint/apps/endpoint/policy_details.ts b/x-pack/test/security_solution_endpoint/apps/endpoint/policy_details.ts index 137f24432976a..b15fab96470e0 100644 --- a/x-pack/test/security_solution_endpoint/apps/endpoint/policy_details.ts +++ b/x-pack/test/security_solution_endpoint/apps/endpoint/policy_details.ts @@ -30,8 +30,7 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { port, }); - // FAILING ES PROMOTION: https://github.com/elastic/kibana/issues/72102 - describe.skip('When on the Endpoint Policy Details Page', function () { + describe('When on the Endpoint Policy Details Page', function () { this.tags(['ciGroup7']); describe('with an invalid policy id', () => { From 0d378e488cfae581d7c13bd3f9d45ff21ffa7b0b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Loix?= Date: Mon, 5 Oct 2020 18:09:50 +0200 Subject: [PATCH 18/49] Form lib enhancements (#78588) Co-authored-by: Patryk Kopycinski Co-authored-by: Elastic Machine Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- .../static/forms/components/field.tsx | 2 + .../components/fields/json_editor_field.tsx | 4 +- .../hook_form_lib/components/use_array.ts | 38 +++++---- .../hook_form_lib/components/use_field.tsx | 51 +++++------ .../components/use_multi_fields.tsx | 20 ++--- .../static/forms/hook_form_lib/constants.ts | 10 ++- .../forms/hook_form_lib/form_data_context.tsx | 4 +- .../forms/hook_form_lib/hooks/use_field.ts | 84 ++++++++++--------- .../hook_form_lib/hooks/use_form.test.tsx | 4 +- .../forms/hook_form_lib/hooks/use_form.ts | 80 ++++++++++++------ .../hook_form_lib/hooks/use_form_data.ts | 6 +- .../static/forms/hook_form_lib/types.ts | 79 ++++++++++------- .../configuration_form/configuration_form.tsx | 10 +-- .../configuration_form_schema.tsx | 4 +- .../fielddata_frequency_filter_absolute.tsx | 4 +- .../fielddata_frequency_filter_percentage.tsx | 4 +- .../field_parameters/fielddata_parameter.tsx | 30 ++++--- .../other_type_json_parameter.tsx | 2 +- .../fields/edit_field/edit_field_form_row.tsx | 2 +- .../templates_form/templates_form_schema.ts | 3 +- .../constants/parameters_definition.tsx | 16 ++-- .../components/mappings_editor/lib/utils.ts | 2 +- .../mappings_editor/types/document_fields.ts | 2 +- .../common_fields/common_processor_fields.tsx | 2 +- .../common_fields/processor_type_field.tsx | 2 +- .../processor_form/processors/custom.tsx | 2 +- .../processor_form/processors/shared.ts | 2 +- .../test_pipeline_flyout.container.tsx | 6 +- .../test_pipeline/test_pipeline_flyout.tsx | 5 +- .../tab_documents/tab_documents.tsx | 2 +- .../public/cases/components/__mock__/form.ts | 2 +- .../cases/components/edit_connector/index.tsx | 10 ++- .../rules/description_step/index.tsx | 4 +- .../rules/step_define_rule/index.tsx | 7 +- .../rules/threatmatch_input/index.tsx | 3 +- .../detection_engine/rules/create/helpers.ts | 2 +- 36 files changed, 291 insertions(+), 219 deletions(-) diff --git a/src/plugins/es_ui_shared/static/forms/components/field.tsx b/src/plugins/es_ui_shared/static/forms/components/field.tsx index 78702e902ecf6..217a811168814 100644 --- a/src/plugins/es_ui_shared/static/forms/components/field.tsx +++ b/src/plugins/es_ui_shared/static/forms/components/field.tsx @@ -38,6 +38,7 @@ import { SelectField, SuperSelectField, ToggleField, + JsonEditorField, } from './fields'; const mapTypeToFieldComponent: { [key: string]: ComponentType } = { @@ -52,6 +53,7 @@ const mapTypeToFieldComponent: { [key: string]: ComponentType } = { [FIELD_TYPES.SELECT]: SelectField, [FIELD_TYPES.SUPER_SELECT]: SuperSelectField, [FIELD_TYPES.TOGGLE]: ToggleField, + [FIELD_TYPES.JSON]: JsonEditorField, }; export const Field = (props: Props) => { diff --git a/src/plugins/es_ui_shared/static/forms/components/fields/json_editor_field.tsx b/src/plugins/es_ui_shared/static/forms/components/fields/json_editor_field.tsx index fd57e098cf806..e2d80825f397e 100644 --- a/src/plugins/es_ui_shared/static/forms/components/fields/json_editor_field.tsx +++ b/src/plugins/es_ui_shared/static/forms/components/fields/json_editor_field.tsx @@ -23,7 +23,7 @@ import { JsonEditor, OnJsonEditorUpdateHandler } from '../../../../public'; import { FieldHook, getFieldValidityAndErrorMessage } from '../../hook_form_lib'; interface Props { - field: FieldHook; + field: FieldHook; euiCodeEditorProps?: { [key: string]: any }; [key: string]: any; } @@ -44,7 +44,7 @@ export const JsonEditorField = ({ field, ...rest }: Props) => { ['validations']; - children: (args: { - items: ArrayItem[]; - error: string | null; - addItem: () => void; - removeItem: (id: number) => void; - moveItem: (sourceIdx: number, destinationIdx: number) => void; - form: FormHook; - }) => JSX.Element; + validations?: FieldConfig['validations']; + children: (formFieldArray: FormArrayField) => JSX.Element; } export interface ArrayItem { @@ -45,6 +38,15 @@ export interface ArrayItem { isNew: boolean; } +export interface FormArrayField { + items: ArrayItem[]; + error: string | null; + addItem: () => void; + removeItem: (id: number) => void; + moveItem: (sourceIdx: number, destinationIdx: number) => void; + form: FormHook; +} + /** * Use UseArray to dynamically add fields to your form. * @@ -71,7 +73,7 @@ export const UseArray = ({ const uniqueId = useRef(0); const form = useFormContext(); - const { getFieldDefaultValue } = form; + const { __getFieldDefaultValue } = form; const getNewItemAtIndex = useCallback( (index: number): ArrayItem => ({ @@ -84,7 +86,7 @@ export const UseArray = ({ const fieldDefaultValue = useMemo(() => { const defaultValues = readDefaultValueOnForm - ? (getFieldDefaultValue(path) as any[]) + ? (__getFieldDefaultValue(path) as any[]) : undefined; const getInitialItemsFromValues = (values: any[]): ArrayItem[] => @@ -97,17 +99,23 @@ export const UseArray = ({ return defaultValues ? getInitialItemsFromValues(defaultValues) : new Array(initialNumberOfItems).fill('').map((_, i) => getNewItemAtIndex(i)); - }, [path, initialNumberOfItems, readDefaultValueOnForm, getFieldDefaultValue, getNewItemAtIndex]); + }, [ + path, + initialNumberOfItems, + readDefaultValueOnForm, + __getFieldDefaultValue, + getNewItemAtIndex, + ]); // Create a new hook field with the "hasValue" set to false so we don't use its value to build the final form data. // Apart from that the field behaves like a normal field and is hooked into the form validation lifecycle. - const fieldConfigBase: FieldConfig & InternalFieldConfig = { + const fieldConfigBase: FieldConfig & InternalFieldConfig = { defaultValue: fieldDefaultValue, - errorDisplayDelay: 0, + valueChangeDebounceTime: 0, isIncludedInOutput: false, }; - const fieldConfig: FieldConfig & InternalFieldConfig = validations + const fieldConfig: FieldConfig & InternalFieldConfig = validations ? { validations, ...fieldConfigBase } : fieldConfigBase; diff --git a/src/plugins/es_ui_shared/static/forms/hook_form_lib/components/use_field.tsx b/src/plugins/es_ui_shared/static/forms/hook_form_lib/components/use_field.tsx index 6b913f246abbb..a3a0984d4a736 100644 --- a/src/plugins/es_ui_shared/static/forms/hook_form_lib/components/use_field.tsx +++ b/src/plugins/es_ui_shared/static/forms/hook_form_lib/components/use_field.tsx @@ -19,23 +19,23 @@ import React, { FunctionComponent } from 'react'; -import { FieldHook, FieldConfig } from '../types'; +import { FieldHook, FieldConfig, FormData } from '../types'; import { useField } from '../hooks'; import { useFormContext } from '../form_context'; -export interface Props { +export interface Props { path: string; - config?: FieldConfig; + config?: FieldConfig; defaultValue?: T; - component?: FunctionComponent | 'input'; + component?: FunctionComponent; componentProps?: Record; readDefaultValueOnForm?: boolean; - onChange?: (value: T) => void; - children?: (field: FieldHook) => JSX.Element; + onChange?: (value: I) => void; + children?: (field: FieldHook) => JSX.Element; [key: string]: any; } -function UseFieldComp(props: Props) { +function UseFieldComp(props: Props) { const { path, config, @@ -48,18 +48,16 @@ function UseFieldComp(props: Props) { ...rest } = props; - const form = useFormContext(); + const form = useFormContext(); const ComponentToRender = component ?? 'input'; - // For backward compatibility we merge the "componentProps" prop into the "rest" - const propsToForward = - componentProps !== undefined ? { ...componentProps, ...rest } : { ...rest }; + const propsToForward = { ...componentProps, ...rest }; - const fieldConfig: FieldConfig & { initialValue?: T } = + const fieldConfig: FieldConfig & { initialValue?: T } = config !== undefined ? { ...config } : ({ ...form.__readFieldConfigFromSchema(path), - } as Partial>); + } as Partial>); if (defaultValue !== undefined) { // update the form "defaultValue" ref object so when/if we reset the form we can go back to this value @@ -70,21 +68,12 @@ function UseFieldComp(props: Props) { } else { if (readDefaultValueOnForm) { // Read the field initial value from the "defaultValue" object passed to the form - fieldConfig.initialValue = (form.getFieldDefaultValue(path) as T) ?? fieldConfig.defaultValue; + fieldConfig.initialValue = + (form.__getFieldDefaultValue(path) as T) ?? fieldConfig.defaultValue; } } - if (!fieldConfig.path) { - (fieldConfig.path as any) = path; - } else { - if (fieldConfig.path !== path) { - throw new Error( - `Field path mismatch. Got "${path}" but field config has "${fieldConfig.path}".` - ); - } - } - - const field = useField(form, path, fieldConfig, onChange); + const field = useField(form, path, fieldConfig, onChange); // Children prevails over anything else provided. if (children) { @@ -111,9 +100,13 @@ export const UseField = React.memo(UseFieldComp) as typeof UseFieldComp; * Get a component providing some common props for all instances. * @param partialProps Partial props to apply to all instances */ -export function getUseField(partialProps: Partial>) { - return function (props: Partial>) { - const componentProps = { ...partialProps, ...props } as Props; - return {...componentProps} />; +export function getUseField( + partialProps: Partial> +) { + return function ( + props: Partial> + ) { + const componentProps = { ...partialProps, ...props } as Props; + return {...componentProps} />; }; } diff --git a/src/plugins/es_ui_shared/static/forms/hook_form_lib/components/use_multi_fields.tsx b/src/plugins/es_ui_shared/static/forms/hook_form_lib/components/use_multi_fields.tsx index d69527e36249b..20f4608352d94 100644 --- a/src/plugins/es_ui_shared/static/forms/hook_form_lib/components/use_multi_fields.tsx +++ b/src/plugins/es_ui_shared/static/forms/hook_form_lib/components/use_multi_fields.tsx @@ -22,27 +22,27 @@ import React from 'react'; import { UseField, Props as UseFieldProps } from './use_field'; import { FieldHook } from '../types'; -type FieldsArray = Array<{ id: string } & Omit, 'children'>>; +type FieldsArray = Array<{ id: string } & Omit, 'children'>>; -interface Props { - fields: { [key: string]: Exclude, 'children'> }; - children: (fields: { [key: string]: FieldHook }) => JSX.Element; +interface Props { + fields: { [K in keyof T]: Exclude, 'children'> }; + children: (fields: { [K in keyof T]: FieldHook }) => JSX.Element; } -export const UseMultiFields = ({ fields, children }: Props) => { +export function UseMultiFields({ fields, children }: Props) { const fieldsArray = Object.entries(fields).reduce( - (acc, [fieldId, field]) => [...acc, { id: fieldId, ...field }], + (acc, [fieldId, field]) => [...acc, { id: fieldId, ...(field as FieldHook) }], [] as FieldsArray ); - const hookFields: { [key: string]: FieldHook } = {}; + const hookFields: { [K in keyof T]: FieldHook } = {} as any; const renderField = (index: number) => { const { id } = fieldsArray[index]; return ( - + {(field) => { - hookFields[id] = field; + hookFields[id as keyof T] = field; return index === fieldsArray.length - 1 ? children(hookFields) : renderField(index + 1); }} @@ -54,4 +54,4 @@ export const UseMultiFields = ({ fields, children }: Props) => { } return renderField(0); -}; +} diff --git a/src/plugins/es_ui_shared/static/forms/hook_form_lib/constants.ts b/src/plugins/es_ui_shared/static/forms/hook_form_lib/constants.ts index 4056947483107..3a2ffdc3af146 100644 --- a/src/plugins/es_ui_shared/static/forms/hook_form_lib/constants.ts +++ b/src/plugins/es_ui_shared/static/forms/hook_form_lib/constants.ts @@ -30,11 +30,15 @@ export const FIELD_TYPES = { SELECT: 'select', SUPER_SELECT: 'superSelect', MULTI_SELECT: 'multiSelect', + JSON: 'json', }; // Validation types export const VALIDATION_TYPES = { - FIELD: 'field', // Default validation error (on the field value) - ASYNC: 'async', // Returned from asynchronous validations - ARRAY_ITEM: 'arrayItem', // If the field value is an Array, this error would be returned if an _item_ of the array is invalid + /** Default validation error (on the field value) */ + FIELD: 'field', + /** Returned from asynchronous validations */ + ASYNC: 'async', + /** If the field value is an Array, this error type would be returned if an _item_ of the array is invalid */ + ARRAY_ITEM: 'arrayItem', }; diff --git a/src/plugins/es_ui_shared/static/forms/hook_form_lib/form_data_context.tsx b/src/plugins/es_ui_shared/static/forms/hook_form_lib/form_data_context.tsx index 0e6a75e9c5065..0670220ccd0c9 100644 --- a/src/plugins/es_ui_shared/static/forms/hook_form_lib/form_data_context.tsx +++ b/src/plugins/es_ui_shared/static/forms/hook_form_lib/form_data_context.tsx @@ -22,8 +22,8 @@ import React, { createContext, useContext, useMemo } from 'react'; import { FormData, FormHook } from './types'; import { Subject } from './lib'; -export interface Context { - getFormData$: () => Subject; +export interface Context { + getFormData$: () => Subject; getFormData: FormHook['getFormData']; } diff --git a/src/plugins/es_ui_shared/static/forms/hook_form_lib/hooks/use_field.ts b/src/plugins/es_ui_shared/static/forms/hook_form_lib/hooks/use_field.ts index 0119d86e92a36..7b21b6638aeac 100644 --- a/src/plugins/es_ui_shared/static/forms/hook_form_lib/hooks/use_field.ts +++ b/src/plugins/es_ui_shared/static/forms/hook_form_lib/hooks/use_field.ts @@ -19,7 +19,14 @@ import { useMemo, useState, useEffect, useRef, useCallback } from 'react'; -import { FormHook, FieldHook, FieldConfig, FieldValidateResponse, ValidationError } from '../types'; +import { + FormHook, + FieldHook, + FieldConfig, + FieldValidateResponse, + ValidationError, + FormData, +} from '../types'; import { FIELD_TYPES, VALIDATION_TYPES } from '../constants'; export interface InternalFieldConfig { @@ -27,11 +34,11 @@ export interface InternalFieldConfig { isIncludedInOutput?: boolean; } -export const useField = ( - form: FormHook, +export const useField = ( + form: FormHook, path: string, - config: FieldConfig & InternalFieldConfig = {}, - valueChangeListener?: (value: T) => void + config: FieldConfig & InternalFieldConfig = {}, + valueChangeListener?: (value: I) => void ) => { const { type = FIELD_TYPES.TEXT, @@ -44,7 +51,7 @@ export const useField = ( validations, formatters, fieldsToValidateOnChange, - errorDisplayDelay = form.__options.errorDisplayDelay, + valueChangeDebounceTime = form.__options.valueChangeDebounceTime, serializer, deserializer, } = config; @@ -68,7 +75,7 @@ export const useField = ( [initialValue, deserializer] ); - const [value, setStateValue] = useState(deserializeValue); + const [value, setStateValue] = useState(deserializeValue); const [errors, setErrors] = useState([]); const [isPristine, setPristine] = useState(true); const [isValidating, setValidating] = useState(false); @@ -84,9 +91,9 @@ export const useField = ( // -- HELPERS // ---------------------------------- - const serializeValue: FieldHook['__serializeValue'] = useCallback( - (rawValue = value) => { - return serializer ? serializer(rawValue) : rawValue; + const serializeValue: FieldHook['__serializeValue'] = useCallback( + (internalValue: I = value) => { + return serializer ? serializer(internalValue) : ((internalValue as unknown) as T); }, [serializer, value] ); @@ -129,16 +136,8 @@ export const useField = ( const changeIteration = ++changeCounter.current; const startTime = Date.now(); - if (debounceTimeout.current) { - clearTimeout(debounceTimeout.current); - debounceTimeout.current = null; - } - setPristine(false); - - if (errorDisplayDelay > 0) { - setIsChangingValue(true); - } + setIsChangingValue(true); // Notify listener if (valueChangeListener) { @@ -161,22 +160,24 @@ export const useField = ( * and then, we verify how long we've already waited for as form.__validateFields() is asynchronous * and might already have taken more than the specified delay) */ - if (errorDisplayDelay > 0 && changeIteration === changeCounter.current) { - const delta = Date.now() - startTime; - if (delta < errorDisplayDelay) { - debounceTimeout.current = setTimeout(() => { - debounceTimeout.current = null; - setIsChangingValue(false); - }, errorDisplayDelay - delta); - } else { - setIsChangingValue(false); + if (changeIteration === changeCounter.current) { + if (valueChangeDebounceTime > 0) { + const delta = Date.now() - startTime; + if (delta < valueChangeDebounceTime) { + debounceTimeout.current = setTimeout(() => { + debounceTimeout.current = null; + setIsChangingValue(false); + }, valueChangeDebounceTime - delta); + return; + } } + setIsChangingValue(false); } }, [ path, value, valueChangeListener, - errorDisplayDelay, + valueChangeDebounceTime, fieldsToValidateOnChange, __updateFormDataAt, __validateFields, @@ -207,7 +208,7 @@ export const useField = ( validationTypeToValidate, }: { formData: any; - value: T; + value: I; validationTypeToValidate?: string; }): ValidationError[] | Promise => { if (!validations) { @@ -339,7 +340,7 @@ export const useField = ( * If a validationType is provided then only that validation will be executed, * skipping the other type of validation that might exist. */ - const validate: FieldHook['validate'] = useCallback( + const validate: FieldHook['validate'] = useCallback( (validationData = {}) => { const { formData = getFormData({ unflatten: false }), @@ -392,14 +393,14 @@ export const useField = ( * * @param newValue The new value to assign to the field */ - const setValue: FieldHook['setValue'] = useCallback( + const setValue: FieldHook['setValue'] = useCallback( (newValue) => { setStateValue((prev) => { - let formattedValue: T; + let formattedValue: I; if (typeof newValue === 'function') { - formattedValue = formatInputValue((newValue as Function)(prev)); + formattedValue = formatInputValue((newValue as Function)(prev)); } else { - formattedValue = formatInputValue(newValue); + formattedValue = formatInputValue(newValue); } return formattedValue; }); @@ -407,7 +408,7 @@ export const useField = ( [formatInputValue] ); - const _setErrors: FieldHook['setErrors'] = useCallback((_errors) => { + const _setErrors: FieldHook['setErrors'] = useCallback((_errors) => { setErrors( _errors.map((error) => ({ validationType: VALIDATION_TYPES.FIELD, @@ -422,13 +423,13 @@ export const useField = ( * * @param event Form input change event */ - const onChange: FieldHook['onChange'] = useCallback( + const onChange: FieldHook['onChange'] = useCallback( (event) => { const newValue = {}.hasOwnProperty.call(event!.target, 'checked') ? event.target.checked : event.target.value; - setValue((newValue as unknown) as T); + setValue((newValue as unknown) as I); }, [setValue] ); @@ -443,7 +444,7 @@ export const useField = ( * * @param validationType The validation type to return error messages from */ - const getErrorsMessages: FieldHook['getErrorsMessages'] = useCallback( + const getErrorsMessages: FieldHook['getErrorsMessages'] = useCallback( (args = {}) => { const { errorCode, validationType = VALIDATION_TYPES.FIELD } = args; const errorMessages = errors.reduce((messages, error) => { @@ -498,7 +499,7 @@ export const useField = ( [setValue] ); - const reset: FieldHook['reset'] = useCallback( + const reset: FieldHook['reset'] = useCallback( (resetOptions = { resetValue: true }) => { const { resetValue = true, defaultValue: updatedDefaultValue } = resetOptions; @@ -521,7 +522,7 @@ export const useField = ( // Don't take into account non blocker validation. Some are just warning (like trying to add a wrong ComboBox item) const isValid = errors.filter((e) => e.__isBlocking__ !== false).length === 0; - const field = useMemo>(() => { + const field = useMemo>(() => { return { path, type, @@ -599,6 +600,7 @@ export const useField = ( return () => { if (debounceTimeout.current) { clearTimeout(debounceTimeout.current); + debounceTimeout.current = null; } }; }, [onValueChange]); diff --git a/src/plugins/es_ui_shared/static/forms/hook_form_lib/hooks/use_form.test.tsx b/src/plugins/es_ui_shared/static/forms/hook_form_lib/hooks/use_form.test.tsx index edcd84daf5d2f..b28c09d07fa98 100644 --- a/src/plugins/es_ui_shared/static/forms/hook_form_lib/hooks/use_form.test.tsx +++ b/src/plugins/es_ui_shared/static/forms/hook_form_lib/hooks/use_form.test.tsx @@ -196,7 +196,9 @@ describe('useForm() hook', () => { }); expect(isValid).toBe(false); - expect(data).toEqual({}); // Don't build the object (and call the serializers()) when invalid + // If the form is not valid, we don't build the final object to avoid + // calling the serializer(s) with invalid values. + expect(data).toEqual({}); }); }); diff --git a/src/plugins/es_ui_shared/static/forms/hook_form_lib/hooks/use_form.ts b/src/plugins/es_ui_shared/static/forms/hook_form_lib/hooks/use_form.ts index b390c17d3c2ff..be4535fec3669 100644 --- a/src/plugins/es_ui_shared/static/forms/hook_form_lib/hooks/use_form.ts +++ b/src/plugins/es_ui_shared/static/forms/hook_form_lib/hooks/use_form.ts @@ -24,19 +24,18 @@ import { set } from '@elastic/safer-lodash-set'; import { FormHook, FieldHook, FormData, FieldConfig, FieldsMap, FormConfig } from '../types'; import { mapFormFields, unflattenObject, Subject, Subscription } from '../lib'; -const DEFAULT_ERROR_DISPLAY_TIMEOUT = 500; const DEFAULT_OPTIONS = { - errorDisplayDelay: DEFAULT_ERROR_DISPLAY_TIMEOUT, + valueChangeDebounceTime: 500, stripEmptyFields: true, }; -interface UseFormReturn { - form: FormHook; +interface UseFormReturn { + form: FormHook; } -export function useForm( - formConfig?: FormConfig -): UseFormReturn { +export function useForm( + formConfig?: FormConfig +): UseFormReturn { const { onSubmit, schema, serializer, deserializer, options, id = 'default', defaultValue } = formConfig ?? {}; @@ -48,9 +47,9 @@ export function useForm( const filtered = Object.entries(_defaultValue as object) .filter(({ 1: value }) => value !== undefined) - .reduce((acc, [key, value]) => ({ ...acc, [key]: value }), {}); + .reduce((acc, [key, value]) => ({ ...acc, [key]: value }), {} as T); - return deserializer ? (deserializer(filtered) as any) : filtered; + return deserializer ? deserializer(filtered) : filtered; }, [deserializer] ); @@ -61,13 +60,13 @@ export function useForm( const defaultValueDeserialized = useRef(defaultValueMemoized); - const { errorDisplayDelay, stripEmptyFields: doStripEmptyFields } = options ?? {}; + const { valueChangeDebounceTime, stripEmptyFields: doStripEmptyFields } = options ?? {}; const formOptions = useMemo( () => ({ stripEmptyFields: doStripEmptyFields ?? DEFAULT_OPTIONS.stripEmptyFields, - errorDisplayDelay: errorDisplayDelay ?? DEFAULT_OPTIONS.errorDisplayDelay, + valueChangeDebounceTime: valueChangeDebounceTime ?? DEFAULT_OPTIONS.valueChangeDebounceTime, }), - [errorDisplayDelay, doStripEmptyFields] + [valueChangeDebounceTime, doStripEmptyFields] ); const [isSubmitted, setIsSubmitted] = useState(false); @@ -93,7 +92,7 @@ export function useForm( return formData$.current; }, []); - const fieldsToArray = useCallback(() => Object.values(fieldsRefs.current), []); + const fieldsToArray = useCallback<() => FieldHook[]>(() => Object.values(fieldsRefs.current), []); const getFieldsForOutput = useCallback( (fields: FieldsMap, opts: { stripEmptyFields: boolean }): FieldsMap => { @@ -144,7 +143,7 @@ export function useForm( }); const fieldsValue = mapFormFields(fieldsToOutput, (field) => field.__serializeValue()); return serializer - ? (serializer(unflattenObject(fieldsValue)) as T) + ? (serializer(unflattenObject(fieldsValue) as I) as T) : (unflattenObject(fieldsValue) as T); } @@ -175,6 +174,24 @@ export function useForm( const isFieldValid = (field: FieldHook) => field.isValid && !field.isValidating; + const waitForFieldsToFinishValidating = useCallback(async () => { + let areSomeFieldValidating = fieldsToArray().some((field) => field.isValidating); + if (!areSomeFieldValidating) { + return; + } + + return new Promise((resolve) => { + setTimeout(() => { + areSomeFieldValidating = fieldsToArray().some((field) => field.isValidating); + if (areSomeFieldValidating) { + // Recursively wait for all the fields to finish validating. + return waitForFieldsToFinishValidating().then(resolve); + } + resolve(); + }, 100); + }); + }, [fieldsToArray]); + const validateFields: FormHook['__validateFields'] = useCallback( async (fieldNames) => { const fieldsToValidate = fieldNames @@ -204,18 +221,25 @@ export function useForm( // To know the current form validity, we will then merge the "validationResult" _with_ the fieldsRefs object state, // the "validationResult" taking presedence over the fieldsRefs values. const formFieldsValidity = fieldsToArray().map((field) => { + const hasUpdatedValidity = validationResultByPath[field.path] !== undefined; const _isValid = validationResultByPath[field.path] ?? field.isValid; - const _isValidated = - validationResultByPath[field.path] !== undefined ? true : field.isValidated; - return [_isValid, _isValidated]; + const _isValidated = hasUpdatedValidity ? true : field.isValidated; + const _isValidating = hasUpdatedValidity ? false : field.isValidating; + return { + isValid: _isValid, + isValidated: _isValidated, + isValidating: _isValidating, + }; }); - const areAllFieldsValidated = formFieldsValidity.every(({ 1: isValidated }) => isValidated); + const areAllFieldsValidated = formFieldsValidity.every((field) => field.isValidated); + const areSomeFieldValidating = formFieldsValidity.some((field) => field.isValidating); // If *not* all the fiels have been validated, the validity of the form is unknown, thus still "undefined" - const isFormValid = areAllFieldsValidated - ? formFieldsValidity.every(([_isValid]) => _isValid) - : undefined; + const isFormValid = + areAllFieldsValidated && areSomeFieldValidating === false + ? formFieldsValidity.every((field) => field.isValid) + : undefined; setIsValid(isFormValid); @@ -225,6 +249,14 @@ export function useForm( ); const validateAllFields = useCallback(async (): Promise => { + // Maybe some field are being validated because of their async validation(s). + // We make sure those validations have finished executing before proceeding. + await waitForFieldsToFinishValidating(); + + if (!isMounted.current) { + return false; + } + const fieldsArray = fieldsToArray(); const fieldsToValidate = fieldsArray.filter((field) => !field.isValidated); @@ -238,7 +270,7 @@ export function useForm( setIsValid(isFormValid); return isFormValid!; - }, [fieldsToArray, validateFields]); + }, [fieldsToArray, validateFields, waitForFieldsToFinishValidating]); const addField: FormHook['__addField'] = useCallback( (field) => { @@ -303,7 +335,7 @@ export function useForm( const getFields: FormHook['getFields'] = useCallback(() => fieldsRefs.current, []); - const getFieldDefaultValue: FormHook['getFieldDefaultValue'] = useCallback( + const getFieldDefaultValue: FormHook['__getFieldDefaultValue'] = useCallback( (fieldName) => get(defaultValueDeserialized.current, fieldName), [] ); @@ -410,13 +442,13 @@ export function useForm( getFields, getFormData, getErrors, - getFieldDefaultValue, reset, __options: formOptions, __getFormData$: getFormData$, __updateFormDataAt: updateFormDataAt, __updateDefaultValueAt: updateDefaultValueAt, __readFieldConfigFromSchema: readFieldConfigFromSchema, + __getFieldDefaultValue: getFieldDefaultValue, __addField: addField, __removeField: removeField, __validateFields: validateFields, diff --git a/src/plugins/es_ui_shared/static/forms/hook_form_lib/hooks/use_form_data.ts b/src/plugins/es_ui_shared/static/forms/hook_form_lib/hooks/use_form_data.ts index fb4a0984438ad..6c6dee3624979 100644 --- a/src/plugins/es_ui_shared/static/forms/hook_form_lib/hooks/use_form_data.ts +++ b/src/plugins/es_ui_shared/static/forms/hook_form_lib/hooks/use_form_data.ts @@ -63,7 +63,11 @@ export const useFormData = (options: Options = {}): ? (watch as string[]) : ([watch] as string[]); - if (valuesToWatchArray.some((value) => previousRawData.current[value] !== raw[value])) { + if ( + valuesToWatchArray.some( + (value) => previousRawData.current[value] !== raw[value as keyof T] + ) + ) { previousRawData.current = raw; // Only update the state if one of the field we watch has changed. setFormData(raw); diff --git a/src/plugins/es_ui_shared/static/forms/hook_form_lib/types.ts b/src/plugins/es_ui_shared/static/forms/hook_form_lib/types.ts index 18b8f478f7c0e..ae731caff2881 100644 --- a/src/plugins/es_ui_shared/static/forms/hook_form_lib/types.ts +++ b/src/plugins/es_ui_shared/static/forms/hook_form_lib/types.ts @@ -24,21 +24,37 @@ import { Subject, Subscription } from './lib'; // Comes from https://github.com/microsoft/TypeScript/issues/15012#issuecomment-365453623 type Required = T extends FormData ? { [P in keyof T]-?: NonNullable } : T; -export interface FormHook { +export interface FormHook { + /** Flag that indicates if the form has been submitted at least once. It is set to `true` when we call `submit()`. */ readonly isSubmitted: boolean; + /** Flag that indicates if the form is being submitted. */ readonly isSubmitting: boolean; + /** Flag that indicates if the form is valid. If `undefined` then the form validation has not been checked yet. */ readonly isValid: boolean | undefined; + /** The form id. If none was provided, "default" will be returned. */ readonly id: string; + /** + * This handler submits the form and returns its data and validity. If the form is not valid, the data will be `null` + * as only valid data is passed through the `serializer(s)` before being returned. + */ submit: (e?: FormEvent | MouseEvent) => Promise<{ data: T; isValid: boolean }>; + /** Use this handler to get the validity of the form. */ validate: () => Promise; subscribe: (handler: OnUpdateHandler) => Subscription; + /** Sets a field value imperatively. */ setFieldValue: (fieldName: string, value: FieldValue) => void; + /** Sets a field errors imperatively. */ setFieldErrors: (fieldName: string, errors: ValidationError[]) => void; + /** Access any field on the form. */ getFields: () => FieldsMap; + /** + * Return the form data. It accepts an optional options object with an `unflatten` parameter (defaults to `true`). + * If you are only interested in the raw form data, pass `unflatten: false` to the handler + */ getFormData: (options?: { unflatten?: boolean }) => T; - getFieldDefaultValue: (fieldName: string) => unknown; - /* Returns a list of all errors in the form */ + /* Returns an array with of all errors in the form. */ getErrors: () => string[]; + /** Resets the form to its initial state. */ reset: (options?: { resetValues?: boolean; defaultValue?: Partial }) => void; readonly __options: Required; __getFormData$: () => Subject; @@ -50,23 +66,19 @@ export interface FormHook { __updateFormDataAt: (field: string, value: unknown) => T; __updateDefaultValueAt: (field: string, value: unknown) => void; __readFieldConfigFromSchema: (fieldName: string) => FieldConfig; + __getFieldDefaultValue: (fieldName: string) => unknown; } -export interface FormSchema { - [key: string]: FormSchemaEntry; -} - -type FormSchemaEntry = - | FieldConfig - | Array> - | { [key: string]: FieldConfig | Array> | FormSchemaEntry }; +export type FormSchema = { + [K in keyof T]?: FieldConfig | FormSchema; +}; -export interface FormConfig { +export interface FormConfig { onSubmit?: FormSubmitHandler; - schema?: FormSchema; + schema?: FormSchema; defaultValue?: Partial; - serializer?: SerializerFunc; - deserializer?: SerializerFunc; + serializer?: SerializerFunc; + deserializer?: SerializerFunc; options?: FormOptions; id?: string; } @@ -83,20 +95,20 @@ export interface OnFormUpdateArg { export type OnUpdateHandler = (arg: OnFormUpdateArg) => void; export interface FormOptions { - errorDisplayDelay?: number; + valueChangeDebounceTime?: number; /** * Remove empty string field ("") from form data */ stripEmptyFields?: boolean; } -export interface FieldHook { +export interface FieldHook { readonly path: string; readonly label?: string; readonly labelAppend?: string | ReactNode; readonly helpText?: string | ReactNode; readonly type: string; - readonly value: T; + readonly value: I; readonly errors: ValidationError[]; readonly isValid: boolean; readonly isPristine: boolean; @@ -108,34 +120,33 @@ export interface FieldHook { errorCode?: string; }) => string | null; onChange: (event: ChangeEvent<{ name?: string; value: string; checked?: boolean }>) => void; - setValue: (value: T | ((prevValue: T) => T)) => void; + setValue: (value: I | ((prevValue: I) => I)) => void; setErrors: (errors: ValidationError[]) => void; clearErrors: (type?: string | string[]) => void; validate: (validateData?: { formData?: any; - value?: T; + value?: I; validationType?: string; }) => FieldValidateResponse | Promise; reset: (options?: { resetValue?: boolean; defaultValue?: T }) => unknown | undefined; // Flag to indicate if the field value will be included in the form data outputted // when calling form.getFormData(); __isIncludedInOutput: boolean; - __serializeValue: (rawValue?: unknown) => unknown; + __serializeValue: (internalValue?: I) => T; } -export interface FieldConfig { - readonly path?: string; +export interface FieldConfig { readonly label?: string; readonly labelAppend?: string | ReactNode; readonly helpText?: string | ReactNode; - readonly type?: HTMLInputElement['type']; - readonly defaultValue?: ValueType; - readonly validations?: Array>; + readonly type?: string; + readonly defaultValue?: T; + readonly validations?: Array>; readonly formatters?: FormatterFunc[]; - readonly deserializer?: SerializerFunc; - readonly serializer?: SerializerFunc; + readonly deserializer?: SerializerFunc; + readonly serializer?: SerializerFunc; readonly fieldsToValidateOnChange?: string[]; - readonly errorDisplayDelay?: number; + readonly valueChangeDebounceTime?: number; } export interface FieldsMap { @@ -166,7 +177,7 @@ export interface ValidationFuncArg { errors: readonly ValidationError[]; } -export type ValidationFunc = ( +export type ValidationFunc = ( data: ValidationFuncArg ) => ValidationError | void | undefined | Promise | void | undefined>; @@ -187,8 +198,12 @@ type FormatterFunc = (value: any, formData: FormData) => unknown; // string | number | boolean | string[] ... type FieldValue = unknown; -export interface ValidationConfig { - validator: ValidationFunc; +export interface ValidationConfig< + FormType extends FormData = any, + Error extends string = string, + ValueType = unknown +> { + validator: ValidationFunc; type?: string; /** * By default all validation are blockers, which means that if they fail, the field is invalid. diff --git a/x-pack/plugins/index_management/public/application/components/mappings_editor/components/configuration_form/configuration_form.tsx b/x-pack/plugins/index_management/public/application/components/mappings_editor/components/configuration_form/configuration_form.tsx index 7ec78646a654e..2b56a0e68c46b 100644 --- a/x-pack/plugins/index_management/public/application/components/mappings_editor/components/configuration_form/configuration_form.tsx +++ b/x-pack/plugins/index_management/public/application/components/mappings_editor/components/configuration_form/configuration_form.tsx @@ -6,7 +6,7 @@ import React, { useEffect, useRef } from 'react'; import { EuiSpacer } from '@elastic/eui'; -import { useForm, Form, SerializerFunc } from '../../shared_imports'; +import { useForm, Form } from '../../shared_imports'; import { GenericObject, MappingsConfiguration } from '../../types'; import { useDispatch } from '../../mappings_state_context'; import { DynamicMappingSection } from './dynamic_mapping_section'; @@ -19,7 +19,7 @@ interface Props { value?: MappingsConfiguration; } -const formSerializer: SerializerFunc = (formData) => { +const formSerializer = (formData: GenericObject) => { const { dynamicMapping: { enabled: dynamicMappingsEnabled, @@ -88,7 +88,7 @@ const formDeserializer = (formData: GenericObject) => { export const ConfigurationForm = React.memo(({ value }: Props) => { const isMounted = useRef(false); - const { form } = useForm({ + const { form } = useForm({ schema: configurationFormSchema, serializer: formSerializer, deserializer: formDeserializer, @@ -108,7 +108,7 @@ export const ConfigurationForm = React.memo(({ value }: Props) => { validate, submitForm: submit, }, - }); + } as any); }); return subscription.unsubscribe; @@ -130,7 +130,7 @@ export const ConfigurationForm = React.memo(({ value }: Props) => { // Save a snapshot of the form state so we can get back to it when navigating back to the tab const configurationData = getFormData(); - dispatch({ type: 'configuration.save', value: configurationData }); + dispatch({ type: 'configuration.save', value: configurationData as any }); }; }, [getFormData, dispatch]); diff --git a/x-pack/plugins/index_management/public/application/components/mappings_editor/components/configuration_form/configuration_form_schema.tsx b/x-pack/plugins/index_management/public/application/components/mappings_editor/components/configuration_form/configuration_form_schema.tsx index 8742dfc916924..2ab594d9d57fb 100644 --- a/x-pack/plugins/index_management/public/application/components/mappings_editor/components/configuration_form/configuration_form_schema.tsx +++ b/x-pack/plugins/index_management/public/application/components/mappings_editor/components/configuration_form/configuration_form_schema.tsx @@ -11,7 +11,7 @@ import { EuiLink, EuiCode } from '@elastic/eui'; import { documentationService } from '../../../../services/documentation'; import { FormSchema, FIELD_TYPES, VALIDATION_TYPES, fieldValidators } from '../../shared_imports'; -import { ComboBoxOption, MappingsConfiguration } from '../../types'; +import { ComboBoxOption } from '../../types'; const { containsCharsField, isJsonField } = fieldValidators; @@ -28,7 +28,7 @@ const fieldPathComboBoxConfig = { deserializer: (values: string[]): ComboBoxOption[] => values.map((value) => ({ label: value })), }; -export const configurationFormSchema: FormSchema = { +export const configurationFormSchema: FormSchema = { metaField: { label: i18n.translate('xpack.idxMgmt.mappingsEditor.configuration.metaFieldEditorLabel', { defaultMessage: '_meta field data', diff --git a/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/field_parameters/fielddata_frequency_filter_absolute.tsx b/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/field_parameters/fielddata_frequency_filter_absolute.tsx index b446f9dae46bf..8a3bf5810459e 100644 --- a/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/field_parameters/fielddata_frequency_filter_absolute.tsx +++ b/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/field_parameters/fielddata_frequency_filter_absolute.tsx @@ -16,8 +16,8 @@ import { import { FieldHook } from '../../../shared_imports'; interface Props { - min: FieldHook; - max: FieldHook; + min: FieldHook; + max: FieldHook; } export const FielddataFrequencyFilterAbsolute = ({ min, max }: Props) => { diff --git a/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/field_parameters/fielddata_frequency_filter_percentage.tsx b/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/field_parameters/fielddata_frequency_filter_percentage.tsx index 97edba8179180..d1f810b1e8e13 100644 --- a/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/field_parameters/fielddata_frequency_filter_percentage.tsx +++ b/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/field_parameters/fielddata_frequency_filter_percentage.tsx @@ -10,8 +10,8 @@ import { EuiDualRange, EuiFormRow } from '@elastic/eui'; import { FieldHook } from '../../../shared_imports'; interface Props { - min: FieldHook; - max: FieldHook; + min: FieldHook; + max: FieldHook; } export const FielddataFrequencyFilterPercentage = ({ min, max }: Props) => { diff --git a/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/field_parameters/fielddata_parameter.tsx b/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/field_parameters/fielddata_parameter.tsx index df49282b51e74..358f01833e9fe 100644 --- a/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/field_parameters/fielddata_parameter.tsx +++ b/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/field_parameters/fielddata_parameter.tsx @@ -34,6 +34,11 @@ interface Props { type ValueType = 'percentage' | 'absolute'; +interface FieldsType { + min: number; + max: number; +} + export const FieldDataParameter = ({ field, defaultToggleValue }: Props) => { const [valueType, setValueType] = useState( field.source.fielddata_frequency_filter !== undefined @@ -43,21 +48,22 @@ export const FieldDataParameter = ({ field, defaultToggleValue }: Props) => { : 'percentage' ); - const getConfig = (fieldProp: 'min' | 'max', type = valueType) => - type === 'percentage' - ? getFieldConfig('fielddata_frequency_filter_percentage', fieldProp) - : getFieldConfig('fielddata_frequency_filter_absolute', fieldProp); + function getConfig(fieldProp: 'min' | 'max', type = valueType) { + return type === 'percentage' + ? getFieldConfig('fielddata_frequency_filter_percentage', fieldProp) + : getFieldConfig('fielddata_frequency_filter_absolute', fieldProp); + } - const switchType = (min: FieldHook, max: FieldHook) => () => { + const switchType = (min: FieldHook, max: FieldHook) => () => { const nextValueType = valueType === 'percentage' ? 'absolute' : 'percentage'; - const nextMinConfig = getConfig('min', nextValueType); - const nextMaxConfig = getConfig('max', nextValueType); + const nextMinConfig = getConfig('min', nextValueType); + const nextMaxConfig = getConfig('max', nextValueType); min.setValue( - nextMinConfig.deserializer?.(nextMinConfig.defaultValue) ?? nextMinConfig.defaultValue + nextMinConfig.deserializer?.(nextMinConfig.defaultValue!) ?? nextMinConfig.defaultValue! ); max.setValue( - nextMaxConfig.deserializer?.(nextMaxConfig.defaultValue) ?? nextMaxConfig.defaultValue + nextMaxConfig.deserializer?.(nextMaxConfig.defaultValue!) ?? nextMaxConfig.defaultValue! ); setValueType(nextValueType); @@ -85,15 +91,15 @@ export const FieldDataParameter = ({ field, defaultToggleValue }: Props) => { defaultToggleValue={defaultToggleValue} > {/* fielddata_frequency_filter */} - fields={{ min: { path: 'fielddata_frequency_filter.min', - config: getConfig('min'), + config: getConfig('min'), }, max: { path: 'fielddata_frequency_filter.max', - config: getConfig('max'), + config: getConfig('max'), }, }} > diff --git a/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/field_parameters/other_type_json_parameter.tsx b/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/field_parameters/other_type_json_parameter.tsx index 64e50f711a249..32a9926b2d925 100644 --- a/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/field_parameters/other_type_json_parameter.tsx +++ b/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/field_parameters/other_type_json_parameter.tsx @@ -23,7 +23,7 @@ const { isJsonField } = fieldValidators; * We use it to store custom defined parameters in a field called "otherTypeJson". */ -const fieldConfig: FieldConfig = { +const fieldConfig: FieldConfig = { label: i18n.translate('xpack.idxMgmt.mappingsEditor.otherTypeJsonFieldLabel', { defaultMessage: 'Type Parameters JSON', }), diff --git a/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/fields/edit_field/edit_field_form_row.tsx b/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/fields/edit_field/edit_field_form_row.tsx index c0e68b082c310..ce349b2c6104f 100644 --- a/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/fields/edit_field/edit_field_form_row.tsx +++ b/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/fields/edit_field/edit_field_form_row.tsx @@ -93,7 +93,7 @@ export const EditFieldFormRow = React.memo( showLabel={false} /> ) : ( - path={formFieldPath} config={{ ...getFieldConfig(configPath ? configPath : formFieldPath), diff --git a/x-pack/plugins/index_management/public/application/components/mappings_editor/components/templates_form/templates_form_schema.ts b/x-pack/plugins/index_management/public/application/components/mappings_editor/components/templates_form/templates_form_schema.ts index daca85f95b0b9..08ccd27d5bca3 100644 --- a/x-pack/plugins/index_management/public/application/components/mappings_editor/components/templates_form/templates_form_schema.ts +++ b/x-pack/plugins/index_management/public/application/components/mappings_editor/components/templates_form/templates_form_schema.ts @@ -7,11 +7,10 @@ import { i18n } from '@kbn/i18n'; import { FormSchema, fieldValidators } from '../../shared_imports'; -import { MappingsTemplates } from '../../types'; const { isJsonField } = fieldValidators; -export const templatesFormSchema: FormSchema = { +export const templatesFormSchema: FormSchema<{ dynamicTemplates: any[] }> = { dynamicTemplates: { label: i18n.translate('xpack.idxMgmt.mappingsEditor.templates.dynamicTemplatesEditorLabel', { defaultMessage: 'Dynamic templates data', diff --git a/x-pack/plugins/index_management/public/application/components/mappings_editor/constants/parameters_definition.tsx b/x-pack/plugins/index_management/public/application/components/mappings_editor/constants/parameters_definition.tsx index 74cca4dae7817..1434b7d4b4429 100644 --- a/x-pack/plugins/index_management/public/application/components/mappings_editor/constants/parameters_definition.tsx +++ b/x-pack/plugins/index_management/public/application/components/mappings_editor/constants/parameters_definition.tsx @@ -273,15 +273,15 @@ export const PARAMETERS_DEFINITION: { [key in ParameterName]: ParameterDefinitio min: { fieldConfig: { defaultValue: 0.01, - serializer: (value) => (value === '' ? '' : toInt(value) / 100), - deserializer: (value) => Math.round(value * 100), + serializer: (value: string) => (value === '' ? '' : toInt(value) / 100), + deserializer: (value: number) => Math.round(value * 100), } as FieldConfig, }, max: { fieldConfig: { defaultValue: 1, - serializer: (value) => (value === '' ? '' : toInt(value) / 100), - deserializer: (value) => Math.round(value * 100), + serializer: (value: string) => (value === '' ? '' : toInt(value) / 100), + deserializer: (value: number) => Math.round(value * 100), } as FieldConfig, }, }, @@ -949,8 +949,8 @@ export const PARAMETERS_DEFINITION: { [key in ParameterName]: ParameterDefinitio ), }, ], - serializer: (value: AliasOption[]) => (value.length === 0 ? '' : value[0].id), - } as FieldConfig, + serializer: (value) => (value.length === 0 ? '' : value[0].id), + } as FieldConfig, targetTypesNotAllowed: ['object', 'nested', 'alias'] as DataType[], schema: t.string, }, @@ -991,14 +991,14 @@ export const PARAMETERS_DEFINITION: { [key in ParameterName]: ParameterDefinitio fieldConfig: { type: FIELD_TYPES.NUMBER, defaultValue: 2, - serializer: (value) => (value === '' ? '' : toInt(value)), + serializer: (value: string) => (value === '' ? '' : toInt(value)), } as FieldConfig, }, max_chars: { fieldConfig: { type: FIELD_TYPES.NUMBER, defaultValue: 5, - serializer: (value) => (value === '' ? '' : toInt(value)), + serializer: (value: string) => (value === '' ? '' : toInt(value)), } as FieldConfig, }, }, diff --git a/x-pack/plugins/index_management/public/application/components/mappings_editor/lib/utils.ts b/x-pack/plugins/index_management/public/application/components/mappings_editor/lib/utils.ts index d96f20683216a..fd7aa41638505 100644 --- a/x-pack/plugins/index_management/public/application/components/mappings_editor/lib/utils.ts +++ b/x-pack/plugins/index_management/public/application/components/mappings_editor/lib/utils.ts @@ -92,7 +92,7 @@ export const getTypeLabelFromField = (field: Field) => { export const getFieldConfig = ( param: ParameterName, prop?: string -): FieldConfig => { +): FieldConfig => { if (prop !== undefined) { if ( !(PARAMETERS_DEFINITION[param] as any).props || diff --git a/x-pack/plugins/index_management/public/application/components/mappings_editor/types/document_fields.ts b/x-pack/plugins/index_management/public/application/components/mappings_editor/types/document_fields.ts index 926b4c9d12bee..ee4dd55a5801f 100644 --- a/x-pack/plugins/index_management/public/application/components/mappings_editor/types/document_fields.ts +++ b/x-pack/plugins/index_management/public/application/components/mappings_editor/types/document_fields.ts @@ -25,7 +25,7 @@ export interface DataTypeDefinition { export interface ParameterDefinition { title?: string; description?: JSX.Element | string; - fieldConfig: FieldConfig; + fieldConfig: FieldConfig; schema?: any; props?: { [key: string]: ParameterDefinition }; documentation?: { diff --git a/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/processor_form/processors/common_fields/common_processor_fields.tsx b/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/processor_form/processors/common_fields/common_processor_fields.tsx index 1777cac2a5615..e66534ae1b250 100644 --- a/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/processor_form/processors/common_fields/common_processor_fields.tsx +++ b/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/processor_form/processors/common_fields/common_processor_fields.tsx @@ -18,7 +18,7 @@ import { import { TextEditor } from '../../field_components'; import { to, from, EDITOR_PX_HEIGHT } from '../shared'; -const ignoreFailureConfig: FieldConfig = { +const ignoreFailureConfig: FieldConfig = { defaultValue: false, deserializer: to.booleanOrUndef, serializer: from.undefinedIfValue(false), diff --git a/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/processor_form/processors/common_fields/processor_type_field.tsx b/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/processor_form/processors/common_fields/processor_type_field.tsx index 5b3df63a11294..eb792f5a85213 100644 --- a/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/processor_form/processors/common_fields/processor_type_field.tsx +++ b/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/processor_form/processors/common_fields/processor_type_field.tsx @@ -47,7 +47,7 @@ interface Props { const { emptyField } = fieldValidators; -const typeConfig: FieldConfig = { +const typeConfig: FieldConfig = { type: FIELD_TYPES.COMBO_BOX, label: i18n.translate('xpack.ingestPipelines.pipelineEditor.typeField.typeFieldLabel', { defaultMessage: 'Processor', diff --git a/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/processor_form/processors/custom.tsx b/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/processor_form/processors/custom.tsx index f49e77501f931..4a8cfc8be2d8c 100644 --- a/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/processor_form/processors/custom.tsx +++ b/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/processor_form/processors/custom.tsx @@ -20,7 +20,7 @@ import { XJsonEditor } from '../field_components'; import { Fields } from '../processor_form.container'; import { EDITOR_PX_HEIGHT } from './shared'; -const customConfig: FieldConfig = { +const customConfig: FieldConfig = { type: FIELD_TYPES.TEXT, label: i18n.translate('xpack.ingestPipelines.pipelineEditor.customForm.optionsFieldLabel', { defaultMessage: 'Configuration', diff --git a/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/processor_form/processors/shared.ts b/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/processor_form/processors/shared.ts index e45469e23e8a0..c33cce323b727 100644 --- a/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/processor_form/processors/shared.ts +++ b/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/processor_form/processors/shared.ts @@ -74,6 +74,6 @@ export const EDITOR_PX_HEIGHT = { large: 300, }; -export type FieldsConfig = Record; +export type FieldsConfig = Record>; export type FormFieldsComponent = FunctionComponent<{ initialFieldValues?: Record }>; diff --git a/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/test_pipeline/test_pipeline_flyout.container.tsx b/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/test_pipeline/test_pipeline_flyout.container.tsx index e7ccb9d17f2b1..7a32e6328bc73 100644 --- a/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/test_pipeline/test_pipeline_flyout.container.tsx +++ b/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/test_pipeline/test_pipeline_flyout.container.tsx @@ -28,6 +28,10 @@ export interface TestPipelineConfig { verbose?: boolean; } +export interface TestPipelineFlyoutForm { + documents: string | Document[]; +} + export const TestPipelineFlyout: React.FunctionComponent = ({ onClose, activeTab, @@ -46,7 +50,7 @@ export const TestPipelineFlyout: React.FunctionComponent = ({ config: { documents: cachedDocuments, verbose: cachedVerbose }, } = testPipelineData; - const { form } = useForm({ + const { form } = useForm({ defaultValue: { documents: cachedDocuments || '', }, diff --git a/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/test_pipeline/test_pipeline_flyout.tsx b/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/test_pipeline/test_pipeline_flyout.tsx index 51b75dab170a3..aa9e2879aaddf 100644 --- a/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/test_pipeline/test_pipeline_flyout.tsx +++ b/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/test_pipeline/test_pipeline_flyout.tsx @@ -20,6 +20,7 @@ import { FormHook } from '../../../../../shared_imports'; import { Document } from '../../types'; import { Tabs, TestPipelineFlyoutTab, OutputTab, DocumentsTab } from './test_pipeline_tabs'; +import { TestPipelineFlyoutForm } from './test_pipeline_flyout.container'; export interface Props { onClose: () => void; handleTestPipeline: ( @@ -30,9 +31,7 @@ export interface Props { cachedVerbose?: boolean; cachedDocuments?: Document[]; testOutput?: any; - form: FormHook<{ - documents: string | Document[]; - }>; + form: FormHook; validateAndTestPipeline: () => Promise; selectedTab: TestPipelineFlyoutTab; setSelectedTab: (selectedTa: TestPipelineFlyoutTab) => void; diff --git a/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/test_pipeline/test_pipeline_tabs/tab_documents/tab_documents.tsx b/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/test_pipeline/test_pipeline_tabs/tab_documents/tab_documents.tsx index ae784472ebbd9..cd82e0f4ff5ca 100644 --- a/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/test_pipeline/test_pipeline_tabs/tab_documents/tab_documents.tsx +++ b/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/test_pipeline/test_pipeline_tabs/tab_documents/tab_documents.tsx @@ -75,7 +75,7 @@ const i18nTexts = { ), }; -const documentFieldConfig: FieldConfig = { +const documentFieldConfig: FieldConfig = { label: i18n.translate( 'xpack.ingestPipelines.testPipelineFlyout.documentsForm.documentsFieldLabel', { diff --git a/x-pack/plugins/security_solution/public/cases/components/__mock__/form.ts b/x-pack/plugins/security_solution/public/cases/components/__mock__/form.ts index 87f8f46affb52..1029bd35f35f6 100644 --- a/x-pack/plugins/security_solution/public/cases/components/__mock__/form.ts +++ b/x-pack/plugins/security_solution/public/cases/components/__mock__/form.ts @@ -23,7 +23,6 @@ export const mockFormHook = { setFieldErrors: jest.fn(), getFields: jest.fn(), getFormData: jest.fn(), - getFieldDefaultValue: jest.fn(), /* Returns a list of all errors in the form */ getErrors: jest.fn(), reset: jest.fn(), @@ -34,6 +33,7 @@ export const mockFormHook = { __validateFields: jest.fn(), __updateFormDataAt: jest.fn(), __readFieldConfigFromSchema: jest.fn(), + __getFieldDefaultValue: jest.fn(), }; // eslint-disable-next-line @typescript-eslint/no-explicit-any export const getFormMock = (sampleData: any) => ({ diff --git a/x-pack/plugins/security_solution/public/cases/components/edit_connector/index.tsx b/x-pack/plugins/security_solution/public/cases/components/edit_connector/index.tsx index 95ef3353a025f..94d694a9e107a 100644 --- a/x-pack/plugins/security_solution/public/cases/components/edit_connector/index.tsx +++ b/x-pack/plugins/security_solution/public/cases/components/edit_connector/index.tsx @@ -27,7 +27,7 @@ interface EditConnectorProps { connectors: Connector[]; disabled?: boolean; isLoading: boolean; - onSubmit: (a: string[], onSuccess: () => void, onError: () => void) => void; + onSubmit: (a: string, onSuccess: () => void, onError: () => void) => void; selectedConnector: string; } @@ -48,7 +48,13 @@ export const EditConnector = React.memo( onSubmit, selectedConnector, }: EditConnectorProps) => { - const initialState = { connectors }; + const initialState: { + connectors: Connector[]; + connector: string | undefined; + } = { + connectors, + connector: undefined, + }; const { form } = useForm({ defaultValue: initialState, options: { stripEmptyFields: false }, diff --git a/x-pack/plugins/security_solution/public/detections/components/rules/description_step/index.tsx b/x-pack/plugins/security_solution/public/detections/components/rules/description_step/index.tsx index 83d087e60bc7d..7d509270fff95 100644 --- a/x-pack/plugins/security_solution/public/detections/components/rules/description_step/index.tsx +++ b/x-pack/plugins/security_solution/public/detections/components/rules/description_step/index.tsx @@ -125,9 +125,7 @@ export const StepRuleDescriptionComponent = ({ ); }; -export const StepRuleDescription = memo( - StepRuleDescriptionComponent -) as typeof StepRuleDescriptionComponent; +export const StepRuleDescription = memo(StepRuleDescriptionComponent); export const buildListItems = ( data: unknown, diff --git a/x-pack/plugins/security_solution/public/detections/components/rules/step_define_rule/index.tsx b/x-pack/plugins/security_solution/public/detections/components/rules/step_define_rule/index.tsx index d13635bfd1b50..07a67ae8705c3 100644 --- a/x-pack/plugins/security_solution/public/detections/components/rules/step_define_rule/index.tsx +++ b/x-pack/plugins/security_solution/public/detections/components/rules/step_define_rule/index.tsx @@ -19,10 +19,7 @@ import { hasMlAdminPermissions } from '../../../../../common/machine_learning/ha import { hasMlLicense } from '../../../../../common/machine_learning/has_ml_license'; import { useMlCapabilities } from '../../../../common/components/ml/hooks/use_ml_capabilities'; import { useUiSetting$ } from '../../../../common/lib/kibana'; -import { - filterRuleFieldsForType, - RuleFields, -} from '../../../pages/detection_engine/rules/create/helpers'; +import { filterRuleFieldsForType } from '../../../pages/detection_engine/rules/create/helpers'; import { DefineStepRule, RuleStep, @@ -223,7 +220,7 @@ const StepDefineRuleComponent: FC = ({ diff --git a/x-pack/plugins/security_solution/public/detections/components/rules/threatmatch_input/index.tsx b/x-pack/plugins/security_solution/public/detections/components/rules/threatmatch_input/index.tsx index 2a4609a2f5e9e..9a3dcc7a4d713 100644 --- a/x-pack/plugins/security_solution/public/detections/components/rules/threatmatch_input/index.tsx +++ b/x-pack/plugins/security_solution/public/detections/components/rules/threatmatch_input/index.tsx @@ -17,6 +17,7 @@ import { UseField, getFieldValidityAndErrorMessage, } from '../../../../shared_imports'; +import { DefineStepRule } from '../../../pages/detection_engine/rules/types'; import { schema } from '../step_define_rule/schema'; import { QueryBarDefineRule } from '../query_bar'; import { IndexPattern } from '../../../../../../../../src/plugins/data/public'; @@ -51,7 +52,7 @@ const ThreatMatchInputComponent: React.FC = ({ - path="threatIndex" config={{ ...schema.threatIndex, diff --git a/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/create/helpers.ts b/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/create/helpers.ts index 160809a2ba3cd..540fdc6bc75f5 100644 --- a/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/create/helpers.ts +++ b/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/create/helpers.ts @@ -110,7 +110,7 @@ const isThreatMatchFields = ( fields: QueryRuleFields | MlRuleFields | ThresholdRuleFields | ThreatMatchRuleFields ): fields is ThreatMatchRuleFields => has('threatIndex', fields); -export const filterRuleFieldsForType = ( +export const filterRuleFieldsForType = >( fields: T, type: Type ): QueryRuleFields | MlRuleFields | ThresholdRuleFields | ThreatMatchRuleFields => { From fd27e5b7359ed2bf9f510571785d88e5a68ad5ee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Patryk=20Kopyci=C5=84ski?= Date: Mon, 5 Oct 2020 18:10:40 +0200 Subject: [PATCH 19/49] [Security Solution] Align skip logic across SearchStrategy queries (#79085) --- .../cypress/fixtures/overview.json | 13 ---- .../cypress/integration/overview.spec.ts | 4 +- .../cypress/support/commands.js | 8 +- .../cypress/support/index.d.ts | 6 +- .../events_viewer/events_viewer.tsx | 1 + .../components/paginated_table/index.tsx | 2 +- .../events/last_event_time/index.ts | 4 +- .../containers/matrix_histogram/index.ts | 3 + .../containers/authentications/index.tsx | 53 ++++++++----- .../hosts/containers/hosts/details/_index.tsx | 37 +++++---- .../public/hosts/containers/hosts/index.tsx | 63 +++++++++------ .../kpi_hosts/authentications/index.tsx | 41 ++++++---- .../containers/kpi_hosts/hosts/index.tsx | 39 ++++++---- .../containers/kpi_hosts/unique_ips/index.tsx | 41 ++++++---- .../containers/uncommon_processes/index.tsx | 52 ++++++++----- .../network/containers/details/index.tsx | 36 ++++++--- .../containers/kpi_network/dns/index.tsx | 39 ++++++---- .../kpi_network/network_events/index.tsx | 41 ++++++---- .../kpi_network/tls_handshakes/index.tsx | 40 ++++++---- .../kpi_network/unique_flows/index.tsx | 41 ++++++---- .../kpi_network/unique_private_ips/index.tsx | 41 ++++++---- .../network/containers/network_dns/index.tsx | 56 +++++++++----- .../network/containers/network_http/index.tsx | 45 +++++++---- .../network_top_countries/index.tsx | 77 +++++++++++++------ .../containers/network_top_n_flow/index.tsx | 61 ++++++++++----- .../public/network/containers/tls/index.tsx | 74 ++++++++++++------ .../public/network/containers/users/index.tsx | 73 +++++++++++++----- .../containers/overview_host/index.tsx | 35 ++++++--- .../containers/overview_network/index.tsx | 38 ++++++--- .../body/events/event_column_view.tsx | 9 ++- .../footer/__snapshots__/index.test.tsx.snap | 16 ++-- .../components/timeline/footer/index.test.tsx | 9 +++ .../components/timeline/footer/index.tsx | 24 ++++-- .../components/timeline/timeline.tsx | 1 + .../timelines/containers/details/index.tsx | 13 +++- .../public/timelines/containers/index.tsx | 3 +- 36 files changed, 752 insertions(+), 387 deletions(-) delete mode 100644 x-pack/plugins/security_solution/cypress/fixtures/overview.json diff --git a/x-pack/plugins/security_solution/cypress/fixtures/overview.json b/x-pack/plugins/security_solution/cypress/fixtures/overview.json deleted file mode 100644 index c4aeda0c446e4..0000000000000 --- a/x-pack/plugins/security_solution/cypress/fixtures/overview.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "data": { - "source": { - "id": "default", - "status": { - "indicesExist": true, - "indexFields": [], - "__typename": "SourceStatus" - }, - "__typename": "Source" - } - } -} diff --git a/x-pack/plugins/security_solution/cypress/integration/overview.spec.ts b/x-pack/plugins/security_solution/cypress/integration/overview.spec.ts index 14464333fcafe..e2f5ca9025bd9 100644 --- a/x-pack/plugins/security_solution/cypress/integration/overview.spec.ts +++ b/x-pack/plugins/security_solution/cypress/integration/overview.spec.ts @@ -13,8 +13,8 @@ import { OVERVIEW_URL } from '../urls/navigation'; describe('Overview Page', () => { before(() => { - cy.stubSecurityApi('overview'); - cy.stubSearchStrategyApi('overview_search_strategy'); + cy.stubSearchStrategyApi('overviewHostQuery', 'overview_search_strategy'); + cy.stubSearchStrategyApi('overviewNetworkQuery', 'overview_search_strategy'); loginAndWaitForPage(OVERVIEW_URL); }); diff --git a/x-pack/plugins/security_solution/cypress/support/commands.js b/x-pack/plugins/security_solution/cypress/support/commands.js index 0e3c9562aedf0..0dbcb1af4642f 100644 --- a/x-pack/plugins/security_solution/cypress/support/commands.js +++ b/x-pack/plugins/security_solution/cypress/support/commands.js @@ -39,13 +39,17 @@ Cypress.Commands.add('stubSecurityApi', function (dataFileName) { cy.route('POST', 'api/solutions/security/graphql', `@${dataFileName}JSON`); }); -Cypress.Commands.add('stubSearchStrategyApi', function (dataFileName) { +Cypress.Commands.add('stubSearchStrategyApi', function ( + queryId, + dataFileName, + searchStrategyName = 'securitySolutionSearchStrategy' +) { cy.on('window:before:load', (win) => { win.fetch = null; }); cy.server(); cy.fixture(dataFileName).as(`${dataFileName}JSON`); - cy.route('POST', 'internal/search/securitySolutionSearchStrategy', `@${dataFileName}JSON`); + cy.route('POST', `internal/search/${searchStrategyName}/${queryId}`, `@${dataFileName}JSON`); }); Cypress.Commands.add( diff --git a/x-pack/plugins/security_solution/cypress/support/index.d.ts b/x-pack/plugins/security_solution/cypress/support/index.d.ts index f0b0b8c92c616..59180507cbade 100644 --- a/x-pack/plugins/security_solution/cypress/support/index.d.ts +++ b/x-pack/plugins/security_solution/cypress/support/index.d.ts @@ -8,7 +8,11 @@ declare namespace Cypress { interface Chainable { promisify(): Promise; stubSecurityApi(dataFileName: string): Chainable; - stubSearchStrategyApi(dataFileName: string): Chainable; + stubSearchStrategyApi( + queryId: string, + dataFileName: string, + searchStrategyName?: string + ): Chainable; attachFile(fileName: string, fileType?: string): Chainable; } } diff --git a/x-pack/plugins/security_solution/public/common/components/events_viewer/events_viewer.tsx b/x-pack/plugins/security_solution/public/common/components/events_viewer/events_viewer.tsx index 7859f5584b0e5..6ed9765a911d0 100644 --- a/x-pack/plugins/security_solution/public/common/components/events_viewer/events_viewer.tsx +++ b/x-pack/plugins/security_solution/public/common/components/events_viewer/events_viewer.tsx @@ -312,6 +312,7 @@ const EventsViewerComponent: React.FC = ({ onChangeItemsPerPage={onChangeItemsPerPage} onChangePage={loadPage} serverSideEventCount={totalCountMinusDeleted} + showMorePagesIndicator={pageInfo.showMorePagesIndicator} totalCount={pageInfo.fakeTotalCount} /> ) diff --git a/x-pack/plugins/security_solution/public/common/components/paginated_table/index.tsx b/x-pack/plugins/security_solution/public/common/components/paginated_table/index.tsx index f7b69c4fc8ed3..c0d540d01ee97 100644 --- a/x-pack/plugins/security_solution/public/common/components/paginated_table/index.tsx +++ b/x-pack/plugins/security_solution/public/common/components/paginated_table/index.tsx @@ -325,7 +325,7 @@ const FooterAction = styled(EuiFlexGroup).attrs(() => ({ FooterAction.displayName = 'FooterAction'; -const PaginationEuiFlexItem = styled(EuiFlexItem)` +export const PaginationEuiFlexItem = styled(EuiFlexItem)` @media only screen and (min-width: ${({ theme }) => theme.eui.euiBreakpoints.m}) { .euiButtonIcon:last-child { margin-left: 28px; diff --git a/x-pack/plugins/security_solution/public/common/containers/events/last_event_time/index.ts b/x-pack/plugins/security_solution/public/common/containers/events/last_event_time/index.ts index dc2d6605bc292..ab44cbd65516e 100644 --- a/x-pack/plugins/security_solution/public/common/containers/events/last_event_time/index.ts +++ b/x-pack/plugins/security_solution/public/common/containers/events/last_event_time/index.ts @@ -61,7 +61,7 @@ export const useTimelineLastEventTime = ({ details, }); - const [TimelineLastEventTimeResponse, setTimelineLastEventTimeResponse] = useState< + const [timelineLastEventTimeResponse, setTimelineLastEventTimeResponse] = useState< UseTimelineLastEventTimeArgs >({ lastSeen: null, @@ -151,5 +151,5 @@ export const useTimelineLastEventTime = ({ timelineLastEventTimeSearch(TimelineLastEventTimeRequest); }, [TimelineLastEventTimeRequest, timelineLastEventTimeSearch]); - return [loading, TimelineLastEventTimeResponse]; + return [loading, timelineLastEventTimeResponse]; }; diff --git a/x-pack/plugins/security_solution/public/common/containers/matrix_histogram/index.ts b/x-pack/plugins/security_solution/public/common/containers/matrix_histogram/index.ts index 33cc86f5e9798..54e349fe3e926 100644 --- a/x-pack/plugins/security_solution/public/common/containers/matrix_histogram/index.ts +++ b/x-pack/plugins/security_solution/public/common/containers/matrix_histogram/index.ts @@ -34,6 +34,8 @@ export interface UseMatrixHistogramArgs { totalCount: number; } +const ID = 'matrixHistogramQuery'; + export const useMatrixHistogram = ({ endDate, errorMessage, @@ -54,6 +56,7 @@ export const useMatrixHistogram = ({ factoryQueryType: MatrixHistogramQuery, filterQuery: createFilter(filterQuery), histogramType, + id: ID, timerange: { interval: '12h', from: startDate, diff --git a/x-pack/plugins/security_solution/public/hosts/containers/authentications/index.tsx b/x-pack/plugins/security_solution/public/hosts/containers/authentications/index.tsx index bc7137097c646..6418ea83d97f9 100644 --- a/x-pack/plugins/security_solution/public/hosts/containers/authentications/index.tsx +++ b/x-pack/plugins/security_solution/public/hosts/containers/authentications/index.tsx @@ -37,7 +37,7 @@ import { hostsModel, hostsSelectors } from '../../store'; import * as i18n from './translations'; -const ID = 'authenticationQuery'; +const ID = 'hostsAuthenticationsQuery'; export interface AuthenticationArgs { authentications: AuthenticationsEdges[]; @@ -78,25 +78,35 @@ export const useAuthentications = ({ const refetch = useRef(noop); const abortCtrl = useRef(new AbortController()); const [loading, setLoading] = useState(false); - const [authenticationsRequest, setAuthenticationsRequest] = useState< - HostAuthenticationsRequestOptions - >({ - defaultIndex: indexNames, - docValueFields: docValueFields ?? [], - factoryQueryType: HostsQueries.authentications, - filterQuery: createFilter(filterQuery), - pagination: generateTablePaginationOptions(activePage, limit), - timerange: { - interval: '12h', - from: startDate, - to: endDate, - }, - sort: {} as SortField, - }); + const [ + authenticationsRequest, + setAuthenticationsRequest, + ] = useState( + !skip + ? { + defaultIndex: indexNames, + docValueFields: docValueFields ?? [], + factoryQueryType: HostsQueries.authentications, + filterQuery: createFilter(filterQuery), + id: ID, + pagination: generateTablePaginationOptions(activePage, limit), + timerange: { + interval: '12h', + from: startDate, + to: endDate, + }, + sort: {} as SortField, + } + : null + ); const wrappedLoadMore = useCallback( (newActivePage: number) => { setAuthenticationsRequest((prevRequest) => { + if (!prevRequest) { + return prevRequest; + } + return { ...prevRequest, pagination: generateTablePaginationOptions(newActivePage, limit), @@ -126,7 +136,11 @@ export const useAuthentications = ({ }); const authenticationsSearch = useCallback( - (request: HostAuthenticationsRequestOptions) => { + (request: HostAuthenticationsRequestOptions | null) => { + if (request == null) { + return; + } + let didCancel = false; const asyncSearch = async () => { abortCtrl.current = new AbortController(); @@ -184,16 +198,19 @@ export const useAuthentications = ({ useEffect(() => { setAuthenticationsRequest((prevRequest) => { const myRequest = { - ...prevRequest, + ...(prevRequest ?? {}), defaultIndex: indexNames, docValueFields: docValueFields ?? [], + factoryQueryType: HostsQueries.authentications, filterQuery: createFilter(filterQuery), + id: ID, pagination: generateTablePaginationOptions(activePage, limit), timerange: { interval: '12h', from: startDate, to: endDate, }, + sort: {} as SortField, }; if (!skip && !deepEqual(prevRequest, myRequest)) { return myRequest; diff --git a/x-pack/plugins/security_solution/public/hosts/containers/hosts/details/_index.tsx b/x-pack/plugins/security_solution/public/hosts/containers/hosts/details/_index.tsx index 5b69e20398a35..2dec01dc4d9e3 100644 --- a/x-pack/plugins/security_solution/public/hosts/containers/hosts/details/_index.tsx +++ b/x-pack/plugins/security_solution/public/hosts/containers/hosts/details/_index.tsx @@ -28,7 +28,7 @@ import { import { getInspectResponse } from '../../../../helpers'; import { InspectResponse } from '../../../../types'; -const ID = 'hostDetailsQuery'; +const ID = 'hostsDetailsQuery'; export interface HostDetailsArgs { id: string; @@ -60,16 +60,21 @@ export const useHostDetails = ({ const refetch = useRef(noop); const abortCtrl = useRef(new AbortController()); const [loading, setLoading] = useState(false); - const [hostDetailsRequest, setHostDetailsRequest] = useState({ - defaultIndex: indexNames, - hostName, - factoryQueryType: HostsQueries.details, - timerange: { - interval: '12h', - from: startDate, - to: endDate, - }, - }); + const [hostDetailsRequest, setHostDetailsRequest] = useState( + !skip + ? { + defaultIndex: indexNames, + hostName, + id, + factoryQueryType: HostsQueries.details, + timerange: { + interval: '12h', + from: startDate, + to: endDate, + }, + } + : null + ); const [hostDetailsResponse, setHostDetailsResponse] = useState({ endDate, @@ -84,7 +89,11 @@ export const useHostDetails = ({ }); const hostDetailsSearch = useCallback( - (request: HostDetailsRequestOptions) => { + (request: HostDetailsRequestOptions | null) => { + if (request == null) { + return; + } + let didCancel = false; const asyncSearch = async () => { abortCtrl.current = new AbortController(); @@ -141,9 +150,11 @@ export const useHostDetails = ({ useEffect(() => { setHostDetailsRequest((prevRequest) => { const myRequest = { - ...prevRequest, + ...(prevRequest ?? {}), defaultIndex: indexNames, + factoryQueryType: HostsQueries.details, hostName, + id: ID, timerange: { interval: '12h', from: startDate, diff --git a/x-pack/plugins/security_solution/public/hosts/containers/hosts/index.tsx b/x-pack/plugins/security_solution/public/hosts/containers/hosts/index.tsx index 77f4567fc6a5f..9dd4881b3c9ff 100644 --- a/x-pack/plugins/security_solution/public/hosts/containers/hosts/index.tsx +++ b/x-pack/plugins/security_solution/public/hosts/containers/hosts/index.tsx @@ -33,7 +33,7 @@ import { import { getInspectResponse } from '../../../helpers'; import { InspectResponse } from '../../../types'; -const ID = 'hostsQuery'; +const ID = 'hostsAllQuery'; type LoadPage = (newActivePage: number) => void; export interface HostsArgs { @@ -76,29 +76,40 @@ export const useAllHost = ({ const refetch = useRef(noop); const abortCtrl = useRef(new AbortController()); const [loading, setLoading] = useState(false); - const [hostsRequest, setHostRequest] = useState({ - defaultIndex: indexNames, - docValueFields: docValueFields ?? [], - factoryQueryType: HostsQueries.hosts, - filterQuery: createFilter(filterQuery), - pagination: generateTablePaginationOptions(activePage, limit), - timerange: { - interval: '12h', - from: startDate, - to: endDate, - }, - sort: { - direction, - field: sortField, - }, - }); + const [hostsRequest, setHostRequest] = useState( + !skip + ? { + defaultIndex: indexNames, + docValueFields: docValueFields ?? [], + factoryQueryType: HostsQueries.hosts, + filterQuery: createFilter(filterQuery), + id: ID, + pagination: generateTablePaginationOptions(activePage, limit), + timerange: { + interval: '12h', + from: startDate, + to: endDate, + }, + sort: { + direction, + field: sortField, + }, + } + : null + ); const wrappedLoadMore = useCallback( (newActivePage: number) => { - setHostRequest((prevRequest) => ({ - ...prevRequest, - pagination: generateTablePaginationOptions(newActivePage, limit), - })); + setHostRequest((prevRequest) => { + if (!prevRequest) { + return prevRequest; + } + + return { + ...prevRequest, + pagination: generateTablePaginationOptions(newActivePage, limit), + }; + }); }, [limit] ); @@ -124,7 +135,11 @@ export const useAllHost = ({ }); const hostsSearch = useCallback( - (request: HostsRequestOptions) => { + (request: HostsRequestOptions | null) => { + if (request == null) { + return; + } + let didCancel = false; const asyncSearch = async () => { abortCtrl.current = new AbortController(); @@ -180,10 +195,12 @@ export const useAllHost = ({ useEffect(() => { setHostRequest((prevRequest) => { const myRequest = { - ...prevRequest, + ...(prevRequest ?? {}), defaultIndex: indexNames, docValueFields: docValueFields ?? [], + factoryQueryType: HostsQueries.hosts, filterQuery: createFilter(filterQuery), + id: ID, pagination: generateTablePaginationOptions(activePage, limit), timerange: { interval: '12h', diff --git a/x-pack/plugins/security_solution/public/hosts/containers/kpi_hosts/authentications/index.tsx b/x-pack/plugins/security_solution/public/hosts/containers/kpi_hosts/authentications/index.tsx index 404231be1e6cd..90be23b48786c 100644 --- a/x-pack/plugins/security_solution/public/hosts/containers/kpi_hosts/authentications/index.tsx +++ b/x-pack/plugins/security_solution/public/hosts/containers/kpi_hosts/authentications/index.tsx @@ -52,19 +52,24 @@ export const useHostsKpiAuthentications = ({ const refetch = useRef(noop); const abortCtrl = useRef(new AbortController()); const [loading, setLoading] = useState(false); - const [hostsKpiAuthenticationsRequest, setHostsKpiAuthenticationsRequest] = useState< - HostsKpiAuthenticationsRequestOptions - >({ - defaultIndex: indexNames, - factoryQueryType: HostsKpiQueries.kpiAuthentications, - filterQuery: createFilter(filterQuery), - id: ID, - timerange: { - interval: '12h', - from: startDate, - to: endDate, - }, - }); + const [ + hostsKpiAuthenticationsRequest, + setHostsKpiAuthenticationsRequest, + ] = useState( + !skip + ? { + defaultIndex: indexNames, + factoryQueryType: HostsKpiQueries.kpiAuthentications, + filterQuery: createFilter(filterQuery), + id: ID, + timerange: { + interval: '12h', + from: startDate, + to: endDate, + }, + } + : null + ); const [hostsKpiAuthenticationsResponse, setHostsKpiAuthenticationsResponse] = useState< HostsKpiAuthenticationsArgs @@ -83,7 +88,11 @@ export const useHostsKpiAuthentications = ({ }); const hostsKpiAuthenticationsSearch = useCallback( - (request: HostsKpiAuthenticationsRequestOptions) => { + (request: HostsKpiAuthenticationsRequestOptions | null) => { + if (request == null) { + return; + } + let didCancel = false; const asyncSearch = async () => { abortCtrl.current = new AbortController(); @@ -146,9 +155,11 @@ export const useHostsKpiAuthentications = ({ useEffect(() => { setHostsKpiAuthenticationsRequest((prevRequest) => { const myRequest = { - ...prevRequest, + ...(prevRequest ?? {}), defaultIndex: indexNames, + factoryQueryType: HostsKpiQueries.kpiAuthentications, filterQuery: createFilter(filterQuery), + id: ID, timerange: { interval: '12h', from: startDate, diff --git a/x-pack/plugins/security_solution/public/hosts/containers/kpi_hosts/hosts/index.tsx b/x-pack/plugins/security_solution/public/hosts/containers/kpi_hosts/hosts/index.tsx index bb918a9214f40..2bb08dec78e8f 100644 --- a/x-pack/plugins/security_solution/public/hosts/containers/kpi_hosts/hosts/index.tsx +++ b/x-pack/plugins/security_solution/public/hosts/containers/kpi_hosts/hosts/index.tsx @@ -51,17 +51,24 @@ export const useHostsKpiHosts = ({ const refetch = useRef(noop); const abortCtrl = useRef(new AbortController()); const [loading, setLoading] = useState(false); - const [hostsKpiHostsRequest, setHostsKpiHostsRequest] = useState({ - defaultIndex: indexNames, - factoryQueryType: HostsKpiQueries.kpiHosts, - filterQuery: createFilter(filterQuery), - id: ID, - timerange: { - interval: '12h', - from: startDate, - to: endDate, - }, - }); + const [ + hostsKpiHostsRequest, + setHostsKpiHostsRequest, + ] = useState( + !skip + ? { + defaultIndex: indexNames, + factoryQueryType: HostsKpiQueries.kpiHosts, + filterQuery: createFilter(filterQuery), + id: ID, + timerange: { + interval: '12h', + from: startDate, + to: endDate, + }, + } + : null + ); const [hostsKpiHostsResponse, setHostsKpiHostsResponse] = useState({ hosts: 0, @@ -76,7 +83,11 @@ export const useHostsKpiHosts = ({ }); const hostsKpiHostsSearch = useCallback( - (request: HostsKpiHostsRequestOptions) => { + (request: HostsKpiHostsRequestOptions | null) => { + if (request == null) { + return; + } + let didCancel = false; const asyncSearch = async () => { abortCtrl.current = new AbortController(); @@ -134,9 +145,11 @@ export const useHostsKpiHosts = ({ useEffect(() => { setHostsKpiHostsRequest((prevRequest) => { const myRequest = { - ...prevRequest, + ...(prevRequest ?? {}), defaultIndex: indexNames, + factoryQueryType: HostsKpiQueries.kpiHosts, filterQuery: createFilter(filterQuery), + id: ID, timerange: { interval: '12h', from: startDate, diff --git a/x-pack/plugins/security_solution/public/hosts/containers/kpi_hosts/unique_ips/index.tsx b/x-pack/plugins/security_solution/public/hosts/containers/kpi_hosts/unique_ips/index.tsx index b8e93eef8dc91..e5ef53643ff53 100644 --- a/x-pack/plugins/security_solution/public/hosts/containers/kpi_hosts/unique_ips/index.tsx +++ b/x-pack/plugins/security_solution/public/hosts/containers/kpi_hosts/unique_ips/index.tsx @@ -52,19 +52,24 @@ export const useHostsKpiUniqueIps = ({ const refetch = useRef(noop); const abortCtrl = useRef(new AbortController()); const [loading, setLoading] = useState(false); - const [hostsKpiUniqueIpsRequest, setHostsKpiUniqueIpsRequest] = useState< - HostsKpiUniqueIpsRequestOptions - >({ - defaultIndex: indexNames, - factoryQueryType: HostsKpiQueries.kpiUniqueIps, - filterQuery: createFilter(filterQuery), - id: ID, - timerange: { - interval: '12h', - from: startDate, - to: endDate, - }, - }); + const [ + hostsKpiUniqueIpsRequest, + setHostsKpiUniqueIpsRequest, + ] = useState( + !skip + ? { + defaultIndex: indexNames, + factoryQueryType: HostsKpiQueries.kpiUniqueIps, + filterQuery: createFilter(filterQuery), + id: ID, + timerange: { + interval: '12h', + from: startDate, + to: endDate, + }, + } + : null + ); const [hostsKpiUniqueIpsResponse, setHostsKpiUniqueIpsResponse] = useState( { @@ -83,7 +88,11 @@ export const useHostsKpiUniqueIps = ({ ); const hostsKpiUniqueIpsSearch = useCallback( - (request: HostsKpiUniqueIpsRequestOptions) => { + (request: HostsKpiUniqueIpsRequestOptions | null) => { + if (request == null) { + return; + } + let didCancel = false; const asyncSearch = async () => { abortCtrl.current = new AbortController(); @@ -143,9 +152,11 @@ export const useHostsKpiUniqueIps = ({ useEffect(() => { setHostsKpiUniqueIpsRequest((prevRequest) => { const myRequest = { - ...prevRequest, + ...(prevRequest ?? {}), defaultIndex: indexNames, + factoryQueryType: HostsKpiQueries.kpiUniqueIps, filterQuery: createFilter(filterQuery), + id: ID, timerange: { interval: '12h', from: startDate, diff --git a/x-pack/plugins/security_solution/public/hosts/containers/uncommon_processes/index.tsx b/x-pack/plugins/security_solution/public/hosts/containers/uncommon_processes/index.tsx index 4036837024025..2bf97c896f5e5 100644 --- a/x-pack/plugins/security_solution/public/hosts/containers/uncommon_processes/index.tsx +++ b/x-pack/plugins/security_solution/public/hosts/containers/uncommon_processes/index.tsx @@ -35,7 +35,7 @@ import { ESTermQuery } from '../../../../common/typed_json'; import { getInspectResponse } from '../../../helpers'; import { InspectResponse } from '../../../types'; -const ID = 'uncommonProcessesQuery'; +const ID = 'hostsUncommonProcessesQuery'; export interface UncommonProcessesArgs { id: string; @@ -75,25 +75,35 @@ export const useUncommonProcesses = ({ const refetch = useRef(noop); const abortCtrl = useRef(new AbortController()); const [loading, setLoading] = useState(false); - const [uncommonProcessesRequest, setUncommonProcessesRequest] = useState< - HostsUncommonProcessesRequestOptions - >({ - defaultIndex: indexNames, - docValueFields: docValueFields ?? [], - factoryQueryType: HostsQueries.uncommonProcesses, - filterQuery: createFilter(filterQuery), - pagination: generateTablePaginationOptions(activePage, limit), - timerange: { - interval: '12h', - from: startDate!, - to: endDate!, - }, - sort: {} as SortField, - }); + const [ + uncommonProcessesRequest, + setUncommonProcessesRequest, + ] = useState( + !skip + ? { + defaultIndex: indexNames, + docValueFields: docValueFields ?? [], + factoryQueryType: HostsQueries.uncommonProcesses, + filterQuery: createFilter(filterQuery), + id: ID, + pagination: generateTablePaginationOptions(activePage, limit), + timerange: { + interval: '12h', + from: startDate!, + to: endDate!, + }, + sort: {} as SortField, + } + : null + ); const wrappedLoadMore = useCallback( (newActivePage: number) => { setUncommonProcessesRequest((prevRequest) => { + if (!prevRequest) { + return prevRequest; + } + return { ...prevRequest, pagination: generateTablePaginationOptions(newActivePage, limit), @@ -124,7 +134,11 @@ export const useUncommonProcesses = ({ ); const uncommonProcessesSearch = useCallback( - (request: HostsUncommonProcessesRequestOptions) => { + (request: HostsUncommonProcessesRequestOptions | null) => { + if (request == null) { + return; + } + let didCancel = false; const asyncSearch = async () => { abortCtrl.current = new AbortController(); @@ -185,10 +199,12 @@ export const useUncommonProcesses = ({ useEffect(() => { setUncommonProcessesRequest((prevRequest) => { const myRequest = { - ...prevRequest, + ...(prevRequest ?? {}), defaultIndex: indexNames, docValueFields: docValueFields ?? [], + factoryQueryType: HostsQueries.uncommonProcesses, filterQuery: createFilter(filterQuery), + id: ID, pagination: generateTablePaginationOptions(activePage, limit), timerange: { interval: '12h', diff --git a/x-pack/plugins/security_solution/public/network/containers/details/index.tsx b/x-pack/plugins/security_solution/public/network/containers/details/index.tsx index 217241bdadcbb..238270107b071 100644 --- a/x-pack/plugins/security_solution/public/network/containers/details/index.tsx +++ b/x-pack/plugins/security_solution/public/network/containers/details/index.tsx @@ -59,13 +59,21 @@ export const useNetworkDetails = ({ const abortCtrl = useRef(new AbortController()); const [loading, setLoading] = useState(false); - const [networkDetailsRequest, setNetworkDetailsRequest] = useState({ - defaultIndex: indexNames, - docValueFields: docValueFields ?? [], - factoryQueryType: NetworkQueries.details, - filterQuery: createFilter(filterQuery), - ip, - }); + const [ + networkDetailsRequest, + setNetworkDetailsRequest, + ] = useState( + !skip + ? { + defaultIndex: indexNames, + docValueFields: docValueFields ?? [], + factoryQueryType: NetworkQueries.details, + filterQuery: createFilter(filterQuery), + id, + ip, + } + : null + ); const [networkDetailsResponse, setNetworkDetailsResponse] = useState({ networkDetails: {}, @@ -79,7 +87,11 @@ export const useNetworkDetails = ({ }); const networkDetailsSearch = useCallback( - (request: NetworkDetailsRequestOptions) => { + (request: NetworkDetailsRequestOptions | null) => { + if (request == null) { + return; + } + let didCancel = false; const asyncSearch = async () => { abortCtrl.current = new AbortController(); @@ -136,18 +148,20 @@ export const useNetworkDetails = ({ useEffect(() => { setNetworkDetailsRequest((prevRequest) => { const myRequest = { - ...prevRequest, + ...(prevRequest ?? {}), defaultIndex: indexNames, - ip, docValueFields: docValueFields ?? [], + factoryQueryType: NetworkQueries.details, filterQuery: createFilter(filterQuery), + id, + ip, }; if (!skip && !deepEqual(prevRequest, myRequest)) { return myRequest; } return prevRequest; }); - }, [indexNames, filterQuery, skip, ip, docValueFields]); + }, [indexNames, filterQuery, skip, ip, docValueFields, id]); useEffect(() => { networkDetailsSearch(networkDetailsRequest); diff --git a/x-pack/plugins/security_solution/public/network/containers/kpi_network/dns/index.tsx b/x-pack/plugins/security_solution/public/network/containers/kpi_network/dns/index.tsx index dc60bb0a82ba8..aa0e607fc3c05 100644 --- a/x-pack/plugins/security_solution/public/network/containers/kpi_network/dns/index.tsx +++ b/x-pack/plugins/security_solution/public/network/containers/kpi_network/dns/index.tsx @@ -56,17 +56,24 @@ export const useNetworkKpiDns = ({ const refetch = useRef(noop); const abortCtrl = useRef(new AbortController()); const [loading, setLoading] = useState(false); - const [networkKpiDnsRequest, setNetworkKpiDnsRequest] = useState({ - defaultIndex: indexNames, - factoryQueryType: NetworkKpiQueries.dns, - filterQuery: createFilter(filterQuery), - id: ID, - timerange: { - interval: '12h', - from: startDate, - to: endDate, - }, - }); + const [ + networkKpiDnsRequest, + setNetworkKpiDnsRequest, + ] = useState( + !skip + ? { + defaultIndex: indexNames, + factoryQueryType: NetworkKpiQueries.dns, + filterQuery: createFilter(filterQuery), + id: ID, + timerange: { + interval: '12h', + from: startDate, + to: endDate, + }, + } + : null + ); const [networkKpiDnsResponse, setNetworkKpiDnsResponse] = useState({ dnsQueries: 0, @@ -80,7 +87,11 @@ export const useNetworkKpiDns = ({ }); const networkKpiDnsSearch = useCallback( - (request: NetworkKpiDnsRequestOptions) => { + (request: NetworkKpiDnsRequestOptions | null) => { + if (request == null) { + return; + } + let didCancel = false; const asyncSearch = async () => { abortCtrl.current = new AbortController(); @@ -137,9 +148,11 @@ export const useNetworkKpiDns = ({ useEffect(() => { setNetworkKpiDnsRequest((prevRequest) => { const myRequest = { - ...prevRequest, + ...(prevRequest ?? {}), defaultIndex: indexNames, + factoryQueryType: NetworkKpiQueries.dns, filterQuery: createFilter(filterQuery), + id: ID, timerange: { interval: '12h', from: startDate, diff --git a/x-pack/plugins/security_solution/public/network/containers/kpi_network/network_events/index.tsx b/x-pack/plugins/security_solution/public/network/containers/kpi_network/network_events/index.tsx index a1727d5bb4331..9ab14602140f7 100644 --- a/x-pack/plugins/security_solution/public/network/containers/kpi_network/network_events/index.tsx +++ b/x-pack/plugins/security_solution/public/network/containers/kpi_network/network_events/index.tsx @@ -56,19 +56,24 @@ export const useNetworkKpiNetworkEvents = ({ const refetch = useRef(noop); const abortCtrl = useRef(new AbortController()); const [loading, setLoading] = useState(false); - const [networkKpiNetworkEventsRequest, setNetworkKpiNetworkEventsRequest] = useState< - NetworkKpiNetworkEventsRequestOptions - >({ - defaultIndex: indexNames, - factoryQueryType: NetworkKpiQueries.networkEvents, - filterQuery: createFilter(filterQuery), - id: ID, - timerange: { - interval: '12h', - from: startDate, - to: endDate, - }, - }); + const [ + networkKpiNetworkEventsRequest, + setNetworkKpiNetworkEventsRequest, + ] = useState( + !skip + ? { + defaultIndex: indexNames, + factoryQueryType: NetworkKpiQueries.networkEvents, + filterQuery: createFilter(filterQuery), + id: ID, + timerange: { + interval: '12h', + from: startDate, + to: endDate, + }, + } + : null + ); const [networkKpiNetworkEventsResponse, setNetworkKpiNetworkEventsResponse] = useState< NetworkKpiNetworkEventsArgs @@ -84,7 +89,11 @@ export const useNetworkKpiNetworkEvents = ({ }); const networkKpiNetworkEventsSearch = useCallback( - (request: NetworkKpiNetworkEventsRequestOptions) => { + (request: NetworkKpiNetworkEventsRequestOptions | null) => { + if (request == null) { + return; + } + let didCancel = false; const asyncSearch = async () => { abortCtrl.current = new AbortController(); @@ -144,9 +153,11 @@ export const useNetworkKpiNetworkEvents = ({ useEffect(() => { setNetworkKpiNetworkEventsRequest((prevRequest) => { const myRequest = { - ...prevRequest, + ...(prevRequest ?? {}), defaultIndex: indexNames, + factoryQueryType: NetworkKpiQueries.networkEvents, filterQuery: createFilter(filterQuery), + id: ID, timerange: { interval: '12h', from: startDate, diff --git a/x-pack/plugins/security_solution/public/network/containers/kpi_network/tls_handshakes/index.tsx b/x-pack/plugins/security_solution/public/network/containers/kpi_network/tls_handshakes/index.tsx index bcbe485e82163..bc32395c100f2 100644 --- a/x-pack/plugins/security_solution/public/network/containers/kpi_network/tls_handshakes/index.tsx +++ b/x-pack/plugins/security_solution/public/network/containers/kpi_network/tls_handshakes/index.tsx @@ -56,19 +56,24 @@ export const useNetworkKpiTlsHandshakes = ({ const refetch = useRef(noop); const abortCtrl = useRef(new AbortController()); const [loading, setLoading] = useState(false); - const [networkKpiTlsHandshakesRequest, setNetworkKpiTlsHandshakesRequest] = useState< - NetworkKpiTlsHandshakesRequestOptions - >({ - defaultIndex: indexNames, - factoryQueryType: NetworkKpiQueries.tlsHandshakes, - filterQuery: createFilter(filterQuery), - id: ID, - timerange: { - interval: '12h', - from: startDate, - to: endDate, - }, - }); + const [ + networkKpiTlsHandshakesRequest, + setNetworkKpiTlsHandshakesRequest, + ] = useState( + !skip + ? { + defaultIndex: indexNames, + factoryQueryType: NetworkKpiQueries.tlsHandshakes, + filterQuery: createFilter(filterQuery), + id: ID, + timerange: { + interval: '12h', + from: startDate, + to: endDate, + }, + } + : null + ); const [networkKpiTlsHandshakesResponse, setNetworkKpiTlsHandshakesResponse] = useState< NetworkKpiTlsHandshakesArgs @@ -84,7 +89,10 @@ export const useNetworkKpiTlsHandshakes = ({ }); const networkKpiTlsHandshakesSearch = useCallback( - (request: NetworkKpiTlsHandshakesRequestOptions) => { + (request: NetworkKpiTlsHandshakesRequestOptions | null) => { + if (request == null) { + return; + } let didCancel = false; const asyncSearch = async () => { abortCtrl.current = new AbortController(); @@ -144,9 +152,11 @@ export const useNetworkKpiTlsHandshakes = ({ useEffect(() => { setNetworkKpiTlsHandshakesRequest((prevRequest) => { const myRequest = { - ...prevRequest, + ...(prevRequest ?? {}), defaultIndex: indexNames, + factoryQueryType: NetworkKpiQueries.tlsHandshakes, filterQuery: createFilter(filterQuery), + id: ID, timerange: { interval: '12h', from: startDate, diff --git a/x-pack/plugins/security_solution/public/network/containers/kpi_network/unique_flows/index.tsx b/x-pack/plugins/security_solution/public/network/containers/kpi_network/unique_flows/index.tsx index a4fdefc93fe75..256953efac146 100644 --- a/x-pack/plugins/security_solution/public/network/containers/kpi_network/unique_flows/index.tsx +++ b/x-pack/plugins/security_solution/public/network/containers/kpi_network/unique_flows/index.tsx @@ -56,19 +56,24 @@ export const useNetworkKpiUniqueFlows = ({ const refetch = useRef(noop); const abortCtrl = useRef(new AbortController()); const [loading, setLoading] = useState(false); - const [networkKpiUniqueFlowsRequest, setNetworkKpiUniqueFlowsRequest] = useState< - NetworkKpiUniqueFlowsRequestOptions - >({ - defaultIndex: indexNames, - factoryQueryType: NetworkKpiQueries.uniqueFlows, - filterQuery: createFilter(filterQuery), - id: ID, - timerange: { - interval: '12h', - from: startDate, - to: endDate, - }, - }); + const [ + networkKpiUniqueFlowsRequest, + setNetworkKpiUniqueFlowsRequest, + ] = useState( + !skip + ? { + defaultIndex: indexNames, + factoryQueryType: NetworkKpiQueries.uniqueFlows, + filterQuery: createFilter(filterQuery), + id: ID, + timerange: { + interval: '12h', + from: startDate, + to: endDate, + }, + } + : null + ); const [networkKpiUniqueFlowsResponse, setNetworkKpiUniqueFlowsResponse] = useState< NetworkKpiUniqueFlowsArgs @@ -84,7 +89,11 @@ export const useNetworkKpiUniqueFlows = ({ }); const networkKpiUniqueFlowsSearch = useCallback( - (request: NetworkKpiUniqueFlowsRequestOptions) => { + (request: NetworkKpiUniqueFlowsRequestOptions | null) => { + if (request == null) { + return; + } + let didCancel = false; const asyncSearch = async () => { abortCtrl.current = new AbortController(); @@ -144,9 +153,11 @@ export const useNetworkKpiUniqueFlows = ({ useEffect(() => { setNetworkKpiUniqueFlowsRequest((prevRequest) => { const myRequest = { - ...prevRequest, + ...(prevRequest ?? {}), defaultIndex: indexNames, + factoryQueryType: NetworkKpiQueries.uniqueFlows, filterQuery: createFilter(filterQuery), + id: ID, timerange: { interval: '12h', from: startDate, diff --git a/x-pack/plugins/security_solution/public/network/containers/kpi_network/unique_private_ips/index.tsx b/x-pack/plugins/security_solution/public/network/containers/kpi_network/unique_private_ips/index.tsx index 5e9d829077f23..54307eb7c4c1d 100644 --- a/x-pack/plugins/security_solution/public/network/containers/kpi_network/unique_private_ips/index.tsx +++ b/x-pack/plugins/security_solution/public/network/containers/kpi_network/unique_private_ips/index.tsx @@ -60,19 +60,24 @@ export const useNetworkKpiUniquePrivateIps = ({ const refetch = useRef(noop); const abortCtrl = useRef(new AbortController()); const [loading, setLoading] = useState(false); - const [networkKpiUniquePrivateIpsRequest, setNetworkKpiUniquePrivateIpsRequest] = useState< - NetworkKpiUniquePrivateIpsRequestOptions - >({ - defaultIndex: indexNames, - factoryQueryType: NetworkKpiQueries.uniquePrivateIps, - filterQuery: createFilter(filterQuery), - id: ID, - timerange: { - interval: '12h', - from: startDate, - to: endDate, - }, - }); + const [ + networkKpiUniquePrivateIpsRequest, + setNetworkKpiUniquePrivateIpsRequest, + ] = useState( + !skip + ? { + defaultIndex: indexNames, + factoryQueryType: NetworkKpiQueries.uniquePrivateIps, + filterQuery: createFilter(filterQuery), + id: ID, + timerange: { + interval: '12h', + from: startDate, + to: endDate, + }, + } + : null + ); const [networkKpiUniquePrivateIpsResponse, setNetworkKpiUniquePrivateIpsResponse] = useState< NetworkKpiUniquePrivateIpsArgs @@ -91,7 +96,11 @@ export const useNetworkKpiUniquePrivateIps = ({ }); const networkKpiUniquePrivateIpsSearch = useCallback( - (request: NetworkKpiUniquePrivateIpsRequestOptions) => { + (request: NetworkKpiUniquePrivateIpsRequestOptions | null) => { + if (request == null) { + return; + } + let didCancel = false; const asyncSearch = async () => { abortCtrl.current = new AbortController(); @@ -155,9 +164,11 @@ export const useNetworkKpiUniquePrivateIps = ({ useEffect(() => { setNetworkKpiUniquePrivateIpsRequest((prevRequest) => { const myRequest = { - ...prevRequest, + ...(prevRequest ?? {}), defaultIndex: indexNames, + factoryQueryType: NetworkKpiQueries.uniquePrivateIps, filterQuery: createFilter(filterQuery), + id: ID, timerange: { interval: '12h', from: startDate, diff --git a/x-pack/plugins/security_solution/public/network/containers/network_dns/index.tsx b/x-pack/plugins/security_solution/public/network/containers/network_dns/index.tsx index c49aa6a415904..576fc810e9c5f 100644 --- a/x-pack/plugins/security_solution/public/network/containers/network_dns/index.tsx +++ b/x-pack/plugins/security_solution/public/network/containers/network_dns/index.tsx @@ -61,7 +61,6 @@ interface UseNetworkDns { export const useNetworkDns = ({ endDate, filterQuery, - id = ID, indexNames, skip, startDate, @@ -74,26 +73,37 @@ export const useNetworkDns = ({ const abortCtrl = useRef(new AbortController()); const [loading, setLoading] = useState(false); - const [networkDnsRequest, setNetworkDnsRequest] = useState({ - defaultIndex: indexNames, - factoryQueryType: NetworkQueries.dns, - filterQuery: createFilter(filterQuery), - isPtrIncluded, - pagination: generateTablePaginationOptions(activePage, limit), - sort, - timerange: { - interval: '12h', - from: startDate ? startDate : '', - to: endDate ? endDate : new Date(Date.now()).toISOString(), - }, - }); + const [networkDnsRequest, setNetworkDnsRequest] = useState( + !skip + ? { + defaultIndex: indexNames, + factoryQueryType: NetworkQueries.dns, + filterQuery: createFilter(filterQuery), + id: ID, + isPtrIncluded, + pagination: generateTablePaginationOptions(activePage, limit), + sort, + timerange: { + interval: '12h', + from: startDate ? startDate : '', + to: endDate ? endDate : new Date(Date.now()).toISOString(), + }, + } + : null + ); const wrappedLoadMore = useCallback( (newActivePage: number) => { - setNetworkDnsRequest((prevRequest) => ({ - ...prevRequest, - pagination: generateTablePaginationOptions(newActivePage, limit), - })); + setNetworkDnsRequest((prevRequest) => { + if (!prevRequest) { + return prevRequest; + } + + return { + ...prevRequest, + pagination: generateTablePaginationOptions(newActivePage, limit), + }; + }); }, [limit] ); @@ -118,7 +128,11 @@ export const useNetworkDns = ({ }); const networkDnsSearch = useCallback( - (request: NetworkDnsRequestOptions) => { + (request: NetworkDnsRequestOptions | null) => { + if (request == null) { + return; + } + let didCancel = false; const asyncSearch = async () => { abortCtrl.current = new AbortController(); @@ -178,10 +192,12 @@ export const useNetworkDns = ({ useEffect(() => { setNetworkDnsRequest((prevRequest) => { const myRequest = { - ...prevRequest, + ...(prevRequest ?? {}), defaultIndex: indexNames, isPtrIncluded, + factoryQueryType: NetworkQueries.dns, filterQuery: createFilter(filterQuery), + id: ID, pagination: generateTablePaginationOptions(activePage, limit), sort, timerange: { diff --git a/x-pack/plugins/security_solution/public/network/containers/network_http/index.tsx b/x-pack/plugins/security_solution/public/network/containers/network_http/index.tsx index ec4ac39599351..12c3cc481cfc1 100644 --- a/x-pack/plugins/security_solution/public/network/containers/network_http/index.tsx +++ b/x-pack/plugins/security_solution/public/network/containers/network_http/index.tsx @@ -76,23 +76,32 @@ export const useNetworkHttp = ({ const abortCtrl = useRef(new AbortController()); const [loading, setLoading] = useState(false); - const [networkHttpRequest, setHostRequest] = useState({ - defaultIndex: indexNames, - factoryQueryType: NetworkQueries.http, - filterQuery: createFilter(filterQuery), - ip, - pagination: generateTablePaginationOptions(activePage, limit), - sort: sort as SortField, - timerange: { - interval: '12h', - from: startDate ? startDate : '', - to: endDate ? endDate : new Date(Date.now()).toISOString(), - }, - }); + const [networkHttpRequest, setHostRequest] = useState( + !skip + ? { + defaultIndex: indexNames, + factoryQueryType: NetworkQueries.http, + filterQuery: createFilter(filterQuery), + id: ID, + ip, + pagination: generateTablePaginationOptions(activePage, limit), + sort: sort as SortField, + timerange: { + interval: '12h', + from: startDate ? startDate : '', + to: endDate ? endDate : new Date(Date.now()).toISOString(), + }, + } + : null + ); const wrappedLoadMore = useCallback( (newActivePage: number) => { setHostRequest((prevRequest) => { + if (!prevRequest) { + return prevRequest; + } + return { ...prevRequest, pagination: generateTablePaginationOptions(newActivePage, limit), @@ -121,7 +130,11 @@ export const useNetworkHttp = ({ }); const networkHttpSearch = useCallback( - (request: NetworkHttpRequestOptions) => { + (request: NetworkHttpRequestOptions | null) => { + if (request == null) { + return; + } + let didCancel = false; const asyncSearch = async () => { abortCtrl.current = new AbortController(); @@ -180,9 +193,11 @@ export const useNetworkHttp = ({ useEffect(() => { setHostRequest((prevRequest) => { const myRequest = { - ...prevRequest, + ...(prevRequest ?? {}), defaultIndex: indexNames, + factoryQueryType: NetworkQueries.http, filterQuery: createFilter(filterQuery), + id: ID, pagination: generateTablePaginationOptions(activePage, limit), sort: sort as SortField, timerange: { diff --git a/x-pack/plugins/security_solution/public/network/containers/network_top_countries/index.tsx b/x-pack/plugins/security_solution/public/network/containers/network_top_countries/index.tsx index 2d75de138a88c..0b864d66842d1 100644 --- a/x-pack/plugins/security_solution/public/network/containers/network_top_countries/index.tsx +++ b/x-pack/plugins/security_solution/public/network/containers/network_top_countries/index.tsx @@ -5,7 +5,7 @@ */ import { noop } from 'lodash/fp'; -import { useState, useEffect, useCallback, useRef } from 'react'; +import { useState, useEffect, useCallback, useMemo, useRef } from 'react'; import deepEqual from 'fast-deep-equal'; import { ESTermQuery } from '../../../../common/typed_json'; @@ -73,27 +73,42 @@ export const useNetworkTopCountries = ({ const refetch = useRef(noop); const abortCtrl = useRef(new AbortController()); const [loading, setLoading] = useState(false); + const queryId = useMemo(() => `${ID}-${flowTarget}`, [flowTarget]); - const [networkTopCountriesRequest, setHostRequest] = useState({ - defaultIndex: indexNames, - factoryQueryType: NetworkQueries.topCountries, - filterQuery: createFilter(filterQuery), - flowTarget, - pagination: generateTablePaginationOptions(activePage, limit), - sort, - timerange: { - interval: '12h', - from: startDate ? startDate : '', - to: endDate ? endDate : new Date(Date.now()).toISOString(), - }, - }); + const [ + networkTopCountriesRequest, + setHostRequest, + ] = useState( + !skip + ? { + defaultIndex: indexNames, + factoryQueryType: NetworkQueries.topCountries, + filterQuery: createFilter(filterQuery), + flowTarget, + id: queryId, + pagination: generateTablePaginationOptions(activePage, limit), + sort, + timerange: { + interval: '12h', + from: startDate ? startDate : '', + to: endDate ? endDate : new Date(Date.now()).toISOString(), + }, + } + : null + ); const wrappedLoadMore = useCallback( (newActivePage: number) => { - setHostRequest((prevRequest) => ({ - ...prevRequest, - pagination: generateTablePaginationOptions(newActivePage, limit), - })); + setHostRequest((prevRequest) => { + if (!prevRequest) { + return prevRequest; + } + + return { + ...prevRequest, + pagination: generateTablePaginationOptions(newActivePage, limit), + }; + }); }, [limit] ); @@ -102,7 +117,7 @@ export const useNetworkTopCountries = ({ NetworkTopCountriesArgs >({ networkTopCountries: [], - id: `${ID}-${flowTarget}`, + id: queryId, inspect: { dsl: [], response: [], @@ -119,7 +134,11 @@ export const useNetworkTopCountries = ({ }); const networkTopCountriesSearch = useCallback( - (request: NetworkTopCountriesRequestOptions) => { + (request: NetworkTopCountriesRequestOptions | null) => { + if (request == null) { + return; + } + let didCancel = false; const asyncSearch = async () => { abortCtrl.current = new AbortController(); @@ -178,9 +197,12 @@ export const useNetworkTopCountries = ({ useEffect(() => { setHostRequest((prevRequest) => { const myRequest = { - ...prevRequest, + ...(prevRequest ?? {}), defaultIndex: indexNames, + factoryQueryType: NetworkQueries.topCountries, filterQuery: createFilter(filterQuery), + flowTarget, + id: queryId, pagination: generateTablePaginationOptions(activePage, limit), sort, timerange: { @@ -194,7 +216,18 @@ export const useNetworkTopCountries = ({ } return prevRequest; }); - }, [activePage, indexNames, endDate, filterQuery, limit, startDate, sort, skip]); + }, [ + activePage, + indexNames, + endDate, + filterQuery, + limit, + startDate, + sort, + skip, + flowTarget, + queryId, + ]); useEffect(() => { networkTopCountriesSearch(networkTopCountriesRequest); diff --git a/x-pack/plugins/security_solution/public/network/containers/network_top_n_flow/index.tsx b/x-pack/plugins/security_solution/public/network/containers/network_top_n_flow/index.tsx index 328bb5aabcbb8..c68ad2422c514 100644 --- a/x-pack/plugins/security_solution/public/network/containers/network_top_n_flow/index.tsx +++ b/x-pack/plugins/security_solution/public/network/containers/network_top_n_flow/index.tsx @@ -74,26 +74,40 @@ export const useNetworkTopNFlow = ({ const abortCtrl = useRef(new AbortController()); const [loading, setLoading] = useState(false); - const [networkTopNFlowRequest, setTopNFlowRequest] = useState({ - defaultIndex: indexNames, - factoryQueryType: NetworkQueries.topNFlow, - filterQuery: createFilter(filterQuery), - flowTarget, - pagination: generateTablePaginationOptions(activePage, limit), - sort, - timerange: { - interval: '12h', - from: startDate ? startDate : '', - to: endDate ? endDate : new Date(Date.now()).toISOString(), - }, - }); + const [ + networkTopNFlowRequest, + setTopNFlowRequest, + ] = useState( + !skip + ? { + defaultIndex: indexNames, + factoryQueryType: NetworkQueries.topNFlow, + filterQuery: createFilter(filterQuery), + flowTarget, + id: ID, + pagination: generateTablePaginationOptions(activePage, limit), + sort, + timerange: { + interval: '12h', + from: startDate ? startDate : '', + to: endDate ? endDate : new Date(Date.now()).toISOString(), + }, + } + : null + ); const wrappedLoadMore = useCallback( (newActivePage: number) => { - setTopNFlowRequest((prevRequest) => ({ - ...prevRequest, - pagination: generateTablePaginationOptions(newActivePage, limit), - })); + setTopNFlowRequest((prevRequest) => { + if (!prevRequest) { + return prevRequest; + } + + return { + ...prevRequest, + pagination: generateTablePaginationOptions(newActivePage, limit), + }; + }); }, [limit] ); @@ -117,7 +131,11 @@ export const useNetworkTopNFlow = ({ }); const networkTopNFlowSearch = useCallback( - (request: NetworkTopNFlowRequestOptions) => { + (request: NetworkTopNFlowRequestOptions | null) => { + if (request == null) { + return; + } + let didCancel = false; const asyncSearch = async () => { abortCtrl.current = new AbortController(); @@ -176,9 +194,12 @@ export const useNetworkTopNFlow = ({ useEffect(() => { setTopNFlowRequest((prevRequest) => { const myRequest = { - ...prevRequest, + ...(prevRequest ?? {}), defaultIndex: indexNames, + factoryQueryType: NetworkQueries.topNFlow, filterQuery: createFilter(filterQuery), + flowTarget, + id: ID, pagination: generateTablePaginationOptions(activePage, limit), timerange: { interval: '12h', @@ -192,7 +213,7 @@ export const useNetworkTopNFlow = ({ } return prevRequest; }); - }, [activePage, indexNames, endDate, filterQuery, limit, startDate, sort, skip]); + }, [activePage, indexNames, endDate, filterQuery, limit, startDate, sort, skip, flowTarget]); useEffect(() => { networkTopNFlowSearch(networkTopNFlowRequest); diff --git a/x-pack/plugins/security_solution/public/network/containers/tls/index.tsx b/x-pack/plugins/security_solution/public/network/containers/tls/index.tsx index ddea2914a1bbb..09ade9c1bd885 100644 --- a/x-pack/plugins/security_solution/public/network/containers/tls/index.tsx +++ b/x-pack/plugins/security_solution/public/network/containers/tls/index.tsx @@ -75,28 +75,38 @@ export const useNetworkTls = ({ const abortCtrl = useRef(new AbortController()); const [loading, setLoading] = useState(false); - const [networkTlsRequest, setHostRequest] = useState({ - defaultIndex: indexNames, - factoryQueryType: NetworkQueries.tls, - filterQuery: createFilter(filterQuery), - flowTarget, - id, - ip, - pagination: generateTablePaginationOptions(activePage, limit), - sort, - timerange: { - interval: '12h', - from: startDate ? startDate : '', - to: endDate ? endDate : new Date(Date.now()).toISOString(), - }, - }); + const [networkTlsRequest, setHostRequest] = useState( + !skip + ? { + defaultIndex: indexNames, + factoryQueryType: NetworkQueries.tls, + filterQuery: createFilter(filterQuery), + flowTarget, + id, + ip, + pagination: generateTablePaginationOptions(activePage, limit), + sort, + timerange: { + interval: '12h', + from: startDate ? startDate : '', + to: endDate ? endDate : new Date(Date.now()).toISOString(), + }, + } + : null + ); const wrappedLoadMore = useCallback( (newActivePage: number) => { - setHostRequest((prevRequest) => ({ - ...prevRequest, - pagination: generateTablePaginationOptions(newActivePage, limit), - })); + setHostRequest((prevRequest) => { + if (!prevRequest) { + return prevRequest; + } + + return { + ...prevRequest, + pagination: generateTablePaginationOptions(newActivePage, limit), + }; + }); }, [limit] ); @@ -120,7 +130,11 @@ export const useNetworkTls = ({ }); const networkTlsSearch = useCallback( - (request: NetworkTlsRequestOptions) => { + (request: NetworkTlsRequestOptions | null) => { + if (request == null) { + return; + } + let didCancel = false; const asyncSearch = async () => { abortCtrl.current = new AbortController(); @@ -176,9 +190,13 @@ export const useNetworkTls = ({ useEffect(() => { setHostRequest((prevRequest) => { const myRequest = { - ...prevRequest, + ...(prevRequest ?? {}), defaultIndex: indexNames, + factoryQueryType: NetworkQueries.tls, filterQuery: createFilter(filterQuery), + flowTarget, + id, + ip, pagination: generateTablePaginationOptions(activePage, limit), timerange: { interval: '12h', @@ -192,7 +210,19 @@ export const useNetworkTls = ({ } return prevRequest; }); - }, [activePage, indexNames, endDate, filterQuery, limit, startDate, sort, skip]); + }, [ + activePage, + indexNames, + endDate, + filterQuery, + limit, + startDate, + sort, + skip, + flowTarget, + ip, + id, + ]); useEffect(() => { networkTlsSearch(networkTlsRequest); diff --git a/x-pack/plugins/security_solution/public/network/containers/users/index.tsx b/x-pack/plugins/security_solution/public/network/containers/users/index.tsx index 5bca8d773c2f6..2e83c9866c59a 100644 --- a/x-pack/plugins/security_solution/public/network/containers/users/index.tsx +++ b/x-pack/plugins/security_solution/public/network/containers/users/index.tsx @@ -73,27 +73,38 @@ export const useNetworkUsers = ({ const defaultIndex = uiSettings.get(DEFAULT_INDEX_KEY); const [loading, setLoading] = useState(false); - const [networkUsersRequest, setNetworkUsersRequest] = useState({ - defaultIndex, - factoryQueryType: NetworkQueries.users, - filterQuery: createFilter(filterQuery), - flowTarget, - ip, - pagination: generateTablePaginationOptions(activePage, limit), - sort, - timerange: { - interval: '12h', - from: startDate ? startDate : '', - to: endDate ? endDate : new Date(Date.now()).toISOString(), - }, - }); + const [networkUsersRequest, setNetworkUsersRequest] = useState( + !skip + ? { + defaultIndex, + factoryQueryType: NetworkQueries.users, + filterQuery: createFilter(filterQuery), + flowTarget, + id, + ip, + pagination: generateTablePaginationOptions(activePage, limit), + sort, + timerange: { + interval: '12h', + from: startDate ? startDate : '', + to: endDate ? endDate : new Date(Date.now()).toISOString(), + }, + } + : null + ); const wrappedLoadMore = useCallback( (newActivePage: number) => { - setNetworkUsersRequest((prevRequest) => ({ - ...prevRequest, - pagination: generateTablePaginationOptions(newActivePage, limit), - })); + setNetworkUsersRequest((prevRequest) => { + if (!prevRequest) { + return prevRequest; + } + + return { + ...prevRequest, + pagination: generateTablePaginationOptions(newActivePage, limit), + }; + }); }, [limit] ); @@ -117,7 +128,11 @@ export const useNetworkUsers = ({ }); const networkUsersSearch = useCallback( - (request: NetworkUsersRequestOptions) => { + (request: NetworkUsersRequestOptions | null) => { + if (request == null) { + return; + } + let didCancel = false; const asyncSearch = async () => { abortCtrl.current = new AbortController(); @@ -176,9 +191,13 @@ export const useNetworkUsers = ({ useEffect(() => { setNetworkUsersRequest((prevRequest) => { const myRequest = { - ...prevRequest, + ...(prevRequest ?? {}), + id, + ip, defaultIndex, + factoryQueryType: NetworkQueries.users, filterQuery: createFilter(filterQuery), + flowTarget, pagination: generateTablePaginationOptions(activePage, limit), sort, timerange: { @@ -192,7 +211,19 @@ export const useNetworkUsers = ({ } return prevRequest; }); - }, [activePage, defaultIndex, endDate, filterQuery, limit, startDate, sort, skip]); + }, [ + activePage, + defaultIndex, + endDate, + filterQuery, + limit, + startDate, + sort, + skip, + ip, + flowTarget, + id, + ]); useEffect(() => { networkUsersSearch(networkUsersRequest); diff --git a/x-pack/plugins/security_solution/public/overview/containers/overview_host/index.tsx b/x-pack/plugins/security_solution/public/overview/containers/overview_host/index.tsx index 946cd33088a45..e53915bc05fdf 100644 --- a/x-pack/plugins/security_solution/public/overview/containers/overview_host/index.tsx +++ b/x-pack/plugins/security_solution/public/overview/containers/overview_host/index.tsx @@ -55,16 +55,21 @@ export const useHostOverview = ({ const refetch = useRef(noop); const abortCtrl = useRef(new AbortController()); const [loading, setLoading] = useState(false); - const [overviewHostRequest, setHostRequest] = useState({ - defaultIndex: indexNames, - factoryQueryType: HostsQueries.overview, - filterQuery: createFilter(filterQuery), - timerange: { - interval: '12h', - from: startDate, - to: endDate, - }, - }); + const [overviewHostRequest, setHostRequest] = useState( + !skip + ? { + defaultIndex: indexNames, + factoryQueryType: HostsQueries.overview, + filterQuery: createFilter(filterQuery), + id: ID, + timerange: { + interval: '12h', + from: startDate, + to: endDate, + }, + } + : null + ); const [overviewHostResponse, setHostOverviewResponse] = useState({ overviewHost: {}, @@ -78,7 +83,11 @@ export const useHostOverview = ({ }); const overviewHostSearch = useCallback( - (request: HostOverviewRequestOptions) => { + (request: HostOverviewRequestOptions | null) => { + if (request == null) { + return; + } + let didCancel = false; const asyncSearch = async () => { abortCtrl.current = new AbortController(); @@ -135,9 +144,11 @@ export const useHostOverview = ({ useEffect(() => { setHostRequest((prevRequest) => { const myRequest = { - ...prevRequest, + ...(prevRequest ?? {}), defaultIndex: indexNames, + factoryQueryType: HostsQueries.overview, filterQuery: createFilter(filterQuery), + id: ID, timerange: { interval: '12h', from: startDate, diff --git a/x-pack/plugins/security_solution/public/overview/containers/overview_network/index.tsx b/x-pack/plugins/security_solution/public/overview/containers/overview_network/index.tsx index 588fb1f08ef6f..96711917ca393 100644 --- a/x-pack/plugins/security_solution/public/overview/containers/overview_network/index.tsx +++ b/x-pack/plugins/security_solution/public/overview/containers/overview_network/index.tsx @@ -55,16 +55,24 @@ export const useNetworkOverview = ({ const refetch = useRef(noop); const abortCtrl = useRef(new AbortController()); const [loading, setLoading] = useState(false); - const [overviewNetworkRequest, setNetworkRequest] = useState({ - defaultIndex: indexNames, - factoryQueryType: NetworkQueries.overview, - filterQuery: createFilter(filterQuery), - timerange: { - interval: '12h', - from: startDate, - to: endDate, - }, - }); + const [ + overviewNetworkRequest, + setNetworkRequest, + ] = useState( + !skip + ? { + defaultIndex: indexNames, + factoryQueryType: NetworkQueries.overview, + filterQuery: createFilter(filterQuery), + id: ID, + timerange: { + interval: '12h', + from: startDate, + to: endDate, + }, + } + : null + ); const [overviewNetworkResponse, setNetworkOverviewResponse] = useState({ overviewNetwork: {}, @@ -78,7 +86,11 @@ export const useNetworkOverview = ({ }); const overviewNetworkSearch = useCallback( - (request: NetworkOverviewRequestOptions) => { + (request: NetworkOverviewRequestOptions | null) => { + if (request == null) { + return; + } + let didCancel = false; const asyncSearch = async () => { abortCtrl.current = new AbortController(); @@ -135,9 +147,11 @@ export const useNetworkOverview = ({ useEffect(() => { setNetworkRequest((prevRequest) => { const myRequest = { - ...prevRequest, + ...(prevRequest ?? {}), defaultIndex: indexNames, + factoryQueryType: NetworkQueries.overview, filterQuery: createFilter(filterQuery), + id: ID, timerange: { interval: '12h', from: startDate, diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/body/events/event_column_view.tsx b/x-pack/plugins/security_solution/public/timelines/components/timeline/body/events/event_column_view.tsx index df5c48ad012a6..3f9d230575d46 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/timeline/body/events/event_column_view.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/timeline/body/events/event_column_view.tsx @@ -95,9 +95,9 @@ export const EventColumnView = React.memo( toggleShowNotes, updateNote, }) => { - const { timelineType, status } = useShallowEqualSelector( - (state) => state.timeline.timelineById[timelineId] - ); + const { eventType: timelineEventType, timelineType, status } = useShallowEqualSelector< + TimelineModel + >((state) => state.timeline.timelineById[timelineId]); const handlePinClicked = useCallback( () => @@ -151,7 +151,7 @@ export const EventColumnView = React.memo( />, ] : []), - ...(eventType !== 'raw' + ...(timelineEventType !== 'raw' ? [ ( showNotes, status, timelineId, + timelineEventType, timelineType, toggleShowNotes, updateNote, diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/footer/__snapshots__/index.test.tsx.snap b/x-pack/plugins/security_solution/public/timelines/components/timeline/footer/__snapshots__/index.test.tsx.snap index 5b14edf818fdc..2979de270fcc8 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/timeline/footer/__snapshots__/index.test.tsx.snap +++ b/x-pack/plugins/security_solution/public/timelines/components/timeline/footer/__snapshots__/index.test.tsx.snap @@ -72,13 +72,15 @@ exports[`Footer Timeline Component rendering it renders the default timeline foo data-test-subj="paging-control-container" grow={false} > - + + + { onChangePage={loadMore} serverSideEventCount={serverSideEventCount} totalCount={totalCount} + showMorePagesIndicator /> ); @@ -58,6 +59,7 @@ describe('Footer Timeline Component', () => { onChangePage={loadMore} serverSideEventCount={serverSideEventCount} totalCount={totalCount} + showMorePagesIndicator /> ); @@ -81,6 +83,7 @@ describe('Footer Timeline Component', () => { onChangePage={loadMore} serverSideEventCount={serverSideEventCount} totalCount={totalCount} + showMorePagesIndicator /> ); @@ -132,6 +135,7 @@ describe('Footer Timeline Component', () => { onChangePage={loadMore} serverSideEventCount={serverSideEventCount} totalCount={totalCount} + showMorePagesIndicator /> ); @@ -155,6 +159,7 @@ describe('Footer Timeline Component', () => { onChangePage={loadMore} serverSideEventCount={serverSideEventCount} totalCount={totalCount} + showMorePagesIndicator /> ); @@ -182,6 +187,7 @@ describe('Footer Timeline Component', () => { onChangePage={loadMore} serverSideEventCount={serverSideEventCount} totalCount={totalCount} + showMorePagesIndicator /> ); @@ -207,6 +213,7 @@ describe('Footer Timeline Component', () => { onChangePage={loadMore} serverSideEventCount={serverSideEventCount} totalCount={totalCount} + showMorePagesIndicator /> ); @@ -234,6 +241,7 @@ describe('Footer Timeline Component', () => { onChangePage={loadMore} serverSideEventCount={serverSideEventCount} totalCount={totalCount} + showMorePagesIndicator /> ); @@ -259,6 +267,7 @@ describe('Footer Timeline Component', () => { onChangePage={loadMore} serverSideEventCount={serverSideEventCount} totalCount={totalCount} + showMorePagesIndicator /> ); diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/footer/index.tsx b/x-pack/plugins/security_solution/public/timelines/components/timeline/footer/index.tsx index 7c10168da3c62..c06be6d50aae5 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/timeline/footer/index.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/timeline/footer/index.tsx @@ -28,6 +28,7 @@ import { OnChangeItemsPerPage, OnChangePage } from '../events'; import { LastUpdatedAt } from './last_updated'; import * as i18n from './translations'; import { useEventDetailsWidthContext } from '../../../../common/components/events_viewer/event_details_width_context'; +import { PaginationEuiFlexItem } from '../../../../common/components/paginated_table'; import { useManageTimeline } from '../../manage_timeline'; export const isCompactFooter = (width: number): boolean => width < 600; @@ -223,6 +224,7 @@ interface FooterProps { onChangeItemsPerPage: OnChangeItemsPerPage; onChangePage: OnChangePage; serverSideEventCount: number; + showMorePagesIndicator: boolean; totalCount: number; } @@ -240,6 +242,7 @@ export const FooterComponent = ({ onChangeItemsPerPage, onChangePage, serverSideEventCount, + showMorePagesIndicator, totalCount, }: FooterProps) => { const [isPopoverOpen, setIsPopoverOpen] = useState(false); @@ -289,6 +292,11 @@ export const FooterComponent = ({ totalCount, ]); + const PaginationWrapper = useMemo( + () => (showMorePagesIndicator ? PaginationEuiFlexItem : EuiFlexItem), + [showMorePagesIndicator] + ); + useEffect(() => { if (paginationLoading && !isLoading) { setPaginationLoading(false); @@ -365,13 +373,15 @@ export const FooterComponent = ({
) : ( - + + + )} diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/timeline.tsx b/x-pack/plugins/security_solution/public/timelines/components/timeline/timeline.tsx index 1097d58b227a8..abc5b1401d646 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/timeline/timeline.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/timeline/timeline.tsx @@ -302,6 +302,7 @@ export const TimelineComponent: React.FC = ({ onChangeItemsPerPage={onChangeItemsPerPage} onChangePage={loadPage} serverSideEventCount={totalCount} + showMorePagesIndicator={pageInfo.showMorePagesIndicator} totalCount={pageInfo.fakeTotalCount} /> diff --git a/x-pack/plugins/security_solution/public/timelines/containers/details/index.tsx b/x-pack/plugins/security_solution/public/timelines/containers/details/index.tsx index cd72ffb8ac803..2b3d615fe9b32 100644 --- a/x-pack/plugins/security_solution/public/timelines/containers/details/index.tsx +++ b/x-pack/plugins/security_solution/public/timelines/containers/details/index.tsx @@ -29,6 +29,8 @@ export interface UseTimelineEventsDetailsProps { skip: boolean; } +const ID = 'timelineEventsDetails'; + export const useTimelineEventsDetails = ({ docValueFields, indexName, @@ -49,7 +51,11 @@ export const useTimelineEventsDetails = ({ ); const timelineDetailsSearch = useCallback( - (request: TimelineEventsDetailsRequestOptions) => { + (request: TimelineEventsDetailsRequestOptions | null) => { + if (request == null) { + return; + } + let didCancel = false; const asyncSearch = async () => { abortCtrl.current = new AbortController(); @@ -102,6 +108,7 @@ export const useTimelineEventsDetails = ({ ...(prevRequest ?? {}), docValueFields, indexName, + id: ID, eventId, factoryQueryType: TimelineEventsQueries.details, }; @@ -113,9 +120,7 @@ export const useTimelineEventsDetails = ({ }, [docValueFields, eventId, indexName, skip]); useEffect(() => { - if (timelineDetailsRequest) { - timelineDetailsSearch(timelineDetailsRequest); - } + timelineDetailsSearch(timelineDetailsRequest); }, [timelineDetailsRequest, timelineDetailsSearch]); return [loading, timelineDetailsResponse]; diff --git a/x-pack/plugins/security_solution/public/timelines/containers/index.tsx b/x-pack/plugins/security_solution/public/timelines/containers/index.tsx index 53944fd29a687..21e290e1ede82 100644 --- a/x-pack/plugins/security_solution/public/timelines/containers/index.tsx +++ b/x-pack/plugins/security_solution/public/timelines/containers/index.tsx @@ -90,7 +90,7 @@ export const useTimelineEvents = ({ fields, fieldRequested: fields, filterQuery: createFilter(filterQuery), - id, + id: ID, timerange: { interval: '12h', from: startDate, @@ -215,6 +215,7 @@ export const useTimelineEvents = ({ defaultIndex: indexNames, docValueFields: docValueFields ?? [], filterQuery: createFilter(filterQuery), + id: ID, pagination: generateTablePaginationOptions(activePage, limit), timerange: { interval: '12h', From 897a609c35422f9c4a362ba5433a255e4cb1f7b1 Mon Sep 17 00:00:00 2001 From: Shahzad Date: Mon, 5 Oct 2020 18:16:21 +0200 Subject: [PATCH 20/49] Remove resize panels (#79428) --- .../RumDashboard/Charts/PageLoadDistChart.tsx | 5 +-- .../RumDashboard/Charts/PageViewsChart.tsx | 2 +- .../Charts/VisitorBreakdownChart.tsx | 2 +- .../PageLoadDistribution/index.tsx | 3 +- .../app/RumDashboard/PageViewsTrend/index.tsx | 3 +- .../RumDashboard/Panels/PageLoadAndViews.tsx | 38 +++++++------------ .../RumDashboard/Panels/VisitorBreakdowns.tsx | 38 +++++++------------ .../app/RumDashboard/RumDashboard.tsx | 25 +++--------- .../app/RumDashboard/translations.ts | 2 +- 9 files changed, 37 insertions(+), 81 deletions(-) diff --git a/x-pack/plugins/apm/public/components/app/RumDashboard/Charts/PageLoadDistChart.tsx b/x-pack/plugins/apm/public/components/app/RumDashboard/Charts/PageLoadDistChart.tsx index 4eb24f8c80b9a..242eb721639a2 100644 --- a/x-pack/plugins/apm/public/components/app/RumDashboard/Charts/PageLoadDistChart.tsx +++ b/x-pack/plugins/apm/public/components/app/RumDashboard/Charts/PageLoadDistChart.tsx @@ -93,10 +93,7 @@ export function PageLoadDistChart({ : EUI_CHARTS_THEME_LIGHT; return ( - + {(!loading || data) && ( + {(!loading || data) && ( + +
diff --git a/x-pack/plugins/apm/public/components/app/RumDashboard/PageViewsTrend/index.tsx b/x-pack/plugins/apm/public/components/app/RumDashboard/PageViewsTrend/index.tsx index 7492096b93898..621098b6028cb 100644 --- a/x-pack/plugins/apm/public/components/app/RumDashboard/PageViewsTrend/index.tsx +++ b/x-pack/plugins/apm/public/components/app/RumDashboard/PageViewsTrend/index.tsx @@ -12,7 +12,6 @@ import { I18LABELS } from '../translations'; import { BreakdownFilter } from '../Breakdowns/BreakdownFilter'; import { PageViewsChart } from '../Charts/PageViewsChart'; import { BreakdownItem } from '../../../../../typings/ui_filters'; -import { FULL_HEIGHT } from '../RumDashboard'; export function PageViewsTrend() { const { urlParams, uiFilters } = useUrlParams(); @@ -49,7 +48,7 @@ export function PageViewsTrend() { ); return ( -
+
diff --git a/x-pack/plugins/apm/public/components/app/RumDashboard/Panels/PageLoadAndViews.tsx b/x-pack/plugins/apm/public/components/app/RumDashboard/Panels/PageLoadAndViews.tsx index cdc52c98de971..0475b9c62b42a 100644 --- a/x-pack/plugins/apm/public/components/app/RumDashboard/Panels/PageLoadAndViews.tsx +++ b/x-pack/plugins/apm/public/components/app/RumDashboard/Panels/PageLoadAndViews.tsx @@ -5,35 +5,23 @@ */ import React from 'react'; -import { EuiPanel, EuiResizableContainer } from '@elastic/eui'; -import { FULL_HEIGHT } from '../RumDashboard'; +import { EuiFlexGroup, EuiFlexItem, EuiPanel } from '@elastic/eui'; import { PageLoadDistribution } from '../PageLoadDistribution'; import { PageViewsTrend } from '../PageViewsTrend'; -import { useBreakPoints } from '../hooks/useBreakPoints'; export function PageLoadAndViews() { - const { isLarge } = useBreakPoints(); - return ( - - {(EuiResizablePanel, EuiResizableButton) => ( - <> - - - - - - - - - - - - - )} - + + + + + + + + + + + + ); } diff --git a/x-pack/plugins/apm/public/components/app/RumDashboard/Panels/VisitorBreakdowns.tsx b/x-pack/plugins/apm/public/components/app/RumDashboard/Panels/VisitorBreakdowns.tsx index 87ffacbf56f96..400fbd9991621 100644 --- a/x-pack/plugins/apm/public/components/app/RumDashboard/Panels/VisitorBreakdowns.tsx +++ b/x-pack/plugins/apm/public/components/app/RumDashboard/Panels/VisitorBreakdowns.tsx @@ -5,35 +5,23 @@ */ import React from 'react'; -import { EuiPanel, EuiResizableContainer } from '@elastic/eui'; +import { EuiFlexGroup, EuiFlexItem, EuiPanel } from '@elastic/eui'; import { VisitorBreakdown } from '../VisitorBreakdown'; import { VisitorBreakdownMap } from '../VisitorBreakdownMap'; -import { FULL_HEIGHT } from '../RumDashboard'; -import { useBreakPoints } from '../hooks/useBreakPoints'; export function VisitorBreakdownsPanel() { - const { isLarge } = useBreakPoints(); - return ( - - {(EuiResizablePanel, EuiResizableButton) => ( - <> - - - - - - - - - - - - - )} - + + + + + + + + + + + + ); } diff --git a/x-pack/plugins/apm/public/components/app/RumDashboard/RumDashboard.tsx b/x-pack/plugins/apm/public/components/app/RumDashboard/RumDashboard.tsx index 0004599b1821b..9f086f41881c4 100644 --- a/x-pack/plugins/apm/public/components/app/RumDashboard/RumDashboard.tsx +++ b/x-pack/plugins/apm/public/components/app/RumDashboard/RumDashboard.tsx @@ -10,7 +10,6 @@ import { EuiTitle, EuiSpacer, EuiPanel, - EuiResizableContainer, } from '@elastic/eui'; import React from 'react'; import { ClientMetrics } from './ClientMetrics'; @@ -21,10 +20,8 @@ import { PageLoadAndViews } from './Panels/PageLoadAndViews'; import { VisitorBreakdownsPanel } from './Panels/VisitorBreakdowns'; import { useBreakPoints } from './hooks/useBreakPoints'; -export const FULL_HEIGHT = { height: '100%' }; - export function RumDashboard() { - const { isLarge, isSmall } = useBreakPoints(); + const { isSmall } = useBreakPoints(); return ( @@ -45,22 +42,10 @@ export function RumDashboard() { - - {(EuiResizablePanel, EuiResizableButton) => ( - <> - - - - - - - - - )} - + + + + diff --git a/x-pack/plugins/apm/public/components/app/RumDashboard/translations.ts b/x-pack/plugins/apm/public/components/app/RumDashboard/translations.ts index fd118096526d7..afb09db7bd977 100644 --- a/x-pack/plugins/apm/public/components/app/RumDashboard/translations.ts +++ b/x-pack/plugins/apm/public/components/app/RumDashboard/translations.ts @@ -88,7 +88,7 @@ export const I18LABELS = { pageLoadDurationByRegion: i18n.translate( 'xpack.apm.rum.visitorBreakdownMap.pageLoadDurationByRegion', { - defaultMessage: 'Page load duration by region', + defaultMessage: 'Page load duration by region (avg.)', } ), searchByUrl: i18n.translate('xpack.apm.rum.filters.searchByUrl', { From 5f53d4f34b766d24dbd97c3029bae2d4e3f20094 Mon Sep 17 00:00:00 2001 From: Liza Katz Date: Mon, 5 Oct 2020 19:18:30 +0300 Subject: [PATCH 21/49] [RFC][Search] Background sessions RFC (#73281) RFC Co-authored-by: Lukas Olson --- rfcs/images/background_sessions_client.png | Bin 0 -> 110580 bytes rfcs/images/background_sessions_server.png | Bin 0 -> 115868 bytes rfcs/text/0013_background_sessions.md | 489 +++++++++++++++++++++ 3 files changed, 489 insertions(+) create mode 100644 rfcs/images/background_sessions_client.png create mode 100644 rfcs/images/background_sessions_server.png create mode 100644 rfcs/text/0013_background_sessions.md diff --git a/rfcs/images/background_sessions_client.png b/rfcs/images/background_sessions_client.png new file mode 100644 index 0000000000000000000000000000000000000000..46cb90c93aa32bae2b12dc6c8661e73ebcafa967 GIT binary patch literal 110580 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곤p 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%0A^uUy4zz2yfA1b1EJ#dr56xxJ^R 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 literal 0 HcmV?d00001 diff --git a/rfcs/images/background_sessions_server.png b/rfcs/images/background_sessions_server.png new file mode 100644 index 0000000000000000000000000000000000000000..593db3156f8799c8f8a03b15548381586b92dcb6 GIT binary patch literal 115868 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⪻yexqZfdxom0^afa0a@90-`*#Utc>41{L>OVi=>#2Ps3KsM9J>Kb*O6J>`t0^ zbHjW_bPekSF93aJ*?IwVGUPI0x$JUzIei-Rz{cGF7zfSnA_x-Iqwtun^7!yDs=E1} zv~S4ArOr=qOq!b(#^&gnq=A`Pai|9k9%s|j*HPtBj>SI^coi1G?R5>*L*29U1Ag1N|G(&0|Jwo<~6m?#}OzxvhWMJK6BFp!zMk$9Y~w}ltCr_ zE9Zs@^G(dwsdIgG0Xo%AaGMr9*bD#^0ECf{^Ki)b{1~3PElIR(;=TZkCDTbF(e_q@ z2;}n6e~!=D$8mGeP27D;-qAaO4w$xKqh<%*df`p>h(whj^RAL^6 z={|rUWxp6Um+=Tr+I)qppzS|q$8Re1f5LBS-*!kzrpD9PMXfpx{j~Wp*YHGr^xJ@{ zLdHUTuTYpYGPwjiw_>=QG|WsmmCZxJ&lPdPCJlH|ZdkdvZ!!^Q_(y)_A7{`_6=Mm- z3JR{vFTmQ{n^QFk=%viQU2R+XL!6-Y`0Ti|d$E>RK0fjCX(xL;%>7xvSMI0bO&;!H zDTvn6WFuzA(GPR~5gmKQqRfd;=3!>HKB7J-so$uuS6Grbkjj;m?hgPxl;>okL6~~Y zr*}%W^%Xn_<$9X|6N!`y^{T5D-2zL1mRtzuiXC3qm;3Yis>ka$%>Cu8Xm*d3_|0h=_!}DalPjKKk;ArU*M2+FDN0z^ zvmD%&INukvejv4v7_{j)5)pUkbO_}DJSBEt5J*TxXU#LVL(9*W00iz-qH7JH%Sl=h z2^23uCo1@WFs6^AZ2j_cT&1rE`;U*hae7%qD_L(Kk>?CwVD&tv%i@?8Xj0oWk7K5o z3$%`2z^K=^wpMt)CF1QPwPq-xzXw{tn_a|O*-)ZtxAo;j984=w1as-u$5$1=)~`g! z%RkQpT9Cs(MvnFW)=Ejz+`e6>05;$Q!6t|l7Ru|p+1t?4x^#G~Ivv~Xos zbiItL$SlqbpU6#J>qz{#VJ>lhJJAb=v#ts0BxY5px8+1&vOIR+@L={`c?`FvpGD`w zv8**00VPj%Y~=%HP1dMuuJ6`H9B>wDZ*3JrRXuS5BBAO;dnUJ(ePAIZn434lP_FSc zQoZ!Zk(yirzP7Xdx)I7KB=mgr_ffb}s~MS(XH6PJymU8y1a3z`tz`~i+>b-clnZen zW(j&ea-?#EUXF{h$EqbIHd~UFzO94-K}>xkXd2qlP*TuIY(_2e?PKJmeZBDWjhyfK z^(p)ruvC~8&`uOywFi3O&M8h(a>r@9S~n%S5(vhcP6?G{L@oe9&jlJ#huAkfXY=r;z)4>OzCm;Uw1l}8$#TvL~ zbP;LubW3;g_GV|L&aMxLycQi0xK(KD0jvVK5b__~sV=eyJ}Q7`eJCtlnA}O zBw7nfToS}s@mo^;bF)%@i;rr^ZIGWlK2W{Zc)R|cxj&u;z_nn$fuMV61(*3O0ylWh z33Hb9;Be@W((!>0edg7fTJKxEIACZHPRJpk^;$sp@x6|h-?Hi5uB z6atGaJ#h5Pn<+sC$57qu`#nO)W@phx?H&#IByQ~I!7@$RwBoxR!L@FYYVH~&6+~59 zGe`>nxCk>H7I=`kI}S9=!Tbe_ql}^?c65~Py(N-tqm2Z1(Ks$+6vZOcC1vWWnN}W1 z2MfXn9Z$50F_vvHH$O+Bd~R~fFCf7X*j=6u4+0CVRh{6k3<0u|^2XAT`&KN+<%G<* ztbB1c_1Ww3gCXP=N!5rH`!yRT2egI`E6jg$|q99jXSfbp) zHfN+5aMXxHPw!8-v4KYT!>50gcE8&hWkdlYu2^)UoXDUs_yftRCw}Ajgs6fD2>gQv zdH>^M0~MrrQ5P!WF?;!?mEr?C%69`gZAm5ayda;1-QftXsZ6*jf-R?Wi;X=cpU{Re z`vFb?%t#8bgwnxBz%sje_t2kzg{0NQglJPxzurOfGP=2n4vkhF5-Y6TTfXPNDA)r6 zSW(Dn2!=GtJ4!E-kySa4i)-)cnET1&M0@WUOraFN^GX1gHS_{Luug(+;zw8D^GAbf zKF=8s(wJ4q_|-I5xp}}Bl`W|892{7rk7U{lk|Rw^s((?i6Y3L3leT7rXFqO1(c3g} z|LKrFQ;vQF{~rT(!bXr&7?Nn_U|;fMg8Ro_IV-V+_1Vzg{WlMe6DRa4VS!ntVm2W0 ze&@pk!+A}Rw4RY#ygS7)>u2GyJU6e@7B~uL#gFoNp80q{AngN6a{Otw%HEy|&>GTzov{&Ea$4ACaysVmaa(kb$WmTvjRYg%msF1me38BB zyc$=I=HKUqOArMqF4P_w*t@$e{*z)qP6}b*)I_)a2VkTNYy>A#A8PZyg{=g+=dM(i8U_ zUZ#(SX5Ns1XbS$dYU`8gUt%-YRZB`3m5`3a?|XxFKQ@5S(Q#Mq=n>1)EiN;lP|*7S z=TToal7IKq()^PGXTq%)w!Ia4Sbx~%_4+3$0bzB>q#Bk!07u=Pz3(?azV+O6Sds50 ze^Wwos&Rv2Z>B9Ry(Z0$s30G77|}YlJ?E}cRdaU4caMIhH|bP$Orsz>m5?_k>z6&j zvO}wZHEvFsTp9w!z(?tsBP&o$tzuRYUwE9yCS|TQFJDMv=wxZVmyLY>-Q42?XOmwG z(WKPjZHxjl=7pkjEVG7MP*Uabwwh+nVaNN~8AAm{Vw0TyxgkkNk!_68jNkzApdo>y z`tDq6i+bVW+rUE$Wh}L$xhWBibgC?`!x{AEB?u!8CCgn)Zf`SG=fqsMaI`h6>6sR} zVCGb^dB{Uf#dO%w&Vj2XX`|~Ddwu6Rh7tN=41fCG!acU>T;YRirswOUmxkSAZMY^p z{w*>b7BF1lKP2q9#?W%8e}20z-aC*>|4gq)_-%jfG$G|V&k_DHYA9AqQpJ`Mn||E8 zT;WDWE@e)!1<(aFR^-!CI8XS=;8okd@fK^fZ_J;_sCV68)7#FY$adYP1HWWEjl0!j z8aCC*LGP1J<#qfhus}065tzaK&%3kk?!+I827aXZ%L625`p((17@Ya{@uWJ4<<5z6 z)sq`PbFwzS!}MZZCYLW6i$;c$eY}A zfb=%8vD!9%-gv8@XXsErGW;}vk2XKN1UJK2KVIOY@m_?|w0|&@-861B;7K2!+C9lwcaq#IaqF|lRM-1+ zmUsbQ7KbUJZ=XHJ`f1Mh&~<1Vu{;P}!?{Zy>UR`FofpNY$QP8avZX)Vkq1B?5pB<` zwg!!CtdFhE*cafbCA@dqR$LpH(gRX8e<=%P!B6{@><>ANx@CRuHJ~i-~~H%e18lgu^1<;r>-HM zg0DwgfsxE-c|!RuyYt)q&UD1+SzKpOkQ|ATE9NvA^tkw3m%}%_6}qyVa@O;}Y=apD zGB>MVMV;atF#dRCHyE(>XZPD2iArFue$$6LvY}xpvihFj_od;;#T~KZW-v3m1%#OR zZJ3D+CtA+Qi&PVWnPJNWpFw7qiSZ~0(I@%?nrcTyOCz!Z2#Ul0y9??nS$Qt*HoFa* z?&%Hg zI|Ah&+Qd@W{MRCsWw!$yaz=S2+0Diy>KCOIwqik{3@S;8WL{Qy?pC>rA%fcRKLJX5 zbB)(^zE@pvEGRG88DYT|x%|VRqAP0`O*?C$-W209RZE-fLM-Y2%xiDW z^wYR6pyQXm<1&?Xb?$?H1Q@2?tM_P|2@`@3;4;g7Zl3OX6u&dOlw&8?;i zmt2!uL?BfohMS2*_hZl;>SIves9UQh93J$%3jV7O24E34Ac4;AQ*o3zIun>kDWr&ds0B#C3ytNmHEEmon zaM2DNls?h`AlM}aniY-opB{h*F@7j=eGE={4ITmXc4Y0#j$GaRz zAKe0J5`nq1>F=Z6#cSm6(+{R;ZNlVy=iJGCd$#R2UoM-gf$KhNGNJ+I1{TIj^630x z2%9kD_~KFLSfOb2b|upo^Yv?cfN_H_nw$e>|FUQaK3YS3va;_ooW$LKNVNbn{c3%m z?AfV z+P^9WSs$g`(uVk>-=`rp1H03Hljc>OhAvA>_ULR*r&xcVdFf?GY&s*J zI6BSEs0}+ zOGmLOBV(#43IE%x{u3V`_7Yegx%&?RLKSp~fs%svP$bxx<5S==##(>icSm@)KmY&fyM*6ndEP+=eAR&1Ydu-BH# z!-9oCt8tl#nTIyyDWGx1z*Vy9`#p;6=MQ{cHQ@eo8kyJa{i83>gF*MPRzH8cfj#u_ z*RGaABNidR4|8pE31iKc2MvoN|$+so?-f5eTkMrn{=pN!x7 ztb<%GTah=C8$AB`wAW^NT+6{pVlja~PdBUXL^8k~!YjhwC{)%$D6y1%du6n1D!hF( zR=bO|X{z&5ByV}H>{h%9Kq=-CpTuTASULd$XiZp!PK_{{XpwZ$jrKRN^mCIUFZ;L| zA{#(~y+NXEHS{v`)`<4|{F4EDHb&cinL&=)A6#WLQV~uL_^nVJ0QFzXEoDe&_Kz$3 zDgkG^NgI#k5uLT-R-{K$xqWOXFPJ#^&KWzs67{6(ED*ZaV}Le9tT`Wg8L1Q*CUwC9 z+1{g<*0c&s-!;y=dC3CB6A191_9-y06Sgn@Wn%+FqsD$AO{!OcyTa=^)}5UgZQ4`_ zR5@}@Z`D9+p7ghk7K5XmXth}PHFSCnyU0w28B$eN|;$Zvixt1=B0Hr2luGT zw5Lpi12@-qoOQ?htT_x9b3dRl$(w98S>G^Y4ON*jB@S9gBbUqPo*`#zM41DnCE6O8 z0@mizC44!K2j6&TkB-?YzcplRhgI{ZvDoo(z~Y>o@6$$PVa8WPueR4=E9ug5wtBD` z^Y4(W$_TMA)KI%b1PehOF%i3US8B#FKF6|{#3I;_-sdQdDQRA>E6_Gyok366*BZnU z;UqonjU@2kJU^8qaX)l9RK*WkJVgwj_OY(i-NFCm6Y;)*lu;9~L`L+%x()oam1|tO zPaNmV3$_XKi@^6C!9NTJ5ei2*U)j`tG!?xL^+?zxs~8=k-tt6OCgY6YmJ5yJ8(VQj z5n^0c-wno=w1<&S$ONGC&U0zKzIq7J#`OXHly?n!bl*{9f0P_bdn`B*pRG&)9Fz~ z?E&W$c5P(5%-N)UcZsUQ887O4E zPp5@9=(!{f9{fuwJzg&S^aM_pqn3-Pthe@20TG5IGCqTFr2{`=>(zx~QX=U{k*~!U zaYa3n6AE)h8um&0k|xbs=*Nnde-u7SP=;uYY29m^d z)g#WhjWyrqgbR0`bc6-?P!nul$9?ez_8_=l!K|(M)BRtoi1rQS2fh7pn>}$F;>r89 ze)FJZ1NdtkiTY2KrJ-$)y4+v*6@mm_Ijcm<_P!>Gl<<#qSC?~2FGTi1^7-p!Hbac) zLU4bg0(l@X9K7j~_W0h{LD=iJch`6Cp-wQ5uGlnR#in$g#e2Ng! z^;d|Xs_)d=8LF(^N&vYG3I@pN2}QNEgTF?7<44|4n0Tr~cbxEOuy?YJqJ3 zixBxc`t`o8=5?} zEC!^n01=G`VEg`9g8b&d06<%>*TJA3+Pv^tl&W4nhH)y=SMBJuJw+49Zh&IdZ!r%T zsX=)uch$XFe_wvr>y!%XUztTJEoD#z0;0oBwC$}yPy*MLiMvLEQoFX1Z!aC#gk&T_ zv5+SBMP_9S`nrV{Go!sFTvInBQlG4z0WCTz=Cov8fC4JocS?5&l?MN(+hut!Q%0MC z2^U_K4hb=&g#Hfv9@E^7t;dH{l{+yHUe~@=Z`g)M&TWy(nKMECxwVbbMRrAFK9=q_ z$3vPQ`wgmz!edujNsDj@y1UZCrdB$ZWBBBsdg$T6*yc2;xj8HGZ zK9wZhty*2?cP@F|ttwVW$&4u_{CEDaH~5V0(+DT9++r=;Tb}knWAk?JY{p-7WzTpY zni?_I6CY9&no>P8Cbj0|>f^2q1;lUkGFmvkZg<*yCDGKzO8QJ*zTZYB&+v~iY)un` z@Rv9*euauhf1fvKr+I3MY_=KUV*vJnJI8_Y0ynj~t>^;syPgt~*U)1h=H_$4>%wA& zd>2VpVcddzVZ{L$*M26B^iJgV@yXw_7n(=^6RZIwZP+OSNM?2xO_p23ig3o zD}@p`xLf<=88rx{&|mmc{E19*_P!w0z~f2v@R|o;@Ros|hgfIt0cZ?quG6CRf6V!* zlRwWZD{$?WA*!2{i1}f}fabn~pj3!!w{540d@61?X(F=Hq?A%*i0ZtP$h#MEz1?Bb9~@hgLQY8tYi@=cPc}a+{#3nu5Z`1W9Mv%t*E`2vC{8SlrqK{W@J_F z1wYG?NNKU9mnQD_s{Yi3*zlAXJyusSdRWvSus&C9@yyS53!$@ia>lYu4<}YhnsxKZ zSQKI0^TC^ZgDzBW^Hq1iaID*C$1!JY*N!GTHs%nWb$&7oWZM+0kPHqPw{(`k^I~cb zjYhPWpre-{lfqr04Zy$mL4dLbYCgyXO#)?pihCGgZpb#>Vm-is*4%GRplLvh(7HVs zweeI=q=BSE)>21hy$SVv$mK$-Bvf7DU0f0&Uhww}KHH>T?}KehRbS;1`1MSCS;_8g zg8>dNv_$*F>%N#xBPP%{TNU2)v(@)&JOZr4;s2tl|98 zd0!QZL8PU&lqyyZ>yo$7i>|e^vgwUCJ~K}vxJ{sl2}9(B{KI(8@vg4bAwZ=kawJ9Q zZu7PEL?=BHRJQ|l+Wz}s5rC)$jW^uFksa~w4om+bSFh{?>4USjY{GI! z;(c2s$-{cd_43Jr*7a11HyefFQ{nM%D3f)$77AuwFdoWjK?s+jtX(4;5AI$W9p#5H zwv(e0#xEGKP_V%DJ5|RZ%6_6r-tZ1#|3PBT{eBb|I%Vcif}m3F_GnQ{t561VNa#^4 z-RHhp*d1`3`#s}@fyB0HT{5cRuEX9Uean{i1ydgRBqXxV#mA1Fs5LOp`tM&}E z`-`OA58c%yH%Pl~{!~ax*QF#$_D=(9Q=8wBdB1;_BaUa|^qAAKB$Pk49NYRLe$ZsK zx@YJjhA51WqFttp-OYVF4D0qW6XcqU;cW+Zr)kk9F#GIs@nPJTX5d|uHASMBb0v|rY)VDm-*`k|&A^h1pLcG^;p>to6tqZWX z0i7_t;W*HKaaR;K-SJPp+8o>i;bw*N-nlxM`>I$w28Pu6(j_CGq_WxM-H~x=7D=`X z@D>dmp3%2AW0JfZ3k5dY5s7n~@mdV<9xZ&(PK@8HBJ(#al5gab<&KEPdA5^vxZdMY z6BIAm@6#UQw6-|&TAZ-)-m@N*f{5(~e;o0DlUO%N7x=#U9hDQ?)j%yb0tx9n2|P0@XRag{?g1doQEPJl-RFEM(Z6t(u>h;9!9hK`bNx$RLGnd zy~JFs7bRH@-)|4-1eq-0u8j3W4}`@1OylU;Rx_U}E$G-SYJ(G^W`#e}8hn9et12$+ zpLC$33a1w&wD7`_#U9T$XgY)i=B9szxvJ2AkGl1?$!9`**ZnqiVS+b}#-6sqAvZz0=Xd%MQ;6Pubo{EY+?Mlgepe(V&i~pU&A(ylmCzL7UQM zrL#7**$)NPS@;+Kx~gRhZC@uG_C|JNuuE#GpDk(pbaOV*I+Ub-V0f##VbywyNjXdk zb7N&cX=1wzhcD!e8LQTSO4c4piC`c9(9Gj+8a;G9m9flPn4IY=`S&$zrU{9LlgRsU z0e!2kMolffY4)<5n$woI0f;7(LZ#y9SD7E?+u+O)K2ZUQXfi#Dk80?>z7WP z!7;1pV6F9$b(tGRJsT>8lW+SRbl&Tj1ZjPR{n~E7q{Fw1E;HJI%Y+miulJ%Js32>m zj#$2Xlb!bLriiy;q6}MeDR9Kp+4|7A?@ zqjnS!*7NAU7wyUs>%IRd3TcCz*4eU695;!-{hcA~!GcLxCX?MJz#{1FuNz4>r|j7> zhRb9|`^&o89$>(b6zjfi+$s=Gob8K=_RWbE;QS<^P1P<+*RGVb0hF{=fkL(^Xx>#Q zTYZ@;TRnIY(-Vv%J2HT+A$PtV%=c(H8UWn@O1A>%p3l6Y^^brn3(l#6t$S20#fdYM zK={H`BQ}=7Rgi82F15&I9ZhoydtW+Iz44|=dd?o}V!LVB(Owl&rv-5YmqrJjd3*u+ zqLwxfOzzDtYCX9i1DoI-xV9{scEG(rC$FYKAH0>`NF@V}`4?6D(s~#=1%<7jk9t5c z?a4>uOs>Lmw&5KlbY?nJa2)ovse|B_6*)H7xZ{+&+ffcsofQI-eD_wFT;=CbNbc!* zO_%C4#nqP?ysIz}cac6~hpZ{C#O&<_09YR7ogDP+V+!66g>};oSWUe`Db=pq{@OoM zsy(W^{k+da>ix~nS{Yyoi++paPtMYrd=u}C9SC&)$|v#qZ=-!vcc<9w?)yU$;}x^% zuBg92r0v~*tOBl{swSufh+lqKNOS)lE5Pc3=^@U$H!ApsqL z3~Yc}!OIa*_Tiw5SgERjaJkB)uV=rjv}wJNwEh^5{Z_%Q^{mGlLt8V3Wm5dd;ST^Q z`eTXt9LPic@hTQVwILQF?jCAR4)5dW8Fm;ak_iocW&hs2)KCLO_}Rle8W9SzM6WTP z<*NIb#kM@yI5G?>lKTv$A&$Go>3g5q3ntebi@yV!rRP!;mb;k@%EyKnJ^}3M0~`(R zkgV5Sm1)hyJ<9!2aonY9!%9^$p5jp@Fgz(K%p}~LJ{5d>mY6SMTczq>)Ev;K-{+Sc z&YrLFl%-X4r-jCwsr!8x>I(2>C z>+ig-sYWqm{m^L8EyrMbl)EtEM$iWHFMkZM#`{}NpaeLMHqBB%$eQ5ZGV4CyA>}OLb?d=l( zR-A7H8cimTA?-U6r2w9(o$Ql3XsFa;ExSe4a-NT28KbKrPFDMVIyW3ug_4~d!@KhxGFd-S7YdoHZYfrUQ*X#td1qgeKS$fe7rkUu82^P^wHuqF0obul&hLOWZQY^{iV>c_IqNB&4l!?n)nsN2h z?jg9mLxD(&jq5w(soob=2>AFW2Z}5sQMu^&TOzY1cZT57v6*<=(NiSn)-M+t17z?O z0rk;!!=Hkt2W?|-t8pz=qN~?fQ`wogVXf{JUo0Iw;`^l&LP0&u{RKG?EFvmX1mf-p zERUmkZBMc(>W*9J27QDmf6umMnHi8t96P6bmjD+Y|6Yyn@E41dKtVj+;!vN>WVcuf zB8!#k8NbiW3tP={zI}C*Zdvfvryhaw;h!6imDb<9awQ`qJ5N~}gKi=hB<)mwDDBPN zn7agHgRe+*gBS4jS$pSYe3|n4;yl8vgnF1>*%DOwoE;u;?(Zz<0)mDzwI$}k>#T=_ z2c;O-do(h zSI6JS0e-pj)f3yC=Tn*r;Mc}`lC2$3sFYX|`@nF{J*%X-mnLJ~CI2?&-6n-zD5;oQ znKjbd)qzY$yi?Lz?^(SPge|BC?6|ED{@ zapdlTx>%HUO-y>@@h>Sjp(wL`Mi@8J(@#JNU{~3`Yf5af<4l(PJ zo4CJS4AcIEvBC_Vc%pVRCE=6*o+ z3&0Nkv$y-fT}D{zuPn^Rq0x z8$ijW6`!oyvU0;s`?_)u-{(slatx%7$msUH6C4|j;4WFk$=Tz5(k#eLuZwo)*2T)# zxO_IF&HKvUNGLJ|pA!?tyMk+{Qi?Xefr_V@Ptrh7Ixw?4*rhw~dpI^;?n# z-Q2HHY=iIPk?o5~hrX_@vnnvR>maPR>D}Bh4kNQH(|OCx>#iDq4h2d82@M+hoI|Do z5w(AO0`ye+-IW8FN{h>6Jqee;mPcv(QJ{oEWy;BlniaK9ymqQZoX`BZ1cm#RL(wbA zs6sIVagt*dzA|mf^+fIFxvnA}n~=JXiPkiky!qShgFVu8jrlJ~tx~mvyZKcavJdFV z-;cw^?~lF64Xcmn{A()9QW}=RW@E7RL5#K*cNCsI8uIF{O}>a z00B_RWO;#!lMEEn%}wIrtXPE24CN%(TAJ^#NS?-_(O!49ie9gJ7|ePYgw_SnIR8Fw zPcFYgV!Lpl1jgG+9W4oy7`Lmts!*pUX$J#SW_Y_WeH`s|--V}m4f2ut-E+%RZE*b5 zqTklY>RsDZlG%Y?B@pJ_FR@dz)yNW&Qf^o>g%Z6HT!=qO@YkF9- zW4fd(86vX=bUa_HzVD&SKOfA=l!u-9LW1hu$X^!6#R0=_g0lQdDsH2jo0y+C_q#Gw z78^KCBsG%ZbX9-ep0E;og(5Tfe7u^;_mLNjc8kQ_-sma)x_#A$g_;}PjrCP~JRoJ_ z`8%e264y*J&F1M33Y4pG&ZMMLp*j0b7QXDhh+*7)laN2E-XA+&(`a2~e39t3UUo0n z@y`6qkr!!D8tm8MGEuGLVlg(Fq9M3ae=cz|OV(*yb{zd!S3CQgq><9__-H-4>_IjX zevA5!E)CqmVlj^@Se}X0zE->o_sF0Qljc<=E7ET!dhd2O-eqkJCxUvqRjCIn>MJh# z>t2@Ty;GvsNo0r8?$&g~k1ksE4h3D4ox1ODfy-e2<3zEfGkYD6TwX=qDI(Ig+a$Ku zeL-!x_mL%VO2$gYhpZuAquX|1$get5YoqNWb?=VA(iz9n61^oJ5(l0FwVx5wHSBFA ze_2><63#dN^1_)sBW+|BwaG?_!s|LFp~Tq(0}cPM%19ixiu|UM;?bKF(0P)#it6`f zP1Q^OdP{Sos#@t#tz>8WF|PYNtSU^{MGe=68@@!Ru=hVh-8}v;-rh1Ut|n<8o*6Va z!99UMaCZ$((BSUwEY0^%{Z63(^zC0)7}Gd7$Zg#PJlPXwml-Ljk}L_0 z%2x`iw|;uF7C9WsSnCbTqfq>1f8v!We{omT?1(%_Hke=ib!@>u7_aO@ncjN9q@hLN zvdX2tM-fw4_=|*r$UecS z9(@+ID?3}HxNE@#vrZhg2Md!pPM%g0PfOV?wTT`7$8i`mrJulJ^IoM zW`X=+bsdceGRM%js?eblJEM(3bUBh!E!$)kSiatimiMmhK!1*Pa}i#z#NH6=@Jg>^ zs4z^N*r|wTTSbPun+<#U*zGx*>coAcXBP<*Ornp7;3Y$Lk6l)TI{F&K4mEf7MNNrK zMaOO)^99k@C!XTc$Z6;7!ehZcy!#O6O6?8ocnTb{o!BIobk%ExJmf%(xN{OMF(}clG~ANj=~SL zs1gM1Px(O;ac*L@pSkVXu{q>qiHGC}y-(R^!PbT7A@yX`I=E>vRcQ109zP58jQVAJ z87<7HVLznLX#B;uXQb~Eqk@qqX5kslT=?;|FsyaF_Y&MH0mVz-N<{q2ge&W_Er<{H z&vcBVx43OE2;pOanaAbQf3B}Rv9Dk>)fdc_)m%tB6^1#VgdUAuhJxxQQorkN9@7BW zqvqaaRiw1sHkIa=&K803uLMlVv<`l`VL03bNz1 zoNn9c8PC(@>9D*5ib{;u?I)3V%Mw^slaUQA?Gk3Y%3#ULsvCF^UL49 z*+_9H1l$JzY1rv;o?Ga&(9c-{5xcuXfIk_ZD2%pcxubWO_lpJWASHgF%Ajqjk zd_l<|7p3LVgfA;DM|-91Bq<}&pa|arObh<#y36Aovpj>)HI8bY#?$yccgFV@Y4BF$ z%f5D`Oyk2{6YRvY{q=~$63|sMbb9;Mb3+8HJcH6t%q@7Gk@nnu4mS(RjK&g`UzkdP zgOC3#%7Kz#Mgcwrssd!i#mI}gZrY`Pmm0GrqcxF$G|zlK##Z?DhA35zVY~F0ltR(}D=B9NUY9`(oFfyuCw??AWA*+hGVz4V@X$1a^rIq1Z(nmx z>54ypU5egdtf{P`t|6o29!a^Ljvi;L9&bwA)K|<^Ux2$F=l)3e?ZGX%AP2w1<}$4a zi@on-_N4JP&pLOv-jh1`B)4*!nv&w(1m(pln@ks{dljTOqtptYCw}9umY89YoaPIg zkbYGbxA+6oI*X!KHEiSi7A$3$wmd)j?XN0vaT-1`skOn5KTyP z<6Bt7p9j%+fSr?|eVqt<)bQIJt55tc0@enalj2UEc=@8luSBn+FL!)-yf0y!zx3S$ zji%^N?QZlM^G1h{`N)1s25*^6zMn-ZjG!bi;;>jhj%-DBr;9a#4;7ALl-j4CeK#O~ z%xxKX^nBAC+%jgPtbLC^_#j@E@LWEd`-S=LbkFZbK?hOxngQpnUlM7RB$=o+>Ieysa#r`r`;CC8>$!vI3?y0<=ZW`16T zoXDFb2Mps-orxTc5`~CgAMHcpHOA~}V_*MDJMr?HwU+3@?6Nb`>N=1gsl0-+08J$SDxheOLY@~O$ULe;ng@cKe;|HzFOLIa$n_fE+-7@iP!K2Z^6iL}BeHnH7{I^%PjkeSx6hmVcIOI8k9Oqhjr5 z27`S63~TGLfhvPxJ@fPKY%uH({UY+1yt5J^M+GedzV_dTnBNWAPFVl%f5_-U${Uyv zXpujZN6_PzMVC81e2{&Rsre>wFL{;YzF3}0YV;Q=JZv<|e&RtGHCkO6!5YGKWFEy+$k(T7;aqXpJZ%Qmsa&LS%N<+Z8fG8VGbaxx zC;Xya>R%B7XH3Apz9v zulsQ-`s)D;j_2c%eUA54Lfr8sb6Bwpg$xg*jjz;dcGNYAJxd)FCb+VDnZb;hWk`$ym@a6UY{{`BPe zwfUOa$hiNK%u0`4{`$LDSj+7{gfx20ckW8;lv1w5l^#(jic+ry*Xz!ty7-KD9pjvR zn#ugMUe?)X*fBR?HfZQ=w8vMn452#xe8Y{bxY=;?N|}%xeiJiaU<~u(tX;GI*yjUq zT$C>k&#-rnYNKhzl=g2IC(8Ps@iYu zN?YhNNHle#lEyM(5O0~}mT>uE@%ZKA^e_eA_xt=LdiQ=XIt2VOz* zU~azdY9IFd8V=DR|uy!9IP22>?XO1aX*Dg72XcXG#20LgTm*Oor@ZxH>c&KUNXU5A*R?!7mOmr zk?9XD67)>UbKNK?4e*E+%ul6;*EOcE7MT#b88+zSfk>BxLp@MAe$Io;c7cCRs%eW>$Z@*5ReH)Bjp` z3(CJtU{INidF!ey$iF7F23WI~CoiVCPH!LAM}QBk__Qd&RX5xUGT*tzt~2@$EaHmiCjmN!xjWX?1AguJB{v_7r0UPi=a&K-@=}}Wo|Pz z@zfoo7iFoPG$|@L{y#11%-cVhm}yzdKs#AZPh;L8*KVZ+CF z${z|qER6QY;obY2h;@=WbX1s0)uoNvVo@U|v1oKg?L z@8+wI2A(+|vFj+VvTGHuKi75luy$8-r+B^XI?;5;kP*x$5rx2yI3GEdY; z3F^owtCAxJ?}cnV@fy{hR=gmYnk~QqXEz7aP+|`uqv``003-DJdgshT3qnFXGwJ4> z^VeP z1*{JcsxT##UC-%y;;nVHxHrX+C?jcf3F{O)bv7qUyglU&;tJ<{r0>^+VXs4)VL@7U zYy3_Ppe3!iW|>2j^0_ssaq3QoM|wa`9i5o5+6~l2&$m4L=s;BgJyFfe`KV#547PAy zUKb*M;*^PfHR>s}zq?X}_ug)?X3E_VY$yNm1kR2^%(1~r!5`YsO6|ZG3pg%s)7H!` z-Oe(rN8Fg%$-~V}I4vwTbre&km|zE=a;%929UkC#sE>7^MT9#anP5El)JL_TDN(4x zPg_4qSoSS3&W-MOd?UJ;UyXgdy>{kJRZOt;9S>TQ=fp&a!Y4nuGel*ZavVWvO)~m| zZR4=;-uvF(ertu>btMTrUe9 zTB`%9{d8VU z^DM#x&umH|3oGwj#ZKG-5(1!4p1Gc56k&j}feY<(7nd}(7TOVZlliVKno{@EK}7x; zR}bP@qLK=Q`C76U@avHnrIzV&A zT!>nK9(^B9Q+;c&7PVTn6wU|&WWKIs|ze$4x|{VaPaJP;eJa+s^uxGrUIy71p7cgW&a zlZJgMnQc^`F76t%XIqO!RkgFxV&5@+F_DHIlBRbd%P|*ORL<`tzF;IkemXUaJAG)i zUE8oO`89T(9pdJp*!3zN_z7b z91^@CH!1Xz)>zlF0oF_78WSHPh4_*#3#+(f1ug<3@*k5mdBpd)!_37sp7auTquHSe zH*QxLKOG9zx%J*QroGFsOWsYZEr0sQu@z|lFzs@i3^QMD9jyJiBTrHL(?JgzhX%z; z<`V$7$5TMuW8weh-I;}MXak}cED*uw%UtGb4&j#q1OjBqtV@A(zlyQ$ha0t@ds~KE z^yYEPoVe$L5{-ju=E5tfVa(Be4m`H+QuP85*)0u)9X!twluJ20WQyHC)c7YyaO;`W zJ=61V7s{Ticxv==Ud6&tsJ>wShqU|rI{}GnT80L<9J)@SvD{0YlK~>!MNhJT3k1qBGI? z$_gF?G^7AU{r?xj1zKskIy4Wp0KmmUpua9?M5HW#+vEkHzGXT7kMmP79NT+aA4=fX zk>Sr+3`ltqHUo`)|A{Azjz*D7M980j1i*g{OaNF4r2qFn+$me+hMuMd|L0>nF;hoK35BdJ z^R&5lsfmyGG1vn2mN2%zC;#IqCKmtOZ45865$A z34i&kE@7|EMDFg+t4XVO8jbALbkz=iNe-jxc3*+CfgHit&kD$KRMkR~PMkW4#u@lk z3gXtaRI1wr4EJ1BVS5<--O_KY)#vPZ!Fkz|a&$GWQ$OG(X9h|{cB=A9WJbABkKQPr zr{Z(cN$?uiZug7-OrO(ML9`T_Bb|sXBbjx3T@!y%pp+&czV&%W^bPLoV|}JZjt~W3 zgWNQ=dpp}o!(MFL5B+iM*b%AfI^U;B!`3RyB&K^}ClO7zRn9c)!pS^rhU$rk?2kaD)z zJ6 z=OuC&q|z-7n0HG__s`YfaS2oZSd*>fMeGXtlToo8wt`V=$^9~T%FvSUXIwSK{L$2^ z$@~lv=Fhj@Md2GIkH8M>--2|i7tQklNS)Mj( zjl=|{UR-cQID>t!pud|TD_UaIon1u(M#>*bYL}ibT_0&_H z#$LNCRIw2kZ(Rs!<Zhz^5wF!Mm2owI zxQ;6mKS#5LV1?dltT&3+sU3xz;J|61D_0zm1H3___R(Qm+gTBsQf?n3W){3^!d^nq zH?pDZrK{SmnMNiJ_P8gkE{zRt09|I1xt~}zA}cVSNKIrAEa&Ki5{hdaW~N9p=sX1d zsuVh+v)>9_aGm^yft1m_J1565-4NR^=YUWgZgBThl8rRt+@2GVc%EC4j>4JwShY z3PS~)C8q34MHa0H5Q)y$c2NzgN{fDbFpa9aB|MLPqWNGmiLz-G>S|-DRM;xv?)O4~ zFg!MG1l+^{*$aQlD9j{bRQZ9=n?jo|`&ZYMTt+I+^7LzuN#;fzumP!0{0IPupdO$B z9kc17w|^qPP;gsdCr()*pQ@=kc_91q#Ukb5e#%Q6P6yae6l42hUzeI%RVz7yQ_@pl!Te@zKqqbV^Xl4WE>-fYUw?+1G&SWkc+0s6 zUdvBFg07=2#(1I~{jMOd`ABoW)EofhoH^8*M}BDNm9GKx_UrhKAK2kk?1k}eeahu< zHI`qBR2-_)u-cAS@w@3gNX6Mfy&5#-7dvn}7+=dep6%(Jj`Wr;b~(@vuFiv?4)rL> zP$|V=mHG~#G~trvP%s-90I>qwT|*l{z^!bss_lgboLsB4G&9^=xU?yj`wa$@RC^0k zB-$^yyerNe)JhY)`tam4wjrNUoOa?5pEzNYeC62jRpI3MEM~P9b=;)WgTOmz`*mp> z!UphnsZSWbfbpkDn@9>c*C<_^Vnuv&0h4P2!Qj(n4F?5NDOVxS51=W46{VhNY6AlO zSLpWO6=k`i4s1N>k0Gfe;6r(~V)0Q|Ojq+UAt5>bIl2KKV~6(tB2&`-OZNac0+7ONV7 z&gbNH#ApYEammwulQk}*^Tv1Gxo9a4{f~Q)=vhV$wcCV=5^9VtBh3W~=I!~q$c;XZ zkLN3g)11m@4M9J+*N&S(VccdrHJ?zOD#P`!-fV^(ea}_#dpb^bpa-wlf9lE+f=-I~kDamkjH=sz$aAcF_39VEC$ce( z+2v|AUx{C3o0a|9x`n$sRE$DDu|HI;&}D2u<#4KitLk<|SpM|c)Q!|?y8Je&3tMk{ z+9CP`je2#Ot&={TR%emkuxOjgOaVx>Rm%7@xenx65$#M5Tbtvwh`{e))i%<>Fmc+i zFJXvvEXo@(yD*w~Czb<|AE?bsD!J^U9F)W|I`FhL(Wpi6Qa@(^J1pR7X`+@jZ_?Wv zbX+tubDbw%Xs@tG=`HNdy<5nK&h7gIg=BU5+4y6r!hK%78 zn$joxJMB+cr(}nI@chsQ4;J}T!z5R2tks#MLS*H92#esTQux$@X~}X>^a40K3uSdo!yjETbu7mK!IW?%48>sS5Q%a!N%oiO9JCQy^NLg zSLbir4r6vzSuIp+(=%2~+PDxHGfWwJP<*A)(ZduLAy~AVVWRo`^23QZD?%5RVm8+JyD&l zE)^FJ+4{y{4XBP2U2Kd6x=&i$yLPh(?!WZ<=1_Y@gfRN)iJrZ zD|F66w9enpMhRurNs2#pXeH&kO0sD=zjQ@@*3p=Ih^WxbQG>>n`z3*17N-;O04ob! zv%UtK=~JWf-_?LeqtT={LXXjc7lf@szbB2j2%%3-YqL}z&&H-VmQE$z?h@!It|ablxGYFc3QX0V|#z}BIBE)a0IGQa0! zqW{{@!?)xd!NOP+aQ}KhhR30dyyC;d8KRNH*8@Cvc6;)Zl$hDn6?Bjj&_DgJhpr#L zg!z5N{2m6YDj)bv5lL2gOJO^2#IoBqb(!4)k2V8Y{`^~_fJjOt{~^tTC@v8Jif%;U z9Z3GH7w;!;*eu?P%=TKGC=;}3cpXBHc>gst?C^T<2`j*Pf&5#^SM5NzOWFVF;!5by z`xWrg?%yvBr1%Y%sPnJSc3wJdMS=$&L;L;M{xKy16Lzmzmd2=F97(V?*2yrs53Xi2^ggf z`S%BbeoJ=oj}H=KiJz3cc-)nQ2m%f41~*T_{Dx4)dLL2m0pCvc@BguM?7gdvd(`xg z{bJsb#%(2<(!36&{_Jn}B1Lfi=}9RBE}KArc=a_PkkOL-sQV$_V~StwlO00sIVL{h zg}y=5?S}FosxEhYF9xdy_*<07+(9Lsl@{E1Xih};flWB$7;N!8!g$K(VY|-rd zJ|^mOgoE4(lbsU*0CPI^rm#%Fi~PT3*^}m!JSt=5o_ZCW`jW0P5aDM+cX%V6_^*Oz+U-> zg*U5nE3G;gNG&GZ)@s5NeTuf*?5E_#$)-deM68}invhT20doWUzs3B&dUUy<7H+R? z>5up6A|3~xU|`}p*@8hZ(chssupUg?Hlx#Se{WDE^E&^!lm8zE|3}sKaxMkmh0nuu z!xDlQeru7;ctKK-G;+o1treB1wV*6cCe_8U-JG>A$G)k1i_Wk7SwdjmAwM; zxE{n_DJB(c^TTOw%24Piy}NKYjx#aY;3pTrz5MSdj>yE zx_Ai~lU^gafLO+Yr{`J$!r1&Ke-X zu0bD}x=mBnA5i_2{Hc$+kWS}qUns)TK08A{rE>xkt!;WXd$2~!y0KCe# zzFb_`n)CWzAzkQ!iT)jbow+4N&%wVTS~1vrHa_-#JHVfyu38QV1!-R5FY`!x$U)CL z5w27Ne-9(=wdJ#LEK|>gwG3gofA`1o)}&hV;h#PclpF{-ZjlS%xn=aEgiST4v*0d2 zl#DAPXo*7Gv3uG&F<|ANZ|Eo)J=ep4c3~Ogumt<|GQTQ#-psqDQoo`Lj zg?=a!p4a8lS3w6quP9Cgtga1m&p8=$hr-%tsw}1)>kH@Ge7y+$ z9Dk)}RXf%dI?tJ}EGRYDR|0r8Nn}&}bYv$kvX&ovMrP0n4~t%uwVqaP(AXfgQR`;p zkS=5u*p;TmMP$7Nb7!ZdSNF4b;C1vf8`{Wb>4qqD*xtNpKvRDnS7ni{5nrCOPb8L} zl8LNd?aM$U<`%0|2C!0xkk8W_#9L(3%J~<4TB^64p}6s3aXzQXvm8)+`GhbaYNKE4 z6cx+m8T_B_o_h@L`W`cPzJvbIj6FJY=s(c$?k z`?i)nD`CZl5rYxV3`t#n(Mrd<^t_Y3)W(Wi^b0L%xI)gyS?j_@Nyc2;y9mhMpxJfa zjJUb#hmiw4=JJZUn6UoOMKw$V&ulnkW7IK!d`&yyudC$SO6d0ir|Wq=-BzjQq*INz zyE#N)G|N(7G_>bqFfC5KtWdA1xhABeNbY6zsC^SPP-0zh9Va$Y2Qe>7vTc8I)Ei)( zjIQe#TvYd5g79ellt>V7S@exQN@wZJt_Qh(M^V;`#E)}LN(f2Jx$)Y}bUsB3q@9$A z%<8&eZ(5Q>Xo-e)9hYG-HCPv=MGqRjQ}$I0FF^f^*awo!fm~ei8I~mpe&(0Hn*f1n zE9u`46{VqP-=Y=VNN61(q$eMrzVI1uow~m0h>4PcZ*ykyqpTLvxn*m=7dy2*r2P86 zM?w770@uiM%B*=ivfhev99A@;AUf}F;f_kRR7C$nNs%YKz;AaiAJe|@`kmd z(+`|?hQe0fxnsWHJ~g!mB;B_eP+z}%2rcYY7fZZ7Bt6O3zdpeqesj}%-!y@w)g=s@ z-_Ts+q_L=Kgx!}a)USx>Ov z6&bKh7*P=}e3<7K7KOH<{OkO`cX?Og+J*`Q2En?!HXSVEX0X$)V)JXwUDkZ>sU6 zg$c%N;K1v68bh7PY!FX*{Z+h2IzbJOKZ=u75XEU5hjf((<6!8Mnb$-kQ|PC#K=alU z%WAf{X1+Ho>faEq2B&^kbpDsuMn`ojX}DdlcW%Bw)UxPYcH1Z_{>)#)zK+mCq*XmD z3C(60dnvA2Iux8|+2z%(0H#5F{_gg9dcak5tL0F}6atQerDhKG@>7&q#@GQ$w|weA zoYJWCHGDt;BRVM=^uFjnn+%a#p1Nr23O5x_ry>O6?=(q3vr7nGN@_FflL_PYgbh0= zXwEb4Pe$A{KGv>?9TAo8086&vT6kA!4CMfc%EZT|U7=NcFG>HpuuR-}F$n>#`F8~* zkQ4*bDSx%k!{gq)b=@jAeje)67qBO(sn!Bx)|MI*B@>gBgS{Cjf z1LRE|K`&^P`C~rP#*E%F-oi^`!PA{!SA*SjP6-usdJCEgnbJ~gvPYJyZ|QW=+^hKa zTKh-w;hZ5+BUyTJh_{rQXzf8o&);SRb5B#NB3ly%BQAFe5;Nr~EPO z(2tHbT9kItkZ%;_5V!aY<_{{OBw-(q3X+xyTldd!5l1djU%4k<=9D==0At9~EDFT0 zjDAo)Mu*HJR;^aww7Hj;E74JC&YU28TR?dK6mKJQS@*@ZxS6+!&el7j&eQ$ZP*4V@ zFs{&?|B$1=Wf3SN#M;SLAKf$8i4Z~Xq;uqO>+VnsD*o9=6q@pYFDwU@#wQLza@MD% z&5d+Fv9Py{mzyzoc5{H^9r{3(Wo6fVEC(S~r$drYG)C@h1*t9}=JtGwLVGWb4K``R zd7|r;?J|e6{BXyNyL_)o6z|DN4O`j625YRsy}!rdtp|;VA!1gW@F>=sG#Je&cA)J% zYmnX^B5VdK-+YfUw`MMU{O1}B5v~~Jfi>mL&Zq8uuB9S41|bc7HD8N3J;6wz3XxBf zFHgpNNK3YUhtn+TGm*d=%OMFt6n6PU?)N<_-{adygkv&8T zfjNfl;vp{~WjMP^M<4ChH_#@(p+$ku{<|i!&=dmrdh%aJG(jG>sBf;5umh%JOrBjS zVVz<{l}UWqoQnl0D=2(vy=(8&mpl$M!NRCx%ae_98s8hUKjNLb6K?O|D#bBEXVoBnvqRjlX^C34#> zQ$IkSXJhx}jmQ9kTl-lx=n{S1WodI?8B9+6N;^P^4mR*L!Spyz`B_paoyNKYn8bTI zwhyvW{h_he+1^q2t;4B0VpX=mGo4fS_9%yh5aVVa$h_s^55_C|261y;WS=grt6;U( z$4Vo6ytB_9pFx{G`Rsc9E2y;2NcD9zm|-ZZMj;WhFaNPi#csgsm1D?(Y^k{$L7+ zZ)aI8Y>-t0##19L&0Y<~TyLr%i|`^R8wb_Ro)=*^VIkrhYZ?vE2DZ)r*y#6J{o`k#n-bcT$ z!Cimy!?+||Dy~tXa2&#qn}cX;jopt$syM_E%J#{wp>4dT{fVk62fNbt+ z(My#LKfYxaifYt~ZpP*gkDbDT`&uNqx=4nFFSvqODyT0e3F)qBQyRnwq}qNjZzA`e z20kOYGQ@wnAw~5Y;aWW|i=)Z{>8KV6nJ^^)J~zKF#%eH~4&q_n>bPW4*7SJ9f$W`X zy&pj+wJUL7#59whn68D4+%^wQ$?*E^#FO0?pQJ^)d)N~VCd1*j+bz*aO*=7HTyG&v zpP#*{YhaQ$?4YM*WkZ46(9seWH{ixM3h;lc+t?{_3n{iwxPa$R%?@89DW|g{c^z|I-r$)!Nb? zO}Ve&b%8czL#Vi`JL#*49(C!~#mv;ZA887lv#U=TI-j)J7hB74a+IlS6FBc)D0QcN zjQ!bEy>;^S5V>hGN1`Z}hM_T`TPIt#TY^Em>2&)vSB(OGB;R2$s3^!?)lyQ#qthy3 zocXnFhMthyyggyRz#sIa3Vb^%>V@MIwmHUx z+$Efw(lz-X1kfDWRUmUIu5H6gducOQF(cQOHGFvrBZi~*Gn~8zPM{R=Op*aVugHVg zBZ!2$&0tGb^K>6Mp6vNKkG)f6b30Kup6@2#@14cqMhFFRH~&uu)1B9Fi)Bn0 ze~I?J{v#2TBk-Spz*>HZ^bdOry--(mMK{$|^4Q}7I4y8+=~o+dTSO+wK>#ScFh%p3 z&oh`3#y=G5Ekk?7Rr9>$(%}wJIJid4F1z;C^T6GIz4Jdq()elOZSRgXqSY@vnPs;- zK!oMKf(`+RZlLZnHh8Fmv%ZErPWH2<`SF4zD#SNDp%Ii|9tc8q!u#za<=T)ScWeKY zUOLa)?hR!sJLE(_|JFmq+h^dx8vlXyXrzXsT*i4b zQRe1mkY}Snz}WR7#uy~^TNMY=E2vX;%1idDQ?dZ0+!4z=WX`upU<>>J#1f=`>z#Qc z5dJED&5zvWMtPEHV5=(6ti|nMvb`F>JvELkT5X zE(x%mo}$!imk1b`oOUb+Rj@Z`qZagR zF^a;OF>9;4cf_AH2Gt(UxANOGb)tRFm?eJmb4iN(OLbU8?p`s-wbYMX{)4%D zrmknW8uGc5qHuOk{fpo|9^qR(ji?KZ;erRdZx<1YoYrBZtL#HNG=fe#m@_Au-RWC1X9K1W4#rReirS5w?I{7SN$LS>_M?81qHRHsSlqzCAA6Hoit7 zi1`AhVu28FuoLMJC0~mju%+`w67TV8>?j7Q@1D>YFy#_AVO>14ZS2}8^Q~TW!b6taO*_wJqX5|Vw3wi@PxJ_$( zO$|%zQQiW(mkv5jRo}wMW=-PG{FR+vnW*)aehpuGuiLe5Txwr%rP@#L6aK@hgo+|Q zxZ84xyS_-zI?)akKg1`p=%?6M%OZ5*+$28@x9i617mcn(okV<>I^E=eJ9)-?d${OvH8>dtGVnkis7AQV7bUH^QD-GGw=&9J9|5 z|L+f`H&6Z~6VK_$NxlE{Y3lcZ^Qcy&*rX+D7 zdNC|9mmAD)Cklk9xTLN4MM-}6;m6E&t=Hb2($>#6(oprsWtVQnYYNyZG^BzLnWj5Z9rI==}NR9#t!d2T`O8 zajSc=*4z~`3)~3%&wnNFPp@TtM9@#lV`=$#xv{?=SWrWbXGlbxw#l*6}N%L@3gry>!Q&~KNT|jqi_z$@FAWM`-SB$2 zwBu_yo=eBq&1$w=>O=&n)sd-uxZr$&>? zbM?iT{DfhzyoPM&Xt91Kcz#GTmn>2EVL{_*`8D{!wQ!<-U@ADnQD3fRMuQwd5oop(Udg52!Xk0JO;I4d_9VMCVw|szo5IBbM zYD2rNuNkk4zxTd(T~***aTybb%59(6M@{*ueo{={&zn4Bctn3C9rmL#Ae;K)yQ;5D z;ATL5Q=cz&AH(gdiluK>y~s}ADX`8UqRY8UaA1Fze>ubVFqY1`$o;3H9}hUILXHhD zZ)*t_Y6+IT;>h2|Cp|T4@{y`KK5G}CSR3rzotfOeOl==ABG!?~gmYlxb&1P^ zgSfT|i}+{9Wbo6BwwL}C-Wq^!4+M$u{WDNB30Xw#&w)liHGF1?j|igM&%u{UNDf4;vCdhg4El}m>D zW!66706=AU4M{b#P`(cc18##UK>sn%o@V*11CfmVnrMmB^hEocv7+Y06TSI-PYEah zW&}wkn9q3i1tSgZOmVSGgTcPeqT@pP({?A^MJ;^?&cN97Z8#I}d;Ceu*QxqBE=jh0 zZkEgD4zuF+6sWl>tE#9~EFJIMoVe}2mejWXyw7pL7!`K9HV2dE*94Sw3sfv2K^Q~N zJIyzS5e&b>Y2zXvebc%q*OxFW>ZnQ3q;rn*F{TsyCzeY5r~LGOp&KqWI4)1xN|kewv(M!rOWS)~@A zMC)rh59yW8)~pW_g&I6t6GcCgfzny;AR3=w>nQJATI>qOUw4yi27>baKF*qw>r5MZ zzEm8r5UCnL^b-SC%~68&eyg*d9-Qwdjqf8!v0Siq19T_$;-%a4u_;i*QOp@ckUl{u z$DZ@;$WMmlcI?fT9!_{dmV3~Djw@0~&#`Q9v*j+eS_t4$*WYe?gN`1?WtTpHhCZ4= zV@0d<;ELhEA3JMIO}1@lnmX-NUp95tFhjKGQ0=2I5qM4T`m>%ya?~k;Osga}T)6O! zDyCKrtHUf>si(&aX7)74^n>t>Z^UlW-*?Ws?*~OIp_I!NJsCqWf$jzqE+1TDKu?s0#N|_t1DqiQB zR=nsv?56%uHkip!`b(keLmcD7ajBW5UA}4a(i%S?(c&@4Ck<{mulM(t1>ElbI;XO1 zB#JEX2^d3MTL@XxB=gw>%RMZ3_kJ|K7e~(#@R5(MWk68VZKYNI_NH?aT9;VV0gtNP z9VXYC?UtI}^={SEhd7-Y+t7z#X`saJOlR)6w5Y~zA`VpNz*^%mJ}7W3(&6d|vA4cm zjyhqFupacL*45n!!&7C>g3;@)G~M9cLQ>%se#vK*L<=HgENDh1RF-Y;F{qb3xn-TK z9kgRHQYGJM}Q5ZMjZ6+q@t9SCdl4M-ZD{_P}0Tvk=?FGZUwQk1h z6`#QfOns=a)~s_{yOc)thG}i2v~)aLDvL%(zT($Vd=|6#z`V|jm?ZsPHK@CGYtIgU z)1t~n4BFGO<&`s+9mv{SAAV9wktL7+c5%Y4N$oi!=49&J zj3#Y}S~EE~Db>86*yz#g-k;!W++j4}`-a<(Uik+{e+TVyvvp@9Si-JDYO`_l6X2*;$92KfTbmbvvfpPn3+n=!?5x`3dV&Qm&~f z`^5&~OzUq?d7kRMVO;IVJ!E@rdk~!GM#TmPuuNz|v5-MDFko@xhU(6;sOztJ4`o^J zlutIN(oea@quJc(5ti?pzsmDwgz0r#P8}7?Jxkv~2nwAj2jXeG#6;mIqs_HPu6jN* zSA3UMP1F(ItA%=-rnMCFLSP5!*AysDtS-(kyY->y4dncS!^&QYRG1}u_~!A^d;W2L zQ(Qr3a2+9*IM-v#clD-MS+q?f$24Nkx~$(eIvEGp?>g}|z=0L3RxX?vbeFioN}!H< z%-ugKHS3vo-HWJqpn(7(d@0Z@1B0)xVa`)6e5xSD6)c!RLa=^dI)LK6TOER3kyn-W z{M-1UIF7#Z6kT`BthsPccuZeh6YhA0&WxLK?`;nA6OoaV%vIxtfp>Wh({Utm%(7mJ za}C^i56>&d&+p}g=;P2Yi*)HGj`8PXD=LR%s>*ki+(fL~y1((>yFV?ThumGB83SFzH>JLz>?;91CJiho@sS!TbO})&fn8CR0@2~Qh23QZITZ`U zW0O9)80omktn~l^FbHRPQU_|6UN=^d(KGjXLf?0w=wejJK`tdji;q9$&YjQiK3}vs ztG0IT%ob%nP!*Dj`Fst_2nzy6G=j|QTvCmA(1zoSSc$NfVK3`!OdX)42dhGg!vuid z`u~rtw+@JM3Hye3=@0=)Nfo6_x=|1iDd}$M?uHcvq(!7eKtZ}YmRJNtS~`|xR}fHY zL1KX=z8lXu&-=XZ_b)d)bIr_E^SfdcfKCnS5Yw&j`(ikH(;>NEB2`vsa6V}Hd*6V; zxWKgS5m}0m$3#GF60xTXf|4akGg003 zz9GYZ5{~PxW#O1R?|x)6)Aysmnt2YiVbb45Y4z!V(*W^h0&7L{2m;Omwal73MO*(? zhZs*V7}76gJ$u$)IP(41%lMG?UAiNx#iT7GwbQG2&xRYvhIDPoB1^#kZ~}0%M|_?x z^L;S&E8=@#T9r`4ML~EZ@B;QHg0k$FE0pGo3_D~XfN0gf$uR8`{&+o{XY$a;rtht_ z1wXO%_tyCG!nhfZZh-UX{@Gz5iN|khl9QWy9D7v|NT}4ybewQT%mdR~hz#DXDFB6l91w~Q(&tOMs;`MjH%a+qxZ?=oi zAE}TD(gQE3UY`dDRO>F{7dks6bS7U1;*escC8PT4eJgu%{ogZ-G(?)X@p(MD@a)ug zM(lShxM)O-EmiqIbDPS#_-Vo}AFi+e;qUc!TfWfycwq@*$y1f=cCGYXJ%!+)KC3l7BP-MRX8VivX9ptL1x) z&ith+UCh5vZp5c?=)tkOCg3i}4RWnLiPs0=>XTci>4cS_>z(h|oNdp(l6woD3&9Ds zKV3c~Zh8$u=ROYm^Xg|OUTc3Zl?(-il_x&%ZZ~`2XqBJh72++pMWInU#}RRQzHYA! z&u556Wl_8@E%;y~EhU^uYB>~{5mG+Sp%eGk-(~cbDW7BRp7a8(<^Hd^k)a2RlkdGa zL6|fTT8@jG1&r&iv^Q^wmOPRF9KY{TygKdUJjJmX=UsXphaDkn_)&I}mL^neRtw6x zf3DRQDiHyhVCh<_1a0`bVltC6Zm6Jcjr{hNl#I9!Vgdgr`yDH@?PXW)-yo_zByjKX zavN9pe!BUSwZZue`^E87Wlv=vvLwdV#zv?%hw_j+XDGsLZIO0SBZ)o!2L%h9sQPH| zexd%*?wy^RZEDq?gIqa|w|1Sh%IFP;c8l`fJr?`A_VGLplkL;6s#`bzAYOQ4-`60T z@Xe2)M~yOarq5dyQS$CK5+@4l`%}j3;ZCJ-KCS%n3JV0rYQOO zvJa6Q?vK_pyBu+vo2DK=S1eNTR~x31d-OwXmMR1O3Z#3irx<0e?>}}v_q@kIdxn)5 zq5_zae@qD=U*Z_#D7_#L^Tmz)x|DVPIsL&5&JT}FhJDvvt{z6XG+5fXC~KT*<9ly! zava9~=QKxO?wg1KkWXrs`nzM#OHe(t+xAe^hg()ZMhxNiJ_>Vs zH?NB*7&@Wq0I=_`O6_TCnZ0odrNL$2cQN<(xpY~@P4w#Lz?W#qPzia>IX5Kt_Om$y ziRXjP(TweRIrck0*aD3pKHW}lUr&^eX*G5h=z9B66L|`~fF7Kg#IQ(f${xpRNt|{u zRVrwa0^unM9PoN;be8bcDQ@BvcdxfJwbk0B=bYl{YeLf|GB8039v;2fwM-IMcQo1W zBa`TBJs;z05~b5YXH{}pD6JkcCv1LgAi{6ma#16-_^lz#T4WWVr%R`BT5f|*4F2$e zfn(9LGHT|;{%2m{G^3>e+?(X$w2$q8^;w*KTBokp4IDE9(~>ZXDn43`!(qN2vX|RDMo6S_-4bHU<{dC^KWsWS${hZPO--q^G)=+HG+xUOfKS1Xs5;*&ibL=sh{Z%{hzK5=3D=im%^)p^2kN4=w^RHn`90;NtG$ zXBC-ZL}4-K_+ZWBfns_c0W670Z#GV)03|9o6ynIOqKjjOktQY*40J5U%L)nRa@GAF z4wMexxHihDcvBaHD+C0Lj8I5_xhC6NlZn30iN819p*cJqt7y)j&K49O<=P zCg$&MvOh*1G4AD^aLpwrJmHgFAblm?^ud|irNva55|{Uk^&;ovjES!TB#gr~6**Ss zyt?^R#iO^3-fD-jr>txu&TVrv5E9>j7kH(|1fbl>QBPvd3D(4bNA~iafHb&oOhD{a z{`EEkks$qFBiP?EyL|}_#$Be8-=PsWcI#;!oP7nN(^MlZ|8uvWR z(wF6h<$AMK(uCl+YSb4OE!QPk)2fQ_!E&X;rb_4e@VC0O1~z!wD=UlBR&7*%L7NhwhB9YvQhoT#g~FQ;!l;_$o&)`(Tqr=?bt`p z^Gb8gt;w|py#zf0ntW-W&8MdL1(sWHvbQOFHghg{)-e6qxAMK#kW7PtC*%@f<>7mw0+UtsWBy;UMXf9cCC1rw^QCk^R4=}XKk5t=TE+AoWfW zYIswH!d!>hSeV)_9~!usTqzY%A6hGOvc(UPSFoH_`~+=FU)BPB7}o}ik#C5Y0UdL2 zon?roz5>=GyY=U6d*M~}B82s=nGt$sRgMM(;#qkOYB853i3IlZjqel&7mt3V4I5^!uuzZW(!Jrh|Rh}b-e z1B2|X@56F8f2DkyScMh2k&?HH!n=TC5-awxuBP4HZb1~*23|f`Zz{zGKnjU?ClYX4 z7EhPvFnK@$sDB7?;X_^j&s&!&{n$SQR-Mhv)yAF7R~LWd84TRzUkUp84Yoi1l`ldIu*g0V{9=C@rA}Jh8}Z zbnFt3bMPO*XUv++W4X`nbjqbP)?BfIhShL7aQ@N-0^EB;!L5rooD2$FY-!Iq&|^QA zcS=kinq1=4NRlqjU6Di9@WB?*S6?7t5OAA_s>nJBcT~$}S2cMS77cQ_jWC9Q=_UAJ zJo|rX2Z+=k36ggle2gDAQVB{Js(O0sQibShZW$UR#98xv(pA%Eu$E3MyFbWomJ{ZfkNL1T<#4nt1Em&Hj|JJTU~`gByKMhB0Uq z5&zlC^eLlA%;lg_WZ^Yjo9NY>XhG@HS$ht*eWxG;P2#=ye~#t)RD@$6QFrkh+}@$a z*C(bE+G!Zs$3jaQhSB)aVQ_@)& z;vL!vGnoy+F;i{0zj+2VTA;UTFw}IZPh8%&QypIUHa^R z1(B9#h%UErz^V}UGM~{q+dk;1e4CUTpbzy|d;q_onWoI)KTF$gQ9JR}=ELA+HO@2f z#xG>shMMH17veCTpmW4Me&+{xET1l5q+9gmy>9k?g{t{)y##nY4=`S>k*Da`cw9PH z0gCu1nT1q3*@^h`Gn2cdwWhRcv9-gIL0@M#xVerE9d}>5QCM~7N`EN8Qv|P*jau@R zt(c&u{!}tip=vKN7rVF@2VR)G%OIESqr&W93|Fu!Bq+_=dH&=Ad*E|Ytc3>%QlRs- z$n1K`|126I1XqWW)y~&|*{e#Ei98kV!k)Nf`ZX)JvJz{y|Lk9mH+$ z|A7KE&tm^$3zrtqG$|{rmrG%vBjn)0aB^t((&VoP;7cFz_wA+atsAzrbbw&(^<7Kh zNTB>rF{aGLFZei2c1(FWx4Su=j92jH{afEKQCe9?1^aZ5eC2);7T})< z)a7Xs+x>!oh|58$e7Ux6e=3^@+vT65`5w!M1A-OE@cIT1`Ove21oPwF-WDy(uzPsd zGsO}&(#MWS$Lq(aKgR3p#iThb-)D1l#J_O#pbcMJdQ zoEpTej#!&&j>O4Zc znz;COVLdtkiU^5MK52)CiLaln2{c$?=IB^a(1RQbEF+wf;+cMJXtF^6up&NcpX z1P7?YG|uFwX4|A)o^NDc5cmKZ7}fw_Q-*@*i#s~$o5{sevge}-(=nVs+Z}^$2N=w5 zvb#$ot&OR3qC1u@MyCoY&LpLgv5$W7&z0vGP538O7Yw1FC_0L`L(9LnAzH5FTeAI( zX}kJa0_BSFPCi~Wkl(LDA{i;e>AXZe@4%>O>aZ+f53d-z!hwW2cUu!Df5BbsZWY|B zC1iEB^AjXizKT5};bur8K~I}q#f)o=`U@bzBH zF9D&MN031)d31p|6hk@QE&Tu(*5Y(-cWZ#Wm(o8R^J}z3i&b9NTTy{6KCM?Auv&%J zD+bE%dQTlpzbQDvjRgZ0itz&@7A&Cx`AWEUqaMu0T{X@28X4LBSdjms*h?G3HzeV_RUu$|=O*CsU$ zLB4`h=q9j0FGIgUTsvX9dx4qS6-XX#!Z{c7T^u)y#)e@YoIT^|+Bs)WMXc=Pfg*lf zes}fOX2m_9Dfj3b{Siol0}Mxdja@8}gVa6qKvQ?z$<5y`n3_m2m5S94%a^1I93 zLA}e)1|8UAzYTHgV=*zF?w!kEmCi?pqOc{>KFev+#TN01u##Y_XNfm2c7}(8fVY5S zuT?MzgA1bizy)IskZ%5tmSHDQ<2{;Vl-Pl$D4TR&eN=X}UpdIE38%96uyq-D#kvuQ zxy)He@-NAY=#F^kk_+lyScuTtxD5iau>22^#h`A#sOGSsgR#rrh~;@=3}#0hS+LXF zVwLu7hu(c80U3rp9F2YYX1nWR>X`U^Z7Q}U^ij(}jyT|wf&kp9HQo+Qc(>Y;(VTXI z6!rihuc0C2s$B*+^4+fVLNT22#*7KH#Q9RLVOc`dE8yfBmQMr>OU zI@vAjors=y47d@-0$emf^F-IS(}fn586Yo?9<5t_Av9J&y=o2#o4p6C85IVBWMr=Y z!)KYieONc$Ks!h5xc`HQ2;;<~-u915>v^L&k+F=`jn3^KFa>svx930sWxIF+)vh*5 z6DpVQI}A0PRd{w8icFXJC!7SwZx4P}6?KMw-PtOUl5Tc8mLex42Vh?iNDO%O*{tUS zCW^PA{+)5Aoz7R~2;nkkwqHXc`F#%bei^{-oB6+~iIzXpZ#Z>)9m;=>W?%8dHJYyEQP4?_=riHy<4B=Ed+5?*e(YQjU*KI zIJ=8-f9C+Wvw!_r;IDP*Iz{Exc#M6pq`#*tH%-P&pYgd-MrzG?3q^&PE<=nb+ zb39^Kje^7^%VM~&S}li4psm$#oDM95QbcEf@HLOM{?&CMvmh+nT2xQ)Le&YPiUUug zfIhljmJf#bo|+A>miQL;tM}d$`a5^^+SLc6^nK*PmuJhD;{a9wLh1Z<7C2y% zRiG_9GF)UZG?=b4Xk2sTD)e;!V#^ZEKX}kN2xY^4*P`&V*Fd3zf7jyAhS^Y5o%b{k zmKLdqtX6l+C>;9v=1c9^Xz}8A#*mfZrNjfZ8!~Lyl7yi`mA)~qR4dP!so!3CTkhAn z-K<0FWiYh}IC;ha1#J3&`Cz}O6xRCoMWFE1H;{>^jHhtIKIbhCOAHso{c6)Q1_+IJ zDhMt2WFjA$`*4aCDuC_+R&dsifp6 zkxpzo8~E~kmUpqUiMRuuw%B>s`jWO&IA_WpZ4_o4h5RFz@6TH3L`#P! zD%);N2f?eIISXst?=ixu=*&blQwofp)10V5A5?!e`jG$f@JReo=*&TF9bq2uZUpDU zf4#yWdA-9v=Tm0=g;>L7`CjgDp9P2a*sW!|ULk4y2mVv>7>|n=-6P}eiibQEaTw)v zR`s=5^m7n@0{HS$GTxt6{_6Ge?b8bvm4wT~o(?ER*-Sp{f->yk%8)*ELWQjj9T1`X zv&C$mkz~*Ca%(eXv^atxR!mvL%HS21mcgvl6u!~;oQjh8yvkhiDvg#QlHdmQ3d_AS^gcn(J7$`}rZB5pUov}lKS)X&Q1bGc<(-jSke9F>Mf zH-RM6cxb>6-09yE(r(XsjLIDmF>dLTFQL{6n(6hQr&S?ok@t$tZb@!vC*5z>DR<_I z(}^W4Jq3wmb2*n-2~BeiC1-EFV~r_!XdJ+iJ>dJf{#%gv*kh$NtKo58LE;4sE|-U4 zNY2RSSLMx4y5)^th(t|keT|f3>z94q-Wco7hYSoiamRk{U2VsOf7+3( zlOrRxnF7BZ#88PW-gSjuiJs1doc!>lqY zsfPxCN@moHQnFB?0dkR%Nm{B!YrhiBUOjBNM=u&lBDX81w~{umPkT@(bF(C4+TSbG6O@UcW0&cUB&z27 zlI4_1aCG)7fU4_Ws{r?0wC(Eg4Hl%_PU%sJx&LGSB!PhDN7&~(fmiR&Ms5yFi8&b< zr}?g?RUea&m>U)Q)f#STmEKH?xfCgcqXi(q zX5d{y0OPJ?MUCfk`TpP`JoZ*>X^{^PB)c5Cg}o52!lo4jBE#3|QK_H^e@1eg^Qe0f zWeizwPcG^3$s<;kJtHoUb|Phvly5UjY1(r}`kw-*<(}DWfm>Q)x&X%%CC!2(otFxK zQDws2ta*CN+lEeq+zcdwTyLsZ63J#sJoW1p^nD?m;`Zh#2gZ8Zb|T-C`MK1}o=krG zc(7+SZLgIIZ&K3i-G39U%|fc3+S^~KD}1W@N0l8M>zBsT+5QHwRfuNX$syJvT*dS z?)MAAi9#lQjkqP-Qw1KLmLA4%vYVu{cBdvwqdvSK3-oZQQ;t~$YH#b z)#PC3le)qo%S{5{d1rt9?p-pchg{p4%rzmbN%-?4VTXv1KwAW>CCtUx_Himyd)2@T z(9!bY%SkR-<3q^Yc=g$4x#~PeBdNQvx?#@;T<<>B$|*NNeyTbDG}=}!tDv1`1CMd- z%@>z_05M*zF$_)L{>T}X6+MBsm6pqwPDw@##h+L4nZK`=(mi8g{+&N!SNMm+ojmoMCzG0K`7~`R&vPfa($d*3 zw*qhJwcADM(4@t7_m~kDmX!2nKYTU9WEE8?y%kjNAl2KHw3}|9nMt6jU=%LWk>D*k zm)-XH@~8LBH^0;>z3E^xX$QM)ON?hkGK~MDONGGU4TbYD9%6l%otANEjr`eIu)Jqs zlRTnb%Q8ToQ!0=b<`J6H_K|XFpawdgU%)C7^A(C1n>`B`R5-uveGt^;lB#;O>(vOkQu7`z>@%0Hg_6238D&-A?jeaPbPPzJzg8 z2R~fYfhJD>xSMWxeyf*37U)ariJ#NO`YIwA$J5qAoca%(XRfnj4N3(U;DL!5i1E}5 z2fw7aKqI3w$2w}N)kArEf4Tnrg-=Jc7pN#yzNk|A)|wV;Jy@O+`(})9#|zr&3ux@r z9F$;8f&9x)1dTO+j%YWU8vF?*?!i`S1rp4NSea@$VAUk>jb7PPWvEyYu>B#8WoXJVf--U*%9d5!M-F;lE&f}H4Asr zdM+<5Ws#K^za*E9owV^;^u472p>hAKI5FPI!e1o#@B;9ze1HbKD|-fYf9jYem76z` z%D5#QBZKdR7(-@ymil65+s{~!sNlv5^EvNtoa+%Rhp0oMnDRMbv4j%*u*Vvb7{qg) znNnRG*NQwK^^OETP~w4XpHrgNy*XnfPwz_*98GvB_-SfLJMhaZQ09-XJr77yS_EMJ zt|BJ5lna`k>PZec%m&H_ttM5?9KI{%D zi*=jE0rM+|F+Yb(GSAYsEG2m`v;REMhBBbk@Fa-Zb{42mQWU7|cc2uuK&q>#h+t0G zek#L)DwtmZyi8soTN%J!ZnO}*feW53T&0<6nV(=l*-|>E`wyhW)e2rD+cLN?jKU9aAfc{%R43TyJxH+B&^}z zwmH{Z8EzJ;nAy%^dR*o*1wo&j=?dVv&~%%)!Lg~w;I=O4&nevXFHRZOF%_#JQP>&69pz$ zM9)=MfW&jHf%l6{jKuBCA8S&-x$&J0|hGqu_3tV8$Wd9iy#*3H0S%(=Ks z)IpLyc@y-HiY1JOuM^`_(GK`mwo3i*a9apA6r< z6TKx=xc22ww!YY2#*20$a@)85=HjtGhW7=n%%0zzuB&5S5vU|_k6B%CXKkf&@Hw_q zP?_RSD1PKT$K@$H4e}BA-dM{W<}h)ww&F95U=kNIlK;O>DRYWkcX+*C0M;DvT7m9G zAg}YGZ7A;(SC#aSkD_%Fj80Qg$8t;4AF4jyU8p=uR*BT5mN2=w>`G|#tF#4t*H?1r zX>V_vpZl*CHXPUF;zW%dVnMPQQ`#^V<`A3_Nw+{(Nx4eN8odpm64~MFoQCAD zFQ-H*nNIV08(B$=J#`&_7^zqf5zsr4;jUH>^h z0MgrF9{{mbPE61Z+e8fh{Dz)b==-u!*gFvRrx8WEKtg28Tr)eO&3$EP%mAiI>Zu3S zJz|!fw%&d$0MkxyJ2D$IO$xU5%-%`KjN7-i$xqQXQnc^w!VG=t?ke=sK3k>vq3@S$ z78`PCS$g;;EI+{XF_0>9^BObN_!}>z!%(8M+(8lpnE`|e7C9T(w_EHLj94f({6?+0 z+jP}L*x@4@absiOa5;Xx**=3R9lyO7@d;9D2pHjq#)7-=*fv!a(v^f3tK6tBn)z3X zN8;UU#3RRCYjmKBMS7xnwfEnLYoX7-j5!SatUC-kbog;Fq4kOob$4@w3(gD03-jiq z$znbG^h{$&Bu3DK)$cvQYc=z`iv@m2rt>e3W_?x7A<7Clt8}Z!&WPt9`O;rlZU<$~ z>YVDvo8L+|=-rR(-TNbQJCl<&u$3iD(o?RH-a|%?#ZsmSkqe(>X%c8F=c%u+JH7F& za_rqQRCTGZhnX-B|9|a30?{6(0ufMr4m9E-xW1mx|6@z`xdH5TJt61hcxUAvH4OKU{!cI@ z+Jlcn5xa${v*Pk2eU_{veY*nz!l&yA#s^W2m~ky+fMvHNczv`hLQuGoOyKM|Gy8l$ zMlA4P1B1vG?FFzOnC>+o{gFdj2?+p=f^>7Fd(avvE3ykMr-DxG4S!gS9V6P?y@*YL zqLK1p*bb~hG4?3u^dJWRWXB!DVY~|sh|nPujP1x{W?9?jb8ZSw)Z_sMiIT2WV z>l`t9l|MRd2_>If{|~E;)R6vJEKF`NdW3U60pASCJE_MeDBKCWH1B(hb;8IMly%Sh zM{IX>1|6*D7|)XKVVV0WOcgKba}mNo9usKq-CxODyepm?RO?(#XXR2OvmbN05Y}Sv zvd$&|+irl4%N+SR5aR_7+$HxIDbV^raE(YN|3z?}VwZf^d&=7^AQ49BBPz7NB{}{H zVND>qJme}=F_hQ^f&{vbfb`v4m z%V&~#{DV9{5O{C?|CuI8N!)R|XMu6G)g!=C{)vYix{H})Z+8kVKz+}Zu_r8?D(u8r z469(Hp3wCj2ymH;Q~sSC|1XO$drxH(R;<(DoNvq_0ybB9&knF->X)y9@`4(SeFCdT z)q+kw42rPq=-;IhINJ|%2)T*|0bsS-|K1@B(OXL`n24?hs)&6~ceI@LeRPYK``gfC zIQh+kH5&Vd6dBE>Os)Loc_ok0Jnin6@a^~i2l4)Qzks|KREz|8E)& zER{fD69jU_`){{m>u@Uwu44y`K(N2sY6>SY=k`ed2b}ZWQ7ClnKOXp-3_ZdH!;JjT zaKO6RffNi7O!->Qu9Go%XaM?!fIJY#v>9f}HzG@IQj|-zOQ`r5ubUGJg}i z($uMV4Qc+BvwuDV@Qi$W9V&b~JXBh&6rSSYKz`z{od>|4Kdv3bznLFo_$Sy9@%^BH z&_YvRvKs)vEc4*nxLwl)^iL=&z`(KclJ77(`DpphLM3QT{&Gj*l|NFxjR8fTFLx2B z1`oyVU#`Y-1|Qfuh&695hXr48RE5|cUmjeDzYoRiPnD1h3=sa`lvh)s#G%~)GTMb@ z(eCKoJ#fbu96UUUyjeC*gYvdFMKeB=}K zGI}|y3{y?Xr19ow_&zbGr2vs$AtMqC9A%=BqOx_6hoNaW2*91k%Fcg#hN$J}4GN^I`ZZsOBt z4^Yb|GrIBbF!=?~A%zHch3g+Jj>>QQM}(an`ticVaxpJKDrmWI#9ab_$+8%43!Y;D z^a#kXZUl87eq+YVilndnrWyUH^)mdbfZctflpt$0Ea`R%-u&L~L4p?rAfcc=rmO*T zM3+#K=FqM25eIK!FmniH>cH!00 zz`q_?s(QEIx`^D{)8Q|>R;onn%Srs`20=Jp#q>$I;3Yn+2u+N_0$SWEvd}!fYHx!0 z3Lg+sL)nyx3xV3d8IOVa?G?g*m#z9^W8ZFE{zL#s5du;n`##>{`R7AW+ad9MI{hV% zkr*E=+BIVgC-C`anaii<>EPZ7Flg=`YZPhTOT=UlKB)42QT`BPU~)|#99 zp0QmDBY|995Ukz!tgIt?Hy zBLrJGI5%$21G8Sq2waMo=Ui<<+#~Etj+W0Vls%=yc{qaWa=zVGEvDouQXhNU`}~Wf zPcZbLRd&_oSVwtUC|75bPp-niqesbp610$M$DaHTOQ46jajZoR4AUAuO zWJ*zfL{wW3znRoKY%~7So0?#PXj0xvlily|#g8mk6 zuVrP7rr-IM5|Nj?3Tx*5_BAXkjtseJ2S>)Yg93sMsVg8_Rd!GPrJYPFzj2L}Jq2oU z{X3_pP_NhGKHp+qhb@n3B)cwY%%iNg+PH`WQ=}?nDt$>JrH7XF7%1O){@LE!C$zdJ zdwwJ8lwmS^Z8 zji*d_VAdH%LioOw<)Wi7e}ftMzl& zDYwZszkBN`?(TB?RS}C&J9X0x8C|%znhPsgW7|poF<0t=FgrSi#-Wq-E(`_XTc#pi z3%ZMI(Qu_xil}Rc$%1KbUsUSD>2&qsL`&|CDg!z6%#GMgf5s9|v8PQx@0+^KaRuKD z&hdNMc}(=oz6!zC2qy-wFBW_ZbSpmi!r~@!-froLe%b74`?*ofdS=mQ^JJv=(V~@@ z{|2>D(Xk6~_?{{e3Oo4O9~Gu90^UCR1NyUD>bI-o#S6alg+350o?XrVLDl|tb|1TGD?X9`q%p$H+{!x;vM1M*vP4(kAA7-7>=Hb84hy9n;eh%b zb&KH@eBvM;9XMB~Y&6Rvq>}%RwNq!Y&?}cgVP0j}S6q$CjWMRxJDQ!p&)8_r1AG_U z=0Gjp^bMsOfio#S-asi1pDoyZq#?Q4zDWHU$(JgOiD~wRQ5gvdbMZk@xiMogTx^@QqDx-hTw~Kolg>;#DOI^g8Tq-y{54DILaYK_D*D-J z_@gnQK&Q?|(qVizWp-6O%?JCf_g*;;X7(vh#-I3rN5rZs{F9Awt42u-HFM2X+zs@!8B_E< zo%QxI|r4J>kt@`O=leMHYZsoiWNME7)JT=2N zhaf--oG>QR5(Wvl9^EudRUyRL*7_1g$z{j9uvI#MdHxf>wQk+znOADpyx0h!j7lVb z?O5;MC=XW zL$&7skIjMMl;SQg5Rku?so}NL-IO_ftbppoehdi!gCKuPU$z`X8%2k&RtZ1*_Q?h* zQMD@m!Glu!cl8dR;0jE~rC|u#=qDs>3T2ynoL7t|@ta3|=UB?|eo55##;?quW~jqW z7K5G3@y1=hlu5_klVXQ;@_#LCIlcokND$7qSxbTE9$>Fkk%T-Mr(W6SzFs{A2Y@bPf`cX^fcK;zQrA(#A%$Ck19k45pK zu=CTw6HWfxWNunYKu$kv^h0d?K<~T)rTwQ(kEm&Ez{>G>fh~?1HXfOJ0<TEGRPUo+)nq51<@}Spc*|qvbzVn_?1^3 zVk4b1AGh(GZSbwS#k(R4yfWH`Jp`zBwE3c^(kx~s@A`y|68TFtV%ZqlI|~dyM9-o> zyB;&3^TG>-fTNA#OXkic1k?5sYq!3VeN^W#%pq)TC~|Drlh{q2#SDa(=ulFg8DFc(oX+GDBaK4Yi`eCpqXVDJr{7e zK40RPKG+_eOHWu+Q_{^25NSgrsyw<5L_VziT(5S8!D@5lYmob0p5*XSjNu31O7?ff z6Eet&>lMH2)a{njIL6(sa3GA7Wq@xzT2hW>bMv(m^vu~peX>`Ysm{>G3^+$>`W+?U zFtL6GsWd0xE+pzr9NXR{rEK#bX7SompK3YoM6BYXpgg{;^(;brF653r62pp7Ym%m|Nan2;#GZ!2tPn zK;@_DYOKKS%{z!CRMA+y*BVKaEcD<^XCmIKO`O;rkR}OsbnWzj2R!)jtub}!vAT?f z7s0=dlHEb5IIcz8)t{Q@985nygUFkbe(<}w5<0jTL$DgIZcblhZ?!VyeTeF7W%<*D zBjfygcB7HI{*z1f<-7RFQ^)PtHlNkv(YvsPLzruc(2o?8$yA+cim^7um`~0aGcbFC zz7%CamolU`^g-CiJxVZ(*m{k4+iuNHBS^)~f$ug!=xx)``TVFb9h;McBP;n8d~;eJ z*m_Rf$MCxh4X@i9E8&kJv34Cb+SX@&0$isLjX0)_+P7rIhfn4jl7ol0hphUC0TAJ@ zyEJx?dn0h?QjL=IDDG$gzg2R=!&c4w^KaC~x%OKP3g6U#$t(MCdK@pHDdl(*;ROi( z?(mhZK0aytJQRP75|ycV=ZrU@^V?5S;m7jaI(ScPQ$*u+B@H3ESLVH@6(6J~KZ6Wc zJIKWq#As2I(T|ue6W;_Bp|yjaL4MaiaNPBMc)b>Uvbaw_y0?15`qC37iozjobMot} z77S%YpcV^YDgF*;b``!&gCoQ=cxg?H6%UAmc@aK;o z*Kd-4J2N`#kz_^uc=OQeaVy*H%}QlMg@mWSI@CzRZ|HN0R=;lgxF#a;nJA;J^Pt+P zF~xI}!TsRQ(xMrbLt$>uC`}<>ltdX1OhDzjpJya99w3OC!3wDSIa5i=h^5H@P6HiS z$rtJVwfzeX7bbTG6Zc)r+?~a{{7;;Js=Jx9>$^0>$6OwmTf-a=y`A8khQnM&uiaRa zx0Y4caagBU=Hg57WBgWT*5;(Id%QlgXM7T+uQZtl zpy*)*8R3UQ})#>wF+mmn{( z!NxUr*@349T-yk*mmoLZz_@pIk*Nr&p|aZj#+`yA&i3{bkGWgt>z1-MpUM%MSVN2D z(Pzf;6a*>d3rD@Ohmxd!fZJ)aOHApCU`Z18p(q(mg+HmAfL$)*g6_#nab+B{#I4qZ za0zJ!xfRblH!K)QYBjQQa19E@u|e4%KV)V@6)&_k;xbO3-^opAWfpqa723RN`RNzk z(;>sJZaY5xaUFMH?=bG)pv**UhSjp>HnG!Bhc9(z%zt*%p7Ot?`fc)cn@m*P_c9}s z=w<7hHP#OY+C@AO7Li2&e01&aRo)pFX51q<7bk&wwmyg8lOGix$1rF*L2MZ~vnpOt zxknX$_^4w^;8$*D*t4W|oBTb~(V|kA&WpxQ*1eW-W6#%*AtCkqx3~ z9YQCyFokNvdpt)Wb+E!bNlx5%I7yXeX|EQI%%!uMk}asMaxh;va$^;WZ!_YKSmu_F zsv*dunLfN?UN@0ED4OC^@`QXdxL=`{UJB}ZM4LY8a>2YF~rS;U1p3oV{m>uNC(6eewA|H=>ko0e!oz)$cTGA(^?~~v7`-k zG&2K=WGBs5G`6DdxN`f+=cv7s-S4mqfd3ez7YRpsbG`H2NQ~!CR8#dosAWB+cKE#rPfINyX!Eak$TN7LPH^K2pPU3Q(D?Z|D(*jqd@$ZXFL+KT z!%cy*d%PdT0f19~{qFZN<5sXe%RK-u$;9s`&jX60{vL1epHLs%n5)Qv2l_x+7=U$* zM^Qnb|4FTOo`);&D-cY*@>dTrjQMvYKMS--*av9k7&N~k?4=RZRrVJ?@u@2Y$j20t z;RWV+7!mEsxbA1SmdhZ&|3y$1jAnpQu@i@vrUJR?TM*EAFKvF@*3iM|UkoKH#ZOiO z+{&nUqfc3dI_96RJi`Y`|9nkN|NFIw4z+pY#0SO;WNAK8H#5x}gm{3@=|F;vE+L*c zo&qG8w|tpn-_jpJHmnoI`)1Zo#ef~MGr7yp_xk*gxj{U|shzZ*O&3Fwa82K7k!9R% zmX%YcI63x;>z{Mn!er!HZ_h$O;5^`7Of{G3P)Gt^x9E%^^lF{E$A4A2g`am*bN!DI zqr3k;|4nUO@2+aUlA69Ajgau)<3bcM7RXhrs*j&xQ*YhcsDS8z+4UA2%hbq5Y}so; zHRsR^XX6j><_A9f941y^S z#NJPsYGX2wx$s7I=N^-eS-d=-EI)Ag>BOQAVxsV9{cj&7#u_q;(qHbYWvnGOkCbht zu?e8en6?8B&SmfaR5o{uIM(`QSrV>4#BB2-7yi^Rem!S)lw=uzTpiu!M22MFNo|(b z?LOHPHNO#-X}It>>*cY_;7c3Lh5jGx9bRpiQTG3jthWxRa_QQKH=Ax0$xVuMBb|aY z0@7X5-QB5@(hbtxU9xFu>DV;V($e+ap7WgZKF|02mzaBI&6+i9R$LdoM@_9_oVxSe zm(oos}`m{C-yO(=3O{Z1ZW9T`nW(epzJ5U4l(#`AeFJ{HhyCo$f z9{E2DBQ@LZKWewsSuPRvZaF-qhM%{AQ_{yPq;)^y$sEpWJ#Tx4h?Gzn!Sfn+t+hBy zU!g&%Fka3?gP03Ze@&oJzcg)ZpwYOg1TbEWn*}N5nfHGlwetw|m-}E`aTjzbsy+Cf~ zM*Q%4_@^@^xwp0ROXCJ!>4zD?y@1(E{ zgoynG`YyjSwJM2Jsw^z@+?6%VAhBF+p#IT$Lsgll`N6E!%6Bh$^QWAaF|`kRp2M~^?^wk(AF2~OTk)bEeB5+h%w*iGU=jFg>+xBoOS8yGf!brKBih`n9_0q5*nwZQyLEL`h7RFM zy-3ay7YjmX`g(;iqasb2XTB}Ujo~h4y`YxT+2-0A@vu%MH?esUSlV5bAfjj5ury*; zFo~CKA=>bDHmswz)=L0RoyDHo+*&cfx8ItDnmW z*RmaB%weKM!vis{{%3Rq-c45g&$YCwnj(re&su$LQa{HXJ!e=>8~1O<;2ijD^1xGE zxW&IQNyZn?aLDWE+*0yV4;EpN-r~}xN3tA2>%j)+5NS882yn{&WsX^)-Rk@ka@>le zZLcGA?8+)FM_pKP0Wo&#*K|wYa)6E9lvuk%3d_DMvRTC#~B=<$I-aUE$2Hr*mUN znt_Y+O;Y1p=q=o3t$vAW^YatDPFu~siI$hv5U2iL(q%8Vtujq({+s_kRnW7+OpX%aaOo|_grrG9R2D_l)rP6C8g#MwO{9C?7KV$Y=TMvme6 zIv3Z*YR$(+mC2b8iwgkmy?0{8<*XMR%l)iP>``uCydq|LKG_3V(n2{kQ&flY!W5nF zPb((VVf9CMw1&)VV+Nj$S2S;S&s^^)raxwYBL!^=sl$`@oUBAWS7|<+&9#d+|#5`r~9o+E(O);e^I0&B`gKx4Xxe2f{U`k!EH%g2^9|PO^cRr^Vh_ z#0_IfCN}QXPsMAp#cy5>sI6q-f|*($L8|MSG`5{FXo|EJ3cRftg*eLTu`3-nZdShn z??d0;J%r51zsp{8zT$uXW-WD(8-_}Z;K2g;89;{?Y}|sib{lhn49$U~-QAhe#rQ1? zm44A7zg<|b(U(SbkCVuctW)TF0w{!~tIa=+S2KoCtK-!!Q@c>K+|=llj|M!FercGfmn55Z!!ZqDcLFc}{9~rRZ zk_88i&pKGEny+Ux=9U{&xn4qox>9DmGAX+P+H8{jout{DaLj(Ya zDLRS=v>0>hn3^Nb`|kWOhTCRS&toqga1C0E6UJHdDdrM<3EkW@@$J^@w9QhQGj8-+ zWcg%kkD%+h^yR{pn_n#wfj2vvS!fc)ZV6qy+L8ilnk~RjpQP)2D`Aik46>GGdtpdw z)((+T5${UyJL6mk;$V4!YxK&=g$l8c0b^6K*`O26W6L zfyx5km-U;dM$hErP!-@2zCQ8BT|=p2pg`3hoJ=O4dm%_yb%Vn6Km5|k z_|YS5P{UOgMsc}4*o8id=dAhuwl@zMM&?Ea3m)mXix_(^e?^QsLh>ECMD$2_FCnFn z@$p=8G#2O6S4nQ#rqQtHYxwq~>z+-hGA3hju+XhJrL{L!tX(yXIRM;Czs4`514di# z_Id2UdBsFwa~E!JO2+B$%pxX;M&%1t!rTY}h$(W?^| z^Pi;&iH3qlD6wC$DQUu!IL^T(Yrxq9x1@=7z}+*VTS*56QfqTzg{Wq&1^p&929zzq z7i)_}3FMXt<~t4Oi<$e!?Z=GeSXJ0j`d#~}gN3eqfGNtE(IyP#62g)E(qvSRx{55h zs&4HgH?!@>r2EihkC1$)W?H>d>}jaeMmCbbIQjAzHWo!kNA9aQ(9(v&Ea5%B8<8^? z`8aa+nQ@)(CG;DT2zf=7tlcfoK4P~$4py9$IaLsyW8v{j7E*KvgO4LUouUEb+lkM6;$izJPw<);;GdQL_F{T!cSaO3J)QZg|85@#)F zrPfv}_t_Ex@IvHm%1e?*t#V3$t`c+1FqRDQOH$M zLb4wl0nhHo_aK?~wOoxHR&Vg$1@|Cx`M+E1P9$#$acG-PyHYDUdaoy84bk{97!VGboSsnMu&^!5Vlr`rcaz~ucL$BbwrV;ri;WF93a?v2p7hx1 znOUvK#UP{79V7dZtIhPM7|5vQs*qz6_jES=;X7KbqD;4(0Zy0n{V)%FX9|8xm>UZ( zgeR4rT#sN^wHMx&hQpTq0i`V}ROE^1f0%#8umv5pmot?#f+ z4_JebKBA_pu|~ot+~8k4$y6zmp|P9 zE}-K~MlE3_B~obQG^kzLOwUiQJzUpwjbfXt#%pf9bWyz6F~e^JDcum;dx%bDtYg>M zZj)9%d{q}dwf*(-+aYmuwrwcsins;d@87x?T(u8_7r5K=efscqV`Sm|mTbKrHw&tT zA|74N*Xn=Sqd$;szi3E5g=}Tgr~18!n9blHy>3WwBzW^{I1_8`(7fwK<38@7ig#^G zb=3H~upk;&+Dh>qxh``@@#$ngGT6IRc!y3XO>8%<%pCodsbt&y>W6E?&0z``C5#^T zABWSoFqu2&25Q1%J?ES%6b&y1yI0T~&ph}N0{$PKd_;+oF+IeqX#cSt`UKYFtIP9{ zl=aep{k9ytrI}_zjf}DE2gWq(prQ>LFv;A<&R$)|`jGfR1wZl1y~ZX5_iwpvFObmtXJX+Exq zFEwXm9tiQ*l#NKQVfvEw~P+P9$X? z{pHjTWM{b%g4&dF>_9E>J%^7YHT_N9#ODam&^G~deT(PrJpE{z71{w2kh|kd#Ov+9 z*N`HKb0&|!AioR}uT>YsA7V2d5EyS|$#X!}O48=^T|)?c<3Xfg${ezx^l7Me*8|~Y z9b5FT07-_Dy#qZebfd!ATNJ*gd-cBme91t3sZMATfA|IHWNk?-z}j3N)D6cE z#fGYmWFF@yMGOS?Q0J&?R9xTyF{K`K?df>)>f4y+_inoe7s_vq_p`mk=k@%(s)s~Z z!yeVY(z4f!RmSRC@el?)oZz^}Cu-|^#>loR^+N1w-ob&e$10GzzYCCsR*@q}wmB+# zARPJ){aQJ?>!_+1zHi)+%vXY5H%gjB6TZ@roJ;L(Sz2y zT0%h@x;hfUH?E2G4Yj|6>;#BCGr(lG^jLvkEyAQpaSe%g*%j#!=GB82W)f>YpnW2o z0a-6xS2Pa(b&RIYeq0NuPLmAenUY3mD&cr-ho#x?xud08l9hcs?yFionY>eRQ2zaP zD3%NkcG%ys`gsR`t$T&n)>vwr;YAF4L7Qw*<;vWBk4nXC=s{YMlGnE?H613P+$`7` zXyloc;*wSd_rbSrReUwN8L2f%*&yY0;9=mCnK!^+%-9 zQG-*FL-)oEMyGQ-O(V61P}EqI^UfAho`y5n*0zTm|2Oluh0Lc*;3Y(%H>l^*m7WPN zwa#8GcT5)txs`BeosGMGUbbpnoov)B1O*`PAb~TIUu>2EAY}B2a4MY^czvQS+c%3? zD(!D6UDK`c7aTDis32C7bMNsSB_UkDAKlB0Q%~d5FRd+1`x|X(5-OBeURwJwma{7! zKv5lZuqb)HA<`n2wTYr_>Iaj1%sw-uDo zRgC<(at=cpYX}EP^jw8e#+jkpVI%c-+p4CR&qzr?|5=Er=U9z2N7d;6a{}_r3 zqP@j4J@gB{1dsSF4=QUQKD?R)I@aG~I+(`sutcsO6#*xtF=oB+bv*T|oa!m$cdPN; zTn*{IxJ+`Bx^LaWn9rXFcelU4uMoF~P8NB0MYGRLTtPW2|3euXQ>J}RlmxmC4+z;%>t=bXW(Di5w#+eCV*$jCE z=cym*iK=eW@-ehlw}b42uxMY``8tP-o7JoF>3DDaiK)B^V8va#zOT6RWg(Q_^np|N zr7N=aT5_42p??#=^S#0=5TsGvf2L!cWhd?J>szufS14OzfU99XtL#gBwIfxiG|b`g z18s$EOI@blLg1(;Bq3EbMJ@jeX$ec!ZdtT1D-QLb%OK{VbnF$v{K#3Q1vXFD6gpdu zsU)cwU7-`~M}>y;9ZXx$r8xek;wYta;N={TwYUYMCTuZ_{V*TTfEjvoAb{q`*Qyyn zo29cn_)*I^tL1c9Vrkwd65EhvY+~sUwK}1z$|D)*&h#xkM|E)b(+JzB>>#rP$eV)7 zYwiL2rSrZo^el!)tyiOcS51?{_5-=itHMmuDA+gTGaKEAS+{BKY4Sz)jk%;$(yoFf zovwL(iUeN_82Zad`(pr#F?}=)IzITv*%iq%oosqR)@V7r7){zsiF33qvwg&78)4c? zLVH^!XU7O#K45L%MZC_2p&-ofhS1ts0-F)&r-R-rw647_n#U;MZ>Ke)RH3G%}#C zY|tB}>T>A-5dgs+I}Hb@3ZUPM$(3JB)6b>FfST=A+ep)s@o~;!q2m;-yT-AL0w61N zhO7^uSsuX99B#efW}9%=ZV};x%}3_c^;w|`YGv9(w@&b6=nlwmE8u^<{HnYen@*93 z!()-B?)&?z&WC9!LZA!L@bCl4hr1=#{Hl1zr~J1(Gc|WjU!&z-Lj2bSd15W8oMEYp z7KrQns{EDha(W$AjfXdRPAGxWxf(!;GlwEGblRbIH;yy!_(Ms{_-35cL_O@)q~y#G z8-_X-mMBC5vu+=SaO-Ga&quPjaCm9{0y=R9>kqeLN`T;l^Hk^hqg1zJr`+VVZZ+dG zUN)%hclKIQc}nacXwv(|)r(DWBl=^jQ-{{O)N7_&s?Aq11%uKzz1JD0Pd0JLJJ$we zm8UsW_@yhumA3@v74o;gI}Qy`NvGTuv-~pdCsCboCH7I=cNPb~qs_P(n&K|NDD++} zDGeIR2g0H5mbRD2ziOx@Hh$!PjW3H}TcIRX(BrI+v34=R-)i0E(vNLtz;c``?3I_H zJ=!>77td2|A&_>YfC?6N?SABfDA}V&v2s!`W2>s-r3w_SxH2ZD9@^G?%3!hHtaOB& zmmK0nFl*{vIQKMcdCQtgd>H0p9f_XlWAqaIEZNQh;}$cL*n-BSTx=GV z>%)=P_$Y^8uiG@2ng$YMZVmy8M8pV&eXPn(g>CwzN|Jx`Prc2XMP}PH;98YFHw;a! zBe{yNTgL>-{R*a32b;!9A#Pw% zE(JgyAftN{`d_-jrE?tdK`m?RA$IqSig)VmdEuRZcz>0JHZ|j zsvIwKEb=Oyf%FQDb!Vch>(Gy;q7rLN9%E;kmLlkbBf*0H>0@hDccig_=4B>FYhz2c zb$44J`Q6>ba1C>y)gk^{JO_^hx!RKwscXqmIGWX2nrL=K#PtqKrR%=&mJ~_`_m%Ni0dY2i2Dd z08aXtC9Bs0oWy3Td2RBes=nM7-V7T+mv^t%|L@ov8s6 zLk`Dz|8b>`=FNw!pL%MkwNyPTZH@G!TQ2ouZphXOE9GT(87h7wE2xzCzCNBw2{J$89uaZ4YGw2(8QOuXP#11gC<;46olTDP5hp7`M*+Yn62>-79t|cTGZ_X*`QAm(7SVKE@spHO4}07}ZU5 z+zXxJ`S~>;*InkW@2+Ig9-WBMdMCWEJ$1-P$2~sf?rS7=ILm=Qw#{{|np+GLQDss` zeqyJsjbH181~wz~t@djkuVsvXjr*KfXVb&!us!YdRtz(CJ~$c-_t%RR6W|+_Tx{JR zUV5Bo)^pAHwOkn)l;sCere8OYe;?q>IM)pjLVrD{9X$d-)U6qjWj+RJ3qRd?Ov-8R zwSs|QV^nt3@?%5A8=-O*LWE}2IJ%CjLL&*6ed@Y(pZe}cLiUsbQab1ZZ_Yr&z>rRD z1X-~sE#C^=3qy!$_dy3p@ghx_8ahZP*<}E~WxA;U?v6T_Fnh|V^upn@Ue=v2>GJN! z_LD`lN>Vbk_c3RE12_+3m^;G+(!!-Xvqz5NOMI;joBKM{)^_BSFw_eg!zY7xN+Q|hh(T{#)Mqj?8bU&Q@P z3oQ2{C1I*^y!8+dxa)US`(poEha6>^0!lirGl=<`5E<6`W3f6+4Mhp)XUeW68$g|h z$Bb<(Iqx{tObG_fiNY;(zHoX@PIsRGis+f=h?m#lV(ynw%u-1y#X6fYn6j#8N0j`{ zKHxo<6s&&Fj}}8X21T!a!ki@S*1J~1slM!**|HJpuzCKkS98ENK9K!*6ZiCZ2@~;e ztzC7l25MOTdile3fZAAgZ(CIu>n@2l{k_e|WxD-{B;M2WK3^*>38pa`LPo*{;;brV zHYN`GVc`w~yCI;v1t#4w`L>}BG7KcRBcb=djcOzYjRvo3s4p4*m!xiODmO$d-R*^7{VlS!lz7O39hHfF9FQrMMZQeT%=X z=bMR1Y{jBOBGn%DFdz5IH~XhtU{K$lh&!&Vj z=#n{3F<7Sm^g@D*zAqugTN7sMZZ#ej`Y_Fj-fs>{9`mT>^<8^g%HU2~(=y=Qg4@(+w z1LyvI16#ALhCN-6^Zl9r(~U6)Cx#6n%1NuH_oE%q9A@plEd{)et^K9QLfU~B+}+W) z-vF-{=`X&^+2{@Y${tI(8h2Z}+Q_03Fa3Yy_Piwgpev8&JaNJl39(v_M{yb|=aCY9L zR(hdDK5@}Wzl=x+&xxx_V7hsqmyV`q*S9hv z;iA0;NHEn}=8VPmR23sX1bCaPs(=N5gJVOLMucb)J&GBGa!R>hT~%juMt=q1&{r*W zQ~|Ye%|6*ZQ?*OrIqEV#UTmziD_rl(z4&Oi#9rE=Pce-OcWH_De3Mq|UkS4e2%3*s zJmJ@eKzuim(~-gLEPrCYhKRf^08Z*#n}Jp?)-fAg-?QOrq~-`ZH3Dl7YNH{2nmZ|{_E13uR$(69L&;rK1A@@5RU6{)?|Cd-GP(ac4m3(dN zup&1eEGUbP^Y1PZOl3|yEu>^W!@GF@pU542NEMl&L4Y$^1jq3&I)kNI+0T_pTL9`T z*P>c~0=ltGF15Krd^97KT;|jpb4wSTR-Iu-+-7Jvzc3Ouzoeg8bcS1F-NMV79yLjT zHpd3hRCh}(sx+D2UIqYy5f0uQbM$1BW8RpI4v{pL{?z+Qs>rA;s*RUchNnn(C`h+y zSp?Y~sY}}7E;;9gS1VG=G>4_-oI|!~0D6UMS4D4H^-5Zpfm|^;|NepIFZ7cYK2Hl+ z$A_HHBlvRs$~L8U$7g~>l0lG4X3W$a2}T?8e$uP;_pa;Lv_Y`m3q+?gM zwLxvcKN@?O>e|mpL%FyYVw>EMjq-bb82HZNW{l3ea(!vF+5MxLF#OpV8g40XFp1hi zZ)0pVt!{sZfUI3?LGyk~&5cuP$&JZH7vJ^kYN5qHS(0;Uln~-fpX^GE_{5LCTeFWZ zC;D(^vOsMSn$hr#r9HqZ0YBJjnH+|N0Jy=4ol@6`GuO;*lslQ@Zal5ixZsSKN#GqQ z@prZ-`GfE;mCeqHYWoq9LiK2C254g-s4Aji=NL&foPVy?|7JCsfU!@l-i}4B(l@!* zX|k|1;UQq#Ou#m2Q{z^YXeE3I=A``VIp8b#6=qCePzZ00! z=lcTshs@;XI9?CBZ-xY+rV}hD)G7>YR>4SIk9t3!hxK{Qk)`j_Wh!F$A72jK&5 z_Sg5el!d11KT<6--9GM6gli`ag`r+66Mu(D@SRZGv4*sf*v8GeoaKRZ-Q!${#fc+= zFDYb<#`$^XzAnnOiWJSVy5Et!klT{YXjJGQz)3?QnmEdhth80_Q^nJt=W|BlRBr6> zc|1FzR;%>h{FWj~y;&(sR)|OejriM!vg9*wbr$B4V2Dg)mt3#;=a4SJ!~N|@8OI)R z1;T^g0e;mNuB2=q6u<29jYR*u8wtD!PV^;!uTM*NRsvV`QrH%FWtT|KtTqo#{AFdPPNG&9j%*X;2sBl;v}ps z%x?@h9eV0}Kazcv{WM1lhB|}b^l=haF;rQxz*h!^#;+`Rc|*nm<^7ocs=CAmorC~U z4}>iq_?r8@`lrXo`1`xxY1yy*1Q62yGfQ&N8Y*z0faxKj-84;s?|D`sy}fB07X!#T z<`Lw>4LhEPH}D`qAk%~>dNUfpuij~WGfpn`G62(G>MGSR{r~xsH>wp zqEPPttPUCEA%>4@xV(J*&Ms^1eyxHHet^*f^XY>2X6kgNb1f*q_P=Jmq#4jcU{{iM zwB>96V12G1B#V}wsl3;4i5}e4jgj$u&0qRv>NCqrfW%~R`#(aNRVbY-r~^Sa9i8DS z6Ggu*<&`$O#;8nzZ8%hjsqF22sv)LC_Mz!hSvYHdl)>LmfF63#t^^fY_(!g@(PHNa zAiMEV#1v~Coh`}4(evO;8vIO6!3I$-OZwj-DEW)1Z1x7jw*}J#aQ2}v;94lTfyw+q zt@!Ydu-eGy)V9QcrtLsa1m1lQ)rI`nNwe1~CTxge>tmPzQl&kwuPT!DfF>0gLn_A{chFMOux+hGsQSQ_zY&hk!UGV#Q6{4SH&rfkm*jVF~xq#`bciyET3k*7!wwtr#M zKV8U;o2aq1io#F)qc`sGPPY20FOMu*!&M4!pWd25tSba=50!Sc%@!Mn@LS)v*1=p_ zBeabSyv;oGLZ1q1C*`fU|1jji*Zl@lnwAX8LyXvh7=1ddSrT=`!6RZisji8u99D8# z7=i5%OVw~iFO|_O*8)bxZ@)0uxhG$Ze~tyIC^%D%Fh(Hw1vPa)@NwhxD{`3BCK19L z1z7x}@NIBnvgctNQqub?L6&$vPp?Q88X@%hxN)5$Ho8@4v^Uz z5|}CfVfVQ#zIJ+yh_9D1E97NT<%+9juk9?cR;sxK2h&*IydV?Dp~TEMBIH$pf5-`y zD2#CP`xTg-8A@VT&d1&h65*8!6MOXi*$KdsOhq43rmbbSLG$+&8^@tz`yG&2AhMp*c5t zT(_YDGf-OV)dwA0Msb+N6jsE%DnOtS*N5*{qoo-_?k2!v^Ci6~@;i{T@NN>OhoZ9D z37ofU#cv39>8wBYo)rxWQ}_|F6M;`vo@~(s+5feJm|w#wB&yh619aB!O_oO5s###O zaoUy5rArEnJW6V3+$NnQggMlGzfU_$^s*Y4{2%}j#bGKfQggmPg6lD~{(i5bo)BM4 zg}E*~3x4o=D$^Okk(b8?=lncp50Q6g7cHlc9&Ve^NTeZ`?b9%NC&M*CZTTMKU>R4# zz7G6Mgza+lsUp4oG9TAGg-$}lUnZ>$?iKX@-s0Z*)%Lz#Uh{pOG0Sf1Ap-BY5KCcu z)HA)K=OwEtK`*t@V0FiJfc8T%MyAlk#mJ4zx>`BIVDGWb%=D^1iTnsv{awD+SHaDa zafU6{P&e&oH~%${b&k}(uQ4X1_2+8**(Nw+fSOtUMp~;Sm++Guy2xM<`6+~Due3MV zF-G}ulOHhe!#zy_w1yG2jephI^FUFmD^^M#obxx{3mKGHJA#>f>j=AGbaQ$Z)DJNQ zY2cS3*|wBW&j0kU56uc3z3~`GzH~+)kc~ojG@Z}2FlYTp>Im+FCEc(bely} zWinIEBk!08UyTN0PJw@!)NBo{(o}4@c?W)<;f+iTZ)P|(Tq=s~)Tf1ZR+h#HR=@Z^ zNvWIO=*pR{^CF`iFhf>BIxXZZ4-wxL@ER8|3St-Zti52algOr`e@q?(-C;i{&{@Do zqG&%sr=?ME)3REnm)zh{~XEnO}wAegN>ms z4?@j^hReqVKo6_ai?GDs>3<{zykq|i1u&&n6KuW!`-EJUGOYOzay7&t4FB&Ss^raV zL3v)taBdHj3v33g&=!&h3~F6-%W2I&h%KXk+~J!o+WTE{cwrha*e5`k<3}I8pC}?* zwaw{N?cW;pmB8@u&JM>lP3kklox%igy)L+~x5=t3-H)QPjV^A5hPRv}!x**E0CW;0 z!2NLYyD5R6IfV6w%DED3MU~Mggo|AV3&KK&ev&7nosd^jDV+TNpW*i}MNwf_N|1)s zk!H`P!)mF8_iGtpl4DvSCDBa;hQ#7MO!mfYOXV!aSuku;Bv3mUAb|`6KawZNqnOBV z)MsebOe$KFRPn7CEOLHl!g(NflEk`K zIui&yI&N<}PG1Wo*`@QxfZ-ZrZQC=puh|ua|Jt!XAJJ8X&j`&+K=jQ8&{1cnU78E| z-!C_&X{)wt2W)Y-SnxLcvt;TxP?lY5R(>pC9mplHAw_VrYO@(fn|m_rA%?kdPAOYs zC25h(6xVk>4+gbOMDI_lyQ>l%FaEiB|7<0&5KpB@Z3|bgsyxzc3N;Qo%dCX^U_W)? zD$tXQs3K11Q@x8_S7`Z$aSK_}HS2C)M_d{pQGqGyrA@ z!_k?XO6zYZGBdchdN+3){NVTD0}s3NaBzAj-Y*Zas240dQRQ}&&^r8XLDi?E&c_|y zr-$*XvsI5_8&s5&5tm|11dt#`#9pr?i>@pJXzm(l5XG`3Kj= zgYoH*#)u4@u$Z$Cd;u12ing0IaFLXLSLLv`9ZP&M&H$ZG`#Dz!gb$u(+;tEdfu;w2 zZTbm%?mqWr{&=tYpl3CZnmOAf*vYK=!9=0n zQW)5#(ds6EA%^SN-u=McLPCl(c#os5%=xis>ID;yb)B~zM+Kh+w6YdL%2Xzqs`u@r z2shuk==*A#fuRdtmRi7IfIoj8^^%Bx(32e&%1OJ+wLAjo9h~(OkvbdZ)m0oqdLol!rcIE1+qNq4mM)mNqY^Y&9cz9ZIQx-R|WW4-IQ+1Os3-_0~;XLv>92jZl< zcSke=(ijG^H3C}dnne_%QLl!{E9(@h=_#OfVm+J*Rf9=7-BOZAaa@OPi(^GW@6Q4wVYVsy;Ba0eX ztXQGzXkvp*4Kq~_W~ry+W5qkw^atlZct^)1O)c?jq*biUOwHZt3Op0;uxP`oQHiAF zne#vGbD$w;hSDE1N0`1vUAdm|XaU9CH|0?;sG*L<4ReW6zLt8Ca=~+uG)4)KVxN?o z_(A~)EUYaN{bz zC6T97#)pxJ$e}cr^n*|qiApzf)u_EWWb^!=%(jYuB`^7z> zpZ0Nv7@TgUiI>8cq+eOuj2=##GzXQ;XIPj1JmiVkucgW(;~wRcU*-wg{H&Ygi&2ed z2zj+c%xupmto zOIPRcy6%TtD7TGO;h9S@x|&(zaC29Nsux+5!?izDV)EP{Y zrRy~u@GBOaHM_kL5D4n?r^o}c)fA;0WDW)kLinPrU*+d_HrZXE1H_YHAoBsE>$Ls( zTo4y$EmibyG{=)5o4otRSh2gE-0e}>E2LeNwZIT(uByGuZ8k7^p>c0$eib0dERASJQKH^595 zDVy4}Kr=TCxT>j=*HVEdVvHfspF2q`;9RUkRVA6vHbW-d=2LDn{czBRuUc9$O?as! zy{)?p$BGG#VVwc9O7<9T>IwG>2kbkw2Mq=Ebuh;tP|GHqHEr(JScdTD^i!%syx}1u zlVMWN<4oxzq!W~7O0?@DhQi~#G_etROD*O{-{CLjH@L(u#n`r+{_pDTD4={T_W5dL zT(25iMl1w9sT$c!suQ9n)@olUsik?!sCD3J9Z3h!({~-EbC0Va{=e&FwhDOtTrc+( zE?K_%7b3Y-52-Q4QFXh48c_P@#@~B_=)mfA6XjaGl33JF(EfV`y}Kd%+EndWqU-IP zIZNEAGj~XBBxnxwI(6bhg*vU`N8f>U10+q{|Naxt9^%UwdT27(pDP}cJ^JBUHsB&N z?b&O~X))=&x-tf~h!N3a&&FQBf9=&j+n%N48mykEj1vCX;9OfS?brcoA^}f?@27xx zR=nl;ZzfHhcp6WWfNpevt0{{p;SbbiOCX4rf!$wap@AClI-I7UbuHKgyleI^nW%UFwxAz^;4>MWd%%VM>~}9u9Vj2JWVhc zGx@jaBq$CQsx+pl@3-tz`|0QKL{I_o0O%!)|EC)-5ptCam>{Liqf^SWoGTK!CR+8M zm2=6N@|Ys5!~!r=Yx4|JGT-sfOiDP39Ni}=&G|L~SYH1%c_oY!!-~U|PGm-fGr`l& z-osT6;X>_qYWXqPb6F580E5>W9xV7DJqNJ%*3j_r41JHfD4~Y7{~iqBWx!DfieL!m z*C@)OeSrGvb?cSlAfp(uTmA46DI3Jnx?U>Mf<3R9qbI?efam9{(NEqh!#k+ ze32LLIiFZ}qI3}j5ZIhcLUM%pt^tOz|JyEXpz>iGcP*bhl%FAgjV0OlczF7>_79&B z05A`L)Ba;7=%Eb05BRk1LeB2b4nB93S!3y!TNpC-u^2z~Bubly~nPh6ugD1{qq zfz$nk$eV*>xS`6(``>HHf}mH&sTUO9<&ZKD_sQw#CK0$E9f=J&eXw^N?FuDn<3yfy z$^?z={*@Xv?ZCdwLf6ZO*l*|Z6a#U$MFi?|IaFbFy{QDcNji29&1>a|v5f=_%?nnD?iDl3;i799aSU&p}9439$Sc+ABjbbEVz$8=igo;SI)H#8>tcN38BD zMo#c7E#Jw0970gtmRN{pY~9)w=!hbW?ANb=L}GDP)x5J|1`=+7nHEPBn@8%^=_xvX0SZLn`m?7mQS9cjo>r*55V(1HV1%zIZ{I?Q~mxFD7PVO23lTvNX zHw~R$e}fTPE}<;9dLP+OL-mCD&)kHOGzY^8XqBkY7bm1PCN**N%q9!r(X(~*T&bnd z5x`6%&z$XO)m5I?$E5C`HIMLGam$4cn#3kZHjb9>k0_O%-22wNcW=wIDP>5UIy^A* z8*YF3_2*1WyGN0#8o`m{C`*+9eKr2S7V{j9?FlEFugRq7r?%8l5+mWK9Qy>bMvLZt zS54t}7lVixgM4sD-??;%7rMe!u19V0ol48poa~PQ2xE4E#@L@ruGuj07Md8lNOg3X z+VmevrIKo9v)D}R8J!qtl&0{Cg>6LM_;Bjqni_EVlxf>Ov{?{*i(4dP6^difKl$S? z{m0J0!`TJ<)dP$MTN1Vd?BFrcouGT zOhg6DSl%x3GgOcw@Rp9O4DC6yLT%|G(Olev@1Of5B}#k9buBYhb6)Kbi7Q4Tq#zj% z7rcu%j#|%>2oR`{U#CBB5@_wg1N&gmLbp96XtrF;Nj$pjiT}$|Ya&q5(-B}8B7gY) z>m?7)TbRZODe0#`8X3*7tuB0DCsC}hpZ8CpgQCWdbAAJ}wuE>0nBWX2?;2mY=;v0_ z>OX0Sq^7wqc^7SG%)2kaKy#@;sc3XmaAF^+aR73!ZNeEhC5|0iv~E4Kua1?(4unp< z8%vXxclcYr_^KcKl`a0Agk5eeL?bi(^%Lwe@ltYg^RpBGJp${sJm3iZdl~I4t}W#| z;Ms*@E*8j8J4X{5vgV*o7*d3dVfDeRV-nfRkmQuDJ4EJj!b3W{_W(rUmkH@7yp)H zs_FI5?NHMlgyxfHD?t#RNwR5U#4D2t)_q!wWbQ&g=E)3yVm1SdS^#-X$#s73+%24p z1n%F>-XvTrCI6I@H=|0bo7Ar&gA+AOtWj{$^#((?48~ZYmG!+GGYMJe_aG+1;03%< zf|is%tVLmNDX9V-HAxgD#B8|~8zBWNKAEHGfF2c+qI3z?t~FOSW-Q7 z_+trWOBMwH#U8~Rdsbf%36s4@pQAyi$*g{s!9LBPNbMR7Ksmki93LL>@E**Re9=EL zl7wix*T`Ur$#X355^6i=z-%h%`-==>{Krj!ptI>6C}>m$e(1q_WGH~;K*F%rSK$_4 z@n}q4?f((;F4hJS7KX+>b!g>-W&pZ@&eLr?*!urOYz?QtA%MeX`MF$1GLiI?=+I&s z^Bx0c@0a%u6@=Km&|GP?+MY8bD``7J=}Lk%S?xV}E1Ay9rnmhZ%DdIiNHDP}N5h>u zpXsVQj|49dXllvjbQjR+nfE_(wi$zMkn^N%?C5GFyaGK^>vBWvnV=+8Q)m;Gi-o^o z^r=X1cPzCQ1En}**y&yrP6E@F4mfnIe`Z3B+hoH8-7|UJ+!sOCj`Z(Qs{mMMDZ&aj zLj`f*FQ~csaNa&axUQamIcC065p@!J>r`KMX!6Fo$W`sxD_fhY>ewMY@-MLdq2h#U z?;T$PL{AO6L&*e2Wiok|m~`Hl=gSv5uJzDg2@cT@l^NW9;s^7Hy;8SjnVZb< zMGP~8{~vpA9TsKR^$nkcAl(W|h)PKd5()w;B`w_&O2g0{gGvYpN`nYUH%P}2qX;NN zh%^i(-Q5H8om}cA-uLtV{l3R{Jb!X9=h|zp+UvLW+Iw4bPbfNi==;?a>b2MsF#F^? zEV1=gtyV!T@gf!W3|TCe$wA||S-RBV`I$QqyyhSq9)}?G?fG}jhk}@Xam2YvK+TcE zD6k4d?VsLR*V@HAyNn$#6WnQ;Xp;jeO8n3iC@5RAL~1#5ZMG@R_qoJXxs-i!2sG2C z>np<`*rD(fd?XVS*mHXh4`f#JgKIk;3DwuW1gXYoKz^hzCBn(tKvzuCA?$Q2a%zXClEUZ*yxH3nVwH?2O_YjKen5Uiv` zJ;f8XpDs>>7y;k=? zn$9BM3L2s%o683!y&=CCn*L+=8A`1Te4jO2BG4R+Ii3=NNzo2^_D2uqiid+Bt*ZT( zcPNYpqWbqj5AlZsj%FvuV5HcC#0~99#0=ilO=ndwd% zn_-Qz>N3qQ1f9$;GY@$7Ux3Qfe5rVkf+x~nU|Ik{!Ddh2B43qbma`kzOoBIT!nHOTEV`Z?7g*xDNOp*4hiW9d78y0^ej?)x2L&4%v(8x7^ z>n`bYIXhEw>Zo?ERh-*viT=b`-bj7zSZ-8Yi0=ZOpB8vo)X!z*G;Qy|*@q26opQl* z=^ofGHGAAUbmX}v+YP;%7fUNf`9NU80+xS%f>sc3e-60!if$ivvH1PUQyphnxnuA~ zPEHs7HWqM;)lJ9pq;faJQpc5dCrJcvJy`PC$cEbV=}J}0Um4};u;1{Y_7hqyz|t#< zulz35{cN{}9+?))ishHfqUa;~d+|;DK1!b*_-QY(t_LNga>}2m2l}A;F&TT~`yV*2 z@(zdbdSpfpmL-$@qx`>J?G!RBllrTSJ@7N{oOvfg-x}`7E09$pg33&XPW{IZQNA~( z;nR+lNxS6r{p@?q_vm;H@YcZ>xXwsP{h&hLe6c{kv#dv~RvCN(`!7`uNgs^f^K;Q! z=tU>;vuA#cOV@r$%PfC zA1s*vu{p3{L5uf+^HzFJ@PV2bG;9+d03e6KQ;#AvK|?oeG+kASTCh;X73cbL zIfaIoC?E07o&$l3&C(h813*QsXAu2H)ef%&)-4Q=RbmPRR3{=8lMA8f|q^zYI#w#E;k%FAmN2S z*fpA?kva6>?WVE1O$n3_Te0Xq1Lmc@wUeSERhjbVvCvFsMZuQ{49JDJyHt~}AHB%5IU7a9M9BC+FbczF)-hHxD3Ttn0x z=Tk10Kigu@6|7E6b+e7u>3bZLmuiLQLt=xb}A)*IIY1!Az7Y13RK0fup6EM<4fD-VrKye z7|Rm${N#tEW!X#<8q%;XVG(KKo;CVgg!bI>hpe(?nNR%ITn=xgT+k*wJ70Z$-xc{M zdj43bett=8Wz$Xc{NTXc=3>(7m;Z_@2QymDI6D!DoaHJv zOgY)zOMw~to*a$)n&9?RZjdD{&c9CW){Nk=-4=Rm%2>^;<8^|NJ!{H$($U&5*m0{k zjCP|7hHfLMi`9SJ7}d~q2Q~X2LY;2jT;iLm!5kh};rn8!iJ$iuUW+RpTF|KaMz)^n zys3JGpuIxP30`{eCwlNi8|pFijX!?2gsig*)Ng=hgQvy|)y)`_|4Sox416`%W*8dL zuFnlm-jsUJ+_o$3n5hw&k+|fznkmX)7nc&E-pQ&UKEKVy!_9$@s{I4xPTeAEX5d(_ zEd}QFEF}}|R`ry-3l)4=lEa45>hH}f{*vorXm&zhxgs{tv{kPzbGA1)oM z8*}X1#FC&85UZ2eHpsd5lzh4OD__Ucg}e|MEL7X8^RWKwqUI=(|D;YiV~*Y%7&qKK zrG7k6L%e?;3zhS3S|D@gZHq;b<-6I~a;;T6)sjXQ;VzG~h`tX|U@E1uLc)yC zRfO2Ho++5KxxloS$zK+)>01$PUJfJF{q)u8-CBRmT^Q@f=gHyN)usa%ec?uwX@$A7 zRd4969UIluzkAHqmgxn6e%|0(-O-sNR=?UWFs{(1^m%6JKI;+IyPgT=clR7SHlF1M2sX7;q6IId$yw{P-WfoJNGIH#mSZ!}f%NZ?MW?O=glOCsVF@7C z$s!n+KE~Ks1SH7n6MuM=*R4OWT!l?_HVq4pHe|uvemr!v*NE{k*^?jr5mv7dCJ0I(eh348!mgIZtLXbG|3eZKfq{@>~DNk<-Z3R#H1mq}EZ(Tr`Rb z*&f(^npGoso4_@s_SKSZLO8pgNM=r2Z{UUXh7Iqqi7#elY1S*Ic~TNHN^0tH9W2&F z`s%ZG8fvyBl?v!{N^@eoRiyU=XYaGk%BT;C+?M$GL&3hlGD zk-*tl8I2KMY=p&ut*9f7v(~t7iO_FFsWZ=b`<+zpey3B(TK@EasWMQrT)m1ms#;b4 zuHG|RYeg)SeSI;;^SVvF!(}IpVlsN>_qIfCa>;aR?l)PD%7tF*+Nxfz{97+9$gVG4 z-B+&qMzmt@?;Yg%#ZiE_G|$rhm|8^7INYzO{?sh`Q0|6i!phM7JryFT^?h9hn9G}c z5_)qH<0&}tO66%VD^&|y(nq@qJ9=1zXX9?vj9VJkzBoql1bhloK?8g!Y=%=LtlNoZ z+jyucQuO zsM#<}ypR*0%H)bziiyR%`@LozhHB;)EFQGTM=oM{T@tXX!IOluB5Lw#8f!zY zGZKW*nAHJ2tMAx(9_GG{KgSmMA6AjOX+2%cigop5e@K;#dFkPFr%TCgx)!Zc zXcwv0Qx(osX)#r*#JETW=6!Gb@jsAHzeQ=$_X6f-`5Bq_jG)u8Z?U6SaR!&Q9D~T~ z{7Ap4gsp#I25;*96TbK~d^6Fl8^FsHUvX{(CZ6Lw78XjakDDfrvroW0-^R@}Gr{&9 zctd{fyLM7+?Wgy#G8Ny`ON(VO<&G1=5%gC{|5J%=#lm8EsBxy64Hd}A+_!=L<(hYv z*&>d%C;T;qOE0-BpUN_tsN=Y3$8yAgJL1@drHhGR{xed3gxkv5sN#|%`2mA|Z#JCaSUCwvNups?^LCYvCG%^}>+U0GB@wo2? z(i%TbcMSb7^Ko{n zel<}yb>?~l9#BYmu*r{5#;cbksG9IITZRkwbA>SxmMOD9uZ%v^bNf>nIbEEzeOJgK zv0ilK6FRj7)gaW+oo;#NLaQcUFWnLmVH`VJfTaCCV&AscNK-Qcf7kD1M&Pv1z_5dBWUw{fUF#Dl7xwd6 ziYvrvS+c1vx+BAn9bK8h+aUU$j&Y^xPFNg}z0^0jOXiTN?lz_0bB~U_(Iai-uQg)} z$6cMe?&Bq+%Ewej%xu^X*foyqaTn3r%ZfUa0%~vFtf;9cer!7IKHnJM%`J~dJ@MRl zoVK;STgP>F0yXbx%Wq-3H;=vtj}t|frt_{nr^P8JEO1tLT(*u<9Z&85Jj8-*qXsof9n& zseytmA7R*B?KrI_Wq_8!r8qA49{uQ2GTTm(Z;N?la9Q1U%cG=r0=YP$OfJcAb|Y{* z{Le<1eBc9L9Y3wR7dEy1oG9wEn4+c{7}UoJ{TIEStz*%ds%kWUufJEWDoC!OOWDg@ za^uF))3RQJ#CD3^(eUW1zVeJI9JZaA{((iSD)_NhJdEE`+y%q3^qD6-vIVX7hQcjj zh=~_z;-wzm^k~2LzMnbnKO5_(`-dvNr-u;$%qFtr>SW4vp-kxQw@7(6;a3nrc5~u_4F^N106Swk_n8a$6?G_RFv=ycIZXemEHfUS{}548fbX zgtxoKi+-fU3H8(p$HlEOJsi>vC(W@a{VprtxDqvA$=ganq*l(mHgPf=!xp2b1vPY4 z9p0HTLklXq$Y_+X9avJj$YrX?uq*s{t6m;W-CKSYDZ2|7Bd6CWhli2$yW%P)Nm-b; z3zv#m$Vo-HR$Zot+drU7A>#7Aa@K4T*c*TL0tc-KFN@XG^(jeotdohNPh@6OQ>2~~kyPN~bTsQjP541g z_XV%x3@($yB%P9BF7n4U$$__4BKuY*Zg#j}@6yGK8SmN5W7`#CBI4E*`e!jL&w*QK z(V0R_N=e3e@y7W0g84rDl)Qt*(pc}6-Zq8NyVX-BkXbtQ5)%zB1!KbJ+*;SZ-#2_g z@?zyV`+A=o2NY+3@MfQNtMof5-i$|y&4MeQ;OV+T|N2j46L?s6MgHl-I89@|ZgR{t z7LiZDIxa$Z^8ua~foo(n^VMv6(!33HIh;3)uD!A19<917mw?SH2<0E~l2XE%3F~mz;!_1;9Hr4jf3@t)dL`w{9-la}|op%d$ zd{GXHi7wxFg+C^C-@ozsd915^+!%Nq@XUIsEaihu0d zs9&~z|2#Z5olmE#(t6_gaDhk93SU)s15lL^x>7+;V9knP%YLJpUlnf}Crmo)8&o4R zSz3~azhJ^aK!k$}Nv8j&Y2mc8=6rCO_i#oPb8Ol&-h2(AUMN2{%%Ynae4G}+&$g$a za#70Um8M%we^EYxO2*v@TAoW(LGV_y+;49c1=+rT{!+B+&P(doUF|bG$Yk9tRAm5( zk~Wv89@{)S6UPiR-$8387P|G7CN^Z2hk0~#>xOD(dRyR0WtjDJ^+TngDPy?Y)Z^7*ii-$xYYdk=v4&OV%+ix z-nIR<-MA`>sw+WkU{$u>RHXajJO2nE_Ry4;Wz@eDqPH#e4sQAoKtF zP3X*ksm#UGhQ|Ik$ix+Anf~PeC?j{?5I3OdI^JRM>XG_R-COp*1kW_K{jUuFT{r&kn9Y_PiCuBBgN*a?g}Tb&pnUC`qP3{Rt|)+-ra6Nz{$=w zLS1S%PIm-=2j;Sp_toowv4Fq2!6tClxv~Gy0H0go@pHR&wo&V*JEV^AOeY(-dqg;4 zfOj^g50JXG%c%d8t^Z}^f29KUy#7CCD-?cxyi3H5+cHp( zUug@`VIjf?2HKru~vijhDxJds?d zzbxg1dC_U#UTA+ZH(^PDzZrDe;|l>F=u>{oy{lU3CO%KpiXxbUktAomxe7Z?izxxf z`Mv386XlHMRiAHn!fP&ep3vP@zIOlQlowV2i)i&LvKvoz44u6jM~|HHM*KPj|38296!;q4uHnEg@8u;J}_&Qk__Ns@E^V&Ij9 z{|Kh{VMHNmtsU6X75Jf zCM|&9*L8hVyLeVZ@3>tt5=UVmj~?GJrpZsB0b63Yw+!N4u+GeN4x|B2R1G(238Ycb z_0j2X8q{G|XE2kG|4;ws+?@>C9XaXsU3~9E@5J$L=Z<^PgXic}u$5dHz`lfvifZP@ zW5Z}2&OOGuI{>Ov2UI8fS#^5U44PNp{C0ynYV@{Tb%M=q3 zJOuE89cz7v%+D?SsWU-c`~Tt30d*$X`RtK^lUf$EZbh&H{Q)L@eLZxnZgd9HGk~G(uc7Kp1Jg7}`zL%w zS6m!cp_!xJdf%fXrB!BD1uL$wk3Q19dlc84_lK_mHCav8uK_<&t;O@ysn6<$7km`oTUtrzEN`1*-p(PN8q z9|R$ZLzU=TVQa+XBz=RFmvCDMiGcj;;OhnuchLq8yQ0(zXhkcOV%YwPZ5i=1mW$M; zhI@}MX$kS&EVDf@Z)v!En=TKjOh?7@@1T9oX`)nz-#+PW7Y=fVIMNCTzQvh%P}K31 zTvI3&XD}XG$%Se6?8ovx2yXg;^V9xjrw*L8;vM$rAcOlwbqyoW8K$oF#g5Cdk57x> zOxzfNe#}xd>!Q;tZqjWw(VOHQA?gBo#QHhtE7HC#!b-6jI!HCy0=%s@rCxBnR#I>N zMgQJOJ@$k`Tao-+m^&5GAQ8-o>U!sHDw)&ho zT798gtUhXT)es&xGu@P{pF^22Fc+S#D zyQGxHMT5vpo%!iEmNIzs*A-#AC*~?<$Xt|JKD7?*K&Y)oQ+IJw*{9LPd>;JDFyJ34 zuNl&l_N?`{kY>)nq?6bPdZeW2VlTGT#fuc&>e*O}n#n>rHI>)56sJSnQJr(|m;l3` z1vC|c^g3`30a~7y*1mCBx#)*p+RB_Jt<{9>n4_+cM(q5`Cb_83BwbsgicTF>0k9iA zpA%=H5h-C+EBwHcu%U(1U0a~2>@Gjh*q?xpf0^f(AJofdE>a{3w`caJg);AKg)gk@ z88EB%*K^B%ZmH)y|K64<*ec1YDl%&oO;=wCZ4=i61CIztLP_M(e7Wh$-iA&#F(Rh! zj`;@v?3xP9%^T;ZNsqzB!uidcRhElu@~qt$dmNs~@8ytGYsfK}dKM@OcbW9}5A$As zYc@_VoU@p99d=nW&9*^m#I?na)hnNE>pV!cc_h>V(jxN9*;e~xH8O{dKg!WqPb~5m z$2Qn%QQFPKW)|z&ag>~ta#Xp_Odnd!XUT=ti*0B=`5_>tt7SNU&S4lJ@+SGslV-+- zs4HXo)@dksE&KwQd%{ zP*Tv-P^SWwU)ds4{wP4=<2QobA{gILf8jLMRlW*ceqxt?%z`d_VCQ11OXes3gvPX! zZdI%4@YlpUEz1gJn~$B1HG{nHY^xduR++1*Opbhc-{^2D(z^&BL78(M^eoWJ@GRo8 zwL_0KM{xp4Il^^T*xZKnVdlyWwafL=-LfG(c0^wHeumgRrPjp?;TJ^=6+(2qN|MEP zi8updZlP}vV(d!{;k})R{?`lzNxngf#0ed4?3IB4noU?sFRgWh1Tx5Q#J}Cwd1Q_; za|eD#ojNaXsktGN`Me)H+S!cbwt7Q3lf}2>+!u6&1yz^0wH6 z(z2%Z8IRYZyV-b%h>D1oUVfA_K1)TUSpoYce z!f`{(JzK!CrVXsxVvzRNL}k{x(l{)S`g={{=0q!l_vs+otPBg1QK6kp*_f;bLjP!k zUS)b}bTnh8k|e$K=ob-jmlTHjp+a4Mjlz|R#N9V`+v%4Ru`H|>n zXGHyHVOV+ofUy52Cos^o?cKDtsAcP75&o@jm}g5Ioww?+*BCgJ!9cT54F;_Y-`(Pn zil07gWTTd}+r|Cq^`d@W2h%3yYv(dxIeqPdMQycWg`MQI`Pi0^cDbl_&z5Q5XCVUR zSV+8$GgjS~)5Y{=0sp%pilWv3POb>f2~koP2!Tnt(+2`WTls zSoXOejPPLD`&cTp82?^F5B5LUO$7`+0g5tQGy79E5+S!YM(Ii&Y|6E5vQw+qwJH_! zsgQ)DRFLYYbmf#+e@@xlDI3slHU2W0lT1p1N_a4*&Hdv;!A+i4l2!2ffxWMeYQn=G z7+{0@F8sjjk)cps{tOyRfvG?MRZoPN^6v>FiJ65~c%~+LeKTBh)e-0t>8Nk=Gv5OA zLvGTdHhwc#BM)$AMKH;2^nB^#{w6j2VMuFLe5rA8fZW=UNGM`((j%!T%DRCIEz!Vm z?=4))_W``J2hbmqd9Asjq4`O}&f@}w0$YLyx!-6iM?UH}GBYAesNS$DDs^wI+=|76 zVZ?j?oDm)(b2sT*Zk~fX_CKq`zRfCypIUA$6LnawWw&Lz*;FF4(})K5aNn2C}l;H(RmSu6FwUH2IVc11$Su!;U5D?UF7}7y5$| z8<+i&wkp%u?=lI{){HH{#$}@T(|)%dBHL^(qDq#bkA&{S8QY;aU zJ@G3nC#m)bD?ByZ;w@e5;>cd-MoQUuC$x3$f3$DP3S2$c)CtDrrln?59Ed*IuPm-c z1`s@XQ1BnI*~_K;xiBSL?YAL~wL?WyH6Waa3o(a}u$5{Yo0?zUY$f_VxEJ7H&Vg9^m`fRR*)756ZkBoO`^B2*S~i39akF+(-olz-`=rxe6$Mh5QPU&GG(6V|$*)+-ty*Qgc6R)*|%94G0z@p%o4r{&hfJgWQy>xUDcATpgx1BP?{#z=_xD#n_ z^(|w#woJ`~5|CT&AB(R7Yj4-EokdTS$g2+|#qoY;uPG#mSx1+yn3>4R(ZmtjZb>kk zaPP9>*xV}~AKzFSAO3nAB&6^QCYV)llkI~ehwos(XRMFUHNHgmVCG|g^G4<;1R@;6 zgfCU%Vr`A%jhGEZH1?$U^Ix6<=DJVt5a3?&njOsN9jpW8SO4eA=q_Ls&XfAByCl{xK8t?mP3nffQbqaBlT2?L{yC$Z?=m47LF z6WXU|Kh5W@e$$ULkrr9UCry(WqZybr+BuwO$JEc8Hr!BJIq#DQ&0`hBMq}6?uL5kAHqN`eX1KR_c&YR4V>$ z*(altMIJTwHC24v6f(vE>a;$DEBKaM*YmbEXeXrrL2kAb0*HH%FbB*R(+!}HyBMlT ze&q!z9dqYC?Cyp!JIKo~m_f9?q_?*!3x~D41xs0MvU}~{&2@jf{D~{S^%~Q2DZsa6 zc^?lUq8^NP5dbg;OY?1bmayY{lsA8yH;+EHc~6e*bvKeKMSenrr&3DG^ZB-KCo@oi z)s*l4W2DlwFg2KxoA{9_i8l6xKh;EWad3=*EpT#D_N8m>G45XWpx)lE#H?$U5K>(c zfh@7qg`*EOflf(^^uoG`U6}pl>TjK7+*H(MfK9A~C?}S^G{Y$&7iKM5KXDQSESO1X z^|x(zP=l|&mx#c$R?UyifL(g8rG;gKK>0Dx{9~FdfbIbP^>z^IF2E|rmx2#*hv^=y z9PI$;kKZgBN72XU|D722!~^FKxQw0}dU%L~d;sSW?kTjKHJX|lvn_$hMND1;eH03=HNkmo?1#13r~;y44c|2hSBveUu#mA9#aUiE*HHZhVSEBw!K-V zJmO17!7e|lo7?syY6texciP9Oz2k+2v0{lgoW>4Ab+FZV(p3$1xiLauJ=aR@eiun* zlhv+`v)5M)Exi)Ei(2^F5-`%B>g&k?D34XstY+(FAF}*PYPQw^)XqvF>#^G5x;;<& zqgMFr!grw`h36+Q8*6)On1i)M{QWt-pqeuu*gSo^bx8|t1cc*DEARCikv5{yPM7Fc z##5#bZ5{l4KMXN+v{T2)$yN z!&PfQHBXI_`C%ff^!!eL2?6UX9&$j#r#oJlC$;(pz_&2g^@6i zIjuOB&8Zu3%$5@CRj}l;%$+<@7<}_2NfBr7Xs7d|fFLLNBwofLH}b-G z_pTT&6((g3m65h?)o(p#s?oM|?1prs3ac;VhJ|XC!MnJR*_t<3IyM+i_7CP#K&BHz z8)dym#C{ujo!cNs{i0m9E?J`Ho=v2WbvAPCg(7D8#TL<81L>jQs^?ysvrl3|PEOwS z#e6GY>epJK=#68wlj;LIs^5#M5cWiAo*c(+cwuN2&ctrCkFE#9@@t>`&@~xfYOg8o z--DsZ{Ei7S2aoE-23+%2>aPI<4&S9z%r~XsMv_@_$v$tc1n+%3Dev)X6rZn3oGboq z$4=IOD}J@EL$(Wh6P96Q8p7k5pMH%dZ}r~VDY z9gsnkLv-PQNJnNN2W`tvUM-J@&JV|5arYSOO$C>-+~@N2%2rp9Uw@0IL382 zh@^$aLob4*qZQE4xNd2stS$tyqq5Vl-@3N1u{v0IB6Er~PHjsFcVfT)PQF-Kk38Xr zjje>3CqVe|x^+kJV#~_fxiMbaNaVOUjUOhK)zy|21)fbQPS?@Zs^S3YoJbk6@1&{^~|_ovapK)7?i2-5av!2KzLX%ZG?!D8rm~^ z;WmNfipjI?p}E5^at3=QOAR$^{B$GIz*zPyZuW~KiPgdE`PScDRw)K>nyd|-Kl02L z+ln2Y9hvWR);6+Lmls)D6%44Kx@1Eu1B|h1sWl!W9+JU)ynbA?CkMxU3_50qS5W=8 zgh8wH)q&&5!lbutlF}m{)=3A2H=)Godz5?C9N1h4Lv2dZM;OM&V=wEI<2^7H%GLNS zRgX5~xe8xeh`K{Z}p)6O49M<9XTW3%8Ct>^faMP6hQd6XS{V zYaF#_Mlp;hC&NxdjO0H>(-yEYT!5Ji?EdCUevl1wl|B6z=!Bqiga6tqsJsqq6k$ab z!;nVz&kMI@&}1{1$aU_!fdkVrn*I$j5J#Xl|6 zp8jWR!`N^#;J`kLwTK9NVl>}*H+I|?=5Pna(1^)$s#EXcHaK0#asDY;pQfL%q}Pbe zmFyJQLEq8LTuQ^i!G(O{ZQu1%pZk|h(vJZK9v>_B-YKDxGhVLvfRWn2TwJU6(`hvo z4jeCkl_I{`6uJokK!;`JvrAeW(_2aAX$NmyFgLBo-#J97?@ z#GX*I_Q1YWT#80B;&BWchRf$}^6FHi)jeK*|H#B^Hi`4~e- z7VdB~h4Flue}`+yT6yJW)nhTh{U+9Wuyd8qr0+QOY-Lh%86Rr@`KwNkH?Ag25T~V? zbAGsBME<%R<8?Tu>*i|=9bS;-XtD)~WZ+sdoFS6%`N>$wxZYAHPrIUssHJK33eM%E z?W-$I{pV);k+=YFYoN`}uFezU*(SNGMyzt$!UNx7qg)@(C~99}XzQZ7+-?1+KgTyxBLn46DbF0%}aN%?pWyKq6&VG7QcV;q#t3 zIib_o1Nj|V(BWuO1o{ps`2HzQI zwZ;+iakah{|BkmTMc`b#Zp=9J@z@!aM#0blN5_WouiZSy+U%P^0j=HNWdDk`cL+Ed zz?rz-BS8)45bU)gl)SZGI<+g_+@#BlfzA3zgJ+jL9bcPT5i1lHm7VRe=v7$Ca=^om4Z;w z8C9`Hy<}o2aKup0P9-H*@uAj1JnP$e>HxIVo7MR_@48# znt@%Dy<7CL+p09JA>qQ^htQ^;zek8>@SSY%M%&Ei}!P0A~{izW`^)!A_--?HMyt@%sR*wRogw>>u z3YC6uKGEbOL^R;sc6QI1Vky6^EcAHzkNJ2pA|?&;4>aaS-ix{kywDwwwyqG}*8oV! z1@A^Tcw^?Tk~B1Z;9dw!p}5TOwu}uRrG_sI4^NLQBxlhMjKy`GJl&snni^sTPFL); zj-r2f;V=3;#9fJauJ15K8-}}eo^mrJ6 zyC68XyB#q(pG@JGt}3TiU%wx0+JIcE-`Ip8UVvc#pE=!u3^E%>y`NheQ()12odD`jR>7wk_6ueCM`22)IX_{TeHxIk0>m`-9 z!YYBKQq}Jn?KsMa*>_@=be5p!>0#Jk zcW)OltBI3iQcvh?=wp^nd8B{DHMS(-l)zc*S3}}O;D`M7Co}3KXdNH~$ zd5h(C5>$P{Gq&o9oj5~Zc$P98HZpq!D%fuG_}F&12*f!A$+og@Bn5k|+*tlDGms^l zGax-|jwuq^RiWo$Du&t_7w08v)$1kXm$bU`tTlgMlo@Xy_7UBqA2NiwgXnJp_bzY1 z3F3=t^@QXu4$rv{;dYuaG<2$#4_Zfgfkcnipxb>!sG4^unpPpSlJZWNPw=a8ackjO z)oPxDoN(67Hws4qd|Hu0C(==`4O)YsGZpX!8IxNq1cpMKR8$p)QWyr2Na`KO^~#bR z_-atsYAXF5?1@jyPI+d4`v)$8rYr`tz}ExSoBl2>rUJ#f@2~KmaDXCkAHw-W8am4; zH)=I!=!B2x3w@&@wED~)jWyh!ya*mWSiH7Q=GQn;D4bkg_}FbQTa|@pK~}u`ulbI!w}@R$+|Dg z<&V6gj)Y@s?KyM33T{+%9n=X20Q%r%KKU_4+X5wckU`PY(je{K+raBEYOTgXJzq(; z*>nNu;STiG^#S220UnVNm!U^~O0?Lv7!$+S!FS(%X_$}#xX~ImP3t59NR5LXDx+em zksa=M_arYX!MlAz2c5bgqBY#f3uny~P>Brf*m)oo$CAkZ`K}LB61}4(yQTNuiy^LK zG7G-Ffe@w>tJW4@-aVZR<)Kxxkm@Dv*MYsa?&O@hZ$v5cPnO5Ek;pWet z`eX8CKk8#tB=xznzzuCide@!Jm}J8zm!LbF`}Wo)HO4PBeV*sSQ}y)SO~hYK4R;(~ zRZiMC9NG)wQI3pJ{QgK%Tv$`U`Z|A)PW3wd)~pxjs+a$r2%nFkfIj?lw?_Xl5l`0c z%8rIQspHb7X2g-qHhgRNbzs)D0t+9fL@^EiQh#b+-6Q~QS|*$vjj^70=0k6E51In2 z>860Iyl_Y2mY&3WPE<#D&maomMRqYH6OSxa|Suv70kIRnbBM>FxU?ID{{sS(JDzR&MWW@k_m*DPncD4P73sM_}lQ*s7ZYZ+PsNHszJbQ4?V*623V z_D+8JlgC0Uyxqqa>iJWAJWys+CI{ab4L`i#?fbHConG5excH^MT_x_RzMzhZIX2d$Th~QSOS(;VS3(C}|`p)X;5afGz^y!ZDi`+g@mq^lc z6-p8%2MrX)mr{A5iS|EiL!=IN%rE^JewgmFNRedykG3PoX?s`3c#lH}jFgX-Rmv!QMIys4-#Iih+@aJM5;x0RV4 z?Se@~myMgCP4jdZI|g~XY#Rs}!OOq5ns~ZybY+dvy!QU+*9xcc8-)uxr*J*SG4d%R zW_0wv;CCEjfedXEQ)|$}`aoD$NeJhzc;UWN>vzKVdG88OT%1}bbVyF7$o;aPS4qV# zU0H>1$qbhL6)|xR{igY;lj~^ujE`kyenJE zYp5m411TRl>ZDnXJ7{@zhUtX|uDU{7w@Bbg3>2=Mp9XP0!L-C&pT)cMY|(EO#Hu7d zlP8|aN?4l*h ztw&>kcL7Ue-%DOplZ;k!YNpkI>82d8y0wAzLS_D3LCP)FIqoNO4M&~~V$Xz+q=k%5 zL&fAr$ZgtT);0(C>nTD_1KvB1M*ZJJi!LkiJh2?L>}+R9Dde?76f1%(scB6E=wG^6#{G&+o3RNI6aL=ZB%Vit9U$q>cwdm zCF z8j8E;vVY@77WdAMyQK*^G$?|kBVRAhYjt$+K>XzZ$Cju|$?VYn5<`zS6hM4R&wilf z5?^wgG-)b>OL&~Os6@kjvl&q^8QNex*yqi@VqY>evwM_w*}6VXW}6GpgQ}PVUpcl8QI?{q)AjHQy`N&d;o#z9m(uSj(uk!` z8GRn|bLYwqH?)^52m4aXBLctK?C#I>n>xjXDL|^<7?<};!#ivG;4ORaXy@*PyLdz{ zIp?mpLlwMLMs$w0+)LzF^fI%gGql$ZsmzZ>C9`e9_?edoBuMKQ)6Z@7BX4DbMe-&c z{S<-&F)QmH^a(Lysh&sPXAgEVt0DE7or`k*&EjgpBS zMFIcYk}kvfwibom&rCLmDq4J7P%z z*M$v;d*#~E&^KDnHSHB$|od=z}_6%JwGoZ!% z)ME;@TJx1jS~uJIQquoLS%K;B$F0Y&rY&g#-vlpmUbHNo4ic>U0XJV-L;eNv>~JPn z6lw8$e#}2YDJCNMX*+EDmsl%y_GW(7v&Lvo2d={U;Hw#P!kAxK+3UM|yhHk7^@Z5J zl-tTI!GD6rwbRx|>2b$*NUnqyeE!@){yvRYO3ASu3~!kD2(58Oa^xeKyGE)b-0S)5 zTL0qD?Fi7L_JI#r_xjE@XRxRB_CtxS;R~rqzP-9ntn*4i#MB)PJEB=OsFNedzc8~% z`n{La8bY17k~5VAIXj#82wb}>d6lNbhFXHSg;24I@x0mO^;(j9o-($_J~caMF>XCK zS-{!}ZJPBWt~4zbYt8;io%DG#&w0lt+dI3XFVg$DNRO_8HCz1Opm;QNqTER$TAAL> z{MLI`9qyV+658U#E43(lJ*7`OPHbS6w(}M66MQpZ8!eAJi1cmKaN;48T95&Y9)&W?gRFGLD2J5NvDmAc*L z?B4_-;A#R3U8WDf&N#4WUjKM+-_HqQwL7jK&7Hjb>eI)ouXRL=CZ65n^NiouJm`Mh z9rKm?7rc2PD5EvWMPOKV=I-h+Wf$~M5c18|B($|}lGU(3DzaqaXT% za(Wr&EP3=~*TZ+`qW6E&)O-0ln)~R+TRSY#l(jP4i99(;Wpj{gV9j&?yXDLuq&Fqk zekumW4^mLw05(d6?u#l;v{@BxxOM;JAFl8G4DYPh_kXeMpOEW(p4C6=&m>({imdBW zU-(21I8SC+9W`I%aak$vWu8ycH(95?rl<8J&H;WAk zo%>Dd+#Tn&>z*z8uq8|P-OE7xx~}Zk1tLoMKX^+v-n+clWo~rTi@oc7C&$)*^1g87 z>zjq?;#?8ek&@V2Bc7;>+ry5CDKgByz^o|xwl5$N0YCaXqm-EseqNACAZUA({Gv-C?725HU1!gr(|FUY9=_hh=~ysN+emo`MdLF9%T zS;C1|_C0n2_KUjGj7*LlOI{}ZEoS>K+x?un$0ubotaGvU`m#Ax`+k{CZ5Mxe@b=yd zVsG-7CJL{TyVmjT?@9gQg`u_Q_wyBWBL&Xn-O|jZiAz5)?vRUa@ckj+wp%D3 zvaeA)1R83mT+QQkjxc@n-aowT=lXBbFRSlQyZvj&oeuv!(?hNQe^C9~8X&uAZQg;t zScO@Iw;yt@1(uz^HzC!Q&))62_B~zWl!1ox`o|MfW5YA|@X8OU{_#fMJA1Euugmz7S-VQR zROr*k)T=lCDxdwLnHO}|^_7@MUToC0xtR=Ry>{#TIkKnJz3BMc$6VvNKZd1!^9}e& zqy^LDrIA;E&#qk>Ti9*%*;a1V!uY(2Q~#Q52%o;=>ek%NuWzsF%i13lKT~{lS*Ub* zt?An(daE~_-M1oW|KFVdQ&MBb@0GaM@Gynhq literal 0 HcmV?d00001 diff --git a/rfcs/text/0013_background_sessions.md b/rfcs/text/0013_background_sessions.md new file mode 100644 index 0000000000000..056149e770448 --- /dev/null +++ b/rfcs/text/0013_background_sessions.md @@ -0,0 +1,489 @@ +- Start Date: (fill me in with today's date, YYYY-MM-DD) +- RFC PR: (leave this empty) +- Kibana Issue: (leave this empty) + +- Architecture diagram: https://app.lucidchart.com/documents/edit/cf35b512-616a-4734-bc72-43dde70dbd44/0_0 +- Mockups: https://www.figma.com/proto/FD2M7MUpLScJKOyYjfbmev/ES-%2F-Query-Management-v4?node-id=440%3A1&viewport=984%2C-99%2C0.09413627535104752&scaling=scale-down +- Old issue: https://github.com/elastic/kibana/issues/53335 +- Background search roadmap: https://github.com/elastic/kibana/issues/61738 +- POC: https://github.com/elastic/kibana/pull/64641 + +# Summary + +Background Sessions will enable Kibana applications and solutions to start a group of related search requests (such as those coming from a single load of a dashboard or SIEM timeline), navigate away or close the browser, then retrieve the results when they have completed. + +# Basic example + +At its core, background sessions are enabled via several new APIs, that: +- Start a session, associating multiple search requests with a single entity +- Store the session (and continue search requests in the background) +- Restore the background session + +```ts +const searchService = dataPluginStart.search; + +if (appState.sessionId) { + // If we are restoring a session, set the session ID in the search service + searchService.session.restore(sessionId); +} else { + // Otherwise, start a new background session to associate our search requests + appState.sessionId = searchService.session.start(); +} + +// Search, passing in the generated session ID. +// If this is a new session, the `search_interceptor` will associate and keep track of the async search ID with the session ID. +// If this is a restored session, the server will immediately return saved results. +// In the case where there is no saved result for a given request, or if the results have expired, `search` will throw an error with a meaningful error code. +const request = buildKibanaRequest(...); +request.sessionId = searchService.session.get(); +const response$ = await searchService.search(request); + +// Calling `session.store()`, creates a saved object for this session, allowing the user to navigate away. +// The session object will be saved with all async search IDs that were executed so far. +// Any follow up searches executed with this sessionId will be saved into this object as well. +const backgroundSession = await searchService.session.store(); +``` + +# Motivation + +Kibana is great at providing fast results from large sets of "hot" data. However, there is an increasing number of use cases where users want to analyze large amounts of "colder" data (such as year-over-year reports, historical or audit data, batch queries, etc.). + +For these cases, users run into two limitations: + 1. Kibana has a default timeout of 30s per search. This is controlled by the `elasticsearch.requestTimeout` setting (originally intended to protect clusters from unintentional overload by a single query). + 2. Kibana cancels queries upon navigating away from an application, once again, as means of protecting clusters and reducing unnecessary load. + +In 7.7, with the introduction of the `_async_search` API in Elasticsearch, we provided Kibana users a way to bypass the timeout, but users still need to remain on-screen for the entire duration of the search requests. + +The primary motivation of this RFC is to enable users to do the following without needing to keep Kibana open, or while moving onto other work inside Kibana: + +- Run long search requests (beyond 30 seconds) +- View their status (complete/incomplete) +- Cancel incomplete search requests +- Retrieve completed search request results + +# Detailed design + +Because a single view (such as a dashboard with multiple visualizations) can initiate multiple search requests, we need a way to associate the search requests together in a single entity. + +We call this entity a `session`, and when a user decides that they want to continue running the search requests while moving onto other work, we will create a saved object corresponding with that specific `session`, persisting the *sessionId* along with a mapping of each *request's hash* to the *async ID* returned by Elasticsearch. + +## High Level Flow Charts + +### Client side search + +This diagram matches any case where `data.search` is called from the front end: + +![image](../images/background_sessions_client.png) + +### Server side search + +This case happens if the server is the one to invoke the `data.search` endpoint, for example with TSVB. + +![image](../images/background_sessions_server.png) + +## Data and Saved Objects + +### Background Session Status + +```ts +export enum BackgroundSessionStatus { + Running, // The session has at least one running search ID associated with it. + Done, // All search IDs associated with this session have completed. + Error, // At least one search ID associated with this session had an error. + Expired, // The session has expired. Associated search ID data was cleared from ES. +} +``` + +### Saved Object Structure + +The saved object created for a background session will be scoped to a single space, and will be a `hidden` saved object +(so that it doesn't show in the management listings). We will provide a separate interface for users to manage their own +background sessions (which will use the `list`, `expire`, and `extend` methods described below, which will be restricted +per-user). + +```ts +interface BackgroundSessionAttributes extends SavedObjectAttributes { + sessionId: string; + userId: string; // Something unique to the user who generated this session, like username/realm-name/realm-type + status: BackgroundSessionStatus; + name: string; + creation: Date; + expiration: Date; + idMapping: { [key: string]: string }; + url: string; // A URL relative to the Kibana root to retrieve the results of a completed background session (and/or to return to an incomplete view) + metadata: { [key: string]: any } // Any data the specific application requires to restore a background session view +} +``` + +The URL that is provided will need to be generated by the specific application implementing background sessions. We +recommend using the URL generator to ensure that URLs are backwards-compatible since background sessions may exist as +long as a user continues to extend the expiration. + +## Frontend Services + +Most sessions will probably not be saved. Therefore, to avoid creating unnecessary saved objects, the browser will keep track of requests and their respective search IDs, until the user chooses to store the session. Once a session is stored, any additional searches will be immediately saved on the server side. + +### New Session Service + +We will expose a new frontend `session` service on the `data` plugin `search` service. + +The service will expose the following APIs: + +```ts +interface ISessionService { + /** + * Returns the current session ID + */ + getActiveSessionId: () => string; + + /** + * Sets the current session + * @param sessionId: The ID of the session to set + * @param isRestored: Whether or not the session is being restored + */ + setActiveSessionId: (sessionId: string, isRestored: boolean) => void; + + /** + * Start a new session, by generating a new session ID (calls `setActiveSessionId` internally) + */ + start: () => string; + + /** + * Store a session, alongside with any tracked searchIds. + * @param sessionId Session ID to store. Probably retrieved from `sessionService.get()`. + * @param name A display name for the session. + * @param url TODO: is the URL provided here? How? + * @returns The stored `BackgroundSessionAttributes` object + * @throws Throws an error in OSS. + */ + store: (sessionId: string, name: string, url: string) => Promise + + /** + * @returns Is the current session stored (i.e. is there a saved object corresponding with this sessionId). + */ + isStored: () => boolean; + + /** + * @returns Is the current session a restored session + */ + isRestored: () => boolean; + + /** + * Mark a session and and all associated searchIds as expired. + * Cancels active requests, if there are any. + * @param sessionId Session ID to store. Probably retrieved from `sessionService.get()`. + * @returns success status + * @throws Throws an error in OSS. + */ + expire: (sessionId: string) => Promise + + /** + * Extend a session and all associated searchIds. + * @param sessionId Session ID to extend. Probably retrieved from `sessionService.get()`. + * @param extendBy Time to extend by, can be a relative or absolute string. + * @returns success status + * @throws Throws an error in OSS. + */ + extend: (sessionId: string, extendBy: string)=> Promise + + /** + * @param sessionId the ID of the session to retrieve the saved object. + * @returns a filtered list of BackgroundSessionAttributes objects. + * @throws Throws an error in OSS. + */ + get: (sessionId: string) => Promise + + /** + * @param options The options to query for specific background session saved objects. + * @returns a filtered list of BackgroundSessionAttributes objects. + * @throws Throws an error in OSS. + */ + list: (options: SavedObjectsFindOptions) => Promise + + /** + * Clears out any session info as well as the current session. Called internally whenever the user navigates + * between applications. + * @internal + */ + clear: () => void; + + /** + * Track a search ID of a sessionId, if it exists. Called internally by the search service. + * @param sessionId + * @param request + * @param searchId + * @internal + */ + trackSearchId: ( + sessionId: string, + request: IKibanaSearchRequest, + searchId: string, + ) => Promise +} +``` + +## Backend Services and Routes + +The server side's feature implementation builds on how Elasticsearch's `async_search` endpoint works. When making an +initial new request to Elasticsearch, it returns a search ID that can be later used to retrieve the results. + +The server will then store that `request`, `sessionId`, and `searchId` in a mapping in memory, and periodically query +for a saved object corresponding with that session. If the saved object is found, it will update the saved object to +include this `request`/`searchId` combination, and remove it from memory. If, after a period of time (5 minutes?) the +saved object has not been found, we will stop polling for that `sessionId` and remove the `request`/`searchId` from +memory. + +When the server receives a search request that has a `sessionId` and is marked as a `restore` request, the server will +attempt to find the correct id within the saved object, and use it to retrieve the results previously saved. + +### New Session Service + +```ts +interface ISessionService { + /** + * Adds a search ID to a Background Session, if it exists. + * Also extends the expiration of the search ID to match the session's expiration. + * @param request + * @param sessionId + * @param searchId + * @returns true if id was added, false if Background Session doesn't exist or if there was an error while updating. + * @throws an error if `searchId` already exists in the mapping for this `sessionId` + */ + trackSearchId: ( + request: KibanaRequest, + sessionId: string, + searchId: string, + ) => Promise + + /** + * Get a Background Session object. + * @param request + * @param sessionId + * @returns the Background Session object if exists, or undefined. + */ + get: async ( + request: KibanaRequest, + sessionId: string + ) => Promise + + /** + * Get a searchId from a Background Session object. + * @param request + * @param sessionId + * @returns the searchID if exists on the Background Session, or undefined. + */ + getSearchId: async ( + request: KibanaRequest, + sessionId: string + ) => Promise + + /** + * Store a session. + * @param request + * @param sessionId Session ID to store. Probably retrieved from `sessionService.get()`. + * @param searchIdMap A mapping of hashed requests mapped to the corresponding searchId. + * @param url TODO: is the URL provided here? How? + * @returns The stored `BackgroundSessionAttributes` object + * @throws Throws an error in OSS. + * @internal (Consumers should use searchInterceptor.sendToBackground()) + */ + store: ( + request: KibanaRequest, + sessionId: string, + name: string, + url: string, + searchIdMapping?: Record + ) => Promise + + /** + * Mark a session as and all associated searchIds as expired. + * @param request + * @param sessionId + * @returns success status + * @throws Throws an error in OSS. + */ + expire: async ( + request: KibanaRequest, + sessionId: string + ) => Promise + + /** + * Extend a session and all associated searchIds. + * @param request + * @param sessionId + * @param extendBy Time to extend by, can be a relative or absolute string. + * @returns success status + * @throws Throws an error in OSS. + */ + extend: async ( + request: KibanaRequest, + sessionId: string, + extendBy: string, + ) => Promise + + /** + * Get a list of background session objects. + * @param request + * @param sessionId + * @returns success status + * @throws Throws an error in OSS. + */ + list: async ( + request: KibanaRequest, + ) => Promise + + /** + * Update the status of a given session + * @param request + * @param sessionId + * @param status + * @returns success status + * @throws Throws an error in OSS. + */ + updateStatus: async ( + request: KibanaRequest, + sessionId: string, + status: BackgroundSessionStatus + ) => Promise +} + +``` + +### Search Service Changes + +There are cases where search requests are issued by the server (Like TSVB). +We can simplify this flow by introducing a mechanism, similar to the frontend one, tracking the information in memory and polling for a saved object with a corresponding sessionId to store the ids into it. + +```ts +interface SearchService { + /** + * The search API will accept the option `trackId`, which will track the search ID, if available, on the server, until a corresponding saved object is created. + **/ + search: async ( + context: RequestHandlerContext, + request: IEnhancedEsSearchRequest, + options?: ISearchOptions + ) => ISearchResponse +} +``` + +### Server Routes + +Each route exposes the corresponding method from the Session Service (used only by the client-side service, not meant to be used directly by any consumers): + +`POST /internal/session/store` + +`POST /internal/session/extend` + +`POST /internal/session/expire` + +`GET /internal/session/list` + +### Search Strategy Integration + +If the `EnhancedEsSearchStrategy` receives a `restore` option, it will attempt reloading data using the Background Session saved object matching the provided `sessionId`. If there are any errors during that process, the strategy will return an error response and *not attempt to re-run the request. + +The strategy will track the asyncId on the server side, if `trackId` option is provided. + +### Monitoring Service + +The `data` plugin will register a task with the task manager, periodically monitoring the status of incomplete background sessions. + +It will query the list of all incomplete sessions, and check the status of each search that is executing. If the search requests are all complete, it will update the corresponding saved object to have a `status` of `complete`. If any of the searches return an error, it will update the saved object to an `error` state. If the search requests have expired, it will update the saved object to an `expired` state. Expired sessions will be purged once they are older than the time definedby the `EXPIRED_SESSION_TTL` advanced setting. + +Once there's a notification area in Kibana, we may use that mechanism to push completion \ error notifications to the client. + +## Miscellaneous + +#### Relative dates and restore URLs + +Restoring a sessionId depends on each request's `sha-256` hash matching exactly to the ones saved, requiring special attention to relative date ranges, as having these might yield ambiguous results. + +There are two potential scenarios: + - A relative date (for example `now-1d`) is being used in query DSL - In this case any future hash will match, but the returned data *won't match the displayed timeframe*. For example, a report might state that it shows data from yesterday, but actually show data from a week ago. + - A relative date is being translated by the application before being set to the query DSL - In this case a different date will be sent and the hash will never match, resulting in an error restoring the dashboard. + +Both scenarios require careful attention during the UI design and implementation. + +The former can be resolved by clearly displaying the creation time of the restored Background Session. We could also attempt translating relative dates to absolute one's, but this might be challenging as relative dates may appear deeply nested within the DSL. + +The latter case happens at the moment for the timepicker only: The relative date is being translated each time into an absolute one, before being sent to Elasticsearch. In order to avoid issues, we'll have to make sure that restore URLs are generated with an absolute date, to make sure they are restored correctly. + +#### Changing a restored session + +If you have restored a Background Session, making any type of change to it (time range, filters, etc.) will trigger new (potentially long) searches. There should be a clear indication in the UI that the data is no longer stored. A user then may choose to send it to background, resulting in a new Background Session being saved. + +#### Loading an errored \ expired \ canceled session + +When trying to restore a Background Session, if any of the requests hashes don't match the ones saved, or if any of the saved async search IDs are expired, a meaningful error code will be returned by the server **by those requests**. It is each application's responsibility to handle these errors appropriately. + +In such a scenario, the session will be partially restored. + +#### Extending Expiration + +Sessions are given an expiration date defined in an advanced setting (5 days by default). This expiration date is measured from the time the Background Session is saved, and it includes the time it takes to generate the results. + +A session's expiration date may be extended indefinitely. However, if a session was canceled or has already expired, it needs to be re-run. + +# Limitations + +In the first iteration, cases which require multiple search requests to be made serially will not be supported. The +following are examples of such scenarios: + +- When a visualization is configured with a terms agg with an "other" bucket +- When using blended layers or term joins in Maps + +Eventually, when expressions can be run on the server, they will run in the context of a specific `sessionId`, hence enabling those edge cases too. + +# Drawbacks + +One drawback of this approach is that we will be regularly polling Elasticsearch for saved objects, which will increase +load on the Elasticsearch server, in addition to the Kibana server (since all server-side processes share the same event +loop). We've opened https://github.com/elastic/kibana/issues/77293 to track this, and hopefully come up with benchmarks +so we feel comfortable moving forward with this approach. + +Two potential drawbacks stem from storing things in server memory. If a Kibana server is restarted, in-memory results +will be lost. (This can be an issue if a search request has started, and the user has sent to background, but the +background session saved object has not yet been updated with the search request ID.) In such cases, the user interface +will need to indicate errors for requests that were not stored in the saved object. + +There is also the consideration of the memory footprint of the Kibana server; however, since +we are only storing a hash of the request and search request ID, and are periodically cleaning it up (see Backend +Services and Routes), we do not anticipate the footprint to increase significantly. + +The results of search requests that have been sent to the background will be stored in Elasticsearch for several days, +even if they will only be retrieved once. This will be mitigated by allowing the user manually delete a background +session object after it has been accessed. + +# Alternatives + +What other designs have been considered? What is the impact of not doing this? + +# Adoption strategy + +(See "Basic example" above.) + +Any application or solution that uses the `data` plugin `search` services will be able to facilitate background sessions +fairly simply. The public side will need to create/clear sessions when appropriate, and ensure the `sessionId` is sent +with all search requests. It will also need to ensure that any necessary application data, as well as a `restoreUrl` is +sent when creating the saved object. + +The server side will just need to ensure that the `sessionId` is sent to the `search` service. If bypassing the `search` +service, it will need to also call `trackSearchId` when the first response is received, and `getSearchId` when restoring +the view. + +# How we teach this + +What names and terminology work best for these concepts and why? How is this +idea best presented? As a continuation of existing Kibana patterns? + +Would the acceptance of this proposal mean the Kibana documentation must be +re-organized or altered? Does it change how Kibana is taught to new developers +at any level? + +How should this feature be taught to existing Kibana developers? + +# Unresolved questions + +Optional, but suggested for first drafts. What parts of the design are still +TBD? From 951034cf0caa09b7e1914d8e16b8197f343eca25 Mon Sep 17 00:00:00 2001 From: Ryland Herrick Date: Mon, 5 Oct 2020 11:30:32 -0500 Subject: [PATCH 22/49] [Search]Add EQL search strategy (#78645) * Add EQL search strategy Since EQL is an x-pack feature, this strategy will live in the x-pack plugin data_enhanced. * Refactor our test setup to minimize shared state * Ensures that the same variable is not used for both test setup and test assertions * Ensures that mocks are reinstantiated on every test * Use explicit top-level exports * Move async search options to a helper function * Move our workaround to a helper function This was repeated in five places, time to consolidate. * Commit documentation changes We export a few new helper functions. * Mark our internal methods as such Updates documentation accordingly. Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- src/plugins/data/server/index.ts | 2 + .../search/es_search/es_search_strategy.ts | 16 +- .../es_search/get_default_search_params.ts | 8 + .../data/server/search/es_search/index.ts | 1 + .../es_search/shim_abort_signal.test.ts | 55 ++++++ .../search/es_search/shim_abort_signal.ts | 41 +++++ .../data/server/search/routes/call_msearch.ts | 23 ++- src/plugins/data/server/server.api.md | 36 ++-- x-pack/plugins/data_enhanced/common/index.ts | 8 +- .../data_enhanced/common/search/index.ts | 6 +- .../data_enhanced/common/search/types.ts | 19 +- x-pack/plugins/data_enhanced/server/index.ts | 2 +- x-pack/plugins/data_enhanced/server/plugin.ts | 9 +- .../server/search/eql_search_strategy.test.ts | 168 ++++++++++++++++++ .../server/search/eql_search_strategy.ts | 70 ++++++++ .../server/search/es_search_strategy.ts | 16 +- .../data_enhanced/server/search/index.ts | 1 + 17 files changed, 429 insertions(+), 52 deletions(-) create mode 100644 src/plugins/data/server/search/es_search/shim_abort_signal.test.ts create mode 100644 src/plugins/data/server/search/es_search/shim_abort_signal.ts create mode 100644 x-pack/plugins/data_enhanced/server/search/eql_search_strategy.test.ts create mode 100644 x-pack/plugins/data_enhanced/server/search/eql_search_strategy.ts diff --git a/src/plugins/data/server/index.ts b/src/plugins/data/server/index.ts index aac1fe1fde212..11dcbb01bf4a6 100644 --- a/src/plugins/data/server/index.ts +++ b/src/plugins/data/server/index.ts @@ -214,11 +214,13 @@ export { ISearchSetup, ISearchStart, toSnakeCase, + getAsyncOptions, getDefaultSearchParams, getShardTimeout, getTotalLoaded, shimHitsTotal, usageProvider, + shimAbortSignal, SearchUsage, } from './search'; diff --git a/src/plugins/data/server/search/es_search/es_search_strategy.ts b/src/plugins/data/server/search/es_search/es_search_strategy.ts index e2ed500689cfa..6e185d30ad56a 100644 --- a/src/plugins/data/server/search/es_search/es_search_strategy.ts +++ b/src/plugins/data/server/search/es_search/es_search_strategy.ts @@ -23,7 +23,13 @@ import { Observable } from 'rxjs'; import { ApiResponse } from '@elastic/elasticsearch'; import { SearchUsage } from '../collectors/usage'; import { toSnakeCase } from './to_snake_case'; -import { ISearchStrategy, getDefaultSearchParams, getTotalLoaded, getShardTimeout } from '..'; +import { + ISearchStrategy, + getDefaultSearchParams, + getTotalLoaded, + getShardTimeout, + shimAbortSignal, +} from '..'; export const esSearchStrategyProvider = ( config$: Observable, @@ -52,10 +58,10 @@ export const esSearchStrategyProvider = ( }); try { - // Temporary workaround until https://github.com/elastic/elasticsearch-js/issues/1297 - const promise = context.core.elasticsearch.client.asCurrentUser.search(params); - if (options?.abortSignal) - options.abortSignal.addEventListener('abort', () => promise.abort()); + const promise = shimAbortSignal( + context.core.elasticsearch.client.asCurrentUser.search(params), + options?.abortSignal + ); const { body: rawResponse } = (await promise) as ApiResponse>; if (usage) usage.trackSuccess(rawResponse.took); diff --git a/src/plugins/data/server/search/es_search/get_default_search_params.ts b/src/plugins/data/server/search/es_search/get_default_search_params.ts index 13607fce51670..b51293b88fcec 100644 --- a/src/plugins/data/server/search/es_search/get_default_search_params.ts +++ b/src/plugins/data/server/search/es_search/get_default_search_params.ts @@ -42,3 +42,11 @@ export async function getDefaultSearchParams(uiSettingsClient: IUiSettingsClient trackTotalHits: true, }; } + +/** + @internal + */ +export const getAsyncOptions = () => ({ + waitForCompletionTimeout: '100ms', // Wait up to 100ms for the response to return + keepAlive: '1m', // Extend the TTL for this search request by one minute +}); diff --git a/src/plugins/data/server/search/es_search/index.ts b/src/plugins/data/server/search/es_search/index.ts index 1bd17fc986168..63ab7a025ee51 100644 --- a/src/plugins/data/server/search/es_search/index.ts +++ b/src/plugins/data/server/search/es_search/index.ts @@ -21,5 +21,6 @@ export { esSearchStrategyProvider } from './es_search_strategy'; export * from './get_default_search_params'; export { getTotalLoaded } from './get_total_loaded'; export * from './to_snake_case'; +export { shimAbortSignal } from './shim_abort_signal'; export { ES_SEARCH_STRATEGY, IEsSearchRequest, IEsSearchResponse } from '../../../common'; diff --git a/src/plugins/data/server/search/es_search/shim_abort_signal.test.ts b/src/plugins/data/server/search/es_search/shim_abort_signal.test.ts new file mode 100644 index 0000000000000..794b6535cc184 --- /dev/null +++ b/src/plugins/data/server/search/es_search/shim_abort_signal.test.ts @@ -0,0 +1,55 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { elasticsearchServiceMock } from '../../../../../core/server/mocks'; +import { shimAbortSignal } from '.'; + +describe('shimAbortSignal', () => { + it('aborts the promise if the signal is aborted', () => { + const promise = elasticsearchServiceMock.createSuccessTransportRequestPromise({ + success: true, + }); + const controller = new AbortController(); + shimAbortSignal(promise, controller.signal); + controller.abort(); + + expect(promise.abort).toHaveBeenCalled(); + }); + + it('returns the original promise', async () => { + const promise = elasticsearchServiceMock.createSuccessTransportRequestPromise({ + success: true, + }); + const controller = new AbortController(); + const response = await shimAbortSignal(promise, controller.signal); + + expect(response).toEqual(expect.objectContaining({ body: { success: true } })); + }); + + it('allows the promise to be aborted manually', () => { + const promise = elasticsearchServiceMock.createSuccessTransportRequestPromise({ + success: true, + }); + const controller = new AbortController(); + const enhancedPromise = shimAbortSignal(promise, controller.signal); + + enhancedPromise.abort(); + expect(promise.abort).toHaveBeenCalled(); + }); +}); diff --git a/src/plugins/data/server/search/es_search/shim_abort_signal.ts b/src/plugins/data/server/search/es_search/shim_abort_signal.ts new file mode 100644 index 0000000000000..14a4a6919c5af --- /dev/null +++ b/src/plugins/data/server/search/es_search/shim_abort_signal.ts @@ -0,0 +1,41 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { TransportRequestPromise } from '@elastic/elasticsearch/lib/Transport'; + +/** + * + * @internal + * NOTE: Temporary workaround until https://github.com/elastic/elasticsearch-js/issues/1297 + * is resolved + * + * @param promise a TransportRequestPromise + * @param signal optional AbortSignal + * + * @returns a TransportRequestPromise that will be aborted if the signal is aborted + */ +export const shimAbortSignal = >( + promise: T, + signal: AbortSignal | undefined +): T => { + if (signal) { + signal.addEventListener('abort', () => promise.abort()); + } + return promise; +}; diff --git a/src/plugins/data/server/search/routes/call_msearch.ts b/src/plugins/data/server/search/routes/call_msearch.ts index 764dcd189f8db..8103b680c6bbb 100644 --- a/src/plugins/data/server/search/routes/call_msearch.ts +++ b/src/plugins/data/server/search/routes/call_msearch.ts @@ -25,7 +25,7 @@ import { IUiSettingsClient, IScopedClusterClient, SharedGlobalConfig } from 'src import { MsearchRequestBody, MsearchResponse } from '../../../common/search/search_source'; import { shimHitsTotal } from './shim_hits_total'; -import { getShardTimeout, getDefaultSearchParams, toSnakeCase } from '..'; +import { getShardTimeout, getDefaultSearchParams, toSnakeCase, shimAbortSignal } from '..'; /** @internal */ export function convertRequestBody( @@ -74,18 +74,17 @@ export function getCallMsearch(dependencies: CallMsearchDependencies) { const body = convertRequestBody(params.body, timeout); - // Temporary workaround until https://github.com/elastic/elasticsearch-js/issues/1297 - const promise = esClient.asCurrentUser.msearch( - { - body, - }, - { - querystring: toSnakeCase(defaultParams), - } + const promise = shimAbortSignal( + esClient.asCurrentUser.msearch( + { + body, + }, + { + querystring: toSnakeCase(defaultParams), + } + ), + params.signal ); - if (params.signal) { - params.signal.addEventListener('abort', () => promise.abort()); - } const response = (await promise) as ApiResponse<{ responses: Array> }>; return { diff --git a/src/plugins/data/server/server.api.md b/src/plugins/data/server/server.api.md index fed0c1a02297e..45dbdee0f846b 100644 --- a/src/plugins/data/server/server.api.md +++ b/src/plugins/data/server/server.api.md @@ -47,6 +47,7 @@ import { SearchResponse } from 'elasticsearch'; import { SerializedFieldFormat as SerializedFieldFormat_2 } from 'src/plugins/expressions/common'; import { ShardsResponse } from 'elasticsearch'; import { ToastInputFields } from 'src/core/public/notifications'; +import { TransportRequestPromise } from '@elastic/elasticsearch/lib/Transport'; import { Type } from '@kbn/config-schema'; import { TypeOf } from '@kbn/config-schema'; import { Unit } from '@elastic/datemath'; @@ -354,6 +355,12 @@ export type Filter = { query?: any; }; +// @internal (undocumented) +export const getAsyncOptions: () => { + waitForCompletionTimeout: string; + keepAlive: string; +}; + // Warning: (ae-forgotten-export) The symbol "IUiSettingsClient" needs to be exported by the entry point index.d.ts // Warning: (ae-missing-release-tag) "getDefaultSearchParams" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) // @@ -980,6 +987,9 @@ export interface SearchUsage { trackSuccess(duration: number): Promise; } +// @internal +export const shimAbortSignal: >(promise: T, signal: AbortSignal | undefined) => T; + // @internal export function shimHitsTotal(response: SearchResponse): { hits: { @@ -1115,19 +1125,19 @@ export function usageProvider(core: CoreSetup_2): SearchUsage; // src/plugins/data/server/index.ts:101:26 - (ae-forgotten-export) The symbol "TruncateFormat" needs to be exported by the entry point index.d.ts // src/plugins/data/server/index.ts:127:27 - (ae-forgotten-export) The symbol "isFilterable" needs to be exported by the entry point index.d.ts // src/plugins/data/server/index.ts:127:27 - (ae-forgotten-export) The symbol "isNestedField" needs to be exported by the entry point index.d.ts -// src/plugins/data/server/index.ts:226:20 - (ae-forgotten-export) The symbol "getRequestInspectorStats" needs to be exported by the entry point index.d.ts -// src/plugins/data/server/index.ts:226:20 - (ae-forgotten-export) The symbol "getResponseInspectorStats" needs to be exported by the entry point index.d.ts -// src/plugins/data/server/index.ts:226:20 - (ae-forgotten-export) The symbol "tabifyAggResponse" needs to be exported by the entry point index.d.ts -// src/plugins/data/server/index.ts:226:20 - (ae-forgotten-export) The symbol "tabifyGetColumns" needs to be exported by the entry point index.d.ts -// src/plugins/data/server/index.ts:228:1 - (ae-forgotten-export) The symbol "CidrMask" needs to be exported by the entry point index.d.ts -// src/plugins/data/server/index.ts:229:1 - (ae-forgotten-export) The symbol "dateHistogramInterval" needs to be exported by the entry point index.d.ts -// src/plugins/data/server/index.ts:238:1 - (ae-forgotten-export) The symbol "InvalidEsCalendarIntervalError" needs to be exported by the entry point index.d.ts -// src/plugins/data/server/index.ts:239:1 - (ae-forgotten-export) The symbol "InvalidEsIntervalFormatError" needs to be exported by the entry point index.d.ts -// src/plugins/data/server/index.ts:240:1 - (ae-forgotten-export) The symbol "Ipv4Address" needs to be exported by the entry point index.d.ts -// src/plugins/data/server/index.ts:244:1 - (ae-forgotten-export) The symbol "isValidEsInterval" needs to be exported by the entry point index.d.ts -// src/plugins/data/server/index.ts:245:1 - (ae-forgotten-export) The symbol "isValidInterval" needs to be exported by the entry point index.d.ts -// src/plugins/data/server/index.ts:249:1 - (ae-forgotten-export) The symbol "propFilter" needs to be exported by the entry point index.d.ts -// src/plugins/data/server/index.ts:252:1 - (ae-forgotten-export) The symbol "toAbsoluteDates" needs to be exported by the entry point index.d.ts +// src/plugins/data/server/index.ts:228:20 - (ae-forgotten-export) The symbol "getRequestInspectorStats" needs to be exported by the entry point index.d.ts +// src/plugins/data/server/index.ts:228:20 - (ae-forgotten-export) The symbol "getResponseInspectorStats" needs to be exported by the entry point index.d.ts +// src/plugins/data/server/index.ts:228:20 - (ae-forgotten-export) The symbol "tabifyAggResponse" needs to be exported by the entry point index.d.ts +// src/plugins/data/server/index.ts:228:20 - (ae-forgotten-export) The symbol "tabifyGetColumns" needs to be exported by the entry point index.d.ts +// src/plugins/data/server/index.ts:230:1 - (ae-forgotten-export) The symbol "CidrMask" needs to be exported by the entry point index.d.ts +// src/plugins/data/server/index.ts:231:1 - (ae-forgotten-export) The symbol "dateHistogramInterval" needs to be exported by the entry point index.d.ts +// src/plugins/data/server/index.ts:240:1 - (ae-forgotten-export) The symbol "InvalidEsCalendarIntervalError" needs to be exported by the entry point index.d.ts +// src/plugins/data/server/index.ts:241:1 - (ae-forgotten-export) The symbol "InvalidEsIntervalFormatError" needs to be exported by the entry point index.d.ts +// src/plugins/data/server/index.ts:242:1 - (ae-forgotten-export) The symbol "Ipv4Address" needs to be exported by the entry point index.d.ts +// src/plugins/data/server/index.ts:246:1 - (ae-forgotten-export) The symbol "isValidEsInterval" needs to be exported by the entry point index.d.ts +// src/plugins/data/server/index.ts:247:1 - (ae-forgotten-export) The symbol "isValidInterval" needs to be exported by the entry point index.d.ts +// src/plugins/data/server/index.ts:251:1 - (ae-forgotten-export) The symbol "propFilter" needs to be exported by the entry point index.d.ts +// src/plugins/data/server/index.ts:254:1 - (ae-forgotten-export) The symbol "toAbsoluteDates" needs to be exported by the entry point index.d.ts // src/plugins/data/server/index_patterns/index_patterns_service.ts:50:14 - (ae-forgotten-export) The symbol "IndexPatternsService" needs to be exported by the entry point index.d.ts // src/plugins/data/server/plugin.ts:88:66 - (ae-forgotten-export) The symbol "DataEnhancements" needs to be exported by the entry point index.d.ts // src/plugins/data/server/search/types.ts:78:5 - (ae-forgotten-export) The symbol "ISearchStartSearchSource" needs to be exported by the entry point index.d.ts diff --git a/x-pack/plugins/data_enhanced/common/index.ts b/x-pack/plugins/data_enhanced/common/index.ts index 012f1204da46a..bcea85556d42e 100644 --- a/x-pack/plugins/data_enhanced/common/index.ts +++ b/x-pack/plugins/data_enhanced/common/index.ts @@ -5,7 +5,11 @@ */ export { - IEnhancedEsSearchRequest, - IAsyncSearchRequest, ENHANCED_ES_SEARCH_STRATEGY, + EQL_SEARCH_STRATEGY, + EqlRequestParams, + EqlSearchStrategyRequest, + EqlSearchStrategyResponse, + IAsyncSearchRequest, + IEnhancedEsSearchRequest, } from './search'; diff --git a/x-pack/plugins/data_enhanced/common/search/index.ts b/x-pack/plugins/data_enhanced/common/search/index.ts index 696938a403e89..9f4141dbcae7d 100644 --- a/x-pack/plugins/data_enhanced/common/search/index.ts +++ b/x-pack/plugins/data_enhanced/common/search/index.ts @@ -4,8 +4,4 @@ * you may not use this file except in compliance with the Elastic License. */ -export { - IEnhancedEsSearchRequest, - IAsyncSearchRequest, - ENHANCED_ES_SEARCH_STRATEGY, -} from './types'; +export * from './types'; diff --git a/x-pack/plugins/data_enhanced/common/search/types.ts b/x-pack/plugins/data_enhanced/common/search/types.ts index 24d459ade4bf9..235fcdc325bcb 100644 --- a/x-pack/plugins/data_enhanced/common/search/types.ts +++ b/x-pack/plugins/data_enhanced/common/search/types.ts @@ -4,7 +4,14 @@ * you may not use this file except in compliance with the Elastic License. */ -import { IEsSearchRequest } from '../../../../../src/plugins/data/common'; +import { EqlSearch } from '@elastic/elasticsearch/api/requestParams'; +import { ApiResponse, TransportRequestOptions } from '@elastic/elasticsearch/lib/Transport'; + +import { + IEsSearchRequest, + IKibanaSearchRequest, + IKibanaSearchResponse, +} from '../../../../../src/plugins/data/common'; export const ENHANCED_ES_SEARCH_STRATEGY = 'ese'; @@ -21,3 +28,13 @@ export interface IEnhancedEsSearchRequest extends IEsSearchRequest { */ isRollup?: boolean; } + +export const EQL_SEARCH_STRATEGY = 'eql'; + +export type EqlRequestParams = EqlSearch>; + +export interface EqlSearchStrategyRequest extends IKibanaSearchRequest { + options?: TransportRequestOptions; +} + +export type EqlSearchStrategyResponse = IKibanaSearchResponse>; diff --git a/x-pack/plugins/data_enhanced/server/index.ts b/x-pack/plugins/data_enhanced/server/index.ts index 3c5d5d1e99d13..a0edd2e26ebef 100644 --- a/x-pack/plugins/data_enhanced/server/index.ts +++ b/x-pack/plugins/data_enhanced/server/index.ts @@ -11,6 +11,6 @@ export function plugin(initializerContext: PluginInitializerContext) { return new EnhancedDataServerPlugin(initializerContext); } -export { ENHANCED_ES_SEARCH_STRATEGY } from '../common'; +export { ENHANCED_ES_SEARCH_STRATEGY, EQL_SEARCH_STRATEGY } from '../common'; export { EnhancedDataServerPlugin as Plugin }; diff --git a/x-pack/plugins/data_enhanced/server/plugin.ts b/x-pack/plugins/data_enhanced/server/plugin.ts index a1dff00ddfdd3..ad21216bb7035 100644 --- a/x-pack/plugins/data_enhanced/server/plugin.ts +++ b/x-pack/plugins/data_enhanced/server/plugin.ts @@ -16,10 +16,10 @@ import { PluginStart as DataPluginStart, usageProvider, } from '../../../../src/plugins/data/server'; -import { enhancedEsSearchStrategyProvider } from './search'; +import { enhancedEsSearchStrategyProvider, eqlSearchStrategyProvider } from './search'; import { UsageCollectionSetup } from '../../../../src/plugins/usage_collection/server'; import { getUiSettings } from './ui_settings'; -import { ENHANCED_ES_SEARCH_STRATEGY } from '../common'; +import { ENHANCED_ES_SEARCH_STRATEGY, EQL_SEARCH_STRATEGY } from '../common'; interface SetupDependencies { data: DataPluginSetup; @@ -47,6 +47,11 @@ export class EnhancedDataServerPlugin implements Plugin ({ + body: { + is_partial: false, + is_running: false, + took: 162, + timed_out: false, + hits: { + total: { + value: 1, + relation: 'eq', + }, + sequences: [], + }, + }, +}); + +describe('EQL search strategy', () => { + let mockLogger: Logger; + + beforeEach(() => { + mockLogger = ({ debug: jest.fn() } as unknown) as Logger; + }); + + describe('strategy interface', () => { + it('returns a strategy with a `search` function', async () => { + const eqlSearch = await eqlSearchStrategyProvider(mockLogger); + expect(typeof eqlSearch.search).toBe('function'); + }); + + it('returns a strategy with a `cancel` function', async () => { + const eqlSearch = await eqlSearchStrategyProvider(mockLogger); + expect(typeof eqlSearch.cancel).toBe('function'); + }); + }); + + describe('search()', () => { + let mockEqlSearch: jest.Mock; + let mockEqlGet: jest.Mock; + let mockContext: RequestHandlerContext; + let params: Required['params']; + let options: Required['options']; + + beforeEach(() => { + mockEqlSearch = jest.fn().mockResolvedValueOnce(getMockEqlResponse()); + mockEqlGet = jest.fn().mockResolvedValueOnce(getMockEqlResponse()); + mockContext = ({ + core: { + uiSettings: { + client: { + get: jest.fn(), + }, + }, + elasticsearch: { + client: { + asCurrentUser: { + eql: { + get: mockEqlGet, + search: mockEqlSearch, + }, + }, + }, + }, + }, + } as unknown) as RequestHandlerContext; + params = { + index: 'logstash-*', + body: { query: 'process where 1 == 1' }, + }; + options = { ignore: [400] }; + }); + + describe('async functionality', () => { + it('performs an eql client search with params when no ID is provided', async () => { + const eqlSearch = await eqlSearchStrategyProvider(mockLogger); + await eqlSearch.search(mockContext, { options, params }); + const [[request, requestOptions]] = mockEqlSearch.mock.calls; + + expect(request.index).toEqual('logstash-*'); + expect(request.body).toEqual(expect.objectContaining({ query: 'process where 1 == 1' })); + expect(requestOptions).toEqual(expect.objectContaining({ ignore: [400] })); + }); + + it('retrieves the current request if an id is provided', async () => { + const eqlSearch = await eqlSearchStrategyProvider(mockLogger); + await eqlSearch.search(mockContext, { id: 'my-search-id' }); + const [[requestParams]] = mockEqlGet.mock.calls; + + expect(mockEqlSearch).not.toHaveBeenCalled(); + expect(requestParams).toEqual(expect.objectContaining({ id: 'my-search-id' })); + }); + }); + + describe('arguments', () => { + it('sends along async search options', async () => { + const eqlSearch = await eqlSearchStrategyProvider(mockLogger); + await eqlSearch.search(mockContext, { options, params }); + const [[request]] = mockEqlSearch.mock.calls; + + expect(request).toEqual( + expect.objectContaining({ + wait_for_completion_timeout: '100ms', + keep_alive: '1m', + }) + ); + }); + + it('sends along default search parameters', async () => { + const eqlSearch = await eqlSearchStrategyProvider(mockLogger); + await eqlSearch.search(mockContext, { options, params }); + const [[request]] = mockEqlSearch.mock.calls; + + expect(request).toEqual( + expect.objectContaining({ + ignore_unavailable: true, + ignore_throttled: true, + }) + ); + }); + + it('allows search parameters to be overridden', async () => { + const eqlSearch = await eqlSearchStrategyProvider(mockLogger); + await eqlSearch.search(mockContext, { + options, + params: { + ...params, + wait_for_completion_timeout: '5ms', + keep_on_completion: false, + }, + }); + const [[request]] = mockEqlSearch.mock.calls; + + expect(request).toEqual( + expect.objectContaining({ + wait_for_completion_timeout: '5ms', + keep_alive: '1m', + keep_on_completion: false, + }) + ); + }); + + it('allows search options to be overridden', async () => { + const eqlSearch = await eqlSearchStrategyProvider(mockLogger); + await eqlSearch.search(mockContext, { + options: { ...options, maxRetries: 2, ignore: [300] }, + params, + }); + const [[, requestOptions]] = mockEqlSearch.mock.calls; + + expect(requestOptions).toEqual( + expect.objectContaining({ + max_retries: 2, + ignore: [300], + }) + ); + }); + }); + }); +}); diff --git a/x-pack/plugins/data_enhanced/server/search/eql_search_strategy.ts b/x-pack/plugins/data_enhanced/server/search/eql_search_strategy.ts new file mode 100644 index 0000000000000..5fd3b8df87278 --- /dev/null +++ b/x-pack/plugins/data_enhanced/server/search/eql_search_strategy.ts @@ -0,0 +1,70 @@ +/* + * 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 { Logger } from 'kibana/server'; +import { ApiResponse, TransportRequestPromise } from '@elastic/elasticsearch/lib/Transport'; + +import { + getAsyncOptions, + getDefaultSearchParams, + ISearchStrategy, + toSnakeCase, + shimAbortSignal, +} from '../../../../../src/plugins/data/server'; +import { EqlSearchStrategyRequest, EqlSearchStrategyResponse } from '../../common/search/types'; + +export const eqlSearchStrategyProvider = ( + logger: Logger +): ISearchStrategy => { + return { + cancel: async (context, id) => { + logger.debug(`_eql/delete ${id}`); + await context.core.elasticsearch.client.asCurrentUser.eql.delete({ + id, + }); + }, + search: async (context, request, options) => { + logger.debug(`_eql/search ${JSON.stringify(request.params) || request.id}`); + let promise: TransportRequestPromise; + const eqlClient = context.core.elasticsearch.client.asCurrentUser.eql; + const uiSettingsClient = await context.core.uiSettings.client; + const asyncOptions = getAsyncOptions(); + + if (request.id) { + promise = eqlClient.get({ + id: request.id, + ...toSnakeCase(asyncOptions), + }); + } else { + const { ignoreThrottled, ignoreUnavailable } = await getDefaultSearchParams( + uiSettingsClient + ); + const searchParams = toSnakeCase({ + ignoreThrottled, + ignoreUnavailable, + ...asyncOptions, + ...request.params, + }); + const searchOptions = toSnakeCase({ ...request.options }); + + promise = eqlClient.search( + searchParams as EqlSearchStrategyRequest['params'], + searchOptions as EqlSearchStrategyRequest['options'] + ); + } + + const rawResponse = await shimAbortSignal(promise, options?.abortSignal); + const { id, is_partial: isPartial, is_running: isRunning } = rawResponse.body; + + return { + id, + isPartial, + isRunning, + rawResponse, + }; + }, + }; +}; diff --git a/x-pack/plugins/data_enhanced/server/search/es_search_strategy.ts b/x-pack/plugins/data_enhanced/server/search/es_search_strategy.ts index f3cf67a487a68..7475228724388 100644 --- a/x-pack/plugins/data_enhanced/server/search/es_search_strategy.ts +++ b/x-pack/plugins/data_enhanced/server/search/es_search_strategy.ts @@ -17,6 +17,8 @@ import { getShardTimeout, toSnakeCase, shimHitsTotal, + getAsyncOptions, + shimAbortSignal, } from '../../../../../src/plugins/data/server'; import { IEnhancedEsSearchRequest } from '../../common'; import { @@ -79,11 +81,7 @@ export const enhancedEsSearchStrategyProvider = ( let promise: TransportRequestPromise; const esClient = context.core.elasticsearch.client.asCurrentUser; const uiSettingsClient = await context.core.uiSettings.client; - - const asyncOptions = { - waitForCompletionTimeout: '100ms', // Wait up to 100ms for the response to return - keepAlive: '1m', // Extend the TTL for this search request by one minute - }; + const asyncOptions = getAsyncOptions(); // If we have an ID, then just poll for that ID, otherwise send the entire request body if (!request.id) { @@ -102,9 +100,7 @@ export const enhancedEsSearchStrategyProvider = ( }); } - // Temporary workaround until https://github.com/elastic/elasticsearch-js/issues/1297 - if (options?.abortSignal) options.abortSignal.addEventListener('abort', () => promise.abort()); - const esResponse = await promise; + const esResponse = await shimAbortSignal(promise, options?.abortSignal); const { id, response, is_partial: isPartial, is_running: isRunning } = esResponse.body; return { id, @@ -139,9 +135,7 @@ export const enhancedEsSearchStrategyProvider = ( querystring, }); - // Temporary workaround until https://github.com/elastic/elasticsearch-js/issues/1297 - if (options?.abortSignal) options.abortSignal.addEventListener('abort', () => promise.abort()); - const esResponse = await promise; + const esResponse = await shimAbortSignal(promise, options?.abortSignal); const response = esResponse.body as SearchResponse; return { diff --git a/x-pack/plugins/data_enhanced/server/search/index.ts b/x-pack/plugins/data_enhanced/server/search/index.ts index f914326f30d32..64a28cea358e5 100644 --- a/x-pack/plugins/data_enhanced/server/search/index.ts +++ b/x-pack/plugins/data_enhanced/server/search/index.ts @@ -5,3 +5,4 @@ */ export { enhancedEsSearchStrategyProvider } from './es_search_strategy'; +export { eqlSearchStrategyProvider } from './eql_search_strategy'; From 90b6442ca65b732a128148a6c60d1db8ff8bad1f Mon Sep 17 00:00:00 2001 From: Uladzislau Lasitsa Date: Mon, 5 Oct 2020 19:46:02 +0300 Subject: [PATCH 23/49] [Visualize] Horizontal Bar Graph Visualizations have Vertical Bar Graph Type (#78536) * Fixed useEffect in metric_axes. Update type in params instead of type of vis * Fixed tests * Fixed tests * Update current chart type definition Co-authored-by: sulemanof Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- .../options/metrics_axes/index.test.tsx | 28 ------------------- .../components/options/metrics_axes/index.tsx | 11 +------- .../options/point_series/point_series.tsx | 9 ++++-- src/plugins/vis_type_vislib/public/types.ts | 1 + 4 files changed, 9 insertions(+), 40 deletions(-) diff --git a/src/plugins/vis_type_vislib/public/components/options/metrics_axes/index.test.tsx b/src/plugins/vis_type_vislib/public/components/options/metrics_axes/index.test.tsx index 524792d1460fe..0cc737f19e5c6 100644 --- a/src/plugins/vis_type_vislib/public/components/options/metrics_axes/index.test.tsx +++ b/src/plugins/vis_type_vislib/public/components/options/metrics_axes/index.test.tsx @@ -134,34 +134,6 @@ describe('MetricsAxisOptions component', () => { const updatedSeries = [{ ...chart, data: { id: agg.id, label: agg.makeLabel() } }]; expect(setValue).toHaveBeenCalledWith(SERIES_PARAMS, updatedSeries); }); - - it('should update visType when one seriesParam', () => { - const comp = mount(); - expect(defaultProps.vis.type.type).toBe(ChartTypes.AREA); - - comp.setProps({ - stateParams: { - ...defaultProps.stateParams, - seriesParams: [{ ...chart, type: ChartTypes.LINE }], - }, - }); - - expect(defaultProps.vis.setState).toHaveBeenLastCalledWith({ type: ChartTypes.LINE }); - }); - - it('should set histogram visType when multiple seriesParam', () => { - const comp = mount(); - expect(defaultProps.vis.type.type).toBe(ChartTypes.AREA); - - comp.setProps({ - stateParams: { - ...defaultProps.stateParams, - seriesParams: [chart, { ...chart, type: ChartTypes.LINE }], - }, - }); - - expect(defaultProps.vis.setState).toHaveBeenLastCalledWith({ type: ChartTypes.HISTOGRAM }); - }); }); describe('updateAxisTitle', () => { diff --git a/src/plugins/vis_type_vislib/public/components/options/metrics_axes/index.tsx b/src/plugins/vis_type_vislib/public/components/options/metrics_axes/index.tsx index d885f8fb0b12f..18687404b9114 100644 --- a/src/plugins/vis_type_vislib/public/components/options/metrics_axes/index.tsx +++ b/src/plugins/vis_type_vislib/public/components/options/metrics_axes/index.tsx @@ -18,7 +18,7 @@ */ import React, { useState, useEffect, useCallback, useMemo } from 'react'; -import { cloneDeep, uniq, get } from 'lodash'; +import { cloneDeep, get } from 'lodash'; import { EuiSpacer } from '@elastic/eui'; import { IAggConfig } from 'src/plugins/data/public'; @@ -293,15 +293,6 @@ function MetricsAxisOptions(props: ValidationVisOptionsProps) updateAxisTitle(updatedSeries); }, [metrics, firstValueAxesId, setValue, stateParams.seriesParams, updateAxisTitle]); - const visType = useMemo(() => { - const types = uniq(stateParams.seriesParams.map(({ type }) => type)); - return types.length === 1 ? types[0] : 'histogram'; - }, [stateParams.seriesParams]); - - useEffect(() => { - vis.setState({ ...vis.serialize(), type: visType }); - }, [vis, visType]); - return isTabSelected ? ( <> ) { const { stateParams, setValue, vis } = props; + const currentChartTypes = useMemo(() => uniq(stateParams.seriesParams.map(({ type }) => type)), [ + stateParams.seriesParams, + ]); + return ( <> @@ -68,7 +73,7 @@ function PointSeriesOptions(props: ValidationVisOptionsProps) /> )} - {vis.type.name === ChartTypes.HISTOGRAM && ( + {currentChartTypes.includes(ChartTypes.HISTOGRAM) && ( Date: Mon, 5 Oct 2020 18:51:06 +0200 Subject: [PATCH 24/49] [Ingest Manager] Install uploaded package (#77986) * Refactor: installPackage -> installPackageFromRegistry * Refactor: factor out source-agnostic installation steps * Unpack and cache uploaded zip and tgz files. * Add basic archive verification and parse manifest. * Catch error when zip archive is uploaded as gzip. * Add API integration tests. * Remove unnecessary use of "package key" concept. * Add 'install_source' property to saved object epm-packages. * Adjust tests. * Add API integration test for manifest missing fields. * Refactor loadArchive -> loadArchivePackage. * Refactor caching of package archive content * Get datasets and config templates from manifest files. * Use file paths from archive instead of asset paths from registry. * Correctly load registry packages into cache * Use InstallablePackage instead of RegistryPackage where possible. * Actually install uploaded package. * Add missing field to saved objects in tests. * Adjust unit test to pick buffer extractor. * Adjust unit test. * Fix and re-enable getAsset() test. * Adjust integration tests. * Make error message match test. * Pick data_stream.dataset from manifest if set. * dataset -> data_stream also in comments * Remove unused variable. * Use pkgToPkgKey() where appropriate. * More dataset -> data stream renaming. Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- .../ingest_manager/common/types/models/epm.ts | 20 +- .../server/errors/handlers.test.ts | 20 ++ .../ingest_manager/server/errors/handlers.ts | 10 +- .../ingest_manager/server/errors/index.ts | 4 + .../server/routes/epm/handlers.ts | 28 +- .../server/saved_objects/index.ts | 1 + .../saved_objects/migrations/to_v7_10_0.ts | 10 + .../server/services/epm/archive/index.ts | 332 ++++++++++++++++++ .../elasticsearch/ingest_pipeline/install.ts | 12 +- .../epm/elasticsearch/template/install.ts | 14 +- .../epm/elasticsearch/transform/install.ts | 26 +- .../server/services/epm/fields/field.ts | 4 +- .../epm/kibana/index_pattern/install.ts | 4 +- .../services/epm/packages/assets.test.ts | 43 ++- .../server/services/epm/packages/assets.ts | 31 +- .../ensure_installed_default_packages.test.ts | 1 + .../server/services/epm/packages/get.ts | 9 +- .../epm/packages/get_install_type.test.ts | 2 + .../server/services/epm/packages/index.ts | 5 +- .../server/services/epm/packages/install.ts | 120 ++++++- .../server/services/epm/packages/remove.ts | 5 +- .../server/services/epm/registry/cache.ts | 14 +- .../services/epm/registry/index.test.ts | 19 +- .../server/services/epm/registry/index.ts | 102 +++--- .../ingest_manager/server/types/index.tsx | 2 + .../common/endpoint/generate_data.ts | 1 + .../apis/epm/install_by_upload.ts | 162 +++++++-- .../apis/epm/install_remove_assets.ts | 1 + .../apis/epm/update_assets.ts | 1 + .../direct_upload_packages/apache_0.1.4.zip | Bin 0 -> 601945 bytes ...he_invalid_manifest_invalid_yaml_0.1.4.zip | Bin 0 -> 599739 bytes ...e_invalid_manifest_missing_field_0.1.4.zip | Bin 0 -> 599735 bytes .../apache_invalid_no_manifest_0.1.4.zip | Bin 0 -> 599077 bytes ...apache_invalid_toplevel_mismatch_0.1.4.zip | Bin 0 -> 599746 bytes .../apache_invalid_two_toplevels_0.1.4.zip | Bin 0 -> 600553 bytes 35 files changed, 814 insertions(+), 189 deletions(-) create mode 100644 x-pack/plugins/ingest_manager/server/services/epm/archive/index.ts create mode 100644 x-pack/test/ingest_manager_api_integration/apis/fixtures/direct_upload_packages/apache_0.1.4.zip create mode 100644 x-pack/test/ingest_manager_api_integration/apis/fixtures/direct_upload_packages/apache_invalid_manifest_invalid_yaml_0.1.4.zip create mode 100644 x-pack/test/ingest_manager_api_integration/apis/fixtures/direct_upload_packages/apache_invalid_manifest_missing_field_0.1.4.zip create mode 100644 x-pack/test/ingest_manager_api_integration/apis/fixtures/direct_upload_packages/apache_invalid_no_manifest_0.1.4.zip create mode 100644 x-pack/test/ingest_manager_api_integration/apis/fixtures/direct_upload_packages/apache_invalid_toplevel_mismatch_0.1.4.zip create mode 100644 x-pack/test/ingest_manager_api_integration/apis/fixtures/direct_upload_packages/apache_invalid_two_toplevels_0.1.4.zip diff --git a/x-pack/plugins/ingest_manager/common/types/models/epm.ts b/x-pack/plugins/ingest_manager/common/types/models/epm.ts index d2d1f22dda3a0..ea7fd60d1fa3f 100644 --- a/x-pack/plugins/ingest_manager/common/types/models/epm.ts +++ b/x-pack/plugins/ingest_manager/common/types/models/epm.ts @@ -20,6 +20,7 @@ export enum InstallStatus { } export type InstallType = 'reinstall' | 'reupdate' | 'rollback' | 'update' | 'install'; +export type InstallSource = 'registry' | 'upload'; export type EpmPackageInstallStatus = 'installed' | 'installing'; @@ -49,10 +50,8 @@ export enum AgentAssetType { export type RegistryRelease = 'ga' | 'beta' | 'experimental'; -// from /package/{name} -// type Package struct at https://github.com/elastic/package-registry/blob/master/util/package.go -// https://github.com/elastic/package-registry/blob/master/docs/api/package.json -export interface RegistryPackage { +// Fields common to packages that come from direct upload and the registry +export interface InstallablePackage { name: string; title?: string; version: string; @@ -61,7 +60,6 @@ export interface RegistryPackage { description: string; type: string; categories: string[]; - requirement: RequirementsByServiceName; screenshots?: RegistryImage[]; icons?: RegistryImage[]; assets?: string[]; @@ -69,6 +67,17 @@ export interface RegistryPackage { format_version: string; data_streams?: RegistryDataStream[]; policy_templates?: RegistryPolicyTemplate[]; +} + +// Uploaded package archives don't have extra fields +// Linter complaint disabled because this extra type is meant for better code readability +// eslint-disable-next-line @typescript-eslint/no-empty-interface +export interface ArchivePackage extends InstallablePackage {} + +// Registry packages do have extra fields. +// cf. type Package struct at https://github.com/elastic/package-registry/blob/master/util/package.go +export interface RegistryPackage extends InstallablePackage { + requirement: RequirementsByServiceName; download: string; path: string; } @@ -240,6 +249,7 @@ export interface Installation extends SavedObjectAttributes { install_status: EpmPackageInstallStatus; install_version: string; install_started_at: string; + install_source: InstallSource; } export type Installable = Installed | NotInstalled; diff --git a/x-pack/plugins/ingest_manager/server/errors/handlers.test.ts b/x-pack/plugins/ingest_manager/server/errors/handlers.test.ts index 361386a86d547..272d95c0b3688 100644 --- a/x-pack/plugins/ingest_manager/server/errors/handlers.test.ts +++ b/x-pack/plugins/ingest_manager/server/errors/handlers.test.ts @@ -13,6 +13,7 @@ import { IngestManagerError, RegistryError, PackageNotFoundError, + PackageUnsupportedMediaTypeError, defaultIngestErrorHandler, } from './index'; @@ -101,6 +102,25 @@ describe('defaultIngestErrorHandler', () => { expect(mockContract.logger?.error).toHaveBeenCalledWith(error.message); }); + it('415: PackageUnsupportedMediaType', async () => { + const error = new PackageUnsupportedMediaTypeError('123'); + const response = httpServerMock.createResponseFactory(); + + await defaultIngestErrorHandler({ error, response }); + + // response + expect(response.ok).toHaveBeenCalledTimes(0); + expect(response.customError).toHaveBeenCalledTimes(1); + expect(response.customError).toHaveBeenCalledWith({ + statusCode: 415, + body: { message: error.message }, + }); + + // logging + expect(mockContract.logger?.error).toHaveBeenCalledTimes(1); + expect(mockContract.logger?.error).toHaveBeenCalledWith(error.message); + }); + it('404: PackageNotFoundError', async () => { const error = new PackageNotFoundError('123'); const response = httpServerMock.createResponseFactory(); diff --git a/x-pack/plugins/ingest_manager/server/errors/handlers.ts b/x-pack/plugins/ingest_manager/server/errors/handlers.ts index b621f2dd29331..bcad3f9c022da 100644 --- a/x-pack/plugins/ingest_manager/server/errors/handlers.ts +++ b/x-pack/plugins/ingest_manager/server/errors/handlers.ts @@ -13,7 +13,12 @@ import { } from 'src/core/server'; import { errors as LegacyESErrors } from 'elasticsearch'; import { appContextService } from '../services'; -import { IngestManagerError, RegistryError, PackageNotFoundError } from './index'; +import { + IngestManagerError, + RegistryError, + PackageNotFoundError, + PackageUnsupportedMediaTypeError, +} from './index'; type IngestErrorHandler = ( params: IngestErrorHandlerParams @@ -52,6 +57,9 @@ const getHTTPResponseCode = (error: IngestManagerError): number => { if (error instanceof PackageNotFoundError) { return 404; // Not Found } + if (error instanceof PackageUnsupportedMediaTypeError) { + return 415; // Unsupported Media Type + } return 400; // Bad Request }; diff --git a/x-pack/plugins/ingest_manager/server/errors/index.ts b/x-pack/plugins/ingest_manager/server/errors/index.ts index f495bf551dcff..15ac97f21a17a 100644 --- a/x-pack/plugins/ingest_manager/server/errors/index.ts +++ b/x-pack/plugins/ingest_manager/server/errors/index.ts @@ -18,3 +18,7 @@ export class RegistryConnectionError extends RegistryError {} export class RegistryResponseError extends RegistryError {} export class PackageNotFoundError extends IngestManagerError {} export class PackageOutdatedError extends IngestManagerError {} +export class PackageUnsupportedMediaTypeError extends IngestManagerError {} +export class PackageInvalidArchiveError extends IngestManagerError {} +export class PackageCacheError extends IngestManagerError {} +export class PackageOperationNotSupportedError extends IngestManagerError {} diff --git a/x-pack/plugins/ingest_manager/server/routes/epm/handlers.ts b/x-pack/plugins/ingest_manager/server/routes/epm/handlers.ts index c55979d187f9d..0aa8641fd2a3e 100644 --- a/x-pack/plugins/ingest_manager/server/routes/epm/handlers.ts +++ b/x-pack/plugins/ingest_manager/server/routes/epm/handlers.ts @@ -8,7 +8,6 @@ import { RequestHandler, CustomHttpResponseOptions } from 'src/core/server'; import { GetInfoResponse, InstallPackageResponse, - MessageResponse, DeletePackageResponse, GetCategoriesResponse, GetPackagesResponse, @@ -35,8 +34,9 @@ import { getFile, getPackageInfo, handleInstallPackageFailure, - installPackage, isBulkInstallError, + installPackageFromRegistry, + installPackageByUpload, removeInstallation, getLimitedPackages, getInstallationObject, @@ -148,7 +148,7 @@ export const installPackageFromRegistryHandler: RequestHandler< const { pkgName, pkgVersion } = splitPkgKey(pkgkey); const installedPkg = await getInstallationObject({ savedObjectsClient, pkgName }); try { - const res = await installPackage({ + const res = await installPackageFromRegistry({ savedObjectsClient, pkgkey, callCluster, @@ -212,10 +212,24 @@ export const installPackageByUploadHandler: RequestHandler< undefined, TypeOf > = async (context, request, response) => { - const body: MessageResponse = { - response: 'package upload was received ok, but not installed (not implemented yet)', - }; - return response.ok({ body }); + const savedObjectsClient = context.core.savedObjects.client; + const callCluster = context.core.elasticsearch.legacy.client.callAsCurrentUser; + const contentType = request.headers['content-type'] as string; // from types it could also be string[] or undefined but this is checked later + const archiveBuffer = Buffer.from(request.body); + try { + const res = await installPackageByUpload({ + savedObjectsClient, + callCluster, + archiveBuffer, + contentType, + }); + const body: InstallPackageResponse = { + response: res, + }; + return response.ok({ body }); + } catch (error) { + return defaultIngestErrorHandler({ error, response }); + } }; export const deletePackageHandler: RequestHandler, + Installation +> = (installationDoc) => { + installationDoc.attributes.install_source = 'registry'; + + return installationDoc; +}; diff --git a/x-pack/plugins/ingest_manager/server/services/epm/archive/index.ts b/x-pack/plugins/ingest_manager/server/services/epm/archive/index.ts new file mode 100644 index 0000000000000..91ed489b3a5bb --- /dev/null +++ b/x-pack/plugins/ingest_manager/server/services/epm/archive/index.ts @@ -0,0 +1,332 @@ +/* + * 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 yaml from 'js-yaml'; +import { uniq } from 'lodash'; + +import { + ArchivePackage, + RegistryPolicyTemplate, + RegistryDataStream, + RegistryInput, + RegistryStream, + RegistryVarsEntry, +} from '../../../../common/types'; +import { PackageInvalidArchiveError, PackageUnsupportedMediaTypeError } from '../../../errors'; +import { pkgToPkgKey } from '../registry'; +import { cacheGet, cacheSet, setArchiveFilelist } from '../registry/cache'; +import { unzipBuffer, untarBuffer, ArchiveEntry } from '../registry/extract'; + +export async function loadArchivePackage({ + archiveBuffer, + contentType, +}: { + archiveBuffer: Buffer; + contentType: string; +}): Promise<{ paths: string[]; archivePackageInfo: ArchivePackage }> { + const paths = await unpackArchiveToCache(archiveBuffer, contentType); + const archivePackageInfo = parseAndVerifyArchive(paths); + setArchiveFilelist(archivePackageInfo.name, archivePackageInfo.version, paths); + + return { + paths, + archivePackageInfo, + }; +} + +function getBufferExtractorForContentType(contentType: string) { + if (contentType === 'application/gzip') { + return untarBuffer; + } else if (contentType === 'application/zip') { + return unzipBuffer; + } else { + throw new PackageUnsupportedMediaTypeError( + `Unsupported media type ${contentType}. Please use 'application/gzip' or 'application/zip'` + ); + } +} + +export async function unpackArchiveToCache( + archiveBuffer: Buffer, + contentType: string, + filter = (entry: ArchiveEntry): boolean => true +): Promise { + const bufferExtractor = getBufferExtractorForContentType(contentType); + const paths: string[] = []; + try { + await bufferExtractor(archiveBuffer, filter, (entry: ArchiveEntry) => { + const { path, buffer } = entry; + // skip directories + if (path.slice(-1) === '/') return; + if (buffer) { + cacheSet(path, buffer); + paths.push(path); + } + }); + } catch (error) { + throw new PackageInvalidArchiveError( + `Error during extraction of uploaded package: ${error}. Assumed content type was ${contentType}, check if this matches the archive type.` + ); + } + + // While unpacking a tar.gz file with unzipBuffer() will result in a thrown error in the try-catch above, + // unpacking a zip file with untarBuffer() just results in nothing. + if (paths.length === 0) { + throw new PackageInvalidArchiveError( + `Uploaded archive seems empty. Assumed content type was ${contentType}, check if this matches the archive type.` + ); + } + return paths; +} + +// TODO: everything below performs verification of manifest.yml files, and hence duplicates functionality already implemented in the +// package registry. At some point this should probably be replaced (or enhanced) with verification based on +// https://github.com/elastic/package-spec/ + +function parseAndVerifyArchive(paths: string[]): ArchivePackage { + // The top-level directory must match pkgName-pkgVersion, and no other top-level files or directories may be present + const toplevelDir = paths[0].split('/')[0]; + paths.forEach((path) => { + if (path.split('/')[0] !== toplevelDir) { + throw new PackageInvalidArchiveError('Package contains more than one top-level directory.'); + } + }); + + // The package must contain a manifest file ... + const manifestFile = `${toplevelDir}/manifest.yml`; + const manifestBuffer = cacheGet(manifestFile); + if (!paths.includes(manifestFile) || !manifestBuffer) { + throw new PackageInvalidArchiveError('Package must contain a top-level manifest.yml file.'); + } + + // ... which must be valid YAML + let manifest; + try { + manifest = yaml.load(manifestBuffer.toString()); + } catch (error) { + throw new PackageInvalidArchiveError(`Could not parse top-level package manifest: ${error}.`); + } + + // Package name and version from the manifest must match those from the toplevel directory + const pkgKey = pkgToPkgKey({ name: manifest.name, version: manifest.version }); + if (toplevelDir !== pkgKey) { + throw new PackageInvalidArchiveError( + `Name ${manifest.name} and version ${manifest.version} do not match top-level directory ${toplevelDir}` + ); + } + + const { name, version, description, type, categories, format_version: formatVersion } = manifest; + // check for mandatory fields + if (!(name && version && description && type && categories && formatVersion)) { + throw new PackageInvalidArchiveError( + 'Invalid top-level package manifest: one or more fields missing of name, version, description, type, categories, format_version' + ); + } + + const dataStreams = parseAndVerifyDataStreams(paths, name, version); + const policyTemplates = parseAndVerifyPolicyTemplates(manifest); + + return { + name, + version, + description, + type, + categories, + format_version: formatVersion, + data_streams: dataStreams, + policy_templates: policyTemplates, + }; +} + +function parseAndVerifyDataStreams( + paths: string[], + pkgName: string, + pkgVersion: string +): RegistryDataStream[] { + // A data stream is made up of a subdirectory of name-version/data_stream/, containing a manifest.yml + let dataStreamPaths: string[] = []; + const dataStreams: RegistryDataStream[] = []; + const pkgKey = pkgToPkgKey({ name: pkgName, version: pkgVersion }); + + // pick all paths matching name-version/data_stream/DATASTREAM_PATH/... + // from those, pick all unique data stream paths + paths + .filter((path) => path.startsWith(`${pkgKey}/data_stream/`)) + .forEach((path) => { + const parts = path.split('/'); + if (parts.length > 2 && parts[2]) dataStreamPaths.push(parts[2]); + }); + + dataStreamPaths = uniq(dataStreamPaths); + + dataStreamPaths.forEach((dataStreamPath) => { + const manifestFile = `${pkgKey}/data_stream/${dataStreamPath}/manifest.yml`; + const manifestBuffer = cacheGet(manifestFile); + if (!paths.includes(manifestFile) || !manifestBuffer) { + throw new PackageInvalidArchiveError( + `No manifest.yml file found for data stream '${dataStreamPath}'` + ); + } + + let manifest; + try { + manifest = yaml.load(manifestBuffer.toString()); + } catch (error) { + throw new PackageInvalidArchiveError( + `Could not parse package manifest for data stream '${dataStreamPath}': ${error}.` + ); + } + + const { + title: dataStreamTitle, + release, + ingest_pipeline: ingestPipeline, + type, + dataset, + } = manifest; + if (!(dataStreamTitle && release && type)) { + throw new PackageInvalidArchiveError( + `Invalid manifest for data stream '${dataStreamPath}': one or more fields missing of 'title', 'release', 'type'` + ); + } + const streams = parseAndVerifyStreams(manifest, dataStreamPath); + + // default ingest pipeline name see https://github.com/elastic/package-registry/blob/master/util/dataset.go#L26 + return dataStreams.push({ + dataset: dataset || `${pkgName}.${dataStreamPath}`, + title: dataStreamTitle, + release, + package: pkgName, + ingest_pipeline: ingestPipeline || 'default', + path: dataStreamPath, + type, + streams, + }); + }); + + return dataStreams; +} + +function parseAndVerifyStreams(manifest: any, dataStreamPath: string): RegistryStream[] { + const streams: RegistryStream[] = []; + const manifestStreams = manifest.streams; + if (manifestStreams && manifestStreams.length > 0) { + manifestStreams.forEach((manifestStream: any) => { + const { + input, + title: streamTitle, + description, + enabled, + vars: manifestVars, + template_path: templatePath, + } = manifestStream; + if (!(input && streamTitle)) { + throw new PackageInvalidArchiveError( + `Invalid manifest for data stream ${dataStreamPath}: stream is missing one or more fields of: input, title` + ); + } + const vars = parseAndVerifyVars(manifestVars, `data stream ${dataStreamPath}`); + // default template path name see https://github.com/elastic/package-registry/blob/master/util/dataset.go#L143 + streams.push({ + input, + title: streamTitle, + description, + enabled, + vars, + template_path: templatePath || 'stream.yml.hbs', + }); + }); + } + return streams; +} + +function parseAndVerifyVars(manifestVars: any[], location: string): RegistryVarsEntry[] { + const vars: RegistryVarsEntry[] = []; + if (manifestVars && manifestVars.length > 0) { + manifestVars.forEach((manifestVar) => { + const { + name, + title: varTitle, + description, + type, + required, + show_user: showUser, + multi, + def, + os, + } = manifestVar; + if (!(name && type)) { + throw new PackageInvalidArchiveError( + `Invalid var definition for ${location}: one of mandatory fields 'name' and 'type' missing in var: ${manifestVar}` + ); + } + vars.push({ + name, + title: varTitle, + description, + type, + required, + show_user: showUser, + multi, + default: def, + os, + }); + }); + } + return vars; +} + +function parseAndVerifyPolicyTemplates(manifest: any): RegistryPolicyTemplate[] { + const policyTemplates: RegistryPolicyTemplate[] = []; + const manifestPolicyTemplates = manifest.policy_templates; + if (manifestPolicyTemplates && manifestPolicyTemplates > 0) { + manifestPolicyTemplates.forEach((policyTemplate: any) => { + const { name, title: policyTemplateTitle, description, inputs, multiple } = policyTemplate; + if (!(name && policyTemplateTitle && description && inputs)) { + throw new PackageInvalidArchiveError( + `Invalid top-level manifest: one of mandatory fields 'name', 'title', 'description', 'input' missing in policy template: ${policyTemplate}` + ); + } + + const parsedInputs = parseAndVerifyInputs(inputs, `config template ${name}`); + + // defaults to true if undefined, but may be explicitly set to false. + let parsedMultiple = true; + if (typeof multiple === 'boolean' && multiple === false) parsedMultiple = false; + + policyTemplates.push({ + name, + title: policyTemplateTitle, + description, + inputs: parsedInputs, + multiple: parsedMultiple, + }); + }); + } + return policyTemplates; +} + +function parseAndVerifyInputs(manifestInputs: any, location: string): RegistryInput[] { + const inputs: RegistryInput[] = []; + if (manifestInputs && manifestInputs.length > 0) { + manifestInputs.forEach((input: any) => { + const { type, title: inputTitle, description, vars } = input; + if (!(type && inputTitle)) { + throw new PackageInvalidArchiveError( + `Invalid top-level manifest: one of mandatory fields 'type', 'title' missing in input: ${input}` + ); + } + const parsedVars = parseAndVerifyVars(vars, location); + inputs.push({ + type, + title: inputTitle, + description, + vars: parsedVars, + }); + }); + } + return inputs; +} diff --git a/x-pack/plugins/ingest_manager/server/services/epm/elasticsearch/ingest_pipeline/install.ts b/x-pack/plugins/ingest_manager/server/services/epm/elasticsearch/ingest_pipeline/install.ts index 6088bcb71f878..43c0179c0aa8a 100644 --- a/x-pack/plugins/ingest_manager/server/services/epm/elasticsearch/ingest_pipeline/install.ts +++ b/x-pack/plugins/ingest_manager/server/services/epm/elasticsearch/ingest_pipeline/install.ts @@ -9,7 +9,7 @@ import { EsAssetReference, RegistryDataStream, ElasticsearchAssetType, - RegistryPackage, + InstallablePackage, } from '../../../../types'; import * as Registry from '../../registry'; import { CallESAsCurrentUser } from '../../../../types'; @@ -22,7 +22,7 @@ interface RewriteSubstitution { } export const installPipelines = async ( - registryPackage: RegistryPackage, + installablePackage: InstallablePackage, paths: string[], callCluster: CallESAsCurrentUser, savedObjectsClient: SavedObjectsClientContract @@ -30,7 +30,7 @@ export const installPipelines = async ( // unlike other ES assets, pipeline names are versioned so after a template is updated // it can be created pointing to the new template, without removing the old one and effecting data // so do not remove the currently installed pipelines here - const dataStreams = registryPackage.data_streams; + const dataStreams = installablePackage.data_streams; if (!dataStreams?.length) return []; const pipelinePaths = paths.filter((path) => isPipeline(path)); // get and save pipeline refs before installing pipelines @@ -43,14 +43,14 @@ export const installPipelines = async ( const nameForInstallation = getPipelineNameForInstallation({ pipelineName: name, dataStream, - packageVersion: registryPackage.version, + packageVersion: installablePackage.version, }); return { id: nameForInstallation, type: ElasticsearchAssetType.ingestPipeline }; }); acc.push(...pipelineObjectRefs); return acc; }, []); - await saveInstalledEsRefs(savedObjectsClient, registryPackage.name, pipelineRefs); + await saveInstalledEsRefs(savedObjectsClient, installablePackage.name, pipelineRefs); const pipelines = dataStreams.reduce>>((acc, dataStream) => { if (dataStream.ingest_pipeline) { acc.push( @@ -58,7 +58,7 @@ export const installPipelines = async ( dataStream, callCluster, paths: pipelinePaths, - pkgVersion: registryPackage.version, + pkgVersion: installablePackage.version, }) ); } diff --git a/x-pack/plugins/ingest_manager/server/services/epm/elasticsearch/template/install.ts b/x-pack/plugins/ingest_manager/server/services/epm/elasticsearch/template/install.ts index 8f80feb268910..d32d5b8093c52 100644 --- a/x-pack/plugins/ingest_manager/server/services/epm/elasticsearch/template/install.ts +++ b/x-pack/plugins/ingest_manager/server/services/epm/elasticsearch/template/install.ts @@ -8,10 +8,10 @@ import Boom from 'boom'; import { SavedObjectsClientContract } from 'src/core/server'; import { RegistryDataStream, - RegistryPackage, ElasticsearchAssetType, TemplateRef, RegistryElasticsearch, + InstallablePackage, } from '../../../../types'; import { CallESAsCurrentUser } from '../../../../types'; import { Field, loadFieldsFromYaml, processFields } from '../../fields/field'; @@ -21,7 +21,7 @@ import * as Registry from '../../registry'; import { removeAssetsFromInstalledEsByType, saveInstalledEsRefs } from '../../packages/install'; export const installTemplates = async ( - registryPackage: RegistryPackage, + installablePackage: InstallablePackage, callCluster: CallESAsCurrentUser, paths: string[], savedObjectsClient: SavedObjectsClientContract @@ -35,11 +35,11 @@ export const installTemplates = async ( // remove package installation's references to index templates await removeAssetsFromInstalledEsByType( savedObjectsClient, - registryPackage.name, + installablePackage.name, ElasticsearchAssetType.indexTemplate ); // build templates per data stream from yml files - const dataStreams = registryPackage.data_streams; + const dataStreams = installablePackage.data_streams; if (!dataStreams) return []; // get template refs to save const installedTemplateRefs = dataStreams.map((dataStream) => ({ @@ -48,14 +48,14 @@ export const installTemplates = async ( })); // add package installation's references to index templates - await saveInstalledEsRefs(savedObjectsClient, registryPackage.name, installedTemplateRefs); + await saveInstalledEsRefs(savedObjectsClient, installablePackage.name, installedTemplateRefs); if (dataStreams) { const installTemplatePromises = dataStreams.reduce>>( (acc, dataStream) => { acc.push( installTemplateForDataStream({ - pkg: registryPackage, + pkg: installablePackage, callCluster, dataStream, }) @@ -171,7 +171,7 @@ export async function installTemplateForDataStream({ callCluster, dataStream, }: { - pkg: RegistryPackage; + pkg: InstallablePackage; callCluster: CallESAsCurrentUser; dataStream: RegistryDataStream; }): Promise { diff --git a/x-pack/plugins/ingest_manager/server/services/epm/elasticsearch/transform/install.ts b/x-pack/plugins/ingest_manager/server/services/epm/elasticsearch/transform/install.ts index d8aff10492595..89811783a7f79 100644 --- a/x-pack/plugins/ingest_manager/server/services/epm/elasticsearch/transform/install.ts +++ b/x-pack/plugins/ingest_manager/server/services/epm/elasticsearch/transform/install.ts @@ -11,7 +11,7 @@ import * as Registry from '../../registry'; import { ElasticsearchAssetType, EsAssetReference, - RegistryPackage, + InstallablePackage, } from '../../../../../common/types/models'; import { CallESAsCurrentUser } from '../../../../types'; import { getInstallation } from '../../packages'; @@ -24,14 +24,14 @@ interface TransformInstallation { } export const installTransform = async ( - registryPackage: RegistryPackage, + installablePackage: InstallablePackage, paths: string[], callCluster: CallESAsCurrentUser, savedObjectsClient: SavedObjectsClientContract ) => { const installation = await getInstallation({ savedObjectsClient, - pkgName: registryPackage.name, + pkgName: installablePackage.name, }); let previousInstalledTransformEsAssets: EsAssetReference[] = []; if (installation) { @@ -46,13 +46,13 @@ export const installTransform = async ( previousInstalledTransformEsAssets.map((asset) => asset.id) ); - const installNameSuffix = `${registryPackage.version}`; + const installNameSuffix = `${installablePackage.version}`; const transformPaths = paths.filter((path) => isTransform(path)); let installedTransforms: EsAssetReference[] = []; if (transformPaths.length > 0) { const transformRefs = transformPaths.reduce((acc, path) => { acc.push({ - id: getTransformNameForInstallation(registryPackage, path, installNameSuffix), + id: getTransformNameForInstallation(installablePackage, path, installNameSuffix), type: ElasticsearchAssetType.transform, }); @@ -60,11 +60,15 @@ export const installTransform = async ( }, []); // get and save transform refs before installing transforms - await saveInstalledEsRefs(savedObjectsClient, registryPackage.name, transformRefs); + await saveInstalledEsRefs(savedObjectsClient, installablePackage.name, transformRefs); const transforms: TransformInstallation[] = transformPaths.map((path: string) => { return { - installationName: getTransformNameForInstallation(registryPackage, path, installNameSuffix), + installationName: getTransformNameForInstallation( + installablePackage, + path, + installNameSuffix + ), content: getAsset(path).toString('utf-8'), }; }); @@ -79,14 +83,14 @@ export const installTransform = async ( if (previousInstalledTransformEsAssets.length > 0) { const currentInstallation = await getInstallation({ savedObjectsClient, - pkgName: registryPackage.name, + pkgName: installablePackage.name, }); // remove the saved object reference await deleteTransformRefs( savedObjectsClient, currentInstallation?.installed_es || [], - registryPackage.name, + installablePackage.name, previousInstalledTransformEsAssets.map((asset) => asset.id), installedTransforms.map((installed) => installed.id) ); @@ -123,12 +127,12 @@ async function handleTransformInstall({ } const getTransformNameForInstallation = ( - registryPackage: RegistryPackage, + installablePackage: InstallablePackage, path: string, suffix: string ) => { const pathPaths = path.split('/'); const filename = pathPaths?.pop()?.split('.')[0]; const folderName = pathPaths?.pop(); - return `${registryPackage.name}.${folderName}-${filename}-${suffix}`; + return `${installablePackage.name}.${folderName}-${filename}-${suffix}`; }; diff --git a/x-pack/plugins/ingest_manager/server/services/epm/fields/field.ts b/x-pack/plugins/ingest_manager/server/services/epm/fields/field.ts index 5913302e77ba6..06091ab3cedb0 100644 --- a/x-pack/plugins/ingest_manager/server/services/epm/fields/field.ts +++ b/x-pack/plugins/ingest_manager/server/services/epm/fields/field.ts @@ -5,7 +5,7 @@ */ import { safeLoad } from 'js-yaml'; -import { RegistryPackage } from '../../../types'; +import { InstallablePackage } from '../../../types'; import { getAssetsData } from '../packages/assets'; // This should become a copy of https://github.com/elastic/beats/blob/d9a4c9c240a9820fab15002592e5bb6db318543b/libbeat/mapping/field.go#L39 @@ -253,7 +253,7 @@ const isFields = (path: string) => { */ export const loadFieldsFromYaml = async ( - pkg: RegistryPackage, + pkg: InstallablePackage, datasetName?: string ): Promise => { // Fetch all field definition files diff --git a/x-pack/plugins/ingest_manager/server/services/epm/kibana/index_pattern/install.ts b/x-pack/plugins/ingest_manager/server/services/epm/kibana/index_pattern/install.ts index bde542412f123..2aa28d23cf857 100644 --- a/x-pack/plugins/ingest_manager/server/services/epm/kibana/index_pattern/install.ts +++ b/x-pack/plugins/ingest_manager/server/services/epm/kibana/index_pattern/install.ts @@ -89,7 +89,9 @@ export async function installIndexPatterns( // TODO: move to install package // cache all installed packages if they don't exist const packagePromises = installedPackages.map((pkg) => - Registry.ensureCachedArchiveInfo(pkg.pkgName, pkg.pkgVersion) + // TODO: this hard-codes 'registry' as installSource, so uploaded packages are ignored + // and their fields will be removed from the generated index patterns after this runs. + Registry.ensureCachedArchiveInfo(pkg.pkgName, pkg.pkgVersion, 'registry') ); await Promise.all(packagePromises); diff --git a/x-pack/plugins/ingest_manager/server/services/epm/packages/assets.test.ts b/x-pack/plugins/ingest_manager/server/services/epm/packages/assets.test.ts index 78b42b03be831..eb43bef72db70 100644 --- a/x-pack/plugins/ingest_manager/server/services/epm/packages/assets.test.ts +++ b/x-pack/plugins/ingest_manager/server/services/epm/packages/assets.test.ts @@ -4,34 +4,41 @@ * you may not use this file except in compliance with the Elastic License. */ -import { RegistryPackage } from '../../../types'; +import { InstallablePackage } from '../../../types'; import { getAssets } from './assets'; +import { getArchiveFilelist } from '../registry/cache'; + +jest.mock('../registry/cache', () => { + return { + getArchiveFilelist: jest.fn(), + }; +}); + +const mockedGetArchiveFilelist = getArchiveFilelist as jest.Mock; +mockedGetArchiveFilelist.mockImplementation(() => [ + 'coredns-1.0.1/data_stream/log/elasticsearch/ingest-pipeline/pipeline-plaintext.json', + 'coredns-1.0.1/data_stream/log/elasticsearch/ingest-pipeline/pipeline-json.json', +]); const tests = [ { package: { - assets: [ - '/package/coredns/1.0.1/data_stream/log/elasticsearch/ingest-pipeline/pipeline-plaintext.json', - '/package/coredns/1.0.1/data_stream/log/elasticsearch/ingest-pipeline/pipeline-json.json', - ], - path: '/package/coredns/1.0.1', + name: 'coredns', + version: '1.0.1', }, dataset: 'log', filter: (path: string) => { return true; }, expected: [ - '/package/coredns/1.0.1/data_stream/log/elasticsearch/ingest-pipeline/pipeline-plaintext.json', - '/package/coredns/1.0.1/data_stream/log/elasticsearch/ingest-pipeline/pipeline-json.json', + 'coredns-1.0.1/data_stream/log/elasticsearch/ingest-pipeline/pipeline-plaintext.json', + 'coredns-1.0.1/data_stream/log/elasticsearch/ingest-pipeline/pipeline-json.json', ], }, { package: { - assets: [ - '/package/coredns-1.0.1/data_stream/log/elasticsearch/ingest-pipeline/pipeline-plaintext.json', - '/package/coredns-1.0.1/data_stream/log/elasticsearch/ingest-pipeline/pipeline-json.json', - ], - path: '/package/coredns/1.0.1', + name: 'coredns', + version: '1.0.1', }, // Non existant dataset dataset: 'foo', @@ -42,10 +49,8 @@ const tests = [ }, { package: { - assets: [ - '/package/coredns-1.0.1/data_stream/log/elasticsearch/ingest-pipeline/pipeline-plaintext.json', - '/package/coredns-1.0.1/data_stream/log/elasticsearch/ingest-pipeline/pipeline-json.json', - ], + name: 'coredns', + version: '1.0.1', }, // Filter which does not exist filter: (path: string) => { @@ -57,8 +62,8 @@ const tests = [ test('testGetAssets', () => { for (const value of tests) { - // as needed to pretent it is a RegistryPackage - const assets = getAssets(value.package as RegistryPackage, value.filter, value.dataset); + // as needed to pretend it is an InstallablePackage + const assets = getAssets(value.package as InstallablePackage, value.filter, value.dataset); expect(assets).toStrictEqual(value.expected); } }); diff --git a/x-pack/plugins/ingest_manager/server/services/epm/packages/assets.ts b/x-pack/plugins/ingest_manager/server/services/epm/packages/assets.ts index a8abc12917781..856f04c0c9b67 100644 --- a/x-pack/plugins/ingest_manager/server/services/epm/packages/assets.ts +++ b/x-pack/plugins/ingest_manager/server/services/epm/packages/assets.ts @@ -4,9 +4,9 @@ * you may not use this file except in compliance with the Elastic License. */ -import { RegistryPackage } from '../../../types'; +import { InstallablePackage } from '../../../types'; import * as Registry from '../registry'; -import { ensureCachedArchiveInfo } from '../registry'; +import { getArchiveFilelist } from '../registry/cache'; // paths from RegistryPackage are routes to the assets on EPR // e.g. `/package/nginx/1.2.0/data_stream/access/fields/fields.yml` @@ -14,30 +14,26 @@ import { ensureCachedArchiveInfo } from '../registry'; // e.g. `nginx-1.2.0/data_stream/access/fields/fields.yml` // RegistryPackage paths have a `/package/` prefix compared to ArchiveEntry paths // and different package and version structure -const EPR_PATH_PREFIX = '/package'; -function registryPathToArchivePath(registryPath: RegistryPackage['path']): string { - const path = registryPath.replace(`${EPR_PATH_PREFIX}/`, ''); - const [pkgName, pkgVersion] = path.split('/'); - return path.replace(`${pkgName}/${pkgVersion}`, `${pkgName}-${pkgVersion}`); -} export function getAssets( - packageInfo: RegistryPackage, + packageInfo: InstallablePackage, filter = (path: string): boolean => true, datasetName?: string ): string[] { const assets: string[] = []; - if (!packageInfo?.assets) return assets; + const paths = getArchiveFilelist(packageInfo.name, packageInfo.version); + // TODO: might be better to throw a PackageCacheError here + if (!paths || paths.length === 0) return assets; // Skip directories - for (const path of packageInfo.assets) { + for (const path of paths) { if (path.endsWith('/')) { continue; } // if dataset, filter for them if (datasetName) { - const comparePath = `${packageInfo.path}/data_stream/${datasetName}/`; + const comparePath = `${packageInfo.name}-${packageInfo.version}/data_stream/${datasetName}/`; if (!path.includes(comparePath)) { continue; } @@ -52,21 +48,20 @@ export function getAssets( } export async function getAssetsData( - packageInfo: RegistryPackage, + packageInfo: InstallablePackage, filter = (path: string): boolean => true, datasetName?: string ): Promise { // TODO: Needs to be called to fill the cache but should not be required - await ensureCachedArchiveInfo(packageInfo.name, packageInfo.version); + await Registry.ensureCachedArchiveInfo(packageInfo.name, packageInfo.version, 'registry'); // Gather all asset data const assets = getAssets(packageInfo, filter, datasetName); - const entries: Registry.ArchiveEntry[] = assets.map((registryPath) => { - const archivePath = registryPathToArchivePath(registryPath); - const buffer = Registry.getAsset(archivePath); + const entries: Registry.ArchiveEntry[] = assets.map((path) => { + const buffer = Registry.getAsset(path); - return { path: registryPath, buffer }; + return { path, buffer }; }); return entries; diff --git a/x-pack/plugins/ingest_manager/server/services/epm/packages/ensure_installed_default_packages.test.ts b/x-pack/plugins/ingest_manager/server/services/epm/packages/ensure_installed_default_packages.test.ts index f0b487ad59774..aaff5df39bac3 100644 --- a/x-pack/plugins/ingest_manager/server/services/epm/packages/ensure_installed_default_packages.test.ts +++ b/x-pack/plugins/ingest_manager/server/services/epm/packages/ensure_installed_default_packages.test.ts @@ -49,6 +49,7 @@ const mockInstallation: SavedObject = { install_status: 'installed', install_version: '1.0.0', install_started_at: new Date().toISOString(), + install_source: 'registry', }, }; diff --git a/x-pack/plugins/ingest_manager/server/services/epm/packages/get.ts b/x-pack/plugins/ingest_manager/server/services/epm/packages/get.ts index 2d11b6157804f..74ee25eace736 100644 --- a/x-pack/plugins/ingest_manager/server/services/epm/packages/get.ts +++ b/x-pack/plugins/ingest_manager/server/services/epm/packages/get.ts @@ -101,11 +101,14 @@ export async function getPackageInfo(options: { pkgVersion: string; }): Promise { const { savedObjectsClient, pkgName, pkgVersion } = options; - const [item, savedObject, latestPackage, assets] = await Promise.all([ - Registry.fetchInfo(pkgName, pkgVersion), + const [ + savedObject, + latestPackage, + { paths: assets, registryPackageInfo: item }, + ] = await Promise.all([ getInstallationObject({ savedObjectsClient, pkgName }), Registry.fetchFindLatestPackage(pkgName), - Registry.getArchiveInfo(pkgName, pkgVersion), + Registry.loadRegistryPackage(pkgName, pkgVersion), ]); // add properties that aren't (or aren't yet) on Registry response diff --git a/x-pack/plugins/ingest_manager/server/services/epm/packages/get_install_type.test.ts b/x-pack/plugins/ingest_manager/server/services/epm/packages/get_install_type.test.ts index cce4b7fee8fd7..a04bfaafe7570 100644 --- a/x-pack/plugins/ingest_manager/server/services/epm/packages/get_install_type.test.ts +++ b/x-pack/plugins/ingest_manager/server/services/epm/packages/get_install_type.test.ts @@ -21,6 +21,7 @@ const mockInstallation: SavedObject = { install_status: 'installed', install_version: '1.0.0', install_started_at: new Date().toISOString(), + install_source: 'registry', }, }; const mockInstallationUpdateFail: SavedObject = { @@ -37,6 +38,7 @@ const mockInstallationUpdateFail: SavedObject = { install_status: 'installing', install_version: '1.0.1', install_started_at: new Date().toISOString(), + install_source: 'registry', }, }; diff --git a/x-pack/plugins/ingest_manager/server/services/epm/packages/index.ts b/x-pack/plugins/ingest_manager/server/services/epm/packages/index.ts index 94aa969c2d2b8..92070f3c2fafc 100644 --- a/x-pack/plugins/ingest_manager/server/services/epm/packages/index.ts +++ b/x-pack/plugins/ingest_manager/server/services/epm/packages/index.ts @@ -27,9 +27,10 @@ export { export { BulkInstallResponse, - handleInstallPackageFailure, - installPackage, IBulkInstallPackageError, + handleInstallPackageFailure, + installPackageFromRegistry, + installPackageByUpload, ensureInstalledPackage, } from './install'; export { removeInstallation } from './remove'; diff --git a/x-pack/plugins/ingest_manager/server/services/epm/packages/install.ts b/x-pack/plugins/ingest_manager/server/services/epm/packages/install.ts index d7262ebb66b2e..a7514d1075d78 100644 --- a/x-pack/plugins/ingest_manager/server/services/epm/packages/install.ts +++ b/x-pack/plugins/ingest_manager/server/services/epm/packages/install.ts @@ -8,7 +8,7 @@ import { SavedObject, SavedObjectsClientContract } from 'src/core/server'; import semver from 'semver'; import Boom from 'boom'; import { UnwrapPromise } from '@kbn/utility-types'; -import { BulkInstallPackageInfo } from '../../../../common'; +import { BulkInstallPackageInfo, InstallablePackage, InstallSource } from '../../../../common'; import { PACKAGES_SAVED_OBJECT_TYPE, MAX_TIME_COMPLETE_INSTALL } from '../../../constants'; import { AssetReference, @@ -42,10 +42,15 @@ import { } from '../kibana/assets/install'; import { updateCurrentWriteIndices } from '../elasticsearch/template/template'; import { deleteKibanaSavedObjectsAssets, removeInstallation } from './remove'; -import { IngestManagerError, PackageOutdatedError } from '../../../errors'; +import { + IngestManagerError, + PackageOperationNotSupportedError, + PackageOutdatedError, +} from '../../../errors'; import { getPackageSavedObjects } from './get'; import { installTransform } from '../elasticsearch/transform/install'; import { appContextService } from '../../app_context'; +import { loadArchivePackage } from '../archive'; export async function installLatestPackage(options: { savedObjectsClient: SavedObjectsClientContract; @@ -59,7 +64,7 @@ export async function installLatestPackage(options: { name: latestPackage.name, version: latestPackage.version, }); - return installPackage({ savedObjectsClient, pkgkey, callCluster }); + return installPackageFromRegistry({ savedObjectsClient, pkgkey, callCluster }); } catch (err) { throw err; } @@ -155,7 +160,7 @@ export async function handleInstallPackageFailure({ } const prevVersion = `${pkgName}-${installedPkg.attributes.version}`; logger.error(`rolling back to ${prevVersion} after error installing ${pkgkey}`); - await installPackage({ + await installPackageFromRegistry({ savedObjectsClient, pkgkey: prevVersion, callCluster, @@ -193,7 +198,7 @@ export async function upgradePackage({ }); try { - const assets = await installPackage({ savedObjectsClient, pkgkey, callCluster }); + const assets = await installPackageFromRegistry({ savedObjectsClient, pkgkey, callCluster }); return { name: pkgToUpgrade, newVersion: latestPkg.version, @@ -232,7 +237,7 @@ interface InstallPackageParams { force?: boolean; } -export async function installPackage({ +export async function installPackageFromRegistry({ savedObjectsClient, pkgkey, callCluster, @@ -254,12 +259,96 @@ export async function installPackage({ if (semver.lt(pkgVersion, latestPackage.version) && !force && !installOutOfDateVersionOk) { throw new PackageOutdatedError(`${pkgkey} is out-of-date and cannot be installed or updated`); } - const paths = await Registry.getArchiveInfo(pkgName, pkgVersion); - const registryPackageInfo = await Registry.fetchInfo(pkgName, pkgVersion); + + const { paths, registryPackageInfo } = await Registry.loadRegistryPackage(pkgName, pkgVersion); const removable = !isRequiredPackage(pkgName); const { internal = false } = registryPackageInfo; - const toSaveESIndexPatterns = generateESIndexPatterns(registryPackageInfo.data_streams); + const installSource = 'registry'; + + return installPackage({ + savedObjectsClient, + callCluster, + pkgName, + pkgVersion, + installedPkg, + paths, + removable, + internal, + packageInfo: registryPackageInfo, + installType, + installSource, + }); +} + +export async function installPackageByUpload({ + savedObjectsClient, + callCluster, + archiveBuffer, + contentType, +}: { + savedObjectsClient: SavedObjectsClientContract; + callCluster: CallESAsCurrentUser; + archiveBuffer: Buffer; + contentType: string; +}): Promise { + const { paths, archivePackageInfo } = await loadArchivePackage({ archiveBuffer, contentType }); + const installedPkg = await getInstallationObject({ + savedObjectsClient, + pkgName: archivePackageInfo.name, + }); + const installType = getInstallType({ pkgVersion: archivePackageInfo.version, installedPkg }); + if (installType !== 'install') { + throw new PackageOperationNotSupportedError( + `Package upload only supports fresh installations. Package ${archivePackageInfo.name} is already installed, please uninstall first.` + ); + } + + const removable = !isRequiredPackage(archivePackageInfo.name); + const { internal = false } = archivePackageInfo; + const installSource = 'upload'; + + return installPackage({ + savedObjectsClient, + callCluster, + pkgName: archivePackageInfo.name, + pkgVersion: archivePackageInfo.version, + installedPkg, + paths, + removable, + internal, + packageInfo: archivePackageInfo, + installType, + installSource, + }); +} + +async function installPackage({ + savedObjectsClient, + callCluster, + pkgName, + pkgVersion, + installedPkg, + paths, + removable, + internal, + packageInfo, + installType, + installSource, +}: { + savedObjectsClient: SavedObjectsClientContract; + callCluster: CallESAsCurrentUser; + pkgName: string; + pkgVersion: string; + installedPkg?: SavedObject; + paths: string[]; + removable: boolean; + internal: boolean; + packageInfo: InstallablePackage; + installType: InstallType; + installSource: InstallSource; +}): Promise { + const toSaveESIndexPatterns = generateESIndexPatterns(packageInfo.data_streams); // add the package installation to the saved object. // if some installation already exists, just update install info @@ -273,12 +362,14 @@ export async function installPackage({ installed_kibana: [], installed_es: [], toSaveESIndexPatterns, + installSource, }); } else { await savedObjectsClient.update(PACKAGES_SAVED_OBJECT_TYPE, pkgName, { install_version: pkgVersion, install_status: 'installing', install_started_at: new Date().toISOString(), + install_source: installSource, }); } const installIndexPatternPromise = installIndexPatterns(savedObjectsClient, pkgName, pkgVersion); @@ -309,14 +400,14 @@ export async function installPackage({ // installs versionized pipelines without removing currently installed ones const installedPipelines = await installPipelines( - registryPackageInfo, + packageInfo, paths, callCluster, savedObjectsClient ); // install or update the templates referencing the newly installed pipelines const installedTemplates = await installTemplates( - registryPackageInfo, + packageInfo, callCluster, paths, savedObjectsClient @@ -326,7 +417,7 @@ export async function installPackage({ await updateCurrentWriteIndices(callCluster, installedTemplates); const installedTransforms = await installTransform( - registryPackageInfo, + packageInfo, paths, callCluster, savedObjectsClient @@ -388,6 +479,7 @@ export async function createInstallation(options: { installed_kibana: KibanaAssetReference[]; installed_es: EsAssetReference[]; toSaveESIndexPatterns: Record; + installSource: InstallSource; }) { const { savedObjectsClient, @@ -398,6 +490,7 @@ export async function createInstallation(options: { installed_kibana: installedKibana, installed_es: installedEs, toSaveESIndexPatterns, + installSource, } = options; await savedObjectsClient.create( PACKAGES_SAVED_OBJECT_TYPE, @@ -412,6 +505,7 @@ export async function createInstallation(options: { install_version: pkgVersion, install_status: 'installing', install_started_at: new Date().toISOString(), + install_source: installSource, }, { id: pkgName, overwrite: true } ); @@ -477,7 +571,7 @@ export async function ensurePackagesCompletedInstall( const pkgkey = `${pkg.attributes.name}-${pkg.attributes.install_version}`; // reinstall package if (elapsedTime > MAX_TIME_COMPLETE_INSTALL) { - acc.push(installPackage({ savedObjectsClient, pkgkey, callCluster })); + acc.push(installPackageFromRegistry({ savedObjectsClient, pkgkey, callCluster })); } return acc; }, []); diff --git a/x-pack/plugins/ingest_manager/server/services/epm/packages/remove.ts b/x-pack/plugins/ingest_manager/server/services/epm/packages/remove.ts index 2434ebf27aa5d..417f2871a6cbf 100644 --- a/x-pack/plugins/ingest_manager/server/services/epm/packages/remove.ts +++ b/x-pack/plugins/ingest_manager/server/services/epm/packages/remove.ts @@ -18,7 +18,7 @@ import { deletePipeline } from '../elasticsearch/ingest_pipeline/'; import { installIndexPatterns } from '../kibana/index_pattern/install'; import { deleteTransforms } from '../elasticsearch/transform/remove'; import { packagePolicyService, appContextService } from '../..'; -import { splitPkgKey, deletePackageCache, getArchiveInfo } from '../registry'; +import { splitPkgKey, deletePackageCache } from '../registry'; export async function removeInstallation(options: { savedObjectsClient: SavedObjectsClientContract; @@ -57,8 +57,7 @@ export async function removeInstallation(options: { // remove the package archive and its contents from the cache so that a reinstall fetches // a fresh copy from the registry - const paths = await getArchiveInfo(pkgName, pkgVersion); - deletePackageCache(pkgName, pkgVersion, paths); + deletePackageCache(pkgName, pkgVersion); // successful delete's in SO client return {}. return something more useful return installedAssets; diff --git a/x-pack/plugins/ingest_manager/server/services/epm/registry/cache.ts b/x-pack/plugins/ingest_manager/server/services/epm/registry/cache.ts index b7c1e8c2069d6..695db9db73fa2 100644 --- a/x-pack/plugins/ingest_manager/server/services/epm/registry/cache.ts +++ b/x-pack/plugins/ingest_manager/server/services/epm/registry/cache.ts @@ -12,12 +12,12 @@ export const cacheHas = (key: string) => cache.has(key); export const cacheClear = () => cache.clear(); export const cacheDelete = (key: string) => cache.delete(key); -const archiveLocationCache: Map = new Map(); -export const getArchiveLocation = (name: string, version: string) => - archiveLocationCache.get(pkgToPkgKey({ name, version })); +const archiveFilelistCache: Map = new Map(); +export const getArchiveFilelist = (name: string, version: string) => + archiveFilelistCache.get(pkgToPkgKey({ name, version })); -export const setArchiveLocation = (name: string, version: string, location: string) => - archiveLocationCache.set(pkgToPkgKey({ name, version }), location); +export const setArchiveFilelist = (name: string, version: string, paths: string[]) => + archiveFilelistCache.set(pkgToPkgKey({ name, version }), paths); -export const deleteArchiveLocation = (name: string, version: string) => - archiveLocationCache.delete(pkgToPkgKey({ name, version })); +export const deleteArchiveFilelist = (name: string, version: string) => + archiveFilelistCache.delete(pkgToPkgKey({ name, version })); diff --git a/x-pack/plugins/ingest_manager/server/services/epm/registry/index.test.ts b/x-pack/plugins/ingest_manager/server/services/epm/registry/index.test.ts index 2fd9175549026..ba51636c13f36 100644 --- a/x-pack/plugins/ingest_manager/server/services/epm/registry/index.test.ts +++ b/x-pack/plugins/ingest_manager/server/services/epm/registry/index.test.ts @@ -6,17 +6,8 @@ import { AssetParts } from '../../../types'; import { getBufferExtractor, pathParts, splitPkgKey } from './index'; -import { getArchiveLocation } from './cache'; import { untarBuffer, unzipBuffer } from './extract'; -jest.mock('./cache', () => { - return { - getArchiveLocation: jest.fn(), - }; -}); - -const mockedGetArchiveLocation = getArchiveLocation as jest.Mock; - const testPaths = [ { path: 'foo-1.1.0/service/type/file.yml', @@ -92,19 +83,13 @@ describe('splitPkgKey tests', () => { }); describe('getBufferExtractor', () => { - it('throws if the archive has not been downloaded/cached yet', () => { - expect(() => getBufferExtractor('missing', '1.2.3')).toThrow('no archive location'); - }); - it('returns unzipBuffer if the archive key ends in .zip', () => { - mockedGetArchiveLocation.mockImplementation(() => '.zip'); - const extractor = getBufferExtractor('will-use-mocked-key', 'a.b.c'); + const extractor = getBufferExtractor('.zip'); expect(extractor).toBe(unzipBuffer); }); it('returns untarBuffer if the key ends in anything else', () => { - mockedGetArchiveLocation.mockImplementation(() => 'xyz'); - const extractor = getBufferExtractor('will-use-mocked-key', 'a.b.c'); + const extractor = getBufferExtractor('.xyz'); expect(extractor).toBe(untarBuffer); }); }); diff --git a/x-pack/plugins/ingest_manager/server/services/epm/registry/index.ts b/x-pack/plugins/ingest_manager/server/services/epm/registry/index.ts index 22f1b670b2cc4..66f28fe58599a 100644 --- a/x-pack/plugins/ingest_manager/server/services/epm/registry/index.ts +++ b/x-pack/plugins/ingest_manager/server/services/epm/registry/index.ts @@ -12,6 +12,7 @@ import { AssetsGroupedByServiceByType, CategoryId, CategorySummaryList, + InstallSource, KibanaAssetType, RegistryPackage, RegistrySearchResults, @@ -21,17 +22,16 @@ import { cacheGet, cacheSet, cacheDelete, - cacheHas, - getArchiveLocation, - setArchiveLocation, - deleteArchiveLocation, + getArchiveFilelist, + setArchiveFilelist, + deleteArchiveFilelist, } from './cache'; import { ArchiveEntry, untarBuffer, unzipBuffer } from './extract'; import { fetchUrl, getResponse, getResponseStream } from './requests'; import { streamToBuffer } from './streams'; import { getRegistryUrl } from './registry_url'; import { appContextService } from '../..'; -import { PackageNotFoundError } from '../../../errors'; +import { PackageNotFoundError, PackageCacheError } from '../../../errors'; export { ArchiveEntry } from './extract'; @@ -132,14 +132,14 @@ export async function fetchCategories(params?: CategoriesParams): Promise true ): Promise { const paths: string[] = []; - const archiveBuffer = await getOrFetchArchiveBuffer(pkgName, pkgVersion); - const bufferExtractor = getBufferExtractor(pkgName, pkgVersion); + const { archiveBuffer, archivePath } = await fetchArchiveBuffer(pkgName, pkgVersion); + const bufferExtractor = getBufferExtractor(archivePath); await bufferExtractor(archiveBuffer, filter, (entry: ArchiveEntry) => { const { path, buffer } = entry; const { file } = pathParts(path); @@ -153,6 +153,22 @@ export async function getArchiveInfo( return paths; } +export async function loadRegistryPackage( + pkgName: string, + pkgVersion: string +): Promise<{ paths: string[]; registryPackageInfo: RegistryPackage }> { + let paths = getArchiveFilelist(pkgName, pkgVersion); + if (!paths || paths.length === 0) { + paths = await unpackRegistryPackageToCache(pkgName, pkgVersion); + setArchiveFilelist(pkgName, pkgVersion, paths); + } + + // TODO: cache this as well? + const registryPackageInfo = await fetchInfo(pkgName, pkgVersion); + + return { paths, registryPackageInfo }; +} + export function pathParts(path: string): AssetParts { let dataset; @@ -183,45 +199,39 @@ export function pathParts(path: string): AssetParts { } as AssetParts; } -export function getBufferExtractor(pkgName: string, pkgVersion: string) { - const archiveLocation = getArchiveLocation(pkgName, pkgVersion); - if (!archiveLocation) throw new Error(`no archive location for ${pkgName} ${pkgVersion}`); - const isZip = archiveLocation.endsWith('.zip'); +export function getBufferExtractor(archivePath: string) { + const isZip = archivePath.endsWith('.zip'); const bufferExtractor = isZip ? unzipBuffer : untarBuffer; return bufferExtractor; } -async function getOrFetchArchiveBuffer(pkgName: string, pkgVersion: string): Promise { - const key = getArchiveLocation(pkgName, pkgVersion); - let buffer = key && cacheGet(key); - if (!buffer) { - buffer = await fetchArchiveBuffer(pkgName, pkgVersion); - } - - if (buffer) { - return buffer; - } else { - throw new Error(`no archive buffer for ${key}`); - } -} - -export async function ensureCachedArchiveInfo(name: string, version: string) { - const pkgkey = getArchiveLocation(name, version); - if (!pkgkey || !cacheHas(pkgkey)) { - await getArchiveInfo(name, version); +export async function ensureCachedArchiveInfo( + name: string, + version: string, + installSource: InstallSource = 'registry' +) { + const paths = getArchiveFilelist(name, version); + if (!paths || paths.length === 0) { + if (installSource === 'registry') { + await loadRegistryPackage(name, version); + } else { + throw new PackageCacheError( + `Package ${name}-${version} not cached. If it was uploaded, try uninstalling and reinstalling manually.` + ); + } } } -async function fetchArchiveBuffer(pkgName: string, pkgVersion: string): Promise { +async function fetchArchiveBuffer( + pkgName: string, + pkgVersion: string +): Promise<{ archiveBuffer: Buffer; archivePath: string }> { const { download: archivePath } = await fetchInfo(pkgName, pkgVersion); const archiveUrl = `${getRegistryUrl()}${archivePath}`; - const buffer = await getResponseStream(archiveUrl).then(streamToBuffer); + const archiveBuffer = await getResponseStream(archiveUrl).then(streamToBuffer); - setArchiveLocation(pkgName, pkgVersion, archivePath); - cacheSet(archivePath, buffer); - - return buffer; + return { archiveBuffer, archivePath }; } export function getAsset(key: string) { @@ -250,16 +260,14 @@ export function groupPathsByService(paths: string[]): AssetsGroupedByServiceByTy }; } -export const deletePackageCache = (name: string, version: string, paths: string[]) => { - const archiveLocation = getArchiveLocation(name, version); - if (archiveLocation) { - // delete cached archive - cacheDelete(archiveLocation); +export const deletePackageCache = (name: string, version: string) => { + // get cached archive filelist + const paths = getArchiveFilelist(name, version); - // delete cached archive location - deleteArchiveLocation(name, version); - } - // delete cached archive contents - // this has been populated in Registry.getArchiveInfo() - paths.forEach((path) => cacheDelete(path)); + // delete cached archive filelist + deleteArchiveFilelist(name, version); + + // delete cached archive files + // this has been populated in unpackRegistryPackageToCache() + paths?.forEach((path) => cacheDelete(path)); }; diff --git a/x-pack/plugins/ingest_manager/server/types/index.tsx b/x-pack/plugins/ingest_manager/server/types/index.tsx index fc5ba1af196ad..0c070959e3b93 100644 --- a/x-pack/plugins/ingest_manager/server/types/index.tsx +++ b/x-pack/plugins/ingest_manager/server/types/index.tsx @@ -52,6 +52,7 @@ export { KibanaAssetReference, ElasticsearchAssetType, RegistryPackage, + InstallablePackage, AssetType, Installable, KibanaAssetType, @@ -68,6 +69,7 @@ export { Settings, SettingsSOAttributes, InstallType, + InstallSource, // Agent Request types PostAgentEnrollRequest, PostAgentCheckinRequest, diff --git a/x-pack/plugins/security_solution/common/endpoint/generate_data.ts b/x-pack/plugins/security_solution/common/endpoint/generate_data.ts index ec7a49da469fe..f0254616e6c9d 100644 --- a/x-pack/plugins/security_solution/common/endpoint/generate_data.ts +++ b/x-pack/plugins/security_solution/common/endpoint/generate_data.ts @@ -1215,6 +1215,7 @@ export class EndpointDocGenerator { install_version: '0.5.0', install_status: 'installed', install_started_at: '2020-06-24T14:41:23.098Z', + install_source: 'registry', }, references: [], updated_at: '2020-06-24T14:41:23.098Z', diff --git a/x-pack/test/ingest_manager_api_integration/apis/epm/install_by_upload.ts b/x-pack/test/ingest_manager_api_integration/apis/epm/install_by_upload.ts index e6d2affaec0cd..7fa0e0f38179a 100644 --- a/x-pack/test/ingest_manager_api_integration/apis/epm/install_by_upload.ts +++ b/x-pack/test/ingest_manager_api_integration/apis/epm/install_by_upload.ts @@ -9,18 +9,43 @@ import path from 'path'; import expect from '@kbn/expect'; import { FtrProviderContext } from '../../../api_integration/ftr_provider_context'; -import { warnAndSkipTest } from '../../helpers'; +import { skipIfNoDockerRegistry } from '../../helpers'; -export default function ({ getService }: FtrProviderContext) { +export default function (providerContext: FtrProviderContext) { + const { getService } = providerContext; const supertest = getService('supertest'); const dockerServers = getService('dockerServers'); - const log = getService('log'); const testPkgArchiveTgz = path.join( path.dirname(__filename), '../fixtures/direct_upload_packages/apache_0.1.4.tar.gz' ); - const testPkgKey = 'apache-0.14'; + const testPkgArchiveZip = path.join( + path.dirname(__filename), + '../fixtures/direct_upload_packages/apache_0.1.4.zip' + ); + const testPkgArchiveInvalidTwoToplevels = path.join( + path.dirname(__filename), + '../fixtures/direct_upload_packages/apache_invalid_two_toplevels_0.1.4.zip' + ); + const testPkgArchiveInvalidNoManifest = path.join( + path.dirname(__filename), + '../fixtures/direct_upload_packages/apache_invalid_no_manifest_0.1.4.zip' + ); + const testPkgArchiveInvalidManifestInvalidYaml = path.join( + path.dirname(__filename), + '../fixtures/direct_upload_packages/apache_invalid_manifest_invalid_yaml_0.1.4.zip' + ); + const testPkgArchiveInvalidManifestMissingField = path.join( + path.dirname(__filename), + '../fixtures/direct_upload_packages/apache_invalid_manifest_missing_field_0.1.4.zip' + ); + const testPkgArchiveInvalidToplevelMismatch = path.join( + path.dirname(__filename), + '../fixtures/direct_upload_packages/apache_invalid_toplevel_mismatch_0.1.4.zip' + ); + + const testPkgKey = 'apache-0.1.4'; const server = dockerServers.get('registry'); const deletePackage = async (pkgkey: string) => { @@ -28,28 +53,125 @@ export default function ({ getService }: FtrProviderContext) { }; describe('installs packages from direct upload', async () => { - after(async () => { - if (server.enabled) { + skipIfNoDockerRegistry(providerContext); + afterEach(async () => { + if (server) { // remove the package just in case it being installed will affect other tests await deletePackage(testPkgKey); } }); it('should install a tar archive correctly', async function () { - if (server.enabled) { - const buf = fs.readFileSync(testPkgArchiveTgz); - const res = await supertest - .post(`/api/ingest_manager/epm/packages`) - .set('kbn-xsrf', 'xxxx') - .type('application/gzip') - .send(buf) - .expect(200); - expect(res.body.response).to.equal( - 'package upload was received ok, but not installed (not implemented yet)' - ); - } else { - warnAndSkipTest(this, log); - } + const buf = fs.readFileSync(testPkgArchiveTgz); + const res = await supertest + .post(`/api/ingest_manager/epm/packages`) + .set('kbn-xsrf', 'xxxx') + .type('application/gzip') + .send(buf) + .expect(200); + expect(res.body.response.length).to.be(23); + }); + + it('should install a zip archive correctly', async function () { + const buf = fs.readFileSync(testPkgArchiveZip); + const res = await supertest + .post(`/api/ingest_manager/epm/packages`) + .set('kbn-xsrf', 'xxxx') + .type('application/zip') + .send(buf) + .expect(200); + expect(res.body.response.length).to.be(18); + }); + + it('should throw an error if the archive is zip but content type is gzip', async function () { + const buf = fs.readFileSync(testPkgArchiveZip); + const res = await supertest + .post(`/api/ingest_manager/epm/packages`) + .set('kbn-xsrf', 'xxxx') + .type('application/gzip') + .send(buf) + .expect(400); + expect(res.error.text).to.equal( + '{"statusCode":400,"error":"Bad Request","message":"Uploaded archive seems empty. Assumed content type was application/gzip, check if this matches the archive type."}' + ); + }); + + it('should throw an error if the archive is tar.gz but content type is zip', async function () { + const buf = fs.readFileSync(testPkgArchiveTgz); + const res = await supertest + .post(`/api/ingest_manager/epm/packages`) + .set('kbn-xsrf', 'xxxx') + .type('application/zip') + .send(buf) + .expect(400); + expect(res.error.text).to.equal( + '{"statusCode":400,"error":"Bad Request","message":"Error during extraction of uploaded package: Error: end of central directory record signature not found. Assumed content type was application/zip, check if this matches the archive type."}' + ); + }); + + it('should throw an error if the archive contains two top-level directories', async function () { + const buf = fs.readFileSync(testPkgArchiveInvalidTwoToplevels); + const res = await supertest + .post(`/api/ingest_manager/epm/packages`) + .set('kbn-xsrf', 'xxxx') + .type('application/zip') + .send(buf) + .expect(400); + expect(res.error.text).to.equal( + '{"statusCode":400,"error":"Bad Request","message":"Package contains more than one top-level directory."}' + ); + }); + + it('should throw an error if the archive does not contain a manifest', async function () { + const buf = fs.readFileSync(testPkgArchiveInvalidNoManifest); + const res = await supertest + .post(`/api/ingest_manager/epm/packages`) + .set('kbn-xsrf', 'xxxx') + .type('application/zip') + .send(buf) + .expect(400); + expect(res.error.text).to.equal( + '{"statusCode":400,"error":"Bad Request","message":"Package must contain a top-level manifest.yml file."}' + ); + }); + + it('should throw an error if the archive manifest contains invalid YAML', async function () { + const buf = fs.readFileSync(testPkgArchiveInvalidManifestInvalidYaml); + const res = await supertest + .post(`/api/ingest_manager/epm/packages`) + .set('kbn-xsrf', 'xxxx') + .type('application/zip') + .send(buf) + .expect(400); + expect(res.error.text).to.equal( + '{"statusCode":400,"error":"Bad Request","message":"Could not parse top-level package manifest: YAMLException: bad indentation of a mapping entry at line 2, column 7:\\n name: apache\\n ^."}' + ); + }); + + it('should throw an error if the archive manifest misses a mandatory field', async function () { + const buf = fs.readFileSync(testPkgArchiveInvalidManifestMissingField); + const res = await supertest + .post(`/api/ingest_manager/epm/packages`) + .set('kbn-xsrf', 'xxxx') + .type('application/zip') + .send(buf) + .expect(400); + expect(res.error.text).to.equal( + '{"statusCode":400,"error":"Bad Request","message":"Invalid top-level package manifest: one or more fields missing of name, version, description, type, categories, format_version"}' + ); + }); + + it('should throw an error if the toplevel directory name does not match the package key', async function () { + const buf = fs.readFileSync(testPkgArchiveInvalidToplevelMismatch); + const res = await supertest + .post(`/api/ingest_manager/epm/packages`) + .set('kbn-xsrf', 'xxxx') + .type('application/zip') + .send(buf) + .expect(400); + expect(res.error.text).to.equal( + '{"statusCode":400,"error":"Bad Request","message":"Name thisIsATypo and version 0.1.4 do not match top-level directory apache-0.1.4"}' + ); }); }); } diff --git a/x-pack/test/ingest_manager_api_integration/apis/epm/install_remove_assets.ts b/x-pack/test/ingest_manager_api_integration/apis/epm/install_remove_assets.ts index 5170867d7b545..0b27498103f2d 100644 --- a/x-pack/test/ingest_manager_api_integration/apis/epm/install_remove_assets.ts +++ b/x-pack/test/ingest_manager_api_integration/apis/epm/install_remove_assets.ts @@ -192,6 +192,7 @@ export default function (providerContext: FtrProviderContext) { install_version: '0.1.0', install_status: 'installed', install_started_at: res.attributes.install_started_at, + install_source: 'registry', }); }); }); diff --git a/x-pack/test/ingest_manager_api_integration/apis/epm/update_assets.ts b/x-pack/test/ingest_manager_api_integration/apis/epm/update_assets.ts index 9af27f5f98558..8608756c37f54 100644 --- a/x-pack/test/ingest_manager_api_integration/apis/epm/update_assets.ts +++ b/x-pack/test/ingest_manager_api_integration/apis/epm/update_assets.ts @@ -325,6 +325,7 @@ export default function (providerContext: FtrProviderContext) { install_version: '0.2.0', install_status: 'installed', install_started_at: res.attributes.install_started_at, + install_source: 'registry', }); }); }); diff --git a/x-pack/test/ingest_manager_api_integration/apis/fixtures/direct_upload_packages/apache_0.1.4.zip b/x-pack/test/ingest_manager_api_integration/apis/fixtures/direct_upload_packages/apache_0.1.4.zip new file mode 100644 index 0000000000000000000000000000000000000000..410b00ecde2be5d44ae8217f2bee7ad3cc1c9a1c GIT binary patch literal 601945 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 ? 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

-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

Gcw}UB@d{xGD6O8;Gt%x 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 literal 0 HcmV?d00001 diff --git a/x-pack/test/ingest_manager_api_integration/apis/fixtures/direct_upload_packages/apache_invalid_manifest_invalid_yaml_0.1.4.zip b/x-pack/test/ingest_manager_api_integration/apis/fixtures/direct_upload_packages/apache_invalid_manifest_invalid_yaml_0.1.4.zip new file mode 100644 index 0000000000000000000000000000000000000000..e18db3c0e3df09554b44834590628e28925cd1ed GIT binary patch literal 599739 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

_o5ar>V*r6b` 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

ybUG{Rfrbd<A%0@tuEh` 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

!`8qAUPFpuGp|%7Z9*f=&%FX{dd@^Dk{Yb{ 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

G%RCbbsOjOGfk1PT=0(Bn)sZ!o4YF+QUmCxgB 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

-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%0DIYxKR2ZUq3e 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

qf}|3H+7{B4sq4-CYjm3B2k4y}AdnT!EC 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

2|IQCW{1x-6kmLR;pw41=X?pqU8{E(9omki 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

LY)+Gnx*N=l53hm?hKU$Z#`+Bkv>FN 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 literal 0 HcmV?d00001 diff --git a/x-pack/test/ingest_manager_api_integration/apis/fixtures/direct_upload_packages/apache_invalid_manifest_missing_field_0.1.4.zip b/x-pack/test/ingest_manager_api_integration/apis/fixtures/direct_upload_packages/apache_invalid_manifest_missing_field_0.1.4.zip new file mode 100644 index 0000000000000000000000000000000000000000..8526f6a53458b6be1632efb3a8d3b199073d1ce1 GIT binary patch literal 599735 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

TM~J7tC&lUOQ(bbWJQMJiFj= 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

{datasourcePreview} diff --git a/x-pack/plugins/canvas/storybook/webpack.config.js b/x-pack/plugins/canvas/storybook/webpack.config.js index d8434bd5d9080..a7f712fb62da3 100644 --- a/x-pack/plugins/canvas/storybook/webpack.config.js +++ b/x-pack/plugins/canvas/storybook/webpack.config.js @@ -176,6 +176,10 @@ module.exports = async ({ config: storybookConfig }) => { /(lib)?\/ui_metric/, path.resolve(__dirname, '../tasks/mocks/uiMetric') ), + new webpack.NormalModuleReplacementPlugin( + /lib\/es_service/, + path.resolve(__dirname, '../tasks/mocks/esService') + ), ], resolve: { extensions: ['.ts', '.tsx', '.scss', '.mjs', '.html'], diff --git a/x-pack/plugins/canvas/tasks/mocks/esService.ts b/x-pack/plugins/canvas/tasks/mocks/esService.ts new file mode 100644 index 0000000000000..a0c2a42eafd7c --- /dev/null +++ b/x-pack/plugins/canvas/tasks/mocks/esService.ts @@ -0,0 +1,9 @@ +/* + * 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. + */ + +export function getDefaultIndex() { + return Promise.resolve('default-index'); +} From ad89e6f956f901fad1839c503162804d01337610 Mon Sep 17 00:00:00 2001 From: Quynh Nguyen <43350163+qn895@users.noreply.github.com> Date: Mon, 5 Oct 2020 13:00:58 -0500 Subject: [PATCH 33/49] [ML] Add runtime fields support (#78700) Co-authored-by: Elastic Machine Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- .../components/data_grid/common.ts | 13 +++++++++++ .../application/components/data_grid/index.ts | 1 + .../common/get_index_data.ts | 10 +++++++-- .../hooks/use_index_data.ts | 6 +++-- .../components/custom_url_editor/utils.js | 3 ++- .../application/services/job_service.js | 4 ++-- .../new_job/categorization/examples.ts | 14 ++++++++---- .../categorization/validation_results.ts | 22 +++++++++++-------- .../public/app/hooks/use_index_data.ts | 10 ++++----- 9 files changed, 58 insertions(+), 25 deletions(-) diff --git a/x-pack/plugins/ml/public/application/components/data_grid/common.ts b/x-pack/plugins/ml/public/application/components/data_grid/common.ts index 36b0573d609d8..a33b2e6b3e2d6 100644 --- a/x-pack/plugins/ml/public/application/components/data_grid/common.ts +++ b/x-pack/plugins/ml/public/application/components/data_grid/common.ts @@ -315,3 +315,16 @@ export const showDataGridColumnChartErrorMessageToast = ( }) ); }; + +// helper function to transform { [key]: [val] } => { [key]: val } +// for when `fields` is used in es.search since response is always an array of values +// since response always returns an array of values for each field +export const getProcessedFields = (originalObj: object) => { + const obj: { [key: string]: any } = { ...originalObj }; + for (const key of Object.keys(obj)) { + if (Array.isArray(obj[key]) && obj[key].length === 1) { + obj[key] = obj[key][0]; + } + } + return obj; +}; diff --git a/x-pack/plugins/ml/public/application/components/data_grid/index.ts b/x-pack/plugins/ml/public/application/components/data_grid/index.ts index 633d70687dd27..cb5b6ecc18fa9 100644 --- a/x-pack/plugins/ml/public/application/components/data_grid/index.ts +++ b/x-pack/plugins/ml/public/application/components/data_grid/index.ts @@ -11,6 +11,7 @@ export { multiColumnSortFactory, showDataGridColumnChartErrorMessageToast, useRenderCellValue, + getProcessedFields, } from './common'; export { getFieldType, ChartData } from './use_column_chart'; export { useDataGrid } from './use_data_grid'; diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/common/get_index_data.ts b/x-pack/plugins/ml/public/application/data_frame_analytics/common/get_index_data.ts index 361a79d42214d..667dea27de96e 100644 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/common/get_index_data.ts +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/common/get_index_data.ts @@ -7,7 +7,7 @@ import type { SearchResponse7 } from '../../../../common/types/es_client'; import { extractErrorMessage } from '../../../../common/util/errors'; -import { EsSorting, UseDataGridReturnType } from '../../components/data_grid'; +import { EsSorting, UseDataGridReturnType, getProcessedFields } from '../../components/data_grid'; import { ml } from '../../services/ml_api_service'; import { isKeywordAndTextType } from '../common/fields'; @@ -47,9 +47,12 @@ export const getIndexData = async ( }, {} as EsSorting); const { pageIndex, pageSize } = pagination; + // TODO: remove results_field from `fields` when possible const resp: SearchResponse7 = await ml.esSearch({ index: jobConfig.dest.index, body: { + fields: ['*'], + _source: jobConfig.dest.results_field, query: searchQuery, from: pageIndex * pageSize, size: pageSize, @@ -58,8 +61,11 @@ export const getIndexData = async ( }); setRowCount(resp.hits.total.value); + const docs = resp.hits.hits.map((d) => ({ + ...getProcessedFields(d.fields), + [jobConfig.dest.results_field]: d._source[jobConfig.dest.results_field], + })); - const docs = resp.hits.hits.map((d) => d._source); setTableItems(docs); setStatus(INDEX_STATUS.LOADED); } catch (e) { diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/hooks/use_index_data.ts b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/hooks/use_index_data.ts index 74d45b86c8c4d..149919d9b36c2 100644 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/hooks/use_index_data.ts +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/hooks/use_index_data.ts @@ -23,6 +23,7 @@ import { useRenderCellValue, EsSorting, UseIndexDataReturnType, + getProcessedFields, } from '../../../../components/data_grid'; import type { SearchResponse7 } from '../../../../../../common/types/es_client'; import { extractErrorMessage } from '../../../../../../common/util/errors'; @@ -81,6 +82,8 @@ export const useIndexData = ( query, // isDefaultQuery(query) ? matchAllQuery : query, from: pagination.pageIndex * pagination.pageSize, size: pagination.pageSize, + fields: ['*'], + _source: false, ...(Object.keys(sort).length > 0 ? { sort } : {}), }, }; @@ -88,8 +91,7 @@ export const useIndexData = ( try { const resp: IndexSearchResponse = await ml.esSearch(esSearchRequest); - const docs = resp.hits.hits.map((d) => d._source); - + const docs = resp.hits.hits.map((d) => getProcessedFields(d.fields)); setRowCount(resp.hits.total.value); setTableItems(docs); setStatus(INDEX_STATUS.LOADED); diff --git a/x-pack/plugins/ml/public/application/jobs/components/custom_url_editor/utils.js b/x-pack/plugins/ml/public/application/jobs/components/custom_url_editor/utils.js index a0e9c33e42dfa..6e23d652b5c9f 100644 --- a/x-pack/plugins/ml/public/application/jobs/components/custom_url_editor/utils.js +++ b/x-pack/plugins/ml/public/application/jobs/components/custom_url_editor/utils.js @@ -18,6 +18,7 @@ import { ml } from '../../../services/ml_api_service'; import { mlJobService } from '../../../services/job_service'; import { escapeForElasticsearchQuery } from '../../../util/string_utils'; import { getSavedObjectsClient, getGetUrlGenerator } from '../../../util/dependency_cache'; +import { getProcessedFields } from '../../../components/data_grid'; export function getNewCustomUrlDefaults(job, dashboards, indexPatterns) { // Returns the settings object in the format used by the custom URL editor @@ -329,7 +330,7 @@ export function getTestUrl(job, customUrl) { }); } else { if (response.hits.total.value > 0) { - testDoc = response.hits.hits[0]._source; + testDoc = getProcessedFields(response.hits.hits[0].fields); } } diff --git a/x-pack/plugins/ml/public/application/services/job_service.js b/x-pack/plugins/ml/public/application/services/job_service.js index 0971b47605135..4aa1f7ef81d59 100644 --- a/x-pack/plugins/ml/public/application/services/job_service.js +++ b/x-pack/plugins/ml/public/application/services/job_service.js @@ -509,10 +509,10 @@ class JobService { fields[job.data_description.time_field] = {}; } - // console.log('fields: ', fields); const fieldsList = Object.keys(fields); if (fieldsList.length) { - body._source = fieldsList; + body.fields = fieldsList; + body._source = false; } } diff --git a/x-pack/plugins/ml/server/models/job_service/new_job/categorization/examples.ts b/x-pack/plugins/ml/server/models/job_service/new_job/categorization/examples.ts index 6b9f30b2ae00b..9e6c6f1552bad 100644 --- a/x-pack/plugins/ml/server/models/job_service/new_job/categorization/examples.ts +++ b/x-pack/plugins/ml/server/models/job_service/new_job/categorization/examples.ts @@ -56,18 +56,25 @@ export function categorizationExamplesProvider({ } } } - const { body } = await asCurrentUser.search>({ index: indexPatternTitle, size, body: { - _source: categorizationFieldName, + fields: [categorizationFieldName], + _source: false, query, sort: ['_doc'], }, }); - const tempExamples = body.hits.hits.map(({ _source }) => _source[categorizationFieldName]); + // hit.fields can be undefined if value is originally null + const tempExamples = body.hits.hits.map(({ fields }) => + fields && + Array.isArray(fields[categorizationFieldName]) && + fields[categorizationFieldName].length > 0 + ? fields[categorizationFieldName][0] + : null + ); validationResults.createNullValueResult(tempExamples); @@ -81,7 +88,6 @@ export function categorizationExamplesProvider({ const examplesWithTokens = await getTokens(CHUNK_SIZE, allExamples, analyzer); return { examples: examplesWithTokens }; } catch (err) { - // console.log('dropping to 50 chunk size'); // if an error is thrown when loading the tokens, lower the chunk size by half and try again // the error may have been caused by too many tokens being found. // the _analyze endpoint has a maximum of 10000 tokens. diff --git a/x-pack/plugins/ml/server/models/job_service/new_job/categorization/validation_results.ts b/x-pack/plugins/ml/server/models/job_service/new_job/categorization/validation_results.ts index 60595ccedff45..5845064218ad8 100644 --- a/x-pack/plugins/ml/server/models/job_service/new_job/categorization/validation_results.ts +++ b/x-pack/plugins/ml/server/models/job_service/new_job/categorization/validation_results.ts @@ -123,15 +123,19 @@ export class ValidationResults { public createNullValueResult(examples: Array) { const nullCount = examples.filter((e) => e === null).length; - if (nullCount / examples.length >= NULL_COUNT_PERCENT_LIMIT) { - this._results.push({ - id: VALIDATION_RESULT.NULL_VALUES, - valid: CATEGORY_EXAMPLES_VALIDATION_STATUS.PARTIALLY_VALID, - message: i18n.translate('xpack.ml.models.jobService.categorization.messages.nullValues', { - defaultMessage: 'More than {percent}% of field values are null.', - values: { percent: NULL_COUNT_PERCENT_LIMIT * 100 }, - }), - }); + // if all values are null, VALIDATION_RESULT.NO_EXAMPLES will be raised + // so we don't need to display this warning as well + if (nullCount !== examples.length) { + if (nullCount / examples.length >= NULL_COUNT_PERCENT_LIMIT) { + this._results.push({ + id: VALIDATION_RESULT.NULL_VALUES, + valid: CATEGORY_EXAMPLES_VALIDATION_STATUS.PARTIALLY_VALID, + message: i18n.translate('xpack.ml.models.jobService.categorization.messages.nullValues', { + defaultMessage: 'More than {percent}% of field values are null.', + values: { percent: NULL_COUNT_PERCENT_LIMIT * 100 }, + }), + }); + } } } diff --git a/x-pack/plugins/transform/public/app/hooks/use_index_data.ts b/x-pack/plugins/transform/public/app/hooks/use_index_data.ts index 6f24017b2274f..c057330507c02 100644 --- a/x-pack/plugins/transform/public/app/hooks/use_index_data.ts +++ b/x-pack/plugins/transform/public/app/hooks/use_index_data.ts @@ -12,13 +12,10 @@ import { isEsSearchResponse, isFieldHistogramsResponseSchema, } from '../../../common/api_schemas/type_guards'; - -import { getErrorMessage } from '../../../common/utils/errors'; - import type { EsSorting, UseIndexDataReturnType } from '../../shared_imports'; +import { getErrorMessage } from '../../../common/utils/errors'; import { isDefaultQuery, matchAllQuery, PivotQuery } from '../common'; - import { SearchItems } from './use_search_items'; import { useApi } from './use_api'; @@ -38,6 +35,7 @@ export const useIndexData = ( showDataGridColumnChartErrorMessageToast, useDataGrid, useRenderCellValue, + getProcessedFields, INDEX_STATUS, }, } = useAppDependencies(); @@ -86,6 +84,8 @@ export const useIndexData = ( const esSearchRequest = { index: indexPattern.title, body: { + fields: ['*'], + _source: false, // Instead of using the default query (`*`), fall back to a more efficient `match_all` query. query: isDefaultQuery(query) ? matchAllQuery : query, from: pagination.pageIndex * pagination.pageSize, @@ -102,7 +102,7 @@ export const useIndexData = ( return; } - const docs = resp.hits.hits.map((d) => d._source); + const docs = resp.hits.hits.map((d) => getProcessedFields(d.fields)); setRowCount(resp.hits.total.value); setTableItems(docs); From a812db3e26be203d8f479f89657ecf1248e0c3bc Mon Sep 17 00:00:00 2001 From: Patrick Mueller Date: Mon, 5 Oct 2020 14:05:34 -0400 Subject: [PATCH 34/49] [Alerts] resolve flaky lastExecutionDate tests (#79436) resolves https://github.com/elastic/kibana/issues/79249 The tests that were flaky were capturing a date while the test was running, and then comparing to a lastExecutionDate field. Most of the time this worked, but were sometimes out of order because of the way the searches are done and status changing dynamically. The only current dates we can test against are really at the very beginning and very end of the tests. --- .../spaces_only/tests/alerting/execution_status.ts | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/x-pack/test/alerting_api_integration/spaces_only/tests/alerting/execution_status.ts b/x-pack/test/alerting_api_integration/spaces_only/tests/alerting/execution_status.ts index 1c2e51637fb41..16a37bdf77662 100644 --- a/x-pack/test/alerting_api_integration/spaces_only/tests/alerting/execution_status.ts +++ b/x-pack/test/alerting_api_integration/spaces_only/tests/alerting/execution_status.ts @@ -19,8 +19,7 @@ import { FtrProviderContext } from '../../../common/ftr_provider_context'; export default function executionStatusAlertTests({ getService }: FtrProviderContext) { const supertest = getService('supertest'); - // FLAKY: https://github.com/elastic/kibana/issues/79249 - describe.skip('executionStatus', () => { + describe('executionStatus', () => { const objectRemover = new ObjectRemover(supertest); after(async () => await objectRemover.removeAll()); @@ -65,7 +64,6 @@ export default function executionStatusAlertTests({ getService }: FtrProviderCon expect(response.status).to.eql(200); const alertId = response.body.id; dates.push(response.body.executionStatus.lastExecutionDate); - dates.push(Date.now()); objectRemover.add(Spaces.space1.id, alertId, 'alert', 'alerts'); const executionStatus = await waitForStatus(alertId, new Set(['ok'])); @@ -100,7 +98,6 @@ export default function executionStatusAlertTests({ getService }: FtrProviderCon expect(response.status).to.eql(200); const alertId = response.body.id; dates.push(response.body.executionStatus.lastExecutionDate); - dates.push(Date.now()); objectRemover.add(Spaces.space1.id, alertId, 'alert', 'alerts'); const executionStatus = await waitForStatus(alertId, new Set(['active'])); @@ -132,7 +129,6 @@ export default function executionStatusAlertTests({ getService }: FtrProviderCon expect(response.status).to.eql(200); const alertId = response.body.id; dates.push(response.body.executionStatus.lastExecutionDate); - dates.push(Date.now()); objectRemover.add(Spaces.space1.id, alertId, 'alert', 'alerts'); const executionStatus = await waitForStatus(alertId, new Set(['error'])); From dca9e706166783106c5538bb31fbc83e15a7e29b Mon Sep 17 00:00:00 2001 From: Aleh Zasypkin Date: Mon, 5 Oct 2020 20:07:23 +0200 Subject: [PATCH 35/49] Ignore intermediate unauthenticated session during repeated authentication attempt. (#79300) --- .github/CODEOWNERS | 2 -- x-pack/README.md | 4 +-- .../authentication/authenticator.test.ts | 28 ++++++------------- .../server/authentication/authenticator.ts | 14 ++++++---- x-pack/scripts/functional_tests.js | 4 +-- .../ftr_provider_context.d.ts | 11 -------- .../services.ts | 14 ---------- .../test/saml_api_integration/apis/index.ts | 14 ---------- .../ftr_provider_context.d.ts | 11 -------- x-pack/test/saml_api_integration/services.ts | 15 ---------- .../fixtures/saml}/idp_metadata.xml | 0 .../fixtures/saml}/idp_metadata_2.xml | 0 .../fixtures/saml}/saml_provider/kibana.json | 0 .../fixtures/saml}/saml_provider/metadata.xml | 0 .../saml}/saml_provider/server/index.ts | 2 +- .../saml}/saml_provider/server/init_routes.ts | 2 +- .../fixtures/saml}/saml_tools.ts | 0 .../login_selector.config.ts} | 14 +++------- .../saml.config.ts} | 6 ++-- .../test/security_api_integration/services.ts | 1 - .../login_selector/basic_functionality.ts} | 22 +++++++++++---- .../tests/login_selector}/index.ts | 6 ++-- .../tests/saml}/index.ts | 4 ++- .../tests/saml}/saml_login.ts | 6 +++- .../tests/session_idle/cleanup.ts | 4 ++- .../tests/session_lifespan/cleanup.ts | 4 ++- .../login_selector.config.ts | 10 +++++-- .../test/security_functional/saml.config.ts | 10 +++++-- 28 files changed, 80 insertions(+), 128 deletions(-) delete mode 100644 x-pack/test/login_selector_api_integration/ftr_provider_context.d.ts delete mode 100644 x-pack/test/login_selector_api_integration/services.ts delete mode 100644 x-pack/test/saml_api_integration/apis/index.ts delete mode 100644 x-pack/test/saml_api_integration/ftr_provider_context.d.ts delete mode 100644 x-pack/test/saml_api_integration/services.ts rename x-pack/test/{saml_api_integration/fixtures => security_api_integration/fixtures/saml}/idp_metadata.xml (100%) rename x-pack/test/{saml_api_integration/fixtures => security_api_integration/fixtures/saml}/idp_metadata_2.xml (100%) rename x-pack/test/{saml_api_integration/fixtures => security_api_integration/fixtures/saml}/saml_provider/kibana.json (100%) rename x-pack/test/{saml_api_integration/fixtures => security_api_integration/fixtures/saml}/saml_provider/metadata.xml (100%) rename x-pack/test/{saml_api_integration/fixtures => security_api_integration/fixtures/saml}/saml_provider/server/index.ts (85%) rename x-pack/test/{saml_api_integration/fixtures => security_api_integration/fixtures/saml}/saml_provider/server/init_routes.ts (96%) rename x-pack/test/{saml_api_integration/fixtures => security_api_integration/fixtures/saml}/saml_tools.ts (100%) rename x-pack/test/{login_selector_api_integration/config.ts => security_api_integration/login_selector.config.ts} (95%) rename x-pack/test/{saml_api_integration/config.ts => security_api_integration/saml.config.ts} (92%) rename x-pack/test/{login_selector_api_integration/apis/login_selector.ts => security_api_integration/tests/login_selector/basic_functionality.ts} (96%) rename x-pack/test/{login_selector_api_integration/apis => security_api_integration/tests/login_selector}/index.ts (65%) rename x-pack/test/{saml_api_integration/apis/security => security_api_integration/tests/saml}/index.ts (84%) rename x-pack/test/{saml_api_integration/apis/security => security_api_integration/tests/saml}/saml_login.ts (99%) diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index d1cf0300b9e17..4db1c2dd3b5eb 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -263,10 +263,8 @@ /x-pack/test/encrypted_saved_objects_api_integration/ @elastic/kibana-security /x-pack/test/functional/apps/security/ @elastic/kibana-security /x-pack/test/kerberos_api_integration/ @elastic/kibana-security -/x-pack/test/login_selector_api_integration/ @elastic/kibana-security /x-pack/test/oidc_api_integration/ @elastic/kibana-security /x-pack/test/pki_api_integration/ @elastic/kibana-security -/x-pack/test/saml_api_integration/ @elastic/kibana-security /x-pack/test/security_api_integration/ @elastic/kibana-security /x-pack/test/security_functional/ @elastic/kibana-security /x-pack/test/spaces_api_integration/ @elastic/kibana-security diff --git a/x-pack/README.md b/x-pack/README.md index 0449f1fc1bdab..73d8736124843 100644 --- a/x-pack/README.md +++ b/x-pack/README.md @@ -55,7 +55,7 @@ yarn test:mocha For more info, see [the Elastic functional test development guide](https://www.elastic.co/guide/en/kibana/current/development-functional-tests.html). -The functional UI tests, the API integration tests, and the SAML API integration tests are all run against a live browser, Kibana, and Elasticsearch install. Each set of tests is specified with a unique config that describes how to start the Elasticsearch server, the Kibana server, and what tests to run against them. The sets of tests that exist today are *functional UI tests* ([specified by this config](test/functional/config.js)), *API integration tests* ([specified by this config](test/api_integration/config.ts)), and *SAML API integration tests* ([specified by this config](test/saml_api_integration/config.ts)). +The functional UI tests, the API integration tests, and the SAML API integration tests are all run against a live browser, Kibana, and Elasticsearch install. Each set of tests is specified with a unique config that describes how to start the Elasticsearch server, the Kibana server, and what tests to run against them. The sets of tests that exist today are *functional UI tests* ([specified by this config](test/functional/config.js)), *API integration tests* ([specified by this config](test/api_integration/config.ts)), and *SAML API integration tests* ([specified by this config](test/security_api_integration/saml.config.ts)). The script runs all sets of tests sequentially like so: * builds Elasticsearch and X-Pack @@ -108,7 +108,7 @@ node scripts/functional_tests --config test/api_integration/config We also have SAML API integration tests which set up Elasticsearch and Kibana with SAML support. Run _only_ API integration tests with SAML enabled like so: ```sh -node scripts/functional_tests --config test/saml_api_integration/config +node scripts/functional_tests --config test/security_api_integration/saml.config ``` #### Running Jest integration tests diff --git a/x-pack/plugins/security/server/authentication/authenticator.test.ts b/x-pack/plugins/security/server/authentication/authenticator.test.ts index fcc652505ba3a..4f52ebe3065a3 100644 --- a/x-pack/plugins/security/server/authentication/authenticator.test.ts +++ b/x-pack/plugins/security/server/authentication/authenticator.test.ts @@ -1374,6 +1374,14 @@ describe('Authenticator', () => { '/mock-server-basepath/login?next=%2Fmock-server-basepath%2Fpath' ) ); + + // Unauthenticated session should be treated as non-existent one. + mockOptions.session.get.mockResolvedValue({ ...mockSessVal, username: undefined }); + await expect(authenticator.authenticate(request)).resolves.toEqual( + AuthenticationResult.redirectTo( + '/mock-server-basepath/login?next=%2Fmock-server-basepath%2Fpath' + ) + ); expect(mockBasicAuthenticationProvider.authenticate).not.toHaveBeenCalled(); }); }); @@ -1591,26 +1599,6 @@ describe('Authenticator', () => { ); }); - it('does not redirect to Overwritten Session if session was unauthenticated before this authentication attempt', async () => { - const request = httpServerMock.createKibanaRequest(); - mockOptions.session.get.mockResolvedValue({ ...mockSessVal, username: undefined }); - - const newMockUser = mockAuthenticatedUser({ username: 'new-username' }); - mockBasicAuthenticationProvider.authenticate.mockResolvedValue( - AuthenticationResult.succeeded(newMockUser, { - state: 'some-state', - authResponseHeaders: { 'WWW-Authenticate': 'Negotiate' }, - }) - ); - - await expect(authenticator.authenticate(request)).resolves.toEqual( - AuthenticationResult.succeeded(newMockUser, { - state: 'some-state', - authResponseHeaders: { 'WWW-Authenticate': 'Negotiate' }, - }) - ); - }); - it('redirects to Overwritten Session when username changes', async () => { const request = httpServerMock.createKibanaRequest(); mockOptions.session.get.mockResolvedValue({ ...mockSessVal, username: 'old-username' }); diff --git a/x-pack/plugins/security/server/authentication/authenticator.ts b/x-pack/plugins/security/server/authentication/authenticator.ts index 1fb9d9221f041..b8ec6258eb0d5 100644 --- a/x-pack/plugins/security/server/authentication/authenticator.ts +++ b/x-pack/plugins/security/server/authentication/authenticator.ts @@ -131,6 +131,10 @@ function isLoginAttemptWithProviderType( ); } +function isSessionAuthenticated(sessionValue?: Readonly | null) { + return !!sessionValue?.username; +} + /** * Instantiates authentication provider based on the provider key from config. * @param providerType Provider type key. @@ -558,7 +562,7 @@ export class Authenticator { return ownsSession ? { value: existingSessionValue, overwritten: false } : null; } - const isExistingSessionAuthenticated = !!existingSessionValue?.username; + const isExistingSessionAuthenticated = isSessionAuthenticated(existingSessionValue); const isNewSessionAuthenticated = !!authenticationResult.user; const providerHasChanged = !!existingSessionValue && !ownsSession; @@ -637,7 +641,7 @@ export class Authenticator { // 4. Request isn't attributed with HTTP Authorization header return ( canRedirectRequest(request) && - !sessionValue && + !isSessionAuthenticated(sessionValue) && this.options.config.authc.selector.enabled && HTTPAuthorizationHeader.parseFromRequest(request) == null ); @@ -688,14 +692,14 @@ export class Authenticator { return authenticationResult; } - const isSessionAuthenticated = !!sessionUpdateResult?.value?.username; + const isUpdatedSessionAuthenticated = isSessionAuthenticated(sessionUpdateResult?.value); let preAccessRedirectURL; - if (isSessionAuthenticated && sessionUpdateResult?.overwritten) { + if (isUpdatedSessionAuthenticated && sessionUpdateResult?.overwritten) { this.logger.debug('Redirecting user to the overwritten session UI.'); preAccessRedirectURL = `${this.options.basePath.serverBasePath}${OVERWRITTEN_SESSION_ROUTE}`; } else if ( - isSessionAuthenticated && + isUpdatedSessionAuthenticated && this.shouldRedirectToAccessAgreement(sessionUpdateResult?.value ?? null) ) { this.logger.debug('Redirecting user to the access agreement UI.'); diff --git a/x-pack/scripts/functional_tests.js b/x-pack/scripts/functional_tests.js index 6271c4b601307..6c0edd904b0e7 100644 --- a/x-pack/scripts/functional_tests.js +++ b/x-pack/scripts/functional_tests.js @@ -31,16 +31,16 @@ const onlyNotInCoverageTests = [ require.resolve('../test/plugin_api_integration/config.ts'), require.resolve('../test/kerberos_api_integration/config.ts'), require.resolve('../test/kerberos_api_integration/anonymous_access.config.ts'), - require.resolve('../test/saml_api_integration/config.ts'), + require.resolve('../test/security_api_integration/saml.config.ts'), require.resolve('../test/security_api_integration/session_idle.config.ts'), require.resolve('../test/security_api_integration/session_lifespan.config.ts'), + require.resolve('../test/security_api_integration/login_selector.config.ts'), require.resolve('../test/token_api_integration/config.js'), require.resolve('../test/oidc_api_integration/config.ts'), require.resolve('../test/oidc_api_integration/implicit_flow.config.ts'), require.resolve('../test/observability_api_integration/basic/config.ts'), require.resolve('../test/observability_api_integration/trial/config.ts'), require.resolve('../test/pki_api_integration/config.ts'), - require.resolve('../test/login_selector_api_integration/config.ts'), require.resolve('../test/encrypted_saved_objects_api_integration/config.ts'), require.resolve('../test/spaces_api_integration/spaces_only/config.ts'), require.resolve('../test/spaces_api_integration/security_and_spaces/config_trial.ts'), diff --git a/x-pack/test/login_selector_api_integration/ftr_provider_context.d.ts b/x-pack/test/login_selector_api_integration/ftr_provider_context.d.ts deleted file mode 100644 index e3add3748f56d..0000000000000 --- a/x-pack/test/login_selector_api_integration/ftr_provider_context.d.ts +++ /dev/null @@ -1,11 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import { GenericFtrProviderContext } from '@kbn/test/types/ftr'; - -import { services } from './services'; - -export type FtrProviderContext = GenericFtrProviderContext; diff --git a/x-pack/test/login_selector_api_integration/services.ts b/x-pack/test/login_selector_api_integration/services.ts deleted file mode 100644 index 8bb2dae90bf59..0000000000000 --- a/x-pack/test/login_selector_api_integration/services.ts +++ /dev/null @@ -1,14 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import { services as commonServices } from '../common/services'; -import { services as apiIntegrationServices } from '../api_integration/services'; - -export const services = { - ...commonServices, - randomness: apiIntegrationServices.randomness, - supertestWithoutAuth: apiIntegrationServices.supertestWithoutAuth, -}; diff --git a/x-pack/test/saml_api_integration/apis/index.ts b/x-pack/test/saml_api_integration/apis/index.ts deleted file mode 100644 index 174e7828a11d4..0000000000000 --- a/x-pack/test/saml_api_integration/apis/index.ts +++ /dev/null @@ -1,14 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import { FtrProviderContext } from '../ftr_provider_context'; - -export default function ({ loadTestFile }: FtrProviderContext) { - describe('apis SAML', function () { - this.tags('ciGroup6'); - loadTestFile(require.resolve('./security')); - }); -} diff --git a/x-pack/test/saml_api_integration/ftr_provider_context.d.ts b/x-pack/test/saml_api_integration/ftr_provider_context.d.ts deleted file mode 100644 index e3add3748f56d..0000000000000 --- a/x-pack/test/saml_api_integration/ftr_provider_context.d.ts +++ /dev/null @@ -1,11 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import { GenericFtrProviderContext } from '@kbn/test/types/ftr'; - -import { services } from './services'; - -export type FtrProviderContext = GenericFtrProviderContext; diff --git a/x-pack/test/saml_api_integration/services.ts b/x-pack/test/saml_api_integration/services.ts deleted file mode 100644 index de300af03bbe6..0000000000000 --- a/x-pack/test/saml_api_integration/services.ts +++ /dev/null @@ -1,15 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import { services as commonServices } from '../common/services'; -import { services as apiIntegrationServices } from '../api_integration/services'; - -export const services = { - ...commonServices, - randomness: apiIntegrationServices.randomness, - legacyEs: apiIntegrationServices.legacyEs, - supertestWithoutAuth: apiIntegrationServices.supertestWithoutAuth, -}; diff --git a/x-pack/test/saml_api_integration/fixtures/idp_metadata.xml b/x-pack/test/security_api_integration/fixtures/saml/idp_metadata.xml similarity index 100% rename from x-pack/test/saml_api_integration/fixtures/idp_metadata.xml rename to x-pack/test/security_api_integration/fixtures/saml/idp_metadata.xml diff --git a/x-pack/test/saml_api_integration/fixtures/idp_metadata_2.xml b/x-pack/test/security_api_integration/fixtures/saml/idp_metadata_2.xml similarity index 100% rename from x-pack/test/saml_api_integration/fixtures/idp_metadata_2.xml rename to x-pack/test/security_api_integration/fixtures/saml/idp_metadata_2.xml diff --git a/x-pack/test/saml_api_integration/fixtures/saml_provider/kibana.json b/x-pack/test/security_api_integration/fixtures/saml/saml_provider/kibana.json similarity index 100% rename from x-pack/test/saml_api_integration/fixtures/saml_provider/kibana.json rename to x-pack/test/security_api_integration/fixtures/saml/saml_provider/kibana.json diff --git a/x-pack/test/saml_api_integration/fixtures/saml_provider/metadata.xml b/x-pack/test/security_api_integration/fixtures/saml/saml_provider/metadata.xml similarity index 100% rename from x-pack/test/saml_api_integration/fixtures/saml_provider/metadata.xml rename to x-pack/test/security_api_integration/fixtures/saml/saml_provider/metadata.xml diff --git a/x-pack/test/saml_api_integration/fixtures/saml_provider/server/index.ts b/x-pack/test/security_api_integration/fixtures/saml/saml_provider/server/index.ts similarity index 85% rename from x-pack/test/saml_api_integration/fixtures/saml_provider/server/index.ts rename to x-pack/test/security_api_integration/fixtures/saml/saml_provider/server/index.ts index d4dda70cef694..25aa4ad61900e 100644 --- a/x-pack/test/saml_api_integration/fixtures/saml_provider/server/index.ts +++ b/x-pack/test/security_api_integration/fixtures/saml/saml_provider/server/index.ts @@ -4,7 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ -import { PluginInitializer } from '../../../../../../src/core/server'; +import { PluginInitializer } from '../../../../../../../src/core/server'; import { initRoutes } from './init_routes'; export const plugin: PluginInitializer = () => ({ diff --git a/x-pack/test/saml_api_integration/fixtures/saml_provider/server/init_routes.ts b/x-pack/test/security_api_integration/fixtures/saml/saml_provider/server/init_routes.ts similarity index 96% rename from x-pack/test/saml_api_integration/fixtures/saml_provider/server/init_routes.ts rename to x-pack/test/security_api_integration/fixtures/saml/saml_provider/server/init_routes.ts index f2c91ea7d1e03..10ec104db939b 100644 --- a/x-pack/test/saml_api_integration/fixtures/saml_provider/server/init_routes.ts +++ b/x-pack/test/security_api_integration/fixtures/saml/saml_provider/server/init_routes.ts @@ -4,7 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ -import { CoreSetup } from '../../../../../../src/core/server'; +import { CoreSetup } from '../../../../../../../src/core/server'; import { getSAMLResponse, getSAMLRequestId } from '../../saml_tools'; export function initRoutes(core: CoreSetup) { diff --git a/x-pack/test/saml_api_integration/fixtures/saml_tools.ts b/x-pack/test/security_api_integration/fixtures/saml/saml_tools.ts similarity index 100% rename from x-pack/test/saml_api_integration/fixtures/saml_tools.ts rename to x-pack/test/security_api_integration/fixtures/saml/saml_tools.ts diff --git a/x-pack/test/login_selector_api_integration/config.ts b/x-pack/test/security_api_integration/login_selector.config.ts similarity index 95% rename from x-pack/test/login_selector_api_integration/config.ts rename to x-pack/test/security_api_integration/login_selector.config.ts index fb711a8bef488..0e43715ba808e 100644 --- a/x-pack/test/login_selector_api_integration/config.ts +++ b/x-pack/test/security_api_integration/login_selector.config.ts @@ -23,14 +23,8 @@ export default async function ({ readConfigFile }: FtrConfigProviderContext) { const pkiKibanaCAPath = resolve(__dirname, '../pki_api_integration/fixtures/kibana_ca.crt'); - const saml1IdPMetadataPath = resolve( - __dirname, - '../saml_api_integration/fixtures/idp_metadata.xml' - ); - const saml2IdPMetadataPath = resolve( - __dirname, - '../saml_api_integration/fixtures/idp_metadata_2.xml' - ); + const saml1IdPMetadataPath = resolve(__dirname, './fixtures/saml/idp_metadata.xml'); + const saml2IdPMetadataPath = resolve(__dirname, './fixtures/saml/idp_metadata_2.xml'); const servers = { ...xPackAPITestsConfig.get('servers'), @@ -45,7 +39,7 @@ export default async function ({ readConfigFile }: FtrConfigProviderContext) { }; return { - testFiles: [require.resolve('./apis')], + testFiles: [require.resolve('./tests/login_selector')], servers, security: { disableTestUser: true }, services: { @@ -54,7 +48,7 @@ export default async function ({ readConfigFile }: FtrConfigProviderContext) { supertestWithoutAuth: xPackAPITestsConfig.get('services.supertestWithoutAuth'), }, junit: { - reportName: 'X-Pack Login Selector API Integration Tests', + reportName: 'X-Pack Security API Integration Tests (Login Selector)', }, esTestCluster: { diff --git a/x-pack/test/saml_api_integration/config.ts b/x-pack/test/security_api_integration/saml.config.ts similarity index 92% rename from x-pack/test/saml_api_integration/config.ts rename to x-pack/test/security_api_integration/saml.config.ts index 9edadca4c1667..133e52d68d87e 100644 --- a/x-pack/test/saml_api_integration/config.ts +++ b/x-pack/test/security_api_integration/saml.config.ts @@ -14,10 +14,10 @@ export default async function ({ readConfigFile }: FtrConfigProviderContext) { const xPackAPITestsConfig = await readConfigFile(require.resolve('../api_integration/config.ts')); const kibanaPort = xPackAPITestsConfig.get('servers.kibana.port'); - const idpPath = resolve(__dirname, '../../test/saml_api_integration/fixtures/idp_metadata.xml'); + const idpPath = resolve(__dirname, './fixtures/saml/idp_metadata.xml'); return { - testFiles: [require.resolve('./apis')], + testFiles: [require.resolve('./tests/saml')], servers: xPackAPITestsConfig.get('servers'), security: { disableTestUser: true }, services: { @@ -26,7 +26,7 @@ export default async function ({ readConfigFile }: FtrConfigProviderContext) { supertestWithoutAuth: xPackAPITestsConfig.get('services.supertestWithoutAuth'), }, junit: { - reportName: 'X-Pack SAML API Integration Tests', + reportName: 'X-Pack Security API Integration Tests (SAML)', }, esTestCluster: { diff --git a/x-pack/test/security_api_integration/services.ts b/x-pack/test/security_api_integration/services.ts index e2abfa71451bc..a8d8048462693 100644 --- a/x-pack/test/security_api_integration/services.ts +++ b/x-pack/test/security_api_integration/services.ts @@ -9,6 +9,5 @@ import { services as apiIntegrationServices } from '../api_integration/services' export const services = { ...commonServices, - legacyEs: apiIntegrationServices.legacyEs, supertestWithoutAuth: apiIntegrationServices.supertestWithoutAuth, }; diff --git a/x-pack/test/login_selector_api_integration/apis/login_selector.ts b/x-pack/test/security_api_integration/tests/login_selector/basic_functionality.ts similarity index 96% rename from x-pack/test/login_selector_api_integration/apis/login_selector.ts rename to x-pack/test/security_api_integration/tests/login_selector/basic_functionality.ts index 44582355cf890..2881020f521ee 100644 --- a/x-pack/test/login_selector_api_integration/apis/login_selector.ts +++ b/x-pack/test/security_api_integration/tests/login_selector/basic_functionality.ts @@ -10,13 +10,13 @@ import { resolve } from 'path'; import url from 'url'; import { CA_CERT_PATH } from '@kbn/dev-utils'; import expect from '@kbn/expect'; -import { getStateAndNonce } from '../../oidc_api_integration/fixtures/oidc_tools'; +import { getStateAndNonce } from '../../../oidc_api_integration/fixtures/oidc_tools'; import { getMutualAuthenticationResponseToken, getSPNEGOToken, -} from '../../kerberos_api_integration/fixtures/kerberos_tools'; -import { getSAMLRequestId, getSAMLResponse } from '../../saml_api_integration/fixtures/saml_tools'; -import { FtrProviderContext } from '../ftr_provider_context'; +} from '../../../kerberos_api_integration/fixtures/kerberos_tools'; +import { getSAMLRequestId, getSAMLResponse } from '../../fixtures/saml/saml_tools'; +import { FtrProviderContext } from '../../ftr_provider_context'; export default function ({ getService }: FtrProviderContext) { const randomness = getService('randomness'); @@ -29,7 +29,7 @@ export default function ({ getService }: FtrProviderContext) { const CA_CERT = readFileSync(CA_CERT_PATH); const CLIENT_CERT = readFileSync( - resolve(__dirname, '../../pki_api_integration/fixtures/first_client.p12') + resolve(__dirname, '../../../pki_api_integration/fixtures/first_client.p12') ); async function checkSessionCookie( @@ -97,11 +97,23 @@ export default function ({ getService }: FtrProviderContext) { // to fully authenticate user yet. const intermediateAuthCookie = request.cookie(handshakeResponse.headers['set-cookie'][0])!; + // When login page is accessed directly. await supertest .get('/login') .ca(CA_CERT) .set('Cookie', intermediateAuthCookie.cookieString()) .expect(200); + + // When user tries to access any other page in Kibana. + const response = await supertest + .get('/abc/xyz/handshake?one=two three') + .ca(CA_CERT) + .set('Cookie', intermediateAuthCookie.cookieString()) + .expect(302); + expect(response.headers['set-cookie']).to.be(undefined); + expect(response.headers.location).to.be( + '/login?next=%2Fabc%2Fxyz%2Fhandshake%3Fone%3Dtwo%2520three' + ); }); describe('SAML', () => { diff --git a/x-pack/test/login_selector_api_integration/apis/index.ts b/x-pack/test/security_api_integration/tests/login_selector/index.ts similarity index 65% rename from x-pack/test/login_selector_api_integration/apis/index.ts rename to x-pack/test/security_api_integration/tests/login_selector/index.ts index a4d92ebc2e109..408bfe0b52c4b 100644 --- a/x-pack/test/login_selector_api_integration/apis/index.ts +++ b/x-pack/test/security_api_integration/tests/login_selector/index.ts @@ -4,11 +4,11 @@ * you may not use this file except in compliance with the Elastic License. */ -import { FtrProviderContext } from '../ftr_provider_context'; +import { FtrProviderContext } from '../../ftr_provider_context'; export default function ({ loadTestFile }: FtrProviderContext) { - describe('apis', function () { + describe('security APIs - Login Selector', function () { this.tags('ciGroup6'); - loadTestFile(require.resolve('./login_selector')); + loadTestFile(require.resolve('./basic_functionality')); }); } diff --git a/x-pack/test/saml_api_integration/apis/security/index.ts b/x-pack/test/security_api_integration/tests/saml/index.ts similarity index 84% rename from x-pack/test/saml_api_integration/apis/security/index.ts rename to x-pack/test/security_api_integration/tests/saml/index.ts index aac9a82ec5680..882c8774e54e6 100644 --- a/x-pack/test/saml_api_integration/apis/security/index.ts +++ b/x-pack/test/security_api_integration/tests/saml/index.ts @@ -7,7 +7,9 @@ import { FtrProviderContext } from '../../ftr_provider_context'; export default function ({ loadTestFile }: FtrProviderContext) { - describe('security', () => { + describe('security APIs - SAML', function () { + this.tags('ciGroup6'); + loadTestFile(require.resolve('./saml_login')); }); } diff --git a/x-pack/test/saml_api_integration/apis/security/saml_login.ts b/x-pack/test/security_api_integration/tests/saml/saml_login.ts similarity index 99% rename from x-pack/test/saml_api_integration/apis/security/saml_login.ts rename to x-pack/test/security_api_integration/tests/saml/saml_login.ts index 2da7c92cd07b6..8770d87c0cf8c 100644 --- a/x-pack/test/saml_api_integration/apis/security/saml_login.ts +++ b/x-pack/test/security_api_integration/tests/saml/saml_login.ts @@ -9,7 +9,11 @@ import url from 'url'; import { delay } from 'bluebird'; import expect from '@kbn/expect'; import request, { Cookie } from 'request'; -import { getLogoutRequest, getSAMLRequestId, getSAMLResponse } from '../../fixtures/saml_tools'; +import { + getLogoutRequest, + getSAMLRequestId, + getSAMLResponse, +} from '../../fixtures/saml/saml_tools'; import { FtrProviderContext } from '../../ftr_provider_context'; export default function ({ getService }: FtrProviderContext) { diff --git a/x-pack/test/security_api_integration/tests/session_idle/cleanup.ts b/x-pack/test/security_api_integration/tests/session_idle/cleanup.ts index 01e2ad76fb3d2..703180442f8f5 100644 --- a/x-pack/test/security_api_integration/tests/session_idle/cleanup.ts +++ b/x-pack/test/security_api_integration/tests/session_idle/cleanup.ts @@ -30,7 +30,9 @@ export default function ({ getService }: FtrProviderContext) { } async function getNumberOfSessionDocuments() { - return (await es.search({ index: '.kibana_security_session*' })).hits.total.value; + return (((await es.search({ index: '.kibana_security_session*' })).hits.total as unknown) as { + value: number; + }).value; } describe('Session Idle cleanup', () => { diff --git a/x-pack/test/security_api_integration/tests/session_lifespan/cleanup.ts b/x-pack/test/security_api_integration/tests/session_lifespan/cleanup.ts index 6036acf3d1cf1..8b136e540f13f 100644 --- a/x-pack/test/security_api_integration/tests/session_lifespan/cleanup.ts +++ b/x-pack/test/security_api_integration/tests/session_lifespan/cleanup.ts @@ -27,7 +27,9 @@ export default function ({ getService }: FtrProviderContext) { } async function getNumberOfSessionDocuments() { - return (await es.search({ index: '.kibana_security_session*' })).hits.total.value; + return (((await es.search({ index: '.kibana_security_session*' })).hits.total as unknown) as { + value: number; + }).value; } describe('Session Lifespan cleanup', () => { diff --git a/x-pack/test/security_functional/login_selector.config.ts b/x-pack/test/security_functional/login_selector.config.ts index bdb4778740503..9fc4c54ba1344 100644 --- a/x-pack/test/security_functional/login_selector.config.ts +++ b/x-pack/test/security_functional/login_selector.config.ts @@ -20,8 +20,14 @@ export default async function ({ readConfigFile }: FtrConfigProviderContext) { ); const kibanaPort = kibanaFunctionalConfig.get('servers.kibana.port'); - const idpPath = resolve(__dirname, '../saml_api_integration/fixtures/saml_provider/metadata.xml'); - const samlIdPPlugin = resolve(__dirname, '../saml_api_integration/fixtures/saml_provider'); + const idpPath = resolve( + __dirname, + '../security_api_integration/fixtures/saml/saml_provider/metadata.xml' + ); + const samlIdPPlugin = resolve( + __dirname, + '../security_api_integration/fixtures/saml/saml_provider' + ); return { testFiles: [resolve(__dirname, './tests/login_selector')], diff --git a/x-pack/test/security_functional/saml.config.ts b/x-pack/test/security_functional/saml.config.ts index 9d925bee480a8..1e032bdcc6ac7 100644 --- a/x-pack/test/security_functional/saml.config.ts +++ b/x-pack/test/security_functional/saml.config.ts @@ -20,8 +20,14 @@ export default async function ({ readConfigFile }: FtrConfigProviderContext) { ); const kibanaPort = kibanaFunctionalConfig.get('servers.kibana.port'); - const idpPath = resolve(__dirname, '../saml_api_integration/fixtures/saml_provider/metadata.xml'); - const samlIdPPlugin = resolve(__dirname, '../saml_api_integration/fixtures/saml_provider'); + const idpPath = resolve( + __dirname, + '../security_api_integration/fixtures/saml/saml_provider/metadata.xml' + ); + const samlIdPPlugin = resolve( + __dirname, + '../security_api_integration/fixtures/saml/saml_provider' + ); return { testFiles: [resolve(__dirname, './tests/saml')], From 9011f42d7ffa8b1ad690d2ef4aa03216bc4401b5 Mon Sep 17 00:00:00 2001 From: Brian Seeders Date: Mon, 5 Oct 2020 14:30:49 -0400 Subject: [PATCH 36/49] Skip failing suite (#79522) --- .../cypress/integration/alerts_detection_rules_eql.spec.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/x-pack/plugins/security_solution/cypress/integration/alerts_detection_rules_eql.spec.ts b/x-pack/plugins/security_solution/cypress/integration/alerts_detection_rules_eql.spec.ts index a7ddba94bffd2..13e5edd1cfe23 100644 --- a/x-pack/plugins/security_solution/cypress/integration/alerts_detection_rules_eql.spec.ts +++ b/x-pack/plugins/security_solution/cypress/integration/alerts_detection_rules_eql.spec.ts @@ -87,7 +87,8 @@ const expectedNumberOfRules = 1; const expectedNumberOfAlerts = 7; const expectedNumberOfSequenceAlerts = 1; -describe('Detection rules, EQL', () => { +// Failing: See https://github.com/elastic/kibana/issues/79522 +describe.skip('Detection rules, EQL', () => { before(() => { esArchiverLoad('timeline'); }); From a074ef5e078650be607ddc48474586f2e080de47 Mon Sep 17 00:00:00 2001 From: Nathan Reese Date: Mon, 5 Oct 2020 12:31:19 -0600 Subject: [PATCH 37/49] [Maps] enable auto fit to bounds by default (#79296) * [Maps] enable auto fit to bounds by default * type fixes and functional test fixes * final tslint fixes * update jest expect Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- .../set_default_auto_fit_to_bounds.test.tsx | 40 +++++++++++++++++++ .../set_default_auto_fit_to_bounds.ts | 34 ++++++++++++++++ .../navigation_panel.test.tsx.snap | 6 +-- .../public/reducers/default_map_settings.ts | 2 +- .../maps/server/saved_objects/migrations.js | 9 +++++ .../api_integration/apis/maps/migrations.js | 2 +- 6 files changed, 88 insertions(+), 5 deletions(-) create mode 100644 x-pack/plugins/maps/common/migrations/set_default_auto_fit_to_bounds.test.tsx create mode 100644 x-pack/plugins/maps/common/migrations/set_default_auto_fit_to_bounds.ts diff --git a/x-pack/plugins/maps/common/migrations/set_default_auto_fit_to_bounds.test.tsx b/x-pack/plugins/maps/common/migrations/set_default_auto_fit_to_bounds.test.tsx new file mode 100644 index 0000000000000..cbdd253b6e2dd --- /dev/null +++ b/x-pack/plugins/maps/common/migrations/set_default_auto_fit_to_bounds.test.tsx @@ -0,0 +1,40 @@ +/* + * 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 { setDefaultAutoFitToBounds } from './set_default_auto_fit_to_bounds'; + +describe('setDefaultAutoFitToBounds', () => { + test('Should handle missing mapStateJSON attribute', () => { + const attributes = { + title: 'my map', + }; + expect(setDefaultAutoFitToBounds({ attributes })).toEqual({ + title: 'my map', + }); + }); + + test('Should set default auto fit to bounds when map settings exist in map state', () => { + const attributes = { + title: 'my map', + mapStateJSON: JSON.stringify({ + settings: { showSpatialFilters: false }, + }), + }; + expect(JSON.parse(setDefaultAutoFitToBounds({ attributes }).mapStateJSON!)).toEqual({ + settings: { autoFitToDataBounds: false, showSpatialFilters: false }, + }); + }); + + test('Should set default auto fit to bounds when map settings does not exist in map state', () => { + const attributes = { + title: 'my map', + mapStateJSON: JSON.stringify({}), + }; + expect(JSON.parse(setDefaultAutoFitToBounds({ attributes }).mapStateJSON!)).toEqual({ + settings: { autoFitToDataBounds: false }, + }); + }); +}); diff --git a/x-pack/plugins/maps/common/migrations/set_default_auto_fit_to_bounds.ts b/x-pack/plugins/maps/common/migrations/set_default_auto_fit_to_bounds.ts new file mode 100644 index 0000000000000..09e23b5213d6c --- /dev/null +++ b/x-pack/plugins/maps/common/migrations/set_default_auto_fit_to_bounds.ts @@ -0,0 +1,34 @@ +/* + * 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 { MapSavedObjectAttributes } from '../map_saved_object_type'; + +export function setDefaultAutoFitToBounds({ + attributes, +}: { + attributes: MapSavedObjectAttributes; +}): MapSavedObjectAttributes { + if (!attributes || !attributes.mapStateJSON) { + return attributes; + } + + // MapState type is defined in public, no need to bring all of that to common for this migration + const mapState: { settings?: { autoFitToDataBounds: boolean } } = JSON.parse( + attributes.mapStateJSON + ); + if ('settings' in mapState) { + mapState.settings!.autoFitToDataBounds = false; + } else { + mapState.settings = { + autoFitToDataBounds: false, + }; + } + + return { + ...attributes, + mapStateJSON: JSON.stringify(mapState), + }; +} diff --git a/x-pack/plugins/maps/public/connected_components/map_settings_panel/__snapshots__/navigation_panel.test.tsx.snap b/x-pack/plugins/maps/public/connected_components/map_settings_panel/__snapshots__/navigation_panel.test.tsx.snap index 1859c7d8177f8..a617fbc552854 100644 --- a/x-pack/plugins/maps/public/connected_components/map_settings_panel/__snapshots__/navigation_panel.test.tsx.snap +++ b/x-pack/plugins/maps/public/connected_components/map_settings_panel/__snapshots__/navigation_panel.test.tsx.snap @@ -25,7 +25,7 @@ exports[`should render 1`] = ` labelType="label" > { const attributes = removeBoundsFromSavedObject(doc); + return { + ...doc, + attributes, + }; + }, + '7.10.0': (doc) => { + const attributes = setDefaultAutoFitToBounds(doc); + return { ...doc, attributes, diff --git a/x-pack/test/api_integration/apis/maps/migrations.js b/x-pack/test/api_integration/apis/maps/migrations.js index a9ecaac09db9a..b634e7117e607 100644 --- a/x-pack/test/api_integration/apis/maps/migrations.js +++ b/x-pack/test/api_integration/apis/maps/migrations.js @@ -41,7 +41,7 @@ export default function ({ getService }) { type: 'index-pattern', }, ]); - expect(resp.body.migrationVersion).to.eql({ map: '7.9.0' }); + expect(resp.body.migrationVersion).to.eql({ map: '7.10.0' }); expect(resp.body.attributes.layerListJSON.includes('indexPatternRefName')).to.be(true); }); }); From 106ab7e1d95246b0f385d7f91c358c3b32f318dd Mon Sep 17 00:00:00 2001 From: Kevin Logan <56395104+kevinlog@users.noreply.github.com> Date: Mon, 5 Oct 2020 14:33:37 -0400 Subject: [PATCH 38/49] [SECURITY_SOLUTION] rely on table in test for endpoint list kql bar (#79402) --- .../apps/endpoint/endpoint_list.ts | 30 ++++++++----------- 1 file changed, 12 insertions(+), 18 deletions(-) diff --git a/x-pack/test/security_solution_endpoint/apps/endpoint/endpoint_list.ts b/x-pack/test/security_solution_endpoint/apps/endpoint/endpoint_list.ts index dd28752bf29b4..5b5949821580f 100644 --- a/x-pack/test/security_solution_endpoint/apps/endpoint/endpoint_list.ts +++ b/x-pack/test/security_solution_endpoint/apps/endpoint/endpoint_list.ts @@ -64,8 +64,7 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { ], ]; - // Failing: See https://github.com/elastic/kibana/issues/77278 - describe.skip('endpoint list', function () { + describe('endpoint list', function () { this.tags('ciGroup7'); const sleep = (ms = 100) => new Promise((resolve) => setTimeout(resolve, ms)); @@ -219,8 +218,11 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { await deleteAllDocsFromMetadataCurrentIndex(getService); }); it('for the kql query: na, table shows an empty list', async () => { - await testSubjects.setValue('adminSearchBar', 'na'); - await (await testSubjects.find('querySubmitButton')).click(); + const adminSearchBar = await testSubjects.find('adminSearchBar'); + await adminSearchBar.clearValueWithKeyboard(); + await adminSearchBar.type('na'); + const querySubmitButton = await testSubjects.find('querySubmitButton'); + await querySubmitButton.click(); const expectedDataFromQuery = [ [ 'Hostname', @@ -240,18 +242,14 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { const tableData = await pageObjects.endpointPageUtils.tableData('endpointListTable'); expect(tableData).to.eql(expectedDataFromQuery); }); - it('for the kql query: HostDetails.Endpoint.policy.applied.id : "C2A9093E-E289-4C0A-AA44-8C32A414FA7A", table shows 2 items', async () => { - await testSubjects.setValue('adminSearchBar', ' '); - await (await testSubjects.find('querySubmitButton')).click(); - - const endpointListTableTotal = await testSubjects.getVisibleText('endpointListTableTotal'); - - await testSubjects.setValue( - 'adminSearchBar', + const adminSearchBar = await testSubjects.find('adminSearchBar'); + await adminSearchBar.clearValueWithKeyboard(); + await adminSearchBar.type( 'HostDetails.Endpoint.policy.applied.id : "C2A9093E-E289-4C0A-AA44-8C32A414FA7A" ' ); - await (await testSubjects.find('querySubmitButton')).click(); + const querySubmitButton = await testSubjects.find('querySubmitButton'); + await querySubmitButton.click(); const expectedDataFromQuery = [ [ 'Hostname', @@ -287,11 +285,7 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { '', ], ]; - - await pageObjects.endpoint.waitForVisibleTextToChange( - 'endpointListTableTotal', - endpointListTableTotal - ); + await pageObjects.endpoint.waitForTableToHaveData('endpointListTable'); const tableData = await pageObjects.endpointPageUtils.tableData('endpointListTable'); expect(tableData).to.eql(expectedDataFromQuery); }); From 197510a73718c96e1e838ccd2613f771377ee235 Mon Sep 17 00:00:00 2001 From: Scotty Bollinger Date: Mon, 5 Oct 2020 13:33:58 -0500 Subject: [PATCH 39/49] [Enterprise Search][Workplace Search] Migrate Groups to Kibana (#78679) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Initial copying of Groups component tree This commit moves the base component tree from ent-search with the following changes to satisfy pre-commit hooks - All file names changed to camel_case - Copyright comment added to the top of each file - Semicolons and formatting to match Kibana - Default exports removed from components - Placeholder keyboard listener functions added to non-interactive elements with click handlers * Update paths, remove kea typecasting This commit does the following: - Updates the paths of the imports - Removed the need to typecast logic i.e. "as IGroupsLogic" after the Kea hooks - Fixed a few TypeScript errors with events and return values on functions - Finally, this commit does away with the ConfirmModal component (was never copied over), as it only wraps 2 EUI components and we decided it was not needed * Add constants and image * Update types - Adds new types - Moves types needed by server and app to common * Refactor ContentSection and ViewContentHeader With the groups components, we needed to add a header action that was right-aligned to ContentSection. After building what was needed, I realized that the header in the ContentSection was basically a ViewContentHeader with a different sized heading. I refactored ViewContentHeader to have variable sizes and for ContentSection to use that instead. Also added styles from ent-search * Add group routes This is both the server routes and the frontend paths. After conversation with Jonas, we decided to not use the `/org` prefix. Will clean up the other routes as we build out the rest the migration * Update logic files This commit converts the logic files for use in Kibana. This includes: - Using the new Kea 2.2 syntax that uses MakeLogicType to provide types - Uses the Kibana HttpLogic instead of the rails routes/http - Adds return types to Actions interfaces - Adds `path` key to help with debuggin in dev tools - Removes FashMessages in lieu of separate logic. Because of this, we have to manually clear the flash mesages with listeners where reducers used to do it when the messages were local to the logic file - Preplaces promises with async/await & try/catch - Also, in GroupsLogic’s getSearchResults method, we used Kea’s breakpoint functionality and replaced the useDebouce Hook that was used in the component (future commit) - Uses global lodash per Kibana’s new directive * Update routers an indexes This PR configures the routers to work with Kibana - Updates paths to imports - Adds top-level styles For GroupRouter - Removes AppView - Use global flash messages - Remove sidebar and breadcrumbs * Update GroupOverview Adds some changes to facilitate the new design for Kibana - Copy changes - Layout changes to have buttons inline and not conditionally shown * Various updates to components Adds some changes to facilitate the new design for Kibana. - Remove unnecessary TableHeader - Adds pencil in lieu of manage button per design * Update main groups component A previous commit did this for the components, as the intention was to do this for components in one PR and the others an a separate PR. Unfortunately the build does not pass with all the missing imports. This commit does the following: - Updates the paths of the imports - Removed the need to typecast logic i.e. "as IGroupsLogic" after the Kea hooks - Fixed a few TypeScript errors with events and return values on functions - Use global flash messages - Remove debounces filderValue, as it’s now debounces in logic file - Remove legacy isCurated props - Remove legact AppView * Add sub navigation to main nav Also removes redundant search link in sidebar * Update logic file to reset flashmessages correctly Because we have separated concerns with global flash message state, we now have to manually trigger resets of flash messages with listeners in Kea where we used to be able to use a reducer to listen to changes and reset flash messages. * Use navigateToUrl for navigation over history.push Thanks to work by @constance, we can now use the KibanaLogic’s navigateToUrl value to change routes directly from logic files * Fix failing test A previous commit removed the redundant Search link from the sidebar nav because of the one in the header. This commit fixes a filing test and now assets on the number of items as the link addresses will be changing as we migrate more components over * Convert React Router links to our wrappers * Replace anchors with EuiButtonEmpty The original pre-commit hooks failed because the anchors didn’t have key handlers. Pleaceholders were added with TODOs and these have been replaced with EuiButtonEmpty, which satisifies the UI needs and passes linting * Fix a bug where header actions disappearing There was a bug where changing routes would cause the header action, in the case of Workplace Search the “Go to search application” link, to disappear on route changes. Turns out that we didn’t need it in the useEffect and that moving it out keeps the unmount from removing the link from the header. * i18n top-level component and logic files * i18n for components * Fix failing test This was from https://github.com/elastic/kibana/pull/78679/commits/3254c6277e44a2f1de4ea84155a4f287d7fbd270 * Fix broken i18n Had duplicate ids and misnamed value * Fix a bug where manage group not in Flash message There is a button that appears in the Flash Message when a new group is added so that the user can navigate to manage the group and, because the order of setting the new group was before the instantiation of the global flashmessages, the button was not appearing. This commit moves the action after the flash message is set. * Refactor typings * Refactor ContentSection spacing The css was not being used and the bottom padding of 44px (xxl + xs spacer) was being generated with spacers. This has been changed to use only CSS * Remove canCreateInvitations * Remove hasMessages check rendering FlashMessages * snake_case telemetry and path Will convert other paths in a separate PR * Fix failing tests Co-authored-by: Elastic Machine Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- .../common/types/workplace_search.ts | 46 +++ .../shared/constants/default_meta.ts | 14 + .../applications/shared/constants/index.ts | 7 + .../workplace_search/assets/share_circle.svg | 1 + .../components/layout/nav.test.tsx | 2 +- .../components/layout/nav.tsx | 9 +- .../content_section/content_section.scss | 9 + .../content_section/content_section.test.tsx | 13 +- .../content_section/content_section.tsx | 15 +- .../shared/source_row/source_row.scss | 19 + .../shared/source_row/source_row.tsx | 24 +- .../view_content_header.test.tsx | 18 +- .../view_content_header.tsx | 52 ++- .../workplace_search/index.test.tsx | 1 - .../applications/workplace_search/index.tsx | 11 +- .../applications/workplace_search/routes.ts | 5 +- .../applications/workplace_search/types.ts | 40 +- .../groups/components/add_group_modal.tsx | 89 ++++ .../groups/components/clear_filters_link.tsx | 40 ++ .../components/filterable_users_list.tsx | 134 ++++++ .../components/filterable_users_popover.tsx | 62 +++ .../groups/components/group_manager_modal.tsx | 180 ++++++++ .../groups/components/group_overview.tsx | 274 +++++++++++++ .../views/groups/components/group_row.tsx | 103 +++++ .../components/group_row_sources_dropdown.tsx | 66 +++ .../components/group_row_users_dropdown.tsx | 55 +++ .../group_source_prioritization.tsx | 192 +++++++++ .../views/groups/components/group_sources.tsx | 43 ++ .../views/groups/components/group_sub_nav.tsx | 38 ++ .../views/groups/components/group_users.tsx | 45 ++ .../groups/components/group_users_table.tsx | 85 ++++ .../views/groups/components/groups_table.tsx | 96 +++++ .../groups/components/manage_users_modal.tsx | 56 +++ .../components/shared_sources_modal.tsx | 64 +++ .../groups/components/source_option_item.tsx | 31 ++ .../views/groups/components/sources_list.tsx | 41 ++ .../table_filter_sources_dropdown.tsx | 67 +++ .../table_filter_users_dropdown.tsx | 52 +++ .../views/groups/components/table_filters.tsx | 59 +++ .../groups/components/user_option_item.tsx | 25 ++ .../views/groups/group_logic.ts | 388 ++++++++++++++++++ .../views/groups/group_router.tsx | 47 +++ .../workplace_search/views/groups/groups.scss | 101 +++++ .../workplace_search/views/groups/groups.tsx | 146 +++++++ .../views/groups/groups_logic.ts | 351 ++++++++++++++++ .../views/groups/groups_router.tsx | 35 ++ .../workplace_search/views/groups/index.ts | 8 + .../enterprise_search/server/plugin.ts | 2 + .../server/routes/workplace_search/groups.ts | 256 ++++++++++++ 49 files changed, 3424 insertions(+), 93 deletions(-) create mode 100644 x-pack/plugins/enterprise_search/public/applications/shared/constants/default_meta.ts create mode 100644 x-pack/plugins/enterprise_search/public/applications/shared/constants/index.ts create mode 100644 x-pack/plugins/enterprise_search/public/applications/workplace_search/assets/share_circle.svg create mode 100644 x-pack/plugins/enterprise_search/public/applications/workplace_search/components/shared/content_section/content_section.scss create mode 100644 x-pack/plugins/enterprise_search/public/applications/workplace_search/components/shared/source_row/source_row.scss create mode 100644 x-pack/plugins/enterprise_search/public/applications/workplace_search/views/groups/components/add_group_modal.tsx create mode 100644 x-pack/plugins/enterprise_search/public/applications/workplace_search/views/groups/components/clear_filters_link.tsx create mode 100644 x-pack/plugins/enterprise_search/public/applications/workplace_search/views/groups/components/filterable_users_list.tsx create mode 100644 x-pack/plugins/enterprise_search/public/applications/workplace_search/views/groups/components/filterable_users_popover.tsx create mode 100644 x-pack/plugins/enterprise_search/public/applications/workplace_search/views/groups/components/group_manager_modal.tsx create mode 100644 x-pack/plugins/enterprise_search/public/applications/workplace_search/views/groups/components/group_overview.tsx create mode 100644 x-pack/plugins/enterprise_search/public/applications/workplace_search/views/groups/components/group_row.tsx create mode 100644 x-pack/plugins/enterprise_search/public/applications/workplace_search/views/groups/components/group_row_sources_dropdown.tsx create mode 100644 x-pack/plugins/enterprise_search/public/applications/workplace_search/views/groups/components/group_row_users_dropdown.tsx create mode 100644 x-pack/plugins/enterprise_search/public/applications/workplace_search/views/groups/components/group_source_prioritization.tsx create mode 100644 x-pack/plugins/enterprise_search/public/applications/workplace_search/views/groups/components/group_sources.tsx create mode 100644 x-pack/plugins/enterprise_search/public/applications/workplace_search/views/groups/components/group_sub_nav.tsx create mode 100644 x-pack/plugins/enterprise_search/public/applications/workplace_search/views/groups/components/group_users.tsx create mode 100644 x-pack/plugins/enterprise_search/public/applications/workplace_search/views/groups/components/group_users_table.tsx create mode 100644 x-pack/plugins/enterprise_search/public/applications/workplace_search/views/groups/components/groups_table.tsx create mode 100644 x-pack/plugins/enterprise_search/public/applications/workplace_search/views/groups/components/manage_users_modal.tsx create mode 100644 x-pack/plugins/enterprise_search/public/applications/workplace_search/views/groups/components/shared_sources_modal.tsx create mode 100644 x-pack/plugins/enterprise_search/public/applications/workplace_search/views/groups/components/source_option_item.tsx create mode 100644 x-pack/plugins/enterprise_search/public/applications/workplace_search/views/groups/components/sources_list.tsx create mode 100644 x-pack/plugins/enterprise_search/public/applications/workplace_search/views/groups/components/table_filter_sources_dropdown.tsx create mode 100644 x-pack/plugins/enterprise_search/public/applications/workplace_search/views/groups/components/table_filter_users_dropdown.tsx create mode 100644 x-pack/plugins/enterprise_search/public/applications/workplace_search/views/groups/components/table_filters.tsx create mode 100644 x-pack/plugins/enterprise_search/public/applications/workplace_search/views/groups/components/user_option_item.tsx create mode 100644 x-pack/plugins/enterprise_search/public/applications/workplace_search/views/groups/group_logic.ts create mode 100644 x-pack/plugins/enterprise_search/public/applications/workplace_search/views/groups/group_router.tsx create mode 100644 x-pack/plugins/enterprise_search/public/applications/workplace_search/views/groups/groups.scss create mode 100644 x-pack/plugins/enterprise_search/public/applications/workplace_search/views/groups/groups.tsx create mode 100644 x-pack/plugins/enterprise_search/public/applications/workplace_search/views/groups/groups_logic.ts create mode 100644 x-pack/plugins/enterprise_search/public/applications/workplace_search/views/groups/groups_router.tsx create mode 100644 x-pack/plugins/enterprise_search/public/applications/workplace_search/views/groups/index.ts create mode 100644 x-pack/plugins/enterprise_search/server/routes/workplace_search/groups.ts diff --git a/x-pack/plugins/enterprise_search/common/types/workplace_search.ts b/x-pack/plugins/enterprise_search/common/types/workplace_search.ts index 6c82206706b32..886597fcd9891 100644 --- a/x-pack/plugins/enterprise_search/common/types/workplace_search.ts +++ b/x-pack/plugins/enterprise_search/common/types/workplace_search.ts @@ -30,3 +30,49 @@ export interface IConfiguredLimits { totalFields: number; }; } + +export interface IGroup { + id: string; + name: string; + createdAt: string; + updatedAt: string; + contentSources: IContentSource[]; + users: IUser[]; + usersCount: number; + color?: string; +} + +export interface IGroupDetails extends IGroup { + contentSources: IContentSourceDetails[]; + canEditGroup: boolean; + canDeleteGroup: boolean; +} + +export interface IUser { + id: string; + name: string | null; + initials: string; + pictureUrl: string | null; + color: string; + email: string; + role?: string; + groupIds: string[]; +} + +export interface IContentSource { + id: string; + serviceType: string; + name: string; +} + +export interface IContentSourceDetails extends IContentSource { + status: string; + statusMessage: string; + documentCount: string; + isFederatedSource: boolean; + searchable: boolean; + supportedByLicense: boolean; + errorReason: number; + allowsReauth: boolean; + boost: number; +} diff --git a/x-pack/plugins/enterprise_search/public/applications/shared/constants/default_meta.ts b/x-pack/plugins/enterprise_search/public/applications/shared/constants/default_meta.ts new file mode 100644 index 0000000000000..82f1c9d8b8914 --- /dev/null +++ b/x-pack/plugins/enterprise_search/public/applications/shared/constants/default_meta.ts @@ -0,0 +1,14 @@ +/* + * 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. + */ + +export const DEFAULT_META = { + page: { + current: 1, + size: 10, + total_pages: 0, + total_results: 0, + }, +}; diff --git a/x-pack/plugins/enterprise_search/public/applications/shared/constants/index.ts b/x-pack/plugins/enterprise_search/public/applications/shared/constants/index.ts new file mode 100644 index 0000000000000..4d4ff5f52ef20 --- /dev/null +++ b/x-pack/plugins/enterprise_search/public/applications/shared/constants/index.ts @@ -0,0 +1,7 @@ +/* + * 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. + */ + +export { DEFAULT_META } from './default_meta'; diff --git a/x-pack/plugins/enterprise_search/public/applications/workplace_search/assets/share_circle.svg b/x-pack/plugins/enterprise_search/public/applications/workplace_search/assets/share_circle.svg new file mode 100644 index 0000000000000..730f4fb90f601 --- /dev/null +++ b/x-pack/plugins/enterprise_search/public/applications/workplace_search/assets/share_circle.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/x-pack/plugins/enterprise_search/public/applications/workplace_search/components/layout/nav.test.tsx b/x-pack/plugins/enterprise_search/public/applications/workplace_search/components/layout/nav.test.tsx index 2553284744e4d..ccc0fe8b38ff3 100644 --- a/x-pack/plugins/enterprise_search/public/applications/workplace_search/components/layout/nav.test.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/workplace_search/components/layout/nav.test.tsx @@ -18,6 +18,6 @@ describe('WorkplaceSearchNav', () => { expect(wrapper.find(SideNav)).toHaveLength(1); expect(wrapper.find(SideNavLink).first().prop('to')).toEqual('/'); - expect(wrapper.find(SideNavLink).last().prop('to')).toEqual('http://localhost:3002/ws/search'); + expect(wrapper.find(SideNavLink)).toHaveLength(7); }); }); diff --git a/x-pack/plugins/enterprise_search/public/applications/workplace_search/components/layout/nav.tsx b/x-pack/plugins/enterprise_search/public/applications/workplace_search/components/layout/nav.tsx index 5572716391112..7070659a951ef 100644 --- a/x-pack/plugins/enterprise_search/public/applications/workplace_search/components/layout/nav.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/workplace_search/components/layout/nav.tsx @@ -12,6 +12,8 @@ import { WORKPLACE_SEARCH_PLUGIN } from '../../../../../common/constants'; import { getWorkplaceSearchUrl } from '../../../shared/enterprise_search_url'; import { SideNav, SideNavLink } from '../../../shared/layout'; +import { GroupSubNav } from '../../views/groups/components/group_sub_nav'; + import { ORG_SOURCES_PATH, SOURCES_PATH, @@ -35,7 +37,7 @@ export const WorkplaceSearchNav: React.FC = () => { defaultMessage: 'Sources', })} - + }> {i18n.translate('xpack.enterpriseSearch.workplaceSearch.nav.groups', { defaultMessage: 'Groups', })} @@ -61,11 +63,6 @@ export const WorkplaceSearchNav: React.FC = () => { defaultMessage: 'View my personal dashboard', })} - - {i18n.translate('xpack.enterpriseSearch.workplaceSearch.nav.search', { - defaultMessage: 'Go to search application', - })} - ); }; diff --git a/x-pack/plugins/enterprise_search/public/applications/workplace_search/components/shared/content_section/content_section.scss b/x-pack/plugins/enterprise_search/public/applications/workplace_search/components/shared/content_section/content_section.scss new file mode 100644 index 0000000000000..c79e31370ebcf --- /dev/null +++ b/x-pack/plugins/enterprise_search/public/applications/workplace_search/components/shared/content_section/content_section.scss @@ -0,0 +1,9 @@ +/* + * 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. + */ + +.content-section { + padding-bottom: 44px; +} diff --git a/x-pack/plugins/enterprise_search/public/applications/workplace_search/components/shared/content_section/content_section.test.tsx b/x-pack/plugins/enterprise_search/public/applications/workplace_search/components/shared/content_section/content_section.test.tsx index cc827d7edb0af..559693d4c7891 100644 --- a/x-pack/plugins/enterprise_search/public/applications/workplace_search/components/shared/content_section/content_section.test.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/workplace_search/components/shared/content_section/content_section.test.tsx @@ -6,9 +6,10 @@ import React from 'react'; import { shallow } from 'enzyme'; -import { EuiTitle, EuiSpacer } from '@elastic/eui'; +import { EuiSpacer } from '@elastic/eui'; import { ContentSection } from './'; +import { ViewContentHeader } from '../view_content_header'; const props = { children:
, @@ -20,15 +21,16 @@ describe('ContentSection', () => { const wrapper = shallow(); expect(wrapper.prop('data-test-subj')).toEqual('contentSection'); - expect(wrapper.prop('className')).toEqual('test'); + expect(wrapper.prop('className')).toEqual('test content-section'); expect(wrapper.find('.children')).toHaveLength(1); }); it('displays title and description', () => { const wrapper = shallow(); - expect(wrapper.find(EuiTitle)).toHaveLength(1); - expect(wrapper.find('p').text()).toEqual('bar'); + expect(wrapper.find(ViewContentHeader)).toHaveLength(1); + expect(wrapper.find(ViewContentHeader).prop('title')).toEqual('foo'); + expect(wrapper.find(ViewContentHeader).prop('description')).toEqual('bar'); }); it('displays header content', () => { @@ -41,7 +43,8 @@ describe('ContentSection', () => { /> ); - expect(wrapper.find(EuiSpacer).prop('size')).toEqual('s'); + expect(wrapper.find(EuiSpacer).first().prop('size')).toEqual('s'); + expect(wrapper.find(EuiSpacer)).toHaveLength(1); expect(wrapper.find('.header')).toHaveLength(1); }); }); diff --git a/x-pack/plugins/enterprise_search/public/applications/workplace_search/components/shared/content_section/content_section.tsx b/x-pack/plugins/enterprise_search/public/applications/workplace_search/components/shared/content_section/content_section.tsx index b2a9eebc72e85..8111324632513 100644 --- a/x-pack/plugins/enterprise_search/public/applications/workplace_search/components/shared/content_section/content_section.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/workplace_search/components/shared/content_section/content_section.tsx @@ -6,15 +6,20 @@ import React from 'react'; -import { EuiSpacer, EuiTitle } from '@elastic/eui'; +import { EuiSpacer } from '@elastic/eui'; import { TSpacerSize } from '../../../types'; +import { ViewContentHeader } from '../view_content_header'; + +import './content_section.scss'; + interface IContentSectionProps { children: React.ReactNode; className?: string; title?: React.ReactNode; description?: React.ReactNode; + action?: React.ReactNode; headerChildren?: React.ReactNode; headerSpacer?: TSpacerSize; testSubj?: string; @@ -25,17 +30,15 @@ export const ContentSection: React.FC = ({ className = '', title, description, + action, headerChildren, headerSpacer, testSubj, }) => ( -
+
{title && ( <> - -

{title}

-
- {description &&

{description}

} + {headerChildren} {headerSpacer && } diff --git a/x-pack/plugins/enterprise_search/public/applications/workplace_search/components/shared/source_row/source_row.scss b/x-pack/plugins/enterprise_search/public/applications/workplace_search/components/shared/source_row/source_row.scss new file mode 100644 index 0000000000000..a099b974a0d41 --- /dev/null +++ b/x-pack/plugins/enterprise_search/public/applications/workplace_search/components/shared/source_row/source_row.scss @@ -0,0 +1,19 @@ +.source-row { + &__icon { + width: 24px; + height: 24px; + } + + &__name { + font-weight: 500; + } + + &__actions { + width: 100px; + } + + &__actions a { + opacity: 1.0; + pointer-events: auto; + } +} diff --git a/x-pack/plugins/enterprise_search/public/applications/workplace_search/components/shared/source_row/source_row.tsx b/x-pack/plugins/enterprise_search/public/applications/workplace_search/components/shared/source_row/source_row.tsx index a2e252c886354..ca01563d81eda 100644 --- a/x-pack/plugins/enterprise_search/public/applications/workplace_search/components/shared/source_row/source_row.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/workplace_search/components/shared/source_row/source_row.tsx @@ -10,7 +10,6 @@ import classNames from 'classnames'; // Prefer importing entire lodash library, e.g. import { get } from "lodash" // eslint-disable-next-line no-restricted-imports import _kebabCase from 'lodash/kebabCase'; -import { Link } from 'react-router-dom'; import { EuiFlexGroup, @@ -24,12 +23,15 @@ import { EuiToolTip, } from '@elastic/eui'; +import { EuiLink } from '../../../../shared/react_router_helpers'; import { SOURCE_STATUSES as statuses } from '../../../constants'; import { IContentSourceDetails } from '../../../types'; import { ADD_SOURCE_PATH, SOURCE_DETAILS_PATH, getContentSourcePath } from '../../../routes'; import { SourceIcon } from '../source_icon'; +import './source_row.scss'; + const CREDENTIALS_INVALID_ERROR_REASON = 1; export interface ISourceRow { @@ -75,14 +77,9 @@ export const SourceRow: React.FC = ({ const imageClass = classNames('source-row__icon', { 'source-row__icon--loading': isIndexing }); const fixLink = ( - + Fix - + ); const remoteTooltip = ( @@ -100,7 +97,12 @@ export const SourceRow: React.FC = ({ return ( - + = ({ {showFix && {fixLink}} {showDetails && ( - Details - + )} diff --git a/x-pack/plugins/enterprise_search/public/applications/workplace_search/components/shared/view_content_header/view_content_header.test.tsx b/x-pack/plugins/enterprise_search/public/applications/workplace_search/components/shared/view_content_header/view_content_header.test.tsx index 1bb9ff255f7ed..7d81e9df67289 100644 --- a/x-pack/plugins/enterprise_search/public/applications/workplace_search/components/shared/view_content_header/view_content_header.test.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/workplace_search/components/shared/view_content_header/view_content_header.test.tsx @@ -19,7 +19,7 @@ describe('ViewContentHeader', () => { it('renders with title and alignItems', () => { const wrapper = shallow(); - expect(wrapper.find('h2').text()).toEqual('Header'); + expect(wrapper.find('h3').text()).toEqual('Header'); expect(wrapper.find(EuiFlexGroup).prop('alignItems')).toEqual('flexStart'); }); @@ -35,4 +35,20 @@ describe('ViewContentHeader', () => { expect(wrapper.find('.action')).toHaveLength(1); }); + + it('renders small heading', () => { + const wrapper = shallow( + } /> + ); + + expect(wrapper.find('h4')).toHaveLength(1); + }); + + it('renders large heading', () => { + const wrapper = shallow( + } /> + ); + + expect(wrapper.find('h2')).toHaveLength(1); + }); }); diff --git a/x-pack/plugins/enterprise_search/public/applications/workplace_search/components/shared/view_content_header/view_content_header.tsx b/x-pack/plugins/enterprise_search/public/applications/workplace_search/components/shared/view_content_header/view_content_header.tsx index 0408517fd4ec5..0e2d781020294 100644 --- a/x-pack/plugins/enterprise_search/public/applications/workplace_search/components/shared/view_content_header/view_content_header.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/workplace_search/components/shared/view_content_header/view_content_header.tsx @@ -15,28 +15,44 @@ interface IViewContentHeaderProps { description?: React.ReactNode; action?: React.ReactNode; alignItems?: FlexGroupAlignItems; + titleSize?: 's' | 'm' | 'l'; } export const ViewContentHeader: React.FC = ({ title, + titleSize = 'm', description, action, alignItems = 'center', -}) => ( - <> - - - -

{title}

-
- {description && ( - -

{description}

-
- )} -
- {action && {action}} -
- - -); +}) => { + let titleElement; + + switch (titleSize) { + case 's': + titleElement =

{title}

; + break; + case 'l': + titleElement =

{title}

; + break; + default: + titleElement =

{title}

; + break; + } + + return ( + <> + + + {titleElement} + {description && ( + +

{description}

+
+ )} +
+ {action && {action}} +
+ + + ); +}; diff --git a/x-pack/plugins/enterprise_search/public/applications/workplace_search/index.test.tsx b/x-pack/plugins/enterprise_search/public/applications/workplace_search/index.test.tsx index 25544b4a9bb68..6aa4cf59ab46c 100644 --- a/x-pack/plugins/enterprise_search/public/applications/workplace_search/index.test.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/workplace_search/index.test.tsx @@ -76,7 +76,6 @@ describe('WorkplaceSearchConfigured', () => { shallow(); expect(initializeAppData).not.toHaveBeenCalled(); - expect(mockKibanaValues.renderHeaderActions).not.toHaveBeenCalled(); }); it('renders ErrorState', () => { diff --git a/x-pack/plugins/enterprise_search/public/applications/workplace_search/index.tsx b/x-pack/plugins/enterprise_search/public/applications/workplace_search/index.tsx index b4c4217659043..a3c7f7d48a612 100644 --- a/x-pack/plugins/enterprise_search/public/applications/workplace_search/index.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/workplace_search/index.tsx @@ -22,6 +22,7 @@ import { SetupGuide } from './views/setup_guide'; import { ErrorState } from './views/error_state'; import { NotFound } from '../shared/not_found'; import { Overview } from './views/overview'; +import { GroupsRouter } from './views/groups'; export const WorkplaceSearch: React.FC = (props) => { const { config } = useValues(KibanaLogic); @@ -37,10 +38,11 @@ export const WorkplaceSearchConfigured: React.FC = (props) => { useEffect(() => { if (!hasInitialized) { initializeAppData(props); - renderHeaderActions(WorkplaceSearchHeaderActions); } }, [hasInitialized]); + renderHeaderActions(WorkplaceSearchHeaderActions); + return ( @@ -50,14 +52,13 @@ export const WorkplaceSearchConfigured: React.FC = (props) => { {errorConnecting ? : } - } readOnlyMode={readOnlyMode}> + } restrictWidth readOnlyMode={readOnlyMode}> {errorConnecting ? ( ) : ( - - {/* Will replace with groups component subsequent PR */} -
+ + diff --git a/x-pack/plugins/enterprise_search/public/applications/workplace_search/routes.ts b/x-pack/plugins/enterprise_search/public/applications/workplace_search/routes.ts index e833dde4c1b72..dfe664c33198c 100644 --- a/x-pack/plugins/enterprise_search/public/applications/workplace_search/routes.ts +++ b/x-pack/plugins/enterprise_search/public/applications/workplace_search/routes.ts @@ -50,7 +50,7 @@ export const ROLE_MAPPING_NEW_PATH = `${ROLE_MAPPINGS_PATH}/new`; export const USERS_PATH = `${ORG_PATH}/users`; export const SECURITY_PATH = `${ORG_PATH}/security`; -export const GROUPS_PATH = `${ORG_PATH}/groups`; +export const GROUPS_PATH = '/groups'; export const GROUP_PATH = `${GROUPS_PATH}/:groupId`; export const GROUP_SOURCE_PRIORITIZATION_PATH = `${GROUPS_PATH}/:groupId/source-prioritization`; @@ -114,3 +114,6 @@ export const getContentSourcePath = ( sourceId: string, isOrganization: boolean ): string => generatePath(isOrganization ? ORG_PATH + path : path, { sourceId }); +export const getGroupPath = (groupId: string) => generatePath(GROUP_PATH, { groupId }); +export const getGroupSourcePrioritizationPath = (groupId: string) => + `${GROUPS_PATH}/${groupId}/source_prioritization`; diff --git a/x-pack/plugins/enterprise_search/public/applications/workplace_search/types.ts b/x-pack/plugins/enterprise_search/public/applications/workplace_search/types.ts index 3866da738cbb6..e398a868b2466 100644 --- a/x-pack/plugins/enterprise_search/public/applications/workplace_search/types.ts +++ b/x-pack/plugins/enterprise_search/public/applications/workplace_search/types.ts @@ -8,42 +8,6 @@ export * from '../../../common/types/workplace_search'; export type TSpacerSize = 'xs' | 's' | 'm' | 'l' | 'xl' | 'xxl'; -export interface IGroup { - id: string; - name: string; - createdAt: string; - updatedAt: string; - contentSources: IContentSource[]; - users: IUser[]; - usersCount: number; - color?: string; -} - -export interface IUser { - id: string; - name: string | null; - initials: string; - pictureUrl: string | null; - color: string; - email: string; - role?: string; - groupIds: string[]; -} - -export interface IContentSource { - id: string; - serviceType: string; - name: string; -} - -export interface IContentSourceDetails extends IContentSource { - status: string; - statusMessage: string; - documentCount: string; - isFederatedSource: boolean; - searchable: boolean; - supportedByLicense: boolean; - errorReason: number; - allowsReauth: boolean; - boost: number; +export interface ISourcePriority { + [id: string]: number; } diff --git a/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/groups/components/add_group_modal.tsx b/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/groups/components/add_group_modal.tsx new file mode 100644 index 0000000000000..766aa511ebb2d --- /dev/null +++ b/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/groups/components/add_group_modal.tsx @@ -0,0 +1,89 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import React from 'react'; + +import { useActions, useValues } from 'kea'; +import { i18n } from '@kbn/i18n'; + +import { + EuiButton, + EuiButtonEmpty, + EuiFieldText, + EuiFormRow, + EuiModal, + EuiModalBody, + EuiModalFooter, + EuiModalHeader, + EuiModalHeaderTitle, + EuiOverlayMask, +} from '@elastic/eui'; + +import { GroupsLogic } from '../groups_logic'; + +const ADD_GROUP_HEADER = i18n.translate( + 'xpack.enterpriseSearch.workplaceSearch.groups.addGroup.heading', + { + defaultMessage: 'Add a group', + } +); +const ADD_GROUP_CANCEL = i18n.translate( + 'xpack.enterpriseSearch.workplaceSearch.groups.addGroup.cancel.action', + { + defaultMessage: 'Cancel', + } +); +const ADD_GROUP_SUBMIT = i18n.translate( + 'xpack.enterpriseSearch.workplaceSearch.groups.addGroup.submit.action', + { + defaultMessage: 'Add Group', + } +); + +export const AddGroupModal: React.FC<{}> = () => { + const { closeNewGroupModal, saveNewGroup, setNewGroupName } = useActions(GroupsLogic); + const { newGroupNameErrors, newGroupName } = useValues(GroupsLogic); + const isInvalid = newGroupNameErrors.length > 0; + const handleFormSumbit = (e: React.FormEvent) => { + e.preventDefault(); + saveNewGroup(); + }; + + return ( + + +
+ + {ADD_GROUP_HEADER} + + + + + setNewGroupName(e.target.value)} + /> + + + + + {ADD_GROUP_CANCEL} + + {ADD_GROUP_SUBMIT} + + +
+
+
+ ); +}; diff --git a/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/groups/components/clear_filters_link.tsx b/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/groups/components/clear_filters_link.tsx new file mode 100644 index 0000000000000..164c938fb5788 --- /dev/null +++ b/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/groups/components/clear_filters_link.tsx @@ -0,0 +1,40 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import React from 'react'; + +import { useActions } from 'kea'; +import { i18n } from '@kbn/i18n'; + +import { EuiFlexGroup, EuiFlexItem, EuiIcon, EuiLink } from '@elastic/eui'; + +import { GroupsLogic } from '../groups_logic'; + +const CLEAR_FILTERS = i18n.translate( + 'xpack.enterpriseSearch.workplaceSearch.groups.clearFilters.action', + { + defaultMessage: 'Clear Filters', + } +); + +export const ClearFiltersLink: React.FC<{}> = () => { + const { resetGroupsFilters } = useActions(GroupsLogic); + + return ( + + + + + + + + + {CLEAR_FILTERS} + + + + ); +}; diff --git a/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/groups/components/filterable_users_list.tsx b/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/groups/components/filterable_users_list.tsx new file mode 100644 index 0000000000000..a7b5d3e83bee2 --- /dev/null +++ b/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/groups/components/filterable_users_list.tsx @@ -0,0 +1,134 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import React, { useState } from 'react'; + +import { i18n } from '@kbn/i18n'; + +import { + EuiCard, + EuiFieldSearch, + EuiFilterSelectItem, + EuiIcon, + EuiPopoverTitle, + EuiSpacer, +} from '@elastic/eui'; + +import { IUser } from '../../../types'; + +import { UserOptionItem } from './user_option_item'; + +const MAX_VISIBLE_USERS = 20; + +const FILTER_USERS_PLACEHOLDER = i18n.translate( + 'xpack.enterpriseSearch.workplaceSearch.groups.filterUsers.placeholder', + { + defaultMessage: 'Filter users...', + } +); +const NO_USERS_FOUND = i18n.translate( + 'xpack.enterpriseSearch.workplaceSearch.groups.noUsersFound', + { + defaultMessage: 'No users found', + } +); + +interface IFilterableUsersListProps { + users: IUser[]; + selectedOptions?: string[]; + itemsClickable?: boolean; + isPopover?: boolean; + allGroupUsersLoading?: React.ReactElement; + addFilteredUser(userId: string): void; + removeFilteredUser(userId: string): void; +} + +export const FilterableUsersList: React.FC = ({ + users, + selectedOptions = [], + itemsClickable, + isPopover, + addFilteredUser, + allGroupUsersLoading, + removeFilteredUser, +}) => { + const [filterValue, updateValue] = useState(''); + + const filterUsers = (userId: string): boolean => { + if (!filterValue) return true; + const filterUser = users.find(({ id }) => id === userId) as IUser; + const filteredName = filterUser.name || filterUser.email; + return filteredName.toLowerCase().indexOf(filterValue.toLowerCase()) > -1; + }; + + // Only show the first 20 users in the dropdown. + const availableUsers = users.map(({ id }) => id).filter(filterUsers); + const hiddenUsers = [...availableUsers]; + const visibleUsers = hiddenUsers.splice(0, MAX_VISIBLE_USERS); + + const getOptionEl = (userId: string, index: number): React.ReactElement => { + const checked = selectedOptions.indexOf(userId) > -1 ? 'on' : undefined; + const handleClick = () => (checked ? removeFilteredUser(userId) : addFilteredUser(userId)); + const user = users.filter(({ id }) => id === userId)[0]; + const option = ; + + return itemsClickable ? ( + + {option} + + ) : ( +
+ {option} +
+ ); + }; + + const filterUsersBar = ( + updateValue(e.target.value)} + /> + ); + const noResults = ( + <> + {NO_USERS_FOUND} + + ); + + const options = + visibleUsers.length > 0 ? ( + visibleUsers.map((userId, index) => getOptionEl(userId, index)) + ) : ( + } + description={!!allGroupUsersLoading ? allGroupUsersLoading : noResults} + /> + ); + + const usersList = ( + <> + {hiddenUsers.length > 0 && ( +
+ + {i18n.translate('xpack.enterpriseSearch.workplaceSearch.groups.userListCount', { + defaultMessage: 'Showing {maxVisibleUsers} of {numUsers} users.', + values: { maxVisibleUsers: MAX_VISIBLE_USERS, numUsers: availableUsers.length }, + })} + +
+ )} + {options} + + ); + + return ( + <> + {isPopover ? {filterUsersBar} : filterUsersBar} + {isPopover ?
{usersList}
: usersList} + + ); +}; diff --git a/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/groups/components/filterable_users_popover.tsx b/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/groups/components/filterable_users_popover.tsx new file mode 100644 index 0000000000000..e5fdcc3089059 --- /dev/null +++ b/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/groups/components/filterable_users_popover.tsx @@ -0,0 +1,62 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import React from 'react'; + +import { useActions } from 'kea'; + +import { EuiFilterGroup, EuiPopover } from '@elastic/eui'; + +import { IUser } from '../../../types'; + +import { GroupsLogic } from '../groups_logic'; +import { FilterableUsersList } from './filterable_users_list'; + +interface IIFilterableUsersPopoverProps { + users: IUser[]; + selectedOptions?: string[]; + itemsClickable?: boolean; + isPopoverOpen: boolean; + allGroupUsersLoading?: React.ReactElement; + className?: string; + button: React.ReactElement; + closePopover(): void; +} + +export const FilterableUsersPopover: React.FC = ({ + users, + selectedOptions = [], + itemsClickable, + isPopoverOpen, + allGroupUsersLoading, + className, + button, + closePopover, +}) => { + const { addFilteredUser, removeFilteredUser } = useActions(GroupsLogic); + return ( + + + + + + ); +}; diff --git a/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/groups/components/group_manager_modal.tsx b/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/groups/components/group_manager_modal.tsx new file mode 100644 index 0000000000000..db576808b66e3 --- /dev/null +++ b/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/groups/components/group_manager_modal.tsx @@ -0,0 +1,180 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import React from 'react'; + +import { useValues } from 'kea'; + +import { i18n } from '@kbn/i18n'; + +import { + EuiButton, + EuiButtonEmpty, + EuiEmptyPrompt, + EuiFlexGroup, + EuiFlexItem, + EuiFormRow, + EuiModal, + EuiModalBody, + EuiModalFooter, + EuiModalHeader, + EuiModalHeaderTitle, + EuiOverlayMask, + EuiSpacer, +} from '@elastic/eui'; + +import { EuiButton as EuiLinkButton } from '../../../../shared/react_router_helpers'; + +import { IGroup } from '../../../types'; +import { ORG_SOURCES_PATH } from '../../../routes'; + +import noSharedSourcesIcon from '../../../assets/share_circle.svg'; + +import { GroupLogic } from '../group_logic'; +import { GroupsLogic } from '../groups_logic'; + +const CANCEL_BUTTON_TEXT = i18n.translate( + 'xpack.enterpriseSearch.workplaceSearch.groups.groupManagerCancel', + { + defaultMessage: 'Cancel', + } +); +const UPDATE_BUTTON_TEXT = i18n.translate( + 'xpack.enterpriseSearch.workplaceSearch.groups.groupManagerUpdate', + { + defaultMessage: 'Update', + } +); +const ADD_SOURCE_BUTTON_TEXT = i18n.translate( + 'xpack.enterpriseSearch.workplaceSearch.groups.groupManagerUpdateAddSourceButton', + { + defaultMessage: 'Add a Shared Source', + } +); +const EMPTY_STATE_TITLE = i18n.translate( + 'xpack.enterpriseSearch.workplaceSearch.groups.groupManagerSourceEmpty.title', + { + defaultMessage: 'Whoops!', + } +); +const EMPTY_STATE_BODY = i18n.translate( + 'xpack.enterpriseSearch.workplaceSearch.groups.groupManagerSourceEmpty.body', + { + defaultMessage: 'Looks like you have not added any shared content sources yet.', + } +); + +interface IGroupManagerModalProps { + children: React.ReactElement; + label: string; + allItems: object[]; + numSelected: number; + hideModal(group: IGroup): void; + selectAll(allItems: object[]): void; + saveItems(): void; +} + +export const GroupManagerModal: React.FC = ({ + children, + label, + allItems, + numSelected, + hideModal, + selectAll, + saveItems, +}) => { + const { group, managerModalFormErrors } = useValues(GroupLogic); + const { contentSources } = useValues(GroupsLogic); + + const allSelected = numSelected === allItems.length; + const isSources = label === 'shared content sources'; + const showEmptyState = isSources && contentSources.length < 1; + const handleClose = () => hideModal(group); + const handleSelectAll = () => selectAll(allSelected ? [] : allItems); + + const sourcesButton = ( + + {ADD_SOURCE_BUTTON_TEXT} + + ); + + const emptyState = ( + + + {EMPTY_STATE_TITLE}} + body={EMPTY_STATE_BODY} + actions={sourcesButton} + /> + + ); + + const modalContent = ( + <> + + + {i18n.translate('xpack.enterpriseSearch.workplaceSearch.groups.groupManagerHeaderTitle', { + defaultMessage: 'Manage {label}', + values: { label }, + })} + + + + + + 0} + fullWidth + > + {children} + + + + + + + + + {i18n.translate( + 'xpack.enterpriseSearch.workplaceSearch.groups.groupManagerSelectAllToggle', + { + defaultMessage: '{action} All', + values: { action: allSelected ? 'Deselect' : 'Select' }, + } + )} + + + + + + {CANCEL_BUTTON_TEXT} + + + + {UPDATE_BUTTON_TEXT} + + + + + + + + ); + + return ( + + + {showEmptyState ? emptyState : modalContent} + + + ); +}; diff --git a/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/groups/components/group_overview.tsx b/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/groups/components/group_overview.tsx new file mode 100644 index 0000000000000..fc9ee7a1a26dc --- /dev/null +++ b/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/groups/components/group_overview.tsx @@ -0,0 +1,274 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import React from 'react'; + +import { useActions, useValues } from 'kea'; + +import { i18n } from '@kbn/i18n'; + +import { + EuiButton, + EuiConfirmModal, + EuiOverlayMask, + EuiFieldText, + EuiFlexGroup, + EuiFlexItem, + EuiFormRow, + EuiSpacer, + EuiHorizontalRule, +} from '@elastic/eui'; + +import { SetWorkplaceSearchChrome as SetPageChrome } from '../../../../shared/kibana_chrome'; +import { SendWorkplaceSearchTelemetry as SendTelemetry } from '../../../../shared/telemetry'; + +import { AppLogic } from '../../../app_logic'; +import { TruncatedContent } from '../../../../shared/truncate'; +import { ContentSection } from '../../../components/shared/content_section'; +import { ViewContentHeader } from '../../../components/shared/view_content_header'; +import { Loading } from '../../../components/shared/loading'; +import { SourcesTable } from '../../../components/shared/sources_table'; + +import { GroupUsersTable } from './group_users_table'; + +import { GroupLogic, MAX_NAME_LENGTH } from '../group_logic'; + +const EMPTY_SOURCES_DESCRIPTION = i18n.translate( + 'xpack.enterpriseSearch.workplaceSearch.groups.overview.emptySourcesDescription', + { + defaultMessage: 'No content sources are shared with this group.', + } +); +const GROUP_USERS_DESCRIPTION = i18n.translate( + 'xpack.enterpriseSearch.workplaceSearch.groups.overview.groupUsersDescription', + { + defaultMessage: 'Members will be able to search over the group’s sources.', + } +); +const EMPTY_USERS_DESCRIPTION = i18n.translate( + 'xpack.enterpriseSearch.workplaceSearch.groups.overview.emptyUsersDescription', + { + defaultMessage: 'There are no users in this group.', + } +); +const MANAGE_SOURCES_BUTTON_TEXT = i18n.translate( + 'xpack.enterpriseSearch.workplaceSearch.groups.overview.manageSourcesButtonText', + { + defaultMessage: 'Manage shared content sources', + } +); +const MANAGE_USERS_BUTTON_TEXT = i18n.translate( + 'xpack.enterpriseSearch.workplaceSearch.groups.overview.manageUsersButtonText', + { + defaultMessage: 'Manage users', + } +); +const NAME_SECTION_TITLE = i18n.translate( + 'xpack.enterpriseSearch.workplaceSearch.groups.overview.nameSectionTitle', + { + defaultMessage: 'Group name', + } +); +const NAME_SECTION_DESCRIPTION = i18n.translate( + 'xpack.enterpriseSearch.workplaceSearch.groups.overview.nameSectionDescription', + { + defaultMessage: 'Customize the name of this group.', + } +); +const SAVE_NAME_BUTTON_TEXT = i18n.translate( + 'xpack.enterpriseSearch.workplaceSearch.groups.overview.saveNameButtonText', + { + defaultMessage: 'Save name', + } +); +const REMOVE_SECTION_TITLE = i18n.translate( + 'xpack.enterpriseSearch.workplaceSearch.groups.overview.removeSectionTitle', + { + defaultMessage: 'Remove this group', + } +); +const REMOVE_SECTION_DESCRIPTION = i18n.translate( + 'xpack.enterpriseSearch.workplaceSearch.groups.overview.removeSectionDescription', + { + defaultMessage: 'This action cannot be undone.', + } +); +const REMOVE_BUTTON_TEXT = i18n.translate( + 'xpack.enterpriseSearch.workplaceSearch.groups.overview.removeButtonText', + { + defaultMessage: 'Remove group', + } +); +const CANCEL_REMOVE_BUTTON_TEXT = i18n.translate( + 'xpack.enterpriseSearch.workplaceSearch.groups.overview.cancelRemoveButtonText', + { + defaultMessage: 'Cancel', + } +); +const CONFIRM_TITLE_TEXT = i18n.translate( + 'xpack.enterpriseSearch.workplaceSearch.groups.overview.confirmTitleText', + { + defaultMessage: 'Confirm', + } +); + +export const GroupOverview: React.FC = () => { + const { + deleteGroup, + showSharedSourcesModal, + showManageUsersModal, + showConfirmDeleteModal, + hideConfirmDeleteModal, + updateGroupName, + onGroupNameInputChange, + } = useActions(GroupLogic); + const { + group: { name, contentSources, users, canDeleteGroup }, + groupNameInputValue, + dataLoading, + confirmDeleteModalVisible, + } = useValues(GroupLogic); + + const { isFederatedAuth } = useValues(AppLogic); + + if (dataLoading) return ; + + const truncatedName = ( + + ); + + const CONFIRM_REMOVE_BUTTON_TEXT = i18n.translate( + 'xpack.enterpriseSearch.workplaceSearch.groups.overview.confirmRemoveButtonText', + { + defaultMessage: 'Delete {name}', + values: { name }, + } + ); + const CONFIRM_REMOVE_DESCRIPTION = i18n.translate( + 'xpack.enterpriseSearch.workplaceSearch.groups.overview.confirmRemoveDescription', + { + defaultMessage: + 'Your group will be deleted from Workplace Search. Are you sure you want to remove {name}?', + values: { name }, + } + ); + const GROUP_SOURCES_DESCRIPTION = i18n.translate( + 'xpack.enterpriseSearch.workplaceSearch.groups.overview.groupSourcesDescription', + { + defaultMessage: 'Searchable by all users in the "{name}" group.', + values: { name }, + } + ); + + const hasContentSources = contentSources.length > 0; + const hasUsers = users.length > 0; + + const manageSourcesButton = ( + + {MANAGE_SOURCES_BUTTON_TEXT} + + ); + const manageUsersButton = !isFederatedAuth && ( + + {MANAGE_USERS_BUTTON_TEXT} + + ); + const sourcesTable = ; + + const sourcesSection = ( + + {hasContentSources && sourcesTable} + + ); + + const usersSection = !isFederatedAuth && ( + + {hasUsers && } + + ); + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + updateGroupName(); + }; + + const nameSection = ( + +
+ + + + onGroupNameInputChange(e.target.value)} + /> + + + + {SAVE_NAME_BUTTON_TEXT} + + + + +
+
+ ); + + const deleteSection = ( + <> + + + + + {confirmDeleteModalVisible && ( + + + {CONFIRM_REMOVE_DESCRIPTION} + + + )} + + {REMOVE_BUTTON_TEXT} + + + + ); + + return ( + <> + + + + + + {sourcesSection} + {usersSection} + {nameSection} + {canDeleteGroup && deleteSection} + + ); +}; diff --git a/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/groups/components/group_row.tsx b/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/groups/components/group_row.tsx new file mode 100644 index 0000000000000..9c7276372cf54 --- /dev/null +++ b/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/groups/components/group_row.tsx @@ -0,0 +1,103 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import React from 'react'; +import moment from 'moment'; +import { useValues } from 'kea'; + +import { i18n } from '@kbn/i18n'; + +import { EuiTableRow, EuiTableRowCell, EuiIcon } from '@elastic/eui'; + +import { TruncatedContent } from '../../../../shared/truncate'; +import { EuiLink } from '../../../../shared/react_router_helpers'; + +import { IGroup } from '../../../types'; + +import { AppLogic } from '../../../app_logic'; +import { getGroupPath } from '../../../routes'; +import { MAX_NAME_LENGTH } from '../group_logic'; +import { GroupSources } from './group_sources'; +import { GroupUsers } from './group_users'; + +const DAYS_CUTOFF = 8; +const NO_SOURCES_MESSAGE = i18n.translate( + 'xpack.enterpriseSearch.workplaceSearch.groups.noSourcesMessage', + { + defaultMessage: 'No shared content sources', + } +); +const NO_USERS_MESSAGE = i18n.translate( + 'xpack.enterpriseSearch.workplaceSearch.groups.noUsersMessage', + { + defaultMessage: 'No users', + } +); + +const dateDisplay = (date: string) => + moment(date).isAfter(moment().subtract(DAYS_CUTOFF, 'days')) + ? moment(date).fromNow() + : moment(date).format('MMMM D, YYYY'); + +export const GroupRow: React.FC = ({ + id, + name, + updatedAt, + contentSources, + users, + usersCount, +}) => { + const { isFederatedAuth } = useValues(AppLogic); + + const GROUP_UPDATED_TEXT = i18n.translate( + 'xpack.enterpriseSearch.workplaceSearch.groups.groupUpdatedText', + { + defaultMessage: 'Last updated {updatedAt}.', + values: { updatedAt: dateDisplay(updatedAt) }, + } + ); + + return ( + + + + + + + +
+ {GROUP_UPDATED_TEXT} +
+ +
+ {contentSources.length > 0 ? ( + + ) : ( + NO_SOURCES_MESSAGE + )} +
+
+ {!isFederatedAuth && ( + +
+ {usersCount > 0 ? ( + + ) : ( + NO_USERS_MESSAGE + )} +
+
+ )} + + + + + + + +
+ ); +}; diff --git a/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/groups/components/group_row_sources_dropdown.tsx b/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/groups/components/group_row_sources_dropdown.tsx new file mode 100644 index 0000000000000..3e3840eab33da --- /dev/null +++ b/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/groups/components/group_row_sources_dropdown.tsx @@ -0,0 +1,66 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import React from 'react'; + +import { i18n } from '@kbn/i18n'; + +import { EuiFilterGroup, EuiPopover, EuiPopoverTitle, EuiButtonEmpty } from '@elastic/eui'; + +import { IContentSource } from '../../../types'; + +import { SourceOptionItem } from './source_option_item'; + +interface IGroupRowSourcesDropdownProps { + isPopoverOpen: boolean; + numOptions: number; + groupSources: IContentSource[]; + onButtonClick(): void; + closePopover(): void; +} + +export const GroupRowSourcesDropdown: React.FC = ({ + isPopoverOpen, + numOptions, + groupSources, + onButtonClick, + closePopover, +}) => { + const toggleLink = ( + + + {numOptions} + + ); + const contentSourceCountHeading = ( + + {i18n.translate('xpack.enterpriseSearch.workplaceSearch.groups.contentSourceCountHeading', { + defaultMessage: '{numSources} shared content sources', + values: { numSources: groupSources.length }, + })} + + ); + + const sources = groupSources.map((source, index) => ( +
+ id === source.id)[0]} /> +
+ )); + + return ( + + + {contentSourceCountHeading} +
{sources}
+
+
+ ); +}; diff --git a/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/groups/components/group_row_users_dropdown.tsx b/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/groups/components/group_row_users_dropdown.tsx new file mode 100644 index 0000000000000..7ecf01db9c044 --- /dev/null +++ b/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/groups/components/group_row_users_dropdown.tsx @@ -0,0 +1,55 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import React from 'react'; + +import { useActions, useValues } from 'kea'; + +import { EuiLoadingContent, EuiButtonEmpty } from '@elastic/eui'; + +import { GroupsLogic } from '../groups_logic'; +import { FilterableUsersPopover } from './filterable_users_popover'; + +interface IGroupRowUsersDropdownProps { + isPopoverOpen: boolean; + numOptions: number; + groupId: string; + onButtonClick(): void; + closePopover(): void; +} + +export const GroupRowUsersDropdown: React.FC = ({ + isPopoverOpen, + numOptions, + groupId, + onButtonClick, + closePopover, +}) => { + const { fetchGroupUsers } = useActions(GroupsLogic); + const { allGroupUsersLoading, allGroupUsers } = useValues(GroupsLogic); + + const handleLinkClick = () => { + fetchGroupUsers(groupId); + onButtonClick(); + }; + + const toggleLink = ( + + + {numOptions} + + ); + + return ( + : undefined} + className="user-group-source--additional__wrap" + button={toggleLink} + closePopover={closePopover} + /> + ); +}; diff --git a/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/groups/components/group_source_prioritization.tsx b/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/groups/components/group_source_prioritization.tsx new file mode 100644 index 0000000000000..659f7f209e498 --- /dev/null +++ b/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/groups/components/group_source_prioritization.tsx @@ -0,0 +1,192 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import React, { ChangeEvent, MouseEvent } from 'react'; + +import { useActions, useValues } from 'kea'; + +import { i18n } from '@kbn/i18n'; + +import { + EuiButton, + EuiEmptyPrompt, + EuiFlexGroup, + EuiFlexItem, + EuiRange, + EuiPanel, + EuiSpacer, + EuiTable, + EuiTableHeader, + EuiTableHeaderCell, + EuiTableBody, + EuiTableRow, + EuiTableRowCell, +} from '@elastic/eui'; + +import { Loading } from '../../../components/shared/loading'; +import { ViewContentHeader } from '../../../components/shared/view_content_header'; +import { SourceIcon } from '../../../components/shared/source_icon'; + +import { GroupLogic } from '../group_logic'; + +import { IContentSource } from '../../../types'; + +const HEADER_TITLE = i18n.translate( + 'xpack.enterpriseSearch.workplaceSearch.groups.sourceProioritization.headerTitle', + { + defaultMessage: 'Shared content source prioritization', + } +); +const HEADER_DESCRIPTION = i18n.translate( + 'xpack.enterpriseSearch.workplaceSearch.groups.sourceProioritization.headerDescription', + { + defaultMessage: 'Calibrate relative document importance across group content sources.', + } +); +const HEADER_ACTION_TEXT = i18n.translate( + 'xpack.enterpriseSearch.workplaceSearch.groups.sourceProioritization.headerActionText', + { + defaultMessage: 'Save', + } +); +const ZERO_STATE_TITLE = i18n.translate( + 'xpack.enterpriseSearch.workplaceSearch.groups.sourceProioritization.zeroStateTitle', + { + defaultMessage: 'No sources are shared with this group', + } +); +const ZERO_STATE_BUTTON_TEXT = i18n.translate( + 'xpack.enterpriseSearch.workplaceSearch.groups.sourceProioritization.zeroStateButtonText', + { + defaultMessage: 'Add shared content sources', + } +); +const SOURCE_TABLE_HEADER = i18n.translate( + 'xpack.enterpriseSearch.workplaceSearch.groups.sourceProioritization.sourceTableHeader', + { + defaultMessage: 'Source', + } +); +const PRIORITY_TABLE_HEADER = i18n.translate( + 'xpack.enterpriseSearch.workplaceSearch.groups.sourceProioritization.priorityTableHeader', + { + defaultMessage: 'Relevance Priority', + } +); + +export const GroupSourcePrioritization: React.FC = () => { + const { updatePriority, saveGroupSourcePrioritization, showSharedSourcesModal } = useActions( + GroupLogic + ); + + const { + group: { contentSources, name: groupName }, + dataLoading, + activeSourcePriorities, + groupPrioritiesUnchanged, + } = useValues(GroupLogic); + + if (dataLoading) return ; + + const headerAction = ( + + {HEADER_ACTION_TEXT} + + ); + const handleSliderChange = ( + id: string, + e: ChangeEvent | MouseEvent + ) => updatePriority(id, Number((e.target as HTMLInputElement).value)); + const hasSources = contentSources.length > 0; + + const zeroState = ( + + + {ZERO_STATE_TITLE}} + body={ + <> + {i18n.translate( + 'xpack.enterpriseSearch.workplaceSearch.groups.sourceProioritization.zeroStateBody', + { + defaultMessage: + 'Share two or more sources with {groupName} to customize source prioritization.', + values: { groupName }, + } + )} + + } + actions={{ZERO_STATE_BUTTON_TEXT}} + /> + + + ); + + const sourceTable = ( + + + {SOURCE_TABLE_HEADER} + {PRIORITY_TABLE_HEADER} + + + {contentSources.map(({ id, name, serviceType }: IContentSource) => ( + + + + + + + + {name} + + + + + + + | MouseEvent) => + handleSliderChange(id, e) + } + /> + + +
+ {activeSourcePriorities[id]} +
+
+
+
+
+ ))} +
+
+ ); + + return ( + <> + + {hasSources ? sourceTable : zeroState} + + ); +}; diff --git a/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/groups/components/group_sources.tsx b/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/groups/components/group_sources.tsx new file mode 100644 index 0000000000000..7ae9856834443 --- /dev/null +++ b/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/groups/components/group_sources.tsx @@ -0,0 +1,43 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import React, { useState } from 'react'; + +import { SourceIcon } from '../../../components/shared/source_icon'; +import { MAX_TABLE_ROW_ICONS } from '../../../constants'; + +import { IContentSource } from '../../../types'; + +import { GroupRowSourcesDropdown } from './group_row_sources_dropdown'; + +interface IGroupSourcesProps { + groupSources: IContentSource[]; +} + +export const GroupSources: React.FC = ({ groupSources }) => { + const [popoverOpen, setPopoverOpen] = useState(false); + const closePopover = () => setPopoverOpen(false); + const togglePopover = () => setPopoverOpen(!popoverOpen); + const hiddenSources = [...groupSources]; + const visibleSources = hiddenSources.splice(0, MAX_TABLE_ROW_ICONS); + + return ( + <> + {visibleSources.map((source, index) => ( + + ))} + {hiddenSources.length > 0 && ( + + )} + + ); +}; diff --git a/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/groups/components/group_sub_nav.tsx b/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/groups/components/group_sub_nav.tsx new file mode 100644 index 0000000000000..db8d390acce51 --- /dev/null +++ b/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/groups/components/group_sub_nav.tsx @@ -0,0 +1,38 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import React from 'react'; +import { useValues } from 'kea'; +import { i18n } from '@kbn/i18n'; + +import { GroupLogic } from '../group_logic'; + +import { SideNavLink } from '../../../../shared/layout'; + +import { getGroupPath, getGroupSourcePrioritizationPath } from '../../../routes'; + +export const GroupSubNav: React.FC = () => { + const { + group: { id }, + } = useValues(GroupLogic); + + if (!id) return null; + + return ( + <> + + {i18n.translate('xpack.enterpriseSearch.workplaceSearch.nav.groups.groupOverview', { + defaultMessage: 'Overview', + })} + + + {i18n.translate('xpack.enterpriseSearch.workplaceSearch.nav.groups.sourcePrioritization', { + defaultMessage: 'Source Prioritization', + })} + + + ); +}; diff --git a/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/groups/components/group_users.tsx b/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/groups/components/group_users.tsx new file mode 100644 index 0000000000000..6ce4370ccb8d1 --- /dev/null +++ b/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/groups/components/group_users.tsx @@ -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; + * you may not use this file except in compliance with the Elastic License. + */ + +import React, { useState } from 'react'; + +import { UserIcon } from '../../../components/shared/user_icon'; +import { MAX_TABLE_ROW_ICONS } from '../../../constants'; + +import { IUser } from '../../../types'; + +import { GroupRowUsersDropdown } from './group_row_users_dropdown'; + +interface IGroupUsersProps { + groupUsers: IUser[]; + usersCount: number; + groupId: string; +} + +export const GroupUsers: React.FC = ({ groupUsers, usersCount, groupId }) => { + const [popoverOpen, setPopoverOpen] = useState(false); + const closePopover = () => setPopoverOpen(false); + const togglePopover = () => setPopoverOpen(!popoverOpen); + const hiddenUsers = [...groupUsers]; + const visibleUsers = hiddenUsers.splice(0, MAX_TABLE_ROW_ICONS); + + return ( + <> + {visibleUsers.map((user, index) => ( + + ))} + {hiddenUsers.length > 0 && ( + + )} + + ); +}; diff --git a/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/groups/components/group_users_table.tsx b/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/groups/components/group_users_table.tsx new file mode 100644 index 0000000000000..5ab71056aba7e --- /dev/null +++ b/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/groups/components/group_users_table.tsx @@ -0,0 +1,85 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import React, { useState } from 'react'; + +import { useValues } from 'kea'; + +import { i18n } from '@kbn/i18n'; + +import { EuiTable, EuiTableBody, EuiTablePagination } from '@elastic/eui'; +import { Pager } from '@elastic/eui'; + +import { IUser } from '../../../types'; + +import { TableHeader } from '../../../../shared/table_header'; +import { UserRow } from '../../../components/shared/user_row'; + +import { AppLogic } from '../../../app_logic'; +import { GroupLogic } from '../group_logic'; + +const USERS_PER_PAGE = 10; +const USERNAME_TABLE_HEADER = i18n.translate( + 'xpack.enterpriseSearch.workplaceSearch.groups.groupsUsersTable.usernameTableHeader', + { + defaultMessage: 'Username', + } +); +const EMAIL_TABLE_HEADER = i18n.translate( + 'xpack.enterpriseSearch.workplaceSearch.groups.groupsUsersTable.emailTableHeader', + { + defaultMessage: 'Email', + } +); + +export const GroupUsersTable: React.FC = () => { + const { isFederatedAuth } = useValues(AppLogic); + const { + group: { users }, + } = useValues(GroupLogic); + const headerItems = [USERNAME_TABLE_HEADER]; + if (!isFederatedAuth) { + headerItems.push(EMAIL_TABLE_HEADER); + } + + const [firstItem, setFirstItem] = useState(0); + const [lastItem, setLastItem] = useState(USERS_PER_PAGE - 1); + const [currentPage, setCurrentPage] = useState(0); + + const numUsers = users.length; + const pager = new Pager(numUsers, USERS_PER_PAGE); + + const onChangePage = (pageIndex: number) => { + pager.goToPageIndex(pageIndex); + setFirstItem(pager.firstItemIndex); + setLastItem(pager.lastItemIndex); + setCurrentPage(pager.getCurrentPageIndex()); + }; + + const pagination = ( + + ); + + return ( + <> + + + + {users.slice(firstItem, lastItem + 1).map((user: IUser) => ( + + ))} + + + {numUsers > USERS_PER_PAGE && pagination} + + ); +}; diff --git a/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/groups/components/groups_table.tsx b/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/groups/components/groups_table.tsx new file mode 100644 index 0000000000000..896a80e642be4 --- /dev/null +++ b/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/groups/components/groups_table.tsx @@ -0,0 +1,96 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import React from 'react'; + +import { useActions, useValues } from 'kea'; + +import { i18n } from '@kbn/i18n'; + +import { + EuiSpacer, + EuiTable, + EuiTableBody, + EuiTableHeader, + EuiTableHeaderCell, +} from '@elastic/eui'; + +import { TablePaginationBar } from '../../../components/shared/table_pagination_bar'; + +import { AppLogic } from '../../../app_logic'; +import { GroupsLogic } from '../groups_logic'; +import { GroupRow } from './group_row'; + +import { ClearFiltersLink } from './clear_filters_link'; + +const GROUP_TABLE_HEADER = i18n.translate( + 'xpack.enterpriseSearch.workplaceSearch.groups.groupsTable.groupTableHeader', + { + defaultMessage: 'Group', + } +); +const SOURCES_TABLE_HEADER = i18n.translate( + 'xpack.enterpriseSearch.workplaceSearch.groups.groupsTable.sourcesTableHeader', + { + defaultMessage: 'Content sources', + } +); +const USERS_TABLE_HEADER = i18n.translate( + 'xpack.enterpriseSearch.workplaceSearch.groups.groupsTable.usersTableHeader', + { + defaultMessage: 'Users', + } +); + +export const GroupsTable: React.FC<{}> = () => { + const { setActivePage } = useActions(GroupsLogic); + const { + groupsMeta: { + page: { total_pages: totalPages, total_results: totalItems, current: activePage }, + }, + groups, + hasFiltersSet, + } = useValues(GroupsLogic); + const { isFederatedAuth } = useValues(AppLogic); + + const clearFiltersLink = hasFiltersSet ? : undefined; + + const paginationOptions = { + itemLabel: 'Groups', + totalPages, + totalItems, + activePage, + clearFiltersLink, + onChangePage: (page: number) => { + // EUI component starts page at 0. API starts at 1. + setActivePage(page + 1); + }, + }; + + const showPagination = totalPages > 1; + + return ( + <> + {showPagination ? : clearFiltersLink} + + + + {GROUP_TABLE_HEADER} + {SOURCES_TABLE_HEADER} + {!isFederatedAuth && {USERS_TABLE_HEADER}} + + + + {groups.map((group, index) => ( + + ))} + + + + {showPagination && } + + ); +}; diff --git a/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/groups/components/manage_users_modal.tsx b/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/groups/components/manage_users_modal.tsx new file mode 100644 index 0000000000000..8a384cfd5a91a --- /dev/null +++ b/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/groups/components/manage_users_modal.tsx @@ -0,0 +1,56 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import React from 'react'; + +import { useActions, useValues } from 'kea'; + +import { i18n } from '@kbn/i18n'; + +import { GroupLogic } from '../group_logic'; +import { GroupsLogic } from '../groups_logic'; + +import { FilterableUsersList } from './filterable_users_list'; +import { GroupManagerModal } from './group_manager_modal'; + +const MODAL_LABEL = i18n.translate( + 'xpack.enterpriseSearch.workplaceSearch.groups.usersModalLabel', + { + defaultMessage: 'users', + } +); + +export const ManageUsersModal: React.FC = () => { + const { + addGroupUser, + removeGroupUser, + selectAllUsers, + hideManageUsersModal, + saveGroupUsers, + } = useActions(GroupLogic); + + const { selectedGroupUsers } = useValues(GroupLogic); + const { users } = useValues(GroupsLogic); + + return ( + + + + ); +}; diff --git a/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/groups/components/shared_sources_modal.tsx b/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/groups/components/shared_sources_modal.tsx new file mode 100644 index 0000000000000..1bc72f99d7be8 --- /dev/null +++ b/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/groups/components/shared_sources_modal.tsx @@ -0,0 +1,64 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import React from 'react'; + +import { useActions, useValues } from 'kea'; + +import { i18n } from '@kbn/i18n'; + +import { GroupLogic } from '../group_logic'; +import { GroupsLogic } from '../groups_logic'; + +import { GroupManagerModal } from './group_manager_modal'; +import { SourcesList } from './sources_list'; + +const MODAL_LABEL = i18n.translate( + 'xpack.enterpriseSearch.workplaceSearch.groups.sourcesModalLabel', + { + defaultMessage: 'shared content sources', + } +); + +export const SharedSourcesModal: React.FC = () => { + const { + addGroupSource, + selectAllSources, + hideSharedSourcesModal, + removeGroupSource, + saveGroupSources, + } = useActions(GroupLogic); + + const { selectedGroupSources, group } = useValues(GroupLogic); + + const { contentSources } = useValues(GroupsLogic); + + return ( + + <> +

+ {i18n.translate('xpack.enterpriseSearch.workplaceSearch.groups.sourcesModalTitle', { + defaultMessage: 'Select content sources to share with {groupName}', + values: { groupName: group.name }, + })} +

+ + +
+ ); +}; diff --git a/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/groups/components/source_option_item.tsx b/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/groups/components/source_option_item.tsx new file mode 100644 index 0000000000000..f6677670f8a88 --- /dev/null +++ b/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/groups/components/source_option_item.tsx @@ -0,0 +1,31 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import React from 'react'; + +import { EuiFlexGroup, EuiFlexItem } from '@elastic/eui'; + +import { TruncatedContent } from '../../../../shared/truncate'; + +import { SourceIcon } from '../../../components/shared/source_icon'; +import { IContentSource } from '../../../types'; + +const MAX_LENGTH = 28; + +interface ISourceOptionItemProps { + source: IContentSource; +} + +export const SourceOptionItem: React.FC = ({ source }) => ( + + + + + + + + +); diff --git a/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/groups/components/sources_list.tsx b/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/groups/components/sources_list.tsx new file mode 100644 index 0000000000000..e8f9027d98e0d --- /dev/null +++ b/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/groups/components/sources_list.tsx @@ -0,0 +1,41 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import React from 'react'; + +import { EuiFilterSelectItem } from '@elastic/eui'; + +import { IContentSource } from '../../../types'; + +import { SourceOptionItem } from './source_option_item'; + +interface ISourcesListProps { + contentSources: IContentSource[]; + filteredSources: string[]; + addFilteredSource(sourceId: string): void; + removeFilteredSource(sourceId: string): void; +} + +export const SourcesList: React.FC = ({ + contentSources, + filteredSources, + addFilteredSource, + removeFilteredSource, +}) => { + const sourceIds = contentSources.map(({ id }) => id); + const sources = sourceIds.map((sourceId, index) => { + const checked = filteredSources.indexOf(sourceId) > -1 ? 'on' : undefined; + const handleClick = () => + checked ? removeFilteredSource(sourceId) : addFilteredSource(sourceId); + return ( + + id === sourceId)[0]} /> + + ); + }); + + return
{sources}
; +}; diff --git a/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/groups/components/table_filter_sources_dropdown.tsx b/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/groups/components/table_filter_sources_dropdown.tsx new file mode 100644 index 0000000000000..220c33ca86ddd --- /dev/null +++ b/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/groups/components/table_filter_sources_dropdown.tsx @@ -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; + * you may not use this file except in compliance with the Elastic License. + */ + +import React from 'react'; + +import { useActions, useValues } from 'kea'; + +import { i18n } from '@kbn/i18n'; + +import { EuiFilterButton, EuiFilterGroup, EuiPopover } from '@elastic/eui'; + +import { GroupsLogic } from '../groups_logic'; +import { SourcesList } from './sources_list'; + +const FILTER_SOURCES_BUTTON_TEXT = i18n.translate( + 'xpack.enterpriseSearch.workplaceSearch.groups.filterSources.buttonText', + { + defaultMessage: 'Sources', + } +); + +export const TableFilterSourcesDropdown: React.FC = () => { + const { + addFilteredSource, + removeFilteredSource, + toggleFilterSourcesDropdown, + closeFilterSourcesDropdown, + } = useActions(GroupsLogic); + const { contentSources, filterSourcesDropdownOpen, filteredSources } = useValues(GroupsLogic); + + const sourceIds = contentSources.map(({ id }) => id); + + const filterButton = ( + 0} + numActiveFilters={filteredSources.length} + > + {FILTER_SOURCES_BUTTON_TEXT} + + ); + + return ( + + + + + + ); +}; diff --git a/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/groups/components/table_filter_users_dropdown.tsx b/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/groups/components/table_filter_users_dropdown.tsx new file mode 100644 index 0000000000000..6345c4378418f --- /dev/null +++ b/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/groups/components/table_filter_users_dropdown.tsx @@ -0,0 +1,52 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import React from 'react'; + +import { useActions, useValues } from 'kea'; + +import { i18n } from '@kbn/i18n'; + +import { EuiFilterButton } from '@elastic/eui'; + +import { GroupsLogic } from '../groups_logic'; +import { FilterableUsersPopover } from './filterable_users_popover'; + +const FILTER_USERS_BUTTON_TEXT = i18n.translate( + 'xpack.enterpriseSearch.workplaceSearch.groups.filterUsers.buttonText', + { + defaultMessage: 'Users', + } +); + +export const TableFilterUsersDropdown: React.FC<{}> = () => { + const { closeFilterUsersDropdown, toggleFilterUsersDropdown } = useActions(GroupsLogic); + const { filteredUsers, filterUsersDropdownOpen, users } = useValues(GroupsLogic); + + const filterButton = ( + 0} + numActiveFilters={filteredUsers.length} + > + {FILTER_USERS_BUTTON_TEXT} + + ); + + return ( + + ); +}; diff --git a/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/groups/components/table_filters.tsx b/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/groups/components/table_filters.tsx new file mode 100644 index 0000000000000..d11af030822bf --- /dev/null +++ b/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/groups/components/table_filters.tsx @@ -0,0 +1,59 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import React, { ChangeEvent } from 'react'; + +import { useActions, useValues } from 'kea'; + +import { i18n } from '@kbn/i18n'; + +import { EuiFieldSearch, EuiFlexGroup, EuiFlexItem } from '@elastic/eui'; + +import { AppLogic } from '../../../app_logic'; +import { GroupsLogic } from '../groups_logic'; + +import { TableFilterSourcesDropdown } from './table_filter_sources_dropdown'; +import { TableFilterUsersDropdown } from './table_filter_users_dropdown'; + +const FILTER_GROUPS_PLACEHOLDER = i18n.translate( + 'xpack.enterpriseSearch.workplaceSearch.groups.filterGroups.placeholder', + { + defaultMessage: 'Filter groups by name...', + } +); + +export const TableFilters: React.FC = () => { + const { setFilterValue } = useActions(GroupsLogic); + const { filterValue } = useValues(GroupsLogic); + const { isFederatedAuth } = useValues(AppLogic); + + const handleSearchChange = (e: ChangeEvent) => setFilterValue(e.target.value); + + return ( + + + + + + + + + + {!isFederatedAuth && ( + + + + )} + + + + ); +}; diff --git a/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/groups/components/user_option_item.tsx b/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/groups/components/user_option_item.tsx new file mode 100644 index 0000000000000..8eb199d67cf92 --- /dev/null +++ b/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/groups/components/user_option_item.tsx @@ -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; + * you may not use this file except in compliance with the Elastic License. + */ + +import React from 'react'; + +import { EuiFlexGroup, EuiFlexItem } from '@elastic/eui'; + +import { UserIcon } from '../../../components/shared/user_icon'; +import { IUser } from '../../../types'; + +interface IUserOptionItemProps { + user: IUser; +} + +export const UserOptionItem: React.FC = ({ user }) => ( + + + + + {user.name || user.email} + +); diff --git a/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/groups/group_logic.ts b/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/groups/group_logic.ts new file mode 100644 index 0000000000000..1ce0fe53726d4 --- /dev/null +++ b/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/groups/group_logic.ts @@ -0,0 +1,388 @@ +/* + * 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 { kea, MakeLogicType } from 'kea'; +import { isEqual } from 'lodash'; +import { History } from 'history'; +import { i18n } from '@kbn/i18n'; + +import { HttpLogic } from '../../../shared/http'; +import { KibanaLogic } from '../../../shared/kibana'; + +import { + FlashMessagesLogic, + flashAPIErrors, + setSuccessMessage, + setQueuedSuccessMessage, +} from '../../../shared/flash_messages'; +import { GROUPS_PATH } from '../../routes'; + +import { IContentSourceDetails, IGroupDetails, IUser, ISourcePriority } from '../../types'; + +export const MAX_NAME_LENGTH = 40; + +export interface IGroupActions { + onInitializeGroup(group: IGroupDetails): IGroupDetails; + onGroupNameChanged(group: IGroupDetails): IGroupDetails; + onGroupPrioritiesChanged(group: IGroupDetails): IGroupDetails; + onGroupNameInputChange(groupName: string): string; + addGroupSource(sourceId: string): string; + removeGroupSource(sourceId: string): string; + addGroupUser(userId: string): string; + removeGroupUser(userId: string): string; + onGroupSourcesSaved(group: IGroupDetails): IGroupDetails; + onGroupUsersSaved(group: IGroupDetails): IGroupDetails; + setGroupModalErrors(errors: string[]): string[]; + hideSharedSourcesModal(group: IGroupDetails): IGroupDetails; + hideManageUsersModal(group: IGroupDetails): IGroupDetails; + selectAllSources(contentSources: IContentSourceDetails[]): IContentSourceDetails[]; + selectAllUsers(users: IUser[]): IUser[]; + updatePriority(id: string, boost: number): { id: string; boost: number }; + resetGroup(): void; + showConfirmDeleteModal(): void; + hideConfirmDeleteModal(): void; + showSharedSourcesModal(): void; + showManageUsersModal(): void; + resetFlashMessages(): void; + initializeGroup(groupId: string): { groupId: string }; + deleteGroup(): void; + updateGroupName(): void; + saveGroupSources(): void; + saveGroupUsers(): void; + saveGroupSourcePrioritization(): void; +} + +export interface IGroupValues { + contentSources: IContentSourceDetails[]; + users: IUser[]; + group: IGroupDetails; + dataLoading: boolean; + manageUsersModalVisible: boolean; + managerModalFormErrors: string[]; + sharedSourcesModalModalVisible: boolean; + confirmDeleteModalVisible: boolean; + groupNameInputValue: string; + selectedGroupSources: string[]; + selectedGroupUsers: string[]; + groupPrioritiesUnchanged: boolean; + activeSourcePriorities: ISourcePriority; + cachedSourcePriorities: ISourcePriority; +} + +export const GroupLogic = kea>({ + path: ['enterprise_search', 'workplace_search', 'group'], + actions: { + onInitializeGroup: (group: IGroupDetails) => group, + onGroupNameChanged: (group: IGroupDetails) => group, + onGroupPrioritiesChanged: (group: IGroupDetails) => group, + onGroupNameInputChange: (groupName: string) => groupName, + addGroupSource: (sourceId: string) => sourceId, + removeGroupSource: (sourceId: string) => sourceId, + addGroupUser: (userId: string) => userId, + removeGroupUser: (userId: string) => userId, + onGroupSourcesSaved: (group: IGroupDetails) => group, + onGroupUsersSaved: (group: IGroupDetails) => group, + setGroupModalErrors: (errors: string[]) => errors, + hideSharedSourcesModal: (group: IGroupDetails) => group, + hideManageUsersModal: (group: IGroupDetails) => group, + selectAllSources: (contentSources: IContentSourceDetails[]) => contentSources, + selectAllUsers: (users: IUser[]) => users, + updatePriority: (id: string, boost: number) => ({ id, boost }), + resetGroup: () => true, + showConfirmDeleteModal: () => true, + hideConfirmDeleteModal: () => true, + showSharedSourcesModal: () => true, + showManageUsersModal: () => true, + resetFlashMessages: () => true, + initializeGroup: (groupId: string, history: History) => ({ groupId, history }), + deleteGroup: () => true, + updateGroupName: () => true, + saveGroupSources: () => true, + saveGroupUsers: () => true, + saveGroupSourcePrioritization: () => true, + }, + reducers: { + group: [ + {} as IGroupDetails, + { + onInitializeGroup: (_, group) => group, + onGroupNameChanged: (_, group) => group, + onGroupSourcesSaved: (_, group) => group, + onGroupUsersSaved: (_, group) => group, + resetGroup: () => ({} as IGroupDetails), + }, + ], + dataLoading: [ + true, + { + onInitializeGroup: () => false, + onGroupPrioritiesChanged: () => false, + resetGroup: () => true, + }, + ], + manageUsersModalVisible: [ + false, + { + showManageUsersModal: () => true, + hideManageUsersModal: () => false, + onGroupUsersSaved: () => false, + }, + ], + managerModalFormErrors: [ + [], + { + setGroupModalErrors: (_, errors) => errors, + hideManageUsersModal: () => [], + }, + ], + sharedSourcesModalModalVisible: [ + false, + { + showSharedSourcesModal: () => true, + hideSharedSourcesModal: () => false, + onGroupSourcesSaved: () => false, + }, + ], + confirmDeleteModalVisible: [ + false, + { + showConfirmDeleteModal: () => true, + hideConfirmDeleteModal: () => false, + }, + ], + groupNameInputValue: [ + '', + { + onInitializeGroup: (_, { name }) => name, + onGroupNameChanged: (_, { name }) => name, + onGroupNameInputChange: (_, name) => name, + }, + ], + selectedGroupSources: [ + [], + { + onInitializeGroup: (_, { contentSources }) => contentSources.map(({ id }) => id), + onGroupSourcesSaved: (_, { contentSources }) => contentSources.map(({ id }) => id), + selectAllSources: (_, contentSources) => contentSources.map(({ id }) => id), + hideSharedSourcesModal: (_, { contentSources }) => contentSources.map(({ id }) => id), + addGroupSource: (state, sourceId) => [...state, sourceId].sort(), + removeGroupSource: (state, sourceId) => state.filter((id) => id !== sourceId), + }, + ], + selectedGroupUsers: [ + [], + { + onInitializeGroup: (_, { users }) => users.map(({ id }) => id), + onGroupUsersSaved: (_, { users }) => users.map(({ id }) => id), + selectAllUsers: (_, users) => users.map(({ id }) => id), + hideManageUsersModal: (_, { users }) => users.map(({ id }) => id), + addGroupUser: (state, userId) => [...state, userId].sort(), + removeGroupUser: (state, userId) => state.filter((id) => id !== userId), + }, + ], + cachedSourcePriorities: [ + {}, + { + onInitializeGroup: (_, { contentSources }) => mapPriorities(contentSources), + onGroupPrioritiesChanged: (_, { contentSources }) => mapPriorities(contentSources), + onGroupSourcesSaved: (_, { contentSources }) => mapPriorities(contentSources), + }, + ], + activeSourcePriorities: [ + {}, + { + onInitializeGroup: (_, { contentSources }) => mapPriorities(contentSources), + onGroupPrioritiesChanged: (_, { contentSources }) => mapPriorities(contentSources), + onGroupSourcesSaved: (_, { contentSources }) => mapPriorities(contentSources), + updatePriority: (state, { id, boost }) => { + const updated = { ...state }; + updated[id] = boost; + return updated; + }, + }, + ], + }, + selectors: ({ selectors }) => ({ + groupPrioritiesUnchanged: [ + () => [selectors.cachedSourcePriorities, selectors.activeSourcePriorities], + (cached, active) => isEqual(cached, active), + ], + }), + listeners: ({ actions, values }) => ({ + initializeGroup: async ({ groupId }) => { + try { + const response = await HttpLogic.values.http.get(`/api/workplace_search/groups/${groupId}`); + actions.onInitializeGroup(response); + } catch (e) { + const NOT_FOUND_MESSAGE = i18n.translate( + 'xpack.enterpriseSearch.workplaceSearch.groups.groupNotFound', + { + defaultMessage: 'Unable to find group with ID: "{groupId}".', + values: { groupId }, + } + ); + + const error = e.response.status === 404 ? NOT_FOUND_MESSAGE : e; + + FlashMessagesLogic.actions.setQueuedMessages({ + type: 'error', + message: error, + }); + + KibanaLogic.values.navigateToUrl(GROUPS_PATH); + } + }, + deleteGroup: async () => { + const { + group: { id, name }, + } = values; + try { + await HttpLogic.values.http.delete(`/api/workplace_search/groups/${id}`); + const GROUP_DELETED_MESSAGE = i18n.translate( + 'xpack.enterpriseSearch.workplaceSearch.groups.groupDeleted', + { + defaultMessage: 'Group "{groupName}" was successfully deleted.', + values: { groupName: name }, + } + ); + + setQueuedSuccessMessage(GROUP_DELETED_MESSAGE); + KibanaLogic.values.navigateToUrl(GROUPS_PATH); + } catch (e) { + flashAPIErrors(e); + } + }, + updateGroupName: async () => { + const { + group: { id }, + groupNameInputValue, + } = values; + + try { + const response = await HttpLogic.values.http.put(`/api/workplace_search/groups/${id}`, { + body: JSON.stringify({ group: { name: groupNameInputValue } }), + }); + actions.onGroupNameChanged(response); + + const GROUP_RENAMED_MESSAGE = i18n.translate( + 'xpack.enterpriseSearch.workplaceSearch.groups.groupRenamed', + { + defaultMessage: 'Successfully renamed this group to "{groupName}".', + values: { groupName: response.name }, + } + ); + setSuccessMessage(GROUP_RENAMED_MESSAGE); + } catch (e) { + flashAPIErrors(e); + } + }, + saveGroupSources: async () => { + const { + group: { id }, + selectedGroupSources, + } = values; + + try { + const response = await HttpLogic.values.http.post( + `/api/workplace_search/groups/${id}/share`, + { + body: JSON.stringify({ content_source_ids: selectedGroupSources }), + } + ); + actions.onGroupSourcesSaved(response); + const GROUP_SOURCES_UPDATED_MESSAGE = i18n.translate( + 'xpack.enterpriseSearch.workplaceSearch.groups.groupSourcesUpdated', + { + defaultMessage: 'Successfully updated shared content sources.', + } + ); + setSuccessMessage(GROUP_SOURCES_UPDATED_MESSAGE); + } catch (e) { + flashAPIErrors(e); + } + }, + saveGroupUsers: async () => { + const { + group: { id }, + selectedGroupUsers, + } = values; + + try { + const response = await HttpLogic.values.http.post( + `/api/workplace_search/groups/${id}/assign`, + { + body: JSON.stringify({ user_ids: selectedGroupUsers }), + } + ); + actions.onGroupUsersSaved(response); + const GROUP_USERS_UPDATED_MESSAGE = i18n.translate( + 'xpack.enterpriseSearch.workplaceSearch.groups.groupUsersUpdated', + { + defaultMessage: 'Successfully updated the users of this group', + } + ); + setSuccessMessage(GROUP_USERS_UPDATED_MESSAGE); + } catch (e) { + flashAPIErrors(e); + } + }, + saveGroupSourcePrioritization: async () => { + const { + group: { id }, + activeSourcePriorities, + } = values; + + // server expects an array of id, value for each boost. + // example: [['123abc', 7], ['122abv', 1]] + const boosts = [] as Array>; + Object.keys(activeSourcePriorities).forEach((k: string) => + boosts.push([k, Number(activeSourcePriorities[k])]) + ); + + try { + const response = await HttpLogic.values.http.put( + `/api/workplace_search/groups/${id}/boosts`, + { + body: JSON.stringify({ content_source_boosts: boosts }), + } + ); + + const GROUP_PRIORITIZATION_UPDATED_MESSAGE = i18n.translate( + 'xpack.enterpriseSearch.workplaceSearch.groups.groupPrioritizationUpdated', + { + defaultMessage: 'Successfully updated shared source prioritization', + } + ); + + setSuccessMessage(GROUP_PRIORITIZATION_UPDATED_MESSAGE); + actions.onGroupPrioritiesChanged(response); + } catch (e) { + flashAPIErrors(e); + } + }, + showConfirmDeleteModal: () => { + FlashMessagesLogic.actions.clearFlashMessages(); + }, + showManageUsersModal: () => { + FlashMessagesLogic.actions.clearFlashMessages(); + }, + showSharedSourcesModal: () => { + FlashMessagesLogic.actions.clearFlashMessages(); + }, + resetFlashMessages: () => { + FlashMessagesLogic.actions.clearFlashMessages(); + }, + }), +}); + +const mapPriorities = (contentSources: IContentSourceDetails[]): ISourcePriority => { + const prioritiesMap = {} as ISourcePriority; + contentSources.forEach(({ id, boost }) => { + prioritiesMap[id] = boost; + }); + + return prioritiesMap; +}; diff --git a/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/groups/group_router.tsx b/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/groups/group_router.tsx new file mode 100644 index 0000000000000..e5779a96b4687 --- /dev/null +++ b/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/groups/group_router.tsx @@ -0,0 +1,47 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import React, { useEffect } from 'react'; + +import { useActions, useValues } from 'kea'; +import { Route, Switch, useParams } from 'react-router-dom'; + +import { FlashMessages, FlashMessagesLogic } from '../../../shared/flash_messages'; +import { GROUP_SOURCE_PRIORITIZATION_PATH, GROUP_PATH } from '../../routes'; +import { GroupLogic } from './group_logic'; + +import { ManageUsersModal } from './components/manage_users_modal'; +import { SharedSourcesModal } from './components/shared_sources_modal'; + +import { GroupOverview } from './components/group_overview'; +import { GroupSourcePrioritization } from './components/group_source_prioritization'; + +export const GroupRouter: React.FC = () => { + const { groupId } = useParams() as { groupId: string }; + + const { messages } = useValues(FlashMessagesLogic); + const { initializeGroup, resetGroup } = useActions(GroupLogic); + const { sharedSourcesModalModalVisible, manageUsersModalVisible } = useValues(GroupLogic); + + const hasMessages = messages.length > 0; + + useEffect(() => { + initializeGroup(groupId); + return resetGroup; + }, []); + + return ( + <> + {hasMessages && } + + + + + {sharedSourcesModalModalVisible && } + {manageUsersModalVisible && } + + ); +}; diff --git a/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/groups/groups.scss b/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/groups/groups.scss new file mode 100644 index 0000000000000..fbd4e6f87d19b --- /dev/null +++ b/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/groups/groups.scss @@ -0,0 +1,101 @@ +.groups-table { + background-color: transparent; +} + +.user-groups-header { + display: flex; + padding: 0 1.5rem; + margin-bottom: 1rem; + font-size: .875rem; + font-weight: 500; + color: $euiColorDarkShade; + + &__title { + flex: 1; + } + + &__sources, + &__accounts { + width: 25%; + } +} + +.user-group { + display: flex; + height: 80px; + background: $euiColorLightestShade; + color: $euiColorDarkestShade; + border-radius: 6px; + align-items: center; + padding: 0 1.5rem; + position: relative; + margin-bottom: 1rem; + &:hover { + background: $euiColorEmptyShade; + color: $euiColorFullShade; + box-shadow: + inset 0 0 0 1px $euiColorLightShade, + 0 2px 4px rgba(black, .05); + } + + &:after { + content: ''; + width: 8px; + height: 8px; + border-right: 2px solid currentColor; + border-bottom: 2px solid currentColor; + opacity: .5; + position: absolute; + transform: translateY(-50%) rotate(-45deg); + top: 50%; + right: 1.5rem; + } + + &__sources, + &__accounts { + display: flex; + align-items: center; + } + + &__item { + pointer-events: none; + } +} + +.user-group-source, +.user-group-account { + width: 30px; + height: 30px; + overflow: hidden; + margin-right: 4px; + position: relative; + display: flex; + justify-content: center; + align-items: center; + + &--additional { + font-size: .875rem; + margin-left: .5rem; + opacity: .75; + font-weight: 500; + + &__wrap { + border: none; + box-shadow: none; + } + } + + img { + max-width: 100%; + } +} + +.user-groups-filters { + &__search-bar { + min-width: 260px!important; + } + + &__filter-sources { + min-width: 130px!important; + } +} diff --git a/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/groups/groups.tsx b/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/groups/groups.tsx new file mode 100644 index 0000000000000..5c475e717329e --- /dev/null +++ b/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/groups/groups.tsx @@ -0,0 +1,146 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import React, { useEffect } from 'react'; + +import { useActions, useValues } from 'kea'; +import { i18n } from '@kbn/i18n'; + +import { EuiButton, EuiFlexGroup, EuiFlexItem, EuiLoadingSpinner, EuiSpacer } from '@elastic/eui'; +import { EuiButton as EuiLinkButton } from '../../../shared/react_router_helpers'; +import { SetWorkplaceSearchChrome as SetPageChrome } from '../../../shared/kibana_chrome'; +import { SendWorkplaceSearchTelemetry as SendTelemetry } from '../../../shared/telemetry'; + +import { AppLogic } from '../../app_logic'; + +import { Loading } from '../../components/shared/loading'; +import { ViewContentHeader } from '../../components/shared/view_content_header'; + +import { getGroupPath, USERS_PATH } from '../../routes'; + +import { useDidUpdateEffect } from '../../../shared/use_did_update_effect'; +import { FlashMessages, FlashMessagesLogic } from '../../../shared/flash_messages'; + +import { GroupsLogic } from './groups_logic'; + +import { AddGroupModal } from './components/add_group_modal'; +import { ClearFiltersLink } from './components/clear_filters_link'; +import { GroupsTable } from './components/groups_table'; +import { TableFilters } from './components/table_filters'; + +export const Groups: React.FC = () => { + const { messages } = useValues(FlashMessagesLogic); + + const { getSearchResults, openNewGroupModal, resetGroups } = useActions(GroupsLogic); + const { + groupsDataLoading, + newGroupModalOpen, + newGroup, + groupListLoading, + hasFiltersSet, + groupsMeta: { + page: { current: activePage, total_results: numGroups }, + }, + filteredSources, + filteredUsers, + filterValue, + } = useValues(GroupsLogic); + + const { isFederatedAuth } = useValues(AppLogic); + + const hasMessages = messages.length > 0; + + useEffect(() => { + getSearchResults(true); + return resetGroups; + }, [filteredSources, filteredUsers, filterValue]); + + // Because the initial search happens above, we want to skip the initial search and use the custom hook to do so. + useDidUpdateEffect(() => { + getSearchResults(); + }, [activePage]); + + if (groupsDataLoading) { + return ; + } + + if (newGroup && hasMessages) { + messages[0].description = ( + + {i18n.translate('xpack.enterpriseSearch.workplaceSearch.groups.newGroup.action', { + defaultMessage: 'Manage Group', + })} + + ); + } + + const clearFilters = hasFiltersSet && ; + const inviteUsersButton = !isFederatedAuth ? ( + + {i18n.translate('xpack.enterpriseSearch.workplaceSearch.groups.inviteUsers.action', { + defaultMessage: 'Invite users', + })} + + ) : null; + + const headerAction = ( + + + + {i18n.translate('xpack.enterpriseSearch.workplaceSearch.groups.addGroupForm.action', { + defaultMessage: 'Create a group', + })} + + + {inviteUsersButton} + + ); + + const noResults = ( + + + {groupListLoading ? ( + + ) : ( + <> + {clearFilters} +

+ {i18n.translate( + 'xpack.enterpriseSearch.workplaceSearch.groups.searchResults.notFoound', + { + defaultMessage: 'No results found.', + } + )} +

+ + )} +
+
+ ); + + return ( + <> + + + + + + + + {numGroups > 0 && !groupListLoading ? : noResults} + {newGroupModalOpen && } + + ); +}; diff --git a/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/groups/groups_logic.ts b/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/groups/groups_logic.ts new file mode 100644 index 0000000000000..35d4387b4cf3d --- /dev/null +++ b/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/groups/groups_logic.ts @@ -0,0 +1,351 @@ +/* + * 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 { kea, MakeLogicType } from 'kea'; +import { i18n } from '@kbn/i18n'; + +import { HttpLogic } from '../../../shared/http'; + +import { + FlashMessagesLogic, + flashAPIErrors, + setSuccessMessage, +} from '../../../shared/flash_messages'; + +import { IContentSource, IGroup, IUser } from '../../types'; + +import { JSON_HEADER as headers } from '../../../../../common/constants'; +import { DEFAULT_META } from '../../../shared/constants'; +import { IMeta } from '../../../../../common/types'; + +export const MAX_NAME_LENGTH = 40; + +interface IGroupsServerData { + contentSources: IContentSource[]; + users: IUser[]; +} + +interface IGroupsSearchResponse { + results: IGroup[]; + meta: IMeta; +} + +export interface IGroupsActions { + onInitializeGroups(data: IGroupsServerData): IGroupsServerData; + setSearchResults(data: IGroupsSearchResponse): IGroupsSearchResponse; + addFilteredSource(sourceId: string): string; + removeFilteredSource(sourceId: string): string; + addFilteredUser(userId: string): string; + removeFilteredUser(userId: string): string; + setGroupUsers(allGroupUsers: IUser[]): IUser[]; + setAllGroupLoading(allGroupUsersLoading: boolean): boolean; + setFilterValue(filterValue: string): string; + setActivePage(activePage: number): number; + setNewGroupName(newGroupName: string): string; + setNewGroup(newGroup: IGroup): IGroup; + setNewGroupFormErrors(errors: string[]): string[]; + openNewGroupModal(): void; + closeNewGroupModal(): void; + closeFilterSourcesDropdown(): void; + closeFilterUsersDropdown(): void; + toggleFilterSourcesDropdown(): void; + toggleFilterUsersDropdown(): void; + setGroupsLoading(): void; + resetGroupsFilters(): void; + resetGroups(): void; + initializeGroups(): void; + getSearchResults(resetPagination?: boolean): { resetPagination: boolean | undefined }; + fetchGroupUsers(groupId: string): { groupId: string }; + saveNewGroup(): void; +} + +export interface IGroupsValues { + groups: IGroup[]; + contentSources: IContentSource[]; + users: IUser[]; + groupsDataLoading: boolean; + groupListLoading: boolean; + newGroupModalOpen: boolean; + newGroupName: string; + newGroup: IGroup | null; + newGroupNameErrors: string[]; + filterSourcesDropdownOpen: boolean; + filteredSources: string[]; + filterUsersDropdownOpen: boolean; + filteredUsers: string[]; + allGroupUsersLoading: boolean; + allGroupUsers: IUser[]; + filterValue: string; + groupsMeta: IMeta; + hasFiltersSet: boolean; +} + +export const GroupsLogic = kea>({ + path: ['enterprise_search', 'workplace_search', 'groups'], + actions: { + onInitializeGroups: (data: IGroupsServerData) => data, + setSearchResults: (data: IGroupsSearchResponse) => data, + addFilteredSource: (sourceId: string) => sourceId, + removeFilteredSource: (sourceId: string) => sourceId, + addFilteredUser: (userId: string) => userId, + removeFilteredUser: (userId: string) => userId, + setGroupUsers: (allGroupUsers: IUser[]) => allGroupUsers, + setAllGroupLoading: (allGroupUsersLoading: boolean) => allGroupUsersLoading, + setFilterValue: (filterValue: string) => filterValue, + setActivePage: (activePage: number) => activePage, + setNewGroupName: (newGroupName: string) => newGroupName, + setNewGroup: (newGroup: IGroup) => newGroup, + setNewGroupFormErrors: (errors: string[]) => errors, + openNewGroupModal: () => true, + closeNewGroupModal: () => true, + closeFilterSourcesDropdown: () => true, + closeFilterUsersDropdown: () => true, + toggleFilterSourcesDropdown: () => true, + toggleFilterUsersDropdown: () => true, + setGroupsLoading: () => true, + resetGroupsFilters: () => true, + resetGroups: () => true, + initializeGroups: () => true, + getSearchResults: (resetPagination?: boolean) => ({ resetPagination }), + fetchGroupUsers: (groupId: string) => ({ groupId }), + saveNewGroup: () => true, + }, + reducers: { + groups: [ + [] as IGroup[], + { + setSearchResults: (_, { results }) => results, + }, + ], + contentSources: [ + [], + { + onInitializeGroups: (_, { contentSources }) => contentSources, + }, + ], + users: [ + [], + { + onInitializeGroups: (_, { users }) => users, + }, + ], + groupsDataLoading: [ + true, + { + onInitializeGroups: () => false, + }, + ], + groupListLoading: [ + true, + { + setSearchResults: () => false, + setGroupsLoading: () => true, + }, + ], + newGroupModalOpen: [ + false, + { + openNewGroupModal: () => true, + closeNewGroupModal: () => false, + setNewGroup: () => false, + }, + ], + newGroupName: [ + '', + { + setNewGroupName: (_, newGroupName) => newGroupName, + setSearchResults: () => '', + closeNewGroupModal: () => '', + }, + ], + newGroup: [ + null, + { + setNewGroup: (_, newGroup) => newGroup, + resetGroups: () => null, + openNewGroupModal: () => null, + }, + ], + newGroupNameErrors: [ + [], + { + setNewGroupFormErrors: (_, newGroupNameErrors) => newGroupNameErrors, + setNewGroup: () => [], + setNewGroupName: () => [], + closeNewGroupModal: () => [], + }, + ], + filterSourcesDropdownOpen: [ + false, + { + toggleFilterSourcesDropdown: (state) => !state, + closeFilterSourcesDropdown: () => false, + }, + ], + filteredSources: [ + [], + { + resetGroupsFilters: () => [], + setNewGroup: () => [], + addFilteredSource: (state, sourceId) => [...state, sourceId].sort(), + removeFilteredSource: (state, sourceId) => state.filter((id) => id !== sourceId), + }, + ], + filterUsersDropdownOpen: [ + false, + { + toggleFilterUsersDropdown: (state) => !state, + closeFilterUsersDropdown: () => false, + }, + ], + filteredUsers: [ + [], + { + resetGroupsFilters: () => [], + setNewGroup: () => [], + addFilteredUser: (state, userId) => [...state, userId].sort(), + removeFilteredUser: (state, userId) => state.filter((id) => id !== userId), + }, + ], + allGroupUsersLoading: [ + false, + { + setAllGroupLoading: (_, allGroupUsersLoading) => allGroupUsersLoading, + setGroupUsers: () => false, + }, + ], + allGroupUsers: [ + [], + { + setGroupUsers: (_, allGroupUsers) => allGroupUsers, + setAllGroupLoading: () => [], + }, + ], + filterValue: [ + '', + { + setFilterValue: (_, filterValue) => filterValue, + resetGroupsFilters: () => '', + }, + ], + groupsMeta: [ + DEFAULT_META, + { + resetGroupsFilters: () => DEFAULT_META, + setNewGroup: () => DEFAULT_META, + setSearchResults: (_, { meta }) => meta, + setActivePage: (state, activePage) => ({ + ...state, + page: { + ...state.page, + current: activePage, + }, + }), + }, + ], + }, + selectors: ({ selectors }) => ({ + hasFiltersSet: [ + () => [selectors.filteredUsers, selectors.filteredSources], + (filteredUsers, filteredSources) => filteredUsers.length > 0 || filteredSources.length > 0, + ], + }), + listeners: ({ actions, values }) => ({ + initializeGroups: async () => { + try { + const response = await HttpLogic.values.http.get('/api/workplace_search/groups'); + actions.onInitializeGroups(response); + } catch (e) { + flashAPIErrors(e); + } + }, + getSearchResults: async ({ resetPagination }, breakpoint) => { + // Debounce search results when typing + await breakpoint(300); + + actions.setGroupsLoading(); + + const { + groupsMeta: { + page: { current, size }, + }, + filterValue, + filteredSources, + filteredUsers, + } = values; + + // Is the user changes the query while on a different page, we want to start back over at 1. + const page = { + current: resetPagination ? 1 : current, + size, + }; + const search = { + query: filterValue, + content_source_ids: filteredSources, + user_ids: filteredUsers, + }; + + try { + const response = await HttpLogic.values.http.post('/api/workplace_search/groups/search', { + body: JSON.stringify({ + page, + search, + }), + headers, + }); + + actions.setSearchResults(response); + } catch (e) { + flashAPIErrors(e); + } + }, + fetchGroupUsers: async ({ groupId }) => { + actions.setAllGroupLoading(true); + try { + const response = await HttpLogic.values.http.get( + `/api/workplace_search/groups/${groupId}/group_users` + ); + actions.setGroupUsers(response); + } catch (e) { + flashAPIErrors(e); + } + }, + saveNewGroup: async () => { + try { + const response = await HttpLogic.values.http.post('/api/workplace_search/groups', { + body: JSON.stringify({ group_name: values.newGroupName }), + headers, + }); + actions.getSearchResults(true); + + const SUCCESS_MESSAGE = i18n.translate( + 'xpack.enterpriseSearch.workplaceSearch.groups.newGroupSavedSuccess', + { + defaultMessage: 'Successfully created {groupName}', + values: { groupName: response.name }, + } + ); + + setSuccessMessage(SUCCESS_MESSAGE); + actions.setNewGroup(response); + } catch (e) { + flashAPIErrors(e); + } + }, + openNewGroupModal: () => { + FlashMessagesLogic.actions.clearFlashMessages(); + }, + resetGroupsFilters: () => { + FlashMessagesLogic.actions.clearFlashMessages(); + }, + toggleFilterSourcesDropdown: () => { + FlashMessagesLogic.actions.clearFlashMessages(); + }, + toggleFilterUsersDropdown: () => { + FlashMessagesLogic.actions.clearFlashMessages(); + }, + }), +}); diff --git a/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/groups/groups_router.tsx b/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/groups/groups_router.tsx new file mode 100644 index 0000000000000..caa71d0d622f3 --- /dev/null +++ b/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/groups/groups_router.tsx @@ -0,0 +1,35 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import React, { useEffect } from 'react'; + +import { useActions } from 'kea'; + +import { Route, Switch } from 'react-router-dom'; + +import { GROUP_PATH, GROUPS_PATH } from '../../routes'; + +import { GroupsLogic } from './groups_logic'; + +import { GroupRouter } from './group_router'; +import { Groups } from './groups'; + +import './groups.scss'; + +export const GroupsRouter: React.FC = () => { + const { initializeGroups } = useActions(GroupsLogic); + + useEffect(() => { + initializeGroups(); + }, []); + + return ( + + + + + ); +}; diff --git a/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/groups/index.ts b/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/groups/index.ts new file mode 100644 index 0000000000000..79b5e39d2b27d --- /dev/null +++ b/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/groups/index.ts @@ -0,0 +1,8 @@ +/* + * 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. + */ + +export { GroupsRouter } from './groups_router'; +export { GroupsLogic } from './groups_logic'; diff --git a/x-pack/plugins/enterprise_search/server/plugin.ts b/x-pack/plugins/enterprise_search/server/plugin.ts index a9bd03e8f97d4..43b0be8a5b438 100644 --- a/x-pack/plugins/enterprise_search/server/plugin.ts +++ b/x-pack/plugins/enterprise_search/server/plugin.ts @@ -45,6 +45,7 @@ import { registerCredentialsRoutes } from './routes/app_search/credentials'; import { workplaceSearchTelemetryType } from './saved_objects/workplace_search/telemetry'; import { registerTelemetryUsageCollector as registerWSTelemetryUsageCollector } from './collectors/workplace_search/telemetry'; import { registerWSOverviewRoute } from './routes/workplace_search/overview'; +import { registerWSGroupRoutes } from './routes/workplace_search/groups'; export interface PluginsSetup { usageCollection?: UsageCollectionSetup; @@ -129,6 +130,7 @@ export class EnterpriseSearchPlugin implements Plugin { registerEnginesRoute(dependencies); registerCredentialsRoutes(dependencies); registerWSOverviewRoute(dependencies); + registerWSGroupRoutes(dependencies); /** * Bootstrap the routes, saved objects, and collector for telemetry diff --git a/x-pack/plugins/enterprise_search/server/routes/workplace_search/groups.ts b/x-pack/plugins/enterprise_search/server/routes/workplace_search/groups.ts new file mode 100644 index 0000000000000..21d08e5c8756b --- /dev/null +++ b/x-pack/plugins/enterprise_search/server/routes/workplace_search/groups.ts @@ -0,0 +1,256 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { schema } from '@kbn/config-schema'; + +import { IRouteDependencies } from '../../plugin'; + +import { IMeta } from '../../../common/types'; +import { IUser, IContentSource, IGroup } from '../../../common/types/workplace_search'; + +export function registerGroupsRoute({ + router, + enterpriseSearchRequestHandler, +}: IRouteDependencies) { + router.get( + { + path: '/api/workplace_search/groups', + validate: false, + }, + enterpriseSearchRequestHandler.createRequest({ + path: '/ws/org/groups', + hasValidData: (body: { users: IUser[]; contentSources: IContentSource[] }) => + typeof Array.isArray(body?.users) && typeof Array.isArray(body?.contentSources), + }) + ); + + router.post( + { + path: '/api/workplace_search/groups', + validate: { + body: schema.object({ + group_name: schema.string(), + }), + }, + }, + async (context, request, response) => { + return enterpriseSearchRequestHandler.createRequest({ + path: '/ws/org/groups', + body: request.body, + hasValidData: (body: { created_at: string }) => typeof body?.created_at === 'string', + })(context, request, response); + } + ); +} + +export function registerSearchGroupsRoute({ + router, + enterpriseSearchRequestHandler, +}: IRouteDependencies) { + router.post( + { + path: '/api/workplace_search/groups/search', + validate: { + body: schema.object({ + page: schema.object({ + current: schema.number(), + size: schema.number(), + }), + search: schema.object({ + query: schema.string(), + content_source_ids: schema.arrayOf(schema.string()), + user_ids: schema.arrayOf(schema.string()), + }), + }), + }, + }, + async (context, request, response) => { + return enterpriseSearchRequestHandler.createRequest({ + path: '/ws/org/groups/search', + body: request.body, + hasValidData: (body: { results: IGroup[]; meta: IMeta }) => + typeof Array.isArray(body?.results) && + typeof body?.meta?.page?.total_results === 'number', + })(context, request, response); + } + ); +} + +export function registerGroupRoute({ router, enterpriseSearchRequestHandler }: IRouteDependencies) { + router.get( + { + path: '/api/workplace_search/groups/{id}', + validate: { + params: schema.object({ + id: schema.string(), + }), + }, + }, + async (context, request, response) => { + return enterpriseSearchRequestHandler.createRequest({ + path: `/ws/org/groups/${request.params.id}`, + hasValidData: (body: IGroup) => + typeof body?.createdAt === 'string' && typeof body?.usersCount === 'number', + })(context, request, response); + } + ); + + router.put( + { + path: '/api/workplace_search/groups/{id}', + validate: { + params: schema.object({ + id: schema.string(), + }), + body: schema.object({ + group: schema.object({ + name: schema.string(), + }), + }), + }, + }, + async (context, request, response) => { + return enterpriseSearchRequestHandler.createRequest({ + path: `/ws/org/groups/${request.params.id}`, + body: request.body, + hasValidData: (body: IGroup) => + typeof body?.createdAt === 'string' && typeof body?.usersCount === 'number', + })(context, request, response); + } + ); + + router.delete( + { + path: '/api/workplace_search/groups/{id}', + validate: { + params: schema.object({ + id: schema.string(), + }), + }, + }, + async (context, request, response) => { + return enterpriseSearchRequestHandler.createRequest({ + path: `/ws/org/groups/${request.params.id}`, + hasValidData: (body: { deleted: boolean }) => body?.deleted === true, + })(context, request, response); + } + ); +} + +export function registerGroupUsersRoute({ + router, + enterpriseSearchRequestHandler, +}: IRouteDependencies) { + router.get( + { + path: '/api/workplace_search/groups/{id}/group_users', + validate: { + params: schema.object({ + id: schema.string(), + }), + }, + }, + async (context, request, response) => { + return enterpriseSearchRequestHandler.createRequest({ + path: `/ws/org/groups/${request.params.id}/group_users`, + hasValidData: (body: IUser[]) => typeof Array.isArray(body), + })(context, request, response); + } + ); +} + +export function registerShareGroupRoute({ + router, + enterpriseSearchRequestHandler, +}: IRouteDependencies) { + router.post( + { + path: '/api/workplace_search/groups/{id}/share', + validate: { + params: schema.object({ + id: schema.string(), + }), + body: schema.object({ + content_source_ids: schema.arrayOf(schema.string()), + }), + }, + }, + async (context, request, response) => { + return enterpriseSearchRequestHandler.createRequest({ + path: `/ws/org/groups/${request.params.id}/share`, + body: request.body, + hasValidData: (body: IGroup) => + typeof body?.createdAt === 'string' && typeof body?.usersCount === 'number', + })(context, request, response); + } + ); +} + +export function registerAssignGroupRoute({ + router, + enterpriseSearchRequestHandler, +}: IRouteDependencies) { + router.post( + { + path: '/api/workplace_search/groups/{id}/assign', + validate: { + params: schema.object({ + id: schema.string(), + }), + body: schema.object({ + user_ids: schema.arrayOf(schema.string()), + }), + }, + }, + async (context, request, response) => { + return enterpriseSearchRequestHandler.createRequest({ + path: `/ws/org/groups/${request.params.id}/assign`, + body: request.body, + hasValidData: (body: IGroup) => + typeof body?.createdAt === 'string' && typeof body?.usersCount === 'number', + })(context, request, response); + } + ); +} + +export function registerBoostsGroupRoute({ + router, + enterpriseSearchRequestHandler, +}: IRouteDependencies) { + router.put( + { + path: '/api/workplace_search/groups/{id}/boosts', + validate: { + params: schema.object({ + id: schema.string(), + }), + body: schema.object({ + content_source_boosts: schema.arrayOf( + schema.arrayOf(schema.oneOf([schema.string(), schema.number()])) + ), + }), + }, + }, + async (context, request, response) => { + return enterpriseSearchRequestHandler.createRequest({ + path: `/ws/org/groups/${request.params.id}/update_source_boosts`, + body: request.body, + hasValidData: (body: IGroup) => + typeof body?.createdAt === 'string' && typeof body?.usersCount === 'number', + })(context, request, response); + } + ); +} + +export function registerWSGroupRoutes(dependencies: IRouteDependencies) { + registerGroupsRoute(dependencies); + registerSearchGroupsRoute(dependencies); + registerGroupRoute(dependencies); + registerGroupUsersRoute(dependencies); + registerShareGroupRoute(dependencies); + registerAssignGroupRoute(dependencies); + registerBoostsGroupRoute(dependencies); +} From 3bad1fc328425e48ff0cd4f6f65f9cc07c84adf9 Mon Sep 17 00:00:00 2001 From: Chandler Prall Date: Mon, 5 Oct 2020 12:44:29 -0600 Subject: [PATCH 40/49] Upgraded EUI to v29.3.0 (#78870) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Upgraded EUI to v29.2.0 * Remove hacks on top of EuiHeaderLink(s) * Actual update to eui@29.2.0 * Resolve typescript issue when omitting a key over a union * Resolve nav menu test's expectations * Fix lint issue * Update to 29.3.0 * Revert vega snapshot update I don’t think this was intended to change when I ran the updater * [ui-shared-deps] strip proptypes from ui-shared-deps production build Co-authored-by: cchaos Co-authored-by: spalger --- package.json | 2 +- packages/kbn-ui-framework/package.json | 2 +- packages/kbn-ui-shared-deps/package.json | 3 +- packages/kbn-ui-shared-deps/webpack.config.js | 19 ++ .../public/top_nav_menu/_index.scss | 5 - .../public/top_nav_menu/top_nav_menu.test.tsx | 4 - .../public/top_nav_menu/top_nav_menu.tsx | 2 +- .../public/top_nav_menu/top_nav_menu_item.tsx | 2 +- src/plugins/share/public/types.ts | 6 +- .../plugins/kbn_tp_run_pipeline/package.json | 2 +- .../kbn_sample_panel_action/package.json | 2 +- .../kbn_tp_custom_visualizations/package.json | 2 +- x-pack/package.json | 2 +- .../color_picker_popover.stories.storyshot | 4 - .../shape_picker_popover.stories.storyshot | 3 - .../text_style_picker.stories.storyshot | 2 - .../__snapshots__/edit_menu.stories.storyshot | 6 - .../element_menu.stories.storyshot | 1 - .../share_menu.stories.storyshot | 1 - .../__snapshots__/view_menu.stories.storyshot | 4 - .../extended_template.stories.storyshot | 3 - .../__snapshots__/index.test.tsx.snap | 13 +- .../note_card_body.test.tsx.snap | 13 +- .../tests/csm/__snapshots__/page_views.snap | 280 ------------------ yarn.lock | 8 +- 25 files changed, 57 insertions(+), 334 deletions(-) delete mode 100644 x-pack/test/apm_api_integration/trial/tests/csm/__snapshots__/page_views.snap diff --git a/package.json b/package.json index b2252e2bd264b..0041736aaf5b2 100644 --- a/package.json +++ b/package.json @@ -117,7 +117,7 @@ "dependencies": { "@elastic/datemath": "5.0.3", "@elastic/elasticsearch": "7.9.1", - "@elastic/eui": "29.0.0", + "@elastic/eui": "29.3.0", "@elastic/good": "8.1.1-kibana2", "@elastic/numeral": "^2.5.0", "@elastic/request-crypto": "1.1.4", diff --git a/packages/kbn-ui-framework/package.json b/packages/kbn-ui-framework/package.json index 639d4e17d0e71..21d25311420ca 100644 --- a/packages/kbn-ui-framework/package.json +++ b/packages/kbn-ui-framework/package.json @@ -31,7 +31,7 @@ }, "devDependencies": { "@babel/core": "^7.11.6", - "@elastic/eui": "29.0.0", + "@elastic/eui": "29.3.0", "@kbn/babel-preset": "1.0.0", "@kbn/optimizer": "1.0.0", "babel-loader": "^8.0.6", diff --git a/packages/kbn-ui-shared-deps/package.json b/packages/kbn-ui-shared-deps/package.json index d2a590d29947b..719a60363a4dc 100644 --- a/packages/kbn-ui-shared-deps/package.json +++ b/packages/kbn-ui-shared-deps/package.json @@ -10,7 +10,7 @@ }, "dependencies": { "@elastic/charts": "23.0.0", - "@elastic/eui": "29.0.0", + "@elastic/eui": "29.3.0", "@elastic/numeral": "^2.5.0", "@kbn/i18n": "1.0.0", "@kbn/monaco": "1.0.0", @@ -39,6 +39,7 @@ "devDependencies": { "@kbn/babel-preset": "1.0.0", "@kbn/dev-utils": "1.0.0", + "babel-plugin-transform-react-remove-prop-types": "^0.4.24", "css-loader": "^3.4.2", "del": "^5.1.0", "loader-utils": "^1.2.3", diff --git a/packages/kbn-ui-shared-deps/webpack.config.js b/packages/kbn-ui-shared-deps/webpack.config.js index b7d4e929ac93f..986ddba209270 100644 --- a/packages/kbn-ui-shared-deps/webpack.config.js +++ b/packages/kbn-ui-shared-deps/webpack.config.js @@ -77,6 +77,25 @@ exports.getWebpackConfig = ({ dev = false } = {}) => ({ }, ], }, + { + test: !dev ? /[\\\/]@elastic[\\\/]eui[\\\/].*\.js$/ : () => false, + use: [ + { + loader: 'babel-loader', + options: { + plugins: [ + [ + require.resolve('babel-plugin-transform-react-remove-prop-types'), + { + mode: 'remove', + removeImport: true, + }, + ], + ], + }, + }, + ], + }, ], }, diff --git a/src/plugins/navigation/public/top_nav_menu/_index.scss b/src/plugins/navigation/public/top_nav_menu/_index.scss index 976ddd789ad22..230be399febda 100644 --- a/src/plugins/navigation/public/top_nav_menu/_index.scss +++ b/src/plugins/navigation/public/top_nav_menu/_index.scss @@ -1,8 +1,3 @@ .kbnTopNavMenu { margin-right: $euiSizeXS; } - -.kbnTopNavMenu > * > * { - // TEMP fix to adjust spacing between EuiHeaderList__list items - margin: 0 $euiSizeXS; -} diff --git a/src/plugins/navigation/public/top_nav_menu/top_nav_menu.test.tsx b/src/plugins/navigation/public/top_nav_menu/top_nav_menu.test.tsx index 212bc19208ca8..147feee3cd472 100644 --- a/src/plugins/navigation/public/top_nav_menu/top_nav_menu.test.tsx +++ b/src/plugins/navigation/public/top_nav_menu/top_nav_menu.test.tsx @@ -164,10 +164,6 @@ describe('TopNavMenu', () => { // menu is rendered outside of the component expect(component.find(TOP_NAV_ITEM_SELECTOR).length).toBe(0); - - const buttons = portalTarget.querySelectorAll('button'); - expect(buttons.length).toBe(menuItems.length + 1); // should be n+1 buttons in mobile for popover button - expect(buttons[buttons.length - 1].getAttribute('aria-label')).toBe('Open navigation menu'); // last button should be mobile button }); }); }); diff --git a/src/plugins/navigation/public/top_nav_menu/top_nav_menu.tsx b/src/plugins/navigation/public/top_nav_menu/top_nav_menu.tsx index a27addeb14393..1739b7d915adb 100644 --- a/src/plugins/navigation/public/top_nav_menu/top_nav_menu.tsx +++ b/src/plugins/navigation/public/top_nav_menu/top_nav_menu.tsx @@ -88,7 +88,7 @@ export function TopNavMenu(props: TopNavMenuProps): ReactElement | null { function renderMenu(className: string): ReactElement | null { if (!config || config.length === 0) return null; return ( - + {renderItems()} ); diff --git a/src/plugins/navigation/public/top_nav_menu/top_nav_menu_item.tsx b/src/plugins/navigation/public/top_nav_menu/top_nav_menu_item.tsx index e503ebb839f48..5c463902f77f5 100644 --- a/src/plugins/navigation/public/top_nav_menu/top_nav_menu_item.tsx +++ b/src/plugins/navigation/public/top_nav_menu/top_nav_menu_item.tsx @@ -52,7 +52,7 @@ export function TopNavMenuItem(props: TopNavMenuData) { {upperFirst(props.label || props.id!)} ) : ( - + {upperFirst(props.label || props.id!)} ); diff --git a/src/plugins/share/public/types.ts b/src/plugins/share/public/types.ts index 9dcfc3d9e8143..19f33a820a11a 100644 --- a/src/plugins/share/public/types.ts +++ b/src/plugins/share/public/types.ts @@ -18,7 +18,8 @@ */ import { ComponentType } from 'react'; -import { EuiContextMenuPanelDescriptor, EuiContextMenuPanelItemDescriptor } from '@elastic/eui'; +import { EuiContextMenuPanelDescriptor } from '@elastic/eui'; +import { EuiContextMenuPanelItemDescriptorEntry } from '@elastic/eui/src/components/context_menu/context_menu'; /** * @public @@ -53,7 +54,8 @@ export interface ShareContext { * used to order the individual items in a flat list returned by all registered * menu providers. * */ -export interface ShareContextMenuPanelItem extends Omit { +export interface ShareContextMenuPanelItem + extends Omit { name: string; // EUI will accept a `ReactNode` for the `name` prop, but `ShareContentMenu` assumes a `string`. sortOrder?: number; } diff --git a/test/interpreter_functional/plugins/kbn_tp_run_pipeline/package.json b/test/interpreter_functional/plugins/kbn_tp_run_pipeline/package.json index 87a1bc20920a4..0d6d0286c5a8f 100644 --- a/test/interpreter_functional/plugins/kbn_tp_run_pipeline/package.json +++ b/test/interpreter_functional/plugins/kbn_tp_run_pipeline/package.json @@ -12,7 +12,7 @@ "build": "rm -rf './target' && tsc" }, "devDependencies": { - "@elastic/eui": "29.0.0", + "@elastic/eui": "29.3.0", "@kbn/plugin-helpers": "1.0.0", "react": "^16.12.0", "react-dom": "^16.12.0", diff --git a/test/plugin_functional/plugins/kbn_sample_panel_action/package.json b/test/plugin_functional/plugins/kbn_sample_panel_action/package.json index 8bbf6274bd15f..8efd2ee432415 100644 --- a/test/plugin_functional/plugins/kbn_sample_panel_action/package.json +++ b/test/plugin_functional/plugins/kbn_sample_panel_action/package.json @@ -12,7 +12,7 @@ "build": "rm -rf './target' && tsc" }, "devDependencies": { - "@elastic/eui": "29.0.0", + "@elastic/eui": "29.3.0", "react": "^16.12.0", "typescript": "4.0.2" } diff --git a/test/plugin_functional/plugins/kbn_tp_custom_visualizations/package.json b/test/plugin_functional/plugins/kbn_tp_custom_visualizations/package.json index c0d9a03d02c32..4405063e54c06 100644 --- a/test/plugin_functional/plugins/kbn_tp_custom_visualizations/package.json +++ b/test/plugin_functional/plugins/kbn_tp_custom_visualizations/package.json @@ -12,7 +12,7 @@ "build": "rm -rf './target' && tsc" }, "devDependencies": { - "@elastic/eui": "29.0.0", + "@elastic/eui": "29.3.0", "@kbn/plugin-helpers": "1.0.0", "react": "^16.12.0", "typescript": "4.0.2" diff --git a/x-pack/package.json b/x-pack/package.json index ffe1a08855888..0222d198d4f91 100644 --- a/x-pack/package.json +++ b/x-pack/package.json @@ -275,7 +275,7 @@ "@babel/runtime": "^7.11.2", "@elastic/datemath": "5.0.3", "@elastic/ems-client": "7.10.0", - "@elastic/eui": "29.0.0", + "@elastic/eui": "29.3.0", "@elastic/filesaver": "1.1.2", "@elastic/node-crypto": "1.2.1", "@elastic/numeral": "^2.5.0", diff --git a/x-pack/plugins/canvas/public/components/color_picker_popover/__stories__/__snapshots__/color_picker_popover.stories.storyshot b/x-pack/plugins/canvas/public/components/color_picker_popover/__stories__/__snapshots__/color_picker_popover.stories.storyshot index 178cba0c99e4a..6cab47734039b 100644 --- a/x-pack/plugins/canvas/public/components/color_picker_popover/__stories__/__snapshots__/color_picker_popover.stories.storyshot +++ b/x-pack/plugins/canvas/public/components/color_picker_popover/__stories__/__snapshots__/color_picker_popover.stories.storyshot @@ -4,7 +4,6 @@ exports[`Storyshots components/Color/ColorPickerPopover interactive 1`] = `
Date: Mon, 5 Oct 2020 20:46:51 +0200 Subject: [PATCH 41/49] [APM] Persist time range across apps (#79090) --- .../public/application/application.test.tsx | 7 ++ .../app/Home/__snapshots__/Home.test.tsx.snap | 20 ++++ .../shared/DatePicker/date_picker.test.tsx | 100 ++++++++++++++---- .../components/shared/DatePicker/index.tsx | 65 ++++++------ .../ApmPluginContext/MockApmPluginContext.tsx | 5 + 5 files changed, 145 insertions(+), 52 deletions(-) diff --git a/x-pack/plugins/apm/public/application/application.test.tsx b/x-pack/plugins/apm/public/application/application.test.tsx index 0566ff19017f4..3948b698fb482 100644 --- a/x-pack/plugins/apm/public/application/application.test.tsx +++ b/x-pack/plugins/apm/public/application/application.test.tsx @@ -42,6 +42,13 @@ describe('renderApp', () => { licensing: { license$: new Observable() }, triggers_actions_ui: { actionTypeRegistry: {}, alertTypeRegistry: {} }, usageCollection: { reportUiStats: () => {} }, + data: { + query: { + timefilter: { + timefilter: { setTime: () => {}, getTime: () => ({}) }, + }, + }, + }, }; const params = { element: document.createElement('div'), diff --git a/x-pack/plugins/apm/public/components/app/Home/__snapshots__/Home.test.tsx.snap b/x-pack/plugins/apm/public/components/app/Home/__snapshots__/Home.test.tsx.snap index 00be0b37a0e82..0a22604837b97 100644 --- a/x-pack/plugins/apm/public/components/app/Home/__snapshots__/Home.test.tsx.snap +++ b/x-pack/plugins/apm/public/components/app/Home/__snapshots__/Home.test.tsx.snap @@ -53,6 +53,16 @@ exports[`Home component should render services 1`] = ` }, }, "plugins": Object { + "data": Object { + "query": Object { + "timefilter": Object { + "timefilter": Object { + "getTime": [Function], + "setTime": [Function], + }, + }, + }, + }, "ml": Object { "urlGenerator": MlUrlGenerator { "createUrl": [Function], @@ -126,6 +136,16 @@ exports[`Home component should render traces 1`] = ` }, }, "plugins": Object { + "data": Object { + "query": Object { + "timefilter": Object { + "timefilter": Object { + "getTime": [Function], + "setTime": [Function], + }, + }, + }, + }, "ml": Object { "urlGenerator": MlUrlGenerator { "createUrl": [Function], diff --git a/x-pack/plugins/apm/public/components/shared/DatePicker/date_picker.test.tsx b/x-pack/plugins/apm/public/components/shared/DatePicker/date_picker.test.tsx index efa827a0e5df8..520cc2f423ddd 100644 --- a/x-pack/plugins/apm/public/components/shared/DatePicker/date_picker.test.tsx +++ b/x-pack/plugins/apm/public/components/shared/DatePicker/date_picker.test.tsx @@ -19,43 +19,64 @@ import { IUrlParams } from '../../../context/UrlParamsContext/types'; import { DatePicker } from './'; const history = createMemoryHistory(); -const mockHistoryPush = jest.spyOn(history, 'push'); -const mockHistoryReplace = jest.spyOn(history, 'replace'); + const mockRefreshTimeRange = jest.fn(); function MockUrlParamsProvider({ - params = {}, + urlParams = {}, children, }: { children: ReactNode; - params?: IUrlParams; + urlParams?: IUrlParams; }) { return ( ); } -function mountDatePicker(params?: IUrlParams) { - return mount( - +function mountDatePicker(urlParams?: IUrlParams) { + const setTimeSpy = jest.fn(); + const getTimeSpy = jest.fn().mockReturnValue({}); + const wrapper = mount( + - + ); + + return { wrapper, setTimeSpy, getTimeSpy }; } describe('DatePicker', () => { + let mockHistoryPush: jest.SpyInstance; + let mockHistoryReplace: jest.SpyInstance; beforeAll(() => { jest.spyOn(console, 'error').mockImplementation(() => null); + mockHistoryPush = jest.spyOn(history, 'push'); + mockHistoryReplace = jest.spyOn(history, 'replace'); }); afterAll(() => { @@ -76,16 +97,11 @@ describe('DatePicker', () => { ); }); - it('adds missing default value', () => { - mountDatePicker({ - rangeTo: 'now', - refreshInterval: 5000, - }); + it('adds missing `rangeFrom` to url', () => { + mountDatePicker({ rangeTo: 'now', refreshInterval: 5000 }); expect(mockHistoryReplace).toHaveBeenCalledTimes(1); expect(mockHistoryReplace).toHaveBeenCalledWith( - expect.objectContaining({ - search: 'rangeFrom=now-15m&rangeTo=now&refreshInterval=5000', - }) + expect.objectContaining({ search: 'rangeFrom=now-15m&rangeTo=now' }) ); }); @@ -100,9 +116,9 @@ describe('DatePicker', () => { }); it('updates the URL when the date range changes', () => { - const datePicker = mountDatePicker(); + const { wrapper } = mountDatePicker(); expect(mockHistoryReplace).toHaveBeenCalledTimes(1); - datePicker.find(EuiSuperDatePicker).props().onTimeChange({ + wrapper.find(EuiSuperDatePicker).props().onTimeChange({ start: 'updated-start', end: 'updated-end', isInvalid: false, @@ -118,7 +134,7 @@ describe('DatePicker', () => { it('enables auto-refresh when refreshPaused is false', async () => { jest.useFakeTimers(); - const wrapper = mountDatePicker({ + const { wrapper } = mountDatePicker({ refreshPaused: false, refreshInterval: 1000, }); @@ -137,4 +153,46 @@ describe('DatePicker', () => { await waitFor(() => {}); expect(mockRefreshTimeRange).not.toHaveBeenCalled(); }); + + describe('if both `rangeTo` and `rangeFrom` is set', () => { + it('calls setTime ', async () => { + const { setTimeSpy } = mountDatePicker({ + rangeTo: 'now-20m', + rangeFrom: 'now-22m', + }); + expect(setTimeSpy).toHaveBeenCalledWith({ + to: 'now-20m', + from: 'now-22m', + }); + }); + + it('does not update the url', () => { + expect(mockHistoryReplace).toHaveBeenCalledTimes(0); + }); + }); + + describe('if `rangeFrom` is missing from the urlParams', () => { + let setTimeSpy: jest.Mock; + beforeEach(() => { + const res = mountDatePicker({ rangeTo: 'now-5m' }); + setTimeSpy = res.setTimeSpy; + }); + + it('does not call setTime', async () => { + expect(setTimeSpy).toHaveBeenCalledTimes(0); + }); + + it('updates the url with the default `rangeFrom` ', async () => { + expect(mockHistoryReplace).toHaveBeenCalledTimes(1); + expect(mockHistoryReplace.mock.calls[0][0].search).toContain( + 'rangeFrom=now-15m' + ); + }); + + it('preserves `rangeTo`', () => { + expect(mockHistoryReplace.mock.calls[0][0].search).toContain( + 'rangeTo=now-5m' + ); + }); + }); }); diff --git a/x-pack/plugins/apm/public/components/shared/DatePicker/index.tsx b/x-pack/plugins/apm/public/components/shared/DatePicker/index.tsx index b4d716f89169e..f35cc06748911 100644 --- a/x-pack/plugins/apm/public/components/shared/DatePicker/index.tsx +++ b/x-pack/plugins/apm/public/components/shared/DatePicker/index.tsx @@ -5,8 +5,7 @@ */ import { EuiSuperDatePicker } from '@elastic/eui'; -import { isEmpty, isEqual, pickBy } from 'lodash'; -import React from 'react'; +import React, { useEffect } from 'react'; import { useHistory, useLocation } from 'react-router-dom'; import { UI_SETTINGS } from '../../../../../../../src/plugins/data/common'; import { useApmPluginContext } from '../../../hooks/useApmPluginContext'; @@ -15,14 +14,10 @@ import { clearCache } from '../../../services/rest/callApi'; import { fromQuery, toQuery } from '../Links/url_helpers'; import { TimePickerQuickRange, TimePickerTimeDefaults } from './typings'; -function removeUndefinedAndEmptyProps(obj: T): Partial { - return pickBy(obj, (value) => value !== undefined && !isEmpty(String(value))); -} - export function DatePicker() { const history = useHistory(); const location = useLocation(); - const { core } = useApmPluginContext(); + const { core, plugins } = useApmPluginContext(); const timePickerQuickRanges = core.uiSettings.get( UI_SETTINGS.TIMEPICKER_QUICK_RANGES @@ -32,11 +27,6 @@ export function DatePicker() { UI_SETTINGS.TIMEPICKER_TIME_DEFAULTS ); - const DEFAULT_VALUES = { - rangeFrom: timePickerTimeDefaults.from, - rangeTo: timePickerTimeDefaults.to, - }; - const commonlyUsedRanges = timePickerQuickRanges.map( ({ from, to, display }) => ({ start: from, @@ -76,35 +66,48 @@ export function DatePicker() { updateUrl({ rangeFrom: start, rangeTo: end }); } - const { rangeFrom, rangeTo, refreshPaused, refreshInterval } = urlParams; - const timePickerURLParams = removeUndefinedAndEmptyProps({ - rangeFrom, - rangeTo, - refreshPaused, - refreshInterval, - }); + useEffect(() => { + // set time if both to and from are given in the url + if (urlParams.rangeFrom && urlParams.rangeTo) { + plugins.data.query.timefilter.timefilter.setTime({ + from: urlParams.rangeFrom, + to: urlParams.rangeTo, + }); + return; + } + + // read time from state and update the url + const timePickerSharedState = plugins.data.query.timefilter.timefilter.getTime(); - const nextParams = { - ...DEFAULT_VALUES, - ...timePickerURLParams, - }; - if (!isEqual(nextParams, timePickerURLParams)) { - // When the default parameters are not availbale in the url, replace it adding the necessary parameters. history.replace({ ...location, search: fromQuery({ ...toQuery(location.search), - ...nextParams, + rangeFrom: + urlParams.rangeFrom ?? + timePickerSharedState.from ?? + timePickerTimeDefaults.from, + rangeTo: + urlParams.rangeTo ?? + timePickerSharedState.to ?? + timePickerTimeDefaults.to, }), }); - } + }, [ + urlParams.rangeFrom, + urlParams.rangeTo, + plugins, + history, + location, + timePickerTimeDefaults, + ]); return ( { clearCache(); diff --git a/x-pack/plugins/apm/public/context/ApmPluginContext/MockApmPluginContext.tsx b/x-pack/plugins/apm/public/context/ApmPluginContext/MockApmPluginContext.tsx index 65f6dca179e71..3b915045f54b6 100644 --- a/x-pack/plugins/apm/public/context/ApmPluginContext/MockApmPluginContext.tsx +++ b/x-pack/plugins/apm/public/context/ApmPluginContext/MockApmPluginContext.tsx @@ -87,6 +87,11 @@ const mockPlugin = { useHash: false, }), }, + data: { + query: { + timefilter: { timefilter: { setTime: () => {}, getTime: () => ({}) } }, + }, + }, }; export const mockApmPluginContextValue = { config: mockConfig, From a08fe39710fe698ab295f60db4b8ed48db5ceafc Mon Sep 17 00:00:00 2001 From: Spencer Date: Mon, 5 Oct 2020 11:47:06 -0700 Subject: [PATCH 42/49] [build] only strip public code, leave other assets (#79504) Co-authored-by: spalger --- src/dev/build/tasks/copy_source_task.ts | 2 +- x-pack/tasks/build.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/dev/build/tasks/copy_source_task.ts b/src/dev/build/tasks/copy_source_task.ts index a5039717760ae..da282f1940662 100644 --- a/src/dev/build/tasks/copy_source_task.ts +++ b/src/dev/build/tasks/copy_source_task.ts @@ -40,7 +40,7 @@ export const CopySource: Task = { '!src/dev/**', '!src/setup_node_env/babel_register/index.js', '!src/setup_node_env/babel_register/register.js', - '!**/public/**', + '!**/public/**/*.{js,ts,tsx,json}', 'typings/**', 'config/kibana.yml', 'config/node.options', diff --git a/x-pack/tasks/build.ts b/x-pack/tasks/build.ts index a3b08a16f4b08..aaeea9d14e385 100644 --- a/x-pack/tasks/build.ts +++ b/x-pack/tasks/build.ts @@ -73,7 +73,7 @@ async function copySourceAndBabelify() { '**/*.{test,test.mocks,mock,mocks}.*', '**/*.d.ts', '**/node_modules/**', - '**/public/**', + '**/public/**/*.{js,ts,tsx,json}', '**/{__tests__,__mocks__,__snapshots__}/**', 'plugins/canvas/shareable_runtime/test/**', ], From d5b8a956947f587a14a21eaf83821611160129c4 Mon Sep 17 00:00:00 2001 From: Constance Date: Mon, 5 Oct 2020 11:51:21 -0700 Subject: [PATCH 43/49] Temporarily remove Layout from App Search plugin for 7.10 release (#79506) - Since our other top level pages (settings, credentials, role mappings) aren't yet ready, we'll stick to the same UI for 7.9, only showing the Engines Overview to users --- .../applications/app_search/index.test.tsx | 14 +------ .../public/applications/app_search/index.tsx | 41 ++++++++++--------- 2 files changed, 24 insertions(+), 31 deletions(-) diff --git a/x-pack/plugins/enterprise_search/public/applications/app_search/index.test.tsx b/x-pack/plugins/enterprise_search/public/applications/app_search/index.test.tsx index ab5b3c9faeea7..3c7979ed3d4b2 100644 --- a/x-pack/plugins/enterprise_search/public/applications/app_search/index.test.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/app_search/index.test.tsx @@ -13,7 +13,7 @@ import React from 'react'; import { Redirect } from 'react-router-dom'; import { shallow } from 'enzyme'; -import { Layout, SideNav, SideNavLink } from '../shared/layout'; +import { SideNav, SideNavLink } from '../shared/layout'; import { SetupGuide } from './components/setup_guide'; import { ErrorConnecting } from './components/error_connecting'; import { EngineOverview } from './components/engine_overview'; @@ -51,11 +51,9 @@ describe('AppSearchConfigured', () => { setMockActions({ initializeAppData: () => {} }); }); - it('renders with layout', () => { + it('renders', () => { const wrapper = shallow(); - expect(wrapper.find(Layout)).toHaveLength(1); - expect(wrapper.find(Layout).prop('readOnlyMode')).toBeFalsy(); expect(wrapper.find(EngineOverview)).toHaveLength(1); }); @@ -86,14 +84,6 @@ describe('AppSearchConfigured', () => { expect(wrapper.find(ErrorConnecting)).toHaveLength(1); }); - it('passes readOnlyMode state', () => { - setMockValues({ myRole: {}, readOnlyMode: true }); - - const wrapper = shallow(); - - expect(wrapper.find(Layout).prop('readOnlyMode')).toEqual(true); - }); - describe('ability checks', () => { // TODO: Use this section for routes wrapped in canViewX conditionals // e.g., it('renders settings if a user can view settings') diff --git a/x-pack/plugins/enterprise_search/public/applications/app_search/index.tsx b/x-pack/plugins/enterprise_search/public/applications/app_search/index.tsx index 9aa2cce9c74df..49e0a8a484de1 100644 --- a/x-pack/plugins/enterprise_search/public/applications/app_search/index.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/app_search/index.tsx @@ -8,6 +8,7 @@ import React, { useEffect } from 'react'; import { Route, Redirect, Switch } from 'react-router-dom'; import { useActions, useValues } from 'kea'; +import { EuiPage, EuiPageBody } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; import { getAppSearchUrl } from '../shared/enterprise_search_url'; @@ -17,7 +18,7 @@ import { AppLogic } from './app_logic'; import { IInitialAppData } from '../../../common/types'; import { APP_SEARCH_PLUGIN } from '../../../common/constants'; -import { Layout, SideNav, SideNavLink } from '../shared/layout'; +import { SideNav, SideNavLink } from '../shared/layout'; import { ROOT_PATH, @@ -52,7 +53,7 @@ export const AppSearchUnconfigured: React.FC = () => ( export const AppSearchConfigured: React.FC = (props) => { const { initializeAppData } = useActions(AppLogic); const { hasInitialized } = useValues(AppLogic); - const { errorConnecting, readOnlyMode } = useValues(HttpLogic); + const { errorConnecting } = useValues(HttpLogic); useEffect(() => { if (!hasInitialized) initializeAppData(props); @@ -64,23 +65,25 @@ export const AppSearchConfigured: React.FC = (props) => { - } readOnlyMode={readOnlyMode}> - {errorConnecting ? ( - - ) : ( - - - - - - - - - - - - )} - + + + {errorConnecting ? ( + + ) : ( + + + + + + + + + + + + )} + + ); From 8120e7e7bc7f66872cb7ca22bb131d47139095f1 Mon Sep 17 00:00:00 2001 From: Shahzad Date: Mon, 5 Oct 2020 21:03:28 +0200 Subject: [PATCH 44/49] [Uptime]Make uptime ping histogram bar clickable to improve filtering (#79054) --- .../common/runtime_types/monitor/state.ts | 1 + .../common/runtime_types/ping/histogram.ts | 2 +- .../monitor_bar_series.test.tsx.snap | 1 + .../ping_histogram.test.tsx.snap | 2 +- .../__tests__/monitor_bar_series.test.tsx | 7 +++++-- .../charts/__tests__/ping_histogram.test.tsx | 2 +- .../common/charts/__tests__/utils.test.ts | 19 ++++++++++++++++++ .../common/charts/monitor_bar_series.tsx | 18 +++++++++++++++-- .../common/charts/ping_histogram.tsx | 13 +++++++++++- .../public/components/common/charts/utils.ts | 20 +++++++++++++++++++ .../overview/monitor_list/monitor_list.tsx | 4 ++-- .../get_ping_histogram.test.ts.snap | 8 ++++---- .../__tests__/get_ping_histogram.test.ts | 4 ++-- .../server/lib/requests/get_monitor_states.ts | 17 +++++++++++----- .../server/lib/requests/get_ping_histogram.ts | 8 ++++---- .../rest/fixtures/monitor_latest_status.json | 2 +- .../uptime/rest/fixtures/ping_histogram.json | 3 ++- .../fixtures/ping_histogram_by_filter.json | 3 ++- .../rest/fixtures/ping_histogram_by_id.json | 3 ++- 19 files changed, 108 insertions(+), 29 deletions(-) create mode 100644 x-pack/plugins/uptime/public/components/common/charts/__tests__/utils.test.ts create mode 100644 x-pack/plugins/uptime/public/components/common/charts/utils.ts diff --git a/x-pack/plugins/uptime/common/runtime_types/monitor/state.ts b/x-pack/plugins/uptime/common/runtime_types/monitor/state.ts index 67b13d70fa3ee..d32c47bb5d3f9 100644 --- a/x-pack/plugins/uptime/common/runtime_types/monitor/state.ts +++ b/x-pack/plugins/uptime/common/runtime_types/monitor/state.ts @@ -66,6 +66,7 @@ export const MonitorSummaryType = t.intersection([ }), t.partial({ histogram: HistogramType, + minInterval: t.number, }), ]); diff --git a/x-pack/plugins/uptime/common/runtime_types/ping/histogram.ts b/x-pack/plugins/uptime/common/runtime_types/ping/histogram.ts index 47e4dd52299b1..f19b147a371a3 100644 --- a/x-pack/plugins/uptime/common/runtime_types/ping/histogram.ts +++ b/x-pack/plugins/uptime/common/runtime_types/ping/histogram.ts @@ -26,7 +26,7 @@ export interface GetPingHistogramParams { export interface HistogramResult { histogram: HistogramDataPoint[]; - interval: string; + minInterval: number; } export interface HistogramQueryResult { diff --git a/x-pack/plugins/uptime/public/components/common/charts/__tests__/__snapshots__/monitor_bar_series.test.tsx.snap b/x-pack/plugins/uptime/public/components/common/charts/__tests__/__snapshots__/monitor_bar_series.test.tsx.snap index 7316cfa368c6e..d4025d62c3678 100644 --- a/x-pack/plugins/uptime/public/components/common/charts/__tests__/__snapshots__/monitor_bar_series.test.tsx.snap +++ b/x-pack/plugins/uptime/public/components/common/charts/__tests__/__snapshots__/monitor_bar_series.test.tsx.snap @@ -131,6 +131,7 @@ exports[`MonitorBarSeries component shallow renders a series when there are down }, ] } + minInterval={10} /> diff --git a/x-pack/plugins/uptime/public/components/common/charts/__tests__/__snapshots__/ping_histogram.test.tsx.snap b/x-pack/plugins/uptime/public/components/common/charts/__tests__/__snapshots__/ping_histogram.test.tsx.snap index 7fdb2e4ede75b..40abce98f5f33 100644 --- a/x-pack/plugins/uptime/public/components/common/charts/__tests__/__snapshots__/ping_histogram.test.tsx.snap +++ b/x-pack/plugins/uptime/public/components/common/charts/__tests__/__snapshots__/ping_histogram.test.tsx.snap @@ -273,7 +273,7 @@ exports[`PingHistogram component shallow renders the component without errors 1` "y": 1, }, ], - "interval": "1s", + "minInterval": 60, } } /> diff --git a/x-pack/plugins/uptime/public/components/common/charts/__tests__/monitor_bar_series.test.tsx b/x-pack/plugins/uptime/public/components/common/charts/__tests__/monitor_bar_series.test.tsx index 5e49d303c5c66..0090a8c5f170b 100644 --- a/x-pack/plugins/uptime/public/components/common/charts/__tests__/monitor_bar_series.test.tsx +++ b/x-pack/plugins/uptime/public/components/common/charts/__tests__/monitor_bar_series.test.tsx @@ -31,6 +31,7 @@ describe('MonitorBarSeries component', () => { up: 0, }, ], + minInterval: 10, }; histogramSeries = [ { timestamp: 1580387868000, up: 0, down: 5 }, @@ -192,14 +193,16 @@ describe('MonitorBarSeries component', () => { }); it('shallow renders nothing if the data series is null', () => { - const component = shallowWithRouter(); + const component = shallowWithRouter( + + ); expect(component).toEqual({}); }); it('renders if the data series is present', () => { const component = renderWithRouter( - + ); expect(component).toMatchSnapshot(); diff --git a/x-pack/plugins/uptime/public/components/common/charts/__tests__/ping_histogram.test.tsx b/x-pack/plugins/uptime/public/components/common/charts/__tests__/ping_histogram.test.tsx index 73c6ee43ccd07..fe14afbcdcfe4 100644 --- a/x-pack/plugins/uptime/public/components/common/charts/__tests__/ping_histogram.test.tsx +++ b/x-pack/plugins/uptime/public/components/common/charts/__tests__/ping_histogram.test.tsx @@ -44,7 +44,7 @@ describe('PingHistogram component', () => { { x: 1581068989000, downCount: 3, upCount: 36, y: 1 }, { x: 1581069019000, downCount: 1, upCount: 11, y: 1 }, ], - interval: '1s', + minInterval: 60, }, }; diff --git a/x-pack/plugins/uptime/public/components/common/charts/__tests__/utils.test.ts b/x-pack/plugins/uptime/public/components/common/charts/__tests__/utils.test.ts new file mode 100644 index 0000000000000..45bb0538e900c --- /dev/null +++ b/x-pack/plugins/uptime/public/components/common/charts/__tests__/utils.test.ts @@ -0,0 +1,19 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { getDateRangeFromChartElement } from '../utils'; +import { XYChartElementEvent } from '@elastic/charts'; + +describe('Chart utils', () => { + it('get date range from chart element should add 100 miliseconds', () => { + const elementData = [{ x: 1548697920000, y: 4 }]; + const dr = getDateRangeFromChartElement(elementData as XYChartElementEvent, 1000); + expect(dr).toStrictEqual({ + dateRangeStart: '2019-01-28T17:52:00.000Z', + dateRangeEnd: '2019-01-28T17:52:01.000Z', + }); + }); +}); diff --git a/x-pack/plugins/uptime/public/components/common/charts/monitor_bar_series.tsx b/x-pack/plugins/uptime/public/components/common/charts/monitor_bar_series.tsx index 0f01ef0e79931..fda76594e8826 100644 --- a/x-pack/plugins/uptime/public/components/common/charts/monitor_bar_series.tsx +++ b/x-pack/plugins/uptime/public/components/common/charts/monitor_bar_series.tsx @@ -13,6 +13,8 @@ import { Position, timeFormatter, BrushEndListener, + XYChartElementEvent, + ElementClickListener, } from '@elastic/charts'; import { i18n } from '@kbn/i18n'; import React, { useContext } from 'react'; @@ -23,12 +25,15 @@ import { HistogramPoint } from '../../../../common/runtime_types'; import { getChartDateLabel, seriesHasDownValues } from '../../../lib/helper'; import { useUrlParams } from '../../../hooks'; import { UptimeThemeContext } from '../../../contexts'; +import { getDateRangeFromChartElement } from './utils'; export interface MonitorBarSeriesProps { /** * The timeseries data to display. */ histogramSeries: HistogramPoint[] | null; + + minInterval: number; } /** @@ -36,7 +41,7 @@ export interface MonitorBarSeriesProps { * so we will only render the series component if there are down counts for the selected monitor. * @param props - the values for the monitor this chart visualizes */ -export const MonitorBarSeries = ({ histogramSeries }: MonitorBarSeriesProps) => { +export const MonitorBarSeries = ({ histogramSeries, minInterval }: MonitorBarSeriesProps) => { const { colors: { danger }, chartTheme, @@ -55,14 +60,23 @@ export const MonitorBarSeries = ({ histogramSeries }: MonitorBarSeriesProps) => }); }; + const onBarClicked: ElementClickListener = ([elementData]) => { + updateUrlParams(getDateRangeFromChartElement(elementData as XYChartElementEvent, minInterval)); + }; + const id = 'downSeries'; return seriesHasDownValues(histogramSeries) ? (
= ({ /> ); } else { - const { histogram } = data; + const { histogram, minInterval } = data; const downSpecId = i18n.translate('xpack.uptime.snapshotHistogram.series.downLabel', { defaultMessage: 'Down', @@ -100,6 +103,12 @@ export const PingHistogramComponent: React.FC = ({ }); }; + const onBarClicked: ElementClickListener = ([elementData]) => { + updateUrlParams( + getDateRangeFromChartElement(elementData as XYChartElementEvent, minInterval) + ); + }; + const barData: BarPoint[] = []; histogram.forEach(({ x, upCount, downCount }) => { @@ -125,11 +134,13 @@ export const PingHistogramComponent: React.FC = ({ { + const startRange = (elementData as XYChartElementEvent)[0].x; + + return { + dateRangeStart: moment(startRange).toISOString(), + dateRangeEnd: moment(startRange).add(minInterval, 'ms').toISOString(), + }; +}; diff --git a/x-pack/plugins/uptime/public/components/overview/monitor_list/monitor_list.tsx b/x-pack/plugins/uptime/public/components/overview/monitor_list/monitor_list.tsx index 718e9e9948081..5e0cc5d3dee1d 100644 --- a/x-pack/plugins/uptime/public/components/overview/monitor_list/monitor_list.tsx +++ b/x-pack/plugins/uptime/public/components/overview/monitor_list/monitor_list.tsx @@ -139,8 +139,8 @@ export const MonitorListComponent: ({ mobileOptions: { show: false, }, - render: (histogramSeries: HistogramPoint[] | null) => ( - + render: (histogramSeries: HistogramPoint[] | null, summary: MonitorSummary) => ( + ), }, { diff --git a/x-pack/plugins/uptime/server/lib/requests/__tests__/__snapshots__/get_ping_histogram.test.ts.snap b/x-pack/plugins/uptime/server/lib/requests/__tests__/__snapshots__/get_ping_histogram.test.ts.snap index 37dec410664ef..774ae47d68acd 100644 --- a/x-pack/plugins/uptime/server/lib/requests/__tests__/__snapshots__/get_ping_histogram.test.ts.snap +++ b/x-pack/plugins/uptime/server/lib/requests/__tests__/__snapshots__/get_ping_histogram.test.ts.snap @@ -22,7 +22,7 @@ Object { "y": 1, }, ], - "interval": "1m", + "minInterval": 36000, } `; @@ -48,7 +48,7 @@ Object { "y": 1, }, ], - "interval": "1h", + "minInterval": 36000, } `; @@ -62,7 +62,7 @@ Object { "y": 1, }, ], - "interval": "10s", + "minInterval": 36000, } `; @@ -82,6 +82,6 @@ Object { "y": 1, }, ], - "interval": "1m", + "minInterval": 36000, } `; diff --git a/x-pack/plugins/uptime/server/lib/requests/__tests__/get_ping_histogram.test.ts b/x-pack/plugins/uptime/server/lib/requests/__tests__/get_ping_histogram.test.ts index 11c7511dec370..0ae5887b31a7b 100644 --- a/x-pack/plugins/uptime/server/lib/requests/__tests__/get_ping_histogram.test.ts +++ b/x-pack/plugins/uptime/server/lib/requests/__tests__/get_ping_histogram.test.ts @@ -140,8 +140,8 @@ describe('getPingHistogram', () => { const result = await getPingHistogram({ callES: mockEsClient, dynamicSettings: DYNAMIC_SETTINGS_DEFAULTS, - from: '1234', - to: '5678', + from: 'now-15m', + to: 'now', filters: JSON.stringify(searchFilter), monitorId: undefined, }); diff --git a/x-pack/plugins/uptime/server/lib/requests/get_monitor_states.ts b/x-pack/plugins/uptime/server/lib/requests/get_monitor_states.ts index 4aff852d7c953..3e49a32881f54 100644 --- a/x-pack/plugins/uptime/server/lib/requests/get_monitor_states.ts +++ b/x-pack/plugins/uptime/server/lib/requests/get_monitor_states.ts @@ -68,13 +68,21 @@ export const getMonitorStates: UMElasticsearchQueryFn< const iterator = new MonitorSummaryIterator(queryContext); const page = await iterator.nextPage(size); + const minInterval = getHistogramInterval( + queryContext.dateRangeStart, + queryContext.dateRangeEnd, + 12 + ); + const histograms = await getHistogramForMonitors( queryContext, - page.monitorSummaries.map((s) => s.monitor_id) + page.monitorSummaries.map((s) => s.monitor_id), + minInterval ); page.monitorSummaries.forEach((s) => { s.histogram = histograms[s.monitor_id]; + s.minInterval = minInterval; }); return { @@ -86,7 +94,8 @@ export const getMonitorStates: UMElasticsearchQueryFn< export const getHistogramForMonitors = async ( queryContext: QueryContext, - monitorIds: string[] + monitorIds: string[], + minInterval: number ): Promise<{ [key: string]: Histogram }> => { const params = { index: queryContext.heartbeatIndices, @@ -122,9 +131,7 @@ export const getHistogramForMonitors = async ( field: '@timestamp', // 12 seems to be a good size for performance given // long monitor lists of up to 100 on the overview page - fixed_interval: - getHistogramInterval(queryContext.dateRangeStart, queryContext.dateRangeEnd, 12) + - 'ms', + fixed_interval: minInterval + 'ms', missing: 0, }, aggs: { diff --git a/x-pack/plugins/uptime/server/lib/requests/get_ping_histogram.ts b/x-pack/plugins/uptime/server/lib/requests/get_ping_histogram.ts index 970d9ad166982..5d8706e2fc5f1 100644 --- a/x-pack/plugins/uptime/server/lib/requests/get_ping_histogram.ts +++ b/x-pack/plugins/uptime/server/lib/requests/get_ping_histogram.ts @@ -37,6 +37,8 @@ export const getPingHistogram: UMElasticsearchQueryFn< } const filter = getFilterClause(from, to, additionalFilters); + const minInterval = getHistogramInterval(from, to, QUERY.DEFAULT_BUCKET_COUNT); + const params = { index: dynamicSettings.heartbeatIndices, body: { @@ -50,8 +52,7 @@ export const getPingHistogram: UMElasticsearchQueryFn< timeseries: { date_histogram: { field: '@timestamp', - fixed_interval: - bucketSize || getHistogramInterval(from, to, QUERY.DEFAULT_BUCKET_COUNT) + 'ms', + fixed_interval: bucketSize || minInterval + 'ms', missing: 0, }, aggs: { @@ -76,7 +77,6 @@ export const getPingHistogram: UMElasticsearchQueryFn< }; const result = await callES('search', params); - const interval = result.aggregations?.timeseries?.interval; const buckets: HistogramQueryResult[] = result?.aggregations?.timeseries?.buckets ?? []; const histogram = buckets.map((bucket) => { const x: number = bucket.key; @@ -91,6 +91,6 @@ export const getPingHistogram: UMElasticsearchQueryFn< }); return { histogram, - interval, + minInterval, }; }; diff --git a/x-pack/test/api_integration/apis/uptime/rest/fixtures/monitor_latest_status.json b/x-pack/test/api_integration/apis/uptime/rest/fixtures/monitor_latest_status.json index f2927af172062..a97ee98123885 100644 --- a/x-pack/test/api_integration/apis/uptime/rest/fixtures/monitor_latest_status.json +++ b/x-pack/test/api_integration/apis/uptime/rest/fixtures/monitor_latest_status.json @@ -54,4 +54,4 @@ }, "docId": "h5toHm0B0I9WX_CznN_V", "timestamp": "2019-09-11T03:40:34.371Z" -} +} \ No newline at end of file diff --git a/x-pack/test/api_integration/apis/uptime/rest/fixtures/ping_histogram.json b/x-pack/test/api_integration/apis/uptime/rest/fixtures/ping_histogram.json index 85ce545ed92b0..22f1fc168ae66 100644 --- a/x-pack/test/api_integration/apis/uptime/rest/fixtures/ping_histogram.json +++ b/x-pack/test/api_integration/apis/uptime/rest/fixtures/ping_histogram.json @@ -156,5 +156,6 @@ "upCount": 93, "y": 1 } - ] + ], + "minInterval": 22801 } \ No newline at end of file diff --git a/x-pack/test/api_integration/apis/uptime/rest/fixtures/ping_histogram_by_filter.json b/x-pack/test/api_integration/apis/uptime/rest/fixtures/ping_histogram_by_filter.json index fe5dc9dd3da3f..f03827c909347 100644 --- a/x-pack/test/api_integration/apis/uptime/rest/fixtures/ping_histogram_by_filter.json +++ b/x-pack/test/api_integration/apis/uptime/rest/fixtures/ping_histogram_by_filter.json @@ -156,5 +156,6 @@ "upCount": 93, "y": 1 } - ] + ], + "minInterval": 22801 } \ No newline at end of file diff --git a/x-pack/test/api_integration/apis/uptime/rest/fixtures/ping_histogram_by_id.json b/x-pack/test/api_integration/apis/uptime/rest/fixtures/ping_histogram_by_id.json index e54738cf5dbd7..fbff31ebe03b6 100644 --- a/x-pack/test/api_integration/apis/uptime/rest/fixtures/ping_histogram_by_id.json +++ b/x-pack/test/api_integration/apis/uptime/rest/fixtures/ping_histogram_by_id.json @@ -156,5 +156,6 @@ "upCount": 1, "y": 1 } - ] + ], + "minInterval": 22801 } \ No newline at end of file From c88d2d3ae09b99ce325f769b86c341ff3ebed365 Mon Sep 17 00:00:00 2001 From: Jen Huang Date: Mon, 5 Oct 2020 12:20:33 -0700 Subject: [PATCH 45/49] [Ingest Manager] Enforce license level for custom registry URL (#79204) * Enforce enterprise license for custom registry URL * Add comments --- x-pack/plugins/ingest_manager/README.md | 3 ++- x-pack/plugins/ingest_manager/common/services/license.ts | 7 +++++++ .../server/services/epm/registry/registry_url.ts | 9 ++++++--- 3 files changed, 15 insertions(+), 4 deletions(-) diff --git a/x-pack/plugins/ingest_manager/README.md b/x-pack/plugins/ingest_manager/README.md index a95a2582f1f60..65df682c23659 100644 --- a/x-pack/plugins/ingest_manager/README.md +++ b/x-pack/plugins/ingest_manager/README.md @@ -8,7 +8,8 @@ - [code for adding the routes](https://github.com/elastic/kibana/blob/1f27d349533b1c2865c10c45b2cf705d7416fb36/x-pack/plugins/ingest_manager/server/plugin.ts#L115-L133) - [Integration tests](server/integration_tests/router.test.ts) - Both EPM and Fleet require `ingestManager` be enabled. They are not standalone features. -- For Gold+ license, a custom package registry URL can be used by setting `xpack.ingestManager.registryUrl=http://localhost:8080` +- For Enterprise license, a custom package registry URL can be used by setting `xpack.ingestManager.registryUrl=http://localhost:8080` + - This property is currently only for internal Elastic development and is unsupported ## Fleet Requirements diff --git a/x-pack/plugins/ingest_manager/common/services/license.ts b/x-pack/plugins/ingest_manager/common/services/license.ts index 6d9b20a8456c0..381db149f7d6d 100644 --- a/x-pack/plugins/ingest_manager/common/services/license.ts +++ b/x-pack/plugins/ingest_manager/common/services/license.ts @@ -43,4 +43,11 @@ export class LicenseService { this.licenseInformation?.hasAtLeast('gold') ); } + public isEnterprise() { + return ( + this.licenseInformation?.isAvailable && + this.licenseInformation?.isActive && + this.licenseInformation?.hasAtLeast('enterprise') + ); + } } diff --git a/x-pack/plugins/ingest_manager/server/services/epm/registry/registry_url.ts b/x-pack/plugins/ingest_manager/server/services/epm/registry/registry_url.ts index 6618220a27085..ff9a7871a7db8 100644 --- a/x-pack/plugins/ingest_manager/server/services/epm/registry/registry_url.ts +++ b/x-pack/plugins/ingest_manager/server/services/epm/registry/registry_url.ts @@ -28,16 +28,19 @@ const getDefaultRegistryUrl = (): string => { } }; +// Custom registry URL is currently only for internal Elastic development and is unsupported export const getRegistryUrl = (): string => { const customUrl = appContextService.getConfig()?.registryUrl; - const isGoldPlus = licenseService.isGoldPlus(); + const isEnterprise = licenseService.isEnterprise(); - if (customUrl && isGoldPlus) { + if (customUrl && isEnterprise) { return customUrl; } if (customUrl) { - appContextService.getLogger().warn('Gold license is required to use a custom registry url.'); + appContextService + .getLogger() + .warn('Enterprise license is required to use a custom registry url.'); } return getDefaultRegistryUrl(); From a64aa686bd407df647c9b577ae7eb92efeaecc95 Mon Sep 17 00:00:00 2001 From: Nathan Reese Date: Mon, 5 Oct 2020 13:22:41 -0600 Subject: [PATCH 46/49] [Maps] expose map title and description to reporting and embeddable container (#79325) Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- .../map_container/map_container.tsx | 11 ++++++++++- .../plugins/maps/public/embeddable/map_embeddable.tsx | 8 ++++++++ .../maps/public/embeddable/map_embeddable_factory.ts | 1 + x-pack/plugins/maps/public/embeddable/types.ts | 7 ++----- .../public/routing/routes/maps_app/maps_app_view.tsx | 6 +++++- 5 files changed, 26 insertions(+), 7 deletions(-) diff --git a/x-pack/plugins/maps/public/connected_components/map_container/map_container.tsx b/x-pack/plugins/maps/public/connected_components/map_container/map_container.tsx index bf75c86ac249d..352aed4a8cc93 100644 --- a/x-pack/plugins/maps/public/connected_components/map_container/map_container.tsx +++ b/x-pack/plugins/maps/public/connected_components/map_container/map_container.tsx @@ -50,6 +50,8 @@ interface Props { refreshConfig: MapRefreshConfig; renderTooltipContent?: RenderToolTipContent; triggerRefreshTimer: () => void; + title?: string; + description?: string; } interface State { @@ -197,7 +199,12 @@ export class MapContainer extends Component { if (mapInitError) { return ( -
+
{ data-dom-id={this.state.domId} data-render-complete={this.state.isInitialLoadRenderTimeoutComplete} data-shared-item + data-title={this.props.title} + data-description={this.props.description} > { type = MAP_SAVED_OBJECT_TYPE; + private _description: string; private _renderTooltipContent?: RenderToolTipContent; private _eventHandlers?: EventHandlers; private _layerList: LayerDescriptor[]; @@ -95,6 +96,7 @@ export class MapEmbeddable extends Embeddable this.onContainerStateChanged(input)); } + public getDescription() { + return this._description; + } + supportedTriggers(): Array { return [APPLY_FILTER_TRIGGER]; } @@ -238,6 +244,8 @@ export class MapEmbeddable extends Embeddable , diff --git a/x-pack/plugins/maps/public/embeddable/map_embeddable_factory.ts b/x-pack/plugins/maps/public/embeddable/map_embeddable_factory.ts index 489a73a90cf70..b49419487b6fa 100644 --- a/x-pack/plugins/maps/public/embeddable/map_embeddable_factory.ts +++ b/x-pack/plugins/maps/public/embeddable/map_embeddable_factory.ts @@ -109,6 +109,7 @@ export class MapEmbeddableFactory implements EmbeddableFactoryDefinition { { layerList, title: savedMap.title, + description: savedMap.description, editUrl: getHttp().basePath.prepend(getExistingMapPath(savedObjectId)), editApp: APP_ID, editPath: `/${MAP_PATH}/${savedObjectId}`, diff --git a/x-pack/plugins/maps/public/embeddable/types.ts b/x-pack/plugins/maps/public/embeddable/types.ts index ce06b7da9094a..8ba906111ad1e 100644 --- a/x-pack/plugins/maps/public/embeddable/types.ts +++ b/x-pack/plugins/maps/public/embeddable/types.ts @@ -6,15 +6,12 @@ import { IIndexPattern } from '../../../../../src/plugins/data/common/index_patterns'; import { MapSettings } from '../reducers/map'; -import { - EmbeddableInput, - EmbeddableOutput, - // eslint-disable-next-line @kbn/eslint/no-restricted-paths -} from '../../../../../src/plugins/embeddable/public/lib/embeddables'; +import { EmbeddableInput, EmbeddableOutput } from '../../../../../src/plugins/embeddable/public'; import { Filter, Query, RefreshInterval, TimeRange } from '../../../../../src/plugins/data/common'; import { LayerDescriptor, MapCenterAndZoom } from '../../common/descriptor_types'; export interface MapEmbeddableConfig { + description?: string; editUrl?: string; editApp?: string; editPath?: string; diff --git a/x-pack/plugins/maps/public/routing/routes/maps_app/maps_app_view.tsx b/x-pack/plugins/maps/public/routing/routes/maps_app/maps_app_view.tsx index abc3462caf6b4..bd08b2f11fadc 100644 --- a/x-pack/plugins/maps/public/routing/routes/maps_app/maps_app_view.tsx +++ b/x-pack/plugins/maps/public/routing/routes/maps_app/maps_app_view.tsx @@ -459,7 +459,11 @@ export class MapsAppView extends React.Component { {this._renderTopNav()}

{`screenTitle placeholder`}

- +
) : null; From bd778221dcf8b934f2947d6be3173f8a2796ef74 Mon Sep 17 00:00:00 2001 From: Nathan L Smith Date: Mon, 5 Oct 2020 14:25:07 -0500 Subject: [PATCH 47/49] Fix link to RFC in GlobalSearch plugin README (#79407) --- x-pack/plugins/global_search/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/x-pack/plugins/global_search/README.md b/x-pack/plugins/global_search/README.md index d47e0bd696fd8..db72f4901c778 100644 --- a/x-pack/plugins/global_search/README.md +++ b/x-pack/plugins/global_search/README.md @@ -39,7 +39,7 @@ Results from providers registered from the client-side `registerResultProvider` not be available when performing a search from the server-side. For this reason, prefer registering providers using the server-side API when possible. -Refer to the [RFC](rfcs/text/0011_global_search.md#result_provider_registration) for more details +Refer to the [RFC](../../../rfcs/text/0011_global_search.md#result_provider_registration) for more details ### Search completion cause From fe1303097941b9eba326b021387686c7586a0805 Mon Sep 17 00:00:00 2001 From: Kevin Logan <56395104+kevinlog@users.noreply.github.com> Date: Mon, 5 Oct 2020 15:26:34 -0400 Subject: [PATCH 48/49] [SECURITY_SOLUTION] remove Elastic from Endpoint Security name (#79367) --- x-pack/plugins/lists/common/constants.ts | 8 ++++---- .../security_solution/public/common/translations.ts | 2 +- .../rules/pre_packaged_rules/translations.ts | 2 +- .../management/components/management_empty_state.tsx | 10 +++++----- .../management/pages/endpoint_hosts/view/index.tsx | 2 +- .../overview/components/endpoint_notice/index.tsx | 4 ++-- .../overview/components/overview_empty/index.test.tsx | 2 +- .../overview/components/overview_empty/index.tsx | 4 ++-- .../__snapshots__/index.test.tsx.snap | 2 +- .../overview/components/overview_host_stats/index.tsx | 2 +- .../components/timeline/body/renderers/translations.ts | 2 +- 11 files changed, 20 insertions(+), 20 deletions(-) diff --git a/x-pack/plugins/lists/common/constants.ts b/x-pack/plugins/lists/common/constants.ts index 1851487b824a2..d1b8e685c2c8a 100644 --- a/x-pack/plugins/lists/common/constants.ts +++ b/x-pack/plugins/lists/common/constants.ts @@ -44,10 +44,10 @@ export const ENDPOINT_LIST_ITEM_URL = '/api/endpoint_list/items'; export const ENDPOINT_LIST_ID = 'endpoint_list'; /** The name of the single global space agnostic endpoint list */ -export const ENDPOINT_LIST_NAME = 'Elastic Endpoint Security Exception List'; +export const ENDPOINT_LIST_NAME = 'Endpoint Security Exception List'; /** The description of the single global space agnostic endpoint list */ -export const ENDPOINT_LIST_DESCRIPTION = 'Elastic Endpoint Security Exception List'; +export const ENDPOINT_LIST_DESCRIPTION = 'Endpoint Security Exception List'; export const MAX_EXCEPTION_LIST_SIZE = 10000; @@ -55,7 +55,7 @@ export const MAX_EXCEPTION_LIST_SIZE = 10000; export const ENDPOINT_TRUSTED_APPS_LIST_ID = 'endpoint_trusted_apps'; /** Name of trusted apps agnostic list */ -export const ENDPOINT_TRUSTED_APPS_LIST_NAME = 'Elastic Endpoint Security Trusted Apps List'; +export const ENDPOINT_TRUSTED_APPS_LIST_NAME = 'Endpoint Security Trusted Apps List'; /** Description of trusted apps agnostic list */ -export const ENDPOINT_TRUSTED_APPS_LIST_DESCRIPTION = 'Elastic Endpoint Security Trusted Apps List'; +export const ENDPOINT_TRUSTED_APPS_LIST_DESCRIPTION = 'Endpoint Security Trusted Apps List'; diff --git a/x-pack/plugins/security_solution/public/common/translations.ts b/x-pack/plugins/security_solution/public/common/translations.ts index c4a9540f62914..6fed7db62aa3c 100644 --- a/x-pack/plugins/security_solution/public/common/translations.ts +++ b/x-pack/plugins/security_solution/public/common/translations.ts @@ -50,7 +50,7 @@ export const EMPTY_ACTION_SECONDARY = i18n.translate( export const EMPTY_ACTION_ENDPOINT = i18n.translate( 'xpack.securitySolution.pages.common.emptyActionEndpoint', { - defaultMessage: 'Add Elastic Endpoint Security', + defaultMessage: 'Add Endpoint Security', } ); diff --git a/x-pack/plugins/security_solution/public/detections/components/rules/pre_packaged_rules/translations.ts b/x-pack/plugins/security_solution/public/detections/components/rules/pre_packaged_rules/translations.ts index 9b0cec99b1b38..66fe138c30ad5 100644 --- a/x-pack/plugins/security_solution/public/detections/components/rules/pre_packaged_rules/translations.ts +++ b/x-pack/plugins/security_solution/public/detections/components/rules/pre_packaged_rules/translations.ts @@ -17,7 +17,7 @@ export const PRE_BUILT_MSG = i18n.translate( 'xpack.securitySolution.detectionEngine.rules.prePackagedRules.emptyPromptMessage', { defaultMessage: - 'Elastic Security comes with prebuilt detection rules that run in the background and create alerts when their conditions are met. By default, all prebuilt rules except the Elastic Endpoint Security rule are disabled. You can select additional rules you want to activate.', + 'Elastic Security comes with prebuilt detection rules that run in the background and create alerts when their conditions are met. By default, all prebuilt rules except the Endpoint Security rule are disabled. You can select additional rules you want to activate.', } ); diff --git a/x-pack/plugins/security_solution/public/management/components/management_empty_state.tsx b/x-pack/plugins/security_solution/public/management/components/management_empty_state.tsx index 4617865d6aa6d..d51a23639f5cb 100644 --- a/x-pack/plugins/security_solution/public/management/components/management_empty_state.tsx +++ b/x-pack/plugins/security_solution/public/management/components/management_empty_state.tsx @@ -58,7 +58,7 @@ const PolicyEmptyState = React.memo<{

@@ -66,21 +66,21 @@ const PolicyEmptyState = React.memo<{ } bodyComponent={ diff --git a/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/index.tsx b/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/index.tsx index 4bb9335496ef4..7639b878b9c5c 100644 --- a/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/index.tsx +++ b/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/index.tsx @@ -570,7 +570,7 @@ export const EndpointList = () => { subtitle={ } > diff --git a/x-pack/plugins/security_solution/public/overview/components/endpoint_notice/index.tsx b/x-pack/plugins/security_solution/public/overview/components/endpoint_notice/index.tsx index 8b73253157edc..98c70908ca5d7 100644 --- a/x-pack/plugins/security_solution/public/overview/components/endpoint_notice/index.tsx +++ b/x-pack/plugins/security_solution/public/overview/components/endpoint_notice/index.tsx @@ -33,7 +33,7 @@ export const EndpointNotice = memo<{ onDismiss: () => void }>(({ onDismiss }) => } @@ -49,7 +49,7 @@ export const EndpointNotice = memo<{ onDismiss: () => void }>(({ onDismiss }) => diff --git a/x-pack/plugins/security_solution/public/overview/components/overview_empty/index.test.tsx b/x-pack/plugins/security_solution/public/overview/components/overview_empty/index.test.tsx index 2112350278e8e..2d4b8538a5d53 100644 --- a/x-pack/plugins/security_solution/public/overview/components/overview_empty/index.test.tsx +++ b/x-pack/plugins/security_solution/public/overview/components/overview_empty/index.test.tsx @@ -53,7 +53,7 @@ describe('OverviewEmpty', () => { description: 'Protect your hosts with threat prevention, detection, and deep security data visibility.', fill: false, - label: 'Add Elastic Endpoint Security', + label: 'Add Endpoint Security', onClick: undefined, url: '/app/home#/tutorial_directory/security', }, diff --git a/x-pack/plugins/security_solution/public/overview/components/overview_empty/index.tsx b/x-pack/plugins/security_solution/public/overview/components/overview_empty/index.tsx index 1d2c6889213f1..9b07d6a53537d 100644 --- a/x-pack/plugins/security_solution/public/overview/components/overview_empty/index.tsx +++ b/x-pack/plugins/security_solution/public/overview/components/overview_empty/index.tsx @@ -63,7 +63,7 @@ const OverviewEmptyComponent: React.FC = () => { <> {i18nCommon.EMPTY_ACTION_SECONDARY} @@ -80,7 +80,7 @@ const OverviewEmptyComponent: React.FC = () => { <> {i18nCommon.EMPTY_ACTION_SECONDARY} diff --git a/x-pack/plugins/security_solution/public/overview/components/overview_host_stats/__snapshots__/index.test.tsx.snap b/x-pack/plugins/security_solution/public/overview/components/overview_host_stats/__snapshots__/index.test.tsx.snap index 23732e88ba1f9..2e70d1a7f8a5b 100644 --- a/x-pack/plugins/security_solution/public/overview/components/overview_host_stats/__snapshots__/index.test.tsx.snap +++ b/x-pack/plugins/security_solution/public/overview/components/overview_host_stats/__snapshots__/index.test.tsx.snap @@ -254,7 +254,7 @@ exports[`Overview Host Stat Data rendering it renders the default OverviewHostSt > diff --git a/x-pack/plugins/security_solution/public/overview/components/overview_host_stats/index.tsx b/x-pack/plugins/security_solution/public/overview/components/overview_host_stats/index.tsx index ef595476d8a94..d2865c4385152 100644 --- a/x-pack/plugins/security_solution/public/overview/components/overview_host_stats/index.tsx +++ b/x-pack/plugins/security_solution/public/overview/components/overview_host_stats/index.tsx @@ -209,7 +209,7 @@ const hostStatGroups: StatGroup[] = [ name: ( ), statIds: [ diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/body/renderers/translations.ts b/x-pack/plugins/security_solution/public/timelines/components/timeline/body/renderers/translations.ts index 92ebd9c2b0e36..ac927f60691e1 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/timeline/body/renderers/translations.ts +++ b/x-pack/plugins/security_solution/public/timelines/components/timeline/body/renderers/translations.ts @@ -33,6 +33,6 @@ export const NON_EXISTENT = i18n.translate('xpack.securitySolution.auditd.nonExi export const LINK_ELASTIC_ENDPOINT_SECURITY = i18n.translate( 'xpack.securitySolution.event.module.linkToElasticEndpointSecurityDescription', { - defaultMessage: 'Open in Elastic Endpoint Security', + defaultMessage: 'Open in Endpoint Security', } ); From 1cf7f783cd0dcc0a2317ae1c86534af0762f0488 Mon Sep 17 00:00:00 2001 From: Constance Date: Mon, 5 Oct 2020 12:48:07 -0700 Subject: [PATCH 49/49] [Enterprise Search] Fix cross-application links & breadcrumbs (#79530) * Update our cross-app links to correctly include Kibana basePaths - see https://www.elastic.co/guide/en/kibana/master/kibana-navigation.html - for this change, we need to pass in the `http` lib as another dependency alongside `history` to createHelper * Update helpers using createHref to pass new expected dependency - Note that a lot of their createHref tests did not functionally change in output because Kibana mocks an empty basePath ('/') in tests --- .../shared/kibana/kibana_logic.test.ts | 5 +++- .../shared/kibana/kibana_logic.ts | 4 +++- .../kibana_chrome/generate_breadcrumbs.ts | 6 +++-- .../react_router_helpers/create_href.test.ts | 23 ++++++++++++++++--- .../react_router_helpers/create_href.ts | 22 ++++++++++++++---- .../shared/react_router_helpers/eui_link.tsx | 6 +++-- 6 files changed, 52 insertions(+), 14 deletions(-) diff --git a/x-pack/plugins/enterprise_search/public/applications/shared/kibana/kibana_logic.test.ts b/x-pack/plugins/enterprise_search/public/applications/shared/kibana/kibana_logic.test.ts index 4d51362a7e11b..a763518d30b99 100644 --- a/x-pack/plugins/enterprise_search/public/applications/shared/kibana/kibana_logic.test.ts +++ b/x-pack/plugins/enterprise_search/public/applications/shared/kibana/kibana_logic.test.ts @@ -6,7 +6,10 @@ import { resetContext } from 'kea'; -import { mockKibanaValues } from '../../__mocks__'; +import { mockKibanaValues, mockHttpValues } from '../../__mocks__'; +jest.mock('../http', () => ({ + HttpLogic: { values: { http: mockHttpValues.http } }, +})); import { KibanaLogic, mountKibanaLogic } from './kibana_logic'; diff --git a/x-pack/plugins/enterprise_search/public/applications/shared/kibana/kibana_logic.ts b/x-pack/plugins/enterprise_search/public/applications/shared/kibana/kibana_logic.ts index 9519a62ac352b..89ed07f302b03 100644 --- a/x-pack/plugins/enterprise_search/public/applications/shared/kibana/kibana_logic.ts +++ b/x-pack/plugins/enterprise_search/public/applications/shared/kibana/kibana_logic.ts @@ -10,6 +10,7 @@ import { FC } from 'react'; import { History } from 'history'; import { ApplicationStart, ChromeBreadcrumb } from 'src/core/public'; +import { HttpLogic } from '../http'; import { createHref, ICreateHrefOptions } from '../react_router_helpers'; interface IKibanaLogicProps { @@ -31,7 +32,8 @@ export const KibanaLogic = kea>({ history: [props.history, {}], navigateToUrl: [ (url: string, options?: ICreateHrefOptions) => { - const href = createHref(url, props.history, options); + const deps = { history: props.history, http: HttpLogic.values.http }; + const href = createHref(url, deps, options); return props.navigateToUrl(href); }, {}, diff --git a/x-pack/plugins/enterprise_search/public/applications/shared/kibana_chrome/generate_breadcrumbs.ts b/x-pack/plugins/enterprise_search/public/applications/shared/kibana_chrome/generate_breadcrumbs.ts index 4882c0d33ae55..e22334aeea371 100644 --- a/x-pack/plugins/enterprise_search/public/applications/shared/kibana_chrome/generate_breadcrumbs.ts +++ b/x-pack/plugins/enterprise_search/public/applications/shared/kibana_chrome/generate_breadcrumbs.ts @@ -7,7 +7,8 @@ import { useValues } from 'kea'; import { EuiBreadcrumb } from '@elastic/eui'; -import { KibanaLogic } from '../../shared/kibana'; +import { KibanaLogic } from '../kibana'; +import { HttpLogic } from '../http'; import { ENTERPRISE_SEARCH_PLUGIN, @@ -66,12 +67,13 @@ export const useGenerateBreadcrumbs = (trail: TBreadcrumbTrail): TBreadcrumbs => export const useEuiBreadcrumbs = (breadcrumbs: TBreadcrumbs): EuiBreadcrumb[] => { const { navigateToUrl, history } = useValues(KibanaLogic); + const { http } = useValues(HttpLogic); return breadcrumbs.map(({ text, path, shouldNotCreateHref }) => { const breadcrumb: EuiBreadcrumb = { text }; if (path) { - breadcrumb.href = createHref(path, history, { shouldNotCreateHref }); + breadcrumb.href = createHref(path, { history, http }, { shouldNotCreateHref }); breadcrumb.onClick = (event) => { if (letBrowserHandleEvent(event)) return; event.preventDefault(); diff --git a/x-pack/plugins/enterprise_search/public/applications/shared/react_router_helpers/create_href.test.ts b/x-pack/plugins/enterprise_search/public/applications/shared/react_router_helpers/create_href.test.ts index 5f96beeb42ae4..353c24a342c17 100644 --- a/x-pack/plugins/enterprise_search/public/applications/shared/react_router_helpers/create_href.test.ts +++ b/x-pack/plugins/enterprise_search/public/applications/shared/react_router_helpers/create_href.test.ts @@ -4,16 +4,33 @@ * you may not use this file except in compliance with the Elastic License. */ +import { httpServiceMock } from 'src/core/public/mocks'; import { mockHistory } from '../../__mocks__'; import { createHref } from './'; describe('createHref', () => { + const dependencies = { + history: mockHistory, + http: httpServiceMock.createSetupContract(), + }; + it('generates a path with the React Router basename included', () => { - expect(createHref('/test', mockHistory)).toEqual('/app/enterprise_search/test'); + expect(createHref('/test', dependencies)).toEqual('/app/enterprise_search/test'); }); - it('does not include the basename if shouldNotCreateHref is passed', () => { - expect(createHref('/test', mockHistory, { shouldNotCreateHref: true })).toEqual('/test'); + describe('shouldNotCreateHref', () => { + const options = { shouldNotCreateHref: true }; + + it('does not include the router basename,', () => { + expect(createHref('/test', dependencies, options)).toEqual('/test'); + }); + + it('does include the Kibana basepath,', () => { + const http = httpServiceMock.createSetupContract({ basePath: '/xyz/s/custom-space' }); + const basePathDeps = { ...dependencies, http }; + + expect(createHref('/test', basePathDeps, options)).toEqual('/xyz/s/custom-space/test'); + }); }); }); diff --git a/x-pack/plugins/enterprise_search/public/applications/shared/react_router_helpers/create_href.ts b/x-pack/plugins/enterprise_search/public/applications/shared/react_router_helpers/create_href.ts index cc8279c80a092..aa2f09a195c8d 100644 --- a/x-pack/plugins/enterprise_search/public/applications/shared/react_router_helpers/create_href.ts +++ b/x-pack/plugins/enterprise_search/public/applications/shared/react_router_helpers/create_href.ts @@ -5,23 +5,35 @@ */ import { History } from 'history'; +import { HttpSetup } from 'src/core/public'; /** - * This helper uses React Router's createHref function to generate links with router basenames accounted for. + * This helper uses React Router's createHref function to generate links with router basenames included. * For example, if we perform navigateToUrl('/engines') within App Search, we expect the app basename - * to be taken into account to be intelligently routed to '/app/enterprise_search/app_search/engines'. + * to be taken into account & intelligently routed to '/app/enterprise_search/app_search/engines'. * * This helper accomplishes that, while still giving us an escape hatch for navigation *between* apps. * For example, if we want to navigate the user from App Search to Enterprise Search we could * navigateToUrl('/app/enterprise_search', { shouldNotCreateHref: true }) + * + * Said escape hatch should still contain all of Kibana's basepaths - for example, + * 'localhost:5601/xyz' when developing locally, or '/s/some-custom-space/' for space basepaths. + * See: https://www.elastic.co/guide/en/kibana/master/kibana-navigation.html + * + * Links completely outside of Kibana should not use our React Router helpers or navigateToUrl. */ +interface ICreateHrefDeps { + history: History; + http: HttpSetup; +} export interface ICreateHrefOptions { shouldNotCreateHref?: boolean; } + export const createHref = ( path: string, - history: History, - options?: ICreateHrefOptions + { history, http }: ICreateHrefDeps, + { shouldNotCreateHref }: ICreateHrefOptions = {} ): string => { - return options?.shouldNotCreateHref ? path : history.createHref({ pathname: path }); + return shouldNotCreateHref ? http.basePath.prepend(path) : history.createHref({ pathname: path }); }; diff --git a/x-pack/plugins/enterprise_search/public/applications/shared/react_router_helpers/eui_link.tsx b/x-pack/plugins/enterprise_search/public/applications/shared/react_router_helpers/eui_link.tsx index e0aa5afdf38c1..f9f6ec54e8832 100644 --- a/x-pack/plugins/enterprise_search/public/applications/shared/react_router_helpers/eui_link.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/shared/react_router_helpers/eui_link.tsx @@ -8,7 +8,8 @@ import React from 'react'; import { useValues } from 'kea'; import { EuiLink, EuiButton, EuiButtonProps, EuiLinkAnchorProps } from '@elastic/eui'; -import { KibanaLogic } from '../../shared/kibana'; +import { KibanaLogic } from '../kibana'; +import { HttpLogic } from '../http'; import { letBrowserHandleEvent, createHref } from './'; /** @@ -33,9 +34,10 @@ export const EuiReactRouterHelper: React.FC = ({ children, }) => { const { navigateToUrl, history } = useValues(KibanaLogic); + const { http } = useValues(HttpLogic); // Generate the correct link href (with basename etc. accounted for) - const href = createHref(to, history, { shouldNotCreateHref }); + const href = createHref(to, { history, http }, { shouldNotCreateHref }); const reactRouterLinkClick = (event: React.MouseEvent) => { if (onClick) onClick(); // Run any passed click events (e.g. telemetry)