From d6fdb689e83330795dbae3640224c0a23091be43 Mon Sep 17 00:00:00 2001 From: Ben Skelker <54019610+benskelker@users.noreply.github.com> Date: Tue, 21 Apr 2020 09:26:06 +0300 Subject: [PATCH 01/67] [Docs]Adds saved object key setting to load balancing kib instances (#63935) * adds saved object key setting to load balancing kib instances * SIEM section doc updates * Revert "SIEM section doc updates" - wrong PR This reverts commit fc55d90a6d1fe30b2f9f06e3bf6b7efee52c84d5. * corrections --- docs/setup/production.asciidoc | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/setup/production.asciidoc b/docs/setup/production.asciidoc index eef2b11e53d85..19f9d64d13623 100644 --- a/docs/setup/production.asciidoc +++ b/docs/setup/production.asciidoc @@ -133,7 +133,8 @@ server.port Settings that must be the same: -------- xpack.security.encryptionKey //decrypting session cookies -xpack.reporting.encryptionKey //decrypting reports stored in Elasticsearch +xpack.reporting.encryptionKey //decrypting reports +xpack.encryptedSavedObjects.encryptionKey // decrypting saved objects -------- Separate configuration files can be used from the command line by using the `-c` flag: From 5adccd005b107a64acf732b178109ec4fc61e6d9 Mon Sep 17 00:00:00 2001 From: Joe Reuter Date: Tue, 21 Apr 2020 08:37:02 +0200 Subject: [PATCH 02/67] follow conventions for saved object definitions (#63571) --- .../server/saved_objects/index.ts | 20 +++++++++++++++++++ .../tsvb_telemetry.ts} | 0 .../validation_telemetry_service.ts | 2 +- 3 files changed, 21 insertions(+), 1 deletion(-) create mode 100644 src/plugins/vis_type_timeseries/server/saved_objects/index.ts rename src/plugins/vis_type_timeseries/server/{validation_telemetry/saved_object_type.ts => saved_objects/tsvb_telemetry.ts} (100%) diff --git a/src/plugins/vis_type_timeseries/server/saved_objects/index.ts b/src/plugins/vis_type_timeseries/server/saved_objects/index.ts new file mode 100644 index 0000000000000..5f7f5767f423d --- /dev/null +++ b/src/plugins/vis_type_timeseries/server/saved_objects/index.ts @@ -0,0 +1,20 @@ +/* + * 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. + */ + +export { tsvbTelemetrySavedObjectType } from './tsvb_telemetry'; diff --git a/src/plugins/vis_type_timeseries/server/validation_telemetry/saved_object_type.ts b/src/plugins/vis_type_timeseries/server/saved_objects/tsvb_telemetry.ts similarity index 100% rename from src/plugins/vis_type_timeseries/server/validation_telemetry/saved_object_type.ts rename to src/plugins/vis_type_timeseries/server/saved_objects/tsvb_telemetry.ts diff --git a/src/plugins/vis_type_timeseries/server/validation_telemetry/validation_telemetry_service.ts b/src/plugins/vis_type_timeseries/server/validation_telemetry/validation_telemetry_service.ts index 779d9441df2fd..e4b8ca19094e4 100644 --- a/src/plugins/vis_type_timeseries/server/validation_telemetry/validation_telemetry_service.ts +++ b/src/plugins/vis_type_timeseries/server/validation_telemetry/validation_telemetry_service.ts @@ -19,7 +19,7 @@ import { APICaller, CoreSetup, Plugin, PluginInitializerContext } from 'kibana/server'; import { UsageCollectionSetup } from '../../../usage_collection/server'; -import { tsvbTelemetrySavedObjectType } from './saved_object_type'; +import { tsvbTelemetrySavedObjectType } from '../saved_objects'; export interface ValidationTelemetryServiceSetup { logFailedValidation: () => void; From 46f6f8779e7564778042578b4ecfbe91ab12713b Mon Sep 17 00:00:00 2001 From: Diana Derevyankina <54894989+DziyanaDzeraviankina@users.noreply.github.com> Date: Tue, 21 Apr 2020 09:55:06 +0300 Subject: [PATCH 03/67] Enable include/exclude in Terms agg for numeric fields (#59425) * Enable include/exclude in Terms agg for numeric fields Closes #4576 * Added a new component that allows adding multiple values * Added some validation to include/exclude fields * Removed unnecessary comments and accepted API changes * Fixed i18n ID issue * Refactored some code and fixed discard button issue * Added SimpleNumberList component and value parsing in include_exclude.tsx * Fixed merge conflict * Fixed merge conflict * Refactored some code * Got rid of lodash isArray, added Number.isFinite where needed and changed symbol of string join and array split * Added some more test cases to cover migrate_include_exclude_format write method Co-authored-by: Elastic Machine --- src/plugins/data/public/index.ts | 2 + src/plugins/data/public/public.api.md | 33 +++-- .../buckets/migrate_include_exclude_format.ts | 15 +- .../public/search/aggs/buckets/terms.test.ts | 60 ++++++++ .../data/public/search/aggs/buckets/terms.ts | 9 +- .../public/components/agg_params_map.ts | 2 + .../controls/components/number_list/utils.ts | 2 +- .../components/simple_number_list.tsx | 140 ++++++++++++++++++ .../components/controls/include_exclude.tsx | 49 ++++++ .../public/components/controls/index.ts | 1 + 10 files changed, 289 insertions(+), 24 deletions(-) create mode 100644 src/plugins/vis_default_editor/public/components/controls/components/simple_number_list.tsx create mode 100644 src/plugins/vis_default_editor/public/components/controls/include_exclude.tsx diff --git a/src/plugins/data/public/index.ts b/src/plugins/data/public/index.ts index b62b728beca35..05a4141483587 100644 --- a/src/plugins/data/public/index.ts +++ b/src/plugins/data/public/index.ts @@ -293,6 +293,7 @@ import { convertIPRangeToString, intervalOptions, // only used in Discover isDateHistogramBucketAggConfig, + isNumberType, isStringType, isType, parentPipelineType, @@ -392,6 +393,7 @@ export const search = { InvalidEsCalendarIntervalError, InvalidEsIntervalFormatError, isDateHistogramBucketAggConfig, + isNumberType, isStringType, isType, isValidEsInterval, diff --git a/src/plugins/data/public/public.api.md b/src/plugins/data/public/public.api.md index 427c4f7864554..6383f61864146 100644 --- a/src/plugins/data/public/public.api.md +++ b/src/plugins/data/public/public.api.md @@ -1545,8 +1545,9 @@ export const search: { InvalidEsCalendarIntervalError: typeof InvalidEsCalendarIntervalError; InvalidEsIntervalFormatError: typeof InvalidEsIntervalFormatError; isDateHistogramBucketAggConfig: typeof isDateHistogramBucketAggConfig; + isNumberType: (agg: import("./search").AggConfig) => boolean; isStringType: (agg: import("./search").AggConfig) => boolean; - isType: (type: string) => (agg: import("./search").AggConfig) => boolean; + isType: (...types: string[]) => (agg: import("./search").AggConfig) => boolean; isValidEsInterval: typeof isValidEsInterval; isValidInterval: typeof isValidInterval; parentPipelineType: string; @@ -1874,21 +1875,21 @@ export type TSearchStrategyProvider = (context: ISearc // src/plugins/data/public/index.ts:234:27 - (ae-forgotten-export) The symbol "flattenHitWrapper" needs to be exported by the entry point index.d.ts // src/plugins/data/public/index.ts:234:27 - (ae-forgotten-export) The symbol "getRoutes" needs to be exported by the entry point index.d.ts // src/plugins/data/public/index.ts:234:27 - (ae-forgotten-export) The symbol "formatHitProvider" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:382:20 - (ae-forgotten-export) The symbol "getRequestInspectorStats" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:382:20 - (ae-forgotten-export) The symbol "getResponseInspectorStats" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:382:20 - (ae-forgotten-export) The symbol "tabifyAggResponse" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:382:20 - (ae-forgotten-export) The symbol "tabifyGetColumns" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:387:1 - (ae-forgotten-export) The symbol "CidrMask" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:388:1 - (ae-forgotten-export) The symbol "convertDateRangeToString" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:390:1 - (ae-forgotten-export) The symbol "dateHistogramInterval" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:399:1 - (ae-forgotten-export) The symbol "InvalidEsCalendarIntervalError" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:400:1 - (ae-forgotten-export) The symbol "InvalidEsIntervalFormatError" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:401:1 - (ae-forgotten-export) The symbol "isDateHistogramBucketAggConfig" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:404:1 - (ae-forgotten-export) The symbol "isValidEsInterval" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:405:1 - (ae-forgotten-export) The symbol "isValidInterval" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:408:1 - (ae-forgotten-export) The symbol "parseInterval" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:409:1 - (ae-forgotten-export) The symbol "propFilter" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:412:1 - (ae-forgotten-export) The symbol "toAbsoluteDates" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:383:20 - (ae-forgotten-export) The symbol "getRequestInspectorStats" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:383:20 - (ae-forgotten-export) The symbol "getResponseInspectorStats" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:383:20 - (ae-forgotten-export) The symbol "tabifyAggResponse" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:383:20 - (ae-forgotten-export) The symbol "tabifyGetColumns" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:388:1 - (ae-forgotten-export) The symbol "CidrMask" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:389:1 - (ae-forgotten-export) The symbol "convertDateRangeToString" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:391:1 - (ae-forgotten-export) The symbol "dateHistogramInterval" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:400:1 - (ae-forgotten-export) The symbol "InvalidEsCalendarIntervalError" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:401:1 - (ae-forgotten-export) The symbol "InvalidEsIntervalFormatError" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:402:1 - (ae-forgotten-export) The symbol "isDateHistogramBucketAggConfig" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:406:1 - (ae-forgotten-export) The symbol "isValidEsInterval" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:407:1 - (ae-forgotten-export) The symbol "isValidInterval" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:410:1 - (ae-forgotten-export) The symbol "parseInterval" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:411:1 - (ae-forgotten-export) The symbol "propFilter" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:414:1 - (ae-forgotten-export) The symbol "toAbsoluteDates" needs to be exported by the entry point index.d.ts // src/plugins/data/public/query/state_sync/connect_to_query_state.ts:33:33 - (ae-forgotten-export) The symbol "FilterStateStore" needs to be exported by the entry point index.d.ts // src/plugins/data/public/query/state_sync/connect_to_query_state.ts:37:1 - (ae-forgotten-export) The symbol "QueryStateChange" needs to be exported by the entry point index.d.ts // src/plugins/data/public/types.ts:52:5 - (ae-forgotten-export) The symbol "createFiltersFromEvent" needs to be exported by the entry point index.d.ts diff --git a/src/plugins/data/public/search/aggs/buckets/migrate_include_exclude_format.ts b/src/plugins/data/public/search/aggs/buckets/migrate_include_exclude_format.ts index 0beeb1c372275..116f8cfad60f6 100644 --- a/src/plugins/data/public/search/aggs/buckets/migrate_include_exclude_format.ts +++ b/src/plugins/data/public/search/aggs/buckets/migrate_include_exclude_format.ts @@ -21,20 +21,22 @@ import { isString, isObject } from 'lodash'; import { IBucketAggConfig, BucketAggType, BucketAggParam } from './bucket_agg_type'; import { IAggConfig } from '../agg_config'; -export const isType = (type: string) => { +export const isType = (...types: string[]) => { return (agg: IAggConfig): boolean => { const field = agg.params.field; - return field && field.type === type; + return types.some(type => field && field.type === type); }; }; +export const isNumberType = isType('number'); export const isStringType = isType('string'); +export const isStringOrNumberType = isType('string', 'number'); export const migrateIncludeExcludeFormat = { serialize(this: BucketAggParam, value: any, agg: IBucketAggConfig) { if (this.shouldShow && !this.shouldShow(agg)) return; - if (!value || isString(value)) return value; + if (!value || isString(value) || Array.isArray(value)) return value; else return value.pattern; }, write( @@ -44,7 +46,12 @@ export const migrateIncludeExcludeFormat = { ) { const value = aggConfig.getParam(this.name); - if (isObject(value)) { + if (Array.isArray(value) && value.length > 0 && isNumberType(aggConfig)) { + const parsedValue = value.filter((val): val is number => Number.isFinite(val)); + if (parsedValue.length) { + output.params[this.name] = parsedValue; + } + } else if (isObject(value)) { output.params[this.name] = value.pattern; } else if (value && isStringType(aggConfig)) { output.params[this.name] = value; diff --git a/src/plugins/data/public/search/aggs/buckets/terms.test.ts b/src/plugins/data/public/search/aggs/buckets/terms.test.ts index 0dc052bd1fdf6..9769efb6da749 100644 --- a/src/plugins/data/public/search/aggs/buckets/terms.test.ts +++ b/src/plugins/data/public/search/aggs/buckets/terms.test.ts @@ -75,5 +75,65 @@ describe('Terms Agg', () => { expect(params.include).toBe('404'); expect(params.exclude).toBe('400'); }); + + test('accepts string from string field type and writes this value', () => { + const aggConfigs = getAggConfigs({ + include: 'include value', + exclude: 'exclude value', + field: { + name: 'string_field', + type: 'string', + }, + orderAgg: { + type: 'count', + }, + }); + + const { [BUCKET_TYPES.TERMS]: params } = aggConfigs.aggs[0].toDsl(); + + expect(params.field).toBe('string_field'); + expect(params.include).toBe('include value'); + expect(params.exclude).toBe('exclude value'); + }); + + test('accepts empty array from number field type and does not write a value', () => { + const aggConfigs = getAggConfigs({ + include: [], + exclude: [], + field: { + name: 'empty_number_field', + type: 'number', + }, + orderAgg: { + type: 'count', + }, + }); + + const { [BUCKET_TYPES.TERMS]: params } = aggConfigs.aggs[0].toDsl(); + + expect(params.field).toBe('empty_number_field'); + expect(params.include).toBe(undefined); + expect(params.exclude).toBe(undefined); + }); + + test('filters array with empty strings from number field type and writes only numbers', () => { + const aggConfigs = getAggConfigs({ + include: [1.1, 2, '', 3.33, ''], + exclude: ['', 4, 5.555, '', 6], + field: { + name: 'number_field', + type: 'number', + }, + orderAgg: { + type: 'count', + }, + }); + + const { [BUCKET_TYPES.TERMS]: params } = aggConfigs.aggs[0].toDsl(); + + expect(params.field).toBe('number_field'); + expect(params.include).toStrictEqual([1.1, 2, 3.33]); + expect(params.exclude).toStrictEqual([4, 5.555, 6]); + }); }); }); diff --git a/src/plugins/data/public/search/aggs/buckets/terms.ts b/src/plugins/data/public/search/aggs/buckets/terms.ts index 5baa38af0e8d6..698e0dfb1d340 100644 --- a/src/plugins/data/public/search/aggs/buckets/terms.ts +++ b/src/plugins/data/public/search/aggs/buckets/terms.ts @@ -22,7 +22,10 @@ import { i18n } from '@kbn/i18n'; import { BucketAggType, IBucketAggConfig } from './bucket_agg_type'; import { BUCKET_TYPES } from './bucket_agg_types'; import { createFilterTerms } from './create_filter/terms'; -import { isStringType, migrateIncludeExcludeFormat } from './migrate_include_exclude_format'; +import { + isStringOrNumberType, + migrateIncludeExcludeFormat, +} from './migrate_include_exclude_format'; import { IAggConfigs } from '../agg_configs'; import { Adapters } from '../../../../../inspector/public'; @@ -266,7 +269,7 @@ export const getTermsBucketAgg = ({ getInternalStartServices }: TermsBucketAggDe }), type: 'string', advanced: true, - shouldShow: isStringType, + shouldShow: isStringOrNumberType, ...migrateIncludeExcludeFormat, }, { @@ -276,7 +279,7 @@ export const getTermsBucketAgg = ({ getInternalStartServices }: TermsBucketAggDe }), type: 'string', advanced: true, - shouldShow: isStringType, + shouldShow: isStringOrNumberType, ...migrateIncludeExcludeFormat, }, ], diff --git a/src/plugins/vis_default_editor/public/components/agg_params_map.ts b/src/plugins/vis_default_editor/public/components/agg_params_map.ts index 5af3cfc5b0928..9bc3146b9903b 100644 --- a/src/plugins/vis_default_editor/public/components/agg_params_map.ts +++ b/src/plugins/vis_default_editor/public/components/agg_params_map.ts @@ -58,6 +58,8 @@ const buckets = { size: controls.SizeParamEditor, }, [BUCKET_TYPES.TERMS]: { + include: controls.IncludeExcludeParamEditor, + exclude: controls.IncludeExcludeParamEditor, orderBy: controls.OrderByParamEditor, orderAgg: controls.OrderAggParamEditor, order: wrapWithInlineComp(controls.OrderParamEditor), diff --git a/src/plugins/vis_default_editor/public/components/controls/components/number_list/utils.ts b/src/plugins/vis_default_editor/public/components/controls/components/number_list/utils.ts index dac86249ebbb9..5cb594ade8dba 100644 --- a/src/plugins/vis_default_editor/public/components/controls/components/number_list/utils.ts +++ b/src/plugins/vis_default_editor/public/components/controls/components/number_list/utils.ts @@ -119,7 +119,7 @@ function getNextModel(list: NumberRowModel[], range: NumberListRange): NumberRow }; } -function getInitModelList(list: Array): NumberRowModel[] { +function getInitModelList(list: Array): NumberRowModel[] { return list.length ? list.map(num => ({ value: (num === undefined ? EMPTY_STRING : num) as NumberRowModel['value'], diff --git a/src/plugins/vis_default_editor/public/components/controls/components/simple_number_list.tsx b/src/plugins/vis_default_editor/public/components/controls/components/simple_number_list.tsx new file mode 100644 index 0000000000000..becf8e47ef573 --- /dev/null +++ b/src/plugins/vis_default_editor/public/components/controls/components/simple_number_list.tsx @@ -0,0 +1,140 @@ +/* + * 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 React, { Fragment, useCallback, useEffect, useMemo, useState } from 'react'; +import { isArray } from 'lodash'; +import { EuiButtonEmpty, EuiFlexItem, EuiFormRow, EuiSpacer, htmlIdGenerator } from '@elastic/eui'; +import { FormattedMessage } from '@kbn/i18n/react'; +import { EMPTY_STRING, getInitModelList, getRange, parse } from './number_list/utils'; +import { NumberRow, NumberRowModel } from './number_list/number_row'; +import { AggParamEditorProps } from '../../agg_param_props'; + +const generateId = htmlIdGenerator(); + +function SimpleNumberList({ + agg, + aggParam, + value, + setValue, + setTouched, +}: AggParamEditorProps>) { + const [numbers, setNumbers] = useState( + getInitModelList(value && isArray(value) ? value : [EMPTY_STRING]) + ); + const numberRange = useMemo(() => getRange('[-Infinity,Infinity]'), []); + + // This useEffect is needed to discard changes, it sets numbers a mapped value if they are different + useEffect(() => { + if ( + isArray(value) && + (value.length !== numbers.length || + !value.every((numberValue, index) => numberValue === numbers[index].value)) + ) { + setNumbers( + value.map(numberValue => ({ + id: generateId(), + value: numberValue, + isInvalid: false, + })) + ); + } + }, [numbers, value]); + + const onUpdate = useCallback( + (numberList: NumberRowModel[]) => { + setNumbers(numberList); + setValue(numberList.map(({ value: numberValue }) => numberValue)); + }, + [setValue] + ); + + const onChangeValue = useCallback( + (numberField: { id: string; value: string }) => { + onUpdate( + numbers.map(number => + number.id === numberField.id + ? { + id: numberField.id, + value: parse(numberField.value), + isInvalid: false, + } + : number + ) + ); + }, + [numbers, onUpdate] + ); + + // Add an item to the end of the list + const onAdd = useCallback(() => { + const newArray = [ + ...numbers, + { + id: generateId(), + value: EMPTY_STRING as '', + isInvalid: false, + }, + ]; + onUpdate(newArray); + }, [numbers, onUpdate]); + + const onDelete = useCallback( + (id: string) => onUpdate(numbers.filter(number => number.id !== id)), + [numbers, onUpdate] + ); + + return ( + + <> + {numbers.map((number, arrayIndex) => ( + + + {numbers.length - 1 !== arrayIndex && } + + ))} + + + + + + + + + ); +} + +export { SimpleNumberList }; diff --git a/src/plugins/vis_default_editor/public/components/controls/include_exclude.tsx b/src/plugins/vis_default_editor/public/components/controls/include_exclude.tsx new file mode 100644 index 0000000000000..f60f6ce7ce249 --- /dev/null +++ b/src/plugins/vis_default_editor/public/components/controls/include_exclude.tsx @@ -0,0 +1,49 @@ +/* + * 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 React, { useEffect } from 'react'; +import { AggParamEditorProps } from '../agg_param_props'; +import { StringParamEditor } from './string'; +import { search } from '../../../../data/public'; +import { SimpleNumberList } from './components/simple_number_list'; +const { isNumberType } = search.aggs; + +export function IncludeExcludeParamEditor(props: AggParamEditorProps>) { + const { agg, value, setValue } = props; + const isAggOfNumberType = isNumberType(agg); + + // This useEffect converts value from string type to number and back when the field type is changed + useEffect(() => { + if (isAggOfNumberType && !Array.isArray(value) && value !== undefined) { + const numberArray = value + .split('|') + .map(item => parseFloat(item)) + .filter(number => Number.isFinite(number)); + setValue(numberArray.length ? numberArray : ['']); + } else if (!isAggOfNumberType && Array.isArray(value) && value !== undefined) { + setValue(value.filter(item => item !== '').join('|')); + } + }, [isAggOfNumberType, setValue, value]); + + return isAggOfNumberType ? ( + } /> + ) : ( + + ); +} diff --git a/src/plugins/vis_default_editor/public/components/controls/index.ts b/src/plugins/vis_default_editor/public/components/controls/index.ts index e8944aa667853..cfb236e5e22e3 100644 --- a/src/plugins/vis_default_editor/public/components/controls/index.ts +++ b/src/plugins/vis_default_editor/public/components/controls/index.ts @@ -24,6 +24,7 @@ export { ExtendedBoundsParamEditor } from './extended_bounds'; export { FieldParamEditor } from './field'; export { FiltersParamEditor } from './filters'; export { HasExtendedBoundsParamEditor } from './has_extended_bounds'; +export { IncludeExcludeParamEditor } from './include_exclude'; export { IpRangesParamEditor } from './ip_ranges'; export { IpRangeTypeParamEditor } from './ip_range_type'; export { IsFilteredByCollarParamEditor } from './is_filtered_by_collar'; From 2f363ba14482d2734be8ff65c7813abb0dfb69cb Mon Sep 17 00:00:00 2001 From: Matthias Wilhelm Date: Tue, 21 Apr 2020 09:49:48 +0200 Subject: [PATCH 04/67] Migrate vis_type_table to kibana/new platform (#63105) * Move vis_type_table to Kibana Platform * Adapt mocha tests * Adapt CODEOWNERS * Adapt SCSS --- .github/CODEOWNERS | 1 + .i18nrc.json | 2 +- .../__tests__/vis_type_table}/agg_table.js | 16 ++- .../vis_type_table}/agg_table_group.js | 15 ++- .../__tests__/vis_type_table}/legacy.ts | 18 +-- .../vis_type_table}/tabified_data.js | 0 .../core_plugins/vis_type_table/index.ts | 44 ------- .../core_plugins/vis_type_table/package.json | 4 - .../public/agg_table/_index.scss | 1 - .../public/paginated_table/_index.scss | 1 - .../vis_type_table/public/table_vis_type.ts | 98 ---------------- .../vis_type_table/public/vis_controller.ts | 104 ----------------- .../public/angular/angular_config.tsx | 6 +- .../vis_type_table/config.ts} | 8 +- src/plugins/vis_type_table/kibana.json | 11 ++ .../__snapshots__/table_vis_fn.test.ts.snap | 0 .../vis_type_table/public/_table_vis.scss | 0 .../public/agg_table/_agg_table.scss | 0 .../public/agg_table/_index.scss | 1 + .../public/agg_table/agg_table.html | 0 .../public/agg_table/agg_table.js | 4 +- .../public/agg_table/agg_table_group.html | 0 .../public/agg_table/agg_table_group.js | 0 .../public/components/table_vis_options.tsx | 8 +- .../vis_type_table/public/components/utils.ts | 0 .../public/get_inner_angular.ts | 8 +- .../vis_type_table/public/index.scss | 6 +- .../vis_type_table/public/index.ts | 4 +- .../public/paginated_table/_index.scss | 1 + .../paginated_table/_table_cell_filter.scss | 0 .../paginated_table/paginated_table.html | 0 .../public/paginated_table/paginated_table.js | 0 .../paginated_table/paginated_table.test.ts | 11 +- .../public/paginated_table/rows.js | 0 .../paginated_table/table_cell_filter.html | 0 .../vis_type_table/public/plugin.ts | 17 +-- .../vis_type_table/public/services.ts | 4 +- .../vis_type_table/public/table_vis.html | 0 .../public/table_vis_controller.js | 0 .../public/table_vis_controller.test.ts | 31 +++-- .../public/table_vis_fn.test.ts | 2 +- .../vis_type_table/public/table_vis_fn.ts | 6 +- .../public/table_vis_legacy_module.ts | 0 .../public/table_vis_response_handler.ts | 0 .../vis_type_table/public/table_vis_type.ts | 100 ++++++++++++++++ .../vis_type_table/public/types.ts | 2 +- .../vis_type_table/public/vis_controller.ts | 109 ++++++++++++++++++ src/plugins/vis_type_table/server/index.ts | 34 ++++++ 48 files changed, 354 insertions(+), 323 deletions(-) rename src/legacy/core_plugins/{vis_type_table/public/agg_table/__tests__ => kibana/public/__tests__/vis_type_table}/agg_table.js (94%) rename src/legacy/core_plugins/{vis_type_table/public/agg_table/__tests__ => kibana/public/__tests__/vis_type_table}/agg_table_group.js (81%) rename src/legacy/core_plugins/{vis_type_table/public => kibana/public/__tests__/vis_type_table}/legacy.ts (69%) rename src/legacy/core_plugins/{vis_type_table/public/agg_table/__tests__ => kibana/public/__tests__/vis_type_table}/tabified_data.js (100%) delete mode 100644 src/legacy/core_plugins/vis_type_table/index.ts delete mode 100644 src/legacy/core_plugins/vis_type_table/package.json delete mode 100644 src/legacy/core_plugins/vis_type_table/public/agg_table/_index.scss delete mode 100644 src/legacy/core_plugins/vis_type_table/public/paginated_table/_index.scss delete mode 100644 src/legacy/core_plugins/vis_type_table/public/table_vis_type.ts delete mode 100644 src/legacy/core_plugins/vis_type_table/public/vis_controller.ts rename src/{legacy/core_plugins/vis_type_table/public/legacy_imports.ts => plugins/vis_type_table/config.ts} (79%) create mode 100644 src/plugins/vis_type_table/kibana.json rename src/{legacy/core_plugins => plugins}/vis_type_table/public/__snapshots__/table_vis_fn.test.ts.snap (100%) rename src/{legacy/core_plugins => plugins}/vis_type_table/public/_table_vis.scss (100%) rename src/{legacy/core_plugins => plugins}/vis_type_table/public/agg_table/_agg_table.scss (100%) create mode 100644 src/plugins/vis_type_table/public/agg_table/_index.scss rename src/{legacy/core_plugins => plugins}/vis_type_table/public/agg_table/agg_table.html (100%) rename src/{legacy/core_plugins => plugins}/vis_type_table/public/agg_table/agg_table.js (98%) rename src/{legacy/core_plugins => plugins}/vis_type_table/public/agg_table/agg_table_group.html (100%) rename src/{legacy/core_plugins => plugins}/vis_type_table/public/agg_table/agg_table_group.js (100%) rename src/{legacy/core_plugins => plugins}/vis_type_table/public/components/table_vis_options.tsx (96%) rename src/{legacy/core_plugins => plugins}/vis_type_table/public/components/utils.ts (100%) rename src/{legacy/core_plugins => plugins}/vis_type_table/public/get_inner_angular.ts (91%) rename src/{legacy/core_plugins => plugins}/vis_type_table/public/index.scss (61%) rename src/{legacy/core_plugins => plugins}/vis_type_table/public/index.ts (92%) create mode 100644 src/plugins/vis_type_table/public/paginated_table/_index.scss rename src/{legacy/core_plugins => plugins}/vis_type_table/public/paginated_table/_table_cell_filter.scss (100%) rename src/{legacy/core_plugins => plugins}/vis_type_table/public/paginated_table/paginated_table.html (100%) rename src/{legacy/core_plugins => plugins}/vis_type_table/public/paginated_table/paginated_table.js (100%) rename src/{legacy/core_plugins => plugins}/vis_type_table/public/paginated_table/paginated_table.test.ts (98%) rename src/{legacy/core_plugins => plugins}/vis_type_table/public/paginated_table/rows.js (100%) rename src/{legacy/core_plugins => plugins}/vis_type_table/public/paginated_table/table_cell_filter.html (100%) rename src/{legacy/core_plugins => plugins}/vis_type_table/public/plugin.ts (80%) rename src/{legacy/core_plugins => plugins}/vis_type_table/public/services.ts (86%) rename src/{legacy/core_plugins => plugins}/vis_type_table/public/table_vis.html (100%) rename src/{legacy/core_plugins => plugins}/vis_type_table/public/table_vis_controller.js (100%) rename src/{legacy/core_plugins => plugins}/vis_type_table/public/table_vis_controller.test.ts (89%) rename src/{legacy/core_plugins => plugins}/vis_type_table/public/table_vis_fn.test.ts (95%) rename src/{legacy/core_plugins => plugins}/vis_type_table/public/table_vis_fn.ts (94%) rename src/{legacy/core_plugins => plugins}/vis_type_table/public/table_vis_legacy_module.ts (100%) rename src/{legacy/core_plugins => plugins}/vis_type_table/public/table_vis_response_handler.ts (100%) create mode 100644 src/plugins/vis_type_table/public/table_vis_type.ts rename src/{legacy/core_plugins => plugins}/vis_type_table/public/types.ts (94%) create mode 100644 src/plugins/vis_type_table/public/vis_controller.ts create mode 100644 src/plugins/vis_type_table/server/index.ts diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index ab05b32ab063e..c32bf8cbaa1c3 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -13,6 +13,7 @@ /src/legacy/core_plugins/kibana/public/dev_tools/ @elastic/kibana-app /src/legacy/core_plugins/vis_type_vislib/ @elastic/kibana-app /src/plugins/vis_type_xy/ @elastic/kibana-app +/src/plugins/vis_type_table/ @elastic/kibana-app /src/plugins/kibana_legacy/ @elastic/kibana-app /src/plugins/vis_type_timelion/ @elastic/kibana-app /src/plugins/dashboard/ @elastic/kibana-app diff --git a/.i18nrc.json b/.i18nrc.json index 4a516f23ebf05..d4286a7bd50e0 100644 --- a/.i18nrc.json +++ b/.i18nrc.json @@ -48,7 +48,7 @@ "visDefaultEditor": "src/plugins/vis_default_editor", "visTypeMarkdown": "src/plugins/vis_type_markdown", "visTypeMetric": "src/plugins/vis_type_metric", - "visTypeTable": "src/legacy/core_plugins/vis_type_table", + "visTypeTable": "src/plugins/vis_type_table", "visTypeTagCloud": "src/legacy/core_plugins/vis_type_tagcloud", "visTypeTimeseries": ["src/legacy/core_plugins/vis_type_timeseries", "src/plugins/vis_type_timeseries"], "visTypeVega": "src/legacy/core_plugins/vis_type_vega", diff --git a/src/legacy/core_plugins/vis_type_table/public/agg_table/__tests__/agg_table.js b/src/legacy/core_plugins/kibana/public/__tests__/vis_type_table/agg_table.js similarity index 94% rename from src/legacy/core_plugins/vis_type_table/public/agg_table/__tests__/agg_table.js rename to src/legacy/core_plugins/kibana/public/__tests__/vis_type_table/agg_table.js index a23407a599ae2..b212ecf578dd1 100644 --- a/src/legacy/core_plugins/vis_type_table/public/agg_table/__tests__/agg_table.js +++ b/src/legacy/core_plugins/kibana/public/__tests__/vis_type_table/agg_table.js @@ -22,11 +22,18 @@ import moment from 'moment'; import ngMock from 'ng_mock'; import expect from '@kbn/expect'; import sinon from 'sinon'; -import { npStart } from '../../legacy_imports'; +import './legacy'; +// eslint-disable-next-line @kbn/eslint/no-restricted-paths +import { npStart } from 'ui/new_platform'; import { round } from 'lodash'; -import { getAngularModule } from '../../get_inner_angular'; -import { initTableVisLegacyModule } from '../../table_vis_legacy_module'; +// eslint-disable-next-line @kbn/eslint/no-restricted-paths +import { getInnerAngular } from '../../../../../../plugins/vis_type_table/public/get_inner_angular'; + +// eslint-disable-next-line @kbn/eslint/no-restricted-paths +import { initTableVisLegacyModule } from '../../../../../../plugins/vis_type_table/public/table_vis_legacy_module'; import { tabifiedData } from './tabified_data'; +// eslint-disable-next-line @kbn/eslint/no-restricted-paths +import { configureAppAngularModule } from '../../../../../../plugins/kibana_legacy/public/angular'; describe('Table Vis - AggTable Directive', function() { let $rootScope; @@ -34,7 +41,8 @@ describe('Table Vis - AggTable Directive', function() { let settings; const initLocalAngular = () => { - const tableVisModule = getAngularModule('kibana/table_vis', npStart.core); + const tableVisModule = getInnerAngular('kibana/table_vis', npStart.core); + configureAppAngularModule(tableVisModule, npStart.core, true); initTableVisLegacyModule(tableVisModule); }; diff --git a/src/legacy/core_plugins/vis_type_table/public/agg_table/__tests__/agg_table_group.js b/src/legacy/core_plugins/kibana/public/__tests__/vis_type_table/agg_table_group.js similarity index 81% rename from src/legacy/core_plugins/vis_type_table/public/agg_table/__tests__/agg_table_group.js rename to src/legacy/core_plugins/kibana/public/__tests__/vis_type_table/agg_table_group.js index 40a0993ccb017..3cd7de393d66a 100644 --- a/src/legacy/core_plugins/vis_type_table/public/agg_table/__tests__/agg_table_group.js +++ b/src/legacy/core_plugins/kibana/public/__tests__/vis_type_table/agg_table_group.js @@ -20,17 +20,24 @@ import $ from 'jquery'; import ngMock from 'ng_mock'; import expect from '@kbn/expect'; -import { npStart } from '../../legacy_imports'; -import { getAngularModule } from '../../get_inner_angular'; -import { initTableVisLegacyModule } from '../../table_vis_legacy_module'; +import './legacy'; +// eslint-disable-next-line @kbn/eslint/no-restricted-paths +import { getInnerAngular } from '../../../../../../plugins/vis_type_table/public/get_inner_angular'; +// eslint-disable-next-line @kbn/eslint/no-restricted-paths +import { initTableVisLegacyModule } from '../../../../../../plugins/vis_type_table/public/table_vis_legacy_module'; import { tabifiedData } from './tabified_data'; +// eslint-disable-next-line @kbn/eslint/no-restricted-paths +import { npStart } from 'ui/new_platform'; +// eslint-disable-next-line @kbn/eslint/no-restricted-paths +import { configureAppAngularModule } from '../../../../../../plugins/kibana_legacy/public/angular'; describe('Table Vis - AggTableGroup Directive', function() { let $rootScope; let $compile; const initLocalAngular = () => { - const tableVisModule = getAngularModule('kibana/table_vis', npStart.core); + const tableVisModule = getInnerAngular('kibana/table_vis', npStart.core); + configureAppAngularModule(tableVisModule, npStart.core, true); initTableVisLegacyModule(tableVisModule); }; diff --git a/src/legacy/core_plugins/vis_type_table/public/legacy.ts b/src/legacy/core_plugins/kibana/public/__tests__/vis_type_table/legacy.ts similarity index 69% rename from src/legacy/core_plugins/vis_type_table/public/legacy.ts rename to src/legacy/core_plugins/kibana/public/__tests__/vis_type_table/legacy.ts index 3d5f8c1b3efe9..c6467a5beae68 100644 --- a/src/legacy/core_plugins/vis_type_table/public/legacy.ts +++ b/src/legacy/core_plugins/kibana/public/__tests__/vis_type_table/legacy.ts @@ -16,19 +16,23 @@ * specific language governing permissions and limitations * under the License. */ - import { PluginInitializerContext } from 'kibana/public'; -import { npSetup, npStart } from './legacy_imports'; -import { plugin } from '.'; - -import { TablePluginSetupDependencies } from './plugin'; +// eslint-disable-next-line @kbn/eslint/no-restricted-paths +import { npStart, npSetup } from 'ui/new_platform'; +import { + TableVisPlugin, + TablePluginSetupDependencies, + // eslint-disable-next-line @kbn/eslint/no-restricted-paths +} from '../../../../../../plugins/vis_type_table/public/plugin'; const plugins: Readonly = { expressions: npSetup.plugins.expressions, visualizations: npSetup.plugins.visualizations, }; -const pluginInstance = plugin({} as PluginInitializerContext); +const pluginInstance = new TableVisPlugin({} as PluginInitializerContext); export const setup = pluginInstance.setup(npSetup.core, plugins); -export const start = pluginInstance.start(npStart.core, { data: npStart.plugins.data }); +export const start = pluginInstance.start(npStart.core, { + data: npStart.plugins.data, +}); diff --git a/src/legacy/core_plugins/vis_type_table/public/agg_table/__tests__/tabified_data.js b/src/legacy/core_plugins/kibana/public/__tests__/vis_type_table/tabified_data.js similarity index 100% rename from src/legacy/core_plugins/vis_type_table/public/agg_table/__tests__/tabified_data.js rename to src/legacy/core_plugins/kibana/public/__tests__/vis_type_table/tabified_data.js diff --git a/src/legacy/core_plugins/vis_type_table/index.ts b/src/legacy/core_plugins/vis_type_table/index.ts deleted file mode 100644 index 04ca9da7de32b..0000000000000 --- a/src/legacy/core_plugins/vis_type_table/index.ts +++ /dev/null @@ -1,44 +0,0 @@ -/* - * 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 { resolve } from 'path'; -import { Legacy } from 'kibana'; - -import { LegacyPluginApi, LegacyPluginInitializer } from '../../../../src/legacy/types'; - -const tableVisPluginInitializer: LegacyPluginInitializer = ({ Plugin }: LegacyPluginApi) => - new Plugin({ - id: 'table_vis', - require: ['kibana', 'elasticsearch'], - publicDir: resolve(__dirname, 'public'), - uiExports: { - styleSheetPaths: resolve(__dirname, 'public/index.scss'), - hacks: [resolve(__dirname, 'public/legacy')], - injectDefaultVars: server => ({}), - }, - init: (server: Legacy.Server) => ({}), - config(Joi: any) { - return Joi.object({ - enabled: Joi.boolean().default(true), - }).default(); - }, - } as Legacy.PluginSpecOptions); - -// eslint-disable-next-line import/no-default-export -export default tableVisPluginInitializer; diff --git a/src/legacy/core_plugins/vis_type_table/package.json b/src/legacy/core_plugins/vis_type_table/package.json deleted file mode 100644 index 2809b0e047836..0000000000000 --- a/src/legacy/core_plugins/vis_type_table/package.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "name": "table_vis", - "version": "kibana" -} diff --git a/src/legacy/core_plugins/vis_type_table/public/agg_table/_index.scss b/src/legacy/core_plugins/vis_type_table/public/agg_table/_index.scss deleted file mode 100644 index b19d4a887a7f3..0000000000000 --- a/src/legacy/core_plugins/vis_type_table/public/agg_table/_index.scss +++ /dev/null @@ -1 +0,0 @@ -@import 'agg_table'; diff --git a/src/legacy/core_plugins/vis_type_table/public/paginated_table/_index.scss b/src/legacy/core_plugins/vis_type_table/public/paginated_table/_index.scss deleted file mode 100644 index 9473b847d3c2b..0000000000000 --- a/src/legacy/core_plugins/vis_type_table/public/paginated_table/_index.scss +++ /dev/null @@ -1 +0,0 @@ -@import './table_cell_filter'; diff --git a/src/legacy/core_plugins/vis_type_table/public/table_vis_type.ts b/src/legacy/core_plugins/vis_type_table/public/table_vis_type.ts deleted file mode 100644 index 43816121bc23b..0000000000000 --- a/src/legacy/core_plugins/vis_type_table/public/table_vis_type.ts +++ /dev/null @@ -1,98 +0,0 @@ -/* - * 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 { i18n } from '@kbn/i18n'; -import { AggGroupNames } from '../../../../plugins/data/public'; -import { Schemas } from '../../../../plugins/vis_default_editor/public'; -import { Vis } from '../../../../plugins/visualizations/public'; -import { tableVisResponseHandler } from './table_vis_response_handler'; -// @ts-ignore -import tableVisTemplate from './table_vis.html'; -import { TableOptions } from './components/table_vis_options'; -import { TableVisualizationController } from './vis_controller'; - -export const tableVisTypeDefinition = { - type: 'table', - name: 'table', - title: i18n.translate('visTypeTable.tableVisTitle', { - defaultMessage: 'Data Table', - }), - icon: 'visTable', - description: i18n.translate('visTypeTable.tableVisDescription', { - defaultMessage: 'Display values in a table', - }), - visualization: TableVisualizationController, - visConfig: { - defaults: { - perPage: 10, - showPartialRows: false, - showMetricsAtAllLevels: false, - sort: { - columnIndex: null, - direction: null, - }, - showTotal: false, - totalFunc: 'sum', - percentageCol: '', - }, - template: tableVisTemplate, - }, - editorConfig: { - optionsTemplate: TableOptions, - schemas: new Schemas([ - { - group: AggGroupNames.Metrics, - name: 'metric', - title: i18n.translate('visTypeTable.tableVisEditorConfig.schemas.metricTitle', { - defaultMessage: 'Metric', - }), - aggFilter: ['!geo_centroid', '!geo_bounds'], - aggSettings: { - top_hits: { - allowStrings: true, - }, - }, - min: 1, - defaults: [{ type: 'count', schema: 'metric' }], - }, - { - group: AggGroupNames.Buckets, - name: 'bucket', - title: i18n.translate('visTypeTable.tableVisEditorConfig.schemas.bucketTitle', { - defaultMessage: 'Split rows', - }), - aggFilter: ['!filter'], - }, - { - group: AggGroupNames.Buckets, - name: 'split', - title: i18n.translate('visTypeTable.tableVisEditorConfig.schemas.splitTitle', { - defaultMessage: 'Split table', - }), - min: 0, - max: 1, - aggFilter: ['!filter'], - }, - ]), - }, - responseHandler: tableVisResponseHandler, - hierarchicalData: (vis: Vis) => { - return Boolean(vis.params.showPartialRows || vis.params.showMetricsAtAllLevels); - }, -}; diff --git a/src/legacy/core_plugins/vis_type_table/public/vis_controller.ts b/src/legacy/core_plugins/vis_type_table/public/vis_controller.ts deleted file mode 100644 index 5bb730d2f9b10..0000000000000 --- a/src/legacy/core_plugins/vis_type_table/public/vis_controller.ts +++ /dev/null @@ -1,104 +0,0 @@ -/* - * 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 angular, { IModule, auto, IRootScopeService, IScope, ICompileService } from 'angular'; -import $ from 'jquery'; - -import { VisParams, ExprVis } from '../../../../plugins/visualizations/public'; -import { npStart } from './legacy_imports'; -import { getAngularModule } from './get_inner_angular'; -import { initTableVisLegacyModule } from './table_vis_legacy_module'; - -const innerAngularName = 'kibana/table_vis'; - -export class TableVisualizationController { - private tableVisModule: IModule | undefined; - private injector: auto.IInjectorService | undefined; - el: JQuery; - vis: ExprVis; - $rootScope: IRootScopeService | null = null; - $scope: (IScope & { [key: string]: any }) | undefined; - $compile: ICompileService | undefined; - - constructor(domeElement: Element, vis: ExprVis) { - this.el = $(domeElement); - this.vis = vis; - } - - getInjector() { - if (!this.injector) { - const mountpoint = document.createElement('div'); - mountpoint.setAttribute('style', 'height: 100%; width: 100%;'); - this.injector = angular.bootstrap(mountpoint, [innerAngularName]); - this.el.append(mountpoint); - } - - return this.injector; - } - - initLocalAngular() { - if (!this.tableVisModule) { - this.tableVisModule = getAngularModule(innerAngularName, npStart.core); - initTableVisLegacyModule(this.tableVisModule); - } - } - - async render(esResponse: object, visParams: VisParams) { - this.initLocalAngular(); - - return new Promise(async (resolve, reject) => { - if (!this.$rootScope) { - const $injector = this.getInjector(); - this.$rootScope = $injector.get('$rootScope'); - this.$compile = $injector.get('$compile'); - } - const updateScope = () => { - if (!this.$scope) { - return; - } - this.$scope.vis = this.vis; - this.$scope.visState = { params: visParams }; - this.$scope.esResponse = esResponse; - - this.$scope.visParams = visParams; - this.$scope.renderComplete = resolve; - this.$scope.renderFailed = reject; - this.$scope.resize = Date.now(); - this.$scope.$apply(); - }; - - if (!this.$scope && this.$compile) { - this.$scope = this.$rootScope.$new(); - this.$scope.uiState = this.vis.getUiState(); - updateScope(); - this.el.find('div').append(this.$compile(this.vis.type!.visConfig.template)(this.$scope)); - this.$scope.$apply(); - } else { - updateScope(); - } - }); - } - - destroy() { - if (this.$rootScope) { - this.$rootScope.$destroy(); - this.$rootScope = null; - } - } -} diff --git a/src/plugins/kibana_legacy/public/angular/angular_config.tsx b/src/plugins/kibana_legacy/public/angular/angular_config.tsx index 71cd57ef2d72e..295cf27688c80 100644 --- a/src/plugins/kibana_legacy/public/angular/angular_config.tsx +++ b/src/plugins/kibana_legacy/public/angular/angular_config.tsx @@ -92,9 +92,9 @@ export const configureAppAngularModule = ( ) => { const core = 'core' in newPlatform ? newPlatform.core : newPlatform; const packageInfo = - 'injectedMetadata' in newPlatform - ? newPlatform.injectedMetadata.getLegacyMetadata() - : newPlatform.env.packageInfo; + 'env' in newPlatform + ? newPlatform.env.packageInfo + : newPlatform.injectedMetadata.getLegacyMetadata(); if ('injectedMetadata' in newPlatform) { forOwn(newPlatform.injectedMetadata.getInjectedVars(), (val, name) => { diff --git a/src/legacy/core_plugins/vis_type_table/public/legacy_imports.ts b/src/plugins/vis_type_table/config.ts similarity index 79% rename from src/legacy/core_plugins/vis_type_table/public/legacy_imports.ts rename to src/plugins/vis_type_table/config.ts index 1030e971d6450..6749bd83de39f 100644 --- a/src/legacy/core_plugins/vis_type_table/public/legacy_imports.ts +++ b/src/plugins/vis_type_table/config.ts @@ -17,4 +17,10 @@ * under the License. */ -export { npSetup, npStart } from 'ui/new_platform'; +import { schema, TypeOf } from '@kbn/config-schema'; + +export const configSchema = schema.object({ + enabled: schema.boolean({ defaultValue: true }), +}); + +export type ConfigSchema = TypeOf; diff --git a/src/plugins/vis_type_table/kibana.json b/src/plugins/vis_type_table/kibana.json new file mode 100644 index 0000000000000..bb0f6478a4240 --- /dev/null +++ b/src/plugins/vis_type_table/kibana.json @@ -0,0 +1,11 @@ +{ + "id": "visTypeTable", + "version": "kibana", + "server": true, + "ui": true, + "requiredPlugins": [ + "expressions", + "visualizations", + "data" + ] +} diff --git a/src/legacy/core_plugins/vis_type_table/public/__snapshots__/table_vis_fn.test.ts.snap b/src/plugins/vis_type_table/public/__snapshots__/table_vis_fn.test.ts.snap similarity index 100% rename from src/legacy/core_plugins/vis_type_table/public/__snapshots__/table_vis_fn.test.ts.snap rename to src/plugins/vis_type_table/public/__snapshots__/table_vis_fn.test.ts.snap diff --git a/src/legacy/core_plugins/vis_type_table/public/_table_vis.scss b/src/plugins/vis_type_table/public/_table_vis.scss similarity index 100% rename from src/legacy/core_plugins/vis_type_table/public/_table_vis.scss rename to src/plugins/vis_type_table/public/_table_vis.scss diff --git a/src/legacy/core_plugins/vis_type_table/public/agg_table/_agg_table.scss b/src/plugins/vis_type_table/public/agg_table/_agg_table.scss similarity index 100% rename from src/legacy/core_plugins/vis_type_table/public/agg_table/_agg_table.scss rename to src/plugins/vis_type_table/public/agg_table/_agg_table.scss diff --git a/src/plugins/vis_type_table/public/agg_table/_index.scss b/src/plugins/vis_type_table/public/agg_table/_index.scss new file mode 100644 index 0000000000000..340e08a76f1bd --- /dev/null +++ b/src/plugins/vis_type_table/public/agg_table/_index.scss @@ -0,0 +1 @@ +@import './agg_table'; diff --git a/src/legacy/core_plugins/vis_type_table/public/agg_table/agg_table.html b/src/plugins/vis_type_table/public/agg_table/agg_table.html similarity index 100% rename from src/legacy/core_plugins/vis_type_table/public/agg_table/agg_table.html rename to src/plugins/vis_type_table/public/agg_table/agg_table.html diff --git a/src/legacy/core_plugins/vis_type_table/public/agg_table/agg_table.js b/src/plugins/vis_type_table/public/agg_table/agg_table.js similarity index 98% rename from src/legacy/core_plugins/vis_type_table/public/agg_table/agg_table.js rename to src/plugins/vis_type_table/public/agg_table/agg_table.js index b9e79f96e4fc1..0cd501e2d0344 100644 --- a/src/legacy/core_plugins/vis_type_table/public/agg_table/agg_table.js +++ b/src/plugins/vis_type_table/public/agg_table/agg_table.js @@ -238,9 +238,9 @@ export function KbnAggTable(config, RecursionHelper) { } /** - * @param {[]Object} columns - the formatted columns that will be displayed + * @param {Object[]} columns - the formatted columns that will be displayed * @param {String} title - the title of the column to add to - * @param {[]Object} rows - the row data for the columns + * @param {Object[]} rows - the row data for the columns * @param {Number} insertAtIndex - the index to insert the percentage column at * @returns {Object} - cols and rows for the table to render now included percentage column(s) */ diff --git a/src/legacy/core_plugins/vis_type_table/public/agg_table/agg_table_group.html b/src/plugins/vis_type_table/public/agg_table/agg_table_group.html similarity index 100% rename from src/legacy/core_plugins/vis_type_table/public/agg_table/agg_table_group.html rename to src/plugins/vis_type_table/public/agg_table/agg_table_group.html diff --git a/src/legacy/core_plugins/vis_type_table/public/agg_table/agg_table_group.js b/src/plugins/vis_type_table/public/agg_table/agg_table_group.js similarity index 100% rename from src/legacy/core_plugins/vis_type_table/public/agg_table/agg_table_group.js rename to src/plugins/vis_type_table/public/agg_table/agg_table_group.js diff --git a/src/legacy/core_plugins/vis_type_table/public/components/table_vis_options.tsx b/src/plugins/vis_type_table/public/components/table_vis_options.tsx similarity index 96% rename from src/legacy/core_plugins/vis_type_table/public/components/table_vis_options.tsx rename to src/plugins/vis_type_table/public/components/table_vis_options.tsx index 265528f33f9cd..68348d5ef1060 100644 --- a/src/legacy/core_plugins/vis_type_table/public/components/table_vis_options.tsx +++ b/src/plugins/vis_type_table/public/components/table_vis_options.tsx @@ -24,12 +24,8 @@ import { i18n } from '@kbn/i18n'; import { FormattedMessage } from '@kbn/i18n/react'; import { VisOptionsProps } from 'src/plugins/vis_default_editor/public'; -import { search } from '../../../../../plugins/data/public'; -import { - SwitchOption, - SelectOption, - NumberInputOption, -} from '../../../../../plugins/charts/public'; +import { search } from '../../../data/public'; +import { SwitchOption, SelectOption, NumberInputOption } from '../../../charts/public'; import { TableVisParams } from '../types'; import { totalAggregations } from './utils'; diff --git a/src/legacy/core_plugins/vis_type_table/public/components/utils.ts b/src/plugins/vis_type_table/public/components/utils.ts similarity index 100% rename from src/legacy/core_plugins/vis_type_table/public/components/utils.ts rename to src/plugins/vis_type_table/public/components/utils.ts diff --git a/src/legacy/core_plugins/vis_type_table/public/get_inner_angular.ts b/src/plugins/vis_type_table/public/get_inner_angular.ts similarity index 91% rename from src/legacy/core_plugins/vis_type_table/public/get_inner_angular.ts rename to src/plugins/vis_type_table/public/get_inner_angular.ts index 6208e358b4184..d69b9bba31b03 100644 --- a/src/legacy/core_plugins/vis_type_table/public/get_inner_angular.ts +++ b/src/plugins/vis_type_table/public/get_inner_angular.ts @@ -23,7 +23,7 @@ import angular from 'angular'; import 'angular-recursion'; import { i18nDirective, i18nFilter, I18nProvider } from '@kbn/i18n/angular'; -import { CoreStart, LegacyCoreStart, IUiSettingsClient } from 'kibana/public'; +import { CoreStart, IUiSettingsClient, PluginInitializerContext } from 'kibana/public'; import { initAngularBootstrap, PaginateDirectiveProvider, @@ -32,15 +32,15 @@ import { watchMultiDecorator, KbnAccessibleClickProvider, configureAppAngularModule, -} from '../../../../plugins/kibana_legacy/public'; +} from '../../kibana_legacy/public'; initAngularBootstrap(); const thirdPartyAngularDependencies = ['ngSanitize', 'ui.bootstrap', 'RecursionHelper']; -export function getAngularModule(name: string, core: CoreStart) { +export function getAngularModule(name: string, core: CoreStart, context: PluginInitializerContext) { const uiModule = getInnerAngular(name, core); - configureAppAngularModule(uiModule, core as LegacyCoreStart, true); + configureAppAngularModule(uiModule, { core, env: context.env }, true); return uiModule; } diff --git a/src/legacy/core_plugins/vis_type_table/public/index.scss b/src/plugins/vis_type_table/public/index.scss similarity index 61% rename from src/legacy/core_plugins/vis_type_table/public/index.scss rename to src/plugins/vis_type_table/public/index.scss index 54124ebc42620..0972c85e0dbe0 100644 --- a/src/legacy/core_plugins/vis_type_table/public/index.scss +++ b/src/plugins/vis_type_table/public/index.scss @@ -1,5 +1,3 @@ -@import 'src/legacy/ui/public/styles/styling_constants'; - // Prefix all styles with "tbv" to avoid conflicts. // Examples // tbvChart @@ -7,6 +5,6 @@ // tbvChart__legend--small // tbvChart__legend-isLoading -@import 'agg_table/index'; -@import 'paginated_table/index'; +@import './agg_table/index'; +@import './paginated_table/index'; @import './table_vis'; diff --git a/src/legacy/core_plugins/vis_type_table/public/index.ts b/src/plugins/vis_type_table/public/index.ts similarity index 92% rename from src/legacy/core_plugins/vis_type_table/public/index.ts rename to src/plugins/vis_type_table/public/index.ts index efbaf69659ea2..5621fdb094772 100644 --- a/src/legacy/core_plugins/vis_type_table/public/index.ts +++ b/src/plugins/vis_type_table/public/index.ts @@ -16,8 +16,8 @@ * specific language governing permissions and limitations * under the License. */ - -import { PluginInitializerContext } from '../../../../core/public'; +import './index.scss'; +import { PluginInitializerContext } from 'kibana/public'; import { TableVisPlugin as Plugin } from './plugin'; export function plugin(initializerContext: PluginInitializerContext) { diff --git a/src/plugins/vis_type_table/public/paginated_table/_index.scss b/src/plugins/vis_type_table/public/paginated_table/_index.scss new file mode 100644 index 0000000000000..23d56c09b2818 --- /dev/null +++ b/src/plugins/vis_type_table/public/paginated_table/_index.scss @@ -0,0 +1 @@ +@import './_table_cell_filter'; diff --git a/src/legacy/core_plugins/vis_type_table/public/paginated_table/_table_cell_filter.scss b/src/plugins/vis_type_table/public/paginated_table/_table_cell_filter.scss similarity index 100% rename from src/legacy/core_plugins/vis_type_table/public/paginated_table/_table_cell_filter.scss rename to src/plugins/vis_type_table/public/paginated_table/_table_cell_filter.scss diff --git a/src/legacy/core_plugins/vis_type_table/public/paginated_table/paginated_table.html b/src/plugins/vis_type_table/public/paginated_table/paginated_table.html similarity index 100% rename from src/legacy/core_plugins/vis_type_table/public/paginated_table/paginated_table.html rename to src/plugins/vis_type_table/public/paginated_table/paginated_table.html diff --git a/src/legacy/core_plugins/vis_type_table/public/paginated_table/paginated_table.js b/src/plugins/vis_type_table/public/paginated_table/paginated_table.js similarity index 100% rename from src/legacy/core_plugins/vis_type_table/public/paginated_table/paginated_table.js rename to src/plugins/vis_type_table/public/paginated_table/paginated_table.js diff --git a/src/legacy/core_plugins/vis_type_table/public/paginated_table/paginated_table.test.ts b/src/plugins/vis_type_table/public/paginated_table/paginated_table.test.ts similarity index 98% rename from src/legacy/core_plugins/vis_type_table/public/paginated_table/paginated_table.test.ts rename to src/plugins/vis_type_table/public/paginated_table/paginated_table.test.ts index 7352236f03feb..23e4aee0378dc 100644 --- a/src/legacy/core_plugins/vis_type_table/public/paginated_table/paginated_table.test.ts +++ b/src/plugins/vis_type_table/public/paginated_table/paginated_table.test.ts @@ -25,10 +25,9 @@ import 'angular-mocks'; import { getAngularModule } from '../get_inner_angular'; import { initTableVisLegacyModule } from '../table_vis_legacy_module'; -import { coreMock } from '../../../../../core/public/mocks'; +import { coreMock } from '../../../../core/public/mocks'; -jest.mock('ui/new_platform'); -jest.mock('../../../../../plugins/kibana_legacy/public/angular/angular_config', () => ({ +jest.mock('../../../kibana_legacy/public/angular/angular_config', () => ({ configureAppAngularModule: () => {}, })); @@ -73,7 +72,11 @@ describe('Table Vis - Paginated table', () => { let paginatedTable: any; const initLocalAngular = () => { - const tableVisModule = getAngularModule('kibana/table_vis', coreMock.createStart()); + const tableVisModule = getAngularModule( + 'kibana/table_vis', + coreMock.createStart(), + coreMock.createPluginInitializerContext() + ); initTableVisLegacyModule(tableVisModule); }; diff --git a/src/legacy/core_plugins/vis_type_table/public/paginated_table/rows.js b/src/plugins/vis_type_table/public/paginated_table/rows.js similarity index 100% rename from src/legacy/core_plugins/vis_type_table/public/paginated_table/rows.js rename to src/plugins/vis_type_table/public/paginated_table/rows.js diff --git a/src/legacy/core_plugins/vis_type_table/public/paginated_table/table_cell_filter.html b/src/plugins/vis_type_table/public/paginated_table/table_cell_filter.html similarity index 100% rename from src/legacy/core_plugins/vis_type_table/public/paginated_table/table_cell_filter.html rename to src/plugins/vis_type_table/public/paginated_table/table_cell_filter.html diff --git a/src/legacy/core_plugins/vis_type_table/public/plugin.ts b/src/plugins/vis_type_table/public/plugin.ts similarity index 80% rename from src/legacy/core_plugins/vis_type_table/public/plugin.ts rename to src/plugins/vis_type_table/public/plugin.ts index ea12a5320a14d..a41d939523bcc 100644 --- a/src/legacy/core_plugins/vis_type_table/public/plugin.ts +++ b/src/plugins/vis_type_table/public/plugin.ts @@ -16,14 +16,13 @@ * specific language governing permissions and limitations * under the License. */ -import { Plugin as ExpressionsPublicPlugin } from '../../../../plugins/expressions/public'; -import { VisualizationsSetup } from '../../../../plugins/visualizations/public'; - -import { PluginInitializerContext, CoreSetup, CoreStart, Plugin } from '../../../../core/public'; +import { PluginInitializerContext, CoreSetup, CoreStart, Plugin } from 'kibana/public'; +import { Plugin as ExpressionsPublicPlugin } from '../../expressions/public'; +import { VisualizationsSetup } from '../../visualizations/public'; import { createTableVisFn } from './table_vis_fn'; -import { tableVisTypeDefinition } from './table_vis_type'; -import { DataPublicPluginStart } from '../../../../plugins/data/public'; +import { getTableVisTypeDefinition } from './table_vis_type'; +import { DataPublicPluginStart } from '../../data/public'; import { setFormatService } from './services'; /** @internal */ @@ -40,6 +39,7 @@ export interface TablePluginStartDependencies { /** @internal */ export class TableVisPlugin implements Plugin, void> { initializerContext: PluginInitializerContext; + createBaseVisualization: any; constructor(initializerContext: PluginInitializerContext) { this.initializerContext = initializerContext; @@ -50,8 +50,9 @@ export class TableVisPlugin implements Plugin, void> { { expressions, visualizations }: TablePluginSetupDependencies ) { expressions.registerFunction(createTableVisFn); - - visualizations.createBaseVisualization(tableVisTypeDefinition); + visualizations.createBaseVisualization( + getTableVisTypeDefinition(core, this.initializerContext) + ); } public start(core: CoreStart, { data }: TablePluginStartDependencies) { diff --git a/src/legacy/core_plugins/vis_type_table/public/services.ts b/src/plugins/vis_type_table/public/services.ts similarity index 86% rename from src/legacy/core_plugins/vis_type_table/public/services.ts rename to src/plugins/vis_type_table/public/services.ts index b4b491ac7a555..3aaffe75e27f1 100644 --- a/src/legacy/core_plugins/vis_type_table/public/services.ts +++ b/src/plugins/vis_type_table/public/services.ts @@ -17,8 +17,8 @@ * under the License. */ -import { createGetterSetter } from '../../../../plugins/kibana_utils/public'; -import { DataPublicPluginStart } from '../../../../plugins/data/public'; +import { createGetterSetter } from '../../kibana_utils/public'; +import { DataPublicPluginStart } from '../../data/public'; export const [getFormatService, setFormatService] = createGetterSetter< DataPublicPluginStart['fieldFormats'] diff --git a/src/legacy/core_plugins/vis_type_table/public/table_vis.html b/src/plugins/vis_type_table/public/table_vis.html similarity index 100% rename from src/legacy/core_plugins/vis_type_table/public/table_vis.html rename to src/plugins/vis_type_table/public/table_vis.html diff --git a/src/legacy/core_plugins/vis_type_table/public/table_vis_controller.js b/src/plugins/vis_type_table/public/table_vis_controller.js similarity index 100% rename from src/legacy/core_plugins/vis_type_table/public/table_vis_controller.js rename to src/plugins/vis_type_table/public/table_vis_controller.js diff --git a/src/legacy/core_plugins/vis_type_table/public/table_vis_controller.test.ts b/src/plugins/vis_type_table/public/table_vis_controller.test.ts similarity index 89% rename from src/legacy/core_plugins/vis_type_table/public/table_vis_controller.test.ts rename to src/plugins/vis_type_table/public/table_vis_controller.test.ts index 8d6f88bf8dd4a..4607324ca150c 100644 --- a/src/legacy/core_plugins/vis_type_table/public/table_vis_controller.test.ts +++ b/src/plugins/vis_type_table/public/table_vis_controller.test.ts @@ -26,24 +26,23 @@ import $ from 'jquery'; import StubIndexPattern from 'test_utils/stub_index_pattern'; import { getAngularModule } from './get_inner_angular'; import { initTableVisLegacyModule } from './table_vis_legacy_module'; -import { tableVisTypeDefinition } from './table_vis_type'; -import { Vis } from '../../../../plugins/visualizations/public'; +import { getTableVisTypeDefinition } from './table_vis_type'; +import { Vis } from '../../visualizations/public'; // eslint-disable-next-line -import { stubFields } from '../../../../plugins/data/public/stubs'; +import { stubFields } from '../../data/public/stubs'; // eslint-disable-next-line import { tableVisResponseHandler } from './table_vis_response_handler'; -import { coreMock } from '../../../../core/public/mocks'; +import { coreMock } from '../../../core/public/mocks'; +import { IAggConfig, search } from '../../data/public'; +// TODO: remove linting disable // eslint-disable-next-line @kbn/eslint/no-restricted-paths -import { npStart } from './legacy_imports'; -import { IAggConfig, search } from '../../../../plugins/data/public'; +import { searchStartMock } from '../../data/public/search/mocks'; -// should be mocked once get rid of 'ui/new_platform' legacy imports -const { createAggConfigs } = npStart.plugins.data.search.aggs; +const { createAggConfigs } = searchStartMock.aggs; const { tabifyAggResponse } = search; -jest.mock('ui/new_platform'); -jest.mock('../../../../plugins/kibana_legacy/public/angular/angular_config', () => ({ +jest.mock('../../kibana_legacy/public/angular/angular_config', () => ({ configureAppAngularModule: () => {}, })); @@ -89,7 +88,11 @@ describe('Table Vis - Controller', () => { let stubIndexPattern: any; const initLocalAngular = () => { - const tableVisModule = getAngularModule('kibana/table_vis', coreMock.createStart()); + const tableVisModule = getAngularModule( + 'kibana/table_vis', + coreMock.createStart(), + coreMock.createPluginInitializerContext() + ); initTableVisLegacyModule(tableVisModule); }; @@ -110,9 +113,13 @@ describe('Table Vis - Controller', () => { (cfg: any) => cfg, 'time', stubFields, - coreMock.createStart() + coreMock.createSetup() ); }); + const tableVisTypeDefinition = getTableVisTypeDefinition( + coreMock.createSetup(), + coreMock.createPluginInitializerContext() + ); function getRangeVis(params?: object) { return ({ diff --git a/src/legacy/core_plugins/vis_type_table/public/table_vis_fn.test.ts b/src/plugins/vis_type_table/public/table_vis_fn.test.ts similarity index 95% rename from src/legacy/core_plugins/vis_type_table/public/table_vis_fn.test.ts rename to src/plugins/vis_type_table/public/table_vis_fn.test.ts index 36392c10f93f3..9accf8950d910 100644 --- a/src/legacy/core_plugins/vis_type_table/public/table_vis_fn.test.ts +++ b/src/plugins/vis_type_table/public/table_vis_fn.test.ts @@ -21,7 +21,7 @@ import { createTableVisFn } from './table_vis_fn'; import { tableVisResponseHandler } from './table_vis_response_handler'; // eslint-disable-next-line -import { functionWrapper } from '../../../../plugins/expressions/common/expression_functions/specs/tests/utils'; +import { functionWrapper } from '../../expressions/common/expression_functions/specs/tests/utils'; jest.mock('./table_vis_response_handler', () => ({ tableVisResponseHandler: jest.fn().mockReturnValue({ diff --git a/src/legacy/core_plugins/vis_type_table/public/table_vis_fn.ts b/src/plugins/vis_type_table/public/table_vis_fn.ts similarity index 94% rename from src/legacy/core_plugins/vis_type_table/public/table_vis_fn.ts rename to src/plugins/vis_type_table/public/table_vis_fn.ts index a97e596e89754..9739a7a284e6c 100644 --- a/src/legacy/core_plugins/vis_type_table/public/table_vis_fn.ts +++ b/src/plugins/vis_type_table/public/table_vis_fn.ts @@ -19,11 +19,7 @@ import { i18n } from '@kbn/i18n'; import { tableVisResponseHandler, TableContext } from './table_vis_response_handler'; -import { - ExpressionFunctionDefinition, - KibanaDatatable, - Render, -} from '../../../../plugins/expressions/public'; +import { ExpressionFunctionDefinition, KibanaDatatable, Render } from '../../expressions/public'; export type Input = KibanaDatatable; diff --git a/src/legacy/core_plugins/vis_type_table/public/table_vis_legacy_module.ts b/src/plugins/vis_type_table/public/table_vis_legacy_module.ts similarity index 100% rename from src/legacy/core_plugins/vis_type_table/public/table_vis_legacy_module.ts rename to src/plugins/vis_type_table/public/table_vis_legacy_module.ts diff --git a/src/legacy/core_plugins/vis_type_table/public/table_vis_response_handler.ts b/src/plugins/vis_type_table/public/table_vis_response_handler.ts similarity index 100% rename from src/legacy/core_plugins/vis_type_table/public/table_vis_response_handler.ts rename to src/plugins/vis_type_table/public/table_vis_response_handler.ts diff --git a/src/plugins/vis_type_table/public/table_vis_type.ts b/src/plugins/vis_type_table/public/table_vis_type.ts new file mode 100644 index 0000000000000..26e5ac8cfd71a --- /dev/null +++ b/src/plugins/vis_type_table/public/table_vis_type.ts @@ -0,0 +1,100 @@ +/* + * 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 { CoreSetup, PluginInitializerContext } from 'kibana/public'; +import { i18n } from '@kbn/i18n'; +import { AggGroupNames } from '../../data/public'; +import { Schemas } from '../../vis_default_editor/public'; +import { Vis } from '../../visualizations/public'; +import { tableVisResponseHandler } from './table_vis_response_handler'; +// @ts-ignore +import tableVisTemplate from './table_vis.html'; +import { TableOptions } from './components/table_vis_options'; +import { getTableVisualizationControllerClass } from './vis_controller'; + +export function getTableVisTypeDefinition(core: CoreSetup, context: PluginInitializerContext) { + return { + type: 'table', + name: 'table', + title: i18n.translate('visTypeTable.tableVisTitle', { + defaultMessage: 'Data Table', + }), + icon: 'visTable', + description: i18n.translate('visTypeTable.tableVisDescription', { + defaultMessage: 'Display values in a table', + }), + visualization: getTableVisualizationControllerClass(core, context), + visConfig: { + defaults: { + perPage: 10, + showPartialRows: false, + showMetricsAtAllLevels: false, + sort: { + columnIndex: null, + direction: null, + }, + showTotal: false, + totalFunc: 'sum', + percentageCol: '', + }, + template: tableVisTemplate, + }, + editorConfig: { + optionsTemplate: TableOptions, + schemas: new Schemas([ + { + group: AggGroupNames.Metrics, + name: 'metric', + title: i18n.translate('visTypeTable.tableVisEditorConfig.schemas.metricTitle', { + defaultMessage: 'Metric', + }), + aggFilter: ['!geo_centroid', '!geo_bounds'], + aggSettings: { + top_hits: { + allowStrings: true, + }, + }, + min: 1, + defaults: [{ type: 'count', schema: 'metric' }], + }, + { + group: AggGroupNames.Buckets, + name: 'bucket', + title: i18n.translate('visTypeTable.tableVisEditorConfig.schemas.bucketTitle', { + defaultMessage: 'Split rows', + }), + aggFilter: ['!filter'], + }, + { + group: AggGroupNames.Buckets, + name: 'split', + title: i18n.translate('visTypeTable.tableVisEditorConfig.schemas.splitTitle', { + defaultMessage: 'Split table', + }), + min: 0, + max: 1, + aggFilter: ['!filter'], + }, + ]), + }, + responseHandler: tableVisResponseHandler, + hierarchicalData: (vis: Vis) => { + return Boolean(vis.params.showPartialRows || vis.params.showMetricsAtAllLevels); + }, + }; +} diff --git a/src/legacy/core_plugins/vis_type_table/public/types.ts b/src/plugins/vis_type_table/public/types.ts similarity index 94% rename from src/legacy/core_plugins/vis_type_table/public/types.ts rename to src/plugins/vis_type_table/public/types.ts index c6de14b9f050c..39023d1305cb6 100644 --- a/src/legacy/core_plugins/vis_type_table/public/types.ts +++ b/src/plugins/vis_type_table/public/types.ts @@ -17,7 +17,7 @@ * under the License. */ -import { SchemaConfig } from '../../../../plugins/visualizations/public'; +import { SchemaConfig } from '../../visualizations/public'; export enum AggTypes { SUM = 'sum', diff --git a/src/plugins/vis_type_table/public/vis_controller.ts b/src/plugins/vis_type_table/public/vis_controller.ts new file mode 100644 index 0000000000000..d49dd32c8c89c --- /dev/null +++ b/src/plugins/vis_type_table/public/vis_controller.ts @@ -0,0 +1,109 @@ +/* + * 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 { CoreSetup, PluginInitializerContext } from 'kibana/public'; +import angular, { IModule, auto, IRootScopeService, IScope, ICompileService } from 'angular'; +import $ from 'jquery'; + +import { VisParams, ExprVis } from '../../visualizations/public'; +import { getAngularModule } from './get_inner_angular'; +import { initTableVisLegacyModule } from './table_vis_legacy_module'; + +const innerAngularName = 'kibana/table_vis'; + +export function getTableVisualizationControllerClass( + core: CoreSetup, + context: PluginInitializerContext +) { + return class TableVisualizationController { + private tableVisModule: IModule | undefined; + private injector: auto.IInjectorService | undefined; + el: JQuery; + vis: ExprVis; + $rootScope: IRootScopeService | null = null; + $scope: (IScope & { [key: string]: any }) | undefined; + $compile: ICompileService | undefined; + + constructor(domeElement: Element, vis: ExprVis) { + this.el = $(domeElement); + this.vis = vis; + } + + getInjector() { + if (!this.injector) { + const mountpoint = document.createElement('div'); + mountpoint.setAttribute('style', 'height: 100%; width: 100%;'); + this.injector = angular.bootstrap(mountpoint, [innerAngularName]); + this.el.append(mountpoint); + } + + return this.injector; + } + + async initLocalAngular() { + if (!this.tableVisModule) { + const [coreStart] = await core.getStartServices(); + this.tableVisModule = getAngularModule(innerAngularName, coreStart, context); + initTableVisLegacyModule(this.tableVisModule); + } + } + + async render(esResponse: object, visParams: VisParams) { + await this.initLocalAngular(); + + return new Promise(async (resolve, reject) => { + if (!this.$rootScope) { + const $injector = this.getInjector(); + this.$rootScope = $injector.get('$rootScope'); + this.$compile = $injector.get('$compile'); + } + const updateScope = () => { + if (!this.$scope) { + return; + } + this.$scope.vis = this.vis; + this.$scope.visState = { params: visParams }; + this.$scope.esResponse = esResponse; + + this.$scope.visParams = visParams; + this.$scope.renderComplete = resolve; + this.$scope.renderFailed = reject; + this.$scope.resize = Date.now(); + this.$scope.$apply(); + }; + + if (!this.$scope && this.$compile) { + this.$scope = this.$rootScope.$new(); + this.$scope.uiState = this.vis.getUiState(); + updateScope(); + this.el.find('div').append(this.$compile(this.vis.type!.visConfig.template)(this.$scope)); + this.$scope.$apply(); + } else { + updateScope(); + } + }); + } + + destroy() { + if (this.$rootScope) { + this.$rootScope.$destroy(); + this.$rootScope = null; + } + } + }; +} diff --git a/src/plugins/vis_type_table/server/index.ts b/src/plugins/vis_type_table/server/index.ts new file mode 100644 index 0000000000000..882958a28777d --- /dev/null +++ b/src/plugins/vis_type_table/server/index.ts @@ -0,0 +1,34 @@ +/* + * 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 { PluginConfigDescriptor } from 'kibana/server'; + +import { configSchema, ConfigSchema } from '../config'; + +export const config: PluginConfigDescriptor = { + schema: configSchema, + deprecations: ({ renameFromRoot }) => [ + renameFromRoot('table_vis.enabled', 'vis_type_table.enabled'), + ], +}; + +export const plugin = () => ({ + setup() {}, + start() {}, +}); From 1deb5d63eb4c941cc2c318a1417ea0c0efa659d8 Mon Sep 17 00:00:00 2001 From: Jean-Louis Leysens Date: Tue, 21 Apr 2020 12:31:05 +0200 Subject: [PATCH 05/67] Move authz lib out of snapshot restore (#63947) Created the first entry for the new __packages_do_no_import__ folder that will house ESUIs private packages. --- .../components/authorization_provider.tsx | 73 +++++++++++++++++++ .../authorization/components/index.ts | 30 ++++++++ .../components/not_authorized_section.tsx | 30 ++++++++ .../components/section_error.tsx | 19 ++++- .../components/with_privileges.tsx | 26 +++++-- .../authorization/index.ts | 30 ++++++++ .../authorization/types.ts | 27 +++++++ .../public/authorization/index.ts | 20 +++++ src/plugins/es_ui_shared/public/index.ts | 12 +++ .../snapshot_restore/common/types/index.ts | 1 - .../common/types/privileges.ts | 14 ---- .../public/application/app.tsx | 15 ++-- .../public/application/app_providers.tsx | 7 +- .../public/application/components/index.ts | 1 - .../policy_form/steps/step_logistics.tsx | 4 +- .../components/repository_form/step_one.tsx | 5 +- .../repository_form/type_settings/index.tsx | 4 +- .../components/authorization_provider.tsx | 47 ------------ .../lib/authorization/components/index.ts | 11 --- .../components/not_authorized_section.tsx | 17 ----- .../application/lib/authorization/index.ts | 7 -- .../policy_details/policy_details.tsx | 3 +- .../sections/home/policy_list/policy_list.tsx | 12 ++- .../policy_list/policy_table/policy_table.tsx | 2 +- .../repository_details/repository_details.tsx | 7 +- .../home/repository_list/repository_list.tsx | 3 +- .../repository_table/repository_table.tsx | 5 +- .../home/restore_list/restore_list.tsx | 11 ++- .../snapshot_details/snapshot_details.tsx | 8 +- .../home/snapshot_list/snapshot_list.tsx | 6 +- .../snapshot_table/snapshot_table.tsx | 2 +- .../sections/policy_add/policy_add.tsx | 6 +- .../sections/policy_edit/policy_edit.tsx | 3 +- .../repository_add/repository_add.tsx | 4 +- .../repository_edit/repository_edit.tsx | 3 +- .../restore_snapshot/restore_snapshot.tsx | 3 +- .../application/services/http/use_request.ts | 5 +- .../snapshot_restore/public/shared_imports.ts | 6 ++ .../snapshot_restore/server/routes/api/app.ts | 5 +- 39 files changed, 335 insertions(+), 159 deletions(-) create mode 100644 src/plugins/es_ui_shared/__packages_do_not_import__/authorization/components/authorization_provider.tsx create mode 100644 src/plugins/es_ui_shared/__packages_do_not_import__/authorization/components/index.ts create mode 100644 src/plugins/es_ui_shared/__packages_do_not_import__/authorization/components/not_authorized_section.tsx rename {x-pack/plugins/snapshot_restore/public/application => src/plugins/es_ui_shared/__packages_do_not_import__/authorization}/components/section_error.tsx (54%) rename {x-pack/plugins/snapshot_restore/public/application/lib => src/plugins/es_ui_shared/__packages_do_not_import__}/authorization/components/with_privileges.tsx (70%) create mode 100644 src/plugins/es_ui_shared/__packages_do_not_import__/authorization/index.ts create mode 100644 src/plugins/es_ui_shared/__packages_do_not_import__/authorization/types.ts create mode 100644 src/plugins/es_ui_shared/public/authorization/index.ts delete mode 100644 x-pack/plugins/snapshot_restore/common/types/privileges.ts delete mode 100644 x-pack/plugins/snapshot_restore/public/application/lib/authorization/components/authorization_provider.tsx delete mode 100644 x-pack/plugins/snapshot_restore/public/application/lib/authorization/components/index.ts delete mode 100644 x-pack/plugins/snapshot_restore/public/application/lib/authorization/components/not_authorized_section.tsx delete mode 100644 x-pack/plugins/snapshot_restore/public/application/lib/authorization/index.ts diff --git a/src/plugins/es_ui_shared/__packages_do_not_import__/authorization/components/authorization_provider.tsx b/src/plugins/es_ui_shared/__packages_do_not_import__/authorization/components/authorization_provider.tsx new file mode 100644 index 0000000000000..68f1cf2045efb --- /dev/null +++ b/src/plugins/es_ui_shared/__packages_do_not_import__/authorization/components/authorization_provider.tsx @@ -0,0 +1,73 @@ +/* + * 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 { HttpSetup } from 'kibana/public'; +import React, { createContext, useContext } from 'react'; + +import { useRequest } from '../../../public'; + +import { Error as CustomError } from './section_error'; + +import { Privileges } from '../types'; + +interface Authorization { + isLoading: boolean; + apiError: CustomError | null; + privileges: Privileges; +} + +const initialValue: Authorization = { + isLoading: true, + apiError: null, + privileges: { + hasAllPrivileges: true, + missingPrivileges: {}, + }, +}; + +export const AuthorizationContext = createContext(initialValue); + +export const useAuthorizationContext = () => { + const ctx = useContext(AuthorizationContext); + if (!ctx) { + throw new Error('AuthorizationContext can only be used inside of AuthorizationProvider!'); + } + return ctx; +}; + +interface Props { + privilegesEndpoint: string; + children: React.ReactNode; + httpClient: HttpSetup; +} + +export const AuthorizationProvider = ({ privilegesEndpoint, httpClient, children }: Props) => { + const { isLoading, error, data: privilegesData } = useRequest(httpClient, { + path: privilegesEndpoint, + method: 'get', + }); + + const value = { + isLoading, + privileges: isLoading ? { hasAllPrivileges: true, missingPrivileges: {} } : privilegesData, + apiError: error ? error : null, + } as Authorization; + + return {children}; +}; diff --git a/src/plugins/es_ui_shared/__packages_do_not_import__/authorization/components/index.ts b/src/plugins/es_ui_shared/__packages_do_not_import__/authorization/components/index.ts new file mode 100644 index 0000000000000..71be3cc6152ca --- /dev/null +++ b/src/plugins/es_ui_shared/__packages_do_not_import__/authorization/components/index.ts @@ -0,0 +1,30 @@ +/* + * 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. + */ + +export { + AuthorizationProvider, + AuthorizationContext, + useAuthorizationContext, +} from './authorization_provider'; + +export { WithPrivileges } from './with_privileges'; + +export { NotAuthorizedSection } from './not_authorized_section'; + +export { Error, SectionError } from './section_error'; diff --git a/src/plugins/es_ui_shared/__packages_do_not_import__/authorization/components/not_authorized_section.tsx b/src/plugins/es_ui_shared/__packages_do_not_import__/authorization/components/not_authorized_section.tsx new file mode 100644 index 0000000000000..c35f674ef9ec4 --- /dev/null +++ b/src/plugins/es_ui_shared/__packages_do_not_import__/authorization/components/not_authorized_section.tsx @@ -0,0 +1,30 @@ +/* + * 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 React from 'react'; +import { EuiEmptyPrompt } from '@elastic/eui'; + +interface Props { + title: React.ReactNode; + message: React.ReactNode | string; +} + +export const NotAuthorizedSection = ({ title, message }: Props) => ( + {title}} body={

{message}

} /> +); diff --git a/x-pack/plugins/snapshot_restore/public/application/components/section_error.tsx b/src/plugins/es_ui_shared/__packages_do_not_import__/authorization/components/section_error.tsx similarity index 54% rename from x-pack/plugins/snapshot_restore/public/application/components/section_error.tsx rename to src/plugins/es_ui_shared/__packages_do_not_import__/authorization/components/section_error.tsx index bd9e48796779e..3d56309adae97 100644 --- a/x-pack/plugins/snapshot_restore/public/application/components/section_error.tsx +++ b/src/plugins/es_ui_shared/__packages_do_not_import__/authorization/components/section_error.tsx @@ -1,7 +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. + * 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 { EuiCallOut, EuiSpacer } from '@elastic/eui'; diff --git a/x-pack/plugins/snapshot_restore/public/application/lib/authorization/components/with_privileges.tsx b/src/plugins/es_ui_shared/__packages_do_not_import__/authorization/components/with_privileges.tsx similarity index 70% rename from x-pack/plugins/snapshot_restore/public/application/lib/authorization/components/with_privileges.tsx rename to src/plugins/es_ui_shared/__packages_do_not_import__/authorization/components/with_privileges.tsx index 223a2882c3cab..8f4b2b976d141 100644 --- a/x-pack/plugins/snapshot_restore/public/application/lib/authorization/components/with_privileges.tsx +++ b/src/plugins/es_ui_shared/__packages_do_not_import__/authorization/components/with_privileges.tsx @@ -1,13 +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. + * 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 { useContext } from 'react'; +import { MissingPrivileges } from '../types'; -import { MissingPrivileges } from '../../../../../common/types'; -import { AuthorizationContext } from './authorization_provider'; +import { useAuthorizationContext } from './authorization_provider'; interface Props { /** @@ -29,7 +41,7 @@ const toArray = (value: string | string[]): string[] => Array.isArray(value) ? (value as string[]) : ([value] as string[]); export const WithPrivileges = ({ privileges: requiredPrivileges, children }: Props) => { - const { isLoading, privileges } = useContext(AuthorizationContext); + const { isLoading, privileges } = useAuthorizationContext(); const privilegesToArray: Privilege[] = toArray(requiredPrivileges).map(p => { const [section, privilege] = p.split('.'); diff --git a/src/plugins/es_ui_shared/__packages_do_not_import__/authorization/index.ts b/src/plugins/es_ui_shared/__packages_do_not_import__/authorization/index.ts new file mode 100644 index 0000000000000..ad89052b3bb54 --- /dev/null +++ b/src/plugins/es_ui_shared/__packages_do_not_import__/authorization/index.ts @@ -0,0 +1,30 @@ +/* + * 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. + */ + +export { + WithPrivileges, + NotAuthorizedSection, + AuthorizationProvider, + AuthorizationContext, + SectionError, + Error, + useAuthorizationContext, +} from './components'; + +export { Privileges, MissingPrivileges } from './types'; diff --git a/src/plugins/es_ui_shared/__packages_do_not_import__/authorization/types.ts b/src/plugins/es_ui_shared/__packages_do_not_import__/authorization/types.ts new file mode 100644 index 0000000000000..cdc2052122688 --- /dev/null +++ b/src/plugins/es_ui_shared/__packages_do_not_import__/authorization/types.ts @@ -0,0 +1,27 @@ +/* + * 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. + */ + +export interface MissingPrivileges { + [key: string]: string[] | undefined; +} + +export interface Privileges { + hasAllPrivileges: boolean; + missingPrivileges: MissingPrivileges; +} diff --git a/src/plugins/es_ui_shared/public/authorization/index.ts b/src/plugins/es_ui_shared/public/authorization/index.ts new file mode 100644 index 0000000000000..3a02c0d2694f3 --- /dev/null +++ b/src/plugins/es_ui_shared/public/authorization/index.ts @@ -0,0 +1,20 @@ +/* + * 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. + */ + +export * from '../../__packages_do_not_import__/authorization'; diff --git a/src/plugins/es_ui_shared/public/index.ts b/src/plugins/es_ui_shared/public/index.ts index a0371bf351193..7e5510d7c9c65 100644 --- a/src/plugins/es_ui_shared/public/index.ts +++ b/src/plugins/es_ui_shared/public/index.ts @@ -47,6 +47,18 @@ export { expandLiteralStrings, } from './console_lang'; +export { + AuthorizationContext, + AuthorizationProvider, + NotAuthorizedSection, + WithPrivileges, + Privileges, + MissingPrivileges, + SectionError, + Error, + useAuthorizationContext, +} from './authorization'; + /** dummy plugin, we just want esUiShared to have its own bundle */ export function plugin() { return new (class EsUiSharedPlugin { diff --git a/x-pack/plugins/snapshot_restore/common/types/index.ts b/x-pack/plugins/snapshot_restore/common/types/index.ts index 5cb3839fa9e01..d52584ca737a2 100644 --- a/x-pack/plugins/snapshot_restore/common/types/index.ts +++ b/x-pack/plugins/snapshot_restore/common/types/index.ts @@ -8,4 +8,3 @@ export * from './repository'; export * from './snapshot'; export * from './restore'; export * from './policy'; -export * from './privileges'; diff --git a/x-pack/plugins/snapshot_restore/common/types/privileges.ts b/x-pack/plugins/snapshot_restore/common/types/privileges.ts deleted file mode 100644 index bf710b8225599..0000000000000 --- a/x-pack/plugins/snapshot_restore/common/types/privileges.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. - */ - -export interface MissingPrivileges { - [key: string]: string[] | undefined; -} - -export interface Privileges { - hasAllPrivileges: boolean; - missingPrivileges: MissingPrivileges; -} diff --git a/x-pack/plugins/snapshot_restore/public/application/app.tsx b/x-pack/plugins/snapshot_restore/public/application/app.tsx index 77ef697814b2c..350d8aec711ed 100644 --- a/x-pack/plugins/snapshot_restore/public/application/app.tsx +++ b/x-pack/plugins/snapshot_restore/public/application/app.tsx @@ -4,13 +4,19 @@ * you may not use this file except in compliance with the Elastic License. */ -import React, { useContext } from 'react'; +import React from 'react'; import { Redirect, Route, Switch } from 'react-router-dom'; import { EuiPageContent } from '@elastic/eui'; import { FormattedMessage } from '@kbn/i18n/react'; -import { APP_REQUIRED_CLUSTER_PRIVILEGES } from '../../common/constants'; -import { SectionLoading, SectionError } from './components'; +import { APP_REQUIRED_CLUSTER_PRIVILEGES } from '../../common'; +import { + useAuthorizationContext, + SectionError, + WithPrivileges, + NotAuthorizedSection, +} from '../shared_imports'; +import { SectionLoading } from './components'; import { BASE_PATH, DEFAULT_SECTION, Section } from './constants'; import { RepositoryAdd, @@ -21,11 +27,10 @@ import { PolicyEdit, } from './sections'; import { useConfig } from './app_context'; -import { AuthorizationContext, WithPrivileges, NotAuthorizedSection } from './lib/authorization'; export const App: React.FunctionComponent = () => { const { slm_ui: slmUi } = useConfig(); - const { apiError } = useContext(AuthorizationContext); + const { apiError } = useAuthorizationContext(); const sections: Section[] = ['repositories', 'snapshots', 'restore_status']; diff --git a/x-pack/plugins/snapshot_restore/public/application/app_providers.tsx b/x-pack/plugins/snapshot_restore/public/application/app_providers.tsx index e2732c0051337..3ca25b7d32dba 100644 --- a/x-pack/plugins/snapshot_restore/public/application/app_providers.tsx +++ b/x-pack/plugins/snapshot_restore/public/application/app_providers.tsx @@ -5,8 +5,8 @@ */ import React from 'react'; -import { API_BASE_PATH } from '../../common/constants'; -import { AuthorizationProvider } from './lib/authorization'; +import { API_BASE_PATH } from '../../common'; +import { AuthorizationProvider } from '../shared_imports'; import { AppContextProvider, AppDependencies } from './app_context'; interface Props { @@ -18,10 +18,11 @@ export const AppProviders = ({ appDependencies, children }: Props) => { const { core } = appDependencies; const { i18n: { Context: I18nContext }, + http, } = core; return ( - + {children} diff --git a/x-pack/plugins/snapshot_restore/public/application/components/index.ts b/x-pack/plugins/snapshot_restore/public/application/components/index.ts index a7038ebd71578..f5bb892389870 100644 --- a/x-pack/plugins/snapshot_restore/public/application/components/index.ts +++ b/x-pack/plugins/snapshot_restore/public/application/components/index.ts @@ -10,7 +10,6 @@ export { RepositoryDeleteProvider } from './repository_delete_provider'; export { RepositoryForm } from './repository_form'; export { RepositoryVerificationBadge } from './repository_verification_badge'; export { RepositoryTypeLogo } from './repository_type_logo'; -export { SectionError, Error } from './section_error'; export { SectionLoading } from './section_loading'; export { SnapshotDeleteProvider } from './snapshot_delete_provider'; export { RestoreSnapshotForm } from './restore_snapshot_form'; diff --git a/x-pack/plugins/snapshot_restore/public/application/components/policy_form/steps/step_logistics.tsx b/x-pack/plugins/snapshot_restore/public/application/components/policy_form/steps/step_logistics.tsx index f2d4e2bd74598..105f0601e3dfb 100644 --- a/x-pack/plugins/snapshot_restore/public/application/components/policy_form/steps/step_logistics.tsx +++ b/x-pack/plugins/snapshot_restore/public/application/components/policy_form/steps/step_logistics.tsx @@ -21,13 +21,13 @@ import { } from '@elastic/eui'; import { Repository } from '../../../../../common/types'; -import { CronEditor } from '../../../../shared_imports'; +import { CronEditor, SectionError } from '../../../../shared_imports'; import { useServices } from '../../../app_context'; import { DEFAULT_POLICY_SCHEDULE, DEFAULT_POLICY_FREQUENCY } from '../../../constants'; import { useLoadRepositories } from '../../../services/http'; import { linkToAddRepository } from '../../../services/navigation'; import { documentationLinksService } from '../../../services/documentation'; -import { SectionLoading, SectionError } from '../../'; +import { SectionLoading } from '../../'; import { StepProps } from './'; export const PolicyStepLogistics: React.FunctionComponent = ({ diff --git a/x-pack/plugins/snapshot_restore/public/application/components/repository_form/step_one.tsx b/x-pack/plugins/snapshot_restore/public/application/components/repository_form/step_one.tsx index 3b4c9d595b9f2..34bc06343a780 100644 --- a/x-pack/plugins/snapshot_restore/public/application/components/repository_form/step_one.tsx +++ b/x-pack/plugins/snapshot_restore/public/application/components/repository_form/step_one.tsx @@ -23,13 +23,14 @@ import { } from '@elastic/eui'; import { Repository, RepositoryType, EmptyRepository } from '../../../../common/types'; -import { REPOSITORY_TYPES } from '../../../../common/constants'; +import { REPOSITORY_TYPES } from '../../../../common'; +import { SectionError, Error } from '../../../shared_imports'; import { documentationLinksService } from '../../services/documentation'; import { useLoadRepositoryTypes } from '../../services/http'; import { textService } from '../../services/text'; import { RepositoryValidation } from '../../services/validation'; -import { SectionError, SectionLoading, RepositoryTypeLogo, Error } from '../'; +import { SectionLoading, RepositoryTypeLogo } from '../'; interface Props { repository: Repository | EmptyRepository; diff --git a/x-pack/plugins/snapshot_restore/public/application/components/repository_form/type_settings/index.tsx b/x-pack/plugins/snapshot_restore/public/application/components/repository_form/type_settings/index.tsx index 75295a1205cef..1e54868397a6d 100644 --- a/x-pack/plugins/snapshot_restore/public/application/components/repository_form/type_settings/index.tsx +++ b/x-pack/plugins/snapshot_restore/public/application/components/repository_form/type_settings/index.tsx @@ -6,11 +6,11 @@ import React from 'react'; import { FormattedMessage } from '@kbn/i18n/react'; -import { REPOSITORY_TYPES } from '../../../../../common/constants'; +import { REPOSITORY_TYPES } from '../../../../../common'; import { Repository, RepositoryType, EmptyRepository } from '../../../../../common/types'; +import { SectionError } from '../../../../shared_imports'; import { useServices } from '../../../app_context'; import { RepositorySettingsValidation } from '../../../services/validation'; -import { SectionError } from '../../index'; import { AzureSettings } from './azure_settings'; import { FSSettings } from './fs_settings'; diff --git a/x-pack/plugins/snapshot_restore/public/application/lib/authorization/components/authorization_provider.tsx b/x-pack/plugins/snapshot_restore/public/application/lib/authorization/components/authorization_provider.tsx deleted file mode 100644 index d32fe29cc1dfa..0000000000000 --- a/x-pack/plugins/snapshot_restore/public/application/lib/authorization/components/authorization_provider.tsx +++ /dev/null @@ -1,47 +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, { createContext } from 'react'; -import { useRequest } from '../../../services/http/use_request'; -import { Privileges } from '../../../../../common/types'; -import { Error } from '../../../components/section_error'; - -interface Authorization { - isLoading: boolean; - apiError: Error | null; - privileges: Privileges; -} - -const initialValue: Authorization = { - isLoading: true, - apiError: null, - privileges: { - hasAllPrivileges: true, - missingPrivileges: {}, - }, -}; - -export const AuthorizationContext = createContext(initialValue); - -interface Props { - privilegesEndpoint: string; - children: React.ReactNode; -} - -export const AuthorizationProvider = ({ privilegesEndpoint, children }: Props) => { - const { isLoading, error, data: privilegesData } = useRequest({ - path: privilegesEndpoint, - method: 'get', - }); - - const value = { - isLoading, - privileges: isLoading ? { hasAllPrivileges: true, missingPrivileges: {} } : privilegesData, - apiError: error ? error : null, - } as Authorization; - - return {children}; -}; diff --git a/x-pack/plugins/snapshot_restore/public/application/lib/authorization/components/index.ts b/x-pack/plugins/snapshot_restore/public/application/lib/authorization/components/index.ts deleted file mode 100644 index ac77aa5268660..0000000000000 --- a/x-pack/plugins/snapshot_restore/public/application/lib/authorization/components/index.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. - */ - -export { AuthorizationProvider, AuthorizationContext } from './authorization_provider'; - -export { WithPrivileges } from './with_privileges'; - -export { NotAuthorizedSection } from './not_authorized_section'; diff --git a/x-pack/plugins/snapshot_restore/public/application/lib/authorization/components/not_authorized_section.tsx b/x-pack/plugins/snapshot_restore/public/application/lib/authorization/components/not_authorized_section.tsx deleted file mode 100644 index 3fc13245708e8..0000000000000 --- a/x-pack/plugins/snapshot_restore/public/application/lib/authorization/components/not_authorized_section.tsx +++ /dev/null @@ -1,17 +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 { EuiEmptyPrompt } from '@elastic/eui'; - -interface Props { - title: React.ReactNode; - message: React.ReactNode | string; -} - -export const NotAuthorizedSection = ({ title, message }: Props) => ( - {title}} body={

{message}

} /> -); diff --git a/x-pack/plugins/snapshot_restore/public/application/lib/authorization/index.ts b/x-pack/plugins/snapshot_restore/public/application/lib/authorization/index.ts deleted file mode 100644 index 73bbde465146c..0000000000000 --- a/x-pack/plugins/snapshot_restore/public/application/lib/authorization/index.ts +++ /dev/null @@ -1,7 +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. - */ - -export * from './components'; diff --git a/x-pack/plugins/snapshot_restore/public/application/sections/home/policy_list/policy_details/policy_details.tsx b/x-pack/plugins/snapshot_restore/public/application/sections/home/policy_list/policy_details/policy_details.tsx index f3110199ee17c..03d381c9f3aa3 100644 --- a/x-pack/plugins/snapshot_restore/public/application/sections/home/policy_list/policy_details/policy_details.tsx +++ b/x-pack/plugins/snapshot_restore/public/application/sections/home/policy_list/policy_details/policy_details.tsx @@ -26,6 +26,7 @@ import { import { SlmPolicy } from '../../../../../../common/types'; import { useServices } from '../../../../app_context'; +import { SectionError, Error } from '../../../../../shared_imports'; import { UIM_POLICY_DETAIL_PANEL_SUMMARY_TAB, UIM_POLICY_DETAIL_PANEL_HISTORY_TAB, @@ -34,11 +35,9 @@ import { useLoadPolicy } from '../../../../services/http'; import { linkToEditPolicy, linkToSnapshot } from '../../../../services/navigation'; import { - SectionError, SectionLoading, PolicyExecuteProvider, PolicyDeleteProvider, - Error, } from '../../../../components'; import { TabSummary, TabHistory } from './tabs'; diff --git a/x-pack/plugins/snapshot_restore/public/application/sections/home/policy_list/policy_list.tsx b/x-pack/plugins/snapshot_restore/public/application/sections/home/policy_list/policy_list.tsx index 0122e25e5e165..51297038b0f3f 100644 --- a/x-pack/plugins/snapshot_restore/public/application/sections/home/policy_list/policy_list.tsx +++ b/x-pack/plugins/snapshot_restore/public/application/sections/home/policy_list/policy_list.tsx @@ -9,13 +9,19 @@ import { FormattedMessage } from '@kbn/i18n/react'; import { RouteComponentProps } from 'react-router-dom'; import { EuiEmptyPrompt, EuiButton, EuiCallOut, EuiSpacer } from '@elastic/eui'; +import { + SectionError, + Error, + WithPrivileges, + NotAuthorizedSection, +} from '../../../../shared_imports'; + import { SlmPolicy } from '../../../../../common/types'; -import { APP_SLM_CLUSTER_PRIVILEGES } from '../../../../../common/constants'; -import { SectionError, SectionLoading, Error } from '../../../components'; +import { APP_SLM_CLUSTER_PRIVILEGES } from '../../../../../common'; +import { SectionLoading } from '../../../components'; import { BASE_PATH, UIM_POLICY_LIST_LOAD } from '../../../constants'; import { useLoadPolicies, useLoadRetentionSettings } from '../../../services/http'; import { linkToAddPolicy, linkToPolicy } from '../../../services/navigation'; -import { WithPrivileges, NotAuthorizedSection } from '../../../lib/authorization'; import { useServices } from '../../../app_context'; import { PolicyDetails } from './policy_details'; diff --git a/x-pack/plugins/snapshot_restore/public/application/sections/home/policy_list/policy_table/policy_table.tsx b/x-pack/plugins/snapshot_restore/public/application/sections/home/policy_list/policy_table/policy_table.tsx index 7f9c5c5af7705..ba28bcddf5347 100644 --- a/x-pack/plugins/snapshot_restore/public/application/sections/home/policy_list/policy_table/policy_table.tsx +++ b/x-pack/plugins/snapshot_restore/public/application/sections/home/policy_list/policy_table/policy_table.tsx @@ -21,6 +21,7 @@ import { } from '@elastic/eui'; import { SlmPolicy } from '../../../../../../common/types'; +import { Error } from '../../../../../shared_imports'; import { UIM_POLICY_SHOW_DETAILS_CLICK } from '../../../../constants'; import { useServices } from '../../../../app_context'; import { @@ -28,7 +29,6 @@ import { PolicyExecuteProvider, PolicyDeleteProvider, } from '../../../../components'; -import { Error } from '../../../../components/section_error'; import { linkToAddPolicy, linkToEditPolicy } from '../../../../services/navigation'; import { SendRequestResponse } from '../../../../../shared_imports'; diff --git a/x-pack/plugins/snapshot_restore/public/application/sections/home/repository_list/repository_details/repository_details.tsx b/x-pack/plugins/snapshot_restore/public/application/sections/home/repository_list/repository_details/repository_details.tsx index d293f194f647a..9932f14664076 100644 --- a/x-pack/plugins/snapshot_restore/public/application/sections/home/repository_list/repository_details/repository_details.tsx +++ b/x-pack/plugins/snapshot_restore/public/application/sections/home/repository_list/repository_details/repository_details.tsx @@ -25,6 +25,8 @@ import { import 'brace/theme/textmate'; +import { SectionError, Error } from '../../../../../shared_imports'; + import { useServices } from '../../../../app_context'; import { documentationLinksService } from '../../../../services/documentation'; import { @@ -35,7 +37,8 @@ import { import { textService } from '../../../../services/text'; import { linkToSnapshots, linkToEditRepository } from '../../../../services/navigation'; -import { REPOSITORY_TYPES } from '../../../../../../common/constants'; +import { REPOSITORY_TYPES } from '../../../../../../common'; + import { Repository, RepositoryVerification, @@ -43,10 +46,8 @@ import { } from '../../../../../../common/types'; import { RepositoryDeleteProvider, - SectionError, SectionLoading, RepositoryVerificationBadge, - Error, } from '../../../../components'; import { TypeDetails } from './type_details'; diff --git a/x-pack/plugins/snapshot_restore/public/application/sections/home/repository_list/repository_list.tsx b/x-pack/plugins/snapshot_restore/public/application/sections/home/repository_list/repository_list.tsx index 6fa12537e9d6f..2256fa5991dec 100644 --- a/x-pack/plugins/snapshot_restore/public/application/sections/home/repository_list/repository_list.tsx +++ b/x-pack/plugins/snapshot_restore/public/application/sections/home/repository_list/repository_list.tsx @@ -10,7 +10,8 @@ import { RouteComponentProps } from 'react-router-dom'; import { EuiButton, EuiEmptyPrompt } from '@elastic/eui'; import { Repository } from '../../../../../common/types'; -import { SectionError, SectionLoading, Error } from '../../../components'; +import { SectionError, Error } from '../../../../shared_imports'; +import { SectionLoading } from '../../../components'; import { BASE_PATH, UIM_REPOSITORY_LIST_LOAD } from '../../../constants'; import { useServices } from '../../../app_context'; import { useLoadRepositories } from '../../../services/http'; diff --git a/x-pack/plugins/snapshot_restore/public/application/sections/home/repository_list/repository_table/repository_table.tsx b/x-pack/plugins/snapshot_restore/public/application/sections/home/repository_list/repository_table/repository_table.tsx index 7c0438f6b837f..bf2643d78bca1 100644 --- a/x-pack/plugins/snapshot_restore/public/application/sections/home/repository_list/repository_table/repository_table.tsx +++ b/x-pack/plugins/snapshot_restore/public/application/sections/home/repository_list/repository_table/repository_table.tsx @@ -15,15 +15,14 @@ import { EuiIconTip, } from '@elastic/eui'; -import { REPOSITORY_TYPES } from '../../../../../../common/constants'; +import { REPOSITORY_TYPES } from '../../../../../../common'; import { Repository, RepositoryType } from '../../../../../../common/types'; -import { Error } from '../../../../components/section_error'; +import { Error, SendRequestResponse } from '../../../../../shared_imports'; import { RepositoryDeleteProvider } from '../../../../components'; import { UIM_REPOSITORY_SHOW_DETAILS_CLICK } from '../../../../constants'; import { useServices } from '../../../../app_context'; import { textService } from '../../../../services/text'; import { linkToEditRepository, linkToAddRepository } from '../../../../services/navigation'; -import { SendRequestResponse } from '../../../../../shared_imports'; interface Props { repositories: Repository[]; diff --git a/x-pack/plugins/snapshot_restore/public/application/sections/home/restore_list/restore_list.tsx b/x-pack/plugins/snapshot_restore/public/application/sections/home/restore_list/restore_list.tsx index da9ce3b124a11..0e3d9363d0535 100644 --- a/x-pack/plugins/snapshot_restore/public/application/sections/home/restore_list/restore_list.tsx +++ b/x-pack/plugins/snapshot_restore/public/application/sections/home/restore_list/restore_list.tsx @@ -18,14 +18,19 @@ import { EuiLoadingSpinner, EuiLink, } from '@elastic/eui'; -import { APP_RESTORE_INDEX_PRIVILEGES } from '../../../../../common/constants'; -import { SectionError, SectionLoading, Error } from '../../../components'; +import { APP_RESTORE_INDEX_PRIVILEGES } from '../../../../../common'; +import { + WithPrivileges, + NotAuthorizedSection, + SectionError, + Error, +} from '../../../../shared_imports'; +import { SectionLoading } from '../../../components'; import { UIM_RESTORE_LIST_LOAD } from '../../../constants'; import { useLoadRestores } from '../../../services/http'; import { linkToSnapshots } from '../../../services/navigation'; import { useServices } from '../../../app_context'; import { RestoreTable } from './restore_table'; -import { WithPrivileges, NotAuthorizedSection } from '../../../lib/authorization'; const ONE_SECOND_MS = 1000; const TEN_SECONDS_MS = 10 * 1000; diff --git a/x-pack/plugins/snapshot_restore/public/application/sections/home/snapshot_list/snapshot_details/snapshot_details.tsx b/x-pack/plugins/snapshot_restore/public/application/sections/home/snapshot_list/snapshot_details/snapshot_details.tsx index d16545debe1ec..1943762a3c36e 100644 --- a/x-pack/plugins/snapshot_restore/public/application/sections/home/snapshot_list/snapshot_details/snapshot_details.tsx +++ b/x-pack/plugins/snapshot_restore/public/application/sections/home/snapshot_list/snapshot_details/snapshot_details.tsx @@ -23,12 +23,8 @@ import React, { Fragment, useState, useEffect } from 'react'; import { FormattedMessage } from '@kbn/i18n/react'; import { SnapshotDetails as ISnapshotDetails } from '../../../../../../common/types'; -import { - SectionError, - SectionLoading, - SnapshotDeleteProvider, - Error, -} from '../../../../components'; +import { SectionError, Error } from '../../../../../shared_imports'; +import { SectionLoading, SnapshotDeleteProvider } from '../../../../components'; import { useServices } from '../../../../app_context'; import { UIM_SNAPSHOT_DETAIL_PANEL_SUMMARY_TAB, diff --git a/x-pack/plugins/snapshot_restore/public/application/sections/home/snapshot_list/snapshot_list.tsx b/x-pack/plugins/snapshot_restore/public/application/sections/home/snapshot_list/snapshot_list.tsx index fe99ccb6f596c..30e4c771644bc 100644 --- a/x-pack/plugins/snapshot_restore/public/application/sections/home/snapshot_list/snapshot_list.tsx +++ b/x-pack/plugins/snapshot_restore/public/application/sections/home/snapshot_list/snapshot_list.tsx @@ -10,10 +10,10 @@ import { FormattedMessage } from '@kbn/i18n/react'; import { RouteComponentProps } from 'react-router-dom'; import { EuiButton, EuiCallOut, EuiLink, EuiEmptyPrompt, EuiSpacer, EuiIcon } from '@elastic/eui'; -import { APP_SLM_CLUSTER_PRIVILEGES } from '../../../../../common/constants'; -import { SectionError, SectionLoading, Error } from '../../../components'; +import { APP_SLM_CLUSTER_PRIVILEGES } from '../../../../../common'; +import { WithPrivileges, SectionError, Error } from '../../../../shared_imports'; +import { SectionLoading } from '../../../components'; import { BASE_PATH, UIM_SNAPSHOT_LIST_LOAD } from '../../../constants'; -import { WithPrivileges } from '../../../lib/authorization'; import { documentationLinksService } from '../../../services/documentation'; import { useLoadSnapshots } from '../../../services/http'; import { diff --git a/x-pack/plugins/snapshot_restore/public/application/sections/home/snapshot_list/snapshot_table/snapshot_table.tsx b/x-pack/plugins/snapshot_restore/public/application/sections/home/snapshot_list/snapshot_table/snapshot_table.tsx index ad64dcc7adcfe..427c241970007 100644 --- a/x-pack/plugins/snapshot_restore/public/application/sections/home/snapshot_list/snapshot_table/snapshot_table.tsx +++ b/x-pack/plugins/snapshot_restore/public/application/sections/home/snapshot_list/snapshot_table/snapshot_table.tsx @@ -17,10 +17,10 @@ import { } from '@elastic/eui'; import { SnapshotDetails } from '../../../../../../common/types'; +import { Error } from '../../../../../shared_imports'; import { SNAPSHOT_STATE, UIM_SNAPSHOT_SHOW_DETAILS_CLICK } from '../../../../constants'; import { useServices } from '../../../../app_context'; import { linkToRepository, linkToRestoreSnapshot } from '../../../../services/navigation'; -import { Error } from '../../../../components/section_error'; import { DataPlaceholder, FormattedDateTime, SnapshotDeleteProvider } from '../../../../components'; import { SendRequestResponse } from '../../../../../shared_imports'; diff --git a/x-pack/plugins/snapshot_restore/public/application/sections/policy_add/policy_add.tsx b/x-pack/plugins/snapshot_restore/public/application/sections/policy_add/policy_add.tsx index 4eb0f54978d09..6d1a432be7f9f 100644 --- a/x-pack/plugins/snapshot_restore/public/application/sections/policy_add/policy_add.tsx +++ b/x-pack/plugins/snapshot_restore/public/application/sections/policy_add/policy_add.tsx @@ -9,9 +9,11 @@ import { RouteComponentProps } from 'react-router-dom'; import { EuiPageBody, EuiPageContent, EuiSpacer, EuiTitle } from '@elastic/eui'; import { SlmPolicyPayload } from '../../../../common/types'; -import { TIME_UNITS } from '../../../../common/constants'; +import { TIME_UNITS } from '../../../../common'; -import { PolicyForm, SectionError, SectionLoading, Error } from '../../components'; +import { SectionError, Error } from '../../../shared_imports'; + +import { PolicyForm, SectionLoading } from '../../components'; import { BASE_PATH, DEFAULT_POLICY_SCHEDULE } from '../../constants'; import { breadcrumbService, docTitleService } from '../../services/navigation'; import { addPolicy, useLoadIndices } from '../../services/http'; diff --git a/x-pack/plugins/snapshot_restore/public/application/sections/policy_edit/policy_edit.tsx b/x-pack/plugins/snapshot_restore/public/application/sections/policy_edit/policy_edit.tsx index 9ca7eba5c4eeb..0f1473fc05492 100644 --- a/x-pack/plugins/snapshot_restore/public/application/sections/policy_edit/policy_edit.tsx +++ b/x-pack/plugins/snapshot_restore/public/application/sections/policy_edit/policy_edit.tsx @@ -9,8 +9,9 @@ import { RouteComponentProps } from 'react-router-dom'; import { EuiPageBody, EuiPageContent, EuiSpacer, EuiTitle, EuiCallOut } from '@elastic/eui'; import { SlmPolicyPayload } from '../../../../common/types'; +import { SectionError, Error } from '../../../shared_imports'; import { TIME_UNITS } from '../../../../common/constants'; -import { SectionError, SectionLoading, PolicyForm, Error } from '../../components'; +import { SectionLoading, PolicyForm } from '../../components'; import { BASE_PATH } from '../../constants'; import { useServices } from '../../app_context'; import { breadcrumbService, docTitleService } from '../../services/navigation'; diff --git a/x-pack/plugins/snapshot_restore/public/application/sections/repository_add/repository_add.tsx b/x-pack/plugins/snapshot_restore/public/application/sections/repository_add/repository_add.tsx index 126e04bc7dc1d..08bfde833c368 100644 --- a/x-pack/plugins/snapshot_restore/public/application/sections/repository_add/repository_add.tsx +++ b/x-pack/plugins/snapshot_restore/public/application/sections/repository_add/repository_add.tsx @@ -12,7 +12,9 @@ import { RouteComponentProps } from 'react-router-dom'; import { EuiPageBody, EuiPageContent, EuiSpacer, EuiTitle } from '@elastic/eui'; import { Repository, EmptyRepository } from '../../../../common/types'; -import { RepositoryForm, SectionError } from '../../components'; +import { SectionError } from '../../../shared_imports'; + +import { RepositoryForm } from '../../components'; import { BASE_PATH, Section } from '../../constants'; import { breadcrumbService, docTitleService } from '../../services/navigation'; import { addRepository } from '../../services/http'; diff --git a/x-pack/plugins/snapshot_restore/public/application/sections/repository_edit/repository_edit.tsx b/x-pack/plugins/snapshot_restore/public/application/sections/repository_edit/repository_edit.tsx index aa29b8b9f0551..95f8b9b8bde7d 100644 --- a/x-pack/plugins/snapshot_restore/public/application/sections/repository_edit/repository_edit.tsx +++ b/x-pack/plugins/snapshot_restore/public/application/sections/repository_edit/repository_edit.tsx @@ -10,7 +10,8 @@ import { RouteComponentProps } from 'react-router-dom'; import { EuiCallOut, EuiPageBody, EuiPageContent, EuiSpacer, EuiTitle } from '@elastic/eui'; import { Repository, EmptyRepository } from '../../../../common/types'; -import { RepositoryForm, SectionError, SectionLoading, Error } from '../../components'; +import { SectionError, Error } from '../../../shared_imports'; +import { RepositoryForm, SectionLoading } from '../../components'; import { BASE_PATH, Section } from '../../constants'; import { useServices } from '../../app_context'; import { breadcrumbService, docTitleService } from '../../services/navigation'; diff --git a/x-pack/plugins/snapshot_restore/public/application/sections/restore_snapshot/restore_snapshot.tsx b/x-pack/plugins/snapshot_restore/public/application/sections/restore_snapshot/restore_snapshot.tsx index 252fd07a85f80..9eabed8341ee0 100644 --- a/x-pack/plugins/snapshot_restore/public/application/sections/restore_snapshot/restore_snapshot.tsx +++ b/x-pack/plugins/snapshot_restore/public/application/sections/restore_snapshot/restore_snapshot.tsx @@ -9,8 +9,9 @@ import { RouteComponentProps } from 'react-router-dom'; import { EuiPageBody, EuiPageContent, EuiSpacer, EuiTitle } from '@elastic/eui'; import { SnapshotDetails, RestoreSettings } from '../../../../common/types'; +import { SectionError, Error } from '../../../shared_imports'; import { BASE_PATH } from '../../constants'; -import { SectionError, SectionLoading, RestoreSnapshotForm, Error } from '../../components'; +import { SectionLoading, RestoreSnapshotForm } from '../../components'; import { useServices } from '../../app_context'; import { breadcrumbService, docTitleService } from '../../services/navigation'; import { useLoadSnapshot, executeRestore } from '../../services/http'; diff --git a/x-pack/plugins/snapshot_restore/public/application/services/http/use_request.ts b/x-pack/plugins/snapshot_restore/public/application/services/http/use_request.ts index 200d601fd2ce9..27a565ccb74bc 100644 --- a/x-pack/plugins/snapshot_restore/public/application/services/http/use_request.ts +++ b/x-pack/plugins/snapshot_restore/public/application/services/http/use_request.ts @@ -9,11 +9,10 @@ import { UseRequestConfig, sendRequest as _sendRequest, useRequest as _useRequest, + Error as CustomError, } from '../../../shared_imports'; -import { Error as CustomError } from '../../components/section_error'; - -import { httpService } from './index'; +import { httpService } from '.'; export const sendRequest = (config: SendRequestConfig) => { return _sendRequest(httpService.httpClient, config); diff --git a/x-pack/plugins/snapshot_restore/public/shared_imports.ts b/x-pack/plugins/snapshot_restore/public/shared_imports.ts index 7e7ef09d0c09d..e0024ea8e0c12 100644 --- a/x-pack/plugins/snapshot_restore/public/shared_imports.ts +++ b/x-pack/plugins/snapshot_restore/public/shared_imports.ts @@ -12,4 +12,10 @@ export { useRequest, CronEditor, DAY, + SectionError, + Error, + WithPrivileges, + useAuthorizationContext, + NotAuthorizedSection, + AuthorizationProvider, } from '../../../../src/plugins/es_ui_shared/public'; diff --git a/x-pack/plugins/snapshot_restore/server/routes/api/app.ts b/x-pack/plugins/snapshot_restore/server/routes/api/app.ts index 5d334fddc144b..bda64fdb66571 100644 --- a/x-pack/plugins/snapshot_restore/server/routes/api/app.ts +++ b/x-pack/plugins/snapshot_restore/server/routes/api/app.ts @@ -3,12 +3,13 @@ * or more contributor license agreements. Licensed under the Elastic License; * you may not use this file except in compliance with the Elastic License. */ -import { Privileges } from '../../../common/types'; +import { Privileges } from '../../../../../../src/plugins/es_ui_shared/public'; + import { APP_REQUIRED_CLUSTER_PRIVILEGES, APP_RESTORE_INDEX_PRIVILEGES, APP_SLM_CLUSTER_PRIVILEGES, -} from '../../../common/constants'; +} from '../../../common'; import { RouteDependencies } from '../../types'; import { addBasePath } from '../helpers'; From 02d55db6cdeec7d7e60a4f12e9a3c2d98f39e460 Mon Sep 17 00:00:00 2001 From: Gidi Meir Morris Date: Tue, 21 Apr 2020 12:32:14 +0100 Subject: [PATCH 06/67] [Alerting] Improve validation and errors handling in PagerDuty action (#63954) Improves the messaging when the Pager Duty action has trouble parsing the timestamp field and adds trimming on the timestamp's field to make us more flexible in handling the parsing and hence more likely to be forgiving of the input by the user. As the timestamp relies on context variables provided via mustcahe templates, we can't reliably validate this field at alert creation time. We address by: 1. Trimming the edges, which is required when parsing a date, should help prevent accidental spaces from breaking the parsing. 2. Checking for a mustache template on the client side and if there are none - we validate for a valid timestamp when the action is created. --- .../builtin_action_types/pagerduty.test.ts | 19 ++++++++++ .../server/builtin_action_types/pagerduty.ts | 24 ++++++++----- .../builtin_action_types/pagerduty.test.tsx | 7 ++-- .../builtin_action_types/pagerduty.tsx | 36 ++++++++++++++++++- .../lib/has_mustache_tokens.test.ts | 23 ++++++++++++ .../application/lib/has_mustache_tokens.ts | 9 +++++ 6 files changed, 106 insertions(+), 12 deletions(-) create mode 100644 x-pack/plugins/triggers_actions_ui/public/application/lib/has_mustache_tokens.test.ts create mode 100644 x-pack/plugins/triggers_actions_ui/public/application/lib/has_mustache_tokens.ts diff --git a/x-pack/plugins/actions/server/builtin_action_types/pagerduty.test.ts b/x-pack/plugins/actions/server/builtin_action_types/pagerduty.test.ts index 514c9759d7b56..e5521558bc2da 100644 --- a/x-pack/plugins/actions/server/builtin_action_types/pagerduty.test.ts +++ b/x-pack/plugins/actions/server/builtin_action_types/pagerduty.test.ts @@ -142,6 +142,25 @@ describe('validateParams()', () => { - [eventAction.2]: expected value to equal [acknowledge]" `); }); + + test('should validate and throw error when timestamp has spaces', () => { + const randoDate = new Date('1963-09-23T01:23:45Z').toISOString(); + const timestamp = ` ${randoDate}`; + expect(() => { + validateParams(actionType, { + timestamp, + }); + }).toThrowError(`error validating action params: error parsing timestamp "${timestamp}"`); + }); + + test('should validate and throw error when timestamp is invalid', () => { + const timestamp = `1963-09-55 90:23:45`; + expect(() => { + validateParams(actionType, { + timestamp, + }); + }).toThrowError(`error validating action params: error parsing timestamp "${timestamp}"`); + }); }); describe('execute()', () => { diff --git a/x-pack/plugins/actions/server/builtin_action_types/pagerduty.ts b/x-pack/plugins/actions/server/builtin_action_types/pagerduty.ts index 2b607d0dd41ba..f4d69a4a39e40 100644 --- a/x-pack/plugins/actions/server/builtin_action_types/pagerduty.ts +++ b/x-pack/plugins/actions/server/builtin_action_types/pagerduty.ts @@ -70,18 +70,26 @@ const ParamsSchema = schema.object( function validateParams(paramsObject: any): string | void { const params: ActionParamsType = paramsObject; - const { timestamp } = params; if (timestamp != null) { - let date; try { - date = Date.parse(timestamp); + const date = Date.parse(timestamp); + if (isNaN(date)) { + return i18n.translate('xpack.actions.builtin.pagerduty.invalidTimestampErrorMessage', { + defaultMessage: `error parsing timestamp "{timestamp}"`, + values: { + timestamp, + }, + }); + } } catch (err) { - return 'error parsing timestamp: ${err.message}'; - } - - if (isNaN(date)) { - return 'error parsing timestamp'; + return i18n.translate('xpack.actions.builtin.pagerduty.timestampParsingFailedErrorMessage', { + defaultMessage: `error parsing timestamp "{timestamp}": {message}`, + values: { + timestamp, + message: err.message, + }, + }); } } } diff --git a/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/pagerduty.test.tsx b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/pagerduty.test.tsx index 7da97b9fe3436..1c9e87310107f 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/pagerduty.test.tsx +++ b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/pagerduty.test.tsx @@ -90,7 +90,7 @@ describe('pagerduty action params validation', () => { summary: '2323', source: 'source', severity: 'critical', - timestamp: '234654564654', + timestamp: new Date().toISOString(), component: 'test', group: 'group', class: 'test class', @@ -99,6 +99,7 @@ describe('pagerduty action params validation', () => { expect(actionTypeModel.validateParams(actionParams)).toEqual({ errors: { summary: [], + timestamp: [], }, }); }); @@ -156,7 +157,7 @@ describe('PagerDutyParamsFields renders', () => { summary: '2323', source: 'source', severity: SeverityActionOptions.CRITICAL, - timestamp: '234654564654', + timestamp: new Date().toISOString(), component: 'test', group: 'group', class: 'test class', @@ -164,7 +165,7 @@ describe('PagerDutyParamsFields renders', () => { const wrapper = mountWithIntl( {}} index={0} /> diff --git a/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/pagerduty.tsx b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/pagerduty.tsx index d99362c618356..15f91ae1d4609 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/pagerduty.tsx +++ b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/pagerduty.tsx @@ -14,6 +14,7 @@ import { } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; import { FormattedMessage } from '@kbn/i18n/react'; +import moment from 'moment'; import { ActionTypeModel, ActionConnectorFieldsProps, @@ -23,6 +24,7 @@ import { import { PagerDutyActionParams, PagerDutyActionConnector } from './types'; import pagerDutySvg from './pagerduty.svg'; import { AddMessageVariables } from '../add_message_variables'; +import { hasMustacheTokens } from '../../lib/has_mustache_tokens'; export function getActionType(): ActionTypeModel { return { @@ -62,6 +64,7 @@ export function getActionType(): ActionTypeModel { const validationResult = { errors: {} }; const errors = { summary: new Array(), + timestamp: new Array(), }; validationResult.errors = errors; if (!actionParams.summary?.length) { @@ -74,6 +77,24 @@ export function getActionType(): ActionTypeModel { ) ); } + if (actionParams.timestamp && !hasMustacheTokens(actionParams.timestamp)) { + if (isNaN(Date.parse(actionParams.timestamp))) { + const { nowShortFormat, nowLongFormat } = getValidTimestampExamples(); + errors.timestamp.push( + i18n.translate( + 'xpack.triggersActionsUI.components.builtinActionTypes.pagerDutyAction.error.invalidTimestamp', + { + defaultMessage: + 'Timestamp must be a valid date, such as {nowShortFormat} or {nowLongFormat}.', + values: { + nowShortFormat, + nowLongFormat, + }, + } + ) + ); + } + } return validationResult; }, actionConnectorFields: PagerDutyActionConnectorFields, @@ -334,6 +355,8 @@ const PagerDutyParamsFields: React.FunctionComponent 0 && timestamp !== undefined} label={i18n.translate( 'xpack.triggersActionsUI.components.builtinActionTypes.pagerDutyAction.timestampTextFieldLabel', { @@ -355,11 +378,14 @@ const PagerDutyParamsFields: React.FunctionComponent 0 && timestamp !== undefined} onChange={(e: React.ChangeEvent) => { editAction('timestamp', e.target.value, index); }} onBlur={() => { - if (!timestamp) { + if (timestamp?.trim()) { + editAction('timestamp', timestamp.trim(), index); + } else { editAction('timestamp', '', index); } }} @@ -534,3 +560,11 @@ const PagerDutyParamsFields: React.FunctionComponent ); }; + +function getValidTimestampExamples() { + const now = moment(); + return { + nowShortFormat: now.format('YYYY-MM-DD'), + nowLongFormat: now.format('YYYY-MM-DD h:mm:ss'), + }; +} diff --git a/x-pack/plugins/triggers_actions_ui/public/application/lib/has_mustache_tokens.test.ts b/x-pack/plugins/triggers_actions_ui/public/application/lib/has_mustache_tokens.test.ts new file mode 100644 index 0000000000000..db4f9fa799170 --- /dev/null +++ b/x-pack/plugins/triggers_actions_ui/public/application/lib/has_mustache_tokens.test.ts @@ -0,0 +1,23 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import uuid from 'uuid'; + +import { hasMustacheTokens } from './has_mustache_tokens'; + +describe('hasMustacheTokens', () => { + test('returns false for empty string', () => { + expect(hasMustacheTokens('')).toBe(false); + }); + + test('returns false for string without tokens', () => { + expect(hasMustacheTokens(`some random string ${uuid.v4()}`)).toBe(false); + }); + + test('returns true when a template token is present', () => { + expect(hasMustacheTokens('{{context.timestamp}}')).toBe(true); + }); +}); diff --git a/x-pack/plugins/triggers_actions_ui/public/application/lib/has_mustache_tokens.ts b/x-pack/plugins/triggers_actions_ui/public/application/lib/has_mustache_tokens.ts new file mode 100644 index 0000000000000..4dcd8113d51fc --- /dev/null +++ b/x-pack/plugins/triggers_actions_ui/public/application/lib/has_mustache_tokens.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 hasMustacheTokens(str: string): boolean { + return null !== str.match(/{{.*}}/); +} From 3b1d0e0c6b5a2b10151858a4e32f2277ea3b038d Mon Sep 17 00:00:00 2001 From: Anton Dosov Date: Tue, 21 Apr 2020 13:53:17 +0200 Subject: [PATCH 07/67] [State Management] ScopedHistory support for state syncing utils (#62761) The needed change is to rely on history as source of truth for location instead of window.location. btw, This makes possible to test state syncing utils integration using createMemoryHistory() One issue was discovered after this change: When switching from context to discover url was incorrect. history.location inside state syncing utils didn't get the last update. This happened, because history instance created in discover wasn't used in context app and when all listeners unsubscribed from it - it stopped receiving location updates. To fix this I just reused one history instance in discover, context and their kbnUrlTracker --- .../public/todo/app.tsx | 12 +- .../public/todo/todo.tsx | 10 +- .../public/with_data_services/application.tsx | 4 +- .../kibana/public/discover/build_services.ts | 10 +- .../kibana/public/discover/kibana_services.ts | 6 + .../discover/np_ready/angular/context.js | 1 + .../np_ready/angular/context_state.ts | 8 +- .../discover/np_ready/angular/discover.js | 5 +- .../sidebar/discover_field.test.tsx | 4 +- .../sidebar/discover_sidebar.test.tsx | 4 +- .../sidebar/lib/visualize_url_utils.ts | 2 +- .../kibana/public/discover/plugin.ts | 8 +- .../url/kbn_url_storage.test.ts | 46 ++++- .../state_management/url/kbn_url_storage.ts | 9 +- .../state_management/url/kbn_url_tracker.ts | 9 +- .../public/state_management/url/parse.ts | 5 +- .../create_kbn_url_state_storage.test.ts | 75 +++++++ test/examples/config.js | 1 + test/examples/state_sync/index.ts | 39 ++++ test/examples/state_sync/todo_app.ts | 189 ++++++++++++++++++ 20 files changed, 403 insertions(+), 44 deletions(-) create mode 100644 test/examples/state_sync/index.ts create mode 100644 test/examples/state_sync/todo_app.ts diff --git a/examples/state_containers_examples/public/todo/app.tsx b/examples/state_containers_examples/public/todo/app.tsx index 319680d07f9bc..f2183613e4a12 100644 --- a/examples/state_containers_examples/public/todo/app.tsx +++ b/examples/state_containers_examples/public/todo/app.tsx @@ -20,7 +20,7 @@ import { AppMountParameters } from 'kibana/public'; import ReactDOM from 'react-dom'; import React from 'react'; -import { createHashHistory, createBrowserHistory } from 'history'; +import { createHashHistory } from 'history'; import { TodoAppPage } from './todo'; export interface AppOptions { @@ -35,13 +35,10 @@ export enum History { } export const renderApp = ( - { appBasePath, element }: AppMountParameters, + { appBasePath, element, history: platformHistory }: AppMountParameters, { appInstanceId, appTitle, historyType }: AppOptions ) => { - const history = - historyType === History.Browser - ? createBrowserHistory({ basename: appBasePath }) - : createHashHistory(); + const history = historyType === History.Browser ? platformHistory : createHashHistory(); ReactDOM.render( = ({ filter }) => { return ( <>
- + All - + Completed - + Not Completed @@ -121,6 +124,7 @@ const TodoApp: React.FC = ({ filter }) => { }); }} label={todo.text} + data-test-subj={`todoCheckbox-${todo.id}`} /> { - const history = createBrowserHistory({ basename: appBasePath }); const kbnUrlStateStorage = createKbnUrlStateStorage({ useHash: false, history }); ReactDOM.render( diff --git a/src/legacy/core_plugins/kibana/public/discover/build_services.ts b/src/legacy/core_plugins/kibana/public/discover/build_services.ts index a3a99a0ded523..c56e50f3b27ff 100644 --- a/src/legacy/core_plugins/kibana/public/discover/build_services.ts +++ b/src/legacy/core_plugins/kibana/public/discover/build_services.ts @@ -16,7 +16,7 @@ * specific language governing permissions and limitations * under the License. */ -import { createHashHistory, History } from 'history'; +import { History } from 'history'; import { Capabilities, @@ -51,7 +51,7 @@ export interface DiscoverServices { data: DataPublicPluginStart; docLinks: DocLinksStart; DocViewer: DocViewerComponent; - history: History; + history: () => History; theme: ChartsPluginStart['theme']; filterManager: FilterManager; indexPatterns: IndexPatternsContract; @@ -67,7 +67,8 @@ export interface DiscoverServices { } export async function buildServices( core: CoreStart, - plugins: DiscoverStartPlugins + plugins: DiscoverStartPlugins, + getHistory: () => History ): Promise { const services = { savedObjectsClient: core.savedObjects.client, @@ -77,6 +78,7 @@ export async function buildServices( overlays: core.overlays, }; const savedObjectService = createSavedSearchesLoader(services); + return { addBasePath: core.http.basePath.prepend, capabilities: core.application.capabilities, @@ -85,11 +87,11 @@ export async function buildServices( data: plugins.data, docLinks: core.docLinks, DocViewer: plugins.discover.docViews.DocViewer, - history: createHashHistory(), theme: plugins.charts.theme, filterManager: plugins.data.query.filterManager, getSavedSearchById: async (id: string) => savedObjectService.get(id), getSavedSearchUrlById: async (id: string) => savedObjectService.urlFor(id), + history: getHistory, indexPatterns: plugins.data.indexPatterns, inspector: plugins.inspector, // @ts-ignore diff --git a/src/legacy/core_plugins/kibana/public/discover/kibana_services.ts b/src/legacy/core_plugins/kibana/public/discover/kibana_services.ts index 0a81ca0222b0a..156267bdfa87e 100644 --- a/src/legacy/core_plugins/kibana/public/discover/kibana_services.ts +++ b/src/legacy/core_plugins/kibana/public/discover/kibana_services.ts @@ -16,6 +16,7 @@ * specific language governing permissions and limitations * under the License. */ +import { createHashHistory } from 'history'; import { DiscoverServices } from './build_services'; import { createGetterSetter } from '../../../../../plugins/kibana_utils/public'; import { search } from '../../../../../plugins/data/public'; @@ -52,6 +53,11 @@ export const [getUrlTracker, setUrlTracker] = createGetterSetter<{ setTrackedUrl: (url: string) => void; }>('urlTracker'); +/** + * Makes sure discover and context are using one instance of history + */ +export const getHistory = _.once(() => createHashHistory()); + export const { getRequestInspectorStats, getResponseInspectorStats, tabifyAggResponse } = search; export { unhashUrl, diff --git a/src/legacy/core_plugins/kibana/public/discover/np_ready/angular/context.js b/src/legacy/core_plugins/kibana/public/discover/np_ready/angular/context.js index 5b03b313e4e3e..032ec7af09a30 100644 --- a/src/legacy/core_plugins/kibana/public/discover/np_ready/angular/context.js +++ b/src/legacy/core_plugins/kibana/public/discover/np_ready/angular/context.js @@ -81,6 +81,7 @@ function ContextAppRouteController($routeParams, $scope, $route) { defaultStepSize: getServices().uiSettings.get('context:defaultSize'), timeFieldName: indexPattern.timeFieldName, storeInSessionStorage: getServices().uiSettings.get('state:storeInSessionStorage'), + history: getServices().history(), }); this.state = { ...appState.getState() }; this.anchorId = $routeParams.id; diff --git a/src/legacy/core_plugins/kibana/public/discover/np_ready/angular/context_state.ts b/src/legacy/core_plugins/kibana/public/discover/np_ready/angular/context_state.ts index ed59143b163f6..b46995d44d826 100644 --- a/src/legacy/core_plugins/kibana/public/discover/np_ready/angular/context_state.ts +++ b/src/legacy/core_plugins/kibana/public/discover/np_ready/angular/context_state.ts @@ -17,7 +17,7 @@ * under the License. */ import _ from 'lodash'; -import { createBrowserHistory, History } from 'history'; +import { History } from 'history'; import { createStateContainer, createKbnUrlStateStorage, @@ -71,9 +71,9 @@ interface GetStateParams { */ storeInSessionStorage?: boolean; /** - * Browser history used for testing + * History instance to use */ - history?: History; + history: History; } interface GetStateReturn { @@ -126,7 +126,7 @@ export function getState({ }: GetStateParams): GetStateReturn { const stateStorage = createKbnUrlStateStorage({ useHash: storeInSessionStorage, - history: history ? history : createBrowserHistory(), + history, }); const globalStateInitial = stateStorage.get(GLOBAL_STATE_URL_KEY) as GlobalState; diff --git a/src/legacy/core_plugins/kibana/public/discover/np_ready/angular/discover.js b/src/legacy/core_plugins/kibana/public/discover/np_ready/angular/discover.js index 56966d6294c9a..567cfda45cc0d 100644 --- a/src/legacy/core_plugins/kibana/public/discover/np_ready/angular/discover.js +++ b/src/legacy/core_plugins/kibana/public/discover/np_ready/angular/discover.js @@ -57,7 +57,7 @@ const { core, chrome, data, - history, + history: getHistory, indexPatterns, filterManager, share, @@ -116,6 +116,7 @@ app.config($routeProvider => { reloadOnSearch: false, resolve: { savedObjects: function($route, Promise) { + const history = getHistory(); const savedSearchId = $route.current.params.id; return ensureDefaultIndexPattern(core, data, history).then(() => { const { appStateContainer } = getState({ history }); @@ -204,6 +205,8 @@ function discoverController( return isDefaultType($scope.indexPattern) ? $scope.indexPattern.timeFieldName : undefined; }; + const history = getHistory(); + const { appStateContainer, startSync: startStateSync, diff --git a/src/legacy/core_plugins/kibana/public/discover/np_ready/components/sidebar/discover_field.test.tsx b/src/legacy/core_plugins/kibana/public/discover/np_ready/components/sidebar/discover_field.test.tsx index 9a6bd65813d18..fdae2c0c16c9f 100644 --- a/src/legacy/core_plugins/kibana/public/discover/np_ready/components/sidebar/discover_field.test.tsx +++ b/src/legacy/core_plugins/kibana/public/discover/np_ready/components/sidebar/discover_field.test.tsx @@ -31,11 +31,11 @@ import { IndexPatternField } from '../../../../../../../../plugins/data/public'; jest.mock('../../../kibana_services', () => ({ getServices: () => ({ - history: { + history: () => ({ location: { search: '', }, - }, + }), capabilities: { visualize: { show: true, diff --git a/src/legacy/core_plugins/kibana/public/discover/np_ready/components/sidebar/discover_sidebar.test.tsx b/src/legacy/core_plugins/kibana/public/discover/np_ready/components/sidebar/discover_sidebar.test.tsx index 0df14515adc6d..29451c075bcad 100644 --- a/src/legacy/core_plugins/kibana/public/discover/np_ready/components/sidebar/discover_sidebar.test.tsx +++ b/src/legacy/core_plugins/kibana/public/discover/np_ready/components/sidebar/discover_sidebar.test.tsx @@ -36,11 +36,11 @@ import { SavedObject } from '../../../../../../../../core/types'; jest.mock('../../../kibana_services', () => ({ getServices: () => ({ - history: { + history: () => ({ location: { search: '', }, - }, + }), capabilities: { visualize: { show: true, diff --git a/src/legacy/core_plugins/kibana/public/discover/np_ready/components/sidebar/lib/visualize_url_utils.ts b/src/legacy/core_plugins/kibana/public/discover/np_ready/components/sidebar/lib/visualize_url_utils.ts index d146d212055b7..968ceeeab73a5 100644 --- a/src/legacy/core_plugins/kibana/public/discover/np_ready/components/sidebar/lib/visualize_url_utils.ts +++ b/src/legacy/core_plugins/kibana/public/discover/np_ready/components/sidebar/lib/visualize_url_utils.ts @@ -125,7 +125,7 @@ export function getVisualizeUrl( services: DiscoverServices ) { const aggsTermSize = services.uiSettings.get('discover:aggs:terms:size'); - const urlParams = parse(services.history.location.search) as Record; + const urlParams = parse(services.history().location.search) as Record; if ( (field.type === KBN_FIELD_TYPES.GEO_POINT || field.type === KBN_FIELD_TYPES.GEO_SHAPE) && diff --git a/src/legacy/core_plugins/kibana/public/discover/plugin.ts b/src/legacy/core_plugins/kibana/public/discover/plugin.ts index d05e96ccaaf0b..42883abe98171 100644 --- a/src/legacy/core_plugins/kibana/public/discover/plugin.ts +++ b/src/legacy/core_plugins/kibana/public/discover/plugin.ts @@ -31,7 +31,7 @@ import { registerFeature } from './np_ready/register_feature'; import './kibana_services'; import { EmbeddableStart, EmbeddableSetup } from '../../../../../plugins/embeddable/public'; import { getInnerAngularModule, getInnerAngularModuleEmbeddable } from './get_inner_angular'; -import { setAngularModule, setServices, setUrlTracker } from './kibana_services'; +import { getHistory, setAngularModule, setServices, setUrlTracker } from './kibana_services'; import { NavigationPublicPluginStart as NavigationStart } from '../../../../../plugins/navigation/public'; import { ChartsPluginStart } from '../../../../../plugins/charts/public'; import { buildServices } from './build_services'; @@ -98,6 +98,10 @@ export class DiscoverPlugin implements Plugin { stop: stopUrlTracker, setActiveUrl: setTrackedUrl, } = createKbnUrlTracker({ + // we pass getter here instead of plain `history`, + // so history is lazily created (when app is mounted) + // this prevents redundant `#` when not in discover app + getHistory, baseUrl: core.http.basePath.prepend('/app/kibana'), defaultSubUrl: '#/discover', storageKey: `lastUrl:${core.http.basePath.get()}:discover`, @@ -174,7 +178,7 @@ export class DiscoverPlugin implements Plugin { if (this.servicesInitialized) { return { core, plugins }; } - const services = await buildServices(core, plugins); + const services = await buildServices(core, plugins, getHistory); setServices(services); this.servicesInitialized = true; diff --git a/src/plugins/kibana_utils/public/state_management/url/kbn_url_storage.test.ts b/src/plugins/kibana_utils/public/state_management/url/kbn_url_storage.test.ts index 6e4c505c62ebc..513c70e60048a 100644 --- a/src/plugins/kibana_utils/public/state_management/url/kbn_url_storage.test.ts +++ b/src/plugins/kibana_utils/public/state_management/url/kbn_url_storage.test.ts @@ -31,6 +31,7 @@ import { setStateToKbnUrl, getStateFromKbnUrl, } from './kbn_url_storage'; +import { ScopedHistory } from '../../../../../core/public'; describe('kbn_url_storage', () => { describe('getStateFromUrl & setStateToUrl', () => { @@ -187,23 +188,54 @@ describe('kbn_url_storage', () => { urlControls.update('/', true); }); - const getCurrentUrl = () => window.location.href; + const getCurrentUrl = () => history.createHref(history.location); it('should flush async url updates', async () => { const pr1 = urlControls.updateAsync(() => '/1', false); const pr2 = urlControls.updateAsync(() => '/2', false); const pr3 = urlControls.updateAsync(() => '/3', false); - expect(getCurrentUrl()).toBe('http://localhost/'); - expect(urlControls.flush()).toBe('http://localhost/3'); - expect(getCurrentUrl()).toBe('http://localhost/3'); + expect(getCurrentUrl()).toBe('/'); + expect(urlControls.flush()).toBe('/3'); + expect(getCurrentUrl()).toBe('/3'); + await Promise.all([pr1, pr2, pr3]); + expect(getCurrentUrl()).toBe('/3'); + }); + + it('flush() should return undefined, if no url updates happened', () => { + expect(urlControls.flush()).toBeUndefined(); + urlControls.updateAsync(() => '/1', false); + urlControls.updateAsync(() => '/', false); + expect(urlControls.flush()).toBeUndefined(); + }); + }); + + describe('urlControls - scoped history integration', () => { + let history: History; + let urlControls: IKbnUrlControls; + beforeEach(() => { + const parentHistory = createBrowserHistory(); + parentHistory.replace('/app/kibana/'); + history = new ScopedHistory(parentHistory, '/app/kibana/'); + urlControls = createKbnUrlControls(history); + }); + + const getCurrentUrl = () => history.createHref(history.location); + + it('should flush async url updates', async () => { + const pr1 = urlControls.updateAsync(() => '/app/kibana/1', false); + const pr2 = urlControls.updateAsync(() => '/app/kibana/2', false); + const pr3 = urlControls.updateAsync(() => '/app/kibana/3', false); + expect(getCurrentUrl()).toBe('/app/kibana/'); + expect(urlControls.flush()).toBe('/app/kibana/3'); + expect(getCurrentUrl()).toBe('/app/kibana/3'); await Promise.all([pr1, pr2, pr3]); - expect(getCurrentUrl()).toBe('http://localhost/3'); + expect(getCurrentUrl()).toBe('/app/kibana/3'); }); it('flush() should return undefined, if no url updates happened', () => { expect(urlControls.flush()).toBeUndefined(); - urlControls.updateAsync(() => 'http://localhost/1', false); - urlControls.updateAsync(() => 'http://localhost/', false); + urlControls.updateAsync(() => '/app/kibana/1', false); + urlControls.updateAsync(() => '/app/kibana/', false); expect(urlControls.flush()).toBeUndefined(); }); }); diff --git a/src/plugins/kibana_utils/public/state_management/url/kbn_url_storage.ts b/src/plugins/kibana_utils/public/state_management/url/kbn_url_storage.ts index 40a411d425a54..337d122e2854b 100644 --- a/src/plugins/kibana_utils/public/state_management/url/kbn_url_storage.ts +++ b/src/plugins/kibana_utils/public/state_management/url/kbn_url_storage.ts @@ -154,7 +154,7 @@ export const createKbnUrlControls = ( let shouldReplace = true; function updateUrl(newUrl: string, replace = false): string | undefined { - const currentUrl = getCurrentUrl(); + const currentUrl = getCurrentUrl(history); if (newUrl === currentUrl) return undefined; // skip update const historyPath = getRelativeToHistoryPath(newUrl, history); @@ -165,7 +165,7 @@ export const createKbnUrlControls = ( history.push(historyPath); } - return getCurrentUrl(); + return getCurrentUrl(history); } // queue clean up @@ -187,7 +187,10 @@ export const createKbnUrlControls = ( function getPendingUrl() { if (updateQueue.length === 0) return undefined; - const resultUrl = updateQueue.reduce((url, nextUpdate) => nextUpdate(url), getCurrentUrl()); + const resultUrl = updateQueue.reduce( + (url, nextUpdate) => nextUpdate(url), + getCurrentUrl(history) + ); return resultUrl; } diff --git a/src/plugins/kibana_utils/public/state_management/url/kbn_url_tracker.ts b/src/plugins/kibana_utils/public/state_management/url/kbn_url_tracker.ts index af8811b1969e6..8adbbfb06e1ed 100644 --- a/src/plugins/kibana_utils/public/state_management/url/kbn_url_tracker.ts +++ b/src/plugins/kibana_utils/public/state_management/url/kbn_url_tracker.ts @@ -57,6 +57,7 @@ export function createKbnUrlTracker({ navLinkUpdater$, toastNotifications, history, + getHistory, storage, shouldTrackUrlUpdate = pathname => { const currentAppName = defaultSubUrl.slice(2); // cut hash and slash symbols @@ -103,6 +104,12 @@ export function createKbnUrlTracker({ * History object to use to track url changes. If this isn't provided, a local history instance will be created. */ history?: History; + + /** + * Lazily retrieve history instance + */ + getHistory?: () => History; + /** * Storage object to use to persist currently active url. If this isn't provided, the browser wide session storage instance will be used. */ @@ -158,7 +165,7 @@ export function createKbnUrlTracker({ function onMountApp() { unsubscribe(); - const historyInstance = history || createHashHistory(); + const historyInstance = history || (getHistory && getHistory()) || createHashHistory(); // track current hash when within app unsubscribeURLHistory = historyInstance.listen(location => { if (shouldTrackUrlUpdate(location.pathname)) { diff --git a/src/plugins/kibana_utils/public/state_management/url/parse.ts b/src/plugins/kibana_utils/public/state_management/url/parse.ts index 95041d0662f56..6339002ea5c68 100644 --- a/src/plugins/kibana_utils/public/state_management/url/parse.ts +++ b/src/plugins/kibana_utils/public/state_management/url/parse.ts @@ -18,12 +18,11 @@ */ import { parse as _parseUrl } from 'url'; +import { History } from 'history'; export const parseUrl = (url: string) => _parseUrl(url, true); export const parseUrlHash = (url: string) => { const hash = parseUrl(url).hash; return hash ? parseUrl(hash.slice(1)) : null; }; -export const getCurrentUrl = () => window.location.href; -export const parseCurrentUrl = () => parseUrl(getCurrentUrl()); -export const parseCurrentUrlHash = () => parseUrlHash(getCurrentUrl()); +export const getCurrentUrl = (history: History) => history.createHref(history.location); diff --git a/src/plugins/kibana_utils/public/state_sync/state_sync_state_storage/create_kbn_url_state_storage.test.ts b/src/plugins/kibana_utils/public/state_sync/state_sync_state_storage/create_kbn_url_state_storage.test.ts index cc3f1df7c1e00..8a9a4ea71ee9a 100644 --- a/src/plugins/kibana_utils/public/state_sync/state_sync_state_storage/create_kbn_url_state_storage.test.ts +++ b/src/plugins/kibana_utils/public/state_sync/state_sync_state_storage/create_kbn_url_state_storage.test.ts @@ -21,6 +21,7 @@ import { createKbnUrlStateStorage, IKbnUrlStateStorage } from './create_kbn_url_ import { History, createBrowserHistory } from 'history'; import { takeUntil, toArray } from 'rxjs/operators'; import { Subject } from 'rxjs'; +import { ScopedHistory } from '../../../../../core/public'; describe('KbnUrlStateStorage', () => { describe('useHash: false', () => { @@ -132,4 +133,78 @@ describe('KbnUrlStateStorage', () => { expect(await result).toEqual([{ test: 'test', ok: 1 }, { test: 'test', ok: 2 }, null]); }); }); + + describe('ScopedHistory integration', () => { + let urlStateStorage: IKbnUrlStateStorage; + let history: ScopedHistory; + const getCurrentUrl = () => history.createHref(history.location); + beforeEach(() => { + const parentHistory = createBrowserHistory(); + parentHistory.push('/kibana/app/'); + history = new ScopedHistory(parentHistory, '/kibana/app/'); + urlStateStorage = createKbnUrlStateStorage({ useHash: false, history }); + }); + + it('should persist state to url', async () => { + const state = { test: 'test', ok: 1 }; + const key = '_s'; + await urlStateStorage.set(key, state); + expect(getCurrentUrl()).toMatchInlineSnapshot(`"/kibana/app/#?_s=(ok:1,test:test)"`); + expect(urlStateStorage.get(key)).toEqual(state); + }); + + it('should flush state to url', () => { + const state = { test: 'test', ok: 1 }; + const key = '_s'; + urlStateStorage.set(key, state); + expect(getCurrentUrl()).toMatchInlineSnapshot(`"/kibana/app/"`); + expect(urlStateStorage.flush()).toBe(true); + expect(getCurrentUrl()).toMatchInlineSnapshot(`"/kibana/app/#?_s=(ok:1,test:test)"`); + expect(urlStateStorage.get(key)).toEqual(state); + + expect(urlStateStorage.flush()).toBe(false); // nothing to flush, not update + }); + + it('should cancel url updates', async () => { + const state = { test: 'test', ok: 1 }; + const key = '_s'; + const pr = urlStateStorage.set(key, state); + expect(getCurrentUrl()).toMatchInlineSnapshot(`"/kibana/app/"`); + urlStateStorage.cancel(); + await pr; + expect(getCurrentUrl()).toMatchInlineSnapshot(`"/kibana/app/"`); + expect(urlStateStorage.get(key)).toEqual(null); + }); + + it('should cancel url updates if synchronously returned to the same state', async () => { + const state1 = { test: 'test', ok: 1 }; + const state2 = { test: 'test', ok: 2 }; + const key = '_s'; + const pr1 = urlStateStorage.set(key, state1); + await pr1; + const historyLength = history.length; + const pr2 = urlStateStorage.set(key, state2); + const pr3 = urlStateStorage.set(key, state1); + await Promise.all([pr2, pr3]); + expect(history.length).toBe(historyLength); + }); + + it('should notify about url changes', async () => { + expect(urlStateStorage.change$).toBeDefined(); + const key = '_s'; + const destroy$ = new Subject(); + const result = urlStateStorage.change$!(key) + .pipe(takeUntil(destroy$), toArray()) + .toPromise(); + + history.push(`/#?${key}=(ok:1,test:test)`); + history.push(`/?query=test#?${key}=(ok:2,test:test)&some=test`); + history.push(`/?query=test#?some=test`); + + destroy$.next(); + destroy$.complete(); + + expect(await result).toEqual([{ test: 'test', ok: 1 }, { test: 'test', ok: 2 }, null]); + }); + }); }); diff --git a/test/examples/config.js b/test/examples/config.js index 49d75da286075..2be34459d8d06 100644 --- a/test/examples/config.js +++ b/test/examples/config.js @@ -28,6 +28,7 @@ export default async function({ readConfigFile }) { require.resolve('./search'), require.resolve('./embeddables'), require.resolve('./ui_actions'), + require.resolve('./state_sync'), ], services: { ...functionalConfig.get('services'), diff --git a/test/examples/state_sync/index.ts b/test/examples/state_sync/index.ts new file mode 100644 index 0000000000000..3c524f0feb619 --- /dev/null +++ b/test/examples/state_sync/index.ts @@ -0,0 +1,39 @@ +/* + * 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 { PluginFunctionalProviderContext } from 'test/plugin_functional/services'; + +// eslint-disable-next-line import/no-default-export +export default function({ + getService, + getPageObjects, + loadTestFile, +}: PluginFunctionalProviderContext) { + const browser = getService('browser'); + const PageObjects = getPageObjects(['common']); + + describe('state sync examples', function() { + before(async () => { + await browser.setWindowSize(1300, 900); + await PageObjects.common.navigateToApp('settings'); + }); + + loadTestFile(require.resolve('./todo_app')); + }); +} diff --git a/test/examples/state_sync/todo_app.ts b/test/examples/state_sync/todo_app.ts new file mode 100644 index 0000000000000..4933d746ca4fd --- /dev/null +++ b/test/examples/state_sync/todo_app.ts @@ -0,0 +1,189 @@ +/* + * 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 expect from '@kbn/expect'; + +import { PluginFunctionalProviderContext } from 'test/plugin_functional/services'; + +// eslint-disable-next-line import/no-default-export +export default function({ getService, getPageObjects }: PluginFunctionalProviderContext) { + const testSubjects = getService('testSubjects'); + const find = getService('find'); + const retry = getService('retry'); + const appsMenu = getService('appsMenu'); + const browser = getService('browser'); + const PageObjects = getPageObjects(['common']); + const log = getService('log'); + + describe('TODO app', () => { + describe("TODO app with browser history (platform's ScopedHistory)", async () => { + const appId = 'stateContainersExampleBrowserHistory'; + let base: string; + + before(async () => { + base = await PageObjects.common.getHostPort(); + await appsMenu.clickLink('State containers example - browser history routing'); + }); + + it('links are rendered correctly and state is preserved in links', async () => { + const getHrefByLinkTestSubj = async (linkTestSubj: string) => + (await testSubjects.find(linkTestSubj)).getAttribute('href'); + + await expectPathname(await getHrefByLinkTestSubj('filterLinkCompleted'), '/completed'); + await expectPathname( + await getHrefByLinkTestSubj('filterLinkNotCompleted'), + '/not-completed' + ); + await expectPathname(await getHrefByLinkTestSubj('filterLinkAll'), '/'); + }); + + it('TODO app state is synced with url, back navigation works', async () => { + // checking that in initial state checkbox is unchecked and state is synced with url + expect(await testSubjects.isChecked('todoCheckbox-0')).to.be(false); + expect(await browser.getCurrentUrl()).to.contain('completed:!f'); + + // check the checkbox by clicking the label (clicking checkbox directly fails as it is "no intractable") + (await find.byCssSelector('label[for="0"]')).click(); + + // wait for react to update dom and checkbox in checked state + await retry.tryForTime(1000, async () => { + await expect(await testSubjects.isChecked('todoCheckbox-0')).to.be(true); + }); + // checking that url is updated with checked state + expect(await browser.getCurrentUrl()).to.contain('completed:!t'); + + // checking back and forward button + await browser.goBack(); + expect(await browser.getCurrentUrl()).to.contain('completed:!f'); + await retry.tryForTime(1000, async () => { + await expect(await testSubjects.isChecked('todoCheckbox-0')).to.be(false); + }); + + await browser.goForward(); + expect(await browser.getCurrentUrl()).to.contain('completed:!t'); + await retry.tryForTime(1000, async () => { + await expect(await testSubjects.isChecked('todoCheckbox-0')).to.be(true); + }); + }); + + it('links navigation works', async () => { + // click link to filter only not completed + await testSubjects.click('filterLinkNotCompleted'); + await expectPathname(await browser.getCurrentUrl(), '/not-completed'); + // checkbox should be missing because it is "completed" + await testSubjects.missingOrFail('todoCheckbox-0'); + }); + + /** + * Parses app's scoped pathname from absolute url and asserts it against `expectedPathname` + * Also checks that hashes are equal (detail of todo app that state is rendered in links) + * @param absoluteUrl + * @param expectedPathname + */ + async function expectPathname(absoluteUrl: string, expectedPathname: string) { + const scoped = await getScopedUrl(absoluteUrl); + const [pathname, newHash] = scoped.split('#'); + expect(pathname).to.be(expectedPathname); + const [, currentHash] = (await browser.getCurrentUrl()).split('#'); + expect(newHash.replace(/%27/g, "'")).to.be(currentHash.replace(/%27/g, "'")); + } + + /** + * Get's part of url scoped to this app (removed kibana's host and app's pathname) + * @param url - absolute url + */ + async function getScopedUrl(url: string): Promise { + expect(url).to.contain(base); + expect(url).to.contain(appId); + const scopedUrl = url.slice(url.indexOf(appId) + appId.length); + expect(scopedUrl).not.to.contain(appId); // app id in url only once + return scopedUrl; + } + }); + + describe('TODO app with hash history ', async () => { + before(async () => { + await appsMenu.clickLink('State containers example - hash history routing'); + }); + + it('Links are rendered correctly and state is preserved in links', async () => { + const getHrefByLinkTestSubj = async (linkTestSubj: string) => + (await testSubjects.find(linkTestSubj)).getAttribute('href'); + await expectHashPathname(await getHrefByLinkTestSubj('filterLinkCompleted'), '/completed'); + await expectHashPathname( + await getHrefByLinkTestSubj('filterLinkNotCompleted'), + '/not-completed' + ); + await expectHashPathname(await getHrefByLinkTestSubj('filterLinkAll'), '/'); + }); + + it('TODO app state is synced with url, back navigation works', async () => { + // checking that in initial state checkbox is unchecked and state is synced with url + expect(await testSubjects.isChecked('todoCheckbox-0')).to.be(false); + expect(await browser.getCurrentUrl()).to.contain('completed:!f'); + // check the checkbox by clicking the label (clicking checkbox directly fails as it is "no intractable") + (await find.byCssSelector('label[for="0"]')).click(); + + // wait for react to update dom and checkbox in checked state + await retry.tryForTime(1000, async () => { + await expect(await testSubjects.isChecked('todoCheckbox-0')).to.be(true); + }); + // checking that url is updated with checked state + expect(await browser.getCurrentUrl()).to.contain('completed:!t'); + + // checking back and forward button + await browser.goBack(); + expect(await browser.getCurrentUrl()).to.contain('completed:!f'); + await retry.tryForTime(1000, async () => { + await expect(await testSubjects.isChecked('todoCheckbox-0')).to.be(false); + }); + + await browser.goForward(); + expect(await browser.getCurrentUrl()).to.contain('completed:!t'); + await retry.tryForTime(1000, async () => { + await expect(await testSubjects.isChecked('todoCheckbox-0')).to.be(true); + }); + }); + + it('links navigation works', async () => { + // click link to filter only not completed + await testSubjects.click('filterLinkNotCompleted'); + await expectHashPathname(await browser.getCurrentUrl(), '/not-completed'); + // checkbox should be missing because it is "completed" + await testSubjects.missingOrFail('todoCheckbox-0'); + }); + + /** + * Parses app's pathname in hash from absolute url and asserts it against `expectedPathname` + * Also checks that queries in hashes are equal (detail of todo app that state is rendered in links) + * @param absoluteUrl + * @param expectedPathname + */ + async function expectHashPathname(hash: string, expectedPathname: string) { + log.debug(`expect hash pathname ${hash} to be ${expectedPathname}`); + const hashPath = hash.split('#')[1]; + const [hashPathname, hashQuery] = hashPath.split('?'); + const [, currentHash] = (await browser.getCurrentUrl()).split('#'); + const [, currentHashQuery] = currentHash.split('?'); + expect(currentHashQuery.replace(/%27/g, "'")).to.be(hashQuery.replace(/%27/g, "'")); + expect(hashPathname).to.be(expectedPathname); + } + }); + }); +} From 698717173d0480438576a5832b7a0a0208ffc0ec Mon Sep 17 00:00:00 2001 From: Christos Nasikas Date: Tue, 21 Apr 2020 15:09:42 +0300 Subject: [PATCH 08/67] [SIEM][CASE] Server common constants (#63952) --- .../siem/public/containers/case/api.test.tsx | 6 +- .../siem/public/containers/case/api.ts | 55 +++++++++++-------- .../public/containers/case/configure/api.ts | 23 ++++---- .../siem/public/containers/case/constants.ts | 2 - x-pack/plugins/case/common/api/helpers.ts | 28 ++++++++++ x-pack/plugins/case/common/constants.ts | 29 ++++++++++ .../api/cases/comments/delete_all_comments.ts | 3 +- .../api/cases/comments/delete_comment.test.ts | 5 +- .../api/cases/comments/delete_comment.ts | 3 +- .../api/cases/comments/find_comments.ts | 3 +- .../api/cases/comments/get_all_comment.ts | 3 +- .../api/cases/comments/get_comment.test.ts | 5 +- .../routes/api/cases/comments/get_comment.ts | 3 +- .../api/cases/comments/patch_comment.test.ts | 7 ++- .../api/cases/comments/patch_comment.ts | 3 +- .../api/cases/comments/post_comment.test.ts | 9 +-- .../routes/api/cases/comments/post_comment.ts | 3 +- .../api/cases/configure/get_configure.test.ts | 9 +-- .../api/cases/configure/get_configure.ts | 3 +- .../cases/configure/get_connectors.test.ts | 5 +- .../api/cases/configure/get_connectors.ts | 4 +- .../cases/configure/patch_configure.test.ts | 11 ++-- .../api/cases/configure/patch_configure.ts | 3 +- .../cases/configure/post_configure.test.ts | 25 +++++---- .../api/cases/configure/post_configure.ts | 3 +- .../routes/api/cases/delete_cases.test.ts | 9 +-- .../server/routes/api/cases/delete_cases.ts | 3 +- .../routes/api/cases/find_cases.test.ts | 3 +- .../server/routes/api/cases/find_cases.ts | 3 +- .../server/routes/api/cases/get_case.test.ts | 9 +-- .../case/server/routes/api/cases/get_case.ts | 3 +- .../server/routes/api/cases/patch_cases.ts | 3 +- .../server/routes/api/cases/post_case.test.ts | 9 +-- .../case/server/routes/api/cases/post_case.ts | 3 +- .../case/server/routes/api/cases/push_case.ts | 3 +- .../api/cases/reporters/get_reporters.ts | 3 +- .../routes/api/cases/status/get_status.ts | 3 +- .../server/routes/api/cases/tags/get_tags.ts | 3 +- .../user_actions/get_all_user_actions.ts | 3 +- 39 files changed, 207 insertions(+), 106 deletions(-) create mode 100644 x-pack/plugins/case/common/api/helpers.ts create mode 100644 x-pack/plugins/case/common/constants.ts diff --git a/x-pack/legacy/plugins/siem/public/containers/case/api.test.tsx b/x-pack/legacy/plugins/siem/public/containers/case/api.test.tsx index 4f5655cc9f221..693a7175ebc3e 100644 --- a/x-pack/legacy/plugins/siem/public/containers/case/api.test.tsx +++ b/x-pack/legacy/plugins/siem/public/containers/case/api.test.tsx @@ -5,6 +5,9 @@ */ import { KibanaServices } from '../../lib/kibana'; + +import { CASES_URL } from '../../../../../../plugins/case/common/constants'; + import { deleteCases, getActionLicense, @@ -22,6 +25,7 @@ import { pushCase, pushToService, } from './api'; + import { actionLicenses, allCases, @@ -44,7 +48,7 @@ import { caseUserActionsSnake, casesStatusSnake, } from './mock'; -import { CASES_URL } from './constants'; + import { DEFAULT_FILTER_OPTIONS, DEFAULT_QUERY_PARAMS } from './use_get_cases'; import * as i18n from './translations'; diff --git a/x-pack/legacy/plugins/siem/public/containers/case/api.ts b/x-pack/legacy/plugins/siem/public/containers/case/api.ts index 12b4c80a2dd89..b745361632419 100644 --- a/x-pack/legacy/plugins/siem/public/containers/case/api.ts +++ b/x-pack/legacy/plugins/siem/public/containers/case/api.ts @@ -20,6 +20,21 @@ import { ActionTypeExecutorResult, } from '../../../../../../plugins/case/common/api'; +import { + CASE_STATUS_URL, + CASES_URL, + CASE_TAGS_URL, + CASE_REPORTERS_URL, + ACTION_TYPES_URL, + ACTION_URL, +} from '../../../../../../plugins/case/common/constants'; + +import { + getCaseDetailsUrl, + getCaseUserActionUrl, + getCaseCommentsUrl, +} from '../../../../../../plugins/case/common/api/helpers'; + import { KibanaServices } from '../../lib/kibana'; import { @@ -33,8 +48,6 @@ import { CaseUserActions, } from './types'; -import { CASES_URL } from './constants'; - import { convertToCamelCase, convertAllCasesToCamel, @@ -54,7 +67,7 @@ export const getCase = async ( includeComments: boolean = true, signal: AbortSignal ): Promise => { - const response = await KibanaServices.get().http.fetch(`${CASES_URL}/${caseId}`, { + const response = await KibanaServices.get().http.fetch(getCaseDetailsUrl(caseId), { method: 'GET', query: { includeComments, @@ -65,18 +78,15 @@ export const getCase = async ( }; export const getCasesStatus = async (signal: AbortSignal): Promise => { - const response = await KibanaServices.get().http.fetch( - `${CASES_URL}/status`, - { - method: 'GET', - signal, - } - ); + const response = await KibanaServices.get().http.fetch(CASE_STATUS_URL, { + method: 'GET', + signal, + }); return convertToCamelCase(decodeCasesStatusResponse(response)); }; export const getTags = async (signal: AbortSignal): Promise => { - const response = await KibanaServices.get().http.fetch(`${CASES_URL}/tags`, { + const response = await KibanaServices.get().http.fetch(CASE_TAGS_URL, { method: 'GET', signal, }); @@ -84,7 +94,7 @@ export const getTags = async (signal: AbortSignal): Promise => { }; export const getReporters = async (signal: AbortSignal): Promise => { - const response = await KibanaServices.get().http.fetch(`${CASES_URL}/reporters`, { + const response = await KibanaServices.get().http.fetch(CASE_REPORTERS_URL, { method: 'GET', signal, }); @@ -96,7 +106,7 @@ export const getCaseUserActions = async ( signal: AbortSignal ): Promise => { const response = await KibanaServices.get().http.fetch( - `${CASES_URL}/${caseId}/user_actions`, + getCaseUserActionUrl(caseId), { method: 'GET', signal, @@ -193,14 +203,11 @@ export const patchComment = async ( version: string, signal: AbortSignal ): Promise => { - const response = await KibanaServices.get().http.fetch( - `${CASES_URL}/${caseId}/comments`, - { - method: 'PATCH', - body: JSON.stringify({ comment: commentUpdate, id: commentId, version }), - signal, - } - ); + const response = await KibanaServices.get().http.fetch(getCaseCommentsUrl(caseId), { + method: 'PATCH', + body: JSON.stringify({ comment: commentUpdate, id: commentId, version }), + signal, + }); return convertToCamelCase(decodeCaseResponse(response)); }; @@ -219,7 +226,7 @@ export const pushCase = async ( signal: AbortSignal ): Promise => { const response = await KibanaServices.get().http.fetch( - `${CASES_URL}/${caseId}/_push`, + `${getCaseDetailsUrl(caseId)}/_push`, { method: 'POST', body: JSON.stringify(push), @@ -235,7 +242,7 @@ export const pushToService = async ( signal: AbortSignal ): Promise => { const response = await KibanaServices.get().http.fetch( - `/api/action/${connectorId}/_execute`, + `${ACTION_URL}/${connectorId}/_execute`, { method: 'POST', body: JSON.stringify({ params: casePushParams }), @@ -251,7 +258,7 @@ export const pushToService = async ( }; export const getActionLicense = async (signal: AbortSignal): Promise => { - const response = await KibanaServices.get().http.fetch(`/api/action/types`, { + const response = await KibanaServices.get().http.fetch(ACTION_TYPES_URL, { method: 'GET', signal, }); diff --git a/x-pack/legacy/plugins/siem/public/containers/case/configure/api.ts b/x-pack/legacy/plugins/siem/public/containers/case/configure/api.ts index c24081c777a96..85e472811c93b 100644 --- a/x-pack/legacy/plugins/siem/public/containers/case/configure/api.ts +++ b/x-pack/legacy/plugins/siem/public/containers/case/configure/api.ts @@ -13,26 +13,27 @@ import { } from '../../../../../../../plugins/case/common/api'; import { KibanaServices } from '../../../lib/kibana'; -import { CASES_CONFIGURE_URL } from '../constants'; +import { + CASE_CONFIGURE_CONNECTORS_URL, + CASE_CONFIGURE_URL, +} from '../../../../../../../plugins/case/common/constants'; + import { ApiProps } from '../types'; import { convertToCamelCase, decodeCaseConfigureResponse } from '../utils'; import { CaseConfigure } from './types'; export const fetchConnectors = async ({ signal }: ApiProps): Promise => { - const response = await KibanaServices.get().http.fetch( - `${CASES_CONFIGURE_URL}/connectors/_find`, - { - method: 'GET', - signal, - } - ); + const response = await KibanaServices.get().http.fetch(`${CASE_CONFIGURE_CONNECTORS_URL}/_find`, { + method: 'GET', + signal, + }); return response; }; export const getCaseConfigure = async ({ signal }: ApiProps): Promise => { const response = await KibanaServices.get().http.fetch( - CASES_CONFIGURE_URL, + CASE_CONFIGURE_URL, { method: 'GET', signal, @@ -51,7 +52,7 @@ export const postCaseConfigure = async ( signal: AbortSignal ): Promise => { const response = await KibanaServices.get().http.fetch( - CASES_CONFIGURE_URL, + CASE_CONFIGURE_URL, { method: 'POST', body: JSON.stringify(caseConfiguration), @@ -68,7 +69,7 @@ export const patchCaseConfigure = async ( signal: AbortSignal ): Promise => { const response = await KibanaServices.get().http.fetch( - CASES_CONFIGURE_URL, + CASE_CONFIGURE_URL, { method: 'PATCH', body: JSON.stringify(caseConfiguration), diff --git a/x-pack/legacy/plugins/siem/public/containers/case/constants.ts b/x-pack/legacy/plugins/siem/public/containers/case/constants.ts index ab8dc98db4f64..d8bb499ed7922 100644 --- a/x-pack/legacy/plugins/siem/public/containers/case/constants.ts +++ b/x-pack/legacy/plugins/siem/public/containers/case/constants.ts @@ -4,7 +4,5 @@ * you may not use this file except in compliance with the Elastic License. */ -export const CASES_URL = `/api/cases`; -export const CASES_CONFIGURE_URL = `/api/cases/configure`; export const DEFAULT_TABLE_ACTIVE_PAGE = 1; export const DEFAULT_TABLE_LIMIT = 5; diff --git a/x-pack/plugins/case/common/api/helpers.ts b/x-pack/plugins/case/common/api/helpers.ts new file mode 100644 index 0000000000000..0efdcd3819659 --- /dev/null +++ b/x-pack/plugins/case/common/api/helpers.ts @@ -0,0 +1,28 @@ +/* + * 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 { + CASE_DETAILS_URL, + CASE_COMMENTS_URL, + CASE_USER_ACTIONS_URL, + CASE_COMMENT_DETAILS_URL, +} from '../constants'; + +export const getCaseDetailsUrl = (id: string): string => { + return CASE_DETAILS_URL.replace('{case_id}', id); +}; + +export const getCaseCommentsUrl = (id: string): string => { + return CASE_COMMENTS_URL.replace('{case_id}', id); +}; + +export const getCaseCommentDetailsUrl = (caseId: string, commentId: string): string => { + return CASE_COMMENT_DETAILS_URL.replace('{case_id}', caseId).replace('{comment_id}', commentId); +}; + +export const getCaseUserActionUrl = (id: string): string => { + return CASE_USER_ACTIONS_URL.replace('{case_id}', id); +}; diff --git a/x-pack/plugins/case/common/constants.ts b/x-pack/plugins/case/common/constants.ts new file mode 100644 index 0000000000000..dcfa46bfa6019 --- /dev/null +++ b/x-pack/plugins/case/common/constants.ts @@ -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. + */ + +export const APP_ID = 'case'; + +/** + * Case routes + */ + +export const CASES_URL = '/api/cases'; +export const CASE_DETAILS_URL = `${CASES_URL}/{case_id}`; +export const CASE_CONFIGURE_URL = `${CASES_URL}/configure`; +export const CASE_CONFIGURE_CONNECTORS_URL = `${CASE_CONFIGURE_URL}/connectors`; +export const CASE_COMMENTS_URL = `${CASE_DETAILS_URL}/comments`; +export const CASE_COMMENT_DETAILS_URL = `${CASE_DETAILS_URL}/comments/{comment_id}`; +export const CASE_REPORTERS_URL = `${CASES_URL}/reporters`; +export const CASE_STATUS_URL = `${CASES_URL}/status`; +export const CASE_TAGS_URL = `${CASES_URL}/tags`; +export const CASE_USER_ACTIONS_URL = `${CASE_DETAILS_URL}/user_actions`; + +/** + * Action routes + */ + +export const ACTION_URL = '/api/action'; +export const ACTION_TYPES_URL = '/api/action/types'; diff --git a/x-pack/plugins/case/server/routes/api/cases/comments/delete_all_comments.ts b/x-pack/plugins/case/server/routes/api/cases/comments/delete_all_comments.ts index 1dfab165eccd7..e9bcb9690ebd8 100644 --- a/x-pack/plugins/case/server/routes/api/cases/comments/delete_all_comments.ts +++ b/x-pack/plugins/case/server/routes/api/cases/comments/delete_all_comments.ts @@ -9,11 +9,12 @@ import { schema } from '@kbn/config-schema'; import { buildCommentUserActionItem } from '../../../../services/user_actions/helpers'; import { RouteDeps } from '../../types'; import { wrapError } from '../../utils'; +import { CASE_COMMENTS_URL } from '../../../../../common/constants'; export function initDeleteAllCommentsApi({ caseService, router, userActionService }: RouteDeps) { router.delete( { - path: '/api/cases/{case_id}/comments', + path: CASE_COMMENTS_URL, validate: { params: schema.object({ case_id: schema.string(), diff --git a/x-pack/plugins/case/server/routes/api/cases/comments/delete_comment.test.ts b/x-pack/plugins/case/server/routes/api/cases/comments/delete_comment.test.ts index b2022e6dec26d..67cb998409570 100644 --- a/x-pack/plugins/case/server/routes/api/cases/comments/delete_comment.test.ts +++ b/x-pack/plugins/case/server/routes/api/cases/comments/delete_comment.test.ts @@ -15,6 +15,7 @@ import { mockCaseComments, } from '../../__fixtures__'; import { initDeleteCommentApi } from './delete_comment'; +import { CASE_COMMENT_DETAILS_URL } from '../../../../../common/constants'; describe('DELETE comment', () => { let routeHandler: RequestHandler; @@ -23,7 +24,7 @@ describe('DELETE comment', () => { }); it(`deletes the comment. responds with 204`, async () => { const request = httpServerMock.createKibanaRequest({ - path: '/api/cases/{case_id}/comments/{comment_id}', + path: CASE_COMMENT_DETAILS_URL, method: 'delete', params: { case_id: 'mock-id-1', @@ -43,7 +44,7 @@ describe('DELETE comment', () => { }); it(`returns an error when thrown from deleteComment service`, async () => { const request = httpServerMock.createKibanaRequest({ - path: '/api/cases/{case_id}/comments/{comment_id}', + path: CASE_COMMENT_DETAILS_URL, method: 'delete', params: { case_id: 'mock-id-1', diff --git a/x-pack/plugins/case/server/routes/api/cases/comments/delete_comment.ts b/x-pack/plugins/case/server/routes/api/cases/comments/delete_comment.ts index ff0729afed96a..72ef400415d0f 100644 --- a/x-pack/plugins/case/server/routes/api/cases/comments/delete_comment.ts +++ b/x-pack/plugins/case/server/routes/api/cases/comments/delete_comment.ts @@ -11,11 +11,12 @@ import { CASE_SAVED_OBJECT } from '../../../../saved_object_types'; import { buildCommentUserActionItem } from '../../../../services/user_actions/helpers'; import { RouteDeps } from '../../types'; import { wrapError } from '../../utils'; +import { CASE_COMMENT_DETAILS_URL } from '../../../../../common/constants'; export function initDeleteCommentApi({ caseService, router, userActionService }: RouteDeps) { router.delete( { - path: '/api/cases/{case_id}/comments/{comment_id}', + path: CASE_COMMENT_DETAILS_URL, validate: { params: schema.object({ case_id: schema.string(), diff --git a/x-pack/plugins/case/server/routes/api/cases/comments/find_comments.ts b/x-pack/plugins/case/server/routes/api/cases/comments/find_comments.ts index 92da64cebee74..3df9fdb80ba8a 100644 --- a/x-pack/plugins/case/server/routes/api/cases/comments/find_comments.ts +++ b/x-pack/plugins/case/server/routes/api/cases/comments/find_comments.ts @@ -18,11 +18,12 @@ import { } from '../../../../../common/api'; import { RouteDeps } from '../../types'; import { escapeHatch, transformComments, wrapError } from '../../utils'; +import { CASE_COMMENTS_URL } from '../../../../../common/constants'; export function initFindCaseCommentsApi({ caseService, router }: RouteDeps) { router.get( { - path: '/api/cases/{case_id}/comments/_find', + path: `${CASE_COMMENTS_URL}/_find`, validate: { params: schema.object({ case_id: schema.string(), diff --git a/x-pack/plugins/case/server/routes/api/cases/comments/get_all_comment.ts b/x-pack/plugins/case/server/routes/api/cases/comments/get_all_comment.ts index 1500039eb2cc2..8d7820d4e8fec 100644 --- a/x-pack/plugins/case/server/routes/api/cases/comments/get_all_comment.ts +++ b/x-pack/plugins/case/server/routes/api/cases/comments/get_all_comment.ts @@ -9,11 +9,12 @@ import { schema } from '@kbn/config-schema'; import { AllCommentsResponseRt } from '../../../../../common/api'; import { RouteDeps } from '../../types'; import { flattenCommentSavedObjects, wrapError } from '../../utils'; +import { CASE_COMMENTS_URL } from '../../../../../common/constants'; export function initGetAllCommentsApi({ caseService, router }: RouteDeps) { router.get( { - path: '/api/cases/{case_id}/comments', + path: CASE_COMMENTS_URL, validate: { params: schema.object({ case_id: schema.string(), diff --git a/x-pack/plugins/case/server/routes/api/cases/comments/get_comment.test.ts b/x-pack/plugins/case/server/routes/api/cases/comments/get_comment.test.ts index 9c8d0e5254df0..b5a7d6367ea4b 100644 --- a/x-pack/plugins/case/server/routes/api/cases/comments/get_comment.test.ts +++ b/x-pack/plugins/case/server/routes/api/cases/comments/get_comment.test.ts @@ -15,6 +15,7 @@ import { } from '../../__fixtures__'; import { flattenCommentSavedObject } from '../../utils'; import { initGetCommentApi } from './get_comment'; +import { CASE_COMMENT_DETAILS_URL } from '../../../../../common/constants'; describe('GET comment', () => { let routeHandler: RequestHandler; @@ -23,7 +24,7 @@ describe('GET comment', () => { }); it(`returns the comment`, async () => { const request = httpServerMock.createKibanaRequest({ - path: '/api/cases/{case_id}/comments/{comment_id}', + path: CASE_COMMENT_DETAILS_URL, method: 'get', params: { case_id: 'mock-id-1', @@ -48,7 +49,7 @@ describe('GET comment', () => { }); it(`returns an error when getComment throws`, async () => { const request = httpServerMock.createKibanaRequest({ - path: '/api/cases/{case_id}/comments/{comment_id}', + path: CASE_COMMENT_DETAILS_URL, method: 'get', params: { case_id: 'mock-id-1', diff --git a/x-pack/plugins/case/server/routes/api/cases/comments/get_comment.ts b/x-pack/plugins/case/server/routes/api/cases/comments/get_comment.ts index 24f44a5f5129b..5fa668f6ae5de 100644 --- a/x-pack/plugins/case/server/routes/api/cases/comments/get_comment.ts +++ b/x-pack/plugins/case/server/routes/api/cases/comments/get_comment.ts @@ -9,11 +9,12 @@ import { schema } from '@kbn/config-schema'; import { CommentResponseRt } from '../../../../../common/api'; import { RouteDeps } from '../../types'; import { flattenCommentSavedObject, wrapError } from '../../utils'; +import { CASE_COMMENT_DETAILS_URL } from '../../../../../common/constants'; export function initGetCommentApi({ caseService, router }: RouteDeps) { router.get( { - path: '/api/cases/{case_id}/comments/{comment_id}', + path: CASE_COMMENT_DETAILS_URL, validate: { params: schema.object({ case_id: schema.string(), diff --git a/x-pack/plugins/case/server/routes/api/cases/comments/patch_comment.test.ts b/x-pack/plugins/case/server/routes/api/cases/comments/patch_comment.test.ts index 8d9906c2abe7f..04473e302e468 100644 --- a/x-pack/plugins/case/server/routes/api/cases/comments/patch_comment.test.ts +++ b/x-pack/plugins/case/server/routes/api/cases/comments/patch_comment.test.ts @@ -14,6 +14,7 @@ import { mockCases, } from '../../__fixtures__'; import { initPatchCommentApi } from './patch_comment'; +import { CASE_COMMENTS_URL } from '../../../../../common/constants'; describe('PATCH comment', () => { let routeHandler: RequestHandler; @@ -22,7 +23,7 @@ describe('PATCH comment', () => { }); it(`Patch a comment`, async () => { const request = httpServerMock.createKibanaRequest({ - path: '/api/cases/{case_id}/comments', + path: CASE_COMMENTS_URL, method: 'patch', params: { case_id: 'mock-id-1', @@ -50,7 +51,7 @@ describe('PATCH comment', () => { it(`Fails with 409 if version does not match`, async () => { const request = httpServerMock.createKibanaRequest({ - path: '/api/cases/{case_id}/comments', + path: CASE_COMMENTS_URL, method: 'patch', params: { case_id: 'mock-id-1', @@ -74,7 +75,7 @@ describe('PATCH comment', () => { }); it(`Returns an error if updateComment throws`, async () => { const request = httpServerMock.createKibanaRequest({ - path: '/api/cases/{case_id}/comments', + path: CASE_COMMENTS_URL, method: 'patch', params: { case_id: 'mock-id-1', diff --git a/x-pack/plugins/case/server/routes/api/cases/comments/patch_comment.ts b/x-pack/plugins/case/server/routes/api/cases/comments/patch_comment.ts index 3b38afc02ed81..dd9b124ff1b79 100644 --- a/x-pack/plugins/case/server/routes/api/cases/comments/patch_comment.ts +++ b/x-pack/plugins/case/server/routes/api/cases/comments/patch_comment.ts @@ -15,11 +15,12 @@ import { CASE_SAVED_OBJECT } from '../../../../saved_object_types'; import { buildCommentUserActionItem } from '../../../../services/user_actions/helpers'; import { RouteDeps } from '../../types'; import { escapeHatch, wrapError, flattenCaseSavedObject } from '../../utils'; +import { CASE_COMMENTS_URL } from '../../../../../common/constants'; export function initPatchCommentApi({ caseService, router, userActionService }: RouteDeps) { router.patch( { - path: '/api/cases/{case_id}/comments', + path: CASE_COMMENTS_URL, validate: { params: schema.object({ case_id: schema.string(), diff --git a/x-pack/plugins/case/server/routes/api/cases/comments/post_comment.test.ts b/x-pack/plugins/case/server/routes/api/cases/comments/post_comment.test.ts index 23039da681ec6..9006470f36f36 100644 --- a/x-pack/plugins/case/server/routes/api/cases/comments/post_comment.test.ts +++ b/x-pack/plugins/case/server/routes/api/cases/comments/post_comment.test.ts @@ -15,6 +15,7 @@ import { mockCaseComments, } from '../../__fixtures__'; import { initPostCommentApi } from './post_comment'; +import { CASE_COMMENTS_URL } from '../../../../../common/constants'; describe('POST comment', () => { let routeHandler: RequestHandler; @@ -27,7 +28,7 @@ describe('POST comment', () => { }); it(`Posts a new comment`, async () => { const request = httpServerMock.createKibanaRequest({ - path: '/api/cases/{case_id}/comments', + path: CASE_COMMENTS_URL, method: 'post', params: { case_id: 'mock-id-1', @@ -52,7 +53,7 @@ describe('POST comment', () => { }); it(`Returns an error if the case does not exist`, async () => { const request = httpServerMock.createKibanaRequest({ - path: '/api/cases/{case_id}/comments', + path: CASE_COMMENTS_URL, method: 'post', params: { case_id: 'this-is-not-real', @@ -75,7 +76,7 @@ describe('POST comment', () => { }); it(`Returns an error if postNewCase throws`, async () => { const request = httpServerMock.createKibanaRequest({ - path: '/api/cases/{case_id}/comments', + path: CASE_COMMENTS_URL, method: 'post', params: { case_id: 'mock-id-1', @@ -100,7 +101,7 @@ describe('POST comment', () => { routeHandler = await createRoute(initPostCommentApi, 'post', true); const request = httpServerMock.createKibanaRequest({ - path: '/api/cases/{case_id}/comments', + path: CASE_COMMENTS_URL, method: 'post', params: { case_id: 'mock-id-1', diff --git a/x-pack/plugins/case/server/routes/api/cases/comments/post_comment.ts b/x-pack/plugins/case/server/routes/api/cases/comments/post_comment.ts index 70405af26f576..a296d9815f251 100644 --- a/x-pack/plugins/case/server/routes/api/cases/comments/post_comment.ts +++ b/x-pack/plugins/case/server/routes/api/cases/comments/post_comment.ts @@ -15,11 +15,12 @@ import { CASE_SAVED_OBJECT } from '../../../../saved_object_types'; import { buildCommentUserActionItem } from '../../../../services/user_actions/helpers'; import { escapeHatch, transformNewComment, wrapError, flattenCaseSavedObject } from '../../utils'; import { RouteDeps } from '../../types'; +import { CASE_COMMENTS_URL } from '../../../../../common/constants'; export function initPostCommentApi({ caseService, router, userActionService }: RouteDeps) { router.post( { - path: '/api/cases/{case_id}/comments', + path: CASE_COMMENTS_URL, validate: { params: schema.object({ case_id: schema.string(), diff --git a/x-pack/plugins/case/server/routes/api/cases/configure/get_configure.test.ts b/x-pack/plugins/case/server/routes/api/cases/configure/get_configure.test.ts index 66d39c3f11d28..5b3b6e77b9403 100644 --- a/x-pack/plugins/case/server/routes/api/cases/configure/get_configure.test.ts +++ b/x-pack/plugins/case/server/routes/api/cases/configure/get_configure.test.ts @@ -15,6 +15,7 @@ import { import { mockCaseConfigure } from '../../__fixtures__/mock_saved_objects'; import { initGetCaseConfigure } from './get_configure'; +import { CASE_CONFIGURE_URL } from '../../../../../common/constants'; describe('GET configuration', () => { let routeHandler: RequestHandler; @@ -24,7 +25,7 @@ describe('GET configuration', () => { it('returns the configuration', async () => { const req = httpServerMock.createKibanaRequest({ - path: '/api/cases/configure', + path: CASE_CONFIGURE_URL, method: 'get', }); @@ -44,7 +45,7 @@ describe('GET configuration', () => { it('handles undefined version correctly', async () => { const req = httpServerMock.createKibanaRequest({ - path: '/api/cases/configure', + path: CASE_CONFIGURE_URL, method: 'get', }); @@ -78,7 +79,7 @@ describe('GET configuration', () => { it('returns an empty object when there is no configuration', async () => { const req = httpServerMock.createKibanaRequest({ - path: '/api/cases/configure', + path: CASE_CONFIGURE_URL, method: 'get', }); @@ -95,7 +96,7 @@ describe('GET configuration', () => { it('returns an error if find throws an error', async () => { const req = httpServerMock.createKibanaRequest({ - path: '/api/cases/configure', + path: CASE_CONFIGURE_URL, method: 'get', }); diff --git a/x-pack/plugins/case/server/routes/api/cases/configure/get_configure.ts b/x-pack/plugins/case/server/routes/api/cases/configure/get_configure.ts index 2832edaa892d5..03bec1fe72d39 100644 --- a/x-pack/plugins/case/server/routes/api/cases/configure/get_configure.ts +++ b/x-pack/plugins/case/server/routes/api/cases/configure/get_configure.ts @@ -7,11 +7,12 @@ import { CaseConfigureResponseRt } from '../../../../../common/api'; import { RouteDeps } from '../../types'; import { wrapError } from '../../utils'; +import { CASE_CONFIGURE_URL } from '../../../../../common/constants'; export function initGetCaseConfigure({ caseConfigureService, caseService, router }: RouteDeps) { router.get( { - path: '/api/cases/configure', + path: CASE_CONFIGURE_URL, validate: false, }, async (context, request, response) => { diff --git a/x-pack/plugins/case/server/routes/api/cases/configure/get_connectors.test.ts b/x-pack/plugins/case/server/routes/api/cases/configure/get_connectors.test.ts index 62edaa0a4792a..09692ff73b94b 100644 --- a/x-pack/plugins/case/server/routes/api/cases/configure/get_connectors.test.ts +++ b/x-pack/plugins/case/server/routes/api/cases/configure/get_connectors.test.ts @@ -16,6 +16,7 @@ import { import { mockCaseConfigure } from '../../__fixtures__/mock_saved_objects'; import { initCaseConfigureGetActionConnector } from './get_connectors'; import { getActions } from '../../__mocks__/request_responses'; +import { CASE_CONFIGURE_CONNECTORS_URL } from '../../../../../common/constants'; describe('GET connectors', () => { let routeHandler: RequestHandler; @@ -25,7 +26,7 @@ describe('GET connectors', () => { it('returns the connectors', async () => { const req = httpServerMock.createKibanaRequest({ - path: '/api/cases/configure/connectors/_find', + path: `${CASE_CONFIGURE_CONNECTORS_URL}/_find`, method: 'get', }); @@ -44,7 +45,7 @@ describe('GET connectors', () => { it('it throws an error when actions client is null', async () => { const req = httpServerMock.createKibanaRequest({ - path: '/api/cases/configure/connectors/_find', + path: `${CASE_CONFIGURE_CONNECTORS_URL}/_find`, method: 'get', }); diff --git a/x-pack/plugins/case/server/routes/api/cases/configure/get_connectors.ts b/x-pack/plugins/case/server/routes/api/cases/configure/get_connectors.ts index 3e9a1c96d55ed..00575655d4c42 100644 --- a/x-pack/plugins/case/server/routes/api/cases/configure/get_connectors.ts +++ b/x-pack/plugins/case/server/routes/api/cases/configure/get_connectors.ts @@ -8,6 +8,8 @@ import Boom from 'boom'; import { RouteDeps } from '../../types'; import { wrapError } from '../../utils'; +import { CASE_CONFIGURE_CONNECTORS_URL } from '../../../../../common/constants'; + /* * Be aware that this api will only return 20 connectors */ @@ -17,7 +19,7 @@ const CASE_SERVICE_NOW_ACTION = '.servicenow'; export function initCaseConfigureGetActionConnector({ caseService, router }: RouteDeps) { router.get( { - path: '/api/cases/configure/connectors/_find', + path: `${CASE_CONFIGURE_CONNECTORS_URL}/_find`, validate: false, }, async (context, request, response) => { diff --git a/x-pack/plugins/case/server/routes/api/cases/configure/patch_configure.test.ts b/x-pack/plugins/case/server/routes/api/cases/configure/patch_configure.test.ts index 5b3d68a258664..9b71f777b95ab 100644 --- a/x-pack/plugins/case/server/routes/api/cases/configure/patch_configure.test.ts +++ b/x-pack/plugins/case/server/routes/api/cases/configure/patch_configure.test.ts @@ -15,6 +15,7 @@ import { import { mockCaseConfigure } from '../../__fixtures__/mock_saved_objects'; import { initPatchCaseConfigure } from './patch_configure'; +import { CASE_CONFIGURE_URL } from '../../../../../common/constants'; describe('PATCH configuration', () => { let routeHandler: RequestHandler; @@ -29,7 +30,7 @@ describe('PATCH configuration', () => { it('patch configuration', async () => { const req = httpServerMock.createKibanaRequest({ - path: '/api/cases/configure', + path: CASE_CONFIGURE_URL, method: 'patch', body: { closure_type: 'close-by-pushing', @@ -61,7 +62,7 @@ describe('PATCH configuration', () => { routeHandler = await createRoute(initPatchCaseConfigure, 'patch', true); const req = httpServerMock.createKibanaRequest({ - path: '/api/cases/configure', + path: CASE_CONFIGURE_URL, method: 'patch', body: { closure_type: 'close-by-pushing', @@ -91,7 +92,7 @@ describe('PATCH configuration', () => { it('throw error when configuration have not being created', async () => { const req = httpServerMock.createKibanaRequest({ - path: '/api/cases/configure', + path: CASE_CONFIGURE_URL, method: 'patch', body: { closure_type: 'close-by-pushing', @@ -113,7 +114,7 @@ describe('PATCH configuration', () => { it('throw error when the versions are different', async () => { const req = httpServerMock.createKibanaRequest({ - path: '/api/cases/configure', + path: CASE_CONFIGURE_URL, method: 'patch', body: { closure_type: 'close-by-pushing', @@ -135,7 +136,7 @@ describe('PATCH configuration', () => { it('handles undefined version correctly', async () => { const req = httpServerMock.createKibanaRequest({ - path: '/api/cases/configure', + path: CASE_CONFIGURE_URL, method: 'patch', body: { connector_id: 'no-version', version: mockCaseConfigure[0].version }, }); diff --git a/x-pack/plugins/case/server/routes/api/cases/configure/patch_configure.ts b/x-pack/plugins/case/server/routes/api/cases/configure/patch_configure.ts index 3a1b9d5059cbc..47f7d503e32b8 100644 --- a/x-pack/plugins/case/server/routes/api/cases/configure/patch_configure.ts +++ b/x-pack/plugins/case/server/routes/api/cases/configure/patch_configure.ts @@ -16,11 +16,12 @@ import { } from '../../../../../common/api'; import { RouteDeps } from '../../types'; import { wrapError, escapeHatch } from '../../utils'; +import { CASE_CONFIGURE_URL } from '../../../../../common/constants'; export function initPatchCaseConfigure({ caseConfigureService, caseService, router }: RouteDeps) { router.patch( { - path: '/api/cases/configure', + path: CASE_CONFIGURE_URL, validate: { body: escapeHatch, }, diff --git a/x-pack/plugins/case/server/routes/api/cases/configure/post_configure.test.ts b/x-pack/plugins/case/server/routes/api/cases/configure/post_configure.test.ts index 7e40cad5b1298..fb95cc53a1710 100644 --- a/x-pack/plugins/case/server/routes/api/cases/configure/post_configure.test.ts +++ b/x-pack/plugins/case/server/routes/api/cases/configure/post_configure.test.ts @@ -16,6 +16,7 @@ import { import { mockCaseConfigure } from '../../__fixtures__/mock_saved_objects'; import { initPostCaseConfigure } from './post_configure'; import { newConfiguration } from '../../__mocks__/request_responses'; +import { CASE_CONFIGURE_URL } from '../../../../../common/constants'; describe('POST configuration', () => { let routeHandler: RequestHandler; @@ -30,7 +31,7 @@ describe('POST configuration', () => { it('create configuration', async () => { const req = httpServerMock.createKibanaRequest({ - path: '/api/cases/configure', + path: CASE_CONFIGURE_URL, method: 'post', body: newConfiguration, }); @@ -61,7 +62,7 @@ describe('POST configuration', () => { routeHandler = await createRoute(initPostCaseConfigure, 'post', true); const req = httpServerMock.createKibanaRequest({ - path: '/api/cases/configure', + path: CASE_CONFIGURE_URL, method: 'post', body: newConfiguration, }); @@ -90,7 +91,7 @@ describe('POST configuration', () => { it('throws when missing connector_id', async () => { const req = httpServerMock.createKibanaRequest({ - path: '/api/cases/configure', + path: CASE_CONFIGURE_URL, method: 'post', body: { connector_name: 'My connector 2', @@ -111,7 +112,7 @@ describe('POST configuration', () => { it('throws when missing connector_name', async () => { const req = httpServerMock.createKibanaRequest({ - path: '/api/cases/configure', + path: CASE_CONFIGURE_URL, method: 'post', body: { connector_id: '456', @@ -132,7 +133,7 @@ describe('POST configuration', () => { it('throws when missing closure_type', async () => { const req = httpServerMock.createKibanaRequest({ - path: '/api/cases/configure', + path: CASE_CONFIGURE_URL, method: 'post', body: { connector_id: '456', @@ -153,7 +154,7 @@ describe('POST configuration', () => { it('it deletes the previous configuration', async () => { const req = httpServerMock.createKibanaRequest({ - path: '/api/cases/configure', + path: CASE_CONFIGURE_URL, method: 'post', body: newConfiguration, }); @@ -172,7 +173,7 @@ describe('POST configuration', () => { it('it does NOT delete when not found', async () => { const req = httpServerMock.createKibanaRequest({ - path: '/api/cases/configure', + path: CASE_CONFIGURE_URL, method: 'post', body: newConfiguration, }); @@ -191,7 +192,7 @@ describe('POST configuration', () => { it('it deletes all configuration', async () => { const req = httpServerMock.createKibanaRequest({ - path: '/api/cases/configure', + path: CASE_CONFIGURE_URL, method: 'post', body: newConfiguration, }); @@ -214,7 +215,7 @@ describe('POST configuration', () => { it('returns an error if find throws an error', async () => { const req = httpServerMock.createKibanaRequest({ - path: '/api/cases/configure', + path: CASE_CONFIGURE_URL, method: 'post', body: newConfiguration, }); @@ -232,7 +233,7 @@ describe('POST configuration', () => { it('returns an error if delete throws an error', async () => { const req = httpServerMock.createKibanaRequest({ - path: '/api/cases/configure', + path: CASE_CONFIGURE_URL, method: 'post', body: newConfiguration, }); @@ -250,7 +251,7 @@ describe('POST configuration', () => { it('returns an error if post throws an error', async () => { const req = httpServerMock.createKibanaRequest({ - path: '/api/cases/configure', + path: CASE_CONFIGURE_URL, method: 'post', body: { connector_id: 'throw-error-create', @@ -272,7 +273,7 @@ describe('POST configuration', () => { it('handles undefined version correctly', async () => { const req = httpServerMock.createKibanaRequest({ - path: '/api/cases/configure', + path: CASE_CONFIGURE_URL, method: 'post', body: { ...newConfiguration, connector_id: 'no-version' }, }); diff --git a/x-pack/plugins/case/server/routes/api/cases/configure/post_configure.ts b/x-pack/plugins/case/server/routes/api/cases/configure/post_configure.ts index 2a23abf0cbf21..5c1693e728c37 100644 --- a/x-pack/plugins/case/server/routes/api/cases/configure/post_configure.ts +++ b/x-pack/plugins/case/server/routes/api/cases/configure/post_configure.ts @@ -16,11 +16,12 @@ import { } from '../../../../../common/api'; import { RouteDeps } from '../../types'; import { wrapError, escapeHatch } from '../../utils'; +import { CASE_CONFIGURE_URL } from '../../../../../common/constants'; export function initPostCaseConfigure({ caseConfigureService, caseService, router }: RouteDeps) { router.post( { - path: '/api/cases/configure', + path: CASE_CONFIGURE_URL, validate: { body: escapeHatch, }, diff --git a/x-pack/plugins/case/server/routes/api/cases/delete_cases.test.ts b/x-pack/plugins/case/server/routes/api/cases/delete_cases.test.ts index c5be6f78a1570..e655339e05eb1 100644 --- a/x-pack/plugins/case/server/routes/api/cases/delete_cases.test.ts +++ b/x-pack/plugins/case/server/routes/api/cases/delete_cases.test.ts @@ -16,6 +16,7 @@ import { mockCaseComments, } from '../__fixtures__'; import { initDeleteCasesApi } from './delete_cases'; +import { CASES_URL } from '../../../../common/constants'; describe('DELETE case', () => { let routeHandler: RequestHandler; @@ -24,7 +25,7 @@ describe('DELETE case', () => { }); it(`deletes the case. responds with 204`, async () => { const request = httpServerMock.createKibanaRequest({ - path: '/api/cases', + path: CASES_URL, method: 'delete', query: { ids: ['mock-id-1'], @@ -43,7 +44,7 @@ describe('DELETE case', () => { }); it(`returns an error when thrown from deleteCase service`, async () => { const request = httpServerMock.createKibanaRequest({ - path: '/api/cases', + path: CASES_URL, method: 'delete', query: { ids: ['not-real'], @@ -62,7 +63,7 @@ describe('DELETE case', () => { }); it(`returns an error when thrown from getAllCaseComments service`, async () => { const request = httpServerMock.createKibanaRequest({ - path: '/api/cases', + path: CASES_URL, method: 'delete', query: { ids: ['bad-guy'], @@ -81,7 +82,7 @@ describe('DELETE case', () => { }); it(`returns an error when thrown from deleteComment service`, async () => { const request = httpServerMock.createKibanaRequest({ - path: '/api/cases', + path: CASES_URL, method: 'delete', query: { ids: ['valid-id'], diff --git a/x-pack/plugins/case/server/routes/api/cases/delete_cases.ts b/x-pack/plugins/case/server/routes/api/cases/delete_cases.ts index 0214017ae5c29..20591637a6c23 100644 --- a/x-pack/plugins/case/server/routes/api/cases/delete_cases.ts +++ b/x-pack/plugins/case/server/routes/api/cases/delete_cases.ts @@ -9,11 +9,12 @@ import { schema } from '@kbn/config-schema'; import { buildCaseUserActionItem } from '../../../services/user_actions/helpers'; import { RouteDeps } from '../types'; import { wrapError } from '../utils'; +import { CASES_URL } from '../../../../common/constants'; export function initDeleteCasesApi({ caseService, router, userActionService }: RouteDeps) { router.delete( { - path: '/api/cases', + path: CASES_URL, validate: { query: schema.object({ ids: schema.arrayOf(schema.string()), diff --git a/x-pack/plugins/case/server/routes/api/cases/find_cases.test.ts b/x-pack/plugins/case/server/routes/api/cases/find_cases.test.ts index 8fafb1af0eb82..7af1cee494457 100644 --- a/x-pack/plugins/case/server/routes/api/cases/find_cases.test.ts +++ b/x-pack/plugins/case/server/routes/api/cases/find_cases.test.ts @@ -14,6 +14,7 @@ import { mockCases, } from '../__fixtures__'; import { initFindCasesApi } from './find_cases'; +import { CASES_URL } from '../../../../common/constants'; describe('GET all cases', () => { let routeHandler: RequestHandler; @@ -22,7 +23,7 @@ describe('GET all cases', () => { }); it(`gets all the cases`, async () => { const request = httpServerMock.createKibanaRequest({ - path: '/api/cases', + path: `${CASES_URL}/_find`, method: 'get', }); diff --git a/x-pack/plugins/case/server/routes/api/cases/find_cases.ts b/x-pack/plugins/case/server/routes/api/cases/find_cases.ts index b2716749e9749..40fc0301b058a 100644 --- a/x-pack/plugins/case/server/routes/api/cases/find_cases.ts +++ b/x-pack/plugins/case/server/routes/api/cases/find_cases.ts @@ -15,6 +15,7 @@ import { CasesFindResponseRt, CasesFindRequestRt, throwErrors } from '../../../. import { transformCases, sortToSnake, wrapError, escapeHatch } from '../utils'; import { RouteDeps, TotalCommentByCase } from '../types'; import { CASE_SAVED_OBJECT } from '../../../saved_object_types'; +import { CASES_URL } from '../../../../common/constants'; const combineFilters = (filters: string[], operator: 'OR' | 'AND'): string => filters?.filter(i => i !== '').join(` ${operator} `); @@ -41,7 +42,7 @@ const buildFilter = ( export function initFindCasesApi({ caseService, router }: RouteDeps) { router.get( { - path: '/api/cases/_find', + path: `${CASES_URL}/_find`, validate: { query: escapeHatch, }, diff --git a/x-pack/plugins/case/server/routes/api/cases/get_case.test.ts b/x-pack/plugins/case/server/routes/api/cases/get_case.test.ts index 5912df2c40aa3..a8c12d4734b53 100644 --- a/x-pack/plugins/case/server/routes/api/cases/get_case.test.ts +++ b/x-pack/plugins/case/server/routes/api/cases/get_case.test.ts @@ -18,6 +18,7 @@ import { } from '../__fixtures__'; import { flattenCaseSavedObject } from '../utils'; import { initGetCaseApi } from './get_case'; +import { CASE_DETAILS_URL } from '../../../../common/constants'; describe('GET case', () => { let routeHandler: RequestHandler; @@ -26,7 +27,7 @@ describe('GET case', () => { }); it(`returns the case with empty case comments when includeComments is false`, async () => { const request = httpServerMock.createKibanaRequest({ - path: '/api/cases/{case_id}', + path: CASE_DETAILS_URL, method: 'get', params: { case_id: 'mock-id-1', @@ -55,7 +56,7 @@ describe('GET case', () => { }); it(`returns an error when thrown from getCase`, async () => { const request = httpServerMock.createKibanaRequest({ - path: '/api/cases/{case_id}', + path: CASE_DETAILS_URL, method: 'get', params: { case_id: 'abcdefg', @@ -78,7 +79,7 @@ describe('GET case', () => { }); it(`returns the case with case comments when includeComments is true`, async () => { const request = httpServerMock.createKibanaRequest({ - path: '/api/cases/{case_id}', + path: CASE_DETAILS_URL, method: 'get', params: { case_id: 'mock-id-1', @@ -102,7 +103,7 @@ describe('GET case', () => { }); it(`returns an error when thrown from getAllCaseComments`, async () => { const request = httpServerMock.createKibanaRequest({ - path: '/api/cases/{case_id}', + path: CASE_DETAILS_URL, method: 'get', params: { case_id: 'bad-guy', diff --git a/x-pack/plugins/case/server/routes/api/cases/get_case.ts b/x-pack/plugins/case/server/routes/api/cases/get_case.ts index ac32b20541a9c..1e836d38c285c 100644 --- a/x-pack/plugins/case/server/routes/api/cases/get_case.ts +++ b/x-pack/plugins/case/server/routes/api/cases/get_case.ts @@ -9,11 +9,12 @@ import { schema } from '@kbn/config-schema'; import { CaseResponseRt } from '../../../../common/api'; import { RouteDeps } from '../types'; import { flattenCaseSavedObject, wrapError } from '../utils'; +import { CASE_DETAILS_URL } from '../../../../common/constants'; export function initGetCaseApi({ caseService, router }: RouteDeps) { router.get( { - path: '/api/cases/{case_id}', + path: CASE_DETAILS_URL, validate: { params: schema.object({ case_id: schema.string(), diff --git a/x-pack/plugins/case/server/routes/api/cases/patch_cases.ts b/x-pack/plugins/case/server/routes/api/cases/patch_cases.ts index c36ea8964dc80..57f9fc20dbf34 100644 --- a/x-pack/plugins/case/server/routes/api/cases/patch_cases.ts +++ b/x-pack/plugins/case/server/routes/api/cases/patch_cases.ts @@ -20,11 +20,12 @@ import { escapeHatch, wrapError, flattenCaseSavedObject } from '../utils'; import { RouteDeps } from '../types'; import { getCaseToUpdate } from './helpers'; import { buildCaseUserActions } from '../../../services/user_actions/helpers'; +import { CASES_URL } from '../../../../common/constants'; export function initPatchCasesApi({ caseService, router, userActionService }: RouteDeps) { router.patch( { - path: '/api/cases', + path: CASES_URL, validate: { body: escapeHatch, }, diff --git a/x-pack/plugins/case/server/routes/api/cases/post_case.test.ts b/x-pack/plugins/case/server/routes/api/cases/post_case.test.ts index 5899102224774..0bbceb5214046 100644 --- a/x-pack/plugins/case/server/routes/api/cases/post_case.test.ts +++ b/x-pack/plugins/case/server/routes/api/cases/post_case.test.ts @@ -14,6 +14,7 @@ import { mockCases, } from '../__fixtures__'; import { initPostCaseApi } from './post_case'; +import { CASES_URL } from '../../../../common/constants'; describe('POST cases', () => { let routeHandler: RequestHandler; @@ -26,7 +27,7 @@ describe('POST cases', () => { }); it(`Posts a new case`, async () => { const request = httpServerMock.createKibanaRequest({ - path: '/api/cases', + path: CASES_URL, method: 'post', body: { description: 'This is a brand new case of a bad meanie defacing data', @@ -49,7 +50,7 @@ describe('POST cases', () => { it(`Error if you passing status for a new case`, async () => { const request = httpServerMock.createKibanaRequest({ - path: '/api/cases', + path: CASES_URL, method: 'post', body: { description: 'This is a brand new case of a bad meanie defacing data', @@ -70,7 +71,7 @@ describe('POST cases', () => { }); it(`Returns an error if postNewCase throws`, async () => { const request = httpServerMock.createKibanaRequest({ - path: '/api/cases', + path: CASES_URL, method: 'post', body: { description: 'Throw an error', @@ -93,7 +94,7 @@ describe('POST cases', () => { routeHandler = await createRoute(initPostCaseApi, 'post', true); const request = httpServerMock.createKibanaRequest({ - path: '/api/cases', + path: CASES_URL, method: 'post', body: { description: 'This is a brand new case of a bad meanie defacing data', diff --git a/x-pack/plugins/case/server/routes/api/cases/post_case.ts b/x-pack/plugins/case/server/routes/api/cases/post_case.ts index 239b8bfdf9b29..059a8b1affd54 100644 --- a/x-pack/plugins/case/server/routes/api/cases/post_case.ts +++ b/x-pack/plugins/case/server/routes/api/cases/post_case.ts @@ -14,11 +14,12 @@ import { flattenCaseSavedObject, transformNewCase, wrapError, escapeHatch } from import { CasePostRequestRt, throwErrors, excess, CaseResponseRt } from '../../../../common/api'; import { buildCaseUserActionItem } from '../../../services/user_actions/helpers'; import { RouteDeps } from '../types'; +import { CASES_URL } from '../../../../common/constants'; export function initPostCaseApi({ caseService, router, userActionService }: RouteDeps) { router.post( { - path: '/api/cases', + path: CASES_URL, validate: { body: escapeHatch, }, diff --git a/x-pack/plugins/case/server/routes/api/cases/push_case.ts b/x-pack/plugins/case/server/routes/api/cases/push_case.ts index aff057adea37f..94ebe24c3d2ae 100644 --- a/x-pack/plugins/case/server/routes/api/cases/push_case.ts +++ b/x-pack/plugins/case/server/routes/api/cases/push_case.ts @@ -15,6 +15,7 @@ import { flattenCaseSavedObject, wrapError, escapeHatch } from '../utils'; import { CaseExternalServiceRequestRt, CaseResponseRt, throwErrors } from '../../../../common/api'; import { buildCaseUserActionItem } from '../../../services/user_actions/helpers'; import { RouteDeps } from '../types'; +import { CASE_DETAILS_URL } from '../../../../common/constants'; export function initPushCaseUserActionApi({ caseConfigureService, @@ -24,7 +25,7 @@ export function initPushCaseUserActionApi({ }: RouteDeps) { router.post( { - path: '/api/cases/{case_id}/_push', + path: `${CASE_DETAILS_URL}/_push`, validate: { params: schema.object({ case_id: schema.string(), diff --git a/x-pack/plugins/case/server/routes/api/cases/reporters/get_reporters.ts b/x-pack/plugins/case/server/routes/api/cases/reporters/get_reporters.ts index 56862a96e0563..3fc96f506d175 100644 --- a/x-pack/plugins/case/server/routes/api/cases/reporters/get_reporters.ts +++ b/x-pack/plugins/case/server/routes/api/cases/reporters/get_reporters.ts @@ -7,11 +7,12 @@ import { UsersRt } from '../../../../../common/api'; import { RouteDeps } from '../../types'; import { wrapError } from '../../utils'; +import { CASE_REPORTERS_URL } from '../../../../../common/constants'; export function initGetReportersApi({ caseService, router }: RouteDeps) { router.get( { - path: '/api/cases/reporters', + path: CASE_REPORTERS_URL, validate: {}, }, async (context, request, response) => { diff --git a/x-pack/plugins/case/server/routes/api/cases/status/get_status.ts b/x-pack/plugins/case/server/routes/api/cases/status/get_status.ts index f7431729d398c..8f86dbc91f315 100644 --- a/x-pack/plugins/case/server/routes/api/cases/status/get_status.ts +++ b/x-pack/plugins/case/server/routes/api/cases/status/get_status.ts @@ -9,11 +9,12 @@ import { wrapError } from '../../utils'; import { CasesStatusResponseRt } from '../../../../../common/api'; import { CASE_SAVED_OBJECT } from '../../../../saved_object_types'; +import { CASE_STATUS_URL } from '../../../../../common/constants'; export function initGetCasesStatusApi({ caseService, router }: RouteDeps) { router.get( { - path: '/api/cases/status', + path: CASE_STATUS_URL, validate: {}, }, async (context, request, response) => { diff --git a/x-pack/plugins/case/server/routes/api/cases/tags/get_tags.ts b/x-pack/plugins/case/server/routes/api/cases/tags/get_tags.ts index 55e8fe2af128c..1a3da659c58c4 100644 --- a/x-pack/plugins/case/server/routes/api/cases/tags/get_tags.ts +++ b/x-pack/plugins/case/server/routes/api/cases/tags/get_tags.ts @@ -6,11 +6,12 @@ import { RouteDeps } from '../../types'; import { wrapError } from '../../utils'; +import { CASE_TAGS_URL } from '../../../../../common/constants'; export function initGetTagsApi({ caseService, router }: RouteDeps) { router.get( { - path: '/api/cases/tags', + path: CASE_TAGS_URL, validate: {}, }, async (context, request, response) => { diff --git a/x-pack/plugins/case/server/routes/api/cases/user_actions/get_all_user_actions.ts b/x-pack/plugins/case/server/routes/api/cases/user_actions/get_all_user_actions.ts index 2d4f16e46d561..c90979f60d23f 100644 --- a/x-pack/plugins/case/server/routes/api/cases/user_actions/get_all_user_actions.ts +++ b/x-pack/plugins/case/server/routes/api/cases/user_actions/get_all_user_actions.ts @@ -10,11 +10,12 @@ import { CaseUserActionsResponseRt } from '../../../../../common/api'; import { CASE_SAVED_OBJECT, CASE_COMMENT_SAVED_OBJECT } from '../../../../saved_object_types'; import { RouteDeps } from '../../types'; import { wrapError } from '../../utils'; +import { CASE_USER_ACTIONS_URL } from '../../../../../common/constants'; export function initGetAllUserActionsApi({ userActionService, router }: RouteDeps) { router.get( { - path: '/api/cases/{case_id}/user_actions', + path: CASE_USER_ACTIONS_URL, validate: { params: schema.object({ case_id: schema.string(), From 6ecba2c732e79cdd90013177fc91faabfef0db26 Mon Sep 17 00:00:00 2001 From: Mikhail Shustov Date: Tue, 21 Apr 2020 14:22:58 +0200 Subject: [PATCH 09/67] Run local prettier script (#63959) * convert eslint scripts into TS * update settings for BWC * add script updating styles to pretter v2 * use default prettier config * run npx once, point to the correct head branch, do not add to git * throw if run script not on a clear branch * run in a batch, add logging --- scripts/prettier_on_changed.js | 21 +++++ src/dev/eslint/{index.js => index.ts} | 0 .../eslint/{lint_files.js => lint_files.ts} | 5 +- ...files_to_lint.js => pick_files_to_lint.ts} | 8 +- src/dev/run_prettier_on_changed.ts | 87 +++++++++++++++++++ 5 files changed, 116 insertions(+), 5 deletions(-) create mode 100644 scripts/prettier_on_changed.js rename src/dev/eslint/{index.js => index.ts} (100%) rename src/dev/eslint/{lint_files.js => lint_files.ts} (90%) rename src/dev/eslint/{pick_files_to_lint.js => pick_files_to_lint.ts} (88%) create mode 100644 src/dev/run_prettier_on_changed.ts diff --git a/scripts/prettier_on_changed.js b/scripts/prettier_on_changed.js new file mode 100644 index 0000000000000..f9598110f91fd --- /dev/null +++ b/scripts/prettier_on_changed.js @@ -0,0 +1,21 @@ +/* + * 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. + */ + +require('../src/setup_node_env/babel_register'); +require('../src/dev/run_prettier_on_changed'); diff --git a/src/dev/eslint/index.js b/src/dev/eslint/index.ts similarity index 100% rename from src/dev/eslint/index.js rename to src/dev/eslint/index.ts diff --git a/src/dev/eslint/lint_files.js b/src/dev/eslint/lint_files.ts similarity index 90% rename from src/dev/eslint/lint_files.js rename to src/dev/eslint/lint_files.ts index a76edeb2eb865..80c493233f39a 100644 --- a/src/dev/eslint/lint_files.js +++ b/src/dev/eslint/lint_files.ts @@ -19,7 +19,8 @@ import { CLIEngine } from 'eslint'; -import { createFailError } from '@kbn/dev-utils'; +import { createFailError, ToolingLog } from '@kbn/dev-utils'; +import { File } from '../file'; import { REPO_ROOT } from '../constants'; /** @@ -30,7 +31,7 @@ import { REPO_ROOT } from '../constants'; * @param {Array} files * @return {undefined} */ -export function lintFiles(log, files, { fix } = {}) { +export function lintFiles(log: ToolingLog, files: File[], { fix }: { fix?: boolean } = {}) { const cli = new CLIEngine({ cache: true, cwd: REPO_ROOT, diff --git a/src/dev/eslint/pick_files_to_lint.js b/src/dev/eslint/pick_files_to_lint.ts similarity index 88% rename from src/dev/eslint/pick_files_to_lint.js rename to src/dev/eslint/pick_files_to_lint.ts index e3212c00d9e0d..b96781fc3a611 100644 --- a/src/dev/eslint/pick_files_to_lint.js +++ b/src/dev/eslint/pick_files_to_lint.ts @@ -16,9 +16,11 @@ * specific language governing permissions and limitations * under the License. */ - import { CLIEngine } from 'eslint'; +import { ToolingLog } from '@kbn/dev-utils'; +import { File } from '../file'; + /** * Filters a list of files to only include lintable files. * @@ -26,8 +28,8 @@ import { CLIEngine } from 'eslint'; * @param {Array} files * @return {Array} */ -export function pickFilesToLint(log, files) { - const cli = new CLIEngine(); +export function pickFilesToLint(log: ToolingLog, files: File[]) { + const cli = new CLIEngine({}); return files.filter(file => { if (!file.isJs() && !file.isTypescript()) { diff --git a/src/dev/run_prettier_on_changed.ts b/src/dev/run_prettier_on_changed.ts new file mode 100644 index 0000000000000..deca4fa1be3ce --- /dev/null +++ b/src/dev/run_prettier_on_changed.ts @@ -0,0 +1,87 @@ +/* + * 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 execa from 'execa'; +// @ts-ignore +import SimpleGit from 'simple-git'; +import { run } from '@kbn/dev-utils'; +import dedent from 'dedent'; +import Util from 'util'; + +import pkg from '../../package.json'; +import { REPO_ROOT } from './constants'; +import { File } from './file'; +import * as Eslint from './eslint'; + +run(async function getChangedFiles({ log }) { + const simpleGit = new SimpleGit(REPO_ROOT); + + const getStatus = Util.promisify(simpleGit.status.bind(simpleGit)); + const gitStatus = await getStatus(); + + if (gitStatus.files.length > 0) { + throw new Error( + dedent(`You should run prettier formatter on a clean branch. + Found not committed changes to: + ${gitStatus.files.map((f: { path: string }) => f.path).join('\n')}`) + ); + } + + const revParse = Util.promisify(simpleGit.revparse.bind(simpleGit)); + const currentBranch = await revParse(['--abbrev-ref', 'HEAD']); + const headBranch = pkg.branch; + + const diff = Util.promisify(simpleGit.diff.bind(simpleGit)); + + const changedFileStatuses: string = await diff([ + '--name-status', + `${headBranch}...${currentBranch}`, + ]); + + const changedFiles = changedFileStatuses + .split('\n') + // Ignore blank lines + .filter(line => line.trim().length > 0) + // git diff --name-status outputs lines with two OR three parts + // separated by a tab character + .map(line => line.trim().split('\t')) + .map(([status, ...paths]) => { + // ignore deleted files + if (status === 'D') { + return undefined; + } + + // the status is always in the first column + // .. If the file is edited the line will only have two columns + // .. If the file is renamed it will have three columns + // .. In any case, the last column is the CURRENT path to the file + return new File(paths[paths.length - 1]); + }) + .filter((file): file is File => Boolean(file)); + + const pathsToLint = Eslint.pickFilesToLint(log, changedFiles).map(f => f.getAbsolutePath()); + + if (pathsToLint.length > 0) { + log.debug('[prettier] run on %j files: ', pathsToLint.length, pathsToLint); + } + + while (pathsToLint.length > 0) { + await execa('npx', ['prettier@2.0.4', '--write', ...pathsToLint.splice(0, 100)]); + } +}); From 2b9c99bd017bb655465ae14eea75a5162e0a5940 Mon Sep 17 00:00:00 2001 From: Alexey Antonov Date: Tue, 21 Apr 2020 15:50:38 +0300 Subject: [PATCH 10/67] Index pattern management - field list - localization functions returning empty strings (#64055) Closes: #63649 --- src/legacy/ui/public/i18n/index.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/legacy/ui/public/i18n/index.tsx b/src/legacy/ui/public/i18n/index.tsx index 4d0f5d3a5bd56..c918554563fcb 100644 --- a/src/legacy/ui/public/i18n/index.tsx +++ b/src/legacy/ui/public/i18n/index.tsx @@ -44,7 +44,7 @@ export function wrapInI18nContext

(ComponentToWrap: React.ComponentType

) { } uiModules - .get('i18n') + .get('i18n', ['ngSanitize']) .provider('i18n', I18nProvider) .filter('i18n', i18nFilter) .directive('i18nId', i18nDirective); From f43d555f14e22ca0a6ed91db7ea2af855e62eb1f Mon Sep 17 00:00:00 2001 From: Josh Dover Date: Tue, 21 Apr 2020 07:39:59 -0600 Subject: [PATCH 11/67] Migrate logstash frontend to KP (#63417) --- .../public/management_service.test.ts | 3 +- .../management/public/management_service.ts | 1 - x-pack/index.js | 2 - x-pack/legacy/plugins/logstash/README.md | 3 - .../common/lib/__tests__/get_moment.js | 33 ---- .../plugins/logstash/common/lib/get_moment.js | 15 -- x-pack/legacy/plugins/logstash/index.js | 32 ---- .../public/lib/register_home_feature.ts | 35 ---- .../update_logstash_sections.js | 22 --- .../components/pipeline_edit/pipeline_edit.js | 60 ------ .../upgrade_failure/upgrade_failure.js | 49 ----- .../pipeline_edit/pipeline_edit_route.html | 5 - .../pipeline_edit/pipeline_edit_route.js | 87 --------- .../components/pipeline_list/index.js | 7 - .../components/pipeline_list/pipeline_list.js | 58 ------ .../public/sections/pipeline_list/index.js | 8 - .../pipeline_list/pipeline_list_route.html | 3 - .../pipeline_list/pipeline_list_route.js | 33 ---- .../register_management_section.js | 36 ---- .../cluster/cluster_service.factory.js | 13 -- .../logstash/public/services/cluster/index.js | 7 - .../logstash/public/services/license/index.js | 7 - .../license/license_service.factory.js | 14 -- .../license/logstash_license_service.js | 62 ------ .../public/services/monitoring/index.js | 7 - .../monitoring/monitoring_service.factory.js | 18 -- .../public/services/pipeline/index.js | 7 - .../pipeline/pipeline_service.factory.js | 14 -- .../services/pipeline/pipeline_service.js | 40 ---- .../public/services/pipelines/index.js | 7 - .../pipelines/pipelines_service.factory.js | 17 -- .../services/pipelines/pipelines_service.js | 135 ------------- .../public/services/security/index.js | 7 - .../services/security/logstash_security.js | 13 -- .../logstash/public/services/upgrade/index.js | 7 - .../upgrade/upgrade_service.factory.js | 13 -- .../services/upgrade/upgrade_service.js | 24 --- .../check_license/__tests__/check_license.js | 179 ------------------ .../server/lib/check_license/check_license.js | 86 --------- .../server/lib/check_license/index.js | 7 - .../lib/register_license_checker/index.js | 7 - .../register_license_checker.js | 21 -- x-pack/plugins/logstash/kibana.json | 10 +- .../public/application}/breadcrumbs.js | 7 +- ...confirm_delete_pipeline_modal.test.js.snap | 0 .../flex_item_setting.test.js.snap | 0 .../form_label_with_icon_tip.test.js.snap | 0 .../pipeline_editor.test.js.snap | 0 .../confirm_delete_pipeline_modal.js | 0 .../confirm_delete_pipeline_modal.test.js | 0 .../components/pipeline_editor/constants.js | 0 .../pipeline_editor/flex_item_setting.js | 0 .../pipeline_editor/flex_item_setting.test.js | 0 .../form_label_with_icon_tip.js | 0 .../form_label_with_icon_tip.test.js | 0 .../components/pipeline_editor/index.js | 0 .../pipeline_editor/pipeline_editor.js | 25 +-- .../pipeline_editor/pipeline_editor.test.js | 18 +- .../__snapshots__/add_role_alert.test.js.snap | 0 .../__snapshots__/alert_call_out.test.js.snap | 0 .../confirm_delete_modal.test.js.snap | 0 .../enable_monitoring_alert.test.js.snap | 0 .../__snapshots__/info_alerts.test.js.snap | 0 .../pipelines_table.test.js.snap | 0 .../pipeline_list/add_role_alert.js | 0 .../pipeline_list/add_role_alert.test.js | 0 .../pipeline_list/alert_call_out.js | 0 .../pipeline_list/alert_call_out.test.js | 0 .../pipeline_list/confirm_delete_modal.js | 0 .../confirm_delete_modal.test.js | 0 .../components/pipeline_list/constants.js | 0 .../pipeline_list/enable_monitoring_alert.js | 0 .../enable_monitoring_alert.test.js | 0 .../components/pipeline_list/index.js | 0 .../components/pipeline_list/info_alerts.js | 0 .../pipeline_list/info_alerts.test.js | 0 .../components/pipeline_list/pipeline_list.js | 0 .../pipeline_list/pipeline_list.test.js | 0 .../pipeline_list/pipelines_table.js | 0 .../pipeline_list/pipelines_table.test.js | 0 .../upgrade_failure.test.js.snap | 0 .../upgrade_failure_actions.test.js.snap | 0 .../upgrade_failure_title.test.js.snap | 0 .../components/upgrade_failure/constants.js | 0 .../components/upgrade_failure/index.js | 0 .../upgrade_failure/upgrade_failure.js | 0 .../upgrade_failure/upgrade_failure.test.js | 0 .../upgrade_failure_actions.js | 0 .../upgrade_failure_actions.test.js | 0 .../upgrade_failure/upgrade_failure_title.js | 0 .../upgrade_failure_title.test.js | 0 .../logstash/public/application/index.tsx | 117 ++++++++++++ .../public/application/pipeline_edit_view.tsx | 153 +++++++++++++++ x-pack/plugins/logstash/public/index.ts | 9 + .../lib/get_search_value/get_search_value.js | 0 .../public/lib/get_search_value/index.js | 0 .../logstash/public/models/cluster/cluster.js | 0 .../logstash/public/models/cluster/index.js | 0 .../logstash/public/models/pipeline/index.js | 0 .../public/models/pipeline/pipeline.js | 0 .../public/models/pipeline_list_item/index.js | 0 .../pipeline_list_item/pipeline_list_item.js | 16 +- x-pack/plugins/logstash/public/plugin.ts | 92 +++++++++ .../services/cluster/cluster_service.js | 16 +- .../public/services/cluster}/index.js | 2 +- .../plugins/logstash/public/services/index.js | 12 ++ .../public/services/license}/index.js | 2 +- .../license/logstash_license_service.js | 106 +++++++++++ .../public/services/monitoring/index.js | 7 + .../services/monitoring/monitoring_service.js | 21 +- .../public/services/pipeline}/index.js | 2 +- .../services/pipeline/pipeline_service.js | 40 ++++ .../public/services/pipelines}/index.js | 2 +- .../services/pipelines/pipelines_service.js | 128 +++++++++++++ .../public/services/upgrade}/index.js | 2 +- .../services/upgrade/upgrade_service.js | 22 +++ .../logstash/server/routes/pipeline/save.ts | 1 - .../translations/translations/ja-JP.json | 2 - .../translations/translations/zh-CN.json | 2 - .../apis/logstash/pipeline/delete.ts | 1 - .../apis/logstash/pipeline/save.ts | 1 - 121 files changed, 737 insertions(+), 1283 deletions(-) delete mode 100755 x-pack/legacy/plugins/logstash/README.md delete mode 100755 x-pack/legacy/plugins/logstash/common/lib/__tests__/get_moment.js delete mode 100755 x-pack/legacy/plugins/logstash/common/lib/get_moment.js delete mode 100755 x-pack/legacy/plugins/logstash/index.js delete mode 100644 x-pack/legacy/plugins/logstash/public/lib/register_home_feature.ts delete mode 100755 x-pack/legacy/plugins/logstash/public/lib/update_management_sections/update_logstash_sections.js delete mode 100755 x-pack/legacy/plugins/logstash/public/sections/pipeline_edit/components/pipeline_edit/pipeline_edit.js delete mode 100755 x-pack/legacy/plugins/logstash/public/sections/pipeline_edit/components/upgrade_failure/upgrade_failure.js delete mode 100755 x-pack/legacy/plugins/logstash/public/sections/pipeline_edit/pipeline_edit_route.html delete mode 100755 x-pack/legacy/plugins/logstash/public/sections/pipeline_edit/pipeline_edit_route.js delete mode 100755 x-pack/legacy/plugins/logstash/public/sections/pipeline_list/components/pipeline_list/index.js delete mode 100755 x-pack/legacy/plugins/logstash/public/sections/pipeline_list/components/pipeline_list/pipeline_list.js delete mode 100755 x-pack/legacy/plugins/logstash/public/sections/pipeline_list/index.js delete mode 100755 x-pack/legacy/plugins/logstash/public/sections/pipeline_list/pipeline_list_route.html delete mode 100755 x-pack/legacy/plugins/logstash/public/sections/pipeline_list/pipeline_list_route.js delete mode 100755 x-pack/legacy/plugins/logstash/public/sections/pipeline_list/register_management_section.js delete mode 100755 x-pack/legacy/plugins/logstash/public/services/cluster/cluster_service.factory.js delete mode 100755 x-pack/legacy/plugins/logstash/public/services/cluster/index.js delete mode 100755 x-pack/legacy/plugins/logstash/public/services/license/index.js delete mode 100755 x-pack/legacy/plugins/logstash/public/services/license/license_service.factory.js delete mode 100755 x-pack/legacy/plugins/logstash/public/services/license/logstash_license_service.js delete mode 100755 x-pack/legacy/plugins/logstash/public/services/monitoring/index.js delete mode 100755 x-pack/legacy/plugins/logstash/public/services/monitoring/monitoring_service.factory.js delete mode 100755 x-pack/legacy/plugins/logstash/public/services/pipeline/index.js delete mode 100755 x-pack/legacy/plugins/logstash/public/services/pipeline/pipeline_service.factory.js delete mode 100755 x-pack/legacy/plugins/logstash/public/services/pipeline/pipeline_service.js delete mode 100755 x-pack/legacy/plugins/logstash/public/services/pipelines/index.js delete mode 100755 x-pack/legacy/plugins/logstash/public/services/pipelines/pipelines_service.factory.js delete mode 100755 x-pack/legacy/plugins/logstash/public/services/pipelines/pipelines_service.js delete mode 100755 x-pack/legacy/plugins/logstash/public/services/security/index.js delete mode 100755 x-pack/legacy/plugins/logstash/public/services/security/logstash_security.js delete mode 100755 x-pack/legacy/plugins/logstash/public/services/upgrade/index.js delete mode 100755 x-pack/legacy/plugins/logstash/public/services/upgrade/upgrade_service.factory.js delete mode 100755 x-pack/legacy/plugins/logstash/public/services/upgrade/upgrade_service.js delete mode 100755 x-pack/legacy/plugins/logstash/server/lib/check_license/__tests__/check_license.js delete mode 100755 x-pack/legacy/plugins/logstash/server/lib/check_license/check_license.js delete mode 100755 x-pack/legacy/plugins/logstash/server/lib/check_license/index.js delete mode 100755 x-pack/legacy/plugins/logstash/server/lib/register_license_checker/index.js delete mode 100755 x-pack/legacy/plugins/logstash/server/lib/register_license_checker/register_license_checker.js rename x-pack/{legacy/plugins/logstash/public/sections => plugins/logstash/public/application}/breadcrumbs.js (80%) rename x-pack/{legacy/plugins/logstash/public => plugins/logstash/public/application}/components/pipeline_editor/__snapshots__/confirm_delete_pipeline_modal.test.js.snap (100%) rename x-pack/{legacy/plugins/logstash/public => plugins/logstash/public/application}/components/pipeline_editor/__snapshots__/flex_item_setting.test.js.snap (100%) rename x-pack/{legacy/plugins/logstash/public => plugins/logstash/public/application}/components/pipeline_editor/__snapshots__/form_label_with_icon_tip.test.js.snap (100%) rename x-pack/{legacy/plugins/logstash/public => plugins/logstash/public/application}/components/pipeline_editor/__snapshots__/pipeline_editor.test.js.snap (100%) rename x-pack/{legacy/plugins/logstash/public => plugins/logstash/public/application}/components/pipeline_editor/confirm_delete_pipeline_modal.js (100%) rename x-pack/{legacy/plugins/logstash/public => plugins/logstash/public/application}/components/pipeline_editor/confirm_delete_pipeline_modal.test.js (100%) rename x-pack/{legacy/plugins/logstash/public => plugins/logstash/public/application}/components/pipeline_editor/constants.js (100%) rename x-pack/{legacy/plugins/logstash/public => plugins/logstash/public/application}/components/pipeline_editor/flex_item_setting.js (100%) rename x-pack/{legacy/plugins/logstash/public => plugins/logstash/public/application}/components/pipeline_editor/flex_item_setting.test.js (100%) rename x-pack/{legacy/plugins/logstash/public => plugins/logstash/public/application}/components/pipeline_editor/form_label_with_icon_tip.js (100%) rename x-pack/{legacy/plugins/logstash/public => plugins/logstash/public/application}/components/pipeline_editor/form_label_with_icon_tip.test.js (100%) rename x-pack/{legacy/plugins/logstash/public => plugins/logstash/public/application}/components/pipeline_editor/index.js (100%) rename x-pack/{legacy/plugins/logstash/public => plugins/logstash/public/application}/components/pipeline_editor/pipeline_editor.js (97%) rename x-pack/{legacy/plugins/logstash/public => plugins/logstash/public/application}/components/pipeline_editor/pipeline_editor.test.js (96%) rename x-pack/{legacy/plugins/logstash/public => plugins/logstash/public/application}/components/pipeline_list/__snapshots__/add_role_alert.test.js.snap (100%) rename x-pack/{legacy/plugins/logstash/public => plugins/logstash/public/application}/components/pipeline_list/__snapshots__/alert_call_out.test.js.snap (100%) rename x-pack/{legacy/plugins/logstash/public => plugins/logstash/public/application}/components/pipeline_list/__snapshots__/confirm_delete_modal.test.js.snap (100%) rename x-pack/{legacy/plugins/logstash/public => plugins/logstash/public/application}/components/pipeline_list/__snapshots__/enable_monitoring_alert.test.js.snap (100%) rename x-pack/{legacy/plugins/logstash/public => plugins/logstash/public/application}/components/pipeline_list/__snapshots__/info_alerts.test.js.snap (100%) rename x-pack/{legacy/plugins/logstash/public => plugins/logstash/public/application}/components/pipeline_list/__snapshots__/pipelines_table.test.js.snap (100%) rename x-pack/{legacy/plugins/logstash/public => plugins/logstash/public/application}/components/pipeline_list/add_role_alert.js (100%) rename x-pack/{legacy/plugins/logstash/public => plugins/logstash/public/application}/components/pipeline_list/add_role_alert.test.js (100%) rename x-pack/{legacy/plugins/logstash/public => plugins/logstash/public/application}/components/pipeline_list/alert_call_out.js (100%) rename x-pack/{legacy/plugins/logstash/public => plugins/logstash/public/application}/components/pipeline_list/alert_call_out.test.js (100%) rename x-pack/{legacy/plugins/logstash/public => plugins/logstash/public/application}/components/pipeline_list/confirm_delete_modal.js (100%) rename x-pack/{legacy/plugins/logstash/public => plugins/logstash/public/application}/components/pipeline_list/confirm_delete_modal.test.js (100%) rename x-pack/{legacy/plugins/logstash/public => plugins/logstash/public/application}/components/pipeline_list/constants.js (100%) rename x-pack/{legacy/plugins/logstash/public => plugins/logstash/public/application}/components/pipeline_list/enable_monitoring_alert.js (100%) rename x-pack/{legacy/plugins/logstash/public => plugins/logstash/public/application}/components/pipeline_list/enable_monitoring_alert.test.js (100%) rename x-pack/{legacy/plugins/logstash/public => plugins/logstash/public/application}/components/pipeline_list/index.js (100%) rename x-pack/{legacy/plugins/logstash/public => plugins/logstash/public/application}/components/pipeline_list/info_alerts.js (100%) rename x-pack/{legacy/plugins/logstash/public => plugins/logstash/public/application}/components/pipeline_list/info_alerts.test.js (100%) rename x-pack/{legacy/plugins/logstash/public => plugins/logstash/public/application}/components/pipeline_list/pipeline_list.js (100%) rename x-pack/{legacy/plugins/logstash/public => plugins/logstash/public/application}/components/pipeline_list/pipeline_list.test.js (100%) rename x-pack/{legacy/plugins/logstash/public => plugins/logstash/public/application}/components/pipeline_list/pipelines_table.js (100%) rename x-pack/{legacy/plugins/logstash/public => plugins/logstash/public/application}/components/pipeline_list/pipelines_table.test.js (100%) rename x-pack/{legacy/plugins/logstash/public => plugins/logstash/public/application}/components/upgrade_failure/__snapshots__/upgrade_failure.test.js.snap (100%) rename x-pack/{legacy/plugins/logstash/public => plugins/logstash/public/application}/components/upgrade_failure/__snapshots__/upgrade_failure_actions.test.js.snap (100%) rename x-pack/{legacy/plugins/logstash/public => plugins/logstash/public/application}/components/upgrade_failure/__snapshots__/upgrade_failure_title.test.js.snap (100%) rename x-pack/{legacy/plugins/logstash/public => plugins/logstash/public/application}/components/upgrade_failure/constants.js (100%) rename x-pack/{legacy/plugins/logstash/public => plugins/logstash/public/application}/components/upgrade_failure/index.js (100%) rename x-pack/{legacy/plugins/logstash/public => plugins/logstash/public/application}/components/upgrade_failure/upgrade_failure.js (100%) rename x-pack/{legacy/plugins/logstash/public => plugins/logstash/public/application}/components/upgrade_failure/upgrade_failure.test.js (100%) rename x-pack/{legacy/plugins/logstash/public => plugins/logstash/public/application}/components/upgrade_failure/upgrade_failure_actions.js (100%) rename x-pack/{legacy/plugins/logstash/public => plugins/logstash/public/application}/components/upgrade_failure/upgrade_failure_actions.test.js (100%) rename x-pack/{legacy/plugins/logstash/public => plugins/logstash/public/application}/components/upgrade_failure/upgrade_failure_title.js (100%) rename x-pack/{legacy/plugins/logstash/public => plugins/logstash/public/application}/components/upgrade_failure/upgrade_failure_title.test.js (100%) create mode 100644 x-pack/plugins/logstash/public/application/index.tsx create mode 100644 x-pack/plugins/logstash/public/application/pipeline_edit_view.tsx create mode 100644 x-pack/plugins/logstash/public/index.ts rename x-pack/{legacy => }/plugins/logstash/public/lib/get_search_value/get_search_value.js (100%) rename x-pack/{legacy => }/plugins/logstash/public/lib/get_search_value/index.js (100%) rename x-pack/{legacy => }/plugins/logstash/public/models/cluster/cluster.js (100%) rename x-pack/{legacy => }/plugins/logstash/public/models/cluster/index.js (100%) rename x-pack/{legacy => }/plugins/logstash/public/models/pipeline/index.js (100%) rename x-pack/{legacy => }/plugins/logstash/public/models/pipeline/pipeline.js (100%) rename x-pack/{legacy => }/plugins/logstash/public/models/pipeline_list_item/index.js (100%) rename x-pack/{legacy => }/plugins/logstash/public/models/pipeline_list_item/pipeline_list_item.js (83%) create mode 100644 x-pack/plugins/logstash/public/plugin.ts rename x-pack/{legacy => }/plugins/logstash/public/services/cluster/cluster_service.js (51%) rename x-pack/{legacy/plugins/logstash/public/sections/pipeline_edit/components/pipeline_edit => plugins/logstash/public/services/cluster}/index.js (82%) create mode 100644 x-pack/plugins/logstash/public/services/index.js rename x-pack/{legacy/plugins/logstash/public/lib/update_management_sections => plugins/logstash/public/services/license}/index.js (77%) create mode 100755 x-pack/plugins/logstash/public/services/license/logstash_license_service.js create mode 100755 x-pack/plugins/logstash/public/services/monitoring/index.js rename x-pack/{legacy => }/plugins/logstash/public/services/monitoring/monitoring_service.js (58%) rename x-pack/{legacy/plugins/logstash/public/sections/pipeline_edit/components/upgrade_failure => plugins/logstash/public/services/pipeline}/index.js (81%) create mode 100755 x-pack/plugins/logstash/public/services/pipeline/pipeline_service.js rename x-pack/{legacy/plugins/logstash/common/lib => plugins/logstash/public/services/pipelines}/index.js (81%) create mode 100755 x-pack/plugins/logstash/public/services/pipelines/pipelines_service.js rename x-pack/{legacy/plugins/logstash/public/sections/pipeline_edit => plugins/logstash/public/services/upgrade}/index.js (82%) create mode 100755 x-pack/plugins/logstash/public/services/upgrade/upgrade_service.js diff --git a/src/plugins/management/public/management_service.test.ts b/src/plugins/management/public/management_service.test.ts index ceb91837921eb..18569ef285ff3 100644 --- a/src/plugins/management/public/management_service.test.ts +++ b/src/plugins/management/public/management_service.test.ts @@ -29,9 +29,8 @@ test('Provides default sections', () => { () => {}, coreMock.createSetup().getStartServices ); - expect(service.getAllSections().length).toEqual(3); + expect(service.getAllSections().length).toEqual(2); expect(service.getSection('kibana')).not.toBeUndefined(); - expect(service.getSection('logstash')).not.toBeUndefined(); expect(service.getSection('elasticsearch')).not.toBeUndefined(); }); diff --git a/src/plugins/management/public/management_service.ts b/src/plugins/management/public/management_service.ts index ed31a22992da8..8fc207e32e6ce 100644 --- a/src/plugins/management/public/management_service.ts +++ b/src/plugins/management/public/management_service.ts @@ -80,7 +80,6 @@ export class ManagementService { ); register({ id: 'kibana', title: 'Kibana', order: 30, euiIconType: 'logoKibana' }); - register({ id: 'logstash', title: 'Logstash', order: 30, euiIconType: 'logoLogstash' }); register({ id: 'elasticsearch', title: 'Elasticsearch', diff --git a/x-pack/index.js b/x-pack/index.js index 7fbd992120ea6..1a78c24b1221b 100644 --- a/x-pack/index.js +++ b/x-pack/index.js @@ -10,7 +10,6 @@ import { monitoring } from './legacy/plugins/monitoring'; import { reporting } from './legacy/plugins/reporting'; import { security } from './legacy/plugins/security'; import { dashboardMode } from './legacy/plugins/dashboard_mode'; -import { logstash } from './legacy/plugins/logstash'; import { beats } from './legacy/plugins/beats_management'; import { apm } from './legacy/plugins/apm'; import { maps } from './legacy/plugins/maps'; @@ -40,7 +39,6 @@ module.exports = function(kibana) { spaces(kibana), security(kibana), dashboardMode(kibana), - logstash(kibana), beats(kibana), apm(kibana), maps(kibana), diff --git a/x-pack/legacy/plugins/logstash/README.md b/x-pack/legacy/plugins/logstash/README.md deleted file mode 100755 index 7d181249300fa..0000000000000 --- a/x-pack/legacy/plugins/logstash/README.md +++ /dev/null @@ -1,3 +0,0 @@ -## Logstash Plugin - -This plugin adds Logstash specific UI code to x-pack. Currently this plugin adds just the management features. diff --git a/x-pack/legacy/plugins/logstash/common/lib/__tests__/get_moment.js b/x-pack/legacy/plugins/logstash/common/lib/__tests__/get_moment.js deleted file mode 100755 index 2e63b231bec32..0000000000000 --- a/x-pack/legacy/plugins/logstash/common/lib/__tests__/get_moment.js +++ /dev/null @@ -1,33 +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 expect from '@kbn/expect'; -import { getMoment } from '../get_moment'; - -describe('get_moment', () => { - describe('getMoment', () => { - it(`returns a moment object when passed a date`, () => { - const moment = getMoment('2017-03-30T14:53:08.121Z'); - - expect(moment.constructor.name).to.be('Moment'); - }); - - it(`returns null when passed falsy`, () => { - const results = [ - getMoment(false), - getMoment(0), - getMoment(''), - getMoment(null), - getMoment(undefined), - getMoment(NaN), - ]; - - results.forEach(result => { - expect(result).to.be(null); - }); - }); - }); -}); diff --git a/x-pack/legacy/plugins/logstash/common/lib/get_moment.js b/x-pack/legacy/plugins/logstash/common/lib/get_moment.js deleted file mode 100755 index 7a808ec9a0336..0000000000000 --- a/x-pack/legacy/plugins/logstash/common/lib/get_moment.js +++ /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 moment from 'moment'; - -export function getMoment(date) { - if (!date) { - return null; - } - - return moment(date); -} diff --git a/x-pack/legacy/plugins/logstash/index.js b/x-pack/legacy/plugins/logstash/index.js deleted file mode 100755 index 29f01032f3413..0000000000000 --- a/x-pack/legacy/plugins/logstash/index.js +++ /dev/null @@ -1,32 +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 { resolve } from 'path'; -import { registerLicenseChecker } from './server/lib/register_license_checker'; -import { PLUGIN } from '../../../plugins/logstash/common/constants'; - -export const logstash = kibana => - new kibana.Plugin({ - id: PLUGIN.ID, - publicDir: resolve(__dirname, 'public'), - require: ['kibana', 'elasticsearch', 'xpack_main'], - configPrefix: 'xpack.logstash', - config(Joi) { - return Joi.object({ - enabled: Joi.boolean().default(true), - }).default(); - }, - uiExports: { - managementSections: [ - 'plugins/logstash/sections/pipeline_list', - 'plugins/logstash/sections/pipeline_edit', - ], - home: ['plugins/logstash/lib/register_home_feature'], - }, - init: server => { - registerLicenseChecker(server); - }, - }); diff --git a/x-pack/legacy/plugins/logstash/public/lib/register_home_feature.ts b/x-pack/legacy/plugins/logstash/public/lib/register_home_feature.ts deleted file mode 100644 index 2e1ee2afb9ce6..0000000000000 --- a/x-pack/legacy/plugins/logstash/public/lib/register_home_feature.ts +++ /dev/null @@ -1,35 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import { i18n } from '@kbn/i18n'; -import { npSetup } from 'ui/new_platform'; -// @ts-ignore -import { xpackInfo } from 'plugins/xpack_main/services/xpack_info'; -import { FeatureCatalogueCategory } from '../../../../../../src/plugins/home/public'; -// @ts-ignore -import { PLUGIN } from '../../../../../plugins/logstash/common/constants'; - -const { - plugins: { home }, -} = npSetup; - -const enableLinks = Boolean(xpackInfo.get(`features.${PLUGIN.ID}.enableLinks`)); - -if (enableLinks) { - home.featureCatalogue.register({ - id: 'management_logstash', - title: i18n.translate('xpack.logstash.homeFeature.logstashPipelinesTitle', { - defaultMessage: 'Logstash Pipelines', - }), - description: i18n.translate('xpack.logstash.homeFeature.logstashPipelinesDescription', { - defaultMessage: 'Create, delete, update, and clone data ingestion pipelines.', - }), - icon: 'pipelineApp', - path: '/app/kibana#/management/logstash/pipelines', - showOnHomePage: true, - category: FeatureCatalogueCategory.ADMIN, - }); -} diff --git a/x-pack/legacy/plugins/logstash/public/lib/update_management_sections/update_logstash_sections.js b/x-pack/legacy/plugins/logstash/public/lib/update_management_sections/update_logstash_sections.js deleted file mode 100755 index 8da687529c846..0000000000000 --- a/x-pack/legacy/plugins/logstash/public/lib/update_management_sections/update_logstash_sections.js +++ /dev/null @@ -1,22 +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 { management } from 'ui/management'; - -export function updateLogstashSections(pipelineId) { - const editSection = management.getSection('logstash/pipelines/pipeline/edit'); - const newSection = management.getSection('logstash/pipelines/pipeline/new'); - - newSection.hide(); - editSection.hide(); - - if (pipelineId) { - editSection.url = `#/management/logstash/pipelines/pipeline/${pipelineId}/edit`; - editSection.show(); - } else { - newSection.show(); - } -} diff --git a/x-pack/legacy/plugins/logstash/public/sections/pipeline_edit/components/pipeline_edit/pipeline_edit.js b/x-pack/legacy/plugins/logstash/public/sections/pipeline_edit/components/pipeline_edit/pipeline_edit.js deleted file mode 100755 index 83446278fdeca..0000000000000 --- a/x-pack/legacy/plugins/logstash/public/sections/pipeline_edit/components/pipeline_edit/pipeline_edit.js +++ /dev/null @@ -1,60 +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 { render } from 'react-dom'; -import { isEmpty } from 'lodash'; -import { uiModules } from 'ui/modules'; -import { npSetup } from 'ui/new_platform'; -import { toastNotifications } from 'ui/notify'; -import { I18nContext } from 'ui/i18n'; -import { PipelineEditor } from '../../../../components/pipeline_editor'; -import 'plugins/logstash/services/license'; -import { logstashSecurity } from 'plugins/logstash/services/security'; -import 'ace'; - -const app = uiModules.get('xpack/logstash'); - -app.directive('pipelineEdit', function($injector) { - const pipelineService = $injector.get('pipelineService'); - const licenseService = $injector.get('logstashLicenseService'); - const kbnUrl = $injector.get('kbnUrl'); - const $route = $injector.get('$route'); - - return { - restrict: 'E', - link: async (scope, el) => { - const close = () => scope.$evalAsync(kbnUrl.change('/management/logstash/pipelines', {})); - const open = id => - scope.$evalAsync(kbnUrl.change(`/management/logstash/pipelines/${id}/edit`)); - - const userResource = logstashSecurity.isSecurityEnabled() - ? await npSetup.plugins.security.authc.getCurrentUser() - : null; - - render( - - - , - el[0] - ); - }, - scope: { - pipeline: '=', - }, - }; -}); diff --git a/x-pack/legacy/plugins/logstash/public/sections/pipeline_edit/components/upgrade_failure/upgrade_failure.js b/x-pack/legacy/plugins/logstash/public/sections/pipeline_edit/components/upgrade_failure/upgrade_failure.js deleted file mode 100755 index 2ef99d3b47672..0000000000000 --- a/x-pack/legacy/plugins/logstash/public/sections/pipeline_edit/components/upgrade_failure/upgrade_failure.js +++ /dev/null @@ -1,49 +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 { render } from 'react-dom'; -import { isEmpty } from 'lodash'; -import { uiModules } from 'ui/modules'; -import { I18nContext } from 'ui/i18n'; -import { UpgradeFailure } from '../../../../components/upgrade_failure'; - -const app = uiModules.get('xpack/logstash'); - -app.directive('upgradeFailure', $injector => { - const $route = $injector.get('$route'); - const kbnUrl = $injector.get('kbnUrl'); - - return { - link: (scope, el) => { - const onRetry = () => { - $route.updateParams({ retry: true }); - $route.reload(); - }; - const onClose = () => { - scope.$evalAsync(kbnUrl.change('management/logstash/pipelines', {})); - }; - const isNewPipeline = isEmpty(scope.pipeline.id); - const isManualUpgrade = !!$route.current.params.retry; - - render( - - - , - el[0] - ); - }, - restrict: 'E', - scope: { - pipeline: '=', - }, - }; -}); diff --git a/x-pack/legacy/plugins/logstash/public/sections/pipeline_edit/pipeline_edit_route.html b/x-pack/legacy/plugins/logstash/public/sections/pipeline_edit/pipeline_edit_route.html deleted file mode 100755 index e1c422d46dfdb..0000000000000 --- a/x-pack/legacy/plugins/logstash/public/sections/pipeline_edit/pipeline_edit_route.html +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/x-pack/legacy/plugins/logstash/public/sections/pipeline_edit/pipeline_edit_route.js b/x-pack/legacy/plugins/logstash/public/sections/pipeline_edit/pipeline_edit_route.js deleted file mode 100755 index 733f7dc3ae2e6..0000000000000 --- a/x-pack/legacy/plugins/logstash/public/sections/pipeline_edit/pipeline_edit_route.js +++ /dev/null @@ -1,87 +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 routes from 'ui/routes'; -import { toastNotifications } from 'ui/notify'; -import { i18n } from '@kbn/i18n'; -import template from './pipeline_edit_route.html'; -import 'plugins/logstash/services/pipeline'; -import 'plugins/logstash/services/license'; -import 'plugins/logstash/services/upgrade'; -import './components/pipeline_edit'; -import './components/upgrade_failure'; -import { updateLogstashSections } from 'plugins/logstash/lib/update_management_sections'; -import { Pipeline } from 'plugins/logstash/models/pipeline'; -import { getPipelineCreateBreadcrumbs, getPipelineEditBreadcrumbs } from '../breadcrumbs'; - -routes - .when('/management/logstash/pipelines/pipeline/:id/edit', { - k7Breadcrumbs: getPipelineEditBreadcrumbs, - }) - .when('/management/logstash/pipelines/new-pipeline', { - k7Breadcrumbs: getPipelineCreateBreadcrumbs, - }) - .defaults(/management\/logstash\/pipelines\/(new-pipeline|pipeline\/:id\/edit)/, { - template: template, - controller: class PipelineEditRouteController { - constructor($injector) { - const $route = $injector.get('$route'); - this.pipeline = $route.current.locals.pipeline; - this.isUpgraded = $route.current.locals.isUpgraded; - } - }, - controllerAs: 'pipelineEditRoute', - resolve: { - logstashTabs: $injector => { - const $route = $injector.get('$route'); - const pipelineId = $route.current.params.id; - updateLogstashSections(pipelineId); - }, - pipeline: function($injector) { - const $route = $injector.get('$route'); - const pipelineService = $injector.get('pipelineService'); - const licenseService = $injector.get('logstashLicenseService'); - const kbnUrl = $injector.get('kbnUrl'); - - const pipelineId = $route.current.params.id; - - if (!pipelineId) return new Pipeline(); - - return pipelineService - .loadPipeline(pipelineId) - .then(pipeline => (!!$route.current.params.clone ? pipeline.clone : pipeline)) - .catch(err => { - return licenseService.checkValidity().then(() => { - if (err.status !== 403) { - toastNotifications.addDanger( - i18n.translate('xpack.logstash.couldNotLoadPipelineErrorNotification', { - defaultMessage: `Couldn't load pipeline. Error: '{errStatusText}'.`, - values: { - errStatusText: err.statusText, - }, - }) - ); - } - - kbnUrl.redirect('/management/logstash/pipelines'); - return Promise.reject(); - }); - }); - }, - checkLicense: $injector => { - const licenseService = $injector.get('logstashLicenseService'); - return licenseService.checkValidity(); - }, - isUpgraded: $injector => { - const upgradeService = $injector.get('upgradeService'); - return upgradeService.executeUpgrade(); - }, - }, - }); - -routes.when('/management/logstash/pipelines/pipeline/:id', { - redirectTo: '/management/logstash/pipelines/pipeline/:id/edit', -}); diff --git a/x-pack/legacy/plugins/logstash/public/sections/pipeline_list/components/pipeline_list/index.js b/x-pack/legacy/plugins/logstash/public/sections/pipeline_list/components/pipeline_list/index.js deleted file mode 100755 index 7e8ca0e4c2c57..0000000000000 --- a/x-pack/legacy/plugins/logstash/public/sections/pipeline_list/components/pipeline_list/index.js +++ /dev/null @@ -1,7 +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 './pipeline_list'; diff --git a/x-pack/legacy/plugins/logstash/public/sections/pipeline_list/components/pipeline_list/pipeline_list.js b/x-pack/legacy/plugins/logstash/public/sections/pipeline_list/components/pipeline_list/pipeline_list.js deleted file mode 100755 index b856979aed8b6..0000000000000 --- a/x-pack/legacy/plugins/logstash/public/sections/pipeline_list/components/pipeline_list/pipeline_list.js +++ /dev/null @@ -1,58 +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 { render } from 'react-dom'; -import { uiModules } from 'ui/modules'; -import { toastNotifications } from 'ui/notify'; -import { I18nContext } from 'ui/i18n'; -import { PipelineList } from '../../../../components/pipeline_list'; -import 'plugins/logstash/services/pipelines'; -import 'plugins/logstash/services/license'; -import 'plugins/logstash/services/cluster'; -import 'plugins/logstash/services/monitoring'; - -const app = uiModules.get('xpack/logstash'); - -app.directive('pipelineList', function($injector) { - const pipelinesService = $injector.get('pipelinesService'); - const licenseService = $injector.get('logstashLicenseService'); - const clusterService = $injector.get('xpackLogstashClusterService'); - const monitoringService = $injector.get('xpackLogstashMonitoringService'); - const kbnUrl = $injector.get('kbnUrl'); - - return { - restrict: 'E', - link: (scope, el) => { - const openPipeline = id => - scope.$evalAsync(kbnUrl.change(`management/logstash/pipelines/pipeline/${id}/edit`)); - const createPipeline = () => - scope.$evalAsync(kbnUrl.change('management/logstash/pipelines/new-pipeline')); - const clonePipeline = id => - scope.$evalAsync(kbnUrl.change(`management/logstash/pipelines/pipeline/${id}/edit?clone`)); - render( - - - , - el[0] - ); - }, - scope: {}, - controllerAs: 'pipelineList', - }; -}); diff --git a/x-pack/legacy/plugins/logstash/public/sections/pipeline_list/index.js b/x-pack/legacy/plugins/logstash/public/sections/pipeline_list/index.js deleted file mode 100755 index f60decd1378d5..0000000000000 --- a/x-pack/legacy/plugins/logstash/public/sections/pipeline_list/index.js +++ /dev/null @@ -1,8 +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 './register_management_section'; -import './pipeline_list_route'; diff --git a/x-pack/legacy/plugins/logstash/public/sections/pipeline_list/pipeline_list_route.html b/x-pack/legacy/plugins/logstash/public/sections/pipeline_list/pipeline_list_route.html deleted file mode 100755 index 55b3fabd70161..0000000000000 --- a/x-pack/legacy/plugins/logstash/public/sections/pipeline_list/pipeline_list_route.html +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/x-pack/legacy/plugins/logstash/public/sections/pipeline_list/pipeline_list_route.js b/x-pack/legacy/plugins/logstash/public/sections/pipeline_list/pipeline_list_route.js deleted file mode 100755 index eb593207572c2..0000000000000 --- a/x-pack/legacy/plugins/logstash/public/sections/pipeline_list/pipeline_list_route.js +++ /dev/null @@ -1,33 +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 routes from 'ui/routes'; -import { management } from 'ui/management'; -import template from './pipeline_list_route.html'; -import './components/pipeline_list'; -import 'plugins/logstash/services/license'; -import { getPipelineListBreadcrumbs } from '../breadcrumbs'; - -routes.when('/management/logstash/pipelines/', { - template, - k7Breadcrumbs: getPipelineListBreadcrumbs, -}); - -routes.defaults(/\/management/, { - resolve: { - logstashManagementSection: $injector => { - const licenseService = $injector.get('logstashLicenseService'); - const logstashSection = management.getSection('logstash/pipelines'); - - if (licenseService.enableLinks) { - logstashSection.show(); - logstashSection.enable(); - } else { - logstashSection.hide(); - } - }, - }, -}); diff --git a/x-pack/legacy/plugins/logstash/public/sections/pipeline_list/register_management_section.js b/x-pack/legacy/plugins/logstash/public/sections/pipeline_list/register_management_section.js deleted file mode 100755 index e285418f5f2ae..0000000000000 --- a/x-pack/legacy/plugins/logstash/public/sections/pipeline_list/register_management_section.js +++ /dev/null @@ -1,36 +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 { management } from 'ui/management'; -import { i18n } from '@kbn/i18n'; - -management.getSection('logstash').register('pipelines', { - display: i18n.translate('xpack.logstash.managementSection.pipelinesTitle', { - defaultMessage: 'Pipelines', - }), - order: 10, - url: '#/management/logstash/pipelines/', -}); - -management.getSection('logstash/pipelines').register('pipeline', { - visible: false, -}); - -management.getSection('logstash/pipelines/pipeline').register('edit', { - display: i18n.translate('xpack.logstash.managementSection.editPipelineTitle', { - defaultMessage: 'Edit pipeline', - }), - order: 1, - visible: false, -}); - -management.getSection('logstash/pipelines/pipeline').register('new', { - display: i18n.translate('xpack.logstash.managementSection.createPipelineTitle', { - defaultMessage: 'Create pipeline', - }), - order: 1, - visible: false, -}); diff --git a/x-pack/legacy/plugins/logstash/public/services/cluster/cluster_service.factory.js b/x-pack/legacy/plugins/logstash/public/services/cluster/cluster_service.factory.js deleted file mode 100755 index 0fee2804c704d..0000000000000 --- a/x-pack/legacy/plugins/logstash/public/services/cluster/cluster_service.factory.js +++ /dev/null @@ -1,13 +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 { uiModules } from 'ui/modules'; -import { ClusterService } from './cluster_service'; - -uiModules.get('xpack/logstash').factory('xpackLogstashClusterService', $injector => { - const $http = $injector.get('$http'); - return new ClusterService($http); -}); diff --git a/x-pack/legacy/plugins/logstash/public/services/cluster/index.js b/x-pack/legacy/plugins/logstash/public/services/cluster/index.js deleted file mode 100755 index ba52657a27ca8..0000000000000 --- a/x-pack/legacy/plugins/logstash/public/services/cluster/index.js +++ /dev/null @@ -1,7 +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 './cluster_service.factory'; diff --git a/x-pack/legacy/plugins/logstash/public/services/license/index.js b/x-pack/legacy/plugins/logstash/public/services/license/index.js deleted file mode 100755 index 8be8fb5ccbc64..0000000000000 --- a/x-pack/legacy/plugins/logstash/public/services/license/index.js +++ /dev/null @@ -1,7 +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 './license_service.factory'; diff --git a/x-pack/legacy/plugins/logstash/public/services/license/license_service.factory.js b/x-pack/legacy/plugins/logstash/public/services/license/license_service.factory.js deleted file mode 100755 index 0e131f9b94008..0000000000000 --- a/x-pack/legacy/plugins/logstash/public/services/license/license_service.factory.js +++ /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 { uiModules } from 'ui/modules'; -import { xpackInfo } from 'plugins/xpack_main/services/xpack_info'; -import 'ui/url'; -import { LogstashLicenseService } from './logstash_license_service'; - -uiModules.get('xpack/logstash').factory('logstashLicenseService', ($timeout, kbnUrl) => { - return new LogstashLicenseService(xpackInfo, kbnUrl, $timeout); -}); diff --git a/x-pack/legacy/plugins/logstash/public/services/license/logstash_license_service.js b/x-pack/legacy/plugins/logstash/public/services/license/logstash_license_service.js deleted file mode 100755 index 69cc8614a6ae2..0000000000000 --- a/x-pack/legacy/plugins/logstash/public/services/license/logstash_license_service.js +++ /dev/null @@ -1,62 +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 { toastNotifications } from 'ui/notify'; -import { MarkdownSimple } from '../../../../../../../src/plugins/kibana_react/public'; -import { PLUGIN } from '../../../../../../plugins/logstash/common/constants'; - -export class LogstashLicenseService { - constructor(xpackInfoService, kbnUrlService, $timeout) { - this.xpackInfoService = xpackInfoService; - this.kbnUrlService = kbnUrlService; - this.$timeout = $timeout; - } - - get enableLinks() { - return Boolean(this.xpackInfoService.get(`features.${PLUGIN.ID}.enableLinks`)); - } - - get isAvailable() { - return Boolean(this.xpackInfoService.get(`features.${PLUGIN.ID}.isAvailable`)); - } - - get isReadOnly() { - return Boolean(this.xpackInfoService.get(`features.${PLUGIN.ID}.isReadOnly`)); - } - - get message() { - return this.xpackInfoService.get(`features.${PLUGIN.ID}.message`); - } - - notifyAndRedirect() { - toastNotifications.addDanger({ - title: ( - - {this.xpackInfoService.get(`features.${PLUGIN.ID}.message`)} - - ), - }); - this.kbnUrlService.redirect('/management'); - } - - /** - * Checks if the license is valid or the license can perform downgraded UI tasks. - * Otherwise, notifies and redirects. - */ - checkValidity() { - return new Promise((resolve, reject) => { - this.$timeout(() => { - if (this.isAvailable) { - return resolve(); - } - - this.notifyAndRedirect(); - return reject(); - }, 10); // To allow latest XHR call to update license info - }); - } -} diff --git a/x-pack/legacy/plugins/logstash/public/services/monitoring/index.js b/x-pack/legacy/plugins/logstash/public/services/monitoring/index.js deleted file mode 100755 index 83b2105beb5ef..0000000000000 --- a/x-pack/legacy/plugins/logstash/public/services/monitoring/index.js +++ /dev/null @@ -1,7 +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 './monitoring_service.factory'; diff --git a/x-pack/legacy/plugins/logstash/public/services/monitoring/monitoring_service.factory.js b/x-pack/legacy/plugins/logstash/public/services/monitoring/monitoring_service.factory.js deleted file mode 100755 index 271c776dd6f69..0000000000000 --- a/x-pack/legacy/plugins/logstash/public/services/monitoring/monitoring_service.factory.js +++ /dev/null @@ -1,18 +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 { uiModules } from 'ui/modules'; -import { MonitoringService } from './monitoring_service'; -import '../cluster'; - -uiModules.get('xpack/logstash').factory('xpackLogstashMonitoringService', $injector => { - const $http = $injector.get('$http'); - const Promise = $injector.get('Promise'); - const monitoringUiEnabled = - $injector.has('monitoringUiEnabled') && $injector.get('monitoringUiEnabled'); - const clusterService = $injector.get('xpackLogstashClusterService'); - return new MonitoringService($http, Promise, monitoringUiEnabled, clusterService); -}); diff --git a/x-pack/legacy/plugins/logstash/public/services/pipeline/index.js b/x-pack/legacy/plugins/logstash/public/services/pipeline/index.js deleted file mode 100755 index 3b0e28bd555e6..0000000000000 --- a/x-pack/legacy/plugins/logstash/public/services/pipeline/index.js +++ /dev/null @@ -1,7 +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 './pipeline_service.factory'; diff --git a/x-pack/legacy/plugins/logstash/public/services/pipeline/pipeline_service.factory.js b/x-pack/legacy/plugins/logstash/public/services/pipeline/pipeline_service.factory.js deleted file mode 100755 index cf93915425213..0000000000000 --- a/x-pack/legacy/plugins/logstash/public/services/pipeline/pipeline_service.factory.js +++ /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 { uiModules } from 'ui/modules'; -import { PipelineService } from './pipeline_service'; - -uiModules.get('xpack/logstash').factory('pipelineService', $injector => { - const $http = $injector.get('$http'); - const pipelinesService = $injector.get('pipelinesService'); - return new PipelineService($http, pipelinesService); -}); diff --git a/x-pack/legacy/plugins/logstash/public/services/pipeline/pipeline_service.js b/x-pack/legacy/plugins/logstash/public/services/pipeline/pipeline_service.js deleted file mode 100755 index b5d0dbeb852d5..0000000000000 --- a/x-pack/legacy/plugins/logstash/public/services/pipeline/pipeline_service.js +++ /dev/null @@ -1,40 +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 chrome from 'ui/chrome'; -import { ROUTES } from '../../../../../../plugins/logstash/common/constants'; -import { Pipeline } from 'plugins/logstash/models/pipeline'; - -export class PipelineService { - constructor($http, pipelinesService) { - this.$http = $http; - this.pipelinesService = pipelinesService; - this.basePath = chrome.addBasePath(ROUTES.API_ROOT); - } - - loadPipeline(id) { - return this.$http.get(`${this.basePath}/pipeline/${id}`).then(response => { - return Pipeline.fromUpstreamJSON(response.data); - }); - } - - savePipeline(pipelineModel) { - return this.$http - .put(`${this.basePath}/pipeline/${pipelineModel.id}`, pipelineModel.upstreamJSON) - .catch(e => { - throw e.data.message; - }); - } - - deletePipeline(id) { - return this.$http - .delete(`${this.basePath}/pipeline/${id}`) - .then(() => this.pipelinesService.addToRecentlyDeleted(id)) - .catch(e => { - throw e.data.message; - }); - } -} diff --git a/x-pack/legacy/plugins/logstash/public/services/pipelines/index.js b/x-pack/legacy/plugins/logstash/public/services/pipelines/index.js deleted file mode 100755 index e273e12d46c6d..0000000000000 --- a/x-pack/legacy/plugins/logstash/public/services/pipelines/index.js +++ /dev/null @@ -1,7 +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 './pipelines_service.factory'; diff --git a/x-pack/legacy/plugins/logstash/public/services/pipelines/pipelines_service.factory.js b/x-pack/legacy/plugins/logstash/public/services/pipelines/pipelines_service.factory.js deleted file mode 100755 index 9295949e001eb..0000000000000 --- a/x-pack/legacy/plugins/logstash/public/services/pipelines/pipelines_service.factory.js +++ /dev/null @@ -1,17 +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 { uiModules } from 'ui/modules'; -import { PipelinesService } from './pipelines_service'; -import '../monitoring'; - -uiModules.get('xpack/logstash').factory('pipelinesService', $injector => { - const $http = $injector.get('$http'); - const $window = $injector.get('$window'); - const Promise = $injector.get('Promise'); - const monitoringService = $injector.get('xpackLogstashMonitoringService'); - return new PipelinesService($http, $window, Promise, monitoringService); -}); diff --git a/x-pack/legacy/plugins/logstash/public/services/pipelines/pipelines_service.js b/x-pack/legacy/plugins/logstash/public/services/pipelines/pipelines_service.js deleted file mode 100755 index d70c8be06fde4..0000000000000 --- a/x-pack/legacy/plugins/logstash/public/services/pipelines/pipelines_service.js +++ /dev/null @@ -1,135 +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 chrome from 'ui/chrome'; -import { ROUTES, MONITORING } from '../../../../../../plugins/logstash/common/constants'; -import { PipelineListItem } from 'plugins/logstash/models/pipeline_list_item'; - -const RECENTLY_DELETED_PIPELINE_IDS_STORAGE_KEY = 'xpack.logstash.recentlyDeletedPipelines'; - -export class PipelinesService { - constructor($http, $window, Promise, monitoringService) { - this.$http = $http; - this.$window = $window; - this.Promise = Promise; - this.monitoringService = monitoringService; - this.basePath = chrome.addBasePath(ROUTES.API_ROOT); - } - - getPipelineList() { - return this.Promise.all([ - this.getManagementPipelineList(), - this.getMonitoringPipelineList(), - ]).then(([managementPipelines, monitoringPipelines]) => { - const now = Date.now(); - - // Monitoring will report centrally-managed pipelines as well, including recently-deleted centrally-managed ones. - // If there's a recently-deleted pipeline we're keeping track of BUT monitoring doesn't report it, that means - // it's not running in Logstash any more. So we can stop tracking it as a recently-deleted pipeline. - const monitoringPipelineIds = monitoringPipelines.map(pipeline => pipeline.id); - this.getRecentlyDeleted().forEach(recentlyDeletedPipeline => { - // We don't want to stop tracking the recently-deleted pipeline until Monitoring has had some - // time to report on it. Otherwise, if we stop tracking first, *then* Monitoring reports it, we'll - // still end up showing it in the list until Monitoring stops reporting it. - if (now - recentlyDeletedPipeline.deletedOn < MONITORING.ACTIVE_PIPELINE_RANGE_S * 1000) { - return; - } - - // If Monitoring is still reporting the pipeline, don't stop tracking it yet - if (monitoringPipelineIds.includes(recentlyDeletedPipeline.id)) { - return; - } - - this.removeFromRecentlyDeleted(recentlyDeletedPipeline.id); - }); - - // Merge centrally-managed pipelines with pipelines reported by monitoring. Take care to dedupe - // while merging because monitoring will (rightly) report centrally-managed pipelines as well, - // including recently-deleted ones! - const managementPipelineIds = managementPipelines.map(pipeline => pipeline.id); - return managementPipelines.concat( - monitoringPipelines.filter( - monitoringPipeline => - !managementPipelineIds.includes(monitoringPipeline.id) && - !this.isRecentlyDeleted(monitoringPipeline.id) - ) - ); - }); - } - - getManagementPipelineList() { - return this.$http - .get(`${this.basePath}/pipelines`) - .then(response => - response.data.pipelines.map(pipeline => PipelineListItem.fromUpstreamJSON(pipeline)) - ); - } - - getMonitoringPipelineList() { - return this.monitoringService.getPipelineList(); - } - - /** - * Delete a collection of pipelines - * - * @param pipelineIds Array of pipeline IDs - * @return Promise { numSuccesses, numErrors } - */ - deletePipelines(pipelineIds) { - const body = { - pipelineIds, - }; - return this.$http.post(`${this.basePath}/pipelines/delete`, body).then(response => { - this.addToRecentlyDeleted(...pipelineIds); - return response.data.results; - }); - } - - addToRecentlyDeleted(...pipelineIds) { - const recentlyDeletedPipelines = this.getRecentlyDeleted(); - const recentlyDeletedPipelineIds = recentlyDeletedPipelines.map(pipeline => pipeline.id); - pipelineIds.forEach(pipelineId => { - if (!recentlyDeletedPipelineIds.includes(pipelineId)) { - recentlyDeletedPipelines.push({ - id: pipelineId, - deletedOn: Date.now(), - }); - } - }); - this.setRecentlyDeleted(recentlyDeletedPipelines); - } - - removeFromRecentlyDeleted(...pipelineIds) { - const recentlyDeletedPipelinesToKeep = this.getRecentlyDeleted().filter( - recentlyDeletedPipeline => !pipelineIds.includes(recentlyDeletedPipeline.id) - ); - this.setRecentlyDeleted(recentlyDeletedPipelinesToKeep); - } - - isRecentlyDeleted(pipelineId) { - return this.getRecentlyDeleted() - .map(pipeline => pipeline.id) - .includes(pipelineId); - } - - getRecentlyDeleted() { - const recentlyDeletedPipelines = this.$window.localStorage.getItem( - RECENTLY_DELETED_PIPELINE_IDS_STORAGE_KEY - ); - if (!recentlyDeletedPipelines) { - return []; - } - - return JSON.parse(recentlyDeletedPipelines); - } - - setRecentlyDeleted(recentlyDeletedPipelineIds) { - this.$window.localStorage.setItem( - RECENTLY_DELETED_PIPELINE_IDS_STORAGE_KEY, - JSON.stringify(recentlyDeletedPipelineIds) - ); - } -} diff --git a/x-pack/legacy/plugins/logstash/public/services/security/index.js b/x-pack/legacy/plugins/logstash/public/services/security/index.js deleted file mode 100755 index c9ff911723156..0000000000000 --- a/x-pack/legacy/plugins/logstash/public/services/security/index.js +++ /dev/null @@ -1,7 +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. - */ - -export { logstashSecurity } from './logstash_security'; diff --git a/x-pack/legacy/plugins/logstash/public/services/security/logstash_security.js b/x-pack/legacy/plugins/logstash/public/services/security/logstash_security.js deleted file mode 100755 index 0949038c9b6c7..0000000000000 --- a/x-pack/legacy/plugins/logstash/public/services/security/logstash_security.js +++ /dev/null @@ -1,13 +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 { xpackInfo } from 'plugins/xpack_main/services/xpack_info'; - -export const logstashSecurity = { - isSecurityEnabled() { - return Boolean(xpackInfo.get(`features.security`)); - }, -}; diff --git a/x-pack/legacy/plugins/logstash/public/services/upgrade/index.js b/x-pack/legacy/plugins/logstash/public/services/upgrade/index.js deleted file mode 100755 index 345d0d0ff68c6..0000000000000 --- a/x-pack/legacy/plugins/logstash/public/services/upgrade/index.js +++ /dev/null @@ -1,7 +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 './upgrade_service.factory'; diff --git a/x-pack/legacy/plugins/logstash/public/services/upgrade/upgrade_service.factory.js b/x-pack/legacy/plugins/logstash/public/services/upgrade/upgrade_service.factory.js deleted file mode 100755 index 925c6ae677bdf..0000000000000 --- a/x-pack/legacy/plugins/logstash/public/services/upgrade/upgrade_service.factory.js +++ /dev/null @@ -1,13 +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 { uiModules } from 'ui/modules'; -import { UpgradeService } from './upgrade_service'; - -uiModules.get('xpack/logstash').factory('upgradeService', $injector => { - const $http = $injector.get('$http'); - return new UpgradeService($http); -}); diff --git a/x-pack/legacy/plugins/logstash/public/services/upgrade/upgrade_service.js b/x-pack/legacy/plugins/logstash/public/services/upgrade/upgrade_service.js deleted file mode 100755 index 2019bdc1bf1aa..0000000000000 --- a/x-pack/legacy/plugins/logstash/public/services/upgrade/upgrade_service.js +++ /dev/null @@ -1,24 +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 chrome from 'ui/chrome'; -import { ROUTES } from '../../../../../../plugins/logstash/common/constants'; - -export class UpgradeService { - constructor($http) { - this.$http = $http; - this.basePath = chrome.addBasePath(ROUTES.API_ROOT); - } - - executeUpgrade() { - return this.$http - .post(`${this.basePath}/upgrade`) - .then(response => response.data.is_upgraded) - .catch(e => { - throw e.data.message; - }); - } -} diff --git a/x-pack/legacy/plugins/logstash/server/lib/check_license/__tests__/check_license.js b/x-pack/legacy/plugins/logstash/server/lib/check_license/__tests__/check_license.js deleted file mode 100755 index 5fcce0aaa1219..0000000000000 --- a/x-pack/legacy/plugins/logstash/server/lib/check_license/__tests__/check_license.js +++ /dev/null @@ -1,179 +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 expect from '@kbn/expect'; -import { set } from 'lodash'; -import { checkLicense } from '../check_license'; - -describe('check_license', function() { - let mockLicenseInfo; - beforeEach(() => (mockLicenseInfo = {})); - - describe('license information is undefined', () => { - beforeEach(() => (mockLicenseInfo = undefined)); - - it('should set isAvailable to false', () => { - expect(checkLicense(mockLicenseInfo).isAvailable).to.be(false); - }); - - it('should set enableLinks to false', () => { - expect(checkLicense(mockLicenseInfo).enableLinks).to.be(false); - }); - - it('should set isReadOnly to false', () => { - expect(checkLicense(mockLicenseInfo).isReadOnly).to.be(false); - }); - - it('should set a message', () => { - expect(checkLicense(mockLicenseInfo).message).to.not.be(undefined); - }); - }); - - describe('license information is not available', () => { - beforeEach(() => (mockLicenseInfo.isAvailable = () => false)); - - it('should set isAvailable to false', () => { - expect(checkLicense(mockLicenseInfo).isAvailable).to.be(false); - }); - - it('should set enableLinks to false', () => { - expect(checkLicense(mockLicenseInfo).enableLinks).to.be(false); - }); - - it('should set isReadOnly to false', () => { - expect(checkLicense(mockLicenseInfo).isReadOnly).to.be(false); - }); - - it('should set a message', () => { - expect(checkLicense(mockLicenseInfo).message).to.not.be(undefined); - }); - }); - - describe('license information is available', () => { - beforeEach(() => { - mockLicenseInfo.isAvailable = () => true; - set(mockLicenseInfo, 'license.getType', () => 'basic'); - }); - - describe('& license is > basic', () => { - beforeEach(() => { - set(mockLicenseInfo, 'license.isOneOf', () => true); - mockLicenseInfo.feature = () => ({ isEnabled: () => true }); // Security feature is enabled - }); - - describe('& license is active', () => { - beforeEach(() => set(mockLicenseInfo, 'license.isActive', () => true)); - - it('should set isAvailable to true', () => { - expect(checkLicense(mockLicenseInfo).isAvailable).to.be(true); - }); - - it('should set enableLinks to true', () => { - expect(checkLicense(mockLicenseInfo).enableLinks).to.be(true); - }); - - it('should set isReadOnly to false', () => { - expect(checkLicense(mockLicenseInfo).isReadOnly).to.be(false); - }); - - it('should not set a message', () => { - expect(checkLicense(mockLicenseInfo).message).to.be(undefined); - }); - }); - - describe('& license is expired', () => { - beforeEach(() => set(mockLicenseInfo, 'license.isActive', () => false)); - - it('should set isAvailable to true', () => { - expect(checkLicense(mockLicenseInfo).isAvailable).to.be(true); - }); - - it('should set enableLinks to true', () => { - expect(checkLicense(mockLicenseInfo).enableLinks).to.be(true); - }); - - it('should set isReadOnly to true', () => { - expect(checkLicense(mockLicenseInfo).isReadOnly).to.be(true); - }); - - it('should set a message', () => { - expect(checkLicense(mockLicenseInfo).message).to.not.be(undefined); - }); - }); - }); - - describe('& license is basic', () => { - beforeEach(() => { - set(mockLicenseInfo, 'license.isOneOf', () => false); - mockLicenseInfo.feature = () => ({ isEnabled: () => true }); // Security feature is enabled - }); - - describe('& license is active', () => { - beforeEach(() => set(mockLicenseInfo, 'license.isActive', () => true)); - - it('should set isAvailable to false', () => { - expect(checkLicense(mockLicenseInfo).isAvailable).to.be(false); - }); - - it('should set enableLinks to false', () => { - expect(checkLicense(mockLicenseInfo).enableLinks).to.be(false); - }); - - it('should set isReadOnly to false', () => { - expect(checkLicense(mockLicenseInfo).isReadOnly).to.be(false); - }); - - it('should set a message', () => { - expect(checkLicense(mockLicenseInfo).message).to.not.be(undefined); - }); - }); - - describe('& license is expired', () => { - beforeEach(() => set(mockLicenseInfo, 'license.isActive', () => false)); - - it('should set isAvailable to false', () => { - expect(checkLicense(mockLicenseInfo).isAvailable).to.be(false); - }); - - it('should set enableLinks to false', () => { - expect(checkLicense(mockLicenseInfo).enableLinks).to.be(false); - }); - - it('should set isReadOnly to false', () => { - expect(checkLicense(mockLicenseInfo).isReadOnly).to.be(false); - }); - - it('should set a message', () => { - expect(checkLicense(mockLicenseInfo).message).to.not.be(undefined); - }); - }); - }); - - describe('& security is disabled', () => { - beforeEach(() => { - mockLicenseInfo.feature = () => ({ isEnabled: () => false }); // Security feature is disabled - set(mockLicenseInfo, 'license.isOneOf', () => true); - set(mockLicenseInfo, 'license.isActive', () => true); - }); - - it('should set isAvailable to false', () => { - expect(checkLicense(mockLicenseInfo).isAvailable).to.be(false); - }); - - it('should set enableLinks to false', () => { - expect(checkLicense(mockLicenseInfo).enableLinks).to.be(false); - }); - - it('should set isReadOnly to false', () => { - expect(checkLicense(mockLicenseInfo).isReadOnly).to.be(false); - }); - - it('should set a message', () => { - expect(checkLicense(mockLicenseInfo).message).to.not.be(undefined); - }); - }); - }); -}); diff --git a/x-pack/legacy/plugins/logstash/server/lib/check_license/check_license.js b/x-pack/legacy/plugins/logstash/server/lib/check_license/check_license.js deleted file mode 100755 index 31136ae1c72a5..0000000000000 --- a/x-pack/legacy/plugins/logstash/server/lib/check_license/check_license.js +++ /dev/null @@ -1,86 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import { i18n } from '@kbn/i18n'; - -export function checkLicense(xpackLicenseInfo) { - // If, for some reason, we cannot get the license information - // from Elasticsearch, assume worst case and disable the Logstash pipeline UI - if (!xpackLicenseInfo || !xpackLicenseInfo.isAvailable()) { - return { - isAvailable: false, - enableLinks: false, - isReadOnly: false, - message: i18n.translate( - 'xpack.logstash.managementSection.notPossibleToManagePipelinesMessage', - { - defaultMessage: - 'You cannot manage Logstash pipelines because license information is not available at this time.', - } - ), - }; - } - - const VALID_LICENSE_MODES = ['trial', 'standard', 'gold', 'platinum', 'enterprise']; - - const isLicenseModeValid = xpackLicenseInfo.license.isOneOf(VALID_LICENSE_MODES); - const isLicenseActive = xpackLicenseInfo.license.isActive(); - const licenseType = xpackLicenseInfo.license.getType(); - const isSecurityEnabled = xpackLicenseInfo.feature('security').isEnabled(); - - // Security is not enabled in ES - if (!isSecurityEnabled) { - const message = i18n.translate('xpack.logstash.managementSection.enableSecurityDescription', { - defaultMessage: - 'Security must be enabled in order to use Logstash pipeline management features.' + - ' Please set xpack.security.enabled: true in your elasticsearch.yml.', - }); - return { - isAvailable: false, - enableLinks: false, - isReadOnly: false, - message, - }; - } - - // License is not valid - if (!isLicenseModeValid) { - return { - isAvailable: false, - enableLinks: false, - isReadOnly: false, - message: i18n.translate('xpack.logstash.managementSection.licenseDoesNotSupportDescription', { - defaultMessage: - 'Your {licenseType} license does not support Logstash pipeline management features. Please upgrade your license.', - values: { licenseType }, - }), - }; - } - - // License is valid but not active, we go into a read-only mode. - if (!isLicenseActive) { - return { - isAvailable: true, - enableLinks: true, - isReadOnly: true, - message: i18n.translate( - 'xpack.logstash.managementSection.pipelineCrudOperationsNotAllowedDescription', - { - defaultMessage: - 'You cannot edit, create, or delete your Logstash pipelines because your {licenseType} license has expired.', - values: { licenseType }, - } - ), - }; - } - - // License is valid and active - return { - isAvailable: true, - enableLinks: true, - isReadOnly: false, - }; -} diff --git a/x-pack/legacy/plugins/logstash/server/lib/check_license/index.js b/x-pack/legacy/plugins/logstash/server/lib/check_license/index.js deleted file mode 100755 index f2c070fd44b6e..0000000000000 --- a/x-pack/legacy/plugins/logstash/server/lib/check_license/index.js +++ /dev/null @@ -1,7 +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. - */ - -export { checkLicense } from './check_license'; diff --git a/x-pack/legacy/plugins/logstash/server/lib/register_license_checker/index.js b/x-pack/legacy/plugins/logstash/server/lib/register_license_checker/index.js deleted file mode 100755 index 7b0f97c38d129..0000000000000 --- a/x-pack/legacy/plugins/logstash/server/lib/register_license_checker/index.js +++ /dev/null @@ -1,7 +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. - */ - -export { registerLicenseChecker } from './register_license_checker'; diff --git a/x-pack/legacy/plugins/logstash/server/lib/register_license_checker/register_license_checker.js b/x-pack/legacy/plugins/logstash/server/lib/register_license_checker/register_license_checker.js deleted file mode 100755 index a0d06e77b410d..0000000000000 --- a/x-pack/legacy/plugins/logstash/server/lib/register_license_checker/register_license_checker.js +++ /dev/null @@ -1,21 +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 { mirrorPluginStatus } from '../../../../../server/lib/mirror_plugin_status'; -import { checkLicense } from '../check_license'; -import { PLUGIN } from '../../../../../../plugins/logstash/common/constants'; - -export function registerLicenseChecker(server) { - const xpackMainPlugin = server.plugins.xpack_main; - const logstashPlugin = server.plugins.logstash; - - mirrorPluginStatus(xpackMainPlugin, logstashPlugin); - xpackMainPlugin.status.once('green', () => { - // Register a function that is called whenever the xpack info changes, - // to re-compute the license check results for this plugin - xpackMainPlugin.info.feature(PLUGIN.ID).registerLicenseCheckResultsGenerator(checkLicense); - }); -} diff --git a/x-pack/plugins/logstash/kibana.json b/x-pack/plugins/logstash/kibana.json index bcc926535d3c2..97dbf58865a88 100644 --- a/x-pack/plugins/logstash/kibana.json +++ b/x-pack/plugins/logstash/kibana.json @@ -4,9 +4,13 @@ "kibanaVersion": "kibana", "configPath": ["xpack", "logstash"], "requiredPlugins": [ - "licensing" + "licensing", + "management" + ], + "optionalPlugins": [ + "home", + "security" ], - "optionalPlugins": ["security"], "server": true, - "ui": false + "ui": true } diff --git a/x-pack/legacy/plugins/logstash/public/sections/breadcrumbs.js b/x-pack/plugins/logstash/public/application/breadcrumbs.js similarity index 80% rename from x-pack/legacy/plugins/logstash/public/sections/breadcrumbs.js rename to x-pack/plugins/logstash/public/application/breadcrumbs.js index 3121a58ff6a74..322b9860b3785 100644 --- a/x-pack/legacy/plugins/logstash/public/sections/breadcrumbs.js +++ b/x-pack/plugins/logstash/public/application/breadcrumbs.js @@ -5,11 +5,9 @@ */ import { i18n } from '@kbn/i18n'; -import { MANAGEMENT_BREADCRUMB } from 'ui/management'; export function getPipelineListBreadcrumbs() { return [ - MANAGEMENT_BREADCRUMB, { text: i18n.translate('xpack.logstash.pipelines.listBreadcrumb', { defaultMessage: 'Pipelines', @@ -19,12 +17,11 @@ export function getPipelineListBreadcrumbs() { ]; } -export function getPipelineEditBreadcrumbs($route) { - const { pipeline } = $route.current.locals; +export function getPipelineEditBreadcrumbs(pipelineId) { return [ ...getPipelineListBreadcrumbs(), { - text: pipeline.id, + text: pipelineId, }, ]; } diff --git a/x-pack/legacy/plugins/logstash/public/components/pipeline_editor/__snapshots__/confirm_delete_pipeline_modal.test.js.snap b/x-pack/plugins/logstash/public/application/components/pipeline_editor/__snapshots__/confirm_delete_pipeline_modal.test.js.snap similarity index 100% rename from x-pack/legacy/plugins/logstash/public/components/pipeline_editor/__snapshots__/confirm_delete_pipeline_modal.test.js.snap rename to x-pack/plugins/logstash/public/application/components/pipeline_editor/__snapshots__/confirm_delete_pipeline_modal.test.js.snap diff --git a/x-pack/legacy/plugins/logstash/public/components/pipeline_editor/__snapshots__/flex_item_setting.test.js.snap b/x-pack/plugins/logstash/public/application/components/pipeline_editor/__snapshots__/flex_item_setting.test.js.snap similarity index 100% rename from x-pack/legacy/plugins/logstash/public/components/pipeline_editor/__snapshots__/flex_item_setting.test.js.snap rename to x-pack/plugins/logstash/public/application/components/pipeline_editor/__snapshots__/flex_item_setting.test.js.snap diff --git a/x-pack/legacy/plugins/logstash/public/components/pipeline_editor/__snapshots__/form_label_with_icon_tip.test.js.snap b/x-pack/plugins/logstash/public/application/components/pipeline_editor/__snapshots__/form_label_with_icon_tip.test.js.snap similarity index 100% rename from x-pack/legacy/plugins/logstash/public/components/pipeline_editor/__snapshots__/form_label_with_icon_tip.test.js.snap rename to x-pack/plugins/logstash/public/application/components/pipeline_editor/__snapshots__/form_label_with_icon_tip.test.js.snap diff --git a/x-pack/legacy/plugins/logstash/public/components/pipeline_editor/__snapshots__/pipeline_editor.test.js.snap b/x-pack/plugins/logstash/public/application/components/pipeline_editor/__snapshots__/pipeline_editor.test.js.snap similarity index 100% rename from x-pack/legacy/plugins/logstash/public/components/pipeline_editor/__snapshots__/pipeline_editor.test.js.snap rename to x-pack/plugins/logstash/public/application/components/pipeline_editor/__snapshots__/pipeline_editor.test.js.snap diff --git a/x-pack/legacy/plugins/logstash/public/components/pipeline_editor/confirm_delete_pipeline_modal.js b/x-pack/plugins/logstash/public/application/components/pipeline_editor/confirm_delete_pipeline_modal.js similarity index 100% rename from x-pack/legacy/plugins/logstash/public/components/pipeline_editor/confirm_delete_pipeline_modal.js rename to x-pack/plugins/logstash/public/application/components/pipeline_editor/confirm_delete_pipeline_modal.js diff --git a/x-pack/legacy/plugins/logstash/public/components/pipeline_editor/confirm_delete_pipeline_modal.test.js b/x-pack/plugins/logstash/public/application/components/pipeline_editor/confirm_delete_pipeline_modal.test.js similarity index 100% rename from x-pack/legacy/plugins/logstash/public/components/pipeline_editor/confirm_delete_pipeline_modal.test.js rename to x-pack/plugins/logstash/public/application/components/pipeline_editor/confirm_delete_pipeline_modal.test.js diff --git a/x-pack/legacy/plugins/logstash/public/components/pipeline_editor/constants.js b/x-pack/plugins/logstash/public/application/components/pipeline_editor/constants.js similarity index 100% rename from x-pack/legacy/plugins/logstash/public/components/pipeline_editor/constants.js rename to x-pack/plugins/logstash/public/application/components/pipeline_editor/constants.js diff --git a/x-pack/legacy/plugins/logstash/public/components/pipeline_editor/flex_item_setting.js b/x-pack/plugins/logstash/public/application/components/pipeline_editor/flex_item_setting.js similarity index 100% rename from x-pack/legacy/plugins/logstash/public/components/pipeline_editor/flex_item_setting.js rename to x-pack/plugins/logstash/public/application/components/pipeline_editor/flex_item_setting.js diff --git a/x-pack/legacy/plugins/logstash/public/components/pipeline_editor/flex_item_setting.test.js b/x-pack/plugins/logstash/public/application/components/pipeline_editor/flex_item_setting.test.js similarity index 100% rename from x-pack/legacy/plugins/logstash/public/components/pipeline_editor/flex_item_setting.test.js rename to x-pack/plugins/logstash/public/application/components/pipeline_editor/flex_item_setting.test.js diff --git a/x-pack/legacy/plugins/logstash/public/components/pipeline_editor/form_label_with_icon_tip.js b/x-pack/plugins/logstash/public/application/components/pipeline_editor/form_label_with_icon_tip.js similarity index 100% rename from x-pack/legacy/plugins/logstash/public/components/pipeline_editor/form_label_with_icon_tip.js rename to x-pack/plugins/logstash/public/application/components/pipeline_editor/form_label_with_icon_tip.js diff --git a/x-pack/legacy/plugins/logstash/public/components/pipeline_editor/form_label_with_icon_tip.test.js b/x-pack/plugins/logstash/public/application/components/pipeline_editor/form_label_with_icon_tip.test.js similarity index 100% rename from x-pack/legacy/plugins/logstash/public/components/pipeline_editor/form_label_with_icon_tip.test.js rename to x-pack/plugins/logstash/public/application/components/pipeline_editor/form_label_with_icon_tip.test.js diff --git a/x-pack/legacy/plugins/logstash/public/components/pipeline_editor/index.js b/x-pack/plugins/logstash/public/application/components/pipeline_editor/index.js similarity index 100% rename from x-pack/legacy/plugins/logstash/public/components/pipeline_editor/index.js rename to x-pack/plugins/logstash/public/application/components/pipeline_editor/index.js diff --git a/x-pack/legacy/plugins/logstash/public/components/pipeline_editor/pipeline_editor.js b/x-pack/plugins/logstash/public/application/components/pipeline_editor/pipeline_editor.js similarity index 97% rename from x-pack/legacy/plugins/logstash/public/components/pipeline_editor/pipeline_editor.js rename to x-pack/plugins/logstash/public/application/components/pipeline_editor/pipeline_editor.js index 5e430ccbd8ceb..e45820d56cc03 100644 --- a/x-pack/legacy/plugins/logstash/public/components/pipeline_editor/pipeline_editor.js +++ b/x-pack/plugins/logstash/public/application/components/pipeline_editor/pipeline_editor.js @@ -13,7 +13,7 @@ import 'brace/mode/plain_text'; import 'brace/theme/github'; import { isEmpty } from 'lodash'; -import { TOOLTIPS } from '../../../../../../plugins/logstash/common/constants/tooltips'; +import { TOOLTIPS } from '../../../../common/constants/tooltips'; import { EuiButton, EuiButtonEmpty, @@ -40,7 +40,6 @@ class PipelineEditorUi extends React.Component { const { pipeline: { id, description, pipeline, settings }, - username, } = this.props; const pipelineWorkersSet = typeof settings['pipeline.workers'] === 'number'; @@ -60,7 +59,6 @@ class PipelineEditorUi extends React.Component { 'queue.max_bytes': settings['queue.max_bytes.number'] + settings['queue.max_bytes.units'], 'queue.type': settings['queue.type'], }, - username, }, pipelineIdErrors: [], pipelineIdPattern: /^[A-Za-z\_][A-Za-z0-9\-\_]*$/, @@ -236,15 +234,7 @@ class PipelineEditorUi extends React.Component { }; getPipelineHeadingText = () => { - const { - routeService: { - current: { - params: { clone, id }, - }, - }, - isNewPipeline, - intl, - } = this.props; + const { clone, id, isNewPipeline, intl } = this.props; if (!!clone && id) { return intl.formatMessage( @@ -502,6 +492,8 @@ class PipelineEditorUi extends React.Component { } PipelineEditorUi.propTypes = { + id: PropTypes.string, + clone: PropTypes.bool.isRequired, close: PropTypes.func.isRequired, isNewPipeline: PropTypes.bool.isRequired, licenseService: PropTypes.shape({ @@ -527,20 +519,11 @@ PipelineEditorUi.propTypes = { deletePipeline: PropTypes.func.isRequired, savePipeline: PropTypes.func.isRequired, }).isRequired, - routeService: PropTypes.shape({ - current: PropTypes.shape({ - params: PropTypes.shape({ - clone: PropTypes.oneOf([true, undefined]), - id: PropTypes.string, - }), - }), - }).isRequired, toastNotifications: PropTypes.shape({ addWarning: PropTypes.func.isRequired, addSuccess: PropTypes.func.isRequired, addError: PropTypes.func.isRequired, }).isRequired, - username: PropTypes.string, }; export const PipelineEditor = injectI18n(PipelineEditorUi); diff --git a/x-pack/legacy/plugins/logstash/public/components/pipeline_editor/pipeline_editor.test.js b/x-pack/plugins/logstash/public/application/components/pipeline_editor/pipeline_editor.test.js similarity index 96% rename from x-pack/legacy/plugins/logstash/public/components/pipeline_editor/pipeline_editor.test.js rename to x-pack/plugins/logstash/public/application/components/pipeline_editor/pipeline_editor.test.js index 2d7ed5f257fbd..bb5961ce36120 100644 --- a/x-pack/legacy/plugins/logstash/public/components/pipeline_editor/pipeline_editor.test.js +++ b/x-pack/plugins/logstash/public/application/components/pipeline_editor/pipeline_editor.test.js @@ -17,7 +17,6 @@ describe('PipelineEditor component', () => { let open; let pipeline; let pipelineService; - let routeService; let toastNotifications; let username; @@ -47,14 +46,6 @@ describe('PipelineEditor component', () => { deletePipeline: jest.fn(), savePipeline: jest.fn(), }; - routeService = { - current: { - params: { - clone: undefined, - id: undefined, - }, - }, - }; toastNotifications = { addWarning: jest.fn(), addSuccess: jest.fn(), @@ -62,13 +53,14 @@ describe('PipelineEditor component', () => { }; username = 'elastic'; props = { + clone: false, + id: 'pipelineId', close, isNewPipeline, licenseService, open, pipeline, pipelineService, - routeService, toastNotifications, username, }; @@ -79,10 +71,8 @@ describe('PipelineEditor component', () => { }); it('matches snapshot for clone pipeline', () => { - routeService.current.params = { - clone: true, - id: 'pipelineToClone', - }; + props.clone = true; + props.id = 'pipelineToClone'; expect(shallowWithIntl()).toMatchSnapshot(); }); diff --git a/x-pack/legacy/plugins/logstash/public/components/pipeline_list/__snapshots__/add_role_alert.test.js.snap b/x-pack/plugins/logstash/public/application/components/pipeline_list/__snapshots__/add_role_alert.test.js.snap similarity index 100% rename from x-pack/legacy/plugins/logstash/public/components/pipeline_list/__snapshots__/add_role_alert.test.js.snap rename to x-pack/plugins/logstash/public/application/components/pipeline_list/__snapshots__/add_role_alert.test.js.snap diff --git a/x-pack/legacy/plugins/logstash/public/components/pipeline_list/__snapshots__/alert_call_out.test.js.snap b/x-pack/plugins/logstash/public/application/components/pipeline_list/__snapshots__/alert_call_out.test.js.snap similarity index 100% rename from x-pack/legacy/plugins/logstash/public/components/pipeline_list/__snapshots__/alert_call_out.test.js.snap rename to x-pack/plugins/logstash/public/application/components/pipeline_list/__snapshots__/alert_call_out.test.js.snap diff --git a/x-pack/legacy/plugins/logstash/public/components/pipeline_list/__snapshots__/confirm_delete_modal.test.js.snap b/x-pack/plugins/logstash/public/application/components/pipeline_list/__snapshots__/confirm_delete_modal.test.js.snap similarity index 100% rename from x-pack/legacy/plugins/logstash/public/components/pipeline_list/__snapshots__/confirm_delete_modal.test.js.snap rename to x-pack/plugins/logstash/public/application/components/pipeline_list/__snapshots__/confirm_delete_modal.test.js.snap diff --git a/x-pack/legacy/plugins/logstash/public/components/pipeline_list/__snapshots__/enable_monitoring_alert.test.js.snap b/x-pack/plugins/logstash/public/application/components/pipeline_list/__snapshots__/enable_monitoring_alert.test.js.snap similarity index 100% rename from x-pack/legacy/plugins/logstash/public/components/pipeline_list/__snapshots__/enable_monitoring_alert.test.js.snap rename to x-pack/plugins/logstash/public/application/components/pipeline_list/__snapshots__/enable_monitoring_alert.test.js.snap diff --git a/x-pack/legacy/plugins/logstash/public/components/pipeline_list/__snapshots__/info_alerts.test.js.snap b/x-pack/plugins/logstash/public/application/components/pipeline_list/__snapshots__/info_alerts.test.js.snap similarity index 100% rename from x-pack/legacy/plugins/logstash/public/components/pipeline_list/__snapshots__/info_alerts.test.js.snap rename to x-pack/plugins/logstash/public/application/components/pipeline_list/__snapshots__/info_alerts.test.js.snap diff --git a/x-pack/legacy/plugins/logstash/public/components/pipeline_list/__snapshots__/pipelines_table.test.js.snap b/x-pack/plugins/logstash/public/application/components/pipeline_list/__snapshots__/pipelines_table.test.js.snap similarity index 100% rename from x-pack/legacy/plugins/logstash/public/components/pipeline_list/__snapshots__/pipelines_table.test.js.snap rename to x-pack/plugins/logstash/public/application/components/pipeline_list/__snapshots__/pipelines_table.test.js.snap diff --git a/x-pack/legacy/plugins/logstash/public/components/pipeline_list/add_role_alert.js b/x-pack/plugins/logstash/public/application/components/pipeline_list/add_role_alert.js similarity index 100% rename from x-pack/legacy/plugins/logstash/public/components/pipeline_list/add_role_alert.js rename to x-pack/plugins/logstash/public/application/components/pipeline_list/add_role_alert.js diff --git a/x-pack/legacy/plugins/logstash/public/components/pipeline_list/add_role_alert.test.js b/x-pack/plugins/logstash/public/application/components/pipeline_list/add_role_alert.test.js similarity index 100% rename from x-pack/legacy/plugins/logstash/public/components/pipeline_list/add_role_alert.test.js rename to x-pack/plugins/logstash/public/application/components/pipeline_list/add_role_alert.test.js diff --git a/x-pack/legacy/plugins/logstash/public/components/pipeline_list/alert_call_out.js b/x-pack/plugins/logstash/public/application/components/pipeline_list/alert_call_out.js similarity index 100% rename from x-pack/legacy/plugins/logstash/public/components/pipeline_list/alert_call_out.js rename to x-pack/plugins/logstash/public/application/components/pipeline_list/alert_call_out.js diff --git a/x-pack/legacy/plugins/logstash/public/components/pipeline_list/alert_call_out.test.js b/x-pack/plugins/logstash/public/application/components/pipeline_list/alert_call_out.test.js similarity index 100% rename from x-pack/legacy/plugins/logstash/public/components/pipeline_list/alert_call_out.test.js rename to x-pack/plugins/logstash/public/application/components/pipeline_list/alert_call_out.test.js diff --git a/x-pack/legacy/plugins/logstash/public/components/pipeline_list/confirm_delete_modal.js b/x-pack/plugins/logstash/public/application/components/pipeline_list/confirm_delete_modal.js similarity index 100% rename from x-pack/legacy/plugins/logstash/public/components/pipeline_list/confirm_delete_modal.js rename to x-pack/plugins/logstash/public/application/components/pipeline_list/confirm_delete_modal.js diff --git a/x-pack/legacy/plugins/logstash/public/components/pipeline_list/confirm_delete_modal.test.js b/x-pack/plugins/logstash/public/application/components/pipeline_list/confirm_delete_modal.test.js similarity index 100% rename from x-pack/legacy/plugins/logstash/public/components/pipeline_list/confirm_delete_modal.test.js rename to x-pack/plugins/logstash/public/application/components/pipeline_list/confirm_delete_modal.test.js diff --git a/x-pack/legacy/plugins/logstash/public/components/pipeline_list/constants.js b/x-pack/plugins/logstash/public/application/components/pipeline_list/constants.js similarity index 100% rename from x-pack/legacy/plugins/logstash/public/components/pipeline_list/constants.js rename to x-pack/plugins/logstash/public/application/components/pipeline_list/constants.js diff --git a/x-pack/legacy/plugins/logstash/public/components/pipeline_list/enable_monitoring_alert.js b/x-pack/plugins/logstash/public/application/components/pipeline_list/enable_monitoring_alert.js similarity index 100% rename from x-pack/legacy/plugins/logstash/public/components/pipeline_list/enable_monitoring_alert.js rename to x-pack/plugins/logstash/public/application/components/pipeline_list/enable_monitoring_alert.js diff --git a/x-pack/legacy/plugins/logstash/public/components/pipeline_list/enable_monitoring_alert.test.js b/x-pack/plugins/logstash/public/application/components/pipeline_list/enable_monitoring_alert.test.js similarity index 100% rename from x-pack/legacy/plugins/logstash/public/components/pipeline_list/enable_monitoring_alert.test.js rename to x-pack/plugins/logstash/public/application/components/pipeline_list/enable_monitoring_alert.test.js diff --git a/x-pack/legacy/plugins/logstash/public/components/pipeline_list/index.js b/x-pack/plugins/logstash/public/application/components/pipeline_list/index.js similarity index 100% rename from x-pack/legacy/plugins/logstash/public/components/pipeline_list/index.js rename to x-pack/plugins/logstash/public/application/components/pipeline_list/index.js diff --git a/x-pack/legacy/plugins/logstash/public/components/pipeline_list/info_alerts.js b/x-pack/plugins/logstash/public/application/components/pipeline_list/info_alerts.js similarity index 100% rename from x-pack/legacy/plugins/logstash/public/components/pipeline_list/info_alerts.js rename to x-pack/plugins/logstash/public/application/components/pipeline_list/info_alerts.js diff --git a/x-pack/legacy/plugins/logstash/public/components/pipeline_list/info_alerts.test.js b/x-pack/plugins/logstash/public/application/components/pipeline_list/info_alerts.test.js similarity index 100% rename from x-pack/legacy/plugins/logstash/public/components/pipeline_list/info_alerts.test.js rename to x-pack/plugins/logstash/public/application/components/pipeline_list/info_alerts.test.js diff --git a/x-pack/legacy/plugins/logstash/public/components/pipeline_list/pipeline_list.js b/x-pack/plugins/logstash/public/application/components/pipeline_list/pipeline_list.js similarity index 100% rename from x-pack/legacy/plugins/logstash/public/components/pipeline_list/pipeline_list.js rename to x-pack/plugins/logstash/public/application/components/pipeline_list/pipeline_list.js diff --git a/x-pack/legacy/plugins/logstash/public/components/pipeline_list/pipeline_list.test.js b/x-pack/plugins/logstash/public/application/components/pipeline_list/pipeline_list.test.js similarity index 100% rename from x-pack/legacy/plugins/logstash/public/components/pipeline_list/pipeline_list.test.js rename to x-pack/plugins/logstash/public/application/components/pipeline_list/pipeline_list.test.js diff --git a/x-pack/legacy/plugins/logstash/public/components/pipeline_list/pipelines_table.js b/x-pack/plugins/logstash/public/application/components/pipeline_list/pipelines_table.js similarity index 100% rename from x-pack/legacy/plugins/logstash/public/components/pipeline_list/pipelines_table.js rename to x-pack/plugins/logstash/public/application/components/pipeline_list/pipelines_table.js diff --git a/x-pack/legacy/plugins/logstash/public/components/pipeline_list/pipelines_table.test.js b/x-pack/plugins/logstash/public/application/components/pipeline_list/pipelines_table.test.js similarity index 100% rename from x-pack/legacy/plugins/logstash/public/components/pipeline_list/pipelines_table.test.js rename to x-pack/plugins/logstash/public/application/components/pipeline_list/pipelines_table.test.js diff --git a/x-pack/legacy/plugins/logstash/public/components/upgrade_failure/__snapshots__/upgrade_failure.test.js.snap b/x-pack/plugins/logstash/public/application/components/upgrade_failure/__snapshots__/upgrade_failure.test.js.snap similarity index 100% rename from x-pack/legacy/plugins/logstash/public/components/upgrade_failure/__snapshots__/upgrade_failure.test.js.snap rename to x-pack/plugins/logstash/public/application/components/upgrade_failure/__snapshots__/upgrade_failure.test.js.snap diff --git a/x-pack/legacy/plugins/logstash/public/components/upgrade_failure/__snapshots__/upgrade_failure_actions.test.js.snap b/x-pack/plugins/logstash/public/application/components/upgrade_failure/__snapshots__/upgrade_failure_actions.test.js.snap similarity index 100% rename from x-pack/legacy/plugins/logstash/public/components/upgrade_failure/__snapshots__/upgrade_failure_actions.test.js.snap rename to x-pack/plugins/logstash/public/application/components/upgrade_failure/__snapshots__/upgrade_failure_actions.test.js.snap diff --git a/x-pack/legacy/plugins/logstash/public/components/upgrade_failure/__snapshots__/upgrade_failure_title.test.js.snap b/x-pack/plugins/logstash/public/application/components/upgrade_failure/__snapshots__/upgrade_failure_title.test.js.snap similarity index 100% rename from x-pack/legacy/plugins/logstash/public/components/upgrade_failure/__snapshots__/upgrade_failure_title.test.js.snap rename to x-pack/plugins/logstash/public/application/components/upgrade_failure/__snapshots__/upgrade_failure_title.test.js.snap diff --git a/x-pack/legacy/plugins/logstash/public/components/upgrade_failure/constants.js b/x-pack/plugins/logstash/public/application/components/upgrade_failure/constants.js similarity index 100% rename from x-pack/legacy/plugins/logstash/public/components/upgrade_failure/constants.js rename to x-pack/plugins/logstash/public/application/components/upgrade_failure/constants.js diff --git a/x-pack/legacy/plugins/logstash/public/components/upgrade_failure/index.js b/x-pack/plugins/logstash/public/application/components/upgrade_failure/index.js similarity index 100% rename from x-pack/legacy/plugins/logstash/public/components/upgrade_failure/index.js rename to x-pack/plugins/logstash/public/application/components/upgrade_failure/index.js diff --git a/x-pack/legacy/plugins/logstash/public/components/upgrade_failure/upgrade_failure.js b/x-pack/plugins/logstash/public/application/components/upgrade_failure/upgrade_failure.js similarity index 100% rename from x-pack/legacy/plugins/logstash/public/components/upgrade_failure/upgrade_failure.js rename to x-pack/plugins/logstash/public/application/components/upgrade_failure/upgrade_failure.js diff --git a/x-pack/legacy/plugins/logstash/public/components/upgrade_failure/upgrade_failure.test.js b/x-pack/plugins/logstash/public/application/components/upgrade_failure/upgrade_failure.test.js similarity index 100% rename from x-pack/legacy/plugins/logstash/public/components/upgrade_failure/upgrade_failure.test.js rename to x-pack/plugins/logstash/public/application/components/upgrade_failure/upgrade_failure.test.js diff --git a/x-pack/legacy/plugins/logstash/public/components/upgrade_failure/upgrade_failure_actions.js b/x-pack/plugins/logstash/public/application/components/upgrade_failure/upgrade_failure_actions.js similarity index 100% rename from x-pack/legacy/plugins/logstash/public/components/upgrade_failure/upgrade_failure_actions.js rename to x-pack/plugins/logstash/public/application/components/upgrade_failure/upgrade_failure_actions.js diff --git a/x-pack/legacy/plugins/logstash/public/components/upgrade_failure/upgrade_failure_actions.test.js b/x-pack/plugins/logstash/public/application/components/upgrade_failure/upgrade_failure_actions.test.js similarity index 100% rename from x-pack/legacy/plugins/logstash/public/components/upgrade_failure/upgrade_failure_actions.test.js rename to x-pack/plugins/logstash/public/application/components/upgrade_failure/upgrade_failure_actions.test.js diff --git a/x-pack/legacy/plugins/logstash/public/components/upgrade_failure/upgrade_failure_title.js b/x-pack/plugins/logstash/public/application/components/upgrade_failure/upgrade_failure_title.js similarity index 100% rename from x-pack/legacy/plugins/logstash/public/components/upgrade_failure/upgrade_failure_title.js rename to x-pack/plugins/logstash/public/application/components/upgrade_failure/upgrade_failure_title.js diff --git a/x-pack/legacy/plugins/logstash/public/components/upgrade_failure/upgrade_failure_title.test.js b/x-pack/plugins/logstash/public/application/components/upgrade_failure/upgrade_failure_title.test.js similarity index 100% rename from x-pack/legacy/plugins/logstash/public/components/upgrade_failure/upgrade_failure_title.test.js rename to x-pack/plugins/logstash/public/application/components/upgrade_failure/upgrade_failure_title.test.js diff --git a/x-pack/plugins/logstash/public/application/index.tsx b/x-pack/plugins/logstash/public/application/index.tsx new file mode 100644 index 0000000000000..438038d6c885e --- /dev/null +++ b/x-pack/plugins/logstash/public/application/index.tsx @@ -0,0 +1,117 @@ +/* + * 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 ReactDOM from 'react-dom'; +import { HashRouter, Route, Switch, Redirect } from 'react-router-dom'; +import { Observable } from 'rxjs'; +import { first } from 'rxjs/operators'; + +import { CoreStart } from 'src/core/public'; +import { ManagementAppMountParams } from '../../../../../src/plugins/management/public'; +import { + ClusterService, + MonitoringService, + PipelineService, + PipelinesService, + UpgradeService, + // @ts-ignore +} from '../services'; +// @ts-ignore +import { PipelineList } from './components/pipeline_list'; +import { PipelineEditView } from './pipeline_edit_view'; +// @ts-ignore +import { Pipeline } from '../models/pipeline'; +// @ts-ignore +import * as Breadcrumbs from './breadcrumbs'; + +export const renderApp = async ( + core: CoreStart, + { basePath, element, setBreadcrumbs }: ManagementAppMountParams, + licenseService$: Observable +) => { + const logstashLicenseService = await licenseService$.pipe(first()).toPromise(); + const clusterService = new ClusterService(core.http); + const monitoringService = new MonitoringService( + core.http, + // When monitoring is migrated this should be fetched from monitoring's plugin contract + core.injectedMetadata.getInjectedVar('monitoringUiEnabled'), + clusterService + ); + const pipelinesService = new PipelinesService(core.http, monitoringService); + const pipelineService = new PipelineService(core.http, pipelinesService); + const upgradeService = new UpgradeService(core.http); + + ReactDOM.render( + + + + { + setBreadcrumbs(Breadcrumbs.getPipelineListBreadcrumbs()); + return ( + history.push(`/pipeline/${id}/edit`)} + clonePipeline={(id: string) => history.push(`/pipeline/${id}/edit?clone`)} + createPipeline={() => history.push(`/pipeline/new-pipeline`)} + pipelinesService={pipelinesService} + toastNotifications={core.notifications.toasts} + /> + ); + }} + /> + ( + + )} + /> + } + /> + ( + + )} + /> + + + , + element + ); + + return () => { + ReactDOM.unmountComponentAtNode(element); + }; +}; diff --git a/x-pack/plugins/logstash/public/application/pipeline_edit_view.tsx b/x-pack/plugins/logstash/public/application/pipeline_edit_view.tsx new file mode 100644 index 0000000000000..c1b465febcd9b --- /dev/null +++ b/x-pack/plugins/logstash/public/application/pipeline_edit_view.tsx @@ -0,0 +1,153 @@ +/* + * 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, useLayoutEffect, useCallback } from 'react'; +import { usePromise } from 'react-use'; +import { History } from 'history'; + +import { i18n } from '@kbn/i18n'; +import { ToastsStart } from 'src/core/public'; + +// @ts-ignore +import { UpgradeFailure } from './components/upgrade_failure'; +// @ts-ignore +import { PipelineEditor } from './components/pipeline_editor'; +// @ts-ignore +import { Pipeline } from '../models/pipeline'; +import { ManagementAppMountParams } from '../../../../../src/plugins/management/public'; +// @ts-ignore +import * as Breadcrumbs from './breadcrumbs'; + +const usePipeline = ( + pipelineService: any, + logstashLicenseService: any, + toasts: ToastsStart, + shouldClone: boolean, + id?: string +) => { + const mounted = usePromise(); + const [pipeline, setPipeline] = useState(null); + + useLayoutEffect(() => { + (async () => { + if (!id) { + return setPipeline(new Pipeline()); + } + + try { + const result = await mounted(pipelineService.loadPipeline(id) as Promise); + setPipeline(shouldClone ? result.clone : result); + } catch (e) { + await logstashLicenseService.checkValidity(); + if (e.status !== 403) { + toasts.addDanger( + i18n.translate('xpack.logstash.couldNotLoadPipelineErrorNotification', { + defaultMessage: `Couldn't load pipeline. Error: '{errStatusText}'.`, + values: { + errStatusText: e.statusText, + }, + }) + ); + } + } + })(); + }, [pipelineService, id, mounted, shouldClone, logstashLicenseService, toasts]); + + return pipeline; +}; + +const useIsUpgraded = (upgradeService: any) => { + const [isUpgraded, setIsUpgraded] = useState(null); + const mounted = usePromise(); + + useLayoutEffect(() => { + mounted(upgradeService.executeUpgrade() as Promise).then(result => + setIsUpgraded(result) + ); + }, [mounted, upgradeService]); + + return isUpgraded; +}; + +interface EditProps { + pipelineService: any; + logstashLicenseService: any; + upgradeService: any; + toasts: ToastsStart; + history: History; + setBreadcrumbs: ManagementAppMountParams['setBreadcrumbs']; + + // URL params + id?: string; +} + +export const PipelineEditView: React.FC = ({ + pipelineService, + logstashLicenseService, + upgradeService, + toasts, + history, + setBreadcrumbs, + id, +}) => { + const params = new URLSearchParams(history.location.search); + const shouldRetry = params.get('retry') === 'true'; + const shouldClone = params.get('clone') === ''; + + const pipeline = usePipeline(pipelineService, logstashLicenseService, toasts, shouldClone, id); + const isUpgraded = useIsUpgraded(upgradeService); + + const onRetry = useCallback(() => { + const newParams = new URLSearchParams(history.location.search); + newParams.set('retry', 'true'); + history.replace({ search: newParams.toString() }); + }, [history]); + const close = useCallback(() => { + history.push('/'); + }, [history]); + const open = useCallback( + (newId: string) => { + history.push(`/pipeline/${newId}/edit`); + }, + [history] + ); + + if (!pipeline || isUpgraded === null) { + return null; + } + + const isNewPipeline = !pipeline.id; + setBreadcrumbs( + isNewPipeline + ? Breadcrumbs.getPipelineCreateBreadcrumbs() + : Breadcrumbs.getPipelineEditBreadcrumbs(pipeline.id) + ); + + if (!isUpgraded) { + return ( + + ); + } + + return ( + + ); +}; diff --git a/x-pack/plugins/logstash/public/index.ts b/x-pack/plugins/logstash/public/index.ts new file mode 100644 index 0000000000000..26a1ca4e8c6c4 --- /dev/null +++ b/x-pack/plugins/logstash/public/index.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. + */ + +import { LogstashPlugin } from './plugin'; + +export const plugin = () => new LogstashPlugin(); diff --git a/x-pack/legacy/plugins/logstash/public/lib/get_search_value/get_search_value.js b/x-pack/plugins/logstash/public/lib/get_search_value/get_search_value.js similarity index 100% rename from x-pack/legacy/plugins/logstash/public/lib/get_search_value/get_search_value.js rename to x-pack/plugins/logstash/public/lib/get_search_value/get_search_value.js diff --git a/x-pack/legacy/plugins/logstash/public/lib/get_search_value/index.js b/x-pack/plugins/logstash/public/lib/get_search_value/index.js similarity index 100% rename from x-pack/legacy/plugins/logstash/public/lib/get_search_value/index.js rename to x-pack/plugins/logstash/public/lib/get_search_value/index.js diff --git a/x-pack/legacy/plugins/logstash/public/models/cluster/cluster.js b/x-pack/plugins/logstash/public/models/cluster/cluster.js similarity index 100% rename from x-pack/legacy/plugins/logstash/public/models/cluster/cluster.js rename to x-pack/plugins/logstash/public/models/cluster/cluster.js diff --git a/x-pack/legacy/plugins/logstash/public/models/cluster/index.js b/x-pack/plugins/logstash/public/models/cluster/index.js similarity index 100% rename from x-pack/legacy/plugins/logstash/public/models/cluster/index.js rename to x-pack/plugins/logstash/public/models/cluster/index.js diff --git a/x-pack/legacy/plugins/logstash/public/models/pipeline/index.js b/x-pack/plugins/logstash/public/models/pipeline/index.js similarity index 100% rename from x-pack/legacy/plugins/logstash/public/models/pipeline/index.js rename to x-pack/plugins/logstash/public/models/pipeline/index.js diff --git a/x-pack/legacy/plugins/logstash/public/models/pipeline/pipeline.js b/x-pack/plugins/logstash/public/models/pipeline/pipeline.js similarity index 100% rename from x-pack/legacy/plugins/logstash/public/models/pipeline/pipeline.js rename to x-pack/plugins/logstash/public/models/pipeline/pipeline.js diff --git a/x-pack/legacy/plugins/logstash/public/models/pipeline_list_item/index.js b/x-pack/plugins/logstash/public/models/pipeline_list_item/index.js similarity index 100% rename from x-pack/legacy/plugins/logstash/public/models/pipeline_list_item/index.js rename to x-pack/plugins/logstash/public/models/pipeline_list_item/index.js diff --git a/x-pack/legacy/plugins/logstash/public/models/pipeline_list_item/pipeline_list_item.js b/x-pack/plugins/logstash/public/models/pipeline_list_item/pipeline_list_item.js similarity index 83% rename from x-pack/legacy/plugins/logstash/public/models/pipeline_list_item/pipeline_list_item.js rename to x-pack/plugins/logstash/public/models/pipeline_list_item/pipeline_list_item.js index 06d01a05bac27..3a304e467e0c0 100755 --- a/x-pack/legacy/plugins/logstash/public/models/pipeline_list_item/pipeline_list_item.js +++ b/x-pack/plugins/logstash/public/models/pipeline_list_item/pipeline_list_item.js @@ -5,10 +5,10 @@ */ import { pick, capitalize } from 'lodash'; +import moment from 'moment'; -import { getSearchValue } from 'plugins/logstash/lib/get_search_value'; -import { getMoment } from 'plugins/logstash/../common/lib/get_moment'; -import { PIPELINE } from '../../../../../../plugins/logstash/common/constants'; +import { getSearchValue } from '../../lib/get_search_value'; +import { PIPELINE } from '../../../common/constants'; /** * Represents the model for listing pipelines in the UI @@ -25,7 +25,7 @@ export class PipelineListItem { this.username = props.username; if (props.lastModified) { - this.lastModified = getMoment(props.lastModified); + this.lastModified = getMomentDate(props.lastModified); this.lastModifiedHumanized = capitalize(this.lastModified.fromNow()); } } @@ -51,3 +51,11 @@ export class PipelineListItem { return new PipelineListItem(props); } } + +function getMomentDate(date) { + if (!date) { + return null; + } + + return moment(date); +} diff --git a/x-pack/plugins/logstash/public/plugin.ts b/x-pack/plugins/logstash/public/plugin.ts new file mode 100644 index 0000000000000..91d1a39d3970c --- /dev/null +++ b/x-pack/plugins/logstash/public/plugin.ts @@ -0,0 +1,92 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { i18n } from '@kbn/i18n'; +import { Subscription } from 'rxjs'; +import { map } from 'rxjs/operators'; +import { once } from 'lodash'; + +import { CoreSetup, CoreStart, Plugin } from 'src/core/public'; +import { + HomePublicPluginSetup, + FeatureCatalogueCategory, +} from '../../../../src/plugins/home/public'; +import { LicensingPluginSetup } from '../../licensing/public'; +import { ManagementSetup } from '../../../../src/plugins/management/public'; + +// @ts-ignore +import { LogstashLicenseService } from './services'; + +interface SetupDeps { + licensing: LicensingPluginSetup; + management: ManagementSetup; + + home?: HomePublicPluginSetup; +} + +export class LogstashPlugin implements Plugin { + private licenseSubscription?: Subscription; + + public setup(core: CoreSetup, plugins: SetupDeps) { + const logstashLicense$ = plugins.licensing.license$.pipe( + map(license => new LogstashLicenseService(license)) + ); + const section = plugins.management.sections.register({ + id: 'logstash', + title: 'Logstash', + order: 30, + euiIconType: 'logoLogstash', + }); + const managementApp = section.registerApp({ + id: 'pipelines', + title: i18n.translate('xpack.logstash.managementSection.pipelinesTitle', { + defaultMessage: 'Pipelines', + }), + order: 10, + mount: async params => { + const [coreStart] = await core.getStartServices(); + const { renderApp } = await import('./application'); + + return renderApp(coreStart, params, logstashLicense$); + }, + }); + + this.licenseSubscription = logstashLicense$.subscribe((license: any) => { + if (license.enableLinks) { + managementApp.enable(); + } else { + managementApp.disable(); + } + + if (plugins.home && license.enableLinks) { + // Ensure that we don't register the feature more than once + once(() => { + plugins.home!.featureCatalogue.register({ + id: 'management_logstash', + title: i18n.translate('xpack.logstash.homeFeature.logstashPipelinesTitle', { + defaultMessage: 'Logstash Pipelines', + }), + description: i18n.translate('xpack.logstash.homeFeature.logstashPipelinesDescription', { + defaultMessage: 'Create, delete, update, and clone data ingestion pipelines.', + }), + icon: 'pipelineApp', + path: '/app/kibana#/management/logstash/pipelines', + showOnHomePage: true, + category: FeatureCatalogueCategory.ADMIN, + }); + }); + } + }); + } + + public start(core: CoreStart) {} + + public stop() { + if (this.licenseSubscription) { + this.licenseSubscription.unsubscribe(); + } + } +} diff --git a/x-pack/legacy/plugins/logstash/public/services/cluster/cluster_service.js b/x-pack/plugins/logstash/public/services/cluster/cluster_service.js similarity index 51% rename from x-pack/legacy/plugins/logstash/public/services/cluster/cluster_service.js rename to x-pack/plugins/logstash/public/services/cluster/cluster_service.js index e89c2fe7d11bf..20f3b0d349c80 100755 --- a/x-pack/legacy/plugins/logstash/public/services/cluster/cluster_service.js +++ b/x-pack/plugins/logstash/public/services/cluster/cluster_service.js @@ -4,22 +4,20 @@ * you may not use this file except in compliance with the Elastic License. */ -import chrome from 'ui/chrome'; -import { ROUTES } from '../../../../../../plugins/logstash/common/constants'; -import { Cluster } from 'plugins/logstash/models/cluster'; +import { ROUTES } from '../../../common/constants'; +import { Cluster } from '../../models/cluster'; export class ClusterService { - constructor($http) { - this.$http = $http; - this.basePath = chrome.addBasePath(ROUTES.API_ROOT); + constructor(http) { + this.http = http; } loadCluster() { - return this.$http.get(`${this.basePath}/cluster`).then(response => { - if (!response.data) { + return this.http.get(`${ROUTES.API_ROOT}/cluster`).then(response => { + if (!response) { return; } - return Cluster.fromUpstreamJSON(response.data.cluster); + return Cluster.fromUpstreamJSON(response.cluster); }); } diff --git a/x-pack/legacy/plugins/logstash/public/sections/pipeline_edit/components/pipeline_edit/index.js b/x-pack/plugins/logstash/public/services/cluster/index.js similarity index 82% rename from x-pack/legacy/plugins/logstash/public/sections/pipeline_edit/components/pipeline_edit/index.js rename to x-pack/plugins/logstash/public/services/cluster/index.js index 5889bbdf96a93..4417262d9f442 100755 --- a/x-pack/legacy/plugins/logstash/public/sections/pipeline_edit/components/pipeline_edit/index.js +++ b/x-pack/plugins/logstash/public/services/cluster/index.js @@ -4,4 +4,4 @@ * you may not use this file except in compliance with the Elastic License. */ -import './pipeline_edit'; +export { ClusterService } from './cluster_service'; diff --git a/x-pack/plugins/logstash/public/services/index.js b/x-pack/plugins/logstash/public/services/index.js new file mode 100644 index 0000000000000..a7e8aa5c6259f --- /dev/null +++ b/x-pack/plugins/logstash/public/services/index.js @@ -0,0 +1,12 @@ +/* + * 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 { ClusterService } from './cluster'; +export { LogstashLicenseService } from './license'; +export { MonitoringService } from './monitoring'; +export { PipelineService } from './pipeline'; +export { PipelinesService } from './pipelines'; +export { UpgradeService } from './upgrade'; diff --git a/x-pack/legacy/plugins/logstash/public/lib/update_management_sections/index.js b/x-pack/plugins/logstash/public/services/license/index.js similarity index 77% rename from x-pack/legacy/plugins/logstash/public/lib/update_management_sections/index.js rename to x-pack/plugins/logstash/public/services/license/index.js index 9d53d4dd61163..64f39b1144cee 100755 --- a/x-pack/legacy/plugins/logstash/public/lib/update_management_sections/index.js +++ b/x-pack/plugins/logstash/public/services/license/index.js @@ -4,4 +4,4 @@ * you may not use this file except in compliance with the Elastic License. */ -export { updateLogstashSections } from './update_logstash_sections'; +export { LogstashLicenseService } from './logstash_license_service'; diff --git a/x-pack/plugins/logstash/public/services/license/logstash_license_service.js b/x-pack/plugins/logstash/public/services/license/logstash_license_service.js new file mode 100755 index 0000000000000..b836b75b89cc7 --- /dev/null +++ b/x-pack/plugins/logstash/public/services/license/logstash_license_service.js @@ -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. + */ + +import { i18n } from '@kbn/i18n'; + +export class LogstashLicenseService { + constructor(license, navigateToApp, toasts) { + this.license = license; + this.navigateToApp = navigateToApp; + this.toasts = toasts; + } + + get enableLinks() { + return this.calculated.enableLinks; + } + + get isAvailable() { + return this.calculated.isAvailable; + } + + get isReadOnly() { + return this.calculated.isReadOnly; + } + + get message() { + return this.calculated.message; + } + + get isSecurityEnabled() { + return this.license.getFeature(`security`).isEnabled; + } + + /** + * Checks if the license is valid or the license can perform downgraded UI tasks. + * Rejects if the plugin is not available due to license. + */ + checkValidity() { + return new Promise((resolve, reject) => { + if (this.isAvailable) { + return resolve(); + } + + return reject(); + }); + } + + get calculated() { + if (!this.license) { + throw new Error(`No license available!`); + } + + if (!this.isSecurityEnabled) { + return { + isAvailable: false, + enableLinks: false, + isReadOnly: false, + message: i18n.translate('xpack.logstash.managementSection.enableSecurityDescription', { + defaultMessage: + 'Security must be enabled in order to use Logstash pipeline management features.' + + ' Please set xpack.security.enabled: true in your elasticsearch.yml.', + }), + }; + } + + if (!this.license.hasAtLeast('standard')) { + return { + isAvailable: false, + enableLinks: false, + isReadOnly: false, + message: i18n.translate( + 'xpack.logstash.managementSection.licenseDoesNotSupportDescription', + { + defaultMessage: + 'Your {licenseType} license does not support Logstash pipeline management features. Please upgrade your license.', + values: { licenseType: this.license.type }, + } + ), + }; + } + + if (!this.license.isActive) { + return { + isAvailable: true, + enableLinks: true, + isReadonly: true, + message: i18n.translate( + 'xpack.logstash.managementSection.pipelineCrudOperationsNotAllowedDescription', + { + defaultMessage: + 'You cannot edit, create, or delete your Logstash pipelines because your {licenseType} license has expired.', + values: { licenseType: this.license.type }, + } + ), + }; + } + + return { + isAvailable: true, + enableLinks: true, + isReadOnly: false, + }; + } +} diff --git a/x-pack/plugins/logstash/public/services/monitoring/index.js b/x-pack/plugins/logstash/public/services/monitoring/index.js new file mode 100755 index 0000000000000..bc0e8b6bc978a --- /dev/null +++ b/x-pack/plugins/logstash/public/services/monitoring/index.js @@ -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 { MonitoringService } from './monitoring_service'; diff --git a/x-pack/legacy/plugins/logstash/public/services/monitoring/monitoring_service.js b/x-pack/plugins/logstash/public/services/monitoring/monitoring_service.js similarity index 58% rename from x-pack/legacy/plugins/logstash/public/services/monitoring/monitoring_service.js rename to x-pack/plugins/logstash/public/services/monitoring/monitoring_service.js index 6103e730c2171..d551f4fba61d2 100755 --- a/x-pack/legacy/plugins/logstash/public/services/monitoring/monitoring_service.js +++ b/x-pack/plugins/logstash/public/services/monitoring/monitoring_service.js @@ -5,17 +5,14 @@ */ import moment from 'moment'; -import chrome from 'ui/chrome'; -import { ROUTES, MONITORING } from '../../../../../../plugins/logstash/common/constants'; -import { PipelineListItem } from 'plugins/logstash/models/pipeline_list_item'; +import { ROUTES, MONITORING } from '../../../common/constants'; +import { PipelineListItem } from '../../models/pipeline_list_item'; export class MonitoringService { - constructor($http, Promise, monitoringUiEnabled, clusterService) { - this.$http = $http; - this.Promise = Promise; + constructor(http, monitoringUiEnabled, clusterService) { + this.http = http; this.monitoringUiEnabled = monitoringUiEnabled; this.clusterService = clusterService; - this.basePath = chrome.addBasePath(ROUTES.MONITORING_API_ROOT); } isMonitoringEnabled() { @@ -30,18 +27,18 @@ export class MonitoringService { return this.clusterService .loadCluster() .then(cluster => { - const url = `${this.basePath}/v1/clusters/${cluster.uuid}/logstash/pipeline_ids`; + const url = `${ROUTES.MONITORING_API_ROOT}/v1/clusters/${cluster.uuid}/logstash/pipeline_ids`; const now = moment.utc(); - const body = { + const body = JSON.stringify({ timeRange: { max: now.toISOString(), min: now.subtract(MONITORING.ACTIVE_PIPELINE_RANGE_S, 'seconds').toISOString(), }, - }; - return this.$http.post(url, body); + }); + return this.http.post(url, { body }); }) .then(response => - response.data.map(pipeline => PipelineListItem.fromUpstreamMonitoringJSON(pipeline)) + response.map(pipeline => PipelineListItem.fromUpstreamMonitoringJSON(pipeline)) ) .catch(() => []); } diff --git a/x-pack/legacy/plugins/logstash/public/sections/pipeline_edit/components/upgrade_failure/index.js b/x-pack/plugins/logstash/public/services/pipeline/index.js similarity index 81% rename from x-pack/legacy/plugins/logstash/public/sections/pipeline_edit/components/upgrade_failure/index.js rename to x-pack/plugins/logstash/public/services/pipeline/index.js index 3a9a6b860c51f..70d228b34860b 100755 --- a/x-pack/legacy/plugins/logstash/public/sections/pipeline_edit/components/upgrade_failure/index.js +++ b/x-pack/plugins/logstash/public/services/pipeline/index.js @@ -4,4 +4,4 @@ * you may not use this file except in compliance with the Elastic License. */ -import './upgrade_failure'; +export { PipelineService } from './pipeline_service'; diff --git a/x-pack/plugins/logstash/public/services/pipeline/pipeline_service.js b/x-pack/plugins/logstash/public/services/pipeline/pipeline_service.js new file mode 100755 index 0000000000000..7c3e18e745d82 --- /dev/null +++ b/x-pack/plugins/logstash/public/services/pipeline/pipeline_service.js @@ -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 { ROUTES } from '../../../common/constants'; +import { Pipeline } from '../../models/pipeline'; + +export class PipelineService { + constructor(http, pipelinesService) { + this.http = http; + this.pipelinesService = pipelinesService; + } + + loadPipeline(id) { + return this.http.get(`${ROUTES.API_ROOT}/pipeline/${id}`).then(response => { + return Pipeline.fromUpstreamJSON(response); + }); + } + + savePipeline(pipelineModel) { + return this.http + .put(`${ROUTES.API_ROOT}/pipeline/${pipelineModel.id}`, { + body: JSON.stringify(pipelineModel.upstreamJSON), + }) + .catch(e => { + throw e.message; + }); + } + + deletePipeline(id) { + return this.http + .delete(`${ROUTES.API_ROOT}/pipeline/${id}`) + .then(() => this.pipelinesService.addToRecentlyDeleted(id)) + .catch(e => { + throw e.message; + }); + } +} diff --git a/x-pack/legacy/plugins/logstash/common/lib/index.js b/x-pack/plugins/logstash/public/services/pipelines/index.js similarity index 81% rename from x-pack/legacy/plugins/logstash/common/lib/index.js rename to x-pack/plugins/logstash/public/services/pipelines/index.js index 6ed1d24a37791..a932dd4b951f4 100755 --- a/x-pack/legacy/plugins/logstash/common/lib/index.js +++ b/x-pack/plugins/logstash/public/services/pipelines/index.js @@ -4,4 +4,4 @@ * you may not use this file except in compliance with the Elastic License. */ -export { getMoment } from './get_moment'; +export { PipelinesService } from './pipelines_service'; diff --git a/x-pack/plugins/logstash/public/services/pipelines/pipelines_service.js b/x-pack/plugins/logstash/public/services/pipelines/pipelines_service.js new file mode 100755 index 0000000000000..00610a23f2717 --- /dev/null +++ b/x-pack/plugins/logstash/public/services/pipelines/pipelines_service.js @@ -0,0 +1,128 @@ +/* + * 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 { ROUTES, MONITORING } from '../../../common/constants'; +import { PipelineListItem } from '../../models/pipeline_list_item'; + +const RECENTLY_DELETED_PIPELINE_IDS_STORAGE_KEY = 'xpack.logstash.recentlyDeletedPipelines'; + +export class PipelinesService { + constructor(http, monitoringService) { + this.http = http; + this.monitoringService = monitoringService; + } + + getPipelineList() { + return Promise.all([this.getManagementPipelineList(), this.getMonitoringPipelineList()]).then( + ([managementPipelines, monitoringPipelines]) => { + const now = Date.now(); + + // Monitoring will report centrally-managed pipelines as well, including recently-deleted centrally-managed ones. + // If there's a recently-deleted pipeline we're keeping track of BUT monitoring doesn't report it, that means + // it's not running in Logstash any more. So we can stop tracking it as a recently-deleted pipeline. + const monitoringPipelineIds = monitoringPipelines.map(pipeline => pipeline.id); + this.getRecentlyDeleted().forEach(recentlyDeletedPipeline => { + // We don't want to stop tracking the recently-deleted pipeline until Monitoring has had some + // time to report on it. Otherwise, if we stop tracking first, *then* Monitoring reports it, we'll + // still end up showing it in the list until Monitoring stops reporting it. + if (now - recentlyDeletedPipeline.deletedOn < MONITORING.ACTIVE_PIPELINE_RANGE_S * 1000) { + return; + } + + // If Monitoring is still reporting the pipeline, don't stop tracking it yet + if (monitoringPipelineIds.includes(recentlyDeletedPipeline.id)) { + return; + } + + this.removeFromRecentlyDeleted(recentlyDeletedPipeline.id); + }); + + // Merge centrally-managed pipelines with pipelines reported by monitoring. Take care to dedupe + // while merging because monitoring will (rightly) report centrally-managed pipelines as well, + // including recently-deleted ones! + const managementPipelineIds = managementPipelines.map(pipeline => pipeline.id); + return managementPipelines.concat( + monitoringPipelines.filter( + monitoringPipeline => + !managementPipelineIds.includes(monitoringPipeline.id) && + !this.isRecentlyDeleted(monitoringPipeline.id) + ) + ); + } + ); + } + + getManagementPipelineList() { + return this.http.get(`${ROUTES.API_ROOT}/pipelines`).then(response => { + return response.pipelines.map(pipeline => PipelineListItem.fromUpstreamJSON(pipeline)); + }); + } + + getMonitoringPipelineList() { + return this.monitoringService.getPipelineList(); + } + + /** + * Delete a collection of pipelines + * + * @param pipelineIds Array of pipeline IDs + * @return Promise { numSuccesses, numErrors } + */ + deletePipelines(pipelineIds) { + const body = JSON.stringify({ + pipelineIds, + }); + return this.http.post(`${ROUTES.API_ROOT}/pipelines/delete`, { body }).then(response => { + this.addToRecentlyDeleted(...pipelineIds); + return response.results; + }); + } + + addToRecentlyDeleted(...pipelineIds) { + const recentlyDeletedPipelines = this.getRecentlyDeleted(); + const recentlyDeletedPipelineIds = recentlyDeletedPipelines.map(pipeline => pipeline.id); + pipelineIds.forEach(pipelineId => { + if (!recentlyDeletedPipelineIds.includes(pipelineId)) { + recentlyDeletedPipelines.push({ + id: pipelineId, + deletedOn: Date.now(), + }); + } + }); + this.setRecentlyDeleted(recentlyDeletedPipelines); + } + + removeFromRecentlyDeleted(...pipelineIds) { + const recentlyDeletedPipelinesToKeep = this.getRecentlyDeleted().filter( + recentlyDeletedPipeline => !pipelineIds.includes(recentlyDeletedPipeline.id) + ); + this.setRecentlyDeleted(recentlyDeletedPipelinesToKeep); + } + + isRecentlyDeleted(pipelineId) { + return this.getRecentlyDeleted() + .map(pipeline => pipeline.id) + .includes(pipelineId); + } + + getRecentlyDeleted() { + const recentlyDeletedPipelines = window.localStorage.getItem( + RECENTLY_DELETED_PIPELINE_IDS_STORAGE_KEY + ); + if (!recentlyDeletedPipelines) { + return []; + } + + return JSON.parse(recentlyDeletedPipelines); + } + + setRecentlyDeleted(recentlyDeletedPipelineIds) { + window.localStorage.setItem( + RECENTLY_DELETED_PIPELINE_IDS_STORAGE_KEY, + JSON.stringify(recentlyDeletedPipelineIds) + ); + } +} diff --git a/x-pack/legacy/plugins/logstash/public/sections/pipeline_edit/index.js b/x-pack/plugins/logstash/public/services/upgrade/index.js similarity index 82% rename from x-pack/legacy/plugins/logstash/public/sections/pipeline_edit/index.js rename to x-pack/plugins/logstash/public/services/upgrade/index.js index 4b699ed79cd26..1c835b11ae423 100755 --- a/x-pack/legacy/plugins/logstash/public/sections/pipeline_edit/index.js +++ b/x-pack/plugins/logstash/public/services/upgrade/index.js @@ -4,4 +4,4 @@ * you may not use this file except in compliance with the Elastic License. */ -import './pipeline_edit_route'; +export { UpgradeService } from './upgrade_service'; diff --git a/x-pack/plugins/logstash/public/services/upgrade/upgrade_service.js b/x-pack/plugins/logstash/public/services/upgrade/upgrade_service.js new file mode 100755 index 0000000000000..7bd101ebee6b0 --- /dev/null +++ b/x-pack/plugins/logstash/public/services/upgrade/upgrade_service.js @@ -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 { ROUTES } from '../../../common/constants'; + +export class UpgradeService { + constructor(http) { + this.http = http; + } + + executeUpgrade() { + return this.http + .post(`${ROUTES.API_ROOT}/upgrade`) + .then(response => response.is_upgraded) + .catch(e => { + throw e.message; + }); + } +} diff --git a/x-pack/plugins/logstash/server/routes/pipeline/save.ts b/x-pack/plugins/logstash/server/routes/pipeline/save.ts index 556c281944a85..e484d0e221b6d 100644 --- a/x-pack/plugins/logstash/server/routes/pipeline/save.ts +++ b/x-pack/plugins/logstash/server/routes/pipeline/save.ts @@ -25,7 +25,6 @@ export function registerPipelineSaveRoute(router: IRouter, security?: SecurityPl id: schema.string(), description: schema.string(), pipeline: schema.string(), - username: schema.string(), settings: schema.maybe(schema.object({}, { unknowns: 'allow' })), }), }, diff --git a/x-pack/plugins/translations/translations/ja-JP.json b/x-pack/plugins/translations/translations/ja-JP.json index 209a3f626272f..8a606e230dc36 100644 --- a/x-pack/plugins/translations/translations/ja-JP.json +++ b/x-pack/plugins/translations/translations/ja-JP.json @@ -8787,8 +8787,6 @@ "xpack.logstash.idFormatErrorMessage": "パイプライン ID は文字またはアンダーラインで始まる必要があり、文字、アンダーライン、ハイフン、数字のみ使用できます", "xpack.logstash.insufficientUserPermissionsDescription": "Logstash パイプラインの管理に必要なユーザーパーミッションがありません", "xpack.logstash.kibanaManagementPipelinesTitle": "Kibana の管理で作成されたパイプラインだけがここに表示されます", - "xpack.logstash.managementSection.createPipelineTitle": "パイプラインの作成", - "xpack.logstash.managementSection.editPipelineTitle": "パイプラインの編集", "xpack.logstash.managementSection.enableSecurityDescription": "Logstash パイプライン管理機能を使用するには、セキュリティを有効にする必要があります。elasticsearch.yml で xpack.security.enabled: true に設定してください。", "xpack.logstash.managementSection.licenseDoesNotSupportDescription": "ご使用の {licenseType} ライセンスは Logstash パイプライン管理をサポートしていません。ライセンスをアップグレードしてください。", "xpack.logstash.managementSection.notPossibleToManagePipelinesMessage": "現在ライセンス情報が利用できないため Logstash パイプラインを使用できません。", diff --git a/x-pack/plugins/translations/translations/zh-CN.json b/x-pack/plugins/translations/translations/zh-CN.json index 5d8d733f2b5b6..faee95b8172b7 100644 --- a/x-pack/plugins/translations/translations/zh-CN.json +++ b/x-pack/plugins/translations/translations/zh-CN.json @@ -8790,8 +8790,6 @@ "xpack.logstash.idFormatErrorMessage": "管道 ID 必须以字母或下划线开头,并只能包含字母、下划线、短划线和数字", "xpack.logstash.insufficientUserPermissionsDescription": "管理 Logstash 管道的用户权限不足", "xpack.logstash.kibanaManagementPipelinesTitle": "仅在 Kibana“管理”中创建的管道显示在此处", - "xpack.logstash.managementSection.createPipelineTitle": "创建管道", - "xpack.logstash.managementSection.editPipelineTitle": "编辑管道", "xpack.logstash.managementSection.enableSecurityDescription": "必须启用 Security,才能使用 Logstash 管道管理功能。请在 elasticsearch.yml 中设置 xpack.security.enabled: true。", "xpack.logstash.managementSection.licenseDoesNotSupportDescription": "您的{licenseType}许可不支持 Logstash 管道管理功能。请升级您的许可。", "xpack.logstash.managementSection.notPossibleToManagePipelinesMessage": "您不能管理 Logstash 管道,因为许可信息当前不可用。", diff --git a/x-pack/test/api_integration/apis/logstash/pipeline/delete.ts b/x-pack/test/api_integration/apis/logstash/pipeline/delete.ts index cdbf5a3e6a1fe..2463dbe4500b5 100644 --- a/x-pack/test/api_integration/apis/logstash/pipeline/delete.ts +++ b/x-pack/test/api_integration/apis/logstash/pipeline/delete.ts @@ -20,7 +20,6 @@ export default function({ getService }: FtrProviderContext) { .send({ id: 'fast_generator', description: 'foobar baz', - username: 'seger', pipeline: 'input { generator {} }\n\n output { stdout {} }', }) .expect(204); diff --git a/x-pack/test/api_integration/apis/logstash/pipeline/save.ts b/x-pack/test/api_integration/apis/logstash/pipeline/save.ts index 2ca9fbe7d68e0..ca0cfb19b9454 100644 --- a/x-pack/test/api_integration/apis/logstash/pipeline/save.ts +++ b/x-pack/test/api_integration/apis/logstash/pipeline/save.ts @@ -28,7 +28,6 @@ export default function({ getService }: FtrProviderContext) { .send({ id: 'fast_generator', description: 'foobar baz', - username: 'seger', pipeline: 'input { generator {} }\n\n output { stdout {} }', }) .expect(204); From dbb7923e9bde6f8822df5093215dffce0a5d272f Mon Sep 17 00:00:00 2001 From: Yara Tercero Date: Tue, 21 Apr 2020 10:42:43 -0400 Subject: [PATCH 12/67] [SIEM][Detections Engine] - minor updates to monitoring table with unit tests (#64020) ### Summary Minor updates to the All Rules monitoring table. Includes front end and backend changes: - Displays dashes in the monitoring table when no values are present - Displays `lastLookBackDate` only if the rule indexes events into the signals index, otherwise `lastLookBackDate` is set to null --- .../rules/use_rule_status.test.tsx | 172 +++++++++--------- .../detection_engine/rules/all/columns.tsx | 6 +- .../signals/__mocks__/es_results.ts | 6 +- .../signals/build_bulk_body.test.ts | 8 +- .../signals/build_signal.test.ts | 6 +- .../signals/search_after_bulk_create.test.ts | 24 ++- .../signals/search_after_bulk_create.ts | 12 +- .../signals/single_bulk_create.test.ts | 6 +- 8 files changed, 127 insertions(+), 113 deletions(-) diff --git a/x-pack/legacy/plugins/siem/public/containers/detection_engine/rules/use_rule_status.test.tsx b/x-pack/legacy/plugins/siem/public/containers/detection_engine/rules/use_rule_status.test.tsx index 0a30329baf68d..f74c2bad1019e 100644 --- a/x-pack/legacy/plugins/siem/public/containers/detection_engine/rules/use_rule_status.test.tsx +++ b/x-pack/legacy/plugins/siem/public/containers/detection_engine/rules/use_rule_status.test.tsx @@ -72,104 +72,108 @@ describe('useRuleStatus', () => { cleanup(); }); - test('init', async () => { - await act(async () => { - const { result, waitForNextUpdate } = renderHook(() => - useRuleStatus('myOwnRuleID') - ); - await waitForNextUpdate(); - expect(result.current).toEqual([true, null, null]); - }); - }); - - test('fetch rule status', async () => { - await act(async () => { - const { result, waitForNextUpdate } = renderHook(() => - useRuleStatus('myOwnRuleID') - ); - await waitForNextUpdate(); - await waitForNextUpdate(); - expect(result.current).toEqual([ - false, - { - current_status: { - alert_id: 'alertId', - last_failure_at: null, - last_failure_message: null, - last_success_at: 'mm/dd/yyyyTHH:MM:sssz', - last_success_message: 'it is a success', - status: 'succeeded', - status_date: 'mm/dd/yyyyTHH:MM:sssz', - gap: null, - bulk_create_time_durations: ['2235.01'], - search_after_time_durations: ['616.97'], - last_look_back_date: '2020-03-19T00:32:07.996Z', - }, - failures: [], - }, - result.current[2], - ]); - }); - }); - - test('re-fetch rule status', async () => { - const spyOngetRuleStatusById = jest.spyOn(api, 'getRuleStatusById'); - await act(async () => { - const { result, waitForNextUpdate } = renderHook(() => - useRuleStatus('myOwnRuleID') - ); - await waitForNextUpdate(); - await waitForNextUpdate(); - if (result.current[2]) { - result.current[2]('myOwnRuleID'); - } - await waitForNextUpdate(); - expect(spyOngetRuleStatusById).toHaveBeenCalledTimes(2); - }); - }); - - test('init rules statuses', async () => { - const payload = [testRule]; - await act(async () => { - const { result, waitForNextUpdate } = renderHook(() => - useRulesStatuses(payload) - ); - await waitForNextUpdate(); - expect(result.current).toEqual({ loading: false, rulesStatuses: [] }); + describe('useRuleStatus', () => { + test('init', async () => { + await act(async () => { + const { result, waitForNextUpdate } = renderHook(() => + useRuleStatus('myOwnRuleID') + ); + await waitForNextUpdate(); + expect(result.current).toEqual([true, null, null]); + }); }); - }); - test('fetch rules statuses', async () => { - const payload = [testRule]; - await act(async () => { - const { result, waitForNextUpdate } = renderHook(() => - useRulesStatuses(payload) - ); - await waitForNextUpdate(); - await waitForNextUpdate(); - expect(result.current).toEqual({ - loading: false, - rulesStatuses: [ + test('fetch rule status', async () => { + await act(async () => { + const { result, waitForNextUpdate } = renderHook(() => + useRuleStatus('myOwnRuleID') + ); + await waitForNextUpdate(); + await waitForNextUpdate(); + expect(result.current).toEqual([ + false, { current_status: { alert_id: 'alertId', - bulk_create_time_durations: ['2235.01'], - gap: null, last_failure_at: null, last_failure_message: null, - last_look_back_date: '2020-03-19T00:32:07.996Z', last_success_at: 'mm/dd/yyyyTHH:MM:sssz', last_success_message: 'it is a success', - search_after_time_durations: ['616.97'], status: 'succeeded', status_date: 'mm/dd/yyyyTHH:MM:sssz', + gap: null, + bulk_create_time_durations: ['2235.01'], + search_after_time_durations: ['616.97'], + last_look_back_date: '2020-03-19T00:32:07.996Z', }, failures: [], - id: '12345678987654321', - activate: true, - name: 'Test rule', }, - ], + result.current[2], + ]); + }); + }); + + test('re-fetch rule status', async () => { + const spyOngetRuleStatusById = jest.spyOn(api, 'getRuleStatusById'); + await act(async () => { + const { result, waitForNextUpdate } = renderHook(() => + useRuleStatus('myOwnRuleID') + ); + await waitForNextUpdate(); + await waitForNextUpdate(); + if (result.current[2]) { + result.current[2]('myOwnRuleID'); + } + await waitForNextUpdate(); + expect(spyOngetRuleStatusById).toHaveBeenCalledTimes(2); + }); + }); + }); + + describe('useRulesStatuses', () => { + test('init rules statuses', async () => { + const payload = [testRule]; + await act(async () => { + const { result, waitForNextUpdate } = renderHook(() => + useRulesStatuses(payload) + ); + await waitForNextUpdate(); + expect(result.current).toEqual({ loading: false, rulesStatuses: [] }); + }); + }); + + test('fetch rules statuses', async () => { + const payload = [testRule]; + await act(async () => { + const { result, waitForNextUpdate } = renderHook(() => + useRulesStatuses(payload) + ); + await waitForNextUpdate(); + await waitForNextUpdate(); + expect(result.current).toEqual({ + loading: false, + rulesStatuses: [ + { + current_status: { + alert_id: 'alertId', + bulk_create_time_durations: ['2235.01'], + gap: null, + last_failure_at: null, + last_failure_message: null, + last_look_back_date: '2020-03-19T00:32:07.996Z', + last_success_at: 'mm/dd/yyyyTHH:MM:sssz', + last_success_message: 'it is a success', + search_after_time_durations: ['616.97'], + status: 'succeeded', + status_date: 'mm/dd/yyyyTHH:MM:sssz', + }, + failures: [], + id: '12345678987654321', + activate: true, + name: 'Test rule', + }, + ], + }); }); }); }); diff --git a/x-pack/legacy/plugins/siem/public/pages/detection_engine/rules/all/columns.tsx b/x-pack/legacy/plugins/siem/public/pages/detection_engine/rules/all/columns.tsx index 8bea504f84206..97c89f91c12bd 100644 --- a/x-pack/legacy/plugins/siem/public/pages/detection_engine/rules/all/columns.tsx +++ b/x-pack/legacy/plugins/siem/public/pages/detection_engine/rules/all/columns.tsx @@ -243,7 +243,7 @@ export const getMonitoringColumns = (): RulesStatusesColumns[] => { {value != null && value.length > 0 ? Math.max(...value?.map(item => Number.parseFloat(item))) - : null} + : getEmptyTagValue()} ), truncateText: true, @@ -256,7 +256,7 @@ export const getMonitoringColumns = (): RulesStatusesColumns[] => { {value != null && value.length > 0 ? Math.max(...value?.map(item => Number.parseFloat(item))) - : null} + : getEmptyTagValue()} ), truncateText: true, @@ -267,7 +267,7 @@ export const getMonitoringColumns = (): RulesStatusesColumns[] => { name: i18n.COLUMN_GAP, render: (value: RuleStatus['current_status']['gap']) => ( - {value} + {value ?? getEmptyTagValue()} ), truncateText: true, diff --git a/x-pack/plugins/siem/server/lib/detection_engine/signals/__mocks__/es_results.ts b/x-pack/plugins/siem/server/lib/detection_engine/signals/__mocks__/es_results.ts index 8a5da8e859721..731fffcac1bb0 100644 --- a/x-pack/plugins/siem/server/lib/detection_engine/signals/__mocks__/es_results.ts +++ b/x-pack/plugins/siem/server/lib/detection_engine/signals/__mocks__/es_results.ts @@ -86,7 +86,7 @@ export const sampleDocNoSortId = (someUuid: string = sampleIdGuid): SignalSource _id: someUuid, _source: { someKey: 'someValue', - '@timestamp': 'someTimeStamp', + '@timestamp': '2020-04-20T21:27:45+0000', }, }); @@ -97,7 +97,7 @@ export const sampleDocNoSortIdNoVersion = (someUuid: string = sampleIdGuid): Sig _id: someUuid, _source: { someKey: 'someValue', - '@timestamp': 'someTimeStamp', + '@timestamp': '2020-04-20T21:27:45+0000', }, }); @@ -109,7 +109,7 @@ export const sampleDocWithSortId = (someUuid: string = sampleIdGuid): SignalSour _id: someUuid, _source: { someKey: 'someValue', - '@timestamp': 'someTimeStamp', + '@timestamp': '2020-04-20T21:27:45+0000', }, sort: ['1234567891111'], }); diff --git a/x-pack/plugins/siem/server/lib/detection_engine/signals/build_bulk_body.test.ts b/x-pack/plugins/siem/server/lib/detection_engine/signals/build_bulk_body.test.ts index bbd01cfaafc62..df9d282b71e5e 100644 --- a/x-pack/plugins/siem/server/lib/detection_engine/signals/build_bulk_body.test.ts +++ b/x-pack/plugins/siem/server/lib/detection_engine/signals/build_bulk_body.test.ts @@ -59,7 +59,7 @@ describe('buildBulkBody', () => { depth: 1, }, ], - original_time: 'someTimeStamp', + original_time: '2020-04-20T21:27:45+0000', status: 'open', rule: { actions: [], @@ -185,7 +185,7 @@ describe('buildBulkBody', () => { depth: 1, }, ], - original_time: 'someTimeStamp', + original_time: '2020-04-20T21:27:45+0000', status: 'open', rule: { actions: [], @@ -309,7 +309,7 @@ describe('buildBulkBody', () => { depth: 1, }, ], - original_time: 'someTimeStamp', + original_time: '2020-04-20T21:27:45+0000', status: 'open', rule: { actions: [], @@ -426,7 +426,7 @@ describe('buildBulkBody', () => { depth: 1, }, ], - original_time: 'someTimeStamp', + original_time: '2020-04-20T21:27:45+0000', status: 'open', rule: { actions: [], diff --git a/x-pack/plugins/siem/server/lib/detection_engine/signals/build_signal.test.ts b/x-pack/plugins/siem/server/lib/detection_engine/signals/build_signal.test.ts index 0a50c33fbbfe4..f3f4ab60e4db6 100644 --- a/x-pack/plugins/siem/server/lib/detection_engine/signals/build_signal.test.ts +++ b/x-pack/plugins/siem/server/lib/detection_engine/signals/build_signal.test.ts @@ -41,7 +41,7 @@ describe('buildSignal', () => { depth: 1, }, ], - original_time: 'someTimeStamp', + original_time: '2020-04-20T21:27:45+0000', status: 'open', rule: { created_by: 'elastic', @@ -101,7 +101,7 @@ describe('buildSignal', () => { depth: 1, }, ], - original_time: 'someTimeStamp', + original_time: '2020-04-20T21:27:45+0000', original_event: { action: 'socket_opened', dataset: 'socket', @@ -173,7 +173,7 @@ describe('buildSignal', () => { depth: 1, }, ], - original_time: 'someTimeStamp', + original_time: '2020-04-20T21:27:45+0000', original_event: { action: 'socket_opened', dataset: 'socket', diff --git a/x-pack/plugins/siem/server/lib/detection_engine/signals/search_after_bulk_create.test.ts b/x-pack/plugins/siem/server/lib/detection_engine/signals/search_after_bulk_create.test.ts index cec011ae8c445..2cb23b05f6a9b 100644 --- a/x-pack/plugins/siem/server/lib/detection_engine/signals/search_after_bulk_create.test.ts +++ b/x-pack/plugins/siem/server/lib/detection_engine/signals/search_after_bulk_create.test.ts @@ -30,7 +30,7 @@ describe('searchAfterAndBulkCreate', () => { test('if successful with empty search results', async () => { const sampleParams = sampleRuleAlertParams(); - const { success, createdSignalsCount } = await searchAfterAndBulkCreate({ + const { success, createdSignalsCount, lastLookBackDate } = await searchAfterAndBulkCreate({ someResult: sampleEmptyDocSearchResults(), ruleParams: sampleParams, services: mockService, @@ -55,6 +55,7 @@ describe('searchAfterAndBulkCreate', () => { expect(mockService.callCluster).toHaveBeenCalledTimes(0); expect(success).toEqual(true); expect(createdSignalsCount).toEqual(0); + expect(lastLookBackDate).toBeNull(); }); test('if successful iteration of while loop with maxDocs', async () => { @@ -105,7 +106,7 @@ describe('searchAfterAndBulkCreate', () => { }, ], }); - const { success, createdSignalsCount } = await searchAfterAndBulkCreate({ + const { success, createdSignalsCount, lastLookBackDate } = await searchAfterAndBulkCreate({ someResult: repeatedSearchResultsWithSortId(3, 1, someGuids.slice(6, 9)), ruleParams: sampleParams, services: mockService, @@ -130,13 +131,14 @@ describe('searchAfterAndBulkCreate', () => { expect(mockService.callCluster).toHaveBeenCalledTimes(5); expect(success).toEqual(true); expect(createdSignalsCount).toEqual(3); + expect(lastLookBackDate).toEqual(new Date('2020-04-20T21:27:45+0000')); }); test('if unsuccessful first bulk create', async () => { const someGuids = Array.from({ length: 4 }).map(x => uuid.v4()); const sampleParams = sampleRuleAlertParams(10); mockService.callCluster.mockResolvedValue(sampleBulkCreateDuplicateResult); - const { success, createdSignalsCount } = await searchAfterAndBulkCreate({ + const { success, createdSignalsCount, lastLookBackDate } = await searchAfterAndBulkCreate({ someResult: repeatedSearchResultsWithSortId(4, 1, someGuids), ruleParams: sampleParams, services: mockService, @@ -161,6 +163,7 @@ describe('searchAfterAndBulkCreate', () => { expect(mockLogger.error).toHaveBeenCalled(); expect(success).toEqual(false); expect(createdSignalsCount).toEqual(1); + expect(lastLookBackDate).toEqual(new Date('2020-04-20T21:27:45+0000')); }); test('if unsuccessful iteration of searchAfterAndBulkCreate due to empty sort ids', async () => { @@ -179,7 +182,7 @@ describe('searchAfterAndBulkCreate', () => { }, ], }); - const { success, createdSignalsCount } = await searchAfterAndBulkCreate({ + const { success, createdSignalsCount, lastLookBackDate } = await searchAfterAndBulkCreate({ someResult: sampleDocSearchResultsNoSortId(), ruleParams: sampleParams, services: mockService, @@ -204,6 +207,7 @@ describe('searchAfterAndBulkCreate', () => { expect(mockLogger.error).toHaveBeenCalled(); expect(success).toEqual(false); expect(createdSignalsCount).toEqual(1); + expect(lastLookBackDate).toEqual(new Date('2020-04-20T21:27:45+0000')); }); test('if unsuccessful iteration of searchAfterAndBulkCreate due to empty sort ids and 0 total hits', async () => { @@ -222,7 +226,7 @@ describe('searchAfterAndBulkCreate', () => { }, ], }); - const { success, createdSignalsCount } = await searchAfterAndBulkCreate({ + const { success, createdSignalsCount, lastLookBackDate } = await searchAfterAndBulkCreate({ someResult: sampleDocSearchResultsNoSortIdNoHits(), ruleParams: sampleParams, services: mockService, @@ -246,6 +250,7 @@ describe('searchAfterAndBulkCreate', () => { }); expect(success).toEqual(true); expect(createdSignalsCount).toEqual(1); + expect(lastLookBackDate).toEqual(new Date('2020-04-20T21:27:45+0000')); }); test('if successful iteration of while loop with maxDocs and search after returns results with no sort ids', async () => { @@ -267,7 +272,7 @@ describe('searchAfterAndBulkCreate', () => { ], }) .mockResolvedValueOnce(sampleDocSearchResultsNoSortId()); - const { success, createdSignalsCount } = await searchAfterAndBulkCreate({ + const { success, createdSignalsCount, lastLookBackDate } = await searchAfterAndBulkCreate({ someResult: repeatedSearchResultsWithSortId(4, 1, someGuids), ruleParams: sampleParams, services: mockService, @@ -291,6 +296,7 @@ describe('searchAfterAndBulkCreate', () => { }); expect(success).toEqual(true); expect(createdSignalsCount).toEqual(1); + expect(lastLookBackDate).toEqual(new Date('2020-04-20T21:27:45+0000')); }); test('if successful iteration of while loop with maxDocs and search after returns empty results with no sort ids', async () => { @@ -312,7 +318,7 @@ describe('searchAfterAndBulkCreate', () => { ], }) .mockResolvedValueOnce(sampleEmptyDocSearchResults()); - const { success, createdSignalsCount } = await searchAfterAndBulkCreate({ + const { success, createdSignalsCount, lastLookBackDate } = await searchAfterAndBulkCreate({ someResult: repeatedSearchResultsWithSortId(4, 1, someGuids), ruleParams: sampleParams, services: mockService, @@ -336,6 +342,7 @@ describe('searchAfterAndBulkCreate', () => { }); expect(success).toEqual(true); expect(createdSignalsCount).toEqual(1); + expect(lastLookBackDate).toEqual(new Date('2020-04-20T21:27:45+0000')); }); test('if returns false when singleSearchAfter throws an exception', async () => { @@ -359,7 +366,7 @@ describe('searchAfterAndBulkCreate', () => { .mockImplementation(() => { throw Error('Fake Error'); }); - const { success, createdSignalsCount } = await searchAfterAndBulkCreate({ + const { success, createdSignalsCount, lastLookBackDate } = await searchAfterAndBulkCreate({ someResult: repeatedSearchResultsWithSortId(4, 1, someGuids), ruleParams: sampleParams, services: mockService, @@ -383,5 +390,6 @@ describe('searchAfterAndBulkCreate', () => { }); expect(success).toEqual(false); expect(createdSignalsCount).toEqual(1); + expect(lastLookBackDate).toEqual(new Date('2020-04-20T21:27:45+0000')); }); }); diff --git a/x-pack/plugins/siem/server/lib/detection_engine/signals/search_after_bulk_create.ts b/x-pack/plugins/siem/server/lib/detection_engine/signals/search_after_bulk_create.ts index e287e33295c89..acf3e9bfb055c 100644 --- a/x-pack/plugins/siem/server/lib/detection_engine/signals/search_after_bulk_create.ts +++ b/x-pack/plugins/siem/server/lib/detection_engine/signals/search_after_bulk_create.ts @@ -98,13 +98,15 @@ export const searchAfterAndBulkCreate = async ({ tags, throttle, }); - toReturn.lastLookBackDate = - someResult.hits.hits.length > 0 - ? new Date(someResult.hits.hits[someResult.hits.hits.length - 1]?._source['@timestamp']) - : null; - if (createdItemsCount) { + + if (createdItemsCount > 0) { toReturn.createdSignalsCount = createdItemsCount; + toReturn.lastLookBackDate = + someResult.hits.hits.length > 0 + ? new Date(someResult.hits.hits[someResult.hits.hits.length - 1]?._source['@timestamp']) + : null; } + if (bulkCreateDuration) { toReturn.bulkCreateTimes.push(bulkCreateDuration); } diff --git a/x-pack/plugins/siem/server/lib/detection_engine/signals/single_bulk_create.test.ts b/x-pack/plugins/siem/server/lib/detection_engine/signals/single_bulk_create.test.ts index 51cc0f449b17a..6f3cc6e708fce 100644 --- a/x-pack/plugins/siem/server/lib/detection_engine/signals/single_bulk_create.test.ts +++ b/x-pack/plugins/siem/server/lib/detection_engine/signals/single_bulk_create.test.ts @@ -300,7 +300,7 @@ describe('singleBulkCreate', () => { _id: 'e1e08ddc-5e37-49ff-a258-5393aa44435a', _source: { someKey: 'someValue', - '@timestamp': 'someTimeStamp', + '@timestamp': '2020-04-20T21:27:45+0000', signal: { parent: { rule: '04128c15-0d1b-4716-a4c5-46997ac7f3bd', @@ -334,7 +334,7 @@ describe('singleBulkCreate', () => { test('filter duplicate rules will return back search responses if they do not have a signal and will NOT filter the source out', () => { const ancestors = sampleDocWithAncestors(); - ancestors.hits.hits[0]._source = { '@timestamp': 'some timestamp' }; + ancestors.hits.hits[0]._source = { '@timestamp': '2020-04-20T21:27:45+0000' }; const filtered = filterDuplicateRules('04128c15-0d1b-4716-a4c5-46997ac7f3bd', ancestors); expect(filtered).toEqual([ { @@ -343,7 +343,7 @@ describe('singleBulkCreate', () => { _score: 100, _version: 1, _id: 'e1e08ddc-5e37-49ff-a258-5393aa44435a', - _source: { '@timestamp': 'some timestamp' }, + _source: { '@timestamp': '2020-04-20T21:27:45+0000' }, }, ]); }); From b7f2a010c85e57b49495ca91a1c39c9f035425e5 Mon Sep 17 00:00:00 2001 From: Devon Thomson Date: Tue, 21 Apr 2020 11:26:53 -0400 Subject: [PATCH 13/67] [DOCS] Add documentation for clone feature (#64019) * Added documentation for the clone feature Co-authored-by: Kaarina Tungseth --- docs/images/clone_panel.gif | Bin 0 -> 817490 bytes docs/user/dashboard.asciidoc | 18 ++++++++++++++++++ 2 files changed, 18 insertions(+) create mode 100644 docs/images/clone_panel.gif diff --git a/docs/images/clone_panel.gif b/docs/images/clone_panel.gif new file mode 100644 index 0000000000000000000000000000000000000000..e521e438d051a986820977b75c75606199972ba4 GIT binary patch literal 817490 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

T0P$RjSBFhCSMN2yp4WCX}ow6QigWYlP9e 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:G15=@s5Dv*SXqCs4yAc=EBCd!| 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

5SovVt#Qh=SLu+a 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

oBfY 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 J^IMmP{|OzDFkJuu literal 579529 zcmbTd2UJsA^EVs?L{vbLCMa0wRgqq=A|N2WhbB!3p|=DGa8-)*EA>j15@LW5DFJDT zQXfD-2t|UlARQzT2$A{)Z+-sjE#G>Rm3`*So;`bhvuD?Ha{T#t7I0BdTUQ%!>J$L* zkoE-}&jEhXf`Xm^00ssCF#rH?7H}#K1fZu;G!Xy~?FRsyetr5c4#U!Gy1!_;g_F$V z4S=Gthi{N?pog#D^}ABH0gCr^4d_oa&^|wD!Jp*Ck!wj4sel^#m0y{DU#H%WJSH+O z>uPE`8k-tv>ps%@X%ypUCqF;0)7Jq2Z=aw5Q=R+Qt!;qU87Baz0apO$Y4)6VatZXi zXKeiFMCXa@Pu>5OP{w}R4!}$Puk-&)_=ux zmT>+T-~C_oA2!e=XnJ(qeB1&+F4s?dVI1K51mxxRGvkls|C0SL$^R4S?G;SJ{PV+4 zOD_b1&Gczk5gPVrSEmOjv=oi5baB!$qtOC1nh*lAH2jl3@(a3eN~48np>i`AY;li9 z(_-oL!zTgS7Brfs=X8Ka@Wa38oG=e_D;l4Z#&7d+HZ=OP>}QuiO`0zOH);GM4>#Qt z|MCF7=U<3^6<5pV;#` z%tQ0U&J+GePbWQN8cmC8I-;AG&WSv&F1iE1Amcx6py%`PGCZl5Ru}yPx4@rxX?p1S zf;`M0()hG`>Aivi%>OJ)|JxIgw(g(uH68&EPxvQg34UHbW0Yna!|8xv(-Z8px)`LK z0w6SL%?-_DL@BspLX>F1kiGx06+jQ z8pn;6>qg_a(eD0|k^EUM5CEp}L4c5-d4aUl_^0F_CI6DW4sfS&eE`cpWnBQ8d~iT8 zO_K*;oyPU}TjzCvChabm#&iGQ==sBzl|S|P(sR+@roT)3sn9>7SEE;?R{~t8*P#D} zUY-5{jjKej^0#hdTA9BPo!GNNtK|gb3;0SUVOeOuxS0GwR@ZS=W|K(Am|C`SlzA`K`jMCBxhA)5XxXv)i@P+oB zp!wz>EWZEb|LNtEmIBdQ)c3#S{%2eKC3TO6)az$SZ<-fCG|X=Q!Yui39o?`N?tf|< zrGICKzt9bP;`1BNKim^9xWyS#3<1w1{^8ypzrAsL^mfth(%Wlv>2w&nR=P&ICc2M+ z>vZqwKG5Oly6Dh!&40`PpJM3mwg;S8eiBzFcArGoUkLy0Yg)vz+-KosxyAB;g`Y)` z<#P{`oBd7VrhF05O{`p_mb<$Tre`}((!6{~11c3gj z@xNlgf@U!Y0HNs&p!xeG-h2R|G}(Xmygw1q^U>d-*Zm*St#}gif9XD>b>_jDdw}a_ z#Lg(4xpPMEg#N29pAn|zDbZ4`f7?cjkH01U3#nU>8}wv80ciUAg$97!J%X;w+`g@F z{T^-VbGxqV<02(--O0=A`p>Mu>j7?oZUG@~u2O)LdGn+k0I+5Hb3Q!9IrtAR$N&IP z`$il4KK;W31_J<_0pa+E~d^2mrj3cL@#%`9mLVqV5L(0-xNK`FVfp!hPEK zHGO=%MH|N$(*S_Om&eEZ#mC2oB{cnC0D$*i$L|4`&eAO~EYY311UP-^6y2p$#~lFL zRC9{q)X&eKiUFri)6p}WVLZ!p?mSHZa}jX*6dm1ZdO8M%lLf`82wFaX{t^S*jXU?w zTsCoHyy?#_^YmrW*<1IkKX8~1kp%8K2Rvgs$H~Qgg-1|GSVUAzR!&|)QAt_zftI$; zLtQ;Ha|=r=8ax+Qw zHMMn^`i6InO>ONRon77k>FFKDkBp9uf1V)B5$C@yEG{jttdhTPZSPQasXz8kaGe6s z{Q--X{(FuMGGdnO8^bP(UAz9%ocE{Zf)wW!HAr8D_e5 zd36as{g{fHHMgqR{D&W>%xs2b6>l_+VeAzi*1v16$IreSl|}_og>kLFX}Y^zXb9-M z+5ic7$$_c4YoHn}@bKd=z$8Hh4{bA${D@h)39!MnAl_%Ye)n>Qi_eoxg5I}rU)Poy zt?{oQ^Q06|aYKU5QkLT5X9_u>vfvaE=VbjJi5exQtNz8=5N8ex{X2js(dgpQRyO-z zib~eP6kgP=ML4$aVP93PC`7tX1RL-jjho@CV6PmQA_v3WBq;b$GaUib(17|LlX)-Y zmlleKd3m1N#%a@c6O%GWNAbF=l{>cT4eV}L1Vu0c6n}`(P{qt1VeD2D`OI^-3J`($ zTSF-joYMheTTzx9gS(wUm1}t<3x3H7$(QH}jks3nIc%p^XDT65`F+EpU(PTf3Bhg9 z#%Y$5=$}kk%o=JYP;iFjnkUZ8olvOQwz6tSi@N3T+UXYt06W0=)c^Xz{KVW6LR;KP z40MQI3Wof=K>I#+UkF4+LVj$y zU-o-VH{0FcFecH9glISU^mLQNbd!W;Z%MB#)NY+aGo@OBBf0TC+B_pB_VLuooP0U?)e#92iKZX$h`7@R84?qjW)6*Vis&>y}N~$u&J1`cJiNdEzbYIem^B z7J70>Tf#8XaCd?7TZXjvMnCs7!C^Agar%~`-s;_?oS7_L!oI_R?cVkpTH3@WgZ)%~ z1(-+sxs!ZF)oM;iB7BlNrVC!-XbT$STnsH~_|+gZR6?G7rAjd2Y;>CRE7|If-26<> zBBlYo+erxFIwvks6``p#gXQ!v$*S$QxhLMz51C5)QQ!3AaPfuG*8tY*DLc2$(U#S( zPyhP&+ z3V76;3CxcAaKh0a#MAF`J^!?KCWsqw{fd& z-`nwsO-VQD#d|6QA5 zm^dz^e>rnHCzN^Moa%sy$&tH23A%ug&!+q^QNXJzrF?n$!^@#qi_C1X-uKTcSy)ekDj$GmGSf$&zjR?P`Iz5PI&3Y6|g8tyEDeiV-|t!xCf1q-@M zS!?xt@3e2$QgFriOxFvUCUGnYas;7;(wZkc$I#=OH42{R&H?%w#%1;U&5S>7$R$gy z0f$}cb1jB8cFybW7|8IBY)LGP$Wj-<&5GaV&*;0qixtdQ_ed1!Gm9Q^QD73G^%8$i znfkPa%(Rd&6$PJqwhUW;10`{L;d1P_z4R~z*ZW=WTAfqo$lL zo04Zo{S%gp!!0KQsL{LOGE~~$(ZWC z!&>H-HW-fA+PCc4mxR22{qN35>zb@8WL)QF^vs2C5|WVuFk>o&bhKs>8=fpR*>xmG znu(E;6Ok-X{O0~P&VHm)pe1%%*EuCra?CvbYcg#yW;{|N3cHihdO2hthwhNdItJw9 z&})tT%ecDK^$nuEqXFp{5T~woz%{t)(clQnqq+KfE@dnA%3sH` z$I~17m@$e1w+QS|FD|w!-3C@^jpKEiWd_+C9B-alSc`*bqyg0>Rw|=ZrXf$rFKnOs|xN^Vz=7lU0+?^2~p23 z9gOg1fg?2^zuCoGTla`fIcT}2Y3~NucHXoVFL`7vlLKdZ*Xt?cm#AlE;&Uf}Y7VdQ z8R%Kv^Aax|_O@R~SJYGNy}x4TPlge0M^XmV1DXU?r9Ri7=Sck!ZniZH=*?{bEdxMUZ2 z%w3d|wZ*=JY$P4xe|Pq`w&M_Xyb@m&UBt!RTQ7uBW-k#{(NfNI;}#Y!wUP-46JLK! zH6xtMmNvdi@@!y?I>GUOdv`fMz{E==9Qx^9gpAS$7 znh$`@NG7@e?q-v9nk^)W{O+nDr;M-L6)Ob&bn1hd-fnd+xxPEYe(x6*FSruXB2NBL z*n{HccSA_|?A#xO>D_P#(DctW(iNWF7qa~4R=B3Glhqqap@H{?iI-P_)2&FG69#XoikQ>9gL?SwsR`ADY4q>;;xgOH0lQ5v(%On)Piz z4>i1d_U)_`$~|^*Y?1q$WR>?<-PiA)xw2`hUe*RGIc3S)+)9&o4SL+G_ZwJL+c=|0 zvG;Oxo*R?!6>XD{3^%SPr8%_*_G;HE`)`R1+{qAt(^j3ml8U{O_Ii@`viK&@1j^!D z=*D1|Ms!Hv3g@^ZJNDY-7x0m6;apc7{j?nEOTZfcMU=~3J1Wx$AB(^7a(UBzD#nZ09R+$Xegp{>FkWke@j>L0N1de5k6 zsZX)@@rrh6nd23!E`6yIuH<%MtJ?`JZ)Nds^2jfNeayUL`c@3pD;x`aFMh650~;Kq zNtv;TsA5NGNqc?RK;~;*BFgMx)7bW8gpmQM#k7yUKmhkPYelMZ`|MJzhwGTs%|s(z z=Pda~mK4nB1r~WY4>SR)YN5wbEzYRja(l;JyXsD-t`lf9>8fzNe_C1*mspjg9A{zk zpsE8~J}|@6`7H^h_q@}hM0sT1vVcQ@D;{akqsPu(OkC4b@0Z1=dA31yy7<`0v{mJH zDmRs@<1D{v!M14)-IsbML$inBE~pMvH*AD+~=~lG5^=zqnnI6v#^w zl4eS6AMSeWFMH>AJ@QgXeA^hpA;x;Dvo{}TnyCb*wP=^&aH3(qY*27-&_BHyV9cmO zG~%KfeW>?eRhK5~#KA-nebO&EcH`w*6*OzpobP_^4lK6^zW+YY*k>h~;tw=~n^r8q z4dFJveTHng4dGe}hrt9h(YAA28IPNL^~5*BBBNsFqjbi$eJ`$z?O~r*tmG`Fhcs`< z{kakP?J8G8YfV--D1%QyOZ)=4pt;OALttL9mkp@cD<$KAT*XE$%88up1JrULMvKYH zC%b@CF(oJS=#9p)$~xAI%Q;gsu{%OT2b$ng+B}-v6;~ku7GKF}kx%az%8#sWY6jZB zKp2N6J&tJ{MjG53K`4s7TzsBqXFh*0)MVx0xi)C(qNv-WZIb?cAuZ9M%N{=Q14MPO z{r6D!zugJ_+kgL?&C;JD{Kub8w!yQ51Q^}E(NUYguMeqD$r|)2ItM0}_G%jEC^g4` zA6)MIJBx8g`HKD;n~MBqzW7?_sHL~Q)GdX^? z1C#U)2$#AVdEg~|AUKCBZsR~ht_5hAkIGR~rwufiBeq{Xk>-e zHvXGyBFx{hqb3x6US;?3ZT<5(=Edb(CKbP;Of$oQ+hX`(Z>ef4Q@t710c)ao(`Pxe zm*u~8m_@HlZ)wS%T_vbW~jltaoE`t?ky=DEZA+Er;k zyrpZ7ZbtQJkjD?>r-hFJc)^`eS&dYkBP{+HFg!G2Mh({ZAbluUn599|cjQ<-V*SKB z8rB_*c#;I?!3DN%SGtj=NoRvDu#75OA(4?h>z?rj*w0nSSCL%AcN*&Pj$5B{S8d-n2t)q!C>7-<$EgM1%%I&2hgRQjWOaeVT3F~C80+DyBhdp{5?|aKYU+Gp z2QU9A2dIi2u1Vh`*e2U?xC*ts;W=%sg?dM3NvY96PTAU5hAF-LiUGxoV^qtc{a?lM zUUKk9Jb%4b{x$(8+$gZX*biA>B2_s?8E}l$X33Nk#a8HD3P78f`FS5$rh(KGb5wA( zLz{g2bH{)#$5iYU>i*p3)55wlFG&NtN1VdXTka8QyWfVnr(|YS9#9_sn!OMx9!I+3<+V>7{nN>t?jy`#}103H@h7B(j>y=MhL#Xl%C zRW>=c^IwCuEiMtGQVta0k8~*cvB=`p!PnNFVg2Q5V=<-O3?rL2QV1SPfmfQA+aCuI zzL&%$kw?qNOiVjW%CdNpb%Qe8jS5Vj4+jj{PFs!%1^aV1dBSzBswrx|DmTle)F!Ov zxrt1nOo!G{BilwVaCI}u7@H$HDDNzP%=R@MqE7b=Bf3LhypZq9wANhVDJq+!Shs2G zSn%gMM8dvli;eVH@4!H>>z0rA0)v}0yTPEQbP0deXxB)d$K&$-GjB?lfVJrfNmtR_ zD5=TiJ=>|_GNAy<#r7^KI5hmhs=ao;x^1Jbr0uxYc-e9XHERDJ3^I)Kh{rO(LTDS3 zc9hJxHdPCKpw~<;d}i1zR7ljnreaZBUpu7J;Iw5PN%!};Q#bX)?n$1NMCDvise!6i@CypZsGO%v z#UKk!a1!8gjA_O4N4_anh%R%`m^>flxHNL=OjMX=$x?Cy@7brV8^s1uAYh` z;^;jfT<0NZ!41rsN0T}x9OMRpz&#+GmmiW}%zsDo>4!8gAN9S*qb_jRxI|*4tOqZh z1I>XfbB38U!u%3JdLVenrfZ>8lr36BuZ4p_S4nX=qp&_-@vvg!ifmOeegjR|_Pu&E zqQP;XIX^hD+s0qJ83$u6pFD`58dbu6sU3ku388&iW3onNn>$B>g@>x1f0+bXT3K=K z<`}d#PdR!fd((4;kmDo=^`+X)N>Y$1`PMC*LhN=P0S%@HeOan&hELMX>R&d4ZMn=i zEG=%6+Pj#YMU@byYiVN;SVNQkI?8r!*sePos~AZrP$RQ;3`RGx#$f3|g_k1FI@%(V z51cBds5Opfsa0wr|M4tf!NWw0fxS&x`Jv^XHACf5Z#>6QpvQ%-59$*@c0!ojp$0rq znE9%UnDRXWnsg%+Tw&?jhLtZZA5QWR%ivkc4g6Xt)53nU zbpiTqvIg(+I%?A0s_8KIhz+JUtjblQPX^BmCoE8X=g?yv}vCq9}##^ZB(Z|ocx@>!I<{S4HEr+d##*`bcOEE_STT}m8nfY?mJGEz0j zJx46iH2#FJNSwkmReuuLdc>`^n#>p{pe8_%RUI4(VJ&>DJB+awh~-7Tbh`6s zQ{!_PmX29f(#w+B8QG#*wDE>G&)XCTt411{)P!WErJ#KFGmS2p$`xtXmS}jE&M8Yy z=qbO`)uoKe?W$lMWl6XV)_qr)5ed=BdKIQhiu)jL#Cjk|?(T48)#r-;N;V!jx~?_b zs=aUwsIAivzoxmqCtKg7Y}+1;Tvdpb)VIlcxbgUH{WF8+k@pMMVZVD?tj=F0%X*j} z5)gel1ayL-i6N+`zJxu`8MEZo%bnzAZGkjoX9pP;?>26l+-tq%eap@DOFXux)GY2reeXd$`fNwDKQ$oxa7uhf1W(1RC zmiR0CssH3@0Y{Ou<->l_o|f=$eFaBDGg;r1mBXiio7z>8#Z+BY3;x(Tb8-iPxjS*( z=vQcL)cN)(-?^3GUvMj|rT5D9<%>Ad6>h`7pk-37rE+XxBC_iWtIff>^S%(IijQo66lfJrl=6oNKd&9Wv)w#c~p zUV}Ys#7ADHo+GeQ_X<0XG~OL`B1cr|6gd9Mrd^|P4W7{~W|Xk+Dbk-jc* zMwe|`GnLgT=;DBdRQsJxzDM3VMyyhfDR88jy%$nj1|o_`QMcPi0<9FyI{4*s6o9Dnt+&B9uLS@ma_ zlsosE-T-7whqgkUyP=^u%{(#FHJr5mt*cif(U$d>n%}$`g+nTmG7*T3L&#R0J3dn3 zXq=zD1w>wJn>h_{CvODVRU>b?m#YB3G(h7aW2-QW(gex5O$p&0wf zRWO)=YtM^w?Dp^95XIK2XjUBtGY&J(g~ax@k{B+%k;%v%9Z?8@?S=yeNn zu)Bk-i1V?Y}gP&Pe z?fdz9)OW{3M$|oj!g|jzO&LF!@R>h(=i^fR(SAqiQ9zpTedXS_8rSU5rCF8KF#iH~ef?W9Pfgs62n&D{h z7;rK2mWS0K(Tc3M=Aby-a$Yq%TiGGq*A3jKN=!H;?&t`#xOop=e9neqr!cTPezxf~R!S7h^p}3sPha}VfYuxdV_@jjQj|XgtTFM9$-HA0Io6@-!;=Xt80tFD zY8vD+sO%rtRhgc8H?1|-u}5rg?1pwG#4x9QG~?EP^75^b&D!1v{DQPcaotncJJdBw zb`2S`7(<%Wqbkg@0zf=+StY`q8p(V&^4DQT6?SLBlh5D#R41uDwr`YbVDWuNQpei3 z(JgEAg7>Au)bl#hLFQz(PAjyio;Y(f0;PyzUs4jv%_1k6t#6>Eb`bGq{$+3QWoeOP zb#>|CU3U_j8my!oCBMO9$bs|uGaHQix1hJWl)GM*uJGL$!g-=&`Oc9g>z_s)R?PM6 z;4U0!;$P>QkrrPsOs_o{*;vA0-=^sb2B*026Qnpe=MEpqGd~Vg9w`#lW9##mLpFA& z6({Sl?Rx5z67h+{Dh`u*ncx;}w#y(<2?Is_%xNhT3r&+@`*$hxY;1x0OtF;mVQU4K|Ch2rqG6BG@=5!6Zq{)N?I| zRo8Jk3<;{)9PUh=2%Kk3j8uV&cg(QK_21PUZV^Qu+$a0IBGs#@6DYh>n(vj*6z^#l zqQIt84t6^JQAh{EO#YZ3!B)ag^kE9=(i26XwQ}9^ebfAhpWv#R>6RAdId$<@jA;ueg$)L}(%)H4GAMk8tZ7%)E=>kYG-HQQGO zTdtKkK&5uOUov|d@jBEO1|G&CR+`}NJ)HG1wlg&~wm+KnZ)DoE+SPM6E^xn?T~)Tg zwlaP!FPBdL-2E!B@gBG=d;F_E5w5LBFlYb(tY!Q@}tJP$oC>+f5EQ_kMXv;!=5uKn_S(3T)#wkRVeeG744p zLzoEUuPB3B?aZ;9WBb7I@e)PHGe;AAvebr9lJ6X@9d{nY$_@V0=JkEV+Z^ zq%+(mkoHKTC!kFs7+61^xa@wxbxm0o*(uhK^Ff5X>Ege(KKiBLw_%l?Y7kcGXasjj zT@mI_RU(Dc4ilJyrZnc{8(&uzD3giM99zZhL-$|mvDKeS@v^oJg~sE-Dmx=j_F;}L z)%c+1NBZ7sBP2O#9c2l+k>ZsNlTo!m*_UeMEmF0QH3sT-s^Lf%L zVmpQ^fYA$lHs71%%%Vp(2G3LyOdPBXbgpWJT7GbLF%{zgnIjBK&02ga%xV*dSE>pl zcGU~0FUhs@XKKkWHQWa$mL8Bap@r?!=kPFZGFP|brAh1Tb_Wjp&Z`T2{6m#>DCSw* z$PUW-fluI4L=LY`k6r2Ty(Qx|C#M+bdeB<9awc3mhUaQI+(yTyf56iu=>`TBvfbQb z9#%ev5<3Q1wRc?|ic{0eRBCk2-8D6V1cZFYSBz)>8bz2S`aC7IQ}U|GGtn)=uMffx zbL;f&oxcwn=9-Sc7>WJ2fc5+Cu?Hq_ExA!_HD7+j>4(y?KhSK81Wn&p#i0db<5BA$ zRmn=>C8nrHoa(ga77G^0Ug@l$1=o^~b)YwON7_-g6+G6Nrk9dos%9X2d|K3ntbu-q z)x&xT+TKm;Ad(tLigGx7eWXAQoP#4`f(y?>ougu-F2Jt&SK*SD$nJ?!+xxz(D_8+C z3*wf?kY*IecY9A!H?Y4@PJtiGhU=?;v^Pm*UVFjRe_f%aO*%mtVh@o`U4H%jx(%rt?TsLl0o444Hk6BDd^{V~0U z*V<>*Ch}aX@-e_{Z(ZDJrMG-v-F-b&Mm#B4<7;n&&*H z7&Mw@VEMp()5+g*EtkL5%LSp6H84gUo5@jEj(B0xLs-^jEE`pgO!shThyMz6So-o8 z`{@nXhcib^^BPXimkMTr}0IQZP^=}_Hqodx9FZDGM(q{!+E@&Zl^>*}ZY9*l}X6TWwuWIh~8qgdEo1NtMpZya_N?1@kB!|Z*NWH+Dl zGvS<56V%11Y7ukjl$o;_$E(Zg!X(7AgMg?x5t49>A!gq90;nO98!!1f-DqsxYdf^c z(YOvDtb!S-JJf2J^1b{;;Ky*5^yS<+Byrx1F(LU1zQQsYIabl5S6X6fH2pjPlULm6 zc8z0up*$h^Du=F#KU&Y?=G?i0L&ZQt(N4)>gDK(isJj!iW0?}lukQ|vF^&^6vxvAz z?oQ^^HZ(JJQG=a2A@_NE^ZW;YbGwz8?SGV z3tr`8cx@wn(E#`@O|b}Rd|mav54?> zKDyZW$@DH1v4SU>(DHO8`# z>%f0j;~50VACDk?xwH%vD3FW@oGU%LK2oWb6e-H3(Bn=#DKF`GM6%<(XXyIG^F%UL}Y5VZY$biRf00=iVVjI$x7F zJ`c<7Y&>!@8s{;!Kx^a zL)7;9)QidLP|TI>JBSJa`VQ~8MwV)yn#v0mEf?IAtuvt#kC5G~DNTmt2C*DOaNi)L z3i)|(4Vr1R#=@?al}1tBoGkYl%iKIF9vg}-x#V(j?(|FzYLt?7F&&Y zWChCVHmggZ4Bu~5d6c!))fwQQ=Q=O9g^xxK_+_OUwm-*-H)D>Tm&ZpRTW&(CzT#*Tf12=G8UHshLh4+NUnzQ{jvwufkw zg-Q@MB(#4(5C6yOypiZT@T-PaF~*L#_p@(*kDIm*`$P$>pP^qts%(J>6jeKcdp{V~w8;s|b~D2MT;>Vcl1v&dh#2x}CvHnmW*? zqUH_6nECZD@b-a|h1)1>4sO_R7f2M7@$l&`14C}uHDLO1y?U0Y$+tI7Z+d!d#YIQ5 zr5$5bmQ`U3mMypV=jO^ymLSJ~?93;PmIQ+6p8Xms6?1eq@>A5M8`MtL_eRg+Nq7UY z`l~r{UmogKcN8Z^rO)Ub)$!5DH&@K3x@3(<_^L__GuUwy$k`}?iR z-`t1|s=j8_Wbe>t-ZU(UcCKq^Y0TXhwzjpxp2ym%M5ZF0{HT@KhJCF^LSo>FF1?Fr z!#c4p^?~vZRr zfH~7%z|cQp+JeLEM`qqTh&2wYN|M@);y7{cWZB(aKK^mJ*2|i$aotu5O?d`UM9$}? zPo8b*7M$10e~?z%E3b|ry;FSxk&unR2#Wol>T?VTNz1#TgwPWB;q}kPGcm6A_(~qw^t?tgvxqmi1S4k(zO=_yJcv z3DN#}8_fo$9B~>zI=TkU)Nf)(q}Mlgq%VRl+SxG6?>^G1*>~~OSA}p&Uu#~9K|IeA zpO_VQLF#dPIby1o3|UH|rTMhD8@P25{has)sh0ll7NJ(=O4aP7EkhI^FeIbVS6uxG z!BE#D&!?eDEvmcl%8??pecmYkh%s_NS-O26To~KL_q+n8Pkl~S*$sVi}#QqUK3X2(A= zWNgiTFi%~AwpWRqz|kMw{sreo!gU+)ZOw9ZFue@9M~hoofwd@R3~vw9Ss$NoMcEG$ ztlD)zUPDFg?|d~c9APquBsB1MrAlvxW{U4rhhTY#?v@%KN})!n{AlTlb`2GbxR224 zC!0l9^*ij=)U>u+zJPfhHgBul$=--$IZSUkJAD&-p;%v=T1}RhzNHiMqF1gfbIwDf z?y*3;q|dyU_wlTMISjF7S)FS)j@;o9vjI?<<%oUY2G)XuFcU-WUtLVOpT$vOA^I1z4olP z-GOYdvoO_0=n>4X9H-4%mbTVB%q?zF27RRRd3qV;#~k zA$ftvUvJa0&az&Pz z%HN{rfvYklLO+Bue>{N?tvx|k75IN_Iz%4?7ag!r57FQ-{#Z9Eo|H&D-2HIK+b+-9 zl(u|yb1XPNP_LRA6_h2jYVf8vXDq)0_4TFZn+N#A*u{sBF1^))XATueGn^eLZgYNH z!J*W^2i3lqUfGyo=X*sb>!8UIRb@1`svUdN)PynuR=$&9T9=z)p{CISpYo27-t@GI z9K%YHb$*R<1>=~Or}>WoF){o1s04l%C_*2H8F9xS$dyr*RTik2P_R2ok#__`S7Pwv zp_P@;K$-is*Bcci7hbt7WFW^rj@pb+xW(+Y;anVIX%)T|!s3eiE7Nx6dmwOirQMRz znc0$!JC_%7Km;)^3QD}Jax5D+=W-^B0G=Q0n2I7w!AVlmzcwkfZ^j-8kHKz~r6#Hi zjCjKg$VPUgq3@XXVx6*?iAiXnmO|7r(6R{Gu@bDXS(@wor4s~}`Y=~?UvaQ%pf${| zLb}4tuz-(4odqH=rE5E#;Z#r9uL2RlBbhpypT&X}M5MvO{gx&(Sp%x&6#ZA=X7Iz` zpxKmBG6hGPp*$gHe?Xt6LQKih-9}fz>VQ#Ie&XbQXWRoaUpnZGjXj~N0nz7GJppQ( z%AK+EWCh)|TfW1YGB&;HR82cFZo@k1bI?}J&r8k?RTu~@8Tv@7>$Jcbd()^-_TDr; z%#tZZIw7?4>?->4e(51eX`m`MZ}!YhZ|8a|7|#1Z#R-(_>^XvD0&W*5Q)3(1|E zD!{nSjST0PD8o*xg@taGVqb(-1S@MiYAw70!+gsOBDS@S*LRdW9HQ!|UL%$htyGR09vHP%aJD_9BPl-E?q{y8e$oUDTysVkK@^LfpHT8;KR2Gn!K zsnQV(uh>8xm>u=W7T9Kub~G1t&7cm~K<1#m^tmm`79m&nG*~#-%iCwVx9EP1_6k1O zu98sE+nNh<7#o5|NaL#70yBcs60G#IcC)9m(B|8=L1Wz`j&+P1nfrmOQ6yt~E6U}= zR2aj)nj_OOz>Sq5a)^#N*nI^S%o0bUs96#D<6CZ_zN|GlKHoX@hT0fxz22e*r|P%o z7*wVDpFxC|gMkCJQki9~(beb7GdV0vvdMxh)|=wmd-Ch3W}hjxM+nitfKKVyT?pPb z=m>YYfa-D#V9=uC=U6AQY41%C2ML9<*)dfb9y3&-dNgvy@e)jwq+vPcMq=!YP~ZJv zsjfg`OgOmVPke}Bj%p9HdJ&YnSqH9OeYtA3oW+@~jQEWk`_g0KJ`0?~&^HZR9Wbpt zf$-+VCW2e}#?zKOWxT~Z2|b&LoNu&;Jv+**pJym}$AD*L%ZE#V1M&t(1 z@K2y^$=4Rv3(n)cWQA(7i5GzT`tlV~zHj8Suh-kFITLCT>mu6c(6}oi+N=Frr9XD8 zAk+|t`szD4)yajLu;s}ikWb>CzRQOux2f?doQGr z==fs#JoOau7;p)ul}dqAvq|UMAlcq;VE5|DA=%;w3Z$9%om5s(Q+9ld+FT-vkIZY- zkZ|T`=v`xNI5o(RoKqq?NKgP72=*|k0404!x4rGx7NA(qZT&BaT^}GgeUrO%Cc;(I2gJR=BKxyU0Mhvb#$~JkOdH!kt(cp6K7EQT{R|d*=Jz8he9-n7TGh6ksyx_+C#>K|iLEVRi_P3YjG?~U)H zlnf?hOYr(T>%V1`tGjtjtA(jaRicB#*Fvzse2paBY;~kc_7T(6K6m7Z`Z=mM zsry3|w}w|?B0*#Q$5q^w7JKA!VeQQO!54Sdu=1qwBvo57e`l613tIYF(4pCTo)4eA zh)sAjdVWNLbIFVq6wturRI*Y2q1RBhr2kvjRvJh)BY51rpdjqCPb4u-e>!AzxnUIB zJ2N`iN}F}0U*H-bFJLC~$AGg(BL>=n5k+m+A#=qFG{mm$hcFekE2CoC1e@W6Cos>hYza4meie*ZAh05$bTr+l zeq{xfD<%cp67)&-Ix?7wRQQG+Ulw#W{^M^~r)Y5(Zcf%oQWt|+95%El`G*J2ZB7^w z8=lgR6->J(c7fpOv!u?>(bTS<;?HMuR1$IQSqae3qBSYYwUG-95s{p-NT;_GT3Q^c zeayC(ERCQRIg4!$gefsy;P)AKv_hgqZ?NaQ^JEGqO4-l;n&OJXbXE9_52X%!3^;^q zc<^62ko^?N=s9z?PMQ_ExHZq(k;(#9(XSr!@$p*UQQ>D_24)qNd;xlfY&~d#)mOi?I-k@6u1oi%?u^g!BVcpm0wWh1bb@E z7J`Q*!^LdUB8knX2iavHyIqe|nb8{h(oT&aXU{LiV%0tPPt)e-Yq#d$lLz-nJ~-O2 zaEjVI7k3~aU#}ZHm;H2Ska?BDcQXeZ&o?$4r9QpKFCI{-HRcku1_~y<6Z>6s{TgxSQY4L~E14lbuM*@dr}=9} z8{z6O&=qVOpBSm#KUBN;_yuhg(fp z7>*epUKpsl#bsdrWAUt*whDE)KI;WmX;LDa5UUiD9G+DPu zD#?wu)e#A}aFAcdVVN|8Tyg$6yzcg5G!Qo(#CPcswFA|7f==eYd?c_ECX`JUpS5h9 zA7r57+M9s(?WJF!xcja9!ZA1N>fg0AVpF<1lHV-*cjq<&b%mOsf@j$)E&6V5T@d1n zMo6g3uzL>Yp*|vwfY~7lt?D-0w&FWt-1Toq%gs$JJoHM1If5FC52vJsLH5C$AhoNo z%k#8Nm#OEG;$cj%E=D@m;VRiE(dQd_c1WO>498}=kxy^EC#1k>r&9F;c&k_FgS&2} zgJ5?A&~|_jt^C!>>aw19&h7knif-hRyiT1-1|Edpyb~oSksjI4KQ}JGM#{&( zB46$EKtm0}RrK;#dQEIcm%kQDHCZn&nRF8T5dBxBRm%lw$W4769Qt%->RPsbq3-Ux z!G0k*YnSlk zm1Ie`#2Hnc03aO%^N7>pe(n454&tr&)Mhib64vrzR9~bHD^ZVWMN}w%AKaG*o)^=c z#KR4S!rIaUDEOFNY_$Q(+;?~CT2v>Rph1LEKg@1ErM=pFi|S5V>)_dK7nhDFq`rt$ znew!(UvG*n5z6yH1J=$wJtZ||jS9r-JpYnYv_PrCf!uHAwXaXtr z#@ze`w#3Nw(0ov@r(GR^8Z@>x4I9i_C5r7^o50ssdd)Mf#5N|ad>+DEvI*ng)c-%q z-ZYxcwT<6ypAK3bv{m!8TU5=hp=Ne#qbO>MiXmH7ku*|62txL*dEPa)rc{YEh!lw- zrV_)0qUNH8L=7<}YKSTOy`TSoy&v9>?^?d_C2PrbU)Oz}=kYtPJkEUvU!uD->klD} z@UaLECEX3mEhXUQzORUOhz`c>Cb@`VRcIYkH`z08KfuhenFb-jana0f+uA9{JRH>@ z`n}$RFb=x}a{N@^Wt+*MYd0uT13~7!e5MPVE!kscrO9QzxyTPib{m>Ps73=>p-^Ah zGOL-;6RcCE=hOcaL^=i<=WphG_jK#l9|Seq4NN~BL8?xP?fHBjRZ_iWzM=XGVR#?) zd}?!e>EdZ~;wF4CUF73y(Bql6e_u&FsarV#;iRrLQ$zst-t~Sb($^t6-`g6epC)wI z`Uc29Qzo-mW;2&cd3ℑ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

-H5+u}=6*8(Wro@Jb& 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"I=ldwnBe=577vEX4LF_Xw*mg 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%0D~gNyX^a~94{ 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

(CYt}FIpy!~_`iBxXgUBe<^noc8L02Q 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�+d=Vdo$(?b$}Z!gA5sKcn$6P@e|=c*y`^&CWT$A?bj~yww8@5 zzsR=8%QOvs(R}Y0M_sbuU?L-wCvb8VR@cqaNni&Hm@AVG^%^sDVM5q=C zVJY(4R ziPpeffaEpxWtpd}pnLR`u`M1A6HWvUTyR`E%evLitmRDIaavdDXTMYlp^j*ay`|3N z3lQ-p+2Nr~1rRV12`64=zcO3{(VI8=A(zTdc_Mel^jL9B?ke!jpo@a8V9ndZnpwSO z#0zYjs}GPT@0|2>8K#Loy+_pmrQVGLx4{cG5gO(Txc!xauwP`m;F+oGRt6zclGG^t zqM$x3y33E=l$nK2(ihlSO=H!1d05@v^U>yNyTh}Cuk@-N2(+|g{Iq;Svt$zKe_Y3iXVC3$RAo}sv0jQXsf34CH$ozU%~J$GcN)}t4AHAU zh_NfiC6h0Pt7$l%v&>Gpw+CAw&&KXF5if-5EexFmEFkqiE99?6RCsgqgCrcIu2QlG zG|`yFiY432V}%5r;7OU2;K$5v!>ClW7psctHMr^Ab}#$wEqY2(L%;>`!vktoEL|&{ z(huTml8ID^=0NS23fdCbXUirc0ZAF*Uq(KTglk_HQ#N>m2m%e6YPfGo`aC>szaMFc|wn!7YOx9n0;;7|IqAR7dwL)y^KXiMhK3zqE?@pWW42+ebi;jD!E zc=8>MTEo_rNGhyR&sUwsFDK>UUqF%s!bn-vLD(^sz0D-iypzwF*aSg#D|%1QbS9%4W2E)WBzdH=V~hCfffB#VuMB4)n&d$WFzJj6iL?lx`MqUd zFOi1k+-nww-rjI*tJ`Dol%kWraG(BCL3Gvdugu1*~hA9?qtPwGZA6K!=| z_u|2FeLlQ;j2o;CfD>9>;QvW%}lBPBWcDQ~hA@$$#dtqI5 zxm3OK!R>R2r!TuGk-H!h$$hwjhcgVME~l8vfGjD_LFlS0Gl>;}&NBmMR-~4N)0MFm z1!H=-;3+(8XJ|YiO*EV!46n{S-BA|*tN>&CDoX7f_1PISrRZD#z=x>ZmW3d7f~o8D z<>A~!!!=c$p4_*CV;p^`{ALVQog`|~W6*t}wiua}e~b4-?%M8QQ@fv)8VO5YbQ68l zuuWfuN+>(f-5rW(x6fdN`glIu5)1E|5E}2(slc^9P6eNzMn^ z)*1C*PZP_}J`XpA4^W^FAU!94AtP5JqXOzu*><)(mw{I$(VO&| zV-)MWWG5ltF+=mJz75YhjruN3qftX%$dv1g_QI|i)S}k~*!cP3=#p106WRkkKi5n#@Id+C`u{{TrZxEfOP} zN=9l@BkM_CJiOXWa8yHNc}gLvdO)Rf#?0s#NZ#08l`13LQQ_tG3Q!4-ua*&;fFbX@&S4erH!l3_JSiu zX0LOMkwJlst~$fl3sm+2>f_D9{?bU1b7w_imdm23?C%9*E4R#*CttAgfBvGY%))Z2 zDnB? zo*>OaVp0Wpmw~rb1GIMt8 zw#?bw)cU#h`#Pl`QB8kIY|^A_?5hY)j77 zLx>}|g|e-zY%d5`N7ZrlhiRhnyHI-bfeDdedbrS(sES0r%EYdM)n=2drj~y>cG~HQ zm)Ef8*Pd`wZ}Y9sw`E#ueZS1Yi>gxjP%JKl^&!~YeNjm!ZXnl^o&{1Ye)gvFgJ$!H^t)*VFEG*i% zpyoM4kDiLzv;QgLyEnDsWX@i(g-TwVM_K$MS`Jf5A*tn6vrAO5k26vXHO88 zSNf4&<8}sh8Oe8VkCocV!7?L$zZ36_rC(nxrPY+ zr0cT6hA9-{*(MmS@hu-efxK|ZM&&0j~lm3^f1?KiJ$(P*gyrSmpf39@OZ zbv_17C9FqcVLP6u{|!r56lif(6JyD!2NPz3A=gGjlOAB#*FO5}MP(=3SfFO)(BseU zdDt29b;e25HEB6y?Oc0&Xq^%)$4eN9*bh2~OO;UPb2O>-nvVi}w)BvR72|vcC0jdQ zgjb!gO^vInfTVb6^cuz^P*kxLVYx6XyJg#=S^Imx62n(PGtCKtp0%4csvPGt`N`A4 zM9EPoA`PpAjMihf${$-yPwb8^%psE1q3VgF0GP{sFuRIKuP=|O{ z?^VT*kAMC=XYtHY^S#Q4lk>ibXT=-aDczja@_Pb=AhL_-RiJ@mSVd@E^YegB?2ImE zwPLYDhYWpr;-bRj7rM@q3D&a|)9B@d0JA$m8r}!ZlrU2bd2CTL(!hq38z*BoRC>V$3d28n7QLwrEkc4DvoH5ch#1#q>j;HU=CHNt~UMs_zR zQ8dWQ+GQpcvJ*(G5T)BZlEmDIInE8rK8!d%=940hK7$n%f}w5Va;sA&eT>EBR)j(P zvcPYxC7d@(@4C4cxT^y=JE6DLqpyM;_ajCki?l1hD^-rhV}eVN{AqrYZC{GT&+O+< z;Sf5M^}XSjmT+iJdg^J-b0#;I*GafMc8gknIBQ#HlAF?Nc{YxyN~h6RvQ0;7xCyp~ z*B_IeAlEcZ)JQgexy-o>Llm~Djrl0|O{XrEIw5@{EoRzBULbx#0~coYRm%yJ?(jt4 zZZoFA{I8@LyG`!baQnaf3*zyAMeNo84l| zXBZvl`zn|@UdNnYir2D^{L1w^u;b>r(c{O@be{R}EG@&S{N&(JZKS!E&r$i<&MNV$ zoVz_!!|&|Kve{>S-e0&38<_@ILP44a(2d-sly=Ty269WVSBmpd^wD+A6#5mfi17-O zgu`8Ix3h4KLce<5%+!(CM=?RYIK zut|=273A6o4BqA)UuCvfy+BYy9AI1hX6dcpMA`DJha3ua=Grwm73RU|6o0LhoP3n0 z+kGeK&{C?}SkpLsJo0rFi{YJ{^MQD;YBF>4m7$@*sIaclsH^z~Xaj29Ub4TyqQ6kF z)CKMw6pY4OSW(}H3a1(^;uR~~{d<_Frl$-}fpXfWfvVX*PBE%ZLo)+2J>&Y)%*7!O zx>lY#%X(TxI{i4q`*~4$EWqZ@;neM!dird@c4eXl6^FJ81ZnD~a+p|jS z7rmmqtGMsfz}MG4rg-DwKH?}z_8N{-EWIw>Pd+6FWXZ_GbTS%FnC#MSw&*uGjQBp` zlP}BfD~u3sGj1`nZJz9C7m>M>NsZUzln6*xrqm>?PB+8Fxgjf;R_<6tx@@nHFDPC4 z+3ujZvAnf^>J!_@vhg!>*Nnc^p(^h?z=B@R0+7f zm`w6%L8_RY-<|w&AiHS%(3v}*bjnXjJ3~FZ`VYLBt(|fAZfuKMfA?cH-^C!e zB&udGm@T$&1P{fXY>&K#wH5kbXGQt>pW{SrC<>pu5@Q@b!bMzWaA+j-Rqvcd9shcu zJa)t^;zU)~2hwuM9ARn|64YsCwEvqJpZV%RMD zE6pe8!cOb1&-{C1gWqL1)l=W`z<*umhzlIVp%k4|Msq#CUnHQW;Lh>;cL*bB3Inn| zyN_c;%5;=J#2N?U7lvPdAiIpvppu3vj%E#{nRb1|?9d=@)1v^2S)UMmlPYmmyUHpo zEm(oYW(VTz>hBjCyFWg8``8iHdp=8QhQ6By-L8xruD^Wcvh$Fu_g8U^v%{wnX_{0B zw$*)ykBhVsPhApLD1Tvj_Dyz;pl;x`z{ikk*7u}!QBp1ULo`k?1gci>xySkZU3 zbOOD)Y=#==`62RWk7J%~^1GqLC0R4;!iqwp^lhfz94qd-RVN)XdmKIWt@ zKF;bfsyf>nYLooj0n~kM0~chw{E7y@L=sbFS1mn#Si+L`VLBJwwuGx4GuQFk*yK9E zJjQWc?0vxId1%D2v}htYtaE)e&D-efmnl=X5B(5HMKURWgbPFuSTxYp zxaVEt@Qd|FhWaMOQWHft#{{9n2~CEeso_{4+bw_e84mx{d?O6M5OKBd^>By3A=HM; zAHG}$fZj2FS~_8{kMGUN7Dq;!hum4Kvgys4H{qMUHEyWTCtT^xnz&BE6qo@HuHXdytQ{+R3d<7~E!D}s3 z?N2EBd%Vw8!~SW^=p&!s7-;W@5@OBtk7td;OnqsK!S*KM`Q)QF2ak_-cyGS=`3^m# zV^~~kx!I+xj8pdIcBP_PVMF`e97_%1uA=nmWy&-vnyRl9K0-nyfF`wrDQTvPsEq56OVf+v)Chvl3)>p{hE0K@@CH^FrX&<1*#`r+5Ig5>iO`Pp<~)#A zAEL9;%A$0RU|NQ0RtJgI$306*0w>O`x_{qrcsjkZ`pS{s4(~wfx9Ve3JH?V5_`o+5 zvH|xBMC))@u}=t5>Q0ZyJCN%llrE`)XPc2PbY0;cn5zp@(}=_=qLtbK;l%OouV!I6 zmd%T^gr}FeLxWBGHk4@e#eUR_H)ixPHP-)6^vhjkgs^X&k`C zG4o;pN5QfY8ticfbOb1tvV&a6F&+zQ zNU&zUl170*CyHi!IeUiyr$f5(9!VGal$_0*Ff{3o&s^s28C}*?alH7%&9h>^oo^n6 zV2XD(ZF*5?!YK>$aQ0{oOL#l<<9J|TZTal;F_wF+MqhS!FxdYNrR`Eot+OvJ#~O@P zpQJyFXrRwW1{<;{4~yRo6efkEwJ7gg;VS7~nEF0zyx~Z;WA91iyc5GT`@J74+3Q8Y z-8Wj9PM)+{Dq)jJK`-5`cd#rN8NcITGBp9AlyQ1Br3=}=|$wbJ4o!ZXyWKpx*>&+NTXi83N4c7V1q&fHt3NsBeY}7*Fgm@ zpHTh3%moeloFOHB)r&Gc(DlC4^Id2!W6b^?#h*vM9~L~gT*RDb?zSu|n-^$GZs{n9g(RsaBT0aLMh+!)GQB%z6`g;9M# z-i%y&C_CF7MoXEqnvJuxP#wa9x4@~Cm;E%nxVz$~&hQi`OS^ueZl@&aXk5X=UAwx9 z^+Kx;nY}qvk{OZb>JeR@SMn*y)wyItIkV?9-pwDe`i`MW{K1OX7KGEGm?~PU{coO= z-}VA!U$`(FDs14-m+8qLweg4pgpstua>V~MOlSSxiX^u<*rJoY>Z-Hp z3AtN(!pgKy>J?^h8FSnEWLq|k@wuSFWTWSOCgY`XYqZUomSL}rgTsgN2L?L(O|EW` z%Gv2x2c3KZK}tc*q@{ zO4noKM$oA~>hcT)7HMu!%!9PAh0_dMgu$jKD{41zFC{g&_87zWdk4IGY5w^oX?J&FFzY^e9~^pV98xn;n(dBXD*d{;^H6aAH!*Pd zZ;p;6{P=+;E5P3IAdCq;K-dR!n4%PJzef{CyVDrzRxCxBQX}$(7eH(a)`EsJ&uU-x z$~IL5VAphoRp@~>K1Vfcpwq5RJa|w{cJMFp9DeUPmhQR{;R+KR)QAnwCnBwwGw~IE zrHK6=pt=w1wpwyQY4>ZKKU!z65cfX8jowtnSJvWKy^M8QOSu%lun&R}Q)w+JmL zwH^B9)RZql+Um!xV&cWl(`SiW^3Bb^#`h`xsPB>(A{C{99Cbul#pxK)wZ z^z{QNMJnDE=R)P)-UXObo)Yb#G zYGw2~22x^@Vkw?W7znqkNW?B=Lao0-U!?1AVYEE&Y6_jh;MfImHM_fnnjWk2qi7xCK@&;&TDo(Lpc9^Oe=(DYZ(T18B)@DM( z_XJamJwFVRYQ%hX^HQ0sFdUArcoaChb>OuAz0WKq`FbFm!y3z9QZ!^f$TO(k8!gC4 zhi03rPj$#n7a|P;6<#WKP-@czkI$V^Cq;QeQ;Cl|W{TOnMHUOkt6C%SLRhRWrgQL# z<5g_V^DH~l8%jT(_epF(&0qzkVo~-)skO`t2^0pSo3{;<^^qqWlk8XM1sGQ$aW%r_ zQFK5oBjGZ5J(P{Gb^=*lK-cs__O%@7Rf)F{(i*C?6$afHoMfksKndYxT5{~zU<4|KIkKd1ZxO*HO_Bo>zX+WP`2>K71&8|17t7Iy0y70aa8UmQ# zT;>eZ5-=_z{oMy#ym(vMP-dm+2!NUa&S%R6P_i*&Vqo_>DCRBMO6uJ zltvX66rk{44HOov<4Do4q5K}(4MdL8Cx^kTnjDG0ncnz~K1#Su|Dy=2#Ax9rv4 zv|O1dG5%ve9F>m|py-y0{;0hNG96&bbNZ6(1JG3RB$+619k4r6#cro;1$%DUdhmwO zjlEn|yhDejmz^5b%M~@qC+~9cJ>6%{FmM&jh=+PB{jo0|)n8OQ#RVyupmWc}D+f^Z z)*(Bf(K^uLSpxgNx=qTKoCW!Y+G&){p0X35dWd))q!$2{XFihIv;#9_uE?WDW>pwu zxP#S=ISHTH8%p#ISunD!8*F(zY}KAEYC#A>H5PA3LpWcytO_c;hP4@IMNrV(4vJ=Z zx;+1EMNsZih?_8jUqH%w$9HxCS*mI5W&T{qq0;zuS9!=W@&nX4`8^P;O;6%ia&8G* z9UH39OBwu?d6g%Lo@j2`3Pk=$Shr~3#_e^%`h$V$hvwaqZlSc{7&i4&i5jE{(Rn(wqj}f{K9W=HDYHjD1&ZiN zphzw*b~I|E7LX$9Jx!9xYL7`?b%yhq-IV496g8+vaW~)dv}a?)de5p7-4}P1r;h^> zI^ZzBa7{v$I`q zyjRVVJNZ4&TTsi!Pbz=c2P9KEEWDv`t^kF!v9+!({1aA7QE3oz4h43VqFNHTE| zu-!%i{Ey}tu0Se;DSqvi6D~XULnV8%@Uh|xV5SwiB96@9Q$e3MY4shsh$>_|O1BXt z{Acm^q?^e*VZ$7O^d(ta07$D1u-m7meC2Vyg=a~Yk7=6%L#;{50-&t!`bWhqXk+9xwAB&ojAa<_GD6sz*EJK(+sDLvWK zJX6s2+&m2=(W)fO&{n;Fk7PDRXj6>fhSS!xB2t`9;I|<4y5gY4uh1T{B@jK4yaZ}! zpe%>cu^esEB2mMwGl7v2Hxz0gf@ZPvI>Qc{uUE9BI7f%>g@zxP8?&&K$Ir(C^b}r6 z*p4fmRt?u8XOxVV6)W9cze2~?^j5dOkx|ia&7c7YHyo5F;{s?aDD8b54E$WSqBGo8 z?F;J)3vC#tw)`V0K~$DeHo{HuQLh9hA9Q?1WpH)C*Fvw zLu|usMr7RExjhREbpconLq40L56i9N)ngywL`;pKGh!&8ruDu;hb$Z#&w2Ze^%4kt6=@&)Y*3UM( zEA$Wxs&L3l#EQpmCMAq$C(ArwR1;r?eOh3#h-}@*L4)0q3@rdhEjIFksmU_$!XTe@ z-JG>vNFI-()nl0`JJ4$z(4IywIPLvv-gH7e{u-A-ucO8q8bc-xwO%8c@!@>kah#!y z5LnSJzV_^-_KU5seYqml^id<^cv4VY4D@E8tneEuOYGrfPTtT0ha_r?RX7tlt6 zyxBiFY`{^*@%TEumfdmOWJ^1-p7WP; z{;7T$Z+)U4?Y!6Vb3px$qI2EzzN@^VUgsN>ayBEOLb`Zfv21%V5Y)ZuK{Q7QsQ3tq zQMVa;Pjwpe0Rg=CRG|v2bt?}W8&yuNHx{()wyF0d^#(J3?K*io`0{jX;8W$VLH}UB zz+OUTrPg2YhD5e%IiEBk^tjG;fLdj4Q6pkUP(UY6TJDc^gMAXoxF~ATU{K_8Zg6P$ zqPxb!bl+%Aw#{60Zb?aVplvkA?I%<=An7&bMc8Ga8;Y8&8v*{wW8)NkL^<>#UEfMd zn9?{!A_%`;7rHKS5KJu`%gBs8kP{dIwVdiuNt~W}p6-&}=xLr3Vvd=qCaAnn`o!KP zT{uC(!ZaRgwagQ%ji{rNnfN%vwNH^K=|)oWx8{8>;i>vskH*N4=v8drA|(CQoKJcM zslvU7>=Xn8&u6_BwiT6NXDQvYipZOgsS>hgra&_jpwf!@W2Vsa@Ag0|QW#*k7H(^3wQ2Iir))V7H7B&i zg#*Ebt2fFo$X2GQQKSxGhhv)j`7MN6N|e^LY- zs!B>bm6j{5p7-j(!Uw1~+yQ6FI>1p7gv6$ti2YrZ#iUFZMD&ySA29k~Bq8iD^}+ zBqbsrGnGns5JHTZS*5~EhGi5-_IuoQOBlE8E$JR< zi^OS!4YvnO$L&RW0`d~@uGiX!Tw{S09>u?iKyh0evFjxUObg>8JZ1+24R2D9g59H9 zSQTP1K&Gb#{<%sL9lCtvDKoooQQt-m5eOGJ%-qdbduGzR5nf@?a)e;d3B2cdm?~g! zLlC=PLLLHC6H>ii7th$R-?;PUODj&GidR+U^J7#i4&OnslA;t5dp7nsbEcB&bJS*( z>Ho%@q9$uXY8nT|hckXk&JifJ)Nc?5UYD(f4tYUBAZ&->Ji}YdluR1YszrI7&{sVLhQp~2H_Mp-H}!qsGY5{z&>o;I`D z15=+`R6f_yIQR>+WEqlmI)AI;pKBq9p=wCtK(98yK5 z_3lXo%JsESCnr3AvM(cd}ReOv#1x6Z(00p(@n!pUUN@9oAoD2&yYnLUK;Ht@q7RQa)D!x&N^YX2V zeMQIddQh{ZX9Z7dyYwE?uN`%QIop;6gl-8T@H=2J`z8L;XEHT*#5gzoMlFm-)*>A3 zG1^UlbDT;d>>8@m6KbsmgKseEUB58PDlI)`@s1ie8Cq8N-13&*^H&OeYK)(1Be{;- zWNpJcgmw9iu(c7$5s*0s6?TF_44+v;t+$^-IRz6{h;INI$p1M@$$exYw-1LVA$pcfhw2LVj1`ragh8MNUs#fSRpeWB%FY(IF9Nj z38=3J)+OQm#&I6ex*Q( zuo4*xM=3WzGXg~gk6H0jAj%PYO#M+;Y9Y%B1ObeacO@)ex5Y{p=4H56W}x)xrkipx$AlGs9GgQe$O`hE${0JF7nP8Su!LYI z{CR5%M!%&nhaAUVU#l)shJUM~A3U5VeaaOpQR!uVc#%22LUi9WZqHFf>=PKp!b3nt zgG=X!jm2*D57pO!!w4pjzcA%(RDJ5ze#)Q;E56C!nnN8+3C-UZR(>wie6vKop!8Wl z0Dl}7dP(G)?{egh{3Ahn1A806QfR_=7Zy8Fjtd=|unAGOu1U@Bym<50(lfS_m$DQC)^gVMzovR?QGq9LHu2-tjL2WcZ=CnpK^=1_zxhn#E?F7!SnfZrsL z@+QupBiJo|BYgOqsQUXn{mV1W!D#rZDWYMfbFE-F*86$P%{GVL{JK|XIKyO;)n#J0hQtH>%v7CX##N?SHewrwNvH)=yi_};C^ zH5yG;Tm}BYNS;y*qEDH`m3ThCk=u&vOFtYO(RhZ=0NScRU12R?rI~YjdMiU8%g-JE zQ*X80lm8|i!yo?(JBA?zV5)M@B9!NttOlnkd}|Y*z)>n-t*>iW`U#3#7jqfwX5onx z<@)^u%Wh+|m6xFY5pO2mbBxMqNpHd^_R?Z5kXA>uoe=7zl=!7Zbrk1flwE9V?CfHm zy6*mdHoh|6#L%n5Ffj_@p*LWZ+M6Yz1*L07rc}_f)2n~T7%t;%HPYMN(?D&I&1E)G zD#0M1AhE+Fwvqu933yAA=sNTWkaAjvg77=U-4av5Sk6e9BJflYMVZAt8u2$D5yg(Q zyUkdCv{;!tSw;6muTm?dOv1wPw9T`)Y{|ok$$X$w{887 z46&XOe-NrGheY86sH0!H#4Ngc2vtxsF(1b4w0cdEDe{HnMuaJpdR~AOeF7adpw2eX z$}?!0>Ljz*BQ`{!IGu3@h+q7OhC-7&Mj+iK*mof|5kg+~>CXkm6W2mdxk~0qE=^m# zBdnS{vr}{`xJo2t9P8rNro=!5OW!*Cp^vHceVca!#hw;j6=OjtTuse@f}VS2NoF0j zEW@$l2R3L7S?MTIiRCJ^T$Yv+R7U~_?OKouAVzi$nm55fF_Hdu5P3^WNtimvXjYUQ z;y5Z#R=392@4#hrJSv^YRuY~OIL6ILP$Pfc$F1(cbWC?T2;EXH6=Qe4y08;|dB}KA zx7W+`L+;5{)x8*#d35EE7mp1-yr%4{M)`~~Byj!Y86H`p!nTJRi)0^VyQ`pf-FS(M zFp*dGjV`u|IP!-WMj=U}J%ZgvY{RarG>9M8Vp^a^+M~T>?;$D&zOgyiu?W9)|FdC@ zXpPLauoui@-U? zBQ`NZhls6Wl@3Rh0ruNxQ{g7*4}eb-b239zu=p+MqS=Jm{sT77!G1@MT)Sp87loh* zG)uN+*q9J6ruEU%9Xr@#A;ZSf>j<-{;XP0&$Z9Aw^6gn9tN0Xj7_<+gq4ZMOhisTI zz7d|Jwfcn+Q^;kno>V8T3WaTDmEDkdk7U`M>&fk+vDZa#?NF6HG?X&RrmlNNpTBRV zr`pw!!Tk2lP5iA7(IwL9BD;`&`>nn4dPBAyeE}@XKzix`m5YUR*-ZuC7?%SzB}P(e ztviR!N*4uzMkd%wN8xxYe658hFJ>oC;ihaKdt$MlEYTHea8BKh1iX|LT0^Fysd2Qg zc73)+UuATsLi>{mf$?-XHQcz1&t2##)Kz>%+obc_D=a8wEW9Gztzs%>o3+M3p{MQQ z06u2AQi9a<;3Hp}d`l>n{mxQo)o@fH_z7XHWHm_?1d4JLmU^?yL}+ju@ZLE2W)Kf3 zHzbxN6IcDBl!rP}weAOokBDkMj#S3AXzn~+S1ySWhl`8Lmz`m1mL&PENfXTYcfSqb5#P)Vj3&I4Xf!f}r7O(fn?m0&7O22Y1ULiSE5 zM_4wZ`NwBphsPL#m-tRp((^K5Vgq(4U>wnUmcqH5ky$)Fqmul|K3g zW)mSLswo@>e+7_lzhi5S3o+D@8sxw;J3Gs0PJLn?$_onQS>Gn?EcLB7gRD6Q>Yc{3 ztJ-WK7ol|{3(V45sb*IG868vO7~%gwShnM@?hk))R%0NF+$&;n-FS&pSX3FMQHK|~ z2OE&arenx$GmM%h!Ua%Yi+5e*4`P?`9!tS5-rc|g|vG9q}K=MY;gStT%Ni7v1> z&ta@R2kn3*kQC+smYQUpWv{dFCyns+PInt?_gt~K#K}yuwqZ(6RsZbySRIZJqH3Kx z6|x}BTJX$FPGYCo1e6gwzds1-Wx3TahE8YK)k|GV2WDFvkOQ78T`*2PovTLY zww2vM{sf{A`=*QE*6I8CRt2b5!B*^@2i81gI}B5sM(YhFZ!sZ{X1Z2X3Z@gz=MVX{ z>u1;~3+Uw?u1B8bywCCL@U*m?rs#Rji{IP1iF50xrkK&9iH{)5y;Amxi2~DxJV0u5 zR-n+V4C911mkl&FX_@xc!U`ca=Tw4_!I^$~NeFLDtKTBDtgjLL@anfPj7L?`Uc9Ig zFz(LQksNv@mO+}c8)BZfx!2t&N_Dk&Fid>7SNlWGew%1IEzc)!xQMlI&N+!s&6rMM zFMciS7S@ajk+Dd@U+^<=CL|@}vW>E?jQOUSO_0232yDJTeptIlwk?9x=&p5Gh-{|Z zs^0;fFOE2Df9Pl*(^@c`n%BnNL#x{_wkh}hwW6XzFzab_pal%kba#BTdv~F8lHN6w zOI!9}U3G>N0>{H^os+0kR!SlyRlw{0Hbbe*9k$5$A%lrM;3dWs! z=z9L<7!khHfh`cHZvNhE9a1Ty%WAF=ws0trc6c*iXHbL!J@&9cax-SPG;2u?9JVB+ zGGZ@CB;BtGd>X1SJ2Ou}t}(&&YXv6FjtOq{y5hiOf5{$BbfJYV2kqksLd(RymP2wJ&5cTYVnn2NHGx-u#hVLS2<`ft za`srE-s@3&zm=w@AG%uCe`qv7G#4HgQ#LhPmorQ_4z3wdf=L9Wo0*NW5AZ7MMC7H; z6+~uwwq{?w2?Pf?T8Uu5L*qJ|7j`5&r4qWM>y}*hPGG=C3lbYhYe>Fq@aQ+tfwgLu1gJ&=+~^&km~i1wlgPX7tf#{9 zZ$|`HBE1KPI2!m(-QR!?jl|Wt4Qo1mcWNGqs}Zh|9F2ZtabWmleOgEX$Nn;eu}Bl{ z{oFTC8vRx@BWXuqC^0geY|4o?H?*5iORZU$$KD>ro&q}`2Dt$b%@_Hx1Zy5ZdJtZ8 zKuW2N79((;=+4{Rmt-D1p157I7Nn3v-e-EUm5Ck}+t>r18(A-3l*fd($DEuM#;m5> z4PfcvB|TRr+a2bit(n=G*k}ysJSDKoSyzBKn$YDO<;DE{4x9W4Y`l#V*jO~majz7_# zj}q5ZyGvBl?Ylvli!l%`x&&97Q{}mvJ zU;o4@A4svz1Y@B(JiU)hqFtF zbm&sCEZOXB$v zqzvbwsV9(pL$*#PhyAup8Tc9o`8|;wNpEsD(;pGQPSrw0?&5f|#YwKd z_1V`i$o5_Per3+q9X3UuEy~~Aa4_he20kMoxL^GFCDT5Ql6Zgf06j*$D=ob$t*&=I zaI{CNRAT%0eGvcZ4D?^<*Y>|y(LZHb^q<>R{Xd(x{|_$xze%p&^$+Fx%0a0+`z2x$ z@_h!IiLIHD)C)}Et8KP<&Xf0{8-@OhvW5d z$Bi;Y!K;MEOth*4b9y5@L!;e{Wv(|Esa|9k82aW*V_?i%+8usV_8;<}4CU&#Rz~ok0 zex%=l@oD=&Bg3cT!LPPoCkE8wrD9Kv(bwai{JkOP6?LEW+D=(BFJ3w}oPqb*n}nEj z-Ni&nz zFDPlJ9Wx%d)tAeqXRVp#()xlMd+s@R;dP&R)=Z3fV^8aL8}G4M*xi#D*mm;uSGl+q z4{xsid42F|i<_%|-=2I-;YWK=rqaJ9lmFR``!hj(bxBS|JIO+oyBhr_P4@dl+Wjwq zuj+a<_4W0+m~y*)-34d8s!U9V-1K^H+H?I7zol2EOl&@O&DMU_Mt_i8m=umXG^71K zJ<{$(+G3SBM&yIOT=VO(&d&}xnhHH&URSt!o!O`by=OKZ*BFn(!9UN)m-L{9M+jg=# z01$1gm%9IT zEY3@hJO#D|J;;S~F(~mIQV@C+{0b)^L;J|#vL$Z!Eg7aMW-d-mINZWee!xy5r6!BTkzcv8QbtC;Ou2ZmQwA4T z)z;}XBDTB`wBH;!*Ge;~EI+87o8h-^LMQE1Tid>S;WoQ&{XRaUHswVtcBp*)e0rE% zZsW15$|l4qY?A8j>yl*bn_G_-*A0p5u%AO{3ErCWh0cbncm9wtIxTn`nRL?B^bEVr z?#7qJ)&?=EMw}@%aq6w~3*7aiG%lr(J<;{qHsX-IW@^)hcYEY6TicJz2br#_`Q={W z<`&q4pu4!eR8!YcPv6J9Bih7-y!z4)4QF=@`n~#LPTyjyT%S~6`dmsJy{0SMQT!)ha#4yE_X7BWmD!ZNCEfrCC&y_??rCE)19HY=C0W+}jEQ!bL7 zW*PJ?gVAO1zMSkVCt=G;>;FYbK56FcAH@gw7v6%jkH9=Bcxe09*pk#_mQ}d3y@Jti zjIZ%{Gnsm2^VgRZaSbdz-}SrBJZri8M6T$`$}E#rG z$nQB5d5PjFe{puWJZTU8^5?Hzk25D1@@x)^YElB`S>wpwobuqisNFq< zn*#crZ3yY@=-}r64FvkvtyCWyU69UuAQaYlHy*`EmgZ$aGtjXP1m701V79G zqUucgyQ$HzsG@?CYs_FjW@IsD?yBK3M%h%CM)Kdyb6OKcmc-65raH!#@Q1l-Fi_oEu>li8OmtL*)Peq$c8-No5cbAUCt8oA7ttN zQ<>vG6QKXk{vnqh(ieCP_yFO^MIGA$LJ-iXk`7u@ax6OEV88E<2$a2v@{!#~^%D>. -You need the following permissions to use the Data Visualizer with file upload: +You need the following permissions to use the {data-viz} with file upload: * cluster privileges: `monitor`, `manage_ingest_pipelines` * index privileges: `read`, `manage`, `index` For more information, see {ref}/security-privileges.html[Security privileges] -and {ref}/built-in-roles.html[Built-in roles]. +and {ml-docs}/setup.html[Set up {ml-features}]. -- From 840808c9422c31b1a36ca001804f02da6fa87799 Mon Sep 17 00:00:00 2001 From: Jen Huang Date: Tue, 21 Apr 2020 09:43:17 -0700 Subject: [PATCH 15/67] Include datasource UUID in agent config yaml, adjust overflow height of yaml view (#64027) --- .../datasource_to_agent_datasource.test.ts | 36 +++++++++++++++---- .../datasource_to_agent_datasource.ts | 3 +- .../common/types/models/agent_config.ts | 6 ++-- .../details_page/components/yaml/index.tsx | 4 ++- 4 files changed, 38 insertions(+), 11 deletions(-) diff --git a/x-pack/plugins/ingest_manager/common/services/datasource_to_agent_datasource.test.ts b/x-pack/plugins/ingest_manager/common/services/datasource_to_agent_datasource.test.ts index 3496ea782ee99..17509571f1985 100644 --- a/x-pack/plugins/ingest_manager/common/services/datasource_to_agent_datasource.test.ts +++ b/x-pack/plugins/ingest_manager/common/services/datasource_to_agent_datasource.test.ts @@ -3,11 +3,11 @@ * or more contributor license agreements. Licensed under the Elastic License; * you may not use this file except in compliance with the Elastic License. */ -import { NewDatasource, DatasourceInput } from '../types'; +import { Datasource, NewDatasource, DatasourceInput } from '../types'; import { storedDatasourceToAgentDatasource } from './datasource_to_agent_datasource'; describe('Ingest Manager - storedDatasourceToAgentDatasource', () => { - const mockDatasource: NewDatasource = { + const mockNewDatasource: NewDatasource = { name: 'mock-datasource', description: '', config_id: '', @@ -17,6 +17,12 @@ describe('Ingest Manager - storedDatasourceToAgentDatasource', () => { inputs: [], }; + const mockDatasource: Datasource = { + ...mockNewDatasource, + id: 'some-uuid', + revision: 1, + }; + const mockInput: DatasourceInput = { type: 'test-logs', enabled: true, @@ -70,7 +76,8 @@ describe('Ingest Manager - storedDatasourceToAgentDatasource', () => { it('returns agent datasource config for datasource with no inputs', () => { expect(storedDatasourceToAgentDatasource(mockDatasource)).toEqual({ - id: 'mock-datasource', + id: 'some-uuid', + name: 'mock-datasource', namespace: 'default', enabled: true, use_output: 'default', @@ -87,7 +94,8 @@ describe('Ingest Manager - storedDatasourceToAgentDatasource', () => { }, }) ).toEqual({ - id: 'mock-datasource', + id: 'some-uuid', + name: 'mock-datasource', namespace: 'default', enabled: true, use_output: 'default', @@ -99,9 +107,21 @@ describe('Ingest Manager - storedDatasourceToAgentDatasource', () => { }); }); + it('uses name for id when id is not provided in case of new datasource', () => { + expect(storedDatasourceToAgentDatasource(mockNewDatasource)).toEqual({ + id: 'mock-datasource', + name: 'mock-datasource', + namespace: 'default', + enabled: true, + use_output: 'default', + inputs: [], + }); + }); + it('returns agent datasource config with flattened input and package stream', () => { expect(storedDatasourceToAgentDatasource({ ...mockDatasource, inputs: [mockInput] })).toEqual({ - id: 'mock-datasource', + id: 'some-uuid', + name: 'mock-datasource', namespace: 'default', enabled: true, use_output: 'default', @@ -140,7 +160,8 @@ describe('Ingest Manager - storedDatasourceToAgentDatasource', () => { ], }) ).toEqual({ - id: 'mock-datasource', + id: 'some-uuid', + name: 'mock-datasource', namespace: 'default', enabled: true, use_output: 'default', @@ -169,7 +190,8 @@ describe('Ingest Manager - storedDatasourceToAgentDatasource', () => { inputs: [{ ...mockInput, enabled: false }], }) ).toEqual({ - id: 'mock-datasource', + id: 'some-uuid', + name: 'mock-datasource', namespace: 'default', enabled: true, use_output: 'default', diff --git a/x-pack/plugins/ingest_manager/common/services/datasource_to_agent_datasource.ts b/x-pack/plugins/ingest_manager/common/services/datasource_to_agent_datasource.ts index b509878b7f945..9e09d3fa3153a 100644 --- a/x-pack/plugins/ingest_manager/common/services/datasource_to_agent_datasource.ts +++ b/x-pack/plugins/ingest_manager/common/services/datasource_to_agent_datasource.ts @@ -12,7 +12,8 @@ export const storedDatasourceToAgentDatasource = ( const { name, namespace, enabled, package: pkg, inputs } = datasource; const fullDatasource: FullAgentConfigDatasource = { - id: name, + id: 'id' in datasource ? datasource.id : name, + name, namespace, enabled, use_output: DEFAULT_OUTPUT.name, // TODO: hardcoded to default output for now diff --git a/x-pack/plugins/ingest_manager/common/types/models/agent_config.ts b/x-pack/plugins/ingest_manager/common/types/models/agent_config.ts index 002c3784446a8..2372caee512af 100644 --- a/x-pack/plugins/ingest_manager/common/types/models/agent_config.ts +++ b/x-pack/plugins/ingest_manager/common/types/models/agent_config.ts @@ -34,8 +34,10 @@ export interface AgentConfig extends NewAgentConfig, SavedObjectAttributes { revision: number; } -export type FullAgentConfigDatasource = Pick & { - id: string; +export type FullAgentConfigDatasource = Pick< + Datasource, + 'id' | 'name' | 'namespace' | 'enabled' +> & { package?: Pick; use_output: string; inputs: Array< diff --git a/x-pack/plugins/ingest_manager/public/applications/ingest_manager/sections/agent_config/details_page/components/yaml/index.tsx b/x-pack/plugins/ingest_manager/public/applications/ingest_manager/sections/agent_config/details_page/components/yaml/index.tsx index 56b109a9bc062..ad27c590d5eaa 100644 --- a/x-pack/plugins/ingest_manager/public/applications/ingest_manager/sections/agent_config/details_page/components/yaml/index.tsx +++ b/x-pack/plugins/ingest_manager/public/applications/ingest_manager/sections/agent_config/details_page/components/yaml/index.tsx @@ -27,7 +27,9 @@ import { Loading } from '../../../../../components'; const CONFIG_KEYS_ORDER = [ 'id', + 'name', 'revision', + 'type', 'outputs', 'datasources', 'enabled', @@ -52,7 +54,7 @@ export const ConfigYamlView = memo<{ config: AgentConfig }>(({ config }) => { return ( - + {dump(fullConfigRequest.data.item, { sortKeys: (keyA: string, keyB: string) => { const indexA = CONFIG_KEYS_ORDER.indexOf(keyA); From 0c14424321256103abd267975a2ba13b9f727d26 Mon Sep 17 00:00:00 2001 From: Steph Milovic Date: Tue, 21 Apr 2020 10:55:42 -0600 Subject: [PATCH 16/67] [SIEM] [Cases] Tags suggestions (#63878) --- .../pages/case/components/__mock__/form.ts | 6 +++ .../case/components/create/index.test.tsx | 45 ++++++++++++++++- .../pages/case/components/create/index.tsx | 49 ++++++++++++++++++- .../case/components/tag_list/index.test.tsx | 44 ++++++++++++++++- .../pages/case/components/tag_list/index.tsx | 45 +++++++++++++++-- .../user_action_tree/index.test.tsx | 6 +-- .../plugins/siem/public/shared_imports.ts | 2 + 7 files changed, 184 insertions(+), 13 deletions(-) diff --git a/x-pack/legacy/plugins/siem/public/pages/case/components/__mock__/form.ts b/x-pack/legacy/plugins/siem/public/pages/case/components/__mock__/form.ts index 9d2ac29bc47d7..cc01edcfaab11 100644 --- a/x-pack/legacy/plugins/siem/public/pages/case/components/__mock__/form.ts +++ b/x-pack/legacy/plugins/siem/public/pages/case/components/__mock__/form.ts @@ -3,6 +3,10 @@ * or more contributor license agreements. Licensed under the Elastic License; * you may not use this file except in compliance with the Elastic License. */ +import { useForm } from '../../../../../../../../../src/plugins/es_ui_shared/static/forms/hook_form_lib/hooks'; +jest.mock( + '../../../../../../../../../src/plugins/es_ui_shared/static/forms/hook_form_lib/hooks/use_form' +); export const mockFormHook = { isSubmitted: false, isSubmitting: false, @@ -35,3 +39,5 @@ export const getFormMock = (sampleData: any) => ({ }), getFormData: () => sampleData, }); + +export const useFormMock = useForm as jest.Mock; diff --git a/x-pack/legacy/plugins/siem/public/pages/case/components/create/index.test.tsx b/x-pack/legacy/plugins/siem/public/pages/case/components/create/index.test.tsx index d480744fc932a..0897be6310fa2 100644 --- a/x-pack/legacy/plugins/siem/public/pages/case/components/create/index.test.tsx +++ b/x-pack/legacy/plugins/siem/public/pages/case/components/create/index.test.tsx @@ -14,6 +14,8 @@ import { Router, routeData, mockHistory, mockLocation } from '../__mock__/router import { useInsertTimeline } from '../../../../components/timeline/insert_timeline_popover/use_insert_timeline'; import { usePostCase } from '../../../../containers/case/use_post_case'; +import { useGetTags } from '../../../../containers/case/use_get_tags'; + jest.mock('../../../../components/timeline/insert_timeline_popover/use_insert_timeline'); jest.mock('../../../../containers/case/use_post_case'); import { useForm } from '../../../../../../../../../src/plugins/es_ui_shared/static/forms/hook_form_lib/hooks'; @@ -22,6 +24,14 @@ import { SiemPageName } from '../../../home/types'; jest.mock( '../../../../../../../../../src/plugins/es_ui_shared/static/forms/hook_form_lib/hooks/use_form' ); +jest.mock('../../../../containers/case/use_get_tags'); +jest.mock( + '../../../../../../../../../src/plugins/es_ui_shared/static/forms/hook_form_lib/components/form_data_provider', + () => ({ + FormDataProvider: ({ children }: { children: ({ tags }: { tags: string[] }) => void }) => + children({ tags: ['rad', 'dude'] }), + }) +); export const useFormMock = useForm as jest.Mock; @@ -40,9 +50,11 @@ const defaultInsertTimeline = { handleCursorChange, handleOnTimelineChange, }; + +const sampleTags = ['coke', 'pepsi']; const sampleData = { description: 'what a great description', - tags: ['coke', 'pepsi'], + tags: sampleTags, title: 'what a cool title', }; const defaultPostCase = { @@ -52,14 +64,28 @@ const defaultPostCase = { postCase, }; describe('Create case', () => { + // Suppress warnings about "noSuggestions" prop + /* eslint-disable no-console */ + const originalError = console.error; + beforeAll(() => { + console.error = jest.fn(); + }); + afterAll(() => { + console.error = originalError; + }); + /* eslint-enable no-console */ + const fetchTags = jest.fn(); const formHookMock = getFormMock(sampleData); - beforeEach(() => { jest.resetAllMocks(); useInsertTimelineMock.mockImplementation(() => defaultInsertTimeline); usePostCaseMock.mockImplementation(() => defaultPostCase); useFormMock.mockImplementation(() => ({ form: formHookMock })); jest.spyOn(routeData, 'useLocation').mockReturnValue(mockLocation); + (useGetTags as jest.Mock).mockImplementation(() => ({ + tags: sampleTags, + fetchTags, + })); }); it('should post case on submit click', async () => { @@ -118,4 +144,19 @@ describe('Create case', () => { ); expect(wrapper.find(`[data-test-subj="create-case-loading-spinner"]`).exists()).toBeTruthy(); }); + it('Tag options render with new tags added', () => { + const wrapper = mount( + + + + + + ); + expect( + wrapper + .find(`[data-test-subj="caseTags"] [data-test-subj="input"]`) + .first() + .prop('options') + ).toEqual([{ label: 'coke' }, { label: 'pepsi' }, { label: 'rad' }, { label: 'dude' }]); + }); }); diff --git a/x-pack/legacy/plugins/siem/public/pages/case/components/create/index.tsx b/x-pack/legacy/plugins/siem/public/pages/case/components/create/index.tsx index 53b792bb9b5eb..0f819f961b396 100644 --- a/x-pack/legacy/plugins/siem/public/pages/case/components/create/index.tsx +++ b/x-pack/legacy/plugins/siem/public/pages/case/components/create/index.tsx @@ -3,7 +3,7 @@ * or more contributor license agreements. Licensed under the Elastic License; * you may not use this file except in compliance with the Elastic License. */ -import React, { useCallback, useState } from 'react'; +import React, { useCallback, useEffect, useState } from 'react'; import { EuiButton, EuiButtonEmpty, @@ -15,8 +15,16 @@ import { import styled, { css } from 'styled-components'; import { Redirect } from 'react-router-dom'; +import { isEqual } from 'lodash/fp'; import { CasePostRequest } from '../../../../../../../../plugins/case/common/api'; -import { Field, Form, getUseField, useForm, UseField } from '../../../../shared_imports'; +import { + Field, + Form, + getUseField, + useForm, + UseField, + FormDataProvider, +} from '../../../../shared_imports'; import { usePostCase } from '../../../../containers/case/use_post_case'; import { schema } from './schema'; import { InsertTimelinePopover } from '../../../../components/timeline/insert_timeline_popover'; @@ -24,6 +32,7 @@ import { useInsertTimeline } from '../../../../components/timeline/insert_timeli import * as i18n from '../../translations'; import { SiemPageName } from '../../../home/types'; import { MarkdownEditorForm } from '../../../../components/markdown_editor/form'; +import { useGetTags } from '../../../../containers/case/use_get_tags'; export const CommonUseField = getUseField({ component: Field }); @@ -59,6 +68,21 @@ export const Create = React.memo(() => { options: { stripEmptyFields: false }, schema, }); + const { tags: tagOptions } = useGetTags(); + const [options, setOptions] = useState( + tagOptions.map(label => ({ + label, + })) + ); + useEffect( + () => + setOptions( + tagOptions.map(label => ({ + label, + })) + ), + [tagOptions] + ); const { handleCursorChange, handleOnTimelineChange } = useInsertTimeline( form, 'description' @@ -108,6 +132,8 @@ export const Create = React.memo(() => { fullWidth: true, placeholder: '', disabled: isLoading, + options, + noSuggestions: false, }, }} /> @@ -131,6 +157,25 @@ export const Create = React.memo(() => { }} /> + + {({ tags: anotherTags }) => { + const current: string[] = options.map(opt => opt.label); + const newOptions = anotherTags.reduce((acc: string[], item: string) => { + if (!acc.includes(item)) { + return [...acc, item]; + } + return acc; + }, current); + if (!isEqual(current, newOptions)) { + setOptions( + newOptions.map((label: string) => ({ + label, + })) + ); + } + return null; + }} + ({ + FormDataProvider: ({ children }: { children: ({ tags }: { tags: string[] }) => void }) => + children({ tags: ['rad', 'dude'] }), + }) +); const onSubmit = jest.fn(); const defaultProps = { disabled: false, @@ -26,11 +35,27 @@ const defaultProps = { }; describe('TagList ', () => { + // Suppress warnings about "noSuggestions" prop + /* eslint-disable no-console */ + const originalError = console.error; + beforeAll(() => { + console.error = jest.fn(); + }); + afterAll(() => { + console.error = originalError; + }); + /* eslint-enable no-console */ const sampleTags = ['coke', 'pepsi']; + const fetchTags = jest.fn(); const formHookMock = getFormMock({ tags: sampleTags }); beforeEach(() => { jest.resetAllMocks(); (useForm as jest.Mock).mockImplementation(() => ({ form: formHookMock })); + + (useGetTags as jest.Mock).mockImplementation(() => ({ + tags: sampleTags, + fetchTags, + })); }); it('Renders no tags, and then edit', () => { const wrapper = mount( @@ -80,6 +105,23 @@ describe('TagList ', () => { expect(onSubmit).toBeCalledWith(sampleTags); }); }); + it('Tag options render with new tags added', () => { + const wrapper = mount( + + + + ); + wrapper + .find(`[data-test-subj="tag-list-edit-button"]`) + .last() + .simulate('click'); + expect( + wrapper + .find(`[data-test-subj="caseTags"] [data-test-subj="input"]`) + .first() + .prop('options') + ).toEqual([{ label: 'coke' }, { label: 'pepsi' }, { label: 'rad' }, { label: 'dude' }]); + }); it('Cancels on cancel', async () => { const props = { ...defaultProps, diff --git a/x-pack/legacy/plugins/siem/public/pages/case/components/tag_list/index.tsx b/x-pack/legacy/plugins/siem/public/pages/case/components/tag_list/index.tsx index 9bac000b93235..c96ae09706426 100644 --- a/x-pack/legacy/plugins/siem/public/pages/case/components/tag_list/index.tsx +++ b/x-pack/legacy/plugins/siem/public/pages/case/components/tag_list/index.tsx @@ -4,7 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ -import React, { useCallback, useState } from 'react'; +import React, { useCallback, useEffect, useState } from 'react'; import { EuiText, EuiHorizontalRule, @@ -17,10 +17,12 @@ import { EuiLoadingSpinner, } from '@elastic/eui'; import styled, { css } from 'styled-components'; +import { isEqual } from 'lodash/fp'; import * as i18n from './translations'; -import { Form, useForm } from '../../../../shared_imports'; +import { Form, FormDataProvider, useForm } from '../../../../shared_imports'; import { schema } from './schema'; import { CommonUseField } from '../create'; +import { useGetTags } from '../../../../containers/case/use_get_tags'; interface TagListProps { disabled?: boolean; @@ -54,6 +56,22 @@ export const TagList = React.memo( setIsEditTags(false); } }, [form, onSubmit]); + const { tags: tagOptions } = useGetTags(); + const [options, setOptions] = useState( + tagOptions.map(label => ({ + label, + })) + ); + + useEffect( + () => + setOptions( + tagOptions.map(label => ({ + label, + })) + ), + [tagOptions] + ); return ( @@ -75,7 +93,7 @@ export const TagList = React.memo( )} - + {tags.length === 0 && !isEditTags &&

{i18n.NO_TAGS}

} {tags.length > 0 && !isEditTags && @@ -98,9 +116,30 @@ export const TagList = React.memo( euiFieldProps: { fullWidth: true, placeholder: '', + options, + noSuggestions: false, }, }} /> + + {({ tags: anotherTags }) => { + const current: string[] = options.map(opt => opt.label); + const newOptions = anotherTags.reduce((acc: string[], item: string) => { + if (!acc.includes(item)) { + return [...acc, item]; + } + return acc; + }, current); + if (!isEqual(current, newOptions)) { + setOptions( + newOptions.map((label: string) => ({ + label, + })) + ); + } + return null; + }} + diff --git a/x-pack/legacy/plugins/siem/public/pages/case/components/user_action_tree/index.test.tsx b/x-pack/legacy/plugins/siem/public/pages/case/components/user_action_tree/index.test.tsx index 1c71260422d4b..ff402e8ea1c8b 100644 --- a/x-pack/legacy/plugins/siem/public/pages/case/components/user_action_tree/index.test.tsx +++ b/x-pack/legacy/plugins/siem/public/pages/case/components/user_action_tree/index.test.tsx @@ -8,17 +8,13 @@ import React from 'react'; import { mount } from 'enzyme'; import { Router, routeData, mockHistory, mockLocation } from '../__mock__/router'; -import { getFormMock } from '../__mock__/form'; +import { getFormMock, useFormMock } from '../__mock__/form'; import { useUpdateComment } from '../../../../containers/case/use_update_comment'; import { basicCase, getUserAction } from '../../../../containers/case/mock'; import { UserActionTree } from './'; import { TestProviders } from '../../../../mock'; -import { useFormMock } from '../create/index.test'; import { wait } from '../../../../lib/helpers'; import { act } from 'react-dom/test-utils'; -jest.mock( - '../../../../../../../../../src/plugins/es_ui_shared/static/forms/hook_form_lib/hooks/use_form' -); const fetchUserActions = jest.fn(); const onUpdateField = jest.fn(); diff --git a/x-pack/legacy/plugins/siem/public/shared_imports.ts b/x-pack/legacy/plugins/siem/public/shared_imports.ts index c83433ef129c9..0c0ac637a4229 100644 --- a/x-pack/legacy/plugins/siem/public/shared_imports.ts +++ b/x-pack/legacy/plugins/siem/public/shared_imports.ts @@ -8,6 +8,7 @@ export { getUseField, getFieldValidityAndErrorMessage, FieldHook, + FieldValidateResponse, FIELD_TYPES, Form, FormData, @@ -17,6 +18,7 @@ export { UseField, useForm, ValidationFunc, + VALIDATION_TYPES, } from '../../../../../src/plugins/es_ui_shared/static/forms/hook_form_lib'; export { Field, From b7aab690f4007fa66e120a2d2dde3f6215c21a17 Mon Sep 17 00:00:00 2001 From: Ben Skelker <54019610+benskelker@users.noreply.github.com> Date: Tue, 21 Apr 2020 20:14:25 +0300 Subject: [PATCH 17/67] [Docs]7.7 SIEM doc updates (#63951) * SIEM section doc updates * corrections * more corrections --- docs/management/advanced-options.asciidoc | 2 ++ docs/siem/images/cases-ui.png | Bin 0 -> 312096 bytes docs/siem/siem-ui.asciidoc | 18 +++++++++++++++++- 3 files changed, 19 insertions(+), 1 deletion(-) create mode 100644 docs/siem/images/cases-ui.png diff --git a/docs/management/advanced-options.asciidoc b/docs/management/advanced-options.asciidoc index f62a4d28dfc0d..7081590931a99 100644 --- a/docs/management/advanced-options.asciidoc +++ b/docs/management/advanced-options.asciidoc @@ -217,6 +217,8 @@ might increase the search time. This setting is off by default. Users must opt-i [horizontal] `siem:defaultAnomalyScore`:: The threshold above which Machine Learning job anomalies are displayed in the SIEM app. `siem:defaultIndex`:: A comma-delimited list of Elasticsearch indices from which the SIEM app collects events. +`siem:ipReputationLinks`:: A JSON array containing links for verifying the reputation of an IP address. The links are displayed on +{siem-guide}/siem-ui-overview.html#network-ui[IP detail] pages. `siem:enableNewsFeed`:: Enables the security news feed on the SIEM *Overview* page. `siem:newsFeedUrl`:: The URL from which the security news feed content is diff --git a/docs/siem/images/cases-ui.png b/docs/siem/images/cases-ui.png new file mode 100644 index 0000000000000000000000000000000000000000..b513efb6647407801733be975c6c1c8d0fc2a420 GIT binary patch literal 312096 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%0ATctif&rE_w5iAW-AteqWx_9mA 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

u<^4h}^zlq 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

Default refresh interval for the SIEM time filter, in milliseconds.

', - }), - category: ['siem'], - requiresPageReload: true, - }, - [DEFAULT_SIEM_TIME_RANGE]: { - type: 'json', - name: i18n.translate('xpack.siem.uiSettings.defaultTimeRangeLabel', { - defaultMessage: 'Time filter period', - }), - value: `{ - "from": "${DEFAULT_FROM}", - "to": "${DEFAULT_TO}" -}`, - description: i18n.translate('xpack.siem.uiSettings.defaultTimeRangeDescription', { - defaultMessage: '

Default period of time in the SIEM time filter.

', - }), - category: ['siem'], - requiresPageReload: true, - }, - [DEFAULT_INDEX_KEY]: { - name: i18n.translate('xpack.siem.uiSettings.defaultIndexLabel', { - defaultMessage: 'Elasticsearch indices', - }), - value: DEFAULT_INDEX_PATTERN, - description: i18n.translate('xpack.siem.uiSettings.defaultIndexDescription', { - defaultMessage: - '

Comma-delimited list of Elasticsearch indices from which the SIEM app collects events.

', - }), - category: ['siem'], - requiresPageReload: true, - }, - [DEFAULT_ANOMALY_SCORE]: { - name: i18n.translate('xpack.siem.uiSettings.defaultAnomalyScoreLabel', { - defaultMessage: 'Anomaly threshold', - }), - value: 50, - type: 'number', - description: i18n.translate('xpack.siem.uiSettings.defaultAnomalyScoreDescription', { - defaultMessage: - '

Value above which Machine Learning job anomalies are displayed in the SIEM app.

Valid values: 0 to 100.

', - }), - category: ['siem'], - requiresPageReload: true, - }, - [ENABLE_NEWS_FEED_SETTING]: { - name: i18n.translate('xpack.siem.uiSettings.enableNewsFeedLabel', { - defaultMessage: 'News feed', - }), - value: true, - description: i18n.translate('xpack.siem.uiSettings.enableNewsFeedDescription', { - defaultMessage: '

Enables the News feed

', - }), - type: 'boolean', - category: ['siem'], - requiresPageReload: true, - }, - [NEWS_FEED_URL_SETTING]: { - name: i18n.translate('xpack.siem.uiSettings.newsFeedUrl', { - defaultMessage: 'News feed URL', - }), - value: NEWS_FEED_URL_SETTING_DEFAULT, - description: i18n.translate('xpack.siem.uiSettings.newsFeedUrlDescription', { - defaultMessage: '

News feed content will be retrieved from this URL

', - }), - category: ['siem'], - requiresPageReload: true, - }, - [IP_REPUTATION_LINKS_SETTING]: { - name: i18n.translate('xpack.siem.uiSettings.ipReputationLinks', { - defaultMessage: 'IP Reputation Links', - }), - value: IP_REPUTATION_LINKS_SETTING_DEFAULT, - type: 'json', - description: i18n.translate('xpack.siem.uiSettings.ipReputationLinksDescription', { - defaultMessage: - 'Array of URL templates to build the list of reputation URLs to be displayed on the IP Details page.', - }), - category: ['siem'], - requiresPageReload: true, - }, - }, mappings: savedObjectMappings, }, config(Joi: Root) { diff --git a/x-pack/plugins/siem/server/plugin.ts b/x-pack/plugins/siem/server/plugin.ts index b9ec1c2e92438..29a6999025e1f 100644 --- a/x-pack/plugins/siem/server/plugin.ts +++ b/x-pack/plugins/siem/server/plugin.ts @@ -42,6 +42,7 @@ import { } from './saved_objects'; import { SiemClientFactory } from './client'; import { createConfig$, ConfigType } from './config'; +import { initUiSettings } from './ui_settings'; export { CoreSetup, CoreStart }; @@ -86,6 +87,8 @@ export class Plugin { ); } + initUiSettings(core.uiSettings); + const router = core.http.createRouter(); core.http.registerRouteHandlerContext(this.name, (context, request, response) => ({ getSiemClient: () => this.siemClientFactory.create(request), diff --git a/x-pack/plugins/siem/server/ui_settings.ts b/x-pack/plugins/siem/server/ui_settings.ts new file mode 100644 index 0000000000000..26b7fd72571af --- /dev/null +++ b/x-pack/plugins/siem/server/ui_settings.ts @@ -0,0 +1,141 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { i18n } from '@kbn/i18n'; +import { schema } from '@kbn/config-schema'; + +import { CoreSetup } from '../../../../src/core/server'; +import { + DEFAULT_INDEX_KEY, + DEFAULT_INDEX_PATTERN, + DEFAULT_ANOMALY_SCORE, + DEFAULT_SIEM_TIME_RANGE, + DEFAULT_SIEM_REFRESH_INTERVAL, + DEFAULT_INTERVAL_PAUSE, + DEFAULT_INTERVAL_VALUE, + DEFAULT_FROM, + DEFAULT_TO, + ENABLE_NEWS_FEED_SETTING, + NEWS_FEED_URL_SETTING, + NEWS_FEED_URL_SETTING_DEFAULT, + IP_REPUTATION_LINKS_SETTING, + IP_REPUTATION_LINKS_SETTING_DEFAULT, +} from '../common/constants'; + +export const initUiSettings = (uiSettings: CoreSetup['uiSettings']) => { + uiSettings.register({ + [DEFAULT_SIEM_REFRESH_INTERVAL]: { + type: 'json', + name: i18n.translate('xpack.siem.uiSettings.defaultRefreshIntervalLabel', { + defaultMessage: 'Time filter refresh interval', + }), + value: `{ + "pause": ${DEFAULT_INTERVAL_PAUSE}, + "value": ${DEFAULT_INTERVAL_VALUE} +}`, + description: i18n.translate('xpack.siem.uiSettings.defaultRefreshIntervalDescription', { + defaultMessage: + '

Default refresh interval for the SIEM time filter, in milliseconds.

', + }), + category: ['siem'], + requiresPageReload: true, + schema: schema.object({ + value: schema.number(), + pause: schema.boolean(), + }), + }, + [DEFAULT_SIEM_TIME_RANGE]: { + type: 'json', + name: i18n.translate('xpack.siem.uiSettings.defaultTimeRangeLabel', { + defaultMessage: 'Time filter period', + }), + value: `{ + "from": "${DEFAULT_FROM}", + "to": "${DEFAULT_TO}" +}`, + description: i18n.translate('xpack.siem.uiSettings.defaultTimeRangeDescription', { + defaultMessage: '

Default period of time in the SIEM time filter.

', + }), + category: ['siem'], + requiresPageReload: true, + schema: schema.object({ + from: schema.string(), + to: schema.string(), + }), + }, + [DEFAULT_INDEX_KEY]: { + name: i18n.translate('xpack.siem.uiSettings.defaultIndexLabel', { + defaultMessage: 'Elasticsearch indices', + }), + value: DEFAULT_INDEX_PATTERN, + description: i18n.translate('xpack.siem.uiSettings.defaultIndexDescription', { + defaultMessage: + '

Comma-delimited list of Elasticsearch indices from which the SIEM app collects events.

', + }), + category: ['siem'], + requiresPageReload: true, + schema: schema.arrayOf(schema.string()), + }, + [DEFAULT_ANOMALY_SCORE]: { + name: i18n.translate('xpack.siem.uiSettings.defaultAnomalyScoreLabel', { + defaultMessage: 'Anomaly threshold', + }), + value: 50, + type: 'number', + description: i18n.translate('xpack.siem.uiSettings.defaultAnomalyScoreDescription', { + defaultMessage: + '

Value above which Machine Learning job anomalies are displayed in the SIEM app.

Valid values: 0 to 100.

', + }), + category: ['siem'], + requiresPageReload: true, + schema: schema.number(), + }, + [ENABLE_NEWS_FEED_SETTING]: { + name: i18n.translate('xpack.siem.uiSettings.enableNewsFeedLabel', { + defaultMessage: 'News feed', + }), + value: true, + description: i18n.translate('xpack.siem.uiSettings.enableNewsFeedDescription', { + defaultMessage: '

Enables the News feed

', + }), + type: 'boolean', + category: ['siem'], + requiresPageReload: true, + schema: schema.boolean(), + }, + [NEWS_FEED_URL_SETTING]: { + name: i18n.translate('xpack.siem.uiSettings.newsFeedUrl', { + defaultMessage: 'News feed URL', + }), + value: NEWS_FEED_URL_SETTING_DEFAULT, + description: i18n.translate('xpack.siem.uiSettings.newsFeedUrlDescription', { + defaultMessage: '

News feed content will be retrieved from this URL

', + }), + category: ['siem'], + requiresPageReload: true, + schema: schema.string(), + }, + [IP_REPUTATION_LINKS_SETTING]: { + name: i18n.translate('xpack.siem.uiSettings.ipReputationLinks', { + defaultMessage: 'IP Reputation Links', + }), + value: IP_REPUTATION_LINKS_SETTING_DEFAULT, + type: 'json', + description: i18n.translate('xpack.siem.uiSettings.ipReputationLinksDescription', { + defaultMessage: + 'Array of URL templates to build the list of reputation URLs to be displayed on the IP Details page.', + }), + category: ['siem'], + requiresPageReload: true, + schema: schema.arrayOf( + schema.object({ + name: schema.string(), + url_template: schema.string(), + }) + ), + }, + }); +}; From ff5971ac170ce557fb6b1563af4e2ee442216791 Mon Sep 17 00:00:00 2001 From: Ryland Herrick Date: Tue, 21 Apr 2020 14:27:10 -0500 Subject: [PATCH 20/67] [SIEM] Server NP Followup (#64010) * Remove unused file This was moved to a constant in common/constants. * Remove unused types Omit is now part of Typescript, and Pick3 is unused. * Define and export SIEM's plugin contracts They're empty for now. * Import config type from config file Instead of our plugin index, which could only cause circular dependencies. * SiemClient API uses getter function instead of direct property access * Add public mock for SiemClient * Fix typo in extract-mitre-attacks script We were backgrounding the process (&) instead of ANDing it with the linting. Whoops! * Remove missed instance of old siemClient API I missed this one when grepping, but typescript and CI saved me. * Use our client mock in our test suite This was causing some test failures as I forgot to update the client mock * Update script following updates to the output's usage This was changed in https://github.com/elastic/kibana/pull/55883 but the script was not updated accordingly. --- .../siem/common/default_index_pattern.ts | 15 --------------- x-pack/plugins/siem/common/utility_types.ts | 6 ------ x-pack/plugins/siem/package.json | 2 +- .../scripts/extract_tactics_techniques_mitre.js | 2 +- .../plugins/siem/server/client/client.test.ts | 4 ++-- x-pack/plugins/siem/server/client/client.ts | 6 ++++-- x-pack/plugins/siem/server/client/factory.ts | 2 +- x-pack/plugins/siem/server/index.ts | 4 ++-- .../routes/__mocks__/request_context.ts | 3 ++- .../routes/index/create_index_route.ts | 2 +- .../routes/index/delete_index_route.ts | 2 +- .../routes/index/read_index_route.ts | 2 +- .../routes/privileges/read_privileges_route.ts | 2 +- .../routes/rules/add_prepackaged_rules_route.ts | 2 +- .../routes/rules/create_rules_bulk_route.ts | 2 +- .../routes/rules/create_rules_route.ts | 2 +- .../routes/rules/export_rules_route.ts | 2 +- .../routes/rules/import_rules_route.test.ts | 1 + .../routes/rules/import_rules_route.ts | 4 ++-- .../routes/rules/update_rules_bulk_route.ts | 2 +- .../routes/rules/update_rules_route.ts | 2 +- .../routes/signals/open_close_signals_route.ts | 2 +- .../routes/signals/query_signals_route.ts | 2 +- .../timeline/routes/export_timelines_route.ts | 2 +- .../timeline/routes/import_timelines_route.ts | 2 +- x-pack/plugins/siem/server/lib/types.ts | 2 +- x-pack/plugins/siem/server/mocks.ts | 17 +++++++++++++++++ x-pack/plugins/siem/server/plugin.ts | 14 ++++++++++++-- x-pack/plugins/siem/server/routes/index.ts | 2 +- 29 files changed, 61 insertions(+), 51 deletions(-) delete mode 100644 x-pack/plugins/siem/common/default_index_pattern.ts create mode 100644 x-pack/plugins/siem/server/mocks.ts diff --git a/x-pack/plugins/siem/common/default_index_pattern.ts b/x-pack/plugins/siem/common/default_index_pattern.ts deleted file mode 100644 index 4d53aeb000c55..0000000000000 --- a/x-pack/plugins/siem/common/default_index_pattern.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. - */ - -/** The comma-delimited list of Elasticsearch indices from which the SIEM app collects events */ -export const defaultIndexPattern = [ - 'apm-*-transaction*', - 'auditbeat-*', - 'endgame-*', - 'filebeat-*', - 'packetbeat-*', - 'winlogbeat-*', -]; diff --git a/x-pack/plugins/siem/common/utility_types.ts b/x-pack/plugins/siem/common/utility_types.ts index c7bbdbfccf082..b46ccdbbe3d05 100644 --- a/x-pack/plugins/siem/common/utility_types.ts +++ b/x-pack/plugins/siem/common/utility_types.ts @@ -6,12 +6,6 @@ import { ReactNode } from 'react'; -export type Pick3 = { - [P1 in K1]: { [P2 in K2]: { [P3 in K3]: T[K1][K2][P3] } }; -}; - -export type Omit = Pick>; - // This type is for typing EuiDescriptionList export interface DescriptionList { title: NonNullable; diff --git a/x-pack/plugins/siem/package.json b/x-pack/plugins/siem/package.json index 1fcef46243628..31c930dce71c0 100644 --- a/x-pack/plugins/siem/package.json +++ b/x-pack/plugins/siem/package.json @@ -5,7 +5,7 @@ "private": true, "license": "Elastic-License", "scripts": { - "extract-mitre-attacks": "node scripts/extract_tactics_techniques_mitre.js & node ../../../scripts/eslint ../../legacy/plugins/siem/public/pages/detection_engine/mitre/mitre_tactics_techniques.ts --fix", + "extract-mitre-attacks": "node scripts/extract_tactics_techniques_mitre.js && node ../../../scripts/eslint ../../legacy/plugins/siem/public/pages/detection_engine/mitre/mitre_tactics_techniques.ts --fix", "build-graphql-types": "node scripts/generate_types_from_graphql.js", "cypress:open": "cypress open --config-file ./cypress/cypress.json", "cypress:run": "cypress run --spec ./cypress/integration/**/*.spec.ts --config-file ./cypress/cypress.json --reporter ../../node_modules/cypress-multi-reporters --reporter-options configFile=./cypress/reporter_config.json; status=$?; ../../node_modules/.bin/mochawesome-merge --reportDir ../../../target/kibana-siem/cypress/results > ../../../target/kibana-siem/cypress/results/output.json; ../../../node_modules/.bin/marge ../../../target/kibana-siem/cypress/results/output.json --reportDir ../../../target/kibana-siem/cypress/results; mkdir -p ../../../target/junit && cp ../../../target/kibana-siem/cypress/results/*.xml ../../../target/junit/ && exit $status;", diff --git a/x-pack/plugins/siem/scripts/extract_tactics_techniques_mitre.js b/x-pack/plugins/siem/scripts/extract_tactics_techniques_mitre.js index 478463b1a8064..145d9715970c8 100644 --- a/x-pack/plugins/siem/scripts/extract_tactics_techniques_mitre.js +++ b/x-pack/plugins/siem/scripts/extract_tactics_techniques_mitre.js @@ -123,7 +123,7 @@ async function main() { .replace(/}"/g, '}') .replace(/"{/g, '{')}; - export const techniques = ${JSON.stringify(techniques, null, 2)}; + export const technique = ${JSON.stringify(techniques, null, 2)}; export const techniquesOptions: MitreTechniquesOptions[] = ${JSON.stringify(getTechniquesOptions(techniques), null, 2) diff --git a/x-pack/plugins/siem/server/client/client.test.ts b/x-pack/plugins/siem/server/client/client.test.ts index 94ff2149b8c64..c0ae15cb73f4e 100644 --- a/x-pack/plugins/siem/server/client/client.test.ts +++ b/x-pack/plugins/siem/server/client/client.test.ts @@ -9,7 +9,7 @@ import { createMockConfig } from '../lib/detection_engine/routes/__mocks__'; import { SiemClient } from './client'; describe('SiemClient', () => { - describe('#signalsIndex', () => { + describe('#getSignalsIndex', () => { it('returns the index scoped to the specified spaceId', () => { const mockConfig = { ...createMockConfig(), @@ -18,7 +18,7 @@ describe('SiemClient', () => { const spaceId = 'fooSpace'; const client = new SiemClient(spaceId, mockConfig); - expect(client.signalsIndex).toEqual('mockSignalsIndex-fooSpace'); + expect(client.getSignalsIndex()).toEqual('mockSignalsIndex-fooSpace'); }); }); }); diff --git a/x-pack/plugins/siem/server/client/client.ts b/x-pack/plugins/siem/server/client/client.ts index 6cb0d4cfade77..5780bb4173f79 100644 --- a/x-pack/plugins/siem/server/client/client.ts +++ b/x-pack/plugins/siem/server/client/client.ts @@ -4,14 +4,16 @@ * you may not use this file except in compliance with the Elastic License. */ -import { ConfigType } from '..'; +import { ConfigType } from '../config'; export class SiemClient { - public readonly signalsIndex: string; + private readonly signalsIndex: string; constructor(private spaceId: string, private config: ConfigType) { const configuredSignalsIndex = this.config.signalsIndex; this.signalsIndex = `${configuredSignalsIndex}-${this.spaceId}`; } + + public getSignalsIndex = (): string => this.signalsIndex; } diff --git a/x-pack/plugins/siem/server/client/factory.ts b/x-pack/plugins/siem/server/client/factory.ts index d3d6b84e5b090..69db4d7eed98f 100644 --- a/x-pack/plugins/siem/server/client/factory.ts +++ b/x-pack/plugins/siem/server/client/factory.ts @@ -6,7 +6,7 @@ import { KibanaRequest } from '../../../../../src/core/server'; import { SiemClient } from './client'; -import { ConfigType } from '..'; +import { ConfigType } from '../config'; interface SetupDependencies { getSpaceId?: (request: KibanaRequest) => string | undefined; diff --git a/x-pack/plugins/siem/server/index.ts b/x-pack/plugins/siem/server/index.ts index 83e2f900a3b90..e9cd78589fac9 100644 --- a/x-pack/plugins/siem/server/index.ts +++ b/x-pack/plugins/siem/server/index.ts @@ -5,7 +5,7 @@ */ import { PluginInitializerContext } from '../../../../src/core/server'; -import { Plugin } from './plugin'; +import { Plugin, PluginSetup, PluginStart } from './plugin'; import { configSchema, ConfigType } from './config'; export const plugin = (context: PluginInitializerContext) => { @@ -14,4 +14,4 @@ export const plugin = (context: PluginInitializerContext) => { export const config = { schema: configSchema }; -export { ConfigType }; +export { ConfigType, Plugin, PluginSetup, PluginStart }; diff --git a/x-pack/plugins/siem/server/lib/detection_engine/routes/__mocks__/request_context.ts b/x-pack/plugins/siem/server/lib/detection_engine/routes/__mocks__/request_context.ts index 10efdb518f7b7..f3b4068f6dd2d 100644 --- a/x-pack/plugins/siem/server/lib/detection_engine/routes/__mocks__/request_context.ts +++ b/x-pack/plugins/siem/server/lib/detection_engine/routes/__mocks__/request_context.ts @@ -13,6 +13,7 @@ import { import { alertsClientMock } from '../../../../../../alerting/server/mocks'; import { actionsClientMock } from '../../../../../../actions/server/mocks'; import { licensingMock } from '../../../../../../licensing/server/mocks'; +import { siemMock } from '../../../../mocks'; const createMockClients = () => ({ actionsClient: actionsClientMock.create(), @@ -20,7 +21,7 @@ const createMockClients = () => ({ clusterClient: elasticsearchServiceMock.createScopedClusterClient(), licensing: { license: licensingMock.createLicenseMock() }, savedObjectsClient: savedObjectsClientMock.create(), - siemClient: { signalsIndex: 'mockSignalsIndex' }, + siemClient: siemMock.createClient(), }); const createRequestContextMock = ( diff --git a/x-pack/plugins/siem/server/lib/detection_engine/routes/index/create_index_route.ts b/x-pack/plugins/siem/server/lib/detection_engine/routes/index/create_index_route.ts index cb48e35228858..20b8ad29d2715 100644 --- a/x-pack/plugins/siem/server/lib/detection_engine/routes/index/create_index_route.ts +++ b/x-pack/plugins/siem/server/lib/detection_engine/routes/index/create_index_route.ts @@ -37,7 +37,7 @@ export const createIndexRoute = (router: IRouter) => { return siemResponse.error({ statusCode: 404 }); } - const index = siemClient.signalsIndex; + const index = siemClient.getSignalsIndex(); const indexExists = await getIndexExists(callCluster, index); if (indexExists) { return siemResponse.error({ diff --git a/x-pack/plugins/siem/server/lib/detection_engine/routes/index/delete_index_route.ts b/x-pack/plugins/siem/server/lib/detection_engine/routes/index/delete_index_route.ts index 5eff38b778492..79cf4851f9ab8 100644 --- a/x-pack/plugins/siem/server/lib/detection_engine/routes/index/delete_index_route.ts +++ b/x-pack/plugins/siem/server/lib/detection_engine/routes/index/delete_index_route.ts @@ -45,7 +45,7 @@ export const deleteIndexRoute = (router: IRouter) => { } const callCluster = clusterClient.callAsCurrentUser; - const index = siemClient.signalsIndex; + const index = siemClient.getSignalsIndex(); const indexExists = await getIndexExists(callCluster, index); if (!indexExists) { diff --git a/x-pack/plugins/siem/server/lib/detection_engine/routes/index/read_index_route.ts b/x-pack/plugins/siem/server/lib/detection_engine/routes/index/read_index_route.ts index 8ff8d7461ecd1..2b418892f0f39 100644 --- a/x-pack/plugins/siem/server/lib/detection_engine/routes/index/read_index_route.ts +++ b/x-pack/plugins/siem/server/lib/detection_engine/routes/index/read_index_route.ts @@ -29,7 +29,7 @@ export const readIndexRoute = (router: IRouter) => { return siemResponse.error({ statusCode: 404 }); } - const index = siemClient.signalsIndex; + const index = siemClient.getSignalsIndex(); const indexExists = await getIndexExists(clusterClient.callAsCurrentUser, index); if (indexExists) { diff --git a/x-pack/plugins/siem/server/lib/detection_engine/routes/privileges/read_privileges_route.ts b/x-pack/plugins/siem/server/lib/detection_engine/routes/privileges/read_privileges_route.ts index 7dbbe837e656d..e3c41c555f297 100644 --- a/x-pack/plugins/siem/server/lib/detection_engine/routes/privileges/read_privileges_route.ts +++ b/x-pack/plugins/siem/server/lib/detection_engine/routes/privileges/read_privileges_route.ts @@ -36,7 +36,7 @@ export const readPrivilegesRoute = ( return siemResponse.error({ statusCode: 404 }); } - const index = siemClient.signalsIndex; + const index = siemClient.getSignalsIndex(); const clusterPrivileges = await readPrivileges(clusterClient.callAsCurrentUser, index); const privileges = merge(clusterPrivileges, { is_authenticated: security?.authc.isAuthenticated(request) ?? false, diff --git a/x-pack/plugins/siem/server/lib/detection_engine/routes/rules/add_prepackaged_rules_route.ts b/x-pack/plugins/siem/server/lib/detection_engine/routes/rules/add_prepackaged_rules_route.ts index bfc8c9c54b2c0..3c6adce45f959 100644 --- a/x-pack/plugins/siem/server/lib/detection_engine/routes/rules/add_prepackaged_rules_route.ts +++ b/x-pack/plugins/siem/server/lib/detection_engine/routes/rules/add_prepackaged_rules_route.ts @@ -49,7 +49,7 @@ export const addPrepackedRulesRoute = (router: IRouter) => { const rulesToInstall = getRulesToInstall(rulesFromFileSystem, prepackagedRules); const rulesToUpdate = getRulesToUpdate(rulesFromFileSystem, prepackagedRules); - const { signalsIndex } = siemClient; + const signalsIndex = siemClient.getSignalsIndex(); if (rulesToInstall.length !== 0 || rulesToUpdate.length !== 0) { const signalsIndexExists = await getIndexExists( clusterClient.callAsCurrentUser, diff --git a/x-pack/plugins/siem/server/lib/detection_engine/routes/rules/create_rules_bulk_route.ts b/x-pack/plugins/siem/server/lib/detection_engine/routes/rules/create_rules_bulk_route.ts index 2d7ddb79e5af5..133c98a6af7b3 100644 --- a/x-pack/plugins/siem/server/lib/detection_engine/routes/rules/create_rules_bulk_route.ts +++ b/x-pack/plugins/siem/server/lib/detection_engine/routes/rules/create_rules_bulk_route.ts @@ -92,7 +92,7 @@ export const createRulesBulkRoute = (router: IRouter) => { try { validateLicenseForRuleType({ license: context.licensing.license, ruleType: type }); - const finalIndex = outputIndex ?? siemClient.signalsIndex; + const finalIndex = outputIndex ?? siemClient.getSignalsIndex(); const indexExists = await getIndexExists(clusterClient.callAsCurrentUser, finalIndex); if (!indexExists) { return createBulkErrorObject({ diff --git a/x-pack/plugins/siem/server/lib/detection_engine/routes/rules/create_rules_route.ts b/x-pack/plugins/siem/server/lib/detection_engine/routes/rules/create_rules_route.ts index 1f0896686aca0..aa7a5cb0da7fd 100644 --- a/x-pack/plugins/siem/server/lib/detection_engine/routes/rules/create_rules_route.ts +++ b/x-pack/plugins/siem/server/lib/detection_engine/routes/rules/create_rules_route.ts @@ -82,7 +82,7 @@ export const createRulesRoute = (router: IRouter): void => { return siemResponse.error({ statusCode: 404 }); } - const finalIndex = outputIndex ?? siemClient.signalsIndex; + const finalIndex = outputIndex ?? siemClient.getSignalsIndex(); const indexExists = await getIndexExists(clusterClient.callAsCurrentUser, finalIndex); if (!indexExists) { return siemResponse.error({ diff --git a/x-pack/plugins/siem/server/lib/detection_engine/routes/rules/export_rules_route.ts b/x-pack/plugins/siem/server/lib/detection_engine/routes/rules/export_rules_route.ts index 8433b74adf310..bc4568dd0a40b 100644 --- a/x-pack/plugins/siem/server/lib/detection_engine/routes/rules/export_rules_route.ts +++ b/x-pack/plugins/siem/server/lib/detection_engine/routes/rules/export_rules_route.ts @@ -6,7 +6,7 @@ import { IRouter } from '../../../../../../../../src/core/server'; import { DETECTION_ENGINE_RULES_URL } from '../../../../../common/constants'; -import { ConfigType } from '../../../..'; +import { ConfigType } from '../../../../config'; import { ExportRulesRequestParams } from '../../rules/types'; import { getNonPackagedRulesCount } from '../../rules/get_existing_prepackaged_rules'; import { exportRulesSchema, exportRulesQuerySchema } from '../schemas/export_rules_schema'; diff --git a/x-pack/plugins/siem/server/lib/detection_engine/routes/rules/import_rules_route.test.ts b/x-pack/plugins/siem/server/lib/detection_engine/routes/rules/import_rules_route.test.ts index 8c052cfdf4024..1233e01a67762 100644 --- a/x-pack/plugins/siem/server/lib/detection_engine/routes/rules/import_rules_route.test.ts +++ b/x-pack/plugins/siem/server/lib/detection_engine/routes/rules/import_rules_route.test.ts @@ -126,6 +126,7 @@ describe('import_rules_route', () => { }); test('returns an error if the index does not exist', async () => { + clients.siemClient.getSignalsIndex.mockReturnValue('mockSignalsIndex'); clients.clusterClient.callAsCurrentUser.mockResolvedValue(getEmptyIndex()); const response = await server.inject(request, context); expect(response.status).toEqual(200); diff --git a/x-pack/plugins/siem/server/lib/detection_engine/routes/rules/import_rules_route.ts b/x-pack/plugins/siem/server/lib/detection_engine/routes/rules/import_rules_route.ts index 527fab786910f..202252da293ee 100644 --- a/x-pack/plugins/siem/server/lib/detection_engine/routes/rules/import_rules_route.ts +++ b/x-pack/plugins/siem/server/lib/detection_engine/routes/rules/import_rules_route.ts @@ -10,7 +10,7 @@ import { extname } from 'path'; import { IRouter } from '../../../../../../../../src/core/server'; import { createPromiseFromStreams } from '../../../../../../../../src/legacy/utils/streams'; import { DETECTION_ENGINE_RULES_URL } from '../../../../../common/constants'; -import { ConfigType } from '../../../..'; +import { ConfigType } from '../../../../config'; import { createRules } from '../../rules/create_rules'; import { ImportRulesRequestParams } from '../../rules/types'; import { readRules } from '../../rules/read_rules'; @@ -147,7 +147,7 @@ export const importRulesRoute = (router: IRouter, config: ConfigType) => { ruleType: type, }); - const signalsIndex = siemClient.signalsIndex; + const signalsIndex = siemClient.getSignalsIndex(); const indexExists = await getIndexExists( clusterClient.callAsCurrentUser, signalsIndex diff --git a/x-pack/plugins/siem/server/lib/detection_engine/routes/rules/update_rules_bulk_route.ts b/x-pack/plugins/siem/server/lib/detection_engine/routes/rules/update_rules_bulk_route.ts index 6db91d74294fc..a2fb78747ff04 100644 --- a/x-pack/plugins/siem/server/lib/detection_engine/routes/rules/update_rules_bulk_route.ts +++ b/x-pack/plugins/siem/server/lib/detection_engine/routes/rules/update_rules_bulk_route.ts @@ -83,7 +83,7 @@ export const updateRulesBulkRoute = (router: IRouter) => { version, exceptions_list, } = payloadRule; - const finalIndex = outputIndex ?? siemClient.signalsIndex; + const finalIndex = outputIndex ?? siemClient.getSignalsIndex(); const idOrRuleIdOrUnknown = id ?? ruleId ?? '(unknown id)'; try { validateLicenseForRuleType({ license: context.licensing.license, ruleType: type }); diff --git a/x-pack/plugins/siem/server/lib/detection_engine/routes/rules/update_rules_route.ts b/x-pack/plugins/siem/server/lib/detection_engine/routes/rules/update_rules_route.ts index 7dbbe5a22ab46..91a32c19eb5e7 100644 --- a/x-pack/plugins/siem/server/lib/detection_engine/routes/rules/update_rules_route.ts +++ b/x-pack/plugins/siem/server/lib/detection_engine/routes/rules/update_rules_route.ts @@ -83,7 +83,7 @@ export const updateRulesRoute = (router: IRouter) => { return siemResponse.error({ statusCode: 404 }); } - const finalIndex = outputIndex ?? siemClient.signalsIndex; + const finalIndex = outputIndex ?? siemClient.getSignalsIndex(); const rule = await updateRules({ alertsClient, actionsClient, diff --git a/x-pack/plugins/siem/server/lib/detection_engine/routes/signals/open_close_signals_route.ts b/x-pack/plugins/siem/server/lib/detection_engine/routes/signals/open_close_signals_route.ts index c71761fcc39db..bcb70b6b4f0dd 100644 --- a/x-pack/plugins/siem/server/lib/detection_engine/routes/signals/open_close_signals_route.ts +++ b/x-pack/plugins/siem/server/lib/detection_engine/routes/signals/open_close_signals_route.ts @@ -44,7 +44,7 @@ export const setSignalsStatusRoute = (router: IRouter) => { } try { const result = await clusterClient.callAsCurrentUser('updateByQuery', { - index: siemClient.signalsIndex, + index: siemClient.getSignalsIndex(), body: { script: { source: `ctx._source.signal.status = '${status}'`, diff --git a/x-pack/plugins/siem/server/lib/detection_engine/routes/signals/query_signals_route.ts b/x-pack/plugins/siem/server/lib/detection_engine/routes/signals/query_signals_route.ts index fd02b3371ed38..41896c725b903 100644 --- a/x-pack/plugins/siem/server/lib/detection_engine/routes/signals/query_signals_route.ts +++ b/x-pack/plugins/siem/server/lib/detection_engine/routes/signals/query_signals_route.ts @@ -29,7 +29,7 @@ export const querySignalsRoute = (router: IRouter) => { try { const result = await clusterClient.callAsCurrentUser('search', { - index: siemClient.signalsIndex, + index: siemClient.getSignalsIndex(), body: { query, aggs, _source, track_total_hits, size }, ignoreUnavailable: true, }); diff --git a/x-pack/plugins/siem/server/lib/timeline/routes/export_timelines_route.ts b/x-pack/plugins/siem/server/lib/timeline/routes/export_timelines_route.ts index c59f6eb6ce3da..e0eefbf811a56 100644 --- a/x-pack/plugins/siem/server/lib/timeline/routes/export_timelines_route.ts +++ b/x-pack/plugins/siem/server/lib/timeline/routes/export_timelines_route.ts @@ -8,7 +8,7 @@ import { set as _set } from 'lodash/fp'; import { TIMELINE_EXPORT_URL } from '../../../../common/constants'; import { IRouter } from '../../../../../../../src/core/server'; -import { ConfigType } from '../../..'; +import { ConfigType } from '../../../config'; import { transformError, buildSiemResponse } from '../../detection_engine/routes/utils'; import { getExportTimelineByObjectIds } from './utils/export_timelines'; diff --git a/x-pack/plugins/siem/server/lib/timeline/routes/import_timelines_route.ts b/x-pack/plugins/siem/server/lib/timeline/routes/import_timelines_route.ts index 258ef9faf671b..9d148abf82cdd 100644 --- a/x-pack/plugins/siem/server/lib/timeline/routes/import_timelines_route.ts +++ b/x-pack/plugins/siem/server/lib/timeline/routes/import_timelines_route.ts @@ -32,7 +32,7 @@ import { IRouter } from '../../../../../../../src/core/server'; import { SetupPlugins } from '../../../plugin'; import { ImportTimelinesPayloadSchemaRt } from './schemas/import_timelines_schema'; import { importRulesSchema } from '../../detection_engine/routes/schemas/response/import_rules_schema'; -import { ConfigType } from '../../..'; +import { ConfigType } from '../../../config'; import { Timeline } from '../saved_object'; import { validate } from '../../detection_engine/routes/rules/validate'; diff --git a/x-pack/plugins/siem/server/lib/types.ts b/x-pack/plugins/siem/server/lib/types.ts index a74fe8f778ba9..2a897806dc628 100644 --- a/x-pack/plugins/siem/server/lib/types.ts +++ b/x-pack/plugins/siem/server/lib/types.ts @@ -6,7 +6,7 @@ import { AuthenticatedUser } from '../../../security/public'; import { RequestHandlerContext } from '../../../../../src/core/server'; -export { ConfigType as Configuration } from '../'; +export { ConfigType as Configuration } from '../config'; import { Authentications } from './authentications'; import { Events } from './events'; diff --git a/x-pack/plugins/siem/server/mocks.ts b/x-pack/plugins/siem/server/mocks.ts new file mode 100644 index 0000000000000..44c41be86b6ff --- /dev/null +++ b/x-pack/plugins/siem/server/mocks.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 { SiemClient } from './types'; + +type SiemClientMock = jest.Mocked; +const createSiemClientMock = (): SiemClientMock => + (({ + getSignalsIndex: jest.fn(), + } as unknown) as SiemClientMock); + +export const siemMock = { + createClient: createSiemClientMock, +}; diff --git a/x-pack/plugins/siem/server/plugin.ts b/x-pack/plugins/siem/server/plugin.ts index 29a6999025e1f..e12832dc876bf 100644 --- a/x-pack/plugins/siem/server/plugin.ts +++ b/x-pack/plugins/siem/server/plugin.ts @@ -11,6 +11,7 @@ import { i18n } from '@kbn/i18n'; import { CoreSetup, CoreStart, + Plugin as IPlugin, PluginInitializerContext, Logger, } from '../../../../src/core/server'; @@ -61,7 +62,12 @@ export interface StartPlugins { alerting: AlertingStart; } -export class Plugin { +// eslint-disable-next-line @typescript-eslint/no-empty-interface +export interface PluginSetup {} +// eslint-disable-next-line @typescript-eslint/no-empty-interface +export interface PluginStart {} + +export class Plugin implements IPlugin { readonly name = 'siem'; private readonly logger: Logger; private readonly config$: Observable; @@ -204,7 +210,11 @@ export class Plugin { const libs = compose(core, plugins, this.context.env.mode.prod); initServer(libs); + + return {}; } - public start(core: CoreStart, plugins: StartPlugins) {} + public start(core: CoreStart, plugins: StartPlugins) { + return {}; + } } diff --git a/x-pack/plugins/siem/server/routes/index.ts b/x-pack/plugins/siem/server/routes/index.ts index 64b232a2686b8..1c03823e85fd7 100644 --- a/x-pack/plugins/siem/server/routes/index.ts +++ b/x-pack/plugins/siem/server/routes/index.ts @@ -31,7 +31,7 @@ import { getPrepackagedRulesStatusRoute } from '../lib/detection_engine/routes/r import { importTimelinesRoute } from '../lib/timeline/routes/import_timelines_route'; import { exportTimelinesRoute } from '../lib/timeline/routes/export_timelines_route'; import { SetupPlugins } from '../plugin'; -import { ConfigType } from '..'; +import { ConfigType } from '../config'; export const initRoutes = ( router: IRouter, From 4ca86103b34c53e8da1e61a9aba3a77986070e64 Mon Sep 17 00:00:00 2001 From: nnamdifrankie <56440728+nnamdifrankie@users.noreply.github.com> Date: Tue, 21 Apr 2020 15:51:51 -0400 Subject: [PATCH 21/67] [Endpoint]EMT-146: use ingest agent for status info (#63921) [Endpoint]EMT-146: use ingest agent for status info --- x-pack/plugins/endpoint/server/mocks.ts | 17 ++- x-pack/plugins/endpoint/server/plugin.test.ts | 4 +- x-pack/plugins/endpoint/server/plugin.ts | 1 + .../server/routes/alerts/alerts.test.ts | 3 +- .../server/routes/alerts/details/handlers.ts | 8 +- .../endpoint/server/routes/metadata/index.ts | 99 ++++++++++++++---- .../server/routes/metadata/metadata.test.ts | 76 +++++++++++++- .../routes/metadata/query_builders.test.ts | 8 +- x-pack/plugins/endpoint/server/types.ts | 2 + .../ingest_manager/common/types/index.ts | 15 +++ .../plugins/ingest_manager/server/plugin.ts | 7 +- .../server/services/agents/status.test.ts | 43 ++++++++ .../server/services/agents/status.ts | 10 +- .../alerts/host_api_feature/data.json.gz | Bin 753 -> 849 bytes 14 files changed, 260 insertions(+), 33 deletions(-) create mode 100644 x-pack/plugins/ingest_manager/server/services/agents/status.test.ts diff --git a/x-pack/plugins/endpoint/server/mocks.ts b/x-pack/plugins/endpoint/server/mocks.ts index 903aa19cd8843..3881840efe9df 100644 --- a/x-pack/plugins/endpoint/server/mocks.ts +++ b/x-pack/plugins/endpoint/server/mocks.ts @@ -4,6 +4,9 @@ * you may not use this file except in compliance with the Elastic License. */ +import { IngestManagerSetupContract } from '../../ingest_manager/server'; +import { AgentService } from '../../ingest_manager/common/types'; + /** * Creates a mock IndexPatternRetriever for use in tests. * @@ -28,6 +31,15 @@ export const createMockMetadataIndexPatternRetriever = () => { return createMockIndexPatternRetriever(MetadataIndexPattern); }; +/** + * Creates a mock AgentService + */ +export const createMockAgentService = (): jest.Mocked => { + return { + getAgentStatusById: jest.fn(), + }; +}; + /** * Creates a mock IndexPatternService for use in tests that need to interact with the Ingest Manager's * ESIndexPatternService. @@ -35,10 +47,13 @@ export const createMockMetadataIndexPatternRetriever = () => { * @param indexPattern a string index pattern to return when called by a test * @returns the same value as `indexPattern` parameter */ -export const createMockIndexPatternService = (indexPattern: string) => { +export const createMockIngestManagerSetupContract = ( + indexPattern: string +): IngestManagerSetupContract => { return { esIndexPatternService: { getESIndexPattern: jest.fn().mockResolvedValue(indexPattern), }, + agentService: createMockAgentService(), }; }; diff --git a/x-pack/plugins/endpoint/server/plugin.test.ts b/x-pack/plugins/endpoint/server/plugin.test.ts index 8d55e64f16dcf..c380bc5c3e3d0 100644 --- a/x-pack/plugins/endpoint/server/plugin.test.ts +++ b/x-pack/plugins/endpoint/server/plugin.test.ts @@ -7,7 +7,7 @@ import { EndpointPlugin, EndpointPluginSetupDependencies } from './plugin'; import { coreMock } from '../../../../src/core/server/mocks'; import { PluginSetupContract } from '../../features/server'; -import { createMockIndexPatternService } from './mocks'; +import { createMockIngestManagerSetupContract } from './mocks'; describe('test endpoint plugin', () => { let plugin: EndpointPlugin; @@ -31,7 +31,7 @@ describe('test endpoint plugin', () => { }; mockedEndpointPluginSetupDependencies = { features: mockedPluginSetupContract, - ingestManager: createMockIndexPatternService(''), + ingestManager: createMockIngestManagerSetupContract(''), }; }); diff --git a/x-pack/plugins/endpoint/server/plugin.ts b/x-pack/plugins/endpoint/server/plugin.ts index 6a42014e91130..ce6be5aeaf6db 100644 --- a/x-pack/plugins/endpoint/server/plugin.ts +++ b/x-pack/plugins/endpoint/server/plugin.ts @@ -70,6 +70,7 @@ export class EndpointPlugin plugins.ingestManager.esIndexPatternService, this.initializerContext.logger ), + agentService: plugins.ingestManager.agentService, logFactory: this.initializerContext.logger, config: (): Promise => { return createConfig$(this.initializerContext) diff --git a/x-pack/plugins/endpoint/server/routes/alerts/alerts.test.ts b/x-pack/plugins/endpoint/server/routes/alerts/alerts.test.ts index 6be7b26898206..39fc2ba4c74bb 100644 --- a/x-pack/plugins/endpoint/server/routes/alerts/alerts.test.ts +++ b/x-pack/plugins/endpoint/server/routes/alerts/alerts.test.ts @@ -12,7 +12,7 @@ import { import { registerAlertRoutes } from './index'; import { EndpointConfigSchema } from '../../config'; import { alertingIndexGetQuerySchema } from '../../../common/schema/alert_index'; -import { createMockIndexPatternRetriever } from '../../mocks'; +import { createMockAgentService, createMockIndexPatternRetriever } from '../../mocks'; describe('test alerts route', () => { let routerMock: jest.Mocked; @@ -26,6 +26,7 @@ describe('test alerts route', () => { routerMock = httpServiceMock.createRouter(); registerAlertRoutes(routerMock, { indexPatternRetriever: createMockIndexPatternRetriever('events-endpoint-*'), + agentService: createMockAgentService(), logFactory: loggingServiceMock.create(), config: () => Promise.resolve(EndpointConfigSchema.validate({})), }); diff --git a/x-pack/plugins/endpoint/server/routes/alerts/details/handlers.ts b/x-pack/plugins/endpoint/server/routes/alerts/details/handlers.ts index 86e9f55da5697..9055ee4110fbb 100644 --- a/x-pack/plugins/endpoint/server/routes/alerts/details/handlers.ts +++ b/x-pack/plugins/endpoint/server/routes/alerts/details/handlers.ts @@ -37,7 +37,13 @@ export const alertDetailsHandlerWrapper = function( indexPattern ); - const currentHostInfo = await getHostData(ctx, response._source.host.id, indexPattern); + const currentHostInfo = await getHostData( + { + endpointAppContext, + requestHandlerContext: ctx, + }, + response._source.host.id + ); return res.ok({ body: { diff --git a/x-pack/plugins/endpoint/server/routes/metadata/index.ts b/x-pack/plugins/endpoint/server/routes/metadata/index.ts index 883bb88204fd4..bc79b828576e0 100644 --- a/x-pack/plugins/endpoint/server/routes/metadata/index.ts +++ b/x-pack/plugins/endpoint/server/routes/metadata/index.ts @@ -4,18 +4,29 @@ * you may not use this file except in compliance with the Elastic License. */ -import { IRouter, RequestHandlerContext } from 'kibana/server'; +import { IRouter, Logger, RequestHandlerContext } from 'kibana/server'; import { SearchResponse } from 'elasticsearch'; import { schema } from '@kbn/config-schema'; -import { kibanaRequestToMetadataListESQuery, getESQueryHostMetadataByID } from './query_builders'; +import { getESQueryHostMetadataByID, kibanaRequestToMetadataListESQuery } from './query_builders'; import { HostInfo, HostMetadata, HostResultList, HostStatus } from '../../../common/types'; import { EndpointAppContext } from '../../types'; +import { AgentStatus } from '../../../../ingest_manager/common/types/models'; interface HitSource { _source: HostMetadata; } +interface MetadataRequestContext { + requestHandlerContext: RequestHandlerContext; + endpointAppContext: EndpointAppContext; +} + +const HOST_STATUS_MAPPING = new Map([ + ['online', HostStatus.ONLINE], + ['offline', HostStatus.OFFLINE], +]); + export function registerEndpointRoutes(router: IRouter, endpointAppContext: EndpointAppContext) { router.post( { @@ -62,7 +73,12 @@ export function registerEndpointRoutes(router: IRouter, endpointAppContext: Endp 'search', queryParams )) as SearchResponse; - return res.ok({ body: mapToHostResultList(queryParams, response) }); + return res.ok({ + body: await mapToHostResultList(queryParams, response, { + endpointAppContext, + requestHandlerContext: context, + }), + }); } catch (err) { return res.internalError({ body: err }); } @@ -79,11 +95,13 @@ export function registerEndpointRoutes(router: IRouter, endpointAppContext: Endp }, async (context, req, res) => { try { - const index = await endpointAppContext.indexPatternRetriever.getMetadataIndexPattern( - context + const doc = await getHostData( + { + endpointAppContext, + requestHandlerContext: context, + }, + req.params.id ); - - const doc = await getHostData(context, req.params.id, index); if (doc) { return res.ok({ body: doc }); } @@ -96,12 +114,14 @@ export function registerEndpointRoutes(router: IRouter, endpointAppContext: Endp } export async function getHostData( - context: RequestHandlerContext, - id: string, - index: string + metadataRequestContext: MetadataRequestContext, + id: string ): Promise { + const index = await metadataRequestContext.endpointAppContext.indexPatternRetriever.getMetadataIndexPattern( + metadataRequestContext.requestHandlerContext + ); const query = getESQueryHostMetadataByID(id, index); - const response = (await context.core.elasticsearch.dataClient.callAsCurrentUser( + const response = (await metadataRequestContext.requestHandlerContext.core.elasticsearch.dataClient.callAsCurrentUser( 'search', query )) as SearchResponse; @@ -110,22 +130,25 @@ export async function getHostData( return undefined; } - return enrichHostMetadata(response.hits.hits[0]._source); + return await enrichHostMetadata(response.hits.hits[0]._source, metadataRequestContext); } -function mapToHostResultList( +async function mapToHostResultList( queryParams: Record, - searchResponse: SearchResponse -): HostResultList { + searchResponse: SearchResponse, + metadataRequestContext: MetadataRequestContext +): Promise { const totalNumberOfHosts = searchResponse?.aggregations?.total?.value || 0; if (searchResponse.hits.hits.length > 0) { return { request_page_size: queryParams.size, request_page_index: queryParams.from, - hosts: searchResponse.hits.hits - .map(response => response.inner_hits.most_recent.hits.hits) - .flatMap(data => data as HitSource) - .map(entry => enrichHostMetadata(entry._source)), + hosts: await Promise.all( + searchResponse.hits.hits + .map(response => response.inner_hits.most_recent.hits.hits) + .flatMap(data => data as HitSource) + .map(async entry => enrichHostMetadata(entry._source, metadataRequestContext)) + ), total: totalNumberOfHosts, }; } else { @@ -138,9 +161,43 @@ function mapToHostResultList( } } -function enrichHostMetadata(hostMetadata: HostMetadata): HostInfo { +async function enrichHostMetadata( + hostMetadata: HostMetadata, + metadataRequestContext: MetadataRequestContext +): Promise { + let hostStatus = HostStatus.ERROR; + let elasticAgentId = hostMetadata?.elastic?.agent?.id; + const log = logger(metadataRequestContext.endpointAppContext); + try { + /** + * Get agent status by elastic agent id if available or use the host id. + * https://github.com/elastic/endpoint-app-team/issues/354 + */ + + if (!elasticAgentId) { + elasticAgentId = hostMetadata.host.id; + log.warn(`Missing elastic agent id, using host id instead ${elasticAgentId}`); + } + + const status = await metadataRequestContext.endpointAppContext.agentService.getAgentStatusById( + metadataRequestContext.requestHandlerContext.core.savedObjects.client, + elasticAgentId + ); + hostStatus = HOST_STATUS_MAPPING.get(status) || HostStatus.ERROR; + } catch (e) { + if (e.isBoom && e.output.statusCode === 404) { + log.warn(`agent with id ${elasticAgentId} not found`); + } else { + log.error(e); + throw e; + } + } return { metadata: hostMetadata, - host_status: HostStatus.ERROR, + host_status: hostStatus, }; } + +const logger = (endpointAppContext: EndpointAppContext): Logger => { + return endpointAppContext.logFactory.get('metadata'); +}; diff --git a/x-pack/plugins/endpoint/server/routes/metadata/metadata.test.ts b/x-pack/plugins/endpoint/server/routes/metadata/metadata.test.ts index 9a7d3fb3188a6..a1186aabc7a66 100644 --- a/x-pack/plugins/endpoint/server/routes/metadata/metadata.test.ts +++ b/x-pack/plugins/endpoint/server/routes/metadata/metadata.test.ts @@ -25,7 +25,9 @@ import { SearchResponse } from 'elasticsearch'; import { registerEndpointRoutes } from './index'; import { EndpointConfigSchema } from '../../config'; import * as data from '../../test_data/all_metadata_data.json'; -import { createMockMetadataIndexPatternRetriever } from '../../mocks'; +import { createMockAgentService, createMockMetadataIndexPatternRetriever } from '../../mocks'; +import { AgentService } from '../../../../ingest_manager/common/types'; +import Boom from 'boom'; describe('test endpoint route', () => { let routerMock: jest.Mocked; @@ -35,6 +37,7 @@ describe('test endpoint route', () => { let mockSavedObjectClient: jest.Mocked; let routeHandler: RequestHandler; let routeConfig: RouteConfig; + let mockAgentService: jest.Mocked; beforeEach(() => { mockClusterClient = elasticsearchServiceMock.createClusterClient() as jest.Mocked< @@ -45,8 +48,10 @@ describe('test endpoint route', () => { mockClusterClient.asScoped.mockReturnValue(mockScopedClient); routerMock = httpServiceMock.createRouter(); mockResponse = httpServerMock.createResponseFactory(); + mockAgentService = createMockAgentService(); registerEndpointRoutes(routerMock, { indexPatternRetriever: createMockMetadataIndexPatternRetriever(), + agentService: mockAgentService, logFactory: loggingServiceMock.create(), config: () => Promise.resolve(EndpointConfigSchema.validate({})), }); @@ -83,7 +88,7 @@ describe('test endpoint route', () => { [routeConfig, routeHandler] = routerMock.post.mock.calls.find(([{ path }]) => path.startsWith('/api/endpoint/metadata') )!; - + mockAgentService.getAgentStatusById = jest.fn().mockReturnValue('error'); await routeHandler( createRouteHandlerContext(mockScopedClient, mockSavedObjectClient), mockRequest, @@ -113,6 +118,8 @@ describe('test endpoint route', () => { ], }, }); + + mockAgentService.getAgentStatusById = jest.fn().mockReturnValue('error'); mockScopedClient.callAsCurrentUser.mockImplementationOnce(() => Promise.resolve((data as unknown) as SearchResponse) ); @@ -154,6 +161,8 @@ describe('test endpoint route', () => { filter: 'not host.ip:10.140.73.246', }, }); + + mockAgentService.getAgentStatusById = jest.fn().mockReturnValue('error'); mockScopedClient.callAsCurrentUser.mockImplementationOnce(() => Promise.resolve((data as unknown) as SearchResponse) ); @@ -216,10 +225,10 @@ describe('test endpoint route', () => { }, }) ); + mockAgentService.getAgentStatusById = jest.fn().mockReturnValue('error'); [routeConfig, routeHandler] = routerMock.get.mock.calls.find(([{ path }]) => path.startsWith('/api/endpoint/metadata') )!; - await routeHandler( createRouteHandlerContext(mockScopedClient, mockSavedObjectClient), mockRequest, @@ -233,13 +242,14 @@ describe('test endpoint route', () => { expect(message).toEqual('Endpoint Not Found'); }); - it('should return a single endpoint with status error', async () => { + it('should return a single endpoint with status online', async () => { const mockRequest = httpServerMock.createKibanaRequest({ params: { id: (data as any).hits.hits[0]._id }, }); const response: SearchResponse = (data as unknown) as SearchResponse< HostMetadata >; + mockAgentService.getAgentStatusById = jest.fn().mockReturnValue('online'); mockScopedClient.callAsCurrentUser.mockImplementationOnce(() => Promise.resolve(response)); [routeConfig, routeHandler] = routerMock.get.mock.calls.find(([{ path }]) => path.startsWith('/api/endpoint/metadata') @@ -256,6 +266,64 @@ describe('test endpoint route', () => { expect(mockResponse.ok).toBeCalled(); const result = mockResponse.ok.mock.calls[0][0]?.body as HostInfo; expect(result).toHaveProperty('metadata.endpoint'); + expect(result.host_status).toEqual(HostStatus.ONLINE); + }); + + it('should return a single endpoint with status error when AgentService throw 404', async () => { + const response: SearchResponse = (data as unknown) as SearchResponse< + HostMetadata + >; + + const mockRequest = httpServerMock.createKibanaRequest({ + params: { id: response.hits.hits[0]._id }, + }); + + mockAgentService.getAgentStatusById = jest.fn().mockImplementation(() => { + throw Boom.notFound('Agent not found'); + }); + mockScopedClient.callAsCurrentUser.mockImplementationOnce(() => Promise.resolve(response)); + [routeConfig, routeHandler] = routerMock.get.mock.calls.find(([{ path }]) => + path.startsWith('/api/endpoint/metadata') + )!; + + await routeHandler( + createRouteHandlerContext(mockScopedClient, mockSavedObjectClient), + mockRequest, + mockResponse + ); + + expect(mockScopedClient.callAsCurrentUser).toBeCalled(); + expect(routeConfig.options).toEqual({ authRequired: true }); + expect(mockResponse.ok).toBeCalled(); + const result = mockResponse.ok.mock.calls[0][0]?.body as HostInfo; + expect(result.host_status).toEqual(HostStatus.ERROR); + }); + + it('should return a single endpoint with status error when status is not offline or online', async () => { + const response: SearchResponse = (data as unknown) as SearchResponse< + HostMetadata + >; + + const mockRequest = httpServerMock.createKibanaRequest({ + params: { id: response.hits.hits[0]._id }, + }); + + mockAgentService.getAgentStatusById = jest.fn().mockReturnValue('warning'); + mockScopedClient.callAsCurrentUser.mockImplementationOnce(() => Promise.resolve(response)); + [routeConfig, routeHandler] = routerMock.get.mock.calls.find(([{ path }]) => + path.startsWith('/api/endpoint/metadata') + )!; + + await routeHandler( + createRouteHandlerContext(mockScopedClient, mockSavedObjectClient), + mockRequest, + mockResponse + ); + + expect(mockScopedClient.callAsCurrentUser).toBeCalled(); + expect(routeConfig.options).toEqual({ authRequired: true }); + expect(mockResponse.ok).toBeCalled(); + const result = mockResponse.ok.mock.calls[0][0]?.body as HostInfo; expect(result.host_status).toEqual(HostStatus.ERROR); }); }); diff --git a/x-pack/plugins/endpoint/server/routes/metadata/query_builders.test.ts b/x-pack/plugins/endpoint/server/routes/metadata/query_builders.test.ts index c8143fbdda1ea..7e6e3f875cd4c 100644 --- a/x-pack/plugins/endpoint/server/routes/metadata/query_builders.test.ts +++ b/x-pack/plugins/endpoint/server/routes/metadata/query_builders.test.ts @@ -6,7 +6,11 @@ import { httpServerMock, loggingServiceMock } from '../../../../../../src/core/server/mocks'; import { EndpointConfigSchema } from '../../config'; import { kibanaRequestToMetadataListESQuery, getESQueryHostMetadataByID } from './query_builders'; -import { createMockMetadataIndexPatternRetriever, MetadataIndexPattern } from '../../mocks'; +import { + createMockAgentService, + createMockMetadataIndexPatternRetriever, + MetadataIndexPattern, +} from '../../mocks'; describe('query builder', () => { describe('MetadataListESQuery', () => { @@ -18,6 +22,7 @@ describe('query builder', () => { mockRequest, { indexPatternRetriever: createMockMetadataIndexPatternRetriever(), + agentService: createMockAgentService(), logFactory: loggingServiceMock.create(), config: () => Promise.resolve(EndpointConfigSchema.validate({})), }, @@ -69,6 +74,7 @@ describe('query builder', () => { mockRequest, { indexPatternRetriever: createMockMetadataIndexPatternRetriever(), + agentService: createMockAgentService(), logFactory: loggingServiceMock.create(), config: () => Promise.resolve(EndpointConfigSchema.validate({})), }, diff --git a/x-pack/plugins/endpoint/server/types.ts b/x-pack/plugins/endpoint/server/types.ts index 46a23060339f4..d43ec58aec428 100644 --- a/x-pack/plugins/endpoint/server/types.ts +++ b/x-pack/plugins/endpoint/server/types.ts @@ -6,12 +6,14 @@ import { LoggerFactory } from 'kibana/server'; import { EndpointConfigType } from './config'; import { IndexPatternRetriever } from './index_pattern'; +import { AgentService } from '../../ingest_manager/common/types'; /** * The context for Endpoint apps. */ export interface EndpointAppContext { indexPatternRetriever: IndexPatternRetriever; + agentService: AgentService; logFactory: LoggerFactory; config(): Promise; } diff --git a/x-pack/plugins/ingest_manager/common/types/index.ts b/x-pack/plugins/ingest_manager/common/types/index.ts index 42f7a9333118e..150a4c9d60280 100644 --- a/x-pack/plugins/ingest_manager/common/types/index.ts +++ b/x-pack/plugins/ingest_manager/common/types/index.ts @@ -3,9 +3,24 @@ * or more contributor license agreements. Licensed under the Elastic License; * you may not use this file except in compliance with the Elastic License. */ +import { SavedObjectsClientContract } from 'kibana/server'; +import { AgentStatus } from './models'; + export * from './models'; export * from './rest_spec'; +/** + * A service that provides exported functions that return information about an Agent + */ +export interface AgentService { + /** + * Return the status by the Agent's id + * @param soClient + * @param agentId + */ + getAgentStatusById(soClient: SavedObjectsClientContract, agentId: string): Promise; +} + export interface IngestManagerConfigType { enabled: boolean; epm: { diff --git a/x-pack/plugins/ingest_manager/server/plugin.ts b/x-pack/plugins/ingest_manager/server/plugin.ts index 4dd070a7414f0..075a0917b9fae 100644 --- a/x-pack/plugins/ingest_manager/server/plugin.ts +++ b/x-pack/plugins/ingest_manager/server/plugin.ts @@ -39,18 +39,20 @@ import { registerInstallScriptRoutes, } from './routes'; -import { IngestManagerConfigType } from '../common'; +import { AgentService, IngestManagerConfigType } from '../common'; import { appContextService, ESIndexPatternService, ESIndexPatternSavedObjectService, } from './services'; +import { getAgentStatusById } from './services/agents'; /** * Describes public IngestManager plugin contract returned at the `setup` stage. */ export interface IngestManagerSetupContract { esIndexPatternService: ESIndexPatternService; + agentService: AgentService; } export interface IngestManagerSetupDeps { @@ -148,6 +150,9 @@ export class IngestManagerPlugin implements Plugin { } return deepFreeze({ esIndexPatternService: new ESIndexPatternSavedObjectService(), + agentService: { + getAgentStatusById, + }, }); } diff --git a/x-pack/plugins/ingest_manager/server/services/agents/status.test.ts b/x-pack/plugins/ingest_manager/server/services/agents/status.test.ts new file mode 100644 index 0000000000000..d19fe883a7780 --- /dev/null +++ b/x-pack/plugins/ingest_manager/server/services/agents/status.test.ts @@ -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 { savedObjectsClientMock } from '../../../../../../src/core/server/saved_objects/service/saved_objects_client.mock'; +import { getAgentStatusById } from './status'; +import { AGENT_TYPE_PERMANENT } from '../../../common/constants'; +import { AgentSOAttributes } from '../../../common/types/models'; +import { SavedObject } from 'kibana/server'; + +describe('Agent status service', () => { + it('should return inactive when agent is not active', async () => { + const mockSavedObjectsClient = savedObjectsClientMock.create(); + mockSavedObjectsClient.get = jest.fn().mockReturnValue({ + id: 'id', + type: AGENT_TYPE_PERMANENT, + attributes: { + active: false, + local_metadata: '{}', + user_provided_metadata: '{}', + }, + } as SavedObject); + const status = await getAgentStatusById(mockSavedObjectsClient, 'id'); + expect(status).toEqual('inactive'); + }); + + it('should return online when agent is active', async () => { + const mockSavedObjectsClient = savedObjectsClientMock.create(); + mockSavedObjectsClient.get = jest.fn().mockReturnValue({ + id: 'id', + type: AGENT_TYPE_PERMANENT, + attributes: { + active: true, + local_metadata: '{}', + user_provided_metadata: '{}', + }, + } as SavedObject); + const status = await getAgentStatusById(mockSavedObjectsClient, 'id'); + expect(status).toEqual('online'); + }); +}); diff --git a/x-pack/plugins/ingest_manager/server/services/agents/status.ts b/x-pack/plugins/ingest_manager/server/services/agents/status.ts index 21e200d701e69..001b6d01f078e 100644 --- a/x-pack/plugins/ingest_manager/server/services/agents/status.ts +++ b/x-pack/plugins/ingest_manager/server/services/agents/status.ts @@ -5,7 +5,7 @@ */ import { SavedObjectsClientContract } from 'src/core/server'; -import { listAgents } from './crud'; +import { getAgent, listAgents } from './crud'; import { AGENT_EVENT_SAVED_OBJECT_TYPE } from '../../constants'; import { AgentStatus, Agent } from '../../types'; @@ -17,6 +17,14 @@ import { } from '../../constants'; import { AgentStatusKueryHelper } from '../../../common/services'; +export async function getAgentStatusById( + soClient: SavedObjectsClientContract, + agentId: string +): Promise { + const agent = await getAgent(soClient, agentId); + return getAgentStatus(agent); +} + export function getAgentStatus(agent: Agent, now: number = Date.now()): AgentStatus { const { type, last_checkin: lastCheckIn } = agent; const msLastCheckIn = new Date(lastCheckIn || 0).getTime(); diff --git a/x-pack/test/functional/es_archives/endpoint/alerts/host_api_feature/data.json.gz b/x-pack/test/functional/es_archives/endpoint/alerts/host_api_feature/data.json.gz index a71281c0ecfec93e0a51aa3473dbbbf565a10f9b..3d4f0e11a7cc670366fa6098143b6306a1a1c72b 100644 GIT binary patch literal 849 zcmV-X1FrlZiwFo(DwQOZ*BnHmQ8QtHV}sI{uPGL8G#%QsbNp`rYZIi z6fG9$q9}Ucr{mVP3|sbY8sxv1$|hMyaz2pmUIJK#M9yf2e20(bYBU~C+RJsC{4k!x zCQMGcfxTPox{<5$P#)*8o4q{$WhvfI-^HJ5{qg+o^FMyezu%a57OR*(cSg(9ZsuVN zX%*MaeAPls+3glB$UD<*v)hEPFE1lMw)17$wr;sDqf#>oBBeBGdva&uW@*(P_}nLz zT=JBBgzQ2B3Rr_DVSr5_>71xp_{qsvuYKBV=gq2fHI=IDT#g;YP>h;B}*3Pri>V2V}6vXXS5*Ix&rmM-*T=~8nRBtf!JwD97%XS3}qnRkoD z7e!XF`LrE>NSjicV-ymPOZVy4&{RExz1z&)jaa>x^~??nACG81y8FK#U5`drFXzHL z-{Zn;w*H=6FxtF;3p$#RD1(xLx>H%oNJfO(r6kJX(U$F_Trd^?e=cb6rS*j1HD@5= zazH5ws70t<#fR@o3d_%vq7K>S+9^PGrhIT@0`EzK5ZXE9EIEoN zNbwCi2%)U@2@NQ%3Mq`>!VFVBC|+^NKoeW_W=UcBHKYii|JAcaDTMWr4#FoELMSlS zbm$kkoHQpPTM7z2QL_43QV>_N^a6-@q=6{9WBCnd1a>`ydZY_DLJCeD2)qS!z#1a= bNFl(AQj>tC8akZ3k@n(0L$8A>b_@Uj^{t;- literal 753 zcmVQOZ*BnHl}k_CKoEfM`4v&ljJ0p?_EbZuIH0N( zQc+d)u+PM8Y)6h0post8bs!musT1Ah2*=*TtobuWm=8c1(tp{dF z3Wgy8QdowyMyW(*bo6Mo^z}Ti%GOjQG*P36rMt~hYtMI2n^n`?-t5RWKAezDAw^H& zlt=~a1Z9wAjDb9%Bx9I;&eCklhiF&oVwLdAyqOG7moc`y9FH~{cYUXpz4&eIb>m$( zWj)hLHSbuqlC=kC@g1}&!lbbL&tf}O_rY0a9JVF^PE`ubc?^nJ0))ww8b!I3XveB8 z;?M11F-kCsPl^)4(%nR~YnUbk#Ygp)BuykvFcXid`L%Uap>6jp9(zCmX5baXS{St7 zvYK}*85Yy&eML%FUCoCVzK*RjBnXrJrMr4i6iG*6sq0*?iq+Yyqqg0MWKZn}>;JpK z-C%HgIH$*^!|8ZDdrM9Q7YA_4ov@w-px82CK8S2DNcmw^Gjqx zC{L(7m{LZggJ3KK0z!lCkk1(i;3i&6;2e1NT81%t9^L3XdXe3)b@e2;s}24mxwc2{ z Date: Tue, 21 Apr 2020 15:57:50 -0400 Subject: [PATCH 22/67] Fixed small issue in clone functionality (#64085) --- .../embeddable/placeholder/placeholder_embeddable_factory.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/plugins/dashboard/public/application/embeddable/placeholder/placeholder_embeddable_factory.ts b/src/plugins/dashboard/public/application/embeddable/placeholder/placeholder_embeddable_factory.ts index 30a93989649a7..b3ce2f1e57d5f 100644 --- a/src/plugins/dashboard/public/application/embeddable/placeholder/placeholder_embeddable_factory.ts +++ b/src/plugins/dashboard/public/application/embeddable/placeholder/placeholder_embeddable_factory.ts @@ -33,6 +33,10 @@ export class PlaceholderEmbeddableFactory implements EmbeddableFactoryDefinition return false; } + public canCreateNew() { + return false; + } + public async create(initialInput: EmbeddableInput, parent?: IContainer) { return new PlaceholderEmbeddable(initialInput, parent); } From ed912751c142e1cea77927d6e6a6a722ecf7f9c2 Mon Sep 17 00:00:00 2001 From: Paul Tavares <56442535+paul-tavares@users.noreply.github.com> Date: Tue, 21 Apr 2020 16:30:09 -0400 Subject: [PATCH 23/67] [Endpoint] Hook to handle events needing navigation via Router (#63863) * new hook providing generic event handler for use with react router * Refactor of Header Naviagtion to use useNavigateByRouterEventHandler * Policy list refactor to use useNavigateByRouterEventHandler hook * Policy list Policy name link to use useNavigateByRouterEventHandler hook * Host list use of useNavigateByRouteEventHandler --- .../view/components/header_navigation.tsx | 44 +++++---- .../view/components/link_to_app.test.tsx | 2 +- ..._navigate_by_router_event_handler.test.tsx | 90 +++++++++++++++++++ .../use_navigate_by_router_event_handler.ts | 70 +++++++++++++++ .../details/components/flyout_sub_header.tsx | 4 +- .../view/hosts/details/host_details.tsx | 13 ++- .../endpoint/view/hosts/details/index.tsx | 22 ++--- .../endpoint/view/hosts/index.tsx | 35 ++++---- .../view/policy/policy_details.test.tsx | 4 +- .../endpoint/view/policy/policy_details.tsx | 11 +-- .../endpoint/view/policy/policy_list.tsx | 33 ++++--- 11 files changed, 244 insertions(+), 84 deletions(-) create mode 100644 x-pack/plugins/endpoint/public/applications/endpoint/view/hooks/use_navigate_by_router_event_handler.test.tsx create mode 100644 x-pack/plugins/endpoint/public/applications/endpoint/view/hooks/use_navigate_by_router_event_handler.ts diff --git a/x-pack/plugins/endpoint/public/applications/endpoint/view/components/header_navigation.tsx b/x-pack/plugins/endpoint/public/applications/endpoint/view/components/header_navigation.tsx index 6c294d9c86548..7475229853698 100644 --- a/x-pack/plugins/endpoint/public/applications/endpoint/view/components/header_navigation.tsx +++ b/x-pack/plugins/endpoint/public/applications/endpoint/view/components/header_navigation.tsx @@ -4,12 +4,13 @@ * you may not use this file except in compliance with the Elastic License. */ -import React, { MouseEvent, useMemo } from 'react'; +import React, { memo, useMemo } from 'react'; import { i18n } from '@kbn/i18n'; import { EuiTabs, EuiTab } from '@elastic/eui'; -import { useHistory, useLocation } from 'react-router-dom'; +import { useLocation } from 'react-router-dom'; import { useKibana } from '../../../../../../../../src/plugins/kibana_react/public'; import { Immutable } from '../../../../../common/types'; +import { useNavigateByRouterEventHandler } from '../hooks/use_navigate_by_router_event_handler'; interface NavTabs { name: string; @@ -48,33 +49,30 @@ const navTabs: Immutable = [ }, ]; -export const HeaderNavigation: React.FunctionComponent = React.memo(() => { - const history = useHistory(); - const location = useLocation(); +const NavTab = memo<{ tab: NavTabs }>(({ tab }) => { + const { pathname } = useLocation(); const { services } = useKibana(); + const onClickHandler = useNavigateByRouterEventHandler(tab.href); const BASE_PATH = services.application.getUrlForApp('endpoint'); + return ( + + {tab.name} + + ); +}); + +export const HeaderNavigation: React.FunctionComponent = React.memo(() => { const tabList = useMemo(() => { return navTabs.map((tab, index) => { - return ( - { - event.preventDefault(); - history.push(tab.href); - }} - isSelected={ - tab.href === location.pathname || - (tab.href !== '/' && location.pathname.startsWith(tab.href)) - } - > - {tab.name} - - ); + return ; }); - }, [BASE_PATH, history, location.pathname]); + }, []); return {tabList}; }); diff --git a/x-pack/plugins/endpoint/public/applications/endpoint/view/components/link_to_app.test.tsx b/x-pack/plugins/endpoint/public/applications/endpoint/view/components/link_to_app.test.tsx index d0a8f9690dafb..2d4d1ca8a1b5b 100644 --- a/x-pack/plugins/endpoint/public/applications/endpoint/view/components/link_to_app.test.tsx +++ b/x-pack/plugins/endpoint/public/applications/endpoint/view/components/link_to_app.test.tsx @@ -110,7 +110,7 @@ describe('LinkToApp component', () => { const clickEventArg = spyOnClickHandler.mock.calls[0][0]; expect(clickEventArg.isDefaultPrevented()).toBe(true); }); - it('should not navigate if onClick callback prevents defalut', () => { + it('should not navigate if onClick callback prevents default', () => { const spyOnClickHandler: LinkToAppOnClickMock = jest.fn(ev => { ev.preventDefault(); }); diff --git a/x-pack/plugins/endpoint/public/applications/endpoint/view/hooks/use_navigate_by_router_event_handler.test.tsx b/x-pack/plugins/endpoint/public/applications/endpoint/view/hooks/use_navigate_by_router_event_handler.test.tsx new file mode 100644 index 0000000000000..b1f09617f0174 --- /dev/null +++ b/x-pack/plugins/endpoint/public/applications/endpoint/view/hooks/use_navigate_by_router_event_handler.test.tsx @@ -0,0 +1,90 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ +import React from 'react'; +import { AppContextTestRender, createAppRootMockRenderer } from '../../mocks'; +import { useNavigateByRouterEventHandler } from './use_navigate_by_router_event_handler'; +import { act, fireEvent, cleanup } from '@testing-library/react'; + +type ClickHandlerMock = jest.Mock< + Return, + [React.MouseEvent] +>; + +describe('useNavigateByRouterEventHandler hook', () => { + let render: AppContextTestRender['render']; + let history: AppContextTestRender['history']; + let renderResult: ReturnType; + let linkEle: HTMLAnchorElement; + let clickHandlerSpy: ClickHandlerMock; + const Link = React.memo<{ + routeTo: Parameters[0]; + onClick?: Parameters[1]; + }>(({ routeTo, onClick }) => { + const onClickHandler = useNavigateByRouterEventHandler(routeTo, onClick); + return ( +
+ mock link + + ); + }); + + beforeEach(async () => { + ({ render, history } = createAppRootMockRenderer()); + clickHandlerSpy = jest.fn(); + renderResult = render(); + linkEle = (await renderResult.findByText('mock link')) as HTMLAnchorElement; + }); + afterEach(cleanup); + + it('should navigate to path via Router', () => { + const containerClickSpy = jest.fn(); + renderResult.container.addEventListener('click', containerClickSpy); + expect(history.location.pathname).not.toEqual('/mock/path'); + act(() => { + fireEvent.click(linkEle); + }); + expect(containerClickSpy.mock.calls[0][0].defaultPrevented).toBe(true); + expect(history.location.pathname).toEqual('/mock/path'); + renderResult.container.removeEventListener('click', containerClickSpy); + }); + it('should support onClick prop', () => { + act(() => { + fireEvent.click(linkEle); + }); + expect(clickHandlerSpy).toHaveBeenCalled(); + expect(history.location.pathname).toEqual('/mock/path'); + }); + it('should not navigate if preventDefault is true', () => { + clickHandlerSpy.mockImplementation(event => { + event.preventDefault(); + }); + act(() => { + fireEvent.click(linkEle); + }); + expect(history.location.pathname).not.toEqual('/mock/path'); + }); + it('should not navigate via router if click was not the primary mouse button', async () => { + act(() => { + fireEvent.click(linkEle, { button: 2 }); + }); + expect(history.location.pathname).not.toEqual('/mock/path'); + }); + it('should not navigate via router if anchor has target', () => { + linkEle.setAttribute('target', '_top'); + act(() => { + fireEvent.click(linkEle, { button: 2 }); + }); + expect(history.location.pathname).not.toEqual('/mock/path'); + }); + it('should not to navigate if meta|alt|ctrl|shift keys are pressed', () => { + ['meta', 'alt', 'ctrl', 'shift'].forEach(key => { + act(() => { + fireEvent.click(linkEle, { [`${key}Key`]: true }); + }); + expect(history.location.pathname).not.toEqual('/mock/path'); + }); + }); +}); diff --git a/x-pack/plugins/endpoint/public/applications/endpoint/view/hooks/use_navigate_by_router_event_handler.ts b/x-pack/plugins/endpoint/public/applications/endpoint/view/hooks/use_navigate_by_router_event_handler.ts new file mode 100644 index 0000000000000..dc33f0befaf35 --- /dev/null +++ b/x-pack/plugins/endpoint/public/applications/endpoint/view/hooks/use_navigate_by_router_event_handler.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 { MouseEventHandler, useCallback } from 'react'; +import { useHistory } from 'react-router-dom'; +import { LocationDescriptorObject } from 'history'; + +type EventHandlerCallback = MouseEventHandler; + +/** + * Provides an event handler that can be used with (for example) `onClick` props to prevent the + * event's default behaviour and instead navigate to to a route via the Router + * + * @param routeTo + * @param onClick + */ +export const useNavigateByRouterEventHandler = ( + routeTo: string | [string, unknown] | LocationDescriptorObject, // Cover the calling signature of `history.push()` + + /** Additional onClick callback */ + onClick?: EventHandlerCallback +): EventHandlerCallback => { + const history = useHistory(); + return useCallback( + ev => { + try { + if (onClick) { + onClick(ev); + } + } catch (error) { + ev.preventDefault(); + throw error; + } + + if (ev.defaultPrevented) { + return; + } + + if (ev.button !== 0) { + return; + } + + if ( + ev.currentTarget instanceof HTMLAnchorElement && + ev.currentTarget.target !== '' && + ev.currentTarget.target !== '_self' + ) { + return; + } + + if (ev.metaKey || ev.altKey || ev.ctrlKey || ev.shiftKey) { + return; + } + + ev.preventDefault(); + + if (Array.isArray(routeTo)) { + history.push(...routeTo); + } else if (typeof routeTo === 'string') { + history.push(routeTo); + } else { + history.push(routeTo); + } + }, + [history, onClick, routeTo] + ); +}; diff --git a/x-pack/plugins/endpoint/public/applications/endpoint/view/hosts/details/components/flyout_sub_header.tsx b/x-pack/plugins/endpoint/public/applications/endpoint/view/hosts/details/components/flyout_sub_header.tsx index 26f2203790a9e..02f91307c988e 100644 --- a/x-pack/plugins/endpoint/public/applications/endpoint/view/hosts/details/components/flyout_sub_header.tsx +++ b/x-pack/plugins/endpoint/public/applications/endpoint/view/hosts/details/components/flyout_sub_header.tsx @@ -4,7 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ -import React, { memo } from 'react'; +import React, { memo, MouseEventHandler } from 'react'; import { EuiFlyoutHeader, CommonProps, EuiButtonEmpty } from '@elastic/eui'; import styled from 'styled-components'; @@ -12,7 +12,7 @@ export type FlyoutSubHeaderProps = CommonProps & { children: React.ReactNode; backButton?: { title: string; - onClick: (event: React.MouseEvent) => void; + onClick: MouseEventHandler; href?: string; }; }; diff --git a/x-pack/plugins/endpoint/public/applications/endpoint/view/hosts/details/host_details.tsx b/x-pack/plugins/endpoint/public/applications/endpoint/view/hosts/details/host_details.tsx index 32c69426b03f3..336308b2ee271 100644 --- a/x-pack/plugins/endpoint/public/applications/endpoint/view/hosts/details/host_details.tsx +++ b/x-pack/plugins/endpoint/public/applications/endpoint/view/hosts/details/host_details.tsx @@ -16,13 +16,13 @@ import { import React, { memo, useMemo } from 'react'; import { FormattedMessage } from '@kbn/i18n/react'; import { i18n } from '@kbn/i18n'; -import { useHistory } from 'react-router-dom'; import { HostMetadata } from '../../../../../../common/types'; import { FormattedDateAndTime } from '../../formatted_date_time'; import { LinkToApp } from '../../components/link_to_app'; import { useHostListSelector, useHostLogsUrl } from '../hooks'; import { urlFromQueryParams } from '../url_from_query_params'; import { uiQueryParams } from '../../../store/hosts/selectors'; +import { useNavigateByRouterEventHandler } from '../../hooks/use_navigate_by_router_event_handler'; const HostIds = styled(EuiListGroupItem)` margin-top: 0; @@ -34,7 +34,6 @@ const HostIds = styled(EuiListGroupItem)` export const HostDetails = memo(({ details }: { details: HostMetadata }) => { const { appId, appPath, url } = useHostLogsUrl(details.host.id); const queryParams = useHostListSelector(uiQueryParams); - const history = useHistory(); const detailsResultsUpper = useMemo(() => { return [ { @@ -65,6 +64,7 @@ export const HostDetails = memo(({ details }: { details: HostMetadata }) => { show: 'policy_response', }); }, [details.host.id, queryParams]); + const policyStatusClickHandler = useNavigateByRouterEventHandler(policyResponseUri); const detailsResultsLower = useMemo(() => { return [ @@ -84,10 +84,7 @@ export const HostDetails = memo(({ details }: { details: HostMetadata }) => { { - ev.preventDefault(); - history.push(policyResponseUri); - }} + onClick={policyStatusClickHandler} > { details.endpoint.policy.id, details.host.hostname, details.host.ip, - history, - policyResponseUri, + policyResponseUri.search, + policyStatusClickHandler, ]); return ( diff --git a/x-pack/plugins/endpoint/public/applications/endpoint/view/hosts/details/index.tsx b/x-pack/plugins/endpoint/public/applications/endpoint/view/hosts/details/index.tsx index a41d4a968f177..0c43e18822508 100644 --- a/x-pack/plugins/endpoint/public/applications/endpoint/view/hosts/details/index.tsx +++ b/x-pack/plugins/endpoint/public/applications/endpoint/view/hosts/details/index.tsx @@ -24,6 +24,7 @@ import { HostDetails } from './host_details'; import { PolicyResponse } from './policy_response'; import { HostMetadata } from '../../../../../../common/types'; import { FlyoutSubHeader, FlyoutSubHeaderProps } from './components/flyout_sub_header'; +import { useNavigateByRouterEventHandler } from '../../hooks/use_navigate_by_router_event_handler'; export const HostDetailsFlyout = memo(() => { const history = useHistory(); @@ -92,24 +93,25 @@ export const HostDetailsFlyout = memo(() => { const PolicyResponseFlyoutPanel = memo<{ hostMeta: HostMetadata; }>(({ hostMeta }) => { - const history = useHistory(); const { show, ...queryParams } = useHostListSelector(uiQueryParams); + const detailsUri = useMemo( + () => + urlFromQueryParams({ + ...queryParams, + selected_host: hostMeta.host.id, + }), + [hostMeta.host.id, queryParams] + ); + const backToDetailsClickHandler = useNavigateByRouterEventHandler(detailsUri); const backButtonProp = useMemo((): FlyoutSubHeaderProps['backButton'] => { - const detailsUri = urlFromQueryParams({ - ...queryParams, - selected_host: hostMeta.host.id, - }); return { title: i18n.translate('xpack.endpoint.host.policyResponse.backLinkTitle', { defaultMessage: 'Endpoint Details', }), href: '?' + detailsUri.search, - onClick: ev => { - ev.preventDefault(); - history.push(detailsUri); - }, + onClick: backToDetailsClickHandler, }; - }, [history, hostMeta.host.id, queryParams]); + }, [backToDetailsClickHandler, detailsUri.search]); return ( <> diff --git a/x-pack/plugins/endpoint/public/applications/endpoint/view/hosts/index.tsx b/x-pack/plugins/endpoint/public/applications/endpoint/view/hosts/index.tsx index 1d81d6e8a16db..e662bafed6492 100644 --- a/x-pack/plugins/endpoint/public/applications/endpoint/view/hosts/index.tsx +++ b/x-pack/plugins/endpoint/public/applications/endpoint/view/hosts/index.tsx @@ -4,9 +4,8 @@ * you may not use this file except in compliance with the Elastic License. */ -import React, { useMemo, useCallback } from 'react'; +import React, { useMemo, useCallback, memo } from 'react'; import { useDispatch } from 'react-redux'; -import { useHistory } from 'react-router-dom'; import { EuiPage, EuiPageBody, @@ -31,11 +30,26 @@ import { useHostListSelector } from './hooks'; import { CreateStructuredSelector } from '../../types'; import { urlFromQueryParams } from './url_from_query_params'; import { HostMetadata, Immutable } from '../../../../../common/types'; +import { useNavigateByRouterEventHandler } from '../hooks/use_navigate_by_router_event_handler'; + +const HostLink = memo<{ + name: string; + href: string; + route: ReturnType; +}>(({ name, href, route }) => { + const clickHandler = useNavigateByRouterEventHandler(route); + + return ( + // eslint-disable-next-line @elastic/eui/href-or-on-click + + {name} + + ); +}); const selector = (createStructuredSelector as CreateStructuredSelector)(selectors); export const HostList = () => { const dispatch = useDispatch<(a: HostAction) => void>(); - const history = useHistory(); const { listData, pageIndex, @@ -75,18 +89,9 @@ export const HostList = () => { defaultMessage: 'Hostname', }), render: ({ host: { hostname, id } }: { host: { hostname: string; id: string } }) => { + const newQueryParams = urlFromQueryParams({ ...queryParams, selected_host: id }); return ( - // eslint-disable-next-line @elastic/eui/href-or-on-click - { - ev.preventDefault(); - history.push(urlFromQueryParams({ ...queryParams, selected_host: id })); - }} - > - {hostname} - + ); }, }, @@ -150,7 +155,7 @@ export const HostList = () => { }, }, ]; - }, [queryParams, history]); + }, [queryParams]); return ( diff --git a/x-pack/plugins/endpoint/public/applications/endpoint/view/policy/policy_details.test.tsx b/x-pack/plugins/endpoint/public/applications/endpoint/view/policy/policy_details.test.tsx index 2ecc2b117bf01..d780b7bde8af3 100644 --- a/x-pack/plugins/endpoint/public/applications/endpoint/view/policy/policy_details.test.tsx +++ b/x-pack/plugins/endpoint/public/applications/endpoint/view/policy/policy_details.test.tsx @@ -101,7 +101,7 @@ describe('Policy Details', () => { 'EuiPageHeaderSection[data-test-subj="pageViewHeaderLeft"] EuiButtonEmpty' ); expect(history.location.pathname).toEqual('/policy/1'); - backToListButton.simulate('click'); + backToListButton.simulate('click', { button: 0 }); expect(history.location.pathname).toEqual('/policy'); }); it('should display agent stats', async () => { @@ -130,7 +130,7 @@ describe('Policy Details', () => { 'EuiButtonEmpty[data-test-subj="policyDetailsCancelButton"]' ); expect(history.location.pathname).toEqual('/policy/1'); - cancelbutton.simulate('click'); + cancelbutton.simulate('click', { button: 0 }); expect(history.location.pathname).toEqual('/policy'); }); it('should display save button', async () => { diff --git a/x-pack/plugins/endpoint/public/applications/endpoint/view/policy/policy_details.tsx b/x-pack/plugins/endpoint/public/applications/endpoint/view/policy/policy_details.tsx index 076de7b57b44b..ea9eb292dba1a 100644 --- a/x-pack/plugins/endpoint/public/applications/endpoint/view/policy/policy_details.tsx +++ b/x-pack/plugins/endpoint/public/applications/endpoint/view/policy/policy_details.tsx @@ -20,7 +20,6 @@ import { import { FormattedMessage } from '@kbn/i18n/react'; import { i18n } from '@kbn/i18n'; import { useDispatch } from 'react-redux'; -import { useHistory } from 'react-router-dom'; import { usePolicyDetailsSelector } from './policy_hooks'; import { policyDetails, @@ -36,11 +35,11 @@ import { AgentsSummary } from './agents_summary'; import { VerticalDivider } from './vertical_divider'; import { WindowsEvents, MacEvents, LinuxEvents } from './policy_forms/events'; import { MalwareProtections } from './policy_forms/protections/malware'; +import { useNavigateByRouterEventHandler } from '../hooks/use_navigate_by_router_event_handler'; export const PolicyDetails = React.memo(() => { const dispatch = useDispatch<(action: AppAction) => void>(); const { notifications, services } = useKibana(); - const history = useHistory(); // Store values const policyItem = usePolicyDetailsSelector(policyDetails); @@ -82,13 +81,7 @@ export const PolicyDetails = React.memo(() => { } }, [notifications.toasts, policyItem, policyName, policyUpdateStatus]); - const handleBackToListOnClick: React.MouseEventHandler = useCallback( - ev => { - ev.preventDefault(); - history.push(`/policy`); - }, - [history] - ); + const handleBackToListOnClick = useNavigateByRouterEventHandler('/policy'); const handleSaveOnClick = useCallback(() => { setShowConfirm(true); diff --git a/x-pack/plugins/endpoint/public/applications/endpoint/view/policy/policy_list.tsx b/x-pack/plugins/endpoint/public/applications/endpoint/view/policy/policy_list.tsx index 062c7afb6706d..f7eafff137f51 100644 --- a/x-pack/plugins/endpoint/public/applications/endpoint/view/policy/policy_list.tsx +++ b/x-pack/plugins/endpoint/public/applications/endpoint/view/policy/policy_list.tsx @@ -24,30 +24,26 @@ import { useKibana } from '../../../../../../../../src/plugins/kibana_react/publ import { PageView } from '../components/page_view'; import { LinkToApp } from '../components/link_to_app'; import { Immutable, PolicyData } from '../../../../../common/types'; +import { useNavigateByRouterEventHandler } from '../hooks/use_navigate_by_router_event_handler'; interface TableChangeCallbackArguments { page: { index: number; size: number }; } -const PolicyLink: React.FC<{ name: string; route: string }> = ({ name, route }) => { - const history = useHistory(); - +const PolicyLink: React.FC<{ name: string; route: string; href: string }> = ({ + name, + route, + href, +}) => { + const clickHandler = useNavigateByRouterEventHandler(route); return ( - { - event.preventDefault(); - history.push(route); - }} - > + // eslint-disable-next-line @elastic/eui/href-or-on-click + {name} ); }; -const renderPolicyNameLink = (value: string, item: Immutable) => { - return ; -}; - export const PolicyList = React.memo(() => { const { services, notifications } = useKibana(); const history = useHistory(); @@ -95,7 +91,16 @@ export const PolicyList = React.memo(() => { name: i18n.translate('xpack.endpoint.policyList.nameField', { defaultMessage: 'Policy Name', }), - render: renderPolicyNameLink, + render: (value: string, item: Immutable) => { + const routeUri = `/policy/${item.id}`; + return ( + + ); + }, truncateText: true, }, { From 592a0ff22423387600258fecdb3f44c0a39e4dda Mon Sep 17 00:00:00 2001 From: Ryland Herrick Date: Tue, 21 Apr 2020 15:33:27 -0500 Subject: [PATCH 24/67] [SIEM] New Platform Saved Objects Registration (#64029) * WIP: Register saved objects types in NP This works, but responsibilities are spread around. Refactor incoming. * Moves new SO definitions into corresponding folders This way our top-level file still acts as the index, but these are more/less unconnected if/when we split these out into separate applications. * Replace raw SO updates with our ruleStatusSavedObjectsClient This mainly consolidates the SO type name and the attributes type to a single file so that we don't have to import both any time we want to work with RuleStatus SavedObjects. --- x-pack/legacy/plugins/siem/index.ts | 4 - .../routes/rules/create_rules_route.ts | 8 +- .../routes/rules/delete_rules_bulk_route.ts | 18 +- .../routes/rules/delete_rules_route.ts | 17 +- .../routes/rules/find_rules_route.ts | 13 +- .../routes/rules/find_rules_status_route.ts | 9 +- .../routes/rules/patch_rules_bulk_route.ts | 13 +- .../routes/rules/patch_rules_route.ts | 13 +- .../routes/rules/read_rules_route.ts | 13 +- .../routes/rules/update_rules_bulk_route.ts | 13 +- .../routes/rules/update_rules_route.ts | 13 +- .../rule_actions/saved_object_mappings.ts | 60 ++- .../lib/detection_engine/rules/patch_rules.ts | 28 +- .../rules/saved_object_mappings.ts | 77 +-- .../detection_engine/rules/update_rules.ts | 28 +- .../signals/__mocks__/es_results.ts | 2 +- .../siem/server/lib/note/saved_object.ts | 2 +- .../server/lib/note/saved_object_mappings.ts | 58 +-- .../server/lib/pinned_event/saved_object.ts | 3 +- .../lib/pinned_event/saved_object_mappings.ts | 52 +- .../timeline/routes/utils/export_timelines.ts | 9 +- .../lib/timeline/saved_object_mappings.ts | 476 +++++++++--------- x-pack/plugins/siem/server/plugin.ts | 21 +- x-pack/plugins/siem/server/saved_objects.ts | 43 +- 24 files changed, 464 insertions(+), 529 deletions(-) diff --git a/x-pack/legacy/plugins/siem/index.ts b/x-pack/legacy/plugins/siem/index.ts index 5ffaea1ee73df..d572561944a76 100644 --- a/x-pack/legacy/plugins/siem/index.ts +++ b/x-pack/legacy/plugins/siem/index.ts @@ -8,9 +8,6 @@ import { i18n } from '@kbn/i18n'; import { resolve } from 'path'; import { Root } from 'joi'; -// eslint-disable-next-line @kbn/eslint/no-restricted-paths -import { savedObjectMappings } from '../../../plugins/siem/server/saved_objects'; - import { APP_ID, APP_NAME } from '../../../plugins/siem/common/constants'; import { DEFAULT_APP_CATEGORIES } from '../../../../src/core/utils'; @@ -46,7 +43,6 @@ export const siem = (kibana: any) => { category: DEFAULT_APP_CATEGORIES.security, }, ], - mappings: savedObjectMappings, }, config(Joi: Root) { return Joi.object() diff --git a/x-pack/plugins/siem/server/lib/detection_engine/routes/rules/create_rules_route.ts b/x-pack/plugins/siem/server/lib/detection_engine/routes/rules/create_rules_route.ts index aa7a5cb0da7fd..9f1cddb2051c9 100644 --- a/x-pack/plugins/siem/server/lib/detection_engine/routes/rules/create_rules_route.ts +++ b/x-pack/plugins/siem/server/lib/detection_engine/routes/rules/create_rules_route.ts @@ -9,10 +9,8 @@ import uuid from 'uuid'; import { IRouter } from '../../../../../../../../src/core/server'; import { DETECTION_ENGINE_RULES_URL } from '../../../../../common/constants'; import { createRules } from '../../rules/create_rules'; -import { IRuleSavedAttributesSavedObjectAttributes } from '../../rules/types'; import { readRules } from '../../rules/read_rules'; import { RuleAlertParamsRest } from '../../types'; -import { ruleStatusSavedObjectType } from '../../rules/saved_object_mappings'; import { transformValidate } from './validate'; import { getIndexExists } from '../../index/get_index_exists'; import { createRulesSchema } from '../schemas/create_rules_schema'; @@ -23,6 +21,7 @@ import { validateLicenseForRuleType, } from '../utils'; import { updateRulesNotifications } from '../../rules/update_rules_notifications'; +import { ruleStatusSavedObjectsClientFactory } from '../../signals/rule_status_saved_objects_client'; export const createRulesRoute = (router: IRouter): void => { router.post( @@ -145,10 +144,7 @@ export const createRulesRoute = (router: IRouter): void => { name, }); - const ruleStatuses = await savedObjectsClient.find< - IRuleSavedAttributesSavedObjectAttributes - >({ - type: ruleStatusSavedObjectType, + const ruleStatuses = await ruleStatusSavedObjectsClientFactory(savedObjectsClient).find({ perPage: 1, sortField: 'statusDate', sortOrder: 'desc', diff --git a/x-pack/plugins/siem/server/lib/detection_engine/routes/rules/delete_rules_bulk_route.ts b/x-pack/plugins/siem/server/lib/detection_engine/routes/rules/delete_rules_bulk_route.ts index 38748e287ab45..b35ba27ef3561 100644 --- a/x-pack/plugins/siem/server/lib/detection_engine/routes/rules/delete_rules_bulk_route.ts +++ b/x-pack/plugins/siem/server/lib/detection_engine/routes/rules/delete_rules_bulk_route.ts @@ -11,14 +11,11 @@ import { rulesBulkSchema } from '../schemas/response/rules_bulk_schema'; import { getIdBulkError } from './utils'; import { transformValidateBulkError, validate } from './validate'; import { transformBulkError, buildRouteValidation, buildSiemResponse } from '../utils'; -import { - IRuleSavedAttributesSavedObjectAttributes, - DeleteRulesRequestParams, -} from '../../rules/types'; +import { DeleteRulesRequestParams } from '../../rules/types'; import { deleteRules } from '../../rules/delete_rules'; import { deleteNotifications } from '../../notifications/delete_notifications'; -import { ruleStatusSavedObjectType } from '../../rules/saved_object_mappings'; import { deleteRuleActionsSavedObject } from '../../rule_actions/delete_rule_actions_saved_object'; +import { ruleStatusSavedObjectsClientFactory } from '../../signals/rule_status_saved_objects_client'; type Config = RouteConfig; type Handler = RequestHandler; @@ -44,6 +41,8 @@ export const deleteRulesBulkRoute = (router: IRouter) => { return siemResponse.error({ statusCode: 404 }); } + const ruleStatusClient = ruleStatusSavedObjectsClientFactory(savedObjectsClient); + const rules = await Promise.all( request.body.map(async payloadRule => { const { id, rule_id: ruleId } = payloadRule; @@ -61,17 +60,12 @@ export const deleteRulesBulkRoute = (router: IRouter) => { ruleAlertId: rule.id, savedObjectsClient, }); - const ruleStatuses = await savedObjectsClient.find< - IRuleSavedAttributesSavedObjectAttributes - >({ - type: ruleStatusSavedObjectType, + const ruleStatuses = await ruleStatusClient.find({ perPage: 6, search: rule.id, searchFields: ['alertId'], }); - ruleStatuses.saved_objects.forEach(async obj => - savedObjectsClient.delete(ruleStatusSavedObjectType, obj.id) - ); + ruleStatuses.saved_objects.forEach(async obj => ruleStatusClient.delete(obj.id)); return transformValidateBulkError(idOrRuleIdOrUnknown, rule, undefined, ruleStatuses); } else { return getIdBulkError({ id, ruleId }); diff --git a/x-pack/plugins/siem/server/lib/detection_engine/routes/rules/delete_rules_route.ts b/x-pack/plugins/siem/server/lib/detection_engine/routes/rules/delete_rules_route.ts index 098d556741fed..2288633ee8d2e 100644 --- a/x-pack/plugins/siem/server/lib/detection_engine/routes/rules/delete_rules_route.ts +++ b/x-pack/plugins/siem/server/lib/detection_engine/routes/rules/delete_rules_route.ts @@ -11,13 +11,10 @@ import { queryRulesSchema } from '../schemas/query_rules_schema'; import { getIdError } from './utils'; import { transformValidate } from './validate'; import { buildRouteValidation, transformError, buildSiemResponse } from '../utils'; -import { - DeleteRuleRequestParams, - IRuleSavedAttributesSavedObjectAttributes, -} from '../../rules/types'; -import { ruleStatusSavedObjectType } from '../../rules/saved_object_mappings'; +import { DeleteRuleRequestParams } from '../../rules/types'; import { deleteNotifications } from '../../notifications/delete_notifications'; import { deleteRuleActionsSavedObject } from '../../rule_actions/delete_rule_actions_saved_object'; +import { ruleStatusSavedObjectsClientFactory } from '../../signals/rule_status_saved_objects_client'; export const deleteRulesRoute = (router: IRouter) => { router.delete( @@ -44,6 +41,7 @@ export const deleteRulesRoute = (router: IRouter) => { return siemResponse.error({ statusCode: 404 }); } + const ruleStatusClient = ruleStatusSavedObjectsClientFactory(savedObjectsClient); const rule = await deleteRules({ actionsClient, alertsClient, @@ -56,17 +54,12 @@ export const deleteRulesRoute = (router: IRouter) => { ruleAlertId: rule.id, savedObjectsClient, }); - const ruleStatuses = await savedObjectsClient.find< - IRuleSavedAttributesSavedObjectAttributes - >({ - type: ruleStatusSavedObjectType, + const ruleStatuses = await ruleStatusClient.find({ perPage: 6, search: rule.id, searchFields: ['alertId'], }); - ruleStatuses.saved_objects.forEach(async obj => - savedObjectsClient.delete(ruleStatusSavedObjectType, obj.id) - ); + ruleStatuses.saved_objects.forEach(async obj => ruleStatusClient.delete(obj.id)); const [validated, errors] = transformValidate( rule, undefined, diff --git a/x-pack/plugins/siem/server/lib/detection_engine/routes/rules/find_rules_route.ts b/x-pack/plugins/siem/server/lib/detection_engine/routes/rules/find_rules_route.ts index 9661fac81497c..f293b9e64a316 100644 --- a/x-pack/plugins/siem/server/lib/detection_engine/routes/rules/find_rules_route.ts +++ b/x-pack/plugins/siem/server/lib/detection_engine/routes/rules/find_rules_route.ts @@ -7,15 +7,12 @@ import { IRouter } from '../../../../../../../../src/core/server'; import { DETECTION_ENGINE_RULES_URL } from '../../../../../common/constants'; import { findRules } from '../../rules/find_rules'; -import { - FindRulesRequestParams, - IRuleSavedAttributesSavedObjectAttributes, -} from '../../rules/types'; +import { FindRulesRequestParams } from '../../rules/types'; import { findRulesSchema } from '../schemas/find_rules_schema'; import { transformValidateFindAlerts } from './validate'; import { buildRouteValidation, transformError, buildSiemResponse } from '../utils'; -import { ruleStatusSavedObjectType } from '../../rules/saved_object_mappings'; import { getRuleActionsSavedObject } from '../../rule_actions/get_rule_actions_saved_object'; +import { ruleStatusSavedObjectsClientFactory } from '../../signals/rule_status_saved_objects_client'; export const findRulesRoute = (router: IRouter) => { router.get( @@ -40,6 +37,7 @@ export const findRulesRoute = (router: IRouter) => { return siemResponse.error({ statusCode: 404 }); } + const ruleStatusClient = ruleStatusSavedObjectsClientFactory(savedObjectsClient); const rules = await findRules({ alertsClient, perPage: query.per_page, @@ -50,10 +48,7 @@ export const findRulesRoute = (router: IRouter) => { }); const ruleStatuses = await Promise.all( rules.data.map(async rule => { - const results = await savedObjectsClient.find< - IRuleSavedAttributesSavedObjectAttributes - >({ - type: ruleStatusSavedObjectType, + const results = await ruleStatusClient.find({ perPage: 1, sortField: 'statusDate', sortOrder: 'desc', diff --git a/x-pack/plugins/siem/server/lib/detection_engine/routes/rules/find_rules_status_route.ts b/x-pack/plugins/siem/server/lib/detection_engine/routes/rules/find_rules_status_route.ts index 6b54a25a1b1c4..8e35fecf6a652 100644 --- a/x-pack/plugins/siem/server/lib/detection_engine/routes/rules/find_rules_status_route.ts +++ b/x-pack/plugins/siem/server/lib/detection_engine/routes/rules/find_rules_status_route.ts @@ -9,17 +9,16 @@ import { DETECTION_ENGINE_RULES_URL } from '../../../../../common/constants'; import { findRulesStatusesSchema } from '../schemas/find_rules_statuses_schema'; import { FindRulesStatusesRequestParams, - IRuleSavedAttributesSavedObjectAttributes, RuleStatusResponse, IRuleStatusAttributes, } from '../../rules/types'; -import { ruleStatusSavedObjectType } from '../../rules/saved_object_mappings'; import { buildRouteValidation, transformError, convertToSnakeCase, buildSiemResponse, } from '../utils'; +import { ruleStatusSavedObjectsClientFactory } from '../../signals/rule_status_saved_objects_client'; export const findRulesStatusesRoute = (router: IRouter) => { router.post( @@ -50,12 +49,10 @@ export const findRulesStatusesRoute = (router: IRouter) => { } */ try { + const ruleStatusClient = ruleStatusSavedObjectsClientFactory(savedObjectsClient); const statuses = await body.ids.reduce>( async (acc, id) => { - const lastFiveErrorsForId = await savedObjectsClient.find< - IRuleSavedAttributesSavedObjectAttributes - >({ - type: ruleStatusSavedObjectType, + const lastFiveErrorsForId = await ruleStatusClient.find({ perPage: 6, sortField: 'statusDate', sortOrder: 'desc', diff --git a/x-pack/plugins/siem/server/lib/detection_engine/routes/rules/patch_rules_bulk_route.ts b/x-pack/plugins/siem/server/lib/detection_engine/routes/rules/patch_rules_bulk_route.ts index e4236f4632dcd..534253db65d78 100644 --- a/x-pack/plugins/siem/server/lib/detection_engine/routes/rules/patch_rules_bulk_route.ts +++ b/x-pack/plugins/siem/server/lib/detection_engine/routes/rules/patch_rules_bulk_route.ts @@ -6,10 +6,7 @@ import { IRouter } from '../../../../../../../../src/core/server'; import { DETECTION_ENGINE_RULES_URL } from '../../../../../common/constants'; -import { - IRuleSavedAttributesSavedObjectAttributes, - PatchRuleAlertParamsRest, -} from '../../rules/types'; +import { PatchRuleAlertParamsRest } from '../../rules/types'; import { transformBulkError, buildRouteValidation, @@ -21,8 +18,8 @@ import { transformValidateBulkError, validate } from './validate'; import { patchRulesBulkSchema } from '../schemas/patch_rules_bulk_schema'; import { rulesBulkSchema } from '../schemas/response/rules_bulk_schema'; import { patchRules } from '../../rules/patch_rules'; -import { ruleStatusSavedObjectType } from '../../rules/saved_object_mappings'; import { updateRulesNotifications } from '../../rules/update_rules_notifications'; +import { ruleStatusSavedObjectsClientFactory } from '../../signals/rule_status_saved_objects_client'; export const patchRulesBulkRoute = (router: IRouter) => { router.patch( @@ -46,6 +43,7 @@ export const patchRulesBulkRoute = (router: IRouter) => { return siemResponse.error({ statusCode: 404 }); } + const ruleStatusClient = ruleStatusSavedObjectsClientFactory(savedObjectsClient); const rules = await Promise.all( request.body.map(async payloadRule => { const { @@ -131,10 +129,7 @@ export const patchRulesBulkRoute = (router: IRouter) => { throttle, name: rule.name, }); - const ruleStatuses = await savedObjectsClient.find< - IRuleSavedAttributesSavedObjectAttributes - >({ - type: ruleStatusSavedObjectType, + const ruleStatuses = await ruleStatusClient.find({ perPage: 1, sortField: 'statusDate', sortOrder: 'desc', diff --git a/x-pack/plugins/siem/server/lib/detection_engine/routes/rules/patch_rules_route.ts b/x-pack/plugins/siem/server/lib/detection_engine/routes/rules/patch_rules_route.ts index 23469144e11f8..f7932cb016ba7 100644 --- a/x-pack/plugins/siem/server/lib/detection_engine/routes/rules/patch_rules_route.ts +++ b/x-pack/plugins/siem/server/lib/detection_engine/routes/rules/patch_rules_route.ts @@ -7,10 +7,7 @@ import { IRouter } from '../../../../../../../../src/core/server'; import { DETECTION_ENGINE_RULES_URL } from '../../../../../common/constants'; import { patchRules } from '../../rules/patch_rules'; -import { - PatchRuleAlertParamsRest, - IRuleSavedAttributesSavedObjectAttributes, -} from '../../rules/types'; +import { PatchRuleAlertParamsRest } from '../../rules/types'; import { patchRulesSchema } from '../schemas/patch_rules_schema'; import { buildRouteValidation, @@ -20,8 +17,8 @@ import { } from '../utils'; import { getIdError } from './utils'; import { transformValidate } from './validate'; -import { ruleStatusSavedObjectType } from '../../rules/saved_object_mappings'; import { updateRulesNotifications } from '../../rules/update_rules_notifications'; +import { ruleStatusSavedObjectsClientFactory } from '../../signals/rule_status_saved_objects_client'; export const patchRulesRoute = (router: IRouter) => { router.patch( @@ -83,6 +80,7 @@ export const patchRulesRoute = (router: IRouter) => { return siemResponse.error({ statusCode: 404 }); } + const ruleStatusClient = ruleStatusSavedObjectsClientFactory(savedObjectsClient); const rule = await patchRules({ actionsClient, alertsClient, @@ -127,10 +125,7 @@ export const patchRulesRoute = (router: IRouter) => { throttle, name: rule.name, }); - const ruleStatuses = await savedObjectsClient.find< - IRuleSavedAttributesSavedObjectAttributes - >({ - type: ruleStatusSavedObjectType, + const ruleStatuses = await ruleStatusClient.find({ perPage: 1, sortField: 'statusDate', sortOrder: 'desc', diff --git a/x-pack/plugins/siem/server/lib/detection_engine/routes/rules/read_rules_route.ts b/x-pack/plugins/siem/server/lib/detection_engine/routes/rules/read_rules_route.ts index 4d23e0217f2e8..cedd7ccd1a411 100644 --- a/x-pack/plugins/siem/server/lib/detection_engine/routes/rules/read_rules_route.ts +++ b/x-pack/plugins/siem/server/lib/detection_engine/routes/rules/read_rules_route.ts @@ -11,12 +11,9 @@ import { transformValidate } from './validate'; import { buildRouteValidation, transformError, buildSiemResponse } from '../utils'; import { readRules } from '../../rules/read_rules'; import { queryRulesSchema } from '../schemas/query_rules_schema'; -import { - ReadRuleRequestParams, - IRuleSavedAttributesSavedObjectAttributes, -} from '../../rules/types'; -import { ruleStatusSavedObjectType } from '../../rules/saved_object_mappings'; +import { ReadRuleRequestParams } from '../../rules/types'; import { getRuleActionsSavedObject } from '../../rule_actions/get_rule_actions_saved_object'; +import { ruleStatusSavedObjectsClientFactory } from '../../signals/rule_status_saved_objects_client'; export const readRulesRoute = (router: IRouter) => { router.get( @@ -41,6 +38,7 @@ export const readRulesRoute = (router: IRouter) => { return siemResponse.error({ statusCode: 404 }); } + const ruleStatusClient = ruleStatusSavedObjectsClientFactory(savedObjectsClient); const rule = await readRules({ alertsClient, id, @@ -51,10 +49,7 @@ export const readRulesRoute = (router: IRouter) => { savedObjectsClient, ruleAlertId: rule.id, }); - const ruleStatuses = await savedObjectsClient.find< - IRuleSavedAttributesSavedObjectAttributes - >({ - type: ruleStatusSavedObjectType, + const ruleStatuses = await ruleStatusClient.find({ perPage: 1, sortField: 'statusDate', sortOrder: 'desc', diff --git a/x-pack/plugins/siem/server/lib/detection_engine/routes/rules/update_rules_bulk_route.ts b/x-pack/plugins/siem/server/lib/detection_engine/routes/rules/update_rules_bulk_route.ts index a2fb78747ff04..f929f2fb3f649 100644 --- a/x-pack/plugins/siem/server/lib/detection_engine/routes/rules/update_rules_bulk_route.ts +++ b/x-pack/plugins/siem/server/lib/detection_engine/routes/rules/update_rules_bulk_route.ts @@ -6,10 +6,7 @@ import { IRouter } from '../../../../../../../../src/core/server'; import { DETECTION_ENGINE_RULES_URL } from '../../../../../common/constants'; -import { - IRuleSavedAttributesSavedObjectAttributes, - UpdateRuleAlertParamsRest, -} from '../../rules/types'; +import { UpdateRuleAlertParamsRest } from '../../rules/types'; import { getIdBulkError } from './utils'; import { transformValidateBulkError, validate } from './validate'; import { @@ -19,10 +16,10 @@ import { validateLicenseForRuleType, } from '../utils'; import { updateRulesBulkSchema } from '../schemas/update_rules_bulk_schema'; -import { ruleStatusSavedObjectType } from '../../rules/saved_object_mappings'; import { updateRules } from '../../rules/update_rules'; import { rulesBulkSchema } from '../schemas/response/rules_bulk_schema'; import { updateRulesNotifications } from '../../rules/update_rules_notifications'; +import { ruleStatusSavedObjectsClientFactory } from '../../signals/rule_status_saved_objects_client'; export const updateRulesBulkRoute = (router: IRouter) => { router.put( @@ -47,6 +44,7 @@ export const updateRulesBulkRoute = (router: IRouter) => { return siemResponse.error({ statusCode: 404 }); } + const ruleStatusClient = ruleStatusSavedObjectsClientFactory(savedObjectsClient); const rules = await Promise.all( request.body.map(async payloadRule => { const { @@ -134,10 +132,7 @@ export const updateRulesBulkRoute = (router: IRouter) => { throttle, name, }); - const ruleStatuses = await savedObjectsClient.find< - IRuleSavedAttributesSavedObjectAttributes - >({ - type: ruleStatusSavedObjectType, + const ruleStatuses = await ruleStatusClient.find({ perPage: 1, sortField: 'statusDate', sortOrder: 'desc', diff --git a/x-pack/plugins/siem/server/lib/detection_engine/routes/rules/update_rules_route.ts b/x-pack/plugins/siem/server/lib/detection_engine/routes/rules/update_rules_route.ts index 91a32c19eb5e7..dedc2c914410a 100644 --- a/x-pack/plugins/siem/server/lib/detection_engine/routes/rules/update_rules_route.ts +++ b/x-pack/plugins/siem/server/lib/detection_engine/routes/rules/update_rules_route.ts @@ -6,10 +6,7 @@ import { IRouter } from '../../../../../../../../src/core/server'; import { DETECTION_ENGINE_RULES_URL } from '../../../../../common/constants'; -import { - UpdateRuleAlertParamsRest, - IRuleSavedAttributesSavedObjectAttributes, -} from '../../rules/types'; +import { UpdateRuleAlertParamsRest } from '../../rules/types'; import { updateRulesSchema } from '../schemas/update_rules_schema'; import { buildRouteValidation, @@ -19,9 +16,9 @@ import { } from '../utils'; import { getIdError } from './utils'; import { transformValidate } from './validate'; -import { ruleStatusSavedObjectType } from '../../rules/saved_object_mappings'; import { updateRules } from '../../rules/update_rules'; import { updateRulesNotifications } from '../../rules/update_rules_notifications'; +import { ruleStatusSavedObjectsClientFactory } from '../../signals/rule_status_saved_objects_client'; export const updateRulesRoute = (router: IRouter) => { router.put( @@ -78,6 +75,7 @@ export const updateRulesRoute = (router: IRouter) => { const actionsClient = context.actions?.getActionsClient(); const savedObjectsClient = context.core.savedObjects.client; const siemClient = context.siem?.getSiemClient(); + const ruleStatusClient = ruleStatusSavedObjectsClientFactory(savedObjectsClient); if (!siemClient || !actionsClient || !alertsClient) { return siemResponse.error({ statusCode: 404 }); @@ -131,10 +129,7 @@ export const updateRulesRoute = (router: IRouter) => { throttle, name, }); - const ruleStatuses = await savedObjectsClient.find< - IRuleSavedAttributesSavedObjectAttributes - >({ - type: ruleStatusSavedObjectType, + const ruleStatuses = await ruleStatusClient.find({ perPage: 1, sortField: 'statusDate', sortOrder: 'desc', diff --git a/x-pack/plugins/siem/server/lib/detection_engine/rule_actions/saved_object_mappings.ts b/x-pack/plugins/siem/server/lib/detection_engine/rule_actions/saved_object_mappings.ts index f54f43c41ef6e..d50c339c95266 100644 --- a/x-pack/plugins/siem/server/lib/detection_engine/rule_actions/saved_object_mappings.ts +++ b/x-pack/plugins/siem/server/lib/detection_engine/rule_actions/saved_object_mappings.ts @@ -4,37 +4,45 @@ * you may not use this file except in compliance with the Elastic License. */ +import { SavedObjectsType } from '../../../../../../../src/core/server'; + export const ruleActionsSavedObjectType = 'siem-detection-engine-rule-actions'; export const ruleActionsSavedObjectMappings = { - [ruleActionsSavedObjectType]: { - properties: { - alertThrottle: { - type: 'keyword', - }, - ruleAlertId: { - type: 'keyword', - }, - ruleThrottle: { - type: 'keyword', - }, - actions: { - properties: { - group: { - type: 'keyword', - }, - id: { - type: 'keyword', - }, - action_type_id: { - type: 'keyword', - }, - params: { - dynamic: true, - properties: {}, - }, + properties: { + alertThrottle: { + type: 'keyword', + }, + ruleAlertId: { + type: 'keyword', + }, + ruleThrottle: { + type: 'keyword', + }, + actions: { + properties: { + group: { + type: 'keyword', + }, + id: { + type: 'keyword', + }, + action_type_id: { + type: 'keyword', + }, + params: { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + dynamic: true as any, + properties: {}, }, }, }, }, }; + +export const type: SavedObjectsType = { + name: ruleActionsSavedObjectType, + hidden: false, + namespaceType: 'single', + mappings: ruleActionsSavedObjectMappings, +}; diff --git a/x-pack/plugins/siem/server/lib/detection_engine/rules/patch_rules.ts b/x-pack/plugins/siem/server/lib/detection_engine/rules/patch_rules.ts index c23f539b58160..85b13ed9cf4ed 100644 --- a/x-pack/plugins/siem/server/lib/detection_engine/rules/patch_rules.ts +++ b/x-pack/plugins/siem/server/lib/detection_engine/rules/patch_rules.ts @@ -7,10 +7,10 @@ import { defaults } from 'lodash/fp'; import { PartialAlert } from '../../../../../alerting/server'; import { readRules } from './read_rules'; -import { PatchRuleParams, IRuleSavedAttributesSavedObjectAttributes } from './types'; +import { PatchRuleParams } from './types'; import { addTags } from './add_tags'; -import { ruleStatusSavedObjectType } from './saved_object_mappings'; import { calculateVersion, calculateName, calculateInterval } from './utils'; +import { ruleStatusSavedObjectsClientFactory } from '../signals/rule_status_saved_objects_client'; export const patchRules = async ({ alertsClient, @@ -134,22 +134,22 @@ export const patchRules = async ({ await alertsClient.disable({ id: rule.id }); } else if (!rule.enabled && enabled === true) { await alertsClient.enable({ id: rule.id }); - const ruleCurrentStatus = savedObjectsClient - ? await savedObjectsClient.find({ - type: ruleStatusSavedObjectType, - perPage: 1, - sortField: 'statusDate', - sortOrder: 'desc', - search: rule.id, - searchFields: ['alertId'], - }) - : null; + + const ruleStatusClient = ruleStatusSavedObjectsClientFactory(savedObjectsClient); + const ruleCurrentStatus = await ruleStatusClient.find({ + perPage: 1, + sortField: 'statusDate', + sortOrder: 'desc', + search: rule.id, + searchFields: ['alertId'], + }); + // set current status for this rule to be 'going to run' if (ruleCurrentStatus && ruleCurrentStatus.saved_objects.length > 0) { const currentStatusToDisable = ruleCurrentStatus.saved_objects[0]; - currentStatusToDisable.attributes.status = 'going to run'; - await savedObjectsClient?.update(ruleStatusSavedObjectType, currentStatusToDisable.id, { + await ruleStatusClient.update(currentStatusToDisable.id, { ...currentStatusToDisable.attributes, + status: 'going to run', }); } } else { diff --git a/x-pack/plugins/siem/server/lib/detection_engine/rules/saved_object_mappings.ts b/x-pack/plugins/siem/server/lib/detection_engine/rules/saved_object_mappings.ts index 1d91def5fa6cc..2dcc90240ad40 100644 --- a/x-pack/plugins/siem/server/lib/detection_engine/rules/saved_object_mappings.ts +++ b/x-pack/plugins/siem/server/lib/detection_engine/rules/saved_object_mappings.ts @@ -4,44 +4,51 @@ * you may not use this file except in compliance with the Elastic License. */ +import { SavedObjectsType } from '../../../../../../../src/core/server'; + export const ruleStatusSavedObjectType = 'siem-detection-engine-rule-status'; export const ruleStatusSavedObjectMappings = { - [ruleStatusSavedObjectType]: { - properties: { - alertId: { - type: 'keyword', - }, - status: { - type: 'keyword', - }, - statusDate: { - type: 'date', - }, - lastFailureAt: { - type: 'date', - }, - lastSuccessAt: { - type: 'date', - }, - lastFailureMessage: { - type: 'text', - }, - lastSuccessMessage: { - type: 'text', - }, - lastLookBackDate: { - type: 'date', - }, - gap: { - type: 'text', - }, - bulkCreateTimeDurations: { - type: 'float', - }, - searchAfterTimeDurations: { - type: 'float', - }, + properties: { + alertId: { + type: 'keyword', + }, + status: { + type: 'keyword', + }, + statusDate: { + type: 'date', + }, + lastFailureAt: { + type: 'date', + }, + lastSuccessAt: { + type: 'date', + }, + lastFailureMessage: { + type: 'text', + }, + lastSuccessMessage: { + type: 'text', + }, + lastLookBackDate: { + type: 'date', + }, + gap: { + type: 'text', + }, + bulkCreateTimeDurations: { + type: 'float', + }, + searchAfterTimeDurations: { + type: 'float', }, }, }; + +export const type: SavedObjectsType = { + name: ruleStatusSavedObjectType, + hidden: false, + namespaceType: 'single', + mappings: ruleStatusSavedObjectMappings, +}; diff --git a/x-pack/plugins/siem/server/lib/detection_engine/rules/update_rules.ts b/x-pack/plugins/siem/server/lib/detection_engine/rules/update_rules.ts index 7ddbbd76b0661..29c2cfdf91076 100644 --- a/x-pack/plugins/siem/server/lib/detection_engine/rules/update_rules.ts +++ b/x-pack/plugins/siem/server/lib/detection_engine/rules/update_rules.ts @@ -7,11 +7,11 @@ import { transformRuleToAlertAction } from '../../../../common/detection_engine/transform_actions'; import { PartialAlert } from '../../../../../alerting/server'; import { readRules } from './read_rules'; -import { IRuleSavedAttributesSavedObjectAttributes, UpdateRuleParams } from './types'; +import { UpdateRuleParams } from './types'; import { addTags } from './add_tags'; -import { ruleStatusSavedObjectType } from './saved_object_mappings'; import { calculateVersion } from './utils'; import { hasListsFeature } from '../feature_flags'; +import { ruleStatusSavedObjectsClientFactory } from '../signals/rule_status_saved_objects_client'; export const updateRules = async ({ alertsClient, @@ -129,22 +129,22 @@ export const updateRules = async ({ await alertsClient.disable({ id: rule.id }); } else if (!rule.enabled && enabled === true) { await alertsClient.enable({ id: rule.id }); - const ruleCurrentStatus = savedObjectsClient - ? await savedObjectsClient.find({ - type: ruleStatusSavedObjectType, - perPage: 1, - sortField: 'statusDate', - sortOrder: 'desc', - search: rule.id, - searchFields: ['alertId'], - }) - : null; + + const ruleStatusClient = ruleStatusSavedObjectsClientFactory(savedObjectsClient); + const ruleCurrentStatus = await ruleStatusClient.find({ + perPage: 1, + sortField: 'statusDate', + sortOrder: 'desc', + search: rule.id, + searchFields: ['alertId'], + }); + // set current status for this rule to be 'going to run' if (ruleCurrentStatus && ruleCurrentStatus.saved_objects.length > 0) { const currentStatusToDisable = ruleCurrentStatus.saved_objects[0]; - currentStatusToDisable.attributes.status = 'going to run'; - await savedObjectsClient?.update(ruleStatusSavedObjectType, currentStatusToDisable.id, { + await ruleStatusClient.update(currentStatusToDisable.id, { ...currentStatusToDisable.attributes, + status: 'going to run', }); } } diff --git a/x-pack/plugins/siem/server/lib/detection_engine/signals/__mocks__/es_results.ts b/x-pack/plugins/siem/server/lib/detection_engine/signals/__mocks__/es_results.ts index 731fffcac1bb0..251a1e6d118ff 100644 --- a/x-pack/plugins/siem/server/lib/detection_engine/signals/__mocks__/es_results.ts +++ b/x-pack/plugins/siem/server/lib/detection_engine/signals/__mocks__/es_results.ts @@ -13,7 +13,7 @@ import { import { loggingServiceMock } from '../../../../../../../../src/core/server/mocks'; import { RuleTypeParams, OutputRuleAlertRest } from '../../types'; import { IRuleStatusAttributes } from '../../rules/types'; -import { ruleStatusSavedObjectType } from '../../../../saved_objects'; +import { ruleStatusSavedObjectType } from '../../rules/saved_object_mappings'; export const sampleRuleAlertParams = ( maxSignals?: number | undefined, diff --git a/x-pack/plugins/siem/server/lib/note/saved_object.ts b/x-pack/plugins/siem/server/lib/note/saved_object.ts index 2b94fd4516786..3eae30625e422 100644 --- a/x-pack/plugins/siem/server/lib/note/saved_object.ts +++ b/x-pack/plugins/siem/server/lib/note/saved_object.ts @@ -25,9 +25,9 @@ import { import { FrameworkRequest } from '../framework'; import { SavedNote, NoteSavedObjectRuntimeType, NoteSavedObject } from './types'; import { noteSavedObjectType } from './saved_object_mappings'; -import { timelineSavedObjectType } from '../../saved_objects'; import { pickSavedTimeline } from '../timeline/pick_saved_timeline'; import { convertSavedObjectToSavedTimeline } from '../timeline/convert_saved_object_to_savedtimeline'; +import { timelineSavedObjectType } from '../timeline/saved_object_mappings'; export class Note { public async deleteNote(request: FrameworkRequest, noteIds: string[]) { diff --git a/x-pack/plugins/siem/server/lib/note/saved_object_mappings.ts b/x-pack/plugins/siem/server/lib/note/saved_object_mappings.ts index b001e30e52336..0f079571b868b 100644 --- a/x-pack/plugins/siem/server/lib/note/saved_object_mappings.ts +++ b/x-pack/plugins/siem/server/lib/note/saved_object_mappings.ts @@ -4,37 +4,39 @@ * you may not use this file except in compliance with the Elastic License. */ -import { ElasticsearchMappingOf } from '../../utils/typed_elasticsearch_mappings'; -import { SavedNote } from './types'; +import { SavedObjectsType } from '../../../../../../src/core/server'; export const noteSavedObjectType = 'siem-ui-timeline-note'; -export const noteSavedObjectMappings: { - [noteSavedObjectType]: ElasticsearchMappingOf; -} = { - [noteSavedObjectType]: { - properties: { - timelineId: { - type: 'keyword', - }, - eventId: { - type: 'keyword', - }, - note: { - type: 'text', - }, - created: { - type: 'date', - }, - createdBy: { - type: 'text', - }, - updated: { - type: 'date', - }, - updatedBy: { - type: 'text', - }, +export const noteSavedObjectMappings = { + properties: { + timelineId: { + type: 'keyword', + }, + eventId: { + type: 'keyword', + }, + note: { + type: 'text', + }, + created: { + type: 'date', + }, + createdBy: { + type: 'text', + }, + updated: { + type: 'date', + }, + updatedBy: { + type: 'text', }, }, }; + +export const type: SavedObjectsType = { + name: noteSavedObjectType, + hidden: false, + namespaceType: 'single', + mappings: noteSavedObjectMappings, +}; diff --git a/x-pack/plugins/siem/server/lib/pinned_event/saved_object.ts b/x-pack/plugins/siem/server/lib/pinned_event/saved_object.ts index 7fc23d86d8218..1e3a481e17106 100644 --- a/x-pack/plugins/siem/server/lib/pinned_event/saved_object.ts +++ b/x-pack/plugins/siem/server/lib/pinned_event/saved_object.ts @@ -20,9 +20,10 @@ import { SavedPinnedEvent, } from './types'; import { PageInfoNote, SortNote, PinnedEvent as PinnedEventResponse } from '../../graphql/types'; -import { pinnedEventSavedObjectType, timelineSavedObjectType } from '../../saved_objects'; import { pickSavedTimeline } from '../timeline/pick_saved_timeline'; import { convertSavedObjectToSavedTimeline } from '../timeline/convert_saved_object_to_savedtimeline'; +import { pinnedEventSavedObjectType } from './saved_object_mappings'; +import { timelineSavedObjectType } from '../timeline/saved_object_mappings'; export class PinnedEvent { public async deletePinnedEventOnTimeline(request: FrameworkRequest, pinnedEventIds: string[]) { diff --git a/x-pack/plugins/siem/server/lib/pinned_event/saved_object_mappings.ts b/x-pack/plugins/siem/server/lib/pinned_event/saved_object_mappings.ts index 322f585ae8ff2..1a4cd3fce575d 100644 --- a/x-pack/plugins/siem/server/lib/pinned_event/saved_object_mappings.ts +++ b/x-pack/plugins/siem/server/lib/pinned_event/saved_object_mappings.ts @@ -4,34 +4,36 @@ * you may not use this file except in compliance with the Elastic License. */ -import { ElasticsearchMappingOf } from '../../utils/typed_elasticsearch_mappings'; -import { SavedPinnedEvent } from './types'; +import { SavedObjectsType } from '../../../../../../src/core/server'; export const pinnedEventSavedObjectType = 'siem-ui-timeline-pinned-event'; -export const pinnedEventSavedObjectMappings: { - [pinnedEventSavedObjectType]: ElasticsearchMappingOf; -} = { - [pinnedEventSavedObjectType]: { - properties: { - timelineId: { - type: 'keyword', - }, - eventId: { - type: 'keyword', - }, - created: { - type: 'date', - }, - createdBy: { - type: 'text', - }, - updated: { - type: 'date', - }, - updatedBy: { - type: 'text', - }, +export const pinnedEventSavedObjectMappings = { + properties: { + timelineId: { + type: 'keyword', + }, + eventId: { + type: 'keyword', + }, + created: { + type: 'date', + }, + createdBy: { + type: 'text', + }, + updated: { + type: 'date', + }, + updatedBy: { + type: 'text', }, }, }; + +export const type: SavedObjectsType = { + name: pinnedEventSavedObjectType, + hidden: false, + namespaceType: 'single', + mappings: pinnedEventSavedObjectMappings, +}; diff --git a/x-pack/plugins/siem/server/lib/timeline/routes/utils/export_timelines.ts b/x-pack/plugins/siem/server/lib/timeline/routes/utils/export_timelines.ts index edd4abe0d76b5..677891fa16c02 100644 --- a/x-pack/plugins/siem/server/lib/timeline/routes/utils/export_timelines.ts +++ b/x-pack/plugins/siem/server/lib/timeline/routes/utils/export_timelines.ts @@ -4,12 +4,6 @@ * you may not use this file except in compliance with the Elastic License. */ -import { set as _set } from 'lodash/fp'; -import { - noteSavedObjectType, - pinnedEventSavedObjectType, - timelineSavedObjectType, -} from '../../../../saved_objects'; import { NoteSavedObject } from '../../../note/types'; import { PinnedEventSavedObject } from '../../../pinned_event/types'; import { convertSavedObjectToSavedTimeline } from '../../convert_saved_object_to_savedtimeline'; @@ -30,6 +24,9 @@ import { TimelineSavedObject, } from '../../types'; import { transformDataToNdjson } from '../../../../utils/read_stream/create_stream_from_ndjson'; +import { pinnedEventSavedObjectType } from '../../../pinned_event/saved_object_mappings'; +import { noteSavedObjectType } from '../../../note/saved_object_mappings'; +import { timelineSavedObjectType } from '../../saved_object_mappings'; export type TimelineSavedObjectsClient = Pick< SavedObjectsClient, diff --git a/x-pack/plugins/siem/server/lib/timeline/saved_object_mappings.ts b/x-pack/plugins/siem/server/lib/timeline/saved_object_mappings.ts index 8fc12fd56a8f6..b956e0f98fcb6 100644 --- a/x-pack/plugins/siem/server/lib/timeline/saved_object_mappings.ts +++ b/x-pack/plugins/siem/server/lib/timeline/saved_object_mappings.ts @@ -4,272 +4,274 @@ * you may not use this file except in compliance with the Elastic License. */ -import { ElasticsearchMappingOf } from '../../utils/typed_elasticsearch_mappings'; -import { SavedTimeline } from './types'; +import { SavedObjectsType } from '../../../../../../src/core/server'; export const timelineSavedObjectType = 'siem-ui-timeline'; -export const timelineSavedObjectMappings: { - [timelineSavedObjectType]: ElasticsearchMappingOf; -} = { - [timelineSavedObjectType]: { - properties: { - columns: { - properties: { - aggregatable: { - type: 'boolean', - }, - category: { - type: 'keyword', - }, - columnHeaderType: { - type: 'keyword', - }, - description: { - type: 'text', - }, - example: { - type: 'text', - }, - indexes: { - type: 'keyword', - }, - id: { - type: 'keyword', - }, - name: { - type: 'text', - }, - placeholder: { - type: 'text', - }, - searchable: { - type: 'boolean', - }, - type: { - type: 'keyword', - }, +export const timelineSavedObjectMappings = { + properties: { + columns: { + properties: { + aggregatable: { + type: 'boolean', + }, + category: { + type: 'keyword', + }, + columnHeaderType: { + type: 'keyword', + }, + description: { + type: 'text', + }, + example: { + type: 'text', + }, + indexes: { + type: 'keyword', + }, + id: { + type: 'keyword', + }, + name: { + type: 'text', + }, + placeholder: { + type: 'text', + }, + searchable: { + type: 'boolean', + }, + type: { + type: 'keyword', }, }, - dataProviders: { - properties: { - id: { - type: 'keyword', - }, - name: { - type: 'text', - }, - enabled: { - type: 'boolean', - }, - excluded: { - type: 'boolean', - }, - kqlQuery: { - type: 'text', - }, - queryMatch: { - properties: { - field: { - type: 'text', - }, - displayField: { - type: 'text', - }, - value: { - type: 'text', - }, - displayValue: { - type: 'text', - }, - operator: { - type: 'text', - }, + }, + dataProviders: { + properties: { + id: { + type: 'keyword', + }, + name: { + type: 'text', + }, + enabled: { + type: 'boolean', + }, + excluded: { + type: 'boolean', + }, + kqlQuery: { + type: 'text', + }, + queryMatch: { + properties: { + field: { + type: 'text', + }, + displayField: { + type: 'text', + }, + value: { + type: 'text', + }, + displayValue: { + type: 'text', + }, + operator: { + type: 'text', }, }, - and: { - properties: { - id: { - type: 'keyword', - }, - name: { - type: 'text', - }, - enabled: { - type: 'boolean', - }, - excluded: { - type: 'boolean', - }, - kqlQuery: { - type: 'text', - }, - queryMatch: { - properties: { - field: { - type: 'text', - }, - displayField: { - type: 'text', - }, - value: { - type: 'text', - }, - displayValue: { - type: 'text', - }, - operator: { - type: 'text', - }, + }, + and: { + properties: { + id: { + type: 'keyword', + }, + name: { + type: 'text', + }, + enabled: { + type: 'boolean', + }, + excluded: { + type: 'boolean', + }, + kqlQuery: { + type: 'text', + }, + queryMatch: { + properties: { + field: { + type: 'text', + }, + displayField: { + type: 'text', + }, + value: { + type: 'text', + }, + displayValue: { + type: 'text', + }, + operator: { + type: 'text', }, }, }, }, }, }, - description: { - type: 'text', - }, - eventType: { - type: 'keyword', - }, - favorite: { - properties: { - keySearch: { - type: 'text', - }, - fullName: { - type: 'text', - }, - userName: { - type: 'text', - }, - favoriteDate: { - type: 'date', - }, + }, + description: { + type: 'text', + }, + eventType: { + type: 'keyword', + }, + favorite: { + properties: { + keySearch: { + type: 'text', + }, + fullName: { + type: 'text', + }, + userName: { + type: 'text', + }, + favoriteDate: { + type: 'date', }, }, - filters: { - properties: { - meta: { - properties: { - alias: { - type: 'text', - }, - controlledBy: { - type: 'text', - }, - disabled: { - type: 'boolean', - }, - field: { - type: 'text', - }, - formattedValue: { - type: 'text', - }, - index: { - type: 'keyword', - }, - key: { - type: 'keyword', - }, - negate: { - type: 'boolean', - }, - params: { - type: 'text', - }, - type: { - type: 'keyword', - }, - value: { - type: 'text', - }, + }, + filters: { + properties: { + meta: { + properties: { + alias: { + type: 'text', + }, + controlledBy: { + type: 'text', + }, + disabled: { + type: 'boolean', + }, + field: { + type: 'text', + }, + formattedValue: { + type: 'text', + }, + index: { + type: 'keyword', + }, + key: { + type: 'keyword', + }, + negate: { + type: 'boolean', + }, + params: { + type: 'text', + }, + type: { + type: 'keyword', + }, + value: { + type: 'text', }, - }, - exists: { - type: 'text', - }, - match_all: { - type: 'text', - }, - missing: { - type: 'text', - }, - query: { - type: 'text', - }, - range: { - type: 'text', - }, - script: { - type: 'text', }, }, + exists: { + type: 'text', + }, + match_all: { + type: 'text', + }, + missing: { + type: 'text', + }, + query: { + type: 'text', + }, + range: { + type: 'text', + }, + script: { + type: 'text', + }, }, - kqlMode: { - type: 'keyword', - }, - kqlQuery: { - properties: { - filterQuery: { - properties: { - kuery: { - properties: { - kind: { - type: 'keyword', - }, - expression: { - type: 'text', - }, + }, + kqlMode: { + type: 'keyword', + }, + kqlQuery: { + properties: { + filterQuery: { + properties: { + kuery: { + properties: { + kind: { + type: 'keyword', + }, + expression: { + type: 'text', }, }, - serializedQuery: { - type: 'text', - }, + }, + serializedQuery: { + type: 'text', }, }, }, }, - title: { - type: 'text', - }, - dateRange: { - properties: { - start: { - type: 'date', - }, - end: { - type: 'date', - }, + }, + title: { + type: 'text', + }, + dateRange: { + properties: { + start: { + type: 'date', }, - }, - savedQueryId: { - type: 'keyword', - }, - sort: { - properties: { - columnId: { - type: 'keyword', - }, - sortDirection: { - type: 'keyword', - }, + end: { + type: 'date', }, }, - created: { - type: 'date', - }, - createdBy: { - type: 'text', - }, - updated: { - type: 'date', - }, - updatedBy: { - type: 'text', + }, + savedQueryId: { + type: 'keyword', + }, + sort: { + properties: { + columnId: { + type: 'keyword', + }, + sortDirection: { + type: 'keyword', + }, }, }, + created: { + type: 'date', + }, + createdBy: { + type: 'text', + }, + updated: { + type: 'date', + }, + updatedBy: { + type: 'text', + }, }, }; + +export const type: SavedObjectsType = { + name: timelineSavedObjectType, + hidden: false, + namespaceType: 'single', + mappings: timelineSavedObjectMappings, +}; diff --git a/x-pack/plugins/siem/server/plugin.ts b/x-pack/plugins/siem/server/plugin.ts index e12832dc876bf..3988fbec05de4 100644 --- a/x-pack/plugins/siem/server/plugin.ts +++ b/x-pack/plugins/siem/server/plugin.ts @@ -34,13 +34,7 @@ import { signalRulesAlertType } from './lib/detection_engine/signals/signal_rule import { rulesNotificationAlertType } from './lib/detection_engine/notifications/rules_notification_alert_type'; import { isNotificationAlertExecutor } from './lib/detection_engine/notifications/types'; import { hasListsFeature, listsEnvFeatureFlagName } from './lib/detection_engine/feature_flags'; -import { - noteSavedObjectType, - pinnedEventSavedObjectType, - timelineSavedObjectType, - ruleStatusSavedObjectType, - ruleActionsSavedObjectType, -} from './saved_objects'; +import { initSavedObjects, savedObjectTypes } from './saved_objects'; import { SiemClientFactory } from './client'; import { createConfig$, ConfigType } from './config'; import { initUiSettings } from './ui_settings'; @@ -93,6 +87,7 @@ export class Plugin implements IPlugin type.name); + +export const initSavedObjects = (savedObjects: CoreSetup['savedObjects']) => { + types.forEach(type => savedObjects.registerType(type)); }; From adc9b0d7577f66ce5e23e6728acaa1a1b2288478 Mon Sep 17 00:00:00 2001 From: Sandra Gonzales Date: Tue, 21 Apr 2020 16:39:32 -0400 Subject: [PATCH 25/67] [EPM] /packages/{package} endpoint to support upgrades (#63629) * install template after pipeline creation * return installed pkg if this pkg version is already installed * remove pipelines after templates are updated * remove kibana saved objects assets before installing * update current write indices * add back removal of merging previous references lost in rebase * improve some typing names, consolidate, fix bad merges * update query to use aggregate on _index Co-authored-by: Elastic Machine --- .../ingest_manager/common/types/models/epm.ts | 9 ++ .../__snapshots__/template.test.ts.snap | 9 -- .../epm/elasticsearch/template/install.ts | 26 ++- .../epm/elasticsearch/template/template.ts | 153 +++++++++++++++--- .../server/services/epm/packages/install.ts | 113 ++++++++----- .../server/services/epm/packages/remove.ts | 66 +++++++- .../ingest_manager/server/types/index.tsx | 2 + 7 files changed, 286 insertions(+), 92 deletions(-) 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 53ad0310ea613..a13e1655d5666 100644 --- a/x-pack/plugins/ingest_manager/common/types/models/epm.ts +++ b/x-pack/plugins/ingest_manager/common/types/models/epm.ts @@ -256,6 +256,10 @@ export enum DefaultPackages { endpoint = 'endpoint', } +export interface IndexTemplateMappings { + properties: any; +} + export interface IndexTemplate { order: number; index_patterns: string[]; @@ -263,3 +267,8 @@ export interface IndexTemplate { mappings: object; aliases: object; } + +export interface TemplateRef { + templateName: string; + indexTemplate: IndexTemplate; +} diff --git a/x-pack/plugins/ingest_manager/server/services/epm/elasticsearch/template/__snapshots__/template.test.ts.snap b/x-pack/plugins/ingest_manager/server/services/epm/elasticsearch/template/__snapshots__/template.test.ts.snap index 166983fbccc35..5cf1f241a709f 100644 --- a/x-pack/plugins/ingest_manager/server/services/epm/elasticsearch/template/__snapshots__/template.test.ts.snap +++ b/x-pack/plugins/ingest_manager/server/services/epm/elasticsearch/template/__snapshots__/template.test.ts.snap @@ -28,9 +28,6 @@ exports[`tests loading base.yml: base.yml 1`] = ` } }, "mappings": { - "_meta": { - "package": "foo" - }, "dynamic_templates": [ { "strings_as_keyword": { @@ -123,9 +120,6 @@ exports[`tests loading coredns.logs.yml: coredns.logs.yml 1`] = ` } }, "mappings": { - "_meta": { - "package": "foo" - }, "dynamic_templates": [ { "strings_as_keyword": { @@ -218,9 +212,6 @@ exports[`tests loading system.yml: system.yml 1`] = ` } }, "mappings": { - "_meta": { - "package": "foo" - }, "dynamic_templates": [ { "strings_as_keyword": { 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 560ddfc1f6885..4df626259ece7 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 @@ -4,13 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ -import { - AssetReference, - Dataset, - RegistryPackage, - IngestAssetType, - ElasticsearchAssetType, -} from '../../../../types'; +import { Dataset, RegistryPackage, ElasticsearchAssetType, TemplateRef } from '../../../../types'; import { CallESAsCurrentUser } from '../../../../types'; import { Field, loadFieldsFromYaml, processFields } from '../../fields/field'; import { getPipelineNameForInstallation } from '../ingest_pipeline/install'; @@ -22,7 +16,7 @@ export const installTemplates = async ( callCluster: CallESAsCurrentUser, pkgName: string, pkgVersion: string -) => { +): Promise => { // install any pre-built index template assets, // atm, this is only the base package's global template installPreBuiltTemplates(pkgName, pkgVersion, callCluster); @@ -30,7 +24,7 @@ export const installTemplates = async ( // build templates per dataset from yml files const datasets = registryPackage.datasets; if (datasets) { - const templates = datasets.reduce>>((acc, dataset) => { + const installTemplatePromises = datasets.reduce>>((acc, dataset) => { acc.push( installTemplateForDataset({ pkg: registryPackage, @@ -40,7 +34,9 @@ export const installTemplates = async ( ); return acc; }, []); - return Promise.all(templates).then(results => results.flat()); + + const res = await Promise.all(installTemplatePromises); + return res.flat(); } return []; }; @@ -84,7 +80,7 @@ export async function installTemplateForDataset({ pkg: RegistryPackage; callCluster: CallESAsCurrentUser; dataset: Dataset; -}): Promise { +}): Promise { const fields = await loadFieldsFromYaml(pkg, dataset.path); return installTemplate({ callCluster, @@ -104,7 +100,7 @@ export async function installTemplate({ fields: Field[]; dataset: Dataset; packageVersion: string; -}): Promise { +}): Promise { const mappings = generateMappings(processFields(fields)); const templateName = generateTemplateName(dataset); let pipelineName; @@ -122,6 +118,8 @@ export async function installTemplate({ body: template, }); - // The id of a template is its name - return { id: templateName, type: IngestAssetType.IndexTemplate }; + return { + templateName, + indexTemplate: template, + }; } diff --git a/x-pack/plugins/ingest_manager/server/services/epm/elasticsearch/template/template.ts b/x-pack/plugins/ingest_manager/server/services/epm/elasticsearch/template/template.ts index 22a61d2bdfb7c..46b6923962462 100644 --- a/x-pack/plugins/ingest_manager/server/services/epm/elasticsearch/template/template.ts +++ b/x-pack/plugins/ingest_manager/server/services/epm/elasticsearch/template/template.ts @@ -5,24 +5,30 @@ */ import { Field, Fields } from '../../fields/field'; -import { Dataset, IndexTemplate } from '../../../../types'; +import { + Dataset, + CallESAsCurrentUser, + TemplateRef, + IndexTemplate, + IndexTemplateMappings, +} from '../../../../types'; import { getDatasetAssetBaseName } from '../index'; interface Properties { [key: string]: any; } -interface Mappings { - properties: any; -} - -interface Mapping { - [key: string]: any; -} interface MultiFields { [key: string]: object; } +export interface IndexTemplateMapping { + [key: string]: any; +} +export interface CurrentIndex { + indexName: string; + indexTemplate: IndexTemplate; +} const DEFAULT_SCALING_FACTOR = 1000; const DEFAULT_IGNORE_ABOVE = 1024; @@ -34,7 +40,7 @@ const DEFAULT_IGNORE_ABOVE = 1024; export function getTemplate( type: string, templateName: string, - mappings: Mappings, + mappings: IndexTemplateMappings, pipelineName?: string | undefined ): IndexTemplate { const template = getBaseTemplate(type, templateName, mappings); @@ -52,7 +58,7 @@ export function getTemplate( * * @param fields */ -export function generateMappings(fields: Field[]): Mappings { +export function generateMappings(fields: Field[]): IndexTemplateMappings { const props: Properties = {}; // TODO: this can happen when the fields property in fields.yml is present but empty // Maybe validation should be moved to fields/field.ts @@ -140,8 +146,8 @@ function generateMultiFields(fields: Fields): MultiFields { return multiFields; } -function generateKeywordMapping(field: Field): Mapping { - const mapping: Mapping = { +function generateKeywordMapping(field: Field): IndexTemplateMapping { + const mapping: IndexTemplateMapping = { ignore_above: DEFAULT_IGNORE_ABOVE, }; if (field.ignore_above) { @@ -150,8 +156,8 @@ function generateKeywordMapping(field: Field): Mapping { return mapping; } -function generateTextMapping(field: Field): Mapping { - const mapping: Mapping = {}; +function generateTextMapping(field: Field): IndexTemplateMapping { + const mapping: IndexTemplateMapping = {}; if (field.analyzer) { mapping.analyzer = field.analyzer; } @@ -200,7 +206,11 @@ export function generateESIndexPatterns(datasets: Dataset[] | undefined): Record return patterns; } -function getBaseTemplate(type: string, templateName: string, mappings: Mappings): IndexTemplate { +function getBaseTemplate( + type: string, + templateName: string, + mappings: IndexTemplateMappings +): IndexTemplate { return { // We need to decide which order we use for the templates order: 1, @@ -234,10 +244,6 @@ function getBaseTemplate(type: string, templateName: string, mappings: Mappings) }, }, mappings: { - // To be filled with interesting information about this specific index - _meta: { - package: 'foo', - }, // All the dynamic field mappings dynamic_templates: [ // This makes sure all mappings are keywords by default @@ -261,3 +267,112 @@ function getBaseTemplate(type: string, templateName: string, mappings: Mappings) aliases: {}, }; } + +export const updateCurrentWriteIndices = async ( + callCluster: CallESAsCurrentUser, + templates: TemplateRef[] +): Promise => { + if (!templates) return; + + const allIndices = await queryIndicesFromTemplates(callCluster, templates); + return updateAllIndices(allIndices, callCluster); +}; + +const queryIndicesFromTemplates = async ( + callCluster: CallESAsCurrentUser, + templates: TemplateRef[] +): Promise => { + const indexPromises = templates.map(template => { + return getIndices(callCluster, template); + }); + const indexObjects = await Promise.all(indexPromises); + return indexObjects.filter(item => item !== undefined).flat(); +}; + +const getIndices = async ( + callCluster: CallESAsCurrentUser, + template: TemplateRef +): Promise => { + const { templateName, indexTemplate } = template; + const res = await callCluster('search', getIndexQuery(templateName)); + const indices: any[] = res?.aggregations?.index.buckets; + if (indices) { + return indices.map(index => ({ + indexName: index.key, + indexTemplate, + })); + } +}; + +const updateAllIndices = async ( + indexNameWithTemplates: CurrentIndex[], + callCluster: CallESAsCurrentUser +): Promise => { + const updateIndexPromises = indexNameWithTemplates.map(({ indexName, indexTemplate }) => { + return updateExistingIndex({ indexName, callCluster, indexTemplate }); + }); + await Promise.all(updateIndexPromises); +}; +const updateExistingIndex = async ({ + indexName, + callCluster, + indexTemplate, +}: { + indexName: string; + callCluster: CallESAsCurrentUser; + indexTemplate: IndexTemplate; +}) => { + const { settings, mappings } = indexTemplate; + // try to update the mappings first + // for now we assume updates are compatible + try { + await callCluster('indices.putMapping', { + index: indexName, + body: mappings, + }); + } catch (err) { + throw new Error('incompatible mappings update'); + } + // update settings after mappings was successful to ensure + // pointing to theme new pipeline is safe + // for now, only update the pipeline + if (!settings.index.default_pipeline) return; + try { + await callCluster('indices.putSettings', { + index: indexName, + body: { index: { default_pipeline: settings.index.default_pipeline } }, + }); + } catch (err) { + throw new Error('incompatible settings update'); + } +}; + +const getIndexQuery = (templateName: string) => ({ + index: `${templateName}-*`, + size: 0, + body: { + query: { + bool: { + must: [ + { + exists: { + field: 'stream.namespace', + }, + }, + { + exists: { + field: 'stream.dataset', + }, + }, + ], + }, + }, + aggs: { + index: { + terms: { + field: '_index', + }, + }, + }, + }, +}); 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 0a7642752b3e9..f3bd49eab6038 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 @@ -12,15 +12,19 @@ import { KibanaAssetType, CallESAsCurrentUser, DefaultPackages, + ElasticsearchAssetType, + IngestAssetType, } from '../../../types'; import { installIndexPatterns } from '../kibana/index_pattern/install'; import * as Registry from '../registry'; import { getObject } from './get_objects'; -import { getInstallation } from './index'; +import { getInstallation, getInstallationObject } from './index'; import { installTemplates } from '../elasticsearch/template/install'; import { generateESIndexPatterns } from '../elasticsearch/template/template'; import { installPipelines } from '../elasticsearch/ingest_pipeline/install'; import { installILMPolicy } from '../elasticsearch/ilm/install'; +import { deleteAssetsByType, deleteKibanaSavedObjectsAssets } from './remove'; +import { updateCurrentWriteIndices } from '../elasticsearch/template/template'; export async function installLatestPackage(options: { savedObjectsClient: SavedObjectsClientContract; @@ -89,41 +93,80 @@ export async function installPackage(options: { const { savedObjectsClient, pkgkey, callCluster } = options; // TODO: change epm API to /packageName/version so we don't need to do this const [pkgName, pkgVersion] = pkgkey.split('-'); + // see if some version of this package is already installed + const installedPkg = await getInstallationObject({ savedObjectsClient, pkgName }); + const reinstall = pkgVersion === installedPkg?.attributes.version; + const registryPackageInfo = await Registry.fetchInfo(pkgName, pkgVersion); const { internal = false } = registryPackageInfo; - const installKibanaAssetsPromise = installKibanaAssets({ - savedObjectsClient, - pkgName, - pkgVersion, - }); - const installPipelinePromises = installPipelines(registryPackageInfo, callCluster); - const installTemplatePromises = installTemplates( + // delete the previous version's installation's SO kibana assets before installing new ones + // in case some assets were removed in the new version + if (installedPkg) { + try { + await deleteKibanaSavedObjectsAssets(savedObjectsClient, installedPkg.attributes.installed); + } catch (err) { + // some assets may not exist if deleting during a failed update + } + } + + const [installedKibanaAssets, installedPipelines] = await Promise.all([ + installKibanaAssets({ + savedObjectsClient, + pkgName, + pkgVersion, + }), + installPipelines(registryPackageInfo, callCluster), + // index patterns and ilm policies are not currently associated with a particular package + // so we do not save them in the package saved object state. + installIndexPatterns(savedObjectsClient, pkgName, pkgVersion), + // currenly only the base package has an ILM policy + // at some point ILM policies can be installed/modified + // per dataset and we should then save them + installILMPolicy(pkgName, pkgVersion, callCluster), + ]); + + // install or update the templates + const installedTemplates = await installTemplates( registryPackageInfo, callCluster, pkgName, pkgVersion ); + const toSaveESIndexPatterns = generateESIndexPatterns(registryPackageInfo.datasets); - // index patterns and ilm policies are not currently associated with a particular package - // so we do not save them in the package saved object state. at some point ILM policies can be installed/modified - // per dataset and we should then save them - await installIndexPatterns(savedObjectsClient, pkgName, pkgVersion); - // currenly only the base package has an ILM policy - await installILMPolicy(pkgName, pkgVersion, callCluster); - - const res = await Promise.all([ - installKibanaAssetsPromise, - installPipelinePromises, - installTemplatePromises, - ]); + // get template refs to save + const installedTemplateRefs = installedTemplates.map(template => ({ + id: template.templateName, + type: IngestAssetType.IndexTemplate, + })); - const toSaveAssetRefs: AssetReference[] = res.flat(); - const toSaveESIndexPatterns = generateESIndexPatterns(registryPackageInfo.datasets); - // Save those references in the package manager's state saved object - return await saveInstallationReferences({ + if (installedPkg) { + // update current index for every index template created + await updateCurrentWriteIndices(callCluster, installedTemplates); + if (!reinstall) { + try { + // delete the previous version's installation's pipelines + // this must happen after the template is updated + await deleteAssetsByType({ + savedObjectsClient, + callCluster, + installedObjects: installedPkg.attributes.installed, + assetType: ElasticsearchAssetType.ingestPipeline, + }); + } catch (err) { + throw new Error(err.message); + } + } + } + const toSaveAssetRefs: AssetReference[] = [ + ...installedKibanaAssets, + ...installedPipelines, + ...installedTemplateRefs, + ]; + // Save references to installed assets in the package's saved object state + return saveInstallationReferences({ savedObjectsClient, - pkgkey, pkgName, pkgVersion, internal, @@ -154,7 +197,6 @@ export async function installKibanaAssets(options: { export async function saveInstallationReferences(options: { savedObjectsClient: SavedObjectsClientContract; - pkgkey: string; pkgName: string; pkgVersion: string; internal: boolean; @@ -169,25 +211,12 @@ export async function saveInstallationReferences(options: { toSaveAssetRefs, toSaveESIndexPatterns, } = options; - const installation = await getInstallation({ savedObjectsClient, pkgName }); - const savedAssetRefs = installation?.installed || []; - const toInstallESIndexPatterns = Object.assign( - installation?.es_index_patterns || {}, - toSaveESIndexPatterns - ); - - const mergeRefsReducer = (current: AssetReference[], pending: AssetReference) => { - const hasRef = current.find(c => c.id === pending.id && c.type === pending.type); - if (!hasRef) current.push(pending); - return current; - }; - const toInstallAssetsRefs = toSaveAssetRefs.reduce(mergeRefsReducer, savedAssetRefs); await savedObjectsClient.create( PACKAGES_SAVED_OBJECT_TYPE, { - installed: toInstallAssetsRefs, - es_index_patterns: toInstallESIndexPatterns, + installed: toSaveAssetRefs, + es_index_patterns: toSaveESIndexPatterns, name: pkgName, version: pkgVersion, internal, @@ -195,7 +224,7 @@ export async function saveInstallationReferences(options: { { id: pkgName, overwrite: true } ); - return toInstallAssetsRefs; + return toSaveAssetRefs; } async function installKibanaSavedObjects({ 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 a30acb97b99cf..ed7b7f3301327 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 @@ -29,7 +29,17 @@ export async function removeInstallation(options: { // recreate or delete index patterns when a package is uninstalled await installIndexPatterns(savedObjectsClient); - // Delete the installed assets + // Delete the installed asset + await deleteAssets(installedObjects, savedObjectsClient, callCluster); + + // successful delete's in SO client return {}. return something more useful + return installedObjects; +} +async function deleteAssets( + installedObjects: AssetReference[], + savedObjectsClient: SavedObjectsClientContract, + callCluster: CallESAsCurrentUser +) { const deletePromises = installedObjects.map(async ({ id, type }) => { const assetType = type as AssetType; if (savedObjectTypes.includes(assetType)) { @@ -40,22 +50,62 @@ export async function removeInstallation(options: { deleteTemplate(callCluster, id); } }); - await Promise.all([...deletePromises]); - - // successful delete's in SO client return {}. return something more useful - return installedObjects; + try { + await Promise.all([...deletePromises]); + } catch (err) { + throw new Error(err.message); + } } - async function deletePipeline(callCluster: CallESAsCurrentUser, id: string): Promise { // '*' shouldn't ever appear here, but it still would delete all ingest pipelines if (id && id !== '*') { - await callCluster('ingest.deletePipeline', { id }); + try { + await callCluster('ingest.deletePipeline', { id }); + } catch (err) { + throw new Error(`error deleting pipeline ${id}`); + } } } async function deleteTemplate(callCluster: CallESAsCurrentUser, name: string): Promise { // '*' shouldn't ever appear here, but it still would delete all templates if (name && name !== '*') { - await callCluster('indices.deleteTemplate', { name }); + try { + await callCluster('indices.deleteTemplate', { name }); + } catch { + throw new Error(`error deleting template ${name}`); + } } } + +export async function deleteAssetsByType({ + savedObjectsClient, + callCluster, + installedObjects, + assetType, +}: { + savedObjectsClient: SavedObjectsClientContract; + callCluster: CallESAsCurrentUser; + installedObjects: AssetReference[]; + assetType: ElasticsearchAssetType; +}) { + const toDelete = installedObjects.filter(asset => asset.type === assetType); + try { + await deleteAssets(toDelete, savedObjectsClient, callCluster); + } catch (err) { + throw new Error(err.message); + } +} + +export async function deleteKibanaSavedObjectsAssets( + savedObjectsClient: SavedObjectsClientContract, + installedObjects: AssetReference[] +) { + const deletePromises = installedObjects.map(({ id, type }) => { + const assetType = type as AssetType; + if (savedObjectTypes.includes(assetType)) { + savedObjectsClient.delete(assetType, id); + } + }); + await Promise.all(deletePromises); +} diff --git a/x-pack/plugins/ingest_manager/server/types/index.tsx b/x-pack/plugins/ingest_manager/server/types/index.tsx index 1cd5622c0c7b0..105f9039f1e98 100644 --- a/x-pack/plugins/ingest_manager/server/types/index.tsx +++ b/x-pack/plugins/ingest_manager/server/types/index.tsx @@ -47,6 +47,8 @@ export { RegistrySearchResults, RegistrySearchResult, DefaultPackages, + TemplateRef, + IndexTemplateMappings, } from '../../common'; export type CallESAsCurrentUser = ScopedClusterClient['callAsCurrentUser']; From f254ee682c5849920f853da513fe542d63786ad3 Mon Sep 17 00:00:00 2001 From: Nathan L Smith Date: Tue, 21 Apr 2020 17:12:36 -0500 Subject: [PATCH 26/67] [kbn-storybook] Use raw loader for text files (#64108) Starting Storybook (with `yarn storybook apm`) was failing to start because it was having trouble loading Angular .html templates. Use the raw loader in the webpack config for storybook, same as the Webpack config in kbn-optimizer. --- packages/kbn-storybook/storybook_config/webpack.config.js | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/packages/kbn-storybook/storybook_config/webpack.config.js b/packages/kbn-storybook/storybook_config/webpack.config.js index 1531c1d22b01b..779d8a4153644 100644 --- a/packages/kbn-storybook/storybook_config/webpack.config.js +++ b/packages/kbn-storybook/storybook_config/webpack.config.js @@ -49,6 +49,13 @@ module.exports = async ({ config }) => { }, }); + config.module.rules.push({ + test: /\.(html|md|txt|tmpl)$/, + use: { + loader: 'raw-loader', + }, + }); + // Handle Typescript files config.module.rules.push({ test: /\.tsx?$/, From ea4eb3385b855a9ae7e8e17ab5166a22ce96252c Mon Sep 17 00:00:00 2001 From: Nathan Reese Date: Tue, 21 Apr 2020 16:27:00 -0600 Subject: [PATCH 27/67] [Maps] Map settings: min and max zoom (#63714) * [Maps] Map settings: min and max zoom * eslint * header and footer * zoom range UI * save session state in mapStateJSON * disable button when flyout is open * tslint * update layer_control jest test * tslint * move settings button to top map chrome * move map_settings_panel to NP * remove merge conflict artifact * fix import for NP migration * remove unused CSS class * fix path from NP move * review feedback * load map settings in embeddable --- .../maps/public/angular/map_controller.js | 37 ++++++- .../maps/public/actions/map_actions.d.ts | 12 +++ .../maps/public/actions/map_actions.js | 27 ++++++ .../maps/public/actions/ui_actions.d.ts | 3 + .../plugins/maps/public/actions/ui_actions.js | 15 +++ .../public/angular/services/saved_gis_map.js | 2 + .../connected_components/gis_map/index.js | 7 +- .../connected_components/gis_map/view.js | 33 ++++--- .../connected_components/map/mb/index.js | 2 + .../connected_components/map/mb/view.js | 42 +++++--- .../map_settings_panel/index.ts | 39 ++++++++ .../map_settings_panel/map_settings_panel.tsx | 97 +++++++++++++++++++ .../map_settings_panel/navigation_panel.tsx | 55 +++++++++++ .../toolbar_overlay/set_view_control/index.js | 3 +- .../set_view_control/set_view_control.js | 5 +- .../__snapshots__/view.test.js.snap | 79 ++++++++++++++- .../widget_overlay/layer_control/index.js | 2 +- .../widget_overlay/layer_control/view.js | 4 +- .../widget_overlay/layer_control/view.test.js | 7 ++ .../maps/public/embeddable/map_embeddable.tsx | 9 ++ .../embeddable/map_embeddable_factory.ts | 9 ++ .../public/reducers/default_map_settings.ts | 15 +++ x-pack/plugins/maps/public/reducers/map.d.ts | 7 ++ x-pack/plugins/maps/public/reducers/map.js | 33 +++++++ x-pack/plugins/maps/public/reducers/ui.ts | 1 + .../maps/public/selectors/map_selectors.d.ts | 6 +- .../maps/public/selectors/map_selectors.js | 12 +++ 27 files changed, 516 insertions(+), 47 deletions(-) create mode 100644 x-pack/plugins/maps/public/connected_components/map_settings_panel/index.ts create mode 100644 x-pack/plugins/maps/public/connected_components/map_settings_panel/map_settings_panel.tsx create mode 100644 x-pack/plugins/maps/public/connected_components/map_settings_panel/navigation_panel.tsx create mode 100644 x-pack/plugins/maps/public/reducers/default_map_settings.ts diff --git a/x-pack/legacy/plugins/maps/public/angular/map_controller.js b/x-pack/legacy/plugins/maps/public/angular/map_controller.js index 9522fd12ad37d..1b1fbf111fe04 100644 --- a/x-pack/legacy/plugins/maps/public/angular/map_controller.js +++ b/x-pack/legacy/plugins/maps/public/angular/map_controller.js @@ -39,6 +39,7 @@ import { replaceLayerList, setQuery, clearTransientLayerStateAndCloseFlyout, + setMapSettings, // eslint-disable-next-line @kbn/eslint/no-restricted-paths } from '../../../../../plugins/maps/public/actions/map_actions'; import { @@ -52,10 +53,14 @@ import { setReadOnly, setIsLayerTOCOpen, setOpenTOCDetails, + openMapSettings, // eslint-disable-next-line @kbn/eslint/no-restricted-paths } from '../../../../../plugins/maps/public/actions/ui_actions'; -// eslint-disable-next-line @kbn/eslint/no-restricted-paths -import { getIsFullScreen } from '../../../../../plugins/maps/public/selectors/ui_selectors'; +import { + getIsFullScreen, + getFlyoutDisplay, + // eslint-disable-next-line @kbn/eslint/no-restricted-paths +} from '../../../../../plugins/maps/public/selectors/ui_selectors'; // eslint-disable-next-line @kbn/eslint/no-restricted-paths import { copyPersistentState } from '../../../../../plugins/maps/public/reducers/util'; import { @@ -395,6 +400,9 @@ app.controller( if (mapState.filters) { savedObjectFilters = mapState.filters; } + if (mapState.settings) { + store.dispatch(setMapSettings(mapState.settings)); + } } if (savedMap.uiStateJSON) { @@ -453,6 +461,7 @@ app.controller( $scope.isFullScreen = false; $scope.isSaveDisabled = false; + $scope.isOpenSettingsDisabled = false; function handleStoreChanges(store) { const nextIsFullScreen = getIsFullScreen(store.getState()); if (nextIsFullScreen !== $scope.isFullScreen) { @@ -474,6 +483,14 @@ app.controller( $scope.isSaveDisabled = nextIsSaveDisabled; }); } + + const flyoutDisplay = getFlyoutDisplay(store.getState()); + const nextIsOpenSettingsDisabled = flyoutDisplay !== FLYOUT_STATE.NONE; + if (nextIsOpenSettingsDisabled !== $scope.isOpenSettingsDisabled) { + $scope.$evalAsync(() => { + $scope.isOpenSettingsDisabled = nextIsOpenSettingsDisabled; + }); + } } $scope.$on('$destroy', () => { @@ -591,6 +608,22 @@ app.controller( getInspector().open(inspectorAdapters, {}); }, }, + { + id: 'mapSettings', + label: i18n.translate('xpack.maps.mapController.openSettingsButtonLabel', { + defaultMessage: `Map settings`, + }), + description: i18n.translate('xpack.maps.mapController.openSettingsDescription', { + defaultMessage: `Open map settings`, + }), + testId: 'openSettingsButton', + disableButton() { + return $scope.isOpenSettingsDisabled; + }, + run() { + store.dispatch(openMapSettings()); + }, + }, ...(getMapsCapabilities().save ? [ { diff --git a/x-pack/plugins/maps/public/actions/map_actions.d.ts b/x-pack/plugins/maps/public/actions/map_actions.d.ts index debead3ad5c45..c8db284a5c4f1 100644 --- a/x-pack/plugins/maps/public/actions/map_actions.d.ts +++ b/x-pack/plugins/maps/public/actions/map_actions.d.ts @@ -14,6 +14,7 @@ import { MapCenterAndZoom, MapRefreshConfig, } from '../../common/descriptor_types'; +import { MapSettings } from '../reducers/map'; export type SyncContext = { startLoading(dataId: string, requestToken: symbol, meta: DataMeta): void; @@ -62,3 +63,14 @@ export function hideViewControl(): AnyAction; export function setHiddenLayers(hiddenLayerIds: string[]): AnyAction; export function addLayerWithoutDataSync(layerDescriptor: unknown): AnyAction; + +export function setMapSettings(settings: MapSettings): AnyAction; + +export function rollbackMapSettings(): AnyAction; + +export function trackMapSettings(): AnyAction; + +export function updateMapSetting( + settingKey: string, + settingValue: string | boolean | number +): AnyAction; diff --git a/x-pack/plugins/maps/public/actions/map_actions.js b/x-pack/plugins/maps/public/actions/map_actions.js index 572385d628b16..da6ba6b481054 100644 --- a/x-pack/plugins/maps/public/actions/map_actions.js +++ b/x-pack/plugins/maps/public/actions/map_actions.js @@ -76,6 +76,10 @@ export const HIDE_TOOLBAR_OVERLAY = 'HIDE_TOOLBAR_OVERLAY'; export const HIDE_LAYER_CONTROL = 'HIDE_LAYER_CONTROL'; export const HIDE_VIEW_CONTROL = 'HIDE_VIEW_CONTROL'; export const SET_WAITING_FOR_READY_HIDDEN_LAYERS = 'SET_WAITING_FOR_READY_HIDDEN_LAYERS'; +export const SET_MAP_SETTINGS = 'SET_MAP_SETTINGS'; +export const ROLLBACK_MAP_SETTINGS = 'ROLLBACK_MAP_SETTINGS'; +export const TRACK_MAP_SETTINGS = 'TRACK_MAP_SETTINGS'; +export const UPDATE_MAP_SETTING = 'UPDATE_MAP_SETTING'; function getLayerLoadingCallbacks(dispatch, getState, layerId) { return { @@ -145,6 +149,29 @@ export function setMapInitError(errorMessage) { }; } +export function setMapSettings(settings) { + return { + type: SET_MAP_SETTINGS, + settings, + }; +} + +export function rollbackMapSettings() { + return { type: ROLLBACK_MAP_SETTINGS }; +} + +export function trackMapSettings() { + return { type: TRACK_MAP_SETTINGS }; +} + +export function updateMapSetting(settingKey, settingValue) { + return { + type: UPDATE_MAP_SETTING, + settingKey, + settingValue, + }; +} + export function trackCurrentLayerState(layerId) { return { type: TRACK_CURRENT_LAYER_STATE, diff --git a/x-pack/plugins/maps/public/actions/ui_actions.d.ts b/x-pack/plugins/maps/public/actions/ui_actions.d.ts index e087dc70256f0..43cdcff7d2d69 100644 --- a/x-pack/plugins/maps/public/actions/ui_actions.d.ts +++ b/x-pack/plugins/maps/public/actions/ui_actions.d.ts @@ -5,6 +5,7 @@ */ import { AnyAction } from 'redux'; +import { FLYOUT_STATE } from '../reducers/ui'; export const UPDATE_FLYOUT: string; export const CLOSE_SET_VIEW: string; @@ -17,6 +18,8 @@ export const SHOW_TOC_DETAILS: string; export const HIDE_TOC_DETAILS: string; export const UPDATE_INDEXING_STAGE: string; +export function updateFlyout(display: FLYOUT_STATE): AnyAction; + export function setOpenTOCDetails(layerIds?: string[]): AnyAction; export function setIsLayerTOCOpen(open: boolean): AnyAction; diff --git a/x-pack/plugins/maps/public/actions/ui_actions.js b/x-pack/plugins/maps/public/actions/ui_actions.js index 77fdf6b0f12d2..e2a36e33e7db0 100644 --- a/x-pack/plugins/maps/public/actions/ui_actions.js +++ b/x-pack/plugins/maps/public/actions/ui_actions.js @@ -4,6 +4,10 @@ * you may not use this file except in compliance with the Elastic License. */ +import { getFlyoutDisplay } from '../selectors/ui_selectors'; +import { FLYOUT_STATE } from '../reducers/ui'; +import { setSelectedLayer, trackMapSettings } from './map_actions'; + export const UPDATE_FLYOUT = 'UPDATE_FLYOUT'; export const CLOSE_SET_VIEW = 'CLOSE_SET_VIEW'; export const OPEN_SET_VIEW = 'OPEN_SET_VIEW'; @@ -28,6 +32,17 @@ export function updateFlyout(display) { display, }; } +export function openMapSettings() { + return (dispatch, getState) => { + const flyoutDisplay = getFlyoutDisplay(getState()); + if (flyoutDisplay === FLYOUT_STATE.MAP_SETTINGS_PANEL) { + return; + } + dispatch(setSelectedLayer(null)); + dispatch(trackMapSettings()); + dispatch(updateFlyout(FLYOUT_STATE.MAP_SETTINGS_PANEL)); + }; +} export function closeSetView() { return { type: CLOSE_SET_VIEW, diff --git a/x-pack/plugins/maps/public/angular/services/saved_gis_map.js b/x-pack/plugins/maps/public/angular/services/saved_gis_map.js index 1c47e0ab7dc2a..1a58b0cefaed9 100644 --- a/x-pack/plugins/maps/public/angular/services/saved_gis_map.js +++ b/x-pack/plugins/maps/public/angular/services/saved_gis_map.js @@ -15,6 +15,7 @@ import { getRefreshConfig, getQuery, getFilters, + getMapSettings, } from '../../selectors/map_selectors'; import { getIsLayerTOCOpen, getOpenTOCDetails } from '../../selectors/ui_selectors'; @@ -98,6 +99,7 @@ export function createSavedGisMapClass(services) { refreshConfig: getRefreshConfig(state), query: _.omit(getQuery(state), 'queryLastTriggeredAt'), filters: getFilters(state), + settings: getMapSettings(state), }); this.uiStateJSON = JSON.stringify({ diff --git a/x-pack/plugins/maps/public/connected_components/gis_map/index.js b/x-pack/plugins/maps/public/connected_components/gis_map/index.js index c825fdab75ca7..f8769d0bb898a 100644 --- a/x-pack/plugins/maps/public/connected_components/gis_map/index.js +++ b/x-pack/plugins/maps/public/connected_components/gis_map/index.js @@ -6,8 +6,6 @@ import { connect } from 'react-redux'; import { GisMap } from './view'; - -import { FLYOUT_STATE } from '../../reducers/ui'; import { exitFullScreen } from '../../actions/ui_actions'; import { getFlyoutDisplay, getIsFullScreen } from '../../selectors/ui_selectors'; import { triggerRefreshTimer, cancelAllInFlightRequests } from '../../actions/map_actions'; @@ -22,12 +20,9 @@ import { import { getCoreChrome } from '../../kibana_services'; function mapStateToProps(state = {}) { - const flyoutDisplay = getFlyoutDisplay(state); return { areLayersLoaded: areLayersLoaded(state), - layerDetailsVisible: flyoutDisplay === FLYOUT_STATE.LAYER_PANEL, - addLayerVisible: flyoutDisplay === FLYOUT_STATE.ADD_LAYER_WIZARD, - noFlyoutVisible: flyoutDisplay === FLYOUT_STATE.NONE, + flyoutDisplay: getFlyoutDisplay(state), isFullScreen: getIsFullScreen(state), refreshConfig: getRefreshConfig(state), mapInitError: getMapInitError(state), diff --git a/x-pack/plugins/maps/public/connected_components/gis_map/view.js b/x-pack/plugins/maps/public/connected_components/gis_map/view.js index 28ad12133d611..6eb173a001d01 100644 --- a/x-pack/plugins/maps/public/connected_components/gis_map/view.js +++ b/x-pack/plugins/maps/public/connected_components/gis_map/view.js @@ -6,6 +6,7 @@ import _ from 'lodash'; import React, { Component } from 'react'; +import classNames from 'classnames'; import { MBMapContainer } from '../map/mb'; import { WidgetOverlay } from '../widget_overlay'; import { ToolbarOverlay } from '../toolbar_overlay'; @@ -19,6 +20,8 @@ import { ES_GEO_FIELD_TYPE } from '../../../common/constants'; import { indexPatterns as indexPatternsUtils } from '../../../../../../src/plugins/data/public'; import { i18n } from '@kbn/i18n'; import uuid from 'uuid/v4'; +import { FLYOUT_STATE } from '../../reducers/ui'; +import { MapSettingsPanel } from '../map_settings_panel'; const RENDER_COMPLETE_EVENT = 'renderComplete'; @@ -147,9 +150,7 @@ export class GisMap extends Component { render() { const { addFilters, - layerDetailsVisible, - addLayerVisible, - noFlyoutVisible, + flyoutDisplay, isFullScreen, exitFullScreen, mapInitError, @@ -174,16 +175,13 @@ export class GisMap extends Component { ); } - let currentPanel; - let currentPanelClassName; - if (noFlyoutVisible) { - currentPanel = null; - } else if (addLayerVisible) { - currentPanelClassName = 'mapMapLayerPanel-isVisible'; - currentPanel = ; - } else if (layerDetailsVisible) { - currentPanelClassName = 'mapMapLayerPanel-isVisible'; - currentPanel = ; + let flyoutPanel = null; + if (flyoutDisplay === FLYOUT_STATE.ADD_LAYER_WIZARD) { + flyoutPanel = ; + } else if (flyoutDisplay === FLYOUT_STATE.LAYER_PANEL) { + flyoutPanel = ; + } else if (flyoutDisplay === FLYOUT_STATE.MAP_SETTINGS_PANEL) { + flyoutPanel = ; } let exitFullScreenButton; @@ -210,8 +208,13 @@ export class GisMap extends Component { - - {currentPanel} + + {flyoutPanel} {exitFullScreenButton} diff --git a/x-pack/plugins/maps/public/connected_components/map/mb/index.js b/x-pack/plugins/maps/public/connected_components/map/mb/index.js index d864b60eb433b..459b38d422694 100644 --- a/x-pack/plugins/maps/public/connected_components/map/mb/index.js +++ b/x-pack/plugins/maps/public/connected_components/map/mb/index.js @@ -23,6 +23,7 @@ import { isInteractiveDisabled, isTooltipControlDisabled, isViewControlHidden, + getMapSettings, } from '../../../selectors/map_selectors'; import { getInspectorAdapters } from '../../../reducers/non_serializable_instances'; @@ -30,6 +31,7 @@ import { getInspectorAdapters } from '../../../reducers/non_serializable_instanc function mapStateToProps(state = {}) { return { isMapReady: getMapReady(state), + settings: getMapSettings(state), layerList: getLayerList(state), goto: getGoto(state), inspectorAdapters: getInspectorAdapters(state), diff --git a/x-pack/plugins/maps/public/connected_components/map/mb/view.js b/x-pack/plugins/maps/public/connected_components/map/mb/view.js index 2d95de184f0f4..71c1af44e493b 100644 --- a/x-pack/plugins/maps/public/connected_components/map/mb/view.js +++ b/x-pack/plugins/maps/public/connected_components/map/mb/view.js @@ -12,14 +12,8 @@ import { removeOrphanedSourcesAndLayers, addSpritesheetToMap, } from './utils'; - import { getGlyphUrl, isRetina } from '../../../meta'; -import { - DECIMAL_DEGREES_PRECISION, - MAX_ZOOM, - MIN_ZOOM, - ZOOM_PRECISION, -} from '../../../../common/constants'; +import { DECIMAL_DEGREES_PRECISION, ZOOM_PRECISION } from '../../../../common/constants'; import mapboxgl from 'mapbox-gl/dist/mapbox-gl-csp'; import mbWorkerUrl from '!!file-loader!mapbox-gl/dist/mapbox-gl-csp-worker'; import mbRtlPlugin from '!!file-loader!@mapbox/mapbox-gl-rtl-text/mapbox-gl-rtl-text.min.js'; @@ -80,7 +74,7 @@ export class MBMapContainer extends React.Component { } _debouncedSync = _.debounce(() => { - if (this._isMounted) { + if (this._isMounted || !this.props.isMapReady) { if (!this.state.hasSyncedLayerList) { this.setState( { @@ -92,6 +86,7 @@ export class MBMapContainer extends React.Component { } ); } + this._syncSettings(); } }, 256); @@ -133,8 +128,8 @@ export class MBMapContainer extends React.Component { scrollZoom: this.props.scrollZoom, preserveDrawingBuffer: getInjectedVarFunc()('preserveDrawingBuffer', false), interactive: !this.props.disableInteractive, - minZoom: MIN_ZOOM, - maxZoom: MAX_ZOOM, + maxZoom: this.props.settings.maxZoom, + minZoom: this.props.settings.minZoom, }; const initialView = _.get(this.props.goto, 'center'); if (initialView) { @@ -265,17 +260,13 @@ export class MBMapContainer extends React.Component { }; _syncMbMapWithLayerList = () => { - if (!this.props.isMapReady) { - return; - } - removeOrphanedSourcesAndLayers(this.state.mbMap, this.props.layerList); this.props.layerList.forEach(layer => layer.syncLayerWithMB(this.state.mbMap)); syncLayerOrderForSingleLayer(this.state.mbMap, this.props.layerList); }; _syncMbMapWithInspector = () => { - if (!this.props.isMapReady || !this.props.inspectorAdapters.map) { + if (!this.props.inspectorAdapters.map) { return; } @@ -289,6 +280,27 @@ export class MBMapContainer extends React.Component { }); }; + _syncSettings() { + let zoomRangeChanged = false; + if (this.props.settings.minZoom !== this.state.mbMap.getMinZoom()) { + this.state.mbMap.setMinZoom(this.props.settings.minZoom); + zoomRangeChanged = true; + } + if (this.props.settings.maxZoom !== this.state.mbMap.getMaxZoom()) { + this.state.mbMap.setMaxZoom(this.props.settings.maxZoom); + zoomRangeChanged = true; + } + + // 'moveend' event not fired when map moves from setMinZoom or setMaxZoom + // https://github.com/mapbox/mapbox-gl-js/issues/9610 + // hack to update extent after zoom update finishes moving map. + if (zoomRangeChanged) { + setTimeout(() => { + this.props.extentChanged(this._getMapState()); + }, 300); + } + } + render() { let drawControl; let tooltipControl; diff --git a/x-pack/plugins/maps/public/connected_components/map_settings_panel/index.ts b/x-pack/plugins/maps/public/connected_components/map_settings_panel/index.ts new file mode 100644 index 0000000000000..329fac28d7d2e --- /dev/null +++ b/x-pack/plugins/maps/public/connected_components/map_settings_panel/index.ts @@ -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 { AnyAction, Dispatch } from 'redux'; +import { connect } from 'react-redux'; +import { FLYOUT_STATE } from '../../reducers/ui'; +import { MapStoreState } from '../../reducers/store'; +import { MapSettingsPanel } from './map_settings_panel'; +import { rollbackMapSettings, updateMapSetting } from '../../actions/map_actions'; +import { getMapSettings, hasMapSettingsChanges } from '../../selectors/map_selectors'; +import { updateFlyout } from '../../actions/ui_actions'; + +function mapStateToProps(state: MapStoreState) { + return { + settings: getMapSettings(state), + hasMapSettingsChanges: hasMapSettingsChanges(state), + }; +} + +function mapDispatchToProps(dispatch: Dispatch) { + return { + cancelChanges: () => { + dispatch(rollbackMapSettings()); + dispatch(updateFlyout(FLYOUT_STATE.NONE)); + }, + keepChanges: () => { + dispatch(updateFlyout(FLYOUT_STATE.NONE)); + }, + updateMapSetting: (settingKey: string, settingValue: string | number | boolean) => { + dispatch(updateMapSetting(settingKey, settingValue)); + }, + }; +} + +const connectedMapSettingsPanel = connect(mapStateToProps, mapDispatchToProps)(MapSettingsPanel); +export { connectedMapSettingsPanel as MapSettingsPanel }; diff --git a/x-pack/plugins/maps/public/connected_components/map_settings_panel/map_settings_panel.tsx b/x-pack/plugins/maps/public/connected_components/map_settings_panel/map_settings_panel.tsx new file mode 100644 index 0000000000000..36ed29e92cf69 --- /dev/null +++ b/x-pack/plugins/maps/public/connected_components/map_settings_panel/map_settings_panel.tsx @@ -0,0 +1,97 @@ +/* + * 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 { + EuiButton, + EuiButtonEmpty, + EuiFlexGroup, + EuiFlexItem, + EuiFlyoutFooter, + EuiFlyoutHeader, + EuiSpacer, + EuiTitle, +} from '@elastic/eui'; +import { i18n } from '@kbn/i18n'; +import { FormattedMessage } from '@kbn/i18n/react'; +import { MapSettings } from '../../reducers/map'; +import { NavigationPanel } from './navigation_panel'; + +interface Props { + cancelChanges: () => void; + hasMapSettingsChanges: boolean; + keepChanges: () => void; + settings: MapSettings; + updateMapSetting: (settingKey: string, settingValue: string | number | boolean) => void; +} + +export function MapSettingsPanel({ + cancelChanges, + hasMapSettingsChanges, + keepChanges, + settings, + updateMapSetting, +}: Props) { + // TODO move common text like Cancel and Close to common i18n translation + const closeBtnLabel = hasMapSettingsChanges + ? i18n.translate('xpack.maps.mapSettingsPanel.cancelLabel', { + defaultMessage: 'Cancel', + }) + : i18n.translate('xpack.maps.mapSettingsPanel.closeLabel', { + defaultMessage: 'Close', + }); + + return ( + + + +

+ +

+
+
+ +
+
+ +
+
+ + + + + + {closeBtnLabel} + + + + + + + + + + + + +
+ ); +} diff --git a/x-pack/plugins/maps/public/connected_components/map_settings_panel/navigation_panel.tsx b/x-pack/plugins/maps/public/connected_components/map_settings_panel/navigation_panel.tsx new file mode 100644 index 0000000000000..ed83e838f44f6 --- /dev/null +++ b/x-pack/plugins/maps/public/connected_components/map_settings_panel/navigation_panel.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 { EuiPanel, EuiSpacer, EuiTitle } from '@elastic/eui'; +import { i18n } from '@kbn/i18n'; +import { FormattedMessage } from '@kbn/i18n/react'; +import { MapSettings } from '../../reducers/map'; +import { ValidatedDualRange, Value } from '../../../../../../src/plugins/kibana_react/public'; +import { MAX_ZOOM, MIN_ZOOM } from '../../../common/constants'; + +interface Props { + settings: MapSettings; + updateMapSetting: (settingKey: string, settingValue: string | number | boolean) => void; +} + +export function NavigationPanel({ settings, updateMapSetting }: Props) { + const onZoomChange = (value: Value) => { + updateMapSetting('minZoom', Math.max(MIN_ZOOM, parseInt(value[0] as string, 10))); + updateMapSetting('maxZoom', Math.min(MAX_ZOOM, parseInt(value[1] as string, 10))); + }; + + return ( + + +
+ +
+
+ + + +
+ ); +} diff --git a/x-pack/plugins/maps/public/connected_components/toolbar_overlay/set_view_control/index.js b/x-pack/plugins/maps/public/connected_components/toolbar_overlay/set_view_control/index.js index 2b6fae26098be..c3cc4090ab952 100644 --- a/x-pack/plugins/maps/public/connected_components/toolbar_overlay/set_view_control/index.js +++ b/x-pack/plugins/maps/public/connected_components/toolbar_overlay/set_view_control/index.js @@ -7,12 +7,13 @@ import { connect } from 'react-redux'; import { SetViewControl } from './set_view_control'; import { setGotoWithCenter } from '../../../actions/map_actions'; -import { getMapZoom, getMapCenter } from '../../../selectors/map_selectors'; +import { getMapZoom, getMapCenter, getMapSettings } from '../../../selectors/map_selectors'; import { closeSetView, openSetView } from '../../../actions/ui_actions'; import { getIsSetViewOpen } from '../../../selectors/ui_selectors'; function mapStateToProps(state = {}) { return { + settings: getMapSettings(state), isSetViewOpen: getIsSetViewOpen(state), zoom: getMapZoom(state), center: getMapCenter(state), diff --git a/x-pack/plugins/maps/public/connected_components/toolbar_overlay/set_view_control/set_view_control.js b/x-pack/plugins/maps/public/connected_components/toolbar_overlay/set_view_control/set_view_control.js index 9c983447bfbf6..2c10728f78e5c 100644 --- a/x-pack/plugins/maps/public/connected_components/toolbar_overlay/set_view_control/set_view_control.js +++ b/x-pack/plugins/maps/public/connected_components/toolbar_overlay/set_view_control/set_view_control.js @@ -18,7 +18,6 @@ import { } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; import { FormattedMessage } from '@kbn/i18n/react'; -import { MAX_ZOOM, MIN_ZOOM } from '../../../../common/constants'; function getViewString(lat, lon, zoom) { return `${lat},${lon},${zoom}`; @@ -118,8 +117,8 @@ export class SetViewControl extends Component { const { isInvalid: isZoomInvalid, component: zoomFormRow } = this._renderNumberFormRow({ value: this.state.zoom, - min: MIN_ZOOM, - max: MAX_ZOOM, + min: this.props.settings.minZoom, + max: this.props.settings.maxZoom, onChange: this._onZoomChange, label: i18n.translate('xpack.maps.setViewControl.zoomLabel', { defaultMessage: 'Zoom', diff --git a/x-pack/plugins/maps/public/connected_components/widget_overlay/layer_control/__snapshots__/view.test.js.snap b/x-pack/plugins/maps/public/connected_components/widget_overlay/layer_control/__snapshots__/view.test.js.snap index 560ebad89c50e..0af4eb0793f03 100644 --- a/x-pack/plugins/maps/public/connected_components/widget_overlay/layer_control/__snapshots__/view.test.js.snap +++ b/x-pack/plugins/maps/public/connected_components/widget_overlay/layer_control/__snapshots__/view.test.js.snap @@ -65,7 +65,7 @@ exports[`LayerControl is rendered 1`] = ` data-test-subj="addLayerButton" fill={true} fullWidth={true} - isDisabled={true} + isDisabled={false} onClick={[Function]} > `; + +exports[`LayerControl should disable buttons when flyout is open 1`] = ` + + + + + + +

+ +

+
+
+ + + + + +
+
+ + + +
+ + + + +
+`; diff --git a/x-pack/plugins/maps/public/connected_components/widget_overlay/layer_control/index.js b/x-pack/plugins/maps/public/connected_components/widget_overlay/layer_control/index.js index 8780bac59e4b7..915f808b8e358 100644 --- a/x-pack/plugins/maps/public/connected_components/widget_overlay/layer_control/index.js +++ b/x-pack/plugins/maps/public/connected_components/widget_overlay/layer_control/index.js @@ -22,7 +22,7 @@ function mapStateToProps(state = {}) { isReadOnly: getIsReadOnly(state), isLayerTOCOpen: getIsLayerTOCOpen(state), layerList: getLayerList(state), - isAddButtonActive: getFlyoutDisplay(state) === FLYOUT_STATE.NONE, + isFlyoutOpen: getFlyoutDisplay(state) !== FLYOUT_STATE.NONE, }; } diff --git a/x-pack/plugins/maps/public/connected_components/widget_overlay/layer_control/view.js b/x-pack/plugins/maps/public/connected_components/widget_overlay/layer_control/view.js index 537a676287042..180dc2e3933c3 100644 --- a/x-pack/plugins/maps/public/connected_components/widget_overlay/layer_control/view.js +++ b/x-pack/plugins/maps/public/connected_components/widget_overlay/layer_control/view.js @@ -57,7 +57,7 @@ export function LayerControl({ closeLayerTOC, openLayerTOC, layerList, - isAddButtonActive, + isFlyoutOpen, }) { if (!isLayerTOCOpen) { const hasErrors = layerList.some(layer => { @@ -86,7 +86,7 @@ export function LayerControl({ {}, isLayerTOCOpen: true, layerList: [], + isFlyoutOpen: false, }; describe('LayerControl', () => { @@ -30,6 +31,12 @@ describe('LayerControl', () => { expect(component).toMatchSnapshot(); }); + test('should disable buttons when flyout is open', () => { + const component = shallow(); + + expect(component).toMatchSnapshot(); + }); + test('isReadOnly', () => { const component = shallow(); diff --git a/x-pack/plugins/maps/public/embeddable/map_embeddable.tsx b/x-pack/plugins/maps/public/embeddable/map_embeddable.tsx index dbd48d614e99b..467cf4727edb7 100644 --- a/x-pack/plugins/maps/public/embeddable/map_embeddable.tsx +++ b/x-pack/plugins/maps/public/embeddable/map_embeddable.tsx @@ -28,6 +28,7 @@ import { } from '../../../../../src/plugins/data/public'; import { GisMap } from '../connected_components/gis_map'; import { createMapStore, MapStore } from '../reducers/store'; +import { MapSettings } from '../reducers/map'; import { setGotoWithCenter, replaceLayerList, @@ -40,6 +41,7 @@ import { hideLayerControl, hideViewControl, setHiddenLayers, + setMapSettings, } from '../actions/map_actions'; import { MapCenterAndZoom } from '../../common/descriptor_types'; import { setReadOnly, setIsLayerTOCOpen, setOpenTOCDetails } from '../actions/ui_actions'; @@ -60,6 +62,7 @@ interface MapEmbeddableConfig { editable: boolean; title?: string; layerList: unknown[]; + settings?: MapSettings; } export interface MapEmbeddableInput extends EmbeddableInput { @@ -97,6 +100,7 @@ export class MapEmbeddable extends Embeddable this.onContainerStateChanged(input)); @@ -194,6 +199,10 @@ export class MapEmbeddable extends Embeddable map.settings; + +const getRollbackMapSettings = ({ map }) => map.__rollbackSettings; + +export const hasMapSettingsChanges = createSelector( + getMapSettings, + getRollbackMapSettings, + (settings, rollbackSettings) => { + return rollbackSettings ? !_.isEqual(settings, rollbackSettings) : false; + } +); + export const getOpenTooltips = ({ map }) => { return map && map.openTooltips ? map.openTooltips : []; }; From 28313c4890cc5749eea138f0d3a6583e861a7eac Mon Sep 17 00:00:00 2001 From: Yuliia Naumenko Date: Tue, 21 Apr 2020 17:00:55 -0700 Subject: [PATCH 28/67] [Alerting] Fixed bug with no possibility to edit the index name after adding (#64033) * Fixed bug with no possibility to edit the index name after adding * fixed test * fixed test * fixed selector * Move the testing to unit tests --- .../builtin_action_types/es_index.test.tsx | 68 ++++++++++++++++++- .../builtin_action_types/es_index.tsx | 2 +- 2 files changed, 67 insertions(+), 3 deletions(-) diff --git a/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/es_index.test.tsx b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/es_index.test.tsx index 658a0e869548f..fdfaf70648694 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/es_index.test.tsx +++ b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/es_index.test.tsx @@ -4,12 +4,19 @@ * you may not use this file except in compliance with the Elastic License. */ import React, { FunctionComponent } from 'react'; -import { mountWithIntl } from 'test_utils/enzyme_helpers'; +import { mountWithIntl, nextTick } from 'test_utils/enzyme_helpers'; +import { act } from 'react-dom/test-utils'; import { TypeRegistry } from '../../type_registry'; import { registerBuiltInActionTypes } from './index'; import { ActionTypeModel, ActionParamsProps } from '../../../types'; import { IndexActionParams, EsIndexActionConnector } from './types'; import { coreMock } from '../../../../../../../src/core/public/mocks'; +jest.mock('../../../common/index_controls', () => ({ + firstFieldOption: jest.fn(), + getFields: jest.fn(), + getIndexOptions: jest.fn(), + getIndexPatterns: jest.fn(), +})); const ACTION_TYPE_ID = '.index'; let actionTypeModel: ActionTypeModel; @@ -91,13 +98,40 @@ describe('action params validation', () => { }); describe('IndexActionConnectorFields renders', () => { - test('all connector fields is rendered', () => { + test('all connector fields is rendered', async () => { const mocks = coreMock.createSetup(); expect(actionTypeModel.actionConnectorFields).not.toBeNull(); if (!actionTypeModel.actionConnectorFields) { return; } + + const { getIndexPatterns } = jest.requireMock('../../../common/index_controls'); + getIndexPatterns.mockResolvedValueOnce([ + { + id: 'indexPattern1', + attributes: { + title: 'indexPattern1', + }, + }, + { + id: 'indexPattern2', + attributes: { + title: 'indexPattern2', + }, + }, + ]); + const { getFields } = jest.requireMock('../../../common/index_controls'); + getFields.mockResolvedValueOnce([ + { + type: 'date', + name: 'test1', + }, + { + type: 'text', + name: 'test2', + }, + ]); const ConnectorFields = actionTypeModel.actionConnectorFields; const actionConnector = { secrets: {}, @@ -119,8 +153,38 @@ describe('IndexActionConnectorFields renders', () => { http={mocks.http} /> ); + + await act(async () => { + await nextTick(); + wrapper.update(); + }); + expect(wrapper.find('[data-test-subj="connectorIndexesComboBox"]').length > 0).toBeTruthy(); expect(wrapper.find('[data-test-subj="indexRefreshCheckbox"]').length > 0).toBeTruthy(); + + const indexSearchBoxValue = wrapper.find('[data-test-subj="comboBoxSearchInput"]'); + expect(indexSearchBoxValue.first().props().value).toEqual(''); + + const indexComboBox = wrapper.find('#indexConnectorSelectSearchBox'); + indexComboBox.first().simulate('click'); + const event = { target: { value: 'indexPattern1' } }; + indexComboBox + .find('input') + .first() + .simulate('change', event); + + const indexSearchBoxValueBeforeEnterData = wrapper.find( + '[data-test-subj="comboBoxSearchInput"]' + ); + expect(indexSearchBoxValueBeforeEnterData.first().props().value).toEqual('indexPattern1'); + + const indexComboBoxClear = wrapper.find('[data-test-subj="comboBoxClearButton"]'); + indexComboBoxClear.first().simulate('click'); + + const indexSearchBoxValueAfterEnterData = wrapper.find( + '[data-test-subj="comboBoxSearchInput"]' + ); + expect(indexSearchBoxValueAfterEnterData.first().props().value).toEqual('indexPattern1'); }); }); diff --git a/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/es_index.tsx b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/es_index.tsx index 15f68e6a9f441..55a219ca94aea 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/es_index.tsx +++ b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/es_index.tsx @@ -151,7 +151,7 @@ const IndexActionConnectorFields: React.FunctionComponent { - editActionConfig('index', selected[0].value); + editActionConfig('index', selected.length > 0 ? selected[0].value : ''); const indices = selected.map(s => s.value as string); // reset time field and expression fields if indices are deleted From edac6669f75634d87045bda50673352deccfb270 Mon Sep 17 00:00:00 2001 From: John Schulz Date: Tue, 21 Apr 2020 20:41:13 -0400 Subject: [PATCH 29/67] [Ingest] EPM & Fleet are enabled when Ingest is enabled (#64103) --- x-pack/plugins/ingest_manager/README.md | 10 +++++----- x-pack/plugins/ingest_manager/server/index.ts | 4 ++-- x-pack/test/api_integration/config.js | 1 - x-pack/test/epm_api_integration/config.ts | 1 - x-pack/test/functional_endpoint/config.ts | 2 -- 5 files changed, 7 insertions(+), 11 deletions(-) diff --git a/x-pack/plugins/ingest_manager/README.md b/x-pack/plugins/ingest_manager/README.md index 07acdf8affd49..9cd4821c2a727 100644 --- a/x-pack/plugins/ingest_manager/README.md +++ b/x-pack/plugins/ingest_manager/README.md @@ -1,9 +1,9 @@ # Ingest Manager ## Plugin - - No features enabled by default. See the TypeScript type for the [the available plugin configuration options](https://github.com/elastic/kibana/blob/feature-ingest/x-pack/plugins/ingest_manager/common/types/index.ts#L9-L19) - - Setting `xpack.ingestManager.enabled=true` is required to enable the plugin. It adds the `DATASOURCE_API_ROUTES` and `AGENT_CONFIG_API_ROUTES` values in [`common/constants/routes.ts`](./common/constants/routes.ts) - - Adding `--xpack.ingestManager.epm.enabled=true` will add the EPM API & UI - - Adding `--xpack.ingestManager.fleet.enabled=true` will add the Fleet API & UI + - The plugin is disabled by default. See the TypeScript type for the [the available plugin configuration options](https://github.com/elastic/kibana/blob/master/x-pack/plugins/ingest_manager/common/types/index.ts#L9-L27) + - Setting `xpack.ingestManager.enabled=true` enables the plugin including the EPM and Fleet features. It also adds the `DATASOURCE_API_ROUTES` and `AGENT_CONFIG_API_ROUTES` values in [`common/constants/routes.ts`](./common/constants/routes.ts) + - Adding `--xpack.ingestManager.epm.enabled=false` will disable the EPM API & UI + - Adding `--xpack.ingestManager.fleet.enabled=false` will disable the Fleet API & UI - [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. @@ -25,7 +25,7 @@ One common development workflow is: ``` - Start Kibana in another shell ``` - yarn start --xpack.ingestManager.enabled=true --xpack.ingestManager.epm.enabled=true --xpack.ingestManager.fleet.enabled=true --no-base-path --xpack.endpoint.enabled=true + yarn start --xpack.ingestManager.enabled=true --no-base-path --xpack.endpoint.enabled=true ``` This plugin follows the `common`, `server`, `public` structure from the [Architecture Style Guide diff --git a/x-pack/plugins/ingest_manager/server/index.ts b/x-pack/plugins/ingest_manager/server/index.ts index 7859c44ccfd89..d99eb2a9bb4bb 100644 --- a/x-pack/plugins/ingest_manager/server/index.ts +++ b/x-pack/plugins/ingest_manager/server/index.ts @@ -18,11 +18,11 @@ export const config = { schema: schema.object({ enabled: schema.boolean({ defaultValue: false }), epm: schema.object({ - enabled: schema.boolean({ defaultValue: false }), + enabled: schema.boolean({ defaultValue: true }), registryUrl: schema.uri({ defaultValue: 'https://epr-staging.elastic.co' }), }), fleet: schema.object({ - enabled: schema.boolean({ defaultValue: false }), + enabled: schema.boolean({ defaultValue: true }), kibana: schema.object({ host: schema.maybe(schema.string()), ca_sha256: schema.maybe(schema.string()), diff --git a/x-pack/test/api_integration/config.js b/x-pack/test/api_integration/config.js index 0eac7c58044e6..dda8c2d888d30 100644 --- a/x-pack/test/api_integration/config.js +++ b/x-pack/test/api_integration/config.js @@ -30,7 +30,6 @@ export async function getApiIntegrationConfig({ readConfigFile }) { '--telemetry.optIn=true', '--xpack.endpoint.enabled=true', '--xpack.ingestManager.enabled=true', - '--xpack.ingestManager.fleet.enabled=true', '--xpack.endpoint.alertResultListDefaultDateRange.from=2018-01-10T00:00:00.000Z', ], }, diff --git a/x-pack/test/epm_api_integration/config.ts b/x-pack/test/epm_api_integration/config.ts index e95a389ef20ed..b04bc76ccb315 100644 --- a/x-pack/test/epm_api_integration/config.ts +++ b/x-pack/test/epm_api_integration/config.ts @@ -28,7 +28,6 @@ export default async function({ readConfigFile }: FtrConfigProviderContext) { ...xPackAPITestsConfig.get('kbnTestServer'), serverArgs: [ ...xPackAPITestsConfig.get('kbnTestServer.serverArgs'), - '--xpack.ingestManager.epm.enabled=true', '--xpack.ingestManager.epm.registryUrl=http://localhost:6666', ], }, diff --git a/x-pack/test/functional_endpoint/config.ts b/x-pack/test/functional_endpoint/config.ts index 6ae78ab9d48ac..d7f1cc21828d1 100644 --- a/x-pack/test/functional_endpoint/config.ts +++ b/x-pack/test/functional_endpoint/config.ts @@ -30,8 +30,6 @@ export default async function({ readConfigFile }: FtrConfigProviderContext) { ...xpackFunctionalConfig.get('kbnTestServer.serverArgs'), '--xpack.endpoint.enabled=true', '--xpack.ingestManager.enabled=true', - '--xpack.ingestManager.epm.enabled=true', - '--xpack.ingestManager.fleet.enabled=true', ], }, }; From aecd00f3d8993e481ad2a3a3adad239bdf798978 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cau=C3=AA=20Marcondes?= <55978943+cauemarcondes@users.noreply.github.com> Date: Wed, 22 Apr 2020 06:34:40 +0100 Subject: [PATCH 30/67] [APM]fixing custom link unit tests (#64045) --- .../Settings/CustomizeUI/CustomLink/index.test.tsx | 11 +++++++---- .../__test__/TransactionActionMenu.test.tsx | 8 +++++--- 2 files changed, 12 insertions(+), 7 deletions(-) diff --git a/x-pack/legacy/plugins/apm/public/components/app/Settings/CustomizeUI/CustomLink/index.test.tsx b/x-pack/legacy/plugins/apm/public/components/app/Settings/CustomizeUI/CustomLink/index.test.tsx index 0c04b7cccbd23..e5c20b260e097 100644 --- a/x-pack/legacy/plugins/apm/public/components/app/Settings/CustomizeUI/CustomLink/index.test.tsx +++ b/x-pack/legacy/plugins/apm/public/components/app/Settings/CustomizeUI/CustomLink/index.test.tsx @@ -35,7 +35,7 @@ const data = [ ]; describe('CustomLink', () => { - let callApmApiSpy: Function; + let callApmApiSpy: jasmine.Spy; beforeAll(() => { callApmApiSpy = spyOn(apmApi, 'callApmApi').and.returnValue({}); }); @@ -101,7 +101,7 @@ describe('CustomLink', () => { ]); }); - it('checks if create custom link button is available and working', () => { + it('checks if create custom link button is available and working', async () => { const { queryByText, getByText } = render( @@ -113,6 +113,7 @@ describe('CustomLink', () => { act(() => { fireEvent.click(getByText('Create custom link')); }); + await wait(() => expect(callApmApiSpy).toHaveBeenCalled()); expect(queryByText('Create link')).toBeInTheDocument(); }); }); @@ -144,8 +145,10 @@ describe('CustomLink', () => { act(() => { fireEvent.click(component.getByText('Create custom link')); }); - await wait(() => component.queryByText('Create link')); - expect(component.queryByText('Create link')).toBeInTheDocument(); + await wait(() => + expect(component.queryByText('Create link')).toBeInTheDocument() + ); + await wait(() => expect(callApmApiSpy).toHaveBeenCalled()); return component; }; diff --git a/x-pack/legacy/plugins/apm/public/components/shared/TransactionActionMenu/__test__/TransactionActionMenu.test.tsx b/x-pack/legacy/plugins/apm/public/components/shared/TransactionActionMenu/__test__/TransactionActionMenu.test.tsx index ce42bd3e39ad1..8dc2076eab5b5 100644 --- a/x-pack/legacy/plugins/apm/public/components/shared/TransactionActionMenu/__test__/TransactionActionMenu.test.tsx +++ b/x-pack/legacy/plugins/apm/public/components/shared/TransactionActionMenu/__test__/TransactionActionMenu.test.tsx @@ -5,7 +5,7 @@ */ import React from 'react'; -import { render, fireEvent, act } from '@testing-library/react'; +import { render, fireEvent, act, wait } from '@testing-library/react'; import { TransactionActionMenu } from '../TransactionActionMenu'; import { Transaction } from '../../../../../../../../plugins/apm/typings/es_schemas/ui/transaction'; import * as Transactions from './mockData'; @@ -143,8 +143,9 @@ describe('TransactionActionMenu component', () => { }); describe('Custom links', () => { + let callApmApiSpy: jasmine.Spy; beforeAll(() => { - spyOn(apmApi, 'callApmApi').and.returnValue({}); + callApmApiSpy = spyOn(apmApi, 'callApmApi').and.returnValue({}); }); afterAll(() => { jest.resetAllMocks(); @@ -257,7 +258,7 @@ describe('TransactionActionMenu component', () => { }); expectTextsInDocument(component, ['Custom Links']); }); - it('opens flyout with filters prefilled', () => { + it('opens flyout with filters prefilled', async () => { const license = new License({ signature: 'test signature', license: { @@ -287,6 +288,7 @@ describe('TransactionActionMenu component', () => { fireEvent.click(component.getByText('Create custom link')); }); expectTextsInDocument(component, ['Create link']); + await wait(() => expect(callApmApiSpy).toHaveBeenCalled()); const getFilterKeyValue = (key: string) => { return { [(component.getAllByText(key)[0] as HTMLOptionElement) From 2f794e6c420e9837a2a2ec423dcb9017f9c5abd5 Mon Sep 17 00:00:00 2001 From: Joe Reuter Date: Wed, 22 Apr 2020 09:29:51 +0200 Subject: [PATCH 31/67] Refresh index pattern list before redirecting (#63329) --- src/legacy/core_plugins/kibana/public/discover/plugin.ts | 3 +++ src/plugins/dashboard/public/plugin.tsx | 2 ++ src/plugins/visualize/public/plugin.ts | 2 ++ test/functional/page_objects/dashboard_page.ts | 2 ++ 4 files changed, 9 insertions(+) diff --git a/src/legacy/core_plugins/kibana/public/discover/plugin.ts b/src/legacy/core_plugins/kibana/public/discover/plugin.ts index 42883abe98171..702331529b879 100644 --- a/src/legacy/core_plugins/kibana/public/discover/plugin.ts +++ b/src/legacy/core_plugins/kibana/public/discover/plugin.ts @@ -147,6 +147,9 @@ export class DiscoverPlugin implements Plugin { await this.initializeServices(); await this.initializeInnerAngular(); + // make sure the index pattern list is up to date + const [, { data: dataStart }] = await core.getStartServices(); + await dataStart.indexPatterns.clearCache(); const { renderApp } = await import('./np_ready/application'); const unmount = await renderApp(innerAngularName, params.element); return () => { diff --git a/src/plugins/dashboard/public/plugin.tsx b/src/plugins/dashboard/public/plugin.tsx index 203c784d9df4e..5f6b67ee6ad20 100644 --- a/src/plugins/dashboard/public/plugin.tsx +++ b/src/plugins/dashboard/public/plugin.tsx @@ -251,6 +251,8 @@ export class DashboardPlugin localStorage: new Storage(localStorage), usageCollection, }; + // make sure the index pattern list is up to date + await dataStart.indexPatterns.clearCache(); const { renderApp } = await import('./application/application'); const unmount = renderApp(params.element, params.appBasePath, deps); return () => { diff --git a/src/plugins/visualize/public/plugin.ts b/src/plugins/visualize/public/plugin.ts index ab64e083a553d..df8479bc891b8 100644 --- a/src/plugins/visualize/public/plugin.ts +++ b/src/plugins/visualize/public/plugin.ts @@ -123,6 +123,8 @@ export class VisualizePlugin }; setServices(deps); + // make sure the index pattern list is up to date + await pluginsStart.data.indexPatterns.clearCache(); const { renderApp } = await import('./application/application'); const unmount = renderApp(params.element, params.appBasePath, deps); return () => { diff --git a/test/functional/page_objects/dashboard_page.ts b/test/functional/page_objects/dashboard_page.ts index a20d7ae9a5372..b76ce141a4418 100644 --- a/test/functional/page_objects/dashboard_page.ts +++ b/test/functional/page_objects/dashboard_page.ts @@ -215,6 +215,8 @@ export function DashboardPageProvider({ getService, getPageObjects }: FtrProvide public async clickNewDashboard() { await listingTable.clickNewButton('createDashboardPromptButton'); + // make sure the dashboard page is shown + await this.waitForRenderComplete(); } public async clickCreateDashboardPrompt() { From 222fdc50294fbe78e40ebbf7f2678e98fd2f0a69 Mon Sep 17 00:00:00 2001 From: Peter Pisljar Date: Wed, 22 Apr 2020 10:41:58 +0200 Subject: [PATCH 32/67] refactor action filter creation utils (#62969) --- ...ta-public.datapublicpluginstart.actions.md | 3 +- ...ugins-data-public.datapublicpluginstart.md | 2 +- ...plugin-plugins-data-public.fieldformats.md | 2 +- ...plugin-plugins-data-server.fieldformats.md | 2 +- .../vis_type_vislib/public/plugin.ts | 2 +- .../vislib/components/legend/legend.test.tsx | 4 +- .../vislib/components/legend/legend.tsx | 2 +- .../public/vislib/lib/handler.js | 17 ++- .../new_platform/new_platform.karma_mock.js | 3 +- ... create_filters_from_range_select.test.ts} | 120 ++++++++---------- ...ts => create_filters_from_range_select.ts} | 34 ++--- ...> create_filters_from_value_click.test.ts} | 13 +- ....ts => create_filters_from_value_click.ts} | 25 ++-- src/plugins/data/public/actions/index.ts | 3 +- .../public/actions/select_range_action.ts | 18 +-- .../data/public/actions/value_click_action.ts | 27 ++-- src/plugins/data/public/mocks.ts | 3 +- src/plugins/data/public/plugin.ts | 10 +- src/plugins/data/public/public.api.md | 10 +- src/plugins/data/public/types.ts | 5 +- src/plugins/data/server/server.api.md | 2 +- src/plugins/embeddable/public/index.ts | 3 +- .../public/lib/triggers/triggers.ts | 22 +++- src/plugins/ui_actions/public/types.ts | 7 +- .../public/embeddable/visualize_embeddable.ts | 3 +- .../visualizations/public/expressions/vis.ts | 10 +- .../public/xy_visualization/xy_expression.tsx | 4 +- 27 files changed, 184 insertions(+), 172 deletions(-) rename src/plugins/data/public/actions/filters/{brush_event.test.ts => create_filters_from_range_select.test.ts} (58%) rename src/plugins/data/public/actions/filters/{brush_event.ts => create_filters_from_range_select.ts} (74%) rename src/plugins/data/public/actions/filters/{create_filters_from_event.test.ts => create_filters_from_value_click.test.ts} (85%) rename src/plugins/data/public/actions/filters/{create_filters_from_event.ts => create_filters_from_value_click.ts} (90%) diff --git a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.datapublicpluginstart.actions.md b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.datapublicpluginstart.actions.md index 3e966caa30799..25ce6eaa688f8 100644 --- a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.datapublicpluginstart.actions.md +++ b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.datapublicpluginstart.actions.md @@ -8,6 +8,7 @@ ```typescript actions: { - createFiltersFromEvent: typeof createFiltersFromEvent; + createFiltersFromValueClickAction: typeof createFiltersFromValueClickAction; + createFiltersFromRangeSelectAction: typeof createFiltersFromRangeSelectAction; }; ``` diff --git a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.datapublicpluginstart.md b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.datapublicpluginstart.md index a623e91388fd6..4f43f10ce089e 100644 --- a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.datapublicpluginstart.md +++ b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.datapublicpluginstart.md @@ -14,7 +14,7 @@ export interface DataPublicPluginStart | Property | Type | Description | | --- | --- | --- | -| [actions](./kibana-plugin-plugins-data-public.datapublicpluginstart.actions.md) | {
createFiltersFromEvent: typeof createFiltersFromEvent;
} | | +| [actions](./kibana-plugin-plugins-data-public.datapublicpluginstart.actions.md) | {
createFiltersFromValueClickAction: typeof createFiltersFromValueClickAction;
createFiltersFromRangeSelectAction: typeof createFiltersFromRangeSelectAction;
} | | | [autocomplete](./kibana-plugin-plugins-data-public.datapublicpluginstart.autocomplete.md) | AutocompleteStart | | | [fieldFormats](./kibana-plugin-plugins-data-public.datapublicpluginstart.fieldformats.md) | FieldFormatsStart | | | [indexPatterns](./kibana-plugin-plugins-data-public.datapublicpluginstart.indexpatterns.md) | IndexPatternsContract | | diff --git a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.fieldformats.md b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.fieldformats.md index 244633c3c4c9e..d39871b99f744 100644 --- a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.fieldformats.md +++ b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.fieldformats.md @@ -10,7 +10,7 @@ fieldFormats: { FieldFormat: typeof FieldFormat; FieldFormatsRegistry: typeof FieldFormatsRegistry; - serialize: (agg: import("./search").AggConfig) => import("../../expressions/common").SerializedFieldFormat; + serialize: (agg: import("./search").AggConfig) => import("../../expressions").SerializedFieldFormat; DEFAULT_CONVERTER_COLOR: { range: string; regex: string; diff --git a/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.fieldformats.md b/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.fieldformats.md index 2b986aee508e2..11f18a195d271 100644 --- a/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.fieldformats.md +++ b/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.fieldformats.md @@ -10,7 +10,7 @@ fieldFormats: { FieldFormatsRegistry: typeof FieldFormatsRegistry; FieldFormat: typeof FieldFormat; - serializeFieldFormat: (agg: import("../public/search").AggConfig) => import("../../expressions/common").SerializedFieldFormat; + serializeFieldFormat: (agg: import("../public/search").AggConfig) => import("../../expressions").SerializedFieldFormat; BoolFormat: typeof BoolFormat; BytesFormat: typeof BytesFormat; ColorFormat: typeof ColorFormat; diff --git a/src/legacy/core_plugins/vis_type_vislib/public/plugin.ts b/src/legacy/core_plugins/vis_type_vislib/public/plugin.ts index ef3f664252856..26800f8a1620e 100644 --- a/src/legacy/core_plugins/vis_type_vislib/public/plugin.ts +++ b/src/legacy/core_plugins/vis_type_vislib/public/plugin.ts @@ -108,6 +108,6 @@ export class VisTypeVislibPlugin implements Plugin { public start(core: CoreStart, { data }: VisTypeVislibPluginStartDependencies) { setFormatService(data.fieldFormats); - setDataActions({ createFiltersFromEvent: data.actions.createFiltersFromEvent }); + setDataActions(data.actions); } } diff --git a/src/legacy/core_plugins/vis_type_vislib/public/vislib/components/legend/legend.test.tsx b/src/legacy/core_plugins/vis_type_vislib/public/vislib/components/legend/legend.test.tsx index c378ae7b05b37..6bf66c2bdd788 100644 --- a/src/legacy/core_plugins/vis_type_vislib/public/vislib/components/legend/legend.test.tsx +++ b/src/legacy/core_plugins/vis_type_vislib/public/vislib/components/legend/legend.test.tsx @@ -36,7 +36,9 @@ jest.mock('../../../legacy_imports', () => ({ })); jest.mock('../../../services', () => ({ - getDataActions: () => ({ createFiltersFromEvent: jest.fn().mockResolvedValue(['yes']) }), + getDataActions: () => ({ + createFiltersFromValueClickAction: jest.fn().mockResolvedValue(['yes']), + }), })); const vis = { diff --git a/src/legacy/core_plugins/vis_type_vislib/public/vislib/components/legend/legend.tsx b/src/legacy/core_plugins/vis_type_vislib/public/vislib/components/legend/legend.tsx index 2fe16bbfeb625..7eb25e3930718 100644 --- a/src/legacy/core_plugins/vis_type_vislib/public/vislib/components/legend/legend.tsx +++ b/src/legacy/core_plugins/vis_type_vislib/public/vislib/components/legend/legend.tsx @@ -101,7 +101,7 @@ export class VisLegend extends PureComponent { return false; } - const filters = await getDataActions().createFiltersFromEvent(item.values); + const filters = await getDataActions().createFiltersFromValueClickAction({ data: item.values }); return Boolean(filters.length); }; diff --git a/src/legacy/core_plugins/vis_type_vislib/public/vislib/lib/handler.js b/src/legacy/core_plugins/vis_type_vislib/public/vislib/lib/handler.js index ecf67ee3e017c..f33ce0395af1f 100644 --- a/src/legacy/core_plugins/vis_type_vislib/public/vislib/lib/handler.js +++ b/src/legacy/core_plugins/vis_type_vislib/public/vislib/lib/handler.js @@ -83,10 +83,21 @@ export class Handler { // memoize so that the same function is returned every time, // allowing us to remove/re-add the same function - this.getProxyHandler = _.memoize(function(event) { + this.getProxyHandler = _.memoize(function(eventType) { const self = this; - return function(e) { - self.vis.emit(event, e); + return function(eventPayload) { + switch (eventType) { + case 'brush': + const xRaw = _.get(eventPayload.data, 'series[0].values[0].xRaw'); + if (!xRaw) return; // not sure if this is possible? + return self.vis.emit(eventType, { + table: xRaw.table, + range: eventPayload.range, + column: xRaw.column, + }); + case 'click': + return self.vis.emit(eventType, eventPayload); + } }; }); diff --git a/src/legacy/ui/public/new_platform/new_platform.karma_mock.js b/src/legacy/ui/public/new_platform/new_platform.karma_mock.js index f14f26613ef01..271586bb8c582 100644 --- a/src/legacy/ui/public/new_platform/new_platform.karma_mock.js +++ b/src/legacy/ui/public/new_platform/new_platform.karma_mock.js @@ -377,7 +377,8 @@ export const npStart = { }, data: { actions: { - createFiltersFromEvent: Promise.resolve(['yes']), + createFiltersFromValueClickAction: Promise.resolve(['yes']), + createFiltersFromRangeSelectAction: sinon.fake(), }, autocomplete: { getProvider: sinon.fake(), diff --git a/src/plugins/data/public/actions/filters/brush_event.test.ts b/src/plugins/data/public/actions/filters/create_filters_from_range_select.test.ts similarity index 58% rename from src/plugins/data/public/actions/filters/brush_event.test.ts rename to src/plugins/data/public/actions/filters/create_filters_from_range_select.test.ts index 60244354f06e4..5d21b395b994f 100644 --- a/src/plugins/data/public/actions/filters/brush_event.test.ts +++ b/src/plugins/data/public/actions/filters/create_filters_from_range_select.test.ts @@ -19,30 +19,34 @@ import moment from 'moment'; -import { onBrushEvent, BrushEvent } from './brush_event'; +import { createFiltersFromRangeSelectAction } from './create_filters_from_range_select'; -import { IndexPatternsContract } from '../../../public'; +import { IndexPatternsContract, RangeFilter } from '../../../public'; import { dataPluginMock } from '../../../public/mocks'; import { setIndexPatterns } from '../../../public/services'; import { mockDataServices } from '../../../public/search/aggs/test_helpers'; +import { TriggerContextMapping } from '../../../../ui_actions/public'; describe('brushEvent', () => { const DAY_IN_MS = 24 * 60 * 60 * 1000; const JAN_01_2014 = 1388559600000; - let baseEvent: BrushEvent; + let baseEvent: TriggerContextMapping['SELECT_RANGE_TRIGGER']['data']; + + const indexPattern = { + id: 'indexPatternId', + timeFieldName: 'time', + fields: { + getByName: () => undefined, + filter: () => [], + }, + }; const aggConfigs = [ { params: { field: {}, }, - getIndexPattern: () => ({ - timeFieldName: 'time', - fields: { - getByName: () => undefined, - filter: () => [], - }, - }), + getIndexPattern: () => indexPattern, }, ]; @@ -50,56 +54,37 @@ describe('brushEvent', () => { mockDataServices(); setIndexPatterns(({ ...dataPluginMock.createStartContract().indexPatterns, - get: async () => ({ - id: 'indexPatternId', - timeFieldName: 'time', - fields: { - getByName: () => undefined, - filter: () => [], - }, - }), + get: async () => indexPattern, } as unknown) as IndexPatternsContract); baseEvent = { - data: { - ordered: { - date: false, - }, - series: [ + column: 0, + table: { + type: 'kibana_datatable', + columns: [ { - values: [ - { - xRaw: { - column: 0, - table: { - columns: [ - { - id: '1', - meta: { - type: 'histogram', - indexPatternId: 'indexPatternId', - aggConfigParams: aggConfigs[0].params, - }, - }, - ], - }, - }, - }, - ], + id: '1', + name: '1', + meta: { + type: 'histogram', + indexPatternId: 'indexPatternId', + aggConfigParams: aggConfigs[0].params, + }, }, ], + rows: [], }, range: [], }; }); test('should be a function', () => { - expect(typeof onBrushEvent).toBe('function'); + expect(typeof createFiltersFromRangeSelectAction).toBe('function'); }); test('ignores event when data.xAxisField not provided', async () => { - const filter = await onBrushEvent(baseEvent); - expect(filter).toBeUndefined(); + const filter = await createFiltersFromRangeSelectAction(baseEvent); + expect(filter).toEqual([]); }); describe('handles an event when the x-axis field is a date field', () => { @@ -109,29 +94,29 @@ describe('brushEvent', () => { name: 'time', type: 'date', }; - baseEvent.data.ordered = { date: true }; }); afterAll(() => { baseEvent.range = []; - baseEvent.data.ordered = { date: false }; + aggConfigs[0].params.field = {}; }); test('by ignoring the event when range spans zero time', async () => { baseEvent.range = [JAN_01_2014, JAN_01_2014]; - const filter = await onBrushEvent(baseEvent); - expect(filter).toBeUndefined(); + const filter = await createFiltersFromRangeSelectAction(baseEvent); + expect(filter).toEqual([]); }); test('by updating the timefilter', async () => { baseEvent.range = [JAN_01_2014, JAN_01_2014 + DAY_IN_MS]; - const filter = await onBrushEvent(baseEvent); + const filter = await createFiltersFromRangeSelectAction(baseEvent); expect(filter).toBeDefined(); - if (filter) { - expect(filter.range.time.gte).toBe(new Date(JAN_01_2014).toISOString()); + if (filter.length) { + const rangeFilter = filter[0] as RangeFilter; + expect(rangeFilter.range.time.gte).toBe(new Date(JAN_01_2014).toISOString()); // Set to a baseline timezone for comparison. - expect(filter.range.time.lt).toBe(new Date(JAN_01_2014 + DAY_IN_MS).toISOString()); + expect(rangeFilter.range.time.lt).toBe(new Date(JAN_01_2014 + DAY_IN_MS).toISOString()); } }); }); @@ -142,26 +127,26 @@ describe('brushEvent', () => { name: 'anotherTimeField', type: 'date', }; - baseEvent.data.ordered = { date: true }; }); afterAll(() => { baseEvent.range = []; - baseEvent.data.ordered = { date: false }; + aggConfigs[0].params.field = {}; }); test('creates a new range filter', async () => { const rangeBegin = JAN_01_2014; const rangeEnd = rangeBegin + DAY_IN_MS; baseEvent.range = [rangeBegin, rangeEnd]; - const filter = await onBrushEvent(baseEvent); + const filter = await createFiltersFromRangeSelectAction(baseEvent); expect(filter).toBeDefined(); - if (filter) { - expect(filter.range.anotherTimeField.gte).toBe(moment(rangeBegin).toISOString()); - expect(filter.range.anotherTimeField.lt).toBe(moment(rangeEnd).toISOString()); - expect(filter.range.anotherTimeField).toHaveProperty( + if (filter.length) { + const rangeFilter = filter[0] as RangeFilter; + expect(rangeFilter.range.anotherTimeField.gte).toBe(moment(rangeBegin).toISOString()); + expect(rangeFilter.range.anotherTimeField.lt).toBe(moment(rangeEnd).toISOString()); + expect(rangeFilter.range.anotherTimeField).toHaveProperty( 'format', 'strict_date_optional_time' ); @@ -184,20 +169,21 @@ describe('brushEvent', () => { test('by ignoring the event when range does not span at least 2 values', async () => { baseEvent.range = [1]; - const filter = await onBrushEvent(baseEvent); - expect(filter).toBeUndefined(); + const filter = await createFiltersFromRangeSelectAction(baseEvent); + expect(filter).toEqual([]); }); test('by creating a new filter', async () => { baseEvent.range = [1, 2, 3, 4]; - const filter = await onBrushEvent(baseEvent); + const filter = await createFiltersFromRangeSelectAction(baseEvent); expect(filter).toBeDefined(); - if (filter) { - expect(filter.range.numberField.gte).toBe(1); - expect(filter.range.numberField.lt).toBe(4); - expect(filter.range.numberField).not.toHaveProperty('format'); + if (filter.length) { + const rangeFilter = filter[0] as RangeFilter; + expect(rangeFilter.range.numberField.gte).toBe(1); + expect(rangeFilter.range.numberField.lt).toBe(4); + expect(rangeFilter.range.numberField).not.toHaveProperty('format'); } }); }); diff --git a/src/plugins/data/public/actions/filters/brush_event.ts b/src/plugins/data/public/actions/filters/create_filters_from_range_select.ts similarity index 74% rename from src/plugins/data/public/actions/filters/brush_event.ts rename to src/plugins/data/public/actions/filters/create_filters_from_range_select.ts index 714f005fbeb6d..409614ca9c380 100644 --- a/src/plugins/data/public/actions/filters/brush_event.ts +++ b/src/plugins/data/public/actions/filters/create_filters_from_range_select.ts @@ -17,34 +17,18 @@ * under the License. */ -import { get, last } from 'lodash'; +import { last } from 'lodash'; import moment from 'moment'; import { esFilters, IFieldType, RangeFilterParams } from '../../../public'; import { getIndexPatterns } from '../../../public/services'; import { deserializeAggConfig } from '../../search/expressions/utils'; +import { RangeSelectTriggerContext } from '../../../../embeddable/public'; -export interface BrushEvent { - data: { - ordered: { - date: boolean; - }; - series: Array>; - }; - range: number[]; -} - -export async function onBrushEvent(event: BrushEvent) { - const isDate = get(event.data, 'ordered.date'); - const xRaw: Record = get(event.data, 'series[0].values[0].xRaw'); - - if (!xRaw) { - return; - } - - const column: Record = xRaw.table.columns[xRaw.column]; +export async function createFiltersFromRangeSelectAction(event: RangeSelectTriggerContext['data']) { + const column: Record = event.table.columns[event.column]; if (!column || !column.meta) { - return; + return []; } const indexPattern = await getIndexPatterns().get(column.meta.indexPatternId); @@ -55,16 +39,18 @@ export async function onBrushEvent(event: BrushEvent) { const field: IFieldType = aggConfig.params.field; if (!field || event.range.length <= 1) { - return; + return []; } const min = event.range[0]; const max = last(event.range); if (min === max) { - return; + return []; } + const isDate = field.type === 'date'; + const range: RangeFilterParams = { gte: isDate ? moment(min).toISOString() : min, lt: isDate ? moment(max).toISOString() : max, @@ -74,5 +60,5 @@ export async function onBrushEvent(event: BrushEvent) { range.format = 'strict_date_optional_time'; } - return esFilters.buildRangeFilter(field, range, indexPattern); + return esFilters.mapAndFlattenFilters([esFilters.buildRangeFilter(field, range, indexPattern)]); } diff --git a/src/plugins/data/public/actions/filters/create_filters_from_event.test.ts b/src/plugins/data/public/actions/filters/create_filters_from_value_click.test.ts similarity index 85% rename from src/plugins/data/public/actions/filters/create_filters_from_event.test.ts rename to src/plugins/data/public/actions/filters/create_filters_from_value_click.test.ts index 1ed09002816d1..a0e285c20d776 100644 --- a/src/plugins/data/public/actions/filters/create_filters_from_event.test.ts +++ b/src/plugins/data/public/actions/filters/create_filters_from_value_click.test.ts @@ -26,7 +26,8 @@ import { import { dataPluginMock } from '../../../public/mocks'; import { setIndexPatterns } from '../../../public/services'; import { mockDataServices } from '../../../public/search/aggs/test_helpers'; -import { createFiltersFromEvent, EventData } from './create_filters_from_event'; +import { createFiltersFromValueClickAction } from './create_filters_from_value_click'; +import { ValueClickTriggerContext } from '../../../../embeddable/public'; const mockField = { name: 'bytes', @@ -37,8 +38,8 @@ const mockField = { format: new fieldFormats.BytesFormat({}, (() => {}) as FieldFormatsGetConfigFn), }; -describe('createFiltersFromEvent', () => { - let dataPoints: EventData[]; +describe('createFiltersFromValueClick', () => { + let dataPoints: ValueClickTriggerContext['data']['data']; beforeEach(() => { dataPoints = [ @@ -86,7 +87,7 @@ describe('createFiltersFromEvent', () => { test('ignores event when value for rows is not provided', async () => { dataPoints[0].table.rows[0]['1-1'] = null; - const filters = await createFiltersFromEvent(dataPoints); + const filters = await createFiltersFromValueClickAction({ data: dataPoints }); expect(filters.length).toEqual(0); }); @@ -95,14 +96,14 @@ describe('createFiltersFromEvent', () => { if (dataPoints[0].table.columns[0].meta) { dataPoints[0].table.columns[0].meta.type = 'terms'; } - const filters = await createFiltersFromEvent(dataPoints); + const filters = await createFiltersFromValueClickAction({ data: dataPoints }); expect(filters.length).toEqual(1); expect(filters[0].query.match_phrase.bytes).toEqual('2048'); }); test('handles an event when aggregations type is not terms', async () => { - const filters = await createFiltersFromEvent(dataPoints); + const filters = await createFiltersFromValueClickAction({ data: dataPoints }); expect(filters.length).toEqual(1); diff --git a/src/plugins/data/public/actions/filters/create_filters_from_event.ts b/src/plugins/data/public/actions/filters/create_filters_from_value_click.ts similarity index 90% rename from src/plugins/data/public/actions/filters/create_filters_from_event.ts rename to src/plugins/data/public/actions/filters/create_filters_from_value_click.ts index e62945a592072..2b426813a98a4 100644 --- a/src/plugins/data/public/actions/filters/create_filters_from_event.ts +++ b/src/plugins/data/public/actions/filters/create_filters_from_value_click.ts @@ -21,13 +21,7 @@ import { KibanaDatatable } from '../../../../../plugins/expressions/public'; import { deserializeAggConfig } from '../../search/expressions'; import { esFilters, Filter } from '../../../public'; import { getIndexPatterns } from '../../../public/services'; - -export interface EventData { - table: Pick; - column: number; - row: number; - value: any; -} +import { ValueClickTriggerContext } from '../../../../embeddable/public'; /** * For terms aggregations on `__other__` buckets, this assembles a list of applicable filter @@ -39,7 +33,7 @@ export interface EventData { * @return {array} - array of terms to filter against */ const getOtherBucketFilterTerms = ( - table: EventData['table'], + table: Pick, columnIndex: number, rowIndex: number ) => { @@ -76,7 +70,11 @@ const getOtherBucketFilterTerms = ( * @param {string} cellValue - value of the current cell * @return {Filter[]|undefined} - list of filters to provide to queryFilter.addFilters() */ -const createFilter = async (table: EventData['table'], columnIndex: number, rowIndex: number) => { +const createFilter = async ( + table: Pick, + columnIndex: number, + rowIndex: number +) => { if (!table || !table.columns || !table.columns[columnIndex]) { return; } @@ -113,11 +111,14 @@ const createFilter = async (table: EventData['table'], columnIndex: number, rowI }; /** @public */ -export const createFiltersFromEvent = async (dataPoints: EventData[], negate?: boolean) => { +export const createFiltersFromValueClickAction = async ({ + data, + negate, +}: ValueClickTriggerContext['data']) => { const filters: Filter[] = []; await Promise.all( - dataPoints + data .filter(point => point) .map(async val => { const { table, column, row } = val; @@ -133,5 +134,5 @@ export const createFiltersFromEvent = async (dataPoints: EventData[], negate?: b }) ); - return filters; + return esFilters.mapAndFlattenFilters(filters); }; diff --git a/src/plugins/data/public/actions/index.ts b/src/plugins/data/public/actions/index.ts index cdb84ff13f25e..ef9014aafe82d 100644 --- a/src/plugins/data/public/actions/index.ts +++ b/src/plugins/data/public/actions/index.ts @@ -18,6 +18,7 @@ */ export { ACTION_GLOBAL_APPLY_FILTER, createFilterAction } from './apply_filter_action'; -export { createFiltersFromEvent } from './filters/create_filters_from_event'; +export { createFiltersFromValueClickAction } from './filters/create_filters_from_value_click'; +export { createFiltersFromRangeSelectAction } from './filters/create_filters_from_range_select'; export { selectRangeAction } from './select_range_action'; export { valueClickAction } from './value_click_action'; diff --git a/src/plugins/data/public/actions/select_range_action.ts b/src/plugins/data/public/actions/select_range_action.ts index 6e1f16a09e803..70a018e3c2bda 100644 --- a/src/plugins/data/public/actions/select_range_action.ts +++ b/src/plugins/data/public/actions/select_range_action.ts @@ -23,19 +23,17 @@ import { IncompatibleActionError, ActionByType, } from '../../../../plugins/ui_actions/public'; -import { onBrushEvent } from './filters/brush_event'; +import { createFiltersFromRangeSelectAction } from './filters/create_filters_from_range_select'; +import { RangeSelectTriggerContext } from '../../../embeddable/public'; import { FilterManager, TimefilterContract, esFilters } from '..'; export const ACTION_SELECT_RANGE = 'ACTION_SELECT_RANGE'; -export interface SelectRangeActionContext { - data: any; - timeFieldName: string; -} +export type SelectRangeActionContext = RangeSelectTriggerContext; async function isCompatible(context: SelectRangeActionContext) { try { - return Boolean(await onBrushEvent(context.data)); + return Boolean(await createFiltersFromRangeSelectAction(context.data)); } catch { return false; } @@ -59,13 +57,7 @@ export function selectRangeAction( throw new IncompatibleActionError(); } - const filter = await onBrushEvent(data); - - if (!filter) { - return; - } - - const selectedFilters = esFilters.mapAndFlattenFilters([filter]); + const selectedFilters = await createFiltersFromRangeSelectAction(data); if (timeFieldName) { const { timeRangeFilter, restOfFilters } = esFilters.extractTimeFilter( diff --git a/src/plugins/data/public/actions/value_click_action.ts b/src/plugins/data/public/actions/value_click_action.ts index 01c32e27da07d..1141e485309cf 100644 --- a/src/plugins/data/public/actions/value_click_action.ts +++ b/src/plugins/data/public/actions/value_click_action.ts @@ -26,21 +26,17 @@ import { } from '../../../../plugins/ui_actions/public'; import { getOverlays, getIndexPatterns } from '../services'; import { applyFiltersPopover } from '../ui/apply_filters'; -import { createFiltersFromEvent } from './filters/create_filters_from_event'; +import { createFiltersFromValueClickAction } from './filters/create_filters_from_value_click'; +import { ValueClickTriggerContext } from '../../../embeddable/public'; import { Filter, FilterManager, TimefilterContract, esFilters } from '..'; export const ACTION_VALUE_CLICK = 'ACTION_VALUE_CLICK'; -export interface ValueClickActionContext { - data: any; - timeFieldName: string; -} +export type ValueClickActionContext = ValueClickTriggerContext; async function isCompatible(context: ValueClickActionContext) { try { - const filters: Filter[] = - (await createFiltersFromEvent(context.data.data || [context.data], context.data.negate)) || - []; + const filters: Filter[] = await createFiltersFromValueClickAction(context.data); return filters.length > 0; } catch { return false; @@ -60,17 +56,16 @@ export function valueClickAction( }); }, isCompatible, - execute: async ({ timeFieldName, data }: ValueClickActionContext) => { - if (!(await isCompatible({ timeFieldName, data }))) { + execute: async (context: ValueClickActionContext) => { + if (!(await isCompatible(context))) { throw new IncompatibleActionError(); } - const filters: Filter[] = - (await createFiltersFromEvent(data.data || [data], data.negate)) || []; + const filters: Filter[] = await createFiltersFromValueClickAction(context.data); - let selectedFilters: Filter[] = esFilters.mapAndFlattenFilters(filters); + let selectedFilters = filters; - if (selectedFilters.length > 1) { + if (filters.length > 1) { const indexPatterns = await Promise.all( filters.map(filter => { return getIndexPatterns().get(filter.meta.index!); @@ -102,9 +97,9 @@ export function valueClickAction( selectedFilters = await filterSelectionPromise; } - if (timeFieldName) { + if (context.timeFieldName) { const { timeRangeFilter, restOfFilters } = esFilters.extractTimeFilter( - timeFieldName, + context.timeFieldName, selectedFilters ); filterManager.addFilters(restOfFilters); diff --git a/src/plugins/data/public/mocks.ts b/src/plugins/data/public/mocks.ts index 2d43cae79ac98..1f604b9eb6baa 100644 --- a/src/plugins/data/public/mocks.ts +++ b/src/plugins/data/public/mocks.ts @@ -45,7 +45,8 @@ const createStartContract = (): Start => { const queryStartMock = queryServiceMock.createStartContract(); return { actions: { - createFiltersFromEvent: jest.fn().mockResolvedValue(['yes']), + createFiltersFromValueClickAction: jest.fn().mockResolvedValue(['yes']), + createFiltersFromRangeSelectAction: jest.fn(), }, autocomplete: autocompleteMock, search: searchStartMock, diff --git a/src/plugins/data/public/plugin.ts b/src/plugins/data/public/plugin.ts index 1723545b32522..ccf94171235fe 100644 --- a/src/plugins/data/public/plugin.ts +++ b/src/plugins/data/public/plugin.ts @@ -58,7 +58,12 @@ import { VALUE_CLICK_TRIGGER, APPLY_FILTER_TRIGGER, } from '../../ui_actions/public'; -import { ACTION_GLOBAL_APPLY_FILTER, createFilterAction, createFiltersFromEvent } from './actions'; +import { + ACTION_GLOBAL_APPLY_FILTER, + createFilterAction, + createFiltersFromValueClickAction, + createFiltersFromRangeSelectAction, +} from './actions'; import { ApplyGlobalFilterActionContext } from './actions/apply_filter_action'; import { selectRangeAction, @@ -162,7 +167,8 @@ export class DataPublicPlugin implements Plugin import("../../expressions/common").SerializedFieldFormat; + serialize: (agg: import("./search").AggConfig) => import("../../expressions").SerializedFieldFormat; DEFAULT_CONVERTER_COLOR: { range: string; regex: string; @@ -1892,8 +1893,9 @@ export type TSearchStrategyProvider = (context: ISearc // src/plugins/data/public/index.ts:414:1 - (ae-forgotten-export) The symbol "toAbsoluteDates" needs to be exported by the entry point index.d.ts // src/plugins/data/public/query/state_sync/connect_to_query_state.ts:33:33 - (ae-forgotten-export) The symbol "FilterStateStore" needs to be exported by the entry point index.d.ts // src/plugins/data/public/query/state_sync/connect_to_query_state.ts:37:1 - (ae-forgotten-export) The symbol "QueryStateChange" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/types.ts:52:5 - (ae-forgotten-export) The symbol "createFiltersFromEvent" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/types.ts:60:5 - (ae-forgotten-export) The symbol "IndexPatternSelectProps" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/types.ts:52:5 - (ae-forgotten-export) The symbol "createFiltersFromValueClickAction" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/types.ts:53:5 - (ae-forgotten-export) The symbol "createFiltersFromRangeSelectAction" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/types.ts:61:5 - (ae-forgotten-export) The symbol "IndexPatternSelectProps" needs to be exported by the entry point index.d.ts // (No @packageDocumentation comment for this package) diff --git a/src/plugins/data/public/types.ts b/src/plugins/data/public/types.ts index e24e01d241278..5414de16be310 100644 --- a/src/plugins/data/public/types.ts +++ b/src/plugins/data/public/types.ts @@ -24,7 +24,7 @@ import { ExpressionsSetup } from 'src/plugins/expressions/public'; import { UiActionsSetup, UiActionsStart } from 'src/plugins/ui_actions/public'; import { AutocompleteSetup, AutocompleteStart } from './autocomplete'; import { FieldFormatsSetup, FieldFormatsStart } from './field_formats'; -import { createFiltersFromEvent } from './actions'; +import { createFiltersFromRangeSelectAction, createFiltersFromValueClickAction } from './actions'; import { ISearchSetup, ISearchStart } from './search'; import { QuerySetup, QueryStart } from './query'; import { IndexPatternSelectProps } from './ui/index_pattern_select'; @@ -49,7 +49,8 @@ export interface DataPublicPluginSetup { export interface DataPublicPluginStart { actions: { - createFiltersFromEvent: typeof createFiltersFromEvent; + createFiltersFromValueClickAction: typeof createFiltersFromValueClickAction; + createFiltersFromRangeSelectAction: typeof createFiltersFromRangeSelectAction; }; autocomplete: AutocompleteStart; indexPatterns: IndexPatternsContract; diff --git a/src/plugins/data/server/server.api.md b/src/plugins/data/server/server.api.md index c41023eab6d20..f8a9a7792c492 100644 --- a/src/plugins/data/server/server.api.md +++ b/src/plugins/data/server/server.api.md @@ -283,7 +283,7 @@ export interface FieldFormatConfig { export const fieldFormats: { FieldFormatsRegistry: typeof FieldFormatsRegistry; FieldFormat: typeof FieldFormat; - serializeFieldFormat: (agg: import("../public/search").AggConfig) => import("../../expressions/common").SerializedFieldFormat; + serializeFieldFormat: (agg: import("../public/search").AggConfig) => import("../../expressions").SerializedFieldFormat; BoolFormat: typeof BoolFormat; BytesFormat: typeof BytesFormat; ColorFormat: typeof ColorFormat; diff --git a/src/plugins/embeddable/public/index.ts b/src/plugins/embeddable/public/index.ts index bdb7bfbddc308..5ee66f9d19ac0 100644 --- a/src/plugins/embeddable/public/index.ts +++ b/src/plugins/embeddable/public/index.ts @@ -47,7 +47,8 @@ export { EmbeddableOutput, EmbeddablePanel, EmbeddableRoot, - EmbeddableVisTriggerContext, + ValueClickTriggerContext, + RangeSelectTriggerContext, ErrorEmbeddable, IContainer, IEmbeddable, diff --git a/src/plugins/embeddable/public/lib/triggers/triggers.ts b/src/plugins/embeddable/public/lib/triggers/triggers.ts index e29302fd6cc13..da7be1eea199a 100644 --- a/src/plugins/embeddable/public/lib/triggers/triggers.ts +++ b/src/plugins/embeddable/public/lib/triggers/triggers.ts @@ -18,18 +18,34 @@ */ import { Trigger } from '../../../../ui_actions/public'; +import { KibanaDatatable } from '../../../../expressions'; import { IEmbeddable } from '..'; export interface EmbeddableContext { embeddable: IEmbeddable; } -export interface EmbeddableVisTriggerContext { +export interface ValueClickTriggerContext { embeddable?: IEmbeddable; timeFieldName?: string; data: { - e?: MouseEvent; - data: unknown; + data: Array<{ + table: Pick; + column: number; + row: number; + value: any; + }>; + negate?: boolean; + }; +} + +export interface RangeSelectTriggerContext { + embeddable?: IEmbeddable; + timeFieldName?: string; + data: { + table: KibanaDatatable; + column: number; + range: number[]; }; } diff --git a/src/plugins/ui_actions/public/types.ts b/src/plugins/ui_actions/public/types.ts index c7e6d61e15f31..e6247a8bafff7 100644 --- a/src/plugins/ui_actions/public/types.ts +++ b/src/plugins/ui_actions/public/types.ts @@ -19,9 +19,10 @@ import { ActionByType } from './actions/action'; import { TriggerInternal } from './triggers/trigger_internal'; -import { EmbeddableVisTriggerContext, IEmbeddable } from '../../embeddable/public'; import { Filter } from '../../data/public'; import { SELECT_RANGE_TRIGGER, VALUE_CLICK_TRIGGER, APPLY_FILTER_TRIGGER } from './triggers'; +import { IEmbeddable } from '../../embeddable/public'; +import { RangeSelectTriggerContext, ValueClickTriggerContext } from '../../embeddable/public'; export type TriggerRegistry = Map>; export type ActionRegistry = Map>; @@ -36,8 +37,8 @@ export type TriggerContext = BaseContext; export interface TriggerContextMapping { [DEFAULT_TRIGGER]: TriggerContext; - [SELECT_RANGE_TRIGGER]: EmbeddableVisTriggerContext; - [VALUE_CLICK_TRIGGER]: EmbeddableVisTriggerContext; + [SELECT_RANGE_TRIGGER]: RangeSelectTriggerContext; + [VALUE_CLICK_TRIGGER]: ValueClickTriggerContext; [APPLY_FILTER_TRIGGER]: { embeddable: IEmbeddable; filters: Filter[]; diff --git a/src/plugins/visualizations/public/embeddable/visualize_embeddable.ts b/src/plugins/visualizations/public/embeddable/visualize_embeddable.ts index ffb028ff131b3..1c545bb36cff0 100644 --- a/src/plugins/visualizations/public/embeddable/visualize_embeddable.ts +++ b/src/plugins/visualizations/public/embeddable/visualize_embeddable.ts @@ -33,7 +33,6 @@ import { EmbeddableInput, EmbeddableOutput, Embeddable, - EmbeddableVisTriggerContext, IContainer, } from '../../../../plugins/embeddable/public'; import { dispatchRenderComplete } from '../../../../plugins/kibana_utils/public'; @@ -261,7 +260,7 @@ export class VisualizeEmbeddable extends Embeddable { if (!this.eventsSubject) return; - this.eventsSubject.next({ name: 'filterBucket', data }); + this.eventsSubject.next({ + name: 'filterBucket', + data: data.data + ? { + data: data.data, + negate: data.negate, + } + : { data: [data] }, + }); }, brush: (data: any) => { if (!this.eventsSubject) return; diff --git a/x-pack/plugins/lens/public/xy_visualization/xy_expression.tsx b/x-pack/plugins/lens/public/xy_visualization/xy_expression.tsx index f12a0e5b907c7..d6b6de479acfb 100644 --- a/x-pack/plugins/lens/public/xy_visualization/xy_expression.tsx +++ b/x-pack/plugins/lens/public/xy_visualization/xy_expression.tsx @@ -28,7 +28,7 @@ import { import { EuiIcon, EuiText, IconType, EuiSpacer } from '@elastic/eui'; import { FormattedMessage } from '@kbn/i18n/react'; import { i18n } from '@kbn/i18n'; -import { EmbeddableVisTriggerContext } from '../../../../../src/plugins/embeddable/public'; +import { ValueClickTriggerContext } from '../../../../../src/plugins/embeddable/public'; import { VIS_EVENT_TO_TRIGGER } from '../../../../../src/plugins/visualizations/public'; import { LensMultiTable, FormatFactory } from '../types'; import { XYArgs, SeriesType, visualizationTypes } from './types'; @@ -277,7 +277,7 @@ export function XYChart({ const timeFieldName = xDomain && xAxisFieldName; - const context: EmbeddableVisTriggerContext = { + const context: ValueClickTriggerContext = { data: { data: points.map(point => ({ row: point.row, From ffc8741da2ffcf4d31ae3ccc143fd483a61cbb1b Mon Sep 17 00:00:00 2001 From: Maja Grubic Date: Wed, 22 Apr 2020 09:59:43 +0100 Subject: [PATCH 33/67] [Dashboard] Deangularize navbar, attempt nr. 2 (#61611) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Attempt at deangularization, nr.2 * Remove padding in fullscreen * Fixing failing functional test * Fixing remaining functional test * Fixing typescript errors * Fixing filter bar not being visible in fullscreen * Fixing filter bar not being visible in fullscreen * Rebasing against master * Fixing a small leftover * Fix order of functions * Fixing linting error * Changing noPadding to a custom class * Use filterManagers to handle filters * Rename class * Attempt at deangularization, nr.2 * Remove padding in fullscreen * Fixing failing functional test * Fixing remaining functional test * Fixing typescript errors * Fixing filter bar not being visible in fullscreen * Fixing filter bar not being visible in fullscreen * Rebasing against master * Fixing a small leftover * Fix order of functions * Fixing linting error * [APM] Agent config select box doesn't work on IE (#63236) * adding value property to select options * fixing test * Use globe icon for "ext" span type on service map (#63205) Both "external" and "ext" can be returned and should have the same icon. * Move shared vislib components into Charts plugin (#62957) * Closes #56310 Move shared vislib components into Charts plugin * Fixed imports in tests * Changed i18n IDs to match charts namespace * Renamed ColorSchemaVislibParams to ColorSchemaParams, added enums and got rid of useValidation function * Renamed ColorSchemaVislibParams to ColorSchemaParams and got rid of useValidation function * Fixed merge conflict * Replaced enums with objects again * Make uptime alert flyout test a little more resilient (#62702) * [SIEM] [Cases] Unit tests for case UI components (#63005) * Endpoint: Remove unused `lib` module (#63248) * [Lens] Fix error in query from generated suggestion (#63018) * [Lens] Fix error in query from generated suggestion * Update from review comments * Fix test Co-authored-by: Elastic Machine * Resolver/node svg 2 html (#62958) * Remove some SVG in Resolver nodes and replace with HTML * [Reporting] convert all server unit tests to TypeScript (#62873) * [Reporting] convert all server unit tests to TypeScript * fix ts * revert unrelated change * [SIEM] Link ML Rule card CTA to license_management (#63210) * Link ML Rule card CTA to license_management Taking the user directly to the license management page within kibana (where they could immediately start a trial subscription) is much more actionable than taking them to the subscriptions marketing page. * Revert translation key change Neither of these is totally accurate, and there've already been translations written for the old one. * Correctly type ILM's optional dependencies as optional (#63255) And guard against their absence. * [Telemetry] use prod keys (#63263) * update chromedriver dependency to 81.0.0 (#63266) * task/mac-eventing-form (#62999) adds mac events form for endpoint policy details Co-authored-by: oatkiller * bc6 rule import april 9 (#63152) * bc6 rule import april 9 Increased the lookback of the ML rules * re-import with LF chars Co-authored-by: Elastic Machine * Added UI for pre-configured connectors. (#63074) * Added UI for pre-configured connectors. * fixed due to comments * Fixed jest tests * Fixed due to comments and added some functional tests * test fix * Fixed failed checks * Fixed functional tests failing * TaskManager tasks scheduled without attempting to run (#62078) * TaskManager tasks scheduled without attempting to run * Removing unused import Co-authored-by: Elastic Machine * Changed alerting wrong param name for help xpack.encrypted_saved_objects.encryptionKey to xpack.encryptedSavedObjects.encryptionKey (#63307) * fix ScopedHistory.createHref to prepend location with scoped history basePath (#62407) * fix createHref to prepend with scoped history basePath + add option to exclude it. * fix prependBasePath behavior * fix test plugins urls * add pathname to endpoint url builder methods * Revert "add pathname to endpoint url builder methods" This reverts commit 7604932b * adapt createHref instead of prependBasePath * use object options for createHref * update generated doc * fixing custom link popover size and hiding scroll (#63240) * Changing noPadding to a custom class * Use filterManagers to handle filters * Rename class * Applying some changes * Reverting search_bar code changes * Removing some stuff that was causing functional tests to fail * Removing refresh dashboard container which was causing errors during navigation * Do not destroy dashboardContainer * Adding updateSavedQueryId method Co-authored-by: Elastic Machine Co-authored-by: Cauê Marcondes <55978943+cauemarcondes@users.noreply.github.com> Co-authored-by: Nathan L Smith Co-authored-by: DianaDerevyankina <54894989+DianaDerevyankina@users.noreply.github.com> Co-authored-by: Brian Seeders Co-authored-by: Steph Milovic Co-authored-by: Robert Austin Co-authored-by: Wylie Conlon Co-authored-by: Brent Kimmel Co-authored-by: Tim Sullivan Co-authored-by: Ryland Herrick Co-authored-by: CJ Cenizal Co-authored-by: Ahmad Bamieh Co-authored-by: Dmitry Lemeshko Co-authored-by: Candace Park <56409205+parkiino@users.noreply.github.com> Co-authored-by: The SpaceCake Project Co-authored-by: Yuliia Naumenko Co-authored-by: Brandon Kobel Co-authored-by: Pierre Gayvallet --- .../public/application/application.ts | 16 +-- .../public/application/dashboard_app.html | 47 +------ .../public/application/dashboard_app.tsx | 15 -- .../application/dashboard_app_controller.tsx | 113 +++++++++------- .../public/top_nav_menu/_index.scss | 4 + .../public/top_nav_menu/top_nav_menu.test.tsx | 13 ++ .../public/top_nav_menu/top_nav_menu.tsx | 5 +- .../apps/dashboard/dashboard_saved_query.js | 128 ++++++++++++++++++ .../apps/dashboard/full_screen_mode.js | 18 +++ test/functional/apps/dashboard/index.js | 1 + .../apps/discover/_saved_queries.js | 1 + .../saved_query_management_component.ts | 6 + 12 files changed, 240 insertions(+), 127 deletions(-) create mode 100644 test/functional/apps/dashboard/dashboard_saved_query.js diff --git a/src/plugins/dashboard/public/application/application.ts b/src/plugins/dashboard/public/application/application.ts index 3134a5bfe2c67..a1696298117b0 100644 --- a/src/plugins/dashboard/public/application/application.ts +++ b/src/plugins/dashboard/public/application/application.ts @@ -38,12 +38,7 @@ import { EmbeddableStart } from '../../../embeddable/public'; import { NavigationPublicPluginStart as NavigationStart } from '../../../navigation/public'; import { DataPublicPluginStart } from '../../../data/public'; import { SharePluginStart } from '../../../share/public'; -import { - KibanaLegacyStart, - configureAppAngularModule, - createTopNavDirective, - createTopNavHelper, -} from '../../../kibana_legacy/public'; +import { KibanaLegacyStart, configureAppAngularModule } from '../../../kibana_legacy/public'; import { SavedObjectLoader } from '../../../saved_objects/public'; export interface RenderDeps { @@ -114,13 +109,11 @@ function mountDashboardApp(appBasePath: string, element: HTMLElement) { function createLocalAngularModule(core: AppMountContext['core'], navigation: NavigationStart) { createLocalI18nModule(); - createLocalTopNavModule(navigation); createLocalIconModule(); const dashboardAngularModule = angular.module(moduleName, [ ...thirdPartyAngularDependencies, 'app/dashboard/I18n', - 'app/dashboard/TopNav', 'app/dashboard/icon', ]); return dashboardAngularModule; @@ -132,13 +125,6 @@ function createLocalIconModule() { .directive('icon', reactDirective => reactDirective(EuiIcon)); } -function createLocalTopNavModule(navigation: NavigationStart) { - angular - .module('app/dashboard/TopNav', ['react']) - .directive('kbnTopNav', createTopNavDirective) - .directive('kbnTopNavHelper', createTopNavHelper(navigation.ui)); -} - function createLocalI18nModule() { angular .module('app/dashboard/I18n', []) diff --git a/src/plugins/dashboard/public/application/dashboard_app.html b/src/plugins/dashboard/public/application/dashboard_app.html index 3cf8932958b6d..87a5728ac2059 100644 --- a/src/plugins/dashboard/public/application/dashboard_app.html +++ b/src/plugins/dashboard/public/application/dashboard_app.html @@ -2,52 +2,7 @@ class="app-container dshAppContainer" ng-class="{'dshAppContainer--withMargins': model.useMargins}" > - - - - - - - - +

{{screenTitle}}

diff --git a/src/plugins/dashboard/public/application/dashboard_app.tsx b/src/plugins/dashboard/public/application/dashboard_app.tsx index 150cd8f8fcbb5..f101935b9288d 100644 --- a/src/plugins/dashboard/public/application/dashboard_app.tsx +++ b/src/plugins/dashboard/public/application/dashboard_app.tsx @@ -33,7 +33,6 @@ import { SavedObjectDashboard } from '../saved_dashboards'; export interface DashboardAppScope extends ng.IScope { dash: SavedObjectDashboard; appState: DashboardAppState; - screenTitle: string; model: { query: Query; filters: Filter[]; @@ -54,21 +53,7 @@ export interface DashboardAppScope extends ng.IScope { getShouldShowEditHelp: () => boolean; getShouldShowViewHelp: () => boolean; updateQueryAndFetch: ({ query, dateRange }: { query: Query; dateRange?: TimeRange }) => void; - onRefreshChange: ({ - isPaused, - refreshInterval, - }: { - isPaused: boolean; - refreshInterval: any; - }) => void; - onFiltersUpdated: (filters: Filter[]) => void; - onCancelApplyFilters: () => void; - onApplyFilters: (filters: Filter[]) => void; - onQuerySaved: (savedQuery: SavedQuery) => void; - onSavedQueryUpdated: (savedQuery: SavedQuery) => void; - onClearSavedQuery: () => void; topNavMenu: any; - showFilterBar: () => boolean; showAddPanel: any; showSaveQuery: boolean; kbnTopNav: any; diff --git a/src/plugins/dashboard/public/application/dashboard_app_controller.tsx b/src/plugins/dashboard/public/application/dashboard_app_controller.tsx index 283fe9f0a83a4..b4a53234bffac 100644 --- a/src/plugins/dashboard/public/application/dashboard_app_controller.tsx +++ b/src/plugins/dashboard/public/application/dashboard_app_controller.tsx @@ -21,12 +21,15 @@ import _, { uniq } from 'lodash'; import { i18n } from '@kbn/i18n'; import { EUI_MODAL_CANCEL_BUTTON } from '@elastic/eui'; import React from 'react'; +import ReactDOM from 'react-dom'; import angular from 'angular'; import { Subscription } from 'rxjs'; import { map } from 'rxjs/operators'; import { History } from 'history'; import { SavedObjectSaveOpts } from 'src/plugins/saved_objects/public'; +import { NavigationPublicPluginStart as NavigationStart } from 'src/plugins/navigation/public'; +import { TimeRange } from 'src/plugins/data/public'; import { DashboardEmptyScreen, DashboardEmptyScreenProps } from './dashboard_empty_screen'; import { @@ -87,6 +90,7 @@ export interface DashboardAppControllerDependencies extends RenderDeps { dashboardConfig: KibanaLegacyStart['dashboardConfig']; history: History; kbnUrlStateStorage: IKbnUrlStateStorage; + navigation: NavigationStart; } export class DashboardAppController { @@ -123,10 +127,13 @@ export class DashboardAppController { history, kbnUrlStateStorage, usageCollection, + navigation, }: DashboardAppControllerDependencies) { const filterManager = queryService.filterManager; const queryFilter = filterManager; const timefilter = queryService.timefilter.timefilter; + let showSearchBar = true; + let showQueryBar = true; let lastReloadRequestTime = 0; const dash = ($scope.dash = $route.current.locals.dash); @@ -243,6 +250,9 @@ export class DashboardAppController { } }; + const showFilterBar = () => + $scope.model.filters.length > 0 || !dashboardStateManager.getFullScreenMode(); + const getEmptyScreenProps = ( shouldShowEditHelp: boolean, isEmptyInReadOnlyMode: boolean @@ -310,7 +320,6 @@ export class DashboardAppController { refreshInterval: timefilter.getRefreshInterval(), }; $scope.panels = dashboardStateManager.getPanels(); - $scope.screenTitle = dashboardStateManager.getTitle(); }; updateState(); @@ -515,49 +524,8 @@ export class DashboardAppController { } }; - $scope.onRefreshChange = function({ isPaused, refreshInterval }) { - timefilter.setRefreshInterval({ - pause: isPaused, - value: refreshInterval ? refreshInterval : $scope.model.refreshInterval.value, - }); - }; - - $scope.onFiltersUpdated = filters => { - // The filters will automatically be set when the queryFilter emits an update event (see below) - queryFilter.setFilters(filters); - }; - - $scope.onQuerySaved = savedQuery => { - $scope.savedQuery = savedQuery; - }; - - $scope.onSavedQueryUpdated = savedQuery => { - $scope.savedQuery = { ...savedQuery }; - }; - - $scope.onClearSavedQuery = () => { - delete $scope.savedQuery; - dashboardStateManager.setSavedQueryId(undefined); - dashboardStateManager.applyFilters( - { - query: '', - language: - localStorage.get('kibana.userQueryLanguage') || uiSettings.get('search:queryLanguage'), - }, - queryFilter.getGlobalFilters() - ); - // Making this method sync broke the updates. - // Temporary fix, until we fix the complex state in this file. - setTimeout(() => { - queryFilter.setFilters(queryFilter.getGlobalFilters()); - }, 0); - }; - const updateStateFromSavedQuery = (savedQuery: SavedQuery) => { - const savedQueryFilters = savedQuery.attributes.filters || []; - const globalFilters = queryFilter.getGlobalFilters(); - const allFilters = [...globalFilters, ...savedQueryFilters]; - + const allFilters = filterManager.getFilters(); dashboardStateManager.applyFilters(savedQuery.attributes.query, allFilters); if (savedQuery.attributes.timefilter) { timefilter.setTime({ @@ -616,6 +584,42 @@ export class DashboardAppController { } ); + const onSavedQueryIdChange = (savedQueryId?: string) => { + dashboardStateManager.setSavedQueryId(savedQueryId); + }; + + const getNavBarProps = () => { + const isFullScreenMode = dashboardStateManager.getFullScreenMode(); + const screenTitle = dashboardStateManager.getTitle(); + return { + appName: 'dashboard', + config: $scope.isVisible ? $scope.topNavMenu : undefined, + className: isFullScreenMode ? 'kbnTopNavMenu-isFullScreen' : undefined, + screenTitle, + showSearchBar, + showQueryBar, + showFilterBar: showFilterBar(), + indexPatterns: $scope.indexPatterns, + showSaveQuery: $scope.showSaveQuery, + query: $scope.model.query, + savedQuery: $scope.savedQuery, + onSavedQueryIdChange, + savedQueryId: dashboardStateManager.getSavedQueryId(), + useDefaultBehaviors: true, + onQuerySubmit: (payload: { dateRange: TimeRange; query?: Query }): void => { + if (!payload.query) { + $scope.updateQueryAndFetch({ query: $scope.model.query, dateRange: payload.dateRange }); + } else { + $scope.updateQueryAndFetch({ query: payload.query, dateRange: payload.dateRange }); + } + }, + }; + }; + const dashboardNavBar = document.getElementById('dashboardChrome'); + const updateNavBar = () => { + ReactDOM.render(, dashboardNavBar); + }; + $scope.timefilterSubscriptions$ = new Subscription(); $scope.timefilterSubscriptions$.add( @@ -707,6 +711,8 @@ export class DashboardAppController { revertChangesAndExitEditMode(); } }); + + updateNavBar(); }; /** @@ -761,9 +767,6 @@ export class DashboardAppController { }); } - $scope.showFilterBar = () => - $scope.model.filters.length > 0 || !dashboardStateManager.getFullScreenMode(); - $scope.showAddPanel = () => { dashboardStateManager.setFullScreenMode(false); /* @@ -785,7 +788,11 @@ export class DashboardAppController { const navActions: { [key: string]: NavAction; } = {}; - navActions[TopNavIds.FULL_SCREEN] = () => dashboardStateManager.setFullScreenMode(true); + navActions[TopNavIds.FULL_SCREEN] = () => { + dashboardStateManager.setFullScreenMode(true); + showQueryBar = false; + updateNavBar(); + }; navActions[TopNavIds.EXIT_EDIT_MODE] = () => onChangeViewMode(ViewMode.VIEW); navActions[TopNavIds.ENTER_EDIT_MODE] = () => onChangeViewMode(ViewMode.EDIT); navActions[TopNavIds.SAVE] = () => { @@ -858,6 +865,7 @@ export class DashboardAppController { if ((response as { error: Error }).error) { dashboardStateManager.setTitle(currentTitle); } + updateNavBar(); return response; }); }; @@ -939,6 +947,9 @@ export class DashboardAppController { const visibleSubscription = chrome.getIsVisible$().subscribe(isVisible => { $scope.$evalAsync(() => { $scope.isVisible = isVisible; + showSearchBar = isVisible || showFilterBar(); + showQueryBar = !dashboardStateManager.getFullScreenMode() && isVisible; + updateNavBar(); }); }); @@ -949,6 +960,11 @@ export class DashboardAppController { navActions, dashboardConfig.getHideWriteControls() ); + updateNavBar(); + }); + + $scope.$watch('indexPatterns', () => { + updateNavBar(); }); $scope.$on('$destroy', () => { @@ -965,9 +981,6 @@ export class DashboardAppController { if (outputSubscription) { outputSubscription.unsubscribe(); } - if (dashboardContainer) { - dashboardContainer.destroy(); - } }); } } diff --git a/src/plugins/navigation/public/top_nav_menu/_index.scss b/src/plugins/navigation/public/top_nav_menu/_index.scss index 5befe4789dd6c..a6ddf7a8b4264 100644 --- a/src/plugins/navigation/public/top_nav_menu/_index.scss +++ b/src/plugins/navigation/public/top_nav_menu/_index.scss @@ -8,4 +8,8 @@ padding: 0 $euiSizeS; } } + + .kbnTopNavMenu-isFullScreen { + padding: 0; + } } 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 8e0e8b3031132..74cfd125c2e3a 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 @@ -75,4 +75,17 @@ describe('TopNavMenu', () => { expect(component.find(TOP_NAV_ITEM_SELECTOR).length).toBe(0); expect(component.find(SEARCH_BAR_SELECTOR).length).toBe(1); }); + + it('Should render with a class name', () => { + const component = shallowWithIntl( + + ); + expect(component.find('.kbnTopNavMenu').length).toBe(1); + expect(component.find('.myCoolClass').length).toBeTruthy(); + }); }); 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 14ad40f13e388..d492c7feb61a7 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 @@ -21,6 +21,7 @@ import React from 'react'; import { EuiFlexGroup, EuiFlexItem } from '@elastic/eui'; +import classNames from 'classnames'; import { TopNavMenuData } from './top_nav_menu_data'; import { TopNavMenuItem } from './top_nav_menu_item'; import { StatefulSearchBarProps, DataPublicPluginStart } from '../../../data/public'; @@ -29,6 +30,7 @@ export type TopNavMenuProps = StatefulSearchBarProps & { config?: TopNavMenuData[]; showSearchBar?: boolean; data?: DataPublicPluginStart; + className?: string; }; /* @@ -65,6 +67,7 @@ export function TopNavMenu(props: TopNavMenuProps) { } function renderLayout() { + const className = classNames('kbnTopNavMenu', props.className); return ( {renderItems()} diff --git a/test/functional/apps/dashboard/dashboard_saved_query.js b/test/functional/apps/dashboard/dashboard_saved_query.js new file mode 100644 index 0000000000000..99d0aed082e70 --- /dev/null +++ b/test/functional/apps/dashboard/dashboard_saved_query.js @@ -0,0 +1,128 @@ +/* + * 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 expect from '@kbn/expect'; + +export default function({ getService, getPageObjects }) { + const esArchiver = getService('esArchiver'); + const kibanaServer = getService('kibanaServer'); + const PageObjects = getPageObjects(['common', 'dashboard', 'timePicker']); + const browser = getService('browser'); + const queryBar = getService('queryBar'); + const savedQueryManagementComponent = getService('savedQueryManagementComponent'); + const testSubjects = getService('testSubjects'); + + describe('dashboard saved queries', function describeIndexTests() { + before(async function() { + await esArchiver.load('dashboard/current/kibana'); + await kibanaServer.uiSettings.replace({ + defaultIndex: '0bf35f60-3dc9-11e8-8660-4d65aa086b3c', + }); + await PageObjects.common.navigateToApp('dashboard'); + }); + + describe('saved query management component functionality', function() { + before(async () => { + await PageObjects.dashboard.gotoDashboardLandingPage(); + await PageObjects.dashboard.clickNewDashboard(); + }); + + it('should show the saved query management component when there are no saved queries', async () => { + await savedQueryManagementComponent.openSavedQueryManagementComponent(); + const descriptionText = await testSubjects.getVisibleText('saved-query-management-popover'); + expect(descriptionText).to.eql( + 'SAVED QUERIES\nThere are no saved queries. Save query text and filters that you want to use again.\nSave current query' + ); + }); + + it('should allow a query to be saved via the saved objects management component', async () => { + await queryBar.setQuery('response:200'); + await savedQueryManagementComponent.saveNewQuery( + 'OkResponse', + '200 responses for .jpg over 24 hours', + true, + true + ); + await savedQueryManagementComponent.savedQueryExistOrFail('OkResponse'); + await savedQueryManagementComponent.savedQueryTextExist('response:200'); + }); + + it('reinstates filters and the time filter when a saved query has filters and a time filter included', async () => { + await PageObjects.timePicker.setDefaultAbsoluteRange(); + await savedQueryManagementComponent.clearCurrentlyLoadedQuery(); + await savedQueryManagementComponent.loadSavedQuery('OkResponse'); + const timePickerValues = await PageObjects.timePicker.getTimeConfigAsAbsoluteTimes(); + expect(timePickerValues.start).to.not.eql(PageObjects.timePicker.defaultStartTime); + expect(timePickerValues.end).to.not.eql(PageObjects.timePicker.defaultEndTime); + }); + + it('preserves the currently loaded query when the page is reloaded', async () => { + await browser.refresh(); + const timePickerValues = await PageObjects.timePicker.getTimeConfigAsAbsoluteTimes(); + expect(timePickerValues.start).to.not.eql(PageObjects.timePicker.defaultStartTime); + expect(timePickerValues.end).to.not.eql(PageObjects.timePicker.defaultEndTime); + expect(await savedQueryManagementComponent.getCurrentlyLoadedQueryID()).to.be('OkResponse'); + }); + + it('allows saving changes to a currently loaded query via the saved query management component', async () => { + await queryBar.setQuery('response:404'); + await savedQueryManagementComponent.updateCurrentlyLoadedQuery( + 'OkResponse', + '404 responses', + false, + false + ); + await savedQueryManagementComponent.savedQueryExistOrFail('OkResponse'); + await savedQueryManagementComponent.clearCurrentlyLoadedQuery(); + expect(await queryBar.getQueryString()).to.eql(''); + await savedQueryManagementComponent.loadSavedQuery('OkResponse'); + expect(await queryBar.getQueryString()).to.eql('response:404'); + }); + + it('allows saving the currently loaded query as a new query', async () => { + await savedQueryManagementComponent.saveCurrentlyLoadedAsNewQuery( + 'OkResponseCopy', + '200 responses', + false, + false + ); + await savedQueryManagementComponent.savedQueryExistOrFail('OkResponseCopy'); + }); + + it('allows deleting the currently loaded saved query in the saved query management component and clears the query', async () => { + await savedQueryManagementComponent.deleteSavedQuery('OkResponseCopy'); + await savedQueryManagementComponent.savedQueryMissingOrFail('OkResponseCopy'); + expect(await queryBar.getQueryString()).to.eql(''); + }); + + it('resets any changes to a loaded query on reloading the same saved query', async () => { + await savedQueryManagementComponent.loadSavedQuery('OkResponse'); + await queryBar.setQuery('response:503'); + await savedQueryManagementComponent.loadSavedQuery('OkResponse'); + expect(await queryBar.getQueryString()).to.eql('response:404'); + }); + + it('allows clearing the currently loaded saved query', async () => { + await savedQueryManagementComponent.loadSavedQuery('OkResponse'); + await savedQueryManagementComponent.clearCurrentlyLoadedQuery(); + expect(await queryBar.getQueryString()).to.eql(''); + }); + }); + }); +} diff --git a/test/functional/apps/dashboard/full_screen_mode.js b/test/functional/apps/dashboard/full_screen_mode.js index df00f64530ca0..17eb6d8f08a9c 100644 --- a/test/functional/apps/dashboard/full_screen_mode.js +++ b/test/functional/apps/dashboard/full_screen_mode.js @@ -25,6 +25,7 @@ export default function({ getService, getPageObjects }) { const kibanaServer = getService('kibanaServer'); const dashboardPanelActions = getService('dashboardPanelActions'); const PageObjects = getPageObjects(['dashboard', 'common']); + const filterBar = getService('filterBar'); describe('full screen mode', () => { before(async () => { @@ -81,5 +82,22 @@ export default function({ getService, getPageObjects }) { expect(isChromeVisible).to.be(true); }); }); + + it('shows filter bar in fullscreen mode', async () => { + await filterBar.addFilter('bytes', 'is', '12345678'); + await PageObjects.dashboard.waitForRenderComplete(); + await PageObjects.dashboard.clickFullScreenMode(); + await retry.try(async () => { + const isChromeHidden = await PageObjects.common.isChromeHidden(); + expect(isChromeHidden).to.be(true); + }); + expect(await filterBar.getFilterCount()).to.be(1); + await PageObjects.dashboard.clickExitFullScreenLogoButton(); + await retry.try(async () => { + const isChromeVisible = await PageObjects.common.isChromeVisible(); + expect(isChromeVisible).to.be(true); + }); + await filterBar.removeFilter('bytes'); + }); }); } diff --git a/test/functional/apps/dashboard/index.js b/test/functional/apps/dashboard/index.js index 6666ccc57d584..bd8e6812147e1 100644 --- a/test/functional/apps/dashboard/index.js +++ b/test/functional/apps/dashboard/index.js @@ -74,6 +74,7 @@ export default function({ getService, loadTestFile }) { loadTestFile(require.resolve('./panel_expand_toggle')); loadTestFile(require.resolve('./dashboard_grid')); loadTestFile(require.resolve('./view_edit')); + loadTestFile(require.resolve('./dashboard_saved_query')); // Order of test suites *shouldn't* be important but there's a bug for the view_edit test above // https://github.com/elastic/kibana/issues/46752 // The dashboard_snapshot test below requires the timestamped URL which breaks the view_edit test. diff --git a/test/functional/apps/discover/_saved_queries.js b/test/functional/apps/discover/_saved_queries.js index 76f3a3aea365f..9b50eeda20073 100644 --- a/test/functional/apps/discover/_saved_queries.js +++ b/test/functional/apps/discover/_saved_queries.js @@ -74,6 +74,7 @@ export default function({ getService, getPageObjects }) { true ); await savedQueryManagementComponent.savedQueryExistOrFail('OkResponse'); + await savedQueryManagementComponent.savedQueryTextExist('response:200'); }); it('reinstates filters and the time filter when a saved query has filters and a time filter included', async () => { diff --git a/test/functional/services/saved_query_management_component.ts b/test/functional/services/saved_query_management_component.ts index 244c1cd214de5..66bf15f3da53c 100644 --- a/test/functional/services/saved_query_management_component.ts +++ b/test/functional/services/saved_query_management_component.ts @@ -151,6 +151,12 @@ export function SavedQueryManagementComponentProvider({ getService }: FtrProvide await testSubjects.existOrFail(`~load-saved-query-${title}-button`); } + async savedQueryTextExist(text: string) { + await this.openSavedQueryManagementComponent(); + const queryString = await queryBar.getQueryString(); + expect(queryString).to.eql(text); + } + async savedQueryMissingOrFail(title: string) { await retry.try(async () => { await this.openSavedQueryManagementComponent(); From c6125fc795f72840a91acb31453b67f1a849fa57 Mon Sep 17 00:00:00 2001 From: Vadim Dalecky Date: Wed, 22 Apr 2020 14:06:02 +0200 Subject: [PATCH 34/67] Filter action icons (#64073) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat: 🎸 add filter icons to filter actions * test: 💍 add unit test for icon type for createFilterAction() * test: 💍 fix TypeScript error --- src/plugins/data/public/actions/select_range_action.ts | 1 + src/plugins/data/public/actions/value_click_action.ts | 1 + .../public/lib/actions/apply_filter_action.test.ts | 8 ++++++++ .../embeddable/public/lib/actions/apply_filter_action.ts | 1 + 4 files changed, 11 insertions(+) diff --git a/src/plugins/data/public/actions/select_range_action.ts b/src/plugins/data/public/actions/select_range_action.ts index 70a018e3c2bda..4882e8eafc0d3 100644 --- a/src/plugins/data/public/actions/select_range_action.ts +++ b/src/plugins/data/public/actions/select_range_action.ts @@ -46,6 +46,7 @@ export function selectRangeAction( return createAction({ type: ACTION_SELECT_RANGE, id: ACTION_SELECT_RANGE, + getIconType: () => 'filter', getDisplayName: () => { return i18n.translate('data.filter.applyFilterActionTitle', { defaultMessage: 'Apply filter to current view', diff --git a/src/plugins/data/public/actions/value_click_action.ts b/src/plugins/data/public/actions/value_click_action.ts index 1141e485309cf..210a58b3f75aa 100644 --- a/src/plugins/data/public/actions/value_click_action.ts +++ b/src/plugins/data/public/actions/value_click_action.ts @@ -50,6 +50,7 @@ export function valueClickAction( return createAction({ type: ACTION_VALUE_CLICK, id: ACTION_VALUE_CLICK, + getIconType: () => 'filter', getDisplayName: () => { return i18n.translate('data.filter.applyFilterActionTitle', { defaultMessage: 'Apply filter to current view', diff --git a/src/plugins/embeddable/public/lib/actions/apply_filter_action.test.ts b/src/plugins/embeddable/public/lib/actions/apply_filter_action.test.ts index 5297cf6cd365c..636ce3e623c5b 100644 --- a/src/plugins/embeddable/public/lib/actions/apply_filter_action.test.ts +++ b/src/plugins/embeddable/public/lib/actions/apply_filter_action.test.ts @@ -31,6 +31,14 @@ test('has expected display name', () => { expect(action.getDisplayName({} as any)).toMatchInlineSnapshot(`"Apply filter to current view"`); }); +describe('getIconType()', () => { + test('returns "filter" icon', async () => { + const action = createFilterAction(); + const result = action.getIconType({} as any); + expect(result).toBe('filter'); + }); +}); + describe('isCompatible()', () => { test('when embeddable filters and filters exist, returns true', async () => { const action = createFilterAction(); diff --git a/src/plugins/embeddable/public/lib/actions/apply_filter_action.ts b/src/plugins/embeddable/public/lib/actions/apply_filter_action.ts index 4680512fb81c8..1cdb5af00e748 100644 --- a/src/plugins/embeddable/public/lib/actions/apply_filter_action.ts +++ b/src/plugins/embeddable/public/lib/actions/apply_filter_action.ts @@ -42,6 +42,7 @@ export function createFilterAction(): ActionByType { return createAction({ type: ACTION_APPLY_FILTER, id: ACTION_APPLY_FILTER, + getIconType: () => 'filter', getDisplayName: () => { return i18n.translate('embeddableApi.actions.applyFilterActionTitle', { defaultMessage: 'Apply filter to current view', From 2f75810f16980f8ddea2df07c3cb448ce5fce276 Mon Sep 17 00:00:00 2001 From: Anton Dosov Date: Wed, 22 Apr 2020 14:29:48 +0200 Subject: [PATCH 35/67] fix dashboard memory leak (#64154) --- .../public/application/dashboard_app_controller.tsx | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/plugins/dashboard/public/application/dashboard_app_controller.tsx b/src/plugins/dashboard/public/application/dashboard_app_controller.tsx index b4a53234bffac..fa2f06bfcdcdd 100644 --- a/src/plugins/dashboard/public/application/dashboard_app_controller.tsx +++ b/src/plugins/dashboard/public/application/dashboard_app_controller.tsx @@ -620,6 +620,12 @@ export class DashboardAppController { ReactDOM.render(, dashboardNavBar); }; + const unmountNavBar = () => { + if (dashboardNavBar) { + ReactDOM.unmountComponentAtNode(dashboardNavBar); + } + }; + $scope.timefilterSubscriptions$ = new Subscription(); $scope.timefilterSubscriptions$.add( @@ -968,6 +974,9 @@ export class DashboardAppController { }); $scope.$on('$destroy', () => { + // we have to unmount nav bar manually to make sure all internal subscriptions are unsubscribed + unmountNavBar(); + updateSubscription.unsubscribe(); stopSyncingQueryServiceStateWithUrl(); stopSyncingAppFilters(); @@ -981,6 +990,9 @@ export class DashboardAppController { if (outputSubscription) { outputSubscription.unsubscribe(); } + if (dashboardContainer) { + dashboardContainer.destroy(); + } }); } } From e17755ecef4770c7d11179fa92e7913f6f7ee937 Mon Sep 17 00:00:00 2001 From: MadameSheema Date: Wed, 22 Apr 2020 15:04:00 +0200 Subject: [PATCH 36/67] [SIEM] Adds 'Create new case' Cypress test (#63971) * adds timeline data * adds 'cases' spec * adds test * implements test * refactor * prepares test to be executed with the new platform * finishes refactor * fixes typo * renames case interface --- .../public/components/header_page/index.tsx | 7 +- .../public/components/link_icon/index.tsx | 3 + .../components/markdown_editor/index.tsx | 1 + .../timeline/selectable_timeline/index.tsx | 2 +- .../case/components/all_cases/columns.tsx | 14 +- .../case/components/all_cases/index.test.tsx | 3 +- .../pages/case/components/all_cases/index.tsx | 3 + .../pages/case/components/case_view/index.tsx | 1 + .../components/open_closed_stats/index.tsx | 33 +- .../pages/case/components/tag_list/index.tsx | 2 +- .../siem/cypress/integration/cases.spec.ts | 115 + x-pack/plugins/siem/cypress/objects/case.ts | 29 + .../plugins/siem/cypress/objects/timeline.ts | 3 +- .../plugins/siem/cypress/screens/all_cases.ts | 41 + .../siem/cypress/screens/case_details.ts | 29 + .../siem/cypress/screens/create_new_case.ts | 24 + .../plugins/siem/cypress/screens/timeline.ts | 2 + .../plugins/siem/cypress/tasks/all_cases.ts | 15 + .../siem/cypress/tasks/case_details.ts | 14 + .../siem/cypress/tasks/create_new_case.ts | 42 + .../plugins/siem/cypress/urls/navigation.ts | 1 + .../es_archives/timeline/data.json.gz | Bin 0 -> 1775 bytes .../es_archives/timeline/mappings.json | 2976 +++++++++++++++++ 23 files changed, 3335 insertions(+), 25 deletions(-) create mode 100644 x-pack/plugins/siem/cypress/integration/cases.spec.ts create mode 100644 x-pack/plugins/siem/cypress/objects/case.ts create mode 100644 x-pack/plugins/siem/cypress/screens/all_cases.ts create mode 100644 x-pack/plugins/siem/cypress/screens/case_details.ts create mode 100644 x-pack/plugins/siem/cypress/screens/create_new_case.ts create mode 100644 x-pack/plugins/siem/cypress/tasks/all_cases.ts create mode 100644 x-pack/plugins/siem/cypress/tasks/case_details.ts create mode 100644 x-pack/plugins/siem/cypress/tasks/create_new_case.ts create mode 100644 x-pack/test/siem_cypress/es_archives/timeline/data.json.gz create mode 100644 x-pack/test/siem_cypress/es_archives/timeline/mappings.json diff --git a/x-pack/legacy/plugins/siem/public/components/header_page/index.tsx b/x-pack/legacy/plugins/siem/public/components/header_page/index.tsx index f88ffc3f3c6c4..f75afcd113628 100644 --- a/x-pack/legacy/plugins/siem/public/components/header_page/index.tsx +++ b/x-pack/legacy/plugins/siem/public/components/header_page/index.tsx @@ -60,6 +60,7 @@ Badge.displayName = 'Badge'; interface BackOptions { href: LinkIconProps['href']; text: LinkIconProps['children']; + dataTestSubj?: string; } export interface HeaderPageProps extends HeaderProps { @@ -91,7 +92,11 @@ const HeaderPageComponent: React.FC = ({ {backOptions && ( - + {backOptions.text} diff --git a/x-pack/legacy/plugins/siem/public/components/link_icon/index.tsx b/x-pack/legacy/plugins/siem/public/components/link_icon/index.tsx index ba5874d42d515..36f57c46c1628 100644 --- a/x-pack/legacy/plugins/siem/public/components/link_icon/index.tsx +++ b/x-pack/legacy/plugins/siem/public/components/link_icon/index.tsx @@ -50,12 +50,14 @@ export interface LinkIconProps extends LinkProps { children: string; iconSize?: IconSize; iconType: IconType; + dataTestSubj?: string; } export const LinkIcon = React.memo( ({ children, color, + dataTestSubj, disabled, href, iconSide = 'left', @@ -67,6 +69,7 @@ export const LinkIcon = React.memo( = ({ - + {isUntitled(option) ? i18nTimeline.UNTITLED_TIMELINE : option.title} diff --git a/x-pack/legacy/plugins/siem/public/pages/case/components/all_cases/columns.tsx b/x-pack/legacy/plugins/siem/public/pages/case/components/all_cases/columns.tsx index e48e5cb0c5959..9c2a7fc07f2d3 100644 --- a/x-pack/legacy/plugins/siem/public/pages/case/components/all_cases/columns.tsx +++ b/x-pack/legacy/plugins/siem/public/pages/case/components/all_cases/columns.tsx @@ -126,10 +126,9 @@ export const getCasesColumns = ( render: (createdAt: Case['createdAt']) => { if (createdAt != null) { return ( - + + + ); } return getEmptyTagValue(); @@ -142,10 +141,9 @@ export const getCasesColumns = ( render: (closedAt: Case['closedAt']) => { if (closedAt != null) { return ( - + + + ); } return getEmptyTagValue(); diff --git a/x-pack/legacy/plugins/siem/public/pages/case/components/all_cases/index.test.tsx b/x-pack/legacy/plugins/siem/public/pages/case/components/all_cases/index.test.tsx index 58d0c1b0faaf3..eb5bca6cc57ff 100644 --- a/x-pack/legacy/plugins/siem/public/pages/case/components/all_cases/index.test.tsx +++ b/x-pack/legacy/plugins/siem/public/pages/case/components/all_cases/index.test.tsx @@ -125,8 +125,9 @@ describe('AllCases', () => { wrapper .find(`[data-test-subj="case-table-column-createdAt"]`) .first() + .childAt(0) .prop('value') - ).toEqual(useGetCasesMockState.data.cases[0].createdAt); + ).toBe(useGetCasesMockState.data.cases[0].createdAt); expect( wrapper .find(`[data-test-subj="case-table-case-count"]`) diff --git a/x-pack/legacy/plugins/siem/public/pages/case/components/all_cases/index.tsx b/x-pack/legacy/plugins/siem/public/pages/case/components/all_cases/index.tsx index a6eca717a82a3..9dd90074a2e7b 100644 --- a/x-pack/legacy/plugins/siem/public/pages/case/components/all_cases/index.tsx +++ b/x-pack/legacy/plugins/siem/public/pages/case/components/all_cases/index.tsx @@ -313,6 +313,7 @@ export const AllCases = React.memo(({ userCanCrud }) => { (({ userCanCrud }) => { (({ userCanCrud }) => { fill href={getCreateCaseUrl(urlSearch)} iconType="plusInCircle" + data-test-subj="createNewCaseBtn" > {i18n.CREATE_TITLE} diff --git a/x-pack/legacy/plugins/siem/public/pages/case/components/case_view/index.tsx b/x-pack/legacy/plugins/siem/public/pages/case/components/case_view/index.tsx index 3cf0405f40637..01b9bc42f8e91 100644 --- a/x-pack/legacy/plugins/siem/public/pages/case/components/case_view/index.tsx +++ b/x-pack/legacy/plugins/siem/public/pages/case/components/case_view/index.tsx @@ -216,6 +216,7 @@ export const CaseComponent = React.memo( backOptions={{ href: getCaseUrl(search), text: i18n.BACK_TO_ALL, + dataTestSubj: 'backToCases', }} data-test-subj="case-view-title" titleNode={ diff --git a/x-pack/legacy/plugins/siem/public/pages/case/components/open_closed_stats/index.tsx b/x-pack/legacy/plugins/siem/public/pages/case/components/open_closed_stats/index.tsx index 75f1d4d911518..b9dab13090aca 100644 --- a/x-pack/legacy/plugins/siem/public/pages/case/components/open_closed_stats/index.tsx +++ b/x-pack/legacy/plugins/siem/public/pages/case/components/open_closed_stats/index.tsx @@ -12,19 +12,28 @@ export interface Props { caseCount: number | null; caseStatus: 'open' | 'closed'; isLoading: boolean; + dataTestSubj?: string; } -export const OpenClosedStats = React.memo(({ caseCount, caseStatus, isLoading }) => { - const openClosedStats = useMemo( - () => [ - { - title: caseStatus === 'open' ? i18n.OPEN_CASES : i18n.CLOSED_CASES, - description: isLoading ? : caseCount ?? 'N/A', - }, - ], - [caseCount, caseStatus, isLoading] - ); - return ; -}); +export const OpenClosedStats = React.memo( + ({ caseCount, caseStatus, isLoading, dataTestSubj }) => { + const openClosedStats = useMemo( + () => [ + { + title: caseStatus === 'open' ? i18n.OPEN_CASES : i18n.CLOSED_CASES, + description: isLoading ? : caseCount ?? 'N/A', + }, + ], + [caseCount, caseStatus, isLoading, dataTestSubj] + ); + return ( + + ); + } +); OpenClosedStats.displayName = 'OpenClosedStats'; diff --git a/x-pack/legacy/plugins/siem/public/pages/case/components/tag_list/index.tsx b/x-pack/legacy/plugins/siem/public/pages/case/components/tag_list/index.tsx index c96ae09706426..c61feab0bab98 100644 --- a/x-pack/legacy/plugins/siem/public/pages/case/components/tag_list/index.tsx +++ b/x-pack/legacy/plugins/siem/public/pages/case/components/tag_list/index.tsx @@ -93,7 +93,7 @@ export const TagList = React.memo( )} - + {tags.length === 0 && !isEditTags &&

{i18n.NO_TAGS}

} {tags.length > 0 && !isEditTags && diff --git a/x-pack/plugins/siem/cypress/integration/cases.spec.ts b/x-pack/plugins/siem/cypress/integration/cases.spec.ts new file mode 100644 index 0000000000000..f541555d56440 --- /dev/null +++ b/x-pack/plugins/siem/cypress/integration/cases.spec.ts @@ -0,0 +1,115 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { case1 } from '../objects/case'; + +import { + ALL_CASES_CLOSE_ACTION, + ALL_CASES_CLOSED_CASES_COUNT, + ALL_CASES_CLOSED_CASES_STATS, + ALL_CASES_COMMENTS_COUNT, + ALL_CASES_DELETE_ACTION, + ALL_CASES_NAME, + ALL_CASES_OPEN_CASES_COUNT, + ALL_CASES_OPEN_CASES_STATS, + ALL_CASES_OPENED_ON, + ALL_CASES_PAGE_TITLE, + ALL_CASES_REPORTER, + ALL_CASES_REPORTERS_COUNT, + ALL_CASES_SERVICE_NOW_INCIDENT, + ALL_CASES_TAGS, + ALL_CASES_TAGS_COUNT, +} from '../screens/all_cases'; +import { + ACTION, + CASE_DETAILS_DESCRIPTION, + CASE_DETAILS_PAGE_TITLE, + CASE_DETAILS_PUSH_AS_SERVICE_NOW_BTN, + CASE_DETAILS_STATUS, + CASE_DETAILS_TAGS, + CASE_DETAILS_TIMELINE_MARKDOWN, + CASE_DETAILS_USER_ACTION, + CASE_DETAILS_USERNAMES, + PARTICIPANTS, + REPORTER, + USER, +} from '../screens/case_details'; +import { TIMELINE_DESCRIPTION, TIMELINE_QUERY, TIMELINE_TITLE } from '../screens/timeline'; + +import { goToCaseDetails, goToCreateNewCase } from '../tasks/all_cases'; +import { openCaseTimeline } from '../tasks/case_details'; +import { backToCases, createNewCase } from '../tasks/create_new_case'; +import { loginAndWaitForPageWithoutDateRange } from '../tasks/login'; +import { esArchiverLoad, esArchiverUnload } from '../tasks/es_archiver'; + +import { CASES } from '../urls/navigation'; + +describe('Cases', () => { + before(() => { + esArchiverLoad('timeline'); + }); + + after(() => { + esArchiverUnload('timeline'); + }); + + it('Creates a new case with timeline and opens the timeline', () => { + loginAndWaitForPageWithoutDateRange(CASES); + goToCreateNewCase(); + createNewCase(case1); + backToCases(); + + cy.get(ALL_CASES_PAGE_TITLE).should('have.text', 'Cases Beta'); + cy.get(ALL_CASES_OPEN_CASES_STATS).should('have.text', 'Open cases1'); + cy.get(ALL_CASES_CLOSED_CASES_STATS).should('have.text', 'Closed cases0'); + cy.get(ALL_CASES_OPEN_CASES_COUNT).should('have.text', 'Open cases (1)'); + cy.get(ALL_CASES_CLOSED_CASES_COUNT).should('have.text', 'Closed cases (0)'); + cy.get(ALL_CASES_REPORTERS_COUNT).should('have.text', 'Reporter1'); + cy.get(ALL_CASES_TAGS_COUNT).should('have.text', 'Tags2'); + cy.get(ALL_CASES_NAME).should('have.text', case1.name); + cy.get(ALL_CASES_REPORTER).should('have.text', case1.reporter); + case1.tags.forEach((tag, index) => { + cy.get(ALL_CASES_TAGS(index)).should('have.text', tag); + }); + cy.get(ALL_CASES_COMMENTS_COUNT).should('have.text', '0'); + cy.get(ALL_CASES_OPENED_ON).should('include.text', 'ago'); + cy.get(ALL_CASES_SERVICE_NOW_INCIDENT).should('have.text', 'Not pushed'); + cy.get(ALL_CASES_DELETE_ACTION).should('exist'); + cy.get(ALL_CASES_CLOSE_ACTION).should('exist'); + + goToCaseDetails(); + + const expectedTags = case1.tags.join(''); + cy.get(CASE_DETAILS_PAGE_TITLE).should('have.text', case1.name); + cy.get(CASE_DETAILS_STATUS).should('have.text', 'open'); + cy.get(CASE_DETAILS_USER_ACTION) + .eq(USER) + .should('have.text', case1.reporter); + cy.get(CASE_DETAILS_USER_ACTION) + .eq(ACTION) + .should('have.text', 'added description'); + cy.get(CASE_DETAILS_DESCRIPTION).should( + 'have.text', + `${case1.description} ${case1.timeline.title}` + ); + cy.get(CASE_DETAILS_USERNAMES) + .eq(REPORTER) + .should('have.text', case1.reporter); + cy.get(CASE_DETAILS_USERNAMES) + .eq(PARTICIPANTS) + .should('have.text', case1.reporter); + cy.get(CASE_DETAILS_TAGS).should('have.text', expectedTags); + cy.get(CASE_DETAILS_PUSH_AS_SERVICE_NOW_BTN).should('have.attr', 'disabled'); + cy.get(CASE_DETAILS_TIMELINE_MARKDOWN).then($element => { + const timelineLink = $element.prop('href').match(/http(s?):\/\/\w*:\w*(\S*)/)[0]; + openCaseTimeline(timelineLink); + + cy.get(TIMELINE_TITLE).should('have.attr', 'value', case1.timeline.title); + cy.get(TIMELINE_DESCRIPTION).should('have.attr', 'value', case1.timeline.description); + cy.get(TIMELINE_QUERY).should('have.attr', 'value', case1.timeline.query); + }); + }); +}); diff --git a/x-pack/plugins/siem/cypress/objects/case.ts b/x-pack/plugins/siem/cypress/objects/case.ts new file mode 100644 index 0000000000000..1c7bc34bca417 --- /dev/null +++ b/x-pack/plugins/siem/cypress/objects/case.ts @@ -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 { Timeline } from './timeline'; + +export interface TestCase { + name: string; + tags: string[]; + description: string; + timeline: Timeline; + reporter: string; +} + +const caseTimeline: Timeline = { + title: 'SIEM test', + description: 'description', + query: 'host.name:*', +}; + +export const case1: TestCase = { + name: 'This is the title of the case', + tags: ['Tag1', 'Tag2'], + description: 'This is the case description', + timeline: caseTimeline, + reporter: 'elastic', +}; diff --git a/x-pack/plugins/siem/cypress/objects/timeline.ts b/x-pack/plugins/siem/cypress/objects/timeline.ts index bca99bfa9266a..060a1376b46ce 100644 --- a/x-pack/plugins/siem/cypress/objects/timeline.ts +++ b/x-pack/plugins/siem/cypress/objects/timeline.ts @@ -4,7 +4,8 @@ * you may not use this file except in compliance with the Elastic License. */ -interface Timeline { +export interface Timeline { title: string; + description: string; query: string; } diff --git a/x-pack/plugins/siem/cypress/screens/all_cases.ts b/x-pack/plugins/siem/cypress/screens/all_cases.ts new file mode 100644 index 0000000000000..b1e4c66515352 --- /dev/null +++ b/x-pack/plugins/siem/cypress/screens/all_cases.ts @@ -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. + */ + +export const ALL_CASES_CLOSE_ACTION = '[data-test-subj="action-close"]'; + +export const ALL_CASES_CLOSED_CASES_COUNT = '[data-test-subj="closed-case-count"]'; + +export const ALL_CASES_CLOSED_CASES_STATS = '[data-test-subj="closedStatsHeader"]'; + +export const ALL_CASES_COMMENTS_COUNT = '[data-test-subj="case-table-column-commentCount"]'; + +export const ALL_CASES_CREATE_NEW_CASE_BTN = '[data-test-subj="createNewCaseBtn"]'; + +export const ALL_CASES_DELETE_ACTION = '[data-test-subj="action-delete"]'; + +export const ALL_CASES_NAME = '[data-test-subj="case-details-link"]'; + +export const ALL_CASES_OPEN_CASES_COUNT = '[data-test-subj="open-case-count"]'; + +export const ALL_CASES_OPEN_CASES_STATS = '[data-test-subj="openStatsHeader"]'; + +export const ALL_CASES_OPENED_ON = '[data-test-subj="case-table-column-createdAt"]'; + +export const ALL_CASES_PAGE_TITLE = '[data-test-subj="header-page-title"]'; + +export const ALL_CASES_REPORTER = '[data-test-subj="case-table-column-createdBy"]'; + +export const ALL_CASES_REPORTERS_COUNT = + '[data-test-subj="options-filter-popover-button-Reporter"]'; + +export const ALL_CASES_SERVICE_NOW_INCIDENT = + '[data-test-subj="case-table-column-external-notPushed"]'; + +export const ALL_CASES_TAGS = (index: number) => { + return `[data-test-subj="case-table-column-tags-${index}"]`; +}; + +export const ALL_CASES_TAGS_COUNT = '[data-test-subj="options-filter-popover-button-Tags"]'; diff --git a/x-pack/plugins/siem/cypress/screens/case_details.ts b/x-pack/plugins/siem/cypress/screens/case_details.ts new file mode 100644 index 0000000000000..3bd180b1d588f --- /dev/null +++ b/x-pack/plugins/siem/cypress/screens/case_details.ts @@ -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. + */ + +export const ACTION = 2; + +export const CASE_DETAILS_DESCRIPTION = '[data-test-subj="markdown-root"]'; + +export const CASE_DETAILS_PAGE_TITLE = '[data-test-subj="header-page-title"]'; + +export const CASE_DETAILS_PUSH_AS_SERVICE_NOW_BTN = '[data-test-subj="push-to-service-now"]'; + +export const CASE_DETAILS_STATUS = '[data-test-subj="case-view-status"]'; + +export const CASE_DETAILS_TAGS = '[data-test-subj="case-tags"]'; + +export const CASE_DETAILS_TIMELINE_MARKDOWN = '[data-test-subj="markdown-link"]'; + +export const CASE_DETAILS_USER_ACTION = '[data-test-subj="user-action-title"] .euiFlexItem'; + +export const CASE_DETAILS_USERNAMES = '[data-test-subj="case-view-username"]'; + +export const PARTICIPANTS = 1; + +export const REPORTER = 0; + +export const USER = 1; diff --git a/x-pack/plugins/siem/cypress/screens/create_new_case.ts b/x-pack/plugins/siem/cypress/screens/create_new_case.ts new file mode 100644 index 0000000000000..6e2beb78fff19 --- /dev/null +++ b/x-pack/plugins/siem/cypress/screens/create_new_case.ts @@ -0,0 +1,24 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +export const BACK_TO_CASES_BTN = '[data-test-subj="backToCases"]'; + +export const DESCRIPTION_INPUT = + '[data-test-subj="caseDescription"] [data-test-subj="textAreaInput"]'; + +export const INSERT_TIMELINE_BTN = '[data-test-subj="insert-timeline-button"]'; + +export const LOADING_SPINNER = '[data-test-subj="create-case-loading-spinner"]'; + +export const SUBMIT_BTN = '[data-test-subj="create-case-submit"]'; + +export const TAGS_INPUT = '[data-test-subj="caseTags"] [data-test-subj="comboBoxSearchInput"]'; + +export const TIMELINE = '[data-test-subj="timeline"]'; + +export const TIMELINE_SEARCHBOX = '[data-test-subj="timeline-super-select-search-box"]'; + +export const TITLE_INPUT = '[data-test-subj="caseTitle"] [data-test-subj="input"]'; diff --git a/x-pack/plugins/siem/cypress/screens/timeline.ts b/x-pack/plugins/siem/cypress/screens/timeline.ts index 53d8273d9ce6b..58d2568084f7c 100644 --- a/x-pack/plugins/siem/cypress/screens/timeline.ts +++ b/x-pack/plugins/siem/cypress/screens/timeline.ts @@ -42,6 +42,8 @@ export const TIMELINE_INSPECT_BUTTON = '[data-test-subj="inspect-empty-button"]' export const TIMELINE_NOT_READY_TO_DROP_BUTTON = '[data-test-subj="flyout-button-not-ready-to-drop"]'; +export const TIMELINE_QUERY = '[data-test-subj="timelineQueryInput"]'; + export const TIMELINE_SETTINGS_ICON = '[data-test-subj="settings-gear"]'; export const TIMELINE_TITLE = '[data-test-subj="timeline-title"]'; diff --git a/x-pack/plugins/siem/cypress/tasks/all_cases.ts b/x-pack/plugins/siem/cypress/tasks/all_cases.ts new file mode 100644 index 0000000000000..f374532201324 --- /dev/null +++ b/x-pack/plugins/siem/cypress/tasks/all_cases.ts @@ -0,0 +1,15 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { ALL_CASES_NAME, ALL_CASES_CREATE_NEW_CASE_BTN } from '../screens/all_cases'; + +export const goToCreateNewCase = () => { + cy.get(ALL_CASES_CREATE_NEW_CASE_BTN).click({ force: true }); +}; + +export const goToCaseDetails = () => { + cy.get(ALL_CASES_NAME).click({ force: true }); +}; diff --git a/x-pack/plugins/siem/cypress/tasks/case_details.ts b/x-pack/plugins/siem/cypress/tasks/case_details.ts new file mode 100644 index 0000000000000..a28f8b8010adb --- /dev/null +++ b/x-pack/plugins/siem/cypress/tasks/case_details.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. + */ + +import { TIMELINE_TITLE } from '../screens/timeline'; + +export const openCaseTimeline = (link: string) => { + cy.visit('/app/kibana'); + cy.visit(link); + cy.contains('a', 'SIEM'); + cy.get(TIMELINE_TITLE).should('exist'); +}; diff --git a/x-pack/plugins/siem/cypress/tasks/create_new_case.ts b/x-pack/plugins/siem/cypress/tasks/create_new_case.ts new file mode 100644 index 0000000000000..b7078a1033de8 --- /dev/null +++ b/x-pack/plugins/siem/cypress/tasks/create_new_case.ts @@ -0,0 +1,42 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { TestCase } from '../objects/case'; + +import { + BACK_TO_CASES_BTN, + DESCRIPTION_INPUT, + SUBMIT_BTN, + INSERT_TIMELINE_BTN, + LOADING_SPINNER, + TAGS_INPUT, + TIMELINE, + TIMELINE_SEARCHBOX, + TITLE_INPUT, +} from '../screens/create_new_case'; + +export const backToCases = () => { + cy.get(BACK_TO_CASES_BTN).click({ force: true }); +}; + +export const createNewCase = (newCase: TestCase) => { + cy.get(TITLE_INPUT).type(newCase.name, { force: true }); + newCase.tags.forEach(tag => { + cy.get(TAGS_INPUT).type(`${tag}{enter}`, { force: true }); + }); + cy.get(DESCRIPTION_INPUT).type(`${newCase.description} `, { force: true }); + + cy.get(INSERT_TIMELINE_BTN).click({ force: true }); + cy.get(TIMELINE_SEARCHBOX).type(`${newCase.timeline.title}{enter}`); + cy.get(TIMELINE).should('be.visible'); + cy.get(TIMELINE) + .eq(1) + .click({ force: true }); + + cy.get(SUBMIT_BTN).click({ force: true }); + cy.get(LOADING_SPINNER).should('exist'); + cy.get(LOADING_SPINNER).should('not.exist'); +}; diff --git a/x-pack/plugins/siem/cypress/urls/navigation.ts b/x-pack/plugins/siem/cypress/urls/navigation.ts index 5e65e5aa34c18..263469a4dbaed 100644 --- a/x-pack/plugins/siem/cypress/urls/navigation.ts +++ b/x-pack/plugins/siem/cypress/urls/navigation.ts @@ -4,6 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ +export const CASES = '/app/siem#/case'; export const DETECTIONS = 'app/siem#/detections'; export const HOSTS_PAGE = '/app/siem#/hosts/allHosts'; export const HOSTS_PAGE_TAB_URLS = { diff --git a/x-pack/test/siem_cypress/es_archives/timeline/data.json.gz b/x-pack/test/siem_cypress/es_archives/timeline/data.json.gz new file mode 100644 index 0000000000000000000000000000000000000000..c7acb36992af3d928d5b8aaf904c3d79eb9a2c20 GIT binary patch literal 1775 zcmV#})`l2yXXtb+RoB(NFuLyGSt^1z^Z^s6x~i)q)f}ngD^2xG*HbOUHnsP|%@Tu@ zju?z!3>jH@^~XWcS*K957hsH_NyZ?31IYzQYp2CM1(!KRdWN%vHO>WvrEr0IT8GBq zrVENhys8!8x{4vgn7)Mp!{ilM@tf4evHn6N@UFO7`{Eu+i<1tPg^%8F3qz97cZkiO zL;MWEDBQ?UA)Gtu3NsLO9a6{`N@ld_9XiMVa;LpTGy@U3%~Mcr4URYk5rv&{F%-iy zkcuP_c80K~D(={RKR6$EhV1^EQ)4^i=72PfP>@@}&nTEdpAnEy5C{l}JR62n*D}@7 z*qMYQO@ma)7Jb?$`w8kPEhlZ{x3LCg5R9w&nTM6Qhp&^%fIuihOjj(^ za*X>wW;IJ^@dT3B(=*O`A^f514Ifhm;e&o7H|^wsg<36=SS_V=p)580O`;QV?rT!<-jyEr&ChuzH%UX3hYR5OLKJ zTQyU0#Wd~eQg&2zs9+aGeh16Db1iHXnpRaS{F(PVz286C_EfKz8HJ>fuB{LzXoi}B z{y$Z!+moWow(4mvwqG=SS<%sVvG zOBBFuEOrvBgy}&@@+*Xb11XD>3C=Ir>_7xdt>}Z*Dso2LYKI34l7i$wq__izXtXmu z^%bP^Cd~o$L9+5I#?D*MdL!K7hLS@=7AAV&uC&5S#Fm5-Y&zz>Ife4k0(KLj=ob1Y z@h2;mORB5Rz`RN4Jc#Lb&9oka1B2y4p=Go<>dZ*~Cp@8kmnFJcY`m4<{;nj??adO% znt>tDa0~PaEI}JcM-xC{3!dN*exfaKx?=M@H0xlJO;#PicvO(+9&Z3$49n~c<3(5K z#e$sK)BRgY-)`c1U+UXCkbNvPwjJI!aycu7dZY+-mk0 zC^unA>tx4dASx^p3v?K6&1mQZ|3mER7==X zL|{-21$oOS0v6@|ygdKyLgEtO?}*K6*Kf0Ec$TXe>X&R5 zIn!c=;RzW$oWjI!Nb#VuzTtXDx1!1&s8P#{k*)oCa;NU5XBvuSI7i%_bIZCDLqB-y zGi-N0$1&WuJ6BD2=NA&K=jyy++;6rzKY)`P0ltZCUu3HA>qfZ#)g$~~`9iPJ{Yu-r zz_%!hz!OVRrAHSa-~%J3^Pi-1J~&1a2S~3krN8+w=xe5LKbC&s9)<7Vr%Qr&5F#Pli@;`3%_GxJ)003)gW7q%y literal 0 HcmV?d00001 diff --git a/x-pack/test/siem_cypress/es_archives/timeline/mappings.json b/x-pack/test/siem_cypress/es_archives/timeline/mappings.json new file mode 100644 index 0000000000000..d3412f9d43b57 --- /dev/null +++ b/x-pack/test/siem_cypress/es_archives/timeline/mappings.json @@ -0,0 +1,2976 @@ +{ + "type": "index", + "value": { + "aliases": { + ".kibana": { + } + }, + "index": ".kibana_1", + "mappings": { + "_meta": { + "migrationMappingPropertyHashes": { + "action": "6e96ac5e648f57523879661ea72525b7", + "action_task_params": "a9d49f184ee89641044be0ca2950fa3a", + "agent_actions": "ed270b46812f0fa1439366c428a2cf17", + "agent_configs": "38abaf89513877745c359e7700c0c66a", + "agent_events": "3231653fafe4ef3196fe3b32ab774bf2", + "agents": "c3eeb7b9d97176f15f6d126370ab23c7", + "alert": "7b44fba6773e37c806ce290ea9b7024e", + "apm-indices": "9bb9b2bf1fa636ed8619cbab5ce6a1dd", + "apm-telemetry": "3525d7c22c42bc80f5e6e9cb3f2b26a2", + "application_usage_totals": "c897e4310c5f24b07caaff3db53ae2c1", + "application_usage_transactional": "965839e75f809fefe04f92dc4d99722a", + "canvas-element": "7390014e1091044523666d97247392fc", + "canvas-workpad": "b0a1706d356228dbdcb4a17e6b9eb231", + "cases": "08b8b110dbca273d37e8aef131ecab61", + "cases-comments": "c2061fb929f585df57425102fa928b4b", + "cases-configure": "42711cbb311976c0687853f4c1354572", + "cases-user-actions": "32277330ec6b721abe3b846cfd939a71", + "config": "ae24d22d5986d04124cc6568f771066f", + "dashboard": "d00f614b29a80360e1190193fd333bab", + "datasources": "d4bc0c252b2b5683ff21ea32d00acffc", + "enrollment_api_keys": "28b91e20b105b6f928e2012600085d8f", + "epm-package": "0be91c6758421dd5d0f1a58e9e5bc7c3", + "file-upload-telemetry": "0ed4d3e1983d1217a30982630897092e", + "graph-workspace": "cd7ba1330e6682e9cc00b78850874be1", + "index-pattern": "66eccb05066c5a89924f48a9e9736499", + "infrastructure-ui-source": "ddc0ecb18383f6b26101a2fadb2dab0c", + "inventory-view": "9ecce5b58867403613d82fe496470b34", + "kql-telemetry": "d12a98a6f19a2d273696597547e064ee", + "lens": "21c3ea0763beb1ecb0162529706b88c5", + "lens-ui-telemetry": "509bfa5978586998e05f9e303c07a327", + "map": "23d7aa4a720d4938ccde3983f87bd58d", + "maps-telemetry": "268da3a48066123fc5baf35abaa55014", + "metrics-explorer-view": "53c5365793677328df0ccb6138bf3cdd", + "migrationVersion": "4a1746014a75ade3a714e1db5763276f", + "ml-telemetry": "257fd1d4b4fdbb9cb4b8a3b27da201e9", + "namespace": "2f4316de49999235636386fe51dc06c1", + "outputs": "aee9782e0d500b867859650a36280165", + "query": "11aaeb7f5f7fa5bb43f25e18ce26e7d9", + "references": "7997cf5a56cc02bdc9c93361bde732b0", + "sample-data-telemetry": "7d3cfeb915303c9641c59681967ffeb4", + "search": "181661168bbadd1eff5902361e2a0d5c", + "server": "ec97f1c5da1a19609a60874e5af1100c", + "siem-detection-engine-rule-actions": "90eee2e4635260f4be0a1da8f5bc0aa0", + "siem-detection-engine-rule-status": "ae783f41c6937db6b7a2ef5c93a9e9b0", + "siem-ui-timeline": "ac8020190f5950dd3250b6499144e7fb", + "siem-ui-timeline-note": "8874706eedc49059d4cf0f5094559084", + "siem-ui-timeline-pinned-event": "20638091112f0e14f0e443d512301c29", + "space": "c5ca8acafa0beaa4d08d014a97b6bc6b", + "telemetry": "36a616f7026dfa617d6655df850fe16d", + "timelion-sheet": "9a2a2748877c7a7b582fef201ab1d4cf", + "tsvb-validation-telemetry": "3a37ef6c8700ae6fc97d5c7da00e9215", + "type": "2f4316de49999235636386fe51dc06c1", + "ui-metric": "0d409297dc5ebe1e3a1da691c6ee32e3", + "updated_at": "00da57df13e94e9d98437d13ace4bfe0", + "upgrade-assistant-reindex-operation": "a53a20fe086b72c9a86da3cc12dad8a6", + "upgrade-assistant-telemetry": "56702cec857e0a9dacfb696655b4ff7b", + "uptime-dynamic-settings": "b6289473c8985c79b6c47eebc19a0ca5", + "url": "c7f66a0df8b1b52f17c28c4adb111105", + "visualization": "52d7a13ad68a150c4525b292d23e12cc" + } + }, + "dynamic": "strict", + "properties": { + "action": { + "properties": { + "actionTypeId": { + "type": "keyword" + }, + "config": { + "enabled": false, + "type": "object" + }, + "name": { + "fields": { + "keyword": { + "type": "keyword" + } + }, + "type": "text" + }, + "secrets": { + "type": "binary" + } + } + }, + "action_task_params": { + "properties": { + "actionId": { + "type": "keyword" + }, + "apiKey": { + "type": "binary" + }, + "params": { + "enabled": false, + "type": "object" + } + } + }, + "agent_actions": { + "properties": { + "agent_id": { + "type": "keyword" + }, + "created_at": { + "type": "date" + }, + "data": { + "type": "flattened" + }, + "sent_at": { + "type": "date" + }, + "type": { + "type": "keyword" + } + } + }, + "agent_configs": { + "properties": { + "datasources": { + "type": "keyword" + }, + "description": { + "type": "text" + }, + "id": { + "type": "keyword" + }, + "is_default": { + "type": "boolean" + }, + "name": { + "type": "text" + }, + "namespace": { + "type": "keyword" + }, + "revision": { + "type": "integer" + }, + "status": { + "type": "keyword" + }, + "updated_by": { + "type": "keyword" + }, + "updated_on": { + "type": "keyword" + } + } + }, + "agent_events": { + "properties": { + "action_id": { + "type": "keyword" + }, + "agent_id": { + "type": "keyword" + }, + "config_id": { + "type": "keyword" + }, + "data": { + "type": "text" + }, + "message": { + "type": "text" + }, + "payload": { + "type": "text" + }, + "stream_id": { + "type": "keyword" + }, + "subtype": { + "type": "keyword" + }, + "timestamp": { + "type": "date" + }, + "type": { + "type": "keyword" + } + } + }, + "agents": { + "properties": { + "access_api_key_id": { + "type": "keyword" + }, + "active": { + "type": "boolean" + }, + "config_id": { + "type": "keyword" + }, + "config_newest_revision": { + "type": "integer" + }, + "config_revision": { + "type": "integer" + }, + "current_error_events": { + "type": "text" + }, + "default_api_key": { + "type": "keyword" + }, + "enrolled_at": { + "type": "date" + }, + "last_checkin": { + "type": "date" + }, + "last_updated": { + "type": "date" + }, + "local_metadata": { + "type": "text" + }, + "shared_id": { + "type": "keyword" + }, + "type": { + "type": "keyword" + }, + "updated_at": { + "type": "date" + }, + "user_provided_metadata": { + "type": "text" + }, + "version": { + "type": "keyword" + } + } + }, + "alert": { + "properties": { + "actions": { + "properties": { + "actionRef": { + "type": "keyword" + }, + "actionTypeId": { + "type": "keyword" + }, + "group": { + "type": "keyword" + }, + "params": { + "enabled": false, + "type": "object" + } + }, + "type": "nested" + }, + "alertTypeId": { + "type": "keyword" + }, + "apiKey": { + "type": "binary" + }, + "apiKeyOwner": { + "type": "keyword" + }, + "consumer": { + "type": "keyword" + }, + "createdAt": { + "type": "date" + }, + "createdBy": { + "type": "keyword" + }, + "enabled": { + "type": "boolean" + }, + "muteAll": { + "type": "boolean" + }, + "mutedInstanceIds": { + "type": "keyword" + }, + "name": { + "fields": { + "keyword": { + "type": "keyword" + } + }, + "type": "text" + }, + "params": { + "enabled": false, + "type": "object" + }, + "schedule": { + "properties": { + "interval": { + "type": "keyword" + } + } + }, + "scheduledTaskId": { + "type": "keyword" + }, + "tags": { + "type": "keyword" + }, + "throttle": { + "type": "keyword" + }, + "updatedBy": { + "type": "keyword" + } + } + }, + "apm-indices": { + "properties": { + "apm_oss": { + "properties": { + "errorIndices": { + "type": "keyword" + }, + "metricsIndices": { + "type": "keyword" + }, + "onboardingIndices": { + "type": "keyword" + }, + "sourcemapIndices": { + "type": "keyword" + }, + "spanIndices": { + "type": "keyword" + }, + "transactionIndices": { + "type": "keyword" + } + } + } + } + }, + "apm-telemetry": { + "properties": { + "agents": { + "properties": { + "dotnet": { + "properties": { + "agent": { + "properties": { + "version": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "service": { + "properties": { + "framework": { + "properties": { + "composite": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "version": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "language": { + "properties": { + "composite": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "version": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "runtime": { + "properties": { + "composite": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "version": { + "ignore_above": 1024, + "type": "keyword" + } + } + } + } + } + } + }, + "go": { + "properties": { + "agent": { + "properties": { + "version": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "service": { + "properties": { + "framework": { + "properties": { + "composite": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "version": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "language": { + "properties": { + "composite": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "version": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "runtime": { + "properties": { + "composite": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "version": { + "ignore_above": 1024, + "type": "keyword" + } + } + } + } + } + } + }, + "java": { + "properties": { + "agent": { + "properties": { + "version": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "service": { + "properties": { + "framework": { + "properties": { + "composite": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "version": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "language": { + "properties": { + "composite": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "version": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "runtime": { + "properties": { + "composite": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "version": { + "ignore_above": 1024, + "type": "keyword" + } + } + } + } + } + } + }, + "js-base": { + "properties": { + "agent": { + "properties": { + "version": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "service": { + "properties": { + "framework": { + "properties": { + "composite": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "version": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "language": { + "properties": { + "composite": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "version": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "runtime": { + "properties": { + "composite": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "version": { + "ignore_above": 1024, + "type": "keyword" + } + } + } + } + } + } + }, + "nodejs": { + "properties": { + "agent": { + "properties": { + "version": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "service": { + "properties": { + "framework": { + "properties": { + "composite": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "version": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "language": { + "properties": { + "composite": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "version": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "runtime": { + "properties": { + "composite": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "version": { + "ignore_above": 1024, + "type": "keyword" + } + } + } + } + } + } + }, + "python": { + "properties": { + "agent": { + "properties": { + "version": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "service": { + "properties": { + "framework": { + "properties": { + "composite": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "version": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "language": { + "properties": { + "composite": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "version": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "runtime": { + "properties": { + "composite": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "version": { + "ignore_above": 1024, + "type": "keyword" + } + } + } + } + } + } + }, + "ruby": { + "properties": { + "agent": { + "properties": { + "version": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "service": { + "properties": { + "framework": { + "properties": { + "composite": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "version": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "language": { + "properties": { + "composite": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "version": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "runtime": { + "properties": { + "composite": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "version": { + "ignore_above": 1024, + "type": "keyword" + } + } + } + } + } + } + }, + "rum-js": { + "properties": { + "agent": { + "properties": { + "version": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "service": { + "properties": { + "framework": { + "properties": { + "composite": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "version": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "language": { + "properties": { + "composite": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "version": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "runtime": { + "properties": { + "composite": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "version": { + "ignore_above": 1024, + "type": "keyword" + } + } + } + } + } + } + } + } + }, + "cardinality": { + "properties": { + "transaction": { + "properties": { + "name": { + "properties": { + "all_agents": { + "properties": { + "1d": { + "type": "long" + } + } + }, + "rum": { + "properties": { + "1d": { + "type": "long" + } + } + } + } + } + } + }, + "user_agent": { + "properties": { + "original": { + "properties": { + "all_agents": { + "properties": { + "1d": { + "type": "long" + } + } + }, + "rum": { + "properties": { + "1d": { + "type": "long" + } + } + } + } + } + } + } + } + }, + "counts": { + "properties": { + "agent_configuration": { + "properties": { + "all": { + "type": "long" + } + } + }, + "error": { + "properties": { + "1d": { + "type": "long" + }, + "all": { + "type": "long" + } + } + }, + "max_error_groups_per_service": { + "properties": { + "1d": { + "type": "long" + } + } + }, + "max_transaction_groups_per_service": { + "properties": { + "1d": { + "type": "long" + } + } + }, + "metric": { + "properties": { + "1d": { + "type": "long" + }, + "all": { + "type": "long" + } + } + }, + "onboarding": { + "properties": { + "1d": { + "type": "long" + }, + "all": { + "type": "long" + } + } + }, + "services": { + "properties": { + "1d": { + "type": "long" + } + } + }, + "sourcemap": { + "properties": { + "1d": { + "type": "long" + }, + "all": { + "type": "long" + } + } + }, + "span": { + "properties": { + "1d": { + "type": "long" + }, + "all": { + "type": "long" + } + } + }, + "traces": { + "properties": { + "1d": { + "type": "long" + } + } + }, + "transaction": { + "properties": { + "1d": { + "type": "long" + }, + "all": { + "type": "long" + } + } + } + } + }, + "has_any_services": { + "type": "boolean" + }, + "indices": { + "properties": { + "all": { + "properties": { + "total": { + "properties": { + "docs": { + "properties": { + "count": { + "type": "long" + } + } + }, + "store": { + "properties": { + "size_in_bytes": { + "type": "long" + } + } + } + } + } + } + }, + "shards": { + "properties": { + "total": { + "type": "long" + } + } + } + } + }, + "integrations": { + "properties": { + "ml": { + "properties": { + "all_jobs_count": { + "type": "long" + } + } + } + } + }, + "retainment": { + "properties": { + "error": { + "properties": { + "ms": { + "type": "long" + } + } + }, + "metric": { + "properties": { + "ms": { + "type": "long" + } + } + }, + "onboarding": { + "properties": { + "ms": { + "type": "long" + } + } + }, + "span": { + "properties": { + "ms": { + "type": "long" + } + } + }, + "transaction": { + "properties": { + "ms": { + "type": "long" + } + } + } + } + }, + "services_per_agent": { + "properties": { + "dotnet": { + "null_value": 0, + "type": "long" + }, + "go": { + "null_value": 0, + "type": "long" + }, + "java": { + "null_value": 0, + "type": "long" + }, + "js-base": { + "null_value": 0, + "type": "long" + }, + "nodejs": { + "null_value": 0, + "type": "long" + }, + "python": { + "null_value": 0, + "type": "long" + }, + "ruby": { + "null_value": 0, + "type": "long" + }, + "rum-js": { + "null_value": 0, + "type": "long" + } + } + }, + "tasks": { + "properties": { + "agent_configuration": { + "properties": { + "took": { + "properties": { + "ms": { + "type": "long" + } + } + } + } + }, + "agents": { + "properties": { + "took": { + "properties": { + "ms": { + "type": "long" + } + } + } + } + }, + "cardinality": { + "properties": { + "took": { + "properties": { + "ms": { + "type": "long" + } + } + } + } + }, + "groupings": { + "properties": { + "took": { + "properties": { + "ms": { + "type": "long" + } + } + } + } + }, + "indices_stats": { + "properties": { + "took": { + "properties": { + "ms": { + "type": "long" + } + } + } + } + }, + "integrations": { + "properties": { + "took": { + "properties": { + "ms": { + "type": "long" + } + } + } + } + }, + "processor_events": { + "properties": { + "took": { + "properties": { + "ms": { + "type": "long" + } + } + } + } + }, + "services": { + "properties": { + "took": { + "properties": { + "ms": { + "type": "long" + } + } + } + } + }, + "versions": { + "properties": { + "took": { + "properties": { + "ms": { + "type": "long" + } + } + } + } + } + } + }, + "version": { + "properties": { + "apm_server": { + "properties": { + "major": { + "type": "long" + }, + "minor": { + "type": "long" + }, + "patch": { + "type": "long" + } + } + } + } + } + } + }, + "application_usage_totals": { + "properties": { + "appId": { + "type": "keyword" + }, + "minutesOnScreen": { + "type": "float" + }, + "numberOfClicks": { + "type": "long" + } + } + }, + "application_usage_transactional": { + "properties": { + "appId": { + "type": "keyword" + }, + "minutesOnScreen": { + "type": "float" + }, + "numberOfClicks": { + "type": "long" + }, + "timestamp": { + "type": "date" + } + } + }, + "canvas-element": { + "dynamic": "false", + "properties": { + "@created": { + "type": "date" + }, + "@timestamp": { + "type": "date" + }, + "content": { + "type": "text" + }, + "help": { + "type": "text" + }, + "image": { + "type": "text" + }, + "name": { + "fields": { + "keyword": { + "type": "keyword" + } + }, + "type": "text" + } + } + }, + "canvas-workpad": { + "dynamic": "false", + "properties": { + "@created": { + "type": "date" + }, + "@timestamp": { + "type": "date" + }, + "name": { + "fields": { + "keyword": { + "type": "keyword" + } + }, + "type": "text" + } + } + }, + "cases": { + "properties": { + "closed_at": { + "type": "date" + }, + "closed_by": { + "properties": { + "email": { + "type": "keyword" + }, + "full_name": { + "type": "keyword" + }, + "username": { + "type": "keyword" + } + } + }, + "created_at": { + "type": "date" + }, + "created_by": { + "properties": { + "email": { + "type": "keyword" + }, + "full_name": { + "type": "keyword" + }, + "username": { + "type": "keyword" + } + } + }, + "description": { + "type": "text" + }, + "external_service": { + "properties": { + "connector_id": { + "type": "keyword" + }, + "connector_name": { + "type": "keyword" + }, + "external_id": { + "type": "keyword" + }, + "external_title": { + "type": "text" + }, + "external_url": { + "type": "text" + }, + "pushed_at": { + "type": "date" + }, + "pushed_by": { + "properties": { + "email": { + "type": "keyword" + }, + "full_name": { + "type": "keyword" + }, + "username": { + "type": "keyword" + } + } + } + } + }, + "status": { + "type": "keyword" + }, + "tags": { + "type": "keyword" + }, + "title": { + "type": "keyword" + }, + "updated_at": { + "type": "date" + }, + "updated_by": { + "properties": { + "email": { + "type": "keyword" + }, + "full_name": { + "type": "keyword" + }, + "username": { + "type": "keyword" + } + } + } + } + }, + "cases-comments": { + "properties": { + "comment": { + "type": "text" + }, + "created_at": { + "type": "date" + }, + "created_by": { + "properties": { + "email": { + "type": "keyword" + }, + "full_name": { + "type": "keyword" + }, + "username": { + "type": "keyword" + } + } + }, + "pushed_at": { + "type": "date" + }, + "pushed_by": { + "properties": { + "email": { + "type": "keyword" + }, + "full_name": { + "type": "keyword" + }, + "username": { + "type": "keyword" + } + } + }, + "updated_at": { + "type": "date" + }, + "updated_by": { + "properties": { + "email": { + "type": "keyword" + }, + "full_name": { + "type": "keyword" + }, + "username": { + "type": "keyword" + } + } + } + } + }, + "cases-configure": { + "properties": { + "closure_type": { + "type": "keyword" + }, + "connector_id": { + "type": "keyword" + }, + "connector_name": { + "type": "keyword" + }, + "created_at": { + "type": "date" + }, + "created_by": { + "properties": { + "email": { + "type": "keyword" + }, + "full_name": { + "type": "keyword" + }, + "username": { + "type": "keyword" + } + } + }, + "updated_at": { + "type": "date" + }, + "updated_by": { + "properties": { + "email": { + "type": "keyword" + }, + "full_name": { + "type": "keyword" + }, + "username": { + "type": "keyword" + } + } + } + } + }, + "cases-user-actions": { + "properties": { + "action": { + "type": "keyword" + }, + "action_at": { + "type": "date" + }, + "action_by": { + "properties": { + "email": { + "type": "keyword" + }, + "full_name": { + "type": "keyword" + }, + "username": { + "type": "keyword" + } + } + }, + "action_field": { + "type": "keyword" + }, + "new_value": { + "type": "text" + }, + "old_value": { + "type": "text" + } + } + }, + "config": { + "dynamic": "true", + "properties": { + "buildNum": { + "type": "keyword" + }, + "dateFormat:tz": { + "fields": { + "keyword": { + "ignore_above": 256, + "type": "keyword" + } + }, + "type": "text" + } + } + }, + "dashboard": { + "properties": { + "description": { + "type": "text" + }, + "hits": { + "type": "integer" + }, + "kibanaSavedObjectMeta": { + "properties": { + "searchSourceJSON": { + "type": "text" + } + } + }, + "optionsJSON": { + "type": "text" + }, + "panelsJSON": { + "type": "text" + }, + "refreshInterval": { + "properties": { + "display": { + "type": "keyword" + }, + "pause": { + "type": "boolean" + }, + "section": { + "type": "integer" + }, + "value": { + "type": "integer" + } + } + }, + "timeFrom": { + "type": "keyword" + }, + "timeRestore": { + "type": "boolean" + }, + "timeTo": { + "type": "keyword" + }, + "title": { + "type": "text" + }, + "version": { + "type": "integer" + } + } + }, + "datasources": { + "properties": { + "config_id": { + "type": "keyword" + }, + "description": { + "type": "text" + }, + "enabled": { + "type": "boolean" + }, + "inputs": { + "properties": { + "config": { + "type": "flattened" + }, + "enabled": { + "type": "boolean" + }, + "processors": { + "type": "keyword" + }, + "streams": { + "properties": { + "config": { + "type": "flattened" + }, + "dataset": { + "type": "keyword" + }, + "enabled": { + "type": "boolean" + }, + "id": { + "type": "keyword" + }, + "processors": { + "type": "keyword" + } + }, + "type": "nested" + }, + "type": { + "type": "keyword" + } + }, + "type": "nested" + }, + "name": { + "type": "keyword" + }, + "namespace": { + "type": "keyword" + }, + "output_id": { + "type": "keyword" + }, + "package": { + "properties": { + "name": { + "type": "keyword" + }, + "title": { + "type": "keyword" + }, + "version": { + "type": "keyword" + } + } + }, + "revision": { + "type": "integer" + } + } + }, + "enrollment_api_keys": { + "properties": { + "active": { + "type": "boolean" + }, + "api_key": { + "type": "binary" + }, + "api_key_id": { + "type": "keyword" + }, + "config_id": { + "type": "keyword" + }, + "created_at": { + "type": "date" + }, + "expire_at": { + "type": "date" + }, + "name": { + "type": "keyword" + }, + "type": { + "type": "keyword" + }, + "updated_at": { + "type": "date" + } + } + }, + "epm-package": { + "properties": { + "installed": { + "properties": { + "id": { + "type": "keyword" + }, + "type": { + "type": "keyword" + } + }, + "type": "nested" + }, + "internal": { + "type": "boolean" + }, + "name": { + "type": "keyword" + }, + "version": { + "type": "keyword" + } + } + }, + "file-upload-telemetry": { + "properties": { + "filesUploadedTotalCount": { + "type": "long" + } + } + }, + "graph-workspace": { + "properties": { + "description": { + "type": "text" + }, + "kibanaSavedObjectMeta": { + "properties": { + "searchSourceJSON": { + "type": "text" + } + } + }, + "numLinks": { + "type": "integer" + }, + "numVertices": { + "type": "integer" + }, + "title": { + "type": "text" + }, + "version": { + "type": "integer" + }, + "wsState": { + "type": "text" + } + } + }, + "index-pattern": { + "properties": { + "fieldFormatMap": { + "type": "text" + }, + "fields": { + "type": "text" + }, + "intervalName": { + "type": "keyword" + }, + "notExpandable": { + "type": "boolean" + }, + "sourceFilters": { + "type": "text" + }, + "timeFieldName": { + "type": "keyword" + }, + "title": { + "type": "text" + }, + "type": { + "type": "keyword" + }, + "typeMeta": { + "type": "keyword" + } + } + }, + "infrastructure-ui-source": { + "properties": { + "description": { + "type": "text" + }, + "fields": { + "properties": { + "container": { + "type": "keyword" + }, + "host": { + "type": "keyword" + }, + "pod": { + "type": "keyword" + }, + "tiebreaker": { + "type": "keyword" + }, + "timestamp": { + "type": "keyword" + } + } + }, + "logAlias": { + "type": "keyword" + }, + "logColumns": { + "properties": { + "fieldColumn": { + "properties": { + "field": { + "type": "keyword" + }, + "id": { + "type": "keyword" + } + } + }, + "messageColumn": { + "properties": { + "id": { + "type": "keyword" + } + } + }, + "timestampColumn": { + "properties": { + "id": { + "type": "keyword" + } + } + } + }, + "type": "nested" + }, + "metricAlias": { + "type": "keyword" + }, + "name": { + "type": "text" + } + } + }, + "inventory-view": { + "properties": { + "autoBounds": { + "type": "boolean" + }, + "autoReload": { + "type": "boolean" + }, + "boundsOverride": { + "properties": { + "max": { + "type": "integer" + }, + "min": { + "type": "integer" + } + } + }, + "customMetrics": { + "properties": { + "aggregation": { + "type": "keyword" + }, + "field": { + "type": "keyword" + }, + "id": { + "type": "keyword" + }, + "label": { + "type": "keyword" + }, + "type": { + "type": "keyword" + } + }, + "type": "nested" + }, + "customOptions": { + "properties": { + "field": { + "type": "keyword" + }, + "text": { + "type": "keyword" + } + }, + "type": "nested" + }, + "filterQuery": { + "properties": { + "expression": { + "type": "keyword" + }, + "kind": { + "type": "keyword" + } + } + }, + "groupBy": { + "properties": { + "field": { + "type": "keyword" + }, + "label": { + "type": "keyword" + } + }, + "type": "nested" + }, + "metric": { + "properties": { + "aggregation": { + "type": "keyword" + }, + "field": { + "type": "keyword" + }, + "id": { + "type": "keyword" + }, + "label": { + "type": "keyword" + }, + "type": { + "type": "keyword" + } + } + }, + "name": { + "type": "keyword" + }, + "nodeType": { + "type": "keyword" + }, + "time": { + "type": "integer" + }, + "view": { + "type": "keyword" + } + } + }, + "kql-telemetry": { + "properties": { + "optInCount": { + "type": "long" + }, + "optOutCount": { + "type": "long" + } + } + }, + "lens": { + "properties": { + "expression": { + "index": false, + "type": "keyword" + }, + "state": { + "type": "flattened" + }, + "title": { + "type": "text" + }, + "visualizationType": { + "type": "keyword" + } + } + }, + "lens-ui-telemetry": { + "properties": { + "count": { + "type": "integer" + }, + "date": { + "type": "date" + }, + "name": { + "type": "keyword" + }, + "type": { + "type": "keyword" + } + } + }, + "map": { + "properties": { + "bounds": { + "type": "geo_shape" + }, + "description": { + "type": "text" + }, + "layerListJSON": { + "type": "text" + }, + "mapStateJSON": { + "type": "text" + }, + "title": { + "type": "text" + }, + "uiStateJSON": { + "type": "text" + }, + "version": { + "type": "integer" + } + } + }, + "maps-telemetry": { + "properties": { + "attributesPerMap": { + "properties": { + "dataSourcesCount": { + "properties": { + "avg": { + "type": "long" + }, + "max": { + "type": "long" + }, + "min": { + "type": "long" + } + } + }, + "emsVectorLayersCount": { + "dynamic": "true", + "type": "object" + }, + "layerTypesCount": { + "dynamic": "true", + "type": "object" + }, + "layersCount": { + "properties": { + "avg": { + "type": "long" + }, + "max": { + "type": "long" + }, + "min": { + "type": "long" + } + } + } + } + }, + "indexPatternsWithGeoFieldCount": { + "type": "long" + }, + "mapsTotalCount": { + "type": "long" + }, + "settings": { + "properties": { + "showMapVisualizationTypes": { + "type": "boolean" + } + } + }, + "timeCaptured": { + "type": "date" + } + } + }, + "metrics-explorer-view": { + "properties": { + "chartOptions": { + "properties": { + "stack": { + "type": "boolean" + }, + "type": { + "type": "keyword" + }, + "yAxisMode": { + "type": "keyword" + } + } + }, + "currentTimerange": { + "properties": { + "from": { + "type": "keyword" + }, + "interval": { + "type": "keyword" + }, + "to": { + "type": "keyword" + } + } + }, + "name": { + "type": "keyword" + }, + "options": { + "properties": { + "aggregation": { + "type": "keyword" + }, + "filterQuery": { + "type": "keyword" + }, + "groupBy": { + "type": "keyword" + }, + "limit": { + "type": "integer" + }, + "metrics": { + "properties": { + "aggregation": { + "type": "keyword" + }, + "color": { + "type": "keyword" + }, + "field": { + "type": "keyword" + }, + "label": { + "type": "keyword" + } + }, + "type": "nested" + } + } + } + } + }, + "migrationVersion": { + "dynamic": "true", + "properties": { + "space": { + "fields": { + "keyword": { + "ignore_above": 256, + "type": "keyword" + } + }, + "type": "text" + } + } + }, + "ml-telemetry": { + "properties": { + "file_data_visualizer": { + "properties": { + "index_creation_count": { + "type": "long" + } + } + } + } + }, + "namespace": { + "type": "keyword" + }, + "outputs": { + "properties": { + "api_key": { + "type": "keyword" + }, + "ca_sha256": { + "type": "keyword" + }, + "config": { + "type": "flattened" + }, + "fleet_enroll_password": { + "type": "binary" + }, + "fleet_enroll_username": { + "type": "binary" + }, + "hosts": { + "type": "keyword" + }, + "is_default": { + "type": "boolean" + }, + "name": { + "type": "keyword" + }, + "type": { + "type": "keyword" + } + } + }, + "query": { + "properties": { + "description": { + "type": "text" + }, + "filters": { + "enabled": false, + "type": "object" + }, + "query": { + "properties": { + "language": { + "type": "keyword" + }, + "query": { + "index": false, + "type": "keyword" + } + } + }, + "timefilter": { + "enabled": false, + "type": "object" + }, + "title": { + "type": "text" + } + } + }, + "references": { + "properties": { + "id": { + "type": "keyword" + }, + "name": { + "type": "keyword" + }, + "type": { + "type": "keyword" + } + }, + "type": "nested" + }, + "sample-data-telemetry": { + "properties": { + "installCount": { + "type": "long" + }, + "unInstallCount": { + "type": "long" + } + } + }, + "search": { + "properties": { + "columns": { + "type": "keyword" + }, + "description": { + "type": "text" + }, + "hits": { + "type": "integer" + }, + "kibanaSavedObjectMeta": { + "properties": { + "searchSourceJSON": { + "type": "text" + } + } + }, + "sort": { + "type": "keyword" + }, + "title": { + "type": "text" + }, + "version": { + "type": "integer" + } + } + }, + "server": { + "properties": { + "uuid": { + "type": "keyword" + } + } + }, + "siem-detection-engine-rule-actions": { + "properties": { + "actions": { + "properties": { + "action_type_id": { + "type": "keyword" + }, + "group": { + "type": "keyword" + }, + "id": { + "type": "keyword" + }, + "params": { + "dynamic": "true", + "type": "object" + } + } + }, + "alertThrottle": { + "type": "keyword" + }, + "ruleAlertId": { + "type": "keyword" + }, + "ruleThrottle": { + "type": "keyword" + } + } + }, + "siem-detection-engine-rule-status": { + "properties": { + "alertId": { + "type": "keyword" + }, + "bulkCreateTimeDurations": { + "type": "float" + }, + "gap": { + "type": "text" + }, + "lastFailureAt": { + "type": "date" + }, + "lastFailureMessage": { + "type": "text" + }, + "lastLookBackDate": { + "type": "date" + }, + "lastSuccessAt": { + "type": "date" + }, + "lastSuccessMessage": { + "type": "text" + }, + "searchAfterTimeDurations": { + "type": "float" + }, + "status": { + "type": "keyword" + }, + "statusDate": { + "type": "date" + } + } + }, + "siem-ui-timeline": { + "properties": { + "columns": { + "properties": { + "aggregatable": { + "type": "boolean" + }, + "category": { + "type": "keyword" + }, + "columnHeaderType": { + "type": "keyword" + }, + "description": { + "type": "text" + }, + "example": { + "type": "text" + }, + "id": { + "type": "keyword" + }, + "indexes": { + "type": "keyword" + }, + "name": { + "type": "text" + }, + "placeholder": { + "type": "text" + }, + "searchable": { + "type": "boolean" + }, + "type": { + "type": "keyword" + } + } + }, + "created": { + "type": "date" + }, + "createdBy": { + "type": "text" + }, + "dataProviders": { + "properties": { + "and": { + "properties": { + "enabled": { + "type": "boolean" + }, + "excluded": { + "type": "boolean" + }, + "id": { + "type": "keyword" + }, + "kqlQuery": { + "type": "text" + }, + "name": { + "type": "text" + }, + "queryMatch": { + "properties": { + "displayField": { + "type": "text" + }, + "displayValue": { + "type": "text" + }, + "field": { + "type": "text" + }, + "operator": { + "type": "text" + }, + "value": { + "type": "text" + } + } + } + } + }, + "enabled": { + "type": "boolean" + }, + "excluded": { + "type": "boolean" + }, + "id": { + "type": "keyword" + }, + "kqlQuery": { + "type": "text" + }, + "name": { + "type": "text" + }, + "queryMatch": { + "properties": { + "displayField": { + "type": "text" + }, + "displayValue": { + "type": "text" + }, + "field": { + "type": "text" + }, + "operator": { + "type": "text" + }, + "value": { + "type": "text" + } + } + } + } + }, + "dateRange": { + "properties": { + "end": { + "type": "date" + }, + "start": { + "type": "date" + } + } + }, + "description": { + "type": "text" + }, + "eventType": { + "type": "keyword" + }, + "favorite": { + "properties": { + "favoriteDate": { + "type": "date" + }, + "fullName": { + "type": "text" + }, + "keySearch": { + "type": "text" + }, + "userName": { + "type": "text" + } + } + }, + "filters": { + "properties": { + "exists": { + "type": "text" + }, + "match_all": { + "type": "text" + }, + "meta": { + "properties": { + "alias": { + "type": "text" + }, + "controlledBy": { + "type": "text" + }, + "disabled": { + "type": "boolean" + }, + "field": { + "type": "text" + }, + "formattedValue": { + "type": "text" + }, + "index": { + "type": "keyword" + }, + "key": { + "type": "keyword" + }, + "negate": { + "type": "boolean" + }, + "params": { + "type": "text" + }, + "type": { + "type": "keyword" + }, + "value": { + "type": "text" + } + } + }, + "missing": { + "type": "text" + }, + "query": { + "type": "text" + }, + "range": { + "type": "text" + }, + "script": { + "type": "text" + } + } + }, + "kqlMode": { + "type": "keyword" + }, + "kqlQuery": { + "properties": { + "filterQuery": { + "properties": { + "kuery": { + "properties": { + "expression": { + "type": "text" + }, + "kind": { + "type": "keyword" + } + } + }, + "serializedQuery": { + "type": "text" + } + } + } + } + }, + "savedQueryId": { + "type": "keyword" + }, + "sort": { + "properties": { + "columnId": { + "type": "keyword" + }, + "sortDirection": { + "type": "keyword" + } + } + }, + "title": { + "type": "text" + }, + "updated": { + "type": "date" + }, + "updatedBy": { + "type": "text" + } + } + }, + "siem-ui-timeline-note": { + "properties": { + "created": { + "type": "date" + }, + "createdBy": { + "type": "text" + }, + "eventId": { + "type": "keyword" + }, + "note": { + "type": "text" + }, + "timelineId": { + "type": "keyword" + }, + "updated": { + "type": "date" + }, + "updatedBy": { + "type": "text" + } + } + }, + "siem-ui-timeline-pinned-event": { + "properties": { + "created": { + "type": "date" + }, + "createdBy": { + "type": "text" + }, + "eventId": { + "type": "keyword" + }, + "timelineId": { + "type": "keyword" + }, + "updated": { + "type": "date" + }, + "updatedBy": { + "type": "text" + } + } + }, + "space": { + "properties": { + "_reserved": { + "type": "boolean" + }, + "color": { + "type": "keyword" + }, + "description": { + "type": "text" + }, + "disabledFeatures": { + "type": "keyword" + }, + "imageUrl": { + "index": false, + "type": "text" + }, + "initials": { + "type": "keyword" + }, + "name": { + "fields": { + "keyword": { + "ignore_above": 2048, + "type": "keyword" + } + }, + "type": "text" + } + } + }, + "spaceId": { + "type": "keyword" + }, + "telemetry": { + "properties": { + "allowChangingOptInStatus": { + "type": "boolean" + }, + "enabled": { + "type": "boolean" + }, + "lastReported": { + "type": "date" + }, + "lastVersionChecked": { + "type": "keyword" + }, + "reportFailureCount": { + "type": "integer" + }, + "reportFailureVersion": { + "type": "keyword" + }, + "sendUsageFrom": { + "type": "keyword" + }, + "userHasSeenNotice": { + "type": "boolean" + } + } + }, + "timelion-sheet": { + "properties": { + "description": { + "type": "text" + }, + "hits": { + "type": "integer" + }, + "kibanaSavedObjectMeta": { + "properties": { + "searchSourceJSON": { + "type": "text" + } + } + }, + "timelion_chart_height": { + "type": "integer" + }, + "timelion_columns": { + "type": "integer" + }, + "timelion_interval": { + "type": "keyword" + }, + "timelion_other_interval": { + "type": "keyword" + }, + "timelion_rows": { + "type": "integer" + }, + "timelion_sheet": { + "type": "text" + }, + "title": { + "type": "text" + }, + "version": { + "type": "integer" + } + } + }, + "tsvb-validation-telemetry": { + "properties": { + "failedRequests": { + "type": "long" + } + } + }, + "type": { + "type": "keyword" + }, + "ui-metric": { + "properties": { + "count": { + "type": "integer" + } + } + }, + "updated_at": { + "type": "date" + }, + "upgrade-assistant-reindex-operation": { + "dynamic": "true", + "properties": { + "indexName": { + "type": "keyword" + }, + "status": { + "type": "integer" + } + } + }, + "upgrade-assistant-telemetry": { + "properties": { + "features": { + "properties": { + "deprecation_logging": { + "properties": { + "enabled": { + "null_value": true, + "type": "boolean" + } + } + } + } + }, + "ui_open": { + "properties": { + "cluster": { + "null_value": 0, + "type": "long" + }, + "indices": { + "null_value": 0, + "type": "long" + }, + "overview": { + "null_value": 0, + "type": "long" + } + } + }, + "ui_reindex": { + "properties": { + "close": { + "null_value": 0, + "type": "long" + }, + "open": { + "null_value": 0, + "type": "long" + }, + "start": { + "null_value": 0, + "type": "long" + }, + "stop": { + "null_value": 0, + "type": "long" + } + } + } + } + }, + "uptime-dynamic-settings": { + "properties": { + "heartbeatIndices": { + "type": "keyword" + } + } + }, + "url": { + "properties": { + "accessCount": { + "type": "long" + }, + "accessDate": { + "type": "date" + }, + "createDate": { + "type": "date" + }, + "url": { + "fields": { + "keyword": { + "ignore_above": 2048, + "type": "keyword" + } + }, + "type": "text" + } + } + }, + "visualization": { + "properties": { + "description": { + "type": "text" + }, + "kibanaSavedObjectMeta": { + "properties": { + "searchSourceJSON": { + "type": "text" + } + } + }, + "savedSearchRefName": { + "type": "keyword" + }, + "title": { + "type": "text" + }, + "uiStateJSON": { + "type": "text" + }, + "version": { + "type": "integer" + }, + "visState": { + "type": "text" + } + } + } + } + }, + "settings": { + "index": { + "auto_expand_replicas": "0-1", + "number_of_replicas": "0", + "number_of_shards": "1" + } + } + } +} \ No newline at end of file From 989245793ed677df3e52ea62309e5d820fcfe87b Mon Sep 17 00:00:00 2001 From: Chris Roberson Date: Wed, 22 Apr 2020 09:06:40 -0400 Subject: [PATCH 37/67] [Monitoring] Fix monitoring 7.7 deprecations (#63738) * Fix monitoring 7.7 deprecations * Switch order * Add comment Co-authored-by: Elastic Machine --- .../config/deprecation/core_deprecations.ts | 50 ------------------- .../plugins/monitoring/server/deprecations.ts | 27 +++++++++- 2 files changed, 26 insertions(+), 51 deletions(-) diff --git a/src/core/server/config/deprecation/core_deprecations.ts b/src/core/server/config/deprecation/core_deprecations.ts index f0b21adf62ff7..9e098c06ba155 100644 --- a/src/core/server/config/deprecation/core_deprecations.ts +++ b/src/core/server/config/deprecation/core_deprecations.ts @@ -128,56 +128,6 @@ export const coreDeprecationProvider: ConfigDeprecationProvider = ({ renameFromRoot('optimize.lazyHost', 'optimize.watchHost'), renameFromRoot('optimize.lazyPrebuild', 'optimize.watchPrebuild'), renameFromRoot('optimize.lazyProxyTimeout', 'optimize.watchProxyTimeout'), - // Monitoring renames - // TODO: Remove these from here once the monitoring plugin is migrated to NP - renameFromRoot('xpack.monitoring.enabled', 'monitoring.enabled'), - renameFromRoot('xpack.monitoring.ui.enabled', 'monitoring.ui.enabled'), - renameFromRoot( - 'xpack.monitoring.kibana.collection.enabled', - 'monitoring.kibana.collection.enabled' - ), - renameFromRoot('xpack.monitoring.max_bucket_size', 'monitoring.ui.max_bucket_size'), - renameFromRoot('xpack.monitoring.min_interval_seconds', 'monitoring.ui.min_interval_seconds'), - renameFromRoot( - 'xpack.monitoring.show_license_expiration', - 'monitoring.ui.show_license_expiration' - ), - renameFromRoot( - 'xpack.monitoring.ui.container.elasticsearch.enabled', - 'monitoring.ui.container.elasticsearch.enabled' - ), - renameFromRoot( - 'xpack.monitoring.ui.container.logstash.enabled', - 'monitoring.ui.container.logstash.enabled' - ), - renameFromRoot( - 'xpack.monitoring.tests.cloud_detector.enabled', - 'monitoring.tests.cloud_detector.enabled' - ), - renameFromRoot( - 'xpack.monitoring.kibana.collection.interval', - 'monitoring.kibana.collection.interval' - ), - renameFromRoot('xpack.monitoring.elasticsearch.hosts', 'monitoring.ui.elasticsearch.hosts'), - renameFromRoot('xpack.monitoring.elasticsearch.username', 'monitoring.ui.elasticsearch.username'), - renameFromRoot('xpack.monitoring.elasticsearch.password', 'monitoring.ui.elasticsearch.password'), - renameFromRoot( - 'xpack.monitoring.xpack_api_polling_frequency_millis', - 'monitoring.xpack_api_polling_frequency_millis' - ), - renameFromRoot( - 'xpack.monitoring.cluster_alerts.email_notifications.enabled', - 'monitoring.cluster_alerts.email_notifications.enabled' - ), - renameFromRoot( - 'xpack.monitoring.cluster_alerts.email_notifications.email_address', - 'monitoring.cluster_alerts.email_notifications.email_address' - ), - renameFromRoot('xpack.monitoring.ccs.enabled', 'monitoring.ui.ccs.enabled'), - renameFromRoot( - 'xpack.monitoring.elasticsearch.logFetchCount', - 'monitoring.ui.elasticsearch.logFetchCount' - ), configPathDeprecation, dataPathDeprecation, rewriteBasePathDeprecation, diff --git a/x-pack/plugins/monitoring/server/deprecations.ts b/x-pack/plugins/monitoring/server/deprecations.ts index dfe8ab31f972c..3a3ec6ac799d2 100644 --- a/x-pack/plugins/monitoring/server/deprecations.ts +++ b/x-pack/plugins/monitoring/server/deprecations.ts @@ -16,8 +16,33 @@ import { CLUSTER_ALERTS_ADDRESS_CONFIG_KEY } from '../common/constants'; * major version! * @return {Array} array of rename operations and callback function for rename logging */ -export const deprecations = ({ rename }: ConfigDeprecationFactory): ConfigDeprecation[] => { +export const deprecations = ({ + rename, + renameFromRoot, +}: ConfigDeprecationFactory): ConfigDeprecation[] => { return [ + // This order matters. The "blanket rename" needs to happen at the end + renameFromRoot('xpack.monitoring.max_bucket_size', 'monitoring.ui.max_bucket_size'), + renameFromRoot('xpack.monitoring.min_interval_seconds', 'monitoring.ui.min_interval_seconds'), + renameFromRoot( + 'xpack.monitoring.show_license_expiration', + 'monitoring.ui.show_license_expiration' + ), + renameFromRoot( + 'xpack.monitoring.ui.container.elasticsearch.enabled', + 'monitoring.ui.container.elasticsearch.enabled' + ), + renameFromRoot( + 'xpack.monitoring.ui.container.logstash.enabled', + 'monitoring.ui.container.logstash.enabled' + ), + renameFromRoot('xpack.monitoring.elasticsearch', 'monitoring.ui.elasticsearch'), + renameFromRoot('xpack.monitoring.ccs.enabled', 'monitoring.ui.ccs.enabled'), + renameFromRoot( + 'xpack.monitoring.elasticsearch.logFetchCount', + 'monitoring.ui.elasticsearch.logFetchCount' + ), + renameFromRoot('xpack.monitoring', 'monitoring'), (config, fromPath, logger) => { const clusterAlertsEnabled = get(config, 'cluster_alerts.enabled'); const emailNotificationsEnabled = From ed3c94bc76ff2df9725243bfe77d75e048a0fd50 Mon Sep 17 00:00:00 2001 From: Joe Reuter Date: Wed, 22 Apr 2020 15:07:12 +0200 Subject: [PATCH 38/67] fix leftover timelion paths (#64041) --- .../tasks/nodejs_modules/clean_client_modules_on_dll_task.js | 4 ++-- src/dev/precommit_hook/casing_check_config.js | 5 ----- 2 files changed, 2 insertions(+), 7 deletions(-) diff --git a/src/dev/build/tasks/nodejs_modules/clean_client_modules_on_dll_task.js b/src/dev/build/tasks/nodejs_modules/clean_client_modules_on_dll_task.js index 52928d6e47fc4..8e8d69a4dfefa 100644 --- a/src/dev/build/tasks/nodejs_modules/clean_client_modules_on_dll_task.js +++ b/src/dev/build/tasks/nodejs_modules/clean_client_modules_on_dll_task.js @@ -48,12 +48,12 @@ export const CleanClientModulesOnDLLTask = { ]; const discoveredLegacyCorePluginEntries = await globby([ `${baseDir}/src/legacy/core_plugins/*/index.js`, - // Small exception to load dynamically discovered functions for timelion plugin - `${baseDir}/src/legacy/core_plugins/timelion/server/*_functions/**/*.js`, `!${baseDir}/src/legacy/core_plugins/**/public`, ]); const discoveredPluginEntries = await globby([ `${baseDir}/src/plugins/*/server/index.js`, + // Small exception to load dynamically discovered functions for timelion plugin + `${baseDir}/src/plugins/vis_type_timelion/server/*_functions/**/*.js`, `!${baseDir}/src/plugins/**/public`, ]); const discoveredNewPlatformXpackPlugins = await globby([ diff --git a/src/dev/precommit_hook/casing_check_config.js b/src/dev/precommit_hook/casing_check_config.js index 1b5110a61cbc4..a75a6997a8cb2 100644 --- a/src/dev/precommit_hook/casing_check_config.js +++ b/src/dev/precommit_hook/casing_check_config.js @@ -116,11 +116,6 @@ export const TEMPORARILY_IGNORED_PATHS = [ 'src/legacy/core_plugins/tile_map/public/__tests__/scaledCircleMarkers.png', 'src/legacy/core_plugins/tile_map/public/__tests__/shadedCircleMarkers.png', 'src/legacy/core_plugins/tile_map/public/__tests__/shadedGeohashGrid.png', - 'src/legacy/core_plugins/timelion/server/lib/asSorted.js', - 'src/legacy/core_plugins/timelion/server/lib/unzipPairs.js', - 'src/legacy/core_plugins/timelion/server/series_functions/__tests__/fixtures/bucketList.js', - 'src/legacy/core_plugins/timelion/server/series_functions/__tests__/fixtures/seriesList.js', - 'src/legacy/core_plugins/timelion/server/series_functions/__tests__/fixtures/tlConfig.js', 'src/fixtures/config_upgrade_from_4.0.0_to_4.0.1-snapshot.json', 'src/legacy/core_plugins/vis_type_vislib/public/vislib/__tests__/lib/fixtures/mock_data/terms/_seriesMultiple.js', 'src/core/server/core_app/assets/favicons/android-chrome-192x192.png', From db642f0b967ca3165fb2d815b2710df56b63240c Mon Sep 17 00:00:00 2001 From: Sandra Gonzales Date: Wed, 22 Apr 2020 09:08:50 -0400 Subject: [PATCH 39/67] [EPM] handle unremovable packages (#64096) * remove endpoint handles unremovable packages * adjust UI to disallow removing of unremovable packages --- .../ingest_manager/common/types/models/epm.ts | 1 + .../sections/epm/screens/detail/content.tsx | 12 +++++-- .../epm/screens/detail/settings_panel.tsx | 36 ++++++++++++++----- .../ingest_manager/server/saved_objects.ts | 1 + .../server/services/epm/packages/install.ts | 6 +++- .../server/services/epm/packages/remove.ts | 5 ++- 6 files changed, 48 insertions(+), 13 deletions(-) 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 a13e1655d5666..c750aa99204fa 100644 --- a/x-pack/plugins/ingest_manager/common/types/models/epm.ts +++ b/x-pack/plugins/ingest_manager/common/types/models/epm.ts @@ -57,6 +57,7 @@ export interface RegistryPackage { icons?: RegistryImage[]; assets?: string[]; internal?: boolean; + removable?: boolean; format_version: string; datasets?: Dataset[]; datasources?: RegistryDatasource[]; diff --git a/x-pack/plugins/ingest_manager/public/applications/ingest_manager/sections/epm/screens/detail/content.tsx b/x-pack/plugins/ingest_manager/public/applications/ingest_manager/sections/epm/screens/detail/content.tsx index 0d4b395895322..a3d24e7806f34 100644 --- a/x-pack/plugins/ingest_manager/public/applications/ingest_manager/sections/epm/screens/detail/content.tsx +++ b/x-pack/plugins/ingest_manager/public/applications/ingest_manager/sections/epm/screens/detail/content.tsx @@ -50,10 +50,18 @@ export function Content(props: ContentProps) { type ContentPanelProps = PackageInfo & Pick; export function ContentPanel(props: ContentPanelProps) { - const { panel, name, version, assets, title } = props; + const { panel, name, version, assets, title, removable } = props; switch (panel) { case 'settings': - return ; + return ( + + ); case 'data-sources': return ; case 'overview': diff --git a/x-pack/plugins/ingest_manager/public/applications/ingest_manager/sections/epm/screens/detail/settings_panel.tsx b/x-pack/plugins/ingest_manager/public/applications/ingest_manager/sections/epm/screens/detail/settings_panel.tsx index ff7ecf97714b6..f947466caf4b0 100644 --- a/x-pack/plugins/ingest_manager/public/applications/ingest_manager/sections/epm/screens/detail/settings_panel.tsx +++ b/x-pack/plugins/ingest_manager/public/applications/ingest_manager/sections/epm/screens/detail/settings_panel.tsx @@ -13,8 +13,14 @@ import { InstallStatus, PackageInfo } from '../../../../types'; import { InstallationButton } from './installation_button'; import { useGetDatasources } from '../../../../hooks'; +const NoteLabel = () => ( + +); export const SettingsPanel = ( - props: Pick + props: Pick ) => { const getPackageInstallStatus = useGetPackageInstallStatus(); const { data: datasourcesData } = useGetDatasources({ @@ -22,10 +28,9 @@ export const SettingsPanel = ( page: 1, kuery: `datasources.package.name:${props.name}`, }); - const { name, title } = props; + const { name, title, removable } = props; const packageInstallStatus = getPackageInstallStatus(name); const packageHasDatasources = !!datasourcesData?.total; - return ( @@ -89,12 +94,12 @@ export const SettingsPanel = (

- {packageHasDatasources && ( + {packageHasDatasources && removable === true && (

- + + + ), + }} + /> +

+ )} + {removable === false && ( +

+ + ), }} diff --git a/x-pack/plugins/ingest_manager/server/saved_objects.ts b/x-pack/plugins/ingest_manager/server/saved_objects.ts index dc0b4695603e4..0a7229b1f2807 100644 --- a/x-pack/plugins/ingest_manager/server/saved_objects.ts +++ b/x-pack/plugins/ingest_manager/server/saved_objects.ts @@ -150,6 +150,7 @@ export const savedObjectMappings = { name: { type: 'keyword' }, version: { type: 'keyword' }, internal: { type: 'boolean' }, + removable: { type: 'boolean' }, es_index_patterns: { dynamic: false, type: 'object', 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 f3bd49eab6038..06f3decdbbe6f 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 @@ -98,7 +98,7 @@ export async function installPackage(options: { const reinstall = pkgVersion === installedPkg?.attributes.version; const registryPackageInfo = await Registry.fetchInfo(pkgName, pkgVersion); - const { internal = false } = registryPackageInfo; + const { internal = false, removable = true } = registryPackageInfo; // delete the previous version's installation's SO kibana assets before installing new ones // in case some assets were removed in the new version @@ -170,6 +170,7 @@ export async function installPackage(options: { pkgName, pkgVersion, internal, + removable, toSaveAssetRefs, toSaveESIndexPatterns, }); @@ -200,6 +201,7 @@ export async function saveInstallationReferences(options: { pkgName: string; pkgVersion: string; internal: boolean; + removable: boolean; toSaveAssetRefs: AssetReference[]; toSaveESIndexPatterns: Record; }) { @@ -208,6 +210,7 @@ export async function saveInstallationReferences(options: { pkgName, pkgVersion, internal, + removable, toSaveAssetRefs, toSaveESIndexPatterns, } = options; @@ -220,6 +223,7 @@ export async function saveInstallationReferences(options: { name: pkgName, version: pkgVersion, internal, + removable, }, { id: pkgName, overwrite: true } ); 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 ed7b7f3301327..498796438c6c8 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 @@ -20,7 +20,10 @@ export async function removeInstallation(options: { // TODO: the epm api should change to /name/version so we don't need to do this const [pkgName] = pkgkey.split('-'); const installation = await getInstallation({ savedObjectsClient, pkgName }); - const installedObjects = installation?.installed || []; + if (!installation) throw new Error('integration does not exist'); + if (installation.removable === false) + throw new Error(`The ${pkgName} integration is installed by default and cannot be removed`); + const installedObjects = installation.installed || []; // Delete the manager saved object with references to the asset objects // could also update with [] or some other state From 5e2dbdaa6962a0c79a4bc18a620e9e757768d73d Mon Sep 17 00:00:00 2001 From: Tiago Costa Date: Wed, 22 Apr 2020 14:11:17 +0100 Subject: [PATCH 40/67] refact(NA): remove set loop from upgrade assistant usage collector (#63977) * refact(NA): use default telemetry obj in the set loop * chore(NA): fix typecheck * fix(NA): test run with lodash has * chore(NA): fix older lodash has * chore(NA): remove lodash has usage --- .../lib/telemetry/usage_collector.test.ts | 1 + .../server/lib/telemetry/usage_collector.ts | 25 +++++++++++-------- 2 files changed, 15 insertions(+), 11 deletions(-) diff --git a/x-pack/plugins/upgrade_assistant/server/lib/telemetry/usage_collector.test.ts b/x-pack/plugins/upgrade_assistant/server/lib/telemetry/usage_collector.test.ts index 2af1a9ac38e44..24347b7799871 100644 --- a/x-pack/plugins/upgrade_assistant/server/lib/telemetry/usage_collector.test.ts +++ b/x-pack/plugins/upgrade_assistant/server/lib/telemetry/usage_collector.test.ts @@ -51,6 +51,7 @@ describe('Upgrade Assistant Usage Collector', () => { 'ui_reindex.open': 4, 'ui_reindex.start': 2, 'ui_reindex.stop': 1, + 'ui_reindex.not_defined': 1, }, }; }, diff --git a/x-pack/plugins/upgrade_assistant/server/lib/telemetry/usage_collector.ts b/x-pack/plugins/upgrade_assistant/server/lib/telemetry/usage_collector.ts index 9c2946db7f084..0c2e3a1e43f4a 100644 --- a/x-pack/plugins/upgrade_assistant/server/lib/telemetry/usage_collector.ts +++ b/x-pack/plugins/upgrade_assistant/server/lib/telemetry/usage_collector.ts @@ -4,7 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ -import { set } from 'lodash'; +import { get } from 'lodash'; import { APICaller, ElasticsearchServiceStart, @@ -84,16 +84,19 @@ export async function fetchUpgradeAssistantMetrics( return defaultTelemetrySavedObject; } - const upgradeAssistantTelemetrySOAttrsKeys = Object.keys( - upgradeAssistantTelemetrySavedObjectAttrs - ); - const telemetryObj = defaultTelemetrySavedObject; - - upgradeAssistantTelemetrySOAttrsKeys.forEach((key: string) => { - set(telemetryObj, key, upgradeAssistantTelemetrySavedObjectAttrs[key]); - }); - - return telemetryObj as UpgradeAssistantTelemetrySavedObject; + return { + ui_open: { + overview: get(upgradeAssistantTelemetrySavedObjectAttrs, 'ui_open.overview', 0), + cluster: get(upgradeAssistantTelemetrySavedObjectAttrs, 'ui_open.cluster', 0), + indices: get(upgradeAssistantTelemetrySavedObjectAttrs, 'ui_open.indices', 0), + }, + ui_reindex: { + close: get(upgradeAssistantTelemetrySavedObjectAttrs, 'ui_reindex.close', 0), + open: get(upgradeAssistantTelemetrySavedObjectAttrs, 'ui_reindex.open', 0), + start: get(upgradeAssistantTelemetrySavedObjectAttrs, 'ui_reindex.start', 0), + stop: get(upgradeAssistantTelemetrySavedObjectAttrs, 'ui_reindex.stop', 0), + }, + } as UpgradeAssistantTelemetrySavedObject; }; return { From 939bf2a6ec45154d33e982550075417d91fe9eeb Mon Sep 17 00:00:00 2001 From: Thomas Neirynck Date: Wed, 22 Apr 2020 09:19:18 -0400 Subject: [PATCH 41/67] [Maps] Convert AbstractSource and AbstractLayer to TS (#63533) --- x-pack/plugins/maps/common/constants.ts | 1 + .../descriptor_types/descriptor_types.d.ts | 28 +- .../style_property_descriptor_types.d.ts | 6 +- .../public/angular/get_initial_layers.test.js | 4 +- .../public/layers/blended_vector_layer.ts | 26 +- x-pack/plugins/maps/public/layers/layer.d.ts | 51 -- x-pack/plugins/maps/public/layers/layer.js | 373 ------------- x-pack/plugins/maps/public/layers/layer.tsx | 490 ++++++++++++++++++ .../client_file_source/geojson_file_source.js | 4 +- .../es_geo_grid_source.d.ts | 9 +- .../layers/sources/es_source/es_source.d.ts | 16 + .../es_term_source/es_term_source.d.ts | 1 + .../mvt_single_layer_vector_source.ts | 11 +- .../maps/public/layers/sources/source.d.ts | 56 -- .../maps/public/layers/sources/source.js | 159 ------ .../maps/public/layers/sources/source.ts | 195 +++++++ .../sources/xyz_tms_source/xyz_tms_source.ts | 3 +- .../public/layers/styles/abstract_style.js | 29 -- .../layers/styles/heatmap/heatmap_style.js | 2 +- .../maps/public/layers/styles/style.ts | 59 +++ .../public/layers/styles/tile/tile_style.ts | 16 + .../layers/styles/vector/vector_style.d.ts | 7 +- .../layers/styles/vector/vector_style.js | 3 +- .../maps/public/layers/tile_layer.d.ts | 4 +- .../plugins/maps/public/layers/tile_layer.js | 8 +- .../maps/public/layers/tile_layer.test.ts | 10 +- .../maps/public/layers/tiled_vector_layer.tsx | 2 +- .../maps/public/layers/vector_layer.d.ts | 6 +- .../maps/public/layers/vector_layer.js | 2 + .../maps/public/layers/vector_tile_layer.js | 3 +- 30 files changed, 861 insertions(+), 723 deletions(-) delete mode 100644 x-pack/plugins/maps/public/layers/layer.d.ts delete mode 100644 x-pack/plugins/maps/public/layers/layer.js create mode 100644 x-pack/plugins/maps/public/layers/layer.tsx delete mode 100644 x-pack/plugins/maps/public/layers/sources/source.d.ts delete mode 100644 x-pack/plugins/maps/public/layers/sources/source.js create mode 100644 x-pack/plugins/maps/public/layers/sources/source.ts delete mode 100644 x-pack/plugins/maps/public/layers/styles/abstract_style.js create mode 100644 x-pack/plugins/maps/public/layers/styles/style.ts create mode 100644 x-pack/plugins/maps/public/layers/styles/tile/tile_style.ts diff --git a/x-pack/plugins/maps/common/constants.ts b/x-pack/plugins/maps/common/constants.ts index a4006732224ce..6f9c0985f5f4a 100644 --- a/x-pack/plugins/maps/common/constants.ts +++ b/x-pack/plugins/maps/common/constants.ts @@ -166,6 +166,7 @@ export enum STYLE_TYPE { export enum LAYER_STYLE_TYPE { VECTOR = 'VECTOR', HEATMAP = 'HEATMAP', + TILE = 'TILE', } export const COLOR_MAP_TYPE = { diff --git a/x-pack/plugins/maps/common/descriptor_types/descriptor_types.d.ts b/x-pack/plugins/maps/common/descriptor_types/descriptor_types.d.ts index f8175b0ed3f10..6980f14d0788a 100644 --- a/x-pack/plugins/maps/common/descriptor_types/descriptor_types.d.ts +++ b/x-pack/plugins/maps/common/descriptor_types/descriptor_types.d.ts @@ -5,8 +5,9 @@ */ /* eslint-disable @typescript-eslint/consistent-type-definitions */ +import { Query } from 'src/plugins/data/public'; import { AGG_TYPE, GRID_RESOLUTION, RENDER_AS, SORT_ORDER, SCALING_TYPES } from '../constants'; -import { VectorStyleDescriptor } from './style_property_descriptor_types'; +import { StyleDescriptor, VectorStyleDescriptor } from './style_property_descriptor_types'; import { DataRequestDescriptor } from './data_request_descriptor_types'; export type AttributionDescriptor = { @@ -17,6 +18,7 @@ export type AttributionDescriptor = { export type AbstractSourceDescriptor = { id?: string; type: string; + applyGlobalQuery?: boolean; }; export type EMSTMSSourceDescriptor = AbstractSourceDescriptor & { @@ -71,17 +73,15 @@ export type ESTermSourceDescriptor = AbstractESAggSourceDescriptor & { term: string; // term field name }; -export type KibanaRegionmapSourceDescriptor = { - type: string; +export type KibanaRegionmapSourceDescriptor = AbstractSourceDescriptor & { name: string; }; -export type KibanaTilemapSourceDescriptor = { - type: string; -}; +// This is for symmetry with other sources only. +// It takes no additional configuration since all params are in the .yml. +export type KibanaTilemapSourceDescriptor = AbstractSourceDescriptor; -export type WMSSourceDescriptor = { - type: string; +export type WMSSourceDescriptor = AbstractSourceDescriptor & { serviceUrl: string; layers: string; styles: string; @@ -111,6 +111,8 @@ export type JoinDescriptor = { right: ESTermSourceDescriptor; }; +// todo : this union type is incompatible with dynamic extensibility of sources. +// Reconsider using SourceDescriptor in type signatures for top-level classes export type SourceDescriptor = | XYZTMSSourceDescriptor | WMSSourceDescriptor @@ -121,7 +123,9 @@ export type SourceDescriptor = | ESGeoGridSourceDescriptor | EMSFileSourceDescriptor | ESPewPewSourceDescriptor - | TiledSingleLayerVectorSourceDescriptor; + | TiledSingleLayerVectorSourceDescriptor + | EMSTMSSourceDescriptor + | EMSFileSourceDescriptor; export type LayerDescriptor = { __dataRequests?: DataRequestDescriptor[]; @@ -129,12 +133,14 @@ export type LayerDescriptor = { __errorMessage?: string; alpha?: number; id: string; - label?: string; + label?: string | null; minZoom?: number; maxZoom?: number; - sourceDescriptor: SourceDescriptor; + sourceDescriptor: SourceDescriptor | null; type?: string; visible?: boolean; + style?: StyleDescriptor | null; + query?: Query; }; export type VectorLayerDescriptor = LayerDescriptor & { diff --git a/x-pack/plugins/maps/common/descriptor_types/style_property_descriptor_types.d.ts b/x-pack/plugins/maps/common/descriptor_types/style_property_descriptor_types.d.ts index 47e56ff96d623..381bc5bba01c0 100644 --- a/x-pack/plugins/maps/common/descriptor_types/style_property_descriptor_types.d.ts +++ b/x-pack/plugins/maps/common/descriptor_types/style_property_descriptor_types.d.ts @@ -182,7 +182,11 @@ export type VectorStylePropertiesDescriptor = { [VECTOR_STYLES.LABEL_BORDER_SIZE]?: LabelBorderSizeStylePropertyDescriptor; }; -export type VectorStyleDescriptor = { +export type StyleDescriptor = { + type: string; +}; + +export type VectorStyleDescriptor = StyleDescriptor & { type: LAYER_STYLE_TYPE.VECTOR; properties: VectorStylePropertiesDescriptor; }; diff --git a/x-pack/plugins/maps/public/angular/get_initial_layers.test.js b/x-pack/plugins/maps/public/angular/get_initial_layers.test.js index f41ed26b2a05d..4b5cad8d19260 100644 --- a/x-pack/plugins/maps/public/angular/get_initial_layers.test.js +++ b/x-pack/plugins/maps/public/angular/get_initial_layers.test.js @@ -52,7 +52,7 @@ describe('kibana.yml configured with map.tilemap.url', () => { sourceDescriptor: { type: 'KIBANA_TILEMAP', }, - style: {}, + style: { type: 'TILE' }, type: 'TILE', visible: true, }, @@ -96,7 +96,7 @@ describe('EMS is enabled', () => { isAutoSelect: true, type: 'EMS_TMS', }, - style: {}, + style: { type: 'TILE' }, type: 'VECTOR_TILE', visible: true, }, diff --git a/x-pack/plugins/maps/public/layers/blended_vector_layer.ts b/x-pack/plugins/maps/public/layers/blended_vector_layer.ts index 9a9ea2968ceeb..1fc3ad203706f 100644 --- a/x-pack/plugins/maps/public/layers/blended_vector_layer.ts +++ b/x-pack/plugins/maps/public/layers/blended_vector_layer.ts @@ -24,7 +24,7 @@ import { } from '../../common/constants'; import { ESGeoGridSource } from './sources/es_geo_grid_source/es_geo_grid_source'; import { canSkipSourceUpdate } from './util/can_skip_fetch'; -import { IVectorLayer, VectorLayerArguments } from './vector_layer'; +import { IVectorLayer } from './vector_layer'; import { IESSource } from './sources/es_source'; import { IESAggSource } from './sources/es_agg_source'; import { ISource } from './sources/source'; @@ -36,6 +36,8 @@ import { DynamicStylePropertyOptions, VectorLayerDescriptor, } from '../../common/descriptor_types'; +import { IStyle } from './styles/style'; +import { IVectorSource } from './sources/vector_source'; const ACTIVE_COUNT_DATA_ID = 'ACTIVE_COUNT_DATA_ID'; @@ -145,6 +147,11 @@ function getClusterStyleDescriptor( return clusterStyleDescriptor; } +export interface BlendedVectorLayerArguments { + source: IVectorSource; + layerDescriptor: VectorLayerDescriptor; +} + export class BlendedVectorLayer extends VectorLayer implements IVectorLayer { static type = LAYER_TYPE.BLENDED_VECTOR; @@ -163,11 +170,14 @@ export class BlendedVectorLayer extends VectorLayer implements IVectorLayer { private readonly _documentSource: IESSource; private readonly _documentStyle: IVectorStyle; - constructor(options: VectorLayerArguments) { - super(options); + constructor(options: BlendedVectorLayerArguments) { + super({ + ...options, + joins: [], + }); this._documentSource = this._source as IESSource; // VectorLayer constructor sets _source as document source - this._documentStyle = this._style; // VectorLayer constructor sets _style as document source + this._documentStyle = this._style as IVectorStyle; // VectorLayer constructor sets _style as document source this._clusterSource = getClusterSource(this._documentSource, this._documentStyle); const clusterStyleDescriptor = getClusterStyleDescriptor( @@ -229,11 +239,11 @@ export class BlendedVectorLayer extends VectorLayer implements IVectorLayer { return this._documentSource; } - getCurrentStyle() { + getCurrentStyle(): IStyle { return this._isClustered ? this._clusterStyle : this._documentStyle; } - getStyleForEditing() { + getStyleForEditing(): IStyle { return this._documentStyle; } @@ -242,8 +252,8 @@ export class BlendedVectorLayer extends VectorLayer implements IVectorLayer { const requestToken = Symbol(`layer-active-count:${this.getId()}`); const searchFilters = this._getSearchFilters( syncContext.dataFilters, - this.getSource(), - this.getCurrentStyle() + this.getSource() as IVectorSource, + this.getCurrentStyle() as IVectorStyle ); const canSkipFetch = await canSkipSourceUpdate({ source: this.getSource(), diff --git a/x-pack/plugins/maps/public/layers/layer.d.ts b/x-pack/plugins/maps/public/layers/layer.d.ts deleted file mode 100644 index e8fc5d473626c..0000000000000 --- a/x-pack/plugins/maps/public/layers/layer.d.ts +++ /dev/null @@ -1,51 +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 { LayerDescriptor, MapExtent, MapFilters, MapQuery } from '../../common/descriptor_types'; -import { ISource } from './sources/source'; -import { DataRequest } from './util/data_request'; -import { SyncContext } from '../actions/map_actions'; - -export interface ILayer { - getBounds(mapFilters: MapFilters): Promise; - getDataRequest(id: string): DataRequest | undefined; - getDisplayName(source?: ISource): Promise; - getId(): string; - getSourceDataRequest(): DataRequest | undefined; - getSource(): ISource; - getSourceForEditing(): ISource; - syncData(syncContext: SyncContext): Promise; - isVisible(): boolean; - showAtZoomLevel(zoomLevel: number): boolean; - getMinZoom(): number; - getMaxZoom(): number; - getMinSourceZoom(): number; -} - -export interface ILayerArguments { - layerDescriptor: LayerDescriptor; - source: ISource; -} - -export class AbstractLayer implements ILayer { - static createDescriptor(options: Partial, mapColors?: string[]): LayerDescriptor; - constructor(layerArguments: ILayerArguments); - getBounds(mapFilters: MapFilters): Promise; - getDataRequest(id: string): DataRequest | undefined; - getDisplayName(source?: ISource): Promise; - getId(): string; - getSourceDataRequest(): DataRequest | undefined; - getSource(): ISource; - getSourceForEditing(): ISource; - syncData(syncContext: SyncContext): Promise; - isVisible(): boolean; - showAtZoomLevel(zoomLevel: number): boolean; - getMinZoom(): number; - getMaxZoom(): number; - getMinSourceZoom(): number; - getQuery(): MapQuery; - _removeStaleMbSourcesAndLayers(mbMap: unknown): void; - _requiresPrevSourceCleanup(mbMap: unknown): boolean; -} diff --git a/x-pack/plugins/maps/public/layers/layer.js b/x-pack/plugins/maps/public/layers/layer.js deleted file mode 100644 index 9362ce2c028e6..0000000000000 --- a/x-pack/plugins/maps/public/layers/layer.js +++ /dev/null @@ -1,373 +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 _ from 'lodash'; -import React from 'react'; -import { EuiIcon, EuiLoadingSpinner } from '@elastic/eui'; -import { DataRequest } from './util/data_request'; -import { - MAX_ZOOM, - MB_SOURCE_ID_LAYER_ID_PREFIX_DELIMITER, - MIN_ZOOM, - SOURCE_DATA_ID_ORIGIN, -} from '../../common/constants'; -import uuid from 'uuid/v4'; - -import { copyPersistentState } from '../reducers/util.js'; -import { i18n } from '@kbn/i18n'; - -export class AbstractLayer { - constructor({ layerDescriptor, source }) { - this._descriptor = AbstractLayer.createDescriptor(layerDescriptor); - this._source = source; - if (this._descriptor.__dataRequests) { - this._dataRequests = this._descriptor.__dataRequests.map( - dataRequest => new DataRequest(dataRequest) - ); - } else { - this._dataRequests = []; - } - } - - static getBoundDataForSource(mbMap, sourceId) { - const mbStyle = mbMap.getStyle(); - return mbStyle.sources[sourceId].data; - } - - static createDescriptor(options = {}) { - const layerDescriptor = { ...options }; - - layerDescriptor.__dataRequests = _.get(options, '__dataRequests', []); - layerDescriptor.id = _.get(options, 'id', uuid()); - layerDescriptor.label = options.label && options.label.length > 0 ? options.label : null; - layerDescriptor.minZoom = _.get(options, 'minZoom', MIN_ZOOM); - layerDescriptor.maxZoom = _.get(options, 'maxZoom', MAX_ZOOM); - layerDescriptor.alpha = _.get(options, 'alpha', 0.75); - layerDescriptor.visible = _.get(options, 'visible', true); - layerDescriptor.style = _.get(options, 'style', {}); - - return layerDescriptor; - } - - destroy() { - if (this._source) { - this._source.destroy(); - } - } - - async cloneDescriptor() { - const clonedDescriptor = copyPersistentState(this._descriptor); - // layer id is uuid used to track styles/layers in mapbox - clonedDescriptor.id = uuid(); - const displayName = await this.getDisplayName(); - clonedDescriptor.label = `Clone of ${displayName}`; - clonedDescriptor.sourceDescriptor = this.getSource().cloneDescriptor(); - if (clonedDescriptor.joins) { - clonedDescriptor.joins.forEach(joinDescriptor => { - // right.id is uuid used to track requests in inspector - joinDescriptor.right.id = uuid(); - }); - } - return clonedDescriptor; - } - - makeMbLayerId(layerNameSuffix) { - return `${this.getId()}${MB_SOURCE_ID_LAYER_ID_PREFIX_DELIMITER}${layerNameSuffix}`; - } - - isJoinable() { - return this.getSource().isJoinable(); - } - - supportsElasticsearchFilters() { - return this.getSource().isESSource(); - } - - async supportsFitToBounds() { - return await this.getSource().supportsFitToBounds(); - } - - async getDisplayName(source) { - if (this._descriptor.label) { - return this._descriptor.label; - } - - const sourceDisplayName = source - ? await source.getDisplayName() - : await this.getSource().getDisplayName(); - return sourceDisplayName || `Layer ${this._descriptor.id}`; - } - - async getAttributions() { - if (!this.hasErrors()) { - return await this.getSource().getAttributions(); - } - return []; - } - - getLabel() { - return this._descriptor.label ? this._descriptor.label : ''; - } - - getCustomIconAndTooltipContent() { - return { - icon: , - }; - } - - getIconAndTooltipContent(zoomLevel, isUsingSearch) { - let icon; - let tooltipContent = null; - const footnotes = []; - if (this.hasErrors()) { - icon = ( - - ); - tooltipContent = this.getErrors(); - } else if (this.isLayerLoading()) { - icon = ; - } else if (!this.isVisible()) { - icon = ; - tooltipContent = i18n.translate('xpack.maps.layer.layerHiddenTooltip', { - defaultMessage: `Layer is hidden.`, - }); - } else if (!this.showAtZoomLevel(zoomLevel)) { - const minZoom = this.getMinZoom(); - const maxZoom = this.getMaxZoom(); - icon = ; - tooltipContent = i18n.translate('xpack.maps.layer.zoomFeedbackTooltip', { - defaultMessage: `Layer is visible between zoom levels {minZoom} and {maxZoom}.`, - values: { minZoom, maxZoom }, - }); - } else { - const customIconAndTooltipContent = this.getCustomIconAndTooltipContent(); - if (customIconAndTooltipContent) { - icon = customIconAndTooltipContent.icon; - if (!customIconAndTooltipContent.areResultsTrimmed) { - tooltipContent = customIconAndTooltipContent.tooltipContent; - } else { - footnotes.push({ - icon: , - message: customIconAndTooltipContent.tooltipContent, - }); - } - } - - if (isUsingSearch && this.getQueryableIndexPatternIds().length) { - footnotes.push({ - icon: , - message: i18n.translate('xpack.maps.layer.isUsingSearchMsg', { - defaultMessage: 'Results narrowed by search bar', - }), - }); - } - } - - return { - icon, - tooltipContent, - footnotes, - }; - } - - async hasLegendDetails() { - return false; - } - - renderLegendDetails() { - return null; - } - - getId() { - return this._descriptor.id; - } - - getSource() { - return this._source; - } - - getSourceForEditing() { - return this._source; - } - - isVisible() { - return this._descriptor.visible; - } - - showAtZoomLevel(zoom) { - return zoom >= this.getMinZoom() && zoom <= this.getMaxZoom(); - } - - getMinZoom() { - return this._descriptor.minZoom; - } - - getMaxZoom() { - return this._descriptor.maxZoom; - } - - getMinSourceZoom() { - return this._source.getMinZoom(); - } - - _requiresPrevSourceCleanup() { - return false; - } - - _removeStaleMbSourcesAndLayers(mbMap) { - if (this._requiresPrevSourceCleanup(mbMap)) { - const mbStyle = mbMap.getStyle(); - mbStyle.layers.forEach(mbLayer => { - if (this.ownsMbLayerId(mbLayer.id)) { - mbMap.removeLayer(mbLayer.id); - } - }); - Object.keys(mbStyle.sources).some(mbSourceId => { - if (this.ownsMbSourceId(mbSourceId)) { - mbMap.removeSource(mbSourceId); - } - }); - } - } - - getAlpha() { - return this._descriptor.alpha; - } - - getQuery() { - return this._descriptor.query; - } - - getCurrentStyle() { - return this._style; - } - - getStyleForEditing() { - return this._style; - } - - async getImmutableSourceProperties() { - return this.getSource().getImmutableProperties(); - } - - renderSourceSettingsEditor = ({ onChange }) => { - return this.getSourceForEditing().renderSourceSettingsEditor({ onChange }); - }; - - getPrevRequestToken(dataId) { - const prevDataRequest = this.getDataRequest(dataId); - if (!prevDataRequest) { - return; - } - - return prevDataRequest.getRequestToken(); - } - - getInFlightRequestTokens() { - if (!this._dataRequests) { - return []; - } - - const requestTokens = this._dataRequests.map(dataRequest => dataRequest.getRequestToken()); - return _.compact(requestTokens); - } - - getSourceDataRequest() { - return this.getDataRequest(SOURCE_DATA_ID_ORIGIN); - } - - getDataRequest(id) { - return this._dataRequests.find(dataRequest => dataRequest.getDataId() === id); - } - - isLayerLoading() { - return this._dataRequests.some(dataRequest => dataRequest.isLoading()); - } - - hasErrors() { - return _.get(this._descriptor, '__isInErrorState', false); - } - - getErrors() { - return this.hasErrors() ? this._descriptor.__errorMessage : ''; - } - - toLayerDescriptor() { - return this._descriptor; - } - - async syncData() { - //no-op by default - } - - getMbLayerIds() { - throw new Error('Should implement AbstractLayer#getMbLayerIds'); - } - - ownsMbLayerId() { - throw new Error('Should implement AbstractLayer#ownsMbLayerId'); - } - - ownsMbSourceId() { - throw new Error('Should implement AbstractLayer#ownsMbSourceId'); - } - - canShowTooltip() { - return false; - } - - syncLayerWithMB() { - throw new Error('Should implement AbstractLayer#syncLayerWithMB'); - } - - getLayerTypeIconName() { - throw new Error('should implement Layer#getLayerTypeIconName'); - } - - isDataLoaded() { - const sourceDataRequest = this.getSourceDataRequest(); - return sourceDataRequest && sourceDataRequest.hasData(); - } - - async getBounds(/* mapFilters: MapFilters */) { - return { - minLon: -180, - maxLon: 180, - minLat: -89, - maxLat: 89, - }; - } - - renderStyleEditor({ onStyleDescriptorChange }) { - const style = this.getStyleForEditing(); - if (!style) { - return null; - } - return style.renderEditor({ layer: this, onStyleDescriptorChange }); - } - - getIndexPatternIds() { - return []; - } - - getQueryableIndexPatternIds() { - return []; - } - - syncVisibilityWithMb(mbMap, mbLayerId) { - mbMap.setLayoutProperty(mbLayerId, 'visibility', this.isVisible() ? 'visible' : 'none'); - } - - getType() { - return this._descriptor.type; - } -} diff --git a/x-pack/plugins/maps/public/layers/layer.tsx b/x-pack/plugins/maps/public/layers/layer.tsx new file mode 100644 index 0000000000000..ce48793e1481b --- /dev/null +++ b/x-pack/plugins/maps/public/layers/layer.tsx @@ -0,0 +1,490 @@ +/* + * 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. + */ +/* eslint-disable @typescript-eslint/consistent-type-definitions */ + +import { Query } from 'src/plugins/data/public'; +import _ from 'lodash'; +import React, { ReactElement } from 'react'; +import { EuiIcon, EuiLoadingSpinner } from '@elastic/eui'; +import uuid from 'uuid/v4'; +import { i18n } from '@kbn/i18n'; +import { FeatureCollection } from 'geojson'; +import { DataRequest } from './util/data_request'; +import { + MAX_ZOOM, + MB_SOURCE_ID_LAYER_ID_PREFIX_DELIMITER, + MIN_ZOOM, + SOURCE_DATA_ID_ORIGIN, +} from '../../common/constants'; +// @ts-ignore +// eslint-disable-next-line @kbn/eslint/no-restricted-paths +import { copyPersistentState } from '../reducers/util.js'; +import { + LayerDescriptor, + MapExtent, + MapFilters, + StyleDescriptor, +} from '../../common/descriptor_types'; +import { Attribution, ImmutableSourceProperty, ISource } from './sources/source'; +import { SyncContext } from '../actions/map_actions'; +import { IStyle } from './styles/style'; + +export interface ILayer { + getBounds(mapFilters: MapFilters): Promise; + getDataRequest(id: string): DataRequest | undefined; + getDisplayName(source?: ISource): Promise; + getId(): string; + getSourceDataRequest(): DataRequest | undefined; + getSource(): ISource; + getSourceForEditing(): ISource; + syncData(syncContext: SyncContext): void; + supportsElasticsearchFilters(): boolean; + supportsFitToBounds(): Promise; + getAttributions(): Promise; + getLabel(): string; + getCustomIconAndTooltipContent(): IconAndTooltipContent; + getIconAndTooltipContent(zoomLevel: number, isUsingSearch: boolean): IconAndTooltipContent; + renderLegendDetails(): ReactElement | null; + showAtZoomLevel(zoom: number): boolean; + getMinZoom(): number; + getMaxZoom(): number; + getMinSourceZoom(): number; + getAlpha(): number; + getQuery(): Query | null; + getStyle(): IStyle; + getStyleForEditing(): IStyle; + getCurrentStyle(): IStyle; + getImmutableSourceProperties(): Promise; + renderSourceSettingsEditor({ onChange }: { onChange: () => void }): ReactElement | null; + isLayerLoading(): boolean; + hasErrors(): boolean; + getErrors(): string; + toLayerDescriptor(): LayerDescriptor; + getMbLayerIds(): string[]; + ownsMbLayerId(mbLayerId: string): boolean; + ownsMbSourceId(mbSourceId: string): boolean; + canShowTooltip(): boolean; + syncLayerWithMB(mbMap: unknown): void; + getLayerTypeIconName(): string; + isDataLoaded(): boolean; + getIndexPatternIds(): string[]; + getQueryableIndexPatternIds(): string[]; + getType(): string | undefined; + isVisible(): boolean; + cloneDescriptor(): Promise; + renderStyleEditor({ + onStyleDescriptorChange, + }: { + onStyleDescriptorChange: (styleDescriptor: StyleDescriptor) => void; + }): ReactElement | null; +} +export type Footnote = { + icon: ReactElement; + message?: string | null; +}; +export type IconAndTooltipContent = { + icon?: ReactElement | null; + tooltipContent?: string | null; + footnotes?: Footnote[] | null; + areResultsTrimmed?: boolean; +}; + +export interface ILayerArguments { + layerDescriptor: LayerDescriptor; + source: ISource; + style: IStyle; +} + +export class AbstractLayer implements ILayer { + protected readonly _descriptor: LayerDescriptor; + protected readonly _source: ISource; + protected readonly _style: IStyle; + protected readonly _dataRequests: DataRequest[]; + + static createDescriptor(options: Partial): LayerDescriptor { + return { + ...options, + sourceDescriptor: options.sourceDescriptor ? options.sourceDescriptor : null, + __dataRequests: _.get(options, '__dataRequests', []), + id: _.get(options, 'id', uuid()), + label: options.label && options.label.length > 0 ? options.label : null, + minZoom: _.get(options, 'minZoom', MIN_ZOOM), + maxZoom: _.get(options, 'maxZoom', MAX_ZOOM), + alpha: _.get(options, 'alpha', 0.75), + visible: _.get(options, 'visible', true), + style: _.get(options, 'style', null), + }; + } + + destroy() { + if (this._source) { + this._source.destroy(); + } + } + + constructor({ layerDescriptor, source, style }: ILayerArguments) { + this._descriptor = AbstractLayer.createDescriptor(layerDescriptor); + this._source = source; + this._style = style; + if (this._descriptor.__dataRequests) { + this._dataRequests = this._descriptor.__dataRequests.map( + dataRequest => new DataRequest(dataRequest) + ); + } else { + this._dataRequests = []; + } + } + + static getBoundDataForSource(mbMap: unknown, sourceId: string): FeatureCollection { + // @ts-ignore + const mbStyle = mbMap.getStyle(); + return mbStyle.sources[sourceId].data; + } + + async cloneDescriptor(): Promise { + // @ts-ignore + const clonedDescriptor = copyPersistentState(this._descriptor); + // layer id is uuid used to track styles/layers in mapbox + clonedDescriptor.id = uuid(); + const displayName = await this.getDisplayName(); + clonedDescriptor.label = `Clone of ${displayName}`; + clonedDescriptor.sourceDescriptor = this.getSource().cloneDescriptor(); + + // todo: remove this + // This should not be in AbstractLayer. It relies on knowledge of VectorLayerDescriptor + // @ts-ignore + if (clonedDescriptor.joins) { + // @ts-ignore + clonedDescriptor.joins.forEach(joinDescriptor => { + // right.id is uuid used to track requests in inspector + // @ts-ignore + joinDescriptor.right.id = uuid(); + }); + } + return clonedDescriptor; + } + + makeMbLayerId(layerNameSuffix: string): string { + return `${this.getId()}${MB_SOURCE_ID_LAYER_ID_PREFIX_DELIMITER}${layerNameSuffix}`; + } + + isJoinable(): boolean { + return this.getSource().isJoinable(); + } + + supportsElasticsearchFilters(): boolean { + return this.getSource().isESSource(); + } + + async supportsFitToBounds(): Promise { + return await this.getSource().supportsFitToBounds(); + } + + async getDisplayName(source?: ISource): Promise { + if (this._descriptor.label) { + return this._descriptor.label; + } + + const sourceDisplayName = source + ? await source.getDisplayName() + : await this.getSource().getDisplayName(); + return sourceDisplayName || `Layer ${this._descriptor.id}`; + } + + async getAttributions(): Promise { + if (!this.hasErrors()) { + return await this.getSource().getAttributions(); + } + return []; + } + + getStyleForEditing(): IStyle { + return this._style; + } + + getStyle() { + return this._style; + } + + getLabel(): string { + return this._descriptor.label ? this._descriptor.label : ''; + } + + getCustomIconAndTooltipContent(): IconAndTooltipContent { + return { + icon: , + }; + } + + getIconAndTooltipContent(zoomLevel: number, isUsingSearch: boolean): IconAndTooltipContent { + let icon; + let tooltipContent = null; + const footnotes = []; + if (this.hasErrors()) { + icon = ( + + ); + tooltipContent = this.getErrors(); + } else if (this.isLayerLoading()) { + icon = ; + } else if (!this.isVisible()) { + icon = ; + tooltipContent = i18n.translate('xpack.maps.layer.layerHiddenTooltip', { + defaultMessage: `Layer is hidden.`, + }); + } else if (!this.showAtZoomLevel(zoomLevel)) { + const minZoom = this.getMinZoom(); + const maxZoom = this.getMaxZoom(); + icon = ; + tooltipContent = i18n.translate('xpack.maps.layer.zoomFeedbackTooltip', { + defaultMessage: `Layer is visible between zoom levels {minZoom} and {maxZoom}.`, + values: { minZoom, maxZoom }, + }); + } else { + const customIconAndTooltipContent = this.getCustomIconAndTooltipContent(); + if (customIconAndTooltipContent) { + icon = customIconAndTooltipContent.icon; + if (!customIconAndTooltipContent.areResultsTrimmed) { + tooltipContent = customIconAndTooltipContent.tooltipContent; + } else { + footnotes.push({ + icon: , + message: customIconAndTooltipContent.tooltipContent, + }); + } + } + + if (isUsingSearch && this.getQueryableIndexPatternIds().length) { + footnotes.push({ + icon: , + message: i18n.translate('xpack.maps.layer.isUsingSearchMsg', { + defaultMessage: 'Results narrowed by search bar', + }), + }); + } + } + + return { + icon, + tooltipContent, + footnotes, + }; + } + + async hasLegendDetails(): Promise { + return false; + } + + renderLegendDetails(): ReactElement | null { + return null; + } + + getId(): string { + return this._descriptor.id; + } + + getSource(): ISource { + return this._source; + } + + getSourceForEditing(): ISource { + return this._source; + } + + isVisible(): boolean { + return !!this._descriptor.visible; + } + + showAtZoomLevel(zoom: number): boolean { + return zoom >= this.getMinZoom() && zoom <= this.getMaxZoom(); + } + + getMinZoom(): number { + return typeof this._descriptor.minZoom === 'number' ? this._descriptor.minZoom : MIN_ZOOM; + } + + getMaxZoom(): number { + return typeof this._descriptor.maxZoom === 'number' ? this._descriptor.maxZoom : MAX_ZOOM; + } + + getMinSourceZoom(): number { + return this._source.getMinZoom(); + } + + _requiresPrevSourceCleanup(mbMap: unknown) { + return false; + } + + _removeStaleMbSourcesAndLayers(mbMap: unknown) { + if (this._requiresPrevSourceCleanup(mbMap)) { + // @ts-ignore + const mbStyle = mbMap.getStyle(); + // @ts-ignore + mbStyle.layers.forEach(mbLayer => { + // @ts-ignore + if (this.ownsMbLayerId(mbLayer.id)) { + // @ts-ignore + mbMap.removeLayer(mbLayer.id); + } + }); + // @ts-ignore + Object.keys(mbStyle.sources).some(mbSourceId => { + // @ts-ignore + if (this.ownsMbSourceId(mbSourceId)) { + // @ts-ignore + mbMap.removeSource(mbSourceId); + } + }); + } + } + + getAlpha(): number { + return typeof this._descriptor.alpha === 'number' ? this._descriptor.alpha : 1; + } + + getQuery(): Query | null { + return this._descriptor.query ? this._descriptor.query : null; + } + + getCurrentStyle(): IStyle { + return this._style; + } + + async getImmutableSourceProperties() { + const source = this.getSource(); + return await source.getImmutableProperties(); + } + + renderSourceSettingsEditor({ onChange }: { onChange: () => void }) { + const source = this.getSourceForEditing(); + return source.renderSourceSettingsEditor({ onChange }); + } + + getPrevRequestToken(dataId: string): symbol | undefined { + const prevDataRequest = this.getDataRequest(dataId); + if (!prevDataRequest) { + return; + } + + return prevDataRequest.getRequestToken(); + } + + getInFlightRequestTokens(): symbol[] { + if (!this._dataRequests) { + return []; + } + + const requestTokens = this._dataRequests.map(dataRequest => dataRequest.getRequestToken()); + + // Compact removes all the undefineds + // @ts-ignore + return _.compact(requestTokens); + } + + getSourceDataRequest(): DataRequest | undefined { + return this.getDataRequest(SOURCE_DATA_ID_ORIGIN); + } + + getDataRequest(id: string): DataRequest | undefined { + return this._dataRequests.find(dataRequest => dataRequest.getDataId() === id); + } + + isLayerLoading(): boolean { + return this._dataRequests.some(dataRequest => dataRequest.isLoading()); + } + + hasErrors(): boolean { + return _.get(this._descriptor, '__isInErrorState', false); + } + + getErrors(): string { + return this.hasErrors() && this._descriptor.__errorMessage + ? this._descriptor.__errorMessage + : ''; + } + + toLayerDescriptor(): LayerDescriptor { + return this._descriptor; + } + + async syncData(syncContext: SyncContext) { + // no-op by default + } + + getMbLayerIds(): string[] { + throw new Error('Should implement AbstractLayer#getMbLayerIds'); + } + + ownsMbLayerId(layerId: string): boolean { + throw new Error('Should implement AbstractLayer#ownsMbLayerId'); + } + + ownsMbSourceId(sourceId: string): boolean { + throw new Error('Should implement AbstractLayer#ownsMbSourceId'); + } + + canShowTooltip() { + return false; + } + + syncLayerWithMB(mbMap: unknown) { + throw new Error('Should implement AbstractLayer#syncLayerWithMB'); + } + + getLayerTypeIconName(): string { + throw new Error('should implement Layer#getLayerTypeIconName'); + } + + isDataLoaded(): boolean { + const sourceDataRequest = this.getSourceDataRequest(); + return sourceDataRequest ? sourceDataRequest.hasData() : false; + } + + async getBounds(mapFilters: MapFilters): Promise { + return { + minLon: -180, + maxLon: 180, + minLat: -89, + maxLat: 89, + }; + } + + renderStyleEditor({ + onStyleDescriptorChange, + }: { + onStyleDescriptorChange: (styleDescriptor: StyleDescriptor) => void; + }): ReactElement | null { + const style = this.getStyleForEditing(); + if (!style) { + return null; + } + return style.renderEditor({ layer: this, onStyleDescriptorChange }); + } + + getIndexPatternIds(): string[] { + return []; + } + + getQueryableIndexPatternIds(): string[] { + return []; + } + + syncVisibilityWithMb(mbMap: unknown, mbLayerId: string) { + // @ts-ignore + mbMap.setLayoutProperty(mbLayerId, 'visibility', this.isVisible() ? 'visible' : 'none'); + } + + getType(): string | undefined { + return this._descriptor.type; + } +} diff --git a/x-pack/plugins/maps/public/layers/sources/client_file_source/geojson_file_source.js b/x-pack/plugins/maps/public/layers/sources/client_file_source/geojson_file_source.js index 137513ad7c612..36f898f723757 100644 --- a/x-pack/plugins/maps/public/layers/sources/client_file_source/geojson_file_source.js +++ b/x-pack/plugins/maps/public/layers/sources/client_file_source/geojson_file_source.js @@ -21,8 +21,6 @@ import { registerSource } from '../source_registry'; export class GeojsonFileSource extends AbstractVectorSource { static type = SOURCE_TYPES.GEOJSON_FILE; - static isIndexingSource = true; - static createDescriptor(geoJson, name) { // Wrap feature as feature collection if needed let featureCollection; @@ -70,7 +68,7 @@ export class GeojsonFileSource extends AbstractVectorSource { } shouldBeIndexed() { - return GeojsonFileSource.isIndexingSource; + return true; } } diff --git a/x-pack/plugins/maps/public/layers/sources/es_geo_grid_source/es_geo_grid_source.d.ts b/x-pack/plugins/maps/public/layers/sources/es_geo_grid_source/es_geo_grid_source.d.ts index 96347c444dd5b..51ee15e7ea5af 100644 --- a/x-pack/plugins/maps/public/layers/sources/es_geo_grid_source/es_geo_grid_source.d.ts +++ b/x-pack/plugins/maps/public/layers/sources/es_geo_grid_source/es_geo_grid_source.d.ts @@ -6,7 +6,7 @@ import { AbstractESAggSource } from '../es_agg_source'; import { ESGeoGridSourceDescriptor } from '../../../../common/descriptor_types'; -import { GRID_RESOLUTION, RENDER_AS } from '../../../../common/constants'; +import { GRID_RESOLUTION } from '../../../../common/constants'; export class ESGeoGridSource extends AbstractESAggSource { static createDescriptor({ @@ -14,12 +14,7 @@ export class ESGeoGridSource extends AbstractESAggSource { geoField, requestType, resolution, - }: { - indexPatternId: string; - geoField: string; - requestType: RENDER_AS; - resolution?: GRID_RESOLUTION; - }): ESGeoGridSourceDescriptor; + }: Partial): ESGeoGridSourceDescriptor; constructor(sourceDescriptor: ESGeoGridSourceDescriptor, inspectorAdapters: unknown); diff --git a/x-pack/plugins/maps/public/layers/sources/es_source/es_source.d.ts b/x-pack/plugins/maps/public/layers/sources/es_source/es_source.d.ts index 092dc3bf0d5a8..3b41ae6bfd86b 100644 --- a/x-pack/plugins/maps/public/layers/sources/es_source/es_source.d.ts +++ b/x-pack/plugins/maps/public/layers/sources/es_source/es_source.d.ts @@ -8,6 +8,8 @@ import { AbstractVectorSource } from '../vector_source'; import { IVectorSource } from '../vector_source'; import { IndexPattern, SearchSource } from '../../../../../../../src/plugins/data/public'; import { VectorSourceRequestMeta } from '../../../../common/descriptor_types'; +import { VectorStyle } from '../../styles/vector/vector_style'; +import { IDynamicStyleProperty } from '../../styles/vector/properties/dynamic_style_property'; export interface IESSource extends IVectorSource { getId(): string; @@ -20,6 +22,13 @@ export interface IESSource extends IVectorSource { limit: number, initialSearchContext?: object ): Promise; + loadStylePropsMeta( + layerName: string, + style: VectorStyle, + dynamicStyleProps: IDynamicStyleProperty[], + registerCancelCallback: (requestToken: symbol, callback: () => void) => void, + searchFilters: VectorSourceRequestMeta + ): Promise; } export class AbstractESSource extends AbstractVectorSource implements IESSource { @@ -33,4 +42,11 @@ export class AbstractESSource extends AbstractVectorSource implements IESSource limit: number, initialSearchContext?: object ): Promise; + loadStylePropsMeta( + layerName: string, + style: VectorStyle, + dynamicStyleProps: IDynamicStyleProperty[], + registerCancelCallback: (requestToken: symbol, callback: () => void) => void, + searchFilters: VectorSourceRequestMeta + ): Promise; } diff --git a/x-pack/plugins/maps/public/layers/sources/es_term_source/es_term_source.d.ts b/x-pack/plugins/maps/public/layers/sources/es_term_source/es_term_source.d.ts index 701bd5e2c8b5e..248ca2b9212b4 100644 --- a/x-pack/plugins/maps/public/layers/sources/es_term_source/es_term_source.d.ts +++ b/x-pack/plugins/maps/public/layers/sources/es_term_source/es_term_source.d.ts @@ -9,4 +9,5 @@ import { IESAggSource } from '../es_agg_source'; export interface IESTermSource extends IESAggSource { getTermField(): IField; + hasCompleteConfig(): boolean; } diff --git a/x-pack/plugins/maps/public/layers/sources/mvt_single_layer_vector_source/mvt_single_layer_vector_source.ts b/x-pack/plugins/maps/public/layers/sources/mvt_single_layer_vector_source/mvt_single_layer_vector_source.ts index 0bfda6be72203..a73cfbdc0d043 100644 --- a/x-pack/plugins/maps/public/layers/sources/mvt_single_layer_vector_source/mvt_single_layer_vector_source.ts +++ b/x-pack/plugins/maps/public/layers/sources/mvt_single_layer_vector_source/mvt_single_layer_vector_source.ts @@ -15,9 +15,9 @@ import { IField } from '../../fields/field'; import { registerSource } from '../source_registry'; import { getDataSourceLabel, getUrlLabel } from '../../../../common/i18n_getters'; import { - LayerDescriptor, MapExtent, TiledSingleLayerVectorSourceDescriptor, + VectorLayerDescriptor, VectorSourceRequestMeta, VectorSourceSyncMeta, } from '../../../../common/descriptor_types'; @@ -66,12 +66,15 @@ export class MVTSingleLayerVectorSource extends AbstractSource return []; } - createDefaultLayer(options: LayerDescriptor): TiledVectorLayer { - const layerDescriptor = { + createDefaultLayer(options?: Partial): TiledVectorLayer { + const layerDescriptor: Partial = { sourceDescriptor: this._descriptor, ...options, }; - const normalizedLayerDescriptor = TiledVectorLayer.createDescriptor(layerDescriptor, []); + const normalizedLayerDescriptor: VectorLayerDescriptor = TiledVectorLayer.createDescriptor( + layerDescriptor, + [] + ); const vectorLayerArguments: VectorLayerArguments = { layerDescriptor: normalizedLayerDescriptor, source: this, diff --git a/x-pack/plugins/maps/public/layers/sources/source.d.ts b/x-pack/plugins/maps/public/layers/sources/source.d.ts deleted file mode 100644 index 5a01da02adaae..0000000000000 --- a/x-pack/plugins/maps/public/layers/sources/source.d.ts +++ /dev/null @@ -1,56 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ -/* eslint-disable @typescript-eslint/consistent-type-definitions */ - -import { AbstractSourceDescriptor, LayerDescriptor } from '../../../common/descriptor_types'; -import { ILayer } from '../layer'; - -export type ImmutableSourceProperty = { - label: string; - value: string; -}; - -export type Attribution = { - url: string; - label: string; -}; - -export interface ISource { - createDefaultLayer(options?: LayerDescriptor): ILayer; - destroy(): void; - getDisplayName(): Promise; - getInspectorAdapters(): object; - isFieldAware(): boolean; - isFilterByMapBounds(): boolean; - isGeoGridPrecisionAware(): boolean; - isQueryAware(): boolean; - isRefreshTimerAware(): Promise; - isTimeAware(): Promise; - getImmutableProperties(): Promise; - getAttributions(): Promise; - getMinZoom(): number; - getMaxZoom(): number; -} - -export class AbstractSource implements ISource { - readonly _descriptor: AbstractSourceDescriptor; - constructor(sourceDescriptor: AbstractSourceDescriptor, inspectorAdapters?: object); - - destroy(): void; - createDefaultLayer(options?: LayerDescriptor, mapColors?: string[]): ILayer; - getDisplayName(): Promise; - getInspectorAdapters(): object; - isFieldAware(): boolean; - isFilterByMapBounds(): boolean; - isGeoGridPrecisionAware(): boolean; - isQueryAware(): boolean; - isRefreshTimerAware(): Promise; - isTimeAware(): Promise; - getImmutableProperties(): Promise; - getAttributions(): Promise; - getMinZoom(): number; - getMaxZoom(): number; -} diff --git a/x-pack/plugins/maps/public/layers/sources/source.js b/x-pack/plugins/maps/public/layers/sources/source.js deleted file mode 100644 index fd93daf249b26..0000000000000 --- a/x-pack/plugins/maps/public/layers/sources/source.js +++ /dev/null @@ -1,159 +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 { copyPersistentState } from '../../reducers/util'; -import { MIN_ZOOM, MAX_ZOOM } from '../../../common/constants'; - -export class AbstractSource { - static isIndexingSource = false; - - static renderEditor() { - throw new Error('Must implement Source.renderEditor'); - } - - static createDescriptor() { - throw new Error('Must implement Source.createDescriptor'); - } - - constructor(descriptor, inspectorAdapters) { - this._descriptor = descriptor; - this._inspectorAdapters = inspectorAdapters; - } - - destroy() {} - - cloneDescriptor() { - return copyPersistentState(this._descriptor); - } - - async supportsFitToBounds() { - return true; - } - - /** - * return list of immutable source properties. - * Immutable source properties are properties that can not be edited by the user. - */ - async getImmutableProperties() { - return []; - } - - getInspectorAdapters() { - return this._inspectorAdapters; - } - - _createDefaultLayerDescriptor() { - throw new Error(`Source#createDefaultLayerDescriptor not implemented`); - } - - createDefaultLayer() { - throw new Error(`Source#createDefaultLayer not implemented`); - } - - async getDisplayName() { - console.warn('Source should implement Source#getDisplayName'); - return ''; - } - - /** - * return attribution for this layer as array of objects with url and label property. - * e.g. [{ url: 'example.com', label: 'foobar' }] - * @return {Promise} - */ - async getAttributions() { - return []; - } - - isFieldAware() { - return false; - } - - isRefreshTimerAware() { - return false; - } - - isGeoGridPrecisionAware() { - return false; - } - - async isTimeAware() { - return false; - } - - getFieldNames() { - return []; - } - - hasCompleteConfig() { - throw new Error(`Source#hasCompleteConfig not implemented`); - } - - renderSourceSettingsEditor() { - return null; - } - - getApplyGlobalQuery() { - return !!this._descriptor.applyGlobalQuery; - } - - getIndexPatternIds() { - return []; - } - - getQueryableIndexPatternIds() { - return []; - } - - isFilterByMapBounds() { - return false; - } - - isQueryAware() { - return false; - } - - getGeoGridPrecision() { - return 0; - } - - isJoinable() { - return false; - } - - shouldBeIndexed() { - return AbstractSource.isIndexingSource; - } - - isESSource() { - return false; - } - - // Returns geo_shape indexed_shape context for spatial quering by pre-indexed shapes - async getPreIndexedShape(/* properties */) { - return null; - } - - // Returns function used to format value - async createFieldFormatter(/* field */) { - return null; - } - - async loadStylePropsMeta() { - throw new Error(`Source#loadStylePropsMeta not implemented`); - } - - async getValueSuggestions(/* field, query */) { - return []; - } - - getMinZoom() { - return MIN_ZOOM; - } - - getMaxZoom() { - return MAX_ZOOM; - } -} diff --git a/x-pack/plugins/maps/public/layers/sources/source.ts b/x-pack/plugins/maps/public/layers/sources/source.ts new file mode 100644 index 0000000000000..1cd84010159ab --- /dev/null +++ b/x-pack/plugins/maps/public/layers/sources/source.ts @@ -0,0 +1,195 @@ +/* + * 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. + */ + +/* eslint-disable @typescript-eslint/consistent-type-definitions */ + +import { ReactElement } from 'react'; + +import { Adapters } from 'src/plugins/inspector/public'; +// eslint-disable-next-line @kbn/eslint/no-restricted-paths +// @ts-ignore +import { copyPersistentState } from '../../reducers/util'; + +import { LayerDescriptor, SourceDescriptor } from '../../../common/descriptor_types'; +import { ILayer } from '../layer'; +import { IField } from '../fields/field'; +import { MAX_ZOOM, MIN_ZOOM } from '../../../common/constants'; + +export type ImmutableSourceProperty = { + label: string; + value: string; +}; + +export type Attribution = { + url: string; + label: string; +}; + +export type PreIndexedShape = { + index: string; + id: string | number; + path: string; +}; + +export type FieldFormatter = (value: string | number | null | undefined | boolean) => string; + +export interface ISource { + createDefaultLayer(options?: Partial): ILayer; + destroy(): void; + getDisplayName(): Promise; + getInspectorAdapters(): Adapters | undefined; + isFieldAware(): boolean; + isFilterByMapBounds(): boolean; + isGeoGridPrecisionAware(): boolean; + isQueryAware(): boolean; + isRefreshTimerAware(): boolean; + isTimeAware(): Promise; + getImmutableProperties(): Promise; + getAttributions(): Promise; + isESSource(): boolean; + renderSourceSettingsEditor({ onChange }: { onChange: () => void }): ReactElement | null; + supportsFitToBounds(): Promise; + isJoinable(): boolean; + cloneDescriptor(): SourceDescriptor; + getFieldNames(): string[]; + getApplyGlobalQuery(): boolean; + getIndexPatternIds(): string[]; + getQueryableIndexPatternIds(): string[]; + getGeoGridPrecision(zoom: number): number; + shouldBeIndexed(): boolean; + getPreIndexedShape(): Promise; + createFieldFormatter(field: IField): Promise; + getValueSuggestions(field: IField, query: string): Promise; + getMinZoom(): number; + getMaxZoom(): number; +} + +export class AbstractSource implements ISource { + readonly _descriptor: SourceDescriptor; + readonly _inspectorAdapters?: Adapters | undefined; + + constructor(descriptor: SourceDescriptor, inspectorAdapters?: Adapters) { + this._descriptor = descriptor; + this._inspectorAdapters = inspectorAdapters; + } + + destroy(): void {} + + cloneDescriptor(): SourceDescriptor { + // @ts-ignore + return copyPersistentState(this._descriptor); + } + + async supportsFitToBounds(): Promise { + return true; + } + + /** + * return list of immutable source properties. + * Immutable source properties are properties that can not be edited by the user. + */ + async getImmutableProperties(): Promise { + return []; + } + + getInspectorAdapters(): Adapters | undefined { + return this._inspectorAdapters; + } + + createDefaultLayer(options?: Partial): ILayer { + throw new Error(`Source#createDefaultLayer not implemented`); + } + + async getDisplayName(): Promise { + return ''; + } + + async getAttributions(): Promise { + return []; + } + + isFieldAware(): boolean { + return false; + } + + isRefreshTimerAware(): boolean { + return false; + } + + isGeoGridPrecisionAware(): boolean { + return false; + } + + isQueryAware(): boolean { + return false; + } + + getFieldNames(): string[] { + return []; + } + + renderSourceSettingsEditor() { + return null; + } + + getApplyGlobalQuery(): boolean { + return !!this._descriptor.applyGlobalQuery; + } + + getIndexPatternIds(): string[] { + return []; + } + + getQueryableIndexPatternIds(): string[] { + return []; + } + + getGeoGridPrecision(zoom: number): number { + return 0; + } + + isJoinable(): boolean { + return false; + } + + shouldBeIndexed(): boolean { + return false; + } + + isESSource(): boolean { + return false; + } + + // Returns geo_shape indexed_shape context for spatial quering by pre-indexed shapes + async getPreIndexedShape(/* properties */): Promise { + return null; + } + + // Returns function used to format value + async createFieldFormatter(field: IField): Promise { + return null; + } + + async getValueSuggestions(field: IField, query: string): Promise { + return []; + } + + async isTimeAware(): Promise { + return false; + } + + isFilterByMapBounds(): boolean { + return false; + } + + getMinZoom() { + return MIN_ZOOM; + } + + getMaxZoom() { + return MAX_ZOOM; + } +} diff --git a/x-pack/plugins/maps/public/layers/sources/xyz_tms_source/xyz_tms_source.ts b/x-pack/plugins/maps/public/layers/sources/xyz_tms_source/xyz_tms_source.ts index 8b64480f92961..77f8d88a8c0ab 100644 --- a/x-pack/plugins/maps/public/layers/sources/xyz_tms_source/xyz_tms_source.ts +++ b/x-pack/plugins/maps/public/layers/sources/xyz_tms_source/xyz_tms_source.ts @@ -13,6 +13,7 @@ import { AbstractTMSSource } from '../tms_source'; import { LayerDescriptor, XYZTMSSourceDescriptor } from '../../../../common/descriptor_types'; import { Attribution, ImmutableSourceProperty } from '../source'; import { XYZTMSSourceConfig } from './xyz_tms_editor'; +import { ILayer } from '../../layer'; export const sourceTitle = i18n.translate('xpack.maps.source.ems_xyzTitle', { defaultMessage: 'Tile Map Service', @@ -48,7 +49,7 @@ export class XYZTMSSource extends AbstractTMSSource { ]; } - createDefaultLayer(options?: LayerDescriptor): TileLayer { + createDefaultLayer(options?: LayerDescriptor): ILayer { const layerDescriptor: LayerDescriptor = TileLayer.createDescriptor({ sourceDescriptor: this._descriptor, ...options, diff --git a/x-pack/plugins/maps/public/layers/styles/abstract_style.js b/x-pack/plugins/maps/public/layers/styles/abstract_style.js deleted file mode 100644 index 3e7a3dbf7ed20..0000000000000 --- a/x-pack/plugins/maps/public/layers/styles/abstract_style.js +++ /dev/null @@ -1,29 +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. - */ - -export class AbstractStyle { - getDescriptorWithMissingStylePropsRemoved(/* nextOrdinalFields */) { - return { - hasChanges: false, - }; - } - - async pluckStyleMetaFromSourceDataRequest(/* sourceDataRequest */) { - return {}; - } - - getDescriptor() { - return this._descriptor; - } - - renderEditor(/* { layer, onStyleDescriptorChange } */) { - return null; - } - - getSourceFieldNames() { - return []; - } -} diff --git a/x-pack/plugins/maps/public/layers/styles/heatmap/heatmap_style.js b/x-pack/plugins/maps/public/layers/styles/heatmap/heatmap_style.js index d769fe0da9ec2..1fa24943c5e51 100644 --- a/x-pack/plugins/maps/public/layers/styles/heatmap/heatmap_style.js +++ b/x-pack/plugins/maps/public/layers/styles/heatmap/heatmap_style.js @@ -5,7 +5,7 @@ */ import React from 'react'; -import { AbstractStyle } from '../abstract_style'; +import { AbstractStyle } from '../style'; import { HeatmapStyleEditor } from './components/heatmap_style_editor'; import { HeatmapLegend } from './components/legend/heatmap_legend'; import { DEFAULT_HEATMAP_COLOR_RAMP_NAME } from './components/heatmap_constants'; diff --git a/x-pack/plugins/maps/public/layers/styles/style.ts b/x-pack/plugins/maps/public/layers/styles/style.ts new file mode 100644 index 0000000000000..38fdc36904412 --- /dev/null +++ b/x-pack/plugins/maps/public/layers/styles/style.ts @@ -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 { ReactElement } from 'react'; +import { StyleDescriptor, StyleMetaDescriptor } from '../../../common/descriptor_types'; +import { ILayer } from '../layer'; +import { IField } from '../fields/field'; +import { DataRequest } from '../util/data_request'; + +export interface IStyle { + getDescriptor(): StyleDescriptor | null; + getDescriptorWithMissingStylePropsRemoved( + nextFields: IField[] + ): { hasChanges: boolean; nextStyleDescriptor?: StyleDescriptor }; + pluckStyleMetaFromSourceDataRequest(sourceDataRequest: DataRequest): StyleMetaDescriptor; + renderEditor({ + layer, + onStyleDescriptorChange, + }: { + layer: ILayer; + onStyleDescriptorChange: (styleDescriptor: StyleDescriptor) => void; + }): ReactElement | null; + getSourceFieldNames(): string[]; +} + +export class AbstractStyle implements IStyle { + readonly _descriptor: StyleDescriptor | null; + + constructor(descriptor: StyleDescriptor | null) { + this._descriptor = descriptor; + } + + getDescriptorWithMissingStylePropsRemoved( + nextFields: IField[] + ): { hasChanges: boolean; nextStyleDescriptor?: StyleDescriptor } { + return { + hasChanges: false, + }; + } + + pluckStyleMetaFromSourceDataRequest(sourceDataRequest: DataRequest): StyleMetaDescriptor { + return { fieldMeta: {} }; + } + + getDescriptor(): StyleDescriptor | null { + return this._descriptor; + } + + renderEditor(/* { layer, onStyleDescriptorChange } */) { + return null; + } + + getSourceFieldNames(): string[] { + return []; + } +} diff --git a/x-pack/plugins/maps/public/layers/styles/tile/tile_style.ts b/x-pack/plugins/maps/public/layers/styles/tile/tile_style.ts new file mode 100644 index 0000000000000..f658d0821edf2 --- /dev/null +++ b/x-pack/plugins/maps/public/layers/styles/tile/tile_style.ts @@ -0,0 +1,16 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { AbstractStyle } from '../style'; +import { LAYER_STYLE_TYPE } from '../../../../common/constants'; + +export class TileStyle extends AbstractStyle { + constructor() { + super({ + type: LAYER_STYLE_TYPE.TILE, + }); + } +} diff --git a/x-pack/plugins/maps/public/layers/styles/vector/vector_style.d.ts b/x-pack/plugins/maps/public/layers/styles/vector/vector_style.d.ts index e010d5ac7d7a3..762322b8e09f9 100644 --- a/x-pack/plugins/maps/public/layers/styles/vector/vector_style.d.ts +++ b/x-pack/plugins/maps/public/layers/styles/vector/vector_style.d.ts @@ -7,24 +7,23 @@ import { IStyleProperty } from './properties/style_property'; import { IDynamicStyleProperty } from './properties/dynamic_style_property'; import { IVectorLayer } from '../../vector_layer'; import { IVectorSource } from '../../sources/vector_source'; +import { AbstractStyle, IStyle } from '../style'; import { VectorStyleDescriptor, VectorStylePropertiesDescriptor, } from '../../../../common/descriptor_types'; -export interface IVectorStyle { +export interface IVectorStyle extends IStyle { getAllStyleProperties(): IStyleProperty[]; - getDescriptor(): VectorStyleDescriptor; getDynamicPropertiesArray(): IDynamicStyleProperty[]; getSourceFieldNames(): string[]; } -export class VectorStyle implements IVectorStyle { +export class VectorStyle extends AbstractStyle implements IVectorStyle { static createDescriptor(properties: VectorStylePropertiesDescriptor): VectorStyleDescriptor; static createDefaultStyleProperties(mapColors: string[]): VectorStylePropertiesDescriptor; constructor(descriptor: VectorStyleDescriptor, source: IVectorSource, layer: IVectorLayer); getSourceFieldNames(): string[]; getAllStyleProperties(): IStyleProperty[]; - getDescriptor(): VectorStyleDescriptor; getDynamicPropertiesArray(): IDynamicStyleProperty[]; } diff --git a/x-pack/plugins/maps/public/layers/styles/vector/vector_style.js b/x-pack/plugins/maps/public/layers/styles/vector/vector_style.js index b044c98d44d41..5a4edd9c93a05 100644 --- a/x-pack/plugins/maps/public/layers/styles/vector/vector_style.js +++ b/x-pack/plugins/maps/public/layers/styles/vector/vector_style.js @@ -8,7 +8,7 @@ import _ from 'lodash'; import React from 'react'; import { VectorStyleEditor } from './components/vector_style_editor'; import { getDefaultProperties, LINE_STYLES, POLYGON_STYLES } from './vector_style_defaults'; -import { AbstractStyle } from '../abstract_style'; +import { AbstractStyle } from '../style'; import { GEO_JSON_TYPE, FIELD_ORIGIN, @@ -60,6 +60,7 @@ export class VectorStyle extends AbstractStyle { constructor(descriptor = {}, source, layer) { super(); + descriptor = descriptor === null ? {} : descriptor; this._source = source; this._layer = layer; this._descriptor = { diff --git a/x-pack/plugins/maps/public/layers/tile_layer.d.ts b/x-pack/plugins/maps/public/layers/tile_layer.d.ts index 53e8c388ee4c2..8a1ef0f172717 100644 --- a/x-pack/plugins/maps/public/layers/tile_layer.d.ts +++ b/x-pack/plugins/maps/public/layers/tile_layer.d.ts @@ -4,11 +4,11 @@ * you may not use this file except in compliance with the Elastic License. */ -import { AbstractLayer, ILayerArguments } from './layer'; +import { AbstractLayer } from './layer'; import { ITMSSource } from './sources/tms_source'; import { LayerDescriptor } from '../../common/descriptor_types'; -interface ITileLayerArguments extends ILayerArguments { +interface ITileLayerArguments { source: ITMSSource; layerDescriptor: LayerDescriptor; } diff --git a/x-pack/plugins/maps/public/layers/tile_layer.js b/x-pack/plugins/maps/public/layers/tile_layer.js index 2ac60e12d137a..baded3c287637 100644 --- a/x-pack/plugins/maps/public/layers/tile_layer.js +++ b/x-pack/plugins/maps/public/layers/tile_layer.js @@ -6,7 +6,8 @@ import { AbstractLayer } from './layer'; import _ from 'lodash'; -import { SOURCE_DATA_ID_ORIGIN, LAYER_TYPE } from '../../common/constants'; +import { SOURCE_DATA_ID_ORIGIN, LAYER_TYPE, LAYER_STYLE_TYPE } from '../../common/constants'; +import { TileStyle } from './styles/tile/tile_style'; export class TileLayer extends AbstractLayer { static type = LAYER_TYPE.TILE; @@ -15,9 +16,14 @@ export class TileLayer extends AbstractLayer { const tileLayerDescriptor = super.createDescriptor(options, mapColors); tileLayerDescriptor.type = TileLayer.type; tileLayerDescriptor.alpha = _.get(options, 'alpha', 1); + tileLayerDescriptor.style = { type: LAYER_STYLE_TYPE.TILE }; return tileLayerDescriptor; } + constructor({ source, layerDescriptor }) { + super({ source, layerDescriptor, style: new TileStyle() }); + } + async syncData({ startLoading, stopLoading, onLoadError, dataFilters }) { if (!this.isVisible() || !this.showAtZoomLevel(dataFilters.zoom)) { return; diff --git a/x-pack/plugins/maps/public/layers/tile_layer.test.ts b/x-pack/plugins/maps/public/layers/tile_layer.test.ts index f8c2fd9db60fa..a7e8be9fc4b46 100644 --- a/x-pack/plugins/maps/public/layers/tile_layer.test.ts +++ b/x-pack/plugins/maps/public/layers/tile_layer.test.ts @@ -4,7 +4,8 @@ * you may not use this file except in compliance with the Elastic License. */ -import { TileLayer } from './tile_layer'; +// eslint-disable-next-line max-classes-per-file +import { ITileLayerArguments, TileLayer } from './tile_layer'; import { SOURCE_TYPES } from '../../common/constants'; import { XYZTMSSourceDescriptor } from '../../common/descriptor_types'; import { ITMSSource, AbstractTMSSource } from './sources/tms_source'; @@ -38,10 +39,13 @@ class MockTileSource extends AbstractTMSSource implements ITMSSource { describe('TileLayer', () => { it('should use display-label from source', async () => { const source = new MockTileSource(sourceDescriptor); - const layer: ILayer = new TileLayer({ + + const args: ITileLayerArguments = { source, layerDescriptor: { id: 'layerid', sourceDescriptor }, - }); + }; + + const layer: ILayer = new TileLayer(args); expect(await source.getDisplayName()).toEqual(await layer.getDisplayName()); }); diff --git a/x-pack/plugins/maps/public/layers/tiled_vector_layer.tsx b/x-pack/plugins/maps/public/layers/tiled_vector_layer.tsx index c47cae5641e56..06c5ef579b221 100644 --- a/x-pack/plugins/maps/public/layers/tiled_vector_layer.tsx +++ b/x-pack/plugins/maps/public/layers/tiled_vector_layer.tsx @@ -20,7 +20,7 @@ export class TiledVectorLayer extends VectorLayer { static type = LAYER_TYPE.TILED_VECTOR; static createDescriptor( - descriptor: VectorLayerDescriptor, + descriptor: Partial, mapColors: string[] ): VectorLayerDescriptor { const layerDescriptor = super.createDescriptor(descriptor, mapColors); diff --git a/x-pack/plugins/maps/public/layers/vector_layer.d.ts b/x-pack/plugins/maps/public/layers/vector_layer.d.ts index 3d5b8054ff3fd..efc1f3011c687 100644 --- a/x-pack/plugins/maps/public/layers/vector_layer.d.ts +++ b/x-pack/plugins/maps/public/layers/vector_layer.d.ts @@ -19,7 +19,7 @@ import { IVectorStyle } from './styles/vector/vector_style'; import { IField } from './fields/field'; import { SyncContext } from '../actions/map_actions'; -type VectorLayerArguments = { +export type VectorLayerArguments = { source: IVectorSource; joins?: IJoin[]; layerDescriptor: VectorLayerDescriptor; @@ -33,14 +33,12 @@ export interface IVectorLayer extends ILayer { } export class VectorLayer extends AbstractLayer implements IVectorLayer { + protected readonly _style: IVectorStyle; static createDescriptor( options: Partial, mapColors?: string[] ): VectorLayerDescriptor; - protected readonly _source: IVectorSource; - protected readonly _style: IVectorStyle; - constructor(options: VectorLayerArguments); getLayerTypeIconName(): string; getFields(): Promise; diff --git a/x-pack/plugins/maps/public/layers/vector_layer.js b/x-pack/plugins/maps/public/layers/vector_layer.js index c5947a63587ea..17b7f8152d76d 100644 --- a/x-pack/plugins/maps/public/layers/vector_layer.js +++ b/x-pack/plugins/maps/public/layers/vector_layer.js @@ -484,6 +484,8 @@ export class VectorLayer extends AbstractLayer { try { startLoading(dataRequestId, requestToken, nextMeta); const layerName = await this.getDisplayName(source); + + //todo: cast source to ESSource when migrating to TS const styleMeta = await source.loadStylePropsMeta( layerName, style, diff --git a/x-pack/plugins/maps/public/layers/vector_tile_layer.js b/x-pack/plugins/maps/public/layers/vector_tile_layer.js index c620ec6c56dc3..fc7812a2c86c7 100644 --- a/x-pack/plugins/maps/public/layers/vector_tile_layer.js +++ b/x-pack/plugins/maps/public/layers/vector_tile_layer.js @@ -6,7 +6,7 @@ import { TileLayer } from './tile_layer'; import _ from 'lodash'; -import { SOURCE_DATA_ID_ORIGIN, LAYER_TYPE } from '../../common/constants'; +import { SOURCE_DATA_ID_ORIGIN, LAYER_TYPE, LAYER_STYLE_TYPE } from '../../common/constants'; import { isRetina } from '../meta'; import { addSpriteSheetToMapFromImageData, @@ -28,6 +28,7 @@ export class VectorTileLayer extends TileLayer { const tileLayerDescriptor = super.createDescriptor(options); tileLayerDescriptor.type = VectorTileLayer.type; tileLayerDescriptor.alpha = _.get(options, 'alpha', 1); + tileLayerDescriptor.style = { type: LAYER_STYLE_TYPE.TILE }; return tileLayerDescriptor; } From 9a47926b90797999b75edca8733a78689b44de0e Mon Sep 17 00:00:00 2001 From: Kerry Gallagher Date: Wed, 22 Apr 2020 14:25:39 +0100 Subject: [PATCH 42/67] [Logs / Metrics UI] Switch to scopedHistory and enhance useLinkProps hook (#61667) --- .../plugins/infra/public/apps/start_app.tsx | 10 ++- .../source_configuration_settings.tsx | 13 ++-- .../public/hooks/use_link_props.test.tsx | 24 +++--- .../infra/public/hooks/use_link_props.tsx | 78 +++++++++---------- .../infra/public/utils/history_context.ts | 4 +- .../navigation_warning_prompt/context.tsx | 31 ++++++++ .../utils/navigation_warning_prompt/index.ts | 8 ++ .../navigation_warning_prompt/prompt.tsx | 25 ++++++ 8 files changed, 126 insertions(+), 67 deletions(-) create mode 100644 x-pack/plugins/infra/public/utils/navigation_warning_prompt/context.tsx create mode 100644 x-pack/plugins/infra/public/utils/navigation_warning_prompt/index.ts create mode 100644 x-pack/plugins/infra/public/utils/navigation_warning_prompt/prompt.tsx diff --git a/x-pack/plugins/infra/public/apps/start_app.tsx b/x-pack/plugins/infra/public/apps/start_app.tsx index ebf9562c38d7a..4c213700b62e6 100644 --- a/x-pack/plugins/infra/public/apps/start_app.tsx +++ b/x-pack/plugins/infra/public/apps/start_app.tsx @@ -4,7 +4,6 @@ * you may not use this file except in compliance with the Elastic License. */ -import { createBrowserHistory } from 'history'; import React from 'react'; import ReactDOM from 'react-dom'; import { ApolloProvider } from 'react-apollo'; @@ -25,6 +24,7 @@ import { AppRouter } from '../routers'; import { TriggersAndActionsUIPublicPluginSetup } from '../../../triggers_actions_ui/public'; import { TriggersActionsProvider } from '../utils/triggers_actions_context'; import '../index.scss'; +import { NavigationWarningPromptProvider } from '../utils/navigation_warning_prompt'; export const CONTAINER_CLASSNAME = 'infra-container-element'; @@ -36,8 +36,8 @@ export async function startApp( Router: AppRouter, triggersActionsUI: TriggersAndActionsUIPublicPluginSetup ) { - const { element, appBasePath } = params; - const history = createBrowserHistory({ basename: appBasePath }); + const { element, history } = params; + const InfraPluginRoot: React.FunctionComponent = () => { const [darkMode] = useUiSetting$('theme:darkMode'); @@ -49,7 +49,9 @@ export async function startApp( - + + + diff --git a/x-pack/plugins/infra/public/components/source_configuration/source_configuration_settings.tsx b/x-pack/plugins/infra/public/components/source_configuration/source_configuration_settings.tsx index 36645fa3f1f35..7f248cd103003 100644 --- a/x-pack/plugins/infra/public/components/source_configuration/source_configuration_settings.tsx +++ b/x-pack/plugins/infra/public/components/source_configuration/source_configuration_settings.tsx @@ -17,7 +17,6 @@ import { import { i18n } from '@kbn/i18n'; import { FormattedMessage } from '@kbn/i18n/react'; import React, { useCallback, useContext, useMemo } from 'react'; -import { Prompt } from 'react-router-dom'; import { Source } from '../../containers/source'; import { FieldsConfigurationPanel } from './fields_configuration_panel'; @@ -26,6 +25,7 @@ import { NameConfigurationPanel } from './name_configuration_panel'; import { LogColumnsConfigurationPanel } from './log_columns_configuration_panel'; import { useSourceConfigurationFormState } from './source_configuration_form_state'; import { SourceLoadingPage } from '../source_loading_page'; +import { Prompt } from '../../utils/navigation_warning_prompt'; interface SourceConfigurationSettingsProps { shouldAllowEdit: boolean; @@ -100,10 +100,13 @@ export const SourceConfigurationSettings = ({ data-test-subj="sourceConfigurationContent" > { const INTERNAL_APP = 'metrics'; -// Note: Memory history doesn't support basename, -// we'll work around this by re-assigning 'createHref' so that -// it includes a basename, this then acts as our browserHistory instance would. const history = createMemoryHistory(); -const originalCreateHref = history.createHref; -history.createHref = (location: LocationDescriptorObject): string => { - return `${PREFIX}${INTERNAL_APP}${originalCreateHref.call(history, location)}`; -}; +history.push(`${PREFIX}${INTERNAL_APP}`); +const scopedHistory = new ScopedHistory(history, `${PREFIX}${INTERNAL_APP}`); const ProviderWrapper: React.FC = ({ children }) => { return ( - + {children}; ); @@ -111,7 +107,7 @@ describe('useLinkProps hook', () => { pathname: '/', }); expect(result.current.href).toBe('/test-basepath/s/test-space/app/ml/'); - expect(result.current.onClick).not.toBeDefined(); + expect(result.current.onClick).toBeDefined(); }); it('Provides the correct props with pathname options', () => { @@ -127,7 +123,7 @@ describe('useLinkProps hook', () => { expect(result.current.href).toBe( '/test-basepath/s/test-space/app/ml/explorer?type=host&id=some-id&count=12345' ); - expect(result.current.onClick).not.toBeDefined(); + expect(result.current.onClick).toBeDefined(); }); it('Provides the correct props with hash options', () => { @@ -143,7 +139,7 @@ describe('useLinkProps hook', () => { expect(result.current.href).toBe( '/test-basepath/s/test-space/app/ml#/explorer?type=host&id=some-id&count=12345' ); - expect(result.current.onClick).not.toBeDefined(); + expect(result.current.onClick).toBeDefined(); }); it('Provides the correct props with more complex encoding', () => { @@ -161,7 +157,7 @@ describe('useLinkProps hook', () => { expect(result.current.href).toBe( '/test-basepath/s/test-space/app/ml#/explorer?type=host%20%2B%20host&name=this%20name%20has%20spaces%20and%20**%20and%20%25&id=some-id&count=12345&animals=dog,cat,bear' ); - expect(result.current.onClick).not.toBeDefined(); + expect(result.current.onClick).toBeDefined(); }); it('Provides the correct props with a consumer using Rison encoding for search', () => { @@ -180,7 +176,7 @@ describe('useLinkProps hook', () => { expect(result.current.href).toBe( '/test-basepath/s/test-space/app/rison-app#rison-route?type=host%20%2B%20host&state=(refreshInterval:(pause:!t,value:0),time:(from:12345,to:54321))' ); - expect(result.current.onClick).not.toBeDefined(); + expect(result.current.onClick).toBeDefined(); }); }); }); diff --git a/x-pack/plugins/infra/public/hooks/use_link_props.tsx b/x-pack/plugins/infra/public/hooks/use_link_props.tsx index e60ab32046832..8c522bb7fa764 100644 --- a/x-pack/plugins/infra/public/hooks/use_link_props.tsx +++ b/x-pack/plugins/infra/public/hooks/use_link_props.tsx @@ -9,7 +9,8 @@ import { stringify } from 'query-string'; import url from 'url'; import { url as urlUtils } from '../../../../../src/plugins/kibana_utils/public'; import { usePrefixPathWithBasepath } from './use_prefix_path_with_basepath'; -import { useHistory } from '../utils/history_context'; +import { useKibana } from '../../../../../src/plugins/kibana_react/public'; +import { useNavigationWarningPrompt } from '../utils/navigation_warning_prompt'; type Search = Record; @@ -28,31 +29,26 @@ interface LinkProps { export const useLinkProps = ({ app, pathname, hash, search }: LinkDescriptor): LinkProps => { validateParams({ app, pathname, hash, search }); - const history = useHistory(); + const { prompt } = useNavigationWarningPrompt(); const prefixer = usePrefixPathWithBasepath(); + const navigateToApp = useKibana().services.application?.navigateToApp; const encodedSearch = useMemo(() => { return search ? encodeSearch(search) : undefined; }, [search]); - const internalLinkResult = useMemo(() => { - // When the logs / metrics apps are first mounted a history instance is setup with a 'basename' equal to the - // 'appBasePath' received from Core's 'AppMountParams', e.g. /BASE_PATH/s/SPACE_ID/app/APP_ID. With internal - // linking we are using 'createHref' and 'push' on top of this history instance. So a pathname of /inventory used within - // the metrics app will ultimatey end up as /BASE_PATH/s/SPACE_ID/app/metrics/inventory. React-router responds to this - // as it is instantiated with the same history instance. - return history?.createHref({ - pathname: pathname ? formatPathname(pathname) : undefined, - search: encodedSearch, - }); - }, [history, pathname, encodedSearch]); - - const externalLinkResult = useMemo(() => { + const mergedHash = useMemo(() => { // The URI spec defines that the query should appear before the fragment // https://tools.ietf.org/html/rfc3986#section-3 (e.g. url.format()). However, in Kibana, apps that use // hash based routing expect the query to be part of the hash. This will handle that. - const mergedHash = hash && encodedSearch ? `${hash}?${encodedSearch}` : hash; + return hash && encodedSearch ? `${hash}?${encodedSearch}` : hash; + }, [hash, encodedSearch]); + + const mergedPathname = useMemo(() => { + return pathname && encodedSearch ? `${pathname}?${encodedSearch}` : pathname; + }, [pathname, encodedSearch]); + const href = useMemo(() => { const link = url.format({ pathname, hash: mergedHash, @@ -60,28 +56,36 @@ export const useLinkProps = ({ app, pathname, hash, search }: LinkDescriptor): L }); return prefixer(app, link); - }, [hash, encodedSearch, pathname, prefixer, app]); + }, [mergedHash, hash, encodedSearch, pathname, prefixer, app]); const onClick = useMemo(() => { - // If these results are equal we know we're trying to navigate within the same application - // that the current history instance is representing - if (internalLinkResult && linksAreEquivalent(externalLinkResult, internalLinkResult)) { - return (e: React.MouseEvent | React.MouseEvent) => { - e.preventDefault(); - if (history) { - history.push({ - pathname: pathname ? formatPathname(pathname) : undefined, - search: encodedSearch, - }); + return (e: React.MouseEvent | React.MouseEvent) => { + e.preventDefault(); + + const navigate = () => { + if (navigateToApp) { + const navigationPath = mergedHash ? `#${mergedHash}` : mergedPathname; + navigateToApp(app, { path: navigationPath ? navigationPath : undefined }); } }; - } else { - return undefined; - } - }, [internalLinkResult, externalLinkResult, history, pathname, encodedSearch]); + + // A component somewhere within the app hierarchy is requesting that we + // prompt the user before navigating. + if (prompt) { + const wantsToNavigate = window.confirm(prompt); + if (wantsToNavigate) { + navigate(); + } else { + return; + } + } else { + navigate(); + } + }; + }, [navigateToApp, mergedHash, mergedPathname, app, prompt]); return { - href: externalLinkResult, + href, onClick, }; }; @@ -90,10 +94,6 @@ const encodeSearch = (search: Search) => { return stringify(urlUtils.encodeQuery(search), { sort: false, encode: false }); }; -const formatPathname = (pathname: string) => { - return pathname[0] === '/' ? pathname : `/${pathname}`; -}; - const validateParams = ({ app, pathname, hash, search }: LinkDescriptor) => { if (!app && hash) { throw new Error( @@ -101,9 +101,3 @@ const validateParams = ({ app, pathname, hash, search }: LinkDescriptor) => { ); } }; - -const linksAreEquivalent = (externalLink: string, internalLink: string): boolean => { - // Compares with trailing slashes removed. This handles the case where the pathname is '/' - // and 'createHref' will include the '/' but Kibana's 'getUrlForApp' will remove it. - return externalLink.replace(/\/$/, '') === internalLink.replace(/\/$/, ''); -}; diff --git a/x-pack/plugins/infra/public/utils/history_context.ts b/x-pack/plugins/infra/public/utils/history_context.ts index fe036e3179ec1..844d5b5e8e76f 100644 --- a/x-pack/plugins/infra/public/utils/history_context.ts +++ b/x-pack/plugins/infra/public/utils/history_context.ts @@ -5,9 +5,9 @@ */ import { createContext, useContext } from 'react'; -import { History } from 'history'; +import { ScopedHistory } from 'src/core/public'; -export const HistoryContext = createContext(undefined); +export const HistoryContext = createContext(undefined); export const useHistory = () => { return useContext(HistoryContext); diff --git a/x-pack/plugins/infra/public/utils/navigation_warning_prompt/context.tsx b/x-pack/plugins/infra/public/utils/navigation_warning_prompt/context.tsx new file mode 100644 index 0000000000000..10f8fb9e71f43 --- /dev/null +++ b/x-pack/plugins/infra/public/utils/navigation_warning_prompt/context.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, { useState } from 'react'; +import { createContext, useContext } from 'react'; + +interface ContextValues { + prompt?: string; + setPrompt: (prompt: string | undefined) => void; +} + +export const NavigationWarningPromptContext = createContext({ + setPrompt: (prompt: string | undefined) => {}, +}); + +export const useNavigationWarningPrompt = () => { + return useContext(NavigationWarningPromptContext); +}; + +export const NavigationWarningPromptProvider: React.FC = ({ children }) => { + const [prompt, setPrompt] = useState(undefined); + + return ( + + {children} + + ); +}; diff --git a/x-pack/plugins/infra/public/utils/navigation_warning_prompt/index.ts b/x-pack/plugins/infra/public/utils/navigation_warning_prompt/index.ts new file mode 100644 index 0000000000000..dcdbf8e912a83 --- /dev/null +++ b/x-pack/plugins/infra/public/utils/navigation_warning_prompt/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 './context'; +export * from './prompt'; diff --git a/x-pack/plugins/infra/public/utils/navigation_warning_prompt/prompt.tsx b/x-pack/plugins/infra/public/utils/navigation_warning_prompt/prompt.tsx new file mode 100644 index 0000000000000..65ec4729c036d --- /dev/null +++ b/x-pack/plugins/infra/public/utils/navigation_warning_prompt/prompt.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, { useEffect } from 'react'; +import { useNavigationWarningPrompt } from './context'; + +interface Props { + prompt?: string; +} + +export const Prompt: React.FC = ({ prompt }) => { + const { setPrompt } = useNavigationWarningPrompt(); + + useEffect(() => { + setPrompt(prompt); + return () => { + setPrompt(undefined); + }; + }, [prompt, setPrompt]); + + return null; +}; From aa560353f8074c368f9e5b601164a5df8f7017cb Mon Sep 17 00:00:00 2001 From: Kaarina Tungseth Date: Wed, 22 Apr 2020 08:38:53 -0500 Subject: [PATCH 43/67] [DOCS] Adds dashboard controls options (#64079) --- docs/visualize/for-dashboard.asciidoc | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/docs/visualize/for-dashboard.asciidoc b/docs/visualize/for-dashboard.asciidoc index d6e39d35b7b23..400179e9ceae7 100644 --- a/docs/visualize/for-dashboard.asciidoc +++ b/docs/visualize/for-dashboard.asciidoc @@ -13,13 +13,29 @@ on a dashboard. You can add two types of interactive inputs: -* *Options list* - Filters content based on one or more specified options. The dropdown menu is dynamically populated with the results of a terms aggregation. For example, use the options list on the sample flight dashboard when you want to filter the data by origin city and destination city. +* *Options list* — Filters content based on one or more specified options. The dropdown menu is dynamically populated with the results of a terms aggregation. For example, use the options list on the sample flight dashboard when you want to filter the data by origin city and destination city. -* *Range slider* - Filters data within a specified range of numbers. The minimum and maximum values are dynamically populated with the results of a min and max aggregation. For example, use the range slider when you want to filter the sample flight dashboard by a specific average ticket price. +* *Range slider* — Filters data within a specified range of numbers. The minimum and maximum values are dynamically populated with the results of a min and max aggregation. For example, use the range slider when you want to filter the sample flight dashboard by a specific average ticket price. [role="screenshot"] image::images/dashboard-controls.png[] +[float] +[[controls-options]] +==== Controls options + +Configure the settings that apply to the interactive inputs on a dashboard. + +. Click *Options*, then configure the following: + +* *Update {kib} filters on each change* — When selected, all interactive inputs create filters that refresh the dashboard. When unselected, {kib} filters are created only when you click *Apply changes*. + +* *Use time filter* — When selected, the aggregations that generate the options list and time range are connected to the <>. + +* *Pin filters to global state* — When selected, all filters created by interacting with the inputs are automatically pinned. + +. Click *Update*. + [float] [[markdown-widget]] === Markdown From 91f7911d15ccb172319dd6b47290e4589c72db6d Mon Sep 17 00:00:00 2001 From: CJ Cenizal Date: Wed, 22 Apr 2020 07:15:25 -0700 Subject: [PATCH 44/67] Move CCR out of legacy (#62890) * Convert common/services and server/lib to TypeScript. Update Jest tests. - Remove deserializeAutoFollowPattern behavior that returned an empty object if the pattern was undefined. * Localize mocks with the component integration tests. * Update API unit tests to use NP mocks. - Break up test files. - Use inline mocked ES response instead of fixture files. - Move remaining fixture files into client integration tests directory. * Make API route validation more strict. * Publish isUiDisabled as part of Remote Clusters contract. * Default trackUiMetric service to be a no-op. * Remove security dependency. - Fix license check so that CCR won't render if the license is invalid. - Fix server security check to be more precise by checking if ES has security disabled. * Render timestamp for autofollow errors. --- .eslintrc.js | 2 +- .sass-lint.yml | 1 + x-pack/.i18nrc.json | 2 +- x-pack/index.js | 2 - .../common/constants/base_path.ts | 11 - .../common/constants/index.ts | 10 - .../common/constants/settings.ts | 18 - .../follower_index_serialization.test.js.snap | 128 ------- .../auto_follow_pattern_serialization.js | 41 -- .../follower_index_serialization.test.js | 175 --------- .../fixtures/auto_follow_pattern.js | 49 --- .../fixtures/es_errors.js | 45 --- .../fixtures/follower_index.js | 216 ----------- .../fixtures/index.js | 16 - .../cross_cluster_replication/index.js | 57 --- .../public/index.scss | 13 - .../public/main.html | 3 - .../public/np_ready/app/_app.scss | 14 - .../public/np_ready/app/index.js | 25 -- .../app/services/documentation_links.ts | 22 -- .../np_ready/app/services/notifications.ts | 20 - .../np_ready/app/services/track_ui_metric.js | 27 -- .../np_ready/extend_index_management.ts | 28 -- .../public/np_ready/plugin.ts | 44 --- .../public/register_routes.js | 94 ----- .../cross_cluster_replication_data.ts | 36 -- .../server/np_ready/index.ts | 11 - .../call_with_request_factory.js | 20 - .../lib/call_with_request_factory/index.js | 7 - .../lib/check_license/check_license.js | 70 ---- .../__tests__/wrap_es_error.test.js | 33 -- .../__tests__/is_es_error_factory.js | 44 --- .../is_es_error_factory.ts | 18 - .../license_pre_routing_factory.test.ts | 64 ---- .../license_pre_routing_factory.ts | 32 -- .../lib/register_license_checker/index.js | 7 - .../register_license_checker.js | 21 -- .../server/np_ready/plugin.ts | 38 -- .../api/__jest__/auto_follow_pattern.test.js | 330 ---------------- .../api/__jest__/follower_index.test.js | 312 --------------- .../np_ready/routes/api/__jest__/helpers.ts | 37 -- .../routes/api/auto_follow_pattern.ts | 301 --------------- .../server/np_ready/routes/api/ccr.ts | 112 ------ .../np_ready/routes/api/follower_index.ts | 357 ------------------ .../routes/map_to_kibana_http_error.ts | 26 -- .../server/np_ready/routes/types.ts | 13 - .../common/constants/index.ts | 44 +++ .../follower_index_serialization.test.ts.snap | 128 +++++++ ...auto_follow_pattern_serialization.test.ts} | 16 +- .../auto_follow_pattern_serialization.ts | 38 ++ .../follower_index_serialization.test.ts | 224 +++++++++++ .../services/follower_index_serialization.ts} | 27 +- .../common/services/utils.test.ts} | 0 .../common/services/utils.ts} | 11 +- .../cross_cluster_replication/common/types.ts | 186 +++++++++ .../cross_cluster_replication/kibana.json | 17 + .../auto_follow_pattern_add.test.js | 7 +- .../auto_follow_pattern_edit.test.js | 6 +- .../auto_follow_pattern_list.test.js | 15 +- .../fixtures/auto_follow_pattern.ts | 28 ++ .../fixtures/follower_index.ts | 70 ++++ .../follower_index_add.test.js | 9 +- .../follower_index_edit.test.js | 8 +- .../follower_indices_list.test.js | 6 +- .../auto_follow_pattern_add.helpers.js | 6 +- .../auto_follow_pattern_edit.helpers.js | 6 +- .../auto_follow_pattern_list.helpers.js | 6 +- .../client_integration/helpers/constants.js | 0 .../helpers/follower_index_add.helpers.js | 6 +- .../helpers/follower_index_edit.helpers.js | 6 +- .../helpers/follower_index_list.helpers.js | 6 +- .../helpers/home.helpers.js | 8 +- .../helpers/http_requests.js | 0 .../client_integration/helpers/index.js | 0 .../helpers/setup_environment.js | 2 +- .../__jest__/client_integration/home.test.js | 6 +- .../mocks}/breadcrumbs.mock.ts | 4 +- .../client_integration/mocks}/index.ts | 3 +- .../mocks/track_ui_metric.mock.ts | 13 + .../public/app/app.tsx} | 42 +-- .../auto_follow_pattern_form.test.js.snap | 0 ...to_follow_pattern_action_menu.container.ts | 0 .../auto_follow_pattern_action_menu.tsx | 2 +- .../auto_follow_pattern_action_menu/index.ts | 0 .../auto_follow_pattern_delete_provider.d.ts | 0 .../auto_follow_pattern_delete_provider.js | 2 +- .../components/auto_follow_pattern_form.js | 12 +- .../auto_follow_pattern_form.test.js | 0 .../auto_follow_pattern_indices_preview.js | 0 .../auto_follow_pattern_page_title.js | 0 .../auto_follow_pattern_request_flyout.js | 2 +- .../follower_index_form.test.js.snap | 0 .../advanced_settings_fields.js | 0 .../follower_index_form.js | 4 +- .../follower_index_form.test.js | 0 .../follower_index_request_flyout.js | 2 +- .../components/follower_index_form/index.js | 0 .../components/follower_index_page_title.js | 0 .../follower_index_pause_provider.js | 2 +- .../follower_index_resume_provider.js | 4 +- .../follower_index_unfollow_provider.js | 2 +- .../public}/app/components/form_entry_row.js | 0 .../public/app/components/index.d.ts} | 2 +- .../public}/app/components/index.js | 0 .../components/remote_clusters_form_field.js | 4 +- .../components/remote_clusters_provider.js | 0 .../public}/app/components/section_error.js | 0 .../public}/app/components/section_loading.js | 0 .../app/components/section_unauthorized.js | 0 .../public/app/constants/api.ts} | 0 .../public/app/constants/index.ts} | 0 .../public/app/constants/sections.ts} | 0 .../public/app/constants/ui_metric.ts} | 0 .../public/app/index.tsx | 52 +++ .../auto_follow_pattern_add.container.js | 0 .../auto_follow_pattern_add.js | 0 .../sections/auto_follow_pattern_add/index.js | 0 .../auto_follow_pattern_edit.container.js | 19 +- .../auto_follow_pattern_edit.js | 2 +- .../auto_follow_pattern_edit/index.js | 0 .../follower_index_add.container.js | 0 .../follower_index_add/follower_index_add.js | 0 .../app/sections/follower_index_add/index.js | 0 .../follower_index_edit.container.js | 0 .../follower_index_edit.js | 2 +- .../app/sections/follower_index_edit/index.js | 0 .../auto_follow_pattern_list.container.js | 0 .../auto_follow_pattern_list.js | 2 +- .../auto_follow_pattern_table.container.js | 0 .../auto_follow_pattern_table.js | 6 +- .../auto_follow_pattern_table/index.js | 0 .../detail_panel/detail_panel.container.js | 0 .../components/detail_panel/detail_panel.js | 5 +- .../components/detail_panel/index.js | 0 .../components/index.js | 0 .../home/auto_follow_pattern_list/index.js | 0 .../components/context_menu/context_menu.js | 2 +- .../components/context_menu/index.js | 0 .../detail_panel/detail_panel.container.js | 0 .../components/detail_panel/detail_panel.js | 3 +- .../components/detail_panel/index.js | 0 .../follower_indices_table.container.js | 0 .../follower_indices_table.js | 6 +- .../follower_indices_table/index.js | 0 .../follower_indices_list/components/index.js | 0 .../follower_indices_list.container.js | 0 .../follower_indices_list.js | 2 +- .../home/follower_indices_list/index.js | 0 .../app/sections/home/home.container.js | 0 .../public}/app/sections/home/home.js | 4 +- .../public}/app/sections/home/index.js | 0 .../public/app/sections/index.d.ts} | 9 +- .../public}/app/sections/index.js | 0 ...uto_follow_pattern_validators.test.js.snap | 0 .../public}/app/services/api.js | 4 +- .../app/services/auto_follow_errors.js | 3 +- .../app/services/auto_follow_errors.test.js | 0 .../app/services/auto_follow_pattern.js | 0 .../app/services/auto_follow_pattern.test.js | 0 .../auto_follow_pattern_validators.js | 4 +- .../auto_follow_pattern_validators.test.js | 0 .../public}/app/services/breadcrumbs.ts | 22 +- .../app/services/documentation_links.ts | 16 + .../follower_index_default_settings.js | 2 +- .../app/services/get_remote_cluster_name.js | 0 .../public}/app/services/input_validation.js | 2 +- .../public/app/services/notifications.ts | 18 + .../public}/app/services/query_params.js | 0 .../public/app/services/routing.d.ts} | 2 +- .../public}/app/services/routing.js | 13 +- .../public/app/services/track_ui_metric.ts | 37 ++ .../public}/app/services/utils.js | 0 .../public}/app/services/utils.test.js | 0 .../public}/app/store/action_types.js | 0 .../public}/app/store/actions/api.js | 0 .../app/store/actions/auto_follow_pattern.js | 18 +- .../public}/app/store/actions/ccr.js | 0 .../app/store/actions/follower_index.js | 21 +- .../public}/app/store/actions/index.js | 0 .../public/app/store/index.d.ts} | 2 +- .../public}/app/store/index.js | 0 .../public}/app/store/reducers/api.js | 0 .../public}/app/store/reducers/api.test.js | 0 .../app/store/reducers/auto_follow_pattern.js | 0 .../app/store/reducers/follower_index.js | 0 .../public}/app/store/reducers/index.js | 0 .../public}/app/store/reducers/stats.js | 0 .../public}/app/store/selectors/index.js | 0 .../public}/app/store/store.js | 0 .../public}/index.ts | 5 +- .../public/plugin.ts | 102 +++++ .../cross_cluster_replication/public/types.ts | 25 ++ .../server/client/elasticsearch_ccr.ts} | 2 +- .../server/config.ts | 16 + .../cross_cluster_replication/server/index.ts | 19 + .../ccr_stats_serialization.test.ts.snap} | 2 + .../lib/ccr_stats_serialization.test.ts} | 2 + .../server/lib/ccr_stats_serialization.ts} | 19 +- .../server/lib/format_es_error.ts} | 13 + .../server}/lib/is_es_error.ts | 0 .../server/plugin.ts | 139 +++++++ .../routes/api/auto_follow_pattern/index.ts | 24 ++ .../register_create_route.test.ts | 74 ++++ .../register_create_route.ts | 77 ++++ .../register_delete_route.test.ts | 87 +++++ .../register_delete_route.ts | 67 ++++ .../register_fetch_route.test.ts | 69 ++++ .../register_fetch_route.ts | 43 +++ .../register_get_route.test.ts | 67 ++++ .../auto_follow_pattern/register_get_route.ts | 54 +++ .../register_pause_route.test.ts | 86 +++++ .../register_pause_route.ts | 66 ++++ .../register_resume_route.test.ts | 86 +++++ .../register_resume_route.ts | 66 ++++ .../register_update_route.test.ts | 64 ++++ .../register_update_route.ts | 60 +++ .../api/cross_cluster_replication/index.ts | 14 + .../register_permissions_route.ts | 70 ++++ .../register_stats_route.ts | 42 +++ .../server/routes/api/follower_index/index.ts | 24 ++ .../register_create_route.test.ts | 54 +++ .../follower_index/register_create_route.ts | 65 ++++ .../register_fetch_route.test.ts | 160 ++++++++ .../follower_index/register_fetch_route.ts | 62 +++ .../follower_index/register_get_route.test.ts | 159 ++++++++ .../api/follower_index/register_get_route.ts | 78 ++++ .../register_pause_route.test.ts | 86 +++++ .../follower_index/register_pause_route.ts | 64 ++++ .../register_resume_route.test.ts | 86 +++++ .../follower_index/register_resume_route.ts | 64 ++++ .../register_unfollow_route.test.ts | 109 ++++++ .../follower_index/register_unfollow_route.ts | 95 +++++ .../follower_index/register_update_route.ts | 93 +++++ .../server/routes/api/test_lib.ts | 23 ++ .../server/routes/index.ts} | 13 +- .../server/services/add_base_path.ts} | 6 +- .../server/services}/index.ts | 3 +- .../server/services/license.ts | 93 +++++ .../cross_cluster_replication/server/types.ts | 28 ++ .../application/services/notification.ts | 8 +- .../plugins/remote_clusters/public/index.ts | 3 + .../plugins/remote_clusters/public/plugin.ts | 11 +- .../plugins/remote_clusters/server/index.ts | 1 + .../plugins/remote_clusters/server/plugin.ts | 18 +- .../translations/translations/ja-JP.json | 9 +- .../translations/translations/zh-CN.json | 9 +- .../auto_follow_pattern.helpers.js | 20 +- .../auto_follow_pattern.js | 57 +-- .../cross_cluster_replication/fixtures.js | 7 - .../follower_indices.js | 8 +- .../management/index_management/indices.js | 8 +- 251 files changed, 3972 insertions(+), 3234 deletions(-) delete mode 100644 x-pack/legacy/plugins/cross_cluster_replication/common/constants/base_path.ts delete mode 100644 x-pack/legacy/plugins/cross_cluster_replication/common/constants/index.ts delete mode 100644 x-pack/legacy/plugins/cross_cluster_replication/common/constants/settings.ts delete mode 100644 x-pack/legacy/plugins/cross_cluster_replication/common/services/__snapshots__/follower_index_serialization.test.js.snap delete mode 100644 x-pack/legacy/plugins/cross_cluster_replication/common/services/auto_follow_pattern_serialization.js delete mode 100644 x-pack/legacy/plugins/cross_cluster_replication/common/services/follower_index_serialization.test.js delete mode 100644 x-pack/legacy/plugins/cross_cluster_replication/fixtures/auto_follow_pattern.js delete mode 100644 x-pack/legacy/plugins/cross_cluster_replication/fixtures/es_errors.js delete mode 100644 x-pack/legacy/plugins/cross_cluster_replication/fixtures/follower_index.js delete mode 100644 x-pack/legacy/plugins/cross_cluster_replication/fixtures/index.js delete mode 100644 x-pack/legacy/plugins/cross_cluster_replication/index.js delete mode 100644 x-pack/legacy/plugins/cross_cluster_replication/public/index.scss delete mode 100644 x-pack/legacy/plugins/cross_cluster_replication/public/main.html delete mode 100644 x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/_app.scss delete mode 100644 x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/index.js delete mode 100644 x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/services/documentation_links.ts delete mode 100644 x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/services/notifications.ts delete mode 100644 x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/services/track_ui_metric.js delete mode 100644 x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/extend_index_management.ts delete mode 100644 x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/plugin.ts delete mode 100644 x-pack/legacy/plugins/cross_cluster_replication/public/register_routes.js delete mode 100644 x-pack/legacy/plugins/cross_cluster_replication/server/np_ready/cross_cluster_replication_data.ts delete mode 100644 x-pack/legacy/plugins/cross_cluster_replication/server/np_ready/index.ts delete mode 100644 x-pack/legacy/plugins/cross_cluster_replication/server/np_ready/lib/call_with_request_factory/call_with_request_factory.js delete mode 100644 x-pack/legacy/plugins/cross_cluster_replication/server/np_ready/lib/call_with_request_factory/index.js delete mode 100644 x-pack/legacy/plugins/cross_cluster_replication/server/np_ready/lib/check_license/check_license.js delete mode 100644 x-pack/legacy/plugins/cross_cluster_replication/server/np_ready/lib/error_wrappers/__tests__/wrap_es_error.test.js delete mode 100644 x-pack/legacy/plugins/cross_cluster_replication/server/np_ready/lib/is_es_error_factory/__tests__/is_es_error_factory.js delete mode 100644 x-pack/legacy/plugins/cross_cluster_replication/server/np_ready/lib/is_es_error_factory/is_es_error_factory.ts delete mode 100644 x-pack/legacy/plugins/cross_cluster_replication/server/np_ready/lib/license_pre_routing_factory/__jest__/license_pre_routing_factory.test.ts delete mode 100644 x-pack/legacy/plugins/cross_cluster_replication/server/np_ready/lib/license_pre_routing_factory/license_pre_routing_factory.ts delete mode 100644 x-pack/legacy/plugins/cross_cluster_replication/server/np_ready/lib/register_license_checker/index.js delete mode 100644 x-pack/legacy/plugins/cross_cluster_replication/server/np_ready/lib/register_license_checker/register_license_checker.js delete mode 100644 x-pack/legacy/plugins/cross_cluster_replication/server/np_ready/plugin.ts delete mode 100644 x-pack/legacy/plugins/cross_cluster_replication/server/np_ready/routes/api/__jest__/auto_follow_pattern.test.js delete mode 100644 x-pack/legacy/plugins/cross_cluster_replication/server/np_ready/routes/api/__jest__/follower_index.test.js delete mode 100644 x-pack/legacy/plugins/cross_cluster_replication/server/np_ready/routes/api/__jest__/helpers.ts delete mode 100644 x-pack/legacy/plugins/cross_cluster_replication/server/np_ready/routes/api/auto_follow_pattern.ts delete mode 100644 x-pack/legacy/plugins/cross_cluster_replication/server/np_ready/routes/api/ccr.ts delete mode 100644 x-pack/legacy/plugins/cross_cluster_replication/server/np_ready/routes/api/follower_index.ts delete mode 100644 x-pack/legacy/plugins/cross_cluster_replication/server/np_ready/routes/map_to_kibana_http_error.ts delete mode 100644 x-pack/legacy/plugins/cross_cluster_replication/server/np_ready/routes/types.ts create mode 100644 x-pack/plugins/cross_cluster_replication/common/constants/index.ts create mode 100644 x-pack/plugins/cross_cluster_replication/common/services/__snapshots__/follower_index_serialization.test.ts.snap rename x-pack/{legacy/plugins/cross_cluster_replication/common/services/auto_follow_pattern_serialization.test.js => plugins/cross_cluster_replication/common/services/auto_follow_pattern_serialization.test.ts} (85%) create mode 100644 x-pack/plugins/cross_cluster_replication/common/services/auto_follow_pattern_serialization.ts create mode 100644 x-pack/plugins/cross_cluster_replication/common/services/follower_index_serialization.test.ts rename x-pack/{legacy/plugins/cross_cluster_replication/common/services/follower_index_serialization.js => plugins/cross_cluster_replication/common/services/follower_index_serialization.ts} (87%) rename x-pack/{legacy/plugins/cross_cluster_replication/common/services/utils.test.js => plugins/cross_cluster_replication/common/services/utils.test.ts} (100%) rename x-pack/{legacy/plugins/cross_cluster_replication/common/services/utils.js => plugins/cross_cluster_replication/common/services/utils.ts} (62%) create mode 100644 x-pack/plugins/cross_cluster_replication/common/types.ts create mode 100644 x-pack/plugins/cross_cluster_replication/kibana.json rename x-pack/{legacy/plugins/cross_cluster_replication => plugins/cross_cluster_replication/public}/__jest__/client_integration/auto_follow_pattern_add.test.js (98%) rename x-pack/{legacy/plugins/cross_cluster_replication => plugins/cross_cluster_replication/public}/__jest__/client_integration/auto_follow_pattern_edit.test.js (95%) rename x-pack/{legacy/plugins/cross_cluster_replication => plugins/cross_cluster_replication/public}/__jest__/client_integration/auto_follow_pattern_list.test.js (97%) create mode 100644 x-pack/plugins/cross_cluster_replication/public/__jest__/client_integration/fixtures/auto_follow_pattern.ts create mode 100644 x-pack/plugins/cross_cluster_replication/public/__jest__/client_integration/fixtures/follower_index.ts rename x-pack/{legacy/plugins/cross_cluster_replication => plugins/cross_cluster_replication/public}/__jest__/client_integration/follower_index_add.test.js (98%) rename x-pack/{legacy/plugins/cross_cluster_replication => plugins/cross_cluster_replication/public}/__jest__/client_integration/follower_index_edit.test.js (95%) rename x-pack/{legacy/plugins/cross_cluster_replication => plugins/cross_cluster_replication/public}/__jest__/client_integration/follower_indices_list.test.js (99%) rename x-pack/{legacy/plugins/cross_cluster_replication => plugins/cross_cluster_replication/public}/__jest__/client_integration/helpers/auto_follow_pattern_add.helpers.js (76%) rename x-pack/{legacy/plugins/cross_cluster_replication => plugins/cross_cluster_replication/public}/__jest__/client_integration/helpers/auto_follow_pattern_edit.helpers.js (82%) rename x-pack/{legacy/plugins/cross_cluster_replication => plugins/cross_cluster_replication/public}/__jest__/client_integration/helpers/auto_follow_pattern_list.helpers.js (92%) rename x-pack/{legacy/plugins/cross_cluster_replication => plugins/cross_cluster_replication/public}/__jest__/client_integration/helpers/constants.js (100%) rename x-pack/{legacy/plugins/cross_cluster_replication => plugins/cross_cluster_replication/public}/__jest__/client_integration/helpers/follower_index_add.helpers.js (79%) rename x-pack/{legacy/plugins/cross_cluster_replication => plugins/cross_cluster_replication/public}/__jest__/client_integration/helpers/follower_index_edit.helpers.js (84%) rename x-pack/{legacy/plugins/cross_cluster_replication => plugins/cross_cluster_replication/public}/__jest__/client_integration/helpers/follower_index_list.helpers.js (90%) rename x-pack/{legacy/plugins/cross_cluster_replication => plugins/cross_cluster_replication/public}/__jest__/client_integration/helpers/home.helpers.js (68%) rename x-pack/{legacy/plugins/cross_cluster_replication => plugins/cross_cluster_replication/public}/__jest__/client_integration/helpers/http_requests.js (100%) rename x-pack/{legacy/plugins/cross_cluster_replication => plugins/cross_cluster_replication/public}/__jest__/client_integration/helpers/index.js (100%) rename x-pack/{legacy/plugins/cross_cluster_replication => plugins/cross_cluster_replication/public}/__jest__/client_integration/helpers/setup_environment.js (91%) rename x-pack/{legacy/plugins/cross_cluster_replication => plugins/cross_cluster_replication/public}/__jest__/client_integration/home.test.js (93%) rename x-pack/{legacy/plugins/cross_cluster_replication/public/np_ready/app/services => plugins/cross_cluster_replication/public/__jest__/client_integration/mocks}/breadcrumbs.mock.ts (70%) rename x-pack/{legacy/plugins/cross_cluster_replication/server/np_ready/lib/is_es_error_factory => plugins/cross_cluster_replication/public/__jest__/client_integration/mocks}/index.ts (79%) create mode 100644 x-pack/plugins/cross_cluster_replication/public/__jest__/client_integration/mocks/track_ui_metric.mock.ts rename x-pack/{legacy/plugins/cross_cluster_replication/public/np_ready/app/app.js => plugins/cross_cluster_replication/public/app/app.tsx} (89%) rename x-pack/{legacy/plugins/cross_cluster_replication/public/np_ready => plugins/cross_cluster_replication/public}/app/components/__snapshots__/auto_follow_pattern_form.test.js.snap (100%) rename x-pack/{legacy/plugins/cross_cluster_replication/public/np_ready => plugins/cross_cluster_replication/public}/app/components/auto_follow_pattern_action_menu/auto_follow_pattern_action_menu.container.ts (100%) rename x-pack/{legacy/plugins/cross_cluster_replication/public/np_ready => plugins/cross_cluster_replication/public}/app/components/auto_follow_pattern_action_menu/auto_follow_pattern_action_menu.tsx (99%) rename x-pack/{legacy/plugins/cross_cluster_replication/public/np_ready => plugins/cross_cluster_replication/public}/app/components/auto_follow_pattern_action_menu/index.ts (100%) rename x-pack/{legacy/plugins/cross_cluster_replication/public/np_ready => plugins/cross_cluster_replication/public}/app/components/auto_follow_pattern_delete_provider.d.ts (100%) rename x-pack/{legacy/plugins/cross_cluster_replication/public/np_ready => plugins/cross_cluster_replication/public}/app/components/auto_follow_pattern_delete_provider.js (98%) rename x-pack/{legacy/plugins/cross_cluster_replication/public/np_ready => plugins/cross_cluster_replication/public}/app/components/auto_follow_pattern_form.js (98%) rename x-pack/{legacy/plugins/cross_cluster_replication/public/np_ready => plugins/cross_cluster_replication/public}/app/components/auto_follow_pattern_form.test.js (100%) rename x-pack/{legacy/plugins/cross_cluster_replication/public/np_ready => plugins/cross_cluster_replication/public}/app/components/auto_follow_pattern_indices_preview.js (100%) rename x-pack/{legacy/plugins/cross_cluster_replication/public/np_ready => plugins/cross_cluster_replication/public}/app/components/auto_follow_pattern_page_title.js (100%) rename x-pack/{legacy/plugins/cross_cluster_replication/public/np_ready => plugins/cross_cluster_replication/public}/app/components/auto_follow_pattern_request_flyout.js (96%) rename x-pack/{legacy/plugins/cross_cluster_replication/public/np_ready => plugins/cross_cluster_replication/public}/app/components/follower_index_form/__snapshots__/follower_index_form.test.js.snap (100%) rename x-pack/{legacy/plugins/cross_cluster_replication/public/np_ready => plugins/cross_cluster_replication/public}/app/components/follower_index_form/advanced_settings_fields.js (100%) rename x-pack/{legacy/plugins/cross_cluster_replication/public/np_ready => plugins/cross_cluster_replication/public}/app/components/follower_index_form/follower_index_form.js (99%) rename x-pack/{legacy/plugins/cross_cluster_replication/public/np_ready => plugins/cross_cluster_replication/public}/app/components/follower_index_form/follower_index_form.test.js (100%) rename x-pack/{legacy/plugins/cross_cluster_replication/public/np_ready => plugins/cross_cluster_replication/public}/app/components/follower_index_form/follower_index_request_flyout.js (96%) rename x-pack/{legacy/plugins/cross_cluster_replication/public/np_ready => plugins/cross_cluster_replication/public}/app/components/follower_index_form/index.js (100%) rename x-pack/{legacy/plugins/cross_cluster_replication/public/np_ready => plugins/cross_cluster_replication/public}/app/components/follower_index_page_title.js (100%) rename x-pack/{legacy/plugins/cross_cluster_replication/public/np_ready => plugins/cross_cluster_replication/public}/app/components/follower_index_pause_provider.js (98%) rename x-pack/{legacy/plugins/cross_cluster_replication/public/np_ready => plugins/cross_cluster_replication/public}/app/components/follower_index_resume_provider.js (97%) rename x-pack/{legacy/plugins/cross_cluster_replication/public/np_ready => plugins/cross_cluster_replication/public}/app/components/follower_index_unfollow_provider.js (98%) rename x-pack/{legacy/plugins/cross_cluster_replication/public/np_ready => plugins/cross_cluster_replication/public}/app/components/form_entry_row.js (100%) rename x-pack/{legacy/plugins/cross_cluster_replication/server/np_ready/lib/error_wrappers/index.ts => plugins/cross_cluster_replication/public/app/components/index.d.ts} (83%) rename x-pack/{legacy/plugins/cross_cluster_replication/public/np_ready => plugins/cross_cluster_replication/public}/app/components/index.js (100%) rename x-pack/{legacy/plugins/cross_cluster_replication/public/np_ready => plugins/cross_cluster_replication/public}/app/components/remote_clusters_form_field.js (98%) rename x-pack/{legacy/plugins/cross_cluster_replication/public/np_ready => plugins/cross_cluster_replication/public}/app/components/remote_clusters_provider.js (100%) rename x-pack/{legacy/plugins/cross_cluster_replication/public/np_ready => plugins/cross_cluster_replication/public}/app/components/section_error.js (100%) rename x-pack/{legacy/plugins/cross_cluster_replication/public/np_ready => plugins/cross_cluster_replication/public}/app/components/section_loading.js (100%) rename x-pack/{legacy/plugins/cross_cluster_replication/public/np_ready => plugins/cross_cluster_replication/public}/app/components/section_unauthorized.js (100%) rename x-pack/{legacy/plugins/cross_cluster_replication/public/np_ready/app/constants/api.js => plugins/cross_cluster_replication/public/app/constants/api.ts} (100%) rename x-pack/{legacy/plugins/cross_cluster_replication/public/np_ready/app/constants/index.js => plugins/cross_cluster_replication/public/app/constants/index.ts} (100%) rename x-pack/{legacy/plugins/cross_cluster_replication/public/np_ready/app/constants/sections.js => plugins/cross_cluster_replication/public/app/constants/sections.ts} (100%) rename x-pack/{legacy/plugins/cross_cluster_replication/public/np_ready/app/constants/ui_metric.js => plugins/cross_cluster_replication/public/app/constants/ui_metric.ts} (100%) create mode 100644 x-pack/plugins/cross_cluster_replication/public/app/index.tsx rename x-pack/{legacy/plugins/cross_cluster_replication/public/np_ready => plugins/cross_cluster_replication/public}/app/sections/auto_follow_pattern_add/auto_follow_pattern_add.container.js (100%) rename x-pack/{legacy/plugins/cross_cluster_replication/public/np_ready => plugins/cross_cluster_replication/public}/app/sections/auto_follow_pattern_add/auto_follow_pattern_add.js (100%) rename x-pack/{legacy/plugins/cross_cluster_replication/public/np_ready => plugins/cross_cluster_replication/public}/app/sections/auto_follow_pattern_add/index.js (100%) rename x-pack/{legacy/plugins/cross_cluster_replication/public/np_ready => plugins/cross_cluster_replication/public}/app/sections/auto_follow_pattern_edit/auto_follow_pattern_edit.container.js (80%) rename x-pack/{legacy/plugins/cross_cluster_replication/public/np_ready => plugins/cross_cluster_replication/public}/app/sections/auto_follow_pattern_edit/auto_follow_pattern_edit.js (99%) rename x-pack/{legacy/plugins/cross_cluster_replication/public/np_ready => plugins/cross_cluster_replication/public}/app/sections/auto_follow_pattern_edit/index.js (100%) rename x-pack/{legacy/plugins/cross_cluster_replication/public/np_ready => plugins/cross_cluster_replication/public}/app/sections/follower_index_add/follower_index_add.container.js (100%) rename x-pack/{legacy/plugins/cross_cluster_replication/public/np_ready => plugins/cross_cluster_replication/public}/app/sections/follower_index_add/follower_index_add.js (100%) rename x-pack/{legacy/plugins/cross_cluster_replication/public/np_ready => plugins/cross_cluster_replication/public}/app/sections/follower_index_add/index.js (100%) rename x-pack/{legacy/plugins/cross_cluster_replication/public/np_ready => plugins/cross_cluster_replication/public}/app/sections/follower_index_edit/follower_index_edit.container.js (100%) rename x-pack/{legacy/plugins/cross_cluster_replication/public/np_ready => plugins/cross_cluster_replication/public}/app/sections/follower_index_edit/follower_index_edit.js (99%) rename x-pack/{legacy/plugins/cross_cluster_replication/public/np_ready => plugins/cross_cluster_replication/public}/app/sections/follower_index_edit/index.js (100%) rename x-pack/{legacy/plugins/cross_cluster_replication/public/np_ready => plugins/cross_cluster_replication/public}/app/sections/home/auto_follow_pattern_list/auto_follow_pattern_list.container.js (100%) rename x-pack/{legacy/plugins/cross_cluster_replication/public/np_ready => plugins/cross_cluster_replication/public}/app/sections/home/auto_follow_pattern_list/auto_follow_pattern_list.js (99%) rename x-pack/{legacy/plugins/cross_cluster_replication/public/np_ready => plugins/cross_cluster_replication/public}/app/sections/home/auto_follow_pattern_list/components/auto_follow_pattern_table/auto_follow_pattern_table.container.js (100%) rename x-pack/{legacy/plugins/cross_cluster_replication/public/np_ready => plugins/cross_cluster_replication/public}/app/sections/home/auto_follow_pattern_list/components/auto_follow_pattern_table/auto_follow_pattern_table.js (97%) rename x-pack/{legacy/plugins/cross_cluster_replication/public/np_ready => plugins/cross_cluster_replication/public}/app/sections/home/auto_follow_pattern_list/components/auto_follow_pattern_table/index.js (100%) rename x-pack/{legacy/plugins/cross_cluster_replication/public/np_ready => plugins/cross_cluster_replication/public}/app/sections/home/auto_follow_pattern_list/components/detail_panel/detail_panel.container.js (100%) rename x-pack/{legacy/plugins/cross_cluster_replication/public/np_ready => plugins/cross_cluster_replication/public}/app/sections/home/auto_follow_pattern_list/components/detail_panel/detail_panel.js (98%) rename x-pack/{legacy/plugins/cross_cluster_replication/public/np_ready => plugins/cross_cluster_replication/public}/app/sections/home/auto_follow_pattern_list/components/detail_panel/index.js (100%) rename x-pack/{legacy/plugins/cross_cluster_replication/public/np_ready => plugins/cross_cluster_replication/public}/app/sections/home/auto_follow_pattern_list/components/index.js (100%) rename x-pack/{legacy/plugins/cross_cluster_replication/public/np_ready => plugins/cross_cluster_replication/public}/app/sections/home/auto_follow_pattern_list/index.js (100%) rename x-pack/{legacy/plugins/cross_cluster_replication/public/np_ready => plugins/cross_cluster_replication/public}/app/sections/home/follower_indices_list/components/context_menu/context_menu.js (98%) rename x-pack/{legacy/plugins/cross_cluster_replication/public/np_ready => plugins/cross_cluster_replication/public}/app/sections/home/follower_indices_list/components/context_menu/index.js (100%) rename x-pack/{legacy/plugins/cross_cluster_replication/public/np_ready => plugins/cross_cluster_replication/public}/app/sections/home/follower_indices_list/components/detail_panel/detail_panel.container.js (100%) rename x-pack/{legacy/plugins/cross_cluster_replication/public/np_ready => plugins/cross_cluster_replication/public}/app/sections/home/follower_indices_list/components/detail_panel/detail_panel.js (99%) rename x-pack/{legacy/plugins/cross_cluster_replication/public/np_ready => plugins/cross_cluster_replication/public}/app/sections/home/follower_indices_list/components/detail_panel/index.js (100%) rename x-pack/{legacy/plugins/cross_cluster_replication/public/np_ready => plugins/cross_cluster_replication/public}/app/sections/home/follower_indices_list/components/follower_indices_table/follower_indices_table.container.js (100%) rename x-pack/{legacy/plugins/cross_cluster_replication/public/np_ready => plugins/cross_cluster_replication/public}/app/sections/home/follower_indices_list/components/follower_indices_table/follower_indices_table.js (97%) rename x-pack/{legacy/plugins/cross_cluster_replication/public/np_ready => plugins/cross_cluster_replication/public}/app/sections/home/follower_indices_list/components/follower_indices_table/index.js (100%) rename x-pack/{legacy/plugins/cross_cluster_replication/public/np_ready => plugins/cross_cluster_replication/public}/app/sections/home/follower_indices_list/components/index.js (100%) rename x-pack/{legacy/plugins/cross_cluster_replication/public/np_ready => plugins/cross_cluster_replication/public}/app/sections/home/follower_indices_list/follower_indices_list.container.js (100%) rename x-pack/{legacy/plugins/cross_cluster_replication/public/np_ready => plugins/cross_cluster_replication/public}/app/sections/home/follower_indices_list/follower_indices_list.js (99%) rename x-pack/{legacy/plugins/cross_cluster_replication/public/np_ready => plugins/cross_cluster_replication/public}/app/sections/home/follower_indices_list/index.js (100%) rename x-pack/{legacy/plugins/cross_cluster_replication/public/np_ready => plugins/cross_cluster_replication/public}/app/sections/home/home.container.js (100%) rename x-pack/{legacy/plugins/cross_cluster_replication/public/np_ready => plugins/cross_cluster_replication/public}/app/sections/home/home.js (96%) rename x-pack/{legacy/plugins/cross_cluster_replication/public/np_ready => plugins/cross_cluster_replication/public}/app/sections/home/index.js (100%) rename x-pack/{legacy/plugins/cross_cluster_replication/common/constants/app.ts => plugins/cross_cluster_replication/public/app/sections/index.d.ts} (50%) rename x-pack/{legacy/plugins/cross_cluster_replication/public/np_ready => plugins/cross_cluster_replication/public}/app/sections/index.js (100%) rename x-pack/{legacy/plugins/cross_cluster_replication/public/np_ready => plugins/cross_cluster_replication/public}/app/services/__snapshots__/auto_follow_pattern_validators.test.js.snap (100%) rename x-pack/{legacy/plugins/cross_cluster_replication/public/np_ready => plugins/cross_cluster_replication/public}/app/services/api.js (98%) rename x-pack/{legacy/plugins/cross_cluster_replication/public/np_ready => plugins/cross_cluster_replication/public}/app/services/auto_follow_errors.js (92%) rename x-pack/{legacy/plugins/cross_cluster_replication/public/np_ready => plugins/cross_cluster_replication/public}/app/services/auto_follow_errors.test.js (100%) rename x-pack/{legacy/plugins/cross_cluster_replication/public/np_ready => plugins/cross_cluster_replication/public}/app/services/auto_follow_pattern.js (100%) rename x-pack/{legacy/plugins/cross_cluster_replication/public/np_ready => plugins/cross_cluster_replication/public}/app/services/auto_follow_pattern.test.js (100%) rename x-pack/{legacy/plugins/cross_cluster_replication/public/np_ready => plugins/cross_cluster_replication/public}/app/services/auto_follow_pattern_validators.js (97%) rename x-pack/{legacy/plugins/cross_cluster_replication/public/np_ready => plugins/cross_cluster_replication/public}/app/services/auto_follow_pattern_validators.test.js (100%) rename x-pack/{legacy/plugins/cross_cluster_replication/public/np_ready => plugins/cross_cluster_replication/public}/app/services/breadcrumbs.ts (62%) create mode 100644 x-pack/plugins/cross_cluster_replication/public/app/services/documentation_links.ts rename x-pack/{legacy/plugins/cross_cluster_replication/public/np_ready => plugins/cross_cluster_replication/public}/app/services/follower_index_default_settings.js (89%) rename x-pack/{legacy/plugins/cross_cluster_replication/public/np_ready => plugins/cross_cluster_replication/public}/app/services/get_remote_cluster_name.js (100%) rename x-pack/{legacy/plugins/cross_cluster_replication/public/np_ready => plugins/cross_cluster_replication/public}/app/services/input_validation.js (97%) create mode 100644 x-pack/plugins/cross_cluster_replication/public/app/services/notifications.ts rename x-pack/{legacy/plugins/cross_cluster_replication/public/np_ready => plugins/cross_cluster_replication/public}/app/services/query_params.js (100%) rename x-pack/{legacy/plugins/cross_cluster_replication/public/index.js => plugins/cross_cluster_replication/public/app/services/routing.d.ts} (87%) rename x-pack/{legacy/plugins/cross_cluster_replication/public/np_ready => plugins/cross_cluster_replication/public}/app/services/routing.js (93%) create mode 100644 x-pack/plugins/cross_cluster_replication/public/app/services/track_ui_metric.ts rename x-pack/{legacy/plugins/cross_cluster_replication/public/np_ready => plugins/cross_cluster_replication/public}/app/services/utils.js (100%) rename x-pack/{legacy/plugins/cross_cluster_replication/public/np_ready => plugins/cross_cluster_replication/public}/app/services/utils.test.js (100%) rename x-pack/{legacy/plugins/cross_cluster_replication/public/np_ready => plugins/cross_cluster_replication/public}/app/store/action_types.js (100%) rename x-pack/{legacy/plugins/cross_cluster_replication/public/np_ready => plugins/cross_cluster_replication/public}/app/store/actions/api.js (100%) rename x-pack/{legacy/plugins/cross_cluster_replication/public/np_ready => plugins/cross_cluster_replication/public}/app/store/actions/auto_follow_pattern.js (95%) rename x-pack/{legacy/plugins/cross_cluster_replication/public/np_ready => plugins/cross_cluster_replication/public}/app/store/actions/ccr.js (100%) rename x-pack/{legacy/plugins/cross_cluster_replication/public/np_ready => plugins/cross_cluster_replication/public}/app/store/actions/follower_index.js (94%) rename x-pack/{legacy/plugins/cross_cluster_replication/public/np_ready => plugins/cross_cluster_replication/public}/app/store/actions/index.js (100%) rename x-pack/{legacy/plugins/cross_cluster_replication/server/np_ready/lib/check_license/index.js => plugins/cross_cluster_replication/public/app/store/index.d.ts} (83%) rename x-pack/{legacy/plugins/cross_cluster_replication/public/np_ready => plugins/cross_cluster_replication/public}/app/store/index.js (100%) rename x-pack/{legacy/plugins/cross_cluster_replication/public/np_ready => plugins/cross_cluster_replication/public}/app/store/reducers/api.js (100%) rename x-pack/{legacy/plugins/cross_cluster_replication/public/np_ready => plugins/cross_cluster_replication/public}/app/store/reducers/api.test.js (100%) rename x-pack/{legacy/plugins/cross_cluster_replication/public/np_ready => plugins/cross_cluster_replication/public}/app/store/reducers/auto_follow_pattern.js (100%) rename x-pack/{legacy/plugins/cross_cluster_replication/public/np_ready => plugins/cross_cluster_replication/public}/app/store/reducers/follower_index.js (100%) rename x-pack/{legacy/plugins/cross_cluster_replication/public/np_ready => plugins/cross_cluster_replication/public}/app/store/reducers/index.js (100%) rename x-pack/{legacy/plugins/cross_cluster_replication/public/np_ready => plugins/cross_cluster_replication/public}/app/store/reducers/stats.js (100%) rename x-pack/{legacy/plugins/cross_cluster_replication/public/np_ready => plugins/cross_cluster_replication/public}/app/store/selectors/index.js (100%) rename x-pack/{legacy/plugins/cross_cluster_replication/public/np_ready => plugins/cross_cluster_replication/public}/app/store/store.js (100%) rename x-pack/{legacy/plugins/cross_cluster_replication/public/np_ready => plugins/cross_cluster_replication/public}/index.ts (61%) create mode 100644 x-pack/plugins/cross_cluster_replication/public/plugin.ts create mode 100644 x-pack/plugins/cross_cluster_replication/public/types.ts rename x-pack/{legacy/plugins/cross_cluster_replication/server/np_ready/client/elasticsearch_ccr.js => plugins/cross_cluster_replication/server/client/elasticsearch_ccr.ts} (97%) create mode 100644 x-pack/plugins/cross_cluster_replication/server/config.ts create mode 100644 x-pack/plugins/cross_cluster_replication/server/index.ts rename x-pack/{legacy/plugins/cross_cluster_replication/server/np_ready/lib/__snapshots__/ccr_stats_serialization.test.js.snap => plugins/cross_cluster_replication/server/lib/__snapshots__/ccr_stats_serialization.test.ts.snap} (93%) rename x-pack/{legacy/plugins/cross_cluster_replication/server/np_ready/lib/ccr_stats_serialization.test.js => plugins/cross_cluster_replication/server/lib/ccr_stats_serialization.test.ts} (95%) rename x-pack/{legacy/plugins/cross_cluster_replication/server/np_ready/lib/ccr_stats_serialization.js => plugins/cross_cluster_replication/server/lib/ccr_stats_serialization.ts} (77%) rename x-pack/{legacy/plugins/cross_cluster_replication/server/np_ready/lib/error_wrappers/wrap_es_error.ts => plugins/cross_cluster_replication/server/lib/format_es_error.ts} (90%) rename x-pack/{legacy/plugins/cross_cluster_replication/server/np_ready => plugins/cross_cluster_replication/server}/lib/is_es_error.ts (100%) create mode 100644 x-pack/plugins/cross_cluster_replication/server/plugin.ts create mode 100644 x-pack/plugins/cross_cluster_replication/server/routes/api/auto_follow_pattern/index.ts create mode 100644 x-pack/plugins/cross_cluster_replication/server/routes/api/auto_follow_pattern/register_create_route.test.ts create mode 100644 x-pack/plugins/cross_cluster_replication/server/routes/api/auto_follow_pattern/register_create_route.ts create mode 100644 x-pack/plugins/cross_cluster_replication/server/routes/api/auto_follow_pattern/register_delete_route.test.ts create mode 100644 x-pack/plugins/cross_cluster_replication/server/routes/api/auto_follow_pattern/register_delete_route.ts create mode 100644 x-pack/plugins/cross_cluster_replication/server/routes/api/auto_follow_pattern/register_fetch_route.test.ts create mode 100644 x-pack/plugins/cross_cluster_replication/server/routes/api/auto_follow_pattern/register_fetch_route.ts create mode 100644 x-pack/plugins/cross_cluster_replication/server/routes/api/auto_follow_pattern/register_get_route.test.ts create mode 100644 x-pack/plugins/cross_cluster_replication/server/routes/api/auto_follow_pattern/register_get_route.ts create mode 100644 x-pack/plugins/cross_cluster_replication/server/routes/api/auto_follow_pattern/register_pause_route.test.ts create mode 100644 x-pack/plugins/cross_cluster_replication/server/routes/api/auto_follow_pattern/register_pause_route.ts create mode 100644 x-pack/plugins/cross_cluster_replication/server/routes/api/auto_follow_pattern/register_resume_route.test.ts create mode 100644 x-pack/plugins/cross_cluster_replication/server/routes/api/auto_follow_pattern/register_resume_route.ts create mode 100644 x-pack/plugins/cross_cluster_replication/server/routes/api/auto_follow_pattern/register_update_route.test.ts create mode 100644 x-pack/plugins/cross_cluster_replication/server/routes/api/auto_follow_pattern/register_update_route.ts create mode 100644 x-pack/plugins/cross_cluster_replication/server/routes/api/cross_cluster_replication/index.ts create mode 100644 x-pack/plugins/cross_cluster_replication/server/routes/api/cross_cluster_replication/register_permissions_route.ts create mode 100644 x-pack/plugins/cross_cluster_replication/server/routes/api/cross_cluster_replication/register_stats_route.ts create mode 100644 x-pack/plugins/cross_cluster_replication/server/routes/api/follower_index/index.ts create mode 100644 x-pack/plugins/cross_cluster_replication/server/routes/api/follower_index/register_create_route.test.ts create mode 100644 x-pack/plugins/cross_cluster_replication/server/routes/api/follower_index/register_create_route.ts create mode 100644 x-pack/plugins/cross_cluster_replication/server/routes/api/follower_index/register_fetch_route.test.ts create mode 100644 x-pack/plugins/cross_cluster_replication/server/routes/api/follower_index/register_fetch_route.ts create mode 100644 x-pack/plugins/cross_cluster_replication/server/routes/api/follower_index/register_get_route.test.ts create mode 100644 x-pack/plugins/cross_cluster_replication/server/routes/api/follower_index/register_get_route.ts create mode 100644 x-pack/plugins/cross_cluster_replication/server/routes/api/follower_index/register_pause_route.test.ts create mode 100644 x-pack/plugins/cross_cluster_replication/server/routes/api/follower_index/register_pause_route.ts create mode 100644 x-pack/plugins/cross_cluster_replication/server/routes/api/follower_index/register_resume_route.test.ts create mode 100644 x-pack/plugins/cross_cluster_replication/server/routes/api/follower_index/register_resume_route.ts create mode 100644 x-pack/plugins/cross_cluster_replication/server/routes/api/follower_index/register_unfollow_route.test.ts create mode 100644 x-pack/plugins/cross_cluster_replication/server/routes/api/follower_index/register_unfollow_route.ts create mode 100644 x-pack/plugins/cross_cluster_replication/server/routes/api/follower_index/register_update_route.ts create mode 100644 x-pack/plugins/cross_cluster_replication/server/routes/api/test_lib.ts rename x-pack/{legacy/plugins/cross_cluster_replication/server/np_ready/routes/register_routes.ts => plugins/cross_cluster_replication/server/routes/index.ts} (52%) rename x-pack/{legacy/plugins/cross_cluster_replication/common/constants/plugin.ts => plugins/cross_cluster_replication/server/services/add_base_path.ts} (64%) rename x-pack/{legacy/plugins/cross_cluster_replication/server/np_ready/lib/license_pre_routing_factory => plugins/cross_cluster_replication/server/services}/index.ts (74%) create mode 100644 x-pack/plugins/cross_cluster_replication/server/services/license.ts create mode 100644 x-pack/plugins/cross_cluster_replication/server/types.ts diff --git a/.eslintrc.js b/.eslintrc.js index a2b8ae7622d0b..b3a1274d1cbeb 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -96,7 +96,7 @@ module.exports = { }, }, { - files: ['x-pack/legacy/plugins/cross_cluster_replication/**/*.{js,ts,tsx}'], + files: ['x-pack/plugins/cross_cluster_replication/**/*.{js,ts,tsx}'], rules: { 'jsx-a11y/click-events-have-key-events': 'off', }, diff --git a/.sass-lint.yml b/.sass-lint.yml index 5c2c88a1dad5d..89735342a2d6f 100644 --- a/.sass-lint.yml +++ b/.sass-lint.yml @@ -9,6 +9,7 @@ files: - 'x-pack/legacy/plugins/canvas/**/*.s+(a|c)ss' - 'x-pack/plugins/triggers_actions_ui/**/*.s+(a|c)ss' - 'x-pack/plugins/lens/**/*.s+(a|c)ss' + - 'x-pack/plugins/cross_cluster_replication/**/*.s+(a|c)ss' - 'x-pack/legacy/plugins/maps/**/*.s+(a|c)ss' - 'x-pack/plugins/maps/**/*.s+(a|c)ss' ignore: diff --git a/x-pack/.i18nrc.json b/x-pack/.i18nrc.json index c8715ac3447bd..8e5563e4ff674 100644 --- a/x-pack/.i18nrc.json +++ b/x-pack/.i18nrc.json @@ -8,7 +8,7 @@ "xpack.apm": ["legacy/plugins/apm", "plugins/apm"], "xpack.beatsManagement": "legacy/plugins/beats_management", "xpack.canvas": "legacy/plugins/canvas", - "xpack.crossClusterReplication": "legacy/plugins/cross_cluster_replication", + "xpack.crossClusterReplication": "plugins/cross_cluster_replication", "xpack.dashboardMode": "legacy/plugins/dashboard_mode", "xpack.data": "plugins/data_enhanced", "xpack.drilldowns": "plugins/drilldowns", diff --git a/x-pack/index.js b/x-pack/index.js index 1a78c24b1221b..43ae5c3e5c5dd 100644 --- a/x-pack/index.js +++ b/x-pack/index.js @@ -21,7 +21,6 @@ import { taskManager } from './legacy/plugins/task_manager'; import { rollup } from './legacy/plugins/rollup'; import { siem } from './legacy/plugins/siem'; import { remoteClusters } from './legacy/plugins/remote_clusters'; -import { crossClusterReplication } from './legacy/plugins/cross_cluster_replication'; import { upgradeAssistant } from './legacy/plugins/upgrade_assistant'; import { uptime } from './legacy/plugins/uptime'; import { encryptedSavedObjects } from './legacy/plugins/encrypted_saved_objects'; @@ -49,7 +48,6 @@ module.exports = function(kibana) { rollup(kibana), siem(kibana), remoteClusters(kibana), - crossClusterReplication(kibana), upgradeAssistant(kibana), uptime(kibana), encryptedSavedObjects(kibana), diff --git a/x-pack/legacy/plugins/cross_cluster_replication/common/constants/base_path.ts b/x-pack/legacy/plugins/cross_cluster_replication/common/constants/base_path.ts deleted file mode 100644 index 0a948793e07db..0000000000000 --- a/x-pack/legacy/plugins/cross_cluster_replication/common/constants/base_path.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. - */ - -export const BASE_PATH = '/management/elasticsearch/cross_cluster_replication'; -export const BASE_PATH_REMOTE_CLUSTERS = '/management/elasticsearch/remote_clusters'; -export const API_BASE_PATH = '/api/cross_cluster_replication'; -export const API_REMOTE_CLUSTERS_BASE_PATH = '/api/remote_clusters'; -export const API_INDEX_MANAGEMENT_BASE_PATH = '/api/index_management'; diff --git a/x-pack/legacy/plugins/cross_cluster_replication/common/constants/index.ts b/x-pack/legacy/plugins/cross_cluster_replication/common/constants/index.ts deleted file mode 100644 index 300afb4e2d2ff..0000000000000 --- a/x-pack/legacy/plugins/cross_cluster_replication/common/constants/index.ts +++ /dev/null @@ -1,10 +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. - */ - -export * from './plugin'; -export * from './base_path'; -export * from './app'; -export * from './settings'; diff --git a/x-pack/legacy/plugins/cross_cluster_replication/common/constants/settings.ts b/x-pack/legacy/plugins/cross_cluster_replication/common/constants/settings.ts deleted file mode 100644 index 0993a74c8f1fd..0000000000000 --- a/x-pack/legacy/plugins/cross_cluster_replication/common/constants/settings.ts +++ /dev/null @@ -1,18 +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. - */ - -export const FOLLOWER_INDEX_ADVANCED_SETTINGS = { - maxReadRequestOperationCount: 5120, - maxOutstandingReadRequests: 12, - maxReadRequestSize: '32mb', - maxWriteRequestOperationCount: 5120, - maxWriteRequestSize: '9223372036854775807b', - maxOutstandingWriteRequests: 9, - maxWriteBufferCount: 2147483647, - maxWriteBufferSize: '512mb', - maxRetryDelay: '500ms', - readPollTimeout: '1m', -}; diff --git a/x-pack/legacy/plugins/cross_cluster_replication/common/services/__snapshots__/follower_index_serialization.test.js.snap b/x-pack/legacy/plugins/cross_cluster_replication/common/services/__snapshots__/follower_index_serialization.test.js.snap deleted file mode 100644 index d001459e8234d..0000000000000 --- a/x-pack/legacy/plugins/cross_cluster_replication/common/services/__snapshots__/follower_index_serialization.test.js.snap +++ /dev/null @@ -1,128 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`[CCR] follower index serialization deserializeFollowerIndex() deserializes Elasticsearch follower index object 1`] = ` -Object { - "leaderIndex": undefined, - "maxOutstandingReadRequests": undefined, - "maxOutstandingWriteRequests": undefined, - "maxReadRequestOperationCount": undefined, - "maxReadRequestSize": undefined, - "maxRetryDelay": undefined, - "maxWriteBufferCount": undefined, - "maxWriteBufferSize": undefined, - "maxWriteRequestOperationCount": undefined, - "maxWriteRequestSize": undefined, - "name": undefined, - "readPollTimeout": undefined, - "remoteCluster": undefined, - "shards": Array [ - Object { - "bytesReadCount": undefined, - "failedReadRequestsCount": undefined, - "failedWriteRequestsCount": undefined, - "followerGlobalCheckpoint": undefined, - "followerMappingVersion": undefined, - "followerMaxSequenceNum": undefined, - "followerSettingsVersion": undefined, - "id": "shard 1", - "lastRequestedSequenceNum": undefined, - "leaderGlobalCheckpoint": undefined, - "leaderIndex": undefined, - "leaderMaxSequenceNum": undefined, - "operationsReadCount": undefined, - "operationsWrittenCount": undefined, - "outstandingReadRequestsCount": undefined, - "outstandingWriteRequestsCount": undefined, - "readExceptions": undefined, - "remoteCluster": undefined, - "successfulReadRequestCount": undefined, - "successfulWriteRequestsCount": undefined, - "timeSinceLastReadMs": undefined, - "totalReadRemoteExecTimeMs": undefined, - "totalReadTimeMs": undefined, - "totalWriteTimeMs": undefined, - "writeBufferOperationsCount": undefined, - "writeBufferSizeBytes": undefined, - }, - Object { - "bytesReadCount": undefined, - "failedReadRequestsCount": undefined, - "failedWriteRequestsCount": undefined, - "followerGlobalCheckpoint": undefined, - "followerMappingVersion": undefined, - "followerMaxSequenceNum": undefined, - "followerSettingsVersion": undefined, - "id": "shard 2", - "lastRequestedSequenceNum": undefined, - "leaderGlobalCheckpoint": undefined, - "leaderIndex": undefined, - "leaderMaxSequenceNum": undefined, - "operationsReadCount": undefined, - "operationsWrittenCount": undefined, - "outstandingReadRequestsCount": undefined, - "outstandingWriteRequestsCount": undefined, - "readExceptions": undefined, - "remoteCluster": undefined, - "successfulReadRequestCount": undefined, - "successfulWriteRequestsCount": undefined, - "timeSinceLastReadMs": undefined, - "totalReadRemoteExecTimeMs": undefined, - "totalReadTimeMs": undefined, - "totalWriteTimeMs": undefined, - "writeBufferOperationsCount": undefined, - "writeBufferSizeBytes": undefined, - }, - ], - "status": "active", -} -`; - -exports[`[CCR] follower index serialization deserializeShard() deserializes shard 1`] = ` -Object { - "bytesReadCount": "bytes read", - "failedReadRequestsCount": "failed read requests", - "failedWriteRequestsCount": "failed write requests", - "followerGlobalCheckpoint": "follower global checkpoint", - "followerMappingVersion": "follower mapping version", - "followerMaxSequenceNum": "follower max seq no", - "followerSettingsVersion": "follower settings version", - "id": "shard id", - "lastRequestedSequenceNum": "last requested seq no", - "leaderGlobalCheckpoint": "leader global checkpoint", - "leaderIndex": "leader index", - "leaderMaxSequenceNum": "leader max seq no", - "operationsReadCount": "operations read", - "operationsWrittenCount": "operations written", - "outstandingReadRequestsCount": "outstanding read requests", - "outstandingWriteRequestsCount": "outstanding write requests", - "readExceptions": Array [ - "read exception", - ], - "remoteCluster": "remote cluster", - "successfulReadRequestCount": "successful read requests", - "successfulWriteRequestsCount": "successful write requests", - "timeSinceLastReadMs": "time since last read millis", - "totalReadRemoteExecTimeMs": "total read remote exec time millis", - "totalReadTimeMs": "total read time millis", - "totalWriteTimeMs": "total write time millis", - "writeBufferOperationsCount": "write buffer operation count", - "writeBufferSizeBytes": "write buffer size in bytes", -} -`; - -exports[`[CCR] follower index serialization serializeFollowerIndex() serializes object to Elasticsearch follower index object 1`] = ` -Object { - "leader_index": "leader index", - "max_outstanding_read_requests": "foo", - "max_outstanding_write_requests": "foo", - "max_read_request_operation_count": "foo", - "max_read_request_size": "foo", - "max_retry_delay": "foo", - "max_write_buffer_count": "foo", - "max_write_buffer_size": "foo", - "max_write_request_operation_count": "foo", - "max_write_request_size": "foo", - "read_poll_timeout": "foo", - "remote_cluster": "remote cluster", -} -`; diff --git a/x-pack/legacy/plugins/cross_cluster_replication/common/services/auto_follow_pattern_serialization.js b/x-pack/legacy/plugins/cross_cluster_replication/common/services/auto_follow_pattern_serialization.js deleted file mode 100644 index ae13c625a7d80..0000000000000 --- a/x-pack/legacy/plugins/cross_cluster_replication/common/services/auto_follow_pattern_serialization.js +++ /dev/null @@ -1,41 +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. - */ - -export const deserializeAutoFollowPattern = ( - { - name, - pattern: { - active, - // eslint-disable-next-line camelcase - remote_cluster, - // eslint-disable-next-line camelcase - leader_index_patterns, - // eslint-disable-next-line camelcase - follow_index_pattern, - }, - } = { - pattern: {}, - } -) => ({ - name, - active, - remoteCluster: remote_cluster, - leaderIndexPatterns: leader_index_patterns, - followIndexPattern: follow_index_pattern, -}); - -export const deserializeListAutoFollowPatterns = autoFollowPatterns => - autoFollowPatterns.map(deserializeAutoFollowPattern); - -export const serializeAutoFollowPattern = ({ - remoteCluster, - leaderIndexPatterns, - followIndexPattern, -}) => ({ - remote_cluster: remoteCluster, - leader_index_patterns: leaderIndexPatterns, - follow_index_pattern: followIndexPattern, -}); diff --git a/x-pack/legacy/plugins/cross_cluster_replication/common/services/follower_index_serialization.test.js b/x-pack/legacy/plugins/cross_cluster_replication/common/services/follower_index_serialization.test.js deleted file mode 100644 index e1df917d899ad..0000000000000 --- a/x-pack/legacy/plugins/cross_cluster_replication/common/services/follower_index_serialization.test.js +++ /dev/null @@ -1,175 +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 { - deserializeShard, - deserializeFollowerIndex, - deserializeListFollowerIndices, - serializeFollowerIndex, -} from './follower_index_serialization'; - -describe('[CCR] follower index serialization', () => { - describe('deserializeShard()', () => { - it('deserializes shard', () => { - const serializedShard = { - remote_cluster: 'remote cluster', - leader_index: 'leader index', - shard_id: 'shard id', - leader_global_checkpoint: 'leader global checkpoint', - leader_max_seq_no: 'leader max seq no', - follower_global_checkpoint: 'follower global checkpoint', - follower_max_seq_no: 'follower max seq no', - last_requested_seq_no: 'last requested seq no', - outstanding_read_requests: 'outstanding read requests', - outstanding_write_requests: 'outstanding write requests', - write_buffer_operation_count: 'write buffer operation count', - write_buffer_size_in_bytes: 'write buffer size in bytes', - follower_mapping_version: 'follower mapping version', - follower_settings_version: 'follower settings version', - total_read_time_millis: 'total read time millis', - total_read_remote_exec_time_millis: 'total read remote exec time millis', - successful_read_requests: 'successful read requests', - failed_read_requests: 'failed read requests', - operations_read: 'operations read', - bytes_read: 'bytes read', - total_write_time_millis: 'total write time millis', - successful_write_requests: 'successful write requests', - failed_write_requests: 'failed write requests', - operations_written: 'operations written', - read_exceptions: ['read exception'], - time_since_last_read_millis: 'time since last read millis', - }; - - expect(deserializeShard(serializedShard)).toMatchSnapshot(); - }); - }); - - describe('deserializeFollowerIndex()', () => { - it('deserializes Elasticsearch follower index object', () => { - const serializedFollowerIndex = { - index: 'follower index name', - status: 'active', - shards: [ - { - shard_id: 'shard 1', - }, - { - shard_id: 'shard 2', - }, - ], - }; - - expect(deserializeFollowerIndex(serializedFollowerIndex)).toMatchSnapshot(); - }); - }); - - describe('deserializeListFollowerIndices()', () => { - it('deserializes list of Elasticsearch follower index objects', () => { - const serializedFollowerIndexList = [ - { - follower_index: 'follower index 1', - remote_cluster: 'cluster 1', - leader_index: 'leader 1', - status: 'active', - parameters: { - max_read_request_operation_count: 1, - max_outstanding_read_requests: 1, - max_read_request_size: 1, - max_write_request_operation_count: 1, - max_write_request_size: 1, - max_outstanding_write_requests: 1, - max_write_buffer_count: 1, - max_write_buffer_size: 1, - max_retry_delay: 1, - read_poll_timeout: 1, - }, - shards: [], - }, - { - follower_index: 'follower index 2', - remote_cluster: 'cluster 2', - leader_index: 'leader 2', - status: 'paused', - parameters: { - max_read_request_operation_count: 2, - max_outstanding_read_requests: 2, - max_read_request_size: 2, - max_write_request_operation_count: 2, - max_write_request_size: 2, - max_outstanding_write_requests: 2, - max_write_buffer_count: 2, - max_write_buffer_size: 2, - max_retry_delay: 2, - read_poll_timeout: 2, - }, - shards: [], - }, - ]; - - const deserializedFollowerIndexList = [ - { - name: 'follower index 1', - remoteCluster: 'cluster 1', - leaderIndex: 'leader 1', - status: 'active', - maxReadRequestOperationCount: 1, - maxOutstandingReadRequests: 1, - maxReadRequestSize: 1, - maxWriteRequestOperationCount: 1, - maxWriteRequestSize: 1, - maxOutstandingWriteRequests: 1, - maxWriteBufferCount: 1, - maxWriteBufferSize: 1, - maxRetryDelay: 1, - readPollTimeout: 1, - shards: [], - }, - { - name: 'follower index 2', - remoteCluster: 'cluster 2', - leaderIndex: 'leader 2', - status: 'paused', - maxReadRequestOperationCount: 2, - maxOutstandingReadRequests: 2, - maxReadRequestSize: 2, - maxWriteRequestOperationCount: 2, - maxWriteRequestSize: 2, - maxOutstandingWriteRequests: 2, - maxWriteBufferCount: 2, - maxWriteBufferSize: 2, - maxRetryDelay: 2, - readPollTimeout: 2, - shards: [], - }, - ]; - - expect(deserializeListFollowerIndices(serializedFollowerIndexList)).toEqual( - deserializedFollowerIndexList - ); - }); - }); - - describe('serializeFollowerIndex()', () => { - it('serializes object to Elasticsearch follower index object', () => { - const deserializedFollowerIndex = { - remoteCluster: 'remote cluster', - leaderIndex: 'leader index', - maxReadRequestOperationCount: 'foo', - maxOutstandingReadRequests: 'foo', - maxReadRequestSize: 'foo', - maxWriteRequestOperationCount: 'foo', - maxWriteRequestSize: 'foo', - maxOutstandingWriteRequests: 'foo', - maxWriteBufferCount: 'foo', - maxWriteBufferSize: 'foo', - maxRetryDelay: 'foo', - readPollTimeout: 'foo', - }; - - expect(serializeFollowerIndex(deserializedFollowerIndex)).toMatchSnapshot(); - }); - }); -}); diff --git a/x-pack/legacy/plugins/cross_cluster_replication/fixtures/auto_follow_pattern.js b/x-pack/legacy/plugins/cross_cluster_replication/fixtures/auto_follow_pattern.js deleted file mode 100644 index 804fe80cd27b4..0000000000000 --- a/x-pack/legacy/plugins/cross_cluster_replication/fixtures/auto_follow_pattern.js +++ /dev/null @@ -1,49 +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 { getRandomString } from '../../../../test_utils'; - -export const getAutoFollowPatternMock = ( - name = getRandomString(), - remoteCluster = getRandomString(), - leaderIndexPatterns = [getRandomString()], - followIndexPattern = getRandomString() -) => ({ - name, - pattern: { - remote_cluster: remoteCluster, - leader_index_patterns: leaderIndexPatterns, - follow_index_pattern: followIndexPattern, - }, -}); - -export const getAutoFollowPatternListMock = (total = 3) => { - const list = { - patterns: [], - }; - - let i = total; - while (i--) { - list.patterns.push(getAutoFollowPatternMock()); - } - - return list; -}; - -// ----------------- -// Client test mock -// ----------------- -export const getAutoFollowPatternClientMock = ({ - name = getRandomString(), - remoteCluster = getRandomString(), - leaderIndexPatterns = [`${getRandomString()}-*`], - followIndexPattern = getRandomString(), -}) => ({ - name, - remoteCluster, - leaderIndexPatterns, - followIndexPattern, -}); diff --git a/x-pack/legacy/plugins/cross_cluster_replication/fixtures/es_errors.js b/x-pack/legacy/plugins/cross_cluster_replication/fixtures/es_errors.js deleted file mode 100644 index a042375e82715..0000000000000 --- a/x-pack/legacy/plugins/cross_cluster_replication/fixtures/es_errors.js +++ /dev/null @@ -1,45 +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. - */ - -/** - * Errors mocks to throw during development to help visualizing - * the different flows in the UI - * - * TODO: Consult the ES team and make sure the error shapes are correct - * for each statusCode. - */ - -const error400 = new Error('Something went wrong'); -error400.statusCode = 400; -error400.response = ` - { - "error": { - "root_cause": [ - { - "type": "x_content_parse_exception", - "reason": "[2:3] [put_auto_follow_pattern_request] unknown field [remote_clusterxxxxx], parser not found" - } - ], - "type": "x_content_parse_exception", - "reason": "[2:3] [put_auto_follow_pattern_request] unknown field [remote_clusterxxxxx], parser not found" - }, - "status": 400 -}`; - -const error403 = new Error('Unauthorized'); -error403.statusCode = 403; -error403.response = ` - { - "acknowledged": true, - "trial_was_started": false, - "error_message": "Operation failed: Trial was already activated." - } -`; - -export const esErrors = { - 400: error400, - 403: error403, -}; diff --git a/x-pack/legacy/plugins/cross_cluster_replication/fixtures/follower_index.js b/x-pack/legacy/plugins/cross_cluster_replication/fixtures/follower_index.js deleted file mode 100644 index 6c535a665978c..0000000000000 --- a/x-pack/legacy/plugins/cross_cluster_replication/fixtures/follower_index.js +++ /dev/null @@ -1,216 +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. - */ - -const Chance = require('chance'); // eslint-disable-line import/no-extraneous-dependencies -const chance = new Chance(); -import { getRandomString } from '../../../../test_utils'; - -const serializeShard = ({ - id, - remoteCluster, - leaderIndex, - leaderGlobalCheckpoint, - leaderMaxSequenceNum, - followerGlobalCheckpoint, - followerMaxSequenceNum, - lastRequestedSequenceNum, - outstandingReadRequestsCount, - outstandingWriteRequestsCount, - writeBufferOperationsCount, - writeBufferSizeBytes, - followerMappingVersion, - followerSettingsVersion, - totalReadTimeMs, - totalReadRemoteExecTimeMs, - successfulReadRequestCount, - failedReadRequestsCount, - operationsReadCount, - bytesReadCount, - totalWriteTimeMs, - successfulWriteRequestsCount, - failedWriteRequestsCount, - operationsWrittenCount, - readExceptions, - timeSinceLastReadMs, -}) => ({ - shard_id: id, - remote_cluster: remoteCluster, - leader_index: leaderIndex, - leader_global_checkpoint: leaderGlobalCheckpoint, - leader_max_seq_no: leaderMaxSequenceNum, - follower_global_checkpoint: followerGlobalCheckpoint, - follower_max_seq_no: followerMaxSequenceNum, - last_requested_seq_no: lastRequestedSequenceNum, - outstanding_read_requests: outstandingReadRequestsCount, - outstanding_write_requests: outstandingWriteRequestsCount, - write_buffer_operation_count: writeBufferOperationsCount, - write_buffer_size_in_bytes: writeBufferSizeBytes, - follower_mapping_version: followerMappingVersion, - follower_settings_version: followerSettingsVersion, - total_read_time_millis: totalReadTimeMs, - total_read_remote_exec_time_millis: totalReadRemoteExecTimeMs, - successful_read_requests: successfulReadRequestCount, - failed_read_requests: failedReadRequestsCount, - operations_read: operationsReadCount, - bytes_read: bytesReadCount, - total_write_time_millis: totalWriteTimeMs, - successful_write_requests: successfulWriteRequestsCount, - failed_write_requests: failedWriteRequestsCount, - operations_written: operationsWrittenCount, - read_exceptions: readExceptions, - time_since_last_read_millis: timeSinceLastReadMs, -}); - -export const getFollowerIndexStatsMock = ( - name = chance.string(), - shards = [ - { - id: chance.string(), - remoteCluster: chance.string(), - leaderIndex: chance.string(), - leaderGlobalCheckpoint: chance.integer(), - leaderMaxSequenceNum: chance.integer(), - followerGlobalCheckpoint: chance.integer(), - followerMaxSequenceNum: chance.integer(), - lastRequestedSequenceNum: chance.integer(), - outstandingReadRequestsCount: chance.integer(), - outstandingWriteRequestsCount: chance.integer(), - writeBufferOperationsCount: chance.integer(), - writeBufferSizeBytes: chance.integer(), - followerMappingVersion: chance.integer(), - followerSettingsVersion: chance.integer(), - totalReadTimeMs: chance.integer(), - totalReadRemoteExecTimeMs: chance.integer(), - successfulReadRequestCount: chance.integer(), - failedReadRequestsCount: chance.integer(), - operationsReadCount: chance.integer(), - bytesReadCount: chance.integer(), - totalWriteTimeMs: chance.integer(), - successfulWriteRequestsCount: chance.integer(), - failedWriteRequestsCount: chance.integer(), - operationsWrittenCount: chance.integer(), - readExceptions: [chance.string()], - timeSinceLastReadMs: chance.integer(), - }, - ] -) => ({ - index: name, - shards: shards.map(serializeShard), -}); - -export const getFollowerIndexListStatsMock = (total = 3, names) => { - const list = { - follow_stats: { - indices: [], - }, - }; - - for (let i = 0; i < total; i++) { - list.follow_stats.indices.push(getFollowerIndexStatsMock(names[i])); - } - - return list; -}; - -export const getFollowerIndexInfoMock = ( - name = chance.string(), - status = chance.string(), - parameters = { - maxReadRequestOperationCount: chance.string(), - maxOutstandingReadRequests: chance.string(), - maxReadRequestSize: chance.string(), - maxWriteRequestOperationCount: chance.string(), - maxWriteRequestSize: chance.string(), - maxOutstandingWriteRequests: chance.string(), - maxWriteBufferCount: chance.string(), - maxWriteBufferSize: chance.string(), - maxRetryDelay: chance.string(), - readPollTimeout: chance.string(), - } -) => { - return { - follower_index: name, - status, - max_read_request_operation_count: parameters.maxReadRequestOperationCount, - max_outstanding_read_requests: parameters.maxOutstandingReadRequests, - max_read_request_size: parameters.maxReadRequestSize, - max_write_request_operation_count: parameters.maxWriteRequestOperationCount, - max_write_request_size: parameters.maxWriteRequestSize, - max_outstanding_write_requests: parameters.maxOutstandingWriteRequests, - max_write_buffer_count: parameters.maxWriteBufferCount, - max_write_buffer_size: parameters.maxWriteBufferSize, - max_retry_delay: parameters.maxRetryDelay, - read_poll_timeout: parameters.readPollTimeout, - }; -}; - -export const getFollowerIndexListInfoMock = (total = 3) => { - const list = { - follower_indices: [], - }; - - for (let i = 0; i < total; i++) { - list.follower_indices.push(getFollowerIndexInfoMock()); - } - - return list; -}; - -// ----------------- -// Client test mock -// ----------------- - -export const getFollowerIndexMock = ({ - name = getRandomString(), - remoteCluster = getRandomString(), - leaderIndex = getRandomString(), - status = 'Active', -} = {}) => ({ - name, - remoteCluster, - leaderIndex, - status, - maxReadRequestOperationCount: chance.integer(), - maxOutstandingReadRequests: chance.integer(), - maxReadRequestSize: getRandomString({ length: 5 }), - maxWriteRequestOperationCount: chance.integer(), - maxWriteRequestSize: '9223372036854775807b', - maxOutstandingWriteRequests: chance.integer(), - maxWriteBufferCount: chance.integer(), - maxWriteBufferSize: getRandomString({ length: 5 }), - maxRetryDelay: getRandomString({ length: 5 }), - readPollTimeout: getRandomString({ length: 5 }), - shards: [ - { - id: 0, - remoteCluster: remoteCluster, - leaderIndex: leaderIndex, - leaderGlobalCheckpoint: chance.integer(), - leaderMaxSequenceNum: chance.integer(), - followerGlobalCheckpoint: chance.integer(), - followerMaxSequenceNum: chance.integer(), - lastRequestedSequenceNum: chance.integer(), - outstandingReadRequestsCount: chance.integer(), - outstandingWriteRequestsCount: chance.integer(), - writeBufferOperationsCount: chance.integer(), - writeBufferSizeBytes: chance.integer(), - followerMappingVersion: chance.integer(), - followerSettingsVersion: chance.integer(), - totalReadTimeMs: chance.integer(), - totalReadRemoteExecTimeMs: chance.integer(), - successfulReadRequestCount: chance.integer(), - failedReadRequestsCount: chance.integer(), - operationsReadCount: chance.integer(), - bytesReadCount: chance.integer(), - totalWriteTimeMs: chance.integer(), - successfulWriteRequestsCount: chance.integer(), - failedWriteRequestsCount: chance.integer(), - operationsWrittenCount: chance.integer(), - readExceptions: [], - timeSinceLastReadMs: chance.integer(), - }, - ], -}); diff --git a/x-pack/legacy/plugins/cross_cluster_replication/fixtures/index.js b/x-pack/legacy/plugins/cross_cluster_replication/fixtures/index.js deleted file mode 100644 index ccfdf8b19f3ee..0000000000000 --- a/x-pack/legacy/plugins/cross_cluster_replication/fixtures/index.js +++ /dev/null @@ -1,16 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -export { getAutoFollowPatternMock, getAutoFollowPatternListMock } from './auto_follow_pattern'; - -export { esErrors } from './es_errors'; - -export { - getFollowerIndexStatsMock, - getFollowerIndexListStatsMock, - getFollowerIndexInfoMock, - getFollowerIndexListInfoMock, -} from './follower_index'; diff --git a/x-pack/legacy/plugins/cross_cluster_replication/index.js b/x-pack/legacy/plugins/cross_cluster_replication/index.js deleted file mode 100644 index aff4cc5b56738..0000000000000 --- a/x-pack/legacy/plugins/cross_cluster_replication/index.js +++ /dev/null @@ -1,57 +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 { resolve } from 'path'; -import { PLUGIN } from './common/constants'; -import { plugin } from './server/np_ready'; - -export function crossClusterReplication(kibana) { - return new kibana.Plugin({ - id: PLUGIN.ID, - configPrefix: 'xpack.ccr', - publicDir: resolve(__dirname, 'public'), - require: ['kibana', 'elasticsearch', 'xpack_main', 'remoteClusters', 'index_management'], - uiExports: { - styleSheetPaths: resolve(__dirname, 'public/index.scss'), - managementSections: ['plugins/cross_cluster_replication'], - injectDefaultVars(server) { - const config = server.config(); - return { - ccrUiEnabled: - config.get('xpack.ccr.ui.enabled') && config.get('xpack.remote_clusters.ui.enabled'), - }; - }, - }, - - config(Joi) { - return Joi.object({ - // display menu item - ui: Joi.object({ - enabled: Joi.boolean().default(true), - }).default(), - - // enable plugin - enabled: Joi.boolean().default(true), - }).default(); - }, - isEnabled(config) { - return ( - config.get('xpack.ccr.enabled') && - config.get('xpack.index_management.enabled') && - config.get('xpack.remote_clusters.enabled') - ); - }, - init: function initCcrPlugin(server) { - plugin({}).setup(server.newPlatform.setup.core, { - indexManagement: server.newPlatform.setup.plugins.indexManagement, - __LEGACY: { - server, - ccrUIEnabled: server.config().get('xpack.ccr.ui.enabled'), - }, - }); - }, - }); -} diff --git a/x-pack/legacy/plugins/cross_cluster_replication/public/index.scss b/x-pack/legacy/plugins/cross_cluster_replication/public/index.scss deleted file mode 100644 index 31317e16e3e9f..0000000000000 --- a/x-pack/legacy/plugins/cross_cluster_replication/public/index.scss +++ /dev/null @@ -1,13 +0,0 @@ -// Import the EUI global scope so we can use EUI constants -@import 'src/legacy/ui/public/styles/_styling_constants'; - -// Cross-Cluster Replication plugin styles - -// Prefix all styles with "ccr" to avoid conflicts. -// Examples -// ccrChart -// ccrChart__legend -// ccrChart__legend--small -// ccrChart__legend-isLoading - -@import 'np_ready/app/app'; diff --git a/x-pack/legacy/plugins/cross_cluster_replication/public/main.html b/x-pack/legacy/plugins/cross_cluster_replication/public/main.html deleted file mode 100644 index 2129f26267827..0000000000000 --- a/x-pack/legacy/plugins/cross_cluster_replication/public/main.html +++ /dev/null @@ -1,3 +0,0 @@ - -

- diff --git a/x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/_app.scss b/x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/_app.scss deleted file mode 100644 index 5ee862b1d9e44..0000000000000 --- a/x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/_app.scss +++ /dev/null @@ -1,14 +0,0 @@ -.ccrFollowerIndicesFormRow { - padding-bottom: 0; -} - -.ccrFollowerIndicesHelpText { - transform: translateY(-3px); -} - -/** - * 1. Prevent context menu popover appearing above confirmation modal - */ -.ccrFollowerIndicesDetailPanel { - z-index: $euiZMask - 1; /* 1 */ -} diff --git a/x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/index.js b/x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/index.js deleted file mode 100644 index cc81fce4eebe7..0000000000000 --- a/x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/index.js +++ /dev/null @@ -1,25 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ -import React from 'react'; -import { render } from 'react-dom'; -import { Provider } from 'react-redux'; -import { HashRouter } from 'react-router-dom'; - -import { App } from './app'; -import { ccrStore } from './store'; - -export const renderReact = async (elem, I18nContext) => { - render( - - - - - - - , - elem - ); -}; diff --git a/x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/services/documentation_links.ts b/x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/services/documentation_links.ts deleted file mode 100644 index f17926d2bee10..0000000000000 --- a/x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/services/documentation_links.ts +++ /dev/null @@ -1,22 +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. - */ - -let esBase: string; - -export const setDocLinks = ({ - DOC_LINK_VERSION, - ELASTIC_WEBSITE_URL, -}: { - ELASTIC_WEBSITE_URL: string; - DOC_LINK_VERSION: string; -}) => { - esBase = `${ELASTIC_WEBSITE_URL}guide/en/elasticsearch/reference/${DOC_LINK_VERSION}`; -}; - -export const getAutoFollowPatternUrl = () => `${esBase}/ccr-put-auto-follow-pattern.html`; -export const getFollowerIndexUrl = () => `${esBase}/ccr-put-follow.html`; -export const getByteUnitsUrl = () => `${esBase}/common-options.html#byte-units`; -export const getTimeUnitsUrl = () => `${esBase}/common-options.html#time-units`; diff --git a/x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/services/notifications.ts b/x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/services/notifications.ts deleted file mode 100644 index 5e1c3e9e99437..0000000000000 --- a/x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/services/notifications.ts +++ /dev/null @@ -1,20 +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 { NotificationsSetup, IToasts, FatalErrorsSetup } from 'src/core/public'; - -let _notifications: IToasts; -let _fatalErrors: FatalErrorsSetup; - -export const setNotifications = ( - notifications: NotificationsSetup, - fatalErrorsSetup: FatalErrorsSetup -) => { - _notifications = notifications.toasts; - _fatalErrors = fatalErrorsSetup; -}; - -export const getNotifications = () => _notifications; -export const getFatalErrors = () => _fatalErrors; diff --git a/x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/services/track_ui_metric.js b/x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/services/track_ui_metric.js deleted file mode 100644 index 36b9c185b487d..0000000000000 --- a/x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/services/track_ui_metric.js +++ /dev/null @@ -1,27 +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 { - createUiStatsReporter, - METRIC_TYPE, -} from '../../../../../../../../src/legacy/core_plugins/ui_metric/public'; -import { UIM_APP_NAME } from '../constants'; - -export const trackUiMetric = createUiStatsReporter(UIM_APP_NAME); -export { METRIC_TYPE }; -/** - * Transparently return provided request Promise, while allowing us to track - * a successful completion of the request. - */ -export function trackUserRequest(request, actionType) { - // Only track successful actions. - return request.then(response => { - trackUiMetric(METRIC_TYPE.LOADED, actionType); - // We return the response immediately without waiting for the tracking request to resolve, - // to avoid adding additional latency. - return response; - }); -} diff --git a/x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/extend_index_management.ts b/x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/extend_index_management.ts deleted file mode 100644 index 4ffe0db4e3c4e..0000000000000 --- a/x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/extend_index_management.ts +++ /dev/null @@ -1,28 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import { i18n } from '@kbn/i18n'; -import { get } from 'lodash'; -import { IndexManagementPluginSetup } from '../../../../../plugins/index_management/public'; - -const propertyPath = 'isFollowerIndex'; - -const followerBadgeExtension = { - matchIndex: (index: any) => { - return get(index, propertyPath); - }, - label: i18n.translate('xpack.crossClusterReplication.indexMgmtBadge.followerLabel', { - defaultMessage: 'Follower', - }), - color: 'default', - filterExpression: 'isFollowerIndex:true', -}; - -export const extendIndexManagement = (indexManagement?: IndexManagementPluginSetup) => { - if (indexManagement) { - indexManagement.extensionsService.addBadge(followerBadgeExtension); - } -}; diff --git a/x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/plugin.ts b/x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/plugin.ts deleted file mode 100644 index 46259c698b282..0000000000000 --- a/x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/plugin.ts +++ /dev/null @@ -1,44 +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 { - ChromeBreadcrumb, - CoreSetup, - Plugin, - PluginInitializerContext, - DocLinksStart, -} from 'src/core/public'; - -import { IndexManagementPluginSetup } from '../../../../../plugins/index_management/public'; - -// @ts-ignore; -import { setHttpClient } from './app/services/api'; -import { setBreadcrumbSetter } from './app/services/breadcrumbs'; -import { setDocLinks } from './app/services/documentation_links'; -import { setNotifications } from './app/services/notifications'; -import { extendIndexManagement } from './extend_index_management'; - -interface PluginDependencies { - indexManagement: IndexManagementPluginSetup; - __LEGACY: { - chrome: any; - MANAGEMENT_BREADCRUMB: ChromeBreadcrumb; - docLinks: DocLinksStart; - }; -} - -export class CrossClusterReplicationUIPlugin implements Plugin { - // @ts-ignore - constructor(private readonly ctx: PluginInitializerContext) {} - setup({ http, notifications, fatalErrors }: CoreSetup, deps: PluginDependencies) { - setHttpClient(http); - setBreadcrumbSetter(deps); - setDocLinks(deps.__LEGACY.docLinks); - setNotifications(notifications, fatalErrors); - extendIndexManagement(deps.indexManagement); - } - - start() {} -} diff --git a/x-pack/legacy/plugins/cross_cluster_replication/public/register_routes.js b/x-pack/legacy/plugins/cross_cluster_replication/public/register_routes.js deleted file mode 100644 index 838939f46e523..0000000000000 --- a/x-pack/legacy/plugins/cross_cluster_replication/public/register_routes.js +++ /dev/null @@ -1,94 +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 { unmountComponentAtNode } from 'react-dom'; -import chrome from 'ui/chrome'; -import { management, MANAGEMENT_BREADCRUMB } from 'ui/management'; -import { npSetup, npStart } from 'ui/new_platform'; -import routes from 'ui/routes'; -import { xpackInfo } from 'plugins/xpack_main/services/xpack_info'; -import { i18n } from '@kbn/i18n'; - -import template from './main.html'; -import { BASE_PATH } from '../common/constants'; - -import { plugin } from './np_ready'; - -/** - * TODO: When this file is deleted, use the management section for rendering - */ -import { renderReact } from './np_ready/app'; - -const isAvailable = xpackInfo.get('features.crossClusterReplication.isAvailable'); -const isActive = xpackInfo.get('features.crossClusterReplication.isActive'); -const isLicenseOK = isAvailable && isActive; -const isCcrUiEnabled = chrome.getInjected('ccrUiEnabled'); - -if (isLicenseOK && isCcrUiEnabled) { - const esSection = management.getSection('elasticsearch'); - - esSection.register('ccr', { - visible: true, - display: i18n.translate('xpack.crossClusterReplication.appTitle', { - defaultMessage: 'Cross-Cluster Replication', - }), - order: 4, - url: `#${BASE_PATH}`, - }); - - let elem; - - const CCR_REACT_ROOT = 'ccrReactRoot'; - - plugin({}).setup(npSetup.core, { - ...npSetup.plugins, - __LEGACY: { - chrome, - docLinks: npStart.core.docLinks, - MANAGEMENT_BREADCRUMB, - }, - }); - - const unmountReactApp = () => elem && unmountComponentAtNode(elem); - - routes.when(`${BASE_PATH}/:section?/:subsection?/:view?/:id?`, { - template, - controllerAs: 'ccr', - controller: class CrossClusterReplicationController { - constructor($scope, $route) { - // React-router's does not play well with the angular router. It will cause this controller - // to re-execute without the $destroy handler being called. This means that the app will be mounted twice - // creating a memory leak when leaving (only 1 app will be unmounted). - // To avoid this, we unmount the React app each time we enter the controller. - unmountReactApp(); - - $scope.$$postDigest(() => { - elem = document.getElementById(CCR_REACT_ROOT); - renderReact(elem, npStart.core.i18n.Context); - - // Angular Lifecycle - const appRoute = $route.current; - const stopListeningForLocationChange = $scope.$on('$locationChangeSuccess', () => { - const currentRoute = $route.current; - const isNavigationInApp = currentRoute.$$route.template === appRoute.$$route.template; - - // When we navigate within CCR, prevent Angular from re-matching the route and rebuild the app - if (isNavigationInApp) { - $route.current = appRoute; - } else { - // Any clean up when User leaves the CCR - } - - $scope.$on('$destroy', () => { - stopListeningForLocationChange && stopListeningForLocationChange(); - unmountReactApp(); - }); - }); - }); - } - }, - }); -} diff --git a/x-pack/legacy/plugins/cross_cluster_replication/server/np_ready/cross_cluster_replication_data.ts b/x-pack/legacy/plugins/cross_cluster_replication/server/np_ready/cross_cluster_replication_data.ts deleted file mode 100644 index ae15073b979e1..0000000000000 --- a/x-pack/legacy/plugins/cross_cluster_replication/server/np_ready/cross_cluster_replication_data.ts +++ /dev/null @@ -1,36 +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 { APICaller } from 'src/core/server'; -import { Index } from '../../../../../plugins/index_management/server'; - -export const ccrDataEnricher = async (indicesList: Index[], callWithRequest: APICaller) => { - if (!indicesList?.length) { - return indicesList; - } - const params = { - path: '/_all/_ccr/info', - method: 'GET', - }; - try { - const { follower_indices: followerIndices } = await callWithRequest( - 'transport.request', - params - ); - return indicesList.map(index => { - const isFollowerIndex = !!followerIndices.find( - (followerIndex: { follower_index: string }) => { - return followerIndex.follower_index === index.name; - } - ); - return { - ...index, - isFollowerIndex, - }; - }); - } catch (e) { - return indicesList; - } -}; diff --git a/x-pack/legacy/plugins/cross_cluster_replication/server/np_ready/index.ts b/x-pack/legacy/plugins/cross_cluster_replication/server/np_ready/index.ts deleted file mode 100644 index 7a38d024d99a2..0000000000000 --- a/x-pack/legacy/plugins/cross_cluster_replication/server/np_ready/index.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 { PluginInitializerContext } from 'src/core/server'; -import { CrossClusterReplicationServerPlugin } from './plugin'; - -export const plugin = (ctx: PluginInitializerContext) => - new CrossClusterReplicationServerPlugin(ctx); diff --git a/x-pack/legacy/plugins/cross_cluster_replication/server/np_ready/lib/call_with_request_factory/call_with_request_factory.js b/x-pack/legacy/plugins/cross_cluster_replication/server/np_ready/lib/call_with_request_factory/call_with_request_factory.js deleted file mode 100644 index 99d72ce1a0e6e..0000000000000 --- a/x-pack/legacy/plugins/cross_cluster_replication/server/np_ready/lib/call_with_request_factory/call_with_request_factory.js +++ /dev/null @@ -1,20 +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 { once } from 'lodash'; -import { elasticsearchJsPlugin } from '../../client/elasticsearch_ccr'; - -const callWithRequest = once(server => { - const config = { plugins: [elasticsearchJsPlugin] }; - const cluster = server.plugins.elasticsearch.createCluster('ccr', config); - return cluster.callWithRequest; -}); - -export const callWithRequestFactory = (server, request) => { - return (...args) => { - return callWithRequest(server)(request, ...args); - }; -}; diff --git a/x-pack/legacy/plugins/cross_cluster_replication/server/np_ready/lib/call_with_request_factory/index.js b/x-pack/legacy/plugins/cross_cluster_replication/server/np_ready/lib/call_with_request_factory/index.js deleted file mode 100644 index 787814d87dff9..0000000000000 --- a/x-pack/legacy/plugins/cross_cluster_replication/server/np_ready/lib/call_with_request_factory/index.js +++ /dev/null @@ -1,7 +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. - */ - -export { callWithRequestFactory } from './call_with_request_factory'; diff --git a/x-pack/legacy/plugins/cross_cluster_replication/server/np_ready/lib/check_license/check_license.js b/x-pack/legacy/plugins/cross_cluster_replication/server/np_ready/lib/check_license/check_license.js deleted file mode 100644 index 6cf12896fa472..0000000000000 --- a/x-pack/legacy/plugins/cross_cluster_replication/server/np_ready/lib/check_license/check_license.js +++ /dev/null @@ -1,70 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import { i18n } from '@kbn/i18n'; - -export function checkLicense(xpackLicenseInfo) { - const pluginName = 'Cross-Cluster Replication'; - - // If, for some reason, we cannot get the license information - // from Elasticsearch, assume worst case and disable - if (!xpackLicenseInfo || !xpackLicenseInfo.isAvailable()) { - return { - isAvailable: false, - showLinks: true, - enableLinks: false, - message: i18n.translate( - 'xpack.crossClusterReplication.checkLicense.errorUnavailableMessage', - { - defaultMessage: - 'You cannot use {pluginName} because license information is not available at this time.', - values: { pluginName }, - } - ), - }; - } - - const VALID_LICENSE_MODES = ['trial', 'platinum', 'enterprise']; - - const isLicenseModeValid = xpackLicenseInfo.license.isOneOf(VALID_LICENSE_MODES); - const isLicenseActive = xpackLicenseInfo.license.isActive(); - const licenseType = xpackLicenseInfo.license.getType(); - - // License is not valid - if (!isLicenseModeValid) { - return { - isAvailable: false, - isActive: false, - message: i18n.translate( - 'xpack.crossClusterReplication.checkLicense.errorUnsupportedMessage', - { - defaultMessage: - 'Your {licenseType} license does not support {pluginName}. Please upgrade your license.', - values: { licenseType, pluginName }, - } - ), - }; - } - - // License is valid but not active - if (!isLicenseActive) { - return { - isAvailable: true, - isActive: false, - message: i18n.translate('xpack.crossClusterReplication.checkLicense.errorExpiredMessage', { - defaultMessage: - 'You cannot use {pluginName} because your {licenseType} license has expired', - values: { licenseType, pluginName }, - }), - }; - } - - // License is valid and active - return { - isAvailable: true, - isActive: true, - }; -} diff --git a/x-pack/legacy/plugins/cross_cluster_replication/server/np_ready/lib/error_wrappers/__tests__/wrap_es_error.test.js b/x-pack/legacy/plugins/cross_cluster_replication/server/np_ready/lib/error_wrappers/__tests__/wrap_es_error.test.js deleted file mode 100644 index 11a6fd4e1d816..0000000000000 --- a/x-pack/legacy/plugins/cross_cluster_replication/server/np_ready/lib/error_wrappers/__tests__/wrap_es_error.test.js +++ /dev/null @@ -1,33 +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 expect from '@kbn/expect'; -import { wrapEsError } from '../wrap_es_error'; - -describe('wrap_es_error', () => { - describe('#wrapEsError', () => { - let originalError; - beforeEach(() => { - originalError = new Error('I am an error'); - originalError.statusCode = 404; - originalError.response = '{}'; - }); - - it('should return the correct object', () => { - const wrappedError = wrapEsError(originalError); - - expect(wrappedError.statusCode).to.be(originalError.statusCode); - expect(wrappedError.message).to.be(originalError.message); - }); - - it('should return the correct object with custom message', () => { - const wrappedError = wrapEsError(originalError, { 404: 'No encontrado!' }); - - expect(wrappedError.statusCode).to.be(originalError.statusCode); - expect(wrappedError.message).to.be('No encontrado!'); - }); - }); -}); diff --git a/x-pack/legacy/plugins/cross_cluster_replication/server/np_ready/lib/is_es_error_factory/__tests__/is_es_error_factory.js b/x-pack/legacy/plugins/cross_cluster_replication/server/np_ready/lib/is_es_error_factory/__tests__/is_es_error_factory.js deleted file mode 100644 index 5f2141cce9395..0000000000000 --- a/x-pack/legacy/plugins/cross_cluster_replication/server/np_ready/lib/is_es_error_factory/__tests__/is_es_error_factory.js +++ /dev/null @@ -1,44 +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 expect from '@kbn/expect'; -import { isEsErrorFactory } from '../is_es_error_factory'; -import { set } from 'lodash'; - -class MockAbstractEsError {} - -describe('is_es_error_factory', () => { - let mockServer; - let isEsError; - - beforeEach(() => { - const mockEsErrors = { - _Abstract: MockAbstractEsError, - }; - mockServer = {}; - set(mockServer, 'plugins.elasticsearch.getCluster', () => ({ errors: mockEsErrors })); - - isEsError = isEsErrorFactory(mockServer); - }); - - describe('#isEsErrorFactory', () => { - it('should return a function', () => { - expect(isEsError).to.be.a(Function); - }); - - describe('returned function', () => { - it('should return true if passed-in err is a known esError', () => { - const knownEsError = new MockAbstractEsError(); - expect(isEsError(knownEsError)).to.be(true); - }); - - it('should return false if passed-in err is not a known esError', () => { - const unknownEsError = {}; - expect(isEsError(unknownEsError)).to.be(false); - }); - }); - }); -}); diff --git a/x-pack/legacy/plugins/cross_cluster_replication/server/np_ready/lib/is_es_error_factory/is_es_error_factory.ts b/x-pack/legacy/plugins/cross_cluster_replication/server/np_ready/lib/is_es_error_factory/is_es_error_factory.ts deleted file mode 100644 index fc6405b8e7513..0000000000000 --- a/x-pack/legacy/plugins/cross_cluster_replication/server/np_ready/lib/is_es_error_factory/is_es_error_factory.ts +++ /dev/null @@ -1,18 +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 { memoize } from 'lodash'; - -const esErrorsFactory = memoize((server: any) => { - return server.plugins.elasticsearch.getCluster('admin').errors; -}); - -export function isEsErrorFactory(server: any) { - const esErrors = esErrorsFactory(server); - return function isEsError(err: any) { - return err instanceof esErrors._Abstract; - }; -} diff --git a/x-pack/legacy/plugins/cross_cluster_replication/server/np_ready/lib/license_pre_routing_factory/__jest__/license_pre_routing_factory.test.ts b/x-pack/legacy/plugins/cross_cluster_replication/server/np_ready/lib/license_pre_routing_factory/__jest__/license_pre_routing_factory.test.ts deleted file mode 100644 index d22505f0e315a..0000000000000 --- a/x-pack/legacy/plugins/cross_cluster_replication/server/np_ready/lib/license_pre_routing_factory/__jest__/license_pre_routing_factory.test.ts +++ /dev/null @@ -1,64 +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 { kibanaResponseFactory } from '../../../../../../../../../src/core/server'; -import { licensePreRoutingFactory } from '../license_pre_routing_factory'; - -describe('license_pre_routing_factory', () => { - describe('#reportingFeaturePreRoutingFactory', () => { - let mockDeps: any; - let mockLicenseCheckResults: any; - - const anyContext: any = {}; - const anyRequest: any = {}; - - beforeEach(() => { - mockDeps = { - __LEGACY: { - server: { - plugins: { - xpack_main: { - info: { - feature: () => ({ - getLicenseCheckResults: () => mockLicenseCheckResults, - }), - }, - }, - }, - }, - }, - requestHandler: jest.fn(), - }; - }); - - describe('isAvailable is false', () => { - beforeEach(() => { - mockLicenseCheckResults = { - isAvailable: false, - }; - }); - - it('replies with 403', async () => { - const licensePreRouting = licensePreRoutingFactory(mockDeps); - const response = await licensePreRouting(anyContext, anyRequest, kibanaResponseFactory); - expect(response.status).toBe(403); - }); - }); - - describe('isAvailable is true', () => { - beforeEach(() => { - mockLicenseCheckResults = { - isAvailable: true, - }; - }); - - it('it calls the wrapped handler', async () => { - const licensePreRouting = licensePreRoutingFactory(mockDeps); - await licensePreRouting(anyContext, anyRequest, kibanaResponseFactory); - expect(mockDeps.requestHandler).toHaveBeenCalledTimes(1); - }); - }); - }); -}); diff --git a/x-pack/legacy/plugins/cross_cluster_replication/server/np_ready/lib/license_pre_routing_factory/license_pre_routing_factory.ts b/x-pack/legacy/plugins/cross_cluster_replication/server/np_ready/lib/license_pre_routing_factory/license_pre_routing_factory.ts deleted file mode 100644 index c47faa940a650..0000000000000 --- a/x-pack/legacy/plugins/cross_cluster_replication/server/np_ready/lib/license_pre_routing_factory/license_pre_routing_factory.ts +++ /dev/null @@ -1,32 +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 { RequestHandler } from 'src/core/server'; -import { PLUGIN } from '../../../../common/constants'; - -export const licensePreRoutingFactory = ({ - __LEGACY, - requestHandler, -}: { - __LEGACY: { server: any }; - requestHandler: RequestHandler; -}) => { - const xpackMainPlugin = __LEGACY.server.plugins.xpack_main; - - // License checking and enable/disable logic - const licensePreRouting: RequestHandler = (ctx, request, response) => { - const licenseCheckResults = xpackMainPlugin.info.feature(PLUGIN.ID).getLicenseCheckResults(); - if (!licenseCheckResults.isAvailable) { - return response.forbidden({ - body: licenseCheckResults.message, - }); - } else { - return requestHandler(ctx, request, response); - } - }; - - return licensePreRouting; -}; diff --git a/x-pack/legacy/plugins/cross_cluster_replication/server/np_ready/lib/register_license_checker/index.js b/x-pack/legacy/plugins/cross_cluster_replication/server/np_ready/lib/register_license_checker/index.js deleted file mode 100644 index 7b0f97c38d129..0000000000000 --- a/x-pack/legacy/plugins/cross_cluster_replication/server/np_ready/lib/register_license_checker/index.js +++ /dev/null @@ -1,7 +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. - */ - -export { registerLicenseChecker } from './register_license_checker'; diff --git a/x-pack/legacy/plugins/cross_cluster_replication/server/np_ready/lib/register_license_checker/register_license_checker.js b/x-pack/legacy/plugins/cross_cluster_replication/server/np_ready/lib/register_license_checker/register_license_checker.js deleted file mode 100644 index b9bb34a80ce79..0000000000000 --- a/x-pack/legacy/plugins/cross_cluster_replication/server/np_ready/lib/register_license_checker/register_license_checker.js +++ /dev/null @@ -1,21 +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 { mirrorPluginStatus } from '../../../../../../server/lib/mirror_plugin_status'; -import { PLUGIN } from '../../../../common/constants'; -import { checkLicense } from '../check_license'; - -export function registerLicenseChecker(__LEGACY) { - const xpackMainPlugin = __LEGACY.server.plugins.xpack_main; - const ccrPluggin = __LEGACY.server.plugins[PLUGIN.ID]; - - mirrorPluginStatus(xpackMainPlugin, ccrPluggin); - xpackMainPlugin.status.once('green', () => { - // Register a function that is called whenever the xpack info changes, - // to re-compute the license check results for this plugin - xpackMainPlugin.info.feature(PLUGIN.ID).registerLicenseCheckResultsGenerator(checkLicense); - }); -} diff --git a/x-pack/legacy/plugins/cross_cluster_replication/server/np_ready/plugin.ts b/x-pack/legacy/plugins/cross_cluster_replication/server/np_ready/plugin.ts deleted file mode 100644 index 829de10ad0177..0000000000000 --- a/x-pack/legacy/plugins/cross_cluster_replication/server/np_ready/plugin.ts +++ /dev/null @@ -1,38 +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 { Plugin, PluginInitializerContext, CoreSetup } from 'src/core/server'; - -import { IndexManagementPluginSetup } from '../../../../../plugins/index_management/server'; - -// @ts-ignore -import { registerLicenseChecker } from './lib/register_license_checker'; -// @ts-ignore -import { registerRoutes } from './routes/register_routes'; -import { ccrDataEnricher } from './cross_cluster_replication_data'; - -interface PluginDependencies { - indexManagement: IndexManagementPluginSetup; - __LEGACY: { - server: any; - ccrUIEnabled: boolean; - }; -} - -export class CrossClusterReplicationServerPlugin implements Plugin { - // @ts-ignore - constructor(private readonly ctx: PluginInitializerContext) {} - setup({ http }: CoreSetup, { indexManagement, __LEGACY }: PluginDependencies) { - registerLicenseChecker(__LEGACY); - - const router = http.createRouter(); - registerRoutes({ router, __LEGACY }); - if (__LEGACY.ccrUIEnabled && indexManagement && indexManagement.indexDataEnricher) { - indexManagement.indexDataEnricher.add(ccrDataEnricher); - } - } - start() {} -} diff --git a/x-pack/legacy/plugins/cross_cluster_replication/server/np_ready/routes/api/__jest__/auto_follow_pattern.test.js b/x-pack/legacy/plugins/cross_cluster_replication/server/np_ready/routes/api/__jest__/auto_follow_pattern.test.js deleted file mode 100644 index f3024515c7213..0000000000000 --- a/x-pack/legacy/plugins/cross_cluster_replication/server/np_ready/routes/api/__jest__/auto_follow_pattern.test.js +++ /dev/null @@ -1,330 +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 { deserializeAutoFollowPattern } from '../../../../../common/services/auto_follow_pattern_serialization'; -import { callWithRequestFactory } from '../../../lib/call_with_request_factory'; -import { isEsErrorFactory } from '../../../lib/is_es_error_factory'; -import { getAutoFollowPatternMock, getAutoFollowPatternListMock } from '../../../../../fixtures'; -import { registerAutoFollowPatternRoutes } from '../auto_follow_pattern'; - -import { createRouter, callRoute } from './helpers'; - -jest.mock('../../../lib/call_with_request_factory'); -jest.mock('../../../lib/is_es_error_factory'); -jest.mock('../../../lib/license_pre_routing_factory', () => ({ - licensePreRoutingFactory: ({ requestHandler }) => requestHandler, -})); - -const DESERIALIZED_KEYS = Object.keys(deserializeAutoFollowPattern(getAutoFollowPatternMock())); - -let routeRegistry; - -/** - * Helper to extract all the different server route handler so we can easily call them in our tests. - * - * Important: This method registers the handlers in the order that they appear in the file, so - * if a "server.route()" call is moved or deleted, then the HANDLER_INDEX_TO_ACTION must be updated here. - */ -const registerHandlers = () => { - const HANDLER_INDEX_TO_ACTION = { - 0: 'list', - 1: 'create', - 2: 'update', - 3: 'get', - 4: 'delete', - 5: 'pause', - 6: 'resume', - }; - - routeRegistry = createRouter(HANDLER_INDEX_TO_ACTION); - - registerAutoFollowPatternRoutes({ - __LEGACY: {}, - router: routeRegistry.router, - }); -}; - -/** - * Queue to save request response and errors - * It allows us to fake multiple responses from the - * callWithRequestFactory() when the request handler call it - * multiple times. - */ -let requestResponseQueue = []; - -/** - * Helper to mock the response from the call to Elasticsearch - * - * @param {*} err The mock error to throw - * @param {*} response The response to return - */ -const setHttpRequestResponse = (error, response) => { - requestResponseQueue.push({ error, response }); -}; - -const resetHttpRequestResponses = () => (requestResponseQueue = []); - -const getNextResponseFromQueue = () => { - if (!requestResponseQueue.length) { - return null; - } - - const next = requestResponseQueue.shift(); - if (next.error) { - return Promise.reject(next.error); - } - return Promise.resolve(next.response); -}; - -describe('[CCR API Routes] Auto Follow Pattern', () => { - let routeHandler; - - beforeAll(() => { - isEsErrorFactory.mockReturnValue(() => false); - callWithRequestFactory.mockReturnValue(getNextResponseFromQueue); - registerHandlers(); - }); - - describe('list()', () => { - beforeEach(() => { - routeHandler = routeRegistry.getRoutes().list; - }); - - it('should deserialize the response from Elasticsearch', async () => { - const totalResult = 2; - setHttpRequestResponse(null, getAutoFollowPatternListMock(totalResult)); - - const { - options: { body: response }, - } = await callRoute(routeHandler); - const autoFollowPattern = response.patterns[0]; - - expect(response.patterns.length).toEqual(totalResult); - expect(Object.keys(autoFollowPattern)).toEqual(DESERIALIZED_KEYS); - }); - }); - - describe('create()', () => { - beforeEach(() => { - resetHttpRequestResponses(); - routeHandler = routeRegistry.getRoutes().create; - }); - - it('should throw a 409 conflict error if id already exists', async () => { - setHttpRequestResponse(null, { acknowledge: true }); - setHttpRequestResponse(null, { acknowledge: true }); - - const response = await callRoute( - routeHandler, - {}, - { - body: { - id: 'some-id', - foo: 'bar', - }, - } - ); - - expect(response.status).toEqual(409); - }); - - it('should return 200 status when the id does not exist', async () => { - const error = new Error('Resource not found.'); - error.statusCode = 404; - setHttpRequestResponse(error); - setHttpRequestResponse(null, { acknowledge: true }); - - const { - options: { body: response }, - } = await callRoute( - routeHandler, - {}, - { - body: { - id: 'some-id', - foo: 'bar', - }, - } - ); - - expect(response).toEqual({ acknowledge: true }); - }); - }); - - describe('update()', () => { - beforeEach(() => { - routeHandler = routeRegistry.getRoutes().update; - }); - - it('should serialize the payload before sending it to Elasticsearch', async () => { - callWithRequestFactory.mockReturnValueOnce((_, payload) => payload); - - const request = { - params: { id: 'foo' }, - body: { - remoteCluster: 'bar1', - leaderIndexPatterns: ['bar2'], - followIndexPattern: 'bar3', - }, - }; - - const response = await callRoute(routeHandler, {}, request); - - expect(response.options.body).toEqual({ - id: 'foo', - body: { - remote_cluster: 'bar1', - leader_index_patterns: ['bar2'], - follow_index_pattern: 'bar3', - }, - }); - }); - }); - - describe('get()', () => { - beforeEach(() => { - routeHandler = routeRegistry.getRoutes().get; - }); - - it('should return a single resource even though ES return an array with 1 item', async () => { - const autoFollowPattern = getAutoFollowPatternMock(); - const esResponse = { patterns: [autoFollowPattern] }; - - setHttpRequestResponse(null, esResponse); - - const response = await callRoute(routeHandler, {}, { params: { id: 1 } }); - expect(Object.keys(response.options.body)).toEqual(DESERIALIZED_KEYS); - }); - }); - - describe('delete()', () => { - beforeEach(() => { - resetHttpRequestResponses(); - routeHandler = routeRegistry.getRoutes().delete; - }); - - it('should delete a single item', async () => { - setHttpRequestResponse(null, { acknowledge: true }); - - const { - options: { body: response }, - } = await callRoute(routeHandler, {}, { params: { id: 'a' } }); - - expect(response.itemsDeleted).toEqual(['a']); - expect(response.errors).toEqual([]); - }); - - it('should accept a list of ids to delete', async () => { - setHttpRequestResponse(null, { acknowledge: true }); - setHttpRequestResponse(null, { acknowledge: true }); - setHttpRequestResponse(null, { acknowledge: true }); - - const response = await callRoute(routeHandler, {}, { params: { id: 'a,b,c' } }); - - expect(response.options.body.itemsDeleted).toEqual(['a', 'b', 'c']); - }); - - it('should catch error and return them in array', async () => { - const error = new Error('something went wrong'); - error.response = '{ "error": {} }'; - - setHttpRequestResponse(null, { acknowledge: true }); - setHttpRequestResponse(error); - - const { - options: { body: response }, - } = await callRoute(routeHandler, {}, { params: { id: 'a,b' } }); - - expect(response.itemsDeleted).toEqual(['a']); - expect(response.errors[0].id).toEqual('b'); - }); - }); - - describe('pause()', () => { - beforeEach(() => { - resetHttpRequestResponses(); - routeHandler = routeRegistry.getRoutes().pause; - }); - - it('accept a single item', async () => { - setHttpRequestResponse(null, { acknowledge: true }); - - const { - options: { body: response }, - } = await callRoute(routeHandler, {}, { params: { id: 'a' } }); - - expect(response.itemsPaused).toEqual(['a']); - expect(response.errors).toEqual([]); - }); - - it('should accept a list of items to pause', async () => { - setHttpRequestResponse(null, { acknowledge: true }); - setHttpRequestResponse(null, { acknowledge: true }); - setHttpRequestResponse(null, { acknowledge: true }); - - const response = await callRoute(routeHandler, {}, { params: { id: 'a,b,c' } }); - - expect(response.options.body.itemsPaused).toEqual(['a', 'b', 'c']); - }); - - it('should catch error and return them in array', async () => { - const error = new Error('something went wrong'); - error.response = '{ "error": {} }'; - - setHttpRequestResponse(null, { acknowledge: true }); - setHttpRequestResponse(error); - - const { - options: { body: response }, - } = await callRoute(routeHandler, {}, { params: { id: 'a,b' } }); - - expect(response.itemsPaused).toEqual(['a']); - expect(response.errors[0].id).toEqual('b'); - }); - }); - - describe('resume()', () => { - beforeEach(() => { - resetHttpRequestResponses(); - routeHandler = routeRegistry.getRoutes().resume; - }); - - it('accept a single item', async () => { - setHttpRequestResponse(null, { acknowledge: true }); - - const { - options: { body: response }, - } = await callRoute(routeHandler, {}, { params: { id: 'a' } }); - - expect(response.itemsResumed).toEqual(['a']); - expect(response.errors).toEqual([]); - }); - - it('should accept a list of items to pause', async () => { - setHttpRequestResponse(null, { acknowledge: true }); - setHttpRequestResponse(null, { acknowledge: true }); - setHttpRequestResponse(null, { acknowledge: true }); - - const response = await callRoute(routeHandler, {}, { params: { id: 'a,b,c' } }); - - expect(response.options.body.itemsResumed).toEqual(['a', 'b', 'c']); - }); - - it('should catch error and return them in array', async () => { - const error = new Error('something went wrong'); - error.response = '{ "error": {} }'; - - setHttpRequestResponse(null, { acknowledge: true }); - setHttpRequestResponse(error); - - const { - options: { body: response }, - } = await callRoute(routeHandler, {}, { params: { id: 'a,b' } }); - - expect(response.itemsResumed).toEqual(['a']); - expect(response.errors[0].id).toEqual('b'); - }); - }); -}); diff --git a/x-pack/legacy/plugins/cross_cluster_replication/server/np_ready/routes/api/__jest__/follower_index.test.js b/x-pack/legacy/plugins/cross_cluster_replication/server/np_ready/routes/api/__jest__/follower_index.test.js deleted file mode 100644 index f0139e5bd7011..0000000000000 --- a/x-pack/legacy/plugins/cross_cluster_replication/server/np_ready/routes/api/__jest__/follower_index.test.js +++ /dev/null @@ -1,312 +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 { deserializeFollowerIndex } from '../../../../../common/services/follower_index_serialization'; -import { - getFollowerIndexStatsMock, - getFollowerIndexListStatsMock, - getFollowerIndexInfoMock, - getFollowerIndexListInfoMock, -} from '../../../../../fixtures'; -import { callWithRequestFactory } from '../../../lib/call_with_request_factory'; -import { isEsErrorFactory } from '../../../lib/is_es_error_factory'; -import { registerFollowerIndexRoutes } from '../follower_index'; -import { createRouter, callRoute } from './helpers'; - -jest.mock('../../../lib/call_with_request_factory'); -jest.mock('../../../lib/is_es_error_factory'); -jest.mock('../../../lib/license_pre_routing_factory', () => ({ - licensePreRoutingFactory: ({ requestHandler }) => requestHandler, -})); - -const DESERIALIZED_KEYS = Object.keys( - deserializeFollowerIndex({ - ...getFollowerIndexInfoMock(), - ...getFollowerIndexStatsMock(), - }) -); - -let routeRegistry; - -/** - * Helper to extract all the different server route handler so we can easily call them in our tests. - * - * Important: This method registers the handlers in the order that they appear in the file, so - * if a 'server.route()' call is moved or deleted, then the HANDLER_INDEX_TO_ACTION must be updated here. - */ -const registerHandlers = () => { - const HANDLER_INDEX_TO_ACTION = { - 0: 'list', - 1: 'get', - 2: 'create', - 3: 'edit', - 4: 'pause', - 5: 'resume', - 6: 'unfollow', - }; - - routeRegistry = createRouter(HANDLER_INDEX_TO_ACTION); - registerFollowerIndexRoutes({ - __LEGACY: {}, - router: routeRegistry.router, - }); -}; - -/** - * Queue to save request response and errors - * It allows us to fake multiple responses from the - * callWithRequestFactory() when the request handler call it - * multiple times. - */ -let requestResponseQueue = []; - -/** - * Helper to mock the response from the call to Elasticsearch - * - * @param {*} err The mock error to throw - * @param {*} response The response to return - */ -const setHttpRequestResponse = (error, response) => { - requestResponseQueue.push({ error, response }); -}; - -const resetHttpRequestResponses = () => (requestResponseQueue = []); - -const getNextResponseFromQueue = () => { - if (!requestResponseQueue.length) { - return null; - } - - const next = requestResponseQueue.shift(); - if (next.error) { - return Promise.reject(next.error); - } - return Promise.resolve(next.response); -}; - -describe('[CCR API Routes] Follower Index', () => { - let routeHandler; - - beforeAll(() => { - isEsErrorFactory.mockReturnValue(() => false); - callWithRequestFactory.mockReturnValue(getNextResponseFromQueue); - registerHandlers(); - }); - - describe('list()', () => { - beforeEach(() => { - routeHandler = routeRegistry.getRoutes().list; - }); - - it('deserializes the response from Elasticsearch', async () => { - const totalResult = 2; - const infoResult = getFollowerIndexListInfoMock(totalResult); - const statsResult = getFollowerIndexListStatsMock( - totalResult, - infoResult.follower_indices.map(index => index.follower_index) - ); - setHttpRequestResponse(null, infoResult); - setHttpRequestResponse(null, statsResult); - - const { - options: { body: response }, - } = await callRoute(routeHandler); - const followerIndex = response.indices[0]; - - expect(response.indices.length).toEqual(totalResult); - expect(Object.keys(followerIndex)).toEqual(DESERIALIZED_KEYS); - }); - }); - - describe('get()', () => { - beforeEach(() => { - routeHandler = routeRegistry.getRoutes().get; - }); - - it('should return a single resource even though ES return an array with 1 item', async () => { - const mockId = 'test1'; - const followerIndexInfo = getFollowerIndexInfoMock(mockId); - const followerIndexStats = getFollowerIndexStatsMock(mockId); - - setHttpRequestResponse(null, { follower_indices: [followerIndexInfo] }); - setHttpRequestResponse(null, { indices: [followerIndexStats] }); - - const { - options: { body: response }, - } = await callRoute(routeHandler, {}, { params: { id: mockId } }); - expect(Object.keys(response)).toEqual(DESERIALIZED_KEYS); - }); - }); - - describe('create()', () => { - beforeEach(() => { - resetHttpRequestResponses(); - routeHandler = routeRegistry.getRoutes().create; - }); - - it('should return 200 status when follower index is created', async () => { - setHttpRequestResponse(null, { acknowledge: true }); - - const response = await callRoute( - routeHandler, - {}, - { - body: { - name: 'follower_index', - remoteCluster: 'remote_cluster', - leaderIndex: 'leader_index', - }, - } - ); - - expect(response.options.body).toEqual({ acknowledge: true }); - }); - }); - - describe('pause()', () => { - beforeEach(() => { - resetHttpRequestResponses(); - routeHandler = routeRegistry.getRoutes().pause; - }); - - it('should pause a single item', async () => { - setHttpRequestResponse(null, { acknowledge: true }); - - const { - options: { body: response }, - } = await callRoute(routeHandler, {}, { params: { id: '1' } }); - - expect(response.itemsPaused).toEqual(['1']); - expect(response.errors).toEqual([]); - }); - - it('should accept a list of ids to pause', async () => { - setHttpRequestResponse(null, { acknowledge: true }); - setHttpRequestResponse(null, { acknowledge: true }); - setHttpRequestResponse(null, { acknowledge: true }); - - const response = await callRoute(routeHandler, {}, { params: { id: '1,2,3' } }); - - expect(response.options.body.itemsPaused).toEqual(['1', '2', '3']); - }); - - it('should catch error and return them in array', async () => { - const error = new Error('something went wrong'); - error.response = '{ "error": {} }'; - - setHttpRequestResponse(null, { acknowledge: true }); - setHttpRequestResponse(error); - - const { - options: { body: response }, - } = await callRoute(routeHandler, {}, { params: { id: '1,2' } }); - - expect(response.itemsPaused).toEqual(['1']); - expect(response.errors[0].id).toEqual('2'); - }); - }); - - describe('resume()', () => { - beforeEach(() => { - resetHttpRequestResponses(); - routeHandler = routeRegistry.getRoutes().resume; - }); - - it('should resume a single item', async () => { - setHttpRequestResponse(null, { acknowledge: true }); - - const { - options: { body: response }, - } = await callRoute(routeHandler, {}, { params: { id: '1' } }); - - expect(response.itemsResumed).toEqual(['1']); - expect(response.errors).toEqual([]); - }); - - it('should accept a list of ids to resume', async () => { - setHttpRequestResponse(null, { acknowledge: true }); - setHttpRequestResponse(null, { acknowledge: true }); - setHttpRequestResponse(null, { acknowledge: true }); - - const response = await callRoute(routeHandler, {}, { params: { id: '1,2,3' } }); - - expect(response.options.body.itemsResumed).toEqual(['1', '2', '3']); - }); - - it('should catch error and return them in array', async () => { - const error = new Error('something went wrong'); - error.response = '{ "error": {} }'; - - setHttpRequestResponse(null, { acknowledge: true }); - setHttpRequestResponse(error); - - const { - options: { body: response }, - } = await callRoute(routeHandler, {}, { params: { id: '1,2' } }); - - expect(response.itemsResumed).toEqual(['1']); - expect(response.errors[0].id).toEqual('2'); - }); - }); - - describe('unfollow()', () => { - beforeEach(() => { - resetHttpRequestResponses(); - routeHandler = routeRegistry.getRoutes().unfollow; - }); - - it('should unfollow await single item', async () => { - setHttpRequestResponse(null, { acknowledge: true }); - setHttpRequestResponse(null, { acknowledge: true }); - setHttpRequestResponse(null, { acknowledge: true }); - setHttpRequestResponse(null, { acknowledge: true }); - - const { - options: { body: response }, - } = await callRoute(routeHandler, {}, { params: { id: '1' } }); - - expect(response.itemsUnfollowed).toEqual(['1']); - expect(response.errors).toEqual([]); - }); - - it('should accept a list of ids to unfollow', async () => { - setHttpRequestResponse(null, { acknowledge: true }); - setHttpRequestResponse(null, { acknowledge: true }); - setHttpRequestResponse(null, { acknowledge: true }); - setHttpRequestResponse(null, { acknowledge: true }); - setHttpRequestResponse(null, { acknowledge: true }); - setHttpRequestResponse(null, { acknowledge: true }); - setHttpRequestResponse(null, { acknowledge: true }); - setHttpRequestResponse(null, { acknowledge: true }); - setHttpRequestResponse(null, { acknowledge: true }); - setHttpRequestResponse(null, { acknowledge: true }); - setHttpRequestResponse(null, { acknowledge: true }); - setHttpRequestResponse(null, { acknowledge: true }); - - const response = await callRoute(routeHandler, {}, { params: { id: '1,2,3' } }); - - expect(response.options.body.itemsUnfollowed).toEqual(['1', '2', '3']); - }); - - it('should catch error and return them in array', async () => { - const error = new Error('something went wrong'); - error.response = '{ "error": {} }'; - - setHttpRequestResponse(null, { acknowledge: true }); - setHttpRequestResponse(null, { acknowledge: true }); - setHttpRequestResponse(null, { acknowledge: true }); - setHttpRequestResponse(null, { acknowledge: true }); - setHttpRequestResponse(null, { acknowledge: true }); - setHttpRequestResponse(error); - - const { - options: { body: response }, - } = await callRoute(routeHandler, {}, { params: { id: '1,2' } }); - - expect(response.itemsUnfollowed).toEqual(['1']); - expect(response.errors[0].id).toEqual('2'); - }); - }); -}); diff --git a/x-pack/legacy/plugins/cross_cluster_replication/server/np_ready/routes/api/__jest__/helpers.ts b/x-pack/legacy/plugins/cross_cluster_replication/server/np_ready/routes/api/__jest__/helpers.ts deleted file mode 100644 index 555fc0937c0ad..0000000000000 --- a/x-pack/legacy/plugins/cross_cluster_replication/server/np_ready/routes/api/__jest__/helpers.ts +++ /dev/null @@ -1,37 +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 { RequestHandler } from 'src/core/server'; -import { kibanaResponseFactory } from '../../../../../../../../../src/core/server'; - -export const callRoute = ( - route: RequestHandler, - ctx = {}, - request = {}, - response = kibanaResponseFactory -) => { - return route(ctx as any, request as any, response); -}; - -export const createRouter = (indexToActionMap: Record) => { - let index = 0; - const routeHandlers: Record> = {}; - const addHandler = (ignoreCtxForNow: any, handler: RequestHandler) => { - // Save handler and increment index - routeHandlers[indexToActionMap[index]] = handler; - index++; - }; - - return { - getRoutes: () => routeHandlers, - router: { - get: addHandler, - post: addHandler, - put: addHandler, - delete: addHandler, - }, - }; -}; diff --git a/x-pack/legacy/plugins/cross_cluster_replication/server/np_ready/routes/api/auto_follow_pattern.ts b/x-pack/legacy/plugins/cross_cluster_replication/server/np_ready/routes/api/auto_follow_pattern.ts deleted file mode 100644 index d458f1ccb354b..0000000000000 --- a/x-pack/legacy/plugins/cross_cluster_replication/server/np_ready/routes/api/auto_follow_pattern.ts +++ /dev/null @@ -1,301 +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 { schema } from '@kbn/config-schema'; -// @ts-ignore -import { callWithRequestFactory } from '../../lib/call_with_request_factory'; -import { isEsError } from '../../lib/is_es_error'; -// @ts-ignore -import { - deserializeAutoFollowPattern, - deserializeListAutoFollowPatterns, - serializeAutoFollowPattern, - // @ts-ignore -} from '../../../../common/services/auto_follow_pattern_serialization'; - -import { licensePreRoutingFactory } from '../../lib/license_pre_routing_factory'; -import { API_BASE_PATH } from '../../../../common/constants'; - -import { RouteDependencies } from '../types'; -import { mapErrorToKibanaHttpResponse } from '../map_to_kibana_http_error'; - -export const registerAutoFollowPatternRoutes = ({ router, __LEGACY }: RouteDependencies) => { - /** - * Returns a list of all auto-follow patterns - */ - router.get( - { - path: `${API_BASE_PATH}/auto_follow_patterns`, - validate: false, - }, - licensePreRoutingFactory({ - __LEGACY, - requestHandler: async (ctx, request, response) => { - const callWithRequest = callWithRequestFactory(__LEGACY.server, request); - - try { - const result = await callWithRequest('ccr.autoFollowPatterns'); - return response.ok({ - body: { - patterns: deserializeListAutoFollowPatterns(result.patterns), - }, - }); - } catch (err) { - return mapErrorToKibanaHttpResponse(err); - } - }, - }) - ); - - /** - * Create an auto-follow pattern - */ - router.post( - { - path: `${API_BASE_PATH}/auto_follow_patterns`, - validate: { - body: schema.object( - { - id: schema.string(), - }, - { unknowns: 'allow' } - ), - }, - }, - licensePreRoutingFactory({ - __LEGACY, - requestHandler: async (ctx, request, response) => { - const callWithRequest = callWithRequestFactory(__LEGACY.server, request); - const { id, ...rest } = request.body; - const body = serializeAutoFollowPattern(rest); - - /** - * First let's make sur that an auto-follow pattern with - * the same id does not exist. - */ - try { - await callWithRequest('ccr.autoFollowPattern', { id }); - // If we get here it means that an auto-follow pattern with the same id exists - return response.conflict({ - body: `An auto-follow pattern with the name "${id}" already exists.`, - }); - } catch (err) { - if (err.statusCode !== 404) { - return mapErrorToKibanaHttpResponse(err); - } - } - - try { - return response.ok({ - body: await callWithRequest('ccr.saveAutoFollowPattern', { id, body }), - }); - } catch (err) { - return mapErrorToKibanaHttpResponse(err); - } - }, - }) - ); - - /** - * Update an auto-follow pattern - */ - router.put( - { - path: `${API_BASE_PATH}/auto_follow_patterns/{id}`, - validate: { - params: schema.object({ - id: schema.string(), - }), - body: schema.object({}, { unknowns: 'allow' }), - }, - }, - licensePreRoutingFactory({ - __LEGACY, - requestHandler: async (ctx, request, response) => { - const callWithRequest = callWithRequestFactory(__LEGACY.server, request); - const { id } = request.params; - const body = serializeAutoFollowPattern(request.body); - - try { - return response.ok({ - body: await callWithRequest('ccr.saveAutoFollowPattern', { id, body }), - }); - } catch (err) { - return mapErrorToKibanaHttpResponse(err); - } - }, - }) - ); - - /** - * Returns a single auto-follow pattern - */ - router.get( - { - path: `${API_BASE_PATH}/auto_follow_patterns/{id}`, - validate: { - params: schema.object({ - id: schema.string(), - }), - }, - }, - licensePreRoutingFactory({ - __LEGACY, - requestHandler: async (ctx, request, response) => { - const callWithRequest = callWithRequestFactory(__LEGACY.server, request); - const { id } = request.params; - - try { - const result = await callWithRequest('ccr.autoFollowPattern', { id }); - const autoFollowPattern = result.patterns[0]; - - return response.ok({ - body: deserializeAutoFollowPattern(autoFollowPattern), - }); - } catch (err) { - return mapErrorToKibanaHttpResponse(err); - } - }, - }) - ); - - /** - * Delete an auto-follow pattern - */ - router.delete( - { - path: `${API_BASE_PATH}/auto_follow_patterns/{id}`, - validate: { - params: schema.object({ - id: schema.string(), - }), - }, - }, - licensePreRoutingFactory({ - __LEGACY, - requestHandler: async (ctx, request, response) => { - const callWithRequest = callWithRequestFactory(__LEGACY.server, request); - const { id } = request.params; - const ids = id.split(','); - - const itemsDeleted: string[] = []; - const errors: Array<{ id: string; error: any }> = []; - - await Promise.all( - ids.map(_id => - callWithRequest('ccr.deleteAutoFollowPattern', { id: _id }) - .then(() => itemsDeleted.push(_id)) - .catch((err: Error) => { - if (isEsError(err)) { - errors.push({ id: _id, error: mapErrorToKibanaHttpResponse(err) }); - } else { - errors.push({ id: _id, error: mapErrorToKibanaHttpResponse(err) }); - } - }) - ) - ); - - return response.ok({ - body: { - itemsDeleted, - errors, - }, - }); - }, - }) - ); - - /** - * Pause auto-follow pattern(s) - */ - router.post( - { - path: `${API_BASE_PATH}/auto_follow_patterns/{id}/pause`, - validate: { - params: schema.object({ - id: schema.string(), - }), - }, - }, - licensePreRoutingFactory({ - __LEGACY, - requestHandler: async (ctx, request, response) => { - const callWithRequest = callWithRequestFactory(__LEGACY.server, request); - const { id } = request.params; - const ids = id.split(','); - - const itemsPaused: string[] = []; - const errors: Array<{ id: string; error: any }> = []; - - await Promise.all( - ids.map(_id => - callWithRequest('ccr.pauseAutoFollowPattern', { id: _id }) - .then(() => itemsPaused.push(_id)) - .catch((err: Error) => { - if (isEsError(err)) { - errors.push({ id: _id, error: mapErrorToKibanaHttpResponse(err) }); - } else { - errors.push({ id: _id, error: mapErrorToKibanaHttpResponse(err) }); - } - }) - ) - ); - - return response.ok({ - body: { - itemsPaused, - errors, - }, - }); - }, - }) - ); - - /** - * Resume auto-follow pattern(s) - */ - router.post( - { - path: `${API_BASE_PATH}/auto_follow_patterns/{id}/resume`, - validate: { - params: schema.object({ - id: schema.string(), - }), - }, - }, - licensePreRoutingFactory({ - __LEGACY, - requestHandler: async (ctx, request, response) => { - const callWithRequest = callWithRequestFactory(__LEGACY.server, request); - const { id } = request.params; - const ids = id.split(','); - - const itemsResumed: string[] = []; - const errors: Array<{ id: string; error: any }> = []; - - await Promise.all( - ids.map(_id => - callWithRequest('ccr.resumeAutoFollowPattern', { id: _id }) - .then(() => itemsResumed.push(_id)) - .catch((err: Error) => { - if (isEsError(err)) { - errors.push({ id: _id, error: mapErrorToKibanaHttpResponse(err) }); - } else { - errors.push({ id: _id, error: mapErrorToKibanaHttpResponse(err) }); - } - }) - ) - ); - - return response.ok({ - body: { - itemsResumed, - errors, - }, - }); - }, - }) - ); -}; diff --git a/x-pack/legacy/plugins/cross_cluster_replication/server/np_ready/routes/api/ccr.ts b/x-pack/legacy/plugins/cross_cluster_replication/server/np_ready/routes/api/ccr.ts deleted file mode 100644 index b08b056ad2c8a..0000000000000 --- a/x-pack/legacy/plugins/cross_cluster_replication/server/np_ready/routes/api/ccr.ts +++ /dev/null @@ -1,112 +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 { API_BASE_PATH } from '../../../../common/constants'; -// @ts-ignore -import { callWithRequestFactory } from '../../lib/call_with_request_factory'; -// @ts-ignore -import { deserializeAutoFollowStats } from '../../lib/ccr_stats_serialization'; -import { licensePreRoutingFactory } from '../../lib/license_pre_routing_factory'; - -import { mapErrorToKibanaHttpResponse } from '../map_to_kibana_http_error'; -import { RouteDependencies } from '../types'; - -export const registerCcrRoutes = ({ router, __LEGACY }: RouteDependencies) => { - /** - * Returns Auto-follow stats - */ - router.get( - { - path: `${API_BASE_PATH}/stats/auto_follow`, - validate: false, - }, - licensePreRoutingFactory({ - __LEGACY, - requestHandler: async (ctx, request, response) => { - const callWithRequest = callWithRequestFactory(__LEGACY.server, request); - - try { - const { auto_follow_stats: autoFollowStats } = await callWithRequest('ccr.stats'); - - return response.ok({ - body: deserializeAutoFollowStats(autoFollowStats), - }); - } catch (err) { - return mapErrorToKibanaHttpResponse(err); - } - }, - }) - ); - - /** - * Returns whether the user has CCR permissions - */ - router.get( - { - path: `${API_BASE_PATH}/permissions`, - validate: false, - }, - licensePreRoutingFactory({ - __LEGACY, - requestHandler: async (ctx, request, response) => { - const xpackMainPlugin = __LEGACY.server.plugins.xpack_main; - const xpackInfo = xpackMainPlugin && xpackMainPlugin.info; - - if (!xpackInfo) { - // xpackInfo is updated via poll, so it may not be available until polling has begun. - // In this rare situation, tell the client the service is temporarily unavailable. - return response.customError({ - statusCode: 503, - body: 'Security info unavailable', - }); - } - - const securityInfo = xpackInfo && xpackInfo.isAvailable() && xpackInfo.feature('security'); - if (!securityInfo || !securityInfo.isAvailable() || !securityInfo.isEnabled()) { - // If security isn't enabled or available (in the case where security is enabled but license reverted to Basic) let the user use CCR. - return response.ok({ - body: { - hasPermission: true, - missingClusterPrivileges: [], - }, - }); - } - - const callWithRequest = callWithRequestFactory(__LEGACY.server, request); - - try { - const { has_all_requested: hasPermission, cluster } = await callWithRequest( - 'ccr.permissions', - { - body: { - cluster: ['manage', 'manage_ccr'], - }, - } - ); - - const missingClusterPrivileges = Object.keys(cluster).reduce( - (permissions: any, permissionName: any) => { - if (!cluster[permissionName]) { - permissions.push(permissionName); - return permissions; - } - }, - [] as any[] - ); - - return response.ok({ - body: { - hasPermission, - missingClusterPrivileges, - }, - }); - } catch (err) { - return mapErrorToKibanaHttpResponse(err); - } - }, - }) - ); -}; diff --git a/x-pack/legacy/plugins/cross_cluster_replication/server/np_ready/routes/api/follower_index.ts b/x-pack/legacy/plugins/cross_cluster_replication/server/np_ready/routes/api/follower_index.ts deleted file mode 100644 index 1d7dacf4a8688..0000000000000 --- a/x-pack/legacy/plugins/cross_cluster_replication/server/np_ready/routes/api/follower_index.ts +++ /dev/null @@ -1,357 +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 { schema } from '@kbn/config-schema'; -import { - deserializeFollowerIndex, - deserializeListFollowerIndices, - serializeFollowerIndex, - serializeAdvancedSettings, - // @ts-ignore -} from '../../../../common/services/follower_index_serialization'; -import { API_BASE_PATH } from '../../../../common/constants'; -// @ts-ignore -import { removeEmptyFields } from '../../../../common/services/utils'; -// @ts-ignore -import { callWithRequestFactory } from '../../lib/call_with_request_factory'; -import { licensePreRoutingFactory } from '../../lib/license_pre_routing_factory'; - -import { RouteDependencies } from '../types'; -import { mapErrorToKibanaHttpResponse } from '../map_to_kibana_http_error'; - -export const registerFollowerIndexRoutes = ({ router, __LEGACY }: RouteDependencies) => { - /** - * Returns a list of all follower indices - */ - router.get( - { - path: `${API_BASE_PATH}/follower_indices`, - validate: false, - }, - licensePreRoutingFactory({ - __LEGACY, - requestHandler: async (ctx, request, response) => { - const callWithRequest = callWithRequestFactory(__LEGACY.server, request); - - try { - const { follower_indices: followerIndices } = await callWithRequest('ccr.info', { - id: '_all', - }); - - const { - follow_stats: { indices: followerIndicesStats }, - } = await callWithRequest('ccr.stats'); - - const followerIndicesStatsMap = followerIndicesStats.reduce((map: any, stats: any) => { - map[stats.index] = stats; - return map; - }, {}); - - const collatedFollowerIndices = followerIndices.map((followerIndex: any) => { - return { - ...followerIndex, - ...followerIndicesStatsMap[followerIndex.follower_index], - }; - }); - - return response.ok({ - body: { - indices: deserializeListFollowerIndices(collatedFollowerIndices), - }, - }); - } catch (err) { - return mapErrorToKibanaHttpResponse(err); - } - }, - }) - ); - - /** - * Returns a single follower index pattern - */ - router.get( - { - path: `${API_BASE_PATH}/follower_indices/{id}`, - validate: { - params: schema.object({ - id: schema.string(), - }), - }, - }, - licensePreRoutingFactory({ - __LEGACY, - requestHandler: async (ctx, request, response) => { - const callWithRequest = callWithRequestFactory(__LEGACY.server, request); - const { id } = request.params; - - try { - const { follower_indices: followerIndices } = await callWithRequest('ccr.info', { id }); - - const followerIndexInfo = followerIndices && followerIndices[0]; - - if (!followerIndexInfo) { - return response.notFound({ - body: `The follower index "${id}" does not exist.`, - }); - } - - // If this follower is paused, skip call to ES stats api since it will return 404 - if (followerIndexInfo.status === 'paused') { - return response.ok({ - body: deserializeFollowerIndex({ - ...followerIndexInfo, - }), - }); - } else { - const { - indices: followerIndicesStats, - } = await callWithRequest('ccr.followerIndexStats', { id }); - - return response.ok({ - body: deserializeFollowerIndex({ - ...followerIndexInfo, - ...(followerIndicesStats ? followerIndicesStats[0] : {}), - }), - }); - } - } catch (err) { - return mapErrorToKibanaHttpResponse(err); - } - }, - }) - ); - - /** - * Create a follower index - */ - router.post( - { - path: `${API_BASE_PATH}/follower_indices`, - validate: { - body: schema.object( - { - name: schema.string(), - }, - { unknowns: 'allow' } - ), - }, - }, - licensePreRoutingFactory({ - __LEGACY, - requestHandler: async (ctx, request, response) => { - const callWithRequest = callWithRequestFactory(__LEGACY.server, request); - const { name, ...rest } = request.body; - const body = removeEmptyFields(serializeFollowerIndex(rest)); - - try { - return response.ok({ - body: await callWithRequest('ccr.saveFollowerIndex', { name, body }), - }); - } catch (err) { - return mapErrorToKibanaHttpResponse(err); - } - }, - }) - ); - - /** - * Edit a follower index - */ - router.put( - { - path: `${API_BASE_PATH}/follower_indices/{id}`, - validate: { - params: schema.object({ id: schema.string() }), - body: schema.object({ - maxReadRequestOperationCount: schema.maybe(schema.number()), - maxOutstandingReadRequests: schema.maybe(schema.number()), - maxReadRequestSize: schema.maybe(schema.string()), // byte value - maxWriteRequestOperationCount: schema.maybe(schema.number()), - maxWriteRequestSize: schema.maybe(schema.string()), // byte value - maxOutstandingWriteRequests: schema.maybe(schema.number()), - maxWriteBufferCount: schema.maybe(schema.number()), - maxWriteBufferSize: schema.maybe(schema.string()), // byte value - maxRetryDelay: schema.maybe(schema.string()), // time value - readPollTimeout: schema.maybe(schema.string()), // time value - }), - }, - }, - licensePreRoutingFactory({ - __LEGACY, - requestHandler: async (ctx, request, response) => { - const callWithRequest = callWithRequestFactory(__LEGACY.server, request); - const { id } = request.params; - - // We need to first pause the follower and then resume it passing the advanced settings - try { - const { follower_indices: followerIndices } = await callWithRequest('ccr.info', { id }); - const followerIndexInfo = followerIndices && followerIndices[0]; - if (!followerIndexInfo) { - return response.notFound({ body: `The follower index "${id}" does not exist.` }); - } - - // Retrieve paused state instead of pulling it from the payload to ensure it's not stale. - const isPaused = followerIndexInfo.status === 'paused'; - // Pause follower if not already paused - if (!isPaused) { - await callWithRequest('ccr.pauseFollowerIndex', { id }); - } - - // Resume follower - const body = removeEmptyFields(serializeAdvancedSettings(request.body)); - return response.ok({ - body: await callWithRequest('ccr.resumeFollowerIndex', { id, body }), - }); - } catch (err) { - return mapErrorToKibanaHttpResponse(err); - } - }, - }) - ); - - /** - * Pauses a follower index - */ - router.put( - { - path: `${API_BASE_PATH}/follower_indices/{id}/pause`, - validate: { - params: schema.object({ id: schema.string() }), - }, - }, - licensePreRoutingFactory({ - __LEGACY, - requestHandler: async (ctx, request, response) => { - const callWithRequest = callWithRequestFactory(__LEGACY.server, request); - const { id } = request.params; - const ids = id.split(','); - - const itemsPaused: string[] = []; - const errors: Array<{ id: string; error: any }> = []; - - await Promise.all( - ids.map(_id => - callWithRequest('ccr.pauseFollowerIndex', { id: _id }) - .then(() => itemsPaused.push(_id)) - .catch((err: Error) => { - errors.push({ id: _id, error: mapErrorToKibanaHttpResponse(err) }); - }) - ) - ); - - return response.ok({ - body: { - itemsPaused, - errors, - }, - }); - }, - }) - ); - - /** - * Resumes a follower index - */ - router.put( - { - path: `${API_BASE_PATH}/follower_indices/{id}/resume`, - validate: { - params: schema.object({ id: schema.string() }), - }, - }, - licensePreRoutingFactory({ - __LEGACY, - requestHandler: async (ctx, request, response) => { - const callWithRequest = callWithRequestFactory(__LEGACY.server, request); - const { id } = request.params; - const ids = id.split(','); - - const itemsResumed: string[] = []; - const errors: Array<{ id: string; error: any }> = []; - - await Promise.all( - ids.map(_id => - callWithRequest('ccr.resumeFollowerIndex', { id: _id }) - .then(() => itemsResumed.push(_id)) - .catch((err: Error) => { - errors.push({ id: _id, error: mapErrorToKibanaHttpResponse(err) }); - }) - ) - ); - - return response.ok({ - body: { - itemsResumed, - errors, - }, - }); - }, - }) - ); - - /** - * Unfollow follower index's leader index - */ - router.put( - { - path: `${API_BASE_PATH}/follower_indices/{id}/unfollow`, - validate: { - params: schema.object({ id: schema.string() }), - }, - }, - licensePreRoutingFactory({ - __LEGACY, - requestHandler: async (ctx, request, response) => { - const callWithRequest = callWithRequestFactory(__LEGACY.server, request); - const { id } = request.params; - const ids = id.split(','); - - const itemsUnfollowed: string[] = []; - const itemsNotOpen: string[] = []; - const errors: Array<{ id: string; error: any }> = []; - - await Promise.all( - ids.map(async _id => { - try { - // Try to pause follower, let it fail silently since it may already be paused - try { - await callWithRequest('ccr.pauseFollowerIndex', { id: _id }); - } catch (e) { - // Swallow errors - } - - // Close index - await callWithRequest('indices.close', { index: _id }); - - // Unfollow leader - await callWithRequest('ccr.unfollowLeaderIndex', { id: _id }); - - // Try to re-open the index, store failures in a separate array to surface warnings in the UI - // This will allow users to query their index normally after unfollowing - try { - await callWithRequest('indices.open', { index: _id }); - } catch (e) { - itemsNotOpen.push(_id); - } - - // Push success - itemsUnfollowed.push(_id); - } catch (err) { - errors.push({ id: _id, error: mapErrorToKibanaHttpResponse(err) }); - } - }) - ); - - return response.ok({ - body: { - itemsUnfollowed, - itemsNotOpen, - errors, - }, - }); - }, - }) - ); -}; diff --git a/x-pack/legacy/plugins/cross_cluster_replication/server/np_ready/routes/map_to_kibana_http_error.ts b/x-pack/legacy/plugins/cross_cluster_replication/server/np_ready/routes/map_to_kibana_http_error.ts deleted file mode 100644 index 6a81bd26dc47d..0000000000000 --- a/x-pack/legacy/plugins/cross_cluster_replication/server/np_ready/routes/map_to_kibana_http_error.ts +++ /dev/null @@ -1,26 +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 { kibanaResponseFactory } from '../../../../../../../src/core/server'; -// @ts-ignore -import { wrapEsError } from '../lib/error_wrappers'; -import { isEsError } from '../lib/is_es_error'; - -export const mapErrorToKibanaHttpResponse = (err: any) => { - if (isEsError(err)) { - const { statusCode, message, body } = wrapEsError(err); - return kibanaResponseFactory.customError({ - statusCode, - body: { - message, - attributes: { - cause: body?.cause, - }, - }, - }); - } - return kibanaResponseFactory.internalError(err); -}; diff --git a/x-pack/legacy/plugins/cross_cluster_replication/server/np_ready/routes/types.ts b/x-pack/legacy/plugins/cross_cluster_replication/server/np_ready/routes/types.ts deleted file mode 100644 index 7f57c20c536e0..0000000000000 --- a/x-pack/legacy/plugins/cross_cluster_replication/server/np_ready/routes/types.ts +++ /dev/null @@ -1,13 +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 { IRouter } from 'src/core/server'; - -export interface RouteDependencies { - router: IRouter; - __LEGACY: { - server: any; - }; -} diff --git a/x-pack/plugins/cross_cluster_replication/common/constants/index.ts b/x-pack/plugins/cross_cluster_replication/common/constants/index.ts new file mode 100644 index 0000000000000..797141b0996af --- /dev/null +++ b/x-pack/plugins/cross_cluster_replication/common/constants/index.ts @@ -0,0 +1,44 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { i18n } from '@kbn/i18n'; + +import { LicenseType } from '../../../licensing/common/types'; + +const platinumLicense: LicenseType = 'platinum'; + +export const PLUGIN = { + ID: 'crossClusterReplication', + TITLE: i18n.translate('xpack.crossClusterReplication.appTitle', { + defaultMessage: 'Cross-Cluster Replication', + }), + minimumLicenseType: platinumLicense, +}; + +export const APPS = { + CCR_APP: 'ccr', + REMOTE_CLUSTER_APP: 'remote_cluster', +}; + +export const MANAGEMENT_ID = 'cross_cluster_replication'; +export const BASE_PATH = `/management/elasticsearch/${MANAGEMENT_ID}`; +export const BASE_PATH_REMOTE_CLUSTERS = '/management/elasticsearch/remote_clusters'; +export const API_BASE_PATH = '/api/cross_cluster_replication'; +export const API_REMOTE_CLUSTERS_BASE_PATH = '/api/remote_clusters'; +export const API_INDEX_MANAGEMENT_BASE_PATH = '/api/index_management'; + +export const FOLLOWER_INDEX_ADVANCED_SETTINGS = { + maxReadRequestOperationCount: 5120, + maxOutstandingReadRequests: 12, + maxReadRequestSize: '32mb', + maxWriteRequestOperationCount: 5120, + maxWriteRequestSize: '9223372036854775807b', + maxOutstandingWriteRequests: 9, + maxWriteBufferCount: 2147483647, + maxWriteBufferSize: '512mb', + maxRetryDelay: '500ms', + readPollTimeout: '1m', +}; diff --git a/x-pack/plugins/cross_cluster_replication/common/services/__snapshots__/follower_index_serialization.test.ts.snap b/x-pack/plugins/cross_cluster_replication/common/services/__snapshots__/follower_index_serialization.test.ts.snap new file mode 100644 index 0000000000000..c20556fe1434d --- /dev/null +++ b/x-pack/plugins/cross_cluster_replication/common/services/__snapshots__/follower_index_serialization.test.ts.snap @@ -0,0 +1,128 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`[CCR] follower index serialization deserializeFollowerIndex() deserializes Elasticsearch follower index object 1`] = ` +Object { + "leaderIndex": "leader 1", + "maxOutstandingReadRequests": 1, + "maxOutstandingWriteRequests": 1, + "maxReadRequestOperationCount": 1, + "maxReadRequestSize": "1b", + "maxRetryDelay": "1s", + "maxWriteBufferCount": 1, + "maxWriteBufferSize": "1b", + "maxWriteRequestOperationCount": 1, + "maxWriteRequestSize": "1b", + "name": "follower index 1", + "readPollTimeout": "1s", + "remoteCluster": "cluster 1", + "shards": Array [ + Object { + "bytesReadCount": 1, + "failedReadRequestsCount": 1, + "failedWriteRequestsCount": 1, + "followerGlobalCheckpoint": 1, + "followerMappingVersion": 1, + "followerMaxSequenceNum": 1, + "followerSettingsVersion": 1, + "id": 1, + "lastRequestedSequenceNum": 1, + "leaderGlobalCheckpoint": 1, + "leaderIndex": "leader 1", + "leaderMaxSequenceNum": 1, + "operationsReadCount": 1, + "operationsWrittenCount": 1, + "outstandingReadRequestsCount": 1, + "outstandingWriteRequestsCount": 1, + "readExceptions": Array [], + "remoteCluster": "cluster 1", + "successfulReadRequestCount": 1, + "successfulWriteRequestsCount": 1, + "timeSinceLastReadMs": 1, + "totalReadRemoteExecTimeMs": 1, + "totalReadTimeMs": 1, + "totalWriteTimeMs": 1, + "writeBufferOperationsCount": 1, + "writeBufferSizeBytes": 1, + }, + Object { + "bytesReadCount": undefined, + "failedReadRequestsCount": undefined, + "failedWriteRequestsCount": undefined, + "followerGlobalCheckpoint": undefined, + "followerMappingVersion": undefined, + "followerMaxSequenceNum": undefined, + "followerSettingsVersion": undefined, + "id": "shard 2", + "lastRequestedSequenceNum": undefined, + "leaderGlobalCheckpoint": undefined, + "leaderIndex": "leader_index 2", + "leaderMaxSequenceNum": undefined, + "operationsReadCount": undefined, + "operationsWrittenCount": undefined, + "outstandingReadRequestsCount": undefined, + "outstandingWriteRequestsCount": undefined, + "readExceptions": undefined, + "remoteCluster": "remote_cluster 2", + "successfulReadRequestCount": undefined, + "successfulWriteRequestsCount": undefined, + "timeSinceLastReadMs": undefined, + "totalReadRemoteExecTimeMs": undefined, + "totalReadTimeMs": undefined, + "totalWriteTimeMs": undefined, + "writeBufferOperationsCount": undefined, + "writeBufferSizeBytes": undefined, + }, + ], + "status": "active", +} +`; + +exports[`[CCR] follower index serialization deserializeShard() deserializes shard 1`] = ` +Object { + "bytesReadCount": 1, + "failedReadRequestsCount": 1, + "failedWriteRequestsCount": 1, + "followerGlobalCheckpoint": 1, + "followerMappingVersion": 1, + "followerMaxSequenceNum": 1, + "followerSettingsVersion": 1, + "id": 1, + "lastRequestedSequenceNum": 1, + "leaderGlobalCheckpoint": 1, + "leaderIndex": "leader index", + "leaderMaxSequenceNum": 1, + "operationsReadCount": 1, + "operationsWrittenCount": 1, + "outstandingReadRequestsCount": 1, + "outstandingWriteRequestsCount": 1, + "readExceptions": Array [ + "read exception", + ], + "remoteCluster": "remote cluster", + "successfulReadRequestCount": 1, + "successfulWriteRequestsCount": 1, + "timeSinceLastReadMs": 1, + "totalReadRemoteExecTimeMs": 1, + "totalReadTimeMs": 1, + "totalWriteTimeMs": 1, + "writeBufferOperationsCount": 1, + "writeBufferSizeBytes": 1, +} +`; + +exports[`[CCR] follower index serialization serializeFollowerIndex() serializes object to Elasticsearch follower index object 1`] = ` +Object { + "leader_index": "leader index", + "max_outstanding_read_requests": 1, + "max_outstanding_write_requests": 1, + "max_read_request_operation_count": 1, + "max_read_request_size": "1b", + "max_retry_delay": "1s", + "max_write_buffer_count": 1, + "max_write_buffer_size": "1b", + "max_write_request_operation_count": 1, + "max_write_request_size": "1b", + "read_poll_timeout": "1s", + "remote_cluster": "remote cluster", +} +`; diff --git a/x-pack/legacy/plugins/cross_cluster_replication/common/services/auto_follow_pattern_serialization.test.js b/x-pack/plugins/cross_cluster_replication/common/services/auto_follow_pattern_serialization.test.ts similarity index 85% rename from x-pack/legacy/plugins/cross_cluster_replication/common/services/auto_follow_pattern_serialization.test.js rename to x-pack/plugins/cross_cluster_replication/common/services/auto_follow_pattern_serialization.test.ts index eef87a6cc4c89..fe3e59f21ee23 100644 --- a/x-pack/legacy/plugins/cross_cluster_replication/common/services/auto_follow_pattern_serialization.test.js +++ b/x-pack/plugins/cross_cluster_replication/common/services/auto_follow_pattern_serialization.test.ts @@ -4,6 +4,8 @@ * you may not use this file except in compliance with the Elastic License. */ +import { AutoFollowPattern, AutoFollowPatternFromEs } from '../types'; + import { deserializeAutoFollowPattern, deserializeListAutoFollowPatterns, @@ -12,13 +14,10 @@ import { describe('[CCR] auto-follow_serialization', () => { describe('deserializeAutoFollowPattern()', () => { - it('should return empty object if name or esObject are not provided', () => { - expect(deserializeAutoFollowPattern()).toEqual({}); - }); - it('should deserialize Elasticsearch object', () => { const expected = { name: 'some-name', + active: true, remoteCluster: 'foo', leaderIndexPatterns: ['foo-*'], followIndexPattern: 'bar', @@ -27,13 +26,14 @@ describe('[CCR] auto-follow_serialization', () => { const esObject = { name: 'some-name', pattern: { + active: true, remote_cluster: expected.remoteCluster, leader_index_patterns: expected.leaderIndexPatterns, follow_index_pattern: expected.followIndexPattern, }, }; - expect(deserializeAutoFollowPattern(esObject)).toEqual(expected); + expect(deserializeAutoFollowPattern(esObject as AutoFollowPatternFromEs)).toEqual(expected); }); }); @@ -78,7 +78,9 @@ describe('[CCR] auto-follow_serialization', () => { ], }; - expect(deserializeListAutoFollowPatterns(esObjects.patterns)).toEqual(expected); + expect( + deserializeListAutoFollowPatterns(esObjects.patterns as AutoFollowPatternFromEs[]) + ).toEqual(expected); }); }); @@ -96,7 +98,7 @@ describe('[CCR] auto-follow_serialization', () => { followIndexPattern: expected.follow_index_pattern, }; - expect(serializeAutoFollowPattern(object)).toEqual(expected); + expect(serializeAutoFollowPattern(object as AutoFollowPattern)).toEqual(expected); }); }); }); diff --git a/x-pack/plugins/cross_cluster_replication/common/services/auto_follow_pattern_serialization.ts b/x-pack/plugins/cross_cluster_replication/common/services/auto_follow_pattern_serialization.ts new file mode 100644 index 0000000000000..265af0ede1462 --- /dev/null +++ b/x-pack/plugins/cross_cluster_replication/common/services/auto_follow_pattern_serialization.ts @@ -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 { AutoFollowPattern, AutoFollowPatternFromEs, AutoFollowPatternToEs } from '../types'; + +export const deserializeAutoFollowPattern = ( + autoFollowPattern: AutoFollowPatternFromEs +): AutoFollowPattern => { + const { + name, + pattern: { active, remote_cluster, leader_index_patterns, follow_index_pattern }, + } = autoFollowPattern; + + return { + name, + active, + remoteCluster: remote_cluster, + leaderIndexPatterns: leader_index_patterns, + followIndexPattern: follow_index_pattern, + }; +}; + +export const deserializeListAutoFollowPatterns = ( + autoFollowPatterns: AutoFollowPatternFromEs[] +): AutoFollowPattern[] => autoFollowPatterns.map(deserializeAutoFollowPattern); + +export const serializeAutoFollowPattern = ({ + remoteCluster, + leaderIndexPatterns, + followIndexPattern, +}: AutoFollowPattern): AutoFollowPatternToEs => ({ + remote_cluster: remoteCluster, + leader_index_patterns: leaderIndexPatterns, + follow_index_pattern: followIndexPattern, +}); diff --git a/x-pack/plugins/cross_cluster_replication/common/services/follower_index_serialization.test.ts b/x-pack/plugins/cross_cluster_replication/common/services/follower_index_serialization.test.ts new file mode 100644 index 0000000000000..bfe3e1b3443e6 --- /dev/null +++ b/x-pack/plugins/cross_cluster_replication/common/services/follower_index_serialization.test.ts @@ -0,0 +1,224 @@ +/* + * 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 { ShardFromEs, FollowerIndexFromEs, FollowerIndex } from '../types'; + +import { + deserializeShard, + deserializeFollowerIndex, + deserializeListFollowerIndices, + serializeFollowerIndex, +} from './follower_index_serialization'; + +describe('[CCR] follower index serialization', () => { + describe('deserializeShard()', () => { + it('deserializes shard', () => { + const serializedShard = { + remote_cluster: 'remote cluster', + leader_index: 'leader index', + shard_id: 1, + leader_global_checkpoint: 1, + leader_max_seq_no: 1, + follower_global_checkpoint: 1, + follower_max_seq_no: 1, + last_requested_seq_no: 1, + outstanding_read_requests: 1, + outstanding_write_requests: 1, + write_buffer_operation_count: 1, + write_buffer_size_in_bytes: 1, + follower_mapping_version: 1, + follower_settings_version: 1, + total_read_time_millis: 1, + total_read_remote_exec_time_millis: 1, + successful_read_requests: 1, + failed_read_requests: 1, + operations_read: 1, + bytes_read: 1, + total_write_time_millis: 1, + successful_write_requests: 1, + failed_write_requests: 1, + operations_written: 1, + read_exceptions: ['read exception'], + time_since_last_read_millis: 1, + }; + + expect(deserializeShard(serializedShard as ShardFromEs)).toMatchSnapshot(); + }); + }); + + describe('deserializeFollowerIndex()', () => { + it('deserializes Elasticsearch follower index object', () => { + const serializedFollowerIndex = { + follower_index: 'follower index 1', + remote_cluster: 'cluster 1', + leader_index: 'leader 1', + status: 'active', + parameters: { + max_read_request_operation_count: 1, + max_outstanding_read_requests: 1, + max_read_request_size: '1b', + max_write_request_operation_count: 1, + max_write_request_size: '1b', + max_outstanding_write_requests: 1, + max_write_buffer_count: 1, + max_write_buffer_size: '1b', + max_retry_delay: '1s', + read_poll_timeout: '1s', + }, + shards: [ + { + remote_cluster: 'cluster 1', + leader_index: 'leader 1', + shard_id: 1, + leader_global_checkpoint: 1, + leader_max_seq_no: 1, + follower_global_checkpoint: 1, + follower_max_seq_no: 1, + last_requested_seq_no: 1, + outstanding_read_requests: 1, + outstanding_write_requests: 1, + write_buffer_operation_count: 1, + write_buffer_size_in_bytes: 1, + follower_mapping_version: 1, + follower_settings_version: 1, + total_read_time_millis: 1, + total_read_remote_exec_time_millis: 1, + successful_read_requests: 1, + failed_read_requests: 1, + operations_read: 1, + bytes_read: 1, + total_write_time_millis: 1, + successful_write_requests: 1, + failed_write_requests: 1, + operations_written: 1, + // This is an array of exception objects + read_exceptions: [], + time_since_last_read_millis: 1, + }, + { + remote_cluster: 'remote_cluster 2', + leader_index: 'leader_index 2', + shard_id: 'shard 2', + }, + ], + }; + + expect( + deserializeFollowerIndex(serializedFollowerIndex as FollowerIndexFromEs) + ).toMatchSnapshot(); + }); + }); + + describe('deserializeListFollowerIndices()', () => { + it('deserializes list of Elasticsearch follower index objects', () => { + const serializedFollowerIndexList = [ + { + follower_index: 'follower index 1', + remote_cluster: 'cluster 1', + leader_index: 'leader 1', + status: 'active', + parameters: { + max_read_request_operation_count: 1, + max_outstanding_read_requests: 1, + max_read_request_size: '1b', + max_write_request_operation_count: 1, + max_write_request_size: '1b', + max_outstanding_write_requests: 1, + max_write_buffer_count: 1, + max_write_buffer_size: '1b', + max_retry_delay: '1s', + read_poll_timeout: '1s', + }, + shards: [], + }, + { + follower_index: 'follower index 2', + remote_cluster: 'cluster 2', + leader_index: 'leader 2', + status: 'paused', + parameters: { + max_read_request_operation_count: 2, + max_outstanding_read_requests: 2, + max_read_request_size: '2b', + max_write_request_operation_count: 2, + max_write_request_size: '2b', + max_outstanding_write_requests: 2, + max_write_buffer_count: 2, + max_write_buffer_size: '2b', + max_retry_delay: '2s', + read_poll_timeout: '2s', + }, + shards: [], + }, + ]; + + const deserializedFollowerIndexList = [ + { + name: 'follower index 1', + remoteCluster: 'cluster 1', + leaderIndex: 'leader 1', + status: 'active', + maxReadRequestOperationCount: 1, + maxOutstandingReadRequests: 1, + maxReadRequestSize: '1b', + maxWriteRequestOperationCount: 1, + maxWriteRequestSize: '1b', + maxOutstandingWriteRequests: 1, + maxWriteBufferCount: 1, + maxWriteBufferSize: '1b', + maxRetryDelay: '1s', + readPollTimeout: '1s', + shards: [], + }, + { + name: 'follower index 2', + remoteCluster: 'cluster 2', + leaderIndex: 'leader 2', + status: 'paused', + maxReadRequestOperationCount: 2, + maxOutstandingReadRequests: 2, + maxReadRequestSize: '2b', + maxWriteRequestOperationCount: 2, + maxWriteRequestSize: '2b', + maxOutstandingWriteRequests: 2, + maxWriteBufferCount: 2, + maxWriteBufferSize: '2b', + maxRetryDelay: '2s', + readPollTimeout: '2s', + shards: [], + }, + ]; + + expect(deserializeListFollowerIndices(serializedFollowerIndexList)).toEqual( + deserializedFollowerIndexList + ); + }); + }); + + describe('serializeFollowerIndex()', () => { + it('serializes object to Elasticsearch follower index object', () => { + const deserializedFollowerIndex = { + name: 'test', + status: 'active', + shards: [], + remoteCluster: 'remote cluster', + leaderIndex: 'leader index', + maxReadRequestOperationCount: 1, + maxOutstandingReadRequests: 1, + maxReadRequestSize: '1b', + maxWriteRequestOperationCount: 1, + maxWriteRequestSize: '1b', + maxOutstandingWriteRequests: 1, + maxWriteBufferCount: 1, + maxWriteBufferSize: '1b', + maxRetryDelay: '1s', + readPollTimeout: '1s', + }; + + expect(serializeFollowerIndex(deserializedFollowerIndex as FollowerIndex)).toMatchSnapshot(); + }); + }); +}); diff --git a/x-pack/legacy/plugins/cross_cluster_replication/common/services/follower_index_serialization.js b/x-pack/plugins/cross_cluster_replication/common/services/follower_index_serialization.ts similarity index 87% rename from x-pack/legacy/plugins/cross_cluster_replication/common/services/follower_index_serialization.js rename to x-pack/plugins/cross_cluster_replication/common/services/follower_index_serialization.ts index c41fde8f7818d..df476a0b2db89 100644 --- a/x-pack/legacy/plugins/cross_cluster_replication/common/services/follower_index_serialization.js +++ b/x-pack/plugins/cross_cluster_replication/common/services/follower_index_serialization.ts @@ -4,7 +4,16 @@ * you may not use this file except in compliance with the Elastic License. */ -/* eslint-disable camelcase */ +import { + ShardFromEs, + Shard, + FollowerIndexFromEs, + FollowerIndex, + FollowerIndexToEs, + FollowerIndexAdvancedSettings, + FollowerIndexAdvancedSettingsToEs, +} from '../types'; + export const deserializeShard = ({ remote_cluster, leader_index, @@ -32,7 +41,7 @@ export const deserializeShard = ({ operations_written, read_exceptions, time_since_last_read_millis, -}) => ({ +}: ShardFromEs): Shard => ({ id: shard_id, remoteCluster: remote_cluster, leaderIndex: leader_index, @@ -61,9 +70,7 @@ export const deserializeShard = ({ readExceptions: read_exceptions, timeSinceLastReadMs: time_since_last_read_millis, }); -/* eslint-enable camelcase */ -/* eslint-disable camelcase */ export const deserializeFollowerIndex = ({ follower_index, remote_cluster, @@ -82,7 +89,7 @@ export const deserializeFollowerIndex = ({ read_poll_timeout, } = {}, shards, -}) => ({ +}: FollowerIndexFromEs): FollowerIndex => ({ name: follower_index, remoteCluster: remote_cluster, leaderIndex: leader_index, @@ -99,10 +106,10 @@ export const deserializeFollowerIndex = ({ readPollTimeout: read_poll_timeout, shards: shards && shards.map(deserializeShard), }); -/* eslint-enable camelcase */ -export const deserializeListFollowerIndices = followerIndices => - followerIndices.map(deserializeFollowerIndex); +export const deserializeListFollowerIndices = ( + followerIndices: FollowerIndexFromEs[] +): FollowerIndex[] => followerIndices.map(deserializeFollowerIndex); export const serializeAdvancedSettings = ({ maxReadRequestOperationCount, @@ -115,7 +122,7 @@ export const serializeAdvancedSettings = ({ maxWriteBufferSize, maxRetryDelay, readPollTimeout, -}) => ({ +}: FollowerIndexAdvancedSettings): FollowerIndexAdvancedSettingsToEs => ({ max_read_request_operation_count: maxReadRequestOperationCount, max_outstanding_read_requests: maxOutstandingReadRequests, max_read_request_size: maxReadRequestSize, @@ -128,7 +135,7 @@ export const serializeAdvancedSettings = ({ read_poll_timeout: readPollTimeout, }); -export const serializeFollowerIndex = followerIndex => ({ +export const serializeFollowerIndex = (followerIndex: FollowerIndex): FollowerIndexToEs => ({ remote_cluster: followerIndex.remoteCluster, leader_index: followerIndex.leaderIndex, ...serializeAdvancedSettings(followerIndex), diff --git a/x-pack/legacy/plugins/cross_cluster_replication/common/services/utils.test.js b/x-pack/plugins/cross_cluster_replication/common/services/utils.test.ts similarity index 100% rename from x-pack/legacy/plugins/cross_cluster_replication/common/services/utils.test.js rename to x-pack/plugins/cross_cluster_replication/common/services/utils.test.ts diff --git a/x-pack/legacy/plugins/cross_cluster_replication/common/services/utils.js b/x-pack/plugins/cross_cluster_replication/common/services/utils.ts similarity index 62% rename from x-pack/legacy/plugins/cross_cluster_replication/common/services/utils.js rename to x-pack/plugins/cross_cluster_replication/common/services/utils.ts index 3d8c97f45327c..dda6732254cc3 100644 --- a/x-pack/legacy/plugins/cross_cluster_replication/common/services/utils.js +++ b/x-pack/plugins/cross_cluster_replication/common/services/utils.ts @@ -3,14 +3,14 @@ * 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 arrify = val => (Array.isArray(val) ? val : [val]); +export const arrify = (val: any): any[] => (Array.isArray(val) ? val : [val]); /** * Utilty to add some latency in a Promise chain * * @param {number} time Time in millisecond to wait */ -export const wait = (time = 1000) => data => { +export const wait = (time = 1000) => (data: any): Promise => { return new Promise(resolve => { setTimeout(() => resolve(data), time); }); @@ -19,8 +19,11 @@ export const wait = (time = 1000) => data => { /** * Utility to remove empty fields ("") from a request body */ -export const removeEmptyFields = body => - Object.entries(body).reduce((acc, [key, value]) => { +export const removeEmptyFields = (body: Record): Record => + Object.entries(body).reduce((acc: Record, [key, value]: [string, any]): Record< + string, + any + > => { if (value !== '') { acc[key] = value; } diff --git a/x-pack/plugins/cross_cluster_replication/common/types.ts b/x-pack/plugins/cross_cluster_replication/common/types.ts new file mode 100644 index 0000000000000..4932d6c570297 --- /dev/null +++ b/x-pack/plugins/cross_cluster_replication/common/types.ts @@ -0,0 +1,186 @@ +/* + * 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 interface AutoFollowPattern { + name: string; + active: boolean; + remoteCluster: string; + leaderIndexPatterns: string[]; + followIndexPattern: string; +} + +export interface AutoFollowPatternFromEs { + name: string; + pattern: { + active: boolean; + remote_cluster: string; + leader_index_patterns: string[]; + follow_index_pattern: string; + }; +} + +export interface AutoFollowPatternToEs { + remote_cluster: string; + leader_index_patterns: string[]; + follow_index_pattern: string; +} + +export interface ShardFromEs { + remote_cluster: string; + leader_index: string; + shard_id: number; + leader_global_checkpoint: number; + leader_max_seq_no: number; + follower_global_checkpoint: number; + follower_max_seq_no: number; + last_requested_seq_no: number; + outstanding_read_requests: number; + outstanding_write_requests: number; + write_buffer_operation_count: number; + write_buffer_size_in_bytes: number; + follower_mapping_version: number; + follower_settings_version: number; + total_read_time_millis: number; + total_read_remote_exec_time_millis: number; + successful_read_requests: number; + failed_read_requests: number; + operations_read: number; + bytes_read: number; + total_write_time_millis: number; + successful_write_requests: number; + failed_write_requests: number; + operations_written: number; + // This is an array of exception objects + read_exceptions: any[]; + time_since_last_read_millis: number; +} + +export interface Shard { + remoteCluster: string; + leaderIndex: string; + id: number; + leaderGlobalCheckpoint: number; + leaderMaxSequenceNum: number; + followerGlobalCheckpoint: number; + followerMaxSequenceNum: number; + lastRequestedSequenceNum: number; + outstandingReadRequestsCount: number; + outstandingWriteRequestsCount: number; + writeBufferOperationsCount: number; + writeBufferSizeBytes: number; + followerMappingVersion: number; + followerSettingsVersion: number; + totalReadTimeMs: number; + totalReadRemoteExecTimeMs: number; + successfulReadRequestCount: number; + failedReadRequestsCount: number; + operationsReadCount: number; + bytesReadCount: number; + totalWriteTimeMs: number; + successfulWriteRequestsCount: number; + failedWriteRequestsCount: number; + operationsWrittenCount: number; + // This is an array of exception objects + readExceptions: any[]; + timeSinceLastReadMs: number; +} + +export interface FollowerIndexFromEs { + follower_index: string; + remote_cluster: string; + leader_index: string; + status: string; + // Once https://github.com/elastic/elasticsearch/issues/54996 is resolved so that paused follower + // indices contain this information, we can removed this optional typing as well as the optional + // typing in FollowerIndexAdvancedSettings and FollowerIndexAdvancedSettingsToEs. + parameters?: FollowerIndexAdvancedSettingsToEs; + shards: ShardFromEs[]; +} + +export interface FollowerIndex extends FollowerIndexAdvancedSettings { + name: string; + remoteCluster: string; + leaderIndex: string; + status: string; + shards: Shard[]; +} + +export interface FollowerIndexToEs extends FollowerIndexAdvancedSettingsToEs { + remote_cluster: string; + leader_index: string; +} + +export interface FollowerIndexAdvancedSettings { + maxReadRequestOperationCount?: number; + maxOutstandingReadRequests?: number; + maxReadRequestSize?: string; // byte value + maxWriteRequestOperationCount?: number; + maxWriteRequestSize?: string; // byte value + maxOutstandingWriteRequests?: number; + maxWriteBufferCount?: number; + maxWriteBufferSize?: string; // byte value + maxRetryDelay?: string; // time value + readPollTimeout?: string; // time value +} + +export interface FollowerIndexAdvancedSettingsToEs { + max_read_request_operation_count?: number; + max_outstanding_read_requests?: number; + max_read_request_size?: string; // byte value + max_write_request_operation_count?: number; + max_write_request_size?: string; // byte value + max_outstanding_write_requests?: number; + max_write_buffer_count?: number; + max_write_buffer_size?: string; // byte value + max_retry_delay?: string; // time value + read_poll_timeout?: string; // time value +} + +export interface RecentAutoFollowError { + timestamp: number; + leaderIndex: string; + autoFollowException: { + type: string; + reason: string; + }; +} + +export interface RecentAutoFollowErrorFromEs { + timestamp: number; + leader_index: string; + auto_follow_exception: { + type: string; + reason: string; + }; +} + +export interface AutoFollowedCluster { + clusterName: string; + timeSinceLastCheckMillis: number; + lastSeenMetadataVersion: number; +} + +export interface AutoFollowedClusterFromEs { + cluster_name: string; + time_since_last_check_millis: number; + last_seen_metadata_version: number; +} + +export interface AutoFollowStats { + numberOfFailedFollowIndices: number; + numberOfFailedRemoteClusterStateRequests: number; + numberOfSuccessfulFollowIndices: number; + recentAutoFollowErrors: RecentAutoFollowError[]; + autoFollowedClusters: AutoFollowedCluster[]; +} + +export interface AutoFollowStatsFromEs { + number_of_failed_follow_indices: number; + number_of_failed_remote_cluster_state_requests: number; + number_of_successful_follow_indices: number; + recent_auto_follow_errors: RecentAutoFollowErrorFromEs[]; + auto_followed_clusters: AutoFollowedClusterFromEs[]; +} diff --git a/x-pack/plugins/cross_cluster_replication/kibana.json b/x-pack/plugins/cross_cluster_replication/kibana.json new file mode 100644 index 0000000000000..ccf98f41def47 --- /dev/null +++ b/x-pack/plugins/cross_cluster_replication/kibana.json @@ -0,0 +1,17 @@ +{ + "id": "crossClusterReplication", + "version": "kibana", + "server": true, + "ui": true, + "requiredPlugins": [ + "home", + "licensing", + "management", + "remoteClusters", + "indexManagement" + ], + "optionalPlugins": [ + "usageCollection" + ], + "configPath": ["xpack", "ccr"] +} diff --git a/x-pack/legacy/plugins/cross_cluster_replication/__jest__/client_integration/auto_follow_pattern_add.test.js b/x-pack/plugins/cross_cluster_replication/public/__jest__/client_integration/auto_follow_pattern_add.test.js similarity index 98% rename from x-pack/legacy/plugins/cross_cluster_replication/__jest__/client_integration/auto_follow_pattern_add.test.js rename to x-pack/plugins/cross_cluster_replication/public/__jest__/client_integration/auto_follow_pattern_add.test.js index 2be00e70f6f84..db1430d157183 100644 --- a/x-pack/legacy/plugins/cross_cluster_replication/__jest__/client_integration/auto_follow_pattern_add.test.js +++ b/x-pack/plugins/cross_cluster_replication/public/__jest__/client_integration/auto_follow_pattern_add.test.js @@ -3,11 +3,10 @@ * or more contributor license agreements. Licensed under the Elastic License; * you may not use this file except in compliance with the Elastic License. */ -import '../../public/np_ready/app/services/breadcrumbs.mock'; -import { setupEnvironment, pageHelpers, nextTick, getRandomString } from './helpers'; -import { indexPatterns } from '../../../../../../src/plugins/data/public'; -jest.mock('ui/new_platform'); +import { indexPatterns } from '../../../../../../src/plugins/data/public'; +import './mocks'; +import { setupEnvironment, pageHelpers, nextTick, getRandomString } from './helpers'; const { setup } = pageHelpers.autoFollowPatternAdd; diff --git a/x-pack/legacy/plugins/cross_cluster_replication/__jest__/client_integration/auto_follow_pattern_edit.test.js b/x-pack/plugins/cross_cluster_replication/public/__jest__/client_integration/auto_follow_pattern_edit.test.js similarity index 95% rename from x-pack/legacy/plugins/cross_cluster_replication/__jest__/client_integration/auto_follow_pattern_edit.test.js rename to x-pack/plugins/cross_cluster_replication/public/__jest__/client_integration/auto_follow_pattern_edit.test.js index abc3e5dc9def2..170bce7b82085 100644 --- a/x-pack/legacy/plugins/cross_cluster_replication/__jest__/client_integration/auto_follow_pattern_edit.test.js +++ b/x-pack/plugins/cross_cluster_replication/public/__jest__/client_integration/auto_follow_pattern_edit.test.js @@ -4,13 +4,11 @@ * you may not use this file except in compliance with the Elastic License. */ -import '../../public/np_ready/app/services/breadcrumbs.mock'; -import { AutoFollowPatternForm } from '../../public/np_ready/app/components/auto_follow_pattern_form'; +import { AutoFollowPatternForm } from '../../app/components/auto_follow_pattern_form'; +import './mocks'; import { setupEnvironment, pageHelpers, nextTick } from './helpers'; import { AUTO_FOLLOW_PATTERN_EDIT } from './helpers/constants'; -jest.mock('ui/new_platform'); - const { setup } = pageHelpers.autoFollowPatternEdit; const { setup: setupAutoFollowPatternAdd } = pageHelpers.autoFollowPatternAdd; diff --git a/x-pack/legacy/plugins/cross_cluster_replication/__jest__/client_integration/auto_follow_pattern_list.test.js b/x-pack/plugins/cross_cluster_replication/public/__jest__/client_integration/auto_follow_pattern_list.test.js similarity index 97% rename from x-pack/legacy/plugins/cross_cluster_replication/__jest__/client_integration/auto_follow_pattern_list.test.js rename to x-pack/plugins/cross_cluster_replication/public/__jest__/client_integration/auto_follow_pattern_list.test.js index 20e982856dc19..190400e988634 100644 --- a/x-pack/legacy/plugins/cross_cluster_replication/__jest__/client_integration/auto_follow_pattern_list.test.js +++ b/x-pack/plugins/cross_cluster_replication/public/__jest__/client_integration/auto_follow_pattern_list.test.js @@ -4,13 +4,10 @@ * you may not use this file except in compliance with the Elastic License. */ -import '../../public/np_ready/app/services/breadcrumbs.mock'; +import { getAutoFollowPatternMock } from './fixtures/auto_follow_pattern'; +import './mocks'; import { setupEnvironment, pageHelpers, nextTick, getRandomString } from './helpers'; -import { getAutoFollowPatternClientMock } from '../../fixtures/auto_follow_pattern'; - -jest.mock('ui/new_platform'); - const { setup } = pageHelpers.autoFollowPatternList; describe('', () => { @@ -79,11 +76,11 @@ describe('', () => { const testPrefix = 'prefix_'; const testSuffix = '_suffix'; - const autoFollowPattern1 = getAutoFollowPatternClientMock({ + const autoFollowPattern1 = getAutoFollowPatternMock({ name: `a${getRandomString()}`, followIndexPattern: `${testPrefix}{{leader_index}}${testSuffix}`, }); - const autoFollowPattern2 = getAutoFollowPatternClientMock({ + const autoFollowPattern2 = getAutoFollowPatternMock({ name: `b${getRandomString()}`, followIndexPattern: '{{leader_index}}', // no prefix nor suffix }); @@ -305,10 +302,12 @@ describe('', () => { const message = 'bar'; const recentAutoFollowErrors = [ { + timestamp: 1587081600021, leaderIndex: `${autoFollowPattern1.name}:my-leader-test`, autoFollowException: { type: 'exception', reason: message }, }, { + timestamp: 1587081600021, leaderIndex: `${autoFollowPattern2.name}:my-leader-test`, autoFollowException: { type: 'exception', reason: message }, }, @@ -327,7 +326,7 @@ describe('', () => { expect(exists('autoFollowPatternDetail.errors')).toBe(true); expect(exists('autoFollowPatternDetail.titleErrors')).toBe(true); expect(find('autoFollowPatternDetail.recentError').map(error => error.text())).toEqual([ - message, + 'April 16th, 2020 8:00:00 PM: bar', ]); }); }); diff --git a/x-pack/plugins/cross_cluster_replication/public/__jest__/client_integration/fixtures/auto_follow_pattern.ts b/x-pack/plugins/cross_cluster_replication/public/__jest__/client_integration/fixtures/auto_follow_pattern.ts new file mode 100644 index 0000000000000..e6444c37e8590 --- /dev/null +++ b/x-pack/plugins/cross_cluster_replication/public/__jest__/client_integration/fixtures/auto_follow_pattern.ts @@ -0,0 +1,28 @@ +/* + * 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 { getRandomString } from '../../../../../../test_utils'; +import { AutoFollowPattern } from '../../../../common/types'; + +export const getAutoFollowPatternMock = ({ + name = getRandomString(), + active = false, + remoteCluster = getRandomString(), + leaderIndexPatterns = [`${getRandomString()}-*`], + followIndexPattern = getRandomString(), +}: { + name: string; + active: boolean; + remoteCluster: string; + leaderIndexPatterns: string[]; + followIndexPattern: string; +}): AutoFollowPattern => ({ + name, + active, + remoteCluster, + leaderIndexPatterns, + followIndexPattern, +}); diff --git a/x-pack/plugins/cross_cluster_replication/public/__jest__/client_integration/fixtures/follower_index.ts b/x-pack/plugins/cross_cluster_replication/public/__jest__/client_integration/fixtures/follower_index.ts new file mode 100644 index 0000000000000..ff051d470531b --- /dev/null +++ b/x-pack/plugins/cross_cluster_replication/public/__jest__/client_integration/fixtures/follower_index.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 { getRandomString } from '../../../../../../test_utils'; +import { FollowerIndex } from '../../../../common/types'; + +const Chance = require('chance'); // eslint-disable-line import/no-extraneous-dependencies, @typescript-eslint/no-var-requires +const chance = new Chance(); + +interface FollowerIndexMock { + name: string; + remoteCluster: string; + leaderIndex: string; + status: string; +} + +export const getFollowerIndexMock = ({ + name = getRandomString(), + remoteCluster = getRandomString(), + leaderIndex = getRandomString(), + status = 'Active', +}: FollowerIndexMock): FollowerIndex => ({ + name, + remoteCluster, + leaderIndex, + status, + maxReadRequestOperationCount: chance.integer(), + maxOutstandingReadRequests: chance.integer(), + maxReadRequestSize: getRandomString({ length: 5 }), + maxWriteRequestOperationCount: chance.integer(), + maxWriteRequestSize: '9223372036854775807b', + maxOutstandingWriteRequests: chance.integer(), + maxWriteBufferCount: chance.integer(), + maxWriteBufferSize: getRandomString({ length: 5 }), + maxRetryDelay: getRandomString({ length: 5 }), + readPollTimeout: getRandomString({ length: 5 }), + shards: [ + { + id: 0, + remoteCluster, + leaderIndex, + leaderGlobalCheckpoint: chance.integer(), + leaderMaxSequenceNum: chance.integer(), + followerGlobalCheckpoint: chance.integer(), + followerMaxSequenceNum: chance.integer(), + lastRequestedSequenceNum: chance.integer(), + outstandingReadRequestsCount: chance.integer(), + outstandingWriteRequestsCount: chance.integer(), + writeBufferOperationsCount: chance.integer(), + writeBufferSizeBytes: chance.integer(), + followerMappingVersion: chance.integer(), + followerSettingsVersion: chance.integer(), + totalReadTimeMs: chance.integer(), + totalReadRemoteExecTimeMs: chance.integer(), + successfulReadRequestCount: chance.integer(), + failedReadRequestsCount: chance.integer(), + operationsReadCount: chance.integer(), + bytesReadCount: chance.integer(), + totalWriteTimeMs: chance.integer(), + successfulWriteRequestsCount: chance.integer(), + failedWriteRequestsCount: chance.integer(), + operationsWrittenCount: chance.integer(), + readExceptions: [], + timeSinceLastReadMs: chance.integer(), + }, + ], +}); diff --git a/x-pack/legacy/plugins/cross_cluster_replication/__jest__/client_integration/follower_index_add.test.js b/x-pack/plugins/cross_cluster_replication/public/__jest__/client_integration/follower_index_add.test.js similarity index 98% rename from x-pack/legacy/plugins/cross_cluster_replication/__jest__/client_integration/follower_index_add.test.js rename to x-pack/plugins/cross_cluster_replication/public/__jest__/client_integration/follower_index_add.test.js index 7680be9d858a4..4c99339e16952 100644 --- a/x-pack/legacy/plugins/cross_cluster_replication/__jest__/client_integration/follower_index_add.test.js +++ b/x-pack/plugins/cross_cluster_replication/public/__jest__/client_integration/follower_index_add.test.js @@ -4,13 +4,10 @@ * you may not use this file except in compliance with the Elastic License. */ -import '../../public/np_ready/app/services/breadcrumbs.mock'; -import { setupEnvironment, pageHelpers, nextTick } from './helpers'; -import { RemoteClustersFormField } from '../../public/np_ready/app/components'; - import { indexPatterns } from '../../../../../../src/plugins/data/public'; - -jest.mock('ui/new_platform'); +import './mocks'; +import { setupEnvironment, pageHelpers, nextTick } from './helpers'; +import { RemoteClustersFormField } from '../../app/components'; const { setup } = pageHelpers.followerIndexAdd; const { setup: setupAutoFollowPatternAdd } = pageHelpers.autoFollowPatternAdd; diff --git a/x-pack/legacy/plugins/cross_cluster_replication/__jest__/client_integration/follower_index_edit.test.js b/x-pack/plugins/cross_cluster_replication/public/__jest__/client_integration/follower_index_edit.test.js similarity index 95% rename from x-pack/legacy/plugins/cross_cluster_replication/__jest__/client_integration/follower_index_edit.test.js rename to x-pack/plugins/cross_cluster_replication/public/__jest__/client_integration/follower_index_edit.test.js index cfa37ff2e0358..f4bda2af653aa 100644 --- a/x-pack/legacy/plugins/cross_cluster_replication/__jest__/client_integration/follower_index_edit.test.js +++ b/x-pack/plugins/cross_cluster_replication/public/__jest__/client_integration/follower_index_edit.test.js @@ -4,12 +4,10 @@ * you may not use this file except in compliance with the Elastic License. */ -import '../../public/np_ready/app/services/breadcrumbs.mock'; -import { setupEnvironment, pageHelpers, nextTick } from './helpers'; -import { FollowerIndexForm } from '../../public/np_ready/app/components/follower_index_form/follower_index_form'; +import { FollowerIndexForm } from '../../app/components/follower_index_form/follower_index_form'; +import './mocks'; import { FOLLOWER_INDEX_EDIT } from './helpers/constants'; - -jest.mock('ui/new_platform'); +import { setupEnvironment, pageHelpers, nextTick } from './helpers'; const { setup } = pageHelpers.followerIndexEdit; const { setup: setupFollowerIndexAdd } = pageHelpers.followerIndexAdd; diff --git a/x-pack/legacy/plugins/cross_cluster_replication/__jest__/client_integration/follower_indices_list.test.js b/x-pack/plugins/cross_cluster_replication/public/__jest__/client_integration/follower_indices_list.test.js similarity index 99% rename from x-pack/legacy/plugins/cross_cluster_replication/__jest__/client_integration/follower_indices_list.test.js rename to x-pack/plugins/cross_cluster_replication/public/__jest__/client_integration/follower_indices_list.test.js index dde31d1d166f9..f98a1dafbbcbf 100644 --- a/x-pack/legacy/plugins/cross_cluster_replication/__jest__/client_integration/follower_indices_list.test.js +++ b/x-pack/plugins/cross_cluster_replication/public/__jest__/client_integration/follower_indices_list.test.js @@ -4,12 +4,10 @@ * you may not use this file except in compliance with the Elastic License. */ +import { getFollowerIndexMock } from './fixtures/follower_index'; +import './mocks'; import { setupEnvironment, pageHelpers, nextTick, getRandomString } from './helpers'; -import { getFollowerIndexMock } from '../../fixtures/follower_index'; - -jest.mock('ui/new_platform'); - const { setup } = pageHelpers.followerIndexList; describe('', () => { diff --git a/x-pack/legacy/plugins/cross_cluster_replication/__jest__/client_integration/helpers/auto_follow_pattern_add.helpers.js b/x-pack/plugins/cross_cluster_replication/public/__jest__/client_integration/helpers/auto_follow_pattern_add.helpers.js similarity index 76% rename from x-pack/legacy/plugins/cross_cluster_replication/__jest__/client_integration/helpers/auto_follow_pattern_add.helpers.js rename to x-pack/plugins/cross_cluster_replication/public/__jest__/client_integration/helpers/auto_follow_pattern_add.helpers.js index 1f64e589bc4c1..1cb4e7c7725df 100644 --- a/x-pack/legacy/plugins/cross_cluster_replication/__jest__/client_integration/helpers/auto_follow_pattern_add.helpers.js +++ b/x-pack/plugins/cross_cluster_replication/public/__jest__/client_integration/helpers/auto_follow_pattern_add.helpers.js @@ -5,9 +5,9 @@ */ import { registerTestBed } from '../../../../../../test_utils'; -import { AutoFollowPatternAdd } from '../../../public/np_ready/app/sections/auto_follow_pattern_add'; -import { ccrStore } from '../../../public/np_ready/app/store'; -import routing from '../../../public/np_ready/app/services/routing'; +import { AutoFollowPatternAdd } from '../../../app/sections/auto_follow_pattern_add'; +import { ccrStore } from '../../../app/store'; +import { routing } from '../../../app/services/routing'; const testBedConfig = { store: ccrStore, diff --git a/x-pack/legacy/plugins/cross_cluster_replication/__jest__/client_integration/helpers/auto_follow_pattern_edit.helpers.js b/x-pack/plugins/cross_cluster_replication/public/__jest__/client_integration/helpers/auto_follow_pattern_edit.helpers.js similarity index 82% rename from x-pack/legacy/plugins/cross_cluster_replication/__jest__/client_integration/helpers/auto_follow_pattern_edit.helpers.js rename to x-pack/plugins/cross_cluster_replication/public/__jest__/client_integration/helpers/auto_follow_pattern_edit.helpers.js index 2b110c6552072..9cad61893c409 100644 --- a/x-pack/legacy/plugins/cross_cluster_replication/__jest__/client_integration/helpers/auto_follow_pattern_edit.helpers.js +++ b/x-pack/plugins/cross_cluster_replication/public/__jest__/client_integration/helpers/auto_follow_pattern_edit.helpers.js @@ -5,9 +5,9 @@ */ import { registerTestBed } from '../../../../../../test_utils'; -import { AutoFollowPatternEdit } from '../../../public/np_ready/app/sections/auto_follow_pattern_edit'; -import { ccrStore } from '../../../public/np_ready/app/store'; -import routing from '../../../public/np_ready/app/services/routing'; +import { AutoFollowPatternEdit } from '../../../app/sections/auto_follow_pattern_edit'; +import { ccrStore } from '../../../app/store'; +import { routing } from '../../../app/services/routing'; import { AUTO_FOLLOW_PATTERN_EDIT_NAME } from './constants'; diff --git a/x-pack/legacy/plugins/cross_cluster_replication/__jest__/client_integration/helpers/auto_follow_pattern_list.helpers.js b/x-pack/plugins/cross_cluster_replication/public/__jest__/client_integration/helpers/auto_follow_pattern_list.helpers.js similarity index 92% rename from x-pack/legacy/plugins/cross_cluster_replication/__jest__/client_integration/helpers/auto_follow_pattern_list.helpers.js rename to x-pack/plugins/cross_cluster_replication/public/__jest__/client_integration/helpers/auto_follow_pattern_list.helpers.js index 1d3e8ad6dff83..450feed49f9f2 100644 --- a/x-pack/legacy/plugins/cross_cluster_replication/__jest__/client_integration/helpers/auto_follow_pattern_list.helpers.js +++ b/x-pack/plugins/cross_cluster_replication/public/__jest__/client_integration/helpers/auto_follow_pattern_list.helpers.js @@ -5,9 +5,9 @@ */ import { registerTestBed, findTestSubject } from '../../../../../../test_utils'; -import { AutoFollowPatternList } from '../../../public/np_ready/app/sections/home/auto_follow_pattern_list'; -import { ccrStore } from '../../../public/np_ready/app/store'; -import routing from '../../../public/np_ready/app/services/routing'; +import { AutoFollowPatternList } from '../../../app/sections/home/auto_follow_pattern_list'; +import { ccrStore } from '../../../app/store'; +import { routing } from '../../../app/services/routing'; const testBedConfig = { store: ccrStore, diff --git a/x-pack/legacy/plugins/cross_cluster_replication/__jest__/client_integration/helpers/constants.js b/x-pack/plugins/cross_cluster_replication/public/__jest__/client_integration/helpers/constants.js similarity index 100% rename from x-pack/legacy/plugins/cross_cluster_replication/__jest__/client_integration/helpers/constants.js rename to x-pack/plugins/cross_cluster_replication/public/__jest__/client_integration/helpers/constants.js diff --git a/x-pack/legacy/plugins/cross_cluster_replication/__jest__/client_integration/helpers/follower_index_add.helpers.js b/x-pack/plugins/cross_cluster_replication/public/__jest__/client_integration/helpers/follower_index_add.helpers.js similarity index 79% rename from x-pack/legacy/plugins/cross_cluster_replication/__jest__/client_integration/helpers/follower_index_add.helpers.js rename to x-pack/plugins/cross_cluster_replication/public/__jest__/client_integration/helpers/follower_index_add.helpers.js index f74baa1b2ad0a..856b09f3f3cba 100644 --- a/x-pack/legacy/plugins/cross_cluster_replication/__jest__/client_integration/helpers/follower_index_add.helpers.js +++ b/x-pack/plugins/cross_cluster_replication/public/__jest__/client_integration/helpers/follower_index_add.helpers.js @@ -5,9 +5,9 @@ */ import { registerTestBed } from '../../../../../../test_utils'; -import { FollowerIndexAdd } from '../../../public/np_ready/app/sections/follower_index_add'; -import { ccrStore } from '../../../public/np_ready/app/store'; -import routing from '../../../public/np_ready/app/services/routing'; +import { FollowerIndexAdd } from '../../../app/sections/follower_index_add'; +import { ccrStore } from '../../../app/store'; +import { routing } from '../../../app/services/routing'; const testBedConfig = { store: ccrStore, diff --git a/x-pack/legacy/plugins/cross_cluster_replication/__jest__/client_integration/helpers/follower_index_edit.helpers.js b/x-pack/plugins/cross_cluster_replication/public/__jest__/client_integration/helpers/follower_index_edit.helpers.js similarity index 84% rename from x-pack/legacy/plugins/cross_cluster_replication/__jest__/client_integration/helpers/follower_index_edit.helpers.js rename to x-pack/plugins/cross_cluster_replication/public/__jest__/client_integration/helpers/follower_index_edit.helpers.js index 47f8539bb593b..893d01f151bc2 100644 --- a/x-pack/legacy/plugins/cross_cluster_replication/__jest__/client_integration/helpers/follower_index_edit.helpers.js +++ b/x-pack/plugins/cross_cluster_replication/public/__jest__/client_integration/helpers/follower_index_edit.helpers.js @@ -5,9 +5,9 @@ */ import { registerTestBed } from '../../../../../../test_utils'; -import { FollowerIndexEdit } from '../../../public/np_ready/app/sections/follower_index_edit'; -import { ccrStore } from '../../../public/np_ready/app/store'; -import routing from '../../../public/np_ready/app/services/routing'; +import { FollowerIndexEdit } from '../../../app/sections/follower_index_edit'; +import { ccrStore } from '../../../app/store'; +import { routing } from '../../../app/services/routing'; import { FOLLOWER_INDEX_EDIT_NAME } from './constants'; diff --git a/x-pack/legacy/plugins/cross_cluster_replication/__jest__/client_integration/helpers/follower_index_list.helpers.js b/x-pack/plugins/cross_cluster_replication/public/__jest__/client_integration/helpers/follower_index_list.helpers.js similarity index 90% rename from x-pack/legacy/plugins/cross_cluster_replication/__jest__/client_integration/helpers/follower_index_list.helpers.js rename to x-pack/plugins/cross_cluster_replication/public/__jest__/client_integration/helpers/follower_index_list.helpers.js index 2154e11e17b1f..52f4267594cc1 100644 --- a/x-pack/legacy/plugins/cross_cluster_replication/__jest__/client_integration/helpers/follower_index_list.helpers.js +++ b/x-pack/plugins/cross_cluster_replication/public/__jest__/client_integration/helpers/follower_index_list.helpers.js @@ -5,9 +5,9 @@ */ import { registerTestBed, findTestSubject } from '../../../../../../test_utils'; -import { FollowerIndicesList } from '../../../public/np_ready/app/sections/home/follower_indices_list'; -import { ccrStore } from '../../../public/np_ready/app/store'; -import routing from '../../../public/np_ready/app/services/routing'; +import { FollowerIndicesList } from '../../../app/sections/home/follower_indices_list'; +import { ccrStore } from '../../../app/store'; +import { routing } from '../../../app/services/routing'; const testBedConfig = { store: ccrStore, diff --git a/x-pack/legacy/plugins/cross_cluster_replication/__jest__/client_integration/helpers/home.helpers.js b/x-pack/plugins/cross_cluster_replication/public/__jest__/client_integration/helpers/home.helpers.js similarity index 68% rename from x-pack/legacy/plugins/cross_cluster_replication/__jest__/client_integration/helpers/home.helpers.js rename to x-pack/plugins/cross_cluster_replication/public/__jest__/client_integration/helpers/home.helpers.js index 664ad909ba8e7..56dfa765bfa4f 100644 --- a/x-pack/legacy/plugins/cross_cluster_replication/__jest__/client_integration/helpers/home.helpers.js +++ b/x-pack/plugins/cross_cluster_replication/public/__jest__/client_integration/helpers/home.helpers.js @@ -5,10 +5,10 @@ */ import { registerTestBed } from '../../../../../../test_utils'; -import { CrossClusterReplicationHome } from '../../../public/np_ready/app/sections/home/home'; -import { ccrStore } from '../../../public/np_ready/app/store'; -import routing from '../../../public/np_ready/app/services/routing'; -import { BASE_PATH } from '../../../common/constants'; +import { BASE_PATH } from '../../../../common/constants'; +import { CrossClusterReplicationHome } from '../../../app/sections/home/home'; +import { ccrStore } from '../../../app/store'; +import { routing } from '../../../app/services/routing'; const testBedConfig = { store: ccrStore, diff --git a/x-pack/legacy/plugins/cross_cluster_replication/__jest__/client_integration/helpers/http_requests.js b/x-pack/plugins/cross_cluster_replication/public/__jest__/client_integration/helpers/http_requests.js similarity index 100% rename from x-pack/legacy/plugins/cross_cluster_replication/__jest__/client_integration/helpers/http_requests.js rename to x-pack/plugins/cross_cluster_replication/public/__jest__/client_integration/helpers/http_requests.js diff --git a/x-pack/legacy/plugins/cross_cluster_replication/__jest__/client_integration/helpers/index.js b/x-pack/plugins/cross_cluster_replication/public/__jest__/client_integration/helpers/index.js similarity index 100% rename from x-pack/legacy/plugins/cross_cluster_replication/__jest__/client_integration/helpers/index.js rename to x-pack/plugins/cross_cluster_replication/public/__jest__/client_integration/helpers/index.js diff --git a/x-pack/legacy/plugins/cross_cluster_replication/__jest__/client_integration/helpers/setup_environment.js b/x-pack/plugins/cross_cluster_replication/public/__jest__/client_integration/helpers/setup_environment.js similarity index 91% rename from x-pack/legacy/plugins/cross_cluster_replication/__jest__/client_integration/helpers/setup_environment.js rename to x-pack/plugins/cross_cluster_replication/public/__jest__/client_integration/helpers/setup_environment.js index 3562ad0df5b51..6dedbbfa79b19 100644 --- a/x-pack/legacy/plugins/cross_cluster_replication/__jest__/client_integration/helpers/setup_environment.js +++ b/x-pack/plugins/cross_cluster_replication/public/__jest__/client_integration/helpers/setup_environment.js @@ -7,7 +7,7 @@ import axios from 'axios'; import axiosXhrAdapter from 'axios/lib/adapters/xhr'; -import { setHttpClient } from '../../../public/np_ready/app/services/api'; +import { setHttpClient } from '../../../app/services/api'; import { init as initHttpRequests } from './http_requests'; export const setupEnvironment = () => { diff --git a/x-pack/legacy/plugins/cross_cluster_replication/__jest__/client_integration/home.test.js b/x-pack/plugins/cross_cluster_replication/public/__jest__/client_integration/home.test.js similarity index 93% rename from x-pack/legacy/plugins/cross_cluster_replication/__jest__/client_integration/home.test.js rename to x-pack/plugins/cross_cluster_replication/public/__jest__/client_integration/home.test.js index 2c536d069ef53..18d8b4eb9dbe0 100644 --- a/x-pack/legacy/plugins/cross_cluster_replication/__jest__/client_integration/home.test.js +++ b/x-pack/plugins/cross_cluster_replication/public/__jest__/client_integration/home.test.js @@ -4,11 +4,9 @@ * you may not use this file except in compliance with the Elastic License. */ -import '../../public/np_ready/app/services/breadcrumbs.mock'; +import './mocks'; import { setupEnvironment, pageHelpers, nextTick } from './helpers'; -jest.mock('ui/new_platform'); - const { setup } = pageHelpers.home; describe('', () => { @@ -36,7 +34,7 @@ describe('', () => { ({ exists, find, component } = setup()); }); - test('should set the correct an app title', () => { + test('should set the correct app title', () => { expect(exists('appTitle')).toBe(true); expect(find('appTitle').text()).toEqual('Cross-Cluster Replication'); }); diff --git a/x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/services/breadcrumbs.mock.ts b/x-pack/plugins/cross_cluster_replication/public/__jest__/client_integration/mocks/breadcrumbs.mock.ts similarity index 70% rename from x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/services/breadcrumbs.mock.ts rename to x-pack/plugins/cross_cluster_replication/public/__jest__/client_integration/mocks/breadcrumbs.mock.ts index b7c75108d4ef0..60a196254d408 100644 --- a/x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/services/breadcrumbs.mock.ts +++ b/x-pack/plugins/cross_cluster_replication/public/__jest__/client_integration/mocks/breadcrumbs.mock.ts @@ -4,7 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ -jest.mock('./breadcrumbs', () => ({ - ...jest.requireActual('./breadcrumbs'), +jest.mock('../../../app/services/breadcrumbs', () => ({ + ...jest.requireActual('../../../app/services/breadcrumbs'), setBreadcrumbs: jest.fn(), })); diff --git a/x-pack/legacy/plugins/cross_cluster_replication/server/np_ready/lib/is_es_error_factory/index.ts b/x-pack/plugins/cross_cluster_replication/public/__jest__/client_integration/mocks/index.ts similarity index 79% rename from x-pack/legacy/plugins/cross_cluster_replication/server/np_ready/lib/is_es_error_factory/index.ts rename to x-pack/plugins/cross_cluster_replication/public/__jest__/client_integration/mocks/index.ts index 441648a8701e0..cff9c003f3e80 100644 --- a/x-pack/legacy/plugins/cross_cluster_replication/server/np_ready/lib/is_es_error_factory/index.ts +++ b/x-pack/plugins/cross_cluster_replication/public/__jest__/client_integration/mocks/index.ts @@ -4,4 +4,5 @@ * you may not use this file except in compliance with the Elastic License. */ -export { isEsErrorFactory } from './is_es_error_factory'; +import './breadcrumbs.mock'; +import './track_ui_metric.mock'; diff --git a/x-pack/plugins/cross_cluster_replication/public/__jest__/client_integration/mocks/track_ui_metric.mock.ts b/x-pack/plugins/cross_cluster_replication/public/__jest__/client_integration/mocks/track_ui_metric.mock.ts new file mode 100644 index 0000000000000..016e259343285 --- /dev/null +++ b/x-pack/plugins/cross_cluster_replication/public/__jest__/client_integration/mocks/track_ui_metric.mock.ts @@ -0,0 +1,13 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +jest.mock('../../../app/services/track_ui_metric', () => ({ + ...jest.requireActual('../../../app/services/track_ui_metric'), + trackUiMetric: jest.fn(), + trackUserRequest: (request: Promise) => { + return request.then(response => response); + }, +})); diff --git a/x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/app.js b/x-pack/plugins/cross_cluster_replication/public/app/app.tsx similarity index 89% rename from x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/app.js rename to x-pack/plugins/cross_cluster_replication/public/app/app.tsx index 968646a4bd1b0..ec349ccd6f2c7 100644 --- a/x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/app.js +++ b/x-pack/plugins/cross_cluster_replication/public/app/app.tsx @@ -5,8 +5,8 @@ */ import React, { Component, Fragment } from 'react'; -import PropTypes from 'prop-types'; -import { Route, Switch, Redirect, withRouter } from 'react-router-dom'; +import { Route, Switch, Redirect, withRouter, RouteComponentProps } from 'react-router-dom'; +import { History } from 'history'; import { i18n } from '@kbn/i18n'; import { FormattedMessage } from '@kbn/i18n/react'; @@ -20,12 +20,14 @@ import { EuiTitle, } from '@elastic/eui'; -import { BASE_PATH } from '../../../common/constants'; +import { BASE_PATH } from '../../common/constants'; import { getFatalErrors } from './services/notifications'; import { SectionError } from './components'; -import routing from './services/routing'; +import { routing } from './services/routing'; +// @ts-ignore import { loadPermissions } from './services/api'; +// @ts-ignore import { CrossClusterReplicationHome, AutoFollowPatternAdd, @@ -34,16 +36,21 @@ import { FollowerIndexEdit, } from './sections'; -class AppComponent extends Component { - static propTypes = { - history: PropTypes.shape({ - push: PropTypes.func.isRequired, - createHref: PropTypes.func.isRequired, - }).isRequired, - }; +interface AppProps { + history: History; + location: any; +} + +interface AppState { + isFetchingPermissions: boolean; + fetchPermissionError: any; + hasPermission: boolean; + missingClusterPrivileges: any[]; +} - constructor(...args) { - super(...args); +class AppComponent extends Component { + constructor(props: any) { + super(props); this.registerRouter(); this.state = { @@ -54,18 +61,10 @@ class AppComponent extends Component { }; } - UNSAFE_componentWillMount() { - routing.userHasLeftApp = false; - } - componentDidMount() { this.checkPermissions(); } - componentWillUnmount() { - routing.userHasLeftApp = true; - } - async checkPermissions() { this.setState({ isFetchingPermissions: true, @@ -163,7 +162,6 @@ class AppComponent extends Component { - + ( diff --git a/x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/components/remote_clusters_provider.js b/x-pack/plugins/cross_cluster_replication/public/app/components/remote_clusters_provider.js similarity index 100% rename from x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/components/remote_clusters_provider.js rename to x-pack/plugins/cross_cluster_replication/public/app/components/remote_clusters_provider.js diff --git a/x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/components/section_error.js b/x-pack/plugins/cross_cluster_replication/public/app/components/section_error.js similarity index 100% rename from x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/components/section_error.js rename to x-pack/plugins/cross_cluster_replication/public/app/components/section_error.js diff --git a/x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/components/section_loading.js b/x-pack/plugins/cross_cluster_replication/public/app/components/section_loading.js similarity index 100% rename from x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/components/section_loading.js rename to x-pack/plugins/cross_cluster_replication/public/app/components/section_loading.js diff --git a/x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/components/section_unauthorized.js b/x-pack/plugins/cross_cluster_replication/public/app/components/section_unauthorized.js similarity index 100% rename from x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/components/section_unauthorized.js rename to x-pack/plugins/cross_cluster_replication/public/app/components/section_unauthorized.js diff --git a/x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/constants/api.js b/x-pack/plugins/cross_cluster_replication/public/app/constants/api.ts similarity index 100% rename from x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/constants/api.js rename to x-pack/plugins/cross_cluster_replication/public/app/constants/api.ts diff --git a/x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/constants/index.js b/x-pack/plugins/cross_cluster_replication/public/app/constants/index.ts similarity index 100% rename from x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/constants/index.js rename to x-pack/plugins/cross_cluster_replication/public/app/constants/index.ts diff --git a/x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/constants/sections.js b/x-pack/plugins/cross_cluster_replication/public/app/constants/sections.ts similarity index 100% rename from x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/constants/sections.js rename to x-pack/plugins/cross_cluster_replication/public/app/constants/sections.ts diff --git a/x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/constants/ui_metric.js b/x-pack/plugins/cross_cluster_replication/public/app/constants/ui_metric.ts similarity index 100% rename from x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/constants/ui_metric.js rename to x-pack/plugins/cross_cluster_replication/public/app/constants/ui_metric.ts diff --git a/x-pack/plugins/cross_cluster_replication/public/app/index.tsx b/x-pack/plugins/cross_cluster_replication/public/app/index.tsx new file mode 100644 index 0000000000000..79569b587f97f --- /dev/null +++ b/x-pack/plugins/cross_cluster_replication/public/app/index.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 { render, unmountComponentAtNode } from 'react-dom'; +import { Provider } from 'react-redux'; +import { HashRouter } from 'react-router-dom'; +import { I18nStart } from 'kibana/public'; +import { UnmountCallback } from 'src/core/public'; + +import { init as initBreadcrumbs, SetBreadcrumbs } from './services/breadcrumbs'; +import { init as initDocumentation } from './services/documentation_links'; +import { App } from './app'; +import { ccrStore } from './store'; + +const renderApp = (element: Element, I18nContext: I18nStart['Context']): UnmountCallback => { + render( + + + + + + + , + element + ); + + return () => unmountComponentAtNode(element); +}; + +export async function mountApp({ + element, + setBreadcrumbs, + I18nContext, + ELASTIC_WEBSITE_URL, + DOC_LINK_VERSION, +}: { + element: Element; + setBreadcrumbs: SetBreadcrumbs; + I18nContext: I18nStart['Context']; + ELASTIC_WEBSITE_URL: string; + DOC_LINK_VERSION: string; +}): Promise { + // Import and initialize additional services here instead of in plugin.ts to reduce the size of the + // initial bundle as much as possible. + initBreadcrumbs(setBreadcrumbs); + initDocumentation(`${ELASTIC_WEBSITE_URL}guide/en/elasticsearch/reference/${DOC_LINK_VERSION}/`); + + return renderApp(element, I18nContext); +} diff --git a/x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/sections/auto_follow_pattern_add/auto_follow_pattern_add.container.js b/x-pack/plugins/cross_cluster_replication/public/app/sections/auto_follow_pattern_add/auto_follow_pattern_add.container.js similarity index 100% rename from x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/sections/auto_follow_pattern_add/auto_follow_pattern_add.container.js rename to x-pack/plugins/cross_cluster_replication/public/app/sections/auto_follow_pattern_add/auto_follow_pattern_add.container.js diff --git a/x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/sections/auto_follow_pattern_add/auto_follow_pattern_add.js b/x-pack/plugins/cross_cluster_replication/public/app/sections/auto_follow_pattern_add/auto_follow_pattern_add.js similarity index 100% rename from x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/sections/auto_follow_pattern_add/auto_follow_pattern_add.js rename to x-pack/plugins/cross_cluster_replication/public/app/sections/auto_follow_pattern_add/auto_follow_pattern_add.js diff --git a/x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/sections/auto_follow_pattern_add/index.js b/x-pack/plugins/cross_cluster_replication/public/app/sections/auto_follow_pattern_add/index.js similarity index 100% rename from x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/sections/auto_follow_pattern_add/index.js rename to x-pack/plugins/cross_cluster_replication/public/app/sections/auto_follow_pattern_add/index.js diff --git a/x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/sections/auto_follow_pattern_edit/auto_follow_pattern_edit.container.js b/x-pack/plugins/cross_cluster_replication/public/app/sections/auto_follow_pattern_edit/auto_follow_pattern_edit.container.js similarity index 80% rename from x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/sections/auto_follow_pattern_edit/auto_follow_pattern_edit.container.js rename to x-pack/plugins/cross_cluster_replication/public/app/sections/auto_follow_pattern_edit/auto_follow_pattern_edit.container.js index 2c90456076f85..be470edc07537 100644 --- a/x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/sections/auto_follow_pattern_edit/auto_follow_pattern_edit.container.js +++ b/x-pack/plugins/cross_cluster_replication/public/app/sections/auto_follow_pattern_edit/auto_follow_pattern_edit.container.js @@ -39,8 +39,23 @@ const mapStateToProps = state => ({ const mapDispatchToProps = dispatch => ({ getAutoFollowPattern: id => dispatch(getAutoFollowPattern(id)), selectAutoFollowPattern: id => dispatch(selectEditAutoFollowPattern(id)), - saveAutoFollowPattern: (id, autoFollowPattern) => - dispatch(saveAutoFollowPattern(id, autoFollowPattern, true)), + saveAutoFollowPattern: (id, autoFollowPattern) => { + // Strip out errors. + const { active, remoteCluster, leaderIndexPatterns, followIndexPattern } = autoFollowPattern; + + dispatch( + saveAutoFollowPattern( + id, + { + active, + remoteCluster, + leaderIndexPatterns, + followIndexPattern, + }, + true + ) + ); + }, clearApiError: () => { dispatch(clearApiError(`${scope}-get`)); dispatch(clearApiError(`${scope}-save`)); diff --git a/x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/sections/auto_follow_pattern_edit/auto_follow_pattern_edit.js b/x-pack/plugins/cross_cluster_replication/public/app/sections/auto_follow_pattern_edit/auto_follow_pattern_edit.js similarity index 99% rename from x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/sections/auto_follow_pattern_edit/auto_follow_pattern_edit.js rename to x-pack/plugins/cross_cluster_replication/public/app/sections/auto_follow_pattern_edit/auto_follow_pattern_edit.js index 4cd3617abd989..387d7817a0357 100644 --- a/x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/sections/auto_follow_pattern_edit/auto_follow_pattern_edit.js +++ b/x-pack/plugins/cross_cluster_replication/public/app/sections/auto_follow_pattern_edit/auto_follow_pattern_edit.js @@ -12,7 +12,7 @@ import { FormattedMessage } from '@kbn/i18n/react'; import { EuiButtonEmpty, EuiFlexGroup, EuiFlexItem, EuiPageContent, EuiSpacer } from '@elastic/eui'; import { listBreadcrumb, editBreadcrumb, setBreadcrumbs } from '../../services/breadcrumbs'; -import routing from '../../services/routing'; +import { routing } from '../../services/routing'; import { AutoFollowPatternForm, AutoFollowPatternPageTitle, diff --git a/x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/sections/auto_follow_pattern_edit/index.js b/x-pack/plugins/cross_cluster_replication/public/app/sections/auto_follow_pattern_edit/index.js similarity index 100% rename from x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/sections/auto_follow_pattern_edit/index.js rename to x-pack/plugins/cross_cluster_replication/public/app/sections/auto_follow_pattern_edit/index.js diff --git a/x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/sections/follower_index_add/follower_index_add.container.js b/x-pack/plugins/cross_cluster_replication/public/app/sections/follower_index_add/follower_index_add.container.js similarity index 100% rename from x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/sections/follower_index_add/follower_index_add.container.js rename to x-pack/plugins/cross_cluster_replication/public/app/sections/follower_index_add/follower_index_add.container.js diff --git a/x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/sections/follower_index_add/follower_index_add.js b/x-pack/plugins/cross_cluster_replication/public/app/sections/follower_index_add/follower_index_add.js similarity index 100% rename from x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/sections/follower_index_add/follower_index_add.js rename to x-pack/plugins/cross_cluster_replication/public/app/sections/follower_index_add/follower_index_add.js diff --git a/x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/sections/follower_index_add/index.js b/x-pack/plugins/cross_cluster_replication/public/app/sections/follower_index_add/index.js similarity index 100% rename from x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/sections/follower_index_add/index.js rename to x-pack/plugins/cross_cluster_replication/public/app/sections/follower_index_add/index.js diff --git a/x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/sections/follower_index_edit/follower_index_edit.container.js b/x-pack/plugins/cross_cluster_replication/public/app/sections/follower_index_edit/follower_index_edit.container.js similarity index 100% rename from x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/sections/follower_index_edit/follower_index_edit.container.js rename to x-pack/plugins/cross_cluster_replication/public/app/sections/follower_index_edit/follower_index_edit.container.js diff --git a/x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/sections/follower_index_edit/follower_index_edit.js b/x-pack/plugins/cross_cluster_replication/public/app/sections/follower_index_edit/follower_index_edit.js similarity index 99% rename from x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/sections/follower_index_edit/follower_index_edit.js rename to x-pack/plugins/cross_cluster_replication/public/app/sections/follower_index_edit/follower_index_edit.js index 21493602c12a7..22f9a7338384b 100644 --- a/x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/sections/follower_index_edit/follower_index_edit.js +++ b/x-pack/plugins/cross_cluster_replication/public/app/sections/follower_index_edit/follower_index_edit.js @@ -20,7 +20,7 @@ import { } from '@elastic/eui'; import { setBreadcrumbs, listBreadcrumb, editBreadcrumb } from '../../services/breadcrumbs'; -import routing from '../../services/routing'; +import { routing } from '../../services/routing'; import { FollowerIndexForm, FollowerIndexPageTitle, diff --git a/x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/sections/follower_index_edit/index.js b/x-pack/plugins/cross_cluster_replication/public/app/sections/follower_index_edit/index.js similarity index 100% rename from x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/sections/follower_index_edit/index.js rename to x-pack/plugins/cross_cluster_replication/public/app/sections/follower_index_edit/index.js diff --git a/x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/sections/home/auto_follow_pattern_list/auto_follow_pattern_list.container.js b/x-pack/plugins/cross_cluster_replication/public/app/sections/home/auto_follow_pattern_list/auto_follow_pattern_list.container.js similarity index 100% rename from x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/sections/home/auto_follow_pattern_list/auto_follow_pattern_list.container.js rename to x-pack/plugins/cross_cluster_replication/public/app/sections/home/auto_follow_pattern_list/auto_follow_pattern_list.container.js diff --git a/x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/sections/home/auto_follow_pattern_list/auto_follow_pattern_list.js b/x-pack/plugins/cross_cluster_replication/public/app/sections/home/auto_follow_pattern_list/auto_follow_pattern_list.js similarity index 99% rename from x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/sections/home/auto_follow_pattern_list/auto_follow_pattern_list.js rename to x-pack/plugins/cross_cluster_replication/public/app/sections/home/auto_follow_pattern_list/auto_follow_pattern_list.js index e9e14f57e814f..c8cf94842aa68 100644 --- a/x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/sections/home/auto_follow_pattern_list/auto_follow_pattern_list.js +++ b/x-pack/plugins/cross_cluster_replication/public/app/sections/home/auto_follow_pattern_list/auto_follow_pattern_list.js @@ -17,7 +17,7 @@ import { EuiSpacer, } from '@elastic/eui'; -import routing from '../../../services/routing'; +import { routing } from '../../../services/routing'; import { extractQueryParams } from '../../../services/query_params'; import { trackUiMetric, METRIC_TYPE } from '../../../services/track_ui_metric'; import { API_STATUS, UIM_AUTO_FOLLOW_PATTERN_LIST_LOAD } from '../../../constants'; diff --git a/x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/sections/home/auto_follow_pattern_list/components/auto_follow_pattern_table/auto_follow_pattern_table.container.js b/x-pack/plugins/cross_cluster_replication/public/app/sections/home/auto_follow_pattern_list/components/auto_follow_pattern_table/auto_follow_pattern_table.container.js similarity index 100% rename from x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/sections/home/auto_follow_pattern_list/components/auto_follow_pattern_table/auto_follow_pattern_table.container.js rename to x-pack/plugins/cross_cluster_replication/public/app/sections/home/auto_follow_pattern_list/components/auto_follow_pattern_table/auto_follow_pattern_table.container.js diff --git a/x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/sections/home/auto_follow_pattern_list/components/auto_follow_pattern_table/auto_follow_pattern_table.js b/x-pack/plugins/cross_cluster_replication/public/app/sections/home/auto_follow_pattern_list/components/auto_follow_pattern_table/auto_follow_pattern_table.js similarity index 97% rename from x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/sections/home/auto_follow_pattern_list/components/auto_follow_pattern_table/auto_follow_pattern_table.js rename to x-pack/plugins/cross_cluster_replication/public/app/sections/home/auto_follow_pattern_list/components/auto_follow_pattern_table/auto_follow_pattern_table.js index 956a9f10d810b..eb90e59e99fee 100644 --- a/x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/sections/home/auto_follow_pattern_list/components/auto_follow_pattern_table/auto_follow_pattern_table.js +++ b/x-pack/plugins/cross_cluster_replication/public/app/sections/home/auto_follow_pattern_list/components/auto_follow_pattern_table/auto_follow_pattern_table.js @@ -20,8 +20,8 @@ import { AutoFollowPatternDeleteProvider, AutoFollowPatternActionMenu, } from '../../../../../components'; -import routing from '../../../../../services/routing'; -import { trackUiMetric, METRIC_TYPE } from '../../../../../services/track_ui_metric'; +import { routing } from '../../../../../services/routing'; +import { trackUiMetric } from '../../../../../services/track_ui_metric'; export class AutoFollowPatternTable extends PureComponent { static propTypes = { @@ -86,7 +86,7 @@ export class AutoFollowPatternTable extends PureComponent { return ( { - trackUiMetric(METRIC_TYPE.CLICK, UIM_AUTO_FOLLOW_PATTERN_SHOW_DETAILS_CLICK); + trackUiMetric('click', UIM_AUTO_FOLLOW_PATTERN_SHOW_DETAILS_CLICK); selectAutoFollowPattern(name); }} data-test-subj="autoFollowPatternLink" diff --git a/x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/sections/home/auto_follow_pattern_list/components/auto_follow_pattern_table/index.js b/x-pack/plugins/cross_cluster_replication/public/app/sections/home/auto_follow_pattern_list/components/auto_follow_pattern_table/index.js similarity index 100% rename from x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/sections/home/auto_follow_pattern_list/components/auto_follow_pattern_table/index.js rename to x-pack/plugins/cross_cluster_replication/public/app/sections/home/auto_follow_pattern_list/components/auto_follow_pattern_table/index.js diff --git a/x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/sections/home/auto_follow_pattern_list/components/detail_panel/detail_panel.container.js b/x-pack/plugins/cross_cluster_replication/public/app/sections/home/auto_follow_pattern_list/components/detail_panel/detail_panel.container.js similarity index 100% rename from x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/sections/home/auto_follow_pattern_list/components/detail_panel/detail_panel.container.js rename to x-pack/plugins/cross_cluster_replication/public/app/sections/home/auto_follow_pattern_list/components/detail_panel/detail_panel.container.js diff --git a/x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/sections/home/auto_follow_pattern_list/components/detail_panel/detail_panel.js b/x-pack/plugins/cross_cluster_replication/public/app/sections/home/auto_follow_pattern_list/components/detail_panel/detail_panel.js similarity index 98% rename from x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/sections/home/auto_follow_pattern_list/components/detail_panel/detail_panel.js rename to x-pack/plugins/cross_cluster_replication/public/app/sections/home/auto_follow_pattern_list/components/detail_panel/detail_panel.js index 1a6d5e6efe35a..3f2ed82420ff1 100644 --- a/x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/sections/home/auto_follow_pattern_list/components/detail_panel/detail_panel.js +++ b/x-pack/plugins/cross_cluster_replication/public/app/sections/home/auto_follow_pattern_list/components/detail_panel/detail_panel.js @@ -7,7 +7,9 @@ import React, { Component } from 'react'; import PropTypes from 'prop-types'; import { FormattedMessage } from '@kbn/i18n/react'; -import { getIndexListUri } from '../../../../../../../../../../../plugins/index_management/public'; +import moment from 'moment'; + +import { getIndexListUri } from '../../../../../../../../../plugins/index_management/public'; import { EuiButtonEmpty, @@ -247,6 +249,7 @@ export class DetailPanel extends Component {

8% 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≪DP1Xk9B0 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⁣O0d;kW>w4TUJnm3u; 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 R+Rwn{_chV?ig(2Ee*!Vq^;7@= literal 0 HcmV?d00001 diff --git a/docs/siem/siem-ui.asciidoc b/docs/siem/siem-ui.asciidoc index 85253daaf2933..985138756622d 100644 --- a/docs/siem/siem-ui.asciidoc +++ b/docs/siem/siem-ui.asciidoc @@ -35,7 +35,7 @@ image::siem/images/network-ui.png[] [float] [[detections-ui]] -=== Detections (Beta) +=== Detections (beta) The Detections feature automatically searches for threats and creates signals when they are detected. Signal detection rules define the conditions @@ -50,6 +50,22 @@ or the Detections API. [role="screenshot"] image::siem/images/detections-ui.png[] +[float] +[[cases-ui]] +=== Cases (beta) + +Cases are used to open and track security issues directly in SIEM. +Cases list the original reporter and all users who contribute to a case +(`participants`). Case comments support Markdown syntax, and allow linking to +saved Timelines. Additionally, you can send cases to external systems from +within SIEM (currently ServiceNow). + +For information about opening, updating, and closing cases, see +{siem-guide}/cases-overview.html[Cases] in the SIEM Guide. + +[role="screenshot"] +image::siem/images/cases-ui.png[] + [float] [[timelines-ui]] === Timeline From 0266a5c447321ba94c5d0dbc3821679f3689de09 Mon Sep 17 00:00:00 2001 From: Tim Sullivan Date: Tue, 21 Apr 2020 10:46:08 -0700 Subject: [PATCH 18/67] [Reporting] Integration polling config with client code (#63754) * source new platform for reporting ui config * fix test types * fix type check Co-authored-by: Elastic Machine --- x-pack/plugins/reporting/common/types.d.ts | 7 ++ x-pack/plugins/reporting/constants.ts | 7 -- x-pack/plugins/reporting/index.d.ts | 12 ---- .../public/components/report_listing.test.tsx | 13 ++++ .../public/components/report_listing.tsx | 12 ++-- .../reporting/public/lib/stream_handler.ts | 19 ++---- x-pack/plugins/reporting/public/plugin.tsx | 67 ++++++++++--------- .../plugins/reporting/server/config/index.ts | 1 + 8 files changed, 67 insertions(+), 71 deletions(-) create mode 100644 x-pack/plugins/reporting/common/types.d.ts diff --git a/x-pack/plugins/reporting/common/types.d.ts b/x-pack/plugins/reporting/common/types.d.ts new file mode 100644 index 0000000000000..34f0bc9ac8a36 --- /dev/null +++ b/x-pack/plugins/reporting/common/types.d.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 { ConfigType } from '../server/config'; diff --git a/x-pack/plugins/reporting/constants.ts b/x-pack/plugins/reporting/constants.ts index 5756d29face12..8079c5b1d9887 100644 --- a/x-pack/plugins/reporting/constants.ts +++ b/x-pack/plugins/reporting/constants.ts @@ -7,13 +7,6 @@ export const JOB_COMPLETION_NOTIFICATIONS_SESSION_KEY = 'xpack.reporting.jobCompletionNotifications'; -export const JOB_COMPLETION_NOTIFICATIONS_POLLER_CONFIG = { - jobCompletionNotifier: { - interval: 10000, - intervalErrorMultiplier: 5, - }, -}; - // Routes export const API_BASE_URL = '/api/reporting'; export const API_LIST_URL = `${API_BASE_URL}/jobs`; diff --git a/x-pack/plugins/reporting/index.d.ts b/x-pack/plugins/reporting/index.d.ts index 26d661e29bd94..77faf837e6505 100644 --- a/x-pack/plugins/reporting/index.d.ts +++ b/x-pack/plugins/reporting/index.d.ts @@ -4,15 +4,6 @@ * you may not use this file except in compliance with the Elastic License. */ -import { - CoreSetup, - CoreStart, - HttpSetup, - Plugin, - PluginInitializerContext, - NotificationsStart, -} from '../../../src/core/public'; - export type JobId = string; export type JobStatus = | 'completed' @@ -21,9 +12,6 @@ export type JobStatus = | 'processing' | 'failed'; -export type HttpService = HttpSetup; -export type NotificationsService = NotificationsStart; - export interface SourceJob { _id: JobId; _source: { diff --git a/x-pack/plugins/reporting/public/components/report_listing.test.tsx b/x-pack/plugins/reporting/public/components/report_listing.test.tsx index 380a3b3295b9f..787279e6caf9b 100644 --- a/x-pack/plugins/reporting/public/components/report_listing.test.tsx +++ b/x-pack/plugins/reporting/public/components/report_listing.test.tsx @@ -47,12 +47,24 @@ const toasts = { addDanger: jest.fn(), } as any; +const mockPollConfig = { + jobCompletionNotifier: { + interval: 5000, + intervalErrorMultiplier: 3, + }, + jobsRefresh: { + interval: 5000, + intervalErrorMultiplier: 3, + }, +}; + describe('ReportListing', () => { it('Report job listing with some items', () => { const wrapper = mountWithIntl( @@ -74,6 +86,7 @@ describe('ReportListing', () => { } + pollConfig={mockPollConfig} redirect={jest.fn()} toasts={toasts} /> diff --git a/x-pack/plugins/reporting/public/components/report_listing.tsx b/x-pack/plugins/reporting/public/components/report_listing.tsx index 885e9577471a0..d8f9b7d37cfbf 100644 --- a/x-pack/plugins/reporting/public/components/report_listing.tsx +++ b/x-pack/plugins/reporting/public/components/report_listing.tsx @@ -16,14 +16,15 @@ import { i18n } from '@kbn/i18n'; import { FormattedMessage, InjectedIntl, injectI18n } from '@kbn/i18n/react'; import { get } from 'lodash'; import moment from 'moment'; -import { Component, Fragment, default as React } from 'react'; +import { Component, default as React, Fragment } from 'react'; import { Subscription } from 'rxjs'; import { ApplicationStart, ToastsSetup } from 'src/core/public'; import { ILicense, LicensingPluginSetup } from '../../../licensing/public'; import { Poller } from '../../common/poller'; -import { JobStatuses, JOB_COMPLETION_NOTIFICATIONS_POLLER_CONFIG } from '../../constants'; +import { JobStatuses } from '../../constants'; import { checkLicense } from '../lib/license_check'; import { JobQueueEntry, ReportingAPIClient } from '../lib/reporting_api_client'; +import { ClientConfigType } from '../plugin'; import { ReportDeleteButton, ReportDownloadButton, @@ -53,6 +54,7 @@ export interface Props { intl: InjectedIntl; apiClient: ReportingAPIClient; license$: LicensingPluginSetup['license$']; + pollConfig: ClientConfigType['poll']; redirect: ApplicationStart['navigateToApp']; toasts: ToastsSetup; } @@ -167,12 +169,10 @@ class ReportListingUi extends Component { functionToPoll: () => { return this.fetchJobs(); }, - pollFrequencyInMillis: - JOB_COMPLETION_NOTIFICATIONS_POLLER_CONFIG.jobCompletionNotifier.interval, + pollFrequencyInMillis: this.props.pollConfig.jobsRefresh.interval, trailing: false, continuePollingOnError: true, - pollFrequencyErrorMultiplier: - JOB_COMPLETION_NOTIFICATIONS_POLLER_CONFIG.jobCompletionNotifier.intervalErrorMultiplier, + pollFrequencyErrorMultiplier: this.props.pollConfig.jobsRefresh.intervalErrorMultiplier, }); this.poller.start(); this.licenseSubscription = this.props.license$.subscribe(this.licenseHandler); diff --git a/x-pack/plugins/reporting/public/lib/stream_handler.ts b/x-pack/plugins/reporting/public/lib/stream_handler.ts index 3c121f1712685..eed6d5dd141e7 100644 --- a/x-pack/plugins/reporting/public/lib/stream_handler.ts +++ b/x-pack/plugins/reporting/public/lib/stream_handler.ts @@ -4,30 +4,23 @@ * you may not use this file except in compliance with the Elastic License. */ +import { i18n } from '@kbn/i18n'; import * as Rx from 'rxjs'; import { catchError, map } from 'rxjs/operators'; -import { i18n } from '@kbn/i18n'; +import { NotificationsSetup } from 'src/core/public'; import { JOB_COMPLETION_NOTIFICATIONS_SESSION_KEY, JOB_STATUS_COMPLETED, JOB_STATUS_FAILED, JOB_STATUS_WARNINGS, } from '../../constants'; - -import { - JobId, - JobSummary, - JobStatusBuckets, - NotificationsService, - SourceJob, -} from '../../index.d'; - +import { JobId, JobStatusBuckets, JobSummary, SourceJob } from '../../index.d'; import { - getSuccessToast, getFailureToast, + getGeneralErrorToast, + getSuccessToast, getWarningFormulasToast, getWarningMaxSizeToast, - getGeneralErrorToast, } from '../components'; import { ReportingAPIClient } from './reporting_api_client'; @@ -47,7 +40,7 @@ function summarizeJob(src: SourceJob): JobSummary { } export class ReportingNotifierStreamHandler { - constructor(private notifications: NotificationsService, private apiClient: ReportingAPIClient) {} + constructor(private notifications: NotificationsSetup, private apiClient: ReportingAPIClient) {} /* * Use Kibana Toast API to show our messages diff --git a/x-pack/plugins/reporting/public/plugin.tsx b/x-pack/plugins/reporting/public/plugin.tsx index 08ba10ff69207..c40e7ad373eaf 100644 --- a/x-pack/plugins/reporting/public/plugin.tsx +++ b/x-pack/plugins/reporting/public/plugin.tsx @@ -4,44 +4,42 @@ * you may not use this file except in compliance with the Elastic License. */ -import * as Rx from 'rxjs'; +import { i18n } from '@kbn/i18n'; +import { I18nProvider } from '@kbn/i18n/react'; import React from 'react'; import ReactDOM from 'react-dom'; +import * as Rx from 'rxjs'; import { catchError, filter, map, mergeMap, takeUntil } from 'rxjs/operators'; -import { i18n } from '@kbn/i18n'; +import { + CoreSetup, + CoreStart, + NotificationsSetup, + Plugin, + PluginInitializerContext, +} from 'src/core/public'; import { ManagementSetup } from 'src/plugins/management/public'; -import { CoreSetup, CoreStart, Plugin, PluginInitializerContext } from 'src/core/public'; -import { I18nProvider } from '@kbn/i18n/react'; import { UiActionsSetup } from 'src/plugins/ui_actions/public'; - -import { ReportListing } from './components/report_listing'; -import { getGeneralErrorToast } from './components'; - -import { ReportingNotifierStreamHandler as StreamHandler } from './lib/stream_handler'; -import { ReportingAPIClient } from './lib/reporting_api_client'; -import { GetCsvReportPanelAction } from './panel_actions/get_csv_panel_action'; -import { csvReportingProvider } from './share_context_menu/register_csv_reporting'; -import { reportingPDFPNGProvider } from './share_context_menu/register_pdf_png_reporting'; - -import { LicensingPluginSetup } from '../../licensing/public'; +import { JobId, JobStatusBuckets } from '../'; import { CONTEXT_MENU_TRIGGER } from '../../../../src/plugins/embeddable/public'; -import { SharePluginSetup } from '../../../../src/plugins/share/public'; - import { FeatureCatalogueCategory, HomePublicPluginSetup, } from '../../../../src/plugins/home/public'; +import { SharePluginSetup } from '../../../../src/plugins/share/public'; +import { LicensingPluginSetup } from '../../licensing/public'; +import { ConfigType } from '../common/types'; +import { JOB_COMPLETION_NOTIFICATIONS_SESSION_KEY } from '../constants'; +import { getGeneralErrorToast } from './components'; +import { ReportListing } from './components/report_listing'; +import { ReportingAPIClient } from './lib/reporting_api_client'; +import { ReportingNotifierStreamHandler as StreamHandler } from './lib/stream_handler'; +import { GetCsvReportPanelAction } from './panel_actions/get_csv_panel_action'; +import { csvReportingProvider } from './share_context_menu/register_csv_reporting'; +import { reportingPDFPNGProvider } from './share_context_menu/register_pdf_png_reporting'; -import { - JOB_COMPLETION_NOTIFICATIONS_POLLER_CONFIG, - JOB_COMPLETION_NOTIFICATIONS_SESSION_KEY, -} from '../constants'; - -import { JobId, JobStatusBuckets, NotificationsService } from '..'; - -const { - jobCompletionNotifier: { interval: JOBS_REFRESH_INTERVAL }, -} = JOB_COMPLETION_NOTIFICATIONS_POLLER_CONFIG; +export interface ClientConfigType { + poll: ConfigType['poll']; +} function getStored(): JobId[] { const sessionValue = sessionStorage.getItem(JOB_COMPLETION_NOTIFICATIONS_SESSION_KEY); @@ -49,7 +47,7 @@ function getStored(): JobId[] { } function handleError( - notifications: NotificationsService, + notifications: NotificationsSetup, err: Error ): Rx.Observable { notifications.toasts.addDanger( @@ -64,18 +62,19 @@ function handleError( return Rx.of({ completed: [], failed: [] }); } -export class ReportingPublicPlugin implements Plugin { +export class ReportingPublicPlugin implements Plugin { + private config: ClientConfigType; private readonly stop$ = new Rx.ReplaySubject(1); - private readonly title = i18n.translate('xpack.reporting.management.reportingTitle', { defaultMessage: 'Reporting', }); - private readonly breadcrumbText = i18n.translate('xpack.reporting.breadcrumb', { defaultMessage: 'Reporting', }); - constructor(initializerContext: PluginInitializerContext) {} + constructor(initializerContext: PluginInitializerContext) { + this.config = initializerContext.config.get(); + } public setup( core: CoreSetup, @@ -130,6 +129,7 @@ export class ReportingPublicPlugin implements Plugin { @@ -163,8 +163,9 @@ export class ReportingPublicPlugin implements Plugin { const { http, notifications } = core; const apiClient = new ReportingAPIClient(http); const streamHandler = new StreamHandler(notifications, apiClient); + const { interval } = this.config.poll.jobsRefresh; - Rx.timer(0, JOBS_REFRESH_INTERVAL) + Rx.timer(0, interval) .pipe( takeUntil(this.stop$), // stop the interval when stop method is called map(() => getStored()), // read all pending job IDs from session storage diff --git a/x-pack/plugins/reporting/server/config/index.ts b/x-pack/plugins/reporting/server/config/index.ts index f0a0a093aa8c0..a0d7618322c65 100644 --- a/x-pack/plugins/reporting/server/config/index.ts +++ b/x-pack/plugins/reporting/server/config/index.ts @@ -10,6 +10,7 @@ import { ConfigSchema, ConfigType } from './schema'; export { createConfig$ } from './create_config'; export const config: PluginConfigDescriptor = { + exposeToBrowser: { poll: true }, schema: ConfigSchema, deprecations: ({ unused }) => [ unused('capture.browser.chromium.maxScreenshotDimension'), From 5a55c9a8f6c245387f4dc0bf75e5788d1b85bf97 Mon Sep 17 00:00:00 2001 From: Ryland Herrick Date: Tue, 21 Apr 2020 12:47:25 -0500 Subject: [PATCH 19/67] Register uiSettings on New Platform (#64015) This now requires us to define a schema for each setting, which is a little redundant given that we also have to type the useUiSetting calls; this might be an issue between kibana-react and new UiSettings changes. --- x-pack/legacy/plugins/siem/index.ts | 113 +---------------- x-pack/plugins/siem/server/plugin.ts | 3 + x-pack/plugins/siem/server/ui_settings.ts | 141 ++++++++++++++++++++++ 3 files changed, 145 insertions(+), 112 deletions(-) create mode 100644 x-pack/plugins/siem/server/ui_settings.ts diff --git a/x-pack/legacy/plugins/siem/index.ts b/x-pack/legacy/plugins/siem/index.ts index 6e03583dda69f..5ffaea1ee73df 100644 --- a/x-pack/legacy/plugins/siem/index.ts +++ b/x-pack/legacy/plugins/siem/index.ts @@ -11,24 +11,7 @@ import { Root } from 'joi'; // eslint-disable-next-line @kbn/eslint/no-restricted-paths import { savedObjectMappings } from '../../../plugins/siem/server/saved_objects'; -import { - APP_ID, - APP_NAME, - DEFAULT_INDEX_KEY, - DEFAULT_ANOMALY_SCORE, - DEFAULT_SIEM_TIME_RANGE, - DEFAULT_SIEM_REFRESH_INTERVAL, - DEFAULT_INTERVAL_PAUSE, - DEFAULT_INTERVAL_VALUE, - DEFAULT_FROM, - DEFAULT_TO, - ENABLE_NEWS_FEED_SETTING, - NEWS_FEED_URL_SETTING, - NEWS_FEED_URL_SETTING_DEFAULT, - IP_REPUTATION_LINKS_SETTING, - IP_REPUTATION_LINKS_SETTING_DEFAULT, - DEFAULT_INDEX_PATTERN, -} from '../../../plugins/siem/common/constants'; +import { APP_ID, APP_NAME } from '../../../plugins/siem/common/constants'; import { DEFAULT_APP_CATEGORIES } from '../../../../src/core/utils'; // eslint-disable-next-line @typescript-eslint/no-explicit-any @@ -63,100 +46,6 @@ export const siem = (kibana: any) => { category: DEFAULT_APP_CATEGORIES.security, }, ], - uiSettingDefaults: { - [DEFAULT_SIEM_REFRESH_INTERVAL]: { - type: 'json', - name: i18n.translate('xpack.siem.uiSettings.defaultRefreshIntervalLabel', { - defaultMessage: 'Time filter refresh interval', - }), - value: `{ - "pause": ${DEFAULT_INTERVAL_PAUSE}, - "value": ${DEFAULT_INTERVAL_VALUE} -}`, - description: i18n.translate('xpack.siem.uiSettings.defaultRefreshIntervalDescription', { - defaultMessage: - '

CZT$XzGOaws8V^6|Y%zIQQ9xFT{ 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

+fYMKRSlKw?BEKjmNqJXp)K+?4I7k*%CDl`~? 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 Ty^ Date: Tue, 21 Apr 2020 09:35:19 -0700 Subject: [PATCH 14/67] [DOCS] Add file size setting for Data Visualizer (#64006) --- docs/settings/ml-settings.asciidoc | 9 ++++++- .../ml/images/ml-data-visualizer-sample.jpg | Bin 579529 -> 355490 bytes docs/user/ml/index.asciidoc | 22 +++++++++--------- 3 files changed, 19 insertions(+), 12 deletions(-) diff --git a/docs/settings/ml-settings.asciidoc b/docs/settings/ml-settings.asciidoc index 6528568e86890..b71e1c672756a 100644 --- a/docs/settings/ml-settings.asciidoc +++ b/docs/settings/ml-settings.asciidoc @@ -8,7 +8,6 @@ You do not need to configure any settings to use {kib} {ml-features}. They are enabled by default. -[float] [[general-ml-settings-kb]] ==== General {ml} settings @@ -19,3 +18,11 @@ If set to `false` in `kibana.yml`, the {ml} icon is hidden in this {kib} instance. If `xpack.ml.enabled` is set to `true` in `elasticsearch.yml`, however, you can still use the {ml} APIs. To disable {ml} entirely, see the {ref}/ml-settings.html[{es} {ml} settings]. + +[[data-visualizer-settings]] +==== {data-viz} settings + +`xpack.ml.file_data_visualizer.max_file_size`:: +Sets the file size limit when importing data in the {data-viz}. The default +value is `100MB`. The highest supported value for this setting is `1GB`. + diff --git a/docs/user/ml/images/ml-data-visualizer-sample.jpg b/docs/user/ml/images/ml-data-visualizer-sample.jpg index 6c2e018932717f478b9f92dc412d1904d52d6893..ce2bb660d7da1a3cea161afcb07e6223d77e038f 100644 GIT binary patch literal 355490 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∾l4lWCBm1k&WWD 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